package com.ycl.task;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
|
import com.ycl.domain.entity.ProjectInfo;
|
import com.ycl.domain.entity.ProjectProcess;
|
import com.ycl.factory.FlowServiceFactory;
|
import com.ycl.mapper.ProjectInfoMapper;
|
import com.ycl.mapper.ProjectProcessMapper;
|
import com.ycl.service.ProjectProcessService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.flowable.task.api.Task;
|
import org.flowable.task.api.TaskInfo;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.CollectionUtils;
|
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.stream.Collectors;
|
|
@Slf4j
|
@Component("flowableTask")
|
public class FlowableTask extends FlowServiceFactory {
|
@Autowired
|
private ProjectProcessMapper projectProcessMapper;
|
@Autowired
|
private ProjectInfoMapper projectInfoMapper;
|
|
/**
|
* 赋码任务
|
*/
|
public void expireTask() {
|
log.info("开始赋码");
|
List<Task> taskList = taskService.createTaskQuery().list();
|
if (!CollectionUtils.isEmpty(taskList)) {
|
Date now = new Date();
|
// 按超时状态分组任务
|
Map<Boolean, List<String>> processInstanceMap = taskList.stream()
|
.collect(Collectors.groupingBy(
|
task -> task.getDueDate() != null && now.after(task.getDueDate()),
|
Collectors.mapping(TaskInfo::getProcessInstanceId, Collectors.toList())
|
));
|
// 处理超时和未超时的项目
|
updateProjectCoding(processInstanceMap.get(true), "red"); // 超时项目
|
updateProjectCoding(processInstanceMap.get(false), "green"); // 未超时项目
|
}
|
log.info("结束赋码");
|
}
|
|
/**
|
* 赋码
|
*
|
* @param processInstanceIds 流程实例ID列表
|
* @param coding 赋码值
|
*/
|
private void updateProjectCoding(List<String> processInstanceIds, String coding) {
|
if (CollectionUtils.isEmpty(processInstanceIds)) {
|
return;
|
}
|
|
List<Long> projectIds = projectProcessMapper.selectList(
|
new QueryWrapper<ProjectProcess>()
|
.in("process_ins_id", processInstanceIds)
|
).stream()
|
.map(ProjectProcess::getProjectId)
|
.collect(Collectors.toList());
|
|
if (!CollectionUtils.isEmpty(projectIds)) {
|
new LambdaUpdateChainWrapper<>(projectInfoMapper)
|
.in(ProjectInfo::getId, projectIds)
|
.set(ProjectInfo::getCoding, coding)
|
.update();
|
}
|
}
|
}
|