Skip to content

Commit 949ecbd

Browse files
committed
fix 2.10.13
1 parent 4e7ca69 commit 949ecbd

File tree

12 files changed

+279
-25
lines changed

12 files changed

+279
-25
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.12</version>
18+
<version>2.10.13</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.12</version>
9+
<version>2.10.13</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.12</version>
8+
<version>2.10.13</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.12</version>
9+
<version>2.10.13</version>
1010
</parent>
1111

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

springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/record/FlowRecord.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,15 @@ public void matcherOperator(IFlowOperator currentOperator) {
376376
}
377377
}
378378

379+
/**
380+
* 是否是当前发起人
381+
* @param operator 操作者
382+
* @return 是否是当前发起人
383+
*/
384+
public boolean isCreateOperator(IFlowOperator operator) {
385+
return this.createOperator.getUserId() == operator.getUserId();
386+
}
387+
379388
/**
380389
* 是否是当前操作者
381390
*

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ public void verifyFlowRecordCurrentOperator() {
8383
}
8484
}
8585

86+
/**
87+
* 当前人是否为发起人
88+
* @return 是否为发起人
89+
*/
90+
public boolean isCreateOperator() {
91+
return flowRecord.isCreateOperator(currentOperator);
92+
}
93+
8694
/**
8795
* 校验流程是否已审批
8896
*/

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

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ public void recall(long recordId, IFlowOperator currentOperator) {
3838
flowWorkRepository,
3939
flowRecordRepository,
4040
flowProcessRepository,
41-
recordId, currentOperator);
41+
recordId,
42+
currentOperator);
4243

4344
flowRecordVerifyService.verifyFlowRecordCurrentOperator();
4445
flowRecordVerifyService.loadFlowWork();
@@ -48,23 +49,23 @@ public void recall(long recordId, IFlowOperator currentOperator) {
4849

4950
FlowRecord flowRecord = flowRecordVerifyService.getFlowRecord();
5051
FlowWork flowWork = flowRecordVerifyService.getFlowWork();
51-
52-
// 下一流程的流程记录
53-
List<FlowRecord> childrenRecords = flowRecordRepository.findFlowRecordByPreId(recordId);
54-
5552
BindDataSnapshot bindDataSnapshot = flowBindDataRepository.getBindDataSnapshotById(flowRecord.getSnapshotId());
5653

57-
// 下一流程均为办理且未读
58-
59-
// 如果是在开始节点撤销,则直接删除
60-
if (flowRecord.isStartRecord() && flowRecord.isTodo()) {
61-
if (!childrenRecords.isEmpty()) {
62-
throw new IllegalArgumentException("flow record not recall");
54+
if(flowRecordVerifyService.isCreateOperator()){
55+
List<FlowRecord> records = flowRecordRepository.findFlowRecordByProcessId(flowRecord.getProcessId());
56+
for(FlowRecord record:records){
57+
if(!record.isStartRecord()) {
58+
record.delete();
59+
flowRecordRepository.update(record);
60+
}else {
61+
record.recall();
62+
flowRecordRepository.update(record);
63+
}
6364
}
64-
List<FlowRecord> flowRecords = new ArrayList<>();
65-
flowRecords.add(flowRecord);
66-
flowRecordRepository.delete(flowRecords);
67-
} else {
65+
}else {
66+
// 下一流程的流程记录
67+
List<FlowRecord> childrenRecords = flowRecordRepository.findFlowRecordByPreId(recordId);
68+
6869
// 如果是在中间节点撤销,则需要判断是否所有的子流程都是未读状态
6970
if (childrenRecords.isEmpty()) {
7071
throw new IllegalArgumentException("flow record not submit");
@@ -77,13 +78,13 @@ public void recall(long recordId, IFlowOperator currentOperator) {
7778
flowRecord.recall();
7879
flowRecordRepository.update(flowRecord);
7980

80-
for(FlowRecord childrenRecord : childrenRecords) {
81+
for (FlowRecord childrenRecord : childrenRecords) {
8182
childrenRecord.delete();
8283
}
8384
flowRecordRepository.save(childrenRecords);
8485
}
85-
IBindData bindData = bindDataSnapshot.toBindData();
8686

87+
IBindData bindData = bindDataSnapshot.toBindData();
8788
EventPusher.push(new FlowApprovalEvent(FlowApprovalEvent.STATE_RECALL, flowRecord, currentOperator, flowWork, bindData), true);
8889
}
8990
}
Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
package com.codingapi.springboot.flow.test;
2+
3+
import com.codingapi.springboot.flow.bind.BindDataSnapshot;
4+
import com.codingapi.springboot.flow.build.FlowWorkBuilder;
5+
import com.codingapi.springboot.flow.domain.FlowWork;
6+
import com.codingapi.springboot.flow.domain.Opinion;
7+
import com.codingapi.springboot.flow.em.ApprovalType;
8+
import com.codingapi.springboot.flow.flow.Leave;
9+
import com.codingapi.springboot.flow.matcher.OperatorMatcher;
10+
import com.codingapi.springboot.flow.record.FlowRecord;
11+
import com.codingapi.springboot.flow.repository.*;
12+
import com.codingapi.springboot.flow.service.FlowService;
13+
import com.codingapi.springboot.flow.user.User;
14+
import org.junit.jupiter.api.Test;
15+
import org.springframework.data.domain.PageRequest;
16+
17+
import java.util.List;
18+
19+
import static org.junit.jupiter.api.Assertions.assertEquals;
20+
import static org.junit.jupiter.api.Assertions.assertTrue;
21+
22+
public class FlowRecallTest {
23+
24+
private final UserRepository userRepository = new UserRepository();
25+
private final FlowWorkRepository flowWorkRepository = new FlowWorkRepositoryImpl();
26+
private final FlowRecordRepositoryImpl flowRecordRepository = new FlowRecordRepositoryImpl();
27+
private final FlowBindDataRepositoryImpl flowBindDataRepository = new FlowBindDataRepositoryImpl();
28+
private final LeaveRepository leaveRepository = new LeaveRepository();
29+
private final FlowBackupRepository flowBackupRepository = new FlowBackupRepositoryImpl();
30+
private final FlowProcessRepository flowProcessRepository = new FlowProcessRepositoryImpl(flowBackupRepository, userRepository);
31+
private final FlowService flowService = new FlowService(flowWorkRepository, flowRecordRepository, flowBindDataRepository, userRepository, flowProcessRepository, flowBackupRepository);
32+
33+
/**
34+
* 撤回测试(发起人撤销测试)
35+
*/
36+
@Test
37+
void recall1() {
38+
PageRequest pageRequest = PageRequest.of(0, 1000);
39+
40+
User lorne = new User("lorne");
41+
userRepository.save(lorne);
42+
43+
User user = new User("张飞");
44+
userRepository.save(user);
45+
46+
User dept = new User("刘备");
47+
userRepository.save(dept);
48+
49+
User boss = new User("诸葛亮");
50+
userRepository.save(boss);
51+
52+
FlowWork flowWork = FlowWorkBuilder.builder(user)
53+
.title("请假流程")
54+
.nodes()
55+
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
56+
.node("部门领导审批", "dept", "default", ApprovalType.SIGN, OperatorMatcher.specifyOperatorMatcher(dept.getUserId(),lorne.getUserId()))
57+
.node("总经理审批", "manager", "default", ApprovalType.SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
58+
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
59+
.relations()
60+
.relation("部门领导审批", "start", "dept")
61+
.relation("总经理审批", "dept", "manager")
62+
.relation("结束节点", "manager", "over")
63+
.build();
64+
65+
flowWorkRepository.save(flowWork);
66+
67+
String workCode = flowWork.getCode();
68+
69+
Leave leave = new Leave("我要出去看看");
70+
leaveRepository.save(leave);
71+
72+
// 创建流程
73+
flowService.startFlow(workCode, user, leave, "发起流程");
74+
75+
// 查看我的待办
76+
List<FlowRecord> userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
77+
assertEquals(1, userTodos.size());
78+
79+
// 提交流程
80+
FlowRecord userTodo = userTodos.get(0);
81+
assertEquals(0, userTodo.getTimeoutTime());
82+
83+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意").specify(lorne.getUserId()));
84+
85+
// 查看刘备经理的待办
86+
List<FlowRecord> deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
87+
assertEquals(0, deptTodos.size());
88+
89+
List<FlowRecord> lorneTodos = flowRecordRepository.findTodoByOperatorId(lorne.getUserId(), pageRequest).getContent();
90+
assertEquals(1, lorneTodos.size());
91+
92+
// 提交委托lorne部门经理的审批
93+
FlowRecord lorneTodo = lorneTodos.get(0);
94+
flowService.submitFlow(lorneTodo.getId(), lorne, leave, Opinion.pass("同意"));
95+
96+
List<FlowRecord> userDones = flowRecordRepository.findDoneByOperatorId(user.getUserId(), pageRequest).getContent();
97+
assertEquals(1, userDones.size());
98+
99+
FlowRecord userDone = userDones.get(0);
100+
flowService.recall(userDone.getId(),user);
101+
102+
userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
103+
assertEquals(1, userTodos.size());
104+
105+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意").specify(lorne.getUserId()));
106+
107+
lorneTodos = flowRecordRepository.findTodoByOperatorId(lorne.getUserId(), pageRequest).getContent();
108+
assertEquals(1, lorneTodos.size());
109+
110+
lorneTodo = lorneTodos.get(0);
111+
flowService.submitFlow(lorneTodo.getId(), lorne, leave, Opinion.pass("同意"));
112+
113+
// 查看总经理的待办
114+
List<FlowRecord> bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
115+
assertEquals(1, bossTodos.size());
116+
117+
// 提交委托lorne部门经理的审批
118+
FlowRecord bossTodo = bossTodos.get(0);
119+
flowService.submitFlow(bossTodo.getId(), boss, leave, Opinion.pass("同意"));
120+
121+
// 查看所有流程
122+
List<FlowRecord> records = flowRecordRepository.findAll(pageRequest).getContent();
123+
assertEquals(3, records.size());
124+
125+
// 查看所有流程是否都已经结束
126+
assertTrue(records.stream().allMatch(FlowRecord::isFinish));
127+
128+
List<BindDataSnapshot> snapshots = flowBindDataRepository.findAll();
129+
assertEquals(6, snapshots.size());
130+
131+
}
132+
133+
134+
/**
135+
* 撤回测试(流程已读)
136+
*/
137+
@Test
138+
void recall2() {
139+
PageRequest pageRequest = PageRequest.of(0, 1000);
140+
141+
User lorne = new User("lorne");
142+
userRepository.save(lorne);
143+
144+
User user = new User("张飞");
145+
userRepository.save(user);
146+
147+
User dept = new User("刘备");
148+
userRepository.save(dept);
149+
150+
User boss = new User("诸葛亮");
151+
userRepository.save(boss);
152+
153+
FlowWork flowWork = FlowWorkBuilder.builder(user)
154+
.title("请假流程")
155+
.nodes()
156+
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
157+
.node("部门领导审批", "dept", "default", ApprovalType.SIGN, OperatorMatcher.specifyOperatorMatcher(dept.getUserId(),lorne.getUserId()))
158+
.node("总经理审批", "manager", "default", ApprovalType.SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
159+
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
160+
.relations()
161+
.relation("部门领导审批", "start", "dept")
162+
.relation("总经理审批", "dept", "manager")
163+
.relation("结束节点", "manager", "over")
164+
.build();
165+
166+
flowWorkRepository.save(flowWork);
167+
168+
String workCode = flowWork.getCode();
169+
170+
Leave leave = new Leave("我要出去看看");
171+
leaveRepository.save(leave);
172+
173+
// 创建流程
174+
flowService.startFlow(workCode, user, leave, "发起流程");
175+
176+
// 查看我的待办
177+
List<FlowRecord> userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
178+
assertEquals(1, userTodos.size());
179+
180+
// 提交流程
181+
FlowRecord userTodo = userTodos.get(0);
182+
assertEquals(0, userTodo.getTimeoutTime());
183+
184+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意").specify(lorne.getUserId()));
185+
186+
// 查看刘备经理的待办
187+
List<FlowRecord> deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
188+
assertEquals(0, deptTodos.size());
189+
190+
List<FlowRecord> lorneTodos = flowRecordRepository.findTodoByOperatorId(lorne.getUserId(), pageRequest).getContent();
191+
assertEquals(1, lorneTodos.size());
192+
193+
// 提交委托lorne部门经理的审批
194+
FlowRecord lorneTodo = lorneTodos.get(0);
195+
flowService.submitFlow(lorneTodo.getId(), lorne, leave, Opinion.pass("同意"));
196+
197+
// 查看总经理的待办
198+
List<FlowRecord> bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
199+
assertEquals(1, bossTodos.size());
200+
201+
// 提交委托boos部门经理的审批
202+
FlowRecord bossTodo = bossTodos.get(0);
203+
flowService.detail(bossTodo.getId());
204+
flowService.save(bossTodo.getId(), boss, leave, "...");
205+
206+
List<FlowRecord> lorneDones = flowRecordRepository.findDoneByOperatorId(lorne.getUserId(), pageRequest).getContent();
207+
assertEquals(1, lorneDones.size());
208+
209+
FlowRecord lorneDone = lorneDones.get(0);
210+
flowService.recall(lorneDone.getId(),lorne);
211+
212+
lorneTodos = flowRecordRepository.findTodoByOperatorId(lorne.getUserId(), pageRequest).getContent();
213+
assertEquals(1, lorneTodos.size());
214+
215+
lorneTodo = lorneTodos.get(0);
216+
flowService.submitFlow(lorneTodo.getId(), lorne, leave, Opinion.pass("同意"));
217+
218+
bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
219+
assertEquals(1, bossTodos.size());
220+
221+
bossTodo = bossTodos.get(0);
222+
flowService.submitFlow(bossTodo.getId(), boss, leave, Opinion.pass("同意"));
223+
224+
// 查看所有流程
225+
List<FlowRecord> records = flowRecordRepository.findAll(pageRequest).getContent();
226+
assertEquals(3, records.size());
227+
228+
// 查看所有流程是否都已经结束
229+
assertTrue(records.stream().allMatch(FlowRecord::isFinish));
230+
231+
List<BindDataSnapshot> snapshots = flowBindDataRepository.findAll();
232+
assertEquals(5, snapshots.size());
233+
234+
}
235+
236+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1103,7 +1103,7 @@ void recallTest2() {
11031103
flowService.recall(userTodo.getId(), user);
11041104

11051105
List<FlowRecord> records = flowRecordRepository.findAll(pageRequest).getContent();
1106-
assertEquals(0, records.size());
1106+
assertEquals(1, records.size());
11071107

11081108

11091109
}

springboot-starter-security/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.12</version>
9+
<version>2.10.13</version>
1010
</parent>
1111

1212
<artifactId>springboot-starter-security</artifactId>

0 commit comments

Comments
 (0)