package org.springblade.mdm.flow.service; import com.baomidou.mybatisplus.core.metadata.IPage; 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.task.Comment; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.*; import org.springblade.mdm.basesetting.machine.MachineService; import org.springblade.mdm.flow.entity.MdmFlowProcess; import org.springblade.mdm.flow.util.MdmFlowCache; import org.springblade.mdm.flow.vo.FlowVO; import org.springblade.mdm.program.entity.ProcessProgRef; import org.springblade.mdm.program.service.ProcessProgRefService; import org.springblade.system.feign.IUserClient; import org.springblade.system.pojo.entity.User; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Collections; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; /** * 流程业务实现类 * * @author Chill */ @Service @AllArgsConstructor public class FlowBusinessService { private final RuntimeService runtimeService; private final TaskService taskService; private final HistoryService historyService; private final IUserClient userClient; private final ProcessProgRefService processProgRefService; private final ApproveRecordService approveRecordService; /** * 查询我的流程(个人待办列表) * @param page * @param createTimeBegin * @param createTimeEnd * @param keyword * @return */ public IPage selectTodoPage(IPage page, LocalDateTime createTimeBegin, LocalDateTime createTimeEnd, String keyword) { //String taskUser = TaskUtil.getTaskUser(); String userId = "" + AuthUtil.getUserId(); List flowList = new LinkedList<>(); TaskQuery todoQuery = taskService.createTaskQuery().taskAssignee(userId).active().includeProcessVariables(); if (Func.isNotEmpty(createTimeBegin)) { todoQuery.taskCreatedAfter(DateUtil.toDate(createTimeBegin)); ////如果查询实例的开始时间:只能用以下这个,先查出实例id来 //todoQuery.processInstanceIdIn() } if (Func.isNotEmpty(createTimeEnd)) { todoQuery.taskCreatedBefore(DateUtil.toDate(createTimeEnd)); //todoQuery.taskInProgressStartTimeBefore(DateUtil.toDate(createTimeEnd)); } if (Func.isNotEmpty(keyword)) { addKeywordCondition(todoQuery, keyword); } todoQuery.orderByTaskCreateTime().desc(); // 构建列表数据 FlowVO bladeFlow = new FlowVO(); buildFlowTaskList(bladeFlow, flowList, todoQuery);//FlowEngineConstant.STATUS_TODO , "todo" flowList.forEach(flowVO -> { if(flowVO.getVariables().containsKey("machineCode")){ //Machine machinemachineService.getByCode((String)flowVO.getVariables().get("machineCode")) } }); // 计算总数 long count = todoQuery.count(); // 设置页数 page.setSize(count); // 设置总数 page.setTotal(count); // 设置数据 page.setRecords(flowList); return page; } void addKeywordCondition(TaskQuery todoQuery,String keyword) { if(Func.isNotEmpty(keyword)) { todoQuery.or(); todoQuery.processVariableValueLike("processNo", "%" + keyword + "%"); todoQuery.processVariableValueLike("machineCode", "%" + keyword + "%"); todoQuery.processVariableValueLike("machineMode", "%" + keyword + "%"); todoQuery.processVariableValueLike("processName", "%" + keyword + "%"); todoQuery.processVariableValueLike("processEdition", "%" + keyword + "%"); todoQuery.processVariableValueLike("craftEdition", "%" + keyword + "%"); todoQuery.endOr(); } } /* @Override public IPage selectSendPage(IPage page, BladeFlow bladeFlow) { String taskUser = TaskUtil.getTaskUser(); List flowList = new LinkedList<>(); HistoricProcessInstanceQuery historyQuery = historyService.createHistoricProcessInstanceQuery().startedBy(taskUser).orderByProcessInstanceStartTime().desc(); if (bladeFlow.getCategory() != null) { historyQuery.processDefinitionCategory(bladeFlow.getCategory()); } if (bladeFlow.getProcessDefinitionName() != null) { historyQuery.processDefinitionName(bladeFlow.getProcessDefinitionName()); } if (bladeFlow.getBeginDate() != null) { historyQuery.startedAfter(bladeFlow.getBeginDate()); } if (bladeFlow.getEndDate() != null) { historyQuery.startedBefore(bladeFlow.getEndDate()); } // 查询列表 List historyList = historyQuery.listPage(Func.toInt((page.getCurrent() - 1) * page.getSize()), Func.toInt(page.getSize())); historyList.forEach(historicProcessInstance -> { BladeFlow flow = new BladeFlow(); // historicProcessInstance flow.setCreateTime(historicProcessInstance.getStartTime()); flow.setEndTime(historicProcessInstance.getEndTime()); flow.setVariables(historicProcessInstance.getProcessVariables()); String[] businessKey = Func.toStrArray(StringPool.COLON, historicProcessInstance.getBusinessKey()); if (businessKey.length > 1) { flow.setBusinessTable(businessKey[0]); flow.setBusinessId(businessKey[1]); } flow.setHistoryActivityName(historicProcessInstance.getName()); flow.setProcessInstanceId(historicProcessInstance.getId()); flow.setHistoryProcessInstanceId(historicProcessInstance.getId()); // ProcessDefinition FlowProcess processDefinition = FlowCache.getProcessDefinition(historicProcessInstance.getProcessDefinitionId()); flow.setProcessDefinitionId(processDefinition.getId()); flow.setProcessDefinitionName(processDefinition.getName()); flow.setProcessDefinitionVersion(processDefinition.getVersion()); flow.setProcessDefinitionKey(processDefinition.getKey()); flow.setCategory(processDefinition.getCategory()); flow.setCategoryName(FlowCache.getCategoryName(processDefinition.getCategory())); flow.setProcessInstanceId(historicProcessInstance.getId()); // HistoricTaskInstance List historyTasks = historyService.createHistoricTaskInstanceQuery().processInstanceId(historicProcessInstance.getId()).orderByHistoricTaskInstanceEndTime().desc().list(); if (Func.isNotEmpty(historyTasks)) { HistoricTaskInstance historyTask = historyTasks.iterator().next(); flow.setTaskId(historyTask.getId()); flow.setTaskName(historyTask.getName()); flow.setTaskDefinitionKey(historyTask.getTaskDefinitionKey()); } // Status if (historicProcessInstance.getEndActivityId() != null) { flow.setProcessIsFinished(FlowEngineConstant.STATUS_FINISHED); } else { flow.setProcessIsFinished(FlowEngineConstant.STATUS_UNFINISHED); } flow.setStatus(FlowEngineConstant.STATUS_FINISH); flowList.add(flow); }); // 计算总数 long count = historyQuery.count(); // 设置总数 page.setTotal(count); page.setRecords(flowList); return page; } @Override public IPage selectDonePage(IPage page, BladeFlow bladeFlow) { String taskUser = TaskUtil.getTaskUser(); List flowList = new LinkedList<>(); HistoricTaskInstanceQuery doneQuery = historyService.createHistoricTaskInstanceQuery().taskAssignee(taskUser).finished() .includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc(); if (bladeFlow.getCategory() != null) { doneQuery.processCategoryIn(Func.toStrList(bladeFlow.getCategory())); } if (bladeFlow.getProcessDefinitionName() != null) { doneQuery.processDefinitionName(bladeFlow.getProcessDefinitionName()); } if (bladeFlow.getBeginDate() != null) { doneQuery.taskCompletedAfter(bladeFlow.getBeginDate()); } if (bladeFlow.getEndDate() != null) { doneQuery.taskCompletedBefore(bladeFlow.getEndDate()); } // 查询列表 List doneList = doneQuery.listPage(Func.toInt((page.getCurrent() - 1) * page.getSize()), Func.toInt(page.getSize())); doneList.forEach(historicTaskInstance -> { BladeFlow flow = new BladeFlow(); flow.setTaskId(historicTaskInstance.getId()); flow.setTaskDefinitionKey(historicTaskInstance.getTaskDefinitionKey()); flow.setTaskName(historicTaskInstance.getName()); flow.setAssignee(historicTaskInstance.getAssignee()); flow.setCreateTime(historicTaskInstance.getCreateTime()); flow.setExecutionId(historicTaskInstance.getExecutionId()); flow.setHistoryTaskEndTime(historicTaskInstance.getEndTime()); flow.setVariables(historicTaskInstance.getProcessVariables()); FlowProcess processDefinition = FlowCache.getProcessDefinition(historicTaskInstance.getProcessDefinitionId()); flow.setProcessDefinitionId(processDefinition.getId()); flow.setProcessDefinitionName(processDefinition.getName()); flow.setProcessDefinitionKey(processDefinition.getKey()); flow.setProcessDefinitionVersion(processDefinition.getVersion()); flow.setCategory(processDefinition.getCategory()); flow.setCategoryName(FlowCache.getCategoryName(processDefinition.getCategory())); flow.setProcessInstanceId(historicTaskInstance.getProcessInstanceId()); flow.setHistoryProcessInstanceId(historicTaskInstance.getProcessInstanceId()); HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance((historicTaskInstance.getProcessInstanceId())); if (Func.isNotEmpty(historicProcessInstance)) { String[] businessKey = Func.toStrArray(StringPool.COLON, historicProcessInstance.getBusinessKey()); flow.setBusinessTable(businessKey[0]); flow.setBusinessId(businessKey[1]); if (historicProcessInstance.getEndActivityId() != null) { flow.setProcessIsFinished(FlowEngineConstant.STATUS_FINISHED); } else { flow.setProcessIsFinished(FlowEngineConstant.STATUS_UNFINISHED); } } flow.setStatus(FlowEngineConstant.STATUS_FINISH); flowList.add(flow); }); // 计算总数 long count = doneQuery.count(); // 设置总数 page.setTotal(count); page.setRecords(flowList); return page; } */ /** * 构建流程 * * @param bladeFlow 流程通用类 * @param flowList 流程列表 * @param taskQuery 任务查询类 */ private void buildFlowTaskList(FlowVO bladeFlow, List flowList, TaskQuery taskQuery) { if (bladeFlow.getCategory() != null) { taskQuery.processCategoryIn(Func.toStrList(bladeFlow.getCategory())); } if (bladeFlow.getProcessDefinitionName() != null) { taskQuery.processDefinitionName(bladeFlow.getProcessDefinitionName()); } if (bladeFlow.getBeginDate() != null) { taskQuery.taskCreatedAfter(bladeFlow.getBeginDate()); } if (bladeFlow.getEndDate() != null) { taskQuery.taskCreatedBefore(bladeFlow.getEndDate()); } List tasks = taskQuery.list(); tasks.forEach(task -> { FlowVO flow = new FlowVO(); flow.setTaskId(task.getId()); flow.setTaskDefinitionKey(task.getTaskDefinitionKey()); flow.setTaskName(task.getName()); flow.setAssignee(task.getAssignee()); flow.setCreateTime(task.getCreateTime()); flow.setClaimTime(task.getClaimTime()); flow.setExecutionId(task.getExecutionId()); flow.setVariables(task.getProcessVariables()); flow.setDueDate(task.getDueDate()); flow.setProcessDefinitionId(task.getProcessDefinitionId()); //flow.setProcessDefinitionKey(processDefinition.getKey()); //flow.setProcessDefinitionVersion(processDefinition.getVersion()); flow.setProcessInstanceId(task.getProcessInstanceId()); // 查询流程实例创建时间 HistoricProcessInstance historicProcess = historyService.createHistoricProcessInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .singleResult(); flow.setProcessCreateTime(historicProcess.getStartTime()); R ru = userClient.userInfoById(Long.valueOf(historicProcess.getStartUserId())); if(ru.isSuccess()) { flow.setStartUserName(ru.getData().getName()); } ; List comments = lastStepComments(task);//taskService.getTaskComments(task.getId()); if(!comments.isEmpty()){ flow.setComment(comments.get(0).getFullMessage()); } MdmFlowProcess processDefinition = MdmFlowCache.getProcessDefinition(task.getProcessDefinitionId()); flow.setCategory(processDefinition.getCategory()); flow.setCategoryName(MdmFlowCache.getCategoryName(processDefinition.getCategory())); flow.setProcessDefinitionId(processDefinition.getId()); flow.setProcessDefinitionName(processDefinition.getName()); flow.setProcessDefinitionKey(processDefinition.getKey()); flow.setProcessDefinitionVersion(processDefinition.getVersion()); flow.setProcessInstanceId(task.getProcessInstanceId()); //flow.setStatus(status); flowList.add(flow); }); } List lastStepComments(Task currentTask){ List previousTasks = historyService.createHistoricActivityInstanceQuery() .processInstanceId(currentTask.getProcessInstanceId()) .activityType("userTask") // 直接查询用户任务类型 .orderByHistoricActivityInstanceEndTime() .desc() .list() .stream() .filter(activity -> !activity.getActivityId().equals(currentTask.getTaskDefinitionKey())) .map(activity -> historyService.createHistoricTaskInstanceQuery() .taskDefinitionKey(activity.getActivityId()) .processInstanceId(activity.getProcessInstanceId()) .orderByHistoricTaskInstanceEndTime() .desc() .list() ) .flatMap(List::stream) .toList(); List comments; if (!previousTasks.isEmpty()) { return taskService.getTaskComments(previousTasks.get(0).getId()); }else{ return Collections.emptyList(); } } /** * 获取历史流程 * * @param processInstanceId 流程实例id * @return HistoricProcessInstance */ private HistoricProcessInstance getHistoricProcessInstance(String processInstanceId) { return historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); } public IPage selectAllTaskPage(IPage page, String keyword) { List flowList = new LinkedList<>(); TaskQuery todoQuery = taskService.createTaskQuery().active().includeProcessVariables(); addKeywordCondition(todoQuery, keyword); todoQuery.orderByTaskCreateTime().desc(); // 构建列表数据 FlowVO bladeFlow = new FlowVO(); buildFlowTaskList(bladeFlow, flowList, todoQuery);//FlowEngineConstant.STATUS_TODO // 计算总数 long count = todoQuery.count(); // 设置页数 page.setSize(count); // 设置总数 page.setTotal(count); // 设置数据 page.setRecords(flowList); return page; } /** * 超时任务查询 * @param page 分页信息 * @param keyword 关键字 * @return 分页数据 */ public IPage selectOvertimePage(IPage page, LocalDate createTimeBegin, LocalDate createTimeEnd, String assigneeName, String keyword) { List flowList = new LinkedList<>(); Date now = new Date(); TaskQuery todoQuery = taskService.createTaskQuery().taskDueBefore(now).active().includeProcessVariables(); if(Func.isNotEmpty(createTimeBegin)) { todoQuery.taskCreatedAfter(DateUtil.toDate(createTimeBegin)); } if(Func.isNotEmpty(createTimeEnd)) { todoQuery.taskCreatedBefore(DateUtil.toDate(createTimeEnd.plusDays(1))); } if(Func.isNotEmpty(keyword)) { todoQuery.taskVariableValueLike("assigneeName", "%"+assigneeName+"%"); } addKeywordCondition(todoQuery, keyword); todoQuery.orderByTaskCreateTime().desc(); // 构建列表数据 FlowVO bladeFlow = new FlowVO(); buildFlowTaskList(bladeFlow, flowList, todoQuery);//FlowEngineConstant.STATUS_TODO // 计算总数 long count = todoQuery.count(); // 设置页数 page.setSize(count); // 设置总数 page.setTotal(count); // 设置数据 page.setRecords(flowList); return page; } /** * 流程查询 功能 的分页 * @param page * @param createTimeBegin * @param createTimeEnd * @param keyword * @return */ public IPage selectSearchPage(IPage page, LocalDate createTimeBegin, LocalDate createTimeEnd, String keyword) { List flowList = new LinkedList<>(); Date now = new Date(); TaskQuery taskQuery = taskService.createTaskQuery().active().includeProcessVariables(); if(Func.isNotEmpty(createTimeBegin)) { taskQuery.taskCreatedAfter(DateUtil.toDate(createTimeBegin)); } if(Func.isNotEmpty(createTimeEnd)) { taskQuery.taskCreatedBefore(DateUtil.toDate(createTimeEnd.plusDays(1))); } addKeywordCondition(taskQuery, keyword); taskQuery.orderByTaskCreateTime().desc(); // 构建列表数据 FlowVO bladeFlow = new FlowVO(); buildFlowTaskList(bladeFlow, flowList, taskQuery);//FlowEngineConstant.STATUS_TODO // 计算总数 long count = taskQuery.count(); // 设置页数 page.setSize(count); // 设置总数 page.setTotal(count); // 设置数据 page.setRecords(flowList); return page; } public void deleteProcessInstance(String processInstancesId) { runtimeService.deleteProcessInstance(processInstancesId, "流程查询-删除"); //TODO 删除出关联字段 } }