Commit 7bb171512a35522ae060e4b0a313a55ca2be8cef
1 parent
986f9533
📖 BPM:code review 抄送逻辑
Showing
13 changed files
with
87 additions
and
253 deletions
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java
| ... | ... | @@ -17,17 +17,15 @@ import io.swagger.v3.oas.annotations.Operation; |
| 17 | 17 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 18 | 18 | import jakarta.annotation.Resource; |
| 19 | 19 | import jakarta.validation.Valid; |
| 20 | -import org.springframework.context.annotation.Lazy; | |
| 21 | 20 | import org.springframework.security.access.prepost.PreAuthorize; |
| 22 | 21 | import org.springframework.validation.annotation.Validated; |
| 23 | 22 | import org.springframework.web.bind.annotation.*; |
| 24 | 23 | |
| 25 | -import java.util.HashSet; | |
| 26 | 24 | import java.util.Map; |
| 27 | -import java.util.Set; | |
| 28 | -import java.util.stream.Collectors; | |
| 25 | +import java.util.stream.Stream; | |
| 29 | 26 | |
| 30 | 27 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 28 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap; | |
| 31 | 29 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 32 | 30 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| 33 | 31 | |
| ... | ... | @@ -41,6 +39,7 @@ public class BpmProcessInstanceCopyController { |
| 41 | 39 | private BpmProcessInstanceCopyService processInstanceCopyService; |
| 42 | 40 | @Resource |
| 43 | 41 | private BpmProcessInstanceService bpmProcessInstanceService; |
| 42 | + | |
| 44 | 43 | @Resource |
| 45 | 44 | private AdminUserApi adminUserApi; |
| 46 | 45 | |
| ... | ... | @@ -50,8 +49,9 @@ public class BpmProcessInstanceCopyController { |
| 50 | 49 | @PostMapping("/create") |
| 51 | 50 | @Operation(summary = "抄送流程") |
| 52 | 51 | @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:create')") |
| 53 | - public CommonResult<Void> createProcessInstanceCC(@Valid @RequestBody BpmProcessInstanceCopyCreateReqVO createReqVO) { | |
| 54 | - return success(processInstanceCopyService.createProcessInstanceCopy(getLoginUserId(), createReqVO)); | |
| 52 | + public CommonResult<Boolean> createProcessInstanceCC(@Valid @RequestBody BpmProcessInstanceCopyCreateReqVO createReqVO) { | |
| 53 | + processInstanceCopyService.createProcessInstanceCopy(getLoginUserId(), createReqVO); | |
| 54 | + return success(true); | |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | 57 | @GetMapping("/my-page") |
| ... | ... | @@ -64,20 +64,14 @@ public class BpmProcessInstanceCopyController { |
| 64 | 64 | return success(new PageResult<>(pageResult.getTotal())); |
| 65 | 65 | } |
| 66 | 66 | |
| 67 | - Map<String, String> taskNameByTaskIds = bpmTaskService.getTaskNameByTaskIds(convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getTaskId)); | |
| 68 | - Map<String, String> processInstanceNameByProcessInstanceIds = bpmTaskService.getProcessInstanceNameByProcessInstanceIds(convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId)); | |
| 69 | - | |
| 70 | - Set<Long/* userId */> userIds = new HashSet<>(); | |
| 71 | - for (BpmProcessInstanceCopyDO doItem : pageResult.getList()) { | |
| 72 | - userIds.add(doItem.getStartUserId()); | |
| 73 | - Long userId = Long.valueOf(doItem.getCreator()); | |
| 74 | - userIds.add(userId); | |
| 75 | - } | |
| 76 | - Map<Long, String> userMap = adminUserApi.getUserList(userIds).stream().collect(Collectors.toMap( | |
| 77 | - AdminUserRespDTO::getId, AdminUserRespDTO::getNickname)); | |
| 78 | - | |
| 79 | - // 转换返回 | |
| 80 | - return success(BpmProcessInstanceCopyConvert.INSTANCE.convertPage(pageResult, taskNameByTaskIds, processInstanceNameByProcessInstanceIds, userMap)); | |
| 67 | + // 拼接返回 | |
| 68 | + Map<String, String> taskNameMap = bpmTaskService.getTaskNameByTaskIds( | |
| 69 | + convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getTaskId)); | |
| 70 | + Map<String, String> processNameMap = bpmProcessInstanceService.getProcessInstanceNameMap( | |
| 71 | + convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId)); | |
| 72 | + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(), | |
| 73 | + copy -> Stream.of(copy.getStartUserId(), Long.parseLong(copy.getCreator())))); | |
| 74 | + return success(BpmProcessInstanceCopyConvert.INSTANCE.convertPage(pageResult, taskNameMap, processNameMap, userMap)); | |
| 81 | 75 | } |
| 82 | 76 | |
| 83 | 77 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyCreateReqVO.java
| 1 | 1 | package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.module.bpm.controller.admin.candidate.vo.BpmTaskCandidateRuleVO; | |
| 4 | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | 4 | import jakarta.validation.constraints.NotBlank; |
| 6 | 5 | import jakarta.validation.constraints.NotEmpty; |
| 7 | 6 | import lombok.Data; |
| 8 | -import lombok.EqualsAndHashCode; | |
| 9 | -import lombok.ToString; | |
| 10 | 7 | |
| 11 | 8 | @Schema(description = "管理后台 - 流程实例抄送的创建 Request VO") |
| 12 | 9 | @Data |
| 13 | -@EqualsAndHashCode(callSuper = true) | |
| 14 | -@ToString(callSuper = true) | |
| 15 | -public class BpmProcessInstanceCopyCreateReqVO extends BpmTaskCandidateRuleVO { | |
| 10 | +public class BpmProcessInstanceCopyCreateReqVO { | |
| 16 | 11 | |
| 17 | 12 | @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 18 | 13 | @NotEmpty(message = "任务编号不能为空") | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyPageItemRespVO.java
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmProcessInstanceCopyVO.java
| ... | ... | @@ -5,6 +5,7 @@ import lombok.Data; |
| 5 | 5 | |
| 6 | 6 | import java.time.LocalDateTime; |
| 7 | 7 | |
| 8 | +// TODO @kyle:1)明确是 Req 还是 Resp;2)注释可以合并到 swagger 里;3)example 写一下,这样一些 mock 接口平台可以读取 example | |
| 8 | 9 | /** |
| 9 | 10 | * 流程抄送视图对象 |
| 10 | 11 | */ |
| ... | ... | @@ -60,4 +61,5 @@ public class BpmProcessInstanceCopyVO { |
| 60 | 61 | |
| 61 | 62 | @Schema(description = "抄送时间") |
| 62 | 63 | private LocalDateTime createTime; |
| 64 | + | |
| 63 | 65 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/cc/BpmProcessInstanceCopyConvert.java
| ... | ... | @@ -4,8 +4,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 4 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| 5 | 5 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 6 | 6 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageItemRespVO; |
| 7 | -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmProcessInstanceCopyVO; | |
| 8 | 7 | import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; |
| 8 | +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | |
| 9 | 9 | import org.mapstruct.Mapper; |
| 10 | 10 | import org.mapstruct.factory.Mappers; |
| 11 | 11 | |
| ... | ... | @@ -22,22 +22,17 @@ public interface BpmProcessInstanceCopyConvert { |
| 22 | 22 | |
| 23 | 23 | BpmProcessInstanceCopyConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceCopyConvert.class); |
| 24 | 24 | |
| 25 | - BpmProcessInstanceCopyVO convert(BpmProcessInstanceCopyDO bean); | |
| 26 | - | |
| 27 | - List<BpmProcessInstanceCopyPageItemRespVO> convertList(List<BpmProcessInstanceCopyDO> list); | |
| 28 | - | |
| 29 | - default PageResult<BpmProcessInstanceCopyPageItemRespVO> convertPage(PageResult<BpmProcessInstanceCopyDO> page | |
| 30 | - , Map<String, String/* taskName */> taskMap | |
| 31 | - , Map<String, String/* processInstaneName */> processInstaneMap | |
| 32 | - , Map<Long, String/* userName */> userMap | |
| 33 | - ) { | |
| 25 | + default PageResult<BpmProcessInstanceCopyPageItemRespVO> convertPage(PageResult<BpmProcessInstanceCopyDO> page, | |
| 26 | + Map<String, String> taskNameMap, | |
| 27 | + Map<String, String> processInstaneNameMap, | |
| 28 | + Map<Long, AdminUserRespDTO> userMap) { | |
| 34 | 29 | List<BpmProcessInstanceCopyPageItemRespVO> list = BeanUtils.toBean(page.getList(), |
| 35 | 30 | BpmProcessInstanceCopyPageItemRespVO.class, |
| 36 | 31 | copy -> { |
| 37 | - MapUtils.findAndThen(userMap, Long.valueOf(copy.getCreator()), copy::setCreatorNickname); | |
| 38 | - MapUtils.findAndThen(userMap, copy.getStartUserId(), copy::setStartUserNickname); | |
| 39 | - MapUtils.findAndThen(taskMap, copy.getTaskId(), copy::setTaskName); | |
| 40 | - MapUtils.findAndThen(processInstaneMap, copy.getProcessInstanceId(), copy::setProcessInstanceName); | |
| 32 | + MapUtils.findAndThen(userMap, Long.valueOf(copy.getCreator()), user -> user.setNickname(user.getNickname())); | |
| 33 | + MapUtils.findAndThen(userMap, copy.getStartUserId(), user -> copy.setStartUserNickname(user.getNickname())); | |
| 34 | + MapUtils.findAndThen(taskNameMap, copy.getTaskId(), copy::setTaskName); | |
| 35 | + MapUtils.findAndThen(processInstaneNameMap, copy.getProcessInstanceId(), copy::setProcessInstanceName); | |
| 41 | 36 | }); |
| 42 | 37 | return new PageResult<>(list, page.getTotal()); |
| 43 | 38 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/cc/BpmProcessInstanceCopyDO.java
| ... | ... | @@ -28,40 +28,40 @@ public class BpmProcessInstanceCopyDO extends BaseDO { |
| 28 | 28 | |
| 29 | 29 | /** |
| 30 | 30 | * 发起人 Id |
| 31 | - * <p> | |
| 31 | + * | |
| 32 | 32 | * 关联 system_users 的 id 属性 |
| 33 | 33 | */ |
| 34 | 34 | private Long startUserId; |
| 35 | 35 | /** |
| 36 | 36 | * 流程名 |
| 37 | - * <p> | |
| 38 | - * 冗余字段 | |
| 37 | + * | |
| 38 | + * 冗余 ProcessInstance 的 name 字段 | |
| 39 | 39 | */ |
| 40 | 40 | private String processInstanceName; |
| 41 | 41 | /** |
| 42 | 42 | * 流程实例的编号 |
| 43 | - * <p> | |
| 43 | + * | |
| 44 | 44 | * 关联 ProcessInstance 的 id 属性 |
| 45 | 45 | */ |
| 46 | 46 | private String processInstanceId; |
| 47 | 47 | |
| 48 | 48 | /** |
| 49 | 49 | * 任务主键 |
| 50 | - * <p> | |
| 51 | - * 关联 task 的 id 属性 | |
| 50 | + * | |
| 51 | + * 关联 Task 的 id 属性 | |
| 52 | 52 | */ |
| 53 | 53 | private String taskId; |
| 54 | 54 | |
| 55 | 55 | /** |
| 56 | 56 | * 任务名称 |
| 57 | - * <p> | |
| 58 | - * 冗余字段 | |
| 57 | + * | |
| 58 | + * 冗余 Task 的 name 属性 | |
| 59 | 59 | */ |
| 60 | 60 | private String taskName; |
| 61 | 61 | |
| 62 | 62 | /** |
| 63 | 63 | * 用户编号 |
| 64 | - * <p> | |
| 64 | + * | |
| 65 | 65 | * 关联 system_users 的 id 属性 |
| 66 | 66 | */ |
| 67 | 67 | private Long userId; |
| ... | ... | @@ -73,8 +73,8 @@ public class BpmProcessInstanceCopyDO extends BaseDO { |
| 73 | 73 | |
| 74 | 74 | /** |
| 75 | 75 | * 流程分类 |
| 76 | - * <p> | |
| 77 | - * 冗余字段 | |
| 76 | + * | |
| 77 | + * 冗余 ProcessInstance 的 category 字段 | |
| 78 | 78 | */ |
| 79 | 79 | private String category; |
| 80 | 80 | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java
| ... | ... | @@ -47,6 +47,17 @@ public interface BpmProcessInstanceService { |
| 47 | 47 | } |
| 48 | 48 | |
| 49 | 49 | /** |
| 50 | + * 获得流程实例名字 Map | |
| 51 | + * | |
| 52 | + * @param ids 流程实例的编号集合 | |
| 53 | + * @return 对应的映射关系 | |
| 54 | + */ | |
| 55 | + default Map<String, String> getProcessInstanceNameMap(Set<String> ids) { | |
| 56 | + return CollectionUtils.convertMap(getProcessInstances(ids), | |
| 57 | + ProcessInstance::getProcessInstanceId, ProcessInstance::getName); | |
| 58 | + } | |
| 59 | + | |
| 60 | + /** | |
| 50 | 61 | * 获得流程实例的分页 |
| 51 | 62 | * |
| 52 | 63 | * @param userId 用户编号 | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
| ... | ... | @@ -10,7 +10,6 @@ import org.flowable.task.api.Task; |
| 10 | 10 | import java.util.Collection; |
| 11 | 11 | import java.util.List; |
| 12 | 12 | import java.util.Map; |
| 13 | -import java.util.Set; | |
| 14 | 13 | |
| 15 | 14 | /** |
| 16 | 15 | * 流程任务实例 Service 接口 |
| ... | ... | @@ -186,18 +185,11 @@ public interface BpmTaskService { |
| 186 | 185 | List<BpmTaskSubSignRespVO> getChildrenTaskList(String parentId); |
| 187 | 186 | |
| 188 | 187 | /** |
| 189 | - * 通过任务id查询任务名 | |
| 188 | + * 通过任务 ID,查询任务名 Map | |
| 190 | 189 | * |
| 191 | - * @param taskIds 任务id | |
| 192 | - * @return 对应的映射关系 | |
| 190 | + * @param taskIds 任务 ID | |
| 191 | + * @return 任务 ID 与名字的 Map | |
| 193 | 192 | */ |
| 194 | - Map<String/* taskId */, String/* taskName */> getTaskNameByTaskIds(Collection<String> taskIds); | |
| 193 | + Map<String, String> getTaskNameByTaskIds(Collection<String> taskIds); | |
| 195 | 194 | |
| 196 | - /** | |
| 197 | - * 通过流程实例id获取到流程实例名 | |
| 198 | - * | |
| 199 | - * @param processInstaneIds 流程实例Id | |
| 200 | - * @return 对应的映射关系 | |
| 201 | - */ | |
| 202 | - Map<String/* processInstaneId */, String/* processInstaneName */> getProcessInstanceNameByProcessInstanceIds(Set<String> processInstaneIds); | |
| 203 | 195 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
| ... | ... | @@ -21,7 +21,6 @@ import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; |
| 21 | 21 | import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskAddSignTypeEnum; |
| 22 | 22 | import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; |
| 23 | 23 | import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; |
| 24 | -import cn.iocoder.yudao.module.bpm.service.task.cc.BpmProcessInstanceCopyService; | |
| 25 | 24 | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| 26 | 25 | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| 27 | 26 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| ... | ... | @@ -95,9 +94,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 95 | 94 | @Resource |
| 96 | 95 | private ManagementService managementService; |
| 97 | 96 | |
| 98 | - @Resource | |
| 99 | - private BpmProcessInstanceCopyService processInstanceCopyService; | |
| 100 | - | |
| 101 | 97 | @Override |
| 102 | 98 | public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) { |
| 103 | 99 | // 查询待办任务 |
| ... | ... | @@ -972,28 +968,12 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 972 | 968 | } |
| 973 | 969 | |
| 974 | 970 | @Override |
| 975 | - public Map<String/* taskId */, String/* taskName */> getTaskNameByTaskIds(Collection<String> taskIds) { | |
| 976 | - List<Task> tasks = taskService.createTaskQuery().taskIds(taskIds).list(); | |
| 977 | - if (CollUtil.isNotEmpty(tasks)) { | |
| 978 | - Map<String/* taskId */, String/* taskName */> taskMap = new HashMap<>(tasks.size()); | |
| 979 | - for (Task task : tasks) { | |
| 980 | - taskMap.putIfAbsent(task.getId(), task.getName()); | |
| 981 | - } | |
| 982 | - return taskMap; | |
| 971 | + public Map<String, String> getTaskNameByTaskIds(Collection<String> taskIds) { | |
| 972 | + if (CollUtil.isEmpty(taskIds)) { | |
| 973 | + return Collections.emptyMap(); | |
| 983 | 974 | } |
| 984 | - return Collections.emptyMap(); | |
| 975 | + List<Task> tasks = taskService.createTaskQuery().taskIds(taskIds).list(); | |
| 976 | + return convertMap(tasks, Task::getId, Task::getName); | |
| 985 | 977 | } |
| 986 | 978 | |
| 987 | - @Override | |
| 988 | - public Map<String/* processInstaneId */, String/* processInstaneName */> getProcessInstanceNameByProcessInstanceIds(Set<String> processInstanceIds) { | |
| 989 | - List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processInstanceIds(processInstanceIds).list(); | |
| 990 | - if (CollUtil.isNotEmpty(processInstances)) { | |
| 991 | - Map<String/* processInstaneId */, String/* processInstaneName */> processInstaneMap = new HashMap<>(processInstances.size()); | |
| 992 | - for (ProcessInstance processInstance : processInstances) { | |
| 993 | - processInstaneMap.putIfAbsent(processInstance.getId(), processInstance.getName()); | |
| 994 | - } | |
| 995 | - return processInstaneMap; | |
| 996 | - } | |
| 997 | - return Collections.emptyMap(); | |
| 998 | - } | |
| 999 | 979 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/cc/BpmProcessInstanceCopyService.java
| ... | ... | @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.bpm.service.task.cc; |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 4 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyCreateReqVO; |
| 5 | 5 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyMyPageReqVO; |
| 6 | -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageItemRespVO; | |
| 7 | 6 | import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; |
| 8 | 7 | import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo; |
| 9 | 8 | |
| ... | ... | @@ -28,14 +27,14 @@ public interface BpmProcessInstanceCopyService { |
| 28 | 27 | * @param userId 当前登录用户 |
| 29 | 28 | * @param createReqVO 创建的抄送请求 |
| 30 | 29 | */ |
| 31 | - Void createProcessInstanceCopy(Long userId, BpmProcessInstanceCopyCreateReqVO createReqVO); | |
| 30 | + void createProcessInstanceCopy(Long userId, BpmProcessInstanceCopyCreateReqVO createReqVO); | |
| 32 | 31 | |
| 33 | 32 | /** |
| 34 | 33 | * 抄送的流程的分页 |
| 35 | - * @param loginUserId 登录用户id | |
| 34 | + * @param userId 当前登录用户 | |
| 36 | 35 | * @param pageReqVO 分页请求 |
| 37 | 36 | * @return 抄送的分页结果 |
| 38 | 37 | */ |
| 39 | - PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long loginUserId, | |
| 38 | + PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long userId, | |
| 40 | 39 | BpmProcessInstanceCopyMyPageReqVO pageReqVO); |
| 41 | 40 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/cc/BpmProcessInstanceCopyServiceImpl.java
| ... | ... | @@ -7,25 +7,18 @@ import cn.hutool.core.util.StrUtil; |
| 7 | 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 8 | 8 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyCreateReqVO; |
| 9 | 9 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyMyPageReqVO; |
| 10 | -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageItemRespVO; | |
| 11 | -import cn.iocoder.yudao.module.bpm.convert.cc.BpmProcessInstanceCopyConvert; | |
| 12 | 10 | import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; |
| 13 | 11 | import cn.iocoder.yudao.module.bpm.dal.mysql.cc.BpmProcessInstanceCopyMapper; |
| 14 | 12 | import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants; |
| 15 | -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; | |
| 16 | 13 | import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo; |
| 17 | 14 | import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfoProcessorChain; |
| 18 | 15 | import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; |
| 19 | 16 | import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; |
| 20 | 17 | import cn.iocoder.yudao.module.bpm.service.task.cc.dto.BpmDelegateExecutionDTO; |
| 21 | -import cn.iocoder.yudao.module.bpm.util.FlowableUtils; | |
| 22 | -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | |
| 23 | -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | |
| 24 | 18 | import jakarta.annotation.Resource; |
| 25 | 19 | import lombok.extern.slf4j.Slf4j; |
| 26 | 20 | import org.flowable.engine.RuntimeService; |
| 27 | 21 | import org.flowable.engine.delegate.DelegateExecution; |
| 28 | -import org.flowable.engine.repository.ProcessDefinition; | |
| 29 | 22 | import org.flowable.engine.runtime.ProcessInstance; |
| 30 | 23 | import org.flowable.task.api.Task; |
| 31 | 24 | import org.springframework.context.annotation.Lazy; |
| ... | ... | @@ -33,14 +26,14 @@ import org.springframework.stereotype.Service; |
| 33 | 26 | import org.springframework.validation.annotation.Validated; |
| 34 | 27 | |
| 35 | 28 | import java.time.LocalDateTime; |
| 36 | -import java.util.*; | |
| 37 | -import java.util.stream.Collectors; | |
| 29 | +import java.util.ArrayList; | |
| 30 | +import java.util.List; | |
| 31 | +import java.util.Set; | |
| 38 | 32 | |
| 39 | 33 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 40 | -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | |
| 41 | 34 | |
| 42 | 35 | /** |
| 43 | - * Flowable流程抄送实现 | |
| 36 | + * 流程抄送 Service 实现类 | |
| 44 | 37 | * |
| 45 | 38 | * @author kyle |
| 46 | 39 | */ |
| ... | ... | @@ -61,6 +54,9 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy |
| 61 | 54 | @Resource |
| 62 | 55 | @Lazy |
| 63 | 56 | private BpmTaskService bpmTaskService; |
| 57 | + @Resource | |
| 58 | + @Lazy | |
| 59 | + private BpmProcessInstanceService bpmProcessInstanceService; | |
| 64 | 60 | |
| 65 | 61 | @Override |
| 66 | 62 | public boolean makeCopy(BpmCandidateSourceInfo sourceInfo) { |
| ... | ... | @@ -86,7 +82,7 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy |
| 86 | 82 | // 调用 |
| 87 | 83 | // 设置任务id |
| 88 | 84 | copyDO.setTaskId(sourceInfo.getTaskId()); |
| 89 | - copyDO.setTaskName(FlowableUtils.getTaskNameByTaskId(sourceInfo.getTaskId())); | |
| 85 | + copyDO.setTaskName(task.getName()); | |
| 90 | 86 | copyDO.setProcessInstanceId(processInstanceId); |
| 91 | 87 | ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() |
| 92 | 88 | .processInstanceId(processInstanceId) |
| ... | ... | @@ -95,10 +91,9 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy |
| 95 | 91 | log.warn("相关流程实例不存在 {}", sourceInfo.getTaskId()); |
| 96 | 92 | return false; |
| 97 | 93 | } |
| 98 | - copyDO.setStartUserId(FlowableUtils.getStartUserIdFromProcessInstance(processInstance)); | |
| 94 | + copyDO.setStartUserId(Long.parseLong(processInstance.getStartUserId())); | |
| 99 | 95 | copyDO.setProcessInstanceName(processInstance.getName()); |
| 100 | - ProcessDefinition processDefinition = FlowableUtils.getProcessDefinition(processInstance.getProcessDefinitionId()); | |
| 101 | - copyDO.setCategory(processDefinition.getCategory()); | |
| 96 | + copyDO.setCategory(processInstance.getProcessDefinitionCategory()); | |
| 102 | 97 | copyDO.setReason(sourceInfo.getReason()); |
| 103 | 98 | copyDO.setCreator(sourceInfo.getCreator()); |
| 104 | 99 | copyDO.setCreateTime(LocalDateTime.now()); |
| ... | ... | @@ -113,53 +108,32 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy |
| 113 | 108 | } |
| 114 | 109 | |
| 115 | 110 | @Override |
| 116 | - public Void createProcessInstanceCopy(Long userId, BpmProcessInstanceCopyCreateReqVO reqVO) { | |
| 117 | - if (!ObjectUtil.equal(reqVO.getType(), BpmTaskAssignRuleTypeEnum.USER.getType())) { | |
| 118 | - throw new IllegalArgumentException("业务仅支持USER"); | |
| 119 | - } | |
| 111 | + public void createProcessInstanceCopy(Long userId, BpmProcessInstanceCopyCreateReqVO reqVO) { | |
| 112 | + // 1.1 校验任务存在 | |
| 120 | 113 | Task task = bpmTaskService.getTask(reqVO.getTaskId()); |
| 121 | 114 | if (ObjectUtil.isNull(task)) { |
| 122 | 115 | throw exception(ErrorCodeConstants.TASK_NOT_EXISTS); |
| 123 | 116 | } |
| 117 | + // 1.2 校验流程存在 | |
| 124 | 118 | String processInstanceId = task.getProcessInstanceId(); |
| 125 | - if (StrUtil.isBlank(processInstanceId)) { | |
| 119 | + ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(processInstanceId); | |
| 120 | + if (processInstance == null) { | |
| 121 | + log.warn("[createProcessInstanceCopy][任务({}) 对应的流程不存在]", reqVO.getTaskId()); | |
| 126 | 122 | throw exception(ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS); |
| 127 | 123 | } |
| 128 | - // 在能正常审批的情况下抄送流程 | |
| 129 | - BpmProcessInstanceCopyDO copyDO = new BpmProcessInstanceCopyDO(); | |
| 130 | - // 调用 | |
| 131 | - // 设置任务id | |
| 132 | - copyDO.setTaskId(reqVO.getTaskId()); | |
| 133 | - copyDO.setTaskName(FlowableUtils.getTaskNameByTaskId(reqVO.getTaskId())); | |
| 134 | - copyDO.setProcessInstanceId(processInstanceId); | |
| 135 | - ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() | |
| 136 | - .processInstanceId(processInstanceId) | |
| 137 | - .singleResult(); | |
| 138 | - if (null == processInstance) { | |
| 139 | - log.warn("相关流程实例不存在 {}", reqVO.getTaskId()); | |
| 140 | - throw exception(ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS); | |
| 141 | - } | |
| 142 | - copyDO.setStartUserId(FlowableUtils.getStartUserIdFromProcessInstance(processInstance)); | |
| 143 | - copyDO.setProcessInstanceName(processInstance.getName()); | |
| 144 | - ProcessDefinition processDefinition = FlowableUtils.getProcessDefinition(processInstance.getProcessDefinitionId()); | |
| 145 | - copyDO.setCategory(processDefinition.getCategory()); | |
| 146 | - copyDO.setReason(reqVO.getReason()); | |
| 147 | - copyDO.setCreator(String.valueOf(userId)); | |
| 148 | - copyDO.setCreateTime(LocalDateTime.now()); | |
| 149 | - List<BpmProcessInstanceCopyDO> copyList = new ArrayList<>(reqVO.getOptions().size()); | |
| 150 | - for (Long copyUserId : reqVO.getOptions()) { | |
| 151 | - BpmProcessInstanceCopyDO copy = BeanUtil.copyProperties(copyDO, BpmProcessInstanceCopyDO.class); | |
| 152 | - copy.setUserId(copyUserId); | |
| 153 | - copyList.add(copy); | |
| 154 | - } | |
| 155 | - processInstanceCopyMapper.insertBatch(copyList); | |
| 156 | - return null; | |
| 124 | + | |
| 125 | + // 2. 创建抄送流程 | |
| 126 | + BpmProcessInstanceCopyDO copy = new BpmProcessInstanceCopyDO() | |
| 127 | + .setTaskId(reqVO.getTaskId()).setTaskName(task.getName()) | |
| 128 | + .setProcessInstanceId(processInstanceId).setStartUserId(Long.valueOf(processInstance.getStartUserId())) | |
| 129 | + .setProcessInstanceName(processInstance.getName()).setCategory(processInstance.getProcessDefinitionCategory()) | |
| 130 | + .setReason(reqVO.getReason()); | |
| 131 | + processInstanceCopyMapper.insert(copy); | |
| 157 | 132 | } |
| 158 | 133 | |
| 159 | 134 | @Override |
| 160 | - public PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long loginUserId, BpmProcessInstanceCopyMyPageReqVO pageReqVO) { | |
| 161 | - // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 | |
| 162 | - return processInstanceCopyMapper.selectPage(loginUserId, pageReqVO); | |
| 135 | + public PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long userId, BpmProcessInstanceCopyMyPageReqVO pageReqVO) { | |
| 136 | + return processInstanceCopyMapper.selectPage(userId, pageReqVO); | |
| 163 | 137 | } |
| 164 | 138 | |
| 165 | 139 | } | ... | ... |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/util/FlowableUtils.java deleted
| 1 | -package cn.iocoder.yudao.module.bpm.util; | |
| 2 | - | |
| 3 | - | |
| 4 | -import cn.hutool.extra.spring.SpringUtil; | |
| 5 | -import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | |
| 6 | -import org.flowable.bpmn.model.BpmnModel; | |
| 7 | -import org.flowable.bpmn.model.ExtensionElement; | |
| 8 | -import org.flowable.bpmn.model.FlowElement; | |
| 9 | -import org.flowable.bpmn.model.FlowNode; | |
| 10 | -import org.flowable.engine.RepositoryService; | |
| 11 | -import org.flowable.engine.RuntimeService; | |
| 12 | -import org.flowable.engine.TaskService; | |
| 13 | -import org.flowable.engine.repository.ProcessDefinition; | |
| 14 | -import org.flowable.engine.runtime.ProcessInstance; | |
| 15 | -import org.flowable.task.api.Task; | |
| 16 | - | |
| 17 | -import java.util.List; | |
| 18 | -import java.util.Map; | |
| 19 | - | |
| 20 | -/** | |
| 21 | - * 流程引擎工具类封装 | |
| 22 | - * | |
| 23 | - * @author: linjinp | |
| 24 | - * @create: 2019-12-24 13:51 | |
| 25 | - **/ | |
| 26 | -public class FlowableUtils { | |
| 27 | - | |
| 28 | - /** | |
| 29 | - * 获取流程名称 | |
| 30 | - * | |
| 31 | - * @param processDefinitionId | |
| 32 | - * @return | |
| 33 | - */ | |
| 34 | - public static String getProcessDefinitionName(String processDefinitionId) { | |
| 35 | - RepositoryService repositoryService = SpringUtil.getBean(RepositoryService.class); | |
| 36 | - ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId); | |
| 37 | - return processDefinition.getName(); | |
| 38 | - } | |
| 39 | - | |
| 40 | - public static ProcessDefinition getProcessDefinition(String processDefinitionId) { | |
| 41 | - RepositoryService repositoryService = SpringUtil.getBean(RepositoryService.class); | |
| 42 | - return repositoryService.getProcessDefinition(processDefinitionId); | |
| 43 | - } | |
| 44 | - | |
| 45 | - /** | |
| 46 | - * 获取节点数据 | |
| 47 | - * | |
| 48 | - * @param processInstanceId | |
| 49 | - * @param nodeId | |
| 50 | - * @return | |
| 51 | - */ | |
| 52 | - public static FlowNode getFlowNode(String processInstanceId, String nodeId) { | |
| 53 | - | |
| 54 | - RuntimeService runtimeService = SpringUtil.getBean(RuntimeService.class); | |
| 55 | - RepositoryService repositoryService = SpringUtil.getBean(RepositoryService.class); | |
| 56 | - | |
| 57 | - String definitionld = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId(); // 获取bpm(模型)对象 | |
| 58 | - BpmnModel bpmnModel = repositoryService.getBpmnModel(definitionld); | |
| 59 | - // 传节点定义key获取当前节点 | |
| 60 | - FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(nodeId); | |
| 61 | - return flowNode; | |
| 62 | - } | |
| 63 | - | |
| 64 | - public static ExtensionElement generateFlowNodeIdExtension(String nodeId) { | |
| 65 | - ExtensionElement extensionElement = new ExtensionElement(); | |
| 66 | - extensionElement.setElementText(nodeId); | |
| 67 | - extensionElement.setName("nodeId"); | |
| 68 | - extensionElement.setNamespacePrefix("flowable"); | |
| 69 | - extensionElement.setNamespace("nodeId"); | |
| 70 | - return extensionElement; | |
| 71 | - } | |
| 72 | - | |
| 73 | - public static String getNodeIdFromExtension(FlowElement flowElement) { | |
| 74 | - Map<String, List<ExtensionElement>> extensionElements = flowElement.getExtensionElements(); | |
| 75 | - return extensionElements.get("nodeId").get(0).getElementText(); | |
| 76 | - } | |
| 77 | - | |
| 78 | - public static Long getStartUserIdFromProcessInstance(ProcessInstance instance) { | |
| 79 | - if (null == instance) { | |
| 80 | - return null; | |
| 81 | - } | |
| 82 | - return NumberUtils.parseLong(instance.getStartUserId()); | |
| 83 | - } | |
| 84 | - | |
| 85 | - public static String getTaskNameByTaskId(String taskId) { | |
| 86 | - TaskService taskService = SpringUtil.getBean(TaskService.class); | |
| 87 | - Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); | |
| 88 | - return task.getName(); | |
| 89 | - } | |
| 90 | - | |
| 91 | -} |
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/cc/BpmProcessInstanceCopyServiceTest.java deleted
| 1 | -package cn.iocoder.yudao.module.bpm.service.cc; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | |
| 4 | -import cn.iocoder.yudao.module.bpm.service.task.cc.BpmProcessInstanceCopyServiceImpl; | |
| 5 | -import jakarta.annotation.Resource; | |
| 6 | -import org.junit.jupiter.api.Test; | |
| 7 | -import org.springframework.context.annotation.Import; | |
| 8 | - | |
| 9 | -@Import({BpmProcessInstanceCopyServiceImpl.class}) | |
| 10 | -class BpmProcessInstanceCopyServiceTest extends BaseDbUnitTest { | |
| 11 | - @Resource | |
| 12 | - private BpmProcessInstanceCopyServiceImpl service; | |
| 13 | - | |
| 14 | - @Test | |
| 15 | - void queryById() { | |
| 16 | - } | |
| 17 | -} | |
| 18 | 0 | \ No newline at end of file |