package org.springblade.mdm.flow.service; import lombok.AllArgsConstructor; import org.flowable.engine.HistoryService; 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.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.mdm.flow.constants.FlowContants; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.Map; @AllArgsConstructor @Service public class FlowCommonService { private final RuntimeService runtimeService; private final HistoryService historyService; /** * 根据流程实例id获取definitionKey * @param processInstanceId * @return */ public String getDefinitionKey(String processInstanceId){ ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); return processInstance.getProcessDefinitionKey(); } /** * 从流程变量获取发起流程的树形 * @param processInstanceId * @return */ public FlowProgramProperties getProgramProperties(String processInstanceId){ FlowProgramProperties programProperties = new FlowProgramProperties(); programProperties.setProcessInstanceId(processInstanceId); Map vars = runtimeService.getVariables(processInstanceId); programProperties.setTitle(String.valueOf(vars.get(FlowContants.TITLE))); programProperties.setDrawingNo(String.valueOf(vars.get(FlowContants.DRAWING_NO))); programProperties.setDrawingNoEdition(String.valueOf(vars.get(FlowContants.DRAWING_NO_EDITION))); programProperties.setProductModel(String.valueOf(vars.get(FlowContants.PRODUCT_MODEL))); programProperties.setProcessNo(String.valueOf(vars.get(FlowContants.PROCESS_NO))); programProperties.setProcessEdition(String.valueOf(vars.get(FlowContants.PROCESS_EDITION)));//工序版次 programProperties.setProcessName(String.valueOf(vars.get(FlowContants.PROCESS_NAME))); programProperties.setMachineCode(String.valueOf(vars.get(FlowContants.MACHINE_CODE))); programProperties.setMachineMode(String.valueOf(vars.get(FlowContants.MACHINE_MODE))); //数据处理名称为版次以前,零件号加工序号:YZL4-1100-01-50 零组件号:YZL4-1100-01 工序号 50 programProperties.setCraftEdition(String.valueOf(vars.get(FlowContants.CRAFT_EDITION))); programProperties.setHasCuredProgram(String.valueOf(vars.get(FlowContants.HAS_CURED_PROGRAM))); programProperties.setIsProcessEditionSame(String.valueOf(vars.get(FlowContants.IS_PROCESS_EDITION_SAME))); if(vars.containsKey(FlowContants.DEVIATION)) { programProperties.setDeviation(String.valueOf(vars.get(FlowContants.DEVIATION))); } if(vars.containsKey(FlowContants.CURED_NODE_ID)){ programProperties.setCuredNodeId(Func.toLong(vars.get(FlowContants.CURED_NODE_ID))); } ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); String processDefinitionKey = processInstance.getProcessDefinitionKey(); programProperties.setProcessDefinitionKey(processDefinitionKey); return programProperties; } /** * 流程是否在进行 * @param processInstanceId 实例id */ public boolean isProcessInstanceActive(String processInstanceId) { if(processInstanceId == null){ return false; } // 先查运行时表 ProcessInstance instance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); if (instance != null) { return true; } // 再查历史表确认是否曾经存在 HistoricProcessInstance historicInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); return historicInstance != null && historicInstance.getEndTime() == null; } /** * 上一步处理人 * @param processInstanceId 流程实例id * @return assignee */ public String previusAssignee(String processInstanceId) { // 获取历史任务实例 List historicTasks = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId) .orderByHistoricTaskInstanceEndTime().asc() .list(); // 获取上一个已完成的任务 String assignee = ""; if(!historicTasks.isEmpty()) { assignee = historicTasks.get(historicTasks.size() - 1).getAssignee(); } return assignee; } }