package com.ycl.listener.flowable; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ycl.common.utils.spring.SpringUtils; import com.ycl.domain.entity.ProcessCoding; import com.ycl.factory.FlowServiceFactory; 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; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.List; import static com.ycl.common.constant.ProcessOverTimeConstants.GREEN; /** * 任务监听器 *
* create(创建):在任务被创建且所有的任务属性设置完成后才触发
* assignment(指派):在任务被分配给某个办理人之后触发
* complete(完成):在配置了监听器的上一个任务完成时触发
* delete(删除):在任务即将被删除前触发。请注意任务由completeTask正常完成时也会触发
*
* @author Tony
* @date 2021/4/20
*/
@Slf4j
@Component
public class FlowableOverTimeListener implements TaskListener {
/**
* 黄码时间
*/
private FixedValue 黄码时长;
/**
* 红码时间
*/
private FixedValue 红码时长;
/**
* 计时起始节点定义Id
*/
private FixedValue 开始计时节点;
@Override
public void notify(DelegateTask delegateTask) {
log.info("触发超时监听器:{}", delegateTask);
//Flowable的bean自己管理的需要手动获取
ProcessCodingMapper processCodingMapper = SpringUtils.getBean(ProcessCodingMapper.class);
HistoryService historyService = SpringUtils.getBean(HistoryService.class);
//任务id
String taskId = delegateTask.getId();
//流程实例id
String processInstanceId = delegateTask.getProcessInstanceId();
ProcessCoding processCoding = new ProcessCoding();
processCoding.setTaskId(taskId);
processCoding.setProcessInsId(processInstanceId);
processCoding.setTaskDefKey(delegateTask.getTaskDefinitionKey());
//设置状态,查询是否有这个定义节点的历史数据,取最新的一条状态码,避免定时任务还未执行的误差
List