add - 添加新版的 JSON 转 BPMN 功能

This commit is contained in:
wangli 2023-10-16 20:57:22 +08:00
parent 706e884025
commit aff911595a
8 changed files with 526 additions and 40 deletions

View File

@ -4,10 +4,11 @@ package cn.axzo.workflow.common.enums;
public enum BpmFlowNodeType {
//0 发起人 1审批 2抄送 3条件 4路由
NODE_STARTER("NODE_STARTER", "发起人节点"),
NODE_ROUTER("NODE_ROUTER", "路由节点节点"),
NODE_CONDITION("NODE_CONDITION", "条件节点"),
NODE_TASK("NODE_TASK", "审核节点");
NODE_STARTER("NODE_STARTER", "发起人节点"), // ROOT
NODE_EXCLUSIVE_GATEWAY("NODE_EXCLUSIVE_GATEWAY", "排它网关"), // CONDITIONS
NODE_PARALLEL_GATEWAY("NODE_PARALLEL_GATEWAY", "并行网关"),
NODE_CONDITION("NODE_CONDITION", "条件节点"), // CONDITION
NODE_TASK("NODE_TASK", "审核节点"); // APPROVAL
private String type;
private String desc;

View File

@ -158,7 +158,7 @@ public class BpmTransformUtil {
public static String create(String fromId, BpmnJsonNode flowNode, Process process, BpmnModel bpmnModel,
List<SequenceFlow> sequenceFlows, Map<String, BpmnJsonNode> childNodeMap) throws InvocationTargetException, IllegalAccessException {
String nodeType = flowNode.getType().getType();
if (BpmFlowNodeType.NODE_ROUTER.isEqual(nodeType)) {
if (BpmFlowNodeType.NODE_EXCLUSIVE_GATEWAY.isEqual(nodeType)) {
return createExclusiveGatewayBuilder(fromId, flowNode, process, bpmnModel, sequenceFlows, childNodeMap);
} else if (BpmFlowNodeType.NODE_TASK.isEqual(nodeType)) {
childNodeMap.put(flowNode.getId(), flowNode);
@ -273,7 +273,7 @@ public class BpmTransformUtil {
if (Objects.nonNull(childNode) && StringUtils.isNotBlank(childNode.getId())) {
String parentId = childNode.getParentId();
BpmnJsonNode parentChildNode = childNodeMap.get(parentId);
if (BpmFlowNodeType.NODE_ROUTER.equals(parentChildNode.getType())) {
if (BpmFlowNodeType.NODE_EXCLUSIVE_GATEWAY.equals(parentChildNode.getType())) {
String endExId = parentChildNode.getId() + "end";
process.addFlowElement(createExclusiveGateWayEnd(endExId));
if (incoming == null || incoming.isEmpty()) {

View File

@ -14,9 +14,11 @@ import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.EndEvent;
import org.flowable.bpmn.model.ExclusiveGateway;
import org.flowable.bpmn.model.ExtensionAttribute;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.Gateway;
import org.flowable.bpmn.model.ParallelGateway;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.SequenceFlow;
import org.flowable.bpmn.model.StartEvent;
@ -29,6 +31,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import static cn.axzo.workflow.common.constant.BpmConstants.END_EVENT_ID;
import static cn.axzo.workflow.common.constant.BpmConstants.SEQUENCE_FLOW_ID;
@ -99,7 +102,7 @@ public class BpmnJsonConverterUtil {
mainProcess.addFlowElement(convertJsonToElement(EndEvent.class));
SequenceFlow sequenceFlow = new SequenceFlow();
sequenceFlow.setId(SEQUENCE_FLOW_ID);
sequenceFlow.setId(id(SEQUENCE_FLOW_ID));
sequenceFlow.setSourceRef(lastNodeId);
sequenceFlow.setTargetRef(END_EVENT_ID);
mainProcess.addFlowElement(sequenceFlow);
@ -147,8 +150,11 @@ public class BpmnJsonConverterUtil {
case NODE_TASK:
clz = UserTask.class;
break;
case NODE_ROUTER:
clz = Gateway.class;
case NODE_EXCLUSIVE_GATEWAY:
clz = ExclusiveGateway.class;
break;
case NODE_PARALLEL_GATEWAY:
clz = ParallelGateway.class;
break;
case NODE_CONDITION:
clz = Gateway.class;
@ -197,6 +203,10 @@ public class BpmnJsonConverterUtil {
return target;
}
public static String id(String prefix) {
return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase();
}
public static void main(String[] args) {
String jsonStr = "{\n" +
" \"id\": \"NODE_STARTER\",\n" +

View File

@ -0,0 +1,10 @@
package cn.axzo.workflow.core.converter.json;
/**
* TODO
*
* @author wangli
* @since 2023/10/16 20:51
*/
public class ExclusiveGatewayJsonConverter {
}

View File

@ -0,0 +1,10 @@
package cn.axzo.workflow.core.converter.json;
/**
* TODO
*
* @author wangli
* @since 2023/10/16 20:51
*/
public class ParallelGatewayJsonConverter {
}

View File

@ -6,6 +6,7 @@ import org.flowable.bpmn.model.SequenceFlow;
import java.util.List;
import static cn.axzo.workflow.common.constant.BpmConstants.SEQUENCE_FLOW_ID;
import static cn.axzo.workflow.core.common.utils.BpmnJsonConverterUtil.id;
/**
* 顺序流节点
@ -24,7 +25,7 @@ public class SequenceFlowJsonConverter extends AbstractBpmnJsonConverter<Sequenc
List<String> incoming = node.getIncoming().get("incoming");
// TODO 缺少判断网关的逻辑
SequenceFlow sequenceFlow = new SequenceFlow();
sequenceFlow.setId(SEQUENCE_FLOW_ID);
sequenceFlow.setId(id(SEQUENCE_FLOW_ID));
sequenceFlow.setSourceRef(incoming.get(0));
sequenceFlow.setTargetRef(node.getId());
return sequenceFlow;

View File

@ -1,41 +1,41 @@
{
"id": "NODE_STARTER",
"type": "NODE_STARTER",
"name": "发起",
"type": "NODE_STARTER",
"name": "发起",
"children": {
"id": "NODE_CONFIG",
"parentId": "NODE_STARTER",
"type": "NODE_TASK",
"name": "权限配置",
"children": {
"id": "NODE_CONFIG",
"parentId": "NODE_STARTER",
"id": "NODE_RELEASE_DEV",
"parentId": "NODE_CONFIG",
"type": "NODE_TASK",
"name": "发布 DEV",
"children": {
"id": "NODE_RELEASE_TEST",
"parentId": "NODE_RELEASE_DEV",
"type": "NODE_TASK",
"name": "权限配置",
"name": "发布 TEST",
"children": {
"id": "NODE_RELEASE_DEV",
"parentId": "NODE_CONFIG",
"id": "NODE_RELEASE_PRE",
"parentId": "NODE_RELEASE_TEST",
"type": "NODE_TASK",
"name": "发布 PRE",
"children": {
"id": "NODE_RELEASE_PROD",
"parentId": "NODE_RELEASE_PRE",
"type": "NODE_TASK",
"name": "发布 DEV",
"name": "发布生产",
"children": {
"id": "NODE_RELEASE_TEST",
"parentId": "NODE_RELEASE_DEV",
"type": "NODE_TASK",
"name": "发布 TEST",
"children": {
"id": "NODE_RELEASE_PRE",
"parentId": "NODE_RELEASE_TEST",
"type": "NODE_TASK",
"name": "发布 PRE",
"children": {
"id": "NODE_RELEASE_PROD",
"parentId": "NODE_RELEASE_PRE",
"type": "NODE_TASK",
"name": "发布生产",
"children": {
"id": "NODE_ACCEPTANCE",
"parentId": "NODE_RELEASE_PROD",
"type": "NODE_TASK",
"name": "产品验收"
}
}
}
"id": "NODE_ACCEPTANCE",
"parentId": "NODE_RELEASE_PROD",
"type": "NODE_TASK",
"name": "产品验收"
}
}
}
}
}
}
}

View File

@ -0,0 +1,454 @@
{
"id": "NODE_STARTER",
"parentId": null,
"type": "NODE_STARTER",
"name": "发起人",
"desc": "任何人",
"props": {
"assignedUser": [],
"formPerms": []
},
"children": {
"id": "node_545590085414",
"parentId": "NODE_STARTER",
"props": {
"assignedType": "SELF",
"mode": "AND",
"sign": false,
"nobody": {
"handler": "TO_PASS",
"assignedUser": []
},
"timeLimit": {
"timeout": {
"unit": "H",
"value": 0
},
"handler": {
"type": "REFUSE",
"notify": {
"once": true,
"hour": 1
}
}
},
"assignedUser": [],
"formPerms": [
{
"id": "field3933426667777",
"title": "单行文本输入",
"required": false,
"perm": "R"
}
],
"selfSelect": {
"multiple": false
},
"leaderTop": {
"endCondition": "TOP",
"endLevel": 1
},
"leader": {
"level": 1
},
"role": [],
"refuse": {
"type": "TO_END",
"target": ""
},
"formUser": ""
},
"type": "NODE_TASK",
"name": "审批人",
"children": {
"id": "node_049868581708",
"parentId": "node_545590085414",
"props": {},
"type": "NODE_ROUTER",
"name": "条件分支",
"children": {
"id": "node_049868589939",
"parentId": "node_049868581708",
"type": "EMPTY",
"children": {}
},
"branchs": [
{
"id": "node_049868586156",
"parentId": "node_049868581708",
"type": "NODE_CONDITION",
"props": {
"groupsType": "AND",
"groups": [
{
"groupType": "AND",
"cids": [
"root"
],
"conditions": [
{
"id": "root",
"title": "发起人",
"valueType": "User",
"compare": "",
"value": [
{
"id": 100001,
"name": "Java1号",
"type": "user",
"sex": false,
"selected": false
}
]
}
]
}
],
"expression": "A"
},
"name": "条件1",
"children": {
"id": "node_050045756369",
"parentId": "node_049868586156",
"props": {
"assignedType": "SELF_SELECT",
"mode": "AND",
"sign": false,
"nobody": {
"handler": "TO_PASS",
"assignedUser": []
},
"timeLimit": {
"timeout": {
"unit": "H",
"value": 0
},
"handler": {
"type": "REFUSE",
"notify": {
"once": true,
"hour": 1
}
}
},
"assignedUser": [],
"formPerms": [
{
"id": "field3933426667777",
"title": "单行文本输入",
"required": false,
"perm": "R"
}
],
"selfSelect": {
"multiple": false
},
"leaderTop": {
"endCondition": "TOP",
"endLevel": 1
},
"leader": {
"level": 1
},
"role": [],
"refuse": {
"type": "TO_END",
"target": ""
},
"formUser": ""
},
"type": "NODE_TASK",
"name": "审批人",
"children": {
"id": "node_050323594620",
"parentId": "node_050045756369",
"props": {},
"type": "CONCURRENTS",
"name": "并行分支",
"children": {
"id": "node_050323593330",
"parentId": "node_050323594620",
"type": "EMPTY",
"children": {
"id": "node_050494094405",
"parentId": "node_050323593330",
"props": {
"shouldAdd": false,
"assignedUser": [
{
"id": 100003,
"name": "Java3号",
"type": "user",
"sex": false,
"selected": false
}
],
"formPerms": [
{
"id": "field3933426667777",
"title": "单行文本输入",
"required": false,
"perm": "R"
}
]
},
"type": "CC",
"name": "抄送人",
"children": {}
}
},
"branchs": [
{
"id": "node_050323595280",
"name": "分支1",
"parentId": "node_050323594620",
"type": "CONCURRENT",
"props": {},
"children": {
"id": "node_050359097081",
"parentId": "node_050323595280",
"props": {
"assignedType": "SELF_SELECT",
"mode": "AND",
"sign": false,
"nobody": {
"handler": "TO_PASS",
"assignedUser": []
},
"timeLimit": {
"timeout": {
"unit": "H",
"value": 0
},
"handler": {
"type": "REFUSE",
"notify": {
"once": true,
"hour": 1
}
}
},
"assignedUser": [],
"formPerms": [
{
"id": "field3933426667777",
"title": "单行文本输入",
"required": false,
"perm": "R"
}
],
"selfSelect": {
"multiple": false
},
"leaderTop": {
"endCondition": "TOP",
"endLevel": 1
},
"leader": {
"level": 1
},
"role": [],
"refuse": {
"type": "TO_END",
"target": ""
},
"formUser": ""
},
"type": "APPROVAL",
"name": "审批人",
"children": {}
},
"typeElse": false
},
{
"id": "node_050323599136",
"name": "分支2",
"parentId": "node_050323594620",
"type": "CONCURRENT",
"props": {},
"children": {
"id": "node_050407266075",
"parentId": "node_050323599136",
"props": {
"assignedType": "SELF_SELECT",
"mode": "AND",
"sign": false,
"nobody": {
"handler": "TO_PASS",
"assignedUser": []
},
"timeLimit": {
"timeout": {
"unit": "H",
"value": 0
},
"handler": {
"type": "REFUSE",
"notify": {
"once": true,
"hour": 1
}
}
},
"assignedUser": [],
"formPerms": [
{
"id": "field3933426667777",
"title": "单行文本输入",
"required": false,
"perm": "R"
}
],
"selfSelect": {
"multiple": false
},
"leaderTop": {
"endCondition": "TOP",
"endLevel": 1
},
"leader": {
"level": 1
},
"role": [],
"refuse": {
"type": "TO_END",
"target": ""
},
"formUser": ""
},
"type": "APPROVAL",
"name": "审批人",
"children": {}
},
"typeElse": true
}
]
}
},
"typeElse": false
},
{
"id": "node_049868587288",
"parentId": "node_049868581708",
"type": "NODE_CONDITION",
"props": {
"groupsType": "OR",
"groups": [
{
"groupType": "AND",
"cids": [],
"conditions": []
}
],
"expression": ""
},
"name": "条件2",
"children": {
"id": "node_050635779081",
"parentId": "node_049868587288",
"props": {
"type": "EMAIL",
"http": {
"method": "GET",
"url": "",
"headers": [
{
"name": "",
"isField": true,
"value": ""
}
],
"contentType": "FORM",
"params": [
{
"name": "",
"isField": true,
"value": ""
}
],
"retry": 1,
"handlerByScript": false,
"success": "function handlerOk(res) {\n return true;\n}",
"fail": "function handlerFail(res) {\n return true;\n}"
},
"email": {
"subject": "s",
"to": "ss@axzo.cn",
"content": "ssss"
}
},
"type": "TRIGGER",
"name": "触发器",
"children": {
"id": "node_050659439088",
"parentId": "node_050635779081",
"props": {
"type": "FIXED",
"time": "1",
"unit": "M",
"dateTime": ""
},
"type": "DELAY",
"name": "延时处理",
"children": {
"id": "node_050826107631",
"parentId": "node_050659439088",
"props": {
"assignedType": "SELF_SELECT",
"mode": "AND",
"sign": false,
"nobody": {
"handler": "TO_PASS",
"assignedUser": []
},
"timeLimit": {
"timeout": {
"unit": "H",
"value": 0
},
"handler": {
"type": "REFUSE",
"notify": {
"once": true,
"hour": 1
}
}
},
"assignedUser": [],
"formPerms": [
{
"id": "field3933426667777",
"title": "单行文本输入",
"required": false,
"perm": "R"
}
],
"selfSelect": {
"multiple": false
},
"leaderTop": {
"endCondition": "TOP",
"endLevel": 1
},
"leader": {
"level": 1
},
"role": [],
"refuse": {
"type": "TO_END",
"target": ""
},
"formUser": ""
},
"type": "NODE_TASK",
"name": "审批人",
"children": {}
}
}
},
"typeElse": true
}
]
}
}
}