fuliqi
2025-01-03 329b1cb2b08a4043af1262872bb8de88cf665219
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("添加节点到定时器");
    }
}