Просмотр исходного кода

【功能优化】工作流:流程详情的重构 60%:参考钉钉,加签审批后,也成为独立节点

YunaiV 7 месяцев назад
Родитель
Сommit
05979254ca

+ 3 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailReqVO.java

@@ -15,12 +15,12 @@ public class BpmApprovalDetailReqVO {
     @Schema(description = "流程定义的编号", example = "1024")
     private String processDefinitionId; // 使用场景:发起流程时,传流程定义 ID
 
+    @Schema(description = "流程变量")
+    private Map<String, Object> processVariables; // 使用场景:同 processDefinitionId,用于流程预测
+
     @Schema(description = "流程实例的编号", example = "1024")
     private String processInstanceId;  // 使用场景:流程已发起时候传流程实例 ID
 
-    @Schema(description = "流程变量")
-    private Map<String, Object> processVariable; // 使用场景:同 processDefinitionId,用于流程预测
-
     // TODO @芋艿:如果未来 BPMN 增加流程图,它没有发起人节点,会有问题。
     @Schema(description = "流程活动编号", example = "StartUserNode")
     private String activityId; // 用于获取表单权限。1)发起流程时,传“发起人节点” activityId 可获取发起人的表单权限;2)从抄送列表界面进来时,传抄送的 activityId 可获取抄送人的表单权限;

+ 7 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java

@@ -20,7 +20,7 @@ public class BpmApprovalDetailRespVO {
     private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
 
     @Schema(description = "审批信息列表", requiredMode = Schema.RequiredMode.REQUIRED)
-    private List<ApprovalNodeInfo> approveNodes;
+    private List<NodeInfo> approveNodes;
 
     @Schema(description = "表单字段权限")
     private Map<String, String> formFieldsPermission;
@@ -40,7 +40,7 @@ public class BpmApprovalDetailRespVO {
 
     @Schema(description = "审批节点信息")
     @Data
-    public static class ApprovalNodeInfo {
+    public static class NodeInfo {
 
         @Schema(description = "节点编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "StartUserNode")
         private String id;
@@ -62,8 +62,12 @@ public class BpmApprovalDetailRespVO {
         @Schema(description = "审批节点的任务信息")
         private List<ApprovalTaskInfo> tasks;
 
+        @Schema(description = "候选人用户 ID 列表", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1818")
+        @JsonIgnore // 不返回,只是方便后续读取,赋值给 candidateUsers
+        private List<Long> candidateUserIds;
+
         @Schema(description = "候选人用户列表")
-        private List<UserSimpleBaseVO> candidateUsers; // 用于未运行任务节点
+        private List<UserSimpleBaseVO> candidateUsers; // 只包含未生成 ApprovalTaskInfo 的用户列表
 
     }
 

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

@@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.bpm.enums.definition.BpmBoundaryEventType;
 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.definition.BpmModelService;
-import cn.iocoder.yudao.module.bpm.service.task.BpmActivityService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
 import com.google.common.collect.ImmutableSet;
 import jakarta.annotation.Resource;
@@ -44,9 +43,6 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
     @Resource
     @Lazy // 解决循环依赖
     private BpmTaskService taskService;
-    @Resource
-    @Lazy // 解决循环依赖
-    private BpmActivityService activityService;
 
     public static final Set<FlowableEngineEventType> TASK_EVENTS = ImmutableSet.<FlowableEngineEventType>builder()
             .add(FlowableEngineEventType.TASK_CREATED)
@@ -72,7 +68,7 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
 
     @Override
     protected void activityCancelled(FlowableActivityCancelledEvent event) {
-        List<HistoricActivityInstance> activityList = activityService.getHistoricActivityListByExecutionId(event.getExecutionId());
+        List<HistoricActivityInstance> activityList = taskService.getHistoricActivityListByExecutionId(event.getExecutionId());
         if (CollUtil.isEmpty(activityList)) {
             log.error("[activityCancelled][使用 executionId({}) 查找不到对应的活动实例]", event.getExecutionId());
             return;

+ 0 - 30
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityService.java

@@ -1,30 +0,0 @@
-package cn.iocoder.yudao.module.bpm.service.task;
-
-import org.flowable.engine.history.HistoricActivityInstance;
-
-import java.util.List;
-
-/**
- * BPM 活动实例 Service 接口
- *
- * @author 芋道源码
- */
-public interface BpmActivityService {
-
-    /**
-     * 获得指定流程实例的活动实例列表
-     *
-     * @param processInstanceId 流程实例的编号
-     * @return 活动实例列表
-     */
-    List<HistoricActivityInstance> getActivityListByProcessInstanceId(String processInstanceId);
-
-    /**
-     * 获得执行编号对应的活动实例
-     *
-     * @param executionId 执行编号
-     * @return 活动实例
-     */
-    List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId);
-
-}

+ 0 - 37
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmActivityServiceImpl.java

@@ -1,37 +0,0 @@
-package cn.iocoder.yudao.module.bpm.service.task;
-
-import jakarta.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
-import org.flowable.engine.HistoryService;
-import org.flowable.engine.history.HistoricActivityInstance;
-import org.springframework.stereotype.Service;
-import org.springframework.validation.annotation.Validated;
-
-import java.util.List;
-
-// TODO 芋艿:准备废弃
-/**
- * BPM 活动实例 Service 实现类
- *
- * @author 芋道源码
- */
-@Service
-@Slf4j
-@Validated
-public class BpmActivityServiceImpl implements BpmActivityService {
-
-    @Resource
-    private HistoryService historyService;
-
-    @Override
-    public List<HistoricActivityInstance> getActivityListByProcessInstanceId(String processInstanceId) {
-        return historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId)
-                .orderByHistoricActivityInstanceStartTime().asc().list();
-    }
-
-    @Override
-    public List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId) {
-        return historyService.createHistoricActivityInstanceQuery().executionId(executionId).list();
-    }
-
-}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java


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

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
 import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerTypeEnum;
 import jakarta.validation.Valid;
 import org.flowable.bpmn.model.UserTask;
+import org.flowable.engine.history.HistoricActivityInstance;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.history.HistoricTaskInstance;
 
@@ -139,12 +140,20 @@ public interface BpmTaskService {
     List<Task> getTaskListByParentTaskId(String parentTaskId);
 
     /**
-     * 通过任务 ID,查询任务名 Map
+     * 获得指定流程实例的活动实例列表
      *
-     * @param taskIds 任务 ID
-     * @return 任务 ID 与名字的 Map
+     * @param processInstanceId 流程实例的编号
+     * @return 活动实例列表
+     */
+    List<HistoricActivityInstance> getActivityListByProcessInstanceId(String processInstanceId);
+
+    /**
+     * 获得执行编号对应的活动实例
+     *
+     * @param executionId 执行编号
+     * @return 活动实例
      */
-    Map<String, String> getTaskNameByTaskIds(Collection<String> taskIds);
+    List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId);
 
     // ========== Update 写入相关方法 ==========
 

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

@@ -39,6 +39,7 @@ import org.flowable.engine.HistoryService;
 import org.flowable.engine.ManagementService;
 import org.flowable.engine.RuntimeService;
 import org.flowable.engine.TaskService;
+import org.flowable.engine.history.HistoricActivityInstance;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.task.api.DelegationState;
@@ -377,12 +378,14 @@ public class BpmTaskServiceImpl implements BpmTaskService {
     }
 
     @Override
-    public Map<String, String> getTaskNameByTaskIds(Collection<String> taskIds) {
-        if (CollUtil.isEmpty(taskIds)) {
-            return Collections.emptyMap();
-        }
-        List<Task> tasks = taskService.createTaskQuery().taskIds(taskIds).list();
-        return convertMap(tasks, Task::getId, Task::getName);
+    public List<HistoricActivityInstance> getActivityListByProcessInstanceId(String processInstanceId) {
+        return historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId)
+                .orderByHistoricActivityInstanceStartTime().asc().list();
+    }
+
+    @Override
+    public List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId) {
+        return historyService.createHistoricActivityInstanceQuery().executionId(executionId).list();
     }
 
     // ========== Update 写入相关方法 ==========

+ 0 - 36
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/bo/AlreadyRunApproveNodeRespBO.java

@@ -1,36 +0,0 @@
-package cn.iocoder.yudao.module.bpm.service.task.bo;
-
-import lombok.Data;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ApprovalNodeInfo;
-
-/**
- * 已经进行中的审批节点 Response BO
- *
- * @author jason
- */
-@Data
-public class AlreadyRunApproveNodeRespBO {
-
-    /**
-     * 审批节点信息数组
-     */
-    private List<ApprovalNodeInfo> approveNodes;
-
-    /**
-     * 已运行的节点 ID 数组 (对应 Bpmn XML 节点 id)
-     */
-    private Set<String> runNodeIds;
-
-    /**
-     * 正在运行的节点的审批信息(key: activityId, value: 审批信息)
-     * <p>
-     * 用于依次审批,需要加上候选人信息
-     */
-    private Map<String, ApprovalNodeInfo> runningApprovalNodes;
-
-}

Некоторые файлы не были показаны из-за большого количества измененных файлов