From 56ba7464b8f085de2865b08d6cfe61c9a6fc3a4a Mon Sep 17 00:00:00 2001 From: zjh <15615273395@163.com> Date: Wed, 17 Dec 2025 18:27:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TemplateApprovalServiceImpl.java | 232 ++++++++++-------- 1 file changed, 124 insertions(+), 108 deletions(-) diff --git a/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java index fa200e2..a59ae3c 100644 --- a/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java @@ -284,140 +284,156 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { } @Override - public ApprovalFlowView getApprovalProcess(ApprovalFlowForm form) { + public ApprovalFlowView getApprovalProcess( + ApprovalFlowForm form + ) { ApprovalFlowView approvalFlowView = new ApprovalFlowView(); + + // 查询流程基本信息 ApprovalFlow flow = bd.getBusinessDatabase() .eq("id", form.getFlowId()) .eq("flow_type", 1) .doQueryFirst(ApprovalFlow.class); + approvalFlowView.setExplanation(flow.getExplanation()); + approvalFlowView.setFlowStatus(flow.getFlowStatus()); + + // 初始化所有节点列表 + approvalFlowView.setProofreadNodes(new ArrayList<>()); + approvalFlowView.setReviewNodes(new ArrayList<>()); + approvalFlowView.setCountersignNodes(new ArrayList<>()); + approvalFlowView.setApproveNodes(new ArrayList<>()); + + // 第一步:获取校对节点 List proofread = getNodeList(form.getFlowId(), "PROOFREAD"); - if (proofread.isEmpty()) { - List list = new ArrayList<>(); - StringBuilder usernames = new StringBuilder(); - JSON.parseArray(flow.getProofreadUsers()).toJavaList(String.class).forEach(id -> { - ApprovalXdapUsers user = bd.getBusinessDatabase() - .eq("id", id) - .doQueryFirst(ApprovalXdapUsers.class); - usernames.append(user.getUsername()).append(" "); - }); - ApprovalNodeView approvalNodeView = new ApprovalNodeView(); - approvalNodeView.setNode("APPROVING"); - approvalNodeView.setUserName(usernames.toString()); - approvalNodeView.setResult("APPROVING"); - approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); - list.add(approvalNodeView); - - approvalFlowView.setProofreadNodes(list); - approvalFlowView.setReviewNodes(new ArrayList<>()); - approvalFlowView.setCountersignNodes(new ArrayList<>()); - approvalFlowView.setApproveNodes(new ArrayList<>()); - - approvalFlowView.setFlowStatus(flow.getFlowStatus()); + if (!proofread.isEmpty()) { + approvalFlowView.setProofreadNodes(proofread); + } else if ("APPROVING".equals(flow.getFlowStatus())) { + // 如果流程还在审批中且没有校对记录,添加待处理节点 + approvalFlowView.setProofreadNodes(createPendingNodeList(flow.getProofreadUsers(), "PROOFREAD")); return approvalFlowView; } - approvalFlowView.setProofreadNodes(proofread); + + // 第二步:如果流程还在审批中,继续查询审阅节点 + if (!"APPROVING".equals(flow.getFlowStatus())) { + return approvalFlowView; + } + List review = getNodeList(flow.getId(), "REVIEW"); - if (review.isEmpty()) { - List list = new ArrayList<>(); - StringBuilder usernames = new StringBuilder(); - JSON.parseArray(flow.getReviewUsers()).toJavaList(String.class).forEach(id -> { - ApprovalXdapUsers user = bd.getBusinessDatabase() - .eq("id", id) - .doQueryFirst(ApprovalXdapUsers.class); - usernames.append(user.getUsername()).append(" "); - }); - ApprovalNodeView approvalNodeView = new ApprovalNodeView(); - approvalNodeView.setNode("APPROVING"); - approvalNodeView.setUserName(usernames.toString()); - approvalNodeView.setResult("APPROVING"); - approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); - list.add(approvalNodeView); - - approvalFlowView.setReviewNodes(list); - approvalFlowView.setCountersignNodes(new ArrayList<>()); - approvalFlowView.setApproveNodes(new ArrayList<>()); - - approvalFlowView.setFlowStatus(flow.getFlowStatus()); + if (!review.isEmpty()) { + approvalFlowView.setReviewNodes(review); + } else { + // 添加待处理的审阅节点 + approvalFlowView.setReviewNodes(createPendingNodeList(flow.getReviewUsers(), "REVIEW")); return approvalFlowView; } - approvalFlowView.setReviewNodes(review); - if (JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class).isEmpty()) { - approvalFlowView.setCountersignNodes(new ArrayList<>()); - } else { + // 第三步:如果流程还在审批中,继续查询会签节点 + if (!"APPROVING".equals(flow.getFlowStatus())) { + return approvalFlowView; + } + + List countersignUsers = JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class); + if (!countersignUsers.isEmpty()) { List countersign = getNodeList(flow.getId(), "COUNTERSIGN"); + if (countersign.isEmpty()) { - List list = new ArrayList<>(); - StringBuilder usernames = new StringBuilder(); - JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class).forEach(id -> { - ApprovalXdapUsers user = bd.getBusinessDatabase() - .eq("id", id) - .doQueryFirst(ApprovalXdapUsers.class); - usernames.append(user.getUsername()).append(" "); - }); - ApprovalNodeView approvalNodeView = new ApprovalNodeView(); - approvalNodeView.setNode("APPROVING"); - approvalNodeView.setUserName(usernames.toString()); - approvalNodeView.setResult("APPROVING"); - approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); - list.add(approvalNodeView); - approvalFlowView.setCountersignNodes(list); - approvalFlowView.setApproveNodes(new ArrayList<>()); - approvalFlowView.setFlowStatus(flow.getFlowStatus()); + // 添加待处理的会签节点 + approvalFlowView.setCountersignNodes(createPendingNodeList(flow.getCountersignUsers(), "COUNTERSIGN")); + return approvalFlowView; + } else if (countersign.size() < countersignUsers.size()) { + // 部分会签完成,添加未处理的会签节点 + approvalFlowView.setCountersignNodes(getPartialCountersignNodes(countersign, countersignUsers)); return approvalFlowView; } else { - if (countersign.size() == JSON.parseArray(flow.getCountersignUsers()).size()) { - approvalFlowView.setCountersignNodes(countersign); - } else { - List containedIds = countersign.stream().map(ApprovalNodeView::getUserId).collect(Collectors.toList()); - List uncontainedIds = JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class).stream().filter(id -> !containedIds.contains(id)).collect(Collectors.toList()); - StringBuilder usernames = new StringBuilder(); - uncontainedIds.forEach(id -> { - ApprovalXdapUsers user = bd.getBusinessDatabase() - .eq("id", id) - .doQueryFirst(ApprovalXdapUsers.class); - usernames.append(user.getUsername()).append(" "); - }); - ApprovalNodeView approvalNodeView = new ApprovalNodeView(); - approvalNodeView.setNode("APPROVING"); - approvalNodeView.setUserName(usernames.toString()); - approvalNodeView.setResult("APPROVING"); - approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); - countersign.add(approvalNodeView); - approvalFlowView.setCountersignNodes(countersign); - approvalFlowView.setApproveNodes(new ArrayList<>()); - return approvalFlowView; - } + approvalFlowView.setCountersignNodes(countersign); } } - List approve = getNodeList(flow.getId(), "APPROVE"); - if (approve.isEmpty()) { - List list = new ArrayList<>(); - StringBuilder usernames = new StringBuilder(); - JSON.parseArray(flow.getApproveUsers()).toJavaList(String.class).forEach(id -> { - ApprovalXdapUsers user = bd.getBusinessDatabase() - .eq("id", id) - .doQueryFirst(ApprovalXdapUsers.class); - usernames.append(user.getUsername()).append(" "); - }); - ApprovalNodeView approvalNodeView = new ApprovalNodeView(); - approvalNodeView.setNode("APPROVING"); - approvalNodeView.setUserName(usernames.toString()); - approvalNodeView.setResult("APPROVING"); - approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); - list.add(approvalNodeView); - approvalFlowView.setApproveNodes(list); - approvalFlowView.setFlowStatus(flow.getFlowStatus()); + // 第四步:如果流程还在审批中,继续查询批准节点 + if (!"APPROVING".equals(flow.getFlowStatus())) { return approvalFlowView; } - approvalFlowView.setApproveNodes(approve); - approvalFlowView.setFlowStatus(flow.getFlowStatus()); + List approve = getNodeList(flow.getId(), "APPROVE"); + if (!approve.isEmpty()) { + approvalFlowView.setApproveNodes(approve); + } else { + // 添加待处理的批准节点 + approvalFlowView.setApproveNodes(createPendingNodeList(flow.getApproveUsers(), "APPROVE")); + } + return approvalFlowView; } + /** + * 创建待处理节点列表 + */ + private List createPendingNodeList( + String userJson, String nodeType + ) { + List list = new ArrayList<>(); + StringBuilder usernames = new StringBuilder(); + + JSON.parseArray(userJson).toJavaList(String.class).forEach(id -> { + ApprovalXdapUsers user = bd.getBusinessDatabase() + .eq("id", id) + .doQueryFirst(ApprovalXdapUsers.class); + usernames.append(user.getUsername()).append(" "); + }); + + ApprovalNodeView approvalNodeView = new ApprovalNodeView(); + approvalNodeView.setNode(nodeType); + approvalNodeView.setUserName(usernames.toString().trim()); + approvalNodeView.setResult("APPROVING"); + approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + list.add(approvalNodeView); + + return list; + } + + /** + * 获取部分完成的会签节点(包含已处理和未处理的) + */ + private List getPartialCountersignNodes( + List existingCountersign, + List allCountersignUserIds + ) { + + List completedUserIds = existingCountersign.stream() + .map(ApprovalNodeView::getUserId) + .collect(Collectors.toList()); + + // 找出未处理的用户ID + List pendingUserIds = allCountersignUserIds.stream() + .filter(id -> !completedUserIds.contains(id)) + .collect(Collectors.toList()); + + // 获取未处理用户的用户名 + StringBuilder pendingUsernames = new StringBuilder(); + pendingUserIds.forEach(id -> { + ApprovalXdapUsers user = bd.getBusinessDatabase() + .eq("id", id) + .doQueryFirst(ApprovalXdapUsers.class); + if (user != null) { + pendingUsernames.append(user.getUsername()).append(" "); + } + }); + + // 创建待处理节点 + ApprovalNodeView pendingNode = new ApprovalNodeView(); + pendingNode.setNode("COUNTERSIGN"); + pendingNode.setUserName(pendingUsernames.toString().trim()); + pendingNode.setResult("APPROVING"); + pendingNode.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + + // 合并已处理和待处理节点 + List allNodes = new ArrayList<>(existingCountersign); + allNodes.add(pendingNode); + + return allNodes; + } + @Override public void handleReturn(HandleApprovalRequest request) { ApprovalFlow flow = bd.getBusinessDatabase()