Przeglądaj źródła

工作流部署完成

java110 5 lat temu
rodzic
commit
9c44f5fdbf

+ 12 - 0
java110-bean/src/main/java/com/java110/dto/workflow/WorkflowDto.java

@@ -4,6 +4,7 @@ import com.java110.dto.PageDto;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 /**
  * @ClassName FloorDto
@@ -37,6 +38,9 @@ public class WorkflowDto extends PageDto implements Serializable {
 
     private String statusCd = "0";
 
+    private List<WorkflowStepDto> workflowSteps;
+
+
 
     public String getSkipLevel() {
         return skipLevel;
@@ -118,4 +122,12 @@ public class WorkflowDto extends PageDto implements Serializable {
     public void setFlowTypeName(String flowTypeName) {
         this.flowTypeName = flowTypeName;
     }
+
+    public List<WorkflowStepDto> getWorkflowSteps() {
+        return workflowSteps;
+    }
+
+    public void setWorkflowSteps(List<WorkflowStepDto> workflowSteps) {
+        this.workflowSteps = workflowSteps;
+    }
 }

+ 11 - 0
java110-bean/src/main/java/com/java110/dto/workflow/WorkflowStepDto.java

@@ -4,6 +4,7 @@ import com.java110.dto.PageDto;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 /**
  * @ClassName FloorDto
@@ -25,6 +26,8 @@ public class WorkflowStepDto extends PageDto implements Serializable {
     private String flowId;
     private String seq;
 
+    private List<WorkflowStepStaffDto> workflowStepStaffs;
+
 
     private Date createTime;
 
@@ -95,4 +98,12 @@ public class WorkflowStepDto extends PageDto implements Serializable {
     public void setStatusCd(String statusCd) {
         this.statusCd = statusCd;
     }
+
+    public List<WorkflowStepStaffDto> getWorkflowStepStaffs() {
+        return workflowStepStaffs;
+    }
+
+    public void setWorkflowStepStaffs(List<WorkflowStepStaffDto> workflowStepStaffs) {
+        this.workflowStepStaffs = workflowStepStaffs;
+    }
 }

+ 7 - 0
java110-core/src/main/java/com/java110/core/smo/common/IWorkflowInnerServiceSMO.java

@@ -39,4 +39,11 @@ public interface IWorkflowInnerServiceSMO {
      */
     @RequestMapping(value = "/queryWorkflowsCount", method = RequestMethod.POST)
     int queryWorkflowsCount(@RequestBody WorkflowDto workflowDto);
+
+    /**
+     * @Date:2017/11/24
+     * @Description:创建流程并部署
+     */
+    @RequestMapping(value = "/addFlowDeployment", method = RequestMethod.POST)
+    void addFlowDeployment(@RequestBody WorkflowDto workflowDto);
 }

+ 5 - 0
pom.xml

@@ -494,6 +494,11 @@
                 <artifactId>activiti-spring</artifactId>
                 <version>6.0.0</version>
             </dependency>
+            <dependency>
+                <groupId>org.activiti</groupId>
+                <artifactId>activiti-bpmn-layout</artifactId>
+                <version>6.0.0.RC1</version>
+            </dependency>
 
             <dependency>
                 <groupId>com.tencentcloudapi</groupId>

+ 22 - 2
service-api/src/main/java/com/java110/api/listener/workflow/UpdateWorkflowListener.java

@@ -10,8 +10,10 @@ import com.java110.core.annotation.Java110Listener;
 import com.java110.core.context.DataFlowContext;
 import com.java110.core.event.service.api.ServiceDataFlowEvent;
 import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.core.smo.common.IWorkflowInnerServiceSMO;
 import com.java110.core.smo.common.IWorkflowStepInnerServiceSMO;
 import com.java110.core.smo.common.IWorkflowStepStaffInnerServiceSMO;
+import com.java110.dto.workflow.WorkflowDto;
 import com.java110.dto.workflow.WorkflowStepDto;
 import com.java110.dto.workflow.WorkflowStepStaffDto;
 import com.java110.po.workflow.WorkflowPo;
@@ -20,9 +22,12 @@ import com.java110.po.workflow.WorkflowStepStaffPo;
 import com.java110.utils.constant.BusinessTypeConstant;
 import com.java110.utils.constant.ServiceCodeWorkflowConstant;
 import com.java110.utils.util.Assert;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.vo.ResultVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpMethod;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -44,6 +49,9 @@ public class UpdateWorkflowListener extends AbstractServiceApiPlusListener {
     @Autowired
     private IWorkflowStepInnerServiceSMO workflowStepInnerServiceSMOImpl;
 
+    @Autowired
+    private IWorkflowInnerServiceSMO workflowInnerServiceSMOImpl;
+
     @Override
     protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) {
 
@@ -125,11 +133,14 @@ public class UpdateWorkflowListener extends AbstractServiceApiPlusListener {
         workflowPo.setDescrible(reqJson.getString("describle"));
         super.update(context, workflowPo, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_WORKFLOW);
 
+        WorkflowDto workflowDto = BeanConvertUtil.covertBean(workflowPo, WorkflowDto.class);
+
         //保存 工作流程步骤
         JSONArray steps = reqJson.getJSONArray("steps");
         JSONObject step = null;
         JSONObject subStaff = null;
         WorkflowStepStaffPo workflowStepStaffPo = null;
+        List<WorkflowStepDto> tmpWorkflowStepDtos = new ArrayList<>();
         for (int stepIndex = 0; stepIndex < steps.size(); stepIndex++) {
             step = steps.getJSONObject(stepIndex);
             WorkflowStepPo workflowStepPo = new WorkflowStepPo();
@@ -140,8 +151,9 @@ public class UpdateWorkflowListener extends AbstractServiceApiPlusListener {
             workflowStepPo.setType(step.getString("type"));
             workflowStepPo.setStoreId(reqJson.getString("storeId"));
             super.insert(context, workflowStepPo, BusinessTypeConstant.BUSINESS_TYPE_SAVE_WORKFLOW_STEP);
-
+            WorkflowStepDto tmpWorkflowStepDto = BeanConvertUtil.covertBean(workflowStepPo, WorkflowStepDto.class);
             //正常流程
+            List<WorkflowStepStaffDto> workflowStepStaffDtos = new ArrayList<>();
             if (WorkflowStepDto.TYPE_NORMAL.equals(step.getString("type"))) {
                 workflowStepStaffPo = new WorkflowStepStaffPo();
                 workflowStepStaffPo.setWssId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_wssId));
@@ -150,6 +162,7 @@ public class UpdateWorkflowListener extends AbstractServiceApiPlusListener {
                 workflowStepStaffPo.setStaffName(step.getString("staffName"));
                 workflowStepStaffPo.setStepId(workflowStepPo.getStepId());
                 super.insert(context, workflowStepStaffPo, BusinessTypeConstant.BUSINESS_TYPE_SAVE_WORKFLOW_STEP_STAFF);
+                workflowStepStaffDtos.add(BeanConvertUtil.covertBean(workflowStepStaffPo, WorkflowStepStaffDto.class));
                 continue;
             }
 
@@ -163,12 +176,19 @@ public class UpdateWorkflowListener extends AbstractServiceApiPlusListener {
                 workflowStepStaffPo.setStaffName(subStaff.getString("staffName"));
                 workflowStepStaffPo.setStepId(workflowStepPo.getStepId());
                 super.insert(context, workflowStepStaffPo, BusinessTypeConstant.BUSINESS_TYPE_SAVE_WORKFLOW_STEP_STAFF);
+                workflowStepStaffDtos.add(BeanConvertUtil.covertBean(workflowStepStaffPo, WorkflowStepStaffDto.class));
             }
+
+            tmpWorkflowStepDto.setWorkflowStepStaffs(workflowStepStaffDtos);
+
+            tmpWorkflowStepDtos.add(tmpWorkflowStepDto);
         }
         //提交
         commit(context);
 
-
+        workflowDto.setWorkflowSteps(tmpWorkflowStepDtos);
+        workflowInnerServiceSMOImpl.addFlowDeployment(workflowDto);
+        context.setResponseEntity(ResultVo.createResponseEntity(ResultVo.CODE_OK, ResultVo.MSG_OK));
     }
 
     private void deleteWorkflowStepAndStaff(DataFlowContext context, JSONObject reqJson, WorkflowStepDto workflowStepDto) {

+ 4 - 0
service-common/pom.xml

@@ -30,6 +30,10 @@
             <groupId>org.activiti</groupId>
             <artifactId>activiti-spring</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.activiti</groupId>
+            <artifactId>activiti-bpmn-layout</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 231 - 8
service-common/src/main/java/com/java110/common/smo/impl/WorkflowInnerServiceSMOImpl.java

@@ -2,13 +2,29 @@ package com.java110.common.smo.impl;
 
 
 import com.java110.common.dao.IWorkflowServiceDao;
-import com.java110.core.smo.common.IWorkflowInnerServiceSMO;
-import com.java110.dto.workflow.WorkflowDto;
-import com.java110.utils.util.BeanConvertUtil;
 import com.java110.core.base.smo.BaseServiceSMO;
-import com.java110.dto.user.UserDto;
+import com.java110.core.smo.common.IWorkflowInnerServiceSMO;
 import com.java110.core.smo.user.IUserInnerServiceSMO;
 import com.java110.dto.PageDto;
+import com.java110.dto.user.UserDto;
+import com.java110.dto.workflow.WorkflowDto;
+import com.java110.dto.workflow.WorkflowStepDto;
+import com.java110.dto.workflow.WorkflowStepStaffDto;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.StringUtil;
+import org.activiti.bpmn.BpmnAutoLayout;
+import org.activiti.bpmn.model.BpmnModel;
+import org.activiti.bpmn.model.EndEvent;
+import org.activiti.bpmn.model.ExclusiveGateway;
+import org.activiti.bpmn.model.ParallelGateway;
+import org.activiti.bpmn.model.Process;
+import org.activiti.bpmn.model.SequenceFlow;
+import org.activiti.bpmn.model.StartEvent;
+import org.activiti.bpmn.model.UserTask;
+import org.activiti.engine.ProcessEngine;
+import org.activiti.engine.ProcessEngines;
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.repository.Deployment;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
@@ -34,7 +50,7 @@ public class WorkflowInnerServiceSMOImpl extends BaseServiceSMO implements IWork
     private IUserInnerServiceSMO userInnerServiceSMOImpl;
 
     @Override
-    public List<WorkflowDto> queryWorkflows(@RequestBody  WorkflowDto workflowDto) {
+    public List<WorkflowDto> queryWorkflows(@RequestBody WorkflowDto workflowDto) {
 
         //校验是否传了 分页信息
 
@@ -64,7 +80,7 @@ public class WorkflowInnerServiceSMOImpl extends BaseServiceSMO implements IWork
      * 从用户列表中查询用户,将用户中的信息 刷新到 floor对象中
      *
      * @param workflow 小区工作流信息
-     * @param users 用户列表
+     * @param users    用户列表
      */
     private void refreshWorkflow(WorkflowDto workflow, List<UserDto> users) {
         for (UserDto user : users) {
@@ -80,7 +96,7 @@ public class WorkflowInnerServiceSMOImpl extends BaseServiceSMO implements IWork
      * @param workflows 小区楼信息
      * @return 批量userIds 信息
      */
-     private String[] getUserIds(List<WorkflowDto> workflows) {
+    private String[] getUserIds(List<WorkflowDto> workflows) {
         List<String> userIds = new ArrayList<String>();
         for (WorkflowDto workflow : workflows) {
             userIds.add(workflow.getFlowId());
@@ -89,9 +105,216 @@ public class WorkflowInnerServiceSMOImpl extends BaseServiceSMO implements IWork
         return userIds.toArray(new String[userIds.size()]);
     }
 
+    /**
+     * @Date:2017/11/24
+     * @Description:创建流程并部署
+     */
+    protected void addFlowDeployment(@RequestBody WorkflowDto workflowDto) {
+
+        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
+
+//        RepositoryService repositoryService  = processEngine.getRepositoryService();
+//        repositoryService.deleteDeployment("1");
+
+        // 1. 建立模型
+        BpmnModel model = new BpmnModel();
+        Process process = new Process();
+        model.addProcess(process);
+        process.setId(workflowDto.getFlowId());
+        process.setName(workflowDto.getFlowName());
+        process.setDocumentation(workflowDto.getDescrible());
+        //添加流程
+        //开始节点
+        process.addFlowElement(createStartEvent());
+        List<WorkflowStepDto> workflowStepDtos = workflowDto.getWorkflowSteps();
+        for (int i = 0; i < workflowStepDtos.size(); i++) {
+            WorkflowStepDto step = workflowStepDtos.get(i);
+            //判断是否会签
+            if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(step.getType())) {
+                //会签
+                //加入并行网关-分支
+                process.addFlowElement(createParallelGateway("parallelGateway-fork" + i, "并行网关-分支" + i));
+                //获取角色下所有用户
+                List<WorkflowStepStaffDto> userList = step.getWorkflowStepStaffs();
+                for (int u = 0; u < userList.size(); u++) {
+                    //并行网关分支的审核节点
+                    process.addFlowElement(createUserTask("userTask" + i + u, "并行网关分支用户审核节点" + i + u, userList.get(u).getStaffId()));
+                }
+                //并行网关-汇聚
+                process.addFlowElement(createParallelGateway("parallelGateway-join" + i, "并行网关到-汇聚" + i));
+
+            } else {
+                //普通流转
+                //审核节点
+                process.addFlowElement(createGroupTask("task" + i, "组审核节点" + i, step.getWorkflowStepStaffs().get(0).getStaffId()));
+                //回退节点
+                process.addFlowElement(createUserTask("repulse" + i, "回退节点" + i, "${startUserId}"));
+            }
+        }
+        //结束节点
+        process.addFlowElement(createEndEvent());
+
+        //连线
+        for (int y = 0; y < workflowStepDtos.size(); y++) {
+            WorkflowStepDto step = workflowStepDtos.get(y);
+            //是否会签
+            if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(step.getType())) {
+                //会签
+                //判断是否第一个节点
+                if (y == 0) {
+                    //开始节点和并行网关-分支连线
+                    process.addFlowElement(createSequenceFlow("startEvent", "parallelGateway-fork" + y, "开始节点到并行网关-分支" + y, ""));
+                } else {
+                    //审核节点或者并行网关-汇聚到并行网关-分支
+                    //判断上一个节点是否是会签
+                    if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(workflowStepDtos.get(y - 1).getType())) {
+                        process.addFlowElement(createSequenceFlow("parallelGateway-join" + (y - 1), "parallelGateway-fork" + y, "并行网关-汇聚到并行网关-分支" + y, ""));
+                    } else {
+                        process.addFlowElement(createSequenceFlow("task" + (y - 1), "parallelGateway-fork" + y, "上一个审核节点到并行网关-分支" + y, ""));
+                    }
+                }
+                //并行网关-分支和会签用户连线,会签用户和并行网关-汇聚连线
+                List<WorkflowStepStaffDto> userList = step.getWorkflowStepStaffs();
+                for (int u = 0; u < userList.size(); u++) {
+                    process.addFlowElement(createSequenceFlow("parallelGateway-fork" + y, "userTask" + y + u, "并行网关-分支到会签用户" + y + u, ""));
+                    process.addFlowElement(createSequenceFlow("userTask" + y + u, "parallelGateway-join" + y, "会签用户到并行网关-汇聚", ""));
+                }
+                //最后一个节点  并行网关-汇聚到结束节点
+                if (y == (userList.size() - 1)) {
+                    process.addFlowElement(createSequenceFlow("parallelGateway-join" + y, "endEvent", "并行网关-汇聚到结束节点", ""));
+                }
+            } else {
+                //普通流转
+                //第一个节点
+                if (y == 0) {
+                    //开始节点和审核节点1
+                    process.addFlowElement(createSequenceFlow("startEvent", "task" + y, "开始节点到审核节点" + y, ""));
+                } else {
+                    //判断上一个节点是否会签
+                    if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(workflowStepDtos.get(y - 1).getType())) {
+                        //会签
+                        //并行网关-汇聚到审核节点
+                        process.addFlowElement(createSequenceFlow("parallelGateway-join" + (y - 1), "task" + y, "并行网关-汇聚到审核节点" + y, ""));
+                    } else {
+                        //普通
+                        process.addFlowElement(createSequenceFlow("task" + (y - 1), "task" + y, "审核节点" + (y - 1) + "到审核节点" + y, "${flag=='true'}"));
+                    }
+                }
+                //是否最后一个节点
+                if (y == (workflowStepDtos.size() - 1)) {
+                    //审核节点到结束节点
+                    process.addFlowElement(createSequenceFlow("task" + y, "endEvent", "审核节点" + y + "到结束节点", "${flag=='true'}"));
+                }
+                //审核节点到回退节点
+                process.addFlowElement(createSequenceFlow("task" + y, "repulse" + y, "审核不通过-打回" + y, "${flag=='false'}"));
+                process.addFlowElement(createSequenceFlow("repulse" + y, "task" + y, "回退节点到审核节点" + y, ""));
+            }
+        }
+
+        // 2. 生成的图形信息
+        new BpmnAutoLayout(model).execute();
+
+        // 3. 部署流程
+        Deployment deployment = processEngine.getRepositoryService().createDeployment().addBpmnModel(process.getId() + ".bpmn", model).name(process.getId() + "_deployment").deploy();
+
+        //        // 4. 启动一个流程实例
+//        ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(process.getId());
+//
+//        // 5. 获取流程任务
+//        List<Task> tasks = processEngine.getTaskService().createTaskQuery().processInstanceId(processInstance.getId()).list();
+//        try{
+//            // 6. 将流程图保存到本地文件
+//            InputStream processDiagram = processEngine.getRepositoryService().getProcessDiagram(processInstance.getProcessDefinitionId());
+//            FileUtils.copyInputStreamToFile(processDiagram, new File("/deployments/"+process.getId()+".png"));
+//
+//            // 7. 保存BPMN.xml到本地文件
+//            InputStream processBpmn = processEngine.getRepositoryService().getResourceAsStream(deployment.getId(), process.getId()+".bpmn");
+//            FileUtils.copyInputStreamToFile(processBpmn,new File("/deployments/"+process.getId()+".bpmn"));
+//        }catch (Exception e){
+//            e.printStackTrace();
+//        }
+
+        System.out.println(".........end...");
+    }
+
+
+    //任务节点-组
+    protected UserTask createGroupTask(String id, String name, String candidateGroup) {
+        List<String> candidateGroups = new ArrayList<String>();
+        candidateGroups.add(candidateGroup);
+        UserTask userTask = new UserTask();
+        userTask.setName(name);
+        userTask.setId(id);
+        userTask.setCandidateGroups(candidateGroups);
+        return userTask;
+    }
+
+    //任务节点-用户
+    protected UserTask createUserTask(String id, String name, String userPkno) {
+        List<String> candidateUsers = new ArrayList<String>();
+        candidateUsers.add(userPkno);
+        UserTask userTask = new UserTask();
+        userTask.setName(name);
+        userTask.setId(id);
+        userTask.setCandidateUsers(candidateUsers);
+        return userTask;
+    }
+
+    //任务节点-锁定者
+    protected UserTask createAssigneeTask(String id, String name, String assignee) {
+        UserTask userTask = new UserTask();
+        userTask.setName(name);
+        userTask.setId(id);
+        userTask.setAssignee(assignee);
+        return userTask;
+    }
+
+    /*连线*/
+    protected SequenceFlow createSequenceFlow(String from, String to, String name, String conditionExpression) {
+        SequenceFlow flow = new SequenceFlow();
+        flow.setSourceRef(from);
+        flow.setTargetRef(to);
+        flow.setName(name);
+        if (!StringUtil.isEmpty(conditionExpression)) {
+            flow.setConditionExpression(conditionExpression);
+        }
+        return flow;
+    }
+
+    //排他网关
+    protected ExclusiveGateway createExclusiveGateway(String id, String name) {
+        ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
+        exclusiveGateway.setId(id);
+        exclusiveGateway.setName(name);
+        return exclusiveGateway;
+    }
+
+    //并行网关
+    protected ParallelGateway createParallelGateway(String id, String name) {
+        ParallelGateway gateway = new ParallelGateway();
+        gateway.setId(id);
+        gateway.setName(name);
+        return gateway;
+    }
+
+    //开始节点
+    protected StartEvent createStartEvent() {
+        StartEvent startEvent = new StartEvent();
+        startEvent.setId("startEvent");
+        return startEvent;
+    }
+
+    /*结束节点*/
+    protected EndEvent createEndEvent() {
+        EndEvent endEvent = new EndEvent();
+        endEvent.setId("endEvent");
+        return endEvent;
+    }
+
     @Override
     public int queryWorkflowsCount(@RequestBody WorkflowDto workflowDto) {
-        return workflowServiceDaoImpl.queryWorkflowsCount(BeanConvertUtil.beanCovertMap(workflowDto));    }
+        return workflowServiceDaoImpl.queryWorkflowsCount(BeanConvertUtil.beanCovertMap(workflowDto));
+    }
 
     public IWorkflowServiceDao getWorkflowServiceDaoImpl() {
         return workflowServiceDaoImpl;