当前位置: 首页 > news >正文

Flowable之任务撤回(支持主流程、子流程相互撤回)

撤回任务:主流程 > 主流程

处室主管【送科长审核】

处室主管【撤回科长审核】

流程日志

撤回任务:子流程 > 子流程

会办接收岗【送处室主管】

会办接收岗【撤回处室主管】

会办接收岗【同意】

撤回任务:子流程 > 主流程

处室主管【送会办】

处室主管【撤回送会办】

处室主管【再次送会办】【接收员同意】

撤回任务:主流程 > 子流程

会办主管【送经办人】

会办主管【撤回经办人】

会办主管【同意】

撤回任务:主流程 > 并行子流程

同时送2个会办,A接收员同意,B主管送经办人

B主管【撤回送经办人】

B主管【同意】

核心代码实现

List<FlowNode> doingNodes = findFlowNodesInMainProcess(taskItem.getProcDefId(), doingTaskKey);List<FlowNode> targetNodes = findFlowNodesInMainProcess(taskItem.getProcDefId(), taskKey);//撤回到子流程内部: 恢复子流程数据AddChildExecutionCmdif(doingNodes.size()>0 && targetNodes.size()==0){log.info(">>>> 主流程撤回到子流程 {} > {}", doingTaskKey, taskKey);revokeExecutions(bo.getProcInstId(), taskKey);//还原子流程subProcess边界ExecutionEntityImpl root = (ExecutionEntityImpl)runtimeService.createExecutionQuery().executionId(bo.getProcInstId()).singleResult();ExecutionEntityImpl child = (ExecutionEntityImpl)runtimeService.createExecutionQuery().parentId(bo.getProcInstId()).singleResult();Map<String, Object> varMap = this.getInstancesVariables(bo.getProcInstId());managementService.executeCommand(new AddChildExecutionCmd(root, child, varMap));}else if(doingNodes.size()==0 && targetNodes.size()==0){log.info(">>>> 子流程内任务撤回 {} > {}", doingTaskKey, taskKey);revokeActivityIds(bo.getProcInstId(), taskKey, doingTaskKeys);}else if(doingNodes.size()>0 && targetNodes.size()>0){log.info(">>>> 主流程内任务撤回 {} > {}", doingTaskKey, taskKey);revokeExecutions(bo.getProcInstId(), taskKey);}else if(doingNodes.size()==0 && targetNodes.size()>0){log.info(">>>> 子流程撤回到主流程 {} > {}", doingTaskKey, taskKey);revokeActivityIds(bo.getProcInstId(), taskKey, doingTaskKeys);}else {log.error(">>>> 未知撤回流程 {} > {}", doingTaskKey, taskKey);}//6.退回到指定节点(撤销所有子流程)Date endTime = taskItem.getEndTime();//撤回当前用户上一次已办理任务Integer taskNum = processCmdMapper.updateRevokeTask(procInstIdsStr, endTime);Integer actNum = processCmdMapper.updateRevokeAct(procInstIdsStr, endTime);log.info("success revokeTask  = {}, revokeAct = {}", taskNum, actNum);//更新待办任务并发通知handleDoingTask(taskItem.getBusinessKey(), false);}//撤回已经办理的任务private void revokeActivityIds(String procInstId, String taskKey, List<String> doingTaskKeys){if(doingTaskKeys.size()>0){runtimeService.createChangeActivityStateBuilder().processInstanceId(procInstId).moveActivityIdsToSingleActivityId(doingTaskKeys, taskKey).changeState();}}//撤回已经办理的任务private void revokeExecutions(String procInstId, String taskKey){List<String> executionIds = new ArrayList<>();List<Execution> executions = runtimeService.createExecutionQuery().parentId(procInstId).list();executions.forEach(execution -> executionIds.add(execution.getId()));if(executionIds.size()>0){runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, taskKey).changeState();}}//在主流程中查询节点private List<FlowNode> findFlowNodesInMainProcess(String processDefId, String activityId) {List<FlowNode> activities = new ArrayList<>();BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId);List<Process> processes = bpmnModel.getProcesses();for (Process process : processes) {FlowElement flowElement = process.getFlowElement(activityId);if (flowElement != null) {FlowNode flowNode = (FlowNode) flowElement;activities.add(flowNode);}}return activities;}


http://www.mrgr.cn/news/40648.html

相关文章:

  • CMIS5.2_光模块切应用(Application Selection and Instantiation)
  • Elasticsearch:使用 LLM 实现传统搜索自动化
  • 位运算(5)_两数之和
  • 数据分析-30-电影死亡笔记中的数据分析思维
  • 【重学 MySQL】四十四、相关子查询
  • 【Java基础】Java面试基础知识QA(上)
  • 我的创作128天纪念日或者说自写博客以来的一些感悟
  • < IDE编程环境配置>
  • 位运算(4)_丢失的数字
  • 大数据毕业设计选题推荐-NBA球员数据分析系统-Python数据可视化-Hive-Hadoop-Spark
  • C++ 游戏开发
  • 【数据类型】C和C++的区别
  • 使用JavaScript实现动态表格
  • 词袋(Bag of Words, BoW)
  • 如何设计具体项目的数据库管理
  • 文本分类与朴素贝叶斯的魅力 —— 插座智能链接,技术的桥梁
  • 【AI知识点】词袋模型(Bag-of-Words,BOW)
  • ZLMediaKit编译运行
  • C++容器之vector模拟实现(代码纯享版!!!)
  • [云] Getting Started with Kubernetes - Environment setup 环境配置