From ed43774129f2278aa6248242c6ff145bde1a625d Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 27 Mar 2024 22:23:02 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=BF=87=E6=9C=9F=E8=87=AA=E5=8A=A8=E5=AE=A1=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/common/enums/TaskStatusEnum.java | 6 +- .../flowable/config/FlowableConfig.java | 4 +- .../config/GlobalFlowableListener.java | 67 +++++++++++++++---- .../handler/TaskTimeoutJobHandler.java | 38 +++++++++++ 4 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java index 03be8dc53..7b2f55c20 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java @@ -58,7 +58,11 @@ public enum TaskStatusEnum { /** * 减签 */ - SIGN_OFF("sign_off", "减签"); + SIGN_OFF("sign_off", "减签"), + /** + * 超时 + */ + TIMEOUT("timeout", "超时"); /** * 状态 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java index 95233d1eb..1494bf37f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java @@ -1,8 +1,7 @@ package org.dromara.workflow.flowable.config; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import org.flowable.common.engine.impl.cfg.IdGenerator; +import org.dromara.workflow.flowable.handler.TaskTimeoutJobHandler; import org.flowable.spring.SpringProcessEngineConfiguration; import org.flowable.spring.boot.EngineConfigurationConfigurer; import org.springframework.beans.factory.annotation.Autowired; @@ -28,5 +27,6 @@ public class FlowableConfig implements EngineConfigurationConfigurer identifierGenerator.nextId(null).toString()); processEngineConfiguration.setEventListeners(Collections.singletonList(globalFlowableListener)); + processEngineConfiguration.addCustomJobHandler(new TaskTimeoutJobHandler()); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java index a37c787da..b59fb45b2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java @@ -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 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 list = runtimeService.createExecutionQuery().activityId(attachedToRefId).list(); - for (Execution ex : list) { - Task task = QueryUtils.taskQuery().executionId(ex.getId()).singleResult(); - if (task != null) { - List 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 list = runtimeService.createExecutionQuery().activityId(attachedToRefId).list(); + for (Execution ex : list) { + Task task = QueryUtils.taskQuery().executionId(ex.getId()).singleResult(); + if (task != null) { + List taskComments = taskService.getTaskComments(task.getId()); + if (CollUtil.isEmpty(taskComments)) { + taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), "超时自动审批!"); + } + } } } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java new file mode 100644 index 000000000..7685423fc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/TaskTimeoutJobHandler.java @@ -0,0 +1,38 @@ +package org.dromara.workflow.flowable.handler; + +import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.TaskService; +import org.flowable.engine.impl.jobexecutor.TimerEventHandler; +import org.flowable.engine.impl.util.CommandContextUtil; +import org.flowable.job.service.JobHandler; +import org.flowable.job.service.impl.persistence.entity.JobEntity; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.flowable.variable.api.delegate.VariableScope; + +/** + * 办理超时(过期)任务 + * + * @author may + */ +public class TaskTimeoutJobHandler extends TimerEventHandler implements JobHandler { + + public static final String TYPE = "taskTimeout"; + + @Override + public String getType() { + return TYPE; + } + + @Override + public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) { + TaskService taskService = CommandContextUtil.getProcessEngineConfiguration(commandContext) + .getTaskService(); + Task task = taskService.createTaskQuery().taskId(configuration).singleResult(); + if (task != null) { + taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TIMEOUT.getStatus(), "超时自动审批!"); + taskService.complete(configuration); + } + } +}