2
1
Эх сурвалжийг харах

工作流多实例完成时的回调

yuedefeng 6 жил өмнө
parent
commit
059cdaa83a

+ 20 - 2
src/main/java/com/common/workflow/service/activiti/ActivitiService.java

@@ -17,6 +17,7 @@ import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletResponse;
 
 import com.common.workflow.service.dto.ActiHistoricTaskDTO;
+import com.common.workflow.web.rest.vm.ActiCompleteVM;
 import com.common.workflow.web.rest.vm.MultiActiCompleteVM;
 import com.common.workflow.web.rest.vm.MultiOrgAuditVM;
 import org.activiti.bpmn.model.BpmnModel;
@@ -72,7 +73,14 @@ public class ActivitiService {
      *
      * <p>描述: 根据工作流Key, 用户id, 业务表Key 查询待办任务列表</p>
      */
-    public void completeTask(String processKey, String businessKey, String userNames, String userId, String result, String remarks) {
+    public void completeTask(ActiCompleteVM actiVm) {
+        String processKey = actiVm.getProcessKey();
+        String businessKey = actiVm.getBusinessKey();
+        String userNames = actiVm.getUserNames();
+        String userId = actiVm.getUserId();
+        String result = actiVm.getResult();
+        String remarks = actiVm.getRemarks();
+        String callbackUrl = actiVm.getCallbackUrl();
 
         Task myTask = taskService.createTaskQuery()
             .processDefinitionKey(processKey)
@@ -94,6 +102,7 @@ public class ActivitiService {
         Map<String,Object> vars = new HashMap<String,Object>();
         vars.put("users", userNames);
         vars.put("result", Integer.parseInt(result));
+        vars.put("callbackUrl", callbackUrl);
 
         List<String> assigneeList = Arrays.asList(userNames.split(","));
         vars.put("assigneeList", assigneeList);
@@ -114,7 +123,15 @@ public class ActivitiService {
      *
      * <p>描述: 多实例,下一步</p>
      */
-    public void multiCompleteTask(String processKey, String businessKey, String userNames, List<MultiOrgAuditVM> multiOrgAudits, String userId, String result, String remarks) {
+    public void multiCompleteTask(MultiActiCompleteVM actiVm) {
+        String processKey = actiVm.getProcessKey();
+        String businessKey = actiVm.getBusinessKey();
+        String userNames = actiVm.getUserNames();
+        List<MultiOrgAuditVM> multiOrgAudits = actiVm.getMultiOrgAudits();
+        String userId = actiVm.getUserId();
+        String result = actiVm.getResult();
+        String remarks = actiVm.getRemarks();
+        String callbackUrl = actiVm.getCallbackUrl();
 
         Task myTask = taskService.createTaskQuery()
             .processDefinitionKey(processKey)
@@ -136,6 +153,7 @@ public class ActivitiService {
         Map<String,Object> vars = new HashMap<String,Object>();
         vars.put("users", userNames);
         vars.put("result", Integer.parseInt(result));
+        vars.put("callbackUrl", callbackUrl);
 
         List<String> orgInfos = new ArrayList<>();
         for(MultiOrgAuditVM orgInfo : multiOrgAudits) {

+ 10 - 2
src/main/java/com/common/workflow/service/activiti/custom/TaskCompleteCallbackListener.java

@@ -13,8 +13,16 @@ public class TaskCompleteCallbackListener implements TaskListener {
         String result = delegateTask.getVariable("result").toString();
         String bussinessKey = delegateTask.getVariable("businessKey").toString();
         String taskDefinitionKey = delegateTask.getTaskDefinitionKey();
-        if (callbackUrl.length() > 0) {
-            String s = HttpRequest.sendGet(callbackUrl, "result=" + result + "&bussinessKey=" + bussinessKey + "&taskDefinitionKey" + taskDefinitionKey);
+
+        //实例总数
+        String nrOfInstances = delegateTask.getVariable("nrOfInstances").toString();
+        //当前还没有完成的实例
+        String nrOfActiveInstances = delegateTask.getVariable("nrOfActiveInstances").toString();
+        //已经完成的实例个数
+        String nrOfCompletedInstances = delegateTask.getVariable("nrOfCompletedInstances").toString();
+
+        if (callbackUrl.length() > 0 && Integer.parseInt(nrOfActiveInstances) <= 1) {
+            String s = HttpRequest.sendGet(callbackUrl, "result=" + result + "&bussinessKey=" + bussinessKey);
             System.out.println(s);
         }
     }

+ 2 - 4
src/main/java/com/common/workflow/web/rest/ActivitiResource.java

@@ -40,15 +40,13 @@ public class ActivitiResource {
 
     @PostMapping("/task-complete")
     public ResponseEntity<String> taskComplete(@Valid @RequestBody ActiCompleteVM actiVm) {
-        activitiService.completeTask(actiVm.getProcessKey(), actiVm.getBusinessKey(),
-                                        actiVm.getUserNames(), actiVm.getUserId(), actiVm.getResult(), actiVm.getRemarks());
+        activitiService.completeTask(actiVm);
         return ResponseEntity.ok("true");
     }
 
     @PostMapping("/multi-task-complete")
     public ResponseEntity<String> MultiTaskComplete(@Valid @RequestBody MultiActiCompleteVM actiVm) {
-        activitiService.multiCompleteTask(actiVm.getProcessKey(), actiVm.getBusinessKey(),
-            actiVm.getUserNames(), actiVm.getMultiOrgAudits(), actiVm.getUserId(), actiVm.getResult(), actiVm.getRemarks());
+        activitiService.multiCompleteTask(actiVm);
         return ResponseEntity.ok("true");
     }
 

+ 10 - 0
src/main/java/com/common/workflow/web/rest/vm/ActiCompleteVM.java

@@ -16,6 +16,8 @@ public class ActiCompleteVM {
 
     private String remarks;
 
+    private String callbackUrl;
+
     public String getProcessKey() {
         return processKey;
     }
@@ -63,4 +65,12 @@ public class ActiCompleteVM {
     public void setRemarks(String remarks) {
         this.remarks = remarks;
     }
+
+    public String getCallbackUrl() {
+        return callbackUrl;
+    }
+
+    public void setCallbackUrl(String callbackUrl) {
+        this.callbackUrl = callbackUrl;
+    }
 }

+ 10 - 0
src/main/java/com/common/workflow/web/rest/vm/MultiActiCompleteVM.java

@@ -19,6 +19,8 @@ public class MultiActiCompleteVM {
 
     private String remarks;
 
+    private String callbackUrl;
+
     private List<MultiOrgAuditVM> multiOrgAudits = new ArrayList<>();
 
     public String getProcessKey() {
@@ -76,4 +78,12 @@ public class MultiActiCompleteVM {
     public void setMultiOrgAudits(List<MultiOrgAuditVM> multiOrgAudits) {
         this.multiOrgAudits = multiOrgAudits;
     }
+
+    public String getCallbackUrl() {
+        return callbackUrl;
+    }
+
+    public void setCallbackUrl(String callbackUrl) {
+        this.callbackUrl = callbackUrl;
+    }
 }

+ 27 - 32
src/main/resources/processes/oil_audit_apply.bpmn20.xml

@@ -12,37 +12,38 @@
     <userTask id="sid-F067FA1C-2CD1-4F76-9C1C-D8CDA1D8E08F" name="二级单位初审">
       <extensionElements>
         <activiti:taskListener event="create" class="com.common.workflow.service.activiti.custom.MyAssignmentHandler"></activiti:taskListener>
+        <activiti:taskListener event="complete" class="com.common.workflow.service.activiti.custom.TaskCompleteCallbackListener"></activiti:taskListener>
       </extensionElements>
-      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="assigneeList" activiti:elementVariable="assignee"></multiInstanceLoopCharacteristics>
+      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="assigneeList" activiti:elementVariable="assignee">
+        <completionCondition>${result == 0}</completionCondition>
+      </multiInstanceLoopCharacteristics>
     </userTask>
     <sequenceFlow id="sid-E1492287-6937-4732-84DA-1DC63BFF53FD" sourceRef="sid-F5587778-2194-43BD-B5A9-23041685B24E" targetRef="sid-F067FA1C-2CD1-4F76-9C1C-D8CDA1D8E08F"></sequenceFlow>
     <exclusiveGateway id="sid-9066F48C-509C-4652-B697-A7F0E400D57A"></exclusiveGateway>
     <userTask id="sid-79DD1999-5B8D-48D7-9044-B72F48E7049A" name="业务处室专业审核">
       <extensionElements>
         <activiti:taskListener event="create" class="com.common.workflow.service.activiti.custom.MyAssignmentHandler"></activiti:taskListener>
+        <activiti:taskListener event="complete" class="com.common.workflow.service.activiti.custom.TaskCompleteCallbackListener"></activiti:taskListener>
       </extensionElements>
-      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="assigneeList" activiti:elementVariable="assignee"></multiInstanceLoopCharacteristics>
+      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="assigneeList" activiti:elementVariable="assignee">
+        <completionCondition>${result == 0}</completionCondition>
+      </multiInstanceLoopCharacteristics>
     </userTask>
     <exclusiveGateway id="sid-83F82DD8-F857-4908-9A4C-6C62A42F5207"></exclusiveGateway>
     <sequenceFlow id="sid-6859CEC6-ACF1-44CD-9F6D-E2A069698817" sourceRef="sid-79DD1999-5B8D-48D7-9044-B72F48E7049A" targetRef="sid-83F82DD8-F857-4908-9A4C-6C62A42F5207"></sequenceFlow>
-    <userTask id="sid-BDC3C155-2809-4174-850F-15B855DF4755" name="供方交费" activiti:assignee="${users}">
-      <extensionElements>
-        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
-      </extensionElements>
-    </userTask>
-    <endEvent id="sid-5E6E627C-CD70-4CE3-A830-8610FB0ACC89"></endEvent>
     <sequenceFlow id="sid-EDD2C1DA-80DA-492F-897E-FA3D9D595754" sourceRef="sid-F067FA1C-2CD1-4F76-9C1C-D8CDA1D8E08F" targetRef="sid-9066F48C-509C-4652-B697-A7F0E400D57A"></sequenceFlow>
-    <sequenceFlow id="sid-0868B0E0-58BB-454F-A746-3555656A50DD" sourceRef="sid-BDC3C155-2809-4174-850F-15B855DF4755" targetRef="sid-5E6E627C-CD70-4CE3-A830-8610FB0ACC89"></sequenceFlow>
     <sequenceFlow id="sid-1E900E80-E7FB-4E3F-AB4F-84FD36F69163" sourceRef="sid-9066F48C-509C-4652-B697-A7F0E400D57A" targetRef="sid-F5587778-2194-43BD-B5A9-23041685B24E">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${result==0}]]></conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="sid-914F4AEC-3A24-4B7B-8979-CA673FC8822D" sourceRef="sid-9066F48C-509C-4652-B697-A7F0E400D57A" targetRef="sid-79DD1999-5B8D-48D7-9044-B72F48E7049A">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${result==1}]]></conditionExpression>
     </sequenceFlow>
-    <sequenceFlow id="sid-386D9369-2DA0-482E-AF5C-AC4ECA4FBE8A" sourceRef="sid-83F82DD8-F857-4908-9A4C-6C62A42F5207" targetRef="sid-F5587778-2194-43BD-B5A9-23041685B24E">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${result==0}]]></conditionExpression>
+    <endEvent id="sid-0AC9CE7C-C8FA-46E8-8DD6-3D75C898468B" name="通过"></endEvent>
+    <sequenceFlow id="sid-D6E240CB-2B17-48AF-B6AE-C216841F2D4D" sourceRef="sid-83F82DD8-F857-4908-9A4C-6C62A42F5207" targetRef="sid-0AC9CE7C-C8FA-46E8-8DD6-3D75C898468B">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${result==1}]]></conditionExpression>
     </sequenceFlow>
-    <sequenceFlow id="sid-CCF9B21F-81C7-4FC6-8A6E-E440678869F4" sourceRef="sid-83F82DD8-F857-4908-9A4C-6C62A42F5207" targetRef="sid-BDC3C155-2809-4174-850F-15B855DF4755">
+    <intermediateThrowEvent id="sid-32EE47FB-8A0C-4052-B073-347747A2413C" name="不通过"></intermediateThrowEvent>
+    <sequenceFlow id="sid-B68E8B23-15DA-47EB-837B-9830D40B9696" sourceRef="sid-83F82DD8-F857-4908-9A4C-6C62A42F5207" targetRef="sid-32EE47FB-8A0C-4052-B073-347747A2413C">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${result==1}]]></conditionExpression>
     </sequenceFlow>
   </process>
@@ -55,7 +56,7 @@
         <omgdc:Bounds height="80.0" width="100.0" x="95.0" y="138.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape bpmnElement="sid-F067FA1C-2CD1-4F76-9C1C-D8CDA1D8E08F" id="BPMNShape_sid-F067FA1C-2CD1-4F76-9C1C-D8CDA1D8E08F">
-        <omgdc:Bounds height="77.0" width="133.0" x="240.0" y="139.5"></omgdc:Bounds>
+        <omgdc:Bounds height="77.0" width="132.99999999999997" x="240.00000000000003" y="139.5000000000001"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape bpmnElement="sid-9066F48C-509C-4652-B697-A7F0E400D57A" id="BPMNShape_sid-9066F48C-509C-4652-B697-A7F0E400D57A">
         <omgdc:Bounds height="40.0" width="40.0" x="425.0" y="158.0"></omgdc:Bounds>
@@ -66,11 +67,11 @@
       <bpmndi:BPMNShape bpmnElement="sid-83F82DD8-F857-4908-9A4C-6C62A42F5207" id="BPMNShape_sid-83F82DD8-F857-4908-9A4C-6C62A42F5207">
         <omgdc:Bounds height="40.0" width="40.0" x="690.0000000000002" y="158.00000000000006"></omgdc:Bounds>
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="sid-BDC3C155-2809-4174-850F-15B855DF4755" id="BPMNShape_sid-BDC3C155-2809-4174-850F-15B855DF4755">
-        <omgdc:Bounds height="80.0" width="100.0" x="810.0000000000002" y="138.0000000000001"></omgdc:Bounds>
+      <bpmndi:BPMNShape bpmnElement="sid-0AC9CE7C-C8FA-46E8-8DD6-3D75C898468B" id="BPMNShape_sid-0AC9CE7C-C8FA-46E8-8DD6-3D75C898468B">
+        <omgdc:Bounds height="28.0" width="28.0" x="765.0000000000002" y="164.00000000000009"></omgdc:Bounds>
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="sid-5E6E627C-CD70-4CE3-A830-8610FB0ACC89" id="BPMNShape_sid-5E6E627C-CD70-4CE3-A830-8610FB0ACC89">
-        <omgdc:Bounds height="28.0" width="28.0" x="975.0000000000002" y="164.00000000000014"></omgdc:Bounds>
+      <bpmndi:BPMNShape bpmnElement="sid-32EE47FB-8A0C-4052-B073-347747A2413C" id="BPMNShape_sid-32EE47FB-8A0C-4052-B073-347747A2413C">
+        <omgdc:Bounds height="30.0" width="30.0" x="695.0000000000003" y="225.00000000000006"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge bpmnElement="sid-6859CEC6-ACF1-44CD-9F6D-E2A069698817" id="BPMNEdge_sid-6859CEC6-ACF1-44CD-9F6D-E2A069698817">
         <omgdi:waypoint x="644.0" y="178.2461832061069"></omgdi:waypoint>
@@ -86,31 +87,25 @@
         <omgdi:waypoint x="464.57116104868913" y="178.42883895131087"></omgdi:waypoint>
         <omgdi:waypoint x="515.0" y="178.24067164179104"></omgdi:waypoint>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="sid-386D9369-2DA0-482E-AF5C-AC4ECA4FBE8A" id="BPMNEdge_sid-386D9369-2DA0-482E-AF5C-AC4ECA4FBE8A">
-        <omgdi:waypoint x="710.5000000000002" y="197.50000000000006"></omgdi:waypoint>
-        <omgdi:waypoint x="710.5000000000002" y="255.0"></omgdi:waypoint>
-        <omgdi:waypoint x="145.0" y="255.0"></omgdi:waypoint>
-        <omgdi:waypoint x="145.0" y="218.0"></omgdi:waypoint>
+      <bpmndi:BPMNEdge bpmnElement="sid-D6E240CB-2B17-48AF-B6AE-C216841F2D4D" id="BPMNEdge_sid-D6E240CB-2B17-48AF-B6AE-C216841F2D4D">
+        <omgdi:waypoint x="729.6397058823532" y="178.36029411764713"></omgdi:waypoint>
+        <omgdi:waypoint x="765.000372940503" y="178.10218705882852"></omgdi:waypoint>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="sid-EDD2C1DA-80DA-492F-897E-FA3D9D595754" id="BPMNEdge_sid-EDD2C1DA-80DA-492F-897E-FA3D9D595754">
-        <omgdi:waypoint x="373.0" y="178.23920863309354"></omgdi:waypoint>
+        <omgdi:waypoint x="373.0" y="178.2392086330936"></omgdi:waypoint>
         <omgdi:waypoint x="425.427797833935" y="178.42779783393502"></omgdi:waypoint>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="sid-0868B0E0-58BB-454F-A746-3555656A50DD" id="BPMNEdge_sid-0868B0E0-58BB-454F-A746-3555656A50DD">
-        <omgdi:waypoint x="910.0000000000002" y="178.0000000000001"></omgdi:waypoint>
-        <omgdi:waypoint x="975.0000000000002" y="178.00000000000014"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="sid-2E4346F3-7362-419A-A96F-2ED4DCE44A52" id="BPMNEdge_sid-2E4346F3-7362-419A-A96F-2ED4DCE44A52">
         <omgdi:waypoint x="50.0" y="178.0"></omgdi:waypoint>
         <omgdi:waypoint x="95.0" y="178.0"></omgdi:waypoint>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="sid-CCF9B21F-81C7-4FC6-8A6E-E440678869F4" id="BPMNEdge_sid-CCF9B21F-81C7-4FC6-8A6E-E440678869F4">
-        <omgdi:waypoint x="729.5637583892619" y="178.4362416107383"></omgdi:waypoint>
-        <omgdi:waypoint x="810.0000000000002" y="178.16722408026766"></omgdi:waypoint>
+      <bpmndi:BPMNEdge bpmnElement="sid-B68E8B23-15DA-47EB-837B-9830D40B9696" id="BPMNEdge_sid-B68E8B23-15DA-47EB-837B-9830D40B9696">
+        <omgdi:waypoint x="710.3442622950822" y="197.65573770491807"></omgdi:waypoint>
+        <omgdi:waypoint x="710.1219471893329" y="225.0004957120906"></omgdi:waypoint>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="sid-E1492287-6937-4732-84DA-1DC63BFF53FD" id="BPMNEdge_sid-E1492287-6937-4732-84DA-1DC63BFF53FD">
-        <omgdi:waypoint x="195.0" y="178.0"></omgdi:waypoint>
-        <omgdi:waypoint x="240.0" y="178.0"></omgdi:waypoint>
+        <omgdi:waypoint x="195.0" y="178.00000000000003"></omgdi:waypoint>
+        <omgdi:waypoint x="240.00000000000003" y="178.00000000000006"></omgdi:waypoint>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>