Commit 3bb3e4caf6a929b5e53eab74ca43960dbaa5d80d
1 parent
cc67174f
code review:工作流的加减签
Showing
5 changed files
with
25 additions
and
26 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java
| ... | ... | @@ -3,7 +3,6 @@ package cn.iocoder.yudao.framework.common.util.collection; |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 4 | import cn.hutool.core.collection.CollectionUtil; |
| 5 | 5 | import cn.hutool.core.util.ArrayUtil; |
| 6 | -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | |
| 7 | 6 | import com.google.common.collect.ImmutableMap; |
| 8 | 7 | |
| 9 | 8 | import java.util.*; |
| ... | ... | @@ -269,7 +268,7 @@ public class CollectionUtils { |
| 269 | 268 | return deptId == null ? Collections.emptyList() : Collections.singleton(deptId); |
| 270 | 269 | } |
| 271 | 270 | |
| 272 | - public static <T, U> List<U> convertListByMultiAttr(Collection<T> from, | |
| 271 | + public static <T, U> List<U> convertListByFlatMap(Collection<T> from, | |
| 273 | 272 | Function<T, ? extends Stream<? extends U>> func) { |
| 274 | 273 | if (CollUtil.isEmpty(from)) { |
| 275 | 274 | return new ArrayList<>(); |
| ... | ... | @@ -277,11 +276,12 @@ public class CollectionUtils { |
| 277 | 276 | return from.stream().flatMap(func).filter(Objects::nonNull).collect(Collectors.toList()); |
| 278 | 277 | } |
| 279 | 278 | |
| 280 | - public static <T, U> Set<U> convertSetByMultiAttr(Collection<T> from, | |
| 281 | - Function<T, ? extends Stream<? extends U>> func) { | |
| 279 | + public static <T, U> Set<U> convertSetByFlatMap(Collection<T> from, | |
| 280 | + Function<T, ? extends Stream<? extends U>> func) { | |
| 282 | 281 | if (CollUtil.isEmpty(from)) { |
| 283 | 282 | return new HashSet<>(); |
| 284 | 283 | } |
| 285 | 284 | return from.stream().flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet()); |
| 286 | 285 | } |
| 286 | + | |
| 287 | 287 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
| ... | ... | @@ -101,22 +101,22 @@ public class BpmTaskController { |
| 101 | 101 | @PutMapping("/create-sign") |
| 102 | 102 | @Operation(summary = "加签", description = "before 前加签,after 后加签") |
| 103 | 103 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") |
| 104 | - public CommonResult<Boolean> addSignTask(@Valid @RequestBody BpmTaskAddSignReqVO reqVO) { | |
| 105 | - taskService.addSignTask(getLoginUserId(), reqVO); | |
| 104 | + public CommonResult<Boolean> createSignTask(@Valid @RequestBody BpmTaskAddSignReqVO reqVO) { | |
| 105 | + taskService.createSignTask(getLoginUserId(), reqVO); | |
| 106 | 106 | return success(true); |
| 107 | 107 | } |
| 108 | 108 | |
| 109 | 109 | @DeleteMapping("/delete-sign") |
| 110 | 110 | @Operation(summary = "减签") |
| 111 | 111 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") |
| 112 | - public CommonResult<Boolean> subSignTask(@Valid @RequestBody BpmTaskSubSignReqVO reqVO) { | |
| 113 | - taskService.subSignTask(getLoginUserId(), reqVO); | |
| 112 | + public CommonResult<Boolean> deleteSignTask(@Valid @RequestBody BpmTaskSubSignReqVO reqVO) { | |
| 113 | + taskService.deleteSignTask(getLoginUserId(), reqVO); | |
| 114 | 114 | return success(true); |
| 115 | 115 | } |
| 116 | 116 | |
| 117 | 117 | @GetMapping("children-list") |
| 118 | 118 | @Operation(summary = "获取能被减签的任务") |
| 119 | - @Parameter(name = "parentId", description = "父级任务ID", required = true) | |
| 119 | + @Parameter(name = "parentId", description = "父级任务 ID", required = true) | |
| 120 | 120 | @PreAuthorize("@ss.hasPermission('bpm:task:update')") |
| 121 | 121 | public CommonResult<List<BpmTaskSubSignRespVO>> getChildrenTaskList(@RequestParam("parentId") String parentId) { |
| 122 | 122 | return success(taskService.getChildrenTaskList(parentId)); | ... | ... |
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.collection.CollUtil; | |
| 4 | 3 | import cn.hutool.core.date.LocalDateTimeUtil; |
| 5 | 4 | import cn.hutool.core.util.ObjectUtil; |
| 6 | 5 | import cn.hutool.core.util.StrUtil; |
| ... | ... | @@ -27,6 +26,9 @@ import java.util.Date; |
| 27 | 26 | import java.util.List; |
| 28 | 27 | import java.util.Map; |
| 29 | 28 | |
| 29 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; | |
| 30 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; | |
| 31 | + | |
| 30 | 32 | /** |
| 31 | 33 | * Bpm 任务 Convert |
| 32 | 34 | * |
| ... | ... | @@ -171,9 +173,7 @@ public interface BpmTaskConvert { |
| 171 | 173 | Map<String, Task> idTaskMap){ |
| 172 | 174 | return CollectionUtils.convertList(bpmTaskExtDOList, task -> { |
| 173 | 175 | BpmTaskSubSignRespVO bpmTaskSubSignRespVO = new BpmTaskSubSignRespVO() |
| 174 | - .setName(task.getName()) | |
| 175 | - .setId(task.getTaskId()); | |
| 176 | - | |
| 176 | + .setId(task.getTaskId()).setName(task.getName()); | |
| 177 | 177 | // 后加签任务不会直接设置 assignee ,所以不存在 assignee 的情况,则去取 owner |
| 178 | 178 | Task sourceTask = idTaskMap.get(task.getTaskId()); |
| 179 | 179 | String assignee = ObjectUtil.defaultIfBlank(sourceTask.getOwner(),sourceTask.getAssignee()); |
| ... | ... | @@ -190,12 +190,12 @@ public interface BpmTaskConvert { |
| 190 | 190 | * @return 转换后的父子级数组 |
| 191 | 191 | */ |
| 192 | 192 | default List<BpmTaskRespVO> convertChildrenList(List<BpmTaskRespVO> sourceList) { |
| 193 | - List<BpmTaskRespVO> childrenTaskList = CollectionUtils.filterList(sourceList, r -> StrUtil.isNotEmpty(r.getParentTaskId())); | |
| 194 | - Map<String, List<BpmTaskRespVO>> parentChildrenTaskListMap = CollectionUtils.convertMultiMap(childrenTaskList, BpmTaskRespVO::getParentTaskId); | |
| 193 | + List<BpmTaskRespVO> childrenTaskList = filterList(sourceList, r -> StrUtil.isNotEmpty(r.getParentTaskId())); | |
| 194 | + Map<String, List<BpmTaskRespVO>> parentChildrenTaskListMap = convertMultiMap(childrenTaskList, BpmTaskRespVO::getParentTaskId); | |
| 195 | 195 | for (BpmTaskRespVO bpmTaskRespVO : sourceList) { |
| 196 | 196 | bpmTaskRespVO.setChildren(parentChildrenTaskListMap.get(bpmTaskRespVO.getId())); |
| 197 | 197 | } |
| 198 | - return CollectionUtils.filterList(sourceList, r -> StrUtil.isEmpty(r.getParentTaskId())); | |
| 198 | + return filterList(sourceList, r -> StrUtil.isEmpty(r.getParentTaskId())); | |
| 199 | 199 | } |
| 200 | 200 | |
| 201 | 201 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
| ... | ... | @@ -163,7 +163,7 @@ public interface BpmTaskService { |
| 163 | 163 | * @param userId 被加签的用户和任务 ID,加签类型 |
| 164 | 164 | * @param reqVO 当前用户 ID |
| 165 | 165 | */ |
| 166 | - void addSignTask(Long userId, BpmTaskAddSignReqVO reqVO); | |
| 166 | + void createSignTask(Long userId, BpmTaskAddSignReqVO reqVO); | |
| 167 | 167 | |
| 168 | 168 | /** |
| 169 | 169 | * 任务减签名 |
| ... | ... | @@ -171,7 +171,7 @@ public interface BpmTaskService { |
| 171 | 171 | * @param userId 当前用户ID |
| 172 | 172 | * @param reqVO 被减签的任务 ID,理由 |
| 173 | 173 | */ |
| 174 | - void subSignTask(Long userId, BpmTaskSubSignReqVO reqVO); | |
| 174 | + void deleteSignTask(Long userId, BpmTaskSubSignReqVO reqVO); | |
| 175 | 175 | |
| 176 | 176 | /** |
| 177 | 177 | * 获取指定任务的子任务和审批人信息 | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
| ... | ... | @@ -711,7 +711,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 711 | 711 | |
| 712 | 712 | @Override |
| 713 | 713 | @Transactional(rollbackFor = Exception.class) |
| 714 | - public void addSignTask(Long userId, BpmTaskAddSignReqVO reqVO) { | |
| 714 | + public void createSignTask(Long userId, BpmTaskAddSignReqVO reqVO) { | |
| 715 | 715 | // 1. 获取和校验任务 |
| 716 | 716 | TaskEntityImpl taskEntity = validateAddSign(userId, reqVO); |
| 717 | 717 | List<AdminUserRespDTO> userList = adminUserApi.getUserList(reqVO.getUserIdList()); |
| ... | ... | @@ -826,7 +826,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 826 | 826 | |
| 827 | 827 | @Override |
| 828 | 828 | @Transactional(rollbackFor = Exception.class) |
| 829 | - public void subSignTask(Long userId, BpmTaskSubSignReqVO reqVO) { | |
| 829 | + public void deleteSignTask(Long userId, BpmTaskSubSignReqVO reqVO) { | |
| 830 | 830 | // 1.1 校验 task 可以被减签 |
| 831 | 831 | Task task = validateSubSign(reqVO.getId()); |
| 832 | 832 | // 1.2 校验取消人存在 |
| ... | ... | @@ -902,12 +902,14 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 902 | 902 | stack.push(parentTaskId); |
| 903 | 903 | //控制遍历的次数不超过 Byte.MAX_VALUE,避免脏数据造成死循环 |
| 904 | 904 | int count = 0; |
| 905 | + // TODO @海:< 的前后空格,要注意哈; | |
| 905 | 906 | while (!stack.isEmpty() && count<Byte.MAX_VALUE) { |
| 906 | 907 | // 1.2 弹出栈顶任务ID |
| 907 | 908 | String taskId = stack.pop(); |
| 908 | 909 | // 1.3 将任务ID添加到结果集合中 |
| 909 | 910 | allChildTaskIds.add(taskId); |
| 910 | 911 | // 1.4 获取该任务的子任务列表 |
| 912 | + // TODO @海:有个更高效的写法;一次性去 in 一层;不然每个节点,都去查询一次 db, 太浪费了;每次 in,最终就是 O(h) 查询,而不是 O(n) 查询; | |
| 911 | 913 | List<String> childrenTaskIdList = getChildrenTaskIdList(taskId); |
| 912 | 914 | if (CollUtil.isNotEmpty(childrenTaskIdList)) { |
| 913 | 915 | for (String childTaskId : childrenTaskIdList) { |
| ... | ... | @@ -920,7 +922,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 920 | 922 | return allChildTaskIds; |
| 921 | 923 | } |
| 922 | 924 | |
| 923 | - | |
| 924 | 925 | /** |
| 925 | 926 | * 获取指定父级任务的所有子任务 ID 集合 |
| 926 | 927 | * |
| ... | ... | @@ -954,13 +955,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 954 | 955 | } |
| 955 | 956 | List<String> childrenTaskIdList = convertList(taskList, Task::getId); |
| 956 | 957 | |
| 957 | - | |
| 958 | - // 2. 将 owner 和 assignee 统一到一个集合中 | |
| 959 | - List<Long> userIds = convertListByMultiAttr(taskList,control -> | |
| 958 | + // 2.1 将 owner 和 assignee 统一到一个集合中 | |
| 959 | + List<Long> userIds = convertListByFlatMap(taskList, control -> | |
| 960 | 960 | Stream.of(NumberUtils.parseLong(control.getAssignee()), NumberUtils.parseLong(control.getOwner())) |
| 961 | 961 | .filter(Objects::nonNull)); |
| 962 | - | |
| 963 | - // 3. 组装数据 | |
| 962 | + // 2.2 组装数据 | |
| 964 | 963 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| 965 | 964 | List<BpmTaskExtDO> taskExtList = taskExtMapper.selectProcessListByTaskIds(childrenTaskIdList); |
| 966 | 965 | Map<String, Task> idTaskMap = convertMap(taskList, TaskInfo::getId); | ... | ... |