Commit 3fce482716d475d9161c071e90ba6607135654f2

Authored by YunaiV
1 parent d40fa0f9

BPM:简化 task 接口的 VO,做一些合并。虽然字段上有冗余,但是读代码难度降低

Showing 15 changed files with 231 additions and 588 deletions
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusOldEnum.java deleted
1   -package cn.iocoder.yudao.module.bpm.enums.task;
2   -
3   -import lombok.AllArgsConstructor;
4   -import lombok.Getter;
5   -
6   -/**
7   - * 流程实例的状态
8   - *
9   - * @author 芋道源码
10   - */
11   -@Deprecated
12   -@Getter
13   -@AllArgsConstructor
14   -public enum BpmProcessInstanceStatusOldEnum {
15   -
16   - RUNNING(1, "进行中"),
17   - FINISH(2, "已完成");
18   -
19   - /**
20   - * 状态
21   - */
22   - private final Integer status;
23   - /**
24   - * 描述
25   - */
26   - private final String desc;
27   -
28   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.task;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.StrUtil;
3 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  8 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
  9 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  10 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
5 11 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
  12 +import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
  13 +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
6 14 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
  15 +import cn.iocoder.yudao.module.system.api.dept.DeptApi;
  16 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
  17 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  18 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
7 19 import io.swagger.v3.oas.annotations.Operation;
8 20 import io.swagger.v3.oas.annotations.Parameter;
9 21 import io.swagger.v3.oas.annotations.tags.Tag;
  22 +import jakarta.annotation.Resource;
  23 +import jakarta.validation.Valid;
  24 +import org.flowable.bpmn.model.UserTask;
  25 +import org.flowable.engine.history.HistoricProcessInstance;
  26 +import org.flowable.engine.runtime.ProcessInstance;
  27 +import org.flowable.task.api.Task;
  28 +import org.flowable.task.api.history.HistoricTaskInstance;
10 29 import org.springframework.security.access.prepost.PreAuthorize;
11 30 import org.springframework.validation.annotation.Validated;
12 31 import org.springframework.web.bind.annotation.*;
13 32  
14   -import jakarta.annotation.Resource;
15   -import jakarta.validation.Valid;
  33 +import java.util.Collections;
16 34 import java.util.List;
  35 +import java.util.Map;
  36 +import java.util.Set;
  37 +import java.util.stream.Stream;
17 38  
18 39 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  40 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
19 41 import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
20 42  
21 43 @Tag(name = "管理后台 - 流程任务实例")
... ... @@ -26,28 +48,103 @@ public class BpmTaskController {
26 48  
27 49 @Resource
28 50 private BpmTaskService taskService;
  51 + @Resource
  52 + private BpmProcessInstanceService processInstanceService;
  53 +
  54 + @Resource
  55 + private AdminUserApi adminUserApi;
  56 + @Resource
  57 + private DeptApi deptApi;
29 58  
30 59 @GetMapping("todo-page")
31 60 @Operation(summary = "获取 Todo 待办任务分页")
32 61 @PreAuthorize("@ss.hasPermission('bpm:task:query')")
33   - public CommonResult<PageResult<BpmTaskTodoPageItemRespVO>> getTodoTaskPage(@Valid BpmTaskTodoPageReqVO pageVO) {
34   - return success(taskService.getTodoTaskPage(getLoginUserId(), pageVO));
  62 + public CommonResult<PageResult<BpmTaskRespVO>> getTodoTaskPage(@Valid BpmTaskPageReqVO pageVO) {
  63 + PageResult<Task> pageResult = taskService.getTodoTaskPage(getLoginUserId(), pageVO);
  64 + // 拼接数据
  65 + Map<String, ProcessInstance> processInstanceMap = processInstanceService.getProcessInstanceMap(
  66 + convertSet(pageResult.getList(), Task::getProcessInstanceId));
  67 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
  68 + convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
  69 + return success(BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> {
  70 + ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId());
  71 + if (processInstance == null) {
  72 + return;
  73 + }
  74 + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
  75 + taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class,
  76 + processInstanceVO -> processInstanceVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class))));
  77 + }));
35 78 }
36 79  
37 80 @GetMapping("done-page")
38 81 @Operation(summary = "获取 Done 已办任务分页")
39 82 @PreAuthorize("@ss.hasPermission('bpm:task:query')")
40   - public CommonResult<PageResult<BpmTaskDonePageItemRespVO>> getDoneTaskPage(@Valid BpmTaskDonePageReqVO pageVO) {
41   - return success(taskService.getDoneTaskPage(getLoginUserId(), pageVO));
  83 + public CommonResult<PageResult<BpmTaskRespVO>> getDoneTaskPage(@Valid BpmTaskPageReqVO pageVO) {
  84 + PageResult<HistoricTaskInstance> pageResult = taskService.getDoneTaskPage(getLoginUserId(), pageVO);
  85 + // 拼接数据
  86 + Map<String, HistoricProcessInstance> processInstanceMap = processInstanceService.getHistoricProcessInstanceMap(
  87 + convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId));
  88 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
  89 + convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
  90 + return success(BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> {
  91 + HistoricProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId());
  92 + if (processInstance == null) {
  93 + return;
  94 + }
  95 + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
  96 + taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class,
  97 + processInstanceVO -> processInstanceVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class))));
  98 + }));
42 99 }
43 100  
  101 + // TODO @芋艿:怎么优化下
44 102 @GetMapping("/list-by-process-instance-id")
45 103 @Operation(summary = "获得指定流程实例的任务列表", description = "包括完成的、未完成的")
46 104 @Parameter(name = "processInstanceId", description = "流程实例的编号", required = true)
47 105 @PreAuthorize("@ss.hasPermission('bpm:task:query')")
48 106 public CommonResult<List<BpmTaskRespVO>> getTaskListByProcessInstanceId(
49 107 @RequestParam("processInstanceId") String processInstanceId) {
50   - return success(taskService.getTaskListByProcessInstanceId(processInstanceId));
  108 + List<HistoricTaskInstance> taskList = taskService.getTaskListByProcessInstanceId(processInstanceId);
  109 + if (CollUtil.isEmpty(taskList)) {
  110 + return success(Collections.emptyList());
  111 + }
  112 +
  113 + // 拼接数据
  114 + HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId);
  115 + // 获得 User 和 Dept Map
  116 + Set<Long> userIds = convertSet(taskList, task -> NumberUtils.parseLong(task.getAssignee()));
  117 + userIds.add(NumberUtils.parseLong(processInstance.getStartUserId()));
  118 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
  119 + Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
  120 + convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
  121 + List<BpmTaskRespVO> taskVOList = CollectionUtils.convertList(taskList, task -> {
  122 + BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
  123 + taskVO.setStatus((Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS));
  124 + // 流程实例
  125 + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
  126 + taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class,
  127 + processInstanceVO -> processInstanceVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class))));
  128 + // 用户信息
  129 + AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
  130 + if (assignUser != null) {
  131 + taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
  132 + DeptRespDTO dept = deptMap.get(assignUser.getDeptId());
  133 + if (dept != null) {
  134 + taskVO.getAssigneeUser().setDeptName(dept.getName());
  135 + }
  136 + }
  137 + return taskVO;
  138 + });
  139 +
  140 + // 拼接父子关系
  141 + Map<String, List<BpmTaskRespVO>> childrenTaskMap = convertMultiMap(
  142 + filterList(taskVOList, r -> StrUtil.isNotEmpty(r.getParentTaskId())),
  143 + BpmTaskRespVO::getParentTaskId);
  144 + for (BpmTaskRespVO taskVO : taskVOList) {
  145 + taskVO.setChildren(childrenTaskMap.get(taskVO.getId()));
  146 + }
  147 + return success(filterList(taskVOList, r -> StrUtil.isEmpty(r.getParentTaskId())));
51 148 }
52 149  
53 150 @PutMapping("/approve")
... ... @@ -74,12 +171,14 @@ public class BpmTaskController {
74 171 return success(true);
75 172 }
76 173  
77   - @GetMapping("/return-list")
  174 + @GetMapping("/list-by-return")
78 175 @Operation(summary = "获取所有可回退的节点", description = "用于【流程详情】的【回退】按钮")
79 176 @Parameter(name = "taskId", description = "当前任务ID", required = true)
80 177 @PreAuthorize("@ss.hasPermission('bpm:task:update')")
81   - public CommonResult<List<BpmTaskSimpleRespVO>> getReturnList(@RequestParam("taskId") String taskId) {
82   - return success(taskService.getReturnTaskList(taskId));
  178 + public CommonResult<List<BpmTaskRespVO>> getTaskListByReturn(@RequestParam("id") String id) {
  179 + List<UserTask> userTaskList = taskService.getUserTaskListByReturn(id);
  180 + return success(convertList(userTaskList, userTask -> // 只返回 id 和 name
  181 + new BpmTaskRespVO().setName(userTask.getName()).setTaskDefinitionKey(userTask.getId())));
83 182 }
84 183  
85 184 @PutMapping("/return")
... ... @@ -114,12 +213,23 @@ public class BpmTaskController {
114 213 return success(true);
115 214 }
116 215  
117   - @GetMapping("children-list")
118   - @Operation(summary = "获取能被减签的任务")
119   - @Parameter(name = "parentId", description = "父级任务 ID", required = true)
120   - @PreAuthorize("@ss.hasPermission('bpm:task:update')")
121   - public CommonResult<List<BpmTaskSubSignRespVO>> getChildrenTaskList(@RequestParam("parentId") String parentId) {
122   - return success(taskService.getChildrenTaskList(parentId));
  216 + // TODO 芋艿:待测试
  217 + @GetMapping("list-by-parent-task-id")
  218 + @Operation(summary = "获得指定父级任务的子任务列表") // 目前用于,减签的时候,获得子任务列表
  219 + @Parameter(name = "parentTaskId", description = "父级任务编号", required = true)
  220 + @PreAuthorize("@ss.hasPermission('bpm:task:query')")
  221 + public CommonResult<List<BpmTaskRespVO>> getTaskListByParentTaskId(@RequestParam("parentTaskId") String parentTaskId) {
  222 + List<Task> taskList = taskService.getTaskListByParentTaskId(parentTaskId);
  223 + if (CollUtil.isEmpty(taskList)) {
  224 + return success(Collections.emptyList());
  225 + }
  226 + // 拼接数据
  227 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
  228 + convertSetByFlatMap(taskList, user -> Stream.of(Long.valueOf(user.getAssignee()), Long.valueOf(user.getOwner()))));
  229 + return success(convertList(taskList, task -> BeanUtils.toBean(task, BpmTaskRespVO.class, taskVO -> {
  230 + taskVO.setAssigneeUser(BeanUtils.toBean(userMap.get(NumberUtils.parseLong(task.getAssignee())), BpmProcessInstanceRespVO.User.class));
  231 + taskVO.setOwnerUser(BeanUtils.toBean(userMap.get(NumberUtils.parseLong(task.getOwner())), BpmProcessInstanceRespVO.User.class));
  232 + })));
123 233 }
124 234  
125 235 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageItemRespVO.java deleted
1   -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7   -
8   -import java.time.LocalDateTime;
9   -
10   -@Schema(description = "管理后台 - 流程任务的 Done 已完成的分页项 Response VO")
11   -@Data
12   -@EqualsAndHashCode(callSuper = true)
13   -@ToString(callSuper = true)
14   -public class BpmTaskDonePageItemRespVO extends BpmTaskTodoPageItemRespVO {
15   -
16   - @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
17   - private LocalDateTime endTime;
18   - @Schema(description = "持续时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000")
19   - private Long durationInMillis;
20   -
21   - @Schema(description = "任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
22   - private Integer status; // 参见 BpmProcessInstanceResultEnum 枚举
23   -
24   - @Schema(description = "审批建议", requiredMode = Schema.RequiredMode.REQUIRED, example = "不请假了!")
25   - private String reason;
26   -
27   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageReqVO.java deleted
1   -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
2   -
3   -import cn.iocoder.yudao.framework.common.pojo.PageParam;
4   -import io.swagger.v3.oas.annotations.media.Schema;
5   -import lombok.Data;
6   -import lombok.EqualsAndHashCode;
7   -import lombok.ToString;
8   -import org.springframework.format.annotation.DateTimeFormat;
9   -
10   -import java.time.LocalDateTime;
11   -
12   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13   -
14   -@Schema(description = "管理后台 - 流程任务的 Done 已办的分页 Request VO")
15   -@Data
16   -@EqualsAndHashCode(callSuper = true)
17   -@ToString(callSuper = true)
18   -public class BpmTaskDonePageReqVO extends PageParam {
19   -
20   - @Schema(description = "流程任务名", example = "芋道")
21   - private String name;
22   -
23   - @Schema(description = "开始的创建收间")
24   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
25   - private LocalDateTime beginCreateTime;
26   -
27   - @Schema(description = "结束的创建时间")
28   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
29   - private LocalDateTime endCreateTime;
30   -
31   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageReqVO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskPageReqVO.java
... ... @@ -10,13 +10,11 @@ import org.springframework.format.annotation.DateTimeFormat;
10 10  
11 11 import java.time.LocalDateTime;
12 12  
13   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
14   -
15   -@Schema(description = "管理后台 - 流程任务的 TODO 待办的分页 Request VO")
  13 +@Schema(description = "管理后台 - 流程任务的的分页 Request VO") // 待办、已办,都使用该分页
16 14 @Data
17 15 @EqualsAndHashCode(callSuper = true)
18 16 @ToString(callSuper = true)
19   -public class BpmTaskTodoPageReqVO extends PageParam {
  17 +public class BpmTaskPageReqVO extends PageParam {
20 18  
21 19 @Schema(description = "流程任务名", example = "芋道")
22 20 private String name;
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
2 2  
  3 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
3 4 import io.swagger.v3.oas.annotations.media.Schema;
4 5 import lombok.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7 6  
  7 +import java.time.LocalDateTime;
8 8 import java.util.List;
9 9  
10   -@Schema(description = "管理后台 - 流程任务的 Response VO")
  10 +@Schema(description = "管理后台 - 流程任务 Response VO")
11 11 @Data
12   -@EqualsAndHashCode(callSuper = true)
13   -@ToString(callSuper = true)
14   -public class BpmTaskRespVO extends BpmTaskDonePageItemRespVO {
  12 +public class BpmTaskRespVO {
15 13  
16   - @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "user-001")
17   - private String definitionKey;
  14 + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  15 + private String id;
  16 +
  17 + @Schema(description = "任务名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
  18 + private String name;
  19 +
  20 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  21 + private LocalDateTime createTime;
  22 +
  23 + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
  24 + private LocalDateTime endTime;
18 25  
  26 + @Schema(description = "持续时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000")
  27 + private Long durationInMillis;
  28 +
  29 + @Schema(description = "任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
  30 + private Integer status; // 参见 BpmProcessInstanceResultEnum 枚举
  31 +
  32 + /**
  33 + * 负责人的用户信息
  34 + */
  35 + private BpmProcessInstanceRespVO.User ownerUser;
19 36 /**
20 37 * 审核的用户信息
21 38 */
22   - private User assigneeUser;
  39 + private BpmProcessInstanceRespVO.User assigneeUser;
  40 +
  41 + // TODO @芋艿:这个 key 有点问题,应该是 taskDefinitionId
  42 + @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "user-001")
  43 + private String definitionKey;
  44 + @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "Activity_one")
  45 + private String taskDefinitionKey;
  46 +
  47 + @Schema(description = "所属流程实例编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8888")
  48 + private String processInstanceId;
23 49  
24 50 /**
25   - * 父任务ID
  51 + * 所属流程实例
26 52 */
  53 + private ProcessInstance processInstance;
  54 +
  55 + @Schema(description = "父任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
27 56 private String parentTaskId;
28 57  
29   - @Schema(description = "子任务(由加签生成)", requiredMode = Schema.RequiredMode.REQUIRED, example = "childrenTask")
  58 + @Schema(description = "子任务列表(由加签生成)", requiredMode = Schema.RequiredMode.REQUIRED, example = "childrenTask")
30 59 private List<BpmTaskRespVO> children;
31 60  
32   - @Schema(description = "用户信息")
33 61 @Data
34   - public static class User {
  62 + @Schema(description = "流程实例")
  63 + public static class ProcessInstance {
35 64  
36   - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
37   - private Long id;
38   - @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
39   - private String nickname;
  65 + @Schema(description = "流程实例编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  66 + private String id;
40 67  
41   - @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
42   - private Long deptId;
43   - @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部")
44   - private String deptName;
  68 + @Schema(description = "流程实例名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
  69 + private String name;
  70 +
  71 + @Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED)
  72 + private LocalDateTime createTime;
  73 +
  74 + @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
  75 + private String processDefinitionId;
  76 +
  77 + /**
  78 + * 发起人的用户信息
  79 + */
  80 + private BpmProcessInstanceRespVO.User startUser;
45 81  
46 82 }
  83 +
47 84 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskReturnReqVO.java
... ... @@ -15,7 +15,7 @@ public class BpmTaskReturnReqVO {
15 15  
16 16 @Schema(description = "回退到的任务 Key", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
17 17 @NotEmpty(message = "回退到的任务 Key 不能为空")
18   - private String targetDefinitionKey;
  18 + private String targetTaskDefinitionKey;
19 19  
20 20 @Schema(description = "回退意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "我就是想驳回")
21 21 @NotEmpty(message = "回退意见不能为空")
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskSimpleRespVO.java deleted
1   -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -@Schema(description = "管理后台 - 流程任务的精简 Response VO")
7   -@Data
8   -public class BpmTaskSimpleRespVO {
9   -
10   - @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "Activity_one")
11   - private String definitionKey;
12   -
13   - @Schema(description = "任务名词", requiredMode = Schema.RequiredMode.REQUIRED, example = "经理审批")
14   - private String name;
15   -
16   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskSubSignRespVO.java deleted
1   -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -@Schema(description = "管理后台 - 减签流程任务的 Response VO")
7   -@Data
8   -public class BpmTaskSubSignRespVO {
9   -
10   - @Schema(description = "审核的用户信息", requiredMode = Schema.RequiredMode.REQUIRED, example = "小李")
11   - private BpmTaskRespVO.User assigneeUser;
12   -
13   - @Schema(description = "任务 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12312")
14   - private String id;
15   -
16   - @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "经理审批")
17   - private String name;
18   -
19   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageItemRespVO.java deleted
1   -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -import java.time.LocalDateTime;
7   -
8   -@Schema(description = "管理后台 - 流程任务的 Running 进行中的分页项 Response VO")
9   -@Data
10   -public class BpmTaskTodoPageItemRespVO {
11   -
12   - @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13   - private String id;
14   -
15   - @Schema(description = "任务名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
16   - private String name;
17   -
18   - @Schema(description = "接收时间", requiredMode = Schema.RequiredMode.REQUIRED)
19   - private LocalDateTime claimTime;
20   -
21   - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
22   - private LocalDateTime createTime;
23   -
24   - @Schema(description = "激活状态-参见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
25   - private Integer suspensionState;
26   -
27   - /**
28   - * 所属流程实例
29   - */
30   - private ProcessInstance processInstance;
31   -
32   - @Data
33   - @Schema(description = "流程实例")
34   - public static class ProcessInstance {
35   -
36   - @Schema(description = "流程实例编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
37   - private String id;
38   -
39   - @Schema(description = "流程实例名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
40   - private String name;
41   -
42   - @Schema(description = "发起人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
43   - private Long startUserId;
44   -
45   - @Schema(description = "发起人的用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
46   - private String startUserNickname;
47   -
48   - @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
49   - private String processDefinitionId;
50   -
51   - }
52   -
53   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
1 1 package cn.iocoder.yudao.module.bpm.convert.task;
2 2  
3   -import cn.hutool.core.util.ObjectUtil;
4   -import cn.hutool.core.util.StrUtil;
5   -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
6   -import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
7 3 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
8 4 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
9   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
10   -import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
11 5 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
12   -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
13 6 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
14   -import org.flowable.bpmn.model.FlowElement;
15   -import org.flowable.common.engine.impl.db.SuspensionState;
16   -import org.flowable.engine.history.HistoricProcessInstance;
17 7 import org.flowable.engine.runtime.ProcessInstance;
18 8 import org.flowable.task.api.Task;
19   -import org.flowable.task.api.history.HistoricTaskInstance;
20 9 import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl;
21 10 import org.mapstruct.Mapper;
22   -import org.mapstruct.Mapping;
23   -import org.mapstruct.Mappings;
24   -import org.mapstruct.Named;
25 11 import org.mapstruct.factory.Mappers;
26 12  
27 13 import java.util.Date;
28   -import java.util.List;
29   -import java.util.Map;
30   -
31   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap;
32   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
33 14  
34 15 /**
35 16 * Bpm 任务 Convert
... ... @@ -41,91 +22,6 @@ public interface BpmTaskConvert {
41 22  
42 23 BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class);
43 24  
44   - default List<BpmTaskTodoPageItemRespVO> convertList1(List<Task> tasks,
45   - Map<String, ProcessInstance> processInstanceMap,
46   - Map<Long, AdminUserRespDTO> userMap) {
47   - return CollectionUtils.convertList(tasks, task -> {
48   - BpmTaskTodoPageItemRespVO respVO = convert1(task);
49   - ProcessInstance processInstance = processInstanceMap.get(task.getProcessInstanceId());
50   - if (processInstance != null) {
51   - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
52   - respVO.setProcessInstance(convert(processInstance, startUser));
53   - }
54   - return respVO;
55   - });
56   - }
57   -
58   - @Mapping(source = "suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState")
59   - BpmTaskTodoPageItemRespVO convert1(Task bean);
60   -
61   - @Named("convertSuspendedToSuspensionState")
62   - default Integer convertSuspendedToSuspensionState(boolean suspended) {
63   - return suspended ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode();
64   - }
65   -
66   - default List<BpmTaskDonePageItemRespVO> convertList2(List<HistoricTaskInstance> tasks,
67   - Map<String, HistoricProcessInstance> historicProcessInstanceMap,
68   - Map<Long, AdminUserRespDTO> userMap) {
69   - return CollectionUtils.convertList(tasks, task -> {
70   - BpmTaskDonePageItemRespVO respVO = convert2(task);
71   - respVO.setStatus((Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS));
72   - // 流程实例
73   - HistoricProcessInstance processInstance = historicProcessInstanceMap.get(task.getProcessInstanceId());
74   - if (processInstance != null) {
75   - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
76   - respVO.setProcessInstance(convert(processInstance, startUser));
77   - }
78   - return respVO;
79   - });
80   - }
81   -
82   - BpmTaskDonePageItemRespVO convert2(HistoricTaskInstance bean);
83   -
84   - @Mappings({
85   - @Mapping(source = "processInstance.id", target = "id"),
86   - @Mapping(source = "processInstance.name", target = "name"),
87   - @Mapping(source = "processInstance.startUserId", target = "startUserId"),
88   - @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"),
89   - @Mapping(source = "startUser.nickname", target = "startUserNickname")
90   - })
91   - BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, AdminUserRespDTO startUser);
92   -
93   - default List<BpmTaskRespVO> convertList3(List<HistoricTaskInstance> tasks,
94   - HistoricProcessInstance processInstance,
95   - Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) {
96   - return CollectionUtils.convertList(tasks, task -> {
97   - BpmTaskRespVO respVO = convert3(task);
98   - respVO.setStatus((Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS));
99   - // 流程实例
100   - if (processInstance != null) {
101   - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
102   - respVO.setProcessInstance(convert(processInstance, startUser));
103   - }
104   - AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
105   - if (assignUser != null) {
106   - respVO.setAssigneeUser(convert3(assignUser));
107   - DeptRespDTO dept = deptMap.get(assignUser.getDeptId());
108   - if (dept != null) {
109   - respVO.getAssigneeUser().setDeptName(dept.getName());
110   - }
111   - }
112   - return respVO;
113   - });
114   - }
115   -
116   - @Mapping(source = "taskDefinitionKey", target = "definitionKey")
117   - BpmTaskRespVO convert3(HistoricTaskInstance bean);
118   -
119   - BpmTaskRespVO.User convert3(AdminUserRespDTO bean);
120   -
121   - @Mappings({@Mapping(source = "processInstance.id", target = "id"),
122   - @Mapping(source = "processInstance.name", target = "name"),
123   - @Mapping(source = "processInstance.startUserId", target = "startUserId"),
124   - @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"),
125   - @Mapping(source = "startUser.nickname", target = "startUserNickname")})
126   - BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance,
127   - AdminUserRespDTO startUser);
128   -
129 25 default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser,
130 26 Task task) {
131 27 BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO();
... ... @@ -136,12 +32,6 @@ public interface BpmTaskConvert {
136 32 return reqDTO;
137 33 }
138 34  
139   - default List<BpmTaskSimpleRespVO> convertList(List<? extends FlowElement> elementList) {
140   - return CollectionUtils.convertList(elementList, element -> new BpmTaskSimpleRespVO()
141   - .setName(element.getName())
142   - .setDefinitionKey(element.getId()));
143   - }
144   -
145 35 //此处不用 mapstruct 映射,因为 TaskEntityImpl 还有很多其他属性,这里我们只设置我们需要的
146 36 //使用 mapstruct 会将里面嵌套的各个属性值都设置进去,会出现意想不到的问题
147 37 default TaskEntityImpl convert(TaskEntityImpl task,TaskEntityImpl parentTask){
... ... @@ -160,33 +50,4 @@ public interface BpmTaskConvert {
160 50 return task;
161 51 }
162 52  
163   - default List<BpmTaskSubSignRespVO> convertList(List<Task> bpmTaskExtDOList,
164   - Map<Long, AdminUserRespDTO> userMap){
165   - return CollectionUtils.convertList(bpmTaskExtDOList, task -> {
166   - BpmTaskSubSignRespVO bpmTaskSubSignRespVO = new BpmTaskSubSignRespVO()
167   - .setId(task.getId()).setName(task.getName());
168   - // 后加签任务不会直接设置 assignee ,所以不存在 assignee 的情况,则去取 owner
169   -// Task sourceTask = idTaskMap.get(task.getTaskId());
170   - String assignee = ObjectUtil.defaultIfBlank(task.getOwner(), task.getAssignee());
171   - MapUtils.findAndThen(userMap,NumberUtils.parseLong(assignee),
172   - assignUser-> bpmTaskSubSignRespVO.setAssigneeUser(convert3(assignUser)));
173   - return bpmTaskSubSignRespVO;
174   - });
175   - }
176   -
177   - /**
178   - * 转换任务为父子级
179   - *
180   - * @param sourceList 原始数据
181   - * @return 转换后的父子级数组
182   - */
183   - default List<BpmTaskRespVO> convertChildrenList(List<BpmTaskRespVO> sourceList) {
184   - List<BpmTaskRespVO> childrenTaskList = filterList(sourceList, r -> StrUtil.isNotEmpty(r.getParentTaskId()));
185   - Map<String, List<BpmTaskRespVO>> parentChildrenTaskListMap = convertMultiMap(childrenTaskList, BpmTaskRespVO::getParentTaskId);
186   - for (BpmTaskRespVO bpmTaskRespVO : sourceList) {
187   - bpmTaskRespVO.setChildren(parentChildrenTaskListMap.get(bpmTaskRespVO.getId()));
188   - }
189   - return filterList(sourceList, r -> StrUtil.isEmpty(r.getParentTaskId()));
190   - }
191   -
192 53 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java deleted
1   -package cn.iocoder.yudao.module.bpm.dal.dataobject.task;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4   -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
5   -import com.baomidou.mybatisplus.annotation.TableId;
6   -import com.baomidou.mybatisplus.annotation.TableName;
7   -import lombok.Data;
8   -import lombok.EqualsAndHashCode;
9   -import lombok.ToString;
10   -
11   -import java.time.LocalDateTime;
12   -
13   -/**
14   - * Bpm 流程任务的拓展表
15   - * 主要解决 Flowable Task 和 HistoricTaskInstance 不支持拓展字段,所以新建拓展表
16   - *
17   - * @author 芋道源码
18   - */
19   -@TableName(value = "bpm_task_ext", autoResultMap = true)
20   -@Data
21   -@EqualsAndHashCode(callSuper = true)
22   -@ToString(callSuper = true)
23   -@Deprecated
24   -public class BpmTaskExtDO extends BaseDO {
25   -
26   - /**
27   - * 编号,自增
28   - */
29   - @TableId
30   - private Long id;
31   -
32   - /**
33   - * 任务的审批人
34   - *
35   - * 冗余 Task 的 assignee 属性
36   - */
37   - private Long assigneeUserId;
38   - /**
39   - * 任务的名字
40   - *
41   - * 冗余 Task 的 name 属性,为了筛选
42   - */
43   - private String name;
44   - /**
45   - * 任务的编号
46   - *
47   - * 关联 Task 的 id 属性
48   - */
49   - private String taskId;
50   -// /**
51   -// * 任务的标识
52   -// *
53   -// * 关联 {@link Task#getTaskDefinitionKey()}
54   -// */
55   -// private String definitionKey;
56   - /**
57   - * 任务的结果
58   - *
59   - * 枚举 {@link BpmProcessInstanceResultEnum}
60   - */
61   - private Integer result;
62   - /**
63   - * 审批建议
64   - */
65   - @Deprecated
66   - private String reason;
67   - /**
68   - * 任务的结束时间
69   - *
70   - * 冗余 HistoricTaskInstance 的 endTime 属性
71   - */
72   - private LocalDateTime endTime;
73   -
74   - /**
75   - * 流程实例的编号
76   - *
77   - * 关联 ProcessInstance 的 id 属性
78   - */
79   - private String processInstanceId;
80   - /**
81   - * 流程定义的编号
82   - *
83   - * 关联 ProcessDefinition 的 id 属性
84   - */
85   - private String processDefinitionId;
86   -
87   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java deleted
1   -package cn.iocoder.yudao.module.bpm.dal.mysql.task;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4   -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
5   -import org.apache.ibatis.annotations.Mapper;
6   -
7   -@Mapper
8   -public interface BpmTaskExtMapper extends BaseMapperX<BpmTaskExtDO> {
9   -
10   -// default void updateByTaskId(BpmTaskExtDO entity) {
11   -// update(entity, new LambdaQueryWrapper<BpmTaskExtDO>().eq(BpmTaskExtDO::getTaskId, entity.getTaskId()));
12   -// }
13   -
14   -// default List<BpmTaskExtDO> selectListByTaskIds(Collection<String> taskIds) {
15   -// return selectList(BpmTaskExtDO::getTaskId, taskIds);
16   -// }
17   -
18   - // TODO @海:BpmProcessInstanceResultEnum.CAN_SUB_SIGN_STATUS_LIST) 应该作为条件,mapper 不要有业务
19   -// default List<BpmTaskExtDO> selectProcessListByTaskIds(Collection<String> taskIds) {
20   -// return selectList(new LambdaQueryWrapperX<BpmTaskExtDO>()
21   -// .in(BpmTaskExtDO::getTaskId, taskIds)
22   -// .in(BpmTaskExtDO::getResult, BpmProcessInstanceResultEnum.CAN_SUB_SIGN_STATUS_LIST));
23   -// }
24   -
25   -// default BpmTaskExtDO selectByTaskId(String taskId) {
26   -// return selectOne(BpmTaskExtDO::getTaskId, taskId);
27   -// }
28   -
29   -// default void updateBatchByTaskIdList(List<String> taskIdList, BpmTaskExtDO updateObj) {
30   -// update(updateObj, new LambdaQueryWrapper<BpmTaskExtDO>().in(BpmTaskExtDO::getTaskId, taskIdList));
31   -// }
32   -
33   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
... ... @@ -4,7 +4,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
6 6 import jakarta.validation.Valid;
  7 +import org.flowable.bpmn.model.UserTask;
7 8 import org.flowable.task.api.Task;
  9 +import org.flowable.task.api.history.HistoricTaskInstance;
8 10  
9 11 import java.util.Collection;
10 12 import java.util.List;
... ... @@ -25,7 +27,7 @@ public interface BpmTaskService {
25 27 * @param pageReqVO 分页请求
26 28 * @return 流程任务分页
27 29 */
28   - PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageReqVO);
  30 + PageResult<Task> getTodoTaskPage(Long userId, BpmTaskPageReqVO pageReqVO);
29 31  
30 32 /**
31 33 * 获得已办的流程任务分页
... ... @@ -34,7 +36,7 @@ public interface BpmTaskService {
34 36 * @param pageReqVO 分页请求
35 37 * @return 流程任务分页
36 38 */
37   - PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageReqVO);
  39 + PageResult<HistoricTaskInstance> getDoneTaskPage(Long userId, BpmTaskPageReqVO pageReqVO);
38 40  
39 41 /**
40 42 * 获得流程任务 Map
... ... @@ -56,12 +58,12 @@ public interface BpmTaskService {
56 58 List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds);
57 59  
58 60 /**
59   - * 获得指令流程实例的流程任务列表,包括所有状态的
  61 + * 获得指定流程实例的流程任务列表,包括所有状态的
60 62 *
61 63 * @param processInstanceId 流程实例的编号
62 64 * @return 流程任务列表
63 65 */
64   - List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId);
  66 + List<HistoricTaskInstance> getTaskListByProcessInstanceId(String processInstanceId);
65 67  
66 68 /**
67 69 * 通过任务
... ... @@ -126,12 +128,12 @@ public interface BpmTaskService {
126 128 Task getTask(String id);
127 129  
128 130 /**
129   - * 获取当前任务的可回退的流程集合
  131 + * 获取当前任务的可回退的 UserTask 集合
130 132 *
131   - * @param taskId 当前的任务 ID
  133 + * @param id 当前的任务 ID
132 134 * @return 可以回退的节点列表
133 135 */
134   - List<BpmTaskSimpleRespVO> getReturnTaskList(String taskId);
  136 + List<UserTask> getUserTaskListByReturn(String id);
135 137  
136 138 /**
137 139 * 将任务回退到指定的 targetDefinitionKey 位置
... ... @@ -158,7 +160,7 @@ public interface BpmTaskService {
158 160 void createSignTask(Long userId, BpmTaskAddSignReqVO reqVO);
159 161  
160 162 /**
161   - * 任务减签名
  163 + * 任务减签
162 164 *
163 165 * @param userId 当前用户ID
164 166 * @param reqVO 被减签的任务 ID,理由
... ... @@ -166,12 +168,12 @@ public interface BpmTaskService {
166 168 void deleteSignTask(Long userId, BpmTaskSubSignReqVO reqVO);
167 169  
168 170 /**
169   - * 获取指定任务的子任务和审批人信息
  171 + * 获取指定任务的子任务列表
170 172 *
171   - * @param parentId 指定任务ID
  173 + * @param parentTaskId 父任务ID
172 174 * @return 子任务列表
173 175 */
174   - List<BpmTaskSubSignRespVO> getChildrenTaskList(String parentId);
  176 + List<Task> getTaskListByParentTaskId(String parentTaskId);
175 177  
176 178 /**
177 179 * 通过任务 ID,查询任务名 Map
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
... ... @@ -13,15 +13,12 @@ import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils;
13 13 import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
14 14 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
15 15 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
16   -import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper;
17 16 import cn.iocoder.yudao.module.bpm.enums.task.BpmCommentTypeEnum;
18 17 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
19 18 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskAddSignTypeEnum;
20 19 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
21 20 import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
22 21 import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
23   -import cn.iocoder.yudao.module.system.api.dept.DeptApi;
24   -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
25 22 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
26 23 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
27 24 import jakarta.annotation.Resource;
... ... @@ -34,7 +31,6 @@ import org.flowable.engine.HistoryService;
34 31 import org.flowable.engine.ManagementService;
35 32 import org.flowable.engine.RuntimeService;
36 33 import org.flowable.engine.TaskService;
37   -import org.flowable.engine.history.HistoricProcessInstance;
38 34 import org.flowable.engine.runtime.ProcessInstance;
39 35 import org.flowable.task.api.DelegationState;
40 36 import org.flowable.task.api.Task;
... ... @@ -50,10 +46,10 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
50 46 import org.springframework.util.Assert;
51 47  
52 48 import java.util.*;
53   -import java.util.stream.Stream;
54 49  
55 50 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
56   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
  51 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  52 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
57 53 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
58 54  
59 55 /**
... ... @@ -82,49 +78,31 @@ public class BpmTaskServiceImpl implements BpmTaskService {
82 78  
83 79 @Resource
84 80 private AdminUserApi adminUserApi;
85   - @Resource
86   - private DeptApi deptApi;
87   -
88   - @Resource
89   - private BpmTaskExtMapper taskExtMapper;
90 81  
91 82 @Resource
92 83 private ManagementService managementService;
93 84  
94 85 @Override
95   - public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) {
96   - // 查询待办任务
  86 + public PageResult<Task> getTodoTaskPage(Long userId, BpmTaskPageReqVO pageVO) {
97 87 TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(String.valueOf(userId)) // 分配给自己
98 88 .orderByTaskCreateTime().desc(); // 创建时间倒序
99 89 if (StrUtil.isNotBlank(pageVO.getName())) {
100 90 taskQuery.taskNameLike("%" + pageVO.getName() + "%");
101 91 }
102   - if (ArrayUtil.get(pageVO.getCreateTime(), 0) != null) {
  92 + if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
103 93 taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
  94 + taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1]));
104 95 }
105   - if (ArrayUtil.get(pageVO.getCreateTime(), 1) != null) {
106   - taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1]));
  96 + long count = taskQuery.count();
  97 + if (count == 0) {
  98 + return PageResult.empty();
107 99 }
108   - // 执行查询
109 100 List<Task> tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
110   - if (CollUtil.isEmpty(tasks)) {
111   - return PageResult.empty(taskQuery.count());
112   - }
113   -
114   - // 获得 ProcessInstance Map
115   - Map<String, ProcessInstance> processInstanceMap = processInstanceService.getProcessInstanceMap(
116   - convertSet(tasks, Task::getProcessInstanceId));
117   - // 获得 User Map
118   - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
119   - convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
120   - // 拼接结果
121   - return new PageResult<>(BpmTaskConvert.INSTANCE.convertList1(tasks, processInstanceMap, userMap),
122   - taskQuery.count());
  101 + return new PageResult<>(tasks, count);
123 102 }
124 103  
125 104 @Override
126   - public PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageVO) {
127   - // 查询已办任务
  105 + public PageResult<HistoricTaskInstance> getDoneTaskPage(Long userId, BpmTaskPageReqVO pageVO) {
128 106 HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery().finished() // 已完成
129 107 .includeTaskLocalVariables()
130 108 .taskAssignee(String.valueOf(userId)) // 分配给自己
... ... @@ -132,29 +110,17 @@ public class BpmTaskServiceImpl implements BpmTaskService {
132 110 if (StrUtil.isNotBlank(pageVO.getName())) {
133 111 taskQuery.taskNameLike("%" + pageVO.getName() + "%");
134 112 }
135   - // TODO @芋艿:传参风格,统一
136   - if (pageVO.getBeginCreateTime() != null) {
137   - taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getBeginCreateTime()));
138   - }
139   - if (pageVO.getEndCreateTime() != null) {
140   - taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getEndCreateTime()));
  113 + if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
  114 + taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
  115 + taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1]));
141 116 }
142 117 // 执行查询
143   - List<HistoricTaskInstance> tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
144   - if (CollUtil.isEmpty(tasks)) {
145   - return PageResult.empty(taskQuery.count());
  118 + long count = taskQuery.count();
  119 + if (count == 0) {
  120 + return PageResult.empty();
146 121 }
147   -
148   - // 获得 ProcessInstance Map
149   - Map<String, HistoricProcessInstance> historicProcessInstanceMap = processInstanceService.getHistoricProcessInstanceMap(
150   - convertSet(tasks, HistoricTaskInstance::getProcessInstanceId));
151   - // 获得 User Map
152   - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153   - convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
154   - // 拼接结果
155   - return new PageResult<>(
156   - BpmTaskConvert.INSTANCE.convertList2(tasks, historicProcessInstanceMap, userMap),
157   - taskQuery.count());
  122 + List<HistoricTaskInstance> tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
  123 + return new PageResult<>(tasks, count);
158 124 }
159 125  
160 126 @Override
... ... @@ -166,8 +132,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
166 132 }
167 133  
168 134 @Override
169   - public List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId) {
170   - // 获得任务列表
  135 + public List<HistoricTaskInstance> getTaskListByProcessInstanceId(String processInstanceId) {
171 136 List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
172 137 .includeTaskLocalVariables()
173 138 .processInstanceId(processInstanceId)
... ... @@ -176,19 +141,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
176 141 if (CollUtil.isEmpty(tasks)) {
177 142 return Collections.emptyList();
178 143 }
179   -
180   - // 获得 ProcessInstance Map
181   - HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId);
182   - // 获得 User Map
183   - Set<Long> userIds = convertSet(tasks, task -> NumberUtils.parseLong(task.getAssignee()));
184   - userIds.add(NumberUtils.parseLong(processInstance.getStartUserId()));
185   - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
186   - // 获得 Dept Map
187   - Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
188   -
189   - // 拼接数据
190   - List<BpmTaskRespVO> result = BpmTaskConvert.INSTANCE.convertList3(tasks, processInstance, userMap, deptMap);
191   - return BpmTaskConvert.INSTANCE.convertChildrenList(result);
  144 + return tasks;
192 145 }
193 146  
194 147 @Override
... ... @@ -531,10 +484,10 @@ public class BpmTaskServiceImpl implements BpmTaskService {
531 484 }
532 485  
533 486 @Override
534   - public List<BpmTaskSimpleRespVO> getReturnTaskList(String taskId) {
535   - // 1. 校验当前任务 task 存在
536   - Task task = validateTaskExist(taskId);
537   - // 根据流程定义获取流程模型信息
  487 + public List<UserTask> getUserTaskListByReturn(String id) {
  488 + // 1.1 校验当前任务 task 存在
  489 + Task task = validateTaskExist(id);
  490 + // 1.2 根据流程定义获取流程模型信息
538 491 BpmnModel bpmnModel = bpmModelService.getBpmnModelByDefinitionId(task.getProcessDefinitionId());
539 492 FlowElement source = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
540 493 if (source == null) {
... ... @@ -548,7 +501,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
548 501 }
549 502 // 2.2 过滤:只有串行可到达的节点,才可以回退。类似非串行、子流程无法退回
550 503 previousUserList.removeIf(userTask -> !BpmnModelUtils.isSequentialReachable(source, userTask, null));
551   - return BpmTaskConvert.INSTANCE.convertList(previousUserList);
  504 + return previousUserList;
552 505 }
553 506  
554 507 @Override
... ... @@ -560,7 +513,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
560 513 throw exception(TASK_IS_PENDING);
561 514 }
562 515 // 1.2 校验源头和目标节点的关系,并返回目标元素
563   - FlowElement targetElement = validateTargetTaskCanReturn(task.getTaskDefinitionKey(), reqVO.getTargetDefinitionKey(), task.getProcessDefinitionId());
  516 + FlowElement targetElement = validateTargetTaskCanReturn(task.getTaskDefinitionKey(), reqVO.getTargetTaskDefinitionKey(), task.getProcessDefinitionId());
564 517  
565 518 // 3. 更新任务扩展表 TODO 芋艿:需要提前搞
566 519 updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.BACK.getResult());
... ... @@ -635,7 +588,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
635 588 runtimeService.createChangeActivityStateBuilder()
636 589 .processInstanceId(currentTask.getProcessInstanceId())
637 590 .moveActivityIdsToSingleActivityId(returnTaskKeyList, // 当前要跳转的节点列表( 1 或多)
638   - reqVO.getTargetDefinitionKey()) // targetKey 跳转到的节点(1)
  591 + reqVO.getTargetTaskDefinitionKey()) // targetKey 跳转到的节点(1)
639 592 .changeState();
640 593 }
641 594  
... ... @@ -877,6 +830,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
877 830 return StrUtil.equalsAny(scopeType,BpmTaskAddSignTypeEnum.BEFORE.getType(),scopeType, BpmTaskAddSignTypeEnum.AFTER.getType());
878 831 }
879 832  
  833 +// TODO @海:BpmProcessInstanceResultEnum.CAN_SUB_SIGN_STATUS_LIST) 应该作为条件,mapper 不要有业务
880 834 /**
881 835 * 获取所有要被取消的删除的任务 ID 集合
882 836 *
... ... @@ -918,42 +872,17 @@ public class BpmTaskServiceImpl implements BpmTaskService {
918 872 * @return 所有子任务的 ID 集合
919 873 */
920 874 private List<String> getChildrenTaskIdList(String parentTaskId) {
921   - return convertList(getChildrenTaskList0(parentTaskId), Task::getId);
  875 + return convertList(getTaskListByParentTaskId(parentTaskId), Task::getId);
922 876 }
923 877  
924   - /**
925   - * 获取指定父级任务的所有子任务 ID 集合
926   - *
927   - * @param parentTaskId 父任务 ID
928   - * @return 所有子任务的 ID 集合
929   - */
930   - private List<Task> getChildrenTaskList0(String parentTaskId) {
  878 + @Override
  879 + public List<Task> getTaskListByParentTaskId(String parentTaskId) {
931 880 String tableName = managementService.getTableName(TaskEntity.class);
932 881 // taskService.createTaskQuery() 没有 parentId 参数,所以写 sql 查询
933 882 String sql = "select ID_,OWNER_,ASSIGNEE_ from " + tableName + " where PARENT_TASK_ID_=#{parentTaskId}";
934 883 return taskService.createNativeTaskQuery().sql(sql).parameter("parentTaskId", parentTaskId).list();
935 884 }
936 885  
937   -
938   - @Override
939   - public List<BpmTaskSubSignRespVO> getChildrenTaskList(String parentId) {
940   - // 1. 只查询进行中的任务 后加签的任务,可能不存在 assignee,所以还需要查询 owner
941   - List<Task> taskList = getChildrenTaskList0(parentId);
942   - if (CollUtil.isEmpty(taskList)) {
943   - return Collections.emptyList();
944   - }
945   -
946   - // 2.1 将 owner 和 assignee 统一到一个集合中
947   - List<Long> userIds = convertListByFlatMap(taskList, control ->
948   - Stream.of(NumberUtils.parseLong(control.getAssignee()), NumberUtils.parseLong(control.getOwner()))
949   - .filter(Objects::nonNull)); // TODO 芋艿:这里可能可以优化下
950   - // 2.2 组装数据
951   - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
952   -// List<BpmTaskExtDO> taskExtList = taskExtMapper.selectProcessListByTaskIds(childrenTaskIdList);
953   -// Map<String, Task> idTaskMap = convertMap(taskList, TaskInfo::getId);
954   - return BpmTaskConvert.INSTANCE.convertList(taskList, userMap);
955   - }
956   -
957 886 @Override
958 887 public Map<String, String> getTaskNameByTaskIds(Collection<String> taskIds) {
959 888 if (CollUtil.isEmpty(taskIds)) {
... ...