瀏覽代碼

新增自定义流程属性-新增默认节点

wangliang 3 年之前
父節點
當前提交
e2ea1a1463

+ 60 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/AbstractMultiWorkFlowService.java

@@ -1,5 +1,10 @@
 package com.qmth.distributed.print.business.activiti.custom.service;
 
+import com.qmth.distributed.print.business.bean.flow.CustomFlowDto;
+import com.qmth.distributed.print.business.bean.flow.link.FlowTaskLink;
+import com.qmth.distributed.print.business.bean.flow.link.FlowTaskNode;
+import com.qmth.distributed.print.business.enums.CustomFlowDynamicBuildEnum;
+import com.qmth.distributed.print.business.enums.CustomFlowTypeEnum;
 import org.activiti.bpmn.model.MultiInstanceLoopCharacteristics;
 import org.activiti.bpmn.model.UserTask;
 import org.activiti.engine.ProcessEngine;
@@ -9,6 +14,7 @@ import org.activiti.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
 import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
 import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
 import org.activiti.engine.impl.el.ExpressionManager;
+import org.springframework.beans.BeanUtils;
 
 import javax.annotation.Resource;
 import java.text.MessageFormat;
@@ -26,6 +32,13 @@ public abstract class AbstractMultiWorkFlowService implements DefaultInstanceCon
     @Resource
     protected ProcessEngine processEngine;
 
+    /**
+     * 创建多实例行为解释器
+     *
+     * @param id
+     * @param isSequential 是否 串行
+     * @return
+     */
     @Override
     public MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(String id, boolean isSequential) {
         return createMultiInstanceLoopCharacteristics(isSequential, new StringJoiner("")
@@ -33,6 +46,14 @@ public abstract class AbstractMultiWorkFlowService implements DefaultInstanceCon
                 .add(MessageFormat.format("{0}{1}", ASSIGNEE_USER, id)).toString());
     }
 
+    /**
+     * 创建多实例行为解释器
+     *
+     * @param isSequential    是否串行
+     * @param assigneeListExp 用户组表达
+     * @param assignee        用户标识
+     * @return
+     */
     @Override
     public MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(boolean isSequential, String assigneeListExp, String assignee) {
         MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();
@@ -42,6 +63,13 @@ public abstract class AbstractMultiWorkFlowService implements DefaultInstanceCon
         return multiInstanceLoopCharacteristics;
     }
 
+    /**
+     * 创建多实例 循环解释器
+     *
+     * @param userTask
+     * @param sequential
+     * @return
+     */
     @Override
     public UserTask createMultiInstanceBehavior(UserTask userTask, boolean sequential) {
         String id = userTask.getId().substring(userTask.getId().length() - 1, userTask.getId().length());
@@ -51,6 +79,15 @@ public abstract class AbstractMultiWorkFlowService implements DefaultInstanceCon
         return createMultiInstanceBehavior(userTask, sequential, new StringJoiner("").add(MessageFormat.format("{0}{1}{2}", DEFAULT_ASSIGNEE_LIST_EXP, id, EXP_SUFFIX)).toString(), new StringJoiner("").add(MessageFormat.format("{0}{1}", ASSIGNEE_USER, id)).toString());
     }
 
+    /**
+     * 创建多实例 循环解释器
+     *
+     * @param userTask        流程节点
+     * @param sequential      是否串行
+     * @param assigneeListExp 用户组表达
+     * @param assignee
+     * @return
+     */
     @Override
     public UserTask createMultiInstanceBehavior(UserTask userTask, boolean sequential, String assigneeListExp, String assignee) {
         ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) processEngine.getProcessEngineConfiguration();
@@ -64,4 +101,27 @@ public abstract class AbstractMultiWorkFlowService implements DefaultInstanceCon
         behavior.setCollectionElementVariable(assignee);
         return userTask;
     }
+
+    /**
+     * 创建默认用户节点
+     *
+     * @param customFlowDto
+     * @param flowTaskLink
+     * @param id
+     * @return
+     */
+    @Override
+    public FlowTaskLink createDefaultUserTask(CustomFlowDto customFlowDto, FlowTaskLink flowTaskLink, String id) {
+        CustomFlowDto customFlowDefaultDto = new CustomFlowDto();
+        BeanUtils.copyProperties(customFlowDto, customFlowDefaultDto);
+        customFlowDefaultDto.setId(id);
+        customFlowDefaultDto.setType(CustomFlowTypeEnum.PROCESS);
+        customFlowDefaultDto.setContent("提交试卷");
+        customFlowDefaultDto.setH(customFlowDefaultDto.getH() + 30D);
+        customFlowDefaultDto.setY(customFlowDefaultDto.getY() + 50D);
+        customFlowDefaultDto.setFlowTaskId(CustomFlowDynamicBuildEnum.USER_TASK.getId() + id);
+        FlowTaskNode nodeDefault = new FlowTaskNode(customFlowDefaultDto);
+        flowTaskLink.add(nodeDefault);
+        return flowTaskLink;
+    }
 }

+ 12 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/DefaultInstanceConvertToMultiInstance.java

@@ -13,17 +13,22 @@ import org.activiti.bpmn.model.UserTask;
 public interface DefaultInstanceConvertToMultiInstance extends MultiWorkFlow {
 
     public static final String ASSIGNEE_USER = "assignee";
-
     public static final String DEFAULT_ASSIGNEE_LIST = "assigneeList";
-
     public static final String DEFAULT_ASSIGNEE_LIST_EXP = "${assigneeList";
-
     public static final String ASSIGNEE_USER_EXP = "${" + ASSIGNEE_USER;
-
     public static final String EXP_SUFFIX = "}";
+    public static final String APPROVE_ID_EXP = "${approveId}";
+    public static final String DEFAULT_USER_TASK = "_default";
+    public static final String DEFAULT_USER_TASK_NAME = "提交试卷";
+    public static final String USER_TASK_APPROVE_NAME = "审批人";
+    public static final String FLOW_BPMN_MODEL_NAME = "-dynamic-model.bpmn";
+    public static final String FLOW_BPMN_PROCESS_NAME = "-multiple-process.bpmn";
+    public static final String FLOW_BPMN_PNG_NAME = "-multiple-process-diagram.png";
+    public static final String FLOW_BPMN_DEPLOYMENT_NAME = "-multiple process deployment";
+    public static final String BPMN_NAME = "bpmn";
 
     /**
-     * 创建 多实例 行为解释器
+     * 创建多实例行为解释器
      *
      * @param userTask
      * @param sequential
@@ -43,7 +48,7 @@ public interface DefaultInstanceConvertToMultiInstance extends MultiWorkFlow {
     UserTask createMultiInstanceBehavior(UserTask userTask, boolean sequential, String assigneeListExp, String assigneeExp);
 
     /**
-     * 创建多实例 循环解释器
+     * 创建多实例循环解释器
      *
      * @param isSequential    是否串行
      * @param assigneeListExp 用户组表达
@@ -53,7 +58,7 @@ public interface DefaultInstanceConvertToMultiInstance extends MultiWorkFlow {
     MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(boolean isSequential, String assigneeListExp, String assignee);
 
     /**
-     * 创建多实例 循环解释器
+     * 创建多实例循环解释器
      *
      * @param id
      * @param isSequential 是否 串行

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/MultiWorkFlow.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.business.activiti.custom.service;
 
+import com.qmth.distributed.print.business.bean.flow.CustomFlowDto;
+import com.qmth.distributed.print.business.bean.flow.link.FlowTaskLink;
 import org.activiti.bpmn.model.UserTask;
 
 /**
@@ -18,4 +20,14 @@ public interface MultiWorkFlow {
      * @param sequential
      */
     UserTask createMultiInstanceLoopCharacteristics(UserTask userTask, boolean sequential);
+
+    /**
+     * 创建默认用户节点
+     *
+     * @param customFlowDto
+     * @param flowTaskLink
+     * @param id
+     * @return
+     */
+    FlowTaskLink createDefaultUserTask(CustomFlowDto customFlowDto, FlowTaskLink flowTaskLink, String id);
 }

+ 18 - 69
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java

@@ -1440,6 +1440,7 @@ public class ActivitiServiceImpl implements ActivitiService {
         model.addProcess(process);
         process.setId(id);
 
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         List<CustomFlowDto> customFlowLists = customFlowSaveDto.getCustomFlowLists();
         Map<CustomFlowTypeEnum, CustomFlowDto> customFlowTypeEnumCustomFlowDtoMap = new HashMap<>();
         FlowTaskLink flowTaskLink = new FlowTaskLink();
@@ -1457,6 +1458,10 @@ public class ActivitiServiceImpl implements ActivitiService {
                     }
                     customFlowDto.setFlowTaskId(CustomFlowDynamicBuildEnum.START.getId());
                     process.addFlowElement(createStartEvent());
+                    //默认在开始节点后新增一个审批节点
+                    flowTaskLink = multiWorkFlow.createDefaultUserTask(customFlowDto, flowTaskLink, DefaultInstanceConvertToMultiInstance.DEFAULT_USER_TASK);
+                    flowVarMap.computeIfAbsent(SystemConstant.APPROVE_ID, v -> sysUser.getId());
+                    process.addFlowElement(createUserTask(CustomFlowDynamicBuildEnum.USER_TASK.getId() + DefaultInstanceConvertToMultiInstance.DEFAULT_USER_TASK, Objects.nonNull(flowTaskLink.getLast().getTask().getContent()) && !Objects.equals(flowTaskLink.getLast().getTask().getContent(), "") ? flowTaskLink.getLast().getTask().getContent() : DefaultInstanceConvertToMultiInstance.DEFAULT_USER_TASK_NAME, DefaultInstanceConvertToMultiInstance.APPROVE_ID_EXP));
                     break;
                 case PROCESS://过程节点
                     customFlowDto.setFlowTaskId(CustomFlowDynamicBuildEnum.USER_TASK.getId() + i);
@@ -1514,8 +1519,7 @@ public class ActivitiServiceImpl implements ActivitiService {
                             copyUserIds.addAll(customFlowPropertyDto.getCopyForUsers().stream().map(x -> String.valueOf(x.getId())).collect(Collectors.toList()));
                         }
                     }
-//                    process.addFlowElement(createUserTask(CustomFlowDynamicBuildEnum.USER_TASK.getId() + i, customFlowDto.getContent(), null));
-                    process.addFlowElement(createUserTask(CustomFlowDynamicBuildEnum.USER_TASK.getId() + i, "审批人", approveUserIds, customFlowPropertyDto.getMultipleUserApproveType()));
+                    process.addFlowElement(createUserTask(CustomFlowDynamicBuildEnum.USER_TASK.getId() + i, Objects.nonNull(customFlowDto.getContent()) && !Objects.equals(customFlowDto.getContent(), "") ? customFlowDto.getContent() : DefaultInstanceConvertToMultiInstance.USER_TASK_APPROVE_NAME, approveUserIds, customFlowPropertyDto.getMultipleUserApproveType()));
                     //提取过程节点属性
                     break;
                 case END://结束节点
@@ -1540,23 +1544,26 @@ public class ActivitiServiceImpl implements ActivitiService {
 
         //生成图像信息
         new BpmnAutoLayout(model).execute();
+
         //部署流程
-        Deployment deployment = repositoryService.createDeployment().addBpmnModel(id + "-dynamic-model.bpmn", model)
-                .name(id + "-multiple process deployment").deploy();
+        String bpmnName = id + DefaultInstanceConvertToMultiInstance.FLOW_BPMN_MODEL_NAME;
+        String bpmnPngName = id + DefaultInstanceConvertToMultiInstance.FLOW_BPMN_PNG_NAME;
+        String bpmnProcessName = id + DefaultInstanceConvertToMultiInstance.FLOW_BPMN_PROCESS_NAME;
+        String bpmnDeploymentName = id + DefaultInstanceConvertToMultiInstance.FLOW_BPMN_DEPLOYMENT_NAME;
+        Deployment deployment = repositoryService.createDeployment().addBpmnModel(bpmnName, model).name(bpmnDeploymentName).deploy();
 
         //启动流程
         ProcessInstance processInstance = flowVarMap.size() > 0 ? runtimeService.startProcessInstanceByKey(id, flowVarMap) : runtimeService.startProcessInstanceByKey(id);
 
         //保存png图片和xml文件(这一步可做可不做)
         InputStream processDiagram = repositoryService.getProcessDiagram(processInstance.getProcessDefinitionId());
-        FileUtils.copyInputStreamToFile(processDiagram, new File("target" + File.separator + id + "-multiple-process-diagram.png"));
+        FileUtils.copyInputStreamToFile(processDiagram, new File(SystemConstant.TEMP_FILES_DIR + File.separator + DefaultInstanceConvertToMultiInstance.BPMN_NAME + File.separator + bpmnPngName));
 
-//        InputStream processBpmn = repositoryService.getResourceAsStream(deployment.getId(), id + "-dynamic-model.bpmn");
-//        FileUtils.copyInputStreamToFile(processBpmn, new File("target" + File.separator + id + "-multiple-process.bpmn20.xml"));
+//        InputStream processBpmn = repositoryService.getResourceAsStream(deployment.getId(), bpmnName);
+//        FileUtils.copyInputStreamToFile(processBpmn, new File(SystemConstant.TEMP_FILES_DIR + File.separator + DefaultInstanceConvertToMultiInstance.BPMN_NAME + File.separator + id + "-multiple-process.bpmn20.xml"));
 
-        File file = new File("target" + File.separator + id + "-multiple-process.bpmn");
-        InputStream processBpmn = repositoryService.getResourceAsStream(deployment.getId(), id + "-dynamic-model.bpmn");
-        FileUtils.copyInputStreamToFile(processBpmn, file);
+        InputStream processBpmn = repositoryService.getResourceAsStream(deployment.getId(), bpmnName);
+        FileUtils.copyInputStreamToFile(processBpmn, new File(SystemConstant.TEMP_FILES_DIR + File.separator + DefaultInstanceConvertToMultiInstance.BPMN_NAME + File.separator + bpmnProcessName));
     }
 
     /**
@@ -1608,30 +1615,6 @@ public class ActivitiServiceImpl implements ActivitiService {
         UserTask userTask = new UserTask();
         userTask.setName(name);
         userTask.setId(id);
-//        userTask.setAssignee("${assignee}");
-
-//        // 多实例
-//        MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();
-////        multiInstanceLoopCharacteristics.setSequential(false);
-//        multiInstanceLoopCharacteristics.setSequential(true);
-//        multiInstanceLoopCharacteristics.setInputDataItem("${assigneeList}");
-//        multiInstanceLoopCharacteristics.setElementVariable("assignee");
-//
-//        // 注入循环控制
-//        userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
-//
-//        ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) processEngine.getProcessEngineConfiguration();
-//        // 创建任务实例
-//        UserTaskActivityBehavior userTaskActivityBehavior = processEngineConfiguration.getActivityBehaviorFactory().createUserTaskActivityBehavior(userTask);
-//        // 创建behavior
-////        ParallelMultiInstanceBehavior behavior = new ParallelMultiInstanceBehavior(userTask, userTaskActivityBehavior);
-//        SequentialMultiInstanceBehavior behavior = new SequentialMultiInstanceBehavior(userTask, userTaskActivityBehavior);
-//        // 获取表达式解析工具
-//        behavior.setCollectionElementVariable("assignee");
-//
-//        // 注入表达式
-//        ExpressionManager expressionManager = processEngineConfiguration.getExpressionManager();
-//        behavior.setCollectionExpression(expressionManager.createExpression("${assigneeList}"));
 
         boolean isSequential = false;
         if (customFlowMultipleUserApproveTypeEnum == CustomFlowMultipleUserApproveTypeEnum.ORDER) {
@@ -1644,40 +1627,6 @@ public class ActivitiServiceImpl implements ActivitiService {
         return userTask;
     }
 
-//    /**
-//     * @param id                                    对应我们画流程图中节点任务id
-//     * @param name                                  节点任务名称
-//     * @param assignees
-//     * @param customFlowMultipleUserApproveTypeEnum
-//     * @return
-//     */
-//    protected UserTask createUserTask(String id, String name, List<String> assignees, CustomFlowMultipleUserApproveTypeEnum customFlowMultipleUserApproveTypeEnum) {
-//        UserTask userTask = new UserTask();
-//        userTask.setName(name);
-//        userTask.setId(id);
-//        switch (customFlowMultipleUserApproveTypeEnum) {
-//            case ORDER:
-//            case ALL:
-//                MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();
-//                multiInstanceLoopCharacteristics.setLoopCardinality(String.valueOf(assignees.size()));
-////                multiInstanceLoopCharacteristics.setInputDataItem(assignees.toString().replaceAll("\\[", "").replaceAll("\\]", ""));
-//                multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfActiveInstances == nrOfInstances}");
-////                multiInstanceLoopCharacteristics.setElementVariable("assignee");
-//                if (customFlowMultipleUserApproveTypeEnum == CustomFlowMultipleUserApproveTypeEnum.ORDER) {
-//                    multiInstanceLoopCharacteristics.setSequential(true);
-//                } else {
-//                    multiInstanceLoopCharacteristics.setSequential(false);
-//                }
-//                userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
-//                break;
-//            default:
-//                break;
-//        }
-//        //设置审批人
-////        userTask.setCandidateUsers(assignees);
-//        return userTask;
-//    }
-
     /**
      * @param id 网关id
      * @return
@@ -1705,4 +1654,4 @@ public class ActivitiServiceImpl implements ActivitiService {
         }
         return flow;
     }
-}
+}