Skip to content

Commit af4f3e5

Browse files
committed
fix audit bug
1 parent 07202e6 commit af4f3e5

7 files changed

Lines changed: 208 additions & 11 deletions

File tree

flow-engine-framework/src/main/java/com/codingapi/flow/action/actions/PassAction.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ public void run(FlowSession flowSession) {
7070
List<FlowRecord> recordList = new ArrayList<>();
7171
FlowRecord currentRecord = flowSession.getCurrentRecord();
7272
IFlowNode currentNode = flowSession.getCurrentNode();
73-
boolean done = currentNode.isDone(flowSession);
74-
currentRecord.update(flowSession, done);
73+
boolean isFinish = currentNode.isFinish(flowSession);
74+
currentRecord.update(flowSession, true);
7575
// 添加流程结束事件
7676
flowEvents.add(new FlowRecordDoneEvent(currentRecord));
7777
recordList.add(currentRecord);
@@ -89,7 +89,7 @@ public void run(FlowSession flowSession) {
8989
}
9090
}
9191

92-
if (done) {
92+
if (isFinish) {
9393
// 是否转交审批人的流程
9494
if (currentRecord.isForward()) {
9595
IFlowOperator forwardOperator = RepositoryHolderContext.getInstance().getOperatorById(currentRecord.getForwardOperatorId());

flow-engine-framework/src/main/java/com/codingapi/flow/node/BaseAuditNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public void fillNewRecord(FlowSession session, FlowRecord flowRecord) {
6969
}
7070

7171
@Override
72-
public boolean isDone(FlowSession session) {
72+
public boolean isFinish(FlowSession session) {
7373
List<FlowRecord> currentRecords = session.getCurrentNodeRecords();
7474
FlowRecord currentRecord = session.getCurrentRecord();
7575
// 多人审批

flow-engine-framework/src/main/java/com/codingapi/flow/node/BaseFlowNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ public void verifySession(FlowSession session) {
247247
}
248248

249249
@Override
250-
public boolean isDone(FlowSession session) {
250+
public boolean isFinish(FlowSession session) {
251251
return true;
252252
}
253253

flow-engine-framework/src/main/java/com/codingapi/flow/node/IFlowNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* 流程节点 <br/>
1515
* 流程执行的生命周期,流程在运行之前将会先构建 {@link com.codingapi.flow.action.IFlowAction} {@link IFlowNode} {@link FlowSession} 等对象 <br/>
1616
* 1. 流程的调用第一步将会执行 {@link com.codingapi.flow.action.IFlowAction#run(FlowSession)} 函数。<br/>
17-
* 2. 在{@link com.codingapi.flow.action.IFlowAction#run(FlowSession)} 中流程将需要判断当前流程{@link IFlowNode#isDone(FlowSession)} 是否已经办理完成。 <br/>
17+
* 2. 在{@link com.codingapi.flow.action.IFlowAction#run(FlowSession)} 中流程将需要判断当前流程{@link IFlowNode#isFinish(FlowSession)} 是否已经办理完成。 <br/>
1818
* 3. 流程办理完成后将会分析流程对的下一节点对象 {@link com.codingapi.flow.action.BaseAction#triggerNode(FlowSession, Consumer)} ()},将递归掉分析执行下一节点 <br/>
1919
* 4. 在获取下一节点对象时,将会访问节点的过滤策略 {@link IFlowNode#filterBranches(List, FlowSession)},该函数将根据节点的配置进行过滤匹配下一节点。 <br/>
2020
* 5. 获取到下一节点对象后,则会访问流程节点的 {@link IFlowNode#handle(FlowSession)} 函数分析流程是否继续执行。当函数返回true时则会继续循环调用匹配下一节点的逻辑,即triggerNode的递归逻辑。 <br/>
@@ -94,7 +94,7 @@ public interface IFlowNode extends IMapConvertor {
9494
* @param session 会话
9595
* @return true: 节点完成
9696
*/
97-
boolean isDone(FlowSession session);
97+
boolean isFinish(FlowSession session);
9898

9999
/**
100100
* 填充流程记录,在保存流程记录时将会触发当前节点的填充流程记录函数。由于不同节点存储的流程数据会存在差异。

flow-engine-framework/src/main/java/com/codingapi/flow/node/nodes/NotifyNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public void fillNewRecord(FlowSession session, FlowRecord flowRecord) {
5858
}
5959

6060
@Override
61-
public boolean isDone(FlowSession session) {
61+
public boolean isFinish(FlowSession session) {
6262
return true;
6363
}
6464

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -398,9 +398,9 @@ public boolean isNodeType(String nodeType) {
398398
* 更新记录
399399
*
400400
* @param flowSession 流程会话
401-
* @param done 是否完成
401+
* @param pass 是否通过
402402
*/
403-
public void update(FlowSession flowSession, boolean done) {
403+
public void update(FlowSession flowSession, boolean pass) {
404404
IFlowAction flowAction = flowSession.getCurrentAction();
405405
FlowAdvice flowAdvice = flowSession.getAdvice();
406406
this.formData = flowSession.getFormData().toMapData();
@@ -409,7 +409,7 @@ public void update(FlowSession flowSession, boolean done) {
409409
this.readable = true;
410410
this.readTime = System.currentTimeMillis();
411411
this.updateTime = System.currentTimeMillis();
412-
this.recordState = done ? SATE_RECORD_DONE : SATE_RECORD_TODO;
412+
this.recordState = pass ? SATE_RECORD_DONE : SATE_RECORD_TODO;
413413

414414
// 设置流程干预人信息,流程干预只能由流程管理员才能操作
415415
if (flowSession.getCurrentOperator().getUserId() != this.currentOperatorId) {
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
package com.codingapi.flow.service;
2+
3+
import com.codingapi.flow.action.IFlowAction;
4+
import com.codingapi.flow.action.actions.CustomAction;
5+
import com.codingapi.flow.builder.ActionBuilder;
6+
import com.codingapi.flow.builder.FormFieldPermissionsBuilder;
7+
import com.codingapi.flow.builder.NodeStrategyBuilder;
8+
import com.codingapi.flow.context.GatewayContext;
9+
import com.codingapi.flow.form.DataType;
10+
import com.codingapi.flow.form.FlowForm;
11+
import com.codingapi.flow.form.FlowFormBuilder;
12+
import com.codingapi.flow.form.permission.PermissionType;
13+
import com.codingapi.flow.gateway.impl.UserGateway;
14+
import com.codingapi.flow.node.nodes.ApprovalNode;
15+
import com.codingapi.flow.node.nodes.EndNode;
16+
import com.codingapi.flow.node.nodes.StartNode;
17+
import com.codingapi.flow.pojo.body.FlowAdviceBody;
18+
import com.codingapi.flow.pojo.request.FlowActionRequest;
19+
import com.codingapi.flow.pojo.request.FlowCreateRequest;
20+
import com.codingapi.flow.record.FlowRecord;
21+
import com.codingapi.flow.repository.*;
22+
import com.codingapi.flow.strategy.node.FormFieldPermissionStrategy;
23+
import com.codingapi.flow.strategy.node.OperatorLoadStrategy;
24+
import com.codingapi.flow.user.User;
25+
import com.codingapi.flow.workflow.Workflow;
26+
import com.codingapi.flow.workflow.WorkflowBuilder;
27+
import org.junit.jupiter.api.Test;
28+
29+
import java.util.HashMap;
30+
import java.util.List;
31+
import java.util.Map;
32+
33+
import static org.junit.jupiter.api.Assertions.assertEquals;
34+
35+
public class FlowAddAuditServiceTest {
36+
37+
38+
private final FlowTodoRecordRepositoryImpl flowTodoRecordRepository = new FlowTodoRecordRepositoryImpl();
39+
private final FlowTodoMergeRepositoryImpl flowTodoMergeRepository = new FlowTodoMergeRepositoryImpl();
40+
private final FlowRecordRepositoryImpl flowRecordRepository = new FlowRecordRepositoryImpl();
41+
private final UserGateway userGateway = new UserGateway();
42+
private final WorkflowBackupRepository workflowBackupRepository = new WorkflowBackupRepositoryImpl();
43+
private final WorkflowRepository workflowRepository = new WorkflowRepositoryImpl();
44+
private final ParallelBranchRepository parallelBranchRepository = new ParallelBranchRepositoryImpl();
45+
private final DelayTaskRepository delayTaskRepository = new DelayTaskRepositoryImpl();
46+
private final UrgeIntervalRepository urgeIntervalRepository = new UrgeIntervalRepositoryImpl();
47+
private final FlowService flowService = new FlowService(workflowRepository, userGateway, flowRecordRepository, flowTodoRecordRepository, flowTodoMergeRepository, workflowBackupRepository, parallelBranchRepository, delayTaskRepository, urgeIntervalRepository);
48+
49+
50+
51+
/**
52+
* 加签测试
53+
*/
54+
@Test
55+
void addAudit() {
56+
57+
User user = new User(1, "user");
58+
User depart = new User(2, "depart");
59+
User boss = new User(3, "boss");
60+
61+
userGateway.save(user);
62+
userGateway.save(boss);
63+
userGateway.save(depart);
64+
65+
GatewayContext.getInstance().setFlowOperatorGateway(userGateway);
66+
67+
FlowForm form = FlowFormBuilder.builder()
68+
.name("请假流程")
69+
.code("leave")
70+
.addField("请假人", "name", DataType.STRING)
71+
.addField("请假天数", "days", DataType.NUMBER)
72+
.addField("请假事由", "reason", DataType.STRING)
73+
.build();
74+
75+
StartNode startNode = StartNode
76+
.builder()
77+
.strategies(NodeStrategyBuilder.builder()
78+
.addStrategy(new FormFieldPermissionStrategy(FormFieldPermissionsBuilder.builder()
79+
.addPermission("leave", "name", PermissionType.WRITE)
80+
.addPermission("leave", "days", PermissionType.WRITE)
81+
.addPermission("leave", "reason", PermissionType.WRITE)
82+
.build()))
83+
.build())
84+
.actions(ActionBuilder.builder()
85+
.addAction(new CustomAction())
86+
.build())
87+
.build();
88+
89+
ApprovalNode departNode = ApprovalNode.builder()
90+
.name("部门审批")
91+
.strategies(NodeStrategyBuilder.builder()
92+
.addStrategy(new FormFieldPermissionStrategy(FormFieldPermissionsBuilder.builder()
93+
.addPermission("leave", "name", PermissionType.WRITE)
94+
.addPermission("leave", "days", PermissionType.WRITE)
95+
.addPermission("leave", "reason", PermissionType.WRITE)
96+
.build()))
97+
.addStrategy(new OperatorLoadStrategy("def run(request){return [$bind.getOperatorById(2)]}"))
98+
.build()
99+
)
100+
.build();
101+
102+
ApprovalNode bossNode = ApprovalNode.builder()
103+
.name("老板审批")
104+
.strategies(NodeStrategyBuilder.builder()
105+
.addStrategy(new FormFieldPermissionStrategy(FormFieldPermissionsBuilder.builder()
106+
.addPermission("leave", "name", PermissionType.WRITE)
107+
.addPermission("leave", "days", PermissionType.WRITE)
108+
.addPermission("leave", "reason", PermissionType.WRITE)
109+
.build()))
110+
.addStrategy(new OperatorLoadStrategy("def run(request){return [$bind.getOperatorById(3)]}"))
111+
.build()
112+
)
113+
.build();
114+
115+
EndNode endNode = EndNode.builder().build();
116+
Workflow workflow = WorkflowBuilder.builder()
117+
.title("请假流程")
118+
.code("leave")
119+
.createdOperator(user)
120+
.form(form)
121+
.addNode(startNode)
122+
.addNode(departNode)
123+
.addNode(bossNode)
124+
.addNode(endNode)
125+
.build();
126+
127+
workflowRepository.save(workflow);
128+
129+
Map<String, Object> data = new HashMap<>(Map.of("name", "lorne", "days", 1, "reason", "leave"));
130+
131+
List<IFlowAction> startActions = startNode.actionManager().getActions();
132+
FlowCreateRequest userCreateRequest = new FlowCreateRequest();
133+
userCreateRequest.setWorkId(workflow.getId());
134+
userCreateRequest.setFormData(data);
135+
userCreateRequest.setActionId(startActions.get(0).id());
136+
userCreateRequest.setOperatorId(user.getUserId());
137+
flowService.create(userCreateRequest);
138+
139+
List<FlowRecord> userRecordList = flowRecordRepository.findTodoByOperator(user.getUserId());
140+
assertEquals(1, userRecordList.size());
141+
142+
FlowActionRequest userRequest = new FlowActionRequest();
143+
userRequest.setFormData(data);
144+
userRequest.setRecordId(userRecordList.get(0).getId());
145+
userRequest.setAdvice(new FlowAdviceBody(startActions.get(0).id(), "同意", user.getUserId()));
146+
flowService.action(userRequest);
147+
148+
List<FlowRecord> departRecordList = flowRecordRepository.findTodoByOperator(depart.getUserId());
149+
assertEquals(1, departRecordList.size());
150+
151+
152+
List<IFlowAction> departActions = departNode.actionManager().getActions();
153+
154+
FlowActionRequest addAuditRequest = new FlowActionRequest();
155+
addAuditRequest.setFormData(data);
156+
addAuditRequest.setRecordId(departRecordList.get(0).getId());
157+
158+
FlowAdviceBody addAuditAdviceBody = new FlowAdviceBody(departActions.get(3).id(), depart.getUserId());
159+
addAuditAdviceBody.setForwardOperatorIds(List.of(depart.getUserId()));
160+
addAuditRequest.setAdvice(addAuditAdviceBody);
161+
flowService.action(addAuditRequest);
162+
163+
departRecordList = flowRecordRepository.findTodoByOperator(depart.getUserId());
164+
assertEquals(1, departRecordList.size());
165+
166+
FlowActionRequest departRequest = new FlowActionRequest();
167+
departRequest.setFormData(data);
168+
departRequest.setRecordId(departRecordList.get(0).getId());
169+
departRequest.setAdvice(new FlowAdviceBody(departActions.get(0).id(), "同意", depart.getUserId()));
170+
flowService.action(departRequest);
171+
172+
departRecordList = flowRecordRepository.findTodoByOperator(depart.getUserId());
173+
assertEquals(1, departRecordList.size());
174+
175+
departRequest = new FlowActionRequest();
176+
departRequest.setFormData(data);
177+
departRequest.setRecordId(departRecordList.get(0).getId());
178+
departRequest.setAdvice(new FlowAdviceBody(departActions.get(0).id(), "同意", depart.getUserId()));
179+
flowService.action(departRequest);
180+
181+
List<FlowRecord> bossRecordList = flowRecordRepository.findTodoByOperator(boss.getUserId());
182+
assertEquals(1, bossRecordList.size());
183+
184+
List<IFlowAction> bossActions = bossNode.actionManager().getActions();
185+
186+
FlowActionRequest bossRequest = new FlowActionRequest();
187+
bossRequest.setFormData(data);
188+
bossRequest.setRecordId(bossRecordList.get(0).getId());
189+
bossRequest.setAdvice(new FlowAdviceBody(bossActions.get(0).id(), "同意", boss.getUserId()));
190+
flowService.action(bossRequest);
191+
192+
List<FlowRecord> records = flowRecordRepository.findProcessRecords(bossRecordList.get(0).getProcessId());
193+
assertEquals(4, records.size());
194+
assertEquals(4, records.stream().filter(FlowRecord::isFinish).toList().size());
195+
196+
}
197+
}

0 commit comments

Comments
 (0)