diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/CustomerProcessNodeSyncDTO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/CustomerProcessNodeSyncDTO.java index 99168e5..f30493a 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/CustomerProcessNodeSyncDTO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/CustomerProcessNodeSyncDTO.java @@ -27,4 +27,7 @@ public class CustomerProcessNodeSyncDTO implements Serializable { @Schema(description = "审批状态") private String approvalStatus; + + @Schema(description = "MK 流程实例详情,传入后按 currentHandlers.fdName 和 handlerInfos.nodeName 回写") + private Object processInfo; } diff --git a/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java index 1806d52..1b42e38 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java @@ -168,9 +168,9 @@ public class BusinessProcessServiceImpl extends ServiceImpl currentNodes = this.getCurrentNodes(processInstanceId, loginName); - this.syncCustomerArchiveCurrentNode(param.getFormInstanceId(), currentNodes); - this.getProcessInfo(processInstanceId, loginName); + this.getCurrentNodes(processInstanceId, loginName); + Object processInfo = this.getProcessInfo(processInstanceId, loginName); + this.syncCustomerArchiveFromProcessInfo(param.getFormInstanceId(), processInfo); return processInstanceId; } @@ -226,9 +226,9 @@ public class BusinessProcessServiceImpl extends ServiceImpl currentNodes) { - if (StringUtils.isBlank(formInstanceId) || CollectionUtil.isEmpty(currentNodes)) { - log.warn("同步客商当前节点跳过,formInstanceId或节点详情为空 formInstanceId={}", formInstanceId); + private void syncCustomerArchiveFromProcessInfo(String formInstanceId, Object processInfo) { + if (StringUtils.isBlank(formInstanceId) || processInfo == null) { + log.warn("同步客商当前节点跳过,formInstanceId或流程实例详情为空 formInstanceId={}", formInstanceId); return; } Long customerId; @@ -238,32 +238,15 @@ public class BusinessProcessServiceImpl extends ServiceImpl result = customerArchiveClient.syncProcessNode(param); - log.info("同步客商当前节点完成 customerId={} currentNode={} currentProcessor={} result={}", - customerId, currentNode, currentProcessor, JSON.toJSONString(result)); + log.info("同步客商当前节点完成 customerId={} result={}", customerId, JSON.toJSONString(result)); } catch (Exception e) { - log.error("同步客商当前节点异常 customerId={} currentNode={} currentProcessor={}", - customerId, currentNode, currentProcessor, e); + log.error("同步客商当前节点异常 customerId={}", customerId, e); } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CustomerArchivePublicController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CustomerArchivePublicController.java index c339692..19ed444 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CustomerArchivePublicController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CustomerArchivePublicController.java @@ -49,6 +49,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -115,15 +116,6 @@ public class CustomerArchivePublicController { Object nodeData = result == null ? null : result.getData(); log.info("客商公开页流程消息当前节点详情 processId={} loginName={} result={}", processId, loginName, JSON.toJSONString(nodeData)); - if (StringUtil.isBlank(customerIdText)) { - log.warn("客商公开页流程消息未找到客商id,跳过同步当前节点"); - } else { - try { - customerArchiveService.syncProcessNodeFromMk(Long.valueOf(customerIdText), nodeData); - } catch (NumberFormatException e) { - log.warn("客商公开页流程消息客商id格式不正确:{}", customerIdText); - } - } } catch (Exception e) { log.error("客商公开页查询当前节点失败 processId={} loginName={}", processId, loginName, e); } @@ -136,6 +128,12 @@ public class CustomerArchivePublicController { applyProcessResult(customerIdText, processId, formValues, true); } else if (isProcessRejected(processInfo)) { applyProcessResult(customerIdText, processId, formValues, false); + } else if (StringUtil.isNotBlank(customerIdText)) { + try { + customerArchiveService.syncProcessNodeFromProcessInfo(Long.valueOf(customerIdText), processInfo); + } catch (NumberFormatException e) { + log.warn("客商公开页流程消息客商id格式不正确:{}", customerIdText); + } } } catch (Exception e) { log.error("客商公开页查询流程实例详情失败 processId={} loginName={}", processId, loginName, e); @@ -148,7 +146,18 @@ public class CustomerArchivePublicController { } private static boolean isProcessRejected(Object processInfo) { - return "20".equals(firstText(asMap(processInfo), "fdProcessStatus")); + Map info = asMap(processInfo); + if (!"20".equals(firstText(info, "fdProcessStatus"))) { + return false; + } + if (hasItems(info.get("currentHandlers"))) { + return false; + } + return !hasItems(asMap(info.get("fdTaskInfo")).get("handlerInfos")); + } + + private static boolean hasItems(Object value) { + return value instanceof Collection collection && !collection.isEmpty(); } private void applyProcessResult(String customerIdText, String processId, Map formValues, diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/feign/CustomerArchiveClient.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/feign/CustomerArchiveClient.java index 04ffe0a..3b7a716 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/feign/CustomerArchiveClient.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/feign/CustomerArchiveClient.java @@ -30,6 +30,9 @@ public class CustomerArchiveClient implements ICustomerArchiveClient { if (param == null) { return FR.data(false); } + if (param.getProcessInfo() != null) { + return FR.data(customerArchiveService.syncProcessNodeFromProcessInfo(param.getId(), param.getProcessInfo())); + } return FR.data(customerArchiveService.syncProcessNode( param.getId(), param.getCurrentNode(), param.getCurrentProcessor(), param.getApprovalStatus())); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ICustomerArchiveService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ICustomerArchiveService.java index 2541545..b822a2f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ICustomerArchiveService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ICustomerArchiveService.java @@ -120,6 +120,15 @@ public interface ICustomerArchiveService extends BaseService { */ boolean syncProcessNodeFromMk(Long id, Object currentNodes); + /** + * 按 MK 流程实例详情回写当前节点、当前处理人 + * + * @param id 客商ID + * @param processInfo MK getProcessInfo 返回数据 + * @return 是否成功 + */ + boolean syncProcessNodeFromProcessInfo(Long id, Object processInfo); + /** * MK 流程结束(fdProcessStatus=30)时将客商置为审核通过 * 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 fe43c51..cc38929 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 @@ -284,6 +284,28 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl info = asStringObjectMap(processInfo); + if (info.isEmpty()) { + log.warn("同步客商当前节点跳过,流程实例详情为空 id={}", id); + return false; + } + String currentProcessor = joinDistinct(extractTexts(info.get("currentHandlers"), "fdName", "name"), "、"); + Map taskInfo = asStringObjectMap(info.get("fdTaskInfo")); + String currentNode = joinDistinct(extractTexts(taskInfo.get("handlerInfos"), "nodeName"), "、"); + if (Func.isEmpty(currentNode) && Func.isEmpty(currentProcessor)) { + log.warn("同步客商当前节点跳过,未解析到节点名称或处理人 id={}", id); + return false; + } + return syncProcessNode(id, currentNode, currentProcessor, APPROVAL_REVIEWING); + } + @Override @TenantIgnore @Transactional(rollbackFor = Exception.class) @@ -1194,7 +1216,29 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl values) { - return values.stream().filter(Func::isNotEmpty).distinct().collect(Collectors.joining(",")); + return joinDistinct(values, ","); + } + + private String joinDistinct(List values, String delimiter) { + return values.stream().filter(Func::isNotEmpty).distinct().collect(Collectors.joining(delimiter)); + } + + private List extractTexts(Object listObj, String... keys) { + List result = new ArrayList<>(); + if (!(listObj instanceof Collection collection) || keys == null) { + return result; + } + for (Object item : collection) { + Map map = asStringObjectMap(item); + for (String key : keys) { + String text = Func.toStr(map.get(key), "").trim(); + if (Func.isNotEmpty(text)) { + result.add(text); + break; + } + } + } + return result; } private void addChangeRecord(Long customerId, String content, CustomerArchive before, CustomerArchive after) {