package org.springblade.mdm.flow.service; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.IdentityService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.mdm.basesetting.machine.MachineService; import org.springblade.mdm.basesetting.machine.entity.Machine; import org.springblade.mdm.flow.constants.FlowContants; import org.springblade.mdm.flow.entity.FlowProgramFile; import org.springblade.mdm.flow.excution.AutoAssignUsersService; import org.springblade.mdm.flow.vo.TaskAssignVO; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.entity.NcProgram; import org.springblade.mdm.program.entity.ProcessProgRef; import org.springblade.mdm.program.service.NcNodeService; import org.springblade.mdm.program.service.NcProgramService; import org.springblade.mdm.program.service.ProcessProgRefService; import org.springblade.mdm.program.vo.DncSendBackData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 固化流程服务 */ @Slf4j @Service @AllArgsConstructor public class CureFlowService { private final RuntimeService runtimeService; private final HistoryService historyService; private final TaskService taskService; private final IdentityService identityService; private final NcNodeService ncNodeService; private final FlowProgramFileService flowProgramFileService; @Transactional public void startCure(List programPackageList, Map> allFlowProgramFiles) { //根据分组启动流程,并插入关联表 programPackageList.forEach(pkg -> { this.startOne(pkg,allFlowProgramFiles.get(pkg.getId())); }); } /** * 启动一个数控程序的固化流程 * @param programPackage 程序包名 节点实体 */ public void startOne(NcNode programPackage,List programNodes) { Map vars = new HashMap<>(); //该程序在计划任务时 获取编制,校对,审批的人员,作为默认用户,其中编制时第一个固定的用户 if(programPackage.getProcessInstanceId() != null) { //获取审批用户 HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(programPackage.getProcessInstanceId()).includeProcessVariables() .singleResult(); if(instance != null) {//使用任务派工流程的变量 Map oldVars = instance.getProcessVariables(); //机床编号 vars.put(FlowContants.MACHINE_CODE,oldVars.get(FlowContants.MACHINE_CODE)); //机床型号 vars.put(FlowContants.MACHINE_MODE,oldVars.get(FlowContants.MACHINE_MODE)); vars.put(FlowContants.PROCESS_NO,oldVars.get(FlowContants.PROCESS_NO)); vars.put(FlowContants.PROCESS_NAME,oldVars.get(FlowContants.PROCESS_NAME)); vars.put(FlowContants.PROCESS_EDITION,oldVars.get(FlowContants.PROCESS_EDITION)); vars.put(FlowContants.CRAFT_EDITION, oldVars.get(FlowContants.CRAFT_EDITION)); vars.put(FlowContants.DRAWING_NO,oldVars.get(FlowContants.DRAWING_NO)); vars.put(FlowContants.DRAWING_NO_EDITION,oldVars.get(FlowContants.DRAWING_NO_EDITION)); vars.put(FlowContants.PRODUCT_MODEL,oldVars.get(FlowContants.PRODUCT_MODEL)); } } //查找历史实际的审批人 List historicTasks = historyService.createHistoricTaskInstanceQuery() .orderByTaskCreateTime().desc().processInstanceId(programPackage.getProcessInstanceId()) .list(); fillHistoryAssignees(vars, historicTasks); String businessKey = "0";//业务表key identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//设置流程发起人 vars.put(FlowContants.LAST_STEP_USER_NICKNAME, AuthUtil.getNickName()); vars.put(FlowContants.TITLE,programPackage.getName()+"-固化");//自动增加标题 ProcessInstance inst = runtimeService.startProcessInstanceByKey(FlowContants.CURE_PROCESS_KEY,businessKey,vars); //更新程序包名节点的流程实例id programPackage.setProcessInstanceId(inst.getProcessInstanceId()); ncNodeService.updateById(programPackage); //更新文件的流程实例id,和 程序节点的流程文件id 并入库 programNodes.forEach(programNode -> { FlowProgramFile flowProgramFile = programNode.getFlowProgramFile(); flowProgramFile.setProcessInstanceId(inst.getProcessInstanceId()); this.flowProgramFileService.save(flowProgramFile); programNode.setFlowProgramFileId(flowProgramFile.getId()); this.ncNodeService.save(programNode); }); log.info("启动固化流程完成,实例id={}", inst.getId()); } /** * 填充历史审批人,从试切流程中查找 * @param vars 找到审批人后填充的map * @param historicTasks 历史任务集合 */ void fillHistoryAssignees(Map vars,List historicTasks){ String programmer = null; String checker = null; String senior = null; //找不到工艺员,那么查询最后一个审批的工艺员 for (HistoricTaskInstance task : historicTasks) { // 获取任务的办理人 if (task.getTaskDefinitionKey().equals("programmingTask")) { //编制 if (programmer == null) { programmer = task.getAssignee(); } } else if (task.getTaskDefinitionKey().equals("check")) { //校对 if (checker == null) { checker = task.getAssignee(); } } else if (task.getTaskDefinitionKey().equals("approveTask")) { //审核 if (senior == null) { senior = task.getAssignee(); } } } vars.put(FlowContants.PROGRAMMER,programmer); vars.put(FlowContants.CHECKER,checker); vars.put(FlowContants.SENIOR,senior); vars.put(FlowContants.ASSIGNEE,programmer); } /** * 将程序按照机器代码分组 * @param ncProgramIdList * @return */ /* Map> groupProgramsByMachineCode(List ncProgramIdList){ List programs = ncProgramService.listByIds(ncProgramIdList); return programs.stream().collect(Collectors.groupingBy(NcProgram::getMachineCode)); }*/ }