Commit 3fce482716d475d9161c071e90ba6607135654f2
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)) { | ... | ... |