2222import cn .cordys .mybatis .lambda .LambdaQueryWrapper ;
2323import jakarta .annotation .Resource ;
2424import org .apache .commons .collections4 .CollectionUtils ;
25+ import org .apache .commons .lang3 .StringUtils ;
2526import org .apache .commons .lang3 .Strings ;
2627import 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