Skip to content

Commit e6e7b02

Browse files
authored
Merge pull request #39 from codingapi/dev
fix #38
2 parents c29d7c9 + 885c415 commit e6e7b02

7 files changed

Lines changed: 185 additions & 161 deletions

File tree

flow-engine-framework/src/main/java/com/codingapi/flow/context/RepositoryHolderContext.java

Lines changed: 8 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
package com.codingapi.flow.context;
22

3+
import com.codingapi.flow.context.service.FlowRecordSaveService;
34
import com.codingapi.flow.domain.DelayTask;
45
import com.codingapi.flow.exception.FlowStateException;
56
import com.codingapi.flow.gateway.FlowOperatorGateway;
67
import com.codingapi.flow.operator.IFlowOperator;
78
import com.codingapi.flow.record.FlowRecord;
8-
import com.codingapi.flow.record.FlowTodoRecord;
9-
import com.codingapi.flow.record.FlowTodoMerge;
109
import com.codingapi.flow.repository.*;
1110
import com.codingapi.flow.service.FlowService;
1211
import com.codingapi.flow.service.impl.FlowActionService;
1312
import com.codingapi.flow.service.impl.FlowDelayTriggerService;
1413
import com.codingapi.flow.session.FlowSession;
1514
import lombok.Getter;
1615

17-
import java.util.ArrayList;
1816
import java.util.List;
1917

18+
/**
19+
* 流程引擎仓库持有者上下文,负责持有流程引擎相关的仓库实例,并提供相关服务的构建方法
20+
*/
2021
public class RepositoryHolderContext {
2122

2223
@Getter
@@ -156,13 +157,13 @@ public void deleteDelayTask(DelayTask delayTask) {
156157

157158

158159
public void saveRecords(List<FlowRecord> flowRecords) {
159-
FlowRecordRepositoryService flowRecordRepositoryService = new FlowRecordRepositoryService(flowRecords);
160-
flowRecordRepositoryService.saveAll();
160+
FlowRecordSaveService flowRecordSaveService = new FlowRecordSaveService(flowRecords);
161+
flowRecordSaveService.saveAll();
161162
}
162163

163164
public void saveRecord(FlowRecord flowRecord) {
164-
FlowRecordRepositoryService flowRecordRepositoryService = new FlowRecordRepositoryService(flowRecord);
165-
flowRecordRepositoryService.saveAll();
165+
FlowRecordSaveService flowRecordSaveService = new FlowRecordSaveService(flowRecord);
166+
flowRecordSaveService.saveAll();
166167
}
167168

168169
public List<FlowRecord> findCurrentNodeRecords(long fromId, String nodeId) {
@@ -194,106 +195,4 @@ public List<DelayTask> findDelayTasks() {
194195
}
195196

196197

197-
private static class FlowRecordRepositoryService {
198-
199-
private final List<FlowRecord> flowRecords;
200-
private final FlowTodoRecordRepository flowTodoRecordRepository;
201-
private final FlowTodoMergeRepository flowTodoMergeRepository;
202-
private final FlowRecordRepository flowRecordRepository;
203-
204-
205-
public FlowRecordRepositoryService(List<FlowRecord> flowRecords) {
206-
this.flowTodoRecordRepository = RepositoryHolderContext.getInstance().getFlowTodoRecordRepository();
207-
this.flowTodoMergeRepository = RepositoryHolderContext.getInstance().getFlowTodoMergeRepository();
208-
this.flowRecordRepository = RepositoryHolderContext.getInstance().getFlowRecordRepository();
209-
this.flowRecords = flowRecords;
210-
}
211-
212-
public FlowRecordRepositoryService(FlowRecord flowRecord) {
213-
this.flowTodoRecordRepository = RepositoryHolderContext.getInstance().getFlowTodoRecordRepository();
214-
this.flowTodoMergeRepository = RepositoryHolderContext.getInstance().getFlowTodoMergeRepository();
215-
this.flowRecordRepository = RepositoryHolderContext.getInstance().getFlowRecordRepository();
216-
this.flowRecords = new ArrayList<>();
217-
this.flowRecords.add(flowRecord);
218-
}
219-
220-
221-
private void saveTodoMargeRecords() {
222-
List<FlowTodoRecord> flowTodoRecords = new ArrayList<>();
223-
for (FlowRecord flowRecord : flowRecords) {
224-
if (flowRecord.isTodo()) {
225-
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
226-
if (todoMargeRecord == null) {
227-
todoMargeRecord = new FlowTodoRecord(flowRecord);
228-
} else {
229-
todoMargeRecord.update(flowRecord);
230-
if (flowRecord.isMergeable()) {
231-
todoMargeRecord.addMergeCount();
232-
}
233-
}
234-
flowTodoRecords.add(todoMargeRecord);
235-
}
236-
}
237-
if (!flowTodoRecords.isEmpty()) {
238-
flowTodoRecordRepository.saveAll(flowTodoRecords);
239-
}
240-
241-
if (!flowTodoRecords.isEmpty()) {
242-
List<FlowTodoMerge> relationList = new ArrayList<>();
243-
for (FlowTodoRecord margeRecord : flowTodoRecords) {
244-
if(margeRecord.isMergeable()) {
245-
relationList.add(new FlowTodoMerge(margeRecord));
246-
}
247-
}
248-
flowTodoMergeRepository.saveAll(relationList);
249-
}
250-
}
251-
252-
private void saveRecords() {
253-
if (!flowRecords.isEmpty()) {
254-
flowRecordRepository.saveAll(flowRecords);
255-
}
256-
}
257-
258-
259-
private void removeTodoMergeRecords() {
260-
for (FlowRecord flowRecord : flowRecords) {
261-
if (flowRecord.isDone()) {
262-
if (flowRecord.isMergeable()) {
263-
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
264-
if(todoMargeRecord!=null) {
265-
List<FlowTodoMerge> margeRelations = flowTodoMergeRepository.findByTodoId(todoMargeRecord.getId());
266-
if(margeRelations!=null && !margeRelations.isEmpty()) {
267-
for (FlowTodoMerge margeRelation : margeRelations) {
268-
if (margeRelation.isRecord(flowRecord.getId())) {
269-
flowTodoMergeRepository.remove(margeRelation);
270-
todoMargeRecord.divMergeCount();
271-
if (todoMargeRecord.hasMergeCount()) {
272-
flowTodoRecordRepository.save(todoMargeRecord);
273-
} else {
274-
flowTodoRecordRepository.remove(todoMargeRecord);
275-
}
276-
}
277-
}
278-
}
279-
}
280-
} else {
281-
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
282-
if (todoMargeRecord != null) {
283-
flowTodoRecordRepository.remove(todoMargeRecord);
284-
}
285-
}
286-
}
287-
}
288-
}
289-
290-
public void saveAll() {
291-
this.saveRecords();
292-
this.saveTodoMargeRecords();
293-
this.removeTodoMergeRecords();
294-
}
295-
296-
297-
}
298-
299198
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.codingapi.flow.context.service;
2+
3+
import com.codingapi.flow.context.RepositoryHolderContext;
4+
import com.codingapi.flow.record.FlowRecord;
5+
import com.codingapi.flow.record.FlowTodoMerge;
6+
import com.codingapi.flow.record.FlowTodoRecord;
7+
import com.codingapi.flow.repository.FlowRecordRepository;
8+
import com.codingapi.flow.repository.FlowTodoMergeRepository;
9+
import com.codingapi.flow.repository.FlowTodoRecordRepository;
10+
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
/**
15+
* 流程记录保存服务,负责保存流程记录和待办记录的合并关系
16+
*/
17+
public class FlowRecordSaveService {
18+
19+
private final List<FlowRecord> flowRecords;
20+
private final FlowTodoRecordRepository flowTodoRecordRepository;
21+
private final FlowTodoMergeRepository flowTodoMergeRepository;
22+
private final FlowRecordRepository flowRecordRepository;
23+
24+
25+
public FlowRecordSaveService(List<FlowRecord> flowRecords) {
26+
this.flowTodoRecordRepository = RepositoryHolderContext.getInstance().getFlowTodoRecordRepository();
27+
this.flowTodoMergeRepository = RepositoryHolderContext.getInstance().getFlowTodoMergeRepository();
28+
this.flowRecordRepository = RepositoryHolderContext.getInstance().getFlowRecordRepository();
29+
this.flowRecords = flowRecords;
30+
}
31+
32+
public FlowRecordSaveService(FlowRecord flowRecord) {
33+
this.flowTodoRecordRepository = RepositoryHolderContext.getInstance().getFlowTodoRecordRepository();
34+
this.flowTodoMergeRepository = RepositoryHolderContext.getInstance().getFlowTodoMergeRepository();
35+
this.flowRecordRepository = RepositoryHolderContext.getInstance().getFlowRecordRepository();
36+
this.flowRecords = new ArrayList<>();
37+
this.flowRecords.add(flowRecord);
38+
}
39+
40+
41+
private void saveTodoMargeRecords() {
42+
List<FlowTodoRecord> flowTodoRecords = new ArrayList<>();
43+
for (FlowRecord flowRecord : flowRecords) {
44+
if (flowRecord.isTodo()) {
45+
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
46+
if (todoMargeRecord == null) {
47+
todoMargeRecord = new FlowTodoRecord(flowRecord);
48+
} else {
49+
todoMargeRecord.update(flowRecord);
50+
if (flowRecord.isMergeable()) {
51+
todoMargeRecord.addMergeCount();
52+
}
53+
}
54+
flowTodoRecords.add(todoMargeRecord);
55+
}
56+
}
57+
if (!flowTodoRecords.isEmpty()) {
58+
flowTodoRecordRepository.saveAll(flowTodoRecords);
59+
}
60+
61+
if (!flowTodoRecords.isEmpty()) {
62+
List<FlowTodoMerge> relationList = new ArrayList<>();
63+
for (FlowTodoRecord margeRecord : flowTodoRecords) {
64+
if (margeRecord.isMergeable()) {
65+
relationList.add(new FlowTodoMerge(margeRecord));
66+
}
67+
}
68+
flowTodoMergeRepository.saveAll(relationList);
69+
}
70+
}
71+
72+
private void saveRecords() {
73+
if (!flowRecords.isEmpty()) {
74+
// 只保存非结束节点的记录,结束节点的记录由流程引擎自动生成,不允许外部修改
75+
List<FlowRecord> flowRecordList = flowRecords.stream().filter(FlowRecord::isNotEndNode).toList();
76+
flowRecordRepository.saveAll(flowRecordList);
77+
}
78+
}
79+
80+
81+
private void removeTodoMergeRecords() {
82+
for (FlowRecord flowRecord : flowRecords) {
83+
if (flowRecord.isDone()) {
84+
if (flowRecord.isMergeable()) {
85+
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
86+
if (todoMargeRecord != null) {
87+
List<FlowTodoMerge> margeRelations = flowTodoMergeRepository.findByTodoId(todoMargeRecord.getId());
88+
if (margeRelations != null && !margeRelations.isEmpty()) {
89+
for (FlowTodoMerge margeRelation : margeRelations) {
90+
if (margeRelation.isRecord(flowRecord.getId())) {
91+
flowTodoMergeRepository.remove(margeRelation);
92+
todoMargeRecord.divMergeCount();
93+
if (todoMargeRecord.hasMergeCount()) {
94+
flowTodoRecordRepository.save(todoMargeRecord);
95+
} else {
96+
flowTodoRecordRepository.remove(todoMargeRecord);
97+
}
98+
}
99+
}
100+
}
101+
}
102+
} else {
103+
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
104+
if (todoMargeRecord != null) {
105+
flowTodoRecordRepository.remove(todoMargeRecord);
106+
}
107+
}
108+
}
109+
}
110+
}
111+
112+
public void saveAll() {
113+
this.saveRecords();
114+
this.saveTodoMargeRecords();
115+
this.removeTodoMergeRecords();
116+
}
117+
}

flow-engine-framework/src/main/java/com/codingapi/flow/record/FlowRecord.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.codingapi.flow.form.FormData;
77
import com.codingapi.flow.manager.NodeStrategyManager;
88
import com.codingapi.flow.node.IFlowNode;
9+
import com.codingapi.flow.node.nodes.EndNode;
910
import com.codingapi.flow.operator.IFlowOperator;
1011
import com.codingapi.flow.session.FlowAdvice;
1112
import com.codingapi.flow.session.FlowSession;
@@ -604,4 +605,11 @@ public void over() {
604605
this.currentOperatorId = -1;
605606
this.recordState = SATE_RECORD_DONE;
606607
}
608+
609+
/**
610+
* 判断是否结束节点的记录
611+
*/
612+
public boolean isNotEndNode() {
613+
return !EndNode.NODE_TYPE.equals(this.nodeType);
614+
}
607615
}

flow-engine-framework/src/test/java/com/codingapi/flow/service/FlowDetailServiceTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ void detail() {
163163
flowService.action(bossRequest);
164164

165165
List<FlowRecord> records = flowRecordRepository.findProcessRecords(bossRecordList.get(0).getProcessId());
166-
assertEquals(3, records.size());
167-
assertEquals(3, records.stream().filter(FlowRecord::isFinish).toList().size());
166+
assertEquals(2, records.size());
167+
assertEquals(2, records.stream().filter(FlowRecord::isFinish).toList().size());
168168

169169
}
170170

@@ -277,8 +277,8 @@ void processNodes() {
277277
flowService.action(bossRequest);
278278

279279
List<FlowRecord> records = flowRecordRepository.findProcessRecords(bossRecordList.get(0).getProcessId());
280-
assertEquals(3, records.size());
281-
assertEquals(3, records.stream().filter(FlowRecord::isFinish).toList().size());
280+
assertEquals(2, records.size());
281+
assertEquals(2, records.stream().filter(FlowRecord::isFinish).toList().size());
282282

283283
}
284284
}

flow-engine-framework/src/test/java/com/codingapi/flow/service/FlowMergeableServiceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ void mergeableRecords() {
163163

164164
for(int i=0;i<count;i++) {
165165
List<FlowRecord> records = flowRecordRepository.findProcessRecords(bossRecordList.get(i).getProcessId());
166-
assertEquals(3, records.size());
167-
assertEquals(3, records.stream().filter(FlowRecord::isFinish).toList().size());
166+
assertEquals(2, records.size());
167+
assertEquals(2, records.stream().filter(FlowRecord::isFinish).toList().size());
168168
}
169169

170170
List<FlowTodoRecord> todoRecordList = flowTodoRecordRepository.findAll();

flow-engine-framework/src/test/java/com/codingapi/flow/service/FlowParallelServiceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,9 +310,9 @@ void parallelAndParallel() {
310310

311311

312312
List<FlowRecord> records = flowRecordRepository.findProcessRecords(departRecordList.get(0).getProcessId());
313-
assertEquals(8, records.size());
313+
assertEquals(7, records.size());
314314
assertEquals(0, records.stream().filter(FlowRecord::isTodo).toList().size());
315-
assertEquals(8, records.stream().filter(FlowRecord::isFinish).toList().size());
315+
assertEquals(7, records.stream().filter(FlowRecord::isFinish).toList().size());
316316

317317
}
318318
}

0 commit comments

Comments
 (0)