buttons) {
+ return node(RandomGenerator.generateUUID(), name, code, view, approvalType, operatorMatcher, 0, TitleGenerator.defaultTitleGenerator(), errTrigger, editable,mergeable, buttons);
}
- public Nodes node(String name, String code, String view, ApprovalType approvalType, OperatorMatcher operatorMatcher, ErrTrigger errTrigger, boolean editable) {
- return node(RandomGenerator.generateUUID(), name, code, view, approvalType, operatorMatcher, 0, TitleGenerator.defaultTitleGenerator(), errTrigger, editable, null);
+ public Nodes node(String name, String code, String view, ApprovalType approvalType, OperatorMatcher operatorMatcher, ErrTrigger errTrigger, boolean editable,boolean mergeable) {
+ return node(RandomGenerator.generateUUID(), name, code, view, approvalType, operatorMatcher, 0, TitleGenerator.defaultTitleGenerator(), errTrigger, editable,mergeable, null);
}
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/build/SchemaReader.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/build/SchemaReader.java
index f169b75e..09217db6 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/build/SchemaReader.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/build/SchemaReader.java
@@ -48,6 +48,7 @@ private void loadNodes() {
String titleGenerator = properties.getString("titleGenerator");
String name = properties.getString("name");
boolean editable = properties.getBoolean("editable");
+ boolean mergeable = properties.getBoolean("mergeable");
String view = properties.getString("view");
String type = properties.getString("type");
String approvalType = properties.getString("approvalType");
@@ -59,7 +60,7 @@ private void loadNodes() {
buttons = properties.getJSONArray("buttons").toJavaList(FlowButton.class);
}
FlowNode flowNode = new FlowNode(id, name, code, view, NodeType.parser(type), ApprovalType.parser(approvalType), new TitleGenerator(titleGenerator),
- new OperatorMatcher(operatorMatcher), timeout, StringUtils.hasLength(errTrigger) ? new ErrTrigger(errTrigger) : null, editable, buttons);
+ new OperatorMatcher(operatorMatcher), timeout, StringUtils.hasLength(errTrigger) ? new ErrTrigger(errTrigger) : null, editable,mergeable, buttons);
flowNodes.add(flowNode);
}
}
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/domain/FlowNode.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/domain/FlowNode.java
index 1e9985fb..fcad0edd 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/domain/FlowNode.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/domain/FlowNode.java
@@ -78,6 +78,14 @@ public class FlowNode {
*/
private boolean editable;
+ /**
+ * 是否合并记录
+ *
+ * 如果为true,则表示该节点可以合并记录
+ */
+ private boolean mergeable;
+
+
/**
* 创建时间
*/
@@ -148,6 +156,7 @@ public FlowNodeSerializable toSerializable() {
this.approvalType,
this.operatorMatcher.getScript(),
this.editable,
+ this.mergeable,
this.createTime,
this.updateTime,
this.timeout,
@@ -168,6 +177,7 @@ public FlowNode(String id,
long timeout,
ErrTrigger errTrigger,
boolean editable,
+ boolean mergeable,
List buttons) {
this.id = id;
this.code = code;
@@ -182,6 +192,7 @@ public FlowNode(String id,
this.errTrigger = errTrigger;
this.timeout = timeout;
this.editable = editable;
+ this.mergeable = mergeable;
this.buttons = buttons;
}
@@ -229,6 +240,7 @@ public FlowRecord createRecord(long workId,
FlowRecord record = new FlowRecord();
record.setProcessId(processId);
record.setNodeCode(this.code);
+ record.setMergeable(this.mergeable);
record.setCreateTime(System.currentTimeMillis());
record.setWorkId(workId);
record.setWorkCode(workCode);
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/pojo/FlowDetail.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/pojo/FlowDetail.java
index 1b73841f..5dc44e71 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/pojo/FlowDetail.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/pojo/FlowDetail.java
@@ -5,6 +5,7 @@
import com.codingapi.springboot.flow.domain.FlowNode;
import com.codingapi.springboot.flow.domain.FlowWork;
import com.codingapi.springboot.flow.domain.Opinion;
+import com.codingapi.springboot.flow.record.FlowMerge;
import com.codingapi.springboot.flow.record.FlowRecord;
import com.codingapi.springboot.flow.user.IFlowOperator;
import lombok.Getter;
@@ -64,8 +65,14 @@ public class FlowDetail {
*/
private final boolean canHandle;
+ /**
+ * 合并记录
+ */
+ private final List mergeRecords;
+
public FlowDetail(FlowRecord flowRecord,
+ List mergeRecords,
BindDataSnapshot snapshot,
FlowWork flowWork,
List historyRecords,
@@ -73,6 +80,7 @@ public FlowDetail(FlowRecord flowRecord,
boolean canHandle) {
this.operators = operators;
this.flowRecord = flowRecord;
+ this.mergeRecords = mergeRecords;
this.flowWork = flowWork;
this.bindData = snapshot.toBindData();
this.historyRecords = historyRecords;
@@ -92,6 +100,7 @@ public FlowDetail(FlowWork flowWork,
this.operators = operators;
this.flowCreateTime = 0;
this.flowRecord = null;
+ this.mergeRecords = null;
this.historyRecords = null;
this.bindData = null;
this.opinions = null;
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/record/FlowMerge.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/record/FlowMerge.java
new file mode 100644
index 00000000..5ef07031
--- /dev/null
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/record/FlowMerge.java
@@ -0,0 +1,14 @@
+package com.codingapi.springboot.flow.record;
+
+import com.codingapi.springboot.flow.bind.IBindData;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class FlowMerge {
+
+ private final FlowRecord flowRecord;
+ private final IBindData bindData;
+
+}
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/record/FlowRecord.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/record/FlowRecord.java
index fbd303e8..ecd28cb9 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/record/FlowRecord.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/record/FlowRecord.java
@@ -49,6 +49,12 @@ public class FlowRecord {
*/
private String nodeCode;
+
+ /**
+ * 是否可合并
+ */
+ private boolean mergeable;
+
/**
* 流程标题
*/
@@ -402,6 +408,7 @@ public FlowRecord copy() {
record.setWorkCode(this.workCode);
record.setProcessId(this.processId);
record.setNodeCode(this.nodeCode);
+ record.setMergeable(this.mergeable);
record.setTitle(this.title);
record.setCurrentOperator(this.currentOperator);
record.setFlowType(this.flowType);
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/repository/FlowRecordRepository.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/repository/FlowRecordRepository.java
index 292d40e5..8987ec6c 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/repository/FlowRecordRepository.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/repository/FlowRecordRepository.java
@@ -48,6 +48,15 @@ public interface FlowRecordRepository {
*/
List findFlowRecordByProcessId(String processId);
+ /**
+ * 获取合并的流程记录
+ * @param workCode 流程编码
+ * @param nodeCode 节点编码
+ * @param currentOperatorId 当前操作者ID
+ * @return List of FlowRecord
+ */
+ List findMergeFlowRecordById(String workCode,String nodeCode,long currentOperatorId);
+
/**
* 查询所有未完成的流程记录
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/serializable/FlowNodeSerializable.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/serializable/FlowNodeSerializable.java
index d6e80dea..b517104c 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/serializable/FlowNodeSerializable.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/serializable/FlowNodeSerializable.java
@@ -69,6 +69,11 @@ public class FlowNodeSerializable implements Serializable {
*/
private boolean editable;
+ /**
+ * 是否可合并审批
+ */
+ private boolean mergeable;
+
/**
* 创建时间
*/
@@ -95,6 +100,6 @@ public class FlowNodeSerializable implements Serializable {
public FlowNode toFlowNode() {
return new FlowNode(id, code, name, new TitleGenerator(titleGenerator), type, view, approvalType,
- new OperatorMatcher(operatorMatcher), editable, createTime, updateTime, timeout, errTrigger == null ? null : new ErrTrigger(errTrigger),buttons);
+ new OperatorMatcher(operatorMatcher), editable, mergeable, createTime, updateTime, timeout, errTrigger == null ? null : new ErrTrigger(errTrigger), buttons);
}
}
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowDetailService.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowDetailService.java
index e684f422..718784d8 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowDetailService.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowDetailService.java
@@ -5,6 +5,7 @@
import com.codingapi.springboot.flow.domain.FlowNode;
import com.codingapi.springboot.flow.domain.FlowWork;
import com.codingapi.springboot.flow.pojo.FlowDetail;
+import com.codingapi.springboot.flow.record.FlowMerge;
import com.codingapi.springboot.flow.record.FlowRecord;
import com.codingapi.springboot.flow.repository.*;
import com.codingapi.springboot.flow.service.FlowRecordVerifyService;
@@ -46,6 +47,16 @@ public FlowDetail detail(long recordId, IFlowOperator currentOperator) {
FlowRecord flowRecord = flowRecordVerifyService.getFlowRecord();
FlowWork flowWork = flowRecordVerifyService.getFlowWork();
+ List mergeRecords = null;
+ if(flowRecord.isTodo() && flowRecord.isMergeable()){
+ List flowRecords = flowRecordRepository.findMergeFlowRecordById(flowRecord.getWorkCode(),flowRecord.getNodeCode(),currentOperator.getUserId());
+ if(!flowRecords.isEmpty()){
+ mergeRecords = flowRecords.stream().map(record->{
+ BindDataSnapshot bindDataSnapshot = flowBindDataRepository.getBindDataSnapshotById(record.getSnapshotId());
+ return new FlowMerge(record,bindDataSnapshot.toBindData());
+ }).collect(Collectors.toList());
+ }
+ }
BindDataSnapshot snapshot = flowBindDataRepository.getBindDataSnapshotById(flowRecord.getSnapshotId());
List flowRecords =
@@ -64,7 +75,7 @@ public FlowDetail detail(long recordId, IFlowOperator currentOperator) {
}
}
- return new FlowDetail(flowRecord, snapshot, flowWork, flowRecords, operators, currentOperator != null && flowRecord.isTodo() && flowRecord.isOperator(currentOperator));
+ return new FlowDetail(flowRecord,mergeRecords, snapshot, flowWork, flowRecords, operators, currentOperator != null && flowRecord.isTodo() && flowRecord.isOperator(currentOperator));
}
diff --git a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/repository/FlowRecordRepositoryImpl.java b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/repository/FlowRecordRepositoryImpl.java
index 59f60d7b..603d5e42 100644
--- a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/repository/FlowRecordRepositoryImpl.java
+++ b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/repository/FlowRecordRepositoryImpl.java
@@ -43,6 +43,17 @@ public List findFlowRecordByPreId(long preId) {
return cache.stream().filter(record -> record.getPreId() == preId).collect(Collectors.toList());
}
+ @Override
+ public List findMergeFlowRecordById(String workCode, String nodeCode, long operatorId) {
+ return cache.stream()
+ .filter(record -> record.isTodo() && record.getCurrentOperator().getUserId() == operatorId
+ && record.getWorkCode().equals(workCode)
+ && record.getNodeCode().equals(nodeCode)
+ && record.isMergeable()
+ )
+ .collect(Collectors.toList());
+ }
+
@Override
public List findFlowRecordByProcessId(String processId) {
return cache.stream().filter(record -> record.getProcessId().equals(processId))
diff --git a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/ErrorTest.java b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/ErrorTest.java
index 97010832..d04a3124 100644
--- a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/ErrorTest.java
+++ b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/ErrorTest.java
@@ -53,7 +53,7 @@ void errorMatcherOperatorTest(){
.title("请假流程")
.nodes()
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
- .node("部门领导审批", "dept", "default", ApprovalType.UN_SIGN, new OperatorMatcher("def run(content){return []}"), new ErrTrigger("def run(content){return content.createOperatorErrTrigger("+dept.getId()+")}"), true)
+ .node("部门领导审批", "dept", "default", ApprovalType.UN_SIGN, new OperatorMatcher("def run(content){return []}"), new ErrTrigger("def run(content){return content.createOperatorErrTrigger("+dept.getId()+")}"), true,false)
.node("总经理审批", "manager", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
.relations()
@@ -145,7 +145,7 @@ void errorMatcherNodeTest(){
.title("请假流程")
.nodes()
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
- .node("部门领导审批", "dept", "default", ApprovalType.UN_SIGN, new OperatorMatcher("def run(content){return []}"), new ErrTrigger("def run(content){return content.createNodeErrTrigger('manager')}"), true)
+ .node("部门领导审批", "dept", "default", ApprovalType.UN_SIGN, new OperatorMatcher("def run(content){return []}"), new ErrTrigger("def run(content){return content.createNodeErrTrigger('manager')}"), true,false)
.node("总经理审批", "manager", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
.relations()
diff --git a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/FlowTest.java b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/FlowTest.java
index 63502c97..bf6024b9 100644
--- a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/FlowTest.java
+++ b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/FlowTest.java
@@ -388,7 +388,7 @@ void saveDisableTest() {
.title("请假流程")
.nodes()
.node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
- .node("部门领导审批", "dept", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(dept.getUserId()), false)
+ .node("部门领导审批", "dept", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(dept.getUserId()), false,false)
.node("总经理审批", "manager", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
.node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
.relations()
diff --git a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/ScriptBuildTest.java b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/ScriptBuildTest.java
index e41a359a..a319393a 100644
--- a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/ScriptBuildTest.java
+++ b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/ScriptBuildTest.java
@@ -15,7 +15,7 @@ public class ScriptBuildTest {
@Test
void copy() {
User user = new User("张三");
- String script = "{\"nodes\":[{\"id\":\"b82a84e7-2c1d-4e15-a3c5-6f7f6e263acd\",\"type\":\"start-node\",\"x\":593,\"y\":96,\"properties\":{\"name\":\"开始节点\",\"code\":\"start\",\"type\":\"START\",\"view\":\"default\",\"operatorMatcher\":\"def run(content) {return [content.getCurrentOperator().getUserId()];}\",\"editable\":true,\"titleGenerator\":\"def run(content){ return content.getCurrentOperator().getName() + '-' + content.getFlowWork().getTitle() + '-' + content.getFlowNode().getName();}\",\"errTrigger\":\"\",\"approvalType\":\"UN_SIGN\",\"timeout\":0,\"id\":\"b82a84e7-2c1d-4e15-a3c5-6f7f6e263acd\",\"width\":200,\"height\":45,\"operatorMatcherType\":\"any\",\"titleGeneratorType\":\"default\",\"errTriggerType\":\"custom\"}},{\"id\":\"3c2c420a-003b-4f51-9489-3cdcda0bbe35\",\"type\":\"node-node\",\"x\":620,\"y\":239,\"properties\":{\"name\":\"流程节点\",\"code\":\"flow\",\"type\":\"APPROVAL\",\"view\":\"default\",\"operatorMatcher\":\"def run(content) {return [content.getCurrentOperator().getUserId()];}\",\"editable\":true,\"titleGenerator\":\"def run(content){ return content.getCurrentOperator().getName() + '8899-' + content.getFlowWork().getTitle() + '-' + content.getFlowNode().getName();}\",\"errTrigger\":\"\",\"approvalType\":\"SIGN\",\"timeout\":10,\"id\":\"3c2c420a-003b-4f51-9489-3cdcda0bbe35\",\"width\":200,\"height\":45,\"operatorMatcherType\":\"any\",\"titleGeneratorType\":\"custom\",\"errTriggerType\":\"custom\"}},{\"id\":\"b527b4a5-f11f-4052-9848-2c0426da970c\",\"type\":\"over-node\",\"x\":828,\"y\":582,\"properties\":{\"name\":\"结束节点\",\"code\":\"over\",\"type\":\"OVER\",\"view\":\"default\",\"operatorMatcher\":\"def run(content) {return [content.getCurrentOperator().getUserId()];}\",\"editable\":true,\"titleGenerator\":\"def run(content){ return content.getCurrentOperator().getName() + '-' + content.getFlowWork().getTitle() + '-' + content.getFlowNode().getName();}\",\"errTrigger\":\"\",\"approvalType\":\"UN_SIGN\",\"timeout\":0,\"id\":\"b527b4a5-f11f-4052-9848-2c0426da970c\",\"width\":200,\"height\":45,\"operatorMatcherType\":\"any\",\"titleGeneratorType\":\"default\",\"errTriggerType\":\"custom\"}},{\"id\":\"2ecdb8aa-00b2-42af-b3ed-c776d2431b38\",\"type\":\"circulate-node\",\"x\":839,\"y\":409,\"properties\":{\"name\":\"抄送节点\",\"code\":\"circulate\",\"type\":\"CIRCULATE\",\"view\":\"default\",\"operatorMatcher\":\"def run(content) {return [content.getCreateOperator().getUserId()];}\",\"editable\":true,\"titleGenerator\":\"def run(content){ return content.getCurrentOperator().getName() + '-' + content.getFlowWork().getTitle() + '-' + content.getFlowNode().getName();}\",\"errTrigger\":\"\",\"approvalType\":\"CIRCULATE\",\"timeout\":0,\"id\":\"2ecdb8aa-00b2-42af-b3ed-c776d2431b38\",\"width\":200,\"height\":45}}],\"edges\":[{\"id\":\"b68837fb-dca8-41d2-908c-dc079a7f61de\",\"type\":\"bezier\",\"properties\":{\"outTrigger\":\"def run(content) {return true;}\",\"order\":1,\"back\":false},\"sourceNodeId\":\"b82a84e7-2c1d-4e15-a3c5-6f7f6e263acd\",\"targetNodeId\":\"3c2c420a-003b-4f51-9489-3cdcda0bbe35\",\"startPoint\":{\"x\":593,\"y\":118.5},\"endPoint\":{\"x\":620,\"y\":216.5},\"pointsList\":[{\"x\":593,\"y\":118.5},{\"x\":593,\"y\":218.5},{\"x\":620,\"y\":116.5},{\"x\":620,\"y\":216.5}]},{\"id\":\"73e04b95-50f6-44cc-a960-d3007d27fd48\",\"type\":\"bezier\",\"properties\":{\"outTrigger\":\"def run(content) {return true;}\",\"order\":2,\"back\":false},\"sourceNodeId\":\"3c2c420a-003b-4f51-9489-3cdcda0bbe35\",\"targetNodeId\":\"2ecdb8aa-00b2-42af-b3ed-c776d2431b38\",\"startPoint\":{\"x\":720,\"y\":239},\"endPoint\":{\"x\":739,\"y\":409},\"pointsList\":[{\"x\":720,\"y\":239},{\"x\":820,\"y\":239},{\"x\":639,\"y\":409},{\"x\":739,\"y\":409}]},{\"id\":\"f6929c79-b168-4c3c-9f8f-9dc21fcaf29d\",\"type\":\"bezier\",\"properties\":{\"outTrigger\":\"def run(content) {return true;}\",\"order\":1,\"back\":false},\"sourceNodeId\":\"2ecdb8aa-00b2-42af-b3ed-c776d2431b38\",\"targetNodeId\":\"b527b4a5-f11f-4052-9848-2c0426da970c\",\"startPoint\":{\"x\":839,\"y\":431.5},\"endPoint\":{\"x\":828,\"y\":559.5},\"pointsList\":[{\"x\":839,\"y\":431.5},{\"x\":839,\"y\":531.5},{\"x\":828,\"y\":459.5},{\"x\":828,\"y\":559.5}]}]}";
+ String script = "{\"nodes\":[{\"id\":\"b82a84e7-2c1d-4e15-a3c5-6f7f6e263acd\",\"type\":\"start-node\",\"x\":593,\"y\":96,\"properties\":{\"name\":\"开始节点\",\"code\":\"start\",\"type\":\"START\",\"view\":\"default\",\"operatorMatcher\":\"def run(content) {return [content.getCurrentOperator().getUserId()];}\",\"editable\":true,\"mergeable\":true,\"titleGenerator\":\"def run(content){ return content.getCurrentOperator().getName() + '-' + content.getFlowWork().getTitle() + '-' + content.getFlowNode().getName();}\",\"errTrigger\":\"\",\"approvalType\":\"UN_SIGN\",\"timeout\":0,\"id\":\"b82a84e7-2c1d-4e15-a3c5-6f7f6e263acd\",\"width\":200,\"height\":45,\"operatorMatcherType\":\"any\",\"titleGeneratorType\":\"default\",\"errTriggerType\":\"custom\"}},{\"id\":\"3c2c420a-003b-4f51-9489-3cdcda0bbe35\",\"type\":\"node-node\",\"x\":620,\"y\":239,\"properties\":{\"name\":\"流程节点\",\"code\":\"flow\",\"type\":\"APPROVAL\",\"view\":\"default\",\"operatorMatcher\":\"def run(content) {return [content.getCurrentOperator().getUserId()];}\",\"editable\":true,\"mergeable\":true,\"titleGenerator\":\"def run(content){ return content.getCurrentOperator().getName() + '8899-' + content.getFlowWork().getTitle() + '-' + content.getFlowNode().getName();}\",\"errTrigger\":\"\",\"approvalType\":\"SIGN\",\"timeout\":10,\"id\":\"3c2c420a-003b-4f51-9489-3cdcda0bbe35\",\"width\":200,\"height\":45,\"operatorMatcherType\":\"any\",\"titleGeneratorType\":\"custom\",\"errTriggerType\":\"custom\"}},{\"id\":\"b527b4a5-f11f-4052-9848-2c0426da970c\",\"type\":\"over-node\",\"x\":828,\"y\":582,\"properties\":{\"name\":\"结束节点\",\"code\":\"over\",\"type\":\"OVER\",\"view\":\"default\",\"operatorMatcher\":\"def run(content) {return [content.getCurrentOperator().getUserId()];}\",\"editable\":true,\"mergeable\":true,\"titleGenerator\":\"def run(content){ return content.getCurrentOperator().getName() + '-' + content.getFlowWork().getTitle() + '-' + content.getFlowNode().getName();}\",\"errTrigger\":\"\",\"approvalType\":\"UN_SIGN\",\"timeout\":0,\"id\":\"b527b4a5-f11f-4052-9848-2c0426da970c\",\"width\":200,\"height\":45,\"operatorMatcherType\":\"any\",\"titleGeneratorType\":\"default\",\"errTriggerType\":\"custom\"}},{\"id\":\"2ecdb8aa-00b2-42af-b3ed-c776d2431b38\",\"type\":\"circulate-node\",\"x\":839,\"y\":409,\"properties\":{\"name\":\"抄送节点\",\"code\":\"circulate\",\"type\":\"CIRCULATE\",\"view\":\"default\",\"operatorMatcher\":\"def run(content) {return [content.getCreateOperator().getUserId()];}\",\"editable\":true,\"mergeable\":true,\"titleGenerator\":\"def run(content){ return content.getCurrentOperator().getName() + '-' + content.getFlowWork().getTitle() + '-' + content.getFlowNode().getName();}\",\"errTrigger\":\"\",\"approvalType\":\"CIRCULATE\",\"timeout\":0,\"id\":\"2ecdb8aa-00b2-42af-b3ed-c776d2431b38\",\"width\":200,\"height\":45}}],\"edges\":[{\"id\":\"b68837fb-dca8-41d2-908c-dc079a7f61de\",\"type\":\"bezier\",\"properties\":{\"outTrigger\":\"def run(content) {return true;}\",\"order\":1,\"back\":false},\"sourceNodeId\":\"b82a84e7-2c1d-4e15-a3c5-6f7f6e263acd\",\"targetNodeId\":\"3c2c420a-003b-4f51-9489-3cdcda0bbe35\",\"startPoint\":{\"x\":593,\"y\":118.5},\"endPoint\":{\"x\":620,\"y\":216.5},\"pointsList\":[{\"x\":593,\"y\":118.5},{\"x\":593,\"y\":218.5},{\"x\":620,\"y\":116.5},{\"x\":620,\"y\":216.5}]},{\"id\":\"73e04b95-50f6-44cc-a960-d3007d27fd48\",\"type\":\"bezier\",\"properties\":{\"outTrigger\":\"def run(content) {return true;}\",\"order\":2,\"back\":false},\"sourceNodeId\":\"3c2c420a-003b-4f51-9489-3cdcda0bbe35\",\"targetNodeId\":\"2ecdb8aa-00b2-42af-b3ed-c776d2431b38\",\"startPoint\":{\"x\":720,\"y\":239},\"endPoint\":{\"x\":739,\"y\":409},\"pointsList\":[{\"x\":720,\"y\":239},{\"x\":820,\"y\":239},{\"x\":639,\"y\":409},{\"x\":739,\"y\":409}]},{\"id\":\"f6929c79-b168-4c3c-9f8f-9dc21fcaf29d\",\"type\":\"bezier\",\"properties\":{\"outTrigger\":\"def run(content) {return true;}\",\"order\":1,\"back\":false},\"sourceNodeId\":\"2ecdb8aa-00b2-42af-b3ed-c776d2431b38\",\"targetNodeId\":\"b527b4a5-f11f-4052-9848-2c0426da970c\",\"startPoint\":{\"x\":839,\"y\":431.5},\"endPoint\":{\"x\":828,\"y\":559.5},\"pointsList\":[{\"x\":839,\"y\":431.5},{\"x\":839,\"y\":531.5},{\"x\":828,\"y\":459.5},{\"x\":828,\"y\":559.5}]}]}";
FlowWork flowWork = FlowWorkBuilder.builder(user)
.title("请假流程")
.schema(script)
diff --git a/springboot-starter-security/pom.xml b/springboot-starter-security/pom.xml
index 4013b4de..053b4815 100644
--- a/springboot-starter-security/pom.xml
+++ b/springboot-starter-security/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.9.36
+ 2.10.0
springboot-starter-security
diff --git a/springboot-starter/pom.xml b/springboot-starter/pom.xml
index 2a1649d7..d4273854 100644
--- a/springboot-starter/pom.xml
+++ b/springboot-starter/pom.xml
@@ -5,7 +5,7 @@
com.codingapi.springboot
springboot-parent
- 2.9.36
+ 2.10.0
springboot-starter
diff --git a/springboot-starter/src/main/resources/META-INF/banner.txt b/springboot-starter/src/main/resources/META-INF/banner.txt
index bcd02680..45a7845b 100644
--- a/springboot-starter/src/main/resources/META-INF/banner.txt
+++ b/springboot-starter/src/main/resources/META-INF/banner.txt
@@ -1,4 +1,4 @@
------------------------------------------------------
-CodingApi SpringBoot-Starter 2.9.36
+CodingApi SpringBoot-Starter 2.10.0
springboot version (${spring-boot.version})
------------------------------------------------------
From ae885ee5a1b355067f56e315479e9857d443ef3a Mon Sep 17 00:00:00 2001
From: lorne <1991wangliang@gmail.com>
Date: Wed, 28 May 2025 20:34:12 +0800
Subject: [PATCH 2/6] fix sql build
---
pom.xml | 2 +-
springboot-starter-data-authorization/pom.xml | 2 +-
springboot-starter-data-fast/pom.xml | 2 +-
.../java/com/codingapi/springboot/fast/jpa/SQLBuilder.java | 4 ++++
springboot-starter-flow/pom.xml | 2 +-
springboot-starter-security/pom.xml | 2 +-
springboot-starter/pom.xml | 2 +-
springboot-starter/src/main/resources/META-INF/banner.txt | 2 +-
8 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/pom.xml b/pom.xml
index 68ce4625..44c7bc45 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
com.codingapi.springboot
springboot-parent
- 2.10.0
+ 2.10.1
https://github.com/codingapi/springboot-framewrok
springboot-parent
diff --git a/springboot-starter-data-authorization/pom.xml b/springboot-starter-data-authorization/pom.xml
index 46d175a3..a8d45635 100644
--- a/springboot-starter-data-authorization/pom.xml
+++ b/springboot-starter-data-authorization/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.0
+ 2.10.1
springboot-starter-data-authorization
diff --git a/springboot-starter-data-fast/pom.xml b/springboot-starter-data-fast/pom.xml
index a8da394d..12aa37bf 100644
--- a/springboot-starter-data-fast/pom.xml
+++ b/springboot-starter-data-fast/pom.xml
@@ -5,7 +5,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.0
+ 2.10.1
4.0.0
diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/SQLBuilder.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/SQLBuilder.java
index 020e2802..8f6bec96 100644
--- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/SQLBuilder.java
+++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/SQLBuilder.java
@@ -23,6 +23,10 @@ public SQLBuilder(Class> clazz, String sql) {
this(clazz, sql, "select count(1) from " + sql);
}
+ public SQLBuilder(String sql,String countSql) {
+ this(null, sql, countSql);
+ }
+
public SQLBuilder(Class> clazz, String sql, String countSQL) {
this.countSQLBuilder = new StringBuilder(countSQL);
this.sqlBuilder = new StringBuilder(sql);
diff --git a/springboot-starter-flow/pom.xml b/springboot-starter-flow/pom.xml
index 03fb08d1..7db238a6 100644
--- a/springboot-starter-flow/pom.xml
+++ b/springboot-starter-flow/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.0
+ 2.10.1
springboot-starter-flow
diff --git a/springboot-starter-security/pom.xml b/springboot-starter-security/pom.xml
index 053b4815..aa859a81 100644
--- a/springboot-starter-security/pom.xml
+++ b/springboot-starter-security/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.0
+ 2.10.1
springboot-starter-security
diff --git a/springboot-starter/pom.xml b/springboot-starter/pom.xml
index d4273854..cb4d311e 100644
--- a/springboot-starter/pom.xml
+++ b/springboot-starter/pom.xml
@@ -5,7 +5,7 @@
com.codingapi.springboot
springboot-parent
- 2.10.0
+ 2.10.1
springboot-starter
diff --git a/springboot-starter/src/main/resources/META-INF/banner.txt b/springboot-starter/src/main/resources/META-INF/banner.txt
index 45a7845b..98ad746a 100644
--- a/springboot-starter/src/main/resources/META-INF/banner.txt
+++ b/springboot-starter/src/main/resources/META-INF/banner.txt
@@ -1,4 +1,4 @@
------------------------------------------------------
-CodingApi SpringBoot-Starter 2.10.0
+CodingApi SpringBoot-Starter 2.10.1
springboot version (${spring-boot.version})
------------------------------------------------------
From d141d18a0d679c8057908dada9e0c4a82c8d9601 Mon Sep 17 00:00:00 2001
From: lorne <1991wangliang@gmail.com>
Date: Tue, 10 Jun 2025 10:41:53 +0800
Subject: [PATCH 3/6] add flow map data & save event state
---
pom.xml | 2 +-
springboot-starter-data-authorization/pom.xml | 2 +-
springboot-starter-data-fast/pom.xml | 2 +-
springboot-starter-flow/pom.xml | 2 +-
.../springboot/flow/bind/FlowMapBindData.java | 48 +++++++
.../springboot/flow/bind/IBindData.java | 20 +++
.../flow/event/FlowApprovalEvent.java | 25 +++-
.../flow/service/impl/FlowSaveService.java | 12 ++
.../flow/service/impl/FlowStartService.java | 1 +
.../codingapi/springboot/flow/flow/Leave.java | 4 +
.../springboot/flow/flow/Leave2.java | 23 ++++
.../flow/repository/LeaveRepository.java | 5 +
.../springboot/flow/test/FlowMapTest.java | 127 ++++++++++++++++++
springboot-starter-security/pom.xml | 2 +-
springboot-starter/pom.xml | 2 +-
.../src/main/resources/META-INF/banner.txt | 2 +-
16 files changed, 270 insertions(+), 9 deletions(-)
create mode 100644 springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/bind/FlowMapBindData.java
create mode 100644 springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/flow/Leave2.java
create mode 100644 springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/FlowMapTest.java
diff --git a/pom.xml b/pom.xml
index 44c7bc45..809919f1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
com.codingapi.springboot
springboot-parent
- 2.10.1
+ 2.10.2
https://github.com/codingapi/springboot-framewrok
springboot-parent
diff --git a/springboot-starter-data-authorization/pom.xml b/springboot-starter-data-authorization/pom.xml
index a8d45635..024f93f3 100644
--- a/springboot-starter-data-authorization/pom.xml
+++ b/springboot-starter-data-authorization/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.1
+ 2.10.2
springboot-starter-data-authorization
diff --git a/springboot-starter-data-fast/pom.xml b/springboot-starter-data-fast/pom.xml
index 12aa37bf..fcfa7b86 100644
--- a/springboot-starter-data-fast/pom.xml
+++ b/springboot-starter-data-fast/pom.xml
@@ -5,7 +5,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.1
+ 2.10.2
4.0.0
diff --git a/springboot-starter-flow/pom.xml b/springboot-starter-flow/pom.xml
index 7db238a6..68d1b1f0 100644
--- a/springboot-starter-flow/pom.xml
+++ b/springboot-starter-flow/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.1
+ 2.10.2
springboot-starter-flow
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/bind/FlowMapBindData.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/bind/FlowMapBindData.java
new file mode 100644
index 00000000..2648956d
--- /dev/null
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/bind/FlowMapBindData.java
@@ -0,0 +1,48 @@
+package com.codingapi.springboot.flow.bind;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.HashMap;
+
+/**
+ * 流程绑定Map数据对象,用于分布式服务下的流程对象数据传递能力
+ * 该对象中,将clazzName 当做了普通的key来使用,
+ */
+public class FlowMapBindData extends HashMap implements IBindData {
+
+
+ /**
+ * 获取类名称
+ *
+ * @return 类名称
+ */
+ @Override
+ public String getClazzName() {
+ return (String) this.get(CLASS_NAME_KEY);
+ }
+
+ /**
+ * 转化为类对象
+ */
+ @Override
+ public T toJavaObject(Class clazz) {
+ return JSONObject.parseObject(toJsonSnapshot(), clazz);
+ }
+
+ public static FlowMapBindData fromJson(String json) {
+ return JSONObject.parseObject(json, FlowMapBindData.class);
+ }
+
+ public static FlowMapBindData fromObject(Object obj) {
+ return JSONObject.parseObject(JSONObject.toJSONString(obj), FlowMapBindData.class);
+ }
+
+ public static FlowMapBindData fromJson(JSONObject json) {
+ return JSONObject.parseObject(json.toJSONString(), FlowMapBindData.class);
+ }
+
+ public boolean match(String matchKey) {
+ String className = this.getClazzName();
+ return matchKey.equals(className);
+ }
+}
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/bind/IBindData.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/bind/IBindData.java
index 4814cdcb..5c152799 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/bind/IBindData.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/bind/IBindData.java
@@ -7,6 +7,8 @@
*/
public interface IBindData {
+ String CLASS_NAME_KEY = "clazzName";
+
/**
* 数据快照
*
@@ -19,9 +21,27 @@ default String toJsonSnapshot() {
/**
* 获取类名称
+ *
* @return 类名称
*/
default String getClazzName() {
return this.getClass().getName();
}
+
+
+ /**
+ * 类对象匹配
+ */
+ default boolean match(String dataKey) {
+ String className = this.getClazzName();
+ return dataKey.equals(className);
+ }
+
+
+ /**
+ * 转化为类对象
+ */
+ default T toJavaObject(Class clazz) {
+ return (T) this;
+ }
}
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/event/FlowApprovalEvent.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/event/FlowApprovalEvent.java
index ba6665ad..d6b8f406 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/event/FlowApprovalEvent.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/event/FlowApprovalEvent.java
@@ -34,6 +34,8 @@ public class FlowApprovalEvent implements ISyncEvent {
public static final int STATE_URGE = 8;
// 抄送
public static final int STATE_CIRCULATE = 9;
+ // 保存
+ public static final int STATE_SAVE = 10;
private final int state;
@@ -52,8 +54,23 @@ public FlowApprovalEvent(int state, FlowRecord flowRecord, IFlowOperator operato
}
- public boolean match(Class> bindDataClass) {
- return bindDataClass.isInstance(bindData);
+ public boolean match(String matchKey) {
+ return bindData.match(matchKey);
+ }
+
+ /**
+ * 匹配类名
+ * 当前bingData下的clazzName变成了普通的key字段了,推荐使用match(String matchKey)方法
+ * @param clazz 类名
+ * @return 是否匹配
+ */
+ @Deprecated
+ public boolean match(Class> clazz) {
+ return bindData.match(clazz.getName());
+ }
+
+ public T toJavaObject(Class clazz) {
+ return bindData.toJavaObject(clazz);
}
public boolean isUrge() {
@@ -64,6 +81,10 @@ public boolean isTodo() {
return state == STATE_TODO;
}
+ public boolean isSave() {
+ return state == STATE_SAVE;
+ }
+
public boolean isCreate() {
return state == STATE_CREATE;
}
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowSaveService.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowSaveService.java
index 6e57d924..f73c6550 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowSaveService.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowSaveService.java
@@ -2,7 +2,9 @@
import com.codingapi.springboot.flow.bind.BindDataSnapshot;
import com.codingapi.springboot.flow.bind.IBindData;
+import com.codingapi.springboot.flow.domain.FlowWork;
import com.codingapi.springboot.flow.domain.Opinion;
+import com.codingapi.springboot.flow.event.FlowApprovalEvent;
import com.codingapi.springboot.flow.record.FlowRecord;
import com.codingapi.springboot.flow.repository.FlowBindDataRepository;
import com.codingapi.springboot.flow.repository.FlowProcessRepository;
@@ -10,6 +12,7 @@
import com.codingapi.springboot.flow.repository.FlowWorkRepository;
import com.codingapi.springboot.flow.service.FlowRecordVerifyService;
import com.codingapi.springboot.flow.user.IFlowOperator;
+import com.codingapi.springboot.framework.event.EventPusher;
import lombok.AllArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
@@ -48,6 +51,15 @@ public void save(long recordId, IFlowOperator currentOperator, IBindData bindDat
flowRecord.setOpinion(opinion);
flowRecordRepository.update(flowRecord);
+
+ FlowWork flowWork = flowRecordVerifyService.getFlowWork();
+
+ EventPusher.push(new FlowApprovalEvent(FlowApprovalEvent.STATE_SAVE,
+ flowRecord,
+ flowRecord.getCurrentOperator(),
+ flowWork,
+ snapshot.toBindData()),
+ true);
}
}
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowStartService.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowStartService.java
index da90bf88..d035a5e4 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowStartService.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/impl/FlowStartService.java
@@ -189,6 +189,7 @@ public FlowResult startFlow() {
for (FlowRecord record : records) {
this.pushEvent(FlowApprovalEvent.STATE_CREATE, record);
this.pushEvent(FlowApprovalEvent.STATE_TODO, record);
+ this.pushEvent(FlowApprovalEvent.STATE_SAVE, record);
}
// 当前的审批记录
return new FlowResult(flowWork, records);
diff --git a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/flow/Leave.java b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/flow/Leave.java
index 2d02fed0..c7b3a7ca 100644
--- a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/flow/Leave.java
+++ b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/flow/Leave.java
@@ -1,11 +1,15 @@
package com.codingapi.springboot.flow.flow;
import com.codingapi.springboot.flow.bind.IBindData;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
+@AllArgsConstructor
+@NoArgsConstructor
public class Leave implements IBindData {
private long id;
diff --git a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/flow/Leave2.java b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/flow/Leave2.java
new file mode 100644
index 00000000..c6612bc4
--- /dev/null
+++ b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/flow/Leave2.java
@@ -0,0 +1,23 @@
+package com.codingapi.springboot.flow.flow;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class Leave2 {
+
+ private long id;
+ private String title;
+ private int days;
+
+ public Leave2(String title) {
+ this(title,0);
+ }
+
+ public Leave2(String title, int days) {
+ this.title = title;
+ this.days = days;
+ }
+
+}
diff --git a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/repository/LeaveRepository.java b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/repository/LeaveRepository.java
index dd4f50f1..1342286b 100644
--- a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/repository/LeaveRepository.java
+++ b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/repository/LeaveRepository.java
@@ -1,6 +1,7 @@
package com.codingapi.springboot.flow.repository;
import com.codingapi.springboot.flow.flow.Leave;
+import com.codingapi.springboot.flow.flow.Leave2;
import java.util.ArrayList;
import java.util.List;
@@ -15,4 +16,8 @@ public void save(Leave leave) {
leave.setId(cache.size());
}
}
+ public void save(Leave2 leave2) {
+ Leave leave = new Leave(leave2.getId(), leave2.getTitle(), leave2.getDays());
+ this.save(leave);
+ }
}
diff --git a/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/FlowMapTest.java b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/FlowMapTest.java
new file mode 100644
index 00000000..a14c7e98
--- /dev/null
+++ b/springboot-starter-flow/src/test/java/com/codingapi/springboot/flow/test/FlowMapTest.java
@@ -0,0 +1,127 @@
+package com.codingapi.springboot.flow.test;
+
+import com.codingapi.springboot.flow.bind.BindDataSnapshot;
+import com.codingapi.springboot.flow.bind.FlowMapBindData;
+import com.codingapi.springboot.flow.build.FlowWorkBuilder;
+import com.codingapi.springboot.flow.domain.FlowWork;
+import com.codingapi.springboot.flow.domain.Opinion;
+import com.codingapi.springboot.flow.em.ApprovalType;
+import com.codingapi.springboot.flow.flow.Leave2;
+import com.codingapi.springboot.flow.matcher.OperatorMatcher;
+import com.codingapi.springboot.flow.pojo.FlowDetail;
+import com.codingapi.springboot.flow.record.FlowRecord;
+import com.codingapi.springboot.flow.repository.*;
+import com.codingapi.springboot.flow.service.FlowService;
+import com.codingapi.springboot.flow.user.User;
+import org.junit.jupiter.api.Test;
+import org.springframework.data.domain.PageRequest;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FlowMapTest {
+
+ private final UserRepository userRepository = new UserRepository();
+ private final FlowWorkRepository flowWorkRepository = new FlowWorkRepositoryImpl();
+ private final FlowRecordRepositoryImpl flowRecordRepository = new FlowRecordRepositoryImpl();
+ private final FlowBindDataRepositoryImpl flowBindDataRepository = new FlowBindDataRepositoryImpl();
+ private final LeaveRepository leaveRepository = new LeaveRepository();
+ private final FlowBackupRepository flowBackupRepository = new FlowBackupRepositoryImpl();
+ private final FlowProcessRepository flowProcessRepository = new FlowProcessRepositoryImpl(flowBackupRepository, userRepository);
+ private final FlowService flowService = new FlowService(flowWorkRepository, flowRecordRepository, flowBindDataRepository, userRepository, flowProcessRepository, flowBackupRepository);
+
+ /**
+ * map数据绑定对象测试
+ */
+ @Test
+ void mapFlowTest() {
+ PageRequest pageRequest = PageRequest.of(0, 1000);
+
+ User user = new User("张飞");
+ userRepository.save(user);
+
+ User dept = new User("刘备");
+ userRepository.save(dept);
+
+ User boss = new User("诸葛亮");
+ userRepository.save(boss);
+
+ FlowWork flowWork = FlowWorkBuilder.builder(user)
+ .title("请假流程")
+ .nodes()
+ .node("开始节点", "start", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
+ .node("部门领导审批", "dept", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(dept.getUserId()))
+ .node("总经理审批", "manager", "default", ApprovalType.UN_SIGN, OperatorMatcher.specifyOperatorMatcher(boss.getUserId()))
+ .node("结束节点", "over", "default", ApprovalType.UN_SIGN, OperatorMatcher.anyOperatorMatcher())
+ .relations()
+ .relation("部门领导审批", "start", "dept")
+ .relation("总经理审批", "dept", "manager")
+ .relation("结束节点", "manager", "over")
+ .build();
+
+ flowWorkRepository.save(flowWork);
+
+ String workCode = flowWork.getCode();
+
+ Leave2 leave = new Leave2("我要出去看看");
+ FlowMapBindData bindData = FlowMapBindData.fromObject(leave);
+ leaveRepository.save(leave);
+
+ // 创建流程
+ flowService.startFlow(workCode, user, bindData, "发起流程");
+
+ // 查看我的待办
+ List userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
+ assertEquals(1, userTodos.size());
+
+ // 提交流程
+ FlowRecord userTodo = userTodos.get(0);
+ // 保存流程
+ leave.setTitle("我要出去看看~~");
+ bindData = FlowMapBindData.fromObject(leave);
+ flowService.save(userTodo.getId(), user, bindData, "暂存");
+
+ // 查看流程详情
+ FlowDetail flowDetail = flowService.detail(userTodo.getId(), user);
+ assertEquals("我要出去看看~~", (flowDetail.getBindData().toJavaObject(Leave2.class)).getTitle());
+ assertTrue(flowDetail.getFlowRecord().isRead());
+
+
+ flowService.submitFlow(userTodo.getId(), user, bindData, Opinion.pass("同意"));
+
+ // 查看部门经理的待办
+ List deptTodos = flowRecordRepository.findTodoByOperatorId(dept.getUserId(), pageRequest).getContent();
+ assertEquals(1, deptTodos.size());
+
+ // 提交部门经理的审批
+ FlowRecord deptTodo = deptTodos.get(0);
+ flowService.submitFlow(deptTodo.getId(), dept, bindData, Opinion.pass("同意"));
+
+ // 查看总经理的待办
+ List bossTodos = flowRecordRepository.findTodoByOperatorId(boss.getUserId(), pageRequest).getContent();
+ assertEquals(1, bossTodos.size());
+
+ // 提交总经理的审批
+ FlowRecord bossTodo = bossTodos.get(0);
+ flowService.submitFlow(bossTodo.getId(), boss, bindData, Opinion.pass("同意"));
+
+ // 查看所有流程
+ List records = flowRecordRepository.findAll(pageRequest).getContent();
+ assertEquals(3, records.size());
+
+ userTodos = flowRecordRepository.findTodoByOperatorId(user.getUserId(), pageRequest).getContent();
+ assertEquals(0, userTodos.size());
+
+
+ records = flowRecordRepository.findAll(pageRequest).getContent();
+ assertEquals(3, records.size());
+ // 查看所有流程是否都已经结束
+ assertTrue(records.stream().allMatch(FlowRecord::isFinish));
+
+ List snapshots = flowBindDataRepository.findAll();
+ assertEquals(4, snapshots.size());
+
+ }
+}
diff --git a/springboot-starter-security/pom.xml b/springboot-starter-security/pom.xml
index aa859a81..91e08ba7 100644
--- a/springboot-starter-security/pom.xml
+++ b/springboot-starter-security/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.1
+ 2.10.2
springboot-starter-security
diff --git a/springboot-starter/pom.xml b/springboot-starter/pom.xml
index cb4d311e..bb46512e 100644
--- a/springboot-starter/pom.xml
+++ b/springboot-starter/pom.xml
@@ -5,7 +5,7 @@
com.codingapi.springboot
springboot-parent
- 2.10.1
+ 2.10.2
springboot-starter
diff --git a/springboot-starter/src/main/resources/META-INF/banner.txt b/springboot-starter/src/main/resources/META-INF/banner.txt
index 98ad746a..845aa16c 100644
--- a/springboot-starter/src/main/resources/META-INF/banner.txt
+++ b/springboot-starter/src/main/resources/META-INF/banner.txt
@@ -1,4 +1,4 @@
------------------------------------------------------
-CodingApi SpringBoot-Starter 2.10.1
+CodingApi SpringBoot-Starter 2.10.2
springboot version (${spring-boot.version})
------------------------------------------------------
From 11d821918f665fe876cb3352435fd875a9db8f8b Mon Sep 17 00:00:00 2001
From: lorne <1991wangliang@gmail.com>
Date: Fri, 13 Jun 2025 11:22:25 +0800
Subject: [PATCH 4/6] fix 2.10.3
---
pom.xml | 2 +-
springboot-starter-data-authorization/pom.xml | 2 +-
springboot-starter-data-fast/pom.xml | 2 +-
springboot-starter-flow/pom.xml | 2 +-
.../com/codingapi/springboot/flow/service/FlowNodeService.java | 2 +-
springboot-starter-security/pom.xml | 2 +-
springboot-starter/pom.xml | 2 +-
springboot-starter/src/main/resources/META-INF/banner.txt | 2 +-
8 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/pom.xml b/pom.xml
index 809919f1..daad4555 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
com.codingapi.springboot
springboot-parent
- 2.10.2
+ 2.10.3
https://github.com/codingapi/springboot-framewrok
springboot-parent
diff --git a/springboot-starter-data-authorization/pom.xml b/springboot-starter-data-authorization/pom.xml
index 024f93f3..c4a5dbc7 100644
--- a/springboot-starter-data-authorization/pom.xml
+++ b/springboot-starter-data-authorization/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.2
+ 2.10.3
springboot-starter-data-authorization
diff --git a/springboot-starter-data-fast/pom.xml b/springboot-starter-data-fast/pom.xml
index fcfa7b86..94a3ff78 100644
--- a/springboot-starter-data-fast/pom.xml
+++ b/springboot-starter-data-fast/pom.xml
@@ -5,7 +5,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.2
+ 2.10.3
4.0.0
diff --git a/springboot-starter-flow/pom.xml b/springboot-starter-flow/pom.xml
index 68d1b1f0..b366126e 100644
--- a/springboot-starter-flow/pom.xml
+++ b/springboot-starter-flow/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.2
+ 2.10.3
springboot-starter-flow
diff --git a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/FlowNodeService.java b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/FlowNodeService.java
index c0acc00a..bcc58942 100644
--- a/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/FlowNodeService.java
+++ b/springboot-starter-flow/src/main/java/com/codingapi/springboot/flow/service/FlowNodeService.java
@@ -164,7 +164,7 @@ public void loadCustomBackNode(FlowNode flowNode, long parentRecordId) {
}
this.nextNode = nextNode;
this.nextOperator = flowOperator;
- this.backOperator = flowOperator;
+ this.backOperator = null;
}
diff --git a/springboot-starter-security/pom.xml b/springboot-starter-security/pom.xml
index 91e08ba7..1482367f 100644
--- a/springboot-starter-security/pom.xml
+++ b/springboot-starter-security/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.2
+ 2.10.3
springboot-starter-security
diff --git a/springboot-starter/pom.xml b/springboot-starter/pom.xml
index bb46512e..d083955a 100644
--- a/springboot-starter/pom.xml
+++ b/springboot-starter/pom.xml
@@ -5,7 +5,7 @@
com.codingapi.springboot
springboot-parent
- 2.10.2
+ 2.10.3
springboot-starter
diff --git a/springboot-starter/src/main/resources/META-INF/banner.txt b/springboot-starter/src/main/resources/META-INF/banner.txt
index 845aa16c..7b4110d8 100644
--- a/springboot-starter/src/main/resources/META-INF/banner.txt
+++ b/springboot-starter/src/main/resources/META-INF/banner.txt
@@ -1,4 +1,4 @@
------------------------------------------------------
-CodingApi SpringBoot-Starter 2.10.2
+CodingApi SpringBoot-Starter 2.10.3
springboot version (${spring-boot.version})
------------------------------------------------------
From 4eccebafb3a495f58abf2e81b27ecfeafb4da877 Mon Sep 17 00:00:00 2001
From: lorne <1991wangliang@gmail.com>
Date: Fri, 20 Jun 2025 21:37:54 +0800
Subject: [PATCH 5/6] 2.10.4 add HttpSecurityCustomer
---
pom.xml | 2 +-
springboot-starter-data-authorization/pom.xml | 2 +-
springboot-starter-data-fast/pom.xml | 2 +-
springboot-starter-flow/pom.xml | 2 +-
springboot-starter-security/pom.xml | 2 +-
.../security/AutoConfiguration.java | 26 ++++++----
.../customer/DefaultHttpSecurityCustomer.java | 50 +++++++++++++++++++
.../customer/HttpSecurityCustomer.java | 9 ++++
.../CodingApiSecurityProperties.java | 9 ++++
springboot-starter/pom.xml | 2 +-
.../src/main/resources/META-INF/banner.txt | 2 +-
11 files changed, 91 insertions(+), 17 deletions(-)
create mode 100644 springboot-starter-security/src/main/java/com/codingapi/springboot/security/customer/DefaultHttpSecurityCustomer.java
create mode 100644 springboot-starter-security/src/main/java/com/codingapi/springboot/security/customer/HttpSecurityCustomer.java
diff --git a/pom.xml b/pom.xml
index daad4555..d2d5d0dc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
com.codingapi.springboot
springboot-parent
- 2.10.3
+ 2.10.4
https://github.com/codingapi/springboot-framewrok
springboot-parent
diff --git a/springboot-starter-data-authorization/pom.xml b/springboot-starter-data-authorization/pom.xml
index c4a5dbc7..4b6698a5 100644
--- a/springboot-starter-data-authorization/pom.xml
+++ b/springboot-starter-data-authorization/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.3
+ 2.10.4
springboot-starter-data-authorization
diff --git a/springboot-starter-data-fast/pom.xml b/springboot-starter-data-fast/pom.xml
index 94a3ff78..e1a9af60 100644
--- a/springboot-starter-data-fast/pom.xml
+++ b/springboot-starter-data-fast/pom.xml
@@ -5,7 +5,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.3
+ 2.10.4
4.0.0
diff --git a/springboot-starter-flow/pom.xml b/springboot-starter-flow/pom.xml
index b366126e..e27424b1 100644
--- a/springboot-starter-flow/pom.xml
+++ b/springboot-starter-flow/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.3
+ 2.10.4
springboot-starter-flow
diff --git a/springboot-starter-security/pom.xml b/springboot-starter-security/pom.xml
index 1482367f..7abb2fee 100644
--- a/springboot-starter-security/pom.xml
+++ b/springboot-starter-security/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.3
+ 2.10.4
springboot-starter-security
diff --git a/springboot-starter-security/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java b/springboot-starter-security/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java
index b60f597c..b8b21a76 100644
--- a/springboot-starter-security/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java
+++ b/springboot-starter-security/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java
@@ -2,6 +2,8 @@
import com.codingapi.springboot.security.configurer.HttpSecurityConfigurer;
import com.codingapi.springboot.security.controller.VersionController;
+import com.codingapi.springboot.security.customer.DefaultHttpSecurityCustomer;
+import com.codingapi.springboot.security.customer.HttpSecurityCustomer;
import com.codingapi.springboot.security.dto.request.LoginRequest;
import com.codingapi.springboot.security.dto.response.LoginResponse;
import com.codingapi.springboot.security.filter.*;
@@ -67,6 +69,11 @@ public AuthenticationTokenFilter authenticationTokenFilter() {
};
}
+ @Bean
+ @ConditionalOnMissingBean
+ public HttpSecurityCustomer httpSecurityCustomer(CodingApiSecurityProperties properties){
+ return new DefaultHttpSecurityCustomer(properties);
+ }
@Bean
@ConditionalOnMissingBean
@@ -91,16 +98,15 @@ public LoginResponse postHandle(HttpServletRequest request, HttpServletResponse
@Bean
@ConditionalOnMissingBean
- public SecurityFilterChain filterChain(HttpSecurity security, TokenGateway tokenGateway, SecurityLoginHandler loginHandler,
- CodingApiSecurityProperties properties, AuthenticationTokenFilter authenticationTokenFilter) throws Exception {
- //disable basic auth
- security.httpBasic().disable();
-
- //before add addCorsMappings to enable cors.
- security.cors();
- if (properties.isDisableCsrf()) {
- security.csrf().disable();
- }
+ public SecurityFilterChain filterChain(HttpSecurity security,
+ HttpSecurityCustomer httpSecurityCustomer,
+ TokenGateway tokenGateway,
+ SecurityLoginHandler loginHandler,
+ CodingApiSecurityProperties properties,
+ AuthenticationTokenFilter authenticationTokenFilter) throws Exception {
+
+ httpSecurityCustomer.customize(security);
+
security.apply(new HttpSecurityConfigurer(tokenGateway, loginHandler, properties, authenticationTokenFilter));
security
.exceptionHandling()
diff --git a/springboot-starter-security/src/main/java/com/codingapi/springboot/security/customer/DefaultHttpSecurityCustomer.java b/springboot-starter-security/src/main/java/com/codingapi/springboot/security/customer/DefaultHttpSecurityCustomer.java
new file mode 100644
index 00000000..02733c6f
--- /dev/null
+++ b/springboot-starter-security/src/main/java/com/codingapi/springboot/security/customer/DefaultHttpSecurityCustomer.java
@@ -0,0 +1,50 @@
+package com.codingapi.springboot.security.customer;
+
+import com.codingapi.springboot.security.properties.CodingApiSecurityProperties;
+import lombok.AllArgsConstructor;
+import org.springframework.security.config.Customizer;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
+
+@AllArgsConstructor
+public class DefaultHttpSecurityCustomer implements HttpSecurityCustomer {
+
+ private final CodingApiSecurityProperties properties;
+
+ @Override
+ public void customize(HttpSecurity security) throws Exception {
+ //disable basic auth
+ if (properties.isDisableBasicAuth()) {
+ security.httpBasic(AbstractHttpConfigurer::disable);
+ }
+
+ //disable frame options
+ if (properties.isDisableFrameOptions()) {
+ security.headers(new Customizer>() {
+ @Override
+ public void customize(HeadersConfigurer httpSecurityHeadersConfigurer) {
+ httpSecurityHeadersConfigurer.frameOptions(new Customizer.FrameOptionsConfig>() {
+ @Override
+ public void customize(HeadersConfigurer.FrameOptionsConfig frameOptionsConfig) {
+ frameOptionsConfig.disable();
+ }
+ });
+ }
+ });
+ }
+
+ //before add addCorsMappings to enable cors.
+ security.cors(httpSecurityCorsConfigurer -> {
+ if (properties.isDisableCors()) {
+ httpSecurityCorsConfigurer.disable();
+ }
+ });
+
+ security.csrf(httpSecurityCsrfConfigurer -> {
+ if (properties.isDisableCsrf()) {
+ httpSecurityCsrfConfigurer.disable();
+ }
+ });
+ }
+}
diff --git a/springboot-starter-security/src/main/java/com/codingapi/springboot/security/customer/HttpSecurityCustomer.java b/springboot-starter-security/src/main/java/com/codingapi/springboot/security/customer/HttpSecurityCustomer.java
new file mode 100644
index 00000000..ddc35dd6
--- /dev/null
+++ b/springboot-starter-security/src/main/java/com/codingapi/springboot/security/customer/HttpSecurityCustomer.java
@@ -0,0 +1,9 @@
+package com.codingapi.springboot.security.customer;
+
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+
+public interface HttpSecurityCustomer {
+
+ void customize(HttpSecurity security) throws Exception;
+
+}
diff --git a/springboot-starter-security/src/main/java/com/codingapi/springboot/security/properties/CodingApiSecurityProperties.java b/springboot-starter-security/src/main/java/com/codingapi/springboot/security/properties/CodingApiSecurityProperties.java
index 4a33d91b..0db1dad0 100644
--- a/springboot-starter-security/src/main/java/com/codingapi/springboot/security/properties/CodingApiSecurityProperties.java
+++ b/springboot-starter-security/src/main/java/com/codingapi/springboot/security/properties/CodingApiSecurityProperties.java
@@ -38,6 +38,15 @@ public class CodingApiSecurityProperties {
*/
private String aseIv = "QUNYRkdIQEVEUyNYQ1phcw==";
+ /**
+ * 禁用Basic Auth
+ */
+ private boolean disableBasicAuth = true;
+
+ /**
+ * 禁用FrameOptions
+ */
+ private boolean disableFrameOptions = true;
/**
* 启用禁用CSRF
diff --git a/springboot-starter/pom.xml b/springboot-starter/pom.xml
index d083955a..a7db9a65 100644
--- a/springboot-starter/pom.xml
+++ b/springboot-starter/pom.xml
@@ -5,7 +5,7 @@
com.codingapi.springboot
springboot-parent
- 2.10.3
+ 2.10.4
springboot-starter
diff --git a/springboot-starter/src/main/resources/META-INF/banner.txt b/springboot-starter/src/main/resources/META-INF/banner.txt
index 7b4110d8..685e5ca1 100644
--- a/springboot-starter/src/main/resources/META-INF/banner.txt
+++ b/springboot-starter/src/main/resources/META-INF/banner.txt
@@ -1,4 +1,4 @@
------------------------------------------------------
-CodingApi SpringBoot-Starter 2.10.3
+CodingApi SpringBoot-Starter 2.10.4
springboot version (${spring-boot.version})
------------------------------------------------------
From 59ed4505ae9f64c7a7c130ab340f5484653b8bb2 Mon Sep 17 00:00:00 2001
From: lorne <1991wangliang@gmail.com>
Date: Fri, 27 Jun 2025 14:52:38 +0800
Subject: [PATCH 6/6] add Any
---
pom.xml | 2 +-
springboot-starter-data-authorization/pom.xml | 2 +-
springboot-starter-data-fast/pom.xml | 2 +-
springboot-starter-flow/pom.xml | 2 +-
springboot-starter-security/pom.xml | 2 +-
springboot-starter/pom.xml | 2 +-
.../springboot/framework/annotation/ColumnType.java | 5 +++++
springboot-starter/src/main/resources/META-INF/banner.txt | 2 +-
8 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/pom.xml b/pom.xml
index d2d5d0dc..999755a7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
com.codingapi.springboot
springboot-parent
- 2.10.4
+ 2.10.5
https://github.com/codingapi/springboot-framewrok
springboot-parent
diff --git a/springboot-starter-data-authorization/pom.xml b/springboot-starter-data-authorization/pom.xml
index 4b6698a5..fa3f09c0 100644
--- a/springboot-starter-data-authorization/pom.xml
+++ b/springboot-starter-data-authorization/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.4
+ 2.10.5
springboot-starter-data-authorization
diff --git a/springboot-starter-data-fast/pom.xml b/springboot-starter-data-fast/pom.xml
index e1a9af60..f7e84726 100644
--- a/springboot-starter-data-fast/pom.xml
+++ b/springboot-starter-data-fast/pom.xml
@@ -5,7 +5,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.4
+ 2.10.5
4.0.0
diff --git a/springboot-starter-flow/pom.xml b/springboot-starter-flow/pom.xml
index e27424b1..5100e5d9 100644
--- a/springboot-starter-flow/pom.xml
+++ b/springboot-starter-flow/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.4
+ 2.10.5
springboot-starter-flow
diff --git a/springboot-starter-security/pom.xml b/springboot-starter-security/pom.xml
index 7abb2fee..ffebe777 100644
--- a/springboot-starter-security/pom.xml
+++ b/springboot-starter-security/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 2.10.4
+ 2.10.5
springboot-starter-security
diff --git a/springboot-starter/pom.xml b/springboot-starter/pom.xml
index a7db9a65..a314e5c3 100644
--- a/springboot-starter/pom.xml
+++ b/springboot-starter/pom.xml
@@ -5,7 +5,7 @@
com.codingapi.springboot
springboot-parent
- 2.10.4
+ 2.10.5
springboot-starter
diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/annotation/ColumnType.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/annotation/ColumnType.java
index 215814c1..40bb84f1 100644
--- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/annotation/ColumnType.java
+++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/annotation/ColumnType.java
@@ -44,4 +44,9 @@ public enum ColumnType {
* JSON
*/
JSON,
+
+ /**
+ * 任意
+ */
+ Any
}
diff --git a/springboot-starter/src/main/resources/META-INF/banner.txt b/springboot-starter/src/main/resources/META-INF/banner.txt
index 685e5ca1..9555bc0b 100644
--- a/springboot-starter/src/main/resources/META-INF/banner.txt
+++ b/springboot-starter/src/main/resources/META-INF/banner.txt
@@ -1,4 +1,4 @@
------------------------------------------------------
-CodingApi SpringBoot-Starter 2.10.4
+CodingApi SpringBoot-Starter 2.10.5
springboot version (${spring-boot.version})
------------------------------------------------------