Skip to content

Commit 4e7ca69

Browse files
committed
fix flow bug
1 parent 6877181 commit 4e7ca69

File tree

12 files changed

+251
-104
lines changed

12 files changed

+251
-104
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
<groupId>com.codingapi.springboot</groupId>
1717
<artifactId>springboot-parent</artifactId>
18-
<version>2.10.11</version>
18+
<version>2.10.12</version>
1919

2020
<url>https://github.com/codingapi/springboot-framewrok</url>
2121
<name>springboot-parent</name>

springboot-starter-data-authorization/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>2.10.11</version>
9+
<version>2.10.12</version>
1010
</parent>
1111

1212
<name>springboot-starter-data-authorization</name>

springboot-starter-data-fast/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-parent</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>2.10.11</version>
8+
<version>2.10.12</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

springboot-starter-flow/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>2.10.11</version>
9+
<version>2.10.12</version>
1010
</parent>
1111

1212
<name>springboot-starter-flow</name>

springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/domain/FlowWork.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,10 @@ public FlowNode getStartNode() {
309309
/**
310310
* 是否存在退回关系
311311
*/
312-
public boolean hasBackRelation() {
313-
return relations.stream().anyMatch(FlowRelation::isBack);
312+
public boolean hasBackRelation(String sourceCode) {
313+
return relations.stream()
314+
.filter(relation -> relation.getSource().getCode().equals(sourceCode))
315+
.anyMatch(FlowRelation::isBack);
314316
}
315317

316318

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,29 @@ public void skipCirculate() {
102102
/**
103103
* 加载默认回退节点
104104
*/
105-
public void loadDefaultBackNode(FlowRecord currentRecord) {
105+
public void loadDefaultBackNode(FlowNode flowNode,FlowRecord currentRecord) {
106+
// 如果退回设置了回退关系,则需要根据关系匹配下一个节点
107+
if (flowWork.hasBackRelation(flowNode.getCode())) {
108+
FlowNode nextNode = this.matcherNextNode(flowNode, true);
109+
if (nextNode == null) {
110+
throw new IllegalArgumentException("next node not found");
111+
}
112+
long parentRecordId = currentRecord.getPreId();
113+
FlowRecord preFlowRecord = flowRecordRepository.getFlowRecordById(parentRecordId);
114+
IFlowOperator flowOperator = currentOperator;
115+
if (nextNode.isAnyOperatorMatcher()) {
116+
while (preFlowRecord.isTransfer() || !preFlowRecord.getNodeCode().equals(nextNode.getCode())) {
117+
preFlowRecord = flowRecordRepository.getFlowRecordById(preFlowRecord.getPreId());
118+
}
119+
flowOperator = preFlowRecord.getCurrentOperator();
120+
}
121+
this.nextNode = nextNode;
122+
this.nextOperator = flowOperator;
123+
this.backOperator = null;
124+
return;
125+
}
126+
127+
// 如果没有设置回退关系,则需要根据流程记录来匹配下一个节点
106128
List<FlowRecord> historyRecords =
107129
flowRecordRepository.findFlowRecordByProcessId(currentRecord.getProcessId())
108130
.stream()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ private void loadNextNode(List<FlowRecord> historyRecords) {
193193
if (flowDirectionService.isPassRecord()) {
194194
flowNodeService.loadNextPassNode(flowNode);
195195
} else {
196-
flowNodeService.loadDefaultBackNode(flowRecord);
196+
flowNodeService.loadDefaultBackNode(flowNode,flowRecord);
197197
}
198198
this.nextNode = flowNodeService.getNextNode();
199199
}

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

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,4 +239,220 @@ void reject2() {
239239

240240
}
241241

242+
243+
244+
/**
245+
* 驳回测试3
246+
*/
247+
@Test
248+
void reject3() {
249+
PageRequest pageRequest = PageRequest.of(0, 1000);
250+
251+
User lorne = new User("lorne");
252+
userRepository.save(lorne);
253+
254+
User user = new User("张飞");
255+
userRepository.save(user);
256+
257+
User dept = new User("刘备");
258+
userRepository.save(dept);
259+
260+
User boss = new User("诸葛亮");
261+
userRepository.save(boss);
262+
263+
FlowWork flowWork = FlowWorkBuilder.builder(user)
264+
.title("请假流程")
265+
.nodes()
266+
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
267+
.node("部门领导审批", "dept", "default", ApprovalType.SIGN, OperatorMatcher.specifyOperatorMatcher(dept.getUserId()))
268+
.node("总经理审批", "manager", "default", ApprovalType.SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
269+
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
270+
.relations()
271+
.relation("部门领导审批", "start", "dept")
272+
.relation("总经理审批", "dept", "manager")
273+
.relation("总经理审批", "manager", "start",new OutTrigger("" +
274+
"def run(content) {\n" +
275+
" if(content.getBindData().getDays() > 3) {\n" +
276+
" return true;\n" +
277+
" }\n" +
278+
" return false;\n" +
279+
" }"),1,true)
280+
.relation("结束节点", "manager", "over")
281+
.build();
282+
283+
flowWorkRepository.save(flowWork);
284+
285+
String workCode = flowWork.getCode();
286+
287+
Leave leave = new Leave("我要出去看看");
288+
leave.setDays(5);
289+
leaveRepository.save(leave);
290+
291+
// 创建流程
292+
flowService.startFlow(workCode, user, leave, "发起流程");
293+
294+
// 查看我的待办
295+
List<FlowRecord> userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
296+
assertEquals(1, userTodos.size());
297+
298+
// 提交流程
299+
FlowRecord userTodo = userTodos.get(0);
300+
assertEquals(0, userTodo.getTimeoutTime());
301+
302+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意").specify(dept.getUserId()));
303+
304+
// 查看刘备经理的待办
305+
List<FlowRecord> deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
306+
assertEquals(1, deptTodos.size());
307+
308+
// 部门经理的提交审批
309+
FlowRecord deptTodo = deptTodos.get(0);
310+
flowService.submitFlow(deptTodo.getId(), dept, leave, Opinion.pass("同意"));
311+
312+
// 查看总经理的待办
313+
List<FlowRecord> bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
314+
assertEquals(1, bossTodos.size());
315+
316+
// 提交总经理的审批
317+
FlowRecord bossTodo = bossTodos.get(0);
318+
flowService.submitFlow(bossTodo.getId(), boss, leave, Opinion.reject("不同意"));
319+
320+
deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
321+
assertEquals(0, deptTodos.size());
322+
323+
userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
324+
assertEquals(1, bossTodos.size());
325+
326+
userTodo = userTodos.get(0);
327+
leave.setDays(3);
328+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意"));
329+
330+
// 查看所有流程
331+
List<FlowRecord> records = flowRecordRepository.findAll(pageRequest).getContent();
332+
assertEquals(5, records.size());
333+
334+
deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
335+
assertEquals(1, deptTodos.size());
336+
337+
// 部门经理的提交审批
338+
deptTodo = deptTodos.get(0);
339+
flowService.submitFlow(deptTodo.getId(), dept, leave, Opinion.pass("同意"));
340+
341+
bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
342+
assertEquals(1, bossTodos.size());
343+
344+
// 提交总经理的审批
345+
bossTodo = bossTodos.get(0);
346+
flowService.submitFlow(bossTodo.getId(), boss, leave, Opinion.pass("同意"));
347+
348+
records = flowRecordRepository.findAll(pageRequest).getContent();
349+
assertEquals(6, records.size());
350+
// 查看所有流程是否都已经结束
351+
assertTrue(records.stream().allMatch(FlowRecord::isFinish));
352+
353+
List<BindDataSnapshot> snapshots = flowBindDataRepository.findAll();
354+
assertEquals(7, snapshots.size());
355+
356+
}
357+
358+
359+
360+
/**
361+
* 多条件流程测试撤回
362+
*/
363+
@Test
364+
void reject4(){
365+
PageRequest pageRequest = PageRequest.of(0, 1000);
366+
367+
User user = new User("张飞");
368+
userRepository.save(user);
369+
370+
User dept = new User("刘备");
371+
userRepository.save(dept);
372+
373+
User boss = new User("诸葛亮");
374+
userRepository.save(boss);
375+
376+
377+
FlowWork flowWork = FlowWorkBuilder.builder(user)
378+
.title("请假流程")
379+
.nodes()
380+
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
381+
.node("部门领导审批", "dept", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(dept.getUserId()))
382+
.node("总经理审批", "manager", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
383+
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
384+
.relations()
385+
.relation("部门领导审批", "start", "dept")
386+
.relation("总经理审批", "dept", "over",new OutTrigger("def run(content){content.getBindData().getDays()<=5}"),1,false)
387+
.relation("总经理审批", "dept", "manager",new OutTrigger("def run(content){content.getBindData().getDays()>5}"),2,false)
388+
.relation("结束节点", "manager", "start",new OutTrigger("def run(content){return true}"),1,true)
389+
.relation("结束节点", "manager", "over")
390+
.build();
391+
392+
flowWorkRepository.save(flowWork);
393+
394+
String workCode = flowWork.getCode();
395+
396+
Leave leave = new Leave("我要出去看看",6);
397+
leaveRepository.save(leave);
398+
399+
// 创建流程
400+
flowService.startFlow(workCode, user, leave, "发起流程");
401+
402+
// 查看我的待办
403+
List<FlowRecord> userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
404+
assertEquals(1, userTodos.size());
405+
406+
// 提交流程
407+
FlowRecord userTodo = userTodos.get(0);
408+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意"));
409+
410+
// 查看部门经理的待办
411+
List<FlowRecord> deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
412+
assertEquals(1, deptTodos.size());
413+
414+
// 提交部门经理的审批
415+
FlowRecord deptTodo = deptTodos.get(0);
416+
flowService.submitFlow(deptTodo.getId(), dept, leave, Opinion.pass("同意"));
417+
418+
419+
// 查看老板的待办
420+
List<FlowRecord> bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
421+
assertEquals(1, bossTodos.size());
422+
423+
// 提交老板的审批
424+
FlowRecord bossTodo = bossTodos.get(0);
425+
flowService.submitFlow(bossTodo.getId(), boss, leave, Opinion.reject("不同意,最多让你请假3天"));
426+
427+
// 查看所有流程
428+
List<FlowRecord> records = flowRecordRepository.findAll(pageRequest).getContent();
429+
assertEquals(4, records.size());
430+
431+
// 用户修改确认
432+
userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
433+
assertEquals(1, userTodos.size());
434+
435+
// 用户调整为3天
436+
leave.setDays(3);
437+
// 提交流程
438+
userTodo = userTodos.get(0);
439+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意"));
440+
441+
deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
442+
assertEquals(1, deptTodos.size());
443+
444+
// 提交部门经理的审批
445+
deptTodo = deptTodos.get(0);
446+
flowService.submitFlow(deptTodo.getId(), dept, leave, Opinion.pass("同意"));
447+
448+
records = flowRecordRepository.findAll(pageRequest).getContent();
449+
assertEquals(5, records.size());
450+
451+
// 查看所有流程是否都已经结束
452+
assertTrue(records.stream().allMatch(FlowRecord::isFinish));
453+
454+
List<BindDataSnapshot> snapshots = flowBindDataRepository.findAll();
455+
assertEquals(6, snapshots.size());
456+
}
457+
242458
}

0 commit comments

Comments
 (0)