From 9c44f5fdbfc8a6329c8a1987e8a733affb231f2f Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期六, 20 六月 2020 15:36:23 +0800
Subject: [PATCH] 工作流部署完成

---
 service-common/src/main/java/com/java110/common/smo/impl/WorkflowInnerServiceSMOImpl.java |  239 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 231 insertions(+), 8 deletions(-)

diff --git a/service-common/src/main/java/com/java110/common/smo/impl/WorkflowInnerServiceSMOImpl.java b/service-common/src/main/java/com/java110/common/smo/impl/WorkflowInnerServiceSMOImpl.java
index 1b68a09..6406445 100644
--- a/service-common/src/main/java/com/java110/common/smo/impl/WorkflowInnerServiceSMOImpl.java
+++ b/service-common/src/main/java/com/java110/common/smo/impl/WorkflowInnerServiceSMOImpl.java
@@ -2,13 +2,29 @@
 
 
 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 @@
     private IUserInnerServiceSMO userInnerServiceSMOImpl;
 
     @Override
-    public List<WorkflowDto> queryWorkflows(@RequestBody  WorkflowDto workflowDto) {
+    public List<WorkflowDto> queryWorkflows(@RequestBody WorkflowDto workflowDto) {
 
         //鏍¢獙鏄惁浼犱簡 鍒嗛〉淇℃伅
 
@@ -64,7 +80,7 @@
      * 浠庣敤鎴峰垪琛ㄤ腑鏌ヨ鐢ㄦ埛锛屽皢鐢ㄦ埛涓殑淇℃伅 鍒锋柊鍒� floor瀵硅薄涓�
      *
      * @param workflow 灏忓尯宸ヤ綔娴佷俊鎭�
-     * @param users 鐢ㄦ埛鍒楄〃
+     * @param users    鐢ㄦ埛鍒楄〃
      */
     private void refreshWorkflow(WorkflowDto workflow, List<UserDto> users) {
         for (UserDto user : users) {
@@ -80,7 +96,7 @@
      * @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 @@
         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;

--
Gitblit v1.8.0