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 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
... ... @@ -12,7 +12,7 @@ public class BpmProcessInstanceCopyPageItemRespVO {
12 12 @Schema(description = "抄送主键")
13 13 private Long id;
14 14  
15   - @Schema(description = "发起人Id")
  15 + @Schema(description = "发起人 ID")
16 16 private Long startUserId;
17 17  
18 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 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