From 87f258059769f89f0eb4eab287fd6c98befd8cdc Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期五, 15 七月 2022 19:42:16 +0800
Subject: [PATCH] 优化代码

---
 service-common/src/main/java/com/java110/common/smo/impl/WorkflowInnerServiceSMOImpl.java |  581 ++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 465 insertions(+), 116 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
old mode 100644
new mode 100755
index f92c73a..314b6bc
--- 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
@@ -1,34 +1,63 @@
 package com.java110.common.smo.impl;
 
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.java110.common.dao.IWorkflowServiceDao;
 import com.java110.core.base.smo.BaseServiceSMO;
-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.WorkflowAuditInfoDto;
 import com.java110.dto.workflow.WorkflowDto;
+import com.java110.dto.workflow.WorkflowModelDto;
 import com.java110.dto.workflow.WorkflowStepDto;
 import com.java110.dto.workflow.WorkflowStepStaffDto;
+import com.java110.intf.common.IWorkflowInnerServiceSMO;
+import com.java110.intf.user.IUserInnerServiceSMO;
+import com.java110.utils.util.Base64Convert;
 import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.DateUtil;
 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.FlowNode;
 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.editor.constants.ModelDataJsonConstants;
+import org.activiti.engine.*;
+import org.activiti.engine.history.HistoricActivityInstance;
+import org.activiti.engine.history.HistoricActivityInstanceQuery;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.impl.RepositoryServiceImpl;
+import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
 import org.activiti.engine.repository.Deployment;
+import org.activiti.engine.repository.Model;
+import org.activiti.engine.task.Comment;
+import org.activiti.image.ProcessDiagramGenerator;
+import org.apache.batik.transcoder.TranscoderInput;
+import org.apache.batik.transcoder.TranscoderOutput;
+import org.apache.batik.transcoder.image.PNGTranscoder;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import com.java110.core.log.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -41,12 +70,28 @@
  **/
 @RestController
 public class WorkflowInnerServiceSMOImpl extends BaseServiceSMO implements IWorkflowInnerServiceSMO {
+    private static final Logger logger = LoggerFactory.getLogger(BaseServiceSMO.class);
 
     @Autowired
     private IWorkflowServiceDao workflowServiceDaoImpl;
 
     @Autowired
     private IUserInnerServiceSMO userInnerServiceSMOImpl;
+
+    @Autowired
+    private RuntimeService runtimeService;
+
+    @Autowired
+    private HistoryService historyService;
+
+    @Autowired
+    private RepositoryService repositoryService;
+
+    @Autowired
+    private TaskService taskService;
+
+    @Autowired
+    private ObjectMapper objectMapper;
 
     @Override
     public List<WorkflowDto> queryWorkflows(@RequestBody WorkflowDto workflowDto) {
@@ -104,136 +149,305 @@
         return userIds.toArray(new String[userIds.size()]);
     }
 
+    public String getRunWorkflowImage(@RequestBody String businessKey) {
+
+        String image = "";
+        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
+        try {
+            //  鑾峰彇鍘嗗彶娴佺▼瀹炰緥
+            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
+                    .processInstanceBusinessKey(businessKey).singleResult();
+
+            if (historicProcessInstance == null) {
+                //throw new BusinessException("鑾峰彇娴佺▼瀹炰緥ID[" + pProcessInstanceId + "]瀵瑰簲鐨勫巻鍙叉祦绋嬪疄渚嬪け璐ワ紒");
+            } else {
+                // 鑾峰彇娴佺▼瀹氫箟
+                ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
+                        .getDeployedProcessDefinition(historicProcessInstance.getProcessDefinitionId());
+
+                // 鑾峰彇娴佺▼鍘嗗彶涓凡鎵ц鑺傜偣锛屽苟鎸夌収鑺傜偣鍦ㄦ祦绋嬩腑鎵ц鍏堝悗椤哄簭鎺掑簭
+                List<HistoricActivityInstance> historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery()
+                        .processInstanceId(historicProcessInstance.getId()).orderByHistoricActivityInstanceId().asc().list();
+
+                // 宸叉墽琛岀殑鑺傜偣ID闆嗗悎
+                List<String> executedActivityIdList = new ArrayList<String>();
+                int index = 1;
+                //logger.info("鑾峰彇宸茬粡鎵ц鐨勮妭鐐笽D");
+                for (HistoricActivityInstance activityInstance : historicActivityInstanceList) {
+                    executedActivityIdList.add(activityInstance.getActivityId());
+
+                    //logger.info("绗琜" + index + "]涓凡鎵ц鑺傜偣=" + activityInstance.getActivityId() + " : " +activityInstance.getActivityName());
+                    index++;
+                }
+
+                BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());
+
+                // 宸叉墽琛岀殑绾块泦鍚�
+                List<String> flowIds = new ArrayList<String>();
+                // 鑾峰彇娴佺▼璧拌繃鐨勭嚎 (getHighLightedFlows鏄笅闈㈢殑鏂规硶)
+                flowIds = getHighLightedFlows(bpmnModel, processDefinition, historicActivityInstanceList);
+
+
+                // 鑾峰彇娴佺▼鍥惧浘鍍忓瓧绗︽祦
+                ProcessDiagramGenerator pec = processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator();
+                //閰嶇疆瀛椾綋
+                InputStream imageStream = pec.generateDiagram(bpmnModel, "png", executedActivityIdList, flowIds, "瀹嬩綋", "瀹嬩綋", "瀹嬩綋", null, 2.0);
+
+
+                image = Base64Convert.ioToBase64(imageStream);
+            }
+        } catch (Exception e) {
+            logger.error("璇诲彇鍥剧墖澶辫触", e);
+
+        }
+        return image;
+    }
+
+    public List<String> getHighLightedFlows(BpmnModel bpmnModel, ProcessDefinitionEntity processDefinitionEntity, List<HistoricActivityInstance> historicActivityInstances) {
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //24灏忔椂鍒�
+        List<String> highFlows = new ArrayList<String>();// 鐢ㄤ互淇濆瓨楂樹寒鐨勭嚎flowId
+
+        for (int i = 0; i < historicActivityInstances.size() - 1; i++) {
+            // 瀵瑰巻鍙叉祦绋嬭妭鐐硅繘琛岄亶鍘�
+            // 寰楀埌鑺傜偣瀹氫箟鐨勮缁嗕俊鎭�
+            FlowNode activityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(i).getActivityId());
+
+
+            List<FlowNode> sameStartTimeNodes = new ArrayList<FlowNode>();// 鐢ㄤ互淇濆瓨鍚庣画寮�濮嬫椂闂寸浉鍚岀殑鑺傜偣
+            FlowNode sameActivityImpl1 = null;
+
+            HistoricActivityInstance activityImpl_ = historicActivityInstances.get(i);// 绗竴涓妭鐐�
+            HistoricActivityInstance activityImp2_;
+
+            for (int k = i + 1; k <= historicActivityInstances.size() - 1; k++) {
+                activityImp2_ = historicActivityInstances.get(k);// 鍚庣画绗�1涓妭鐐�
+
+                if (activityImpl_.getActivityType().equals("userTask") && activityImp2_.getActivityType().equals("userTask") &&
+                        df.format(activityImpl_.getStartTime()).equals(df.format(activityImp2_.getStartTime()))) //閮芥槸usertask锛屼笖涓昏妭鐐逛笌鍚庣画鑺傜偣鐨勫紑濮嬫椂闂寸浉鍚岋紝璇存槑涓嶆槸鐪熷疄鐨勫悗缁ц妭鐐�
+                {
+
+                } else {
+                    sameActivityImpl1 = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(k).getActivityId());//鎵惧埌绱ц窡鍦ㄥ悗闈㈢殑涓�涓妭鐐�
+                    break;
+                }
+
+            }
+            sameStartTimeNodes.add(sameActivityImpl1); // 灏嗗悗闈㈢涓�涓妭鐐规斁鍦ㄦ椂闂寸浉鍚岃妭鐐圭殑闆嗗悎閲�
+            for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) {
+                HistoricActivityInstance activityImpl1 = historicActivityInstances.get(j);// 鍚庣画绗竴涓妭鐐�
+                HistoricActivityInstance activityImpl2 = historicActivityInstances.get(j + 1);// 鍚庣画绗簩涓妭鐐�
+
+                if (df.format(activityImpl1.getStartTime()).equals(df.format(activityImpl2.getStartTime()))) {// 濡傛灉绗竴涓妭鐐瑰拰绗簩涓妭鐐瑰紑濮嬫椂闂寸浉鍚屼繚瀛�
+                    FlowNode sameActivityImpl2 = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityImpl2.getActivityId());
+                    sameStartTimeNodes.add(sameActivityImpl2);
+                } else {// 鏈変笉鐩稿悓璺冲嚭寰幆
+                    break;
+                }
+            }
+            List<SequenceFlow> pvmTransitions = activityImpl.getOutgoingFlows(); // 鍙栧嚭鑺傜偣鐨勬墍鏈夊嚭鍘荤殑绾�
+
+            for (SequenceFlow pvmTransition : pvmTransitions) {// 瀵规墍鏈夌殑绾胯繘琛岄亶鍘�
+                FlowNode pvmActivityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(pvmTransition.getTargetRef());// 濡傛灉鍙栧嚭鐨勭嚎鐨勭洰鏍囪妭鐐瑰瓨鍦ㄦ椂闂寸浉鍚岀殑鑺傜偣閲岋紝淇濆瓨璇ョ嚎鐨刬d锛岃繘琛岄珮浜樉绀�
+                if (sameStartTimeNodes.contains(pvmActivityImpl)) {
+                    highFlows.add(pvmTransition.getId());
+                }
+            }
+
+        }
+        return highFlows;
+
+    }
+
+
+    public String getWorkflowImage(@RequestBody WorkflowDto workflowDto) {
+
+        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
+        String image = "";
+        List<String> list = processEngine.getRepositoryService()//
+                .getDeploymentResourceNames(workflowDto.getProcessDefinitionKey());
+
+        String resourceName = "";
+        if (list != null && list.size() > 0) {
+            for (String name : list) {
+                if (name.indexOf(".png") >= 0) {
+                    resourceName = name;
+                }
+            }
+        }
+
+        InputStream in = processEngine.getRepositoryService()
+                .getResourceAsStream(workflowDto.getProcessDefinitionKey(), resourceName);
+
+
+        try {
+            image = Base64Convert.ioToBase64(in);
+        } catch (IOException e) {
+            logger.error("璇诲彇鍥剧墖澶辫触", e);
+        }
+        return image;
+    }
+
+
     /**
      * @Date锛�2017/11/24
      * @Description锛氬垱寤烘祦绋嬪苟閮ㄧ讲
      */
-    public void addFlowDeployment(@RequestBody WorkflowDto workflowDto) {
+    public WorkflowDto addFlowDeployment(@RequestBody WorkflowDto workflowDto) {
 
         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
-
+//
 //        RepositoryService repositoryService  = processEngine.getRepositoryService();
 //        repositoryService.deleteDeployment("1");
+        try {
+            // 1. 寤虹珛妯″瀷
+            BpmnModel model = new BpmnModel();
+            Process process = new Process();
+            model.addProcess(process);
+            process.setId(WorkflowDto.DEFAULT_PROCESS + 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, "parallelGateway-fork" + i));
+                    //鑾峰彇瑙掕壊涓嬫墍鏈夌敤鎴�
+                    List<WorkflowStepStaffDto> userList = step.getWorkflowStepStaffs();
+                    for (int u = 0; u < userList.size(); u++) {
+                        //骞惰缃戝叧鍒嗘敮鐨勫鏍歌妭鐐�
+                        process.addFlowElement(createUserTask("userTask" + i + u, userList.get(u).getStaffName(), userList.get(u).getStaffId()));
+                    }
+                    //骞惰缃戝叧-姹囪仛
+                    process.addFlowElement(createParallelGateway("parallelGateway-join" + i, "parallelGateway-join" + i));
 
-        // 1. 寤虹珛妯″瀷
-        BpmnModel model = new BpmnModel();
-        Process process = new Process();
-        model.addProcess(process);
-        process.setId("java110_" + 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(createUserTask("repulse" + i, "鎻愪氦鑰�", "${startUserId}"));
+
+                } else {
+                    //鏅�氭祦杞�
+                    //瀹℃牳鑺傜偣
+                    process.addFlowElement(createUserTask("task" + i, step.getWorkflowStepStaffs().get(0).getStaffName(), step.getWorkflowStepStaffs().get(0).getStaffId()));
+                    //鍥為��鑺傜偣
+                    process.addFlowElement(createUserTask("repulse" + i, "鎻愪氦鑰�", "${startUserId}"));
                 }
-                //骞惰缃戝叧-姹囪仛
-                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());
+            //缁撴潫鑺傜偣
+            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, ""));
+
+            //杩炵嚎
+            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, "startEvent-parallelGateway-fork" + y, ""));
                     } else {
-                        process.addFlowElement(createSequenceFlow("task" + (y - 1), "parallelGateway-fork" + y, "涓婁竴涓鏍歌妭鐐瑰埌骞惰缃戝叧-鍒嗘敮" + y, ""));
+                        //瀹℃牳鑺傜偣鎴栬�呭苟琛岀綉鍏�-姹囪仛鍒板苟琛岀綉鍏�-鍒嗘敮
+                        //鍒ゆ柇涓婁竴涓妭鐐规槸鍚︽槸浼氱
+                        if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(workflowStepDtos.get(y - 1).getType())) {
+                            process.addFlowElement(createSequenceFlow("parallelGateway-join" + (y - 1), "parallelGateway-fork" + y, "parallelGateway-join-parallelGateway-fork-鍒嗘敮" + y, "${flag=='true'}"));
+                        } else {
+                            process.addFlowElement(createSequenceFlow("task" + (y - 1), "parallelGateway-fork" + y, "task-parallelGateway-fork" + y, "${flag=='true'}"));
+                        }
                     }
-                }
-                //骞惰缃戝叧-鍒嗘敮鍜屼細绛剧敤鎴疯繛绾匡紝浼氱鐢ㄦ埛鍜屽苟琛岀綉鍏�-姹囪仛杩炵嚎
-                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, ""));
+                    //骞惰缃戝叧-鍒嗘敮鍜屼細绛剧敤鎴疯繛绾匡紝浼氱鐢ㄦ埛鍜屽苟琛岀綉鍏�-姹囪仛杩炵嚎
+                    List<WorkflowStepStaffDto> userList = step.getWorkflowStepStaffs();
+                    for (int u = 0; u < userList.size(); u++) {
+                        process.addFlowElement(createSequenceFlow("parallelGateway-fork" + y, "userTask" + y + u, "parallelGateway-fork-userTask" + y + u, ""));
+                        process.addFlowElement(createSequenceFlow("userTask" + y + u, "parallelGateway-join" + y, "userTask-parallelGateway-join", ""));
+                        if (u == (userList.size() - 1)) {
+                            if (y == (workflowStepDtos.size() - 1)) {
+                                if("Y".equals(workflowDto.getStartNodeFinish())){ //闇�瑕佹彁浜よ�呯‘璁�
+                                    process.addFlowElement(createSequenceFlow("parallelGateway-join" + y, "repulse" + y, "parallelGateway-join-repulse", ""));
+                                }else {
+                                    process.addFlowElement(createSequenceFlow("parallelGateway-join" + y, "endEvent", "parallelGateway-join-endEvent" + y, "${flag=='true'}"));
+                                    process.addFlowElement(createSequenceFlow("parallelGateway-join" + y, "repulse" + y, "tparallelGateway-join-repulse" + y, "${flag=='false'}"));
+                                }
+                            } else {
+                                process.addFlowElement(createSequenceFlow("parallelGateway-join" + y, "repulse" + y, "parallelGateway-join-repulse", "${flag=='false'}"));
+                            }
+                            process.addFlowElement(createSequenceFlow("repulse" + y, "task" + getNormal(workflowStepDtos, y), "repulse-task" + y, "${flag=='true'}"));
+                        }
+                    }
+
+
+                    process.addFlowElement(createSequenceFlow("repulse" + y, "endEvent", "parallelGateway-join-endEvent", "${flag=='false'}"));
+
                 } else {
-                    //鍒ゆ柇涓婁竴涓妭鐐规槸鍚︿細绛�
-                    if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(workflowStepDtos.get(y - 1).getType())) {
-                        //浼氱
-                        //骞惰缃戝叧-姹囪仛鍒板鏍歌妭鐐�
-                        process.addFlowElement(createSequenceFlow("parallelGateway-join" + (y - 1), "task" + y, "骞惰缃戝叧-姹囪仛鍒板鏍歌妭鐐�" + y, ""));
+                    //鏅�氭祦杞�
+                    //绗竴涓妭鐐�
+                    if (y == 0) {
+                        //寮�濮嬭妭鐐瑰拰瀹℃牳鑺傜偣1
+                        process.addFlowElement(createSequenceFlow("startEvent", "task" + y, "startEvent-task" + y, ""));
                     } else {
-                        //鏅��
-                        process.addFlowElement(createSequenceFlow("task" + (y - 1), "task" + y, "瀹℃牳鑺傜偣" + (y - 1) + "鍒板鏍歌妭鐐�" + y, "${flag=='true'}"));
+                        //鍒ゆ柇涓婁竴涓妭鐐规槸鍚︿細绛�
+                        if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(workflowStepDtos.get(y - 1).getType())) {
+                            //浼氱
+                            //骞惰缃戝叧-姹囪仛鍒板鏍歌妭鐐�
+                            process.addFlowElement(createSequenceFlow("parallelGateway-join" + (y - 1), "task" + y, "parallelGateway-join-task" + y, "${flag=='true'}"));
+                        } else {
+                            //鏅��
+                            process.addFlowElement(createSequenceFlow("task" + (y - 1), "task" + y, "task" + (y - 1) + "task" + y, "${flag=='true'}"));
+                        }
                     }
+                    //鏄惁鏈�鍚庝竴涓妭鐐�
+                  /*  if (y == (workflowStepDtos.size() - 1)) {
+                        //瀹℃牳鑺傜偣鍒扮粨鏉熻妭鐐�
+                        process.addFlowElement(createSequenceFlow("repulse" + y, "endEvent", "task" + y + "endEvent", "${flag=='false'}"));
+                        process.addFlowElement(createSequenceFlow("task" + y, "repulse" + y, "task-repulse" + y, "${flag=='false'}"));
+                    } else {
+                        //瀹℃牳鑺傜偣鍒板洖閫�鑺傜偣
+                        process.addFlowElement(createSequenceFlow("task" + y, "repulse" + y, "task-repulse" + y, "${flag=='false'}"));
+                    }*/
+                    process.addFlowElement(createSequenceFlow("repulse" + y, "endEvent", "repulse" + y + "endEvent", "${flag=='false'}"));
+                    if (y == (workflowStepDtos.size() - 1)) {
+                        if("Y".equals(workflowDto.getStartNodeFinish())){ //闇�瑕佹彁浜よ�呯‘璁�
+                            process.addFlowElement(createSequenceFlow("task" + y, "repulse" + y, "task-repulse" + y, ""));
+                        }else {
+                            process.addFlowElement(createSequenceFlow("task" + y, "endEvent", "task-endEvent" + y, "${flag=='true'}"));
+                            process.addFlowElement(createSequenceFlow("task" + y, "repulse" + y, "task-repulse" + y, "${flag=='false'}"));
+                        }
+                    } else {
+                        process.addFlowElement(createSequenceFlow("task" + y, "repulse" + y, "task-repulse" + y, "${flag=='false'}"));
+                    }
+
+                    process.addFlowElement(createSequenceFlow("repulse" + y, "task" + y, "repulse-task" + 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();
+            workflowDto.setProcessDefinitionKey(deployment.getId());
+
+        } catch (Exception e) {
+            logger.error("閮ㄧ讲宸ヤ綔娴佸け璐�", e);
+        }
+
+        logger.debug("宸ヤ綔娴侀儴缃插畬鎴�");
+        return workflowDto;
+    }
+
+    private int getNormal(List<WorkflowStepDto> workflowStepDtos, int y) {
+        for (int stepIndex = y; stepIndex > 0; stepIndex--) {
+            if (WorkflowStepDto.TYPE_NORMAL.equals(workflowStepDtos.get(stepIndex).getType())) {
+                return stepIndex;
             }
         }
 
-        // 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...");
+        return 0;
     }
 
 
@@ -255,7 +469,8 @@
         UserTask userTask = new UserTask();
         userTask.setName(name);
         userTask.setId(id);
-        userTask.setCandidateUsers(candidateUsers);
+        userTask.setAssignee(userPkno);
+        //userTask.setCandidateUsers(candidateUsers);
         return userTask;
     }
 
@@ -315,6 +530,123 @@
         return workflowServiceDaoImpl.queryWorkflowsCount(BeanConvertUtil.beanCovertMap(workflowDto));
     }
 
+    /**
+     * 鏌ヨ瀹℃牳鍘嗗彶
+     *
+     * @param workflowAuditInfoDto
+     * @return
+     */
+    public List<WorkflowAuditInfoDto> queryWorkflowAuditHistory(@RequestBody WorkflowAuditInfoDto workflowAuditInfoDto) {
+        //List<TaskBo> taskBoList = new ArrayList<TaskBo>();
+        HistoricProcessInstance hisProcessInstance = (HistoricProcessInstance) historyService
+                .createHistoricProcessInstanceQuery()
+                .processInstanceBusinessKey(workflowAuditInfoDto.getBusinessKey()).singleResult();
+        List<HistoricActivityInstance> hisActInstList = new ArrayList<>();
+        if (hisProcessInstance != null) {
+            // 璇ユ祦绋嬪疄渚嬬殑鎵�鏈夎妭鐐瑰鎵硅褰�
+            hisActInstList = getHisUserTaskActivityInstanceList(hisProcessInstance
+                    .getId());
+        }
+        List<WorkflowAuditInfoDto> workflowAuditInfoDtos = new ArrayList<>();
+        WorkflowAuditInfoDto tmpWorkflowAuditInfoDto = null;
+        for (Iterator iterator = hisActInstList.iterator(); iterator.hasNext(); ) {
+            // 闇�瑕佽浆鎹㈡垚HistoricActivityInstance
+            HistoricActivityInstance activityInstance = (HistoricActivityInstance) iterator
+                    .next();
+
+            tmpWorkflowAuditInfoDto = new WorkflowAuditInfoDto();
+            tmpWorkflowAuditInfoDto.setAuditName(activityInstance.getActivityName());
+            if (activityInstance.getEndTime() != null) {
+                tmpWorkflowAuditInfoDto.setAuditTime(DateUtil.getFormatTimeString(activityInstance.getEndTime(), DateUtil.DATE_FORMATE_STRING_A));
+                tmpWorkflowAuditInfoDto.setStateName("瀹屾垚");
+                tmpWorkflowAuditInfoDto.setState(WorkflowAuditInfoDto.STATE_FINISH);
+            } else {
+                tmpWorkflowAuditInfoDto.setStateName("姝e湪澶勭悊");
+                tmpWorkflowAuditInfoDto.setState(WorkflowAuditInfoDto.STATE_NO);
+            }
+            Long time = activityInstance.getDurationInMillis() == null ? new Date().getTime() - activityInstance.getStartTime().getTime()
+                    : activityInstance.getDurationInMillis();
+            tmpWorkflowAuditInfoDto.setDuration(getCostTime(time));
+
+            //濡傛灉杩樻病缁撴潫鍒欎笉鏀鹃噷闈�
+            List<Comment> comments = taskService.getTaskComments(activityInstance.getTaskId());
+            String msg = "";
+            if (comments != null && comments.size() > 0) {
+                for (Comment comment : comments) {
+                    msg += (comment.getFullMessage() + "/");
+                }
+            }
+            msg = msg.endsWith("/") ? msg.substring(0, msg.length() - 1) : msg;
+            tmpWorkflowAuditInfoDto.setUserId(activityInstance.getAssignee());
+            tmpWorkflowAuditInfoDto.setMessage(msg);
+            workflowAuditInfoDtos.add(tmpWorkflowAuditInfoDto);
+        }
+        return workflowAuditInfoDtos;
+    }
+
+    @Override
+    public WorkflowModelDto createModel(@RequestBody  WorkflowModelDto workflowModelDto) {
+        logger.info("鍒涘缓妯″瀷鍏ュ弬name锛歿},key:{}", workflowModelDto.getName(), workflowModelDto.getKey());
+        Model model = repositoryService.newModel();
+        ObjectNode modelNode = objectMapper.createObjectNode();
+        modelNode.put(ModelDataJsonConstants.MODEL_NAME, workflowModelDto.getName());
+        modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, "");
+        modelNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
+        model.setName(workflowModelDto.getName());
+        model.setKey(workflowModelDto.getKey());
+        model.setMetaInfo(modelNode.toString());
+        repositoryService.saveModel(model);
+        createObjectNode(model.getId());
+        logger.info("鍒涘缓妯″瀷缁撴潫锛岃繑鍥炴ā鍨婭D锛歿}", model.getId());
+        workflowModelDto.setModelId(model.getId());
+        return workflowModelDto;
+    }
+
+
+    /**
+     * 鍒涘缓妯″瀷鏃跺畬鍠凪odelEditorSource
+     *
+     * @param modelId
+     */
+    @SuppressWarnings("deprecation")
+    private void createObjectNode(String modelId) {
+        logger.info("鍒涘缓妯″瀷瀹屽杽ModelEditorSource鍏ュ弬妯″瀷ID锛歿}", modelId);
+        ObjectNode editorNode = objectMapper.createObjectNode();
+        editorNode.put("id", "canvas");
+        editorNode.put("resourceId", "canvas");
+        ObjectNode stencilSetNode = objectMapper.createObjectNode();
+        stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
+        editorNode.put("stencilset", stencilSetNode);
+        try {
+            repositoryService.addModelEditorSource(modelId, editorNode.toString().getBytes("utf-8"));
+        } catch (Exception e) {
+            logger.info("鍒涘缓妯″瀷鏃跺畬鍠凪odelEditorSource鏈嶅姟寮傚父锛歿}", e);
+        }
+        logger.info("鍒涘缓妯″瀷瀹屽杽ModelEditorSource缁撴潫");
+    }
+
+
+
+    /**
+     * @param processInstanceId
+     * @return
+     * @CreateUser:xxxx
+     * @ReturnType:List
+     * @CreateDate:2014-6-25涓嬪崍5:03:13
+     * @UseFor :鍦� ACT_HI_ACTINST 琛ㄤ腑鎵惧埌瀵瑰簲娴佺▼瀹炰緥鐨剈serTask鑺傜偣 涓嶅寘鎷瑂tartEvent
+     * <p>
+     * .finished()
+     */
+    private List<HistoricActivityInstance> getHisUserTaskActivityInstanceList(
+            String processInstanceId) {
+        List<HistoricActivityInstance> hisActivityInstanceList = ((HistoricActivityInstanceQuery) historyService
+                .createHistoricActivityInstanceQuery()
+                .processInstanceId(processInstanceId).activityType("userTask")
+                .orderByHistoricActivityInstanceStartTime().asc())
+                .list();
+        return hisActivityInstanceList;
+    }
+
     public IWorkflowServiceDao getWorkflowServiceDaoImpl() {
         return workflowServiceDaoImpl;
     }
@@ -330,4 +662,21 @@
     public void setUserInnerServiceSMOImpl(IUserInnerServiceSMO userInnerServiceSMOImpl) {
         this.userInnerServiceSMOImpl = userInnerServiceSMOImpl;
     }
+
+    public String getCostTime(Long time) {
+        if (time == null) {
+            return "00:00";
+        }
+        long hours = time / (1000 * 60 * 60);
+        long minutes = (time - hours * (1000 * 60 * 60)) / (1000 * 60);
+        String diffTime = "";
+        if (minutes < 10) {
+            diffTime = hours + ":0" + minutes;
+        } else {
+            diffTime = hours + ":" + minutes;
+        }
+        return diffTime;
+    }
+
+
 }

--
Gitblit v1.8.0