Skip to content

Commit cf5c143

Browse files
committed
fix trySubmit bug
1 parent 7c99ed8 commit cf5c143

File tree

5 files changed

+163
-10
lines changed

5 files changed

+163
-10
lines changed

springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/matcher/OperatorMatcher.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,18 @@ public static OperatorMatcher specifyOperatorMatcher(long... userIds) {
8585
return new OperatorMatcher("def run(content) {return [" + userIdsStr + "];}", STATE_SPECIFY);
8686
}
8787

88+
89+
/**
90+
* 指定操作者匹配器
91+
*
92+
* @param userIds 用户ids
93+
* @return 操作者匹配器
94+
*/
95+
public static OperatorMatcher specifyOperatorMatcher(List<Long> userIds) {
96+
String userIdsStr = userIds.stream().map(String::valueOf).collect(Collectors.joining(","));
97+
return new OperatorMatcher("def run(content) {return [" + userIdsStr + "];}", STATE_SPECIFY);
98+
}
99+
88100
/**
89101
* 创建者操作者匹配器
90102
*

springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/FlowDirectionService.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,7 @@ public void verifyFlowSourceDirection() {
8181
*/
8282
public boolean hasCurrentFlowNodeIsDone() {
8383
// 会签下所有人尚未提交时,不执行下一节点
84-
boolean allDone = historyRecords.stream().filter(item -> !item.isTransfer()).allMatch(FlowRecord::isDone);
85-
if (!allDone) {
86-
// 流程尚未审批结束直接退出
87-
return true;
88-
}
89-
return false;
84+
return historyRecords.stream().filter(item -> !item.isTransfer()).allMatch(FlowRecord::isDone);
9085
}
9186

9287

springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowSubmitService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ public FlowResult submitFlow(long recordId, IFlowOperator currentOperator, IBind
9494

9595
// 判断流程是否结束(会签时需要所有人都通过)
9696
if (flowNode.isSign()) {
97-
boolean next = flowDirectionService.hasCurrentFlowNodeIsDone();
98-
if (next) {
97+
boolean isDone = flowDirectionService.hasCurrentFlowNodeIsDone();
98+
if (!isDone) {
9999
List<FlowRecord> todoRecords = historyRecords.stream().filter(FlowRecord::isTodo).toList();
100100
return new FlowResult(flowWork, todoRecords);
101101
}

springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowTrySubmitService.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,19 @@ private FlowSubmitResult trySubmitFlow(FlowWork flowWork, FlowNode flowNode, Flo
107107
} else {
108108
// copy 流程数据防止影响原有数据
109109
historyRecords = flowRecordRepository.findFlowRecordByPreId(flowRecord.getPreId()).stream().map(FlowRecord::copy).toList();
110+
// 更新当前流程记录, 由于try测试过程中没有对数据落库,所以这里需要手动更新
111+
for(FlowRecord record : historyRecords){
112+
if(record.getId() == flowRecord.getId()){
113+
record.submitRecord(currentOperator, snapshot, opinion, flowSourceDirection);
114+
}
115+
}
110116
}
111117
flowDirectionService.bindHistoryRecords(historyRecords);
112118

113119
// 判断流程是否结束(会签时需要所有人都通过)
114120
if (flowNode.isSign()) {
115-
boolean next = flowDirectionService.hasCurrentFlowNodeIsDone();
116-
if (next) {
121+
boolean isDone = flowDirectionService.hasCurrentFlowNodeIsDone();
122+
if (!isDone) {
117123
List<FlowRecord> todoRecords = historyRecords.stream().filter(FlowRecord::isTodo).toList();
118124
return new FlowSubmitResult(flowWork, flowNode, todoRecords.stream().map(FlowRecord::getCurrentOperator).toList());
119125
}

springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/SignTest.java

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77
import com.codingapi.springboot.flow.em.ApprovalType;
88
import com.codingapi.springboot.flow.flow.Leave;
99
import com.codingapi.springboot.flow.matcher.OperatorMatcher;
10+
import com.codingapi.springboot.flow.pojo.FlowSubmitResult;
1011
import com.codingapi.springboot.flow.record.FlowRecord;
1112
import com.codingapi.springboot.flow.repository.*;
1213
import com.codingapi.springboot.flow.service.FlowService;
14+
import com.codingapi.springboot.flow.user.IFlowOperator;
1315
import com.codingapi.springboot.flow.user.User;
1416
import org.junit.jupiter.api.Test;
1517
import org.springframework.data.domain.PageRequest;
1618

19+
import java.util.ArrayList;
1720
import java.util.List;
1821

1922
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -403,4 +406,141 @@ void signRejectTest(){
403406
assertEquals(12, snapshots.size());
404407

405408
}
409+
410+
411+
412+
/**
413+
* 多人会签trySubmit测试
414+
*/
415+
@Test
416+
void signTrySubmitTest(){
417+
PageRequest pageRequest = PageRequest.of(0, 1000);
418+
419+
User caocao = new User("曹操");
420+
userRepository.save(caocao);
421+
User lvBu = new User("吕布");
422+
userRepository.save(lvBu);
423+
User zhaoYun = new User("赵云");
424+
userRepository.save(zhaoYun);
425+
426+
User user = new User("张飞");
427+
userRepository.save(user);
428+
429+
User dept = new User("刘备");
430+
userRepository.save(dept);
431+
432+
User boss = new User("诸葛亮");
433+
userRepository.save(boss);
434+
435+
List<User> signUsers = new ArrayList<>();
436+
signUsers.add(dept);
437+
signUsers.add(caocao);
438+
signUsers.add(lvBu);
439+
signUsers.add(zhaoYun);
440+
441+
FlowWork flowWork = FlowWorkBuilder.builder(user)
442+
.title("请假流程")
443+
.nodes()
444+
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
445+
.node("部门领导审批", "dept", "default", ApprovalType.SIGN, OperatorMatcher.specifyOperatorMatcher(signUsers.stream().map(User::getUserId).toList()))
446+
.node("总经理审批", "manager", "default", ApprovalType.UN_SIGN,OperatorMatcher.specifyOperatorMatcher(boss.getUserId()) )
447+
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
448+
.relations()
449+
.relation("部门领导审批", "start", "dept")
450+
.relation("总经理审批", "dept", "manager")
451+
.relation("结束节点", "manager", "over")
452+
.build();
453+
454+
flowWorkRepository.save(flowWork);
455+
456+
String workCode = flowWork.getCode();
457+
458+
Leave leave = new Leave("我要出去看看");
459+
leaveRepository.save(leave);
460+
461+
// 创建流程
462+
flowService.startFlow(workCode, user, leave, "发起流程");
463+
464+
// 查看我的待办
465+
List<FlowRecord> userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
466+
assertEquals(1, userTodos.size());
467+
468+
// 提交流程
469+
FlowRecord userTodo = userTodos.get(0);
470+
471+
// 验证会签的人员
472+
FlowSubmitResult submitResult = flowService.trySubmitFlow(userTodo.getId(), user, leave, Opinion.pass("用户同意"));
473+
List<? extends IFlowOperator> operators = submitResult.getOperators();
474+
assertEquals(signUsers.size(), operators.size());
475+
476+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("用户同意").specify(dept.getUserId()));
477+
478+
// 查看部门经理的待办
479+
List<FlowRecord> deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
480+
assertEquals(1, deptTodos.size());
481+
482+
// 提交部门经理的审批
483+
FlowRecord deptTodo = deptTodos.get(0);
484+
485+
// 验证会签的人员
486+
submitResult = flowService.trySubmitFlow(deptTodo.getId(), dept, leave, Opinion.pass("用户同意"));
487+
operators = submitResult.getOperators();
488+
assertEquals(1, operators.size());
489+
assertEquals(boss.getName(), operators.get(0).getName());
490+
491+
flowService.submitFlow(deptTodo.getId(), dept, leave, Opinion.pass("刘备同意"));
492+
493+
// 查看总经理的待办
494+
List<FlowRecord> bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
495+
assertEquals(1, bossTodos.size());
496+
497+
// // 查看部门经理 吕布 的待办
498+
// List<FlowRecord> lvbuTodos = flowRecordRepository.findTodoByOperatorId(lvBu.getUserId(), pageRequest).getContent();
499+
// assertEquals(1, lvbuTodos.size());
500+
//
501+
// // 提交部门经理 吕布 的审批
502+
// FlowRecord lvbuTodo = lvbuTodos.get(0);
503+
// flowService.submitFlow(lvbuTodo.getId(), lvBu, leave, Opinion.pass("吕布同意"));
504+
//
505+
//
506+
// // 查看部门经理 赵云 的待办
507+
// List<FlowRecord> zhaoYunTodos = flowRecordRepository.findTodoByOperatorId(zhaoYun.getUserId(), pageRequest).getContent();
508+
// assertEquals(1, zhaoYunTodos.size());
509+
//
510+
// // 提交部门经理 赵云 的审批
511+
// FlowRecord zhaoYunTodo = zhaoYunTodos.get(0);
512+
// flowService.submitFlow(zhaoYunTodo.getId(), zhaoYun, leave, Opinion.pass("赵云同意"));
513+
//
514+
//
515+
// // 查看部门经理 曹操 的待办
516+
// List<FlowRecord> caocaoTodos = flowRecordRepository.findTodoByOperatorId(caocao.getUserId(), pageRequest).getContent();
517+
// assertEquals(1, caocaoTodos.size());
518+
//
519+
// // 提交部门经理 曹操 的审批
520+
// FlowRecord caocaoTodo = caocaoTodos.get(0);
521+
// flowService.submitFlow(caocaoTodo.getId(), caocao, leave, Opinion.pass("曹操同意"));
522+
//
523+
// bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
524+
// assertEquals(1, bossTodos.size());
525+
526+
// 提交总经理的审批
527+
FlowRecord bossTodo = bossTodos.get(0);
528+
flowService.submitFlow(bossTodo.getId(), boss, leave, Opinion.pass("同意"));
529+
530+
// 查看所有流程
531+
List<FlowRecord> records = flowRecordRepository.findAll(pageRequest).getContent();
532+
assertEquals(3, records.size());
533+
534+
userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
535+
assertEquals(0, userTodos.size());
536+
537+
records = flowRecordRepository.findAll(pageRequest).getContent();
538+
assertEquals(3, records.size());
539+
// 查看所有流程是否都已经结束
540+
assertTrue(records.stream().allMatch(FlowRecord::isFinish));
541+
542+
List<BindDataSnapshot> snapshots = flowBindDataRepository.findAll();
543+
assertEquals(4, snapshots.size());
544+
545+
}
406546
}

0 commit comments

Comments
 (0)