ludc
2023-11-20 5e449c8bba2273313fd25457cae653a0f340c910
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/VCIFlowserviceImpl.java
@@ -16,21 +16,30 @@
 */
package com.vci.ubcs.flow.engine.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.vci.ubcs.flow.core.constant.ProcessConstant;
import com.vci.ubcs.flow.core.dto.FlowTaskDTO;
import com.vci.ubcs.flow.core.dto.ProcessStageAttrDTO;
import com.vci.ubcs.flow.core.entity.BladeFlow;
import com.vci.ubcs.flow.core.entity.FlowTaskUser;
import com.vci.ubcs.flow.core.entity.ProcessStageAttr;
import com.vci.ubcs.flow.core.utils.TaskUtil;
import com.vci.ubcs.flow.engine.entity.*;
import com.vci.ubcs.flow.engine.service.FlowEngineService;
import com.vci.ubcs.flow.engine.service.FlowTaskUserService;
import com.vci.ubcs.flow.engine.service.ProcessStageAttrService;
import com.vci.ubcs.flow.engine.service.VICFlowService;
import com.vci.ubcs.starter.web.util.BeanUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.*;
import org.flowable.engine.*;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.support.Kv;
@@ -54,14 +63,18 @@
   private final FlowTaskUserService flowTaskUserService;
   private final FlowEngineService flowEngineService;
   private final HistoryService historyService;
   private final ProcessStageAttrService processStageAttrService;
   private static String MODELKEY = "modelKey";//前端传过来的模型key
   private static String TASKID = "taskId";//前端传过来的模型key
   private static String PROCESSINSTANCEID = "processInstanceId";//前端传过来的模型key
   @Override
   public R<BladeFlow> startProcess(FlowTaskDTO flowTaskUserC){
      String modelKey = flowTaskUserC.getModelKey();
      String templateId = flowTaskUserC.getTemplateId();
      Map<String, Object> kvv = flowTaskUserC.getVariables();
      Kv kv = Kv.create()
         .set(ProcessConstant.TASK_VARIABLE_CREATE_USER, AuthUtil.getUserName());
      String modelKey = kvv.get(MODELKEY).toString();
      Kv kv = Kv.create().set(ProcessConstant.TASK_VARIABLE_CREATE_USER, AuthUtil.getUserName());
      // 设置流程启动用户
      identityService.setAuthenticatedUserId(TaskUtil.getTaskUser());
@@ -72,11 +85,11 @@
      String processDefinitionId = latesDefinition.getId();
      //查询每一步审核人
      List<FlowTaskUser> taskUsers = flowTaskUserService.getTaskUserByTemplateAndModelKey(templateId,modelKey);
      Set<String> taskIdSet = new HashSet<>();
      List<FlowTaskUser> taskUsers = flowTaskUserC.getFlowTaskUsers();
//      Set<String> taskIdSet = new HashSet<>();
      for (FlowTaskUser taskUser:taskUsers){
         kv.put(taskUser.getTaskId(),TaskUtil.getTaskUser(taskUser.getUserId()));
         taskIdSet.add(taskUser.getTaskId());
//         taskIdSet.add(taskUser.getTaskId());
      }
      //对比配置的审核人员和流程中节点是否一致,可能存在流程节点变更了,多了或者少了节点,但是配置审核人员的节点没有变
@@ -92,13 +105,28 @@
//      }
      //流程中文件、变量等
      //do..
      if(kvv!=null&&!kvv.isEmpty()){
         kv.putAll(kvv);
      }
      ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, modelKey, kv);
      // 组装流程通用类
      BladeFlow flow = new BladeFlow();
      flow.setProcessInstanceId(processInstance.getId());
//      //设置下一步审核人
//      Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).active().singleResult();
//      String taskId = task.getTaskDefinitionKey();
//      String assignee = null;
//      for (FlowTaskUser taskUser:taskUsers) {
//         if(taskId.equals(taskUser.getTaskId())){
//            assignee = taskUser.getUserId();
//         }
//      }
//      if(StringUtils.isEmpty(assignee)){
//         throw new ServiceException(taskId+"没有配置审核人!");
//      }
//      taskService.setAssignee(task.getId(),assignee);
      return R.data(flow);
   }
@@ -126,14 +154,21 @@
      //这个实例的所有节点
      ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
      Map<String, Object> processVariables = processInstance.getProcessVariables();//所有参数
      flowTaskDTO.setVars(processVariables);
      flowTaskDTO.setVariables(processVariables);
      String modelKey = processInstance.getProcessDefinitionKey();
      List<FlowTaskDTO> mis = flowEngineService.getNodeByFlowableKey(modelKey);
      Map<String,String> taskMap = new HashMap<>();
      mis.stream().forEach(e->{
         String taskId = e.getTaskId();
         String taskName = e.getTaskName();
         taskMap.put(taskId,taskName);
      });
      // 输出连线
      List<SequenceFlow> outFlows = flowNode.getOutgoingFlows();
      for (SequenceFlow sequenceFlow : outFlows) {
         String toname = sequenceFlow.getName()==null?"同意":sequenceFlow.getName();
         //当前审批节点
         if (NODE_NOW.equals(node)) {
            FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement();
@@ -142,28 +177,64 @@
            // 下一个审批节点
            FlowElement targetFlow = sequenceFlow.getTargetFlowElement();
            if (targetFlow instanceof UserTask) {
               System.out.println("下一节点: id=" + targetFlow.getId() + ",name=" + targetFlow.getName());
               FlowTaskDTO flowTaskUserCi = new FlowTaskDTO();
               //flowTaskUserCi.setConditionKey(null);
               //flowTaskUserCi.setConditionValue(null);
               flowTaskUserCi.setToName(toname);
               flowTaskUserCi.setToTaskId(targetFlow.getId());
               String taskName = taskMap.get(targetFlow.getId());
               flowTaskUserCi.setToTaskName(taskName);
               flowTaskUserCi.setTaskName(taskName);
               taskList.add(flowTaskUserCi);
            }
            // 如果下个审批节点为排他网关
            if (targetFlow instanceof ExclusiveGateway) {
            //结束
            if (targetFlow instanceof EndEvent) {
               FlowTaskDTO flowTaskUserCi = new FlowTaskDTO();
               //flowTaskUserCi.setConditionKey(null);
               //flowTaskUserCi.setConditionValue(null);
               flowTaskUserCi.setToName("同意");
               flowTaskUserCi.setToTaskId(targetFlow.getId());
               flowTaskUserCi.setToTaskName(targetFlow.getName());
               taskList.add(flowTaskUserCi);
            }
            // 如果下个审批节点为网关
            if (targetFlow instanceof Gateway) {
               ExclusiveGateway exclusiveGateway = (ExclusiveGateway) targetFlow;
               List<SequenceFlow> exclusiveGatewayOutgoingFlows = exclusiveGateway.getOutgoingFlows();
               for (SequenceFlow nexti:exclusiveGatewayOutgoingFlows){
                  String conditionExpression = nexti.getConditionExpression();//condition
                  String taskId = nexti.getTargetRef();//taskId
                  String name = nexti.getName();//toName,驳回、同意
                  String taskName = taskMap.get(taskId);
//ExclusiveGateway
                  if(StringUtils.isEmpty(conditionExpression)){//此时排他网关没有配置流转条件
                     continue;
                  }
                  for (FlowTaskDTO flowTaskUserCi:mis){
                     if(taskId.equals(flowTaskUserCi.getTaskId())){
                        flowTaskUserCi.setCondition(conditionExpression);
                        if(conditionExpression.split("=").length>1) {
                           flowTaskUserCi.setConditionKey(conditionExpression.split("=")[0]);
                           flowTaskUserCi.setConditionValue(conditionExpression.split("=")[1]);
                        if(conditionExpression.contains("=")||conditionExpression.contains("<")||conditionExpression.contains(">")) {
                           conditionExpression = conditionExpression.replace("${","").replace("}","").replaceAll("\"","");
                           String[] conditionExpressionStr = conditionExpression.split("==");
                           if(conditionExpression.contains("<")){
                              conditionExpressionStr = conditionExpression.split("<");
                           }else if(conditionExpression.contains("<=")){
                              conditionExpressionStr = conditionExpression.split("<=");
                           }else if(conditionExpression.contains(">")){
                              conditionExpressionStr = conditionExpression.split(">");
                           }else if(conditionExpression.contains(">=")){
                              conditionExpressionStr = conditionExpression.split(">=");
                           }
                           flowTaskUserCi.setConditionKey(conditionExpressionStr.length>0?conditionExpressionStr[0]:null);
                           flowTaskUserCi.setConditionValue(conditionExpressionStr.length>1?conditionExpressionStr[1]:null);
                        }
                        flowTaskUserCi.setToName(name);
                        flowTaskUserCi.setToTaskId(taskId);
                        flowTaskUserCi.setToTaskName(flowTaskUserCi.getTaskName());
                        flowTaskUserCi.setToTaskName(taskName);
                        flowTaskUserCi.setTaskName(taskName);
                        taskList.add(flowTaskUserCi);
                     }
                  }
@@ -171,6 +242,33 @@
            }
         }
      }
      //流程常量
      Map<String,Object> variables = runtimeService.getVariables(processInstanceId);
      if(!variables.isEmpty()){
         flowTaskDTO.setVariables(variables);
      }
      //流程阶段
      Map<String, Object> m = new HashMap<>();
      String templateId = variables.get("templateId").toString();
      m.put("template_id", templateId);
      m.put("task_id", crruentActivityId);
      m.put("model_key", modelKey);
      QueryWrapper q = Condition.getQueryWrapper(m, ProcessStageAttr.class)
         .select("attr_id attrId,attr_name attrName,attr_group attrGroup");
      List<ProcessStageAttr> stageAttrs = processStageAttrService.list(q);
      List<ProcessStageAttrDTO> stageAttrsDto = new ArrayList<>();
      stageAttrs.stream().forEach(e->{
         ProcessStageAttrDTO dto = new ProcessStageAttrDTO();
         BeanUtil.convert(e,dto);
         stageAttrsDto.add(dto);
      });
      flowTaskDTO.setStageAttrs(stageAttrsDto);
      //放入流程阶段、流程modelkey
      variables.put(TASKID,crruentActivityId);
      variables.put(PROCESSINSTANCEID,processInstanceId);
      return flowTaskDTO;
   }
}