Explorar el Código

【功能修改】 整合流程详情接口

jason hace 7 meses
padre
commit
1d815c2c22

+ 1 - 12
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java

@@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
-import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
@@ -128,15 +127,13 @@ public class BpmProcessInstanceController {
                 processInstance.getProcessDefinitionId());
         BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
                 processInstance.getProcessDefinitionId());
-        String bpmnXml = BpmnModelUtils.getBpmnXml(
-                processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()));
         AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId()));
         DeptRespDTO dept = null;
         if (startUser != null && startUser.getDeptId() != null) {
             dept = deptApi.getDept(startUser.getDeptId());
         }
         return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance,
-                processDefinition, processDefinitionInfo, bpmnXml, startUser, dept));
+                processDefinition, processDefinitionInfo, startUser, dept));
     }
 
     @DeleteMapping("/cancel-by-start-user")
@@ -157,14 +154,6 @@ public class BpmProcessInstanceController {
         return success(true);
     }
 
-    @GetMapping("/get-form-fields-permission")
-    @Operation(summary = "获得表单字段权限")
-    @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
-    public CommonResult<Map<String, String>> getFormFieldsPermission(
-            @Valid BpmFormFieldsPermissionReqVO reqVO) {
-        return success(processInstanceService.getFormFieldsPermission(reqVO));
-    }
-
     @GetMapping("/get-approval-detail")
     @Operation(summary = "获得审批详情")
     @Parameter(name = "id", description = "流程实例的编号", required = true)

+ 1 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java

@@ -79,8 +79,7 @@ public class BpmTaskController {
     @Parameter(name = "processInstanceId", description = "流程实例的编号", required = true)
     @PreAuthorize("@ss.hasPermission('bpm:task:query')")
     public CommonResult<BpmTaskRespVO> getMyTodoTask(@RequestParam("processInstanceId") String processInstanceId) {
-        List<BpmTaskRespVO> taskList = taskService.getTodoTask(getLoginUserId(), processInstanceId);
-        return success(findFirst(taskList, Objects::nonNull));
+        return success(taskService.getTodoTask(getLoginUserId(), processInstanceId));
     }
 
     @GetMapping("done-page")

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

@@ -17,6 +17,12 @@ public class BpmApprovalDetailReqVO {
     @Schema(description = "流程实例的编号", example = "1024")
     private String processInstanceId;
 
+    @Schema(description = "流程活动编号",  example = "StartUserNode")
+    private String activityId; // 对应 BPMN XML 节点 Id
+
+    @Schema(description = "流程任务编号", example = "95f2f08b-621b-11ef-bf39-00ff4722db8b")
+    private String taskId; // UserTask 对应的Id
+
     @AssertTrue(message = "流程定义的编号和流程实例的编号不能同时为空")
     @JsonIgnore
     public boolean isValidProcessParam() {

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

@@ -1,11 +1,14 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
 
 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
 
 
 @Schema(description = "管理后台 - 审批详情 Response VO")
@@ -18,6 +21,22 @@ public class BpmApprovalDetailRespVO {
     @Schema(description = "审批信息列表", requiredMode = Schema.RequiredMode.REQUIRED)
     private List<ApprovalNodeInfo> approveNodes;
 
+    @Schema(description = "表单字段权限")
+    private Map<String, String> formFieldsPermission;
+
+    @Schema(description = "待办任务")
+    private BpmTaskRespVO todoTask;
+
+    /**
+     * 所属流程定义信息
+     */
+    private BpmProcessDefinitionRespVO processDefinition;
+
+    /**
+     * 所属流程实例信息
+     */
+    private BpmProcessInstanceRespVO processInstance;
+
     @Schema(description = "审批节点信息")
     @Data
     public static class ApprovalNodeInfo {

+ 0 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java

@@ -75,7 +75,6 @@ public interface BpmProcessInstanceConvert {
     default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
                                                           ProcessDefinition processDefinition,
                                                           BpmProcessDefinitionInfoDO processDefinitionExt,
-                                                          String bpmnXml,
                                                           AdminUserRespDTO startUser,
                                                           DeptRespDTO dept) {
         BpmProcessInstanceRespVO respVO = BeanUtils.toBean(processInstance, BpmProcessInstanceRespVO.class);
@@ -84,7 +83,6 @@ public interface BpmProcessInstanceConvert {
         // definition
         respVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class));
         copyTo(processDefinitionExt, respVO.getProcessDefinition());
-        respVO.getProcessDefinition().setBpmnXml(bpmnXml);
         // user
         if (startUser != null) {
             respVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));

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

@@ -84,14 +84,6 @@ public interface BpmProcessInstanceService {
     PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId,
                                                                @Valid BpmProcessInstancePageReqVO pageReqVO);
 
-    /**
-     * 获得表单字段权限
-     *
-     * @param reqVO 请求消息
-     * @return 表单字段权限
-     */
-    Map<String, String> getFormFieldsPermission(@Valid BpmFormFieldsPermissionReqVO reqVO);
-
     // TODO @芋艿:重点在 review 下
     /**
      * 获取审批详情。

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java


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

@@ -33,13 +33,13 @@ public interface BpmTaskService {
     PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO);
 
     /**
-     * 获得待办任务列表
+     * 获得用户的待办任务, 多条待办任务按时间顺序返回第一条
      *
      * @param userId 用户编号
      * @param processInstanceId 流程实例编号
-     * @return 流程任务列表
+     * @return 待办任务
      */
-    List<BpmTaskRespVO> getTodoTask(Long userId, String processInstanceId);
+    BpmTaskRespVO getTodoTask(Long userId, String processInstanceId);
 
     /**
      * 获得已办的流程任务分页
@@ -82,7 +82,7 @@ public interface BpmTaskService {
      * 获得指定流程实例的流程任务列表,包括所有状态的
      *
      * @param processInstanceId 流程实例的编号
-     * @param asc 是否升序
+     * @param asc               是否升序
      * @return 流程任务列表
      */
     List<HistoricTaskInstance> getTaskListByProcessInstanceId(String processInstanceId, Boolean asc);
@@ -115,8 +115,8 @@ public interface BpmTaskService {
      * 根据条件查询正在进行中的任务
      *
      * @param processInstanceId 流程实例编号,不允许为空
-     * @param assigned 是否分配了审批人,允许空
-     * @param taskDefineKey 任务定义 Key,允许空
+     * @param assigned          是否分配了审批人,允许空
+     * @param taskDefineKey     任务定义 Key,允许空
      */
     List<Task> getRunningTaskListByProcessInstanceId(String processInstanceId,
                                                      Boolean assigned,
@@ -223,10 +223,10 @@ public interface BpmTaskService {
 
     /**
      * 处理 Task 创建事件,目前是
-     *
+     * <p>
      * 1. 更新它的状态为审批中
      * 2. 处理自动通过的情况,例如说:1)无审批人时,是否自动通过、不通过;2)非【人工审核】时,是否自动通过、不通过
-     *
+     * <p>
      * 注意:它的触发时机,晚于 {@link #processTaskAssigned(Task)} 之后
      *
      * @param task 任务实体
@@ -251,8 +251,8 @@ public interface BpmTaskService {
      * 处理 Task 审批超时事件,可能会处理多个当前审批中的任务
      *
      * @param processInstanceId 流程示例编号
-     * @param taskDefineKey 任务 Key
-     * @param handlerType 处理类型,参见 {@link BpmUserTaskTimeoutHandlerTypeEnum}
+     * @param taskDefineKey     任务 Key
+     * @param handlerType       处理类型,参见 {@link BpmUserTaskTimeoutHandlerTypeEnum}
      */
     void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType);
 

+ 16 - 14
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.lang.Assert;
 import cn.hutool.core.util.*;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -127,10 +126,12 @@ public class BpmTaskServiceImpl implements BpmTaskService {
     // TODO 1: @jason:这个,赞要不要放到 BpmApprovalDetailRespVO 里?然后 BpmApprovalDetailRespVO 返回流程实例的信息 processInstance、待审批的信息 todoTask、approveNodes 审批信息列表、以及 getFormFieldsPermission 也融合进去;
     // 类似我们现在新的 get-bpmn-model-view,就是给 bpmn xml 高亮用的。那 get-approval-detail 就是给审批第一个 tab 用的,基本信息 + 按钮 + 流程预测
 
-    // TODO 2:是不是只返回一个 Task。按道理说,只会有一个审批?
     @Override
-    public List<BpmTaskRespVO> getTodoTask(Long userId, String processInstanceId) {
+    public BpmTaskRespVO getTodoTask(Long userId, String processInstanceId) {
         // TODO 芋艿:暂未 review,后续再瞅瞅。先沟通完整体设计。
+        if (processInstanceId == null) {
+            return null;
+        }
         TaskQuery taskQuery = taskService.createTaskQuery()
                 .active()
                 .processInstanceId(processInstanceId)
@@ -153,7 +154,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
         Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
                 convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
-        return CollectionUtils.convertList(todoList, task -> {
+        List<BpmTaskRespVO> taskList = convertList(todoList, task -> {
             // 找到分配给当前用户,或者当前用户加签的任务(为了减签)
             if (!userId.equals(NumberUtil.parseLong(task.getAssignee(), null)) &&
                     (!userId.equals(NumberUtil.parseLong(task.getOwner(), null)) || BpmTaskSignTypeEnum.of(task.getScopeType()) == null)) {
@@ -173,22 +174,23 @@ public class BpmTaskServiceImpl implements BpmTaskService {
                 List<Task> childTasks = childrenTaskMap.get(task.getId());
                 if (CollUtil.isNotEmpty(childTasks)) {
                     taskVO.setChildren(
-                        CollectionUtils.convertList(childTasks, childTask -> {
-                            BpmTaskRespVO childTaskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
-                            childTaskVO.setStatus(FlowableUtils.getTaskStatus(task));
-                            AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(childTask.getAssignee()));
-                            if (assignUser != null) {
-                                childTaskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
-                                findAndThen(deptMap, assignUser.getDeptId(), dept -> childTaskVO.getAssigneeUser().setDeptName(dept.getName()));
-                            }
-                            return childTaskVO;
-                        })
+                            convertList(childTasks, childTask -> {
+                                BpmTaskRespVO childTaskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
+                                childTaskVO.setStatus(FlowableUtils.getTaskStatus(task));
+                                AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(childTask.getAssignee()));
+                                if (assignUser != null) {
+                                    childTaskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
+                                    findAndThen(deptMap, assignUser.getDeptId(), dept -> childTaskVO.getAssigneeUser().setDeptName(dept.getName()));
+                                }
+                                return childTaskVO;
+                            })
                     );
                 }
 
             }
             return taskVO;
         });
+        return findFirst(taskList, Objects::nonNull);
     }
 
     @Override

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio