Skip to content

Commit 78271fa

Browse files
song-cc-rockfit2-zhao
authored andcommitted
feat: Add approval node status
1 parent dbfc927 commit 78271fa

1 file changed

Lines changed: 59 additions & 4 deletions

File tree

backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalInstanceService.java

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import cn.cordys.mybatis.lambda.LambdaQueryWrapper;
2323
import jakarta.annotation.Resource;
2424
import org.apache.commons.collections4.CollectionUtils;
25+
import org.apache.commons.lang3.StringUtils;
2526
import org.apache.commons.lang3.Strings;
2627
import org.springframework.stereotype.Service;
2728

@@ -154,13 +155,20 @@ private List<ApprovalRecordNode> buildApprovalRecordNodeList(List<ApprovalTask>
154155
Map<String, List<Attachment>> attachmentsMap, Map<String, UserSimple> simpleUserMap,
155156
Map<String, List<ApprovalAddSignTask>> addSignTaskMap, String currentNodeId) {
156157
List<ApprovalRecordNode> nodes = new ArrayList<>();
157-
Map<String, ApprovalRecord> recordMap = records.stream().collect(Collectors.toMap(ApprovalRecord::getTaskId, r -> r));
158+
Map<String, ApprovalRecord> autoNodeRecordMap = records.stream().filter(record -> StringUtils.isBlank(record.getTaskId())).collect(Collectors.toMap(ApprovalRecord::getNodeId, r -> r));
159+
Map<String, ApprovalRecord> taskRecordMap = records.stream().filter(record -> StringUtils.isNotBlank(record.getTaskId())).collect(Collectors.toMap(ApprovalRecord::getTaskId, r -> r));
158160
List<ApprovalTask> nTasks = tasks.stream().filter(task -> ApprovalTaskType.valueOf(task.getType()) == ApprovalTaskType.NL).toList();
159161
Map<String, Integer> nodeMaxRoundMap = mergeNodeMaxRound(nTasks, records);
160162
List<String> sortHisNodes = sortNodeRoundMap(nodeMaxRoundMap, nTasks, records);
161163
// 处理历史节点
162164
sortHisNodes.forEach(hisNode -> {
163165
Integer maxRound = nodeMaxRoundMap.get(hisNode);
166+
if (autoNodeRecordMap.containsKey(hisNode) && autoNodeRecordMap.get(hisNode).getNodeRound().equals(maxRound)) {
167+
// 当前节点的最后一轮执行是自动执行
168+
ApprovalRecordNode recordNode = ApprovalRecordNode.builder().nodeId(hisNode).nodeRound(maxRound).approvalStatus(autoNodeRecordMap.get(hisNode).getResult()).taskNodes(null).ccNodes(null).build();
169+
nodes.addLast(recordNode);
170+
return;
171+
}
164172
// 获取节点下最后一轮抄送任务
165173
List<ApprovalTask> ccTasks = tasks.stream().filter(task -> ApprovalTaskType.valueOf(task.getType()) == ApprovalTaskType.CC
166174
&& Strings.CI.equals(task.getNodeId(), hisNode) && task.getNodeRound().equals(maxRound)).toList();
@@ -184,8 +192,8 @@ private List<ApprovalRecordNode> buildApprovalRecordNodeList(List<ApprovalTask>
184192
// 单人执行
185193
List<ApprovalTask> flatSignTasks = flatSignTask(nlTasks.getFirst(), addSignTaskMap, snTasks.stream().collect(Collectors.toMap(ApprovalTask::getId, t -> t)));
186194
flatSignTasks.forEach(signTask -> {
187-
ApprovalTaskNode taskNode = buildTaskNode(signTask, recordMap, attachmentsMap, simpleUserMap);
188-
ApprovalRecordNode recordNode = ApprovalRecordNode.builder().nodeId(hisNode).nodeRound(maxRound).taskNodes(List.of(taskNode)).build();
195+
ApprovalTaskNode taskNode = buildTaskNode(signTask, taskRecordMap, attachmentsMap, simpleUserMap);
196+
ApprovalRecordNode recordNode = ApprovalRecordNode.builder().nodeId(hisNode).nodeRound(maxRound).approvalStatus(taskNode.getApprovalStatus()).taskNodes(List.of(taskNode)).build();
189197
if (ApprovalTaskType.valueOf(signTask.getType()) == ApprovalTaskType.NL) {
190198
recordNode.setCcNodes(ccNodes);
191199
}
@@ -198,7 +206,7 @@ private List<ApprovalRecordNode> buildApprovalRecordNodeList(List<ApprovalTask>
198206
List<ApprovalTask> flatSignTasks = flatSignTask(nlTask, addSignTaskMap, snTasks.stream().collect(Collectors.toMap(ApprovalTask::getId, t -> t)));
199207
allTask.addAll(flatSignTasks);
200208
});
201-
List<ApprovalTaskNode> taskNodes = allTask.stream().map(nTask -> buildTaskNode(nTask, recordMap, attachmentsMap, simpleUserMap)).toList();
209+
List<ApprovalTaskNode> taskNodes = allTask.stream().map(nTask -> buildTaskNode(nTask, taskRecordMap, attachmentsMap, simpleUserMap)).toList();
202210
ApprovalRecordNode recordNode = ApprovalRecordNode.builder().nodeId(hisNode).nodeRound(maxRound).taskNodes(taskNodes).ccNodes(ccNodes).build();
203211
nodes.addLast(recordNode);
204212
}
@@ -209,12 +217,59 @@ private List<ApprovalRecordNode> buildApprovalRecordNodeList(List<ApprovalTask>
209217
ApprovalNodeApprover approverNode = approverNodeMap.get(node.getNodeId());
210218
if (approverNode != null) {
211219
node.setMultiApproverMode(MultiApproverModeEnum.valueOf(approverNode.getMultiApproverMode()));
220+
if (node.getTaskNodes().size() > 1) {
221+
ApprovalStatus approvalStatusOfMultiNode = getNodeApprovalStatusOfMultiTask(node.getTaskNodes(), node.getMultiApproverMode());
222+
node.setApprovalStatus(approvalStatusOfMultiNode == null ? null : approvalStatusOfMultiNode.name());
223+
}
212224
}
213225

214226
});
215227
return nodes;
216228
}
217229

230+
/**
231+
* 处理多人节点的审批状态
232+
* @param taskNodes 任务节点
233+
* @param approverMode 多人审批方式
234+
* @return 审批状态
235+
*/
236+
private ApprovalStatus getNodeApprovalStatusOfMultiTask(List<ApprovalTaskNode> taskNodes, MultiApproverModeEnum approverMode) {
237+
boolean anyReject = taskNodes.stream().anyMatch(tn -> ApprovalStatus.valueOf(tn.getApprovalStatus()) == ApprovalStatus.UNAPPROVED);
238+
boolean anyAutoReject = taskNodes.stream().anyMatch(tn -> ApprovalStatus.valueOf(tn.getApprovalStatus()) == ApprovalStatus.AUTO_UNAPPROVED);
239+
boolean anyApproved = taskNodes.stream().anyMatch(tn -> ApprovalStatus.valueOf(tn.getApprovalStatus()) == ApprovalStatus.APPROVED);
240+
boolean anyAutoApproved = taskNodes.stream().anyMatch(tn -> ApprovalStatus.valueOf(tn.getApprovalStatus()) == ApprovalStatus.AUTO_APPROVED);
241+
if (approverMode == MultiApproverModeEnum.ALL || approverMode == MultiApproverModeEnum.SEQUENTIAL) {
242+
// 会签, 依次审批 (状态优先级: 驳回 > 自动驳回 -> 已通过 -> 自动通过)
243+
if (anyReject) {
244+
return ApprovalStatus.UNAPPROVED;
245+
}
246+
if (anyAutoReject) {
247+
return ApprovalStatus.AUTO_UNAPPROVED;
248+
}
249+
if (anyApproved) {
250+
return ApprovalStatus.APPROVED;
251+
}
252+
if (anyAutoApproved) {
253+
return ApprovalStatus.AUTO_APPROVED;
254+
}
255+
} else if (approverMode == MultiApproverModeEnum.ANY){
256+
// 或签 (状态优先级: 已通过 > 自动通过 -> 自动驳回 -> 驳回)
257+
if (anyApproved) {
258+
return ApprovalStatus.APPROVED;
259+
}
260+
if (anyAutoApproved) {
261+
return ApprovalStatus.AUTO_APPROVED;
262+
}
263+
if (anyAutoReject) {
264+
return ApprovalStatus.AUTO_UNAPPROVED;
265+
}
266+
if (anyReject) {
267+
return ApprovalStatus.UNAPPROVED;
268+
}
269+
}
270+
return null;
271+
}
272+
218273
/**
219274
* 获取所有审批节点集合
220275
* @param nodeIds 节点ID集合

0 commit comments

Comments
 (0)