ソースを参照

仿钉钉流程设计- 任务拒绝,跳转到 EndEvent 结束流程

jason 1 年間 前
コミット
7423f9ddad

+ 3 - 5
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/custom/delegate/MultiInstanceServiceTaskDelegate.java

@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.custom.delegate;
 
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.BooleanUtil;
-import cn.iocoder.yudao.module.bpm.enums.task.BpmCommentTypeEnum;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
@@ -24,17 +23,16 @@ public class MultiInstanceServiceTaskDelegate implements JavaDelegate {
 
     @Override
     public void execute(DelegateExecution execution) {
+
         String attachUserTaskId = BpmnModelUtils.parseExtensionElement(execution.getCurrentFlowElement(),
                 BpmnModelConstants.SERVICE_TASK_ATTACH_USER_TASK_ID);
         Assert.notNull(attachUserTaskId, "附属的用户任务 Id 不能为空");
         // 获取会签任务是否被拒绝
         Boolean userTaskRejected = execution.getVariable(String.format("%s_reject", attachUserTaskId), Boolean.class);
-        // 如果会签任务被拒绝, 终止流程
-        // TODO @jason:【重要】需要测试下,如果基于 createChangeActivityStateBuilder()、changeState 到结束节点,实现审批不通过;
-        // 注意:需要考虑 bpmn 的高亮问题;(不过这个,未来可能会废弃掉!)
+        // 如果会签任务被拒绝, 终止流程, 跳转到 EndEvent 节点
         if (BooleanUtil.isTrue(userTaskRejected)) {
             processInstanceService.updateProcessInstanceReject(execution.getProcessInstanceId(),
-                    BpmCommentTypeEnum.REJECT.formatComment("会签任务拒绝人数满足条件"));
+                   execution.getCurrentActivityId(), "会签任务未达到通过比例" );
         }
     }
 

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java

@@ -41,7 +41,7 @@ public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEvent
 
     @Override
     protected void processCompleted(FlowableEngineEntityEvent event) {
-        processInstanceService.updateProcessInstanceWhenApprove((ProcessInstance)event.getEntity());
+        processInstanceService.updateProcessInstanceWhenCompleted((ProcessInstance)event.getEntity());
     }
 
 }

+ 6 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java

@@ -136,6 +136,12 @@ public class BpmnModelUtils {
         return (StartEvent) CollUtil.findOne(process.getFlowElements(), flowElement -> flowElement instanceof StartEvent);
     }
 
+    public static EndEvent getEndEvent(BpmnModel model) {
+        Process process = model.getMainProcess();
+        // 从 flowElementList 找 endEvent. TODO 多个 EndEvent 会有问题
+        return (EndEvent) CollUtil.findOne(process.getFlowElements(), flowElement -> flowElement instanceof EndEvent);
+    }
+
     public static BpmnModel getBpmnModel(byte[] bpmnBytes) {
         if (ArrayUtil.isEmpty(bpmnBytes)) {
             return null;

+ 9 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java

@@ -137,8 +137,16 @@ public interface BpmProcessInstanceService {
      * 更新 ProcessInstance 拓展记录为不通过
      *
      * @param id     流程编号
+     * @param currentActivityId  当前的活动Id
      * @param reason 理由。例如说,审批不通过时,需要传递该值
      */
-    void updateProcessInstanceReject(String id, String reason);
+    void updateProcessInstanceReject(String id, String currentActivityId,  String reason);
+
+    /**
+     * 当流程结束时候。 更新 ProcessInstance
+     *
+     * @param instance 流程任务
+     */
+    void updateProcessInstanceWhenCompleted(ProcessInstance instance);
 
 }

ファイルの差分が大きいため隠しています
+ 0 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java


+ 4 - 7
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java

@@ -5,7 +5,6 @@ import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
@@ -353,19 +352,17 @@ public class BpmTaskServiceImpl implements BpmTaskService {
             return;
         } else if (userTaskRejectHandlerType == BpmUserTaskRejectHandlerType.FINISH_PROCESS_BY_REJECT_NUMBER) {
             // 3.3 按拒绝人数终止流程
-            // TODO @jason:建议抛出系统异常。类似 throw new IllegalStateException()
             if (!flowElement.hasMultiInstanceLoopCharacteristics()) {
-                log.error("[rejectTask] 用户任务拒绝处理类型配置错误, 按拒绝人数终止流程只能用于会签任务");
-                throw exception(GlobalErrorCodeConstants.ERROR_CONFIGURATION);
+                log.error("[rejectTask] 按拒绝人数终止流程类型,只能用于会签任务. 当前任务【{}】不是会签任务", task.getId());
+                throw new IllegalStateException("按拒绝人数终止流程类型,只能用于会签任务");
             }
             // 设置变量值为拒绝
             runtimeService.setVariableLocal(task.getExecutionId(), BpmConstants.TASK_VARIABLE_STATUS, BpmTaskStatusEnum.REJECT.getStatus());
-            // 完成任务
             taskService.complete(task.getId());
             return;
         }
-        // 3.4 其他情况 终止流程。 TODO 后续可能会增加处理类型
-        processInstanceService.updateProcessInstanceReject(instance.getProcessInstanceId(), reqVO.getReason());
+        // 3.4 其他情况 终止流程。
+        processInstanceService.updateProcessInstanceReject(instance.getProcessInstanceId(), task.getTaskDefinitionKey(),  reqVO.getReason());
     }
 
     /**

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません