Skip to content
Merged

Dev #31

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
Expand Up @@ -5,13 +5,16 @@
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 {
Expand All @@ -29,6 +32,10 @@ private RepositoryHolderContext() {
@Getter
private FlowRecordRepository flowRecordRepository;
@Getter
private FlowTodoRecordRepository flowTodoRecordRepository;
@Getter
private FlowTodoMergeRepository flowTodoMergeRepository;
@Getter
private FlowOperatorGateway flowOperatorGateway;
@Getter
private ParallelBranchRepository parallelBranchRepository;
Expand All @@ -45,6 +52,8 @@ public boolean isRegistered() {
&& delayTaskRepository != null
&& workflowBackupRepository != null
&& flowRecordRepository != null
&& flowTodoRecordRepository != null
&& flowTodoMergeRepository != null
&& flowOperatorGateway != null
&& workflowRepository != null
&& urgeIntervalRepository != null;
Expand All @@ -60,13 +69,17 @@ public void verify() {
public void register(WorkflowRepository workflowRepository,
WorkflowBackupRepository workflowBackupRepository,
FlowRecordRepository flowRecordRepository,
FlowTodoRecordRepository flowTodoRecordRepository,
FlowTodoMergeRepository flowTodoMergeRepository,
FlowOperatorGateway flowOperatorGateway,
ParallelBranchRepository parallelBranchRepository,
DelayTaskRepository delayTaskRepository,
UrgeIntervalRepository urgeIntervalRepository) {
this.workflowRepository = workflowRepository;
this.workflowBackupRepository = workflowBackupRepository;
this.flowRecordRepository = flowRecordRepository;
this.flowTodoRecordRepository = flowTodoRecordRepository;
this.flowTodoMergeRepository = flowTodoMergeRepository;
this.flowOperatorGateway = flowOperatorGateway;
this.parallelBranchRepository = parallelBranchRepository;
this.delayTaskRepository = delayTaskRepository;
Expand Down Expand Up @@ -97,10 +110,7 @@ public FlowDelayTriggerService createDelayTriggerService(DelayTask task) {
*/
public FlowActionService createFlowActionService(FlowSession flowSession) {
this.verify();
return new FlowActionService(flowSession.toActionRequest(),
flowOperatorGateway,
flowRecordRepository,
workflowBackupRepository);
return new FlowActionService(flowSession.toActionRequest());
}


Expand All @@ -114,6 +124,8 @@ public FlowService createFlowService() {
return new FlowService(workflowRepository,
flowOperatorGateway,
flowRecordRepository,
flowTodoRecordRepository,
flowTodoMergeRepository,
workflowBackupRepository,
parallelBranchRepository,
delayTaskRepository,
Expand Down Expand Up @@ -142,12 +154,15 @@ public void deleteDelayTask(DelayTask delayTask) {
delayTaskRepository.delete(delayTask);
}


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

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

public List<FlowRecord> findCurrentNodeRecords(long fromId, String nodeId) {
Expand Down Expand Up @@ -179,4 +194,109 @@ 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 = null;
if (flowRecord.isMergeable()) {
todoMargeRecord = flowTodoRecordRepository.getByMergeKey(flowRecord.getMergeKey());
if (todoMargeRecord == null) {
todoMargeRecord = new FlowTodoRecord(flowRecord);
} else {
todoMargeRecord.update(flowRecord);
todoMargeRecord.addMargeCount();
}
} else {
todoMargeRecord = new FlowTodoRecord(flowRecord);
}
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 removeTodoMargeRecords() {
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.divMargeCount();
if (todoMargeRecord.hasMargeCount()) {
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.removeTodoMargeRecords();
}


}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@

import java.util.List;

/**
* 流程审批意见
*/
@Data
@NoArgsConstructor
public class FlowAdviceBody {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
package com.codingapi.flow.pojo.response;

import com.codingapi.flow.action.IFlowAction;
import com.codingapi.flow.form.FormMeta;
import lombok.Data;

import java.util.List;
import java.util.Map;

/**
* 流程详情
*/
@Data
public class FlowContent {

/**
* 流程记录编号
*/
private long recordId;
/**
* 流程编号
*/
private String workflowCode;
/**
* 流程视图
*/
private String view;

/**
* 表单元数据
*/
private FormMeta form;
/**
* 流程记录
*/
private List<Body> todos;

/**
* 流程按钮
*/
private List<IFlowAction> actions;

/**
* 是否可合并
*/
private boolean mergeable;

/**
* 发起者id
*/
private long createOperatorId;

/**
* 历史记录
*/
private List<History> histories;

/**
* 下一审批
*/
private List<NextNode> nextNodes;

/**
* 流程图
*/
@Data
public static class NextNode{
/**
* 节点名称
*/
private String nodeId;
/**
* 节点名称
*/
private String nodeName;
/**
* 节点类型
*/
private String nodeType;
}

@Data
public static class History{
/**
* 流程编号
*/
private long recordId;
/**
* 流程标题
*/
private String title;

/**
* 审批意见
*/
private String advice;

/**
* 签名key
*/
private String signKey;

/**
* 节点名称
*/
private String nodeName;

/**
* 节点id
*/
private String nodeId;
/**
* 节点类型
*/
private String nodeType;

/**
* 更新时间
*/
private long updateTime;

/**
* 当前审批人Id
*/
private long currentOperatorId;

/**
* 当前审批人名称
*/
private String currentOperatorName;
}

@Data
public static class Body {
/**
* 流程记录编号
*/
private long recordId;
/**
* 流程标题
*/
private String title;
/**
* 表单数据
*/
private Map<String, Object> data;

/**
* 节点状态 | 待办、已办
*/
private int recordState;
/**
* 流程状态 | 运行中、已完成、异常、删除
*/
private int flowState;
}
}
Loading