xiangpei
2025-01-03 310f2ec1d4bc58a911701ba0b902f27a3e17efb6
Merge remote-tracking branch 'origin/master'
3个文件已修改
81 ■■■■■ 已修改文件
business/src/main/java/com/ycl/listener/flowable/FlowableOverTimeListener.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/task/FlowableTask.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/listener/flowable/FlowableOverTimeListener.java
@@ -7,6 +7,7 @@
import com.ycl.mapper.ProcessCodingMapper;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.impl.el.FixedValue;
import org.flowable.engine.HistoryService;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.service.delegate.DelegateTask;
@@ -19,7 +20,7 @@
/**
 * 任务监听器
 *
 * <p>
 * create(创建):在任务被创建且所有的任务属性设置完成后才触发
 * assignment(指派):在任务被分配给某个办理人之后触发
 * complete(完成):在配置了监听器的上一个任务完成时触发
@@ -30,7 +31,7 @@
 */
@Slf4j
@Component
public class FlowableOverTimeListener extends FlowServiceFactory implements TaskListener {
public class FlowableOverTimeListener implements TaskListener {
    /**
     * 黄码时间
     */
@@ -49,6 +50,7 @@
        log.info("触发超时监听器:{}", delegateTask);
        //Flowable的bean自己管理的需要手动获取
        ProcessCodingMapper processCodingMapper = SpringUtils.getBean(ProcessCodingMapper.class);
        HistoryService historyService = SpringUtils.getBean(HistoryService.class);
        //任务id
        String taskId = delegateTask.getId();
        //流程实例id
@@ -57,40 +59,32 @@
        processCoding.setTaskId(taskId);
        processCoding.setProcessInsId(processInstanceId);
        processCoding.setTaskDefKey(delegateTask.getTaskDefinitionKey());
        //涉及到驳回,需要查一下这个节点是否已经添加过了,如果添加过就不进行后续操作
        List<ProcessCoding> processCodings = processCodingMapper.selectList(new QueryWrapper<ProcessCoding>()
                .eq("process_ins_id", processInstanceId)
                .eq("task_def_key", delegateTask.getTaskDefinitionKey()));
        if (CollectionUtils.isEmpty(processCodings)) {
            processCoding.setStatus(GREEN);
            if (yellowTime != null && yellowTime.getValue(delegateTask) != null) {
                processCoding.setYellowTime(Integer.parseInt(yellowTime.getValue(delegateTask).toString()));
            }
            if (redTime != null && redTime.getValue(delegateTask) != null) {
                processCoding.setRedTime(Integer.parseInt(redTime.getValue(delegateTask).toString()));
            }
            if (startTaskId != null && startTaskId.getValue(delegateTask) != null) {
                String taskDefKey = startTaskId.getValue(delegateTask).toString();
                //通过流程实例id和节点定义id找到对应taskId
                if (delegateTask.getTaskDefinitionKey().equals(taskDefKey)) {
                    //当前节点为开始计时节点
                    processCoding.setStartTaskId(delegateTask.getId());
                } else {
                    //开始节点从历史节点查询 取多条中最早的一条
                    List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
                            .processInstanceId(processInstanceId)
                            .taskDefinitionKey(delegateTask.getTaskDefinitionKey())
                            .orderByHistoricTaskInstanceStartTime()
                            .asc()
                            .list();
                    if (!CollectionUtils.isEmpty(list)) {
                        HistoricTaskInstance hisTask = list.get(0);
                        processCoding.setStartTaskId(hisTask.getId());
                    }
                }
            }
            processCodingMapper.insert(processCoding);
            log.info("添加节点到定时器");
        processCoding.setStatus(GREEN);
        if (yellowTime != null && yellowTime.getValue(delegateTask) != null) {
            processCoding.setYellowTime(Integer.parseInt(yellowTime.getValue(delegateTask).toString()));
        }
        if (redTime != null && redTime.getValue(delegateTask) != null) {
            processCoding.setRedTime(Integer.parseInt(redTime.getValue(delegateTask).toString()));
        }
        //设置开始节点
        if (startTaskId != null && startTaskId.getValue(delegateTask) != null) {
            String taskDefKey = startTaskId.getValue(delegateTask).toString();
            //开始节点从历史节点查询 取多条中最早的一条
            List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
                    .processInstanceId(processInstanceId)
                    .taskDefinitionKey(taskDefKey)
                    .orderByHistoricTaskInstanceStartTime()
                    .asc()
                    .list();
            if (!CollectionUtils.isEmpty(list)) {
                HistoricTaskInstance hisTask = list.get(0);
                processCoding.setStartTaskId(hisTask.getId());
            } else {
                //如果为空,说明流程首次走到taskDefKey节点
                processCoding.setStartTaskId(delegateTask.getId());
            }
        }
        processCodingMapper.insert(processCoding);
        log.info("添加节点到定时器");
    }
}
business/src/main/java/com/ycl/task/FlowableTask.java
@@ -96,15 +96,9 @@
    private Map<String, Date> getStartTaskList(List<ProcessCoding> processCodingList) {
        //查出任务计时起始节点集合
        List<String> startTaskIds = processCodingList.stream().map(ProcessCoding::getStartTaskId).collect(Collectors.toList());
        //查出起始计时节点数据 注意正在进行的任务不会进入his表 结束了才会进入 所以需要查两张表
        //查出起始计时节点数据
        Map<String, Date> startDateMap = new HashMap<>();
        List<Task> startTasks = taskService.createTaskQuery().taskIds(startTaskIds).list();
        List<HistoricTaskInstance> hisStartTasks = historyService.createHistoricTaskInstanceQuery().taskIds(startTaskIds).list();
        if (!CollectionUtils.isEmpty(startTasks)) {
            startTasks.forEach(task -> {
                startDateMap.put(task.getId(), task.getCreateTime());
            });
        }
        if (!CollectionUtils.isEmpty(hisStartTasks)) {
            hisStartTasks.forEach(hisTask -> {
                startDateMap.put(hisTask.getId(), hisTask.getStartTime());
flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -798,7 +798,6 @@
                    .processInstanceId(procInsId)
                    .orderByHistoricActivityInstanceStartTime()
                    .desc().list();
            Date now = new Date();
            //扩展 获取这个流程实例的监控信息 key:TaskId value:实体类
            Map<String, ProcessCoding> processCodingMap = processCodingMapper.selectList(new QueryWrapper<ProcessCoding>().eq("process_ins_id", procInsId))
                    .stream()
@@ -864,6 +863,7 @@
                    //扩展 判断是否超时
                    ProcessCoding processCoding = processCodingMap.get(histIns.getTaskId());
                    if(processCoding!=null){
                        //通过耗时判断是否是代办节点
                        //如果任务是代办节点
                        if (flowTask.getDuration() == null) {
                            if(RED.equals(processCoding.getStatus()) || YELLOW.equals(processCoding.getStatus())){
@@ -1129,8 +1129,9 @@
                    .finished()
                    .list();
            //获取这个流程实例的监控信息 key:TaskId value:实体类
            Map<String, ProcessCoding> processCodingMap = processCodingMapper.selectList(new QueryWrapper<ProcessCoding>().eq("process_ins_id", procInsId))
            //扩展 获取这个流程实例的监控信息 key:TaskId value:实体类
            Map<String, ProcessCoding> processCodingMap = processCodingMapper
                    .selectList(new QueryWrapper<ProcessCoding>().eq("process_ins_id", procInsId))
                    .stream()
                    .collect(Collectors.toMap(ProcessCoding::getTaskId, Function.identity()));
            // 保存已经完成的流程节点编号