Commit 986f9533192a4651d496eb85e3ecfd1d705c96d5

Authored by 芋道源码
Committed by Gitee
2 parents a86bce6f 5fb0c51f

!849 流程抄送Review

Merge pull request !849 from 云开/feature/BPM_CC_develop
Showing 17 changed files with 271 additions and 261 deletions
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task;
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
6   -import cn.iocoder.yudao.module.bpm.service.cc.BpmProcessInstanceCopyService;
7 6 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
8 7 import io.swagger.v3.oas.annotations.Operation;
9 8 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -26,9 +25,6 @@ public class BpmProcessInstanceController {
26 25 @Resource
27 26 private BpmProcessInstanceService processInstanceService;
28 27  
29   - @Resource
30   - private BpmProcessInstanceCopyService processInstanceCopyService;
31   -
32 28 @GetMapping("/my-page")
33 29 @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
34 30 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
... ... @@ -60,21 +56,4 @@ public class BpmProcessInstanceController {
60 56 return success(true);
61 57 }
62 58  
63   - // TODO @kyle:抄送要不单独 controller?
64   -
65   - @PostMapping("/cc/create")
66   - @Operation(summary = "抄送流程")
67   - @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:create')")
68   - public CommonResult<Boolean> createProcessInstanceCC(@Valid @RequestBody BpmProcessInstanceCCReqVO createReqVO) {
69   - return success(processInstanceCopyService.ccProcessInstance(getLoginUserId(), createReqVO));
70   - }
71   -
72   - @GetMapping("/cc/my-page")
73   - @Operation(summary = "获得抄送流程分页列表")
74   - @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:query')")
75   - public CommonResult<PageResult<BpmProcessInstanceCCPageItemRespVO>> getProcessInstanceCCPage(
76   - @Valid BpmProcessInstanceCCMyPageReqVO pageReqVO) {
77   - return success(processInstanceCopyService.getMyProcessInstanceCCPage(getLoginUserId(), pageReqVO));
78   - }
79   -
80 59 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.task;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyCreateReqVO;
  7 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyMyPageReqVO;
  8 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageItemRespVO;
  9 +import cn.iocoder.yudao.module.bpm.convert.cc.BpmProcessInstanceCopyConvert;
  10 +import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
  11 +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
  12 +import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
  13 +import cn.iocoder.yudao.module.bpm.service.task.cc.BpmProcessInstanceCopyService;
  14 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  15 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  16 +import io.swagger.v3.oas.annotations.Operation;
  17 +import io.swagger.v3.oas.annotations.tags.Tag;
  18 +import jakarta.annotation.Resource;
  19 +import jakarta.validation.Valid;
  20 +import org.springframework.context.annotation.Lazy;
  21 +import org.springframework.security.access.prepost.PreAuthorize;
  22 +import org.springframework.validation.annotation.Validated;
  23 +import org.springframework.web.bind.annotation.*;
  24 +
  25 +import java.util.HashSet;
  26 +import java.util.Map;
  27 +import java.util.Set;
  28 +import java.util.stream.Collectors;
  29 +
  30 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  31 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  32 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
  33 +
  34 +@Tag(name = "管理后台 - 流程实例抄送")
  35 +@RestController
  36 +@RequestMapping("/bpm/process-instance/cc")
  37 +@Validated
  38 +public class BpmProcessInstanceCopyController {
  39 +
  40 + @Resource
  41 + private BpmProcessInstanceCopyService processInstanceCopyService;
  42 + @Resource
  43 + private BpmProcessInstanceService bpmProcessInstanceService;
  44 + @Resource
  45 + private AdminUserApi adminUserApi;
  46 +
  47 + @Resource
  48 + private BpmTaskService bpmTaskService;
  49 +
  50 + @PostMapping("/create")
  51 + @Operation(summary = "抄送流程")
  52 + @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:create')")
  53 + public CommonResult<Void> createProcessInstanceCC(@Valid @RequestBody BpmProcessInstanceCopyCreateReqVO createReqVO) {
  54 + return success(processInstanceCopyService.createProcessInstanceCopy(getLoginUserId(), createReqVO));
  55 + }
  56 +
  57 + @GetMapping("/my-page")
  58 + @Operation(summary = "获得抄送流程分页列表")
  59 + @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:query')")
  60 + public CommonResult<PageResult<BpmProcessInstanceCopyPageItemRespVO>> getProcessInstanceCCPage(
  61 + @Valid BpmProcessInstanceCopyMyPageReqVO pageReqVO) {
  62 + PageResult<BpmProcessInstanceCopyDO> pageResult = processInstanceCopyService.getMyProcessInstanceCopyPage(getLoginUserId(), pageReqVO);
  63 + if (CollUtil.isEmpty(pageResult.getList())) {
  64 + return success(new PageResult<>(pageResult.getTotal()));
  65 + }
  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));
  81 + }
  82 +
  83 +}
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCCReqVO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyCreateReqVO.java
... ... @@ -4,44 +4,22 @@ import cn.iocoder.yudao.module.bpm.controller.admin.candidate.vo.BpmTaskCandidat
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import jakarta.validation.constraints.NotBlank;
6 6 import jakarta.validation.constraints.NotEmpty;
7   -import jakarta.validation.constraints.NotNull;
8 7 import lombok.Data;
9 8 import lombok.EqualsAndHashCode;
10 9 import lombok.ToString;
11 10  
12   -// TODO @kyle:这个 VO 可以改成 BpmProcessInstanceCopyCreateReqVO
13   -@Schema(description = "管理后台 - 流程实例的抄送 Request VO")
  11 +@Schema(description = "管理后台 - 流程实例抄送的创建 Request VO")
14 12 @Data
15 13 @EqualsAndHashCode(callSuper = true)
16 14 @ToString(callSuper = true)
17   -public class BpmProcessInstanceCCReqVO extends BpmTaskCandidateRuleVO {
  15 +public class BpmProcessInstanceCopyCreateReqVO extends BpmTaskCandidateRuleVO {
18 16  
19 17 @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
20 18 @NotEmpty(message = "任务编号不能为空")
21   - private String taskKey;
22   -
23   - @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
24   - @NotEmpty(message = "任务名称不能为空")
25   - private String taskName;
26   -
27   - @Schema(description = "流程实例的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
28   - @NotEmpty(message = "流程实例的编号不能为空")
29   - private String processInstanceKey;
30   -
31   - @Schema(description = "发起流程的用户的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
32   - @NotNull(message = "发起流程的用户的编号不能为空")
33   - private Long startUserId;
34   -
35   - @Schema(description = "任务实例名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
36   - @NotEmpty(message = "任务实例名称不能为空")
37   - private String processInstanceName;
  19 + private String taskId;
38 20  
39 21 @Schema(description = "抄送原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "请帮忙审查下!")
40 22 @NotBlank(message = "抄送原因不能为空")
41 23 private String reason;
42 24  
43   - // TODO @kyle:看了下字段有点多,尽量不传递可推导的字段;
44   - // 需要传递:taskId(任务编号)、reason、userIds(被抄送的人)
45   - // 不需要传递:taskKey、taskName、processInstanceKey、startUserId、processInstanceName 因为这些可以后端查询到
46   -
47 25 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCCMyPageReqVO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyMyPageReqVO.java
... ... @@ -11,12 +11,11 @@ import java.time.LocalDateTime;
11 11  
12 12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13 13  
14   -// TODO @kyle:建议改成 BpmProcessInstanceCopyMyPageReqVO;cc 缩写不容易理解,所以改成 copy,虽然会长一点,但是可读性更重要;
15 14 @Schema(description = "管理后台 - 流程实例抄送的分页 Request VO")
16 15 @Data
17 16 @EqualsAndHashCode(callSuper = true)
18 17 @ToString(callSuper = true)
19   -public class BpmProcessInstanceCCMyPageReqVO extends PageParam {
  18 +public class BpmProcessInstanceCopyMyPageReqVO extends PageParam {
20 19  
21 20 @Schema(description = "流程名称", example = "芋道")
22 21 private String processInstanceName;
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCCPageItemRespVO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyPageItemRespVO.java
... ... @@ -7,35 +7,23 @@ import java.time.LocalDateTime;
7 7  
8 8 @Schema(description = "管理后台 - 流程实例抄送的分页 Item Response VO")
9 9 @Data
10   -public class BpmProcessInstanceCCPageItemRespVO {
  10 +public class BpmProcessInstanceCopyPageItemRespVO {
11 11  
12   - // TODO @kyle:如果已经写了 swagger 注解,可以不用写 java 注释哈;
13   - /**
14   - * 编号
15   - */
16 12 @Schema(description = "抄送主键")
17 13 private Long id;
18 14  
19   - /**
20   - * 发起人Id
21   - */
22 15 @Schema(description = "发起人Id")
23 16 private Long startUserId;
24 17  
25 18 @Schema(description = "发起人别名")
26 19 private String startUserNickname;
27 20  
28   - /**
29   - * 流程主键
30   - */
31 21 @Schema(description = "流程实例的主键")
32 22 private String processInstanceId;
33 23  
34 24 @Schema(description = "流程实例的名称")
35 25 private String processInstanceName;
36   - /**
37   - * 任务主键
38   - */
  26 +
39 27 @Schema(description = "发起抄送的任务编号")
40 28 private String taskId;
41 29  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/cc/BpmProcessInstanceCopyVO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmProcessInstanceCopyVO.java
1   -package cn.iocoder.yudao.module.bpm.service.cc;
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
5 5  
6 6 import java.time.LocalDateTime;
7 7  
8   -// TODO @kyle:看看是不是要删除
9 8 /**
10   - * 流程抄送视图对象 wf_copy
11   - *
12   - * @author ruoyi
13   - * @date 2022-05-19
  9 + * 流程抄送视图对象
14 10 */
15 11 @Data
16 12 public class BpmProcessInstanceCopyVO {
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/cc/BpmProcessInstanceCopyConvert.java
... ... @@ -2,18 +2,18 @@ package cn.iocoder.yudao.module.bpm.convert.cc;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
5   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCCPageItemRespVO;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  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;
6 8 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
7   -import cn.iocoder.yudao.module.bpm.service.cc.BpmProcessInstanceCopyVO;
8 9 import org.mapstruct.Mapper;
9 10 import org.mapstruct.factory.Mappers;
10 11  
11 12 import java.util.List;
12 13 import java.util.Map;
13 14  
14   -// TODO kyle:类注释不太对
15 15 /**
16   - * 动态表单 Convert
  16 + * 流程抄送 Convert
17 17 *
18 18 * @author 芋艿
19 19 */
... ... @@ -22,39 +22,23 @@ public interface BpmProcessInstanceCopyConvert {
22 22  
23 23 BpmProcessInstanceCopyConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceCopyConvert.class);
24 24  
25   - // TODO @kyle:可以使用 BeanUtils copy 替代这些简单的哈;
26   - BpmProcessInstanceCopyDO copy(BpmProcessInstanceCopyDO bean);
27   -
28 25 BpmProcessInstanceCopyVO convert(BpmProcessInstanceCopyDO bean);
29 26  
30   - List<BpmProcessInstanceCCPageItemRespVO> convertList(List<BpmProcessInstanceCopyDO> list);
  27 + List<BpmProcessInstanceCopyPageItemRespVO> convertList(List<BpmProcessInstanceCopyDO> list);
31 28  
32   - // TODO @kyle:/* taskId */ 这种注释一般不用写,可以一眼看明白的;避免变量看着略微不清晰哈
33   - default PageResult<BpmProcessInstanceCCPageItemRespVO> convertPage(PageResult<BpmProcessInstanceCopyDO> page
34   - , Map<String/* taskId */, String/* taskName */> taskMap
35   - , Map<String/* processInstaneId */, String/* processInstaneName */> processInstaneMap
36   - , Map<Long/* userId */, String/* userName */> userMap
  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
37 33 ) {
38   - List<BpmProcessInstanceCCPageItemRespVO> list = convertList(page.getList());
39   - for (BpmProcessInstanceCCPageItemRespVO vo : list) {
40   - MapUtils.findAndThen(userMap, Long.valueOf(vo.getCreator()),
41   - vo::setCreatorNickname);
42   - MapUtils.findAndThen(userMap, vo.getStartUserId(),
43   - vo::setStartUserNickname);
44   - MapUtils.findAndThen(taskMap, vo.getTaskId(),
45   - vo::setTaskName);
46   - MapUtils.findAndThen(processInstaneMap, vo.getProcessInstanceId(),
47   - vo::setProcessInstanceName);
48   - }
49   - // TODO @kyle:可以精简成下面的哈;
50   -// List<BpmProcessInstanceCCPageItemRespVO> list2 = BeanUtils.toBean(page.getList(),
51   -// BpmProcessInstanceCCPageItemRespVO.class,
52   -// copy -> {
53   -// MapUtils.findAndThen(userMap, Long.valueOf(copy.getCreator()), copy::setCreatorNickname);
54   -// MapUtils.findAndThen(userMap, copy.getStartUserId(), copy::setStartUserNickname);
55   -// MapUtils.findAndThen(taskMap, copy.getTaskId(), copy::setTaskName);
56   -// MapUtils.findAndThen(processInstaneMap, copy.getProcessInstanceId(), copy::setProcessInstanceName);
57   -// });
  34 + List<BpmProcessInstanceCopyPageItemRespVO> list = BeanUtils.toBean(page.getList(),
  35 + BpmProcessInstanceCopyPageItemRespVO.class,
  36 + 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);
  41 + });
58 42 return new PageResult<>(list, page.getTotal());
59 43 }
60 44  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/cc/BpmProcessInstanceCopyDO.java
... ... @@ -9,7 +9,7 @@ import lombok.*;
9 9 * 流程抄送 DO
10 10 *
11 11 * @author kyle
12   - * @date 2022-05-19 TODO @kyle:@date 不是标准 java doc,可以使用 @since 替代,然后日期是不是不对
  12 + * @since 2024-01-22
13 13 */
14 14 @TableName(value = "bpm_process_instance_copy", autoResultMap = true)
15 15 @Data
... ... @@ -26,34 +26,43 @@ public class BpmProcessInstanceCopyDO extends BaseDO {
26 26 @TableId
27 27 private Long id;
28 28  
29   - // TODO @kyle:字段如果是关联或者冗余,要写下注释。以 processInstanceId 举例子。
30 29 /**
31 30 * 发起人 Id
  31 + * <p>
  32 + * 关联 system_users 的 id 属性
32 33 */
33 34 private Long startUserId;
34 35 /**
35 36 * 流程名
  37 + * <p>
  38 + * 冗余字段
36 39 */
37 40 private String processInstanceName;
38 41 /**
39 42 * 流程实例的编号
40   - *
  43 + * <p>
41 44 * 关联 ProcessInstance 的 id 属性
42 45 */
43 46 private String processInstanceId;
44 47  
45 48 /**
46 49 * 任务主键
  50 + * <p>
  51 + * 关联 task 的 id 属性
47 52 */
48 53 private String taskId;
49 54  
50 55 /**
51 56 * 任务名称
  57 + * <p>
  58 + * 冗余字段
52 59 */
53 60 private String taskName;
54 61  
55 62 /**
56 63 * 用户编号
  64 + * <p>
  65 + * 关联 system_users 的 id 属性
57 66 */
58 67 private Long userId;
59 68  
... ... @@ -62,10 +71,11 @@ public class BpmProcessInstanceCopyDO extends BaseDO {
62 71 */
63 72 private String reason;
64 73  
65   - // TODO @kyle:这个字段,可以用 category 简化点
66 74 /**
67 75 * 流程分类
  76 + * <p>
  77 + * 冗余字段
68 78 */
69   - private String processDefinitionCategory;
  79 + private String category;
70 80  
71 81 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/cc/BpmProcessInstanceCopyMapper.java
... ... @@ -3,13 +3,14 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.cc;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCCMyPageReqVO;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyMyPageReqVO;
7 7 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
8 8 import org.apache.ibatis.annotations.Mapper;
9 9  
10 10 @Mapper
11   -public interface BpmProcessInstanceCopyMapper extends BaseMapperX<BpmProcessInstanceCopyDO> { // TODO @kyle:方法和类之间要空行下;
12   - default PageResult<BpmProcessInstanceCopyDO> selectPage(Long loginUserId, BpmProcessInstanceCCMyPageReqVO reqVO){
  11 +public interface BpmProcessInstanceCopyMapper extends BaseMapperX<BpmProcessInstanceCopyDO> {
  12 +
  13 + default PageResult<BpmProcessInstanceCopyDO> selectPage(Long loginUserId, BpmProcessInstanceCopyMyPageReqVO reqVO) {
13 14 return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceCopyDO>()
14 15 .eqIfPresent(BpmProcessInstanceCopyDO::getUserId, loginUserId)
15 16 .eqIfPresent(BpmProcessInstanceCopyDO::getProcessInstanceId, reqVO.getProcessInstanceId())
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/candidate/BpmCandidateSourceInfo.java
... ... @@ -2,12 +2,12 @@ package cn.iocoder.yudao.module.bpm.service.candidate;
2 2  
3 3 import cn.iocoder.yudao.module.bpm.controller.admin.candidate.vo.BpmTaskCandidateRuleVO;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
  5 +import jakarta.validation.constraints.NotEmpty;
  6 +import jakarta.validation.constraints.NotNull;
5 7 import lombok.AllArgsConstructor;
6 8 import lombok.Data;
7 9 import lombok.NoArgsConstructor;
8 10  
9   -import jakarta.validation.constraints.NotEmpty;
10   -import jakarta.validation.constraints.NotNull;
11 11 import java.util.HashSet;
12 12 import java.util.Set;
13 13  
... ... @@ -18,11 +18,6 @@ import java.util.Set;
18 18 @NoArgsConstructor
19 19 @Data
20 20 public class BpmCandidateSourceInfo {
21   -
22   - @Schema(description = "流程id")
23   - @NotNull
24   - private String processInstanceId;
25   -
26 21 @Schema(description = "当前任务ID")
27 22 @NotNull
28 23 private String taskId;
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
... ... @@ -4,11 +4,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
6 6 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
  7 +import jakarta.validation.Valid;
7 8 import org.flowable.task.api.Task;
8 9  
9   -import jakarta.validation.Valid;
  10 +import java.util.Collection;
10 11 import java.util.List;
11 12 import java.util.Map;
  13 +import java.util.Set;
12 14  
13 15 /**
14 16 * 流程任务实例 Service 接口
... ... @@ -132,6 +134,8 @@ public interface BpmTaskService {
132 134 */
133 135 void updateTaskExtAssign(Task task);
134 136  
  137 + Task getTask(String id);
  138 +
135 139 /**
136 140 * 获取当前任务的可回退的流程集合
137 141 *
... ... @@ -181,4 +185,19 @@ public interface BpmTaskService {
181 185 */
182 186 List<BpmTaskSubSignRespVO> getChildrenTaskList(String parentId);
183 187  
  188 + /**
  189 + * 通过任务id查询任务名
  190 + *
  191 + * @param taskIds 任务id
  192 + * @return 对应的映射关系
  193 + */
  194 + Map<String/* taskId */, String/* taskName */> getTaskNameByTaskIds(Collection<String> taskIds);
  195 +
  196 + /**
  197 + * 通过流程实例id获取到流程实例名
  198 + *
  199 + * @param processInstaneIds 流程实例Id
  200 + * @return 对应的映射关系
  201 + */
  202 + Map<String/* processInstaneId */, String/* processInstaneName */> getProcessInstanceNameByProcessInstanceIds(Set<String> processInstaneIds);
184 203 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
... ... @@ -19,14 +19,15 @@ import cn.iocoder.yudao.module.bpm.enums.task.BpmCommentTypeEnum;
19 19 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum;
20 20 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
21 21 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskAddSignTypeEnum;
22   -import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo;
23   -import cn.iocoder.yudao.module.bpm.service.cc.BpmProcessInstanceCopyService;
24 22 import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
25 23 import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
  24 +import cn.iocoder.yudao.module.bpm.service.task.cc.BpmProcessInstanceCopyService;
26 25 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
27 26 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
28 27 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
29 28 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  29 +import jakarta.annotation.Resource;
  30 +import jakarta.validation.Valid;
30 31 import lombok.extern.slf4j.Slf4j;
31 32 import org.flowable.bpmn.model.BpmnModel;
32 33 import org.flowable.bpmn.model.FlowElement;
... ... @@ -51,8 +52,6 @@ import org.springframework.transaction.support.TransactionSynchronization;
51 52 import org.springframework.transaction.support.TransactionSynchronizationManager;
52 53 import org.springframework.util.Assert;
53 54  
54   -import jakarta.annotation.Resource;
55   -import jakarta.validation.Valid;
56 55 import java.time.LocalDateTime;
57 56 import java.util.*;
58 57 import java.util.stream.Stream;
... ... @@ -558,7 +557,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
558 557 return task;
559 558 }
560 559  
561   - private Task getTask(String id) {
  560 + @Override
  561 + public Task getTask(String id) {
562 562 return taskService.createTaskQuery().taskId(id).singleResult();
563 563 }
564 564  
... ... @@ -971,4 +971,29 @@ public class BpmTaskServiceImpl implements BpmTaskService {
971 971 return BpmTaskConvert.INSTANCE.convertList(taskExtList, userMap, idTaskMap);
972 972 }
973 973  
  974 + @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;
  983 + }
  984 + return Collections.emptyMap();
  985 + }
  986 +
  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 + }
974 999 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/cc/BpmProcessInstanceCopyService.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/cc/BpmProcessInstanceCopyService.java
1   -package cn.iocoder.yudao.module.bpm.service.cc;
  1 +package cn.iocoder.yudao.module.bpm.service.task.cc;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCCMyPageReqVO;
5   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCCPageItemRespVO;
6   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCCReqVO;
  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;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageItemRespVO;
  7 +import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
7 8 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo;
8 9  
9   -// TODO @kyle:这个 Service 要不挪到 task 包下;保持统一,task 下有流程、任务、抄送等;
10   -// TODO @kyle:中文和英文之间,有个空格,会更清晰点;例如说;流程抄送 Service 接口;中文写作习惯~
11 10 /**
12   - * 流程抄送Service接口
  11 + * 流程抄送 Service 接口
13 12 *
14 13 * 现在是在审批的时候进行流程抄送
15 14 */
16 15 public interface BpmProcessInstanceCopyService {
17 16  
18   - // TODO @kyle:无用的方法,可以去掉哈;另外,考虑到避免过多的 VO,这里就可以返回 BpmProcessInstanceCopyDO
19   - /**
20   - * 查询流程抄送
21   - *
22   - * @param copyId 流程抄送主键
23   - * @return 流程抄送
24   - */
25   - BpmProcessInstanceCopyVO queryById(Long copyId);
26   -
27 17 // TODO 芋艿:这块要 review 下;思考下~~
28 18 /**
29 19 * 抄送
... ... @@ -32,22 +22,20 @@ public interface BpmProcessInstanceCopyService {
32 22 */
33 23 boolean makeCopy(BpmCandidateSourceInfo sourceInfo);
34 24  
35   - // TODO @kyle:可以方法名改成 createProcessInstanceCopy;现在项目一般新增都用 create 为主;
36 25 /**
37 26 * 流程实例的抄送
38 27 *
39   - * @param userId 当前登录用户
  28 + * @param userId 当前登录用户
40 29 * @param createReqVO 创建的抄送请求
41   - * @return 是否抄送成功,抄送成功则返回true TODO @kyle:这里可以不用返回哈;目前一般是失败,就抛出业务异常;
42 30 */
43   - boolean ccProcessInstance(Long userId, BpmProcessInstanceCCReqVO createReqVO);
  31 + Void createProcessInstanceCopy(Long userId, BpmProcessInstanceCopyCreateReqVO createReqVO);
44 32  
45 33 /**
46   - * 抄送的流程
  34 + * 抄送的流程的分页
47 35 * @param loginUserId 登录用户id
48 36 * @param pageReqVO 分页请求
49 37 * @return 抄送的分页结果
50 38 */
51   - PageResult<BpmProcessInstanceCCPageItemRespVO> getMyProcessInstanceCCPage(Long loginUserId,
52   - BpmProcessInstanceCCMyPageReqVO pageReqVO);
  39 + PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long loginUserId,
  40 + BpmProcessInstanceCopyMyPageReqVO pageReqVO);
53 41 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/cc/BpmProcessInstanceCopyServiceImpl.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/cc/BpmProcessInstanceCopyServiceImpl.java
1   -package cn.iocoder.yudao.module.bpm.service.cc;
  1 +package cn.iocoder.yudao.module.bpm.service.task.cc;
2 2  
  3 +import cn.hutool.core.bean.BeanUtil;
3 4 import cn.hutool.core.collection.CollUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
  6 +import cn.hutool.core.util.StrUtil;
4 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCCMyPageReqVO;
6   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCCPageItemRespVO;
7   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCCReqVO;
  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;
  10 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageItemRespVO;
8 11 import cn.iocoder.yudao.module.bpm.convert.cc.BpmProcessInstanceCopyConvert;
9 12 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
10 13 import cn.iocoder.yudao.module.bpm.dal.mysql.cc.BpmProcessInstanceCopyMapper;
  14 +import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
  15 +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum;
11 16 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo;
12 17 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfoProcessorChain;
13   -import cn.iocoder.yudao.module.bpm.service.cc.dto.BpmDelegateExecutionDTO;
14 18 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
15 19 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
  20 +import cn.iocoder.yudao.module.bpm.service.task.cc.dto.BpmDelegateExecutionDTO;
16 21 import cn.iocoder.yudao.module.bpm.util.FlowableUtils;
17 22 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
18 23 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
... ... @@ -22,6 +27,7 @@ import org.flowable.engine.RuntimeService;
22 27 import org.flowable.engine.delegate.DelegateExecution;
23 28 import org.flowable.engine.repository.ProcessDefinition;
24 29 import org.flowable.engine.runtime.ProcessInstance;
  30 +import org.flowable.task.api.Task;
25 31 import org.springframework.context.annotation.Lazy;
26 32 import org.springframework.stereotype.Service;
27 33 import org.springframework.validation.annotation.Validated;
... ... @@ -30,53 +36,47 @@ import java.time.LocalDateTime;
30 36 import java.util.*;
31 37 import java.util.stream.Collectors;
32 38  
33   -// TODO @kyle:类注释要写下
34   -@Slf4j // TODO @kyle:按照 @Service、@Validated、@Slf4j,从重要到不重要的顺序;
  39 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  40 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  41 +
  42 +/**
  43 + * Flowable流程抄送实现
  44 + *
  45 + * @author kyle
  46 + */
35 47 @Service
36 48 @Validated
  49 +@Slf4j
37 50 public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopyService {
38   - @Resource // TODO @kyle:第一个变量,和类之间要有空行;
  51 +
  52 + @Resource
39 53 private BpmProcessInstanceCopyMapper processInstanceCopyMapper;
40 54  
41   - /**
42   - * 和flowable有关的,查询流程名用的 TODO @kyle:可以不写哈注释;
43   - */
44 55 @Resource
45 56 private RuntimeService runtimeService;
46 57  
47   - /**
48   - * 找抄送人用的 TODO @kyle:可以不写哈注释;
49   - */
50 58 @Resource
51 59 private BpmCandidateSourceInfoProcessorChain processorChain;
52 60  
53   - // TODO @kyle:多余的变量,可以去掉哈
54 61 @Resource
55   - @Lazy // 解决循环依赖
  62 + @Lazy
56 63 private BpmTaskService bpmTaskService;
57   - @Resource
58   - @Lazy // 解决循环依赖
59   - private BpmProcessInstanceService bpmProcessInstanceService;
60   - @Resource
61   - private AdminUserApi adminUserApi;
62   -
63   - @Override
64   - public BpmProcessInstanceCopyVO queryById(Long copyId) {
65   - BpmProcessInstanceCopyDO bpmProcessInstanceCopyDO = processInstanceCopyMapper.selectById(copyId);
66   - return BpmProcessInstanceCopyConvert.INSTANCE.convert(bpmProcessInstanceCopyDO);
67   - }
68 64  
69   - // TODO @kyle:makeCopy 和 ccProcessInstance 的调用关系,感受上反了;
70   - // makeCopy 有点像基于规则,查找抄送人,然后创建;
71   - // ccProcessInstance 是已经有了抄送人,然后创建;
72   - // 建议的改造:独立基于 processInstanceCopyMapper 做 insert
73 65 @Override
74 66 public boolean makeCopy(BpmCandidateSourceInfo sourceInfo) {
75 67 if (null == sourceInfo) {
76 68 return false;
77 69 }
78 70  
79   - DelegateExecution executionEntity = new BpmDelegateExecutionDTO(sourceInfo.getProcessInstanceId());
  71 + Task task = bpmTaskService.getTask(sourceInfo.getTaskId());
  72 + if (ObjectUtil.isNull(task)) {
  73 + return false;
  74 + }
  75 + String processInstanceId = task.getProcessInstanceId();
  76 + if (StrUtil.isBlank(processInstanceId)) {
  77 + return false;
  78 + }
  79 + DelegateExecution executionEntity = new BpmDelegateExecutionDTO(processInstanceId);
80 80 Set<Long> ccCandidates = processorChain.calculateTaskCandidateUsers(executionEntity, sourceInfo);
81 81 if (CollUtil.isEmpty(ccCandidates)) {
82 82 log.warn("相关抄送人不存在 {}", sourceInfo.getTaskId());
... ... @@ -87,9 +87,9 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
87 87 // 设置任务id
88 88 copyDO.setTaskId(sourceInfo.getTaskId());
89 89 copyDO.setTaskName(FlowableUtils.getTaskNameByTaskId(sourceInfo.getTaskId()));
90   - copyDO.setProcessInstanceId(sourceInfo.getProcessInstanceId());
  90 + copyDO.setProcessInstanceId(processInstanceId);
91 91 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
92   - .processInstanceId(sourceInfo.getProcessInstanceId())
  92 + .processInstanceId(processInstanceId)
93 93 .singleResult();
94 94 if (null == processInstance) {
95 95 log.warn("相关流程实例不存在 {}", sourceInfo.getTaskId());
... ... @@ -98,13 +98,13 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
98 98 copyDO.setStartUserId(FlowableUtils.getStartUserIdFromProcessInstance(processInstance));
99 99 copyDO.setProcessInstanceName(processInstance.getName());
100 100 ProcessDefinition processDefinition = FlowableUtils.getProcessDefinition(processInstance.getProcessDefinitionId());
101   - copyDO.setProcessDefinitionCategory(processDefinition.getCategory());
  101 + copyDO.setCategory(processDefinition.getCategory());
102 102 copyDO.setReason(sourceInfo.getReason());
103 103 copyDO.setCreator(sourceInfo.getCreator());
104 104 copyDO.setCreateTime(LocalDateTime.now());
105 105 List<BpmProcessInstanceCopyDO> copyList = new ArrayList<>(ccCandidates.size());
106 106 for (Long userId : ccCandidates) {
107   - BpmProcessInstanceCopyDO copy = BpmProcessInstanceCopyConvert.INSTANCE.copy(copyDO);
  107 + BpmProcessInstanceCopyDO copy = BeanUtil.copyProperties(copyDO, BpmProcessInstanceCopyDO.class);
108 108 copy.setUserId(userId);
109 109 copyList.add(copy);
110 110 }
... ... @@ -113,53 +113,53 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
113 113 }
114 114  
115 115 @Override
116   - public boolean ccProcessInstance(Long userId, BpmProcessInstanceCCReqVO reqVO) {
  116 + public Void createProcessInstanceCopy(Long userId, BpmProcessInstanceCopyCreateReqVO reqVO) {
  117 + if (!ObjectUtil.equal(reqVO.getType(), BpmTaskAssignRuleTypeEnum.USER.getType())) {
  118 + throw new IllegalArgumentException("业务仅支持USER");
  119 + }
  120 + Task task = bpmTaskService.getTask(reqVO.getTaskId());
  121 + if (ObjectUtil.isNull(task)) {
  122 + throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
  123 + }
  124 + String processInstanceId = task.getProcessInstanceId();
  125 + if (StrUtil.isBlank(processInstanceId)) {
  126 + throw exception(ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS);
  127 + }
117 128 // 在能正常审批的情况下抄送流程
118   - BpmCandidateSourceInfo sourceInfo = new BpmCandidateSourceInfo();
119   - sourceInfo.setTaskId(reqVO.getTaskKey());
120   - sourceInfo.setProcessInstanceId(reqVO.getProcessInstanceKey());
121   - sourceInfo.addRule(reqVO);
122   - sourceInfo.setCreator(String.valueOf(userId));
123   - sourceInfo.setReason(reqVO.getReason());
124   - if (!makeCopy(sourceInfo)) {
125   - throw new RuntimeException("抄送任务失败");
  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);
126 141 }
127   - return false;
  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;
128 157 }
129 158  
130   - //获取流程抄送分页 TODO @kyle:接口已经注释,这里不用注释了哈;
131 159 @Override
132   - public PageResult<BpmProcessInstanceCCPageItemRespVO> getMyProcessInstanceCCPage(Long loginUserId, BpmProcessInstanceCCMyPageReqVO pageReqVO) {
  160 + public PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long loginUserId, BpmProcessInstanceCopyMyPageReqVO pageReqVO) {
133 161 // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页
134   - // TODO @kyle:一般读逻辑,Service 返回 PageResult<BpmProcessInstanceCopyDO> 即可。关联数据的查询和拼接,交给 Controller;目的是:保证 Service 聚焦写逻辑,清晰简洁;
135   - PageResult<BpmProcessInstanceCopyDO> pageResult = processInstanceCopyMapper.selectPage(loginUserId, pageReqVO);
136   - if (CollUtil.isEmpty(pageResult.getList())) {
137   - return new PageResult<>(pageResult.getTotal());
138   - }
139   -
140   - // TODO @kyle:这种可以简洁点;参考如下
141   -// Map<String, ProcessInstance> processInstanceMap = bpmProcessInstanceService.getProcessInstanceMap(
142   -// convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId));
143   -
144   - Set<String/* taskId */> taskIds = new HashSet<>();
145   - Set<String/* processInstaneId */> processInstaneIds = new HashSet<>();
146   - Set<Long/* userId */> userIds = new HashSet<>();
147   - for (BpmProcessInstanceCopyDO doItem : pageResult.getList()) {
148   - taskIds.add(doItem.getTaskId());
149   - processInstaneIds.add(doItem.getProcessInstanceId());
150   - userIds.add(doItem.getStartUserId());
151   - Long userId = Long.valueOf(doItem.getCreator());
152   - userIds.add(userId);
153   - }
154   -
155   - Map<String, String> taskNameByTaskIds = FlowableUtils.getTaskNameByTaskIds(taskIds);
156   - Map<String, String> processInstanceNameByTaskIds = FlowableUtils.getProcessInstanceNameByTaskIds(processInstaneIds);
157   -
158   - Map<Long, String> userMap = adminUserApi.getUserList(userIds).stream().collect(Collectors.toMap(
159   - AdminUserRespDTO::getId, AdminUserRespDTO::getNickname));
160   -
161   - // 转换返回
162   - return BpmProcessInstanceCopyConvert.INSTANCE.convertPage(pageResult, taskNameByTaskIds, processInstanceNameByTaskIds, userMap);
  162 + return processInstanceCopyMapper.selectPage(loginUserId, pageReqVO);
163 163 }
164 164  
165 165 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/cc/dto/BpmDelegateExecutionDTO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/cc/dto/BpmDelegateExecutionDTO.java
1   -package cn.iocoder.yudao.module.bpm.service.cc.dto;
  1 +package cn.iocoder.yudao.module.bpm.service.task.cc.dto;
2 2  
3 3 import org.flowable.bpmn.model.FlowElement;
4 4 import org.flowable.bpmn.model.FlowableListener;
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/util/FlowableUtils.java
1 1 package cn.iocoder.yudao.module.bpm.util;
2 2  
3 3  
4   -import cn.hutool.core.collection.CollUtil;
5 4 import cn.hutool.extra.spring.SpringUtil;
6 5 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
7 6 import org.flowable.bpmn.model.BpmnModel;
... ... @@ -15,7 +14,8 @@ import org.flowable.engine.repository.ProcessDefinition;
15 14 import org.flowable.engine.runtime.ProcessInstance;
16 15 import org.flowable.task.api.Task;
17 16  
18   -import java.util.*;
  17 +import java.util.List;
  18 +import java.util.Map;
19 19  
20 20 /**
21 21 * 流程引擎工具类封装
... ... @@ -88,40 +88,4 @@ public class FlowableUtils {
88 88 return task.getName();
89 89 }
90 90  
91   - // TODO @kyle:Utils 里不做查询;可以封装到 bpmTaskService 里
92   - public static Map<String/* taskId */, String/* taskName */> getTaskNameByTaskIds(Collection<String> taskIds) {
93   - TaskService taskService = SpringUtil.getBean(TaskService.class);
94   - List<Task> tasks = taskService.createTaskQuery().taskIds(taskIds).list();
95   - if (CollUtil.isNotEmpty(tasks)) {
96   - Map<String/* taskId */, String/* taskName */> taskMap = new HashMap<>(tasks.size());
97   - for (Task task : tasks) {
98   - taskMap.putIfAbsent(task.getId(), task.getName());
99   - }
100   - return taskMap;
101   - }
102   - return Collections.emptyMap();
103   - }
104   -
105   - public static String getProcessInstanceNameByTaskId(String processInstanceId) {
106   - RuntimeService runtimeService = SpringUtil.getBean(RuntimeService.class);
107   - ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
108   - .processInstanceId(processInstanceId)
109   - .singleResult();
110   - return processInstance.getName();
111   - }
112   -
113   - // TODO @kyle:Utils 里不做查询;可以封装到 bpmTaskService 里
114   - public static Map<String/* processInstaneId */, String/* processInstaneName */> getProcessInstanceNameByTaskIds(Set<String> taskIds) {
115   - RuntimeService runtimeService = SpringUtil.getBean(RuntimeService.class);
116   - List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processInstanceIds(taskIds).list();
117   - if (CollUtil.isNotEmpty(processInstances)) {
118   - Map<String/* processInstaneId */, String/* processInstaneName */> processInstaneMap = new HashMap<>(processInstances.size());
119   - for (ProcessInstance processInstance : processInstances) {
120   - processInstaneMap.putIfAbsent(processInstance.getId(), processInstance.getName());
121   - }
122   - return processInstaneMap;
123   - }
124   - return Collections.emptyMap();
125   - }
126   -
127 91 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/cc/BpmProcessInstanceCopyServiceTest.java
1 1 package cn.iocoder.yudao.module.bpm.service.cc;
2 2  
3 3 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.module.bpm.service.task.cc.BpmProcessInstanceCopyServiceImpl;
4 5 import jakarta.annotation.Resource;
5 6 import org.junit.jupiter.api.Test;
6 7 import org.springframework.context.annotation.Import;
... ...