修改:流程节点问题小修改
This commit is contained in:
parent
a5294f6aec
commit
39da3ad6fe
@ -284,154 +284,136 @@ 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);
|
||||
|
||||
if (flow == null) {
|
||||
return approvalFlowView;
|
||||
}
|
||||
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");
|
||||
if (!proofread.isEmpty()) {
|
||||
approvalFlowView.setProofreadNodes(proofread);
|
||||
} else if ("APPROVING".equals(flow.getFlowStatus())) {
|
||||
// 如果流程还在审批中且没有校对记录,添加待处理节点
|
||||
approvalFlowView.setProofreadNodes(createPendingNodeList(flow.getProofreadUsers(), "PROOFREAD"));
|
||||
return approvalFlowView;
|
||||
}
|
||||
|
||||
// 第二步:如果流程还在审批中,继续查询审阅节点
|
||||
if (!"APPROVING".equals(flow.getFlowStatus())) {
|
||||
setAllCompletedNodes(approvalFlowView, flow);
|
||||
return approvalFlowView;
|
||||
}
|
||||
|
||||
List<ApprovalNodeView> review = getNodeList(flow.getId(), "REVIEW");
|
||||
if (!review.isEmpty()) {
|
||||
approvalFlowView.setReviewNodes(review);
|
||||
} else {
|
||||
// 添加待处理的审阅节点
|
||||
approvalFlowView.setReviewNodes(createPendingNodeList(flow.getReviewUsers(), "REVIEW"));
|
||||
return approvalFlowView;
|
||||
}
|
||||
|
||||
// 第三步:如果流程还在审批中,继续查询会签节点
|
||||
if (!"APPROVING".equals(flow.getFlowStatus())) {
|
||||
return approvalFlowView;
|
||||
}
|
||||
|
||||
List<String> countersignUsers = JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class);
|
||||
if (!countersignUsers.isEmpty()) {
|
||||
List<ApprovalNodeView> countersign = getNodeList(flow.getId(), "COUNTERSIGN");
|
||||
|
||||
if (countersign.isEmpty()) {
|
||||
// 添加待处理的会签节点
|
||||
approvalFlowView.setCountersignNodes(createPendingNodeList(flow.getCountersignUsers(), "COUNTERSIGN"));
|
||||
return approvalFlowView;
|
||||
} else if (countersign.size() < countersignUsers.size()) {
|
||||
// 部分会签完成,添加未处理的会签节点
|
||||
approvalFlowView.setCountersignNodes(getPartialCountersignNodes(countersign, countersignUsers));
|
||||
return approvalFlowView;
|
||||
} else {
|
||||
approvalFlowView.setCountersignNodes(countersign);
|
||||
}
|
||||
}
|
||||
|
||||
// 第四步:如果流程还在审批中,继续查询批准节点
|
||||
if (!"APPROVING".equals(flow.getFlowStatus())) {
|
||||
return approvalFlowView;
|
||||
}
|
||||
|
||||
List<ApprovalNodeView> approve = getNodeList(flow.getId(), "APPROVE");
|
||||
if (!approve.isEmpty()) {
|
||||
approvalFlowView.setApproveNodes(approve);
|
||||
} else {
|
||||
// 添加待处理的批准节点
|
||||
approvalFlowView.setApproveNodes(createPendingNodeList(flow.getApproveUsers(), "APPROVE"));
|
||||
}
|
||||
|
||||
processApprovalNodes(approvalFlowView, flow);
|
||||
return approvalFlowView;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建待处理节点列表
|
||||
*/
|
||||
private List<ApprovalNodeView> createPendingNodeList(
|
||||
String userJson, String nodeType
|
||||
) {
|
||||
private void setAllCompletedNodes(ApprovalFlowView view, ApprovalFlow flow) {
|
||||
view.setProofreadNodes(getNodeList(flow.getId(), "PROOFREAD"));
|
||||
view.setReviewNodes(getNodeList(flow.getId(), "REVIEW"));
|
||||
view.setCountersignNodes(getNodeList(flow.getId(), "COUNTERSIGN"));
|
||||
view.setApproveNodes(getNodeList(flow.getId(), "APPROVE"));
|
||||
}
|
||||
|
||||
private void processApprovalNodes(ApprovalFlowView view, ApprovalFlow flow) {
|
||||
// 处理校对节点
|
||||
List<ApprovalNodeView> proofreadNodes = getNodeList(flow.getId(), "PROOFREAD");
|
||||
if (proofreadNodes.isEmpty()) {
|
||||
view.setProofreadNodes(createApprovingNode(flow.getProofreadUsers()));
|
||||
view.setReviewNodes(new ArrayList<>());
|
||||
view.setCountersignNodes(new ArrayList<>());
|
||||
view.setApproveNodes(new ArrayList<>());
|
||||
return;
|
||||
}
|
||||
view.setProofreadNodes(proofreadNodes);
|
||||
|
||||
// 处理审核节点
|
||||
List<ApprovalNodeView> reviewNodes = getNodeList(flow.getId(), "REVIEW");
|
||||
if (reviewNodes.isEmpty()) {
|
||||
view.setReviewNodes(createApprovingNode(flow.getReviewUsers()));
|
||||
view.setCountersignNodes(new ArrayList<>());
|
||||
view.setApproveNodes(new ArrayList<>());
|
||||
return;
|
||||
}
|
||||
view.setReviewNodes(reviewNodes);
|
||||
|
||||
// 处理会签节点
|
||||
List<String> countersignUserIds = JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class);
|
||||
if (countersignUserIds.isEmpty()) {
|
||||
view.setCountersignNodes(new ArrayList<>());
|
||||
} else {
|
||||
List<ApprovalNodeView> countersignNodes = getNodeList(flow.getId(), "COUNTERSIGN");
|
||||
if (countersignNodes.isEmpty()) {
|
||||
view.setCountersignNodes(createApprovingNode(flow.getCountersignUsers()));
|
||||
view.setApproveNodes(new ArrayList<>());
|
||||
return;
|
||||
} else {
|
||||
if (countersignNodes.size() == countersignUserIds.size()) {
|
||||
view.setCountersignNodes(countersignNodes);
|
||||
} else {
|
||||
List<String> completedUserIds = countersignNodes.stream()
|
||||
.map(ApprovalNodeView::getUserId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<String> pendingUserIds = countersignUserIds.stream()
|
||||
.filter(id -> !completedUserIds.contains(id))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (!pendingUserIds.isEmpty()) {
|
||||
countersignNodes.addAll(createApprovingNode(JSON.toJSONString(pendingUserIds)));
|
||||
}
|
||||
view.setCountersignNodes(countersignNodes);
|
||||
view.setApproveNodes(new ArrayList<>());
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<ApprovalNodeView> approveNodes = getNodeList(flow.getId(), "APPROVE");
|
||||
if (approveNodes.isEmpty()) {
|
||||
view.setApproveNodes(createApprovingNode(flow.getApproveUsers()));
|
||||
} else {
|
||||
view.setApproveNodes(approveNodes);
|
||||
}
|
||||
}
|
||||
|
||||
private List<ApprovalNodeView> createApprovingNode(String userJsonArray) {
|
||||
List<ApprovalNodeView> list = new ArrayList<>();
|
||||
|
||||
if (userJsonArray == null || userJsonArray.trim().isEmpty()) {
|
||||
return list;
|
||||
}
|
||||
|
||||
List<String> userIds = JSON.parseArray(userJsonArray).toJavaList(String.class);
|
||||
if (userIds.isEmpty()) {
|
||||
return list;
|
||||
}
|
||||
Map<String, ApprovalXdapUsers> usersMap = batchQueryUsers(userIds);
|
||||
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);
|
||||
|
||||
for (String id : userIds) {
|
||||
ApprovalXdapUsers user = usersMap.get(id);
|
||||
if (user != null) {
|
||||
usernames.append(user.getUsername()).append(" ");
|
||||
}
|
||||
}
|
||||
if (usernames.length() > 0) {
|
||||
ApprovalNodeView node = new ApprovalNodeView();
|
||||
node.setNode("APPROVING");
|
||||
node.setUserName(usernames.toString().trim());
|
||||
node.setResult("APPROVING");
|
||||
node.setApprovalTime(Timestamp.valueOf(LocalDateTime.now()));
|
||||
list.add(node);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取部分完成的会签节点(包含已处理和未处理的)
|
||||
*/
|
||||
private List<ApprovalNodeView> getPartialCountersignNodes(
|
||||
List<ApprovalNodeView> existingCountersign,
|
||||
List<String> allCountersignUserIds
|
||||
) {
|
||||
private Map<String, ApprovalXdapUsers> batchQueryUsers(List<String> userIds) {
|
||||
if (userIds == null || userIds.isEmpty()) {
|
||||
return new HashMap<>();
|
||||
}
|
||||
|
||||
List<String> completedUserIds = existingCountersign.stream()
|
||||
.map(ApprovalNodeView::getUserId)
|
||||
.collect(Collectors.toList());
|
||||
List<ApprovalXdapUsers> users = bd.getBusinessDatabase()
|
||||
.in("id", userIds)
|
||||
.doQuery(ApprovalXdapUsers.class);
|
||||
|
||||
// 找出未处理的用户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;
|
||||
return users.stream()
|
||||
.collect(Collectors.toMap(ApprovalXdapUsers::getId, user -> user));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -480,7 +462,6 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
||||
.eq("id", approvalNodeView.getUserId())
|
||||
.doQueryFirst(ApprovalXdapUsers.class);
|
||||
approvalNodeView.setUserName(user.getUsername());
|
||||
approvalNodeView.setUserId(null);
|
||||
});
|
||||
}
|
||||
return list;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user