Merge remote-tracking branch 'origin/master'

This commit is contained in:
ys.git 2025-12-18 09:57:40 +08:00
commit b04db8080f

View File

@ -284,140 +284,156 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
} }
@Override @Override
public ApprovalFlowView getApprovalProcess(ApprovalFlowForm form) { public ApprovalFlowView getApprovalProcess(
ApprovalFlowForm form
) {
ApprovalFlowView approvalFlowView = new ApprovalFlowView(); ApprovalFlowView approvalFlowView = new ApprovalFlowView();
// 查询流程基本信息
ApprovalFlow flow = bd.getBusinessDatabase() ApprovalFlow flow = bd.getBusinessDatabase()
.eq("id", form.getFlowId()) .eq("id", form.getFlowId())
.eq("flow_type", 1) .eq("flow_type", 1)
.doQueryFirst(ApprovalFlow.class); .doQueryFirst(ApprovalFlow.class);
approvalFlowView.setExplanation(flow.getExplanation()); 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<ApprovalNodeView> proofread = getNodeList(form.getFlowId(), "PROOFREAD"); List<ApprovalNodeView> proofread = getNodeList(form.getFlowId(), "PROOFREAD");
if (proofread.isEmpty()) { if (!proofread.isEmpty()) {
List<ApprovalNodeView> list = new ArrayList<>(); approvalFlowView.setProofreadNodes(proofread);
StringBuilder usernames = new StringBuilder(); } else if ("APPROVING".equals(flow.getFlowStatus())) {
JSON.parseArray(flow.getProofreadUsers()).toJavaList(String.class).forEach(id -> { // 如果流程还在审批中且没有校对记录添加待处理节点
ApprovalXdapUsers user = bd.getBusinessDatabase() approvalFlowView.setProofreadNodes(createPendingNodeList(flow.getProofreadUsers(), "PROOFREAD"));
.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());
return approvalFlowView; return approvalFlowView;
} }
approvalFlowView.setProofreadNodes(proofread);
// 第二步如果流程还在审批中继续查询审阅节点
if (!"APPROVING".equals(flow.getFlowStatus())) {
return approvalFlowView;
}
List<ApprovalNodeView> review = getNodeList(flow.getId(), "REVIEW"); List<ApprovalNodeView> review = getNodeList(flow.getId(), "REVIEW");
if (review.isEmpty()) { if (!review.isEmpty()) {
List<ApprovalNodeView> list = new ArrayList<>(); approvalFlowView.setReviewNodes(review);
StringBuilder usernames = new StringBuilder(); } else {
JSON.parseArray(flow.getReviewUsers()).toJavaList(String.class).forEach(id -> { // 添加待处理的审阅节点
ApprovalXdapUsers user = bd.getBusinessDatabase() approvalFlowView.setReviewNodes(createPendingNodeList(flow.getReviewUsers(), "REVIEW"));
.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());
return approvalFlowView; return approvalFlowView;
} }
approvalFlowView.setReviewNodes(review);
if (JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class).isEmpty()) { // 第三步如果流程还在审批中继续查询会签节点
approvalFlowView.setCountersignNodes(new ArrayList<>()); if (!"APPROVING".equals(flow.getFlowStatus())) {
} else { return approvalFlowView;
}
List<String> countersignUsers = JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class);
if (!countersignUsers.isEmpty()) {
List<ApprovalNodeView> countersign = getNodeList(flow.getId(), "COUNTERSIGN"); List<ApprovalNodeView> countersign = getNodeList(flow.getId(), "COUNTERSIGN");
if (countersign.isEmpty()) { if (countersign.isEmpty()) {
List<ApprovalNodeView> list = new ArrayList<>(); // 添加待处理的会签节点
StringBuilder usernames = new StringBuilder(); approvalFlowView.setCountersignNodes(createPendingNodeList(flow.getCountersignUsers(), "COUNTERSIGN"));
JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class).forEach(id -> { return approvalFlowView;
ApprovalXdapUsers user = bd.getBusinessDatabase() } else if (countersign.size() < countersignUsers.size()) {
.eq("id", id) // 部分会签完成添加未处理的会签节点
.doQueryFirst(ApprovalXdapUsers.class); approvalFlowView.setCountersignNodes(getPartialCountersignNodes(countersign, countersignUsers));
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());
return approvalFlowView; return approvalFlowView;
} else { } else {
if (countersign.size() == JSON.parseArray(flow.getCountersignUsers()).size()) { approvalFlowView.setCountersignNodes(countersign);
approvalFlowView.setCountersignNodes(countersign);
} else {
List<String> containedIds = countersign.stream().map(ApprovalNodeView::getUserId).collect(Collectors.toList());
List<String> 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;
}
} }
} }
List<ApprovalNodeView> approve = getNodeList(flow.getId(), "APPROVE"); // 第四步如果流程还在审批中继续查询批准节点
if (approve.isEmpty()) { if (!"APPROVING".equals(flow.getFlowStatus())) {
List<ApprovalNodeView> 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());
return approvalFlowView; return approvalFlowView;
} }
approvalFlowView.setApproveNodes(approve);
approvalFlowView.setFlowStatus(flow.getFlowStatus()); List<ApprovalNodeView> approve = getNodeList(flow.getId(), "APPROVE");
if (!approve.isEmpty()) {
approvalFlowView.setApproveNodes(approve);
} else {
// 添加待处理的批准节点
approvalFlowView.setApproveNodes(createPendingNodeList(flow.getApproveUsers(), "APPROVE"));
}
return approvalFlowView; return approvalFlowView;
} }
/**
* 创建待处理节点列表
*/
private List<ApprovalNodeView> createPendingNodeList(
String userJson, String nodeType
) {
List<ApprovalNodeView> 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<ApprovalNodeView> getPartialCountersignNodes(
List<ApprovalNodeView> existingCountersign,
List<String> allCountersignUserIds
) {
List<String> completedUserIds = existingCountersign.stream()
.map(ApprovalNodeView::getUserId)
.collect(Collectors.toList());
// 找出未处理的用户ID
List<String> 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<ApprovalNodeView> allNodes = new ArrayList<>(existingCountersign);
allNodes.add(pendingNode);
return allNodes;
}
@Override @Override
public void handleReturn(HandleApprovalRequest request) { public void handleReturn(HandleApprovalRequest request) {
ApprovalFlow flow = bd.getBusinessDatabase() ApprovalFlow flow = bd.getBusinessDatabase()