|
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.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.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 TaskService taskService;
|
private final HistoryService historyService;
|
private final IUserClient userClient;
|
|
/**
|
* 查询我的流程(个人待办列表)
|
* @param page
|
* @param createTimeBegin
|
* @param createTimeEnd
|
* @param keyword
|
* @return
|
*/
|
public IPage<FlowVO> selectTodoPage(IPage<FlowVO> page, LocalDateTime createTimeBegin, LocalDateTime createTimeEnd, String keyword) {
|
//String taskUser = TaskUtil.getTaskUser();
|
String userId = "" + AuthUtil.getUserId();
|
List<FlowVO> 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<BladeFlow> selectSendPage(IPage<BladeFlow> page, BladeFlow bladeFlow) {
|
String taskUser = TaskUtil.getTaskUser();
|
List<BladeFlow> 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<HistoricProcessInstance> 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<HistoricTaskInstance> 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<BladeFlow> selectDonePage(IPage<BladeFlow> page, BladeFlow bladeFlow) {
|
String taskUser = TaskUtil.getTaskUser();
|
List<BladeFlow> 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<HistoricTaskInstance> 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<FlowVO> 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<Task> 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<User> ru = userClient.userInfoById(Long.valueOf(historicProcess.getStartUserId()));
|
if(ru.isSuccess()) {
|
flow.setStartUserName(ru.getData().getName());
|
}
|
;
|
List<Comment> 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<Comment> lastStepComments(Task currentTask){
|
List<HistoricTaskInstance> 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<Comment> 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<FlowVO> selectAllTaskPage(IPage<FlowVO> page, String keyword) {
|
|
List<FlowVO> 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<FlowVO> selectOvertimePage(IPage<FlowVO> page, LocalDate createTimeBegin, LocalDate createTimeEnd, String assigneeName, String keyword) {
|
|
List<FlowVO> 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 assigneeName
|
* @param keyword
|
* @return
|
*/
|
public IPage<FlowVO> selectSearchPage(IPage<FlowVO> page, LocalDate createTimeBegin, LocalDate createTimeEnd, String keyword) {
|
|
List<FlowVO> 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;
|
}
|
}
|