From ed43774129f2278aa6248242c6ff145bde1a625d Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: 星期三, 27 三月 2024 22:23:02 +0800
Subject: [PATCH] add 添加任务过期自动审批

---
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java |   67 +++++++++++++++++++++++++++------
 1 files changed, 55 insertions(+), 12 deletions(-)

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 a37c787..b59fb45 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.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 @@
             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 @@
      * @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(), "瓒呮椂鑷姩瀹℃壒!");
+                            }
+                        }
                     }
                 }
             }

--
Gitblit v1.9.3