test: 会签逐个通过前复查待办状态
共享库成员可能同属多个会签组,一次通过会连带完成其余组待办并推进节点, 按快照直接点通过会撞上「任务已处理」。改为每轮先确认节点仍在会签, 且批准前复查任务仍为 PENDING。
This commit is contained in:
@@ -515,9 +515,18 @@ class ApprovalSettlementIT {
|
|||||||
.andExpect(jsonPath("$.code").value(0));
|
.andExpect(jsonPath("$.code").value(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 按组把剩余待办逐个通过(会签组内成员来自共享库角色,逐个处理最稳)。 */
|
/**
|
||||||
|
* 按组把剩余待办逐个通过(会签组内成员来自共享库角色,逐个处理最稳)。
|
||||||
|
*
|
||||||
|
* <p>共享库里同一个人可能同时属于多个会签组,按 ADR 0003 他一次通过就会完成本节点本轮
|
||||||
|
* 全部待办,节点随即推进、其余组的待办被取消。因此每轮都要先看节点是否还在会签,
|
||||||
|
* 且批准前复查该任务是否仍为 PENDING——读到的是快照,不能用它直接点通过。</p>
|
||||||
|
*/
|
||||||
private void approveAllByGroup(long instanceId, String groupKey) throws Exception {
|
private void approveAllByGroup(long instanceId, String groupKey) throws Exception {
|
||||||
for (int guard = 0; guard < 20; guard++) {
|
for (int guard = 0; guard < 20; guard++) {
|
||||||
|
if (!"countersign".equals(currentNodeKey(instanceId))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
List<Map<String, Object>> tasks = data.master().queryForList(
|
List<Map<String, Object>> tasks = data.master().queryForList(
|
||||||
"SELECT id, assignee_id, assignee_name FROM approval_task WHERE instance_id = ? "
|
"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",
|
+ "AND node_key = 'countersign' AND group_key = ? AND status = 'PENDING' ORDER BY id",
|
||||||
@@ -533,6 +542,12 @@ class ApprovalSettlementIT {
|
|||||||
|
|
||||||
private void approveTask(Map<String, Object> task, Integer org) throws Exception {
|
private void approveTask(Map<String, Object> task, Integer org) throws Exception {
|
||||||
long taskId = ((Number) task.get("id")).longValue();
|
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");
|
String name = (String) task.get("assignee_name");
|
||||||
ApprovalTestData.TestUser assignee =
|
ApprovalTestData.TestUser assignee =
|
||||||
new ApprovalTestData.TestUser(((Number) task.get("assignee_id")).intValue(), name, name);
|
new ApprovalTestData.TestUser(((Number) task.get("assignee_id")).intValue(), name, name);
|
||||||
|
|||||||
Reference in New Issue
Block a user