Commit 7bb171512a35522ae060e4b0a313a55ca2be8cef

Authored by YunaiV
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 +17,15 @@ import io.swagger.v3.oas.annotations.Operation;
17 import io.swagger.v3.oas.annotations.tags.Tag; 17 import io.swagger.v3.oas.annotations.tags.Tag;
18 import jakarta.annotation.Resource; 18 import jakarta.annotation.Resource;
19 import jakarta.validation.Valid; 19 import jakarta.validation.Valid;
20 -import org.springframework.context.annotation.Lazy;  
21 import org.springframework.security.access.prepost.PreAuthorize; 20 import org.springframework.security.access.prepost.PreAuthorize;
22 import org.springframework.validation.annotation.Validated; 21 import org.springframework.validation.annotation.Validated;
23 import org.springframework.web.bind.annotation.*; 22 import org.springframework.web.bind.annotation.*;
24 23
25 -import java.util.HashSet;  
26 import java.util.Map; 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 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 27 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  28 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap;
31 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 29 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
32 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; 30 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
33 31
@@ -41,6 +39,7 @@ public class BpmProcessInstanceCopyController { @@ -41,6 +39,7 @@ public class BpmProcessInstanceCopyController {
41 private BpmProcessInstanceCopyService processInstanceCopyService; 39 private BpmProcessInstanceCopyService processInstanceCopyService;
42 @Resource 40 @Resource
43 private BpmProcessInstanceService bpmProcessInstanceService; 41 private BpmProcessInstanceService bpmProcessInstanceService;
  42 +
44 @Resource 43 @Resource
45 private AdminUserApi adminUserApi; 44 private AdminUserApi adminUserApi;
46 45
@@ -50,8 +49,9 @@ public class BpmProcessInstanceCopyController { @@ -50,8 +49,9 @@ public class BpmProcessInstanceCopyController {
50 @PostMapping("/create") 49 @PostMapping("/create")
51 @Operation(summary = "抄送流程") 50 @Operation(summary = "抄送流程")
52 @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:create')") 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 @GetMapping("/my-page") 57 @GetMapping("/my-page")
@@ -64,20 +64,14 @@ public class BpmProcessInstanceCopyController { @@ -64,20 +64,14 @@ public class BpmProcessInstanceCopyController {
64 return success(new PageResult<>(pageResult.getTotal())); 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 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; 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 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
5 import jakarta.validation.constraints.NotBlank; 4 import jakarta.validation.constraints.NotBlank;
6 import jakarta.validation.constraints.NotEmpty; 5 import jakarta.validation.constraints.NotEmpty;
7 import lombok.Data; 6 import lombok.Data;
8 -import lombok.EqualsAndHashCode;  
9 -import lombok.ToString;  
10 7
11 @Schema(description = "管理后台 - 流程实例抄送的创建 Request VO") 8 @Schema(description = "管理后台 - 流程实例抄送的创建 Request VO")
12 @Data 9 @Data
13 -@EqualsAndHashCode(callSuper = true)  
14 -@ToString(callSuper = true)  
15 -public class BpmProcessInstanceCopyCreateReqVO extends BpmTaskCandidateRuleVO { 10 +public class BpmProcessInstanceCopyCreateReqVO {
16 11
17 @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 12 @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
18 @NotEmpty(message = "任务编号不能为空") 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
@@ -12,7 +12,7 @@ public class BpmProcessInstanceCopyPageItemRespVO { @@ -12,7 +12,7 @@ public class BpmProcessInstanceCopyPageItemRespVO {
12 @Schema(description = "抄送主键") 12 @Schema(description = "抄送主键")
13 private Long id; 13 private Long id;
14 14
15 - @Schema(description = "发起人Id") 15 + @Schema(description = "发起人 ID")
16 private Long startUserId; 16 private Long startUserId;
17 17
18 @Schema(description = "发起人别名") 18 @Schema(description = "发起人别名")
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,6 +5,7 @@ import lombok.Data;
5 5
6 import java.time.LocalDateTime; 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,4 +61,5 @@ public class BpmProcessInstanceCopyVO {
60 61
61 @Schema(description = "抄送时间") 62 @Schema(description = "抄送时间")
62 private LocalDateTime createTime; 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,8 +4,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageItemRespVO; 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 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; 7 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
  8 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
9 import org.mapstruct.Mapper; 9 import org.mapstruct.Mapper;
10 import org.mapstruct.factory.Mappers; 10 import org.mapstruct.factory.Mappers;
11 11
@@ -22,22 +22,17 @@ public interface BpmProcessInstanceCopyConvert { @@ -22,22 +22,17 @@ public interface BpmProcessInstanceCopyConvert {
22 22
23 BpmProcessInstanceCopyConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceCopyConvert.class); 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 List<BpmProcessInstanceCopyPageItemRespVO> list = BeanUtils.toBean(page.getList(), 29 List<BpmProcessInstanceCopyPageItemRespVO> list = BeanUtils.toBean(page.getList(),
35 BpmProcessInstanceCopyPageItemRespVO.class, 30 BpmProcessInstanceCopyPageItemRespVO.class,
36 copy -> { 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 return new PageResult<>(list, page.getTotal()); 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,40 +28,40 @@ public class BpmProcessInstanceCopyDO extends BaseDO {
28 28
29 /** 29 /**
30 * 发起人 Id 30 * 发起人 Id
31 - * <p> 31 + *
32 * 关联 system_users 的 id 属性 32 * 关联 system_users 的 id 属性
33 */ 33 */
34 private Long startUserId; 34 private Long startUserId;
35 /** 35 /**
36 * 流程名 36 * 流程名
37 - * <p>  
38 - * 冗余字段 37 + *
  38 + * 冗余 ProcessInstance 的 name 字段
39 */ 39 */
40 private String processInstanceName; 40 private String processInstanceName;
41 /** 41 /**
42 * 流程实例的编号 42 * 流程实例的编号
43 - * <p> 43 + *
44 * 关联 ProcessInstance 的 id 属性 44 * 关联 ProcessInstance 的 id 属性
45 */ 45 */
46 private String processInstanceId; 46 private String processInstanceId;
47 47
48 /** 48 /**
49 * 任务主键 49 * 任务主键
50 - * <p>  
51 - * 关联 task 的 id 属性 50 + *
  51 + * 关联 Task 的 id 属性
52 */ 52 */
53 private String taskId; 53 private String taskId;
54 54
55 /** 55 /**
56 * 任务名称 56 * 任务名称
57 - * <p>  
58 - * 冗余字段 57 + *
  58 + * 冗余 Task 的 name 属性
59 */ 59 */
60 private String taskName; 60 private String taskName;
61 61
62 /** 62 /**
63 * 用户编号 63 * 用户编号
64 - * <p> 64 + *
65 * 关联 system_users 的 id 属性 65 * 关联 system_users 的 id 属性
66 */ 66 */
67 private Long userId; 67 private Long userId;
@@ -73,8 +73,8 @@ public class BpmProcessInstanceCopyDO extends BaseDO { @@ -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 private String category; 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,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 * @param userId 用户编号 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,7 +10,6 @@ import org.flowable.task.api.Task;
10 import java.util.Collection; 10 import java.util.Collection;
11 import java.util.List; 11 import java.util.List;
12 import java.util.Map; 12 import java.util.Map;
13 -import java.util.Set;  
14 13
15 /** 14 /**
16 * 流程任务实例 Service 接口 15 * 流程任务实例 Service 接口
@@ -186,18 +185,11 @@ public interface BpmTaskService { @@ -186,18 +185,11 @@ public interface BpmTaskService {
186 List<BpmTaskSubSignRespVO> getChildrenTaskList(String parentId); 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,7 +21,6 @@ import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
21 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskAddSignTypeEnum; 21 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskAddSignTypeEnum;
22 import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; 22 import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
23 import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; 23 import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
24 -import cn.iocoder.yudao.module.bpm.service.task.cc.BpmProcessInstanceCopyService;  
25 import cn.iocoder.yudao.module.system.api.dept.DeptApi; 24 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
26 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 25 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
27 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 26 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -95,9 +94,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -95,9 +94,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
95 @Resource 94 @Resource
96 private ManagementService managementService; 95 private ManagementService managementService;
97 96
98 - @Resource  
99 - private BpmProcessInstanceCopyService processInstanceCopyService;  
100 -  
101 @Override 97 @Override
102 public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) { 98 public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) {
103 // 查询待办任务 99 // 查询待办任务
@@ -972,28 +968,12 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -972,28 +968,12 @@ public class BpmTaskServiceImpl implements BpmTaskService {
972 } 968 }
973 969
974 @Override 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,7 +3,6 @@ package cn.iocoder.yudao.module.bpm.service.task.cc;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyCreateReqVO; 4 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyCreateReqVO;
5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyMyPageReqVO; 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 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; 6 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
8 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo; 7 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo;
9 8
@@ -28,14 +27,14 @@ public interface BpmProcessInstanceCopyService { @@ -28,14 +27,14 @@ public interface BpmProcessInstanceCopyService {
28 * @param userId 当前登录用户 27 * @param userId 当前登录用户
29 * @param createReqVO 创建的抄送请求 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 * @param pageReqVO 分页请求 35 * @param pageReqVO 分页请求
37 * @return 抄送的分页结果 36 * @return 抄送的分页结果
38 */ 37 */
39 - PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long loginUserId, 38 + PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long userId,
40 BpmProcessInstanceCopyMyPageReqVO pageReqVO); 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,25 +7,18 @@ import cn.hutool.core.util.StrUtil;
7 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyCreateReqVO; 8 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyCreateReqVO;
9 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyMyPageReqVO; 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 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
13 import cn.iocoder.yudao.module.bpm.dal.mysql.cc.BpmProcessInstanceCopyMapper; 11 import cn.iocoder.yudao.module.bpm.dal.mysql.cc.BpmProcessInstanceCopyMapper;
14 import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants; 12 import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
15 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum;  
16 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo; 13 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo;
17 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfoProcessorChain; 14 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfoProcessorChain;
18 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; 15 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
19 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; 16 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
20 import cn.iocoder.yudao.module.bpm.service.task.cc.dto.BpmDelegateExecutionDTO; 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 import jakarta.annotation.Resource; 18 import jakarta.annotation.Resource;
25 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
26 import org.flowable.engine.RuntimeService; 20 import org.flowable.engine.RuntimeService;
27 import org.flowable.engine.delegate.DelegateExecution; 21 import org.flowable.engine.delegate.DelegateExecution;
28 -import org.flowable.engine.repository.ProcessDefinition;  
29 import org.flowable.engine.runtime.ProcessInstance; 22 import org.flowable.engine.runtime.ProcessInstance;
30 import org.flowable.task.api.Task; 23 import org.flowable.task.api.Task;
31 import org.springframework.context.annotation.Lazy; 24 import org.springframework.context.annotation.Lazy;
@@ -33,14 +26,14 @@ import org.springframework.stereotype.Service; @@ -33,14 +26,14 @@ import org.springframework.stereotype.Service;
33 import org.springframework.validation.annotation.Validated; 26 import org.springframework.validation.annotation.Validated;
34 27
35 import java.time.LocalDateTime; 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 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 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 * @author kyle 38 * @author kyle
46 */ 39 */
@@ -61,6 +54,9 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy @@ -61,6 +54,9 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
61 @Resource 54 @Resource
62 @Lazy 55 @Lazy
63 private BpmTaskService bpmTaskService; 56 private BpmTaskService bpmTaskService;
  57 + @Resource
  58 + @Lazy
  59 + private BpmProcessInstanceService bpmProcessInstanceService;
64 60
65 @Override 61 @Override
66 public boolean makeCopy(BpmCandidateSourceInfo sourceInfo) { 62 public boolean makeCopy(BpmCandidateSourceInfo sourceInfo) {
@@ -86,7 +82,7 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy @@ -86,7 +82,7 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
86 // 调用 82 // 调用
87 // 设置任务id 83 // 设置任务id
88 copyDO.setTaskId(sourceInfo.getTaskId()); 84 copyDO.setTaskId(sourceInfo.getTaskId());
89 - copyDO.setTaskName(FlowableUtils.getTaskNameByTaskId(sourceInfo.getTaskId())); 85 + copyDO.setTaskName(task.getName());
90 copyDO.setProcessInstanceId(processInstanceId); 86 copyDO.setProcessInstanceId(processInstanceId);
91 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() 87 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
92 .processInstanceId(processInstanceId) 88 .processInstanceId(processInstanceId)
@@ -95,10 +91,9 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy @@ -95,10 +91,9 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
95 log.warn("相关流程实例不存在 {}", sourceInfo.getTaskId()); 91 log.warn("相关流程实例不存在 {}", sourceInfo.getTaskId());
96 return false; 92 return false;
97 } 93 }
98 - copyDO.setStartUserId(FlowableUtils.getStartUserIdFromProcessInstance(processInstance)); 94 + copyDO.setStartUserId(Long.parseLong(processInstance.getStartUserId()));
99 copyDO.setProcessInstanceName(processInstance.getName()); 95 copyDO.setProcessInstanceName(processInstance.getName());
100 - ProcessDefinition processDefinition = FlowableUtils.getProcessDefinition(processInstance.getProcessDefinitionId());  
101 - copyDO.setCategory(processDefinition.getCategory()); 96 + copyDO.setCategory(processInstance.getProcessDefinitionCategory());
102 copyDO.setReason(sourceInfo.getReason()); 97 copyDO.setReason(sourceInfo.getReason());
103 copyDO.setCreator(sourceInfo.getCreator()); 98 copyDO.setCreator(sourceInfo.getCreator());
104 copyDO.setCreateTime(LocalDateTime.now()); 99 copyDO.setCreateTime(LocalDateTime.now());
@@ -113,53 +108,32 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy @@ -113,53 +108,32 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
113 } 108 }
114 109
115 @Override 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 Task task = bpmTaskService.getTask(reqVO.getTaskId()); 113 Task task = bpmTaskService.getTask(reqVO.getTaskId());
121 if (ObjectUtil.isNull(task)) { 114 if (ObjectUtil.isNull(task)) {
122 throw exception(ErrorCodeConstants.TASK_NOT_EXISTS); 115 throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
123 } 116 }
  117 + // 1.2 校验流程存在
124 String processInstanceId = task.getProcessInstanceId(); 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 throw exception(ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS); 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 @Override 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 \ No newline at end of file 0 \ No newline at end of file