Эх сурвалжийг харах

修改 bpm 流程不通过的 Listener 的逻辑

YunaiV 3 жил өмнө
parent
commit
7c62b1a211

+ 18 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.adminserver.modules.bpm.enums.task;
 
+import cn.hutool.core.util.StrUtil;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -12,8 +13,24 @@ import lombok.Getter;
 @AllArgsConstructor
 public enum BpmProcessInstanceDeleteReasonEnum {
 
-    REJECT_TASK("不通过任务,原因:{}");
+    REJECT_TASK("不通过任务,原因:{}"); // 修改文案时,需要注意 isRejectReason 方法
 
     private final String reason;
 
+    /**
+     * 格式化理由
+     *
+     * @param args 参数
+     * @return 理由
+     */
+    public String format(Object... args) {
+        return StrUtil.format(reason, args);
+    }
+
+    // ========== 逻辑 ==========
+
+    public static boolean isRejectReason(String reason) {
+        return StrUtil.startWith(reason, "不通过任务,原因:");
+    }
+
 }

+ 3 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceS
 import org.activiti.api.model.shared.event.RuntimeEvent;
 import org.activiti.api.process.model.ProcessInstance;
 import org.activiti.api.process.model.events.ProcessRuntimeEvent;
+import org.activiti.api.process.runtime.events.ProcessCancelledEvent;
 import org.activiti.api.process.runtime.events.listener.ProcessEventListener;
 import org.activiti.api.process.runtime.events.listener.ProcessRuntimeEventListener;
 import org.activiti.api.task.model.events.TaskRuntimeEvent;
@@ -42,7 +43,8 @@ public class BpmProcessInstanceEventListener<T extends RuntimeEvent<?, ?>>
         }
         // 取消时,更新拓展表为取消
         if (event.getEventType() == ProcessRuntimeEvent.ProcessEvents.PROCESS_CANCELLED) {
-            processInstanceService.updateProcessInstanceExtCancel(event.getEntity());
+            processInstanceService.updateProcessInstanceExtCancel(event.getEntity(),
+                    ((ProcessCancelledEvent) event).getCause());
             return;
         }
         // 完成时,更新拓展表为已完成

+ 3 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java

@@ -144,13 +144,15 @@ public interface BpmProcessInstanceService {
      * 更新 ProcessInstance 拓展记录为取消
      *
      * @param instance 流程任务
+     * @param reason 取消原因
      */
-    void updateProcessInstanceExtCancel(org.activiti.api.process.model.ProcessInstance instance);
+    void updateProcessInstanceExtCancel(org.activiti.api.process.model.ProcessInstance instance, String reason);
 
     /**
      * 更新 ProcessInstance 拓展记录为完成
      *
      * @param instance 流程任务
+     * @param reason 原因
      */
     void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance);
 

+ 8 - 2
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java

@@ -241,7 +241,13 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
     }
 
     @Override
-    public void updateProcessInstanceExtCancel(org.activiti.api.process.model.ProcessInstance instance) {
+    public void updateProcessInstanceExtCancel(org.activiti.api.process.model.ProcessInstance instance, String reason) {
+        // 判断是否为 Reject 不通过。如果是,则不进行更新
+        if (BpmProcessInstanceDeleteReasonEnum.isRejectReason(reason)) {
+            return;
+        }
+
+        // 更新拓展表
         BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance)
                 .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置
                 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
@@ -265,7 +271,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
     public void updateProcessInstanceExtReject(String id, String comment) {
         ProcessInstance processInstance = getProcessInstance(id);
         // 删除流程实例,以实现驳回任务时,取消整个审批流程
-        deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.getReason(), comment));
+        deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(comment)));
 
         // 更新 status + result
         // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法,