/** * BladeX Commercial License Agreement * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. *

* Use of this software is governed by the Commercial License Agreement * obtained after purchasing a license from BladeX. *

* 1. This software is for development use only under a valid license * from BladeX. *

* 2. Redistribution of this software's source code to any third party * without a commercial license is strictly prohibited. *

* 3. Licensees may copyright their own code but cannot use segments * from this software for such purposes. Copyright of this software * remains with BladeX. *

* Using this software signifies agreement to this License, and the software * must not be used for illegal purposes. *

* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is * not liable for any claims arising from secondary or illegal development. *

* Author: Chill Zhuang (bladejava@qq.com) */ 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.TaskService; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.support.Kv; import org.springblade.core.tool.utils.*; import org.springblade.flow.core.constant.ProcessConstant; import org.springblade.flow.core.pojo.entity.BladeFlow; import org.springblade.flow.core.utils.TaskUtil; import org.springblade.mdm.flow.entity.MdmFlowProcess; import org.springblade.mdm.flow.util.MdmFlowCache; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * 流程业务实现类 * * @author Chill */ @Service @AllArgsConstructor public class FlowBusinessService { private final TaskService taskService; private final HistoryService historyService; public IPage selectTodoPage(IPage page, LocalDate createTimeBegin,LocalDate 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)); //如果查询实例的开始时间:todoQuery.taskInProgressStartDueAfter() } if(Func.isNotEmpty(createTimeEnd)){ todoQuery.taskCreatedBefore(DateUtil.toDate(createTimeEnd)); } 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); //TODO 多个字段都要匹配 todoQuery.endOr(); } todoQuery.orderByTaskCreateTime().desc(); //List listt = todoQuery.list(); // 已签收的任务.caseVariableValueLike("processNo",keyword) /* TaskQuery todoQuery = taskService.createTaskQuery().taskAssignee(userId).active() .includeProcessVariables().orderByTaskCreateTime().desc(); */ // 构建列表数据 BladeFlow bladeFlow = new BladeFlow(); buildFlowTaskList(bladeFlow, flowList, todoQuery, "todo");//FlowEngineConstant.STATUS_TODO // 计算总数 long count = todoQuery.count(); // 设置页数 page.setSize(count); // 设置总数 page.setTotal(count); // 设置数据 page.setRecords(flowList); return page; } /* @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; } @Override public boolean completeTask(BladeFlow flow) { String taskId = flow.getTaskId(); String processInstanceId = flow.getProcessInstanceId(); String comment = Func.toStr(flow.getComment(), ProcessConstant.PASS_COMMENT); // 增加评论 if (StringUtil.isNoneBlank(processInstanceId, comment)) { taskService.addComment(taskId, processInstanceId, comment); } // 创建变量 Map variables = flow.getVariables(); if (variables == null) { variables = Kv.create(); } variables.put(ProcessConstant.PASS_KEY, flow.isPass()); // 完成任务 taskService.complete(taskId, variables); return true; } */ /** * 构建流程 * * @param bladeFlow 流程通用类 * @param flowList 流程列表 * @param taskQuery 任务查询类 * @param status 状态 */ private void buildFlowTaskList(BladeFlow bladeFlow, List flowList, TaskQuery taskQuery, String status) { 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 -> { BladeFlow flow = new BladeFlow(); 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.setProcessDefinitionId(task.getProcessDefinitionId()); //flow.setProcessDefinitionName(task.getprocessd); //flow.setProcessDefinitionKey(processDefinition.getKey()); //flow.setProcessDefinitionVersion(processDefinition.getVersion()); flow.setProcessInstanceId(task.getProcessInstanceId()); /* HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(task.getProcessInstanceId()); if (Func.isNotEmpty(historicProcessInstance)) { String[] businessKey = Func.toStrArray(StringPool.COLON, historicProcessInstance.getBusinessKey()); flow.setBusinessTable(businessKey[0]); flow.setBusinessId(businessKey[1]); }*/ 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); }); } /** * 获取历史流程 * * @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(); 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); //TODO 多个字段都要匹配 todoQuery.endOr(); } todoQuery.orderByTaskCreateTime().desc(); // 构建列表数据 BladeFlow bladeFlow = new BladeFlow(); buildFlowTaskList(bladeFlow, flowList, todoQuery, "todo");//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, String assigneeName,String keyword) { List flowList = new LinkedList<>(); Date now = new Date(); TaskQuery todoQuery = taskService.createTaskQuery().taskDueBefore(now).active().includeProcessVariables(); if(Func.isNotEmpty(keyword)) { todoQuery.taskVariableValueLike("assigneeName", "%"+assigneeName+"%"); } if(Func.isNotEmpty(keyword)){ todoQuery.or(); keyword = "%"+keyword+"%"; todoQuery.processVariableValueLike("processNo",keyword); todoQuery.processVariableValueLike("machineCode",keyword); todoQuery.processVariableValueLike("machineMode",keyword); todoQuery.processVariableValueLike("processName",keyword); todoQuery.processVariableValueLike("processEdition",keyword); todoQuery.processVariableValueLike("craftEdition",keyword); //TODO 多个字段都要匹配 todoQuery.endOr(); } todoQuery.orderByTaskCreateTime().desc(); // 构建列表数据 BladeFlow bladeFlow = new BladeFlow(); buildFlowTaskList(bladeFlow, flowList, todoQuery, "todo");//FlowEngineConstant.STATUS_TODO // 计算总数 long count = todoQuery.count(); // 设置页数 page.setSize(count); // 设置总数 page.setTotal(count); // 设置数据 page.setRecords(flowList); return page; } }