Skip to content

Commit b7474c9

Browse files
committed
fix #117
1 parent 59ed450 commit b7474c9

File tree

14 files changed

+306
-12
lines changed

14 files changed

+306
-12
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
<groupId>com.codingapi.springboot</groupId>
1717
<artifactId>springboot-parent</artifactId>
18-
<version>2.10.5</version>
18+
<version>2.10.6</version>
1919

2020
<url>https://github.com/codingapi/springboot-framewrok</url>
2121
<name>springboot-parent</name>

springboot-starter-data-authorization/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>2.10.5</version>
9+
<version>2.10.6</version>
1010
</parent>
1111

1212
<artifactId>springboot-starter-data-authorization</artifactId>

springboot-starter-data-fast/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-parent</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>2.10.5</version>
8+
<version>2.10.6</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

springboot-starter-flow/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>2.10.5</version>
9+
<version>2.10.6</version>
1010
</parent>
1111

1212
<name>springboot-starter-flow</name>

springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/domain/FlowRelation.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
@AllArgsConstructor
1818
public class FlowRelation {
1919

20+
21+
public static final int DEFAULT_ORDER = -100;
22+
2023
/**
2124
* 关系id
2225
*/

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

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.codingapi.springboot.flow.record.FlowRecord;
1414
import com.codingapi.springboot.flow.repository.FlowOperatorRepository;
1515
import com.codingapi.springboot.flow.repository.FlowRecordRepository;
16+
import com.codingapi.springboot.flow.trigger.OutTrigger;
1617
import com.codingapi.springboot.flow.user.IFlowOperator;
1718
import com.codingapi.springboot.framework.event.EventPusher;
1819
import lombok.Getter;
@@ -115,7 +116,7 @@ public void loadDefaultBackNode(FlowRecord currentRecord) {
115116
throw new IllegalArgumentException("back node not found");
116117
}
117118
FlowRecord record = historyRecords.get(index);
118-
if (record.isDone()) {
119+
if (record.isDone() && record.getId()== currentRecord.getPreId()) {
119120
// 是连续的回退节点时,则根据流程记录的状态来判断
120121
if(record.isReject()){
121122
boolean startRemove = false;
@@ -174,7 +175,28 @@ public void loadCustomBackNode(FlowNode flowNode, long parentRecordId) {
174175
* @return 下一个节点
175176
*/
176177
private FlowNode matcherNextNode(FlowNode flowNode, boolean back) {
177-
List<FlowRelation> relations = flowWork.getRelations().stream()
178+
List<FlowRelation> currentRelations = new ArrayList<>(flowWork.getRelations());
179+
if(back){
180+
String preCode = FlowNode.CODE_START;
181+
if(flowRecord.getPreId()!=0){
182+
FlowRecord preRecord = flowRecordRepository.getFlowRecordById(flowRecord.getPreId());
183+
if(preRecord!=null){
184+
preCode = preRecord.getNodeCode();
185+
while (preCode.equals(flowRecord.getNodeCode())){
186+
preRecord = flowRecordRepository.getFlowRecordById(preRecord.getPreId());
187+
if(preRecord==null){
188+
break;
189+
}
190+
preCode = preRecord.getNodeCode();
191+
}
192+
}
193+
}
194+
FlowRelation backRelation = new FlowRelation("defaultId",
195+
"默认回退关系", flowNode, flowWork.getNodeByCode(preCode), OutTrigger.defaultOutTrigger(), FlowRelation.DEFAULT_ORDER, true);
196+
currentRelations.add(backRelation);
197+
}
198+
199+
List<FlowRelation> relations = currentRelations.stream()
178200
.filter(relation -> relation.sourceMatcher(flowNode.getCode()))
179201
.filter(relation -> relation.isBack() == back)
180202
.sorted((o1, o2) -> (o2.getOrder() - o1.getOrder()))
@@ -315,7 +337,7 @@ private List<FlowRecord> errMatcher(FlowNode currentNode, IFlowOperator currentO
315337
List<Long> operatorIds = ((OperatorResult) errorResult).getOperatorIds();
316338
List<? extends IFlowOperator> operators = flowOperatorRepository.findByIds(operatorIds);
317339
for (IFlowOperator operator : operators) {
318-
FlowSession content = new FlowSession(flowRecord, flowWork, currentNode, createOperator, operator, snapshot.toBindData(), opinion, historyRecords);
340+
FlowSession content = new FlowSession(flowRecord, flowWork, currentNode, createOperator, nextOperator, snapshot.toBindData(), opinion, historyRecords);
319341
String recordTitle = currentNode.generateTitle(content);
320342
FlowRecord record = currentNode.createRecord(flowWork.getId(), flowWork.getCode(), processId, preId, recordTitle, createOperator, operator, snapshot, opinion.isWaiting());
321343
recordList.add(record);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ private FlowResult submitCurrentFlow() {
282282
if (flowNode.isUnSign()) {
283283
for (FlowRecord record : historyRecords) {
284284
if (record.isTodo() && record.getId() != flowRecord.getId()) {
285-
record.autoPass(currentOperator, snapshot);
285+
record.autoPass(record.getCurrentOperator(), snapshot);
286286
FlowRecordRepository flowRecordRepository = flowServiceRepositoryHolder.getFlowRecordRepository();
287287
flowRecordRepository.update(record);
288288
}

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

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,4 +209,84 @@ void errorMatcherNodeTest(){
209209
List<BindDataSnapshot> snapshots = flowBindDataRepository.findAll();
210210
assertEquals(3, snapshots.size());
211211
}
212+
213+
214+
/**
215+
* 相同人审批通过,指定人员审批时遇到异常,走异常节点配置
216+
*/
217+
@Test
218+
void sameUserFlow() {
219+
PageRequest pageRequest = PageRequest.of(0, 1000);
220+
221+
User user = new User("张飞");
222+
userRepository.save(user);
223+
224+
User dept = new User("刘备");
225+
userRepository.save(dept);
226+
227+
User boss = new User("诸葛亮");
228+
userRepository.save(boss);
229+
230+
FlowWork flowWork = FlowWorkBuilder.builder(user)
231+
.title("请假流程")
232+
.skipIfSameApprover(true)
233+
.nodes()
234+
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
235+
.node("部门领导审批", "dept", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(user.getUserId()))
236+
.node("总经理审批", "manager", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(dept.getUserId()), new ErrTrigger("" +
237+
"def run(content){" +
238+
" return content.createOperatorErrTrigger(" + dept.getUserId() + ")" +
239+
"}"+
240+
""),true, false)
241+
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
242+
.relations()
243+
.relation("部门领导审批", "start", "dept")
244+
.relation("总经理审批", "dept", "manager")
245+
.relation("结束节点", "manager", "over")
246+
.build();
247+
248+
flowWorkRepository.save(flowWork);
249+
250+
String workCode = flowWork.getCode();
251+
252+
Leave leave = new Leave("我要出去看看");
253+
leaveRepository.save(leave);
254+
255+
// 创建流程
256+
flowService.startFlow(workCode, user, leave, "发起流程");
257+
258+
// 查看我的待办
259+
List<FlowRecord> userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
260+
assertEquals(1, userTodos.size());
261+
262+
// 提交流程
263+
FlowRecord userTodo = userTodos.get(0);
264+
assertEquals(0, userTodo.getTimeoutTime());
265+
266+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意").specify(user.getUserId()));
267+
268+
// 查看刘备经理的待办
269+
List<FlowRecord> deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
270+
assertEquals(1, deptTodos.size());
271+
272+
// 提交委托dept部门经理的审批
273+
FlowRecord deptTodo = deptTodos.get(0);
274+
flowService.submitFlow(deptTodo.getId(), dept, leave, Opinion.pass("同意"));
275+
276+
// 查看所有流程
277+
List<FlowRecord> records = flowRecordRepository.findAll(pageRequest).getContent();
278+
assertEquals(3, records.size());
279+
280+
userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
281+
assertEquals(0, userTodos.size());
282+
283+
records = flowRecordRepository.findAll(pageRequest).getContent();
284+
assertEquals(3, records.size());
285+
// 查看所有流程是否都已经结束
286+
assertTrue(records.stream().allMatch(FlowRecord::isFinish));
287+
288+
List<BindDataSnapshot> snapshots = flowBindDataRepository.findAll();
289+
assertEquals(4, snapshots.size());
290+
291+
}
212292
}

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

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.codingapi.springboot.flow.record.FlowRecord;
1414
import com.codingapi.springboot.flow.repository.*;
1515
import com.codingapi.springboot.flow.service.FlowService;
16+
import com.codingapi.springboot.flow.trigger.OutTrigger;
1617
import com.codingapi.springboot.flow.user.IFlowOperator;
1718
import com.codingapi.springboot.flow.user.User;
1819
import org.junit.jupiter.api.Test;
@@ -1106,4 +1107,160 @@ void recallTest2() {
11061107

11071108

11081109
}
1110+
1111+
/**
1112+
* 非会签审批意见测试
1113+
*/
1114+
@Test
1115+
void noSignContentTest() {
1116+
PageRequest pageRequest = PageRequest.of(0, 1000);
1117+
1118+
User user = new User("张飞");
1119+
userRepository.save(user);
1120+
1121+
User dept1 = new User("诸葛亮");
1122+
userRepository.save(dept1);
1123+
1124+
User dept2 = new User("黄忠");
1125+
userRepository.save(dept2);
1126+
1127+
User boss = new User("刘备");
1128+
userRepository.save(boss);
1129+
1130+
FlowWork flowWork = FlowWorkBuilder.builder(user)
1131+
.title("请假流程")
1132+
.nodes()
1133+
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
1134+
.node("部门领导审批", "dept", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(dept1.getUserId(), dept2.getUserId()))
1135+
.node("总经理审批", "manager", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
1136+
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
1137+
.relations()
1138+
.relation("部门领导审批", "start", "dept")
1139+
.relation("总经理审批", "dept", "manager")
1140+
.relation("结束节点", "manager", "over")
1141+
.build();
1142+
1143+
flowWorkRepository.save(flowWork);
1144+
1145+
String workCode = flowWork.getCode();
1146+
1147+
Leave leave = new Leave("我要出去看看");
1148+
leaveRepository.save(leave);
1149+
1150+
// 创建流程
1151+
flowService.startFlow(workCode, user, leave, "发起流程");
1152+
1153+
// 查看我的待办
1154+
List<FlowRecord> userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
1155+
assertEquals(1, userTodos.size());
1156+
1157+
// 提交到部门经理
1158+
FlowRecord userTodo = userTodos.get(0);
1159+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意"));
1160+
1161+
List<FlowRecord> dept1Todos = flowRecordRepository.findTodoByOperatorId(dept1.getUserId(), pageRequest).getContent();
1162+
List<FlowRecord> dept2Todos = flowRecordRepository.findTodoByOperatorId(dept2.getUserId(), pageRequest).getContent();
1163+
assertEquals(1, dept1Todos.size());
1164+
assertEquals(1, dept2Todos.size());
1165+
1166+
FlowRecord dept1Todo = dept1Todos.get(0);
1167+
flowService.submitFlow(dept1Todo.getId(), dept1, leave, Opinion.pass("同意"));
1168+
1169+
List<FlowRecord> bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
1170+
assertEquals(1, bossTodos.size());
1171+
1172+
List<FlowRecord> records = flowRecordRepository.findAll(pageRequest).getContent();
1173+
assertEquals(4, records.size());
1174+
1175+
FlowDetail detail = flowService.detail(bossTodos.get(0).getId());
1176+
System.out.println(detail);
1177+
1178+
}
1179+
1180+
1181+
/**
1182+
* 退回与自定义退回逻辑
1183+
*/
1184+
@Test
1185+
void rejectDefaultTest() {
1186+
PageRequest pageRequest = PageRequest.of(0, 1000);
1187+
1188+
User user = new User("张飞");
1189+
userRepository.save(user);
1190+
1191+
User dept = new User("诸葛亮");
1192+
userRepository.save(dept);
1193+
1194+
User boss = new User("刘备");
1195+
userRepository.save(boss);
1196+
1197+
FlowWork flowWork = FlowWorkBuilder.builder(user)
1198+
.title("请假流程")
1199+
.nodes()
1200+
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
1201+
.node("部门经理审批", "dept", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(dept.getUserId()))
1202+
.node("总经理审批", "boss", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
1203+
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
1204+
.relations()
1205+
.relation("开始节点->部门经理", "start", "dept")
1206+
.relation("部门经理->总经理", "dept", "boss")
1207+
.relation("总经理退回发起人", "boss", "start", new OutTrigger(
1208+
"def run(content) { \n"+
1209+
" def days = content.getBindData().getDays(); \n"+
1210+
" if (days > 10) { \n" +
1211+
" return true; \n"+
1212+
" } \n"+
1213+
" return false; \n"+
1214+
"}"
1215+
),1,true)
1216+
.relation("结束节点", "boss", "over")
1217+
.build();
1218+
1219+
flowWorkRepository.save(flowWork);
1220+
1221+
String workCode = flowWork.getCode();
1222+
1223+
Leave leave = new Leave("我要出去看看");
1224+
leaveRepository.save(leave);
1225+
1226+
// 创建流程
1227+
flowService.startFlow(workCode, user, leave, "发起流程");
1228+
1229+
// 查看我的待办
1230+
List<FlowRecord> userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
1231+
assertEquals(1, userTodos.size());
1232+
1233+
1234+
FlowRecord userTodo = userTodos.get(0);
1235+
flowService.submitFlow(userTodo.getId(), user, leave, Opinion.pass("同意"));
1236+
1237+
List<FlowRecord> deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
1238+
assertEquals(1, deptTodos.size());
1239+
1240+
FlowRecord deptTodo = deptTodos.get(0);
1241+
flowService.submitFlow(deptTodo.getId(), dept, leave, Opinion.pass("同意"));
1242+
1243+
List<FlowRecord> bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
1244+
assertEquals(1, bossTodos.size());
1245+
1246+
FlowRecord bossTodo = bossTodos.get(0);
1247+
flowService.submitFlow(bossTodo.getId(), boss, leave, Opinion.reject("不同意"));
1248+
1249+
deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
1250+
assertEquals(1, deptTodos.size());
1251+
1252+
deptTodo = deptTodos.get(0);
1253+
flowService.submitFlow(deptTodo.getId(), dept, leave, Opinion.pass("同意"));
1254+
1255+
bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
1256+
assertEquals(1, bossTodos.size());
1257+
1258+
bossTodo = bossTodos.get(0);
1259+
flowService.submitFlow(bossTodo.getId(), boss, leave, Opinion.pass("同意"));
1260+
1261+
List<FlowRecord> records = flowRecordRepository.findAll(pageRequest).getContent();
1262+
assertEquals(5, records.size());
1263+
assertTrue(records.stream().allMatch(FlowRecord::isFinish));
1264+
1265+
}
11091266
}

springboot-starter-security/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>2.10.5</version>
9+
<version>2.10.6</version>
1010
</parent>
1111

1212
<artifactId>springboot-starter-security</artifactId>

springboot-starter/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>com.codingapi.springboot</groupId>
77
<artifactId>springboot-parent</artifactId>
8-
<version>2.10.5</version>
8+
<version>2.10.6</version>
99
</parent>
1010
<artifactId>springboot-starter</artifactId>
1111

springboot-starter/src/main/java/com/codingapi/springboot/framework/event/SpringEventHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public SpringEventHandler(List<IHandler> handlers) {
2626
}
2727

2828
@Override
29-
public void onApplicationEvent(DomainEvent domainEvent) {
29+
public synchronized void onApplicationEvent(DomainEvent domainEvent) {
3030
String traceId = domainEvent.getTraceId();
3131

3232
if (domainEvent.isSync()) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
------------------------------------------------------
2-
CodingApi SpringBoot-Starter 2.10.5
2+
CodingApi SpringBoot-Starter 2.10.6
33
springboot version (${spring-boot.version})
44
------------------------------------------------------

0 commit comments

Comments
 (0)