|
@@ -1,7 +1,10 @@
|
|
|
package org.dromara.workflow.flowable.config;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
+import org.dromara.common.core.utils.StringUtils;
|
|
|
+import org.dromara.common.tenant.helper.TenantHelper;
|
|
|
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
|
|
+import org.dromara.workflow.flowable.handler.TaskTimeoutJobHandler;
|
|
|
import org.dromara.workflow.utils.QueryUtils;
|
|
|
import org.flowable.bpmn.model.BoundaryEvent;
|
|
|
import org.flowable.bpmn.model.BpmnModel;
|
|
@@ -11,13 +14,19 @@ import org.flowable.common.engine.impl.cfg.TransactionState;
|
|
|
import org.flowable.engine.RepositoryService;
|
|
|
import org.flowable.engine.RuntimeService;
|
|
|
import org.flowable.engine.TaskService;
|
|
|
+import org.flowable.engine.impl.util.CommandContextUtil;
|
|
|
import org.flowable.engine.runtime.Execution;
|
|
|
import org.flowable.engine.task.Comment;
|
|
|
+import org.flowable.job.service.TimerJobService;
|
|
|
+import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
|
|
+import org.flowable.job.service.impl.persistence.entity.TimerJobEntity;
|
|
|
import org.flowable.task.api.Task;
|
|
|
+import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
@@ -47,6 +56,36 @@ public class GlobalFlowableListener implements FlowableEventListener {
|
|
|
FlowableEngineEventType engineEventType = (FlowableEngineEventType) flowableEvent.getType();
|
|
|
switch (engineEventType) {
|
|
|
case JOB_EXECUTION_SUCCESS -> jobExecutionSuccess((FlowableEngineEntityEvent) flowableEngineEvent);
|
|
|
+ case TASK_DUEDATE_CHANGED, TASK_CREATED -> {
|
|
|
+ FlowableEntityEvent flowableEntityEvent = (FlowableEntityEvent) flowableEngineEvent;
|
|
|
+ Object entityObject = flowableEntityEvent.getEntity();
|
|
|
+ TaskEntity task = (TaskEntity) entityObject;
|
|
|
+ if (task.getDueDate() != null && task.getDueDate().after(new Date())) {
|
|
|
+ //删除之前已经存在的定时任务
|
|
|
+ TimerJobService timerJobService = CommandContextUtil.getTimerJobService();
|
|
|
+ List<TimerJobEntity> timerJobEntityList = timerJobService.findTimerJobsByProcessInstanceId(task.getProcessInstanceId());
|
|
|
+ if (!CollUtil.isEmpty(timerJobEntityList)) {
|
|
|
+ for (TimerJobEntity timerJobEntity : timerJobEntityList) {
|
|
|
+ String taskId = timerJobEntity.getJobHandlerConfiguration();
|
|
|
+ if (task.getId().equals(taskId)) {
|
|
|
+ timerJobService.deleteTimerJob(timerJobEntity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //创建job对象
|
|
|
+ TimerJobEntity timer = timerJobService.createTimerJob();
|
|
|
+ timer.setTenantId(TenantHelper.getTenantId());
|
|
|
+ //设置job类型
|
|
|
+ timer.setJobType(JobEntity.JOB_TYPE_TIMER);
|
|
|
+ timer.setJobHandlerType(TaskTimeoutJobHandler.TYPE);
|
|
|
+ timer.setDuedate(task.getDueDate());
|
|
|
+ timer.setProcessInstanceId(task.getProcessInstanceId());
|
|
|
+ //设置任务id
|
|
|
+ timer.setJobHandlerConfiguration(task.getId());
|
|
|
+ //保存并触发事件
|
|
|
+ timerJobService.scheduleTimerJob(timer);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -72,18 +111,22 @@ public class GlobalFlowableListener implements FlowableEventListener {
|
|
|
* @param event 事件
|
|
|
*/
|
|
|
protected void jobExecutionSuccess(FlowableEngineEntityEvent event) {
|
|
|
- Execution execution = runtimeService.createExecutionQuery().executionId(event.getExecutionId()).singleResult();
|
|
|
- BpmnModel bpmnModel = repositoryService.getBpmnModel(event.getProcessDefinitionId());
|
|
|
- FlowElement flowElement = bpmnModel.getFlowElement(execution.getActivityId());
|
|
|
- if (flowElement instanceof BoundaryEvent) {
|
|
|
- String attachedToRefId = ((BoundaryEvent) flowElement).getAttachedToRefId();
|
|
|
- List<Execution> list = runtimeService.createExecutionQuery().activityId(attachedToRefId).list();
|
|
|
- for (Execution ex : list) {
|
|
|
- Task task = QueryUtils.taskQuery().executionId(ex.getId()).singleResult();
|
|
|
- if (task != null) {
|
|
|
- List<Comment> taskComments = taskService.getTaskComments(task.getId());
|
|
|
- if (CollUtil.isEmpty(taskComments)) {
|
|
|
- taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), "超时自动审批!");
|
|
|
+ if (event != null && StringUtils.isNotBlank(event.getExecutionId())) {
|
|
|
+ Execution execution = runtimeService.createExecutionQuery().executionId(event.getExecutionId()).singleResult();
|
|
|
+ if (execution != null) {
|
|
|
+ BpmnModel bpmnModel = repositoryService.getBpmnModel(event.getProcessDefinitionId());
|
|
|
+ FlowElement flowElement = bpmnModel.getFlowElement(execution.getActivityId());
|
|
|
+ if (flowElement instanceof BoundaryEvent) {
|
|
|
+ String attachedToRefId = ((BoundaryEvent) flowElement).getAttachedToRefId();
|
|
|
+ List<Execution> list = runtimeService.createExecutionQuery().activityId(attachedToRefId).list();
|
|
|
+ for (Execution ex : list) {
|
|
|
+ Task task = QueryUtils.taskQuery().executionId(ex.getId()).singleResult();
|
|
|
+ if (task != null) {
|
|
|
+ List<Comment> taskComments = taskService.getTaskComments(task.getId());
|
|
|
+ if (CollUtil.isEmpty(taskComments)) {
|
|
|
+ taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), "超时自动审批!");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|