From b3bc78a39e5d97a0060d1d499a4fa8714b5990a7 Mon Sep 17 00:00:00 2001 From: dengqichen Date: Wed, 11 Dec 2024 19:10:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/workflow/enums/NodeType.java | 4 +- .../backend/workflow/util/BpmnConverter.java | 4 +- .../db/migration/V1.0.1__init_data.sql | 12 ++-- .../workflow/util/BpmnConverterTest.java | 72 +++++++++---------- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeType.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeType.java index 8fd5b43c..d2829684 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeType.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeType.java @@ -8,8 +8,8 @@ import com.fasterxml.jackson.annotation.JsonValue; * @date 2024-12-11 */ public enum NodeType { - START("start"), - END("end"), + START_EVENT("startEvent"), + END_EVENT("endEvent"), USER_TASK("userTask"), SERVICE_TASK("serviceTask"), SCRIPT_TASK("scriptTask"), diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/BpmnConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/BpmnConverter.java index afb79072..ad3809e6 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/BpmnConverter.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/BpmnConverter.java @@ -99,9 +99,9 @@ public class BpmnConverter { } switch (node.getType()) { - case START: + case START_EVENT: return createStartEvent(node); - case END: + case END_EVENT: return createEndEvent(node); case SERVICE_TASK: return createServiceTask(node); diff --git a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql b/backend/src/main/resources/db/migration/V1.0.1__init_data.sql index 56029c8e..15f28e3c 100644 --- a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql +++ b/backend/src/main/resources/db/migration/V1.0.1__init_data.sql @@ -166,8 +166,8 @@ INSERT INTO workflow_definition ( -- 简单流程:开始 -> 服务任务 -> 结束 ( '简单服务任务流程', 'simple_service_flow', 1, '一个包含服务任务的简单流程', 'test', - '', - '{"nodes":[{"id":"start1","type":"start","name":"开始","position":{"x":100,"y":100},"config":{"type":"start"},"properties":{},"size":{"width":40,"height":40}},{"id":"service1","type":"serviceTask","name":"服务任务","position":{"x":300,"y":100},"config":{"type":"serviceTask","implementation":"shell","fields":{"script":{"string":"echo \\"Hello World\\""}}},"properties":{},"size":{"width":100,"height":60}},{"id":"end1","type":"end","name":"结束","position":{"x":500,"y":100},"config":{"type":"end"},"properties":{},"size":{"width":40,"height":40}}],"edges":[{"id":"flow1","source":"start1","target":"service1","name":"","config":{"type":"sequenceFlow"},"properties":{}},{"id":"flow2","source":"service1","target":"end1","name":"","config":{"type":"sequenceFlow"},"properties":{}}],"properties":{}}', + '', + '{"nodes":[{"id":"startEvent1","type":"startEvent","name":"开始","position":{"x":100,"y":100},"config":{"type":"startEvent"},"properties":{},"size":{"width":40,"height":40}},{"id":"service1","type":"serviceTask","name":"服务任务","position":{"x":300,"y":100},"config":{"type":"serviceTask","implementation":"shell","fields":{"script":{"string":"echo \\"Hello World\\""}}},"properties":{},"size":{"width":100,"height":60}},{"id":"endEvent1","type":"endEvent","name":"结束","position":{"x":500,"y":100},"config":{"type":"endEvent"},"properties":{},"size":{"width":40,"height":40}}],"edges":[{"id":"flow1","source":"startEvent1","target":"service1","name":"","config":{"type":"sequenceFlow"},"properties":{}},{"id":"flow2","source":"service1","target":"endEvent1","name":"","config":{"type":"sequenceFlow"},"properties":{}}],"properties":{}}', '{"formItems":[]}', '["simple","test","service"]', 'PUBLISHED', TRUE, 'http://www.flowable.org/test', @@ -177,8 +177,8 @@ INSERT INTO workflow_definition ( -- 用户任务流程:开始 -> 用户任务 -> 结束 ( '用户审批流程', 'user_approval_flow', 1, '一个简单的用户审批流程', 'approval', - '', - '{"nodes":[{"id":"start1","type":"start","name":"开始","position":{"x":100,"y":100},"config":{"type":"start"},"properties":{},"size":{"width":40,"height":40}},{"id":"user1","type":"userTask","name":"审批任务","position":{"x":300,"y":100},"config":{"type":"userTask","assignee":"user1"},"properties":{},"size":{"width":100,"height":60}},{"id":"end1","type":"end","name":"结束","position":{"x":500,"y":100},"config":{"type":"end"},"properties":{},"size":{"width":40,"height":40}}],"edges":[{"id":"flow1","source":"start1","target":"user1","name":"提交审批","config":{"type":"sequenceFlow"},"properties":{}},{"id":"flow2","source":"user1","target":"end1","name":"审批完成","config":{"type":"sequenceFlow"},"properties":{}}],"properties":{}}', + '', + '{"nodes":[{"id":"startEvent1","type":"startEvent","name":"开始","position":{"x":100,"y":100},"config":{"type":"startEvent"},"properties":{},"size":{"width":40,"height":40}},{"id":"user1","type":"userTask","name":"审批任务","position":{"x":300,"y":100},"config":{"type":"userTask","assignee":"user1"},"properties":{},"size":{"width":100,"height":60}},{"id":"endEvent1","type":"endEvent","name":"结束","position":{"x":500,"y":100},"config":{"type":"endEvent"},"properties":{},"size":{"width":40,"height":40}}],"edges":[{"id":"flow1","source":"startEvent1","target":"user1","name":"提交审批","config":{"type":"sequenceFlow"},"properties":{}},{"id":"flow2","source":"user1","target":"endEvent1","name":"审批完成","config":{"type":"sequenceFlow"},"properties":{}}],"properties":{}}', '{"formItems":[{"type":"input","label":"意见","name":"comment","required":true}]}', '["approval","user-task"]', 'PUBLISHED', TRUE, 'http://www.flowable.org/test', @@ -188,8 +188,8 @@ INSERT INTO workflow_definition ( -- 复杂流程:开始 -> 服务任务 -> 用户任务 -> 脚本任务 -> 结束 ( '复杂业务流程', 'complex_business_flow', 1, '包含多种任务节点的复杂业务流程', 'business', - '$${condition}', - '{"nodes":[{"id":"start1","type":"start","name":"开始","position":{"x":100,"y":100},"config":{"type":"start"},"properties":{},"size":{"width":40,"height":40}},{"id":"service1","type":"serviceTask","name":"服务任务","position":{"x":300,"y":100},"config":{"type":"serviceTask","implementation":"com.example.ServiceTask"},"properties":{},"size":{"width":100,"height":60}},{"id":"user1","type":"userTask","name":"用户任务","position":{"x":500,"y":100},"config":{"type":"userTask","assignee":"user1"},"properties":{},"size":{"width":100,"height":60}},{"id":"script1","type":"scriptTask","name":"脚本任务","position":{"x":700,"y":100},"config":{"type":"scriptTask","scriptFormat":"groovy","script":"println \\"Hello\\""},"properties":{},"size":{"width":100,"height":60}},{"id":"end1","type":"end","name":"结束","position":{"x":900,"y":100},"config":{"type":"end"},"properties":{},"size":{"width":40,"height":40}}],"edges":[{"id":"flow1","source":"start1","target":"service1","name":"","config":{"type":"sequenceFlow"},"properties":{}},{"id":"flow2","source":"service1","target":"user1","name":"条件分支","config":{"type":"sequenceFlow","conditionExpression":"$${condition}"},"properties":{}},{"id":"flow3","source":"user1","target":"script1","name":"","config":{"type":"sequenceFlow"},"properties":{}},{"id":"flow4","source":"script1","target":"end1","name":"","config":{"type":"sequenceFlow"},"properties":{}}],"properties":{}}', + '', + '{"nodes":[{"id":"startEvent1","type":"startEvent","name":"开始","position":{"x":100,"y":100},"config":{"type":"startEvent"},"properties":{},"size":{"width":40,"height":40}},{"id":"service1","type":"serviceTask","name":"服务任务","position":{"x":300,"y":100},"config":{"type":"serviceTask","implementation":"com.example.ServiceTask"},"properties":{},"size":{"width":100,"height":60}},{"id":"user1","type":"userTask","name":"用户任务","position":{"x":500,"y":100},"config":{"type":"userTask","assignee":"user1"},"properties":{},"size":{"width":100,"height":60}},{"id":"script1","type":"scriptTask","name":"脚本任务","position":{"x":700,"y":100},"config":{"type":"scriptTask","scriptFormat":"groovy","script":"println \\"Hello\\""},"properties":{},"size":{"width":100,"height":60}},{"id":"endEvent1","type":"endEvent","name":"结束","position":{"x":900,"y":100},"config":{"type":"endEvent"},"properties":{},"size":{"width":40,"height":40}}],"edges":[{"id":"flow1","source":"startEvent1","target":"service1","name":"","config":{"type":"sequenceFlow"},"properties":{}},{"id":"flow2","source":"service1","target":"user1","name":"条件分支","config":{"type":"sequenceFlow","conditionExpression":"$${condition}"},"properties":{}},{"id":"flow3","source":"user1","target":"script1","name":"","config":{"type":"sequenceFlow"},"properties":{}},{"id":"flow4","source":"script1","target":"endEvent1","name":"","config":{"type":"sequenceFlow"},"properties":{}}],"properties":{}}', '{"formItems":[{"type":"input","label":"业务参数","name":"businessParam","required":true},{"type":"select","label":"审批结果","name":"approvalResult","options":[{"label":"同意","value":"approve"},{"label":"拒绝","value":"reject"}]}]}', '["complex","business","multi-task"]', 'PUBLISHED', TRUE, 'http://www.flowable.org/test', diff --git a/backend/src/test/java/com/qqchen/deploy/backend/workflow/util/BpmnConverterTest.java b/backend/src/test/java/com/qqchen/deploy/backend/workflow/util/BpmnConverterTest.java index 53b36459..c9b5f50c 100644 --- a/backend/src/test/java/com/qqchen/deploy/backend/workflow/util/BpmnConverterTest.java +++ b/backend/src/test/java/com/qqchen/deploy/backend/workflow/util/BpmnConverterTest.java @@ -34,8 +34,8 @@ class BpmnConverterTest { // 开始节点 WorkflowNode startNode = new WorkflowNode(); - startNode.setId("start"); - startNode.setType(NodeType.START); + startNode.setId("startEvent1"); + startNode.setType(NodeType.START_EVENT); startNode.setName("开始"); startNode.setPosition(new Position(100.0, 100.0)); nodes.add(startNode); @@ -48,7 +48,7 @@ class BpmnConverterTest { serviceNode.setPosition(new Position(300.0, 100.0)); NodeConfig serviceConfig = new NodeConfig(); - serviceConfig.setImplementation("${shellTaskDelegate}"); + serviceConfig.setImplementation("$${shellTaskDelegate}"); Map fields = new HashMap<>(); fields.put("script", "echo 'Hello World'"); fields.put("workDir", "/tmp"); @@ -59,8 +59,8 @@ class BpmnConverterTest { // 结束节点 WorkflowNode endNode = new WorkflowNode(); - endNode.setId("end"); - endNode.setType(NodeType.END); + endNode.setId("endEvent1"); + endNode.setType(NodeType.END_EVENT); endNode.setName("结束"); endNode.setPosition(new Position(500.0, 100.0)); nodes.add(endNode); @@ -71,7 +71,7 @@ class BpmnConverterTest { // 开始 -> 服务任务 WorkflowEdge edge1 = new WorkflowEdge(); edge1.setId("flow1"); - edge1.setSource("start"); + edge1.setSource("startEvent1"); edge1.setTarget("service1"); edge1.setName("流转到服务任务"); edges.add(edge1); @@ -80,7 +80,7 @@ class BpmnConverterTest { WorkflowEdge edge2 = new WorkflowEdge(); edge2.setId("flow2"); edge2.setSource("service1"); - edge2.setTarget("end"); + edge2.setTarget("endEvent1"); edge2.setName("流转到结束"); edges.add(edge2); @@ -107,7 +107,7 @@ class BpmnConverterTest { assertEquals(5, process.getFlowElements().size()); // 验证开始节点 - StartEvent startEvent = (StartEvent) process.getFlowElement("start"); + StartEvent startEvent = (StartEvent) process.getFlowElement("startEvent1"); assertNotNull(startEvent); assertEquals("开始", startEvent.getName()); @@ -115,7 +115,7 @@ class BpmnConverterTest { ServiceTask serviceTask = (ServiceTask) process.getFlowElement("service1"); assertNotNull(serviceTask); assertEquals("服务任务", serviceTask.getName()); - assertEquals("${shellTaskDelegate}", serviceTask.getImplementation()); + assertEquals("$${shellTaskDelegate}", serviceTask.getImplementation()); // 验证服务任务字段 List fieldExtensions = serviceTask.getFieldExtensions(); @@ -132,7 +132,7 @@ class BpmnConverterTest { assertEquals("30", fieldMap.get("timeout")); // 验证结束节点 - EndEvent endEvent = (EndEvent) process.getFlowElement("end"); + EndEvent endEvent = (EndEvent) process.getFlowElement("endEvent1"); assertNotNull(endEvent); assertEquals("结束", endEvent.getName()); @@ -140,14 +140,14 @@ class BpmnConverterTest { SequenceFlow flow1 = (SequenceFlow) process.getFlowElement("flow1"); assertNotNull(flow1); assertEquals("流转到服务任务", flow1.getName()); - assertEquals("start", flow1.getSourceRef()); + assertEquals("startEvent1", flow1.getSourceRef()); assertEquals("service1", flow1.getTargetRef()); SequenceFlow flow2 = (SequenceFlow) process.getFlowElement("flow2"); assertNotNull(flow2); assertEquals("流转到结束", flow2.getName()); assertEquals("service1", flow2.getSourceRef()); - assertEquals("end", flow2.getTargetRef()); + assertEquals("endEvent1", flow2.getTargetRef()); } @Test @@ -160,8 +160,8 @@ class BpmnConverterTest { // 开始节点 WorkflowNode startNode = new WorkflowNode(); - startNode.setId("start"); - startNode.setType(NodeType.START); + startNode.setId("startEvent1"); + startNode.setType(NodeType.START_EVENT); startNode.setName("开始"); startNode.setPosition(new Position(100.0, 100.0)); nodes.add(startNode); @@ -174,10 +174,10 @@ class BpmnConverterTest { userNode.setPosition(new Position(300.0, 100.0)); NodeConfig userConfig = new NodeConfig(); - userConfig.setAssignee("${initiator}"); + userConfig.setAssignee("$${initiator}"); userConfig.setCandidateUsers(Arrays.asList("user1", "user2")); userConfig.setCandidateGroups(Arrays.asList("group1", "group2")); - userConfig.setDueDate("${dueDate}"); + userConfig.setDueDate("$${dueDate}"); userConfig.setPriority(1); userConfig.setFormKey("form1"); userNode.setConfig(userConfig); @@ -185,8 +185,8 @@ class BpmnConverterTest { // 结束节点 WorkflowNode endNode = new WorkflowNode(); - endNode.setId("end"); - endNode.setType(NodeType.END); + endNode.setId("endEvent1"); + endNode.setType(NodeType.END_EVENT); endNode.setName("结束"); endNode.setPosition(new Position(500.0, 100.0)); nodes.add(endNode); @@ -197,7 +197,7 @@ class BpmnConverterTest { // 开始 -> 用户任务 WorkflowEdge edge1 = new WorkflowEdge(); edge1.setId("flow1"); - edge1.setSource("start"); + edge1.setSource("startEvent1"); edge1.setTarget("user1"); edge1.setName("提交审批"); edges.add(edge1); @@ -206,7 +206,7 @@ class BpmnConverterTest { WorkflowEdge edge2 = new WorkflowEdge(); edge2.setId("flow2"); edge2.setSource("user1"); - edge2.setTarget("end"); + edge2.setTarget("endEvent1"); edge2.setName("审批完成"); edges.add(edge2); @@ -233,10 +233,10 @@ class BpmnConverterTest { UserTask userTask = (UserTask) process.getFlowElement("user1"); assertNotNull(userTask); assertEquals("审批任务", userTask.getName()); - assertEquals("${initiator}", userTask.getAssignee()); + assertEquals("$${initiator}", userTask.getAssignee()); assertEquals(Arrays.asList("user1", "user2"), userTask.getCandidateUsers()); assertEquals(Arrays.asList("group1", "group2"), userTask.getCandidateGroups()); - assertEquals("${dueDate}", userTask.getDueDate()); + assertEquals("$${dueDate}", userTask.getDueDate()); assertEquals("1", userTask.getPriority()); assertEquals("form1", userTask.getFormKey()); } @@ -258,8 +258,8 @@ class BpmnConverterTest { // 开始节点 WorkflowNode startNode = new WorkflowNode(); - startNode.setId("start"); - startNode.setType(NodeType.START); + startNode.setId("startEvent1"); + startNode.setType(NodeType.START_EVENT); startNode.setName("开始"); startNode.setPosition(new Position(100.0, 100.0)); nodes.add(startNode); @@ -272,7 +272,7 @@ class BpmnConverterTest { serviceNode.setPosition(new Position(250.0, 100.0)); NodeConfig serviceConfig = new NodeConfig(); - serviceConfig.setImplementation("${shellTaskDelegate}"); + serviceConfig.setImplementation("$${shellTaskDelegate}"); Map serviceFields = new HashMap<>(); serviceFields.put("script", "echo 'Hello World'"); serviceFields.put("workDir", "/tmp"); @@ -288,7 +288,7 @@ class BpmnConverterTest { userNode.setPosition(new Position(400.0, 100.0)); NodeConfig userConfig = new NodeConfig(); - userConfig.setAssignee("${initiator}"); + userConfig.setAssignee("$${initiator}"); List candidateUsers = Arrays.asList("user1", "user2"); List candidateGroups = Arrays.asList("group1", "group2"); userConfig.setCandidateUsers(candidateUsers); @@ -315,8 +315,8 @@ class BpmnConverterTest { // 结束节点 WorkflowNode endNode = new WorkflowNode(); - endNode.setId("end"); - endNode.setType(NodeType.END); + endNode.setId("endEvent1"); + endNode.setType(NodeType.END_EVENT); endNode.setName("结束"); endNode.setPosition(new Position(700.0, 100.0)); nodes.add(endNode); @@ -327,7 +327,7 @@ class BpmnConverterTest { // 开始 -> 服务任务 WorkflowEdge edge1 = new WorkflowEdge(); edge1.setId("flow1"); - edge1.setSource("start"); + edge1.setSource("startEvent1"); edge1.setTarget("service1"); edge1.setName("流转到服务任务"); EdgeConfig edgeConfig1 = new EdgeConfig(); @@ -343,7 +343,7 @@ class BpmnConverterTest { edge2.setName("流转到用户任务"); EdgeConfig edgeConfig2 = new EdgeConfig(); edgeConfig2.setType("sequence"); - edgeConfig2.setCondition("${approved}"); + edgeConfig2.setCondition("$${approved}"); edge2.setConfig(edgeConfig2); edges.add(edge2); @@ -362,7 +362,7 @@ class BpmnConverterTest { WorkflowEdge edge4 = new WorkflowEdge(); edge4.setId("flow4"); edge4.setSource("script1"); - edge4.setTarget("end"); + edge4.setTarget("endEvent1"); edge4.setName("流转到结束"); EdgeConfig edgeConfig4 = new EdgeConfig(); edgeConfig4.setType("sequence"); @@ -402,7 +402,7 @@ class BpmnConverterTest { assertEquals(9, process.getFlowElements().size()); // 5个节点 + 4个连线 // 验证开始节点 - StartEvent startEvent = (StartEvent) process.getFlowElement("start"); + StartEvent startEvent = (StartEvent) process.getFlowElement("startEvent1"); assertNotNull(startEvent); assertEquals("开始", startEvent.getName()); @@ -410,13 +410,13 @@ class BpmnConverterTest { ServiceTask serviceTask = (ServiceTask) process.getFlowElement("service1"); assertNotNull(serviceTask); assertEquals("服务任务", serviceTask.getName()); - assertEquals("${shellTaskDelegate}", serviceTask.getImplementation()); + assertEquals("$${shellTaskDelegate}", serviceTask.getImplementation()); // 验证用户任务 UserTask userTask = (UserTask) process.getFlowElement("user1"); assertNotNull(userTask); assertEquals("用户任务", userTask.getName()); - assertEquals("${initiator}", userTask.getAssignee()); + assertEquals("$${initiator}", userTask.getAssignee()); assertEquals(Arrays.asList("user1", "user2"), userTask.getCandidateUsers()); assertEquals(Arrays.asList("group1", "group2"), userTask.getCandidateGroups()); @@ -427,13 +427,13 @@ class BpmnConverterTest { assertEquals("groovy", scriptTask.getScriptFormat()); // 验证结束节点 - EndEvent endEvent = (EndEvent) process.getFlowElement("end"); + EndEvent endEvent = (EndEvent) process.getFlowElement("endEvent1"); assertNotNull(endEvent); assertEquals("结束", endEvent.getName()); // 验证连线 SequenceFlow flow2 = (SequenceFlow) process.getFlowElement("flow2"); assertNotNull(flow2); - assertEquals("${approved}", flow2.getConditionExpression()); + assertEquals("$${approved}", flow2.getConditionExpression()); } } \ No newline at end of file