Skip to content

Commit f1b01ca

Browse files
committed
fix bug
1 parent ecaab81 commit f1b01ca

File tree

5 files changed

+136
-50
lines changed

5 files changed

+136
-50
lines changed

springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/record/FlowRecord.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ public void transferToTodo(String title, IFlowOperator operator) {
267267
* @param flowOperator 操作者
268268
* @param snapshot 绑定数据
269269
*/
270-
public void unSignAutoDone(IFlowOperator flowOperator, BindDataSnapshot snapshot) {
270+
public void autoPass(IFlowOperator flowOperator, BindDataSnapshot snapshot) {
271271
this.read();
272272
this.flowSourceDirection = FlowSourceDirection.PASS;
273273
this.currentOperatorId = flowOperator.getUserId();

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

Lines changed: 111 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.codingapi.springboot.flow.record.FlowRecord;
1010
import com.codingapi.springboot.flow.repository.FlowBindDataRepository;
1111
import com.codingapi.springboot.flow.repository.FlowOperatorRepository;
12+
import com.codingapi.springboot.flow.user.IFlowOperator;
1213
import lombok.Getter;
1314

1415
import java.util.List;
@@ -20,18 +21,23 @@ class FlowNodeService {
2021
private final FlowBindDataRepository flowBindDataRepository;
2122

2223
private final FlowRecordService2 flowRecordService2;
24+
private final String processId;
2325

2426
private final FlowRecord flowRecord;
2527
private final FlowWork flowWork;
2628
private final FlowNode flowNode;
2729
private final IBindData bindData;
2830
private final Opinion opinion;
31+
private final IFlowOperator currentOperator;
2932

3033
// load Object
3134
@Getter
3235
private FlowSourceDirection flowSourceDirection;
3336
@Getter
3437
private List<FlowRecord> childrenRecords;
38+
@Getter
39+
private List<FlowRecord> historyRecords;
40+
3541
@Getter
3642
private BindDataSnapshot snapshot;
3743

@@ -47,35 +53,121 @@ public FlowNodeService(FlowOperatorRepository flowOperatorRepository,
4753
this.flowRecordService2 = flowRecordService2;
4854
this.bindData = bindData;
4955
this.opinion = opinion;
56+
this.currentOperator = flowRecordService2.getCurrentOperator();
5057

5158
this.flowRecord = flowRecordService2.getFlowRecord();
5259
this.flowWork = flowRecordService2.getFlowWork();
5360
this.flowNode = flowRecordService2.getFlowNode();
5461

62+
this.processId = flowRecord.getProcessId();
63+
5564
}
5665

5766

58-
public void loadFlowSourceDirection(){
59-
if(opinion.isSuccess()){
67+
/**
68+
* 解析当前的审批方向
69+
*/
70+
public void loadFlowSourceDirection() {
71+
if (opinion.isSuccess()) {
6072
flowSourceDirection = FlowSourceDirection.PASS;
6173
}
62-
if(opinion.isReject()){
74+
if (opinion.isReject()) {
6375
flowSourceDirection = FlowSourceDirection.REJECT;
6476
}
6577
}
6678

79+
/**
80+
* 提交流程记录
81+
*/
82+
public void submitFlowRecord() {
83+
flowRecord.submitRecord(currentOperator, snapshot, opinion, flowSourceDirection);
84+
flowRecordService2.flowRecordRepository.update(flowRecord);
85+
}
86+
6787

6888
/**
69-
* 保存流程表单数据
89+
* 重新加载审批方向
90+
* 根据会签结果判断是否需要重新设置审批方向
91+
*/
92+
public void reloadFlowSourceDirection() {
93+
if (flowNode.isSign()) {
94+
boolean allPass = historyRecords.stream().filter(item -> !item.isTransfer()).allMatch(FlowRecord::isPass);
95+
if (!allPass) {
96+
flowSourceDirection = FlowSourceDirection.REJECT;
97+
}
98+
}
99+
}
100+
101+
102+
/**
103+
* 判断当前流程节点是否已经完成,是否可以继续流转
104+
*/
105+
public boolean hasCurrentFlowNodeIsDone() {
106+
// 会签处理流程
107+
if (flowNode.isSign()) {
108+
// 会签下所有人尚未提交时,不执行下一节点
109+
boolean allDone = historyRecords.stream().filter(item -> !item.isTransfer()).allMatch(FlowRecord::isDone);
110+
if (!allDone) {
111+
// 流程尚未审批结束直接退出
112+
return true;
113+
}
114+
}
115+
return false;
116+
}
117+
118+
/**
119+
* 检测当前流程是否已经完成
120+
* 即流程已经进行到了最终节点且审批意见为同意
121+
*/
122+
public boolean hasCurrentFlowIsFinish() {
123+
if (flowSourceDirection == FlowSourceDirection.PASS && flowNode.isOverNode()) {
124+
return true;
125+
}
126+
return false;
127+
}
128+
129+
130+
/**
131+
* 完成所有流程
132+
*/
133+
public void finishFlow() {
134+
flowRecord.finish();
135+
flowRecord.submitRecord(currentOperator, snapshot, opinion, flowSourceDirection);
136+
flowRecordService2.flowRecordRepository.update(flowRecord);
137+
flowRecordService2.flowRecordRepository.finishFlowRecordByProcessId(processId);
138+
}
139+
140+
141+
/**
142+
* 保存流程表单数据
70143
*/
71144
public void updateSnapshot() {
72145
BindDataSnapshot snapshot = new BindDataSnapshot(flowRecord.getSnapshotId(), bindData);
73146
flowBindDataRepository.update(snapshot);
74147
}
75148

76149

150+
/**
151+
* 若非会签模式,则再第一人提交以后其他的人的流程记录将自动通过提交
152+
*/
153+
public void autoSubmitUnSignReload() {
154+
// 非会签处理流程
155+
if (flowNode.isUnSign()) {
156+
// 非会签下,默认其他将所有人未提交的流程,都自动提交然后再执行下一节点
157+
for (FlowRecord record : historyRecords) {
158+
if (record.isTodo() && record.getId() != flowRecord.getId()) {
159+
record.autoPass(currentOperator, snapshot);
160+
flowRecordService2.flowRecordRepository.update(flowRecord);
161+
}
162+
}
163+
}
164+
}
165+
77166

78-
public void loadSnapshot(){
167+
/**
168+
* 加载快照数据
169+
*/
170+
public void loadOrCreateSnapshot() {
79171
// 保存绑定数据
80172
if (flowNode.isEditable()) {
81173
snapshot = new BindDataSnapshot(bindData);
@@ -87,31 +179,40 @@ public void loadSnapshot(){
87179

88180

89181
/**
90-
* 更新流程记录
182+
* 加载同级的审批记录
183+
* 即加载当前节点流程下产生的所有记录数据
184+
*/
185+
public void loadHistoryRecords() {
186+
historyRecords = flowRecordService2.flowRecordRepository.findFlowRecordByPreId(flowRecord.getPreId());
187+
}
188+
189+
190+
/**
191+
* 更新流程记录
91192
*/
92193
public void updateFlowRecord() {
93194
flowRecord.setOpinion(opinion);
94195
flowRecordService2.flowRecordRepository.update(flowRecord);
95196
}
96197

97198

98-
public void loadChildrenRecords(){
199+
public void loadChildrenRecords() {
99200
childrenRecords = flowRecordService2.flowRecordRepository.findFlowRecordByPreId(flowRecord.getId());
100201
}
101202

102203

103-
public void verifyChildrenRecordsIsEmpty(){
204+
public void verifyChildrenRecordsIsEmpty() {
104205
if (!childrenRecords.isEmpty()) {
105206
throw new IllegalArgumentException("flow node is done");
106207
}
107208
}
108209

109210

110211
public void verifyFlowSourceDirection() {
111-
if(flowSourceDirection==null){
212+
if (flowSourceDirection == null) {
112213
throw new IllegalArgumentException("flow source direction is null");
113214
}
114-
if(flowNode.isStartNode() && flowSourceDirection == FlowSourceDirection.REJECT){
215+
if (flowNode.isStartNode() && flowSourceDirection == FlowSourceDirection.REJECT) {
115216
throw new IllegalArgumentException("flow node is start node");
116217
}
117218
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class FlowRecordService2 {
1616

1717
// constructor params
1818
private final long recordId;
19+
@Getter
1920
private final IFlowOperator currentOperator;
2021

2122
// register repository

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

Lines changed: 17 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -342,60 +342,39 @@ public void submitFlow(long recordId, IFlowOperator currentOperator, IBindData b
342342
// 获取创建者
343343
IFlowOperator createOperator = flowOperatorRepository.getFlowOperatorById(flowRecord.getCreateOperatorId());
344344

345-
flowNodeService.loadSnapshot();
345+
flowNodeService.loadOrCreateSnapshot();
346346

347347
BindDataSnapshot snapshot = flowNodeService.getSnapshot();
348-
FlowSourceDirection flowSourceDirection = flowNodeService.getFlowSourceDirection();
348+
349349

350350
// 提交流程
351-
flowRecord.submitRecord(currentOperator, snapshot, opinion, flowSourceDirection);
352-
flowRecordRepository.update(flowRecord);
351+
flowNodeService.submitFlowRecord();
353352

354353
// 与当前流程同级的流程记录
355-
List<FlowRecord> historyRecords = flowRecordRepository.findFlowRecordByPreId(flowRecord.getPreId());
354+
// List<FlowRecord> historyRecords = flowRecordRepository.findFlowRecordByPreId(flowRecord.getPreId());
355+
flowNodeService.loadHistoryRecords();
356356

357+
boolean next = flowNodeService.hasCurrentFlowNodeIsDone();
358+
if(next){
359+
return;
360+
}
357361

358-
// 会签处理流程
359-
if (flowNode.isSign()) {
360-
// 会签下所有人尚未提交时,不执行下一节点
361-
boolean allDone = historyRecords.stream().filter(item -> !item.isTransfer()).allMatch(FlowRecord::isDone);
362-
if (!allDone) {
363-
// 流程尚未审批结束直接退出
364-
return;
365-
}
366-
// 会签下所有人都同意,再执行下一节点
367-
boolean allPass = historyRecords.stream().filter(item -> !item.isTransfer()).allMatch(FlowRecord::isPass);
368-
if (!allPass) {
369-
flowSourceDirection = FlowSourceDirection.REJECT;
370-
}
362+
flowNodeService.reloadFlowSourceDirection();
371363

372-
}
373-
// 非会签处理流程
374-
if (flowNode.isUnSign()) {
375-
// 非会签下,默认其他将所有人未提交的流程,都自动提交然后再执行下一节点
376-
for (FlowRecord record : historyRecords) {
377-
if (record.isTodo() && record.getId() != recordId) {
378-
record.unSignAutoDone(currentOperator, snapshot);
379-
flowRecordRepository.update(flowRecord);
380-
}
381-
}
382-
}
364+
flowNodeService.autoSubmitUnSignReload();
365+
366+
List<FlowRecord> historyRecords = flowNodeService.getHistoryRecords();
383367

384368
String processId = flowRecord.getProcessId();
385369

386-
// 流程结束的情况
387-
if (flowSourceDirection== FlowSourceDirection.PASS && flowNode.isOverNode()) {
388-
// 结束简单时自动审批
389-
flowRecord.finish();
390-
// 提交流程
391-
flowRecord.submitRecord(currentOperator, snapshot, opinion, flowSourceDirection);
392-
flowRecordRepository.update(flowRecord);
370+
FlowSourceDirection flowSourceDirection = flowNodeService.getFlowSourceDirection();
371+
372+
if(flowNodeService.hasCurrentFlowIsFinish()){
373+
flowNodeService.finishFlow();
393374

394-
flowRecordRepository.finishFlowRecordByProcessId(processId);
395375
EventPusher.push(new FlowApprovalEvent(FlowApprovalEvent.STATE_FINISH, flowRecord, currentOperator,flowWork));
396376
return;
397377
}
398-
399378
this.createNextRecord(flowWork,flowSourceDirection,flowNode,processId,createOperator,currentOperator,snapshot,opinion,flowRecord,historyRecords);
400379

401380
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,12 @@ void signRejectTest(){
276276
.nodes()
277277
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
278278
.node("部门领导审批", "dept", "default", ApprovalType.SIGN,
279-
OperatorMatcher.specifyOperatorMatcher(dept.getUserId(),caocao.getUserId(),lvBu.getUserId(),zhaoYun.getUserId()))
279+
OperatorMatcher.specifyOperatorMatcher(
280+
dept.getUserId(),
281+
caocao.getUserId(),
282+
lvBu.getUserId(),
283+
zhaoYun.getUserId()
284+
))
280285
.node("总经理审批", "manager", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
281286
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.creatorOperatorMatcher())
282287
.relations()

0 commit comments

Comments
 (0)