From 2f5a637fe1c465b7845f5fbe0bd25c2deb728a7a Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Wed, 22 May 2024 19:19:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[=E4=BF=AE=E5=A4=8D]=20IT=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?-=E6=AD=A5=E9=AA=A4=E6=95=B0=E9=87=8F=E5=A4=9A=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=B5=81=E8=BD=AC=E6=85=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1162398289854464]IT服务-步骤数量多时,流转慢 http://192.168.0.96:8090/demo/rdm.html#/bug-detail/939050947543040/939050947543057/1162398289854464 --- .../core/ProcessTaskAuditTypeFactory.java | 7 +-- .../core/ProcessStepHandlerBase.java | 44 +++++++++++++++---- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/main/java/neatlogic/framework/process/audithandler/core/ProcessTaskAuditTypeFactory.java b/src/main/java/neatlogic/framework/process/audithandler/core/ProcessTaskAuditTypeFactory.java index 391a7553..b0282af1 100755 --- a/src/main/java/neatlogic/framework/process/audithandler/core/ProcessTaskAuditTypeFactory.java +++ b/src/main/java/neatlogic/framework/process/audithandler/core/ProcessTaskAuditTypeFactory.java @@ -1,9 +1,10 @@ package neatlogic.framework.process.audithandler.core; +import org.reflections.Reflections; + import java.util.HashSet; +import java.util.Objects; import java.util.Set; - -import org.reflections.Reflections; /** * * @Time:2020年8月11日 @@ -39,7 +40,7 @@ public class ProcessTaskAuditTypeFactory { } public static String getDescription(String _value) { for(IProcessTaskAuditType type : getAuditTypeList()) { - if(type.getValue().equals(_value)) { + if(Objects.equals(type.getValue(), _value)) { return type.getDescription(); } } diff --git a/src/main/java/neatlogic/framework/process/stephandler/core/ProcessStepHandlerBase.java b/src/main/java/neatlogic/framework/process/stephandler/core/ProcessStepHandlerBase.java index 23386d1f..df1d0ddf 100644 --- a/src/main/java/neatlogic/framework/process/stephandler/core/ProcessStepHandlerBase.java +++ b/src/main/java/neatlogic/framework/process/stephandler/core/ProcessStepHandlerBase.java @@ -193,11 +193,14 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { @Override public final int active(ProcessTaskStepVo currentProcessTaskStepVo) { + logger.warn("开始激活步骤: " + currentProcessTaskStepVo.getName() + ", time: " + System.currentTimeMillis()); IProcessStepHandlerCrossoverUtil processStepHandlerCrossoverUtil = CrossoverServiceFactory.getApi(IProcessStepHandlerCrossoverUtil.class); try { IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); + logger.warn("激活步骤: " + currentProcessTaskStepVo.getName() + ", 获取Lock startTime: " + System.currentTimeMillis()); /* 锁定当前流程 **/ processTaskCrossoverMapper.getProcessTaskLockById(currentProcessTaskStepVo.getProcessTaskId()); + logger.warn("激活步骤: " + currentProcessTaskStepVo.getName() + ", 获取Lock endTime: " + System.currentTimeMillis()); boolean canFire = false; /* 获取当前步骤的所有前置步骤 **/ /* 获取当前步骤的所有前置连线 **/ @@ -228,18 +231,22 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { } else { canFire = true; } - + logger.warn("a Time: " + System.currentTimeMillis()); if (canFire) { /* 设置当前步骤状态为未开始 **/ currentProcessTaskStepVo.setStatus(ProcessTaskStepStatus.PENDING.getValue()); currentProcessTaskStepVo.setUpdateActiveTime(1); + logger.warn("a1 Time: " + System.currentTimeMillis()); /* 遍历后续节点所有步骤,写入汇聚步骤数据 **/ resetConvergeInfo(currentProcessTaskStepVo); - + logger.warn("a2 Time: " + System.currentTimeMillis()); /* 如果当前步骤是二次进入(后续路径已经走过),则需要对所有后续流转过的步骤都进行挂起操作 **/ hangPostStep(currentProcessTaskStepVo); + logger.warn("a3 Time: " + System.currentTimeMillis()); resetPostStepRelIsHit(currentProcessTaskStepVo.getId()); + logger.warn("a4 Time: " + System.currentTimeMillis()); if (this.getMode().equals(ProcessStepMode.MT)) { + logger.warn("b Time: " + System.currentTimeMillis()); /* 分配处理人 **/ assign(currentProcessTaskStepVo); @@ -270,6 +277,7 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { /* 执行动作 **/ processStepHandlerCrossoverUtil.action(currentProcessTaskStepVo, ProcessTaskStepNotifyTriggerType.ACTIVE); } else if (this.getMode().equals(ProcessStepMode.AT)) { + logger.warn("c Time: " + System.currentTimeMillis()); myActive(currentProcessTaskStepVo); currentProcessTaskStepVo.setIsActive(1); updateProcessTaskStepStatus(currentProcessTaskStepVo); @@ -281,6 +289,7 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { handler.handle(currentProcessTaskStepVo); } }); + logger.warn("d Time: " + System.currentTimeMillis()); } } } catch (ProcessTaskException e) { @@ -304,6 +313,7 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { } }); } + logger.warn("结束激活步骤: " + currentProcessTaskStepVo.getName() + ", time: " + System.currentTimeMillis()); // deleteProcessTaskStepInOperationByProcessTaskStepId(currentProcessTaskStepVo.getId(), // ProcessTaskOperationType.ACTIVE); } @@ -799,10 +809,13 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { @Override public final int complete(ProcessTaskStepVo currentProcessTaskStepVo) { + logger.warn("开始完成步骤: " + currentProcessTaskStepVo.getName() + ", time: " + System.currentTimeMillis()); IProcessStepHandlerCrossoverUtil processStepHandlerCrossoverUtil = CrossoverServiceFactory.getApi(IProcessStepHandlerCrossoverUtil.class); IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); + logger.warn("完成步骤: " + currentProcessTaskStepVo.getName() + ", 获取Lock startTime: " + System.currentTimeMillis()); /* 锁定当前流程 **/ processTaskCrossoverMapper.getProcessTaskLockById(currentProcessTaskStepVo.getProcessTaskId()); + logger.warn("完成步骤: " + currentProcessTaskStepVo.getName() + ", 获取Lock endTime: " + System.currentTimeMillis()); ProcessTaskStepNotifyTriggerType notifyTriggerType = ProcessTaskStepNotifyTriggerType.SUCCEED; ProcessTaskOperationType operationType = ProcessTaskOperationType.STEP_COMPLETE; boolean canComplete = false; @@ -901,6 +914,7 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { if (CollectionUtils.isEmpty(nextStepIdSet)) { throw new ProcessTaskNotFoundNextStepException(); } + logger.warn("完成步骤: " + currentProcessTaskStepVo.getName() + ", nextStepIdSet: " + JSON.toJSONString(nextStepIdSet) + ", time: " + System.currentTimeMillis()); // 完成步骤时将所有后退路线重置为0 List relList = processTaskCrossoverMapper.getProcessTaskStepRelByToId(currentProcessTaskStepVo.getId()); for (ProcessTaskStepRelVo processTaskStepRelVo : relList) { @@ -909,9 +923,10 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { processTaskCrossoverMapper.updateProcessTaskStepRelIsHit(processTaskStepRelVo); } } + logger.warn("完成步骤: " + currentProcessTaskStepVo.getName() + ", a time: " + System.currentTimeMillis()); //将不流转的步骤的正向输入连线的isHit设置为-1 identifyPostInvalidStepRelIsHit(currentProcessTaskStepVo.getId(), nextStepIdSet); - + logger.warn("完成步骤: " + currentProcessTaskStepVo.getName() + ", b time: " + System.currentTimeMillis()); List nextStepIdList = new ArrayList<>(nextStepIdSet); List nextStepList = processTaskCrossoverMapper.getProcessTaskStepListByIdList(nextStepIdList); for (ProcessTaskStepVo nextStep : nextStepList) { @@ -978,6 +993,7 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { /* 计算SLA **/ processStepHandlerCrossoverUtil.calculateSla(new ProcessTaskVo(currentProcessTaskStepVo.getProcessTaskId())); } + logger.warn("结束完成步骤: " + currentProcessTaskStepVo.getName() + ", time: " + System.currentTimeMillis()); } } @@ -2169,6 +2185,8 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { */ private void identifyPostInvalidStepRelIsHit(Long currentProcessTaskStepId, Set activeStepIdSet) { IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); + ProcessTaskStepVo processTaskStep = processTaskCrossoverMapper.getProcessTaskStepBaseInfoById(currentProcessTaskStepId); + logger.warn("identifyPostInvalidStepRelIsHit currentProcessTaskStepId = " + processTaskStep.getName() + "(" + currentProcessTaskStepId + "), activeStepIdSet = " + JSON.toJSONString(activeStepIdSet)); List unactiveStepIdList = null; List allNextStepIdList = processTaskCrossoverMapper.getToProcessTaskStepIdListByFromIdAndType(currentProcessTaskStepId, ProcessFlowDirection.FORWARD.getValue()); if (CollectionUtils.isNotEmpty(activeStepIdSet)) { @@ -2176,6 +2194,7 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { } else { unactiveStepIdList = allNextStepIdList; } + logger.warn("identifyPostInvalidStepRelIsHit currentProcessTaskStepId = " + processTaskStep.getName() + "(" + currentProcessTaskStepId + "), unactiveStepIdList = " + JSON.toJSONString(unactiveStepIdList)); if (CollectionUtils.isNotEmpty(unactiveStepIdList)) { Map> toStepIdMap = new HashMap<>(); List processTaskStepRelList = processTaskCrossoverMapper.getProcessTaskStepRelListByToIdList(unactiveStepIdList); @@ -2193,9 +2212,10 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { updateProcessTaskStepRelVo.setToProcessTaskStepId(unactiveStepId); processTaskCrossoverMapper.updateProcessTaskStepRelIsHit(updateProcessTaskStepRelVo); List fromStepRelList = toStepIdMap.computeIfAbsent(unactiveStepId, k -> new ArrayList<>()); + logger.warn("fromStepRelList = " + JSON.toJSONString(fromStepRelList)); for (ProcessTaskStepRelVo processTaskStepRelVo : fromStepRelList) { - if (Objects.equals(currentProcessTaskStepId, processTaskStepRelVo.getFromProcessTaskStepId()) - || (Objects.equals(unactiveStepId, processTaskStepRelVo.getToProcessTaskStepId()))) { + if (Objects.equals(currentProcessTaskStepId, processTaskStepRelVo.getFromProcessTaskStepId())) { + // || (Objects.equals(unactiveStepId, processTaskStepRelVo.getToProcessTaskStepId())) continue; } if (processTaskStepRelVo.getType().equals(ProcessFlowDirection.FORWARD.getValue())) { @@ -2212,14 +2232,21 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { } } } - + private void resetPostStepRelIsHit(Long currentProcessTaskStepId) { + resetPostStepRelIsHit(currentProcessTaskStepId, new ArrayList<>()); + } /** * 将当前步骤的所有后续步骤间的连线的isHit设置为0 * * @param currentProcessTaskStepId 当前步骤id */ - private void resetPostStepRelIsHit(Long currentProcessTaskStepId) { + private void resetPostStepRelIsHit(Long currentProcessTaskStepId, List stepIdList) { + if (stepIdList.contains(currentProcessTaskStepId)) { + return; + } IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); + ProcessTaskStepVo step = processTaskCrossoverMapper.getProcessTaskStepBaseInfoById(currentProcessTaskStepId); + logger.warn("resetPostStepRelIsHit step = " + step.getName() + "(" + step.getId() + ")"); List toStepIdList = processTaskCrossoverMapper.getToProcessTaskStepIdListByFromIdAndType(currentProcessTaskStepId, ProcessFlowDirection.FORWARD.getValue()); if (CollectionUtils.isNotEmpty(toStepIdList)) { ProcessTaskStepRelVo processTaskStepRelVo = new ProcessTaskStepRelVo(); @@ -2227,8 +2254,9 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { processTaskStepRelVo.setIsHit(0); processTaskStepRelVo.setType(ProcessFlowDirection.FORWARD.getValue()); processTaskCrossoverMapper.updateProcessTaskStepRelIsHit(processTaskStepRelVo); + stepIdList.add(currentProcessTaskStepId); for (Long toStepId : toStepIdList) { - resetPostStepRelIsHit(toStepId); + resetPostStepRelIsHit(toStepId, stepIdList); } } } -- Gitee From 35fc61643f5e9ac45e0c9c283f38c70408e6bf40 Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Thu, 23 May 2024 11:53:39 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[=E4=BF=AE=E5=A4=8D]=20IT=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?-=E6=AD=A5=E9=AA=A4=E6=95=B0=E9=87=8F=E5=A4=9A=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=B5=81=E8=BD=AC=E6=85=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1162398289854464]IT服务-步骤数量多时,流转慢 http://192.168.0.96:8090/demo/rdm.html#/bug-detail/939050947543040/939050947543057/1162398289854464 --- .../core/ProcessStepHandlerBase.java | 207 +++++++++++++----- 1 file changed, 153 insertions(+), 54 deletions(-) diff --git a/src/main/java/neatlogic/framework/process/stephandler/core/ProcessStepHandlerBase.java b/src/main/java/neatlogic/framework/process/stephandler/core/ProcessStepHandlerBase.java index df1d0ddf..c891d28b 100644 --- a/src/main/java/neatlogic/framework/process/stephandler/core/ProcessStepHandlerBase.java +++ b/src/main/java/neatlogic/framework/process/stephandler/core/ProcessStepHandlerBase.java @@ -193,14 +193,11 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { @Override public final int active(ProcessTaskStepVo currentProcessTaskStepVo) { - logger.warn("开始激活步骤: " + currentProcessTaskStepVo.getName() + ", time: " + System.currentTimeMillis()); IProcessStepHandlerCrossoverUtil processStepHandlerCrossoverUtil = CrossoverServiceFactory.getApi(IProcessStepHandlerCrossoverUtil.class); try { IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); - logger.warn("激活步骤: " + currentProcessTaskStepVo.getName() + ", 获取Lock startTime: " + System.currentTimeMillis()); /* 锁定当前流程 **/ processTaskCrossoverMapper.getProcessTaskLockById(currentProcessTaskStepVo.getProcessTaskId()); - logger.warn("激活步骤: " + currentProcessTaskStepVo.getName() + ", 获取Lock endTime: " + System.currentTimeMillis()); boolean canFire = false; /* 获取当前步骤的所有前置步骤 **/ /* 获取当前步骤的所有前置连线 **/ @@ -231,22 +228,16 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { } else { canFire = true; } - logger.warn("a Time: " + System.currentTimeMillis()); if (canFire) { /* 设置当前步骤状态为未开始 **/ currentProcessTaskStepVo.setStatus(ProcessTaskStepStatus.PENDING.getValue()); currentProcessTaskStepVo.setUpdateActiveTime(1); - logger.warn("a1 Time: " + System.currentTimeMillis()); /* 遍历后续节点所有步骤,写入汇聚步骤数据 **/ resetConvergeInfo(currentProcessTaskStepVo); - logger.warn("a2 Time: " + System.currentTimeMillis()); /* 如果当前步骤是二次进入(后续路径已经走过),则需要对所有后续流转过的步骤都进行挂起操作 **/ hangPostStep(currentProcessTaskStepVo); - logger.warn("a3 Time: " + System.currentTimeMillis()); - resetPostStepRelIsHit(currentProcessTaskStepVo.getId()); - logger.warn("a4 Time: " + System.currentTimeMillis()); + resetPostStepRelIsHit(currentProcessTaskStepVo.getProcessTaskId(), currentProcessTaskStepVo.getId()); if (this.getMode().equals(ProcessStepMode.MT)) { - logger.warn("b Time: " + System.currentTimeMillis()); /* 分配处理人 **/ assign(currentProcessTaskStepVo); @@ -277,7 +268,6 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { /* 执行动作 **/ processStepHandlerCrossoverUtil.action(currentProcessTaskStepVo, ProcessTaskStepNotifyTriggerType.ACTIVE); } else if (this.getMode().equals(ProcessStepMode.AT)) { - logger.warn("c Time: " + System.currentTimeMillis()); myActive(currentProcessTaskStepVo); currentProcessTaskStepVo.setIsActive(1); updateProcessTaskStepStatus(currentProcessTaskStepVo); @@ -289,7 +279,6 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { handler.handle(currentProcessTaskStepVo); } }); - logger.warn("d Time: " + System.currentTimeMillis()); } } } catch (ProcessTaskException e) { @@ -313,7 +302,6 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { } }); } - logger.warn("结束激活步骤: " + currentProcessTaskStepVo.getName() + ", time: " + System.currentTimeMillis()); // deleteProcessTaskStepInOperationByProcessTaskStepId(currentProcessTaskStepVo.getId(), // ProcessTaskOperationType.ACTIVE); } @@ -809,13 +797,10 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { @Override public final int complete(ProcessTaskStepVo currentProcessTaskStepVo) { - logger.warn("开始完成步骤: " + currentProcessTaskStepVo.getName() + ", time: " + System.currentTimeMillis()); IProcessStepHandlerCrossoverUtil processStepHandlerCrossoverUtil = CrossoverServiceFactory.getApi(IProcessStepHandlerCrossoverUtil.class); IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); - logger.warn("完成步骤: " + currentProcessTaskStepVo.getName() + ", 获取Lock startTime: " + System.currentTimeMillis()); /* 锁定当前流程 **/ processTaskCrossoverMapper.getProcessTaskLockById(currentProcessTaskStepVo.getProcessTaskId()); - logger.warn("完成步骤: " + currentProcessTaskStepVo.getName() + ", 获取Lock endTime: " + System.currentTimeMillis()); ProcessTaskStepNotifyTriggerType notifyTriggerType = ProcessTaskStepNotifyTriggerType.SUCCEED; ProcessTaskOperationType operationType = ProcessTaskOperationType.STEP_COMPLETE; boolean canComplete = false; @@ -914,7 +899,6 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { if (CollectionUtils.isEmpty(nextStepIdSet)) { throw new ProcessTaskNotFoundNextStepException(); } - logger.warn("完成步骤: " + currentProcessTaskStepVo.getName() + ", nextStepIdSet: " + JSON.toJSONString(nextStepIdSet) + ", time: " + System.currentTimeMillis()); // 完成步骤时将所有后退路线重置为0 List relList = processTaskCrossoverMapper.getProcessTaskStepRelByToId(currentProcessTaskStepVo.getId()); for (ProcessTaskStepRelVo processTaskStepRelVo : relList) { @@ -923,10 +907,8 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { processTaskCrossoverMapper.updateProcessTaskStepRelIsHit(processTaskStepRelVo); } } - logger.warn("完成步骤: " + currentProcessTaskStepVo.getName() + ", a time: " + System.currentTimeMillis()); //将不流转的步骤的正向输入连线的isHit设置为-1 - identifyPostInvalidStepRelIsHit(currentProcessTaskStepVo.getId(), nextStepIdSet); - logger.warn("完成步骤: " + currentProcessTaskStepVo.getName() + ", b time: " + System.currentTimeMillis()); + identifyPostInvalidStepRelIsHit(currentProcessTaskStepVo.getProcessTaskId(), currentProcessTaskStepVo.getId(), nextStepIdSet); List nextStepIdList = new ArrayList<>(nextStepIdSet); List nextStepList = processTaskCrossoverMapper.getProcessTaskStepListByIdList(nextStepIdList); for (ProcessTaskStepVo nextStep : nextStepList) { @@ -993,7 +975,6 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { /* 计算SLA **/ processStepHandlerCrossoverUtil.calculateSla(new ProcessTaskVo(currentProcessTaskStepVo.getProcessTaskId())); } - logger.warn("结束完成步骤: " + currentProcessTaskStepVo.getName() + ", time: " + System.currentTimeMillis()); } } @@ -1213,7 +1194,7 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { /* 如果当前步骤是二次进入(后续路径已经走过),则需要对所有后续流转过的步骤都进行挂起操作 **/ hangPostStep(currentProcessTaskStepVo); - resetPostStepRelIsHit(currentProcessTaskStepVo.getId()); + resetPostStepRelIsHit(currentProcessTaskStepVo.getProcessTaskId(), currentProcessTaskStepVo.getId()); /* 获取当前步骤状态 **/ /* 分配处理人 **/ @@ -2180,42 +2161,64 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { /** * 标识失效步骤,将失效步骤的正向流转连线isHit设置为-1 * + * @param processTaskId 工单id * @param currentProcessTaskStepId 当前步骤id * @param activeStepIdSet 激活步骤列表 */ - private void identifyPostInvalidStepRelIsHit(Long currentProcessTaskStepId, Set activeStepIdSet) { + private void identifyPostInvalidStepRelIsHit(Long processTaskId, Long currentProcessTaskStepId, Set activeStepIdSet) { + IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); + List allProcessTaskStepRelList = processTaskCrossoverMapper.getProcessTaskStepRelByProcessTaskId(processTaskId); + List needProcessTaskStepRelList = new ArrayList<>(); + doIdentifyPostInvalidStepRelIsHit(currentProcessTaskStepId, activeStepIdSet, allProcessTaskStepRelList, needProcessTaskStepRelList); + if (CollectionUtils.isNotEmpty(needProcessTaskStepRelList)) { + for (ProcessTaskStepRelVo processTaskStepRelVo : needProcessTaskStepRelList) { + processTaskCrossoverMapper.updateProcessTaskStepRelIsHit(processTaskStepRelVo); + } + } + } + + /** + * 标识失效步骤,将失效步骤的正向流转连线isHit设置为-1 + * + * @param currentProcessTaskStepId 当前步骤id + * @param activeStepIdSet 激活步骤列表 + * @param allProcessTaskStepRelList 工单的所有连线列表 + * @param needProcessTaskStepRelList 需要更新isHit值为-1的连线列表 + */ + private void doIdentifyPostInvalidStepRelIsHit(Long currentProcessTaskStepId, Set activeStepIdSet, List allProcessTaskStepRelList, List needProcessTaskStepRelList) { IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); ProcessTaskStepVo processTaskStep = processTaskCrossoverMapper.getProcessTaskStepBaseInfoById(currentProcessTaskStepId); - logger.warn("identifyPostInvalidStepRelIsHit currentProcessTaskStepId = " + processTaskStep.getName() + "(" + currentProcessTaskStepId + "), activeStepIdSet = " + JSON.toJSONString(activeStepIdSet)); List unactiveStepIdList = null; - List allNextStepIdList = processTaskCrossoverMapper.getToProcessTaskStepIdListByFromIdAndType(currentProcessTaskStepId, ProcessFlowDirection.FORWARD.getValue()); + List allNextStepIdList = new ArrayList<>(); + for (ProcessTaskStepRelVo processTaskStepRelVo : allProcessTaskStepRelList) { + if (Objects.equals(processTaskStepRelVo.getFromProcessTaskStepId(), currentProcessTaskStepId) && Objects.equals(processTaskStepRelVo.getType(), ProcessFlowDirection.FORWARD.getValue())) { + allNextStepIdList.add(processTaskStepRelVo.getToProcessTaskStepId()); + if (!Objects.equals(processTaskStepRelVo.getIsHit(), -1)) { + processTaskStepRelVo.setIsHit(-1); + needProcessTaskStepRelList.add(processTaskStepRelVo); + } + } + } if (CollectionUtils.isNotEmpty(activeStepIdSet)) { unactiveStepIdList = ListUtils.removeAll(allNextStepIdList, activeStepIdSet); } else { unactiveStepIdList = allNextStepIdList; } - logger.warn("identifyPostInvalidStepRelIsHit currentProcessTaskStepId = " + processTaskStep.getName() + "(" + currentProcessTaskStepId + "), unactiveStepIdList = " + JSON.toJSONString(unactiveStepIdList)); if (CollectionUtils.isNotEmpty(unactiveStepIdList)) { Map> toStepIdMap = new HashMap<>(); - List processTaskStepRelList = processTaskCrossoverMapper.getProcessTaskStepRelListByToIdList(unactiveStepIdList); - for (ProcessTaskStepRelVo processTaskStepRelVo : processTaskStepRelList) { - if (processTaskStepRelVo.getType().equals(ProcessFlowDirection.FORWARD.getValue())) { + + for (ProcessTaskStepRelVo processTaskStepRelVo : allProcessTaskStepRelList) { + if (unactiveStepIdList.contains(processTaskStepRelVo.getToProcessTaskStepId()) && Objects.equals(processTaskStepRelVo.getType(), ProcessFlowDirection.FORWARD.getValue())) { List fromStepRelList = toStepIdMap.computeIfAbsent(processTaskStepRelVo.getToProcessTaskStepId(), k -> new ArrayList<>()); fromStepRelList.add(processTaskStepRelVo); } } - ProcessTaskStepRelVo updateProcessTaskStepRelVo = new ProcessTaskStepRelVo(); - updateProcessTaskStepRelVo.setFromProcessTaskStepId(currentProcessTaskStepId); - updateProcessTaskStepRelVo.setIsHit(-1); + for (Long unactiveStepId : unactiveStepIdList) { boolean invalid = true; - updateProcessTaskStepRelVo.setToProcessTaskStepId(unactiveStepId); - processTaskCrossoverMapper.updateProcessTaskStepRelIsHit(updateProcessTaskStepRelVo); List fromStepRelList = toStepIdMap.computeIfAbsent(unactiveStepId, k -> new ArrayList<>()); - logger.warn("fromStepRelList = " + JSON.toJSONString(fromStepRelList)); for (ProcessTaskStepRelVo processTaskStepRelVo : fromStepRelList) { if (Objects.equals(currentProcessTaskStepId, processTaskStepRelVo.getFromProcessTaskStepId())) { - // || (Objects.equals(unactiveStepId, processTaskStepRelVo.getToProcessTaskStepId())) continue; } if (processTaskStepRelVo.getType().equals(ProcessFlowDirection.FORWARD.getValue())) { @@ -2227,40 +2230,136 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { } if (invalid) { //节点失效, 更新节点状态,继续判断后续节点是否也是失效的 - identifyPostInvalidStepRelIsHit(unactiveStepId, null); + doIdentifyPostInvalidStepRelIsHit(unactiveStepId, null, allProcessTaskStepRelList, needProcessTaskStepRelList); } } } } - private void resetPostStepRelIsHit(Long currentProcessTaskStepId) { - resetPostStepRelIsHit(currentProcessTaskStepId, new ArrayList<>()); - } + /** - * 将当前步骤的所有后续步骤间的连线的isHit设置为0 + * 标识失效步骤,将失效步骤的正向流转连线isHit设置为-1 * * @param currentProcessTaskStepId 当前步骤id + * @param activeStepIdSet 激活步骤列表 */ - private void resetPostStepRelIsHit(Long currentProcessTaskStepId, List stepIdList) { - if (stepIdList.contains(currentProcessTaskStepId)) { - return; +// private void doIdentifyPostInvalidStepRelIsHit(Long currentProcessTaskStepId, Set activeStepIdSet) { +// IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); +// ProcessTaskStepVo processTaskStep = processTaskCrossoverMapper.getProcessTaskStepBaseInfoById(currentProcessTaskStepId); +// List unactiveStepIdList = null; +// List allNextStepIdList = processTaskCrossoverMapper.getToProcessTaskStepIdListByFromIdAndType(currentProcessTaskStepId, ProcessFlowDirection.FORWARD.getValue()); +// if (CollectionUtils.isNotEmpty(activeStepIdSet)) { +// unactiveStepIdList = ListUtils.removeAll(allNextStepIdList, activeStepIdSet); +// } else { +// unactiveStepIdList = allNextStepIdList; +// } +// if (CollectionUtils.isNotEmpty(unactiveStepIdList)) { +// Map> toStepIdMap = new HashMap<>(); +// List processTaskStepRelList = processTaskCrossoverMapper.getProcessTaskStepRelListByToIdList(unactiveStepIdList); +// for (ProcessTaskStepRelVo processTaskStepRelVo : processTaskStepRelList) { +// if (processTaskStepRelVo.getType().equals(ProcessFlowDirection.FORWARD.getValue())) { +// List fromStepRelList = toStepIdMap.computeIfAbsent(processTaskStepRelVo.getToProcessTaskStepId(), k -> new ArrayList<>()); +// fromStepRelList.add(processTaskStepRelVo); +// } +// } +// ProcessTaskStepRelVo updateProcessTaskStepRelVo = new ProcessTaskStepRelVo(); +// updateProcessTaskStepRelVo.setFromProcessTaskStepId(currentProcessTaskStepId); +// updateProcessTaskStepRelVo.setIsHit(-1); +// for (Long unactiveStepId : unactiveStepIdList) { +// boolean invalid = true; +// updateProcessTaskStepRelVo.setToProcessTaskStepId(unactiveStepId); +// processTaskCrossoverMapper.updateProcessTaskStepRelIsHit(updateProcessTaskStepRelVo); +// List fromStepRelList = toStepIdMap.computeIfAbsent(unactiveStepId, k -> new ArrayList<>()); +// for (ProcessTaskStepRelVo processTaskStepRelVo : fromStepRelList) { +// if (Objects.equals(currentProcessTaskStepId, processTaskStepRelVo.getFromProcessTaskStepId())) { +// continue; +// } +// if (processTaskStepRelVo.getType().equals(ProcessFlowDirection.FORWARD.getValue())) { +// if (!Objects.equals(processTaskStepRelVo.getIsHit(), -1)) { +// invalid = false; +// break; +// } +// } +// } +// if (invalid) { +// //节点失效, 更新节点状态,继续判断后续节点是否也是失效的 +// doIdentifyPostInvalidStepRelIsHit(unactiveStepId, null); +// } +// } +// } +// } + + /** + * 将当前步骤的所有后续步骤间的连线的isHit设置为0 + * @param processTaskId 工单ID + * @param currentProcessTaskStepId 步骤ID + */ + private void resetPostStepRelIsHit(Long processTaskId, Long currentProcessTaskStepId) { + IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); + List allProcessTaskStepRelList = processTaskCrossoverMapper.getProcessTaskStepRelByProcessTaskId(processTaskId); + List needProcessTaskStepRelList = new ArrayList<>(); + doResetPostStepRelIsHit(currentProcessTaskStepId, new ArrayList<>(), allProcessTaskStepRelList, needProcessTaskStepRelList); + if (CollectionUtils.isNotEmpty(needProcessTaskStepRelList)) { + for (ProcessTaskStepRelVo processTaskStepRelVo : needProcessTaskStepRelList) { + processTaskCrossoverMapper.updateProcessTaskStepRelIsHit(processTaskStepRelVo); + } } + } + + /** + * 将当前步骤的所有后续步骤间的连线的isHit设置为0 + * @param currentProcessTaskStepId 步骤ID + * @param avoidCyclingStepIdList 遍历过的步骤id列表,避免重复 + * @param allProcessTaskStepRelList 工单的所有连线列表 + * @param needProcessTaskStepRelList 需要更新isHit值为0的连线列表 + */ + private void doResetPostStepRelIsHit(Long currentProcessTaskStepId, List avoidCyclingStepIdList, List allProcessTaskStepRelList, List needProcessTaskStepRelList) { IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); ProcessTaskStepVo step = processTaskCrossoverMapper.getProcessTaskStepBaseInfoById(currentProcessTaskStepId); - logger.warn("resetPostStepRelIsHit step = " + step.getName() + "(" + step.getId() + ")"); - List toStepIdList = processTaskCrossoverMapper.getToProcessTaskStepIdListByFromIdAndType(currentProcessTaskStepId, ProcessFlowDirection.FORWARD.getValue()); + List toStepIdList = new ArrayList<>(); + for (ProcessTaskStepRelVo processTaskStepRelVo : allProcessTaskStepRelList) { + if (Objects.equals(processTaskStepRelVo.getFromProcessTaskStepId(), currentProcessTaskStepId) && Objects.equals(processTaskStepRelVo.getType(), ProcessFlowDirection.FORWARD.getValue())) { + toStepIdList.add(processTaskStepRelVo.getToProcessTaskStepId()); + if (!Objects.equals(processTaskStepRelVo.getIsHit(), 0)) { + processTaskStepRelVo.setIsHit(0); + needProcessTaskStepRelList.add(processTaskStepRelVo); + } + } + } + avoidCyclingStepIdList.add(currentProcessTaskStepId); if (CollectionUtils.isNotEmpty(toStepIdList)) { - ProcessTaskStepRelVo processTaskStepRelVo = new ProcessTaskStepRelVo(); - processTaskStepRelVo.setFromProcessTaskStepId(currentProcessTaskStepId); - processTaskStepRelVo.setIsHit(0); - processTaskStepRelVo.setType(ProcessFlowDirection.FORWARD.getValue()); - processTaskCrossoverMapper.updateProcessTaskStepRelIsHit(processTaskStepRelVo); - stepIdList.add(currentProcessTaskStepId); for (Long toStepId : toStepIdList) { - resetPostStepRelIsHit(toStepId, stepIdList); + if (!avoidCyclingStepIdList.contains(currentProcessTaskStepId)) { + doResetPostStepRelIsHit(toStepId, avoidCyclingStepIdList, allProcessTaskStepRelList, needProcessTaskStepRelList); + } } } } + /** + * 将当前步骤的所有后续步骤间的连线的isHit设置为0 + * + * @param currentProcessTaskStepId 当前步骤id + * @param avoidCyclingStepIdList 避免循环步骤id列表 + */ +// private void doResetPostStepRelIsHit(Long currentProcessTaskStepId, List avoidCyclingStepIdList) { +// IProcessTaskCrossoverMapper processTaskCrossoverMapper = CrossoverServiceFactory.getApi(IProcessTaskCrossoverMapper.class); +// ProcessTaskStepVo step = processTaskCrossoverMapper.getProcessTaskStepBaseInfoById(currentProcessTaskStepId); +// List toStepIdList = processTaskCrossoverMapper.getToProcessTaskStepIdListByFromIdAndType(currentProcessTaskStepId, ProcessFlowDirection.FORWARD.getValue()); +// if (CollectionUtils.isNotEmpty(toStepIdList)) { +// ProcessTaskStepRelVo processTaskStepRelVo = new ProcessTaskStepRelVo(); +// processTaskStepRelVo.setFromProcessTaskStepId(currentProcessTaskStepId); +// processTaskStepRelVo.setIsHit(0); +// processTaskStepRelVo.setType(ProcessFlowDirection.FORWARD.getValue()); +// processTaskCrossoverMapper.updateProcessTaskStepRelIsHit(processTaskStepRelVo); +// avoidCyclingStepIdList.add(currentProcessTaskStepId); +// for (Long toStepId : toStepIdList) { +// if (!avoidCyclingStepIdList.contains(currentProcessTaskStepId)) { +// doResetPostStepRelIsHit(toStepId, avoidCyclingStepIdList); +// } +// } +// } +// } + /** * 将当前步骤的所有后续步骤中流转过的步骤都进行挂起操作 * @@ -2469,7 +2568,7 @@ public abstract class ProcessStepHandlerBase implements IProcessStepHandler { /* 如果当前步骤是二次进入(后续路径已经走过),则需要对所有后续流转过的步骤都进行挂起操作 **/ hangPostStep(currentProcessTaskStepVo); - resetPostStepRelIsHit(currentProcessTaskStepVo.getId()); + resetPostStepRelIsHit(currentProcessTaskStepVo.getProcessTaskId(), currentProcessTaskStepVo.getId()); /* 获取当前步骤状态 **/ /* 分配处理人 **/ -- Gitee