Skip to content

Commit dd59b41

Browse files
committed
fix #30
1 parent c01fddc commit dd59b41

18 files changed

Lines changed: 518 additions & 59 deletions

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

Lines changed: 126 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
import com.codingapi.flow.gateway.FlowOperatorGateway;
66
import com.codingapi.flow.operator.IFlowOperator;
77
import com.codingapi.flow.record.FlowRecord;
8+
import com.codingapi.flow.record.FlowTodoRecord;
9+
import com.codingapi.flow.record.FlowTodoMarge;
810
import com.codingapi.flow.repository.*;
911
import com.codingapi.flow.service.FlowService;
1012
import com.codingapi.flow.service.impl.FlowActionService;
1113
import com.codingapi.flow.service.impl.FlowDelayTriggerService;
1214
import com.codingapi.flow.session.FlowSession;
1315
import lombok.Getter;
1416

17+
import java.util.ArrayList;
1518
import java.util.List;
1619

1720
public class RepositoryHolderContext {
@@ -29,6 +32,10 @@ private RepositoryHolderContext() {
2932
@Getter
3033
private FlowRecordRepository flowRecordRepository;
3134
@Getter
35+
private FlowTodoRecordRepository flowTodoRecordRepository;
36+
@Getter
37+
private FlowTodoMargeRepository flowTodoMargeRepository;
38+
@Getter
3239
private FlowOperatorGateway flowOperatorGateway;
3340
@Getter
3441
private ParallelBranchRepository parallelBranchRepository;
@@ -45,6 +52,8 @@ public boolean isRegistered() {
4552
&& delayTaskRepository != null
4653
&& workflowBackupRepository != null
4754
&& flowRecordRepository != null
55+
&& flowTodoRecordRepository != null
56+
&& flowTodoMargeRepository != null
4857
&& flowOperatorGateway != null
4958
&& workflowRepository != null
5059
&& urgeIntervalRepository != null;
@@ -60,13 +69,17 @@ public void verify() {
6069
public void register(WorkflowRepository workflowRepository,
6170
WorkflowBackupRepository workflowBackupRepository,
6271
FlowRecordRepository flowRecordRepository,
72+
FlowTodoRecordRepository flowTodoRecordRepository,
73+
FlowTodoMargeRepository flowTodoMargeRepository,
6374
FlowOperatorGateway flowOperatorGateway,
6475
ParallelBranchRepository parallelBranchRepository,
6576
DelayTaskRepository delayTaskRepository,
6677
UrgeIntervalRepository urgeIntervalRepository) {
6778
this.workflowRepository = workflowRepository;
6879
this.workflowBackupRepository = workflowBackupRepository;
6980
this.flowRecordRepository = flowRecordRepository;
81+
this.flowTodoRecordRepository = flowTodoRecordRepository;
82+
this.flowTodoMargeRepository = flowTodoMargeRepository;
7083
this.flowOperatorGateway = flowOperatorGateway;
7184
this.parallelBranchRepository = parallelBranchRepository;
7285
this.delayTaskRepository = delayTaskRepository;
@@ -97,10 +110,7 @@ public FlowDelayTriggerService createDelayTriggerService(DelayTask task) {
97110
*/
98111
public FlowActionService createFlowActionService(FlowSession flowSession) {
99112
this.verify();
100-
return new FlowActionService(flowSession.toActionRequest(),
101-
flowOperatorGateway,
102-
flowRecordRepository,
103-
workflowBackupRepository);
113+
return new FlowActionService(flowSession.toActionRequest());
104114
}
105115

106116

@@ -114,6 +124,8 @@ public FlowService createFlowService() {
114124
return new FlowService(workflowRepository,
115125
flowOperatorGateway,
116126
flowRecordRepository,
127+
flowTodoRecordRepository,
128+
flowTodoMargeRepository,
117129
workflowBackupRepository,
118130
parallelBranchRepository,
119131
delayTaskRepository,
@@ -142,12 +154,15 @@ public void deleteDelayTask(DelayTask delayTask) {
142154
delayTaskRepository.delete(delayTask);
143155
}
144156

157+
145158
public void saveRecords(List<FlowRecord> flowRecords) {
146-
flowRecordRepository.saveAll(flowRecords);
159+
FlowRecordRepositoryService flowRecordRepositoryService = new FlowRecordRepositoryService(flowRecords);
160+
flowRecordRepositoryService.saveAll();
147161
}
148162

149163
public void saveRecord(FlowRecord flowRecord) {
150-
flowRecordRepository.save(flowRecord);
164+
FlowRecordRepositoryService flowRecordRepositoryService = new FlowRecordRepositoryService(flowRecord);
165+
flowRecordRepositoryService.saveAll();
151166
}
152167

153168
public List<FlowRecord> findCurrentNodeRecords(long fromId, String nodeId) {
@@ -179,4 +194,109 @@ public List<DelayTask> findDelayTasks() {
179194
}
180195

181196

197+
private static class FlowRecordRepositoryService {
198+
199+
private final List<FlowRecord> flowRecords;
200+
private final FlowTodoRecordRepository flowTodoRecordRepository;
201+
private final FlowTodoMargeRepository flowTodoMargeRepository;
202+
private final FlowRecordRepository flowRecordRepository;
203+
204+
205+
public FlowRecordRepositoryService(List<FlowRecord> flowRecords) {
206+
this.flowTodoRecordRepository = RepositoryHolderContext.getInstance().getFlowTodoRecordRepository();
207+
this.flowTodoMargeRepository = RepositoryHolderContext.getInstance().getFlowTodoMargeRepository();
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.flowTodoMargeRepository = RepositoryHolderContext.getInstance().getFlowTodoMargeRepository();
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 = null;
226+
if (flowRecord.isMergeable()) {
227+
todoMargeRecord = flowTodoRecordRepository.getByMageKey(flowRecord.getMergeKey());
228+
if (todoMargeRecord == null) {
229+
todoMargeRecord = new FlowTodoRecord(flowRecord);
230+
} else {
231+
todoMargeRecord.update(flowRecord);
232+
todoMargeRecord.addMargeCount();
233+
}
234+
} else {
235+
todoMargeRecord = new FlowTodoRecord(flowRecord);
236+
}
237+
flowTodoRecords.add(todoMargeRecord);
238+
}
239+
}
240+
if (!flowTodoRecords.isEmpty()) {
241+
flowTodoRecordRepository.saveAll(flowTodoRecords);
242+
}
243+
244+
if (!flowTodoRecords.isEmpty()) {
245+
List<FlowTodoMarge> relationList = new ArrayList<>();
246+
for (FlowTodoRecord margeRecord : flowTodoRecords) {
247+
if(margeRecord.isMergeable()) {
248+
relationList.add(new FlowTodoMarge(margeRecord));
249+
}
250+
}
251+
flowTodoMargeRepository.saveAll(relationList);
252+
}
253+
}
254+
255+
private void saveRecords() {
256+
if (!flowRecords.isEmpty()) {
257+
flowRecordRepository.saveAll(flowRecords);
258+
}
259+
}
260+
261+
262+
private void removeTodoMargeRecords() {
263+
for (FlowRecord flowRecord : flowRecords) {
264+
if (flowRecord.isDone()) {
265+
if (flowRecord.isMergeable()) {
266+
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMageKey(flowRecord.getMergeKey());
267+
if(todoMargeRecord!=null) {
268+
List<FlowTodoMarge> margeRelations = flowTodoMargeRepository.findByTodoId(todoMargeRecord.getId());
269+
if(margeRelations!=null && !margeRelations.isEmpty()) {
270+
for (FlowTodoMarge margeRelation : margeRelations) {
271+
if (margeRelation.isRecord(flowRecord.getId())) {
272+
flowTodoMargeRepository.remove(margeRelation);
273+
todoMargeRecord.divMargeCount();
274+
if (todoMargeRecord.hasMargeCount()) {
275+
flowTodoRecordRepository.save(todoMargeRecord);
276+
} else {
277+
flowTodoRecordRepository.remove(todoMargeRecord);
278+
}
279+
}
280+
}
281+
}
282+
}
283+
} else {
284+
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMageKey(flowRecord.getMergeKey());
285+
if (todoMargeRecord != null) {
286+
flowTodoRecordRepository.remove(todoMargeRecord);
287+
}
288+
}
289+
}
290+
}
291+
}
292+
293+
public void saveAll() {
294+
this.saveRecords();
295+
this.saveTodoMargeRecords();
296+
this.removeTodoMargeRecords();
297+
}
298+
299+
300+
}
301+
182302
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public class FlowRecord {
190190
private long timeoutTime;
191191
/**
192192
* 是否可合并
193-
* {@link FlowRecord#getMergeId()}
193+
* {@link FlowRecord#getMergeKey()}
194194
*/
195195
private boolean mergeable;
196196
/**
@@ -227,11 +227,11 @@ public class FlowRecord {
227227
* 数据合并的依据,当开启时值为固定值,否则为随机数据
228228
* 相同的 {@link FlowRecord#currentOperatorId} {@link FlowRecord#workBackupId} {@link FlowRecord#nodeId}字段的数据合并到一条记录上。
229229
*/
230-
public String getMergeId() {
230+
public String getMergeKey() {
231231
if (mergeable) {
232232
return String.format("%s-%s-%s", currentOperatorId, workBackupId, nodeId);
233233
} else {
234-
return RandomUtils.generateStringId();
234+
return String.valueOf(id);
235235
}
236236
}
237237

@@ -352,6 +352,13 @@ public boolean isTodo() {
352352
return recordState == SATE_RECORD_TODO && flowState == SATE_FLOW_RUNNING && !hidden && !revoked;
353353
}
354354

355+
/**
356+
* 是否已办
357+
*/
358+
public boolean isDone() {
359+
return recordState == SATE_RECORD_DONE && !hidden && !revoked;
360+
}
361+
355362

356363
/**
357364
* 判断是否已完成
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.codingapi.flow.record;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
7+
/**
8+
* 存储待办合并的记录,仅当开启流程记录合并时才会产生合并记录数据
9+
* {@link FlowRecord#isMergeable()} 为true时才会产生
10+
*/
11+
@Getter
12+
@AllArgsConstructor
13+
public class FlowTodoMarge {
14+
15+
@Setter
16+
private long id;
17+
/**
18+
* 待办id
19+
*/
20+
private long todoId;
21+
/**
22+
* 待办记录id
23+
*/
24+
private long recordId;
25+
/**
26+
* 创建时间
27+
*/
28+
private long createTime;
29+
30+
public FlowTodoMarge(FlowTodoRecord margeRecord){
31+
this.todoId = margeRecord.getId();
32+
this.recordId = margeRecord.getRecordId();
33+
this.createTime = margeRecord.getCreateTime();
34+
}
35+
36+
37+
public boolean isRecord(long recordId) {
38+
return this.recordId == recordId;
39+
}
40+
}

0 commit comments

Comments
 (0)