Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
package com.codingapi.flow.context;

import com.codingapi.flow.context.service.FlowRecordSaveService;
import com.codingapi.flow.domain.DelayTask;
import com.codingapi.flow.exception.FlowStateException;
import com.codingapi.flow.gateway.FlowOperatorGateway;
import com.codingapi.flow.operator.IFlowOperator;
import com.codingapi.flow.record.FlowRecord;
import com.codingapi.flow.record.FlowTodoRecord;
import com.codingapi.flow.record.FlowTodoMerge;
import com.codingapi.flow.repository.*;
import com.codingapi.flow.service.FlowService;
import com.codingapi.flow.service.impl.FlowActionService;
import com.codingapi.flow.service.impl.FlowDelayTriggerService;
import com.codingapi.flow.session.FlowSession;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

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

@Getter
Expand Down Expand Up @@ -156,13 +157,13 @@ public void deleteDelayTask(DelayTask delayTask) {


public void saveRecords(List<FlowRecord> flowRecords) {
FlowRecordRepositoryService flowRecordRepositoryService = new FlowRecordRepositoryService(flowRecords);
flowRecordRepositoryService.saveAll();
FlowRecordSaveService flowRecordSaveService = new FlowRecordSaveService(flowRecords);
flowRecordSaveService.saveAll();
}

public void saveRecord(FlowRecord flowRecord) {
FlowRecordRepositoryService flowRecordRepositoryService = new FlowRecordRepositoryService(flowRecord);
flowRecordRepositoryService.saveAll();
FlowRecordSaveService flowRecordSaveService = new FlowRecordSaveService(flowRecord);
flowRecordSaveService.saveAll();
}

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


private static class FlowRecordRepositoryService {

private final List<FlowRecord> flowRecords;
private final FlowTodoRecordRepository flowTodoRecordRepository;
private final FlowTodoMergeRepository flowTodoMergeRepository;
private final FlowRecordRepository flowRecordRepository;


public FlowRecordRepositoryService(List<FlowRecord> flowRecords) {
this.flowTodoRecordRepository = RepositoryHolderContext.getInstance().getFlowTodoRecordRepository();
this.flowTodoMergeRepository = RepositoryHolderContext.getInstance().getFlowTodoMergeRepository();
this.flowRecordRepository = RepositoryHolderContext.getInstance().getFlowRecordRepository();
this.flowRecords = flowRecords;
}

public FlowRecordRepositoryService(FlowRecord flowRecord) {
this.flowTodoRecordRepository = RepositoryHolderContext.getInstance().getFlowTodoRecordRepository();
this.flowTodoMergeRepository = RepositoryHolderContext.getInstance().getFlowTodoMergeRepository();
this.flowRecordRepository = RepositoryHolderContext.getInstance().getFlowRecordRepository();
this.flowRecords = new ArrayList<>();
this.flowRecords.add(flowRecord);
}


private void saveTodoMargeRecords() {
List<FlowTodoRecord> flowTodoRecords = new ArrayList<>();
for (FlowRecord flowRecord : flowRecords) {
if (flowRecord.isTodo()) {
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
if (todoMargeRecord == null) {
todoMargeRecord = new FlowTodoRecord(flowRecord);
} else {
todoMargeRecord.update(flowRecord);
if (flowRecord.isMergeable()) {
todoMargeRecord.addMergeCount();
}
}
flowTodoRecords.add(todoMargeRecord);
}
}
if (!flowTodoRecords.isEmpty()) {
flowTodoRecordRepository.saveAll(flowTodoRecords);
}

if (!flowTodoRecords.isEmpty()) {
List<FlowTodoMerge> relationList = new ArrayList<>();
for (FlowTodoRecord margeRecord : flowTodoRecords) {
if(margeRecord.isMergeable()) {
relationList.add(new FlowTodoMerge(margeRecord));
}
}
flowTodoMergeRepository.saveAll(relationList);
}
}

private void saveRecords() {
if (!flowRecords.isEmpty()) {
flowRecordRepository.saveAll(flowRecords);
}
}


private void removeTodoMergeRecords() {
for (FlowRecord flowRecord : flowRecords) {
if (flowRecord.isDone()) {
if (flowRecord.isMergeable()) {
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
if(todoMargeRecord!=null) {
List<FlowTodoMerge> margeRelations = flowTodoMergeRepository.findByTodoId(todoMargeRecord.getId());
if(margeRelations!=null && !margeRelations.isEmpty()) {
for (FlowTodoMerge margeRelation : margeRelations) {
if (margeRelation.isRecord(flowRecord.getId())) {
flowTodoMergeRepository.remove(margeRelation);
todoMargeRecord.divMergeCount();
if (todoMargeRecord.hasMergeCount()) {
flowTodoRecordRepository.save(todoMargeRecord);
} else {
flowTodoRecordRepository.remove(todoMargeRecord);
}
}
}
}
}
} else {
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
if (todoMargeRecord != null) {
flowTodoRecordRepository.remove(todoMargeRecord);
}
}
}
}
}

public void saveAll() {
this.saveRecords();
this.saveTodoMargeRecords();
this.removeTodoMergeRecords();
}


}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package com.codingapi.flow.context.service;

import com.codingapi.flow.context.RepositoryHolderContext;
import com.codingapi.flow.record.FlowRecord;
import com.codingapi.flow.record.FlowTodoMerge;
import com.codingapi.flow.record.FlowTodoRecord;
import com.codingapi.flow.repository.FlowRecordRepository;
import com.codingapi.flow.repository.FlowTodoMergeRepository;
import com.codingapi.flow.repository.FlowTodoRecordRepository;

import java.util.ArrayList;
import java.util.List;

/**
* 流程记录保存服务,负责保存流程记录和待办记录的合并关系
*/
public class FlowRecordSaveService {

private final List<FlowRecord> flowRecords;
private final FlowTodoRecordRepository flowTodoRecordRepository;
private final FlowTodoMergeRepository flowTodoMergeRepository;
private final FlowRecordRepository flowRecordRepository;


public FlowRecordSaveService(List<FlowRecord> flowRecords) {
this.flowTodoRecordRepository = RepositoryHolderContext.getInstance().getFlowTodoRecordRepository();
this.flowTodoMergeRepository = RepositoryHolderContext.getInstance().getFlowTodoMergeRepository();
this.flowRecordRepository = RepositoryHolderContext.getInstance().getFlowRecordRepository();
this.flowRecords = flowRecords;
}

public FlowRecordSaveService(FlowRecord flowRecord) {
this.flowTodoRecordRepository = RepositoryHolderContext.getInstance().getFlowTodoRecordRepository();
this.flowTodoMergeRepository = RepositoryHolderContext.getInstance().getFlowTodoMergeRepository();
this.flowRecordRepository = RepositoryHolderContext.getInstance().getFlowRecordRepository();
this.flowRecords = new ArrayList<>();
this.flowRecords.add(flowRecord);
}


private void saveTodoMargeRecords() {
List<FlowTodoRecord> flowTodoRecords = new ArrayList<>();
for (FlowRecord flowRecord : flowRecords) {
if (flowRecord.isTodo()) {
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
if (todoMargeRecord == null) {
todoMargeRecord = new FlowTodoRecord(flowRecord);
} else {
todoMargeRecord.update(flowRecord);
if (flowRecord.isMergeable()) {
todoMargeRecord.addMergeCount();
}
}
flowTodoRecords.add(todoMargeRecord);
}
}
if (!flowTodoRecords.isEmpty()) {
flowTodoRecordRepository.saveAll(flowTodoRecords);
}

if (!flowTodoRecords.isEmpty()) {
List<FlowTodoMerge> relationList = new ArrayList<>();
for (FlowTodoRecord margeRecord : flowTodoRecords) {
if (margeRecord.isMergeable()) {
relationList.add(new FlowTodoMerge(margeRecord));
}
}
flowTodoMergeRepository.saveAll(relationList);
}
}

private void saveRecords() {
if (!flowRecords.isEmpty()) {
// 只保存非结束节点的记录,结束节点的记录由流程引擎自动生成,不允许外部修改
List<FlowRecord> flowRecordList = flowRecords.stream().filter(FlowRecord::isNotEndNode).toList();
flowRecordRepository.saveAll(flowRecordList);
}
}


private void removeTodoMergeRecords() {
for (FlowRecord flowRecord : flowRecords) {
if (flowRecord.isDone()) {
if (flowRecord.isMergeable()) {
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
if (todoMargeRecord != null) {
List<FlowTodoMerge> margeRelations = flowTodoMergeRepository.findByTodoId(todoMargeRecord.getId());
if (margeRelations != null && !margeRelations.isEmpty()) {
for (FlowTodoMerge margeRelation : margeRelations) {
if (margeRelation.isRecord(flowRecord.getId())) {
flowTodoMergeRepository.remove(margeRelation);
todoMargeRecord.divMergeCount();
if (todoMargeRecord.hasMergeCount()) {
flowTodoRecordRepository.save(todoMargeRecord);
} else {
flowTodoRecordRepository.remove(todoMargeRecord);
}
}
}
}
}
} else {
FlowTodoRecord todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
if (todoMargeRecord != null) {
flowTodoRecordRepository.remove(todoMargeRecord);
}
}
}
}
}

public void saveAll() {
this.saveRecords();
this.saveTodoMargeRecords();
this.removeTodoMergeRecords();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.codingapi.flow.form.FormData;
import com.codingapi.flow.manager.NodeStrategyManager;
import com.codingapi.flow.node.IFlowNode;
import com.codingapi.flow.node.nodes.EndNode;
import com.codingapi.flow.operator.IFlowOperator;
import com.codingapi.flow.session.FlowAdvice;
import com.codingapi.flow.session.FlowSession;
Expand Down Expand Up @@ -604,4 +605,11 @@ public void over() {
this.currentOperatorId = -1;
this.recordState = SATE_RECORD_DONE;
}

/**
* 判断是否结束节点的记录
*/
public boolean isNotEndNode() {
return !EndNode.NODE_TYPE.equals(this.nodeType);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ void detail() {
flowService.action(bossRequest);

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

}

Expand Down Expand Up @@ -277,8 +277,8 @@ void processNodes() {
flowService.action(bossRequest);

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

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ void mergeableRecords() {

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

List<FlowTodoRecord> todoRecordList = flowTodoRecordRepository.findAll();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -310,9 +310,9 @@ void parallelAndParallel() {


List<FlowRecord> records = flowRecordRepository.findProcessRecords(departRecordList.get(0).getProcessId());
assertEquals(8, records.size());
assertEquals(7, records.size());
assertEquals(0, records.stream().filter(FlowRecord::isTodo).toList().size());
assertEquals(8, records.stream().filter(FlowRecord::isFinish).toList().size());
assertEquals(7, records.stream().filter(FlowRecord::isFinish).toList().size());

}
}
Loading