diff --git a/src/test/java/com/gxwebsoft/approval/ApprovalSettlementIT.java b/src/test/java/com/gxwebsoft/approval/ApprovalSettlementIT.java index 152b3b4..e517fe0 100644 --- a/src/test/java/com/gxwebsoft/approval/ApprovalSettlementIT.java +++ b/src/test/java/com/gxwebsoft/approval/ApprovalSettlementIT.java @@ -515,9 +515,18 @@ class ApprovalSettlementIT { .andExpect(jsonPath("$.code").value(0)); } - /** 按组把剩余待办逐个通过(会签组内成员来自共享库角色,逐个处理最稳)。 */ + /** + * 按组把剩余待办逐个通过(会签组内成员来自共享库角色,逐个处理最稳)。 + * + *

共享库里同一个人可能同时属于多个会签组,按 ADR 0003 他一次通过就会完成本节点本轮 + * 全部待办,节点随即推进、其余组的待办被取消。因此每轮都要先看节点是否还在会签, + * 且批准前复查该任务是否仍为 PENDING——读到的是快照,不能用它直接点通过。

+ */ private void approveAllByGroup(long instanceId, String groupKey) throws Exception { for (int guard = 0; guard < 20; guard++) { + if (!"countersign".equals(currentNodeKey(instanceId))) { + return; + } List> tasks = data.master().queryForList( "SELECT id, assignee_id, assignee_name FROM approval_task WHERE instance_id = ? " + "AND node_key = 'countersign' AND group_key = ? AND status = 'PENDING' ORDER BY id", @@ -533,6 +542,12 @@ class ApprovalSettlementIT { private void approveTask(Map task, Integer org) throws Exception { long taskId = ((Number) task.get("id")).longValue(); + // 快照里的待办可能已被同一次通过连带完成或取消,批准前必须复查 + Integer pending = data.queryMaster("SELECT COUNT(*) FROM approval_task WHERE id = ? AND status = 'PENDING'", + Integer.class, taskId); + if (pending == null || pending == 0) { + return; + } String name = (String) task.get("assignee_name"); ApprovalTestData.TestUser assignee = new ApprovalTestData.TestUser(((Number) task.get("assignee_id")).intValue(), name, name);