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/handler/TaskTimeoutJobHandler.java | 38 +++++++++++++++++++
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/GlobalFlowableListener.java | 67 +++++++++++++++++++++++++++------
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java | 6 ++
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/config/FlowableConfig.java | 4 +-
4 files changed, 100 insertions(+), 15 deletions(-)
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 03be8dc..7b2f55c 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 @@
/**
* 鍑忕
*/
- 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 95233d1..1494bf3 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 void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setIdGenerator(() -> 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 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(), "瓒呮椂鑷姩瀹℃壒!");
+ }
+ }
}
}
}
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 0000000..7685423
--- /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);
+ }
+ }
+}
--
Gitblit v1.9.3