From a2e9e020b1d9548d9bd841b44427455fbd33cbb9 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Sun, 11 Oct 2026 23:55:02 +0800 Subject: [PATCH] =?UTF-8?q?mk=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/mk/MkProcessMessageService.java | 15 +--- .../transport/mk/MkProcessNodeHelper.java | 84 ++++++++++++++++++- .../CustomerArchivePublicProcessService.java | 17 +--- .../impl/CustomerArchiveServiceImpl.java | 6 +- 4 files changed, 88 insertions(+), 34 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessMessageService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessMessageService.java index 9443faa8..2e23f078 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessMessageService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessMessageService.java @@ -105,7 +105,7 @@ public class MkProcessMessageService { bizType, processId, loginName, JSON.toJSONString(processInfo)); if (isProcessFinished(processInfo)) { applyProcessResult(handler, bizType, bizIdText, processId, formValues, true); - } else if (isProcessRejected(processInfo)) { + } else if (MkProcessNodeHelper.isProcessRejected(processInfo)) { applyProcessResult(handler, bizType, bizIdText, processId, formValues, false); } else if (StringUtil.isNotBlank(bizIdText)) { try { @@ -123,19 +123,6 @@ public class MkProcessMessageService { return "30".equals(firstText(asMap(processInfo), "fdProcessStatus")); } - private static boolean isProcessRejected(Object processInfo) { - Map info = asMap(processInfo); - if (!"20".equals(firstText(info, "fdProcessStatus"))) { - return false; - } - Object historyHandlerInfos = asMap(info.get("fdTaskInfo")).get("historyHandlerInfos"); - if (!(historyHandlerInfos instanceof List historyList) || historyList.isEmpty()) { - return false; - } - Object lastHandler = historyList.get(historyList.size() - 1); - return "N6".equals(firstText(asMap(lastHandler), "nodeNumber")); - } - private void applyProcessResult(IMkProcessBizHandler handler, String bizType, String bizIdText, String processId, Map formValues, boolean approved) { String action = approved ? "审核通过" : "审核驳回"; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessNodeHelper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessNodeHelper.java index c665e58f..6004bbb0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessNodeHelper.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessNodeHelper.java @@ -11,20 +11,47 @@ import java.util.Map; import java.util.stream.Collectors; /** - * 解析 MK 流程实例详情中的当前节点、当前处理人 + * 解析 MK 流程实例详情中的当前节点、当前处理人,以及流程是否驳回到起草节点。 */ public final class MkProcessNodeHelper { + /** + * 起草节点编号。审批节点编号随流程模板变化,不能用来判断驳回。 + */ + private static final String DRAFT_NODE_NUMBER = "N2"; + + private static final List CURRENT_NODE_KEYS = List.of("handlerInfos", "drafterInfos", "adminInfos"); + private MkProcessNodeHelper() { } + /** + * 流程未结束,且当前待办已经回到起草节点时,才视为审核驳回。 + * 中间审批节点通过后流程状态仍是 20,不能把历史节点编号当成驳回。 + */ + public static boolean isProcessRejected(Object processInfo) { + Map info = asMap(processInfo); + String processStatus = text(info.get("fdProcessStatus")); + if (!"11".equals(processStatus) && !"20".equals(processStatus)) { + return false; + } + return hasActiveDraftNode(asMap(info.get("fdTaskInfo"))); + } + public static String currentProcessor(Object processInfo) { return joinDistinct(extractTexts(asMap(processInfo).get("currentHandlers"), "fdName", "name"), "、"); } public static String currentNode(Object processInfo) { Map taskInfo = asMap(asMap(processInfo).get("fdTaskInfo")); - return joinDistinct(extractTexts(taskInfo.get("handlerInfos"), "nodeName"), "、"); + List nodeNames = new ArrayList<>(); + for (String key : CURRENT_NODE_KEYS) { + nodeNames.addAll(extractActiveNodeNames(taskInfo.get(key))); + } + if (nodeNames.isEmpty()) { + nodeNames.addAll(extractTexts(taskInfo.get("handlerInfos"), "nodeName")); + } + return joinDistinct(nodeNames, "、"); } public static String text(String value, String fallback) { @@ -52,6 +79,59 @@ public final class MkProcessNodeHelper { } } + private static boolean hasActiveDraftNode(Map taskInfo) { + for (String key : CURRENT_NODE_KEYS) { + Object nodes = taskInfo.get(key); + if (!(nodes instanceof Collection collection)) { + continue; + } + for (Object item : collection) { + if (isActiveDraftNode(asMap(item))) { + return true; + } + } + } + return false; + } + + private static boolean isActiveDraftNode(Map node) { + if (!"20".equals(text(node.get("status")))) { + return false; + } + String nodeNumber = text(node.get("nodeNumber")); + if (Func.isEmpty(nodeNumber)) { + nodeNumber = text(node.get("nodeId")); + } + if (DRAFT_NODE_NUMBER.equals(nodeNumber)) { + return true; + } + String activityType = text(node.get("activityType")); + return "draft".equalsIgnoreCase(activityType) || "draftTask".equalsIgnoreCase(activityType); + } + + private static List extractActiveNodeNames(Object listObj) { + List result = new ArrayList<>(); + if (!(listObj instanceof Collection collection)) { + return result; + } + for (Object item : collection) { + Map node = asMap(item); + if (!"20".equals(text(node.get("status")))) { + continue; + } + String nodeName = text(node.get("nodeName")); + if (Func.isNotEmpty(nodeName)) { + result.add(nodeName); + } + } + return result; + } + + private static String text(Object value) { + String text = Func.toStr(value, "").trim(); + return "null".equalsIgnoreCase(text) ? "" : text; + } + private static List extractTexts(Object listObj, String... keys) { List result = new ArrayList<>(); if (!(listObj instanceof Collection collection) || keys == null) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchivePublicProcessService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchivePublicProcessService.java index 1c7aa6ae..81a00f48 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchivePublicProcessService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchivePublicProcessService.java @@ -12,12 +12,12 @@ import org.springblade.core.tenant.annotation.TenantIgnore; import org.springblade.core.tool.api.FR; import org.springblade.core.tool.utils.StringUtil; import org.springblade.process.feign.IBusinessProcessClient; +import org.springblade.transport.mk.MkProcessNodeHelper; import org.springblade.transport.service.ICustomerArchiveService; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -97,7 +97,7 @@ public class CustomerArchivePublicProcessService { processId, loginName, JSON.toJSONString(processInfo)); if (isProcessFinished(processInfo)) { applyProcessResult(customerIdText, processId, formValues, true); - } else if (isProcessRejected(processInfo)) { + } else if (MkProcessNodeHelper.isProcessRejected(processInfo)) { applyProcessResult(customerIdText, processId, formValues, false); } else if (StringUtil.isNotBlank(customerIdText)) { try { @@ -115,19 +115,6 @@ public class CustomerArchivePublicProcessService { return "30".equals(firstText(asMap(processInfo), "fdProcessStatus")); } - private static boolean isProcessRejected(Object processInfo) { - Map info = asMap(processInfo); - if (!"20".equals(firstText(info, "fdProcessStatus"))) { - return false; - } - Object historyHandlerInfos = asMap(info.get("fdTaskInfo")).get("historyHandlerInfos"); - if (!(historyHandlerInfos instanceof List historyList) || historyList.isEmpty()) { - return false; - } - Object lastHandler = historyList.get(historyList.size() - 1); - return "N6".equals(firstText(asMap(lastHandler), "nodeNumber")); - } - private void applyProcessResult(String customerIdText, String processId, Map formValues, boolean approved) { String action = approved ? "审核通过" : "审核驳回"; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java index 81b9cb44..4b29ab75 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java @@ -33,6 +33,7 @@ import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.transport.mk.MkProcessNodeHelper; import org.springblade.transport.support.TransportBusinessSupport; import org.springblade.core.tenant.annotation.TenantIgnore; import org.springblade.core.tool.jackson.JsonUtil; @@ -303,9 +304,8 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl taskInfo = asStringObjectMap(info.get("fdTaskInfo")); - String currentNode = joinDistinct(extractTexts(taskInfo.get("handlerInfos"), "nodeName"), "、"); + String currentProcessor = MkProcessNodeHelper.currentProcessor(processInfo); + String currentNode = MkProcessNodeHelper.currentNode(processInfo); if (Func.isEmpty(currentNode) && Func.isEmpty(currentProcessor)) { log.warn("同步客商当前节点跳过,未解析到节点名称或处理人 id={}", id); return false;