浏览代码

activiti工作流整合

wangliang 4 年之前
父节点
当前提交
5e6e0935b5

+ 10 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ActivitiService.java

@@ -1,5 +1,8 @@
 package com.qmth.distributed.print.business.service;
 
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
 import java.util.Map;
 
 /**
@@ -18,6 +21,13 @@ public interface ActivitiService {
      */
     void createDeployment(String processFileName);
 
+    /**
+     * 上传流程文件
+     *
+     * @param file
+     */
+    void uploadDeployment(MultipartFile file) throws IOException;
+
     /**
      * 启动流程
      *

+ 22 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java

@@ -1,6 +1,8 @@
 package com.qmth.distributed.print.business.service.impl;
 
 import com.qmth.distributed.print.business.service.ActivitiService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import org.activiti.engine.ProcessEngine;
 import org.activiti.engine.RepositoryService;
 import org.activiti.engine.RuntimeService;
 import org.activiti.engine.TaskService;
@@ -10,8 +12,11 @@ import org.activiti.engine.task.Task;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -45,7 +50,19 @@ public class ActivitiServiceImpl implements ActivitiService {
     @Override
     public void createDeployment(String processFileName) {
         DeploymentBuilder builder = repositoryService.createDeployment();
-        builder.addClasspathResource("processes/" + processFileName);
+        builder.addClasspathResource(SystemConstant.PROCESSES + File.separator + processFileName);
+        builder.deploy();
+    }
+
+    /**
+     * 上传流程文件
+     *
+     * @param file
+     */
+    @Override
+    public void uploadDeployment(MultipartFile file) throws IOException {
+        DeploymentBuilder builder = repositoryService.createDeployment();
+        builder.addInputStream(file.getOriginalFilename(), file.getInputStream());
         builder.deploy();
     }
 
@@ -56,9 +73,10 @@ public class ActivitiServiceImpl implements ActivitiService {
     public void getTaskList() {
         //获取待办的一些信息,这里可以传入需要查询的用户,
         //我这里查询的所有待办
-        List<Task> tasks = taskService.createTaskQuery().list();
+        List<Task> tasks = taskService.createTaskQuery().taskAssignee("test123").orderByTaskCreateTime().desc().list();
+//        Task task1 = taskService.createTaskQuery().processInstanceId("22531").singleResult();
         for (Task t : tasks) {
-            log.info("assignee:{},createTime:{},id:{},name:{},processInstanceId:{},taskDefinitionKey:{},parentTaskId:{}", t.getAssignee(), t.getCreateTime(), t.getId(), t.getName(), t.getProcessInstanceId(), t.getTaskDefinitionKey(), t.getParentTaskId());
+            log.info("assignee:{},createTime:{},id:{},getProcessDefinitionId:{},name:{},processInstanceId:{},taskDefinitionKey:{},parentTaskId:{}", t.getAssignee(), t.getCreateTime(), t.getId(), t.getProcessDefinitionId(), t.getName(), t.getProcessInstanceId(), t.getTaskDefinitionKey(), t.getParentTaskId());
         }
     }
 
@@ -76,7 +94,7 @@ public class ActivitiServiceImpl implements ActivitiService {
         } else {
             processInstance = runtimeService.startProcessInstanceByKey(processKey);
         }
-        log.info("流程id:{}", processInstance.getId());
+        log.info("流程id:{},processInstanceId:{},processDefinitionId:{},processDefinitionKey:{}", processInstance.getId(), processInstance.getProcessInstanceId(), processInstance.getProcessDefinitionId(), processInstance.getProcessDefinitionKey());
     }
 
     /**

+ 10 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/ActivitiController.java

@@ -8,12 +8,15 @@ import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -40,6 +43,13 @@ public class ActivitiController {
         return ResultUtil.ok();
     }
 
+    @ApiOperation(value = "上传流程")
+    @RequestMapping(value = "/updateDeployment", method = RequestMethod.POST)
+    public Result uploadDeployment(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws IOException {
+        activitiService.uploadDeployment(file);
+        return ResultUtil.ok();
+    }
+
     @ApiOperation(value = "启动流程")
     @RequestMapping(value = "/startActivity", method = RequestMethod.POST)
     public Result startActivity(@RequestParam(value = "processKey") String processKey) {

+ 21 - 0
distributed-print/src/main/java/com/qmth/distributed/print/config/ActivitiIdGenerator.java

@@ -0,0 +1,21 @@
+package com.qmth.distributed.print.config;
+
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import org.activiti.engine.impl.cfg.IdGenerator;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: activiti 分布式id
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/7/14
+ */
+@Component
+public class ActivitiIdGenerator implements IdGenerator {
+
+    @Override
+    public String getNextId() {
+        return String.valueOf(SystemConstant.getDbUuid());
+    }
+}

+ 30 - 0
distributed-print/src/main/java/com/qmth/distributed/print/config/MyProcessEngineConfigurator.java

@@ -0,0 +1,30 @@
+package com.qmth.distributed.print.config;
+
+import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: activiti 分布式id配置
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/7/14
+ */
+@Configuration
+public class MyProcessEngineConfigurator {
+
+    @Resource
+    ActivitiIdGenerator activitiIdGenerator;
+
+    @Bean
+    public ProcessEngineConfigurationImpl processEngineConfigurationImpl(ProcessEngineConfigurationImpl processEngineConfigurationImpl) {
+        //设置ProcessEngineConfigurationImpl里的uuidGenerator
+        processEngineConfigurationImpl.setIdGenerator(activitiIdGenerator);
+        //设置DbSqlSessionFactory的uuidGenerator,否则流程id,任务id,实例id依然是用DbIdGenerator生成
+        processEngineConfigurationImpl.getDbSqlSessionFactory().setIdGenerator(activitiIdGenerator);
+        return processEngineConfigurationImpl;
+    }
+}

+ 0 - 126
distributed-print/src/main/resources/processes/MyProcess2.bpmn

@@ -1,126 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
-  <process id="myProcess2" name="My process" isExecutable="true">
-    <startEvent id="startevent1" name="Start"></startEvent>
-    <userTask id="usertask1" name="请假申请" activiti:assignee="${userId}"></userTask>
-    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
-    <endEvent id="endevent1" name="End"></endEvent>
-    <userTask id="managerApprove" name="主管审批" activiti:assignee="${approveId}"></userTask>
-    <userTask id="bossApprove" name="总监审批" activiti:assignee="${assigneeId}"></userTask>
-    <exclusiveGateway id="exclusivegateway6" name="主管审批"></exclusiveGateway>
-    <sequenceFlow id="flow24" sourceRef="managerApprove" targetRef="exclusivegateway6"></sequenceFlow>
-    <sequenceFlow id="flow25" name="不通过" sourceRef="exclusivegateway6" targetRef="endevent1">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 0}]]></conditionExpression>
-    </sequenceFlow>
-    <sequenceFlow id="flow26" name="通过" sourceRef="exclusivegateway6" targetRef="bossApprove">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 1}]]></conditionExpression>
-    </sequenceFlow>
-    <exclusiveGateway id="exclusivegateway7" name="总监审批"></exclusiveGateway>
-    <sequenceFlow id="flow27" sourceRef="bossApprove" targetRef="exclusivegateway7"></sequenceFlow>
-    <sequenceFlow id="flow28" name="驳回" sourceRef="exclusivegateway7" targetRef="usertask1">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${assignee == 0}]]></conditionExpression>
-    </sequenceFlow>
-    <sequenceFlow id="flow29" name="通过" sourceRef="exclusivegateway7" targetRef="endevent1">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${assignee == 1}]]></conditionExpression>
-    </sequenceFlow>
-    <exclusiveGateway id="exclusivegateway8" name="用户申请"></exclusiveGateway>
-    <sequenceFlow id="flow30" sourceRef="usertask1" targetRef="exclusivegateway8"></sequenceFlow>
-    <sequenceFlow id="flow31" name="通过" sourceRef="exclusivegateway8" targetRef="managerApprove">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${user == 1}]]></conditionExpression>
-    </sequenceFlow>
-    <sequenceFlow id="flow32" name="不通过" sourceRef="exclusivegateway8" targetRef="endevent1">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${user == 0}]]></conditionExpression>
-    </sequenceFlow>
-  </process>
-  <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess2">
-    <bpmndi:BPMNPlane bpmnElement="myProcess2" id="BPMNPlane_myProcess2">
-      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
-        <omgdc:Bounds height="35.0" width="35.0" x="247.0" y="1.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
-        <omgdc:Bounds height="55.0" width="105.0" x="212.0" y="90.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
-        <omgdc:Bounds height="35.0" width="35.0" x="243.0" y="350.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="managerApprove" id="BPMNShape_managerApprove">
-        <omgdc:Bounds height="55.0" width="105.0" x="90.0" y="220.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="bossApprove" id="BPMNShape_bossApprove">
-        <omgdc:Bounds height="55.0" width="105.0" x="330.0" y="220.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="exclusivegateway6" id="BPMNShape_exclusivegateway6">
-        <omgdc:Bounds height="40.0" width="40.0" x="240.0" y="228.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="exclusivegateway7" id="BPMNShape_exclusivegateway7">
-        <omgdc:Bounds height="40.0" width="40.0" x="480.0" y="228.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="exclusivegateway8" id="BPMNShape_exclusivegateway8">
-        <omgdc:Bounds height="40.0" width="40.0" x="122.0" y="97.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
-        <omgdi:waypoint x="264.0" y="36.0"></omgdi:waypoint>
-        <omgdi:waypoint x="264.0" y="90.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow24" id="BPMNEdge_flow24">
-        <omgdi:waypoint x="195.0" y="247.0"></omgdi:waypoint>
-        <omgdi:waypoint x="240.0" y="248.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow25" id="BPMNEdge_flow25">
-        <omgdi:waypoint x="260.0" y="268.0"></omgdi:waypoint>
-        <omgdi:waypoint x="260.0" y="350.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="16.0" width="100.0" x="260.0" y="268.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow26" id="BPMNEdge_flow26">
-        <omgdi:waypoint x="280.0" y="248.0"></omgdi:waypoint>
-        <omgdi:waypoint x="330.0" y="247.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="16.0" width="100.0" x="280.0" y="248.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow27" id="BPMNEdge_flow27">
-        <omgdi:waypoint x="435.0" y="247.0"></omgdi:waypoint>
-        <omgdi:waypoint x="480.0" y="248.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow28" id="BPMNEdge_flow28">
-        <omgdi:waypoint x="500.0" y="228.0"></omgdi:waypoint>
-        <omgdi:waypoint x="500.0" y="117.0"></omgdi:waypoint>
-        <omgdi:waypoint x="317.0" y="117.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="16.0" width="100.0" x="500.0" y="228.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow29" id="BPMNEdge_flow29">
-        <omgdi:waypoint x="500.0" y="268.0"></omgdi:waypoint>
-        <omgdi:waypoint x="499.0" y="367.0"></omgdi:waypoint>
-        <omgdi:waypoint x="278.0" y="367.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="16.0" width="100.0" x="500.0" y="268.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow30" id="BPMNEdge_flow30">
-        <omgdi:waypoint x="212.0" y="117.0"></omgdi:waypoint>
-        <omgdi:waypoint x="162.0" y="117.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow31" id="BPMNEdge_flow31">
-        <omgdi:waypoint x="142.0" y="137.0"></omgdi:waypoint>
-        <omgdi:waypoint x="142.0" y="220.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="16.0" width="100.0" x="142.0" y="137.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow32" id="BPMNEdge_flow32">
-        <omgdi:waypoint x="122.0" y="117.0"></omgdi:waypoint>
-        <omgdi:waypoint x="54.0" y="117.0"></omgdi:waypoint>
-        <omgdi:waypoint x="54.0" y="248.0"></omgdi:waypoint>
-        <omgdi:waypoint x="54.0" y="367.0"></omgdi:waypoint>
-        <omgdi:waypoint x="243.0" y="367.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="16.0" width="100.0" x="122.0" y="117.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-    </bpmndi:BPMNPlane>
-  </bpmndi:BPMNDiagram>
-</definitions>

+ 7 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -149,8 +149,8 @@ public class SystemConstant {
     /**
      * excel相关
      */
-    public static String XLSX = "xlsx";
-    public static String XLS = "xls";
+    public static final String XLSX = "xlsx";
+    public static final String XLS = "xls";
 
     /**
      * 线程池配置
@@ -172,6 +172,11 @@ public class SystemConstant {
     public static final int UNMATCHED_ACK_TYPE = 5;//BROKER间转发消息时,接收端"拒绝"消息
     public static final int UNSEND_ACK_TYPE = 6;//消息未发出
 
+    /**
+     * activiti
+     */
+    public static final String PROCESSES = "processes";
+
     /**
      * 初始化附件文件路径
      */