Skip to content

Commit be09a04

Browse files
committed
1 parent 8594cab commit be09a04

File tree

2 files changed

+127
-57
lines changed
  • springboot-starter-flow/src

2 files changed

+127
-57
lines changed

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

Lines changed: 65 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -31,63 +31,6 @@ public class FlowService {
3131
private final FlowProcessRepository flowProcessRepository;
3232
private final FlowBackupRepository flowBackupRepository;
3333

34-
/**
35-
* 发起流程
36-
*
37-
* @param workId 流程id
38-
* @param operator 操作者
39-
* @param bindData 绑定数据
40-
* @param advice 审批意见
41-
*/
42-
public void startFlow(long workId, IFlowOperator operator, IBindData bindData, String advice) {
43-
// 检测流程是否存在
44-
FlowWork flowWork = flowWorkRepository.getFlowWorkById(workId);
45-
if (flowWork == null) {
46-
throw new IllegalArgumentException("flow work not found");
47-
}
48-
flowWork.verify();
49-
flowWork.enableValidate();
50-
51-
// 流程数据备份
52-
FlowBackup flowBackup = flowBackupRepository.getFlowBackupByWorkIdAndVersion(flowWork.getId(), flowWork.getUpdateTime());
53-
if (flowBackup == null) {
54-
flowBackup = flowBackupRepository.backup(flowWork);
55-
}
56-
57-
// 保存流程
58-
FlowProcess flowProcess = new FlowProcess(flowBackup.getId(), operator);
59-
flowProcessRepository.save(flowProcess);
60-
61-
// 保存绑定数据
62-
BindDataSnapshot snapshot = new BindDataSnapshot(bindData);
63-
flowBindDataRepository.save(snapshot);
64-
65-
String processId = flowProcess.getProcessId();
66-
67-
Opinion opinion = Opinion.pass(advice);
68-
69-
FlowRecordService flowRecordService = new FlowRecordService(flowOperatorRepository, processId, operator, operator, snapshot, opinion, flowWork, opinion.isSuccess(), new ArrayList<>());
70-
// 获取开始节点
71-
FlowNode start = flowWork.getStartNode();
72-
if (start == null) {
73-
throw new IllegalArgumentException("start node not found");
74-
}
75-
long preId = 0;
76-
77-
// 创建待办记录
78-
List<FlowRecord> records = flowRecordService.createRecord(preId, start);
79-
if (records.isEmpty()) {
80-
throw new IllegalArgumentException("flow record not found");
81-
}
82-
flowRecordRepository.save(records);
83-
84-
// 推送消息
85-
for (FlowRecord record : records) {
86-
EventPusher.push(new FlowApprovalEvent(FlowApprovalEvent.STATE_CREATE, record, operator, flowWork));
87-
EventPusher.push(new FlowApprovalEvent(FlowApprovalEvent.STATE_TODO, record, operator, flowWork));
88-
}
89-
90-
}
9134

9235
/**
9336
* 流程详情
@@ -358,6 +301,65 @@ public void save(long recordId, IFlowOperator currentOperator, IBindData bindDat
358301
}
359302

360303

304+
/**
305+
* 发起流程
306+
*
307+
* @param workId 流程id
308+
* @param operator 操作者
309+
* @param bindData 绑定数据
310+
* @param advice 审批意见
311+
*/
312+
public void startFlow(long workId, IFlowOperator operator, IBindData bindData, String advice) {
313+
// 检测流程是否存在
314+
FlowWork flowWork = flowWorkRepository.getFlowWorkById(workId);
315+
if (flowWork == null) {
316+
throw new IllegalArgumentException("flow work not found");
317+
}
318+
flowWork.verify();
319+
flowWork.enableValidate();
320+
321+
// 流程数据备份
322+
FlowBackup flowBackup = flowBackupRepository.getFlowBackupByWorkIdAndVersion(flowWork.getId(), flowWork.getUpdateTime());
323+
if (flowBackup == null) {
324+
flowBackup = flowBackupRepository.backup(flowWork);
325+
}
326+
327+
// 保存流程
328+
FlowProcess flowProcess = new FlowProcess(flowBackup.getId(), operator);
329+
flowProcessRepository.save(flowProcess);
330+
331+
// 保存绑定数据
332+
BindDataSnapshot snapshot = new BindDataSnapshot(bindData);
333+
flowBindDataRepository.save(snapshot);
334+
335+
String processId = flowProcess.getProcessId();
336+
337+
Opinion opinion = Opinion.pass(advice);
338+
339+
FlowRecordService createRecordService = new FlowRecordService(flowOperatorRepository, processId, operator, operator, snapshot, opinion, flowWork, opinion.isSuccess(), new ArrayList<>());
340+
// 获取开始节点
341+
FlowNode start = flowWork.getStartNode();
342+
if (start == null) {
343+
throw new IllegalArgumentException("start node not found");
344+
}
345+
long preId = 0;
346+
347+
// 创建待办记录
348+
List<FlowRecord> records = createRecordService.createRecord(preId, start);
349+
if (records.isEmpty()) {
350+
throw new IllegalArgumentException("flow record not found");
351+
}
352+
353+
flowRecordRepository.save(records);
354+
355+
// 推送消息
356+
for (FlowRecord record : records) {
357+
EventPusher.push(new FlowApprovalEvent(FlowApprovalEvent.STATE_CREATE, record, operator, flowWork));
358+
EventPusher.push(new FlowApprovalEvent(FlowApprovalEvent.STATE_TODO, record, operator, flowWork));
359+
}
360+
361+
}
362+
361363
/**
362364
* 提交流程
363365
*
@@ -467,6 +469,12 @@ public void submitFlow(long recordId, IFlowOperator currentOperator, IBindData b
467469
return;
468470
}
469471

472+
this.createNextRecord(flowWork,flowNextStep,flowNode,processId,createOperator,currentOperator,snapshot,opinion,flowRecord,historyRecords);
473+
474+
}
475+
476+
477+
private void createNextRecord(FlowWork flowWork,boolean flowNextStep,FlowNode flowNode,String processId,IFlowOperator createOperator,IFlowOperator currentOperator,BindDataSnapshot snapshot,Opinion opinion,FlowRecord flowRecord,List<FlowRecord> historyRecords){
470478
// 拥有退出条件 或审批通过时,匹配下一节点
471479
if (flowWork.hasBackRelation() || flowNextStep) {
472480

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

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,68 @@ void entrustTest() {
131131
}
132132

133133

134+
135+
/**
136+
* 同意再拒绝
137+
*/
138+
void passAndRejectTest() {
139+
PageRequest pageRequest = PageRequest.of(0, 1000);
140+
141+
User user = new User("张飞");
142+
userRepository.save(user);
143+
144+
FlowWork flowWork = FlowWorkBuilder.builder(user)
145+
.title("请假流程")
146+
.nodes()
147+
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
148+
.node("总经理审批", "manager", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
149+
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.creatorOperatorMatcher())
150+
.relations()
151+
.relation("开始节点", "start", "manager")
152+
.relation("结束节点", "manager", "over")
153+
.build();
154+
155+
flowWorkRepository.save(flowWork);
156+
157+
long workId = flowWork.getId();
158+
159+
Leave leave = new Leave("我要出去看看");
160+
leaveRepository.save(leave);
161+
162+
// 创建流程
163+
flowService.startFlow(workId, user, leave, "发起流程");
164+
165+
// 查看我的待办
166+
List<FlowRecord> userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
167+
assertEquals(1, userTodos.size());
168+
169+
170+
// 查看所有流程
171+
List<FlowRecord> records = flowRecordRepository.findAll(pageRequest).getContent();
172+
assertEquals(2, records.size());
173+
174+
userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
175+
assertEquals(1, userTodos.size());
176+
177+
FlowRecord userTodo = userTodos.get(0);
178+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意"));
179+
180+
userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
181+
assertEquals(1, userTodos.size());
182+
183+
userTodo = userTodos.get(0);
184+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意"));
185+
186+
records = flowRecordRepository.findAll(pageRequest).getContent();
187+
assertEquals(3, records.size());
188+
// 查看所有流程是否都已经结束
189+
assertTrue(records.stream().allMatch(FlowRecord::isFinish));
190+
191+
List<BindDataSnapshot> snapshots = flowBindDataRepository.findAll();
192+
assertEquals(4, snapshots.size());
193+
194+
}
195+
134196
/**
135197
* 全部通过测试
136198
*/

0 commit comments

Comments
 (0)