package com.iailab.module.bpm.framework.flowable.core.listener; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.iailab.module.bpm.service.task.BpmActivityService; import com.iailab.module.bpm.service.task.BpmTaskService; import com.google.common.collect.ImmutableSet; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener; import org.flowable.engine.delegate.event.FlowableActivityCancelledEvent; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.task.api.Task; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; import java.util.Set; /** * 监听 {@link Task} 的开始与完成 * * @author jason */ @Component @Slf4j public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { @Resource @Lazy // 解决循环依赖 private BpmTaskService taskService; @Resource @Lazy // 解决循环依赖 private BpmActivityService activityService; public static final Set TASK_EVENTS = ImmutableSet.builder() .add(FlowableEngineEventType.TASK_CREATED) .add(FlowableEngineEventType.TASK_ASSIGNED) // .add(FlowableEngineEventType.TASK_COMPLETED) // 由于审批通过时,已经记录了 task 的 status 为通过,所以不需要监听了。 .add(FlowableEngineEventType.ACTIVITY_CANCELLED) .build(); public BpmTaskEventListener(){ super(TASK_EVENTS); } @Override protected void taskCreated(FlowableEngineEntityEvent event) { taskService.updateTaskStatusWhenCreated((Task) event.getEntity()); } @Override protected void taskAssigned(FlowableEngineEntityEvent event) { taskService.updateTaskExtAssign((Task)event.getEntity()); } @Override protected void activityCancelled(FlowableActivityCancelledEvent event) { List activityList = activityService.getHistoricActivityListByExecutionId(event.getExecutionId()); if (CollUtil.isEmpty(activityList)) { log.error("[activityCancelled][使用 executionId({}) 查找不到对应的活动实例]", event.getExecutionId()); return; } // 遍历处理 activityList.forEach(activity -> { if (StrUtil.isEmpty(activity.getTaskId())) { return; } taskService.updateTaskStatusWhenCanceled(activity.getTaskId()); }); } }