flowable上一节点任务撤回-(5)嵌入式子流程

flowable上一节点任务撤回-(5)嵌入式子流程

2023年7月24日发(作者:)

flowable上⼀节点任务撤回-(5)嵌⼊式⼦流程场景:本章主要描述 下⼀节点 嵌⼊式⼦流程 如何进⾏回退操作。嵌⼊式⼦流程上⼀章:flowable 上⼀节点任务撤回-(4)多重⽹关下⼀章:flowable 上⼀节点任务撤回-(6)调⽤式⼦流程环境:springboot:Eflowable:6.4.2所有章节:1. flowable 上⼀节点任务撤回-(1)普通节点撤回2. flowable 上⼀节点任务撤回-(2)会签任务(已完成)3. flowable 上⼀节点任务撤回-(3)会签任务(正在执⾏中)4. flowable 上⼀节点任务撤回-(4)多重⽹关5. flowable 上⼀节点任务撤回-(5)嵌⼊式⼦流程6. flowable 上⼀节点任务撤回-(6)调⽤式⼦流程嵌⼊式⼦流程嵌⼊式⼦流程具有⼀定的特殊性,操作撤回的时候,⽐如 :1. 节点 A 进⼊⼦流程这种边界事件2. ⼦流程中的 各节点的跳转 b-1 b-2 b-3与之前⼀样,对系统的各种数据进⾏分析BpmnModelProcess 与 SubProcess 共性ACT_RU_EXECUTION1. 从debug数据中可以看到,SubProcess 中的节点 存在于 节点 SubProcess 中,不能直接通过 getElement 拿到2. 然后 Process和 SubProcess 都实现于接⼝ ementsContainer,并且调⽤的接⼝ 是wElement(String id);所以 可以从这两处⼊⼿,进⾏功能编写NextSubProcessRollbackOperateStrategy: 从嵌⼊式⼦流程撤回到普通节点步骤:1. 如果下⼀节点是⼦流程 判定 ⼦流程中 是否具有 已完成任务,如果具有,则不具备撤回条件。如果正常则⽆所谓。2. 像 之前⼀样的步骤,构建 Execution ,利⽤ Execution ⽣成 任务。(不过与普通任务不同 ,⼦流程前置 普通任务节点的 execution 已经结束,不是同⼀个,所以⽆法使⽤,需要根据边界⼦节点 ⽗级节点 进⾏构建)3. 处理掉已⽣成的 ⼦流程任务,另外,由上图可以看出,⼦流程任务 b-1 具有 顶级 execution,这个也需要进⾏移除,不然会导致流程⽆法归档。4. 清理掉相关依赖数据。如果是嵌⼊式⼦流程 内部节点间处理,则处理⽅式基本和 普通节点的处理⽅式⼀致,只需要判断,如果 在 Process 找不到 flowElement,则在SubProcess进⾏找就⾏。所以之前的操作类直接满⾜效果。基于模板⽅法模式,构建编写通⽤ s() 操作 @Override public void process(CommandContext commandContext, String assignee, Map variables) { dContext = commandContext; ee = assignee; les = variables; ("处理 existNextFinishedTask"); existNextFinishedTask(); ("配置任务执⾏⼈ setAssignee"); setAssignee(); ("处理 createExecution"); createExecution(); ("处理 deleteRuntimeTasks"); deleteRuntimeTasks(); ("处理 deleteHisActInstance"); deleteHisActInstance(); }判定是否具有已完成任务,此处需要判定标识是从 SubProcess 中获取的 @Override public void existNextFinishedTask() { Map subProcessMap = ProcessMap(); List historicTaskInstances = toricTaskService(commandContext) .findHistoricTaskInstancesByQueryCriteria( (HistoricTaskInstanceQueryImpl) new HistoricTaskInstanceQueryImpl() .taskCompletedAfter(Task().getEndTime()) .finished() ); String key = ().iterator().next(); cess = (key); wElements().forEach(obj -> (())); if (!y()) { h(obj -> { if (ns(kDefinitionKey())) { ("出现已完成任务,⽆法进⾏流程节点撤回: [" + obj + "]"); throw new FlowableRuntimeException("出现已完成任务,⽆法进⾏流程节点撤回"); } }); } }构建 Execution:主要区别在于只能通过相邻节点进⾏获取,不然当出现多层级⽹关的时候,可能会出现层级错误bug @Override public void createExecution() { HistoricTaskInstance hisTask = Task(); ExecutionEntity executionEntity = cutionEntityManager(commandContext).findById(cutionId()); /** * subProcess 作为下⼀节点的时候,hisTask的execution会被关闭调。所以需要重新创建 */ if (null == executionEntity) { ("hisTask:execution 为 null"); List executionEntityList = CommandContextUtil .getExecutionEntityManager(commandContext) .findExecutionsByParentExecutionAndActivityIds(cessInstanceId(), tFlowIdList()); if (y()) { throw new FlowableRuntimeException("没有找到临近节点"); } executionEntity = (0); } // 创建主线 ExecutionEntity newExecution = cutionEntityManager(commandContext).createChildExecution(ent()); // 创建新任务 createExecution(newExecution); // 移除历史任务 removeHisTask(hisTask); }删除历史连线 @Override public void deleteHisActInstance() { List activityInstanceEntityList = ivityInstanceEntityManager(commandContext) .findActivityInstancesByQueryCriteria( new ActivityInstanceQueryImpl() .processInstanceId(Task().getProcessInstanceId()) ); List ids = new ArrayList<>(); h(obj -> { // 时间⼤于 任务创建时间 之后线条 if (rtTime().getTime() > Task().getCreateTime().getTime() && ns(ivityId())) { (()); } // 当前任务的连线 ID if (Task().getTaskDefinitionKey().equals(ivityId()) && Time().getTime() > Task().getCreateTime().getTime() ) { (()); } }); ("移除历史任务连线"); h(obj -> (obj)); }删除正在进⾏任务 @Override public void deleteRuntimeTasks() { HistoricTaskInstance hisTask = Task(); List taskEntityList = kService(commandContext).findTasksByProcessInstanceId(cessInstanceId()); h(obj -> { if (ns(kDefinitionKey())) { ("移除正在执⾏的下⼀节点任务"); // 移除任务 removeRuntimeTaskOperate(obj); } }); // 获取 subProcess 的 ExecutionEntity Collection executionEntities = CommandContextUtil .getExecutionEntityManager(commandContext) .findExecutionsByParentExecutionAndActivityIds(cessInstanceId(), tonList(())); h(obj -> { ("移除 subProcess 层级execution"); List children = CommandContextUtil .getExecutionEntityManager(commandContext) .findChildExecutionsByParentExecutionId(()); // 移除级联⼦节点 h(item -> CommandContextUtil .getExecutionEntityManager(commandContext) .delete(item)); // 移除 subProcess 顶级 CommandContextUtil .getExecutionEntityManager(commandContext) .delete(obj); }); }

发布者:admin,转转请注明出处:http://www.yc00.com/web/1690212698a315700.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信