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,7 +3,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; 5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
6 -import cn.iocoder.yudao.module.bpm.service.cc.BpmProcessInstanceCopyService;  
7 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; 6 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
8 import io.swagger.v3.oas.annotations.Operation; 7 import io.swagger.v3.oas.annotations.Operation;
9 import io.swagger.v3.oas.annotations.Parameter; 8 import io.swagger.v3.oas.annotations.Parameter;
@@ -26,9 +25,6 @@ public class BpmProcessInstanceController { @@ -26,9 +25,6 @@ public class BpmProcessInstanceController {
26 @Resource 25 @Resource
27 private BpmProcessInstanceService processInstanceService; 26 private BpmProcessInstanceService processInstanceService;
28 27
29 - @Resource  
30 - private BpmProcessInstanceCopyService processInstanceCopyService;  
31 -  
32 @GetMapping("/my-page") 28 @GetMapping("/my-page")
33 @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用") 29 @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
34 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") 30 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
@@ -60,21 +56,4 @@ public class BpmProcessInstanceController { @@ -60,21 +56,4 @@ public class BpmProcessInstanceController {
60 return success(true); 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,44 +4,22 @@ import cn.iocoder.yudao.module.bpm.controller.admin.candidate.vo.BpmTaskCandidat
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
5 import jakarta.validation.constraints.NotBlank; 5 import jakarta.validation.constraints.NotBlank;
6 import jakarta.validation.constraints.NotEmpty; 6 import jakarta.validation.constraints.NotEmpty;
7 -import jakarta.validation.constraints.NotNull;  
8 import lombok.Data; 7 import lombok.Data;
9 import lombok.EqualsAndHashCode; 8 import lombok.EqualsAndHashCode;
10 import lombok.ToString; 9 import lombok.ToString;
11 10
12 -// TODO @kyle:这个 VO 可以改成 BpmProcessInstanceCopyCreateReqVO  
13 -@Schema(description = "管理后台 - 流程实例的抄送 Request VO") 11 +@Schema(description = "管理后台 - 流程实例抄送的创建 Request VO")
14 @Data 12 @Data
15 @EqualsAndHashCode(callSuper = true) 13 @EqualsAndHashCode(callSuper = true)
16 @ToString(callSuper = true) 14 @ToString(callSuper = true)
17 -public class BpmProcessInstanceCCReqVO extends BpmTaskCandidateRuleVO { 15 +public class BpmProcessInstanceCopyCreateReqVO extends BpmTaskCandidateRuleVO {
18 16
19 @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 17 @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
20 @NotEmpty(message = "任务编号不能为空") 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 @Schema(description = "抄送原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "请帮忙审查下!") 21 @Schema(description = "抄送原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "请帮忙审查下!")
40 @NotBlank(message = "抄送原因不能为空") 22 @NotBlank(message = "抄送原因不能为空")
41 private String reason; 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,12 +11,11 @@ import java.time.LocalDateTime;
11 11
12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 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 @Schema(description = "管理后台 - 流程实例抄送的分页 Request VO") 14 @Schema(description = "管理后台 - 流程实例抄送的分页 Request VO")
16 @Data 15 @Data
17 @EqualsAndHashCode(callSuper = true) 16 @EqualsAndHashCode(callSuper = true)
18 @ToString(callSuper = true) 17 @ToString(callSuper = true)
19 -public class BpmProcessInstanceCCMyPageReqVO extends PageParam { 18 +public class BpmProcessInstanceCopyMyPageReqVO extends PageParam {
20 19
21 @Schema(description = "流程名称", example = "芋道") 20 @Schema(description = "流程名称", example = "芋道")
22 private String processInstanceName; 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,35 +7,23 @@ import java.time.LocalDateTime;
7 7
8 @Schema(description = "管理后台 - 流程实例抄送的分页 Item Response VO") 8 @Schema(description = "管理后台 - 流程实例抄送的分页 Item Response VO")
9 @Data 9 @Data
10 -public class BpmProcessInstanceCCPageItemRespVO { 10 +public class BpmProcessInstanceCopyPageItemRespVO {
11 11
12 - // TODO @kyle:如果已经写了 swagger 注解,可以不用写 java 注释哈;  
13 - /**  
14 - * 编号  
15 - */  
16 @Schema(description = "抄送主键") 12 @Schema(description = "抄送主键")
17 private Long id; 13 private Long id;
18 14
19 - /**  
20 - * 发起人Id  
21 - */  
22 @Schema(description = "发起人Id") 15 @Schema(description = "发起人Id")
23 private Long startUserId; 16 private Long startUserId;
24 17
25 @Schema(description = "发起人别名") 18 @Schema(description = "发起人别名")
26 private String startUserNickname; 19 private String startUserNickname;
27 20
28 - /**  
29 - * 流程主键  
30 - */  
31 @Schema(description = "流程实例的主键") 21 @Schema(description = "流程实例的主键")
32 private String processInstanceId; 22 private String processInstanceId;
33 23
34 @Schema(description = "流程实例的名称") 24 @Schema(description = "流程实例的名称")
35 private String processInstanceName; 25 private String processInstanceName;
36 - /**  
37 - * 任务主键  
38 - */ 26 +
39 @Schema(description = "发起抄送的任务编号") 27 @Schema(description = "发起抄送的任务编号")
40 private String taskId; 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 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 import java.time.LocalDateTime; 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 @Data 11 @Data
16 public class BpmProcessInstanceCopyVO { 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,18 +2,18 @@ package cn.iocoder.yudao.module.bpm.convert.cc;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 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.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 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; 8 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
7 -import cn.iocoder.yudao.module.bpm.service.cc.BpmProcessInstanceCopyVO;  
8 import org.mapstruct.Mapper; 9 import org.mapstruct.Mapper;
9 import org.mapstruct.factory.Mappers; 10 import org.mapstruct.factory.Mappers;
10 11
11 import java.util.List; 12 import java.util.List;
12 import java.util.Map; 13 import java.util.Map;
13 14
14 -// TODO kyle:类注释不太对  
15 /** 15 /**
16 - * 动态表单 Convert 16 + * 流程抄送 Convert
17 * 17 *
18 * @author 芋艿 18 * @author 芋艿
19 */ 19 */
@@ -22,39 +22,23 @@ public interface BpmProcessInstanceCopyConvert { @@ -22,39 +22,23 @@ public interface BpmProcessInstanceCopyConvert {
22 22
23 BpmProcessInstanceCopyConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceCopyConvert.class); 23 BpmProcessInstanceCopyConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceCopyConvert.class);
24 24
25 - // TODO @kyle:可以使用 BeanUtils copy 替代这些简单的哈;  
26 - BpmProcessInstanceCopyDO copy(BpmProcessInstanceCopyDO bean);  
27 -  
28 BpmProcessInstanceCopyVO convert(BpmProcessInstanceCopyDO bean); 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 return new PageResult<>(list, page.getTotal()); 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,7 +9,7 @@ import lombok.*;
9 * 流程抄送 DO 9 * 流程抄送 DO
10 * 10 *
11 * @author kyle 11 * @author kyle
12 - * @date 2022-05-19 TODO @kyle:@date 不是标准 java doc,可以使用 @since 替代,然后日期是不是不对 12 + * @since 2024-01-22
13 */ 13 */
14 @TableName(value = "bpm_process_instance_copy", autoResultMap = true) 14 @TableName(value = "bpm_process_instance_copy", autoResultMap = true)
15 @Data 15 @Data
@@ -26,34 +26,43 @@ public class BpmProcessInstanceCopyDO extends BaseDO { @@ -26,34 +26,43 @@ public class BpmProcessInstanceCopyDO extends BaseDO {
26 @TableId 26 @TableId
27 private Long id; 27 private Long id;
28 28
29 - // TODO @kyle:字段如果是关联或者冗余,要写下注释。以 processInstanceId 举例子。  
30 /** 29 /**
31 * 发起人 Id 30 * 发起人 Id
  31 + * <p>
  32 + * 关联 system_users 的 id 属性
32 */ 33 */
33 private Long startUserId; 34 private Long startUserId;
34 /** 35 /**
35 * 流程名 36 * 流程名
  37 + * <p>
  38 + * 冗余字段
36 */ 39 */
37 private String processInstanceName; 40 private String processInstanceName;
38 /** 41 /**
39 * 流程实例的编号 42 * 流程实例的编号
40 - * 43 + * <p>
41 * 关联 ProcessInstance 的 id 属性 44 * 关联 ProcessInstance 的 id 属性
42 */ 45 */
43 private String processInstanceId; 46 private String processInstanceId;
44 47
45 /** 48 /**
46 * 任务主键 49 * 任务主键
  50 + * <p>
  51 + * 关联 task 的 id 属性
47 */ 52 */
48 private String taskId; 53 private String taskId;
49 54
50 /** 55 /**
51 * 任务名称 56 * 任务名称
  57 + * <p>
  58 + * 冗余字段
52 */ 59 */
53 private String taskName; 60 private String taskName;
54 61
55 /** 62 /**
56 * 用户编号 63 * 用户编号
  64 + * <p>
  65 + * 关联 system_users 的 id 属性
57 */ 66 */
58 private Long userId; 67 private Long userId;
59 68
@@ -62,10 +71,11 @@ public class BpmProcessInstanceCopyDO extends BaseDO { @@ -62,10 +71,11 @@ public class BpmProcessInstanceCopyDO extends BaseDO {
62 */ 71 */
63 private String reason; 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,13 +3,14 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.cc;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 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 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; 7 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
10 @Mapper 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 return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceCopyDO>() 14 return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceCopyDO>()
14 .eqIfPresent(BpmProcessInstanceCopyDO::getUserId, loginUserId) 15 .eqIfPresent(BpmProcessInstanceCopyDO::getUserId, loginUserId)
15 .eqIfPresent(BpmProcessInstanceCopyDO::getProcessInstanceId, reqVO.getProcessInstanceId()) 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,12 +2,12 @@ package cn.iocoder.yudao.module.bpm.service.candidate;
2 2
3 import cn.iocoder.yudao.module.bpm.controller.admin.candidate.vo.BpmTaskCandidateRuleVO; 3 import cn.iocoder.yudao.module.bpm.controller.admin.candidate.vo.BpmTaskCandidateRuleVO;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
  5 +import jakarta.validation.constraints.NotEmpty;
  6 +import jakarta.validation.constraints.NotNull;
5 import lombok.AllArgsConstructor; 7 import lombok.AllArgsConstructor;
6 import lombok.Data; 8 import lombok.Data;
7 import lombok.NoArgsConstructor; 9 import lombok.NoArgsConstructor;
8 10
9 -import jakarta.validation.constraints.NotEmpty;  
10 -import jakarta.validation.constraints.NotNull;  
11 import java.util.HashSet; 11 import java.util.HashSet;
12 import java.util.Set; 12 import java.util.Set;
13 13
@@ -18,11 +18,6 @@ import java.util.Set; @@ -18,11 +18,6 @@ import java.util.Set;
18 @NoArgsConstructor 18 @NoArgsConstructor
19 @Data 19 @Data
20 public class BpmCandidateSourceInfo { 20 public class BpmCandidateSourceInfo {
21 -  
22 - @Schema(description = "流程id")  
23 - @NotNull  
24 - private String processInstanceId;  
25 -  
26 @Schema(description = "当前任务ID") 21 @Schema(description = "当前任务ID")
27 @NotNull 22 @NotNull
28 private String taskId; 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,11 +4,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; 5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
6 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; 6 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
  7 +import jakarta.validation.Valid;
7 import org.flowable.task.api.Task; 8 import org.flowable.task.api.Task;
8 9
9 -import jakarta.validation.Valid; 10 +import java.util.Collection;
10 import java.util.List; 11 import java.util.List;
11 import java.util.Map; 12 import java.util.Map;
  13 +import java.util.Set;
12 14
13 /** 15 /**
14 * 流程任务实例 Service 接口 16 * 流程任务实例 Service 接口
@@ -132,6 +134,8 @@ public interface BpmTaskService { @@ -132,6 +134,8 @@ public interface BpmTaskService {
132 */ 134 */
133 void updateTaskExtAssign(Task task); 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,4 +185,19 @@ public interface BpmTaskService {
181 */ 185 */
182 List<BpmTaskSubSignRespVO> getChildrenTaskList(String parentId); 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,14 +19,15 @@ import cn.iocoder.yudao.module.bpm.enums.task.BpmCommentTypeEnum;
19 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; 19 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum;
20 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; 20 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.candidate.BpmCandidateSourceInfo;  
23 -import cn.iocoder.yudao.module.bpm.service.cc.BpmProcessInstanceCopyService;  
24 import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; 22 import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
25 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;
26 import cn.iocoder.yudao.module.system.api.dept.DeptApi; 25 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
27 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 26 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
28 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 27 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
29 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 28 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  29 +import jakarta.annotation.Resource;
  30 +import jakarta.validation.Valid;
30 import lombok.extern.slf4j.Slf4j; 31 import lombok.extern.slf4j.Slf4j;
31 import org.flowable.bpmn.model.BpmnModel; 32 import org.flowable.bpmn.model.BpmnModel;
32 import org.flowable.bpmn.model.FlowElement; 33 import org.flowable.bpmn.model.FlowElement;
@@ -51,8 +52,6 @@ import org.springframework.transaction.support.TransactionSynchronization; @@ -51,8 +52,6 @@ import org.springframework.transaction.support.TransactionSynchronization;
51 import org.springframework.transaction.support.TransactionSynchronizationManager; 52 import org.springframework.transaction.support.TransactionSynchronizationManager;
52 import org.springframework.util.Assert; 53 import org.springframework.util.Assert;
53 54
54 -import jakarta.annotation.Resource;  
55 -import jakarta.validation.Valid;  
56 import java.time.LocalDateTime; 55 import java.time.LocalDateTime;
57 import java.util.*; 56 import java.util.*;
58 import java.util.stream.Stream; 57 import java.util.stream.Stream;
@@ -558,7 +557,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -558,7 +557,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
558 return task; 557 return task;
559 } 558 }
560 559
561 - private Task getTask(String id) { 560 + @Override
  561 + public Task getTask(String id) {
562 return taskService.createTaskQuery().taskId(id).singleResult(); 562 return taskService.createTaskQuery().taskId(id).singleResult();
563 } 563 }
564 564
@@ -971,4 +971,29 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -971,4 +971,29 @@ public class BpmTaskServiceImpl implements BpmTaskService {
971 return BpmTaskConvert.INSTANCE.convertList(taskExtList, userMap, idTaskMap); 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 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.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 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo; 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 public interface BpmProcessInstanceCopyService { 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 // TODO 芋艿:这块要 review 下;思考下~~ 17 // TODO 芋艿:这块要 review 下;思考下~~
28 /** 18 /**
29 * 抄送 19 * 抄送
@@ -32,22 +22,20 @@ public interface BpmProcessInstanceCopyService { @@ -32,22 +22,20 @@ public interface BpmProcessInstanceCopyService {
32 */ 22 */
33 boolean makeCopy(BpmCandidateSourceInfo sourceInfo); 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 * @param createReqVO 创建的抄送请求 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 * @param loginUserId 登录用户id 35 * @param loginUserId 登录用户id
48 * @param pageReqVO 分页请求 36 * @param pageReqVO 分页请求
49 * @return 抄送的分页结果 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 import cn.hutool.core.collection.CollUtil; 4 import cn.hutool.core.collection.CollUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
  6 +import cn.hutool.core.util.StrUtil;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import cn.iocoder.yudao.module.bpm.convert.cc.BpmProcessInstanceCopyConvert; 11 import cn.iocoder.yudao.module.bpm.convert.cc.BpmProcessInstanceCopyConvert;
9 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; 12 import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
10 import cn.iocoder.yudao.module.bpm.dal.mysql.cc.BpmProcessInstanceCopyMapper; 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 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo; 16 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo;
12 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfoProcessorChain; 17 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfoProcessorChain;
13 -import cn.iocoder.yudao.module.bpm.service.cc.dto.BpmDelegateExecutionDTO;  
14 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; 18 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
15 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; 19 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
  20 +import cn.iocoder.yudao.module.bpm.service.task.cc.dto.BpmDelegateExecutionDTO;
16 import cn.iocoder.yudao.module.bpm.util.FlowableUtils; 21 import cn.iocoder.yudao.module.bpm.util.FlowableUtils;
17 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 22 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
18 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 23 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -22,6 +27,7 @@ import org.flowable.engine.RuntimeService; @@ -22,6 +27,7 @@ import org.flowable.engine.RuntimeService;
22 import org.flowable.engine.delegate.DelegateExecution; 27 import org.flowable.engine.delegate.DelegateExecution;
23 import org.flowable.engine.repository.ProcessDefinition; 28 import org.flowable.engine.repository.ProcessDefinition;
24 import org.flowable.engine.runtime.ProcessInstance; 29 import org.flowable.engine.runtime.ProcessInstance;
  30 +import org.flowable.task.api.Task;
25 import org.springframework.context.annotation.Lazy; 31 import org.springframework.context.annotation.Lazy;
26 import org.springframework.stereotype.Service; 32 import org.springframework.stereotype.Service;
27 import org.springframework.validation.annotation.Validated; 33 import org.springframework.validation.annotation.Validated;
@@ -30,53 +36,47 @@ import java.time.LocalDateTime; @@ -30,53 +36,47 @@ import java.time.LocalDateTime;
30 import java.util.*; 36 import java.util.*;
31 import java.util.stream.Collectors; 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 @Service 47 @Service
36 @Validated 48 @Validated
  49 +@Slf4j
37 public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopyService { 50 public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopyService {
38 - @Resource // TODO @kyle:第一个变量,和类之间要有空行; 51 +
  52 + @Resource
39 private BpmProcessInstanceCopyMapper processInstanceCopyMapper; 53 private BpmProcessInstanceCopyMapper processInstanceCopyMapper;
40 54
41 - /**  
42 - * 和flowable有关的,查询流程名用的 TODO @kyle:可以不写哈注释;  
43 - */  
44 @Resource 55 @Resource
45 private RuntimeService runtimeService; 56 private RuntimeService runtimeService;
46 57
47 - /**  
48 - * 找抄送人用的 TODO @kyle:可以不写哈注释;  
49 - */  
50 @Resource 58 @Resource
51 private BpmCandidateSourceInfoProcessorChain processorChain; 59 private BpmCandidateSourceInfoProcessorChain processorChain;
52 60
53 - // TODO @kyle:多余的变量,可以去掉哈  
54 @Resource 61 @Resource
55 - @Lazy // 解决循环依赖 62 + @Lazy
56 private BpmTaskService bpmTaskService; 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 @Override 65 @Override
74 public boolean makeCopy(BpmCandidateSourceInfo sourceInfo) { 66 public boolean makeCopy(BpmCandidateSourceInfo sourceInfo) {
75 if (null == sourceInfo) { 67 if (null == sourceInfo) {
76 return false; 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 Set<Long> ccCandidates = processorChain.calculateTaskCandidateUsers(executionEntity, sourceInfo); 80 Set<Long> ccCandidates = processorChain.calculateTaskCandidateUsers(executionEntity, sourceInfo);
81 if (CollUtil.isEmpty(ccCandidates)) { 81 if (CollUtil.isEmpty(ccCandidates)) {
82 log.warn("相关抄送人不存在 {}", sourceInfo.getTaskId()); 82 log.warn("相关抄送人不存在 {}", sourceInfo.getTaskId());
@@ -87,9 +87,9 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy @@ -87,9 +87,9 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
87 // 设置任务id 87 // 设置任务id
88 copyDO.setTaskId(sourceInfo.getTaskId()); 88 copyDO.setTaskId(sourceInfo.getTaskId());
89 copyDO.setTaskName(FlowableUtils.getTaskNameByTaskId(sourceInfo.getTaskId())); 89 copyDO.setTaskName(FlowableUtils.getTaskNameByTaskId(sourceInfo.getTaskId()));
90 - copyDO.setProcessInstanceId(sourceInfo.getProcessInstanceId()); 90 + copyDO.setProcessInstanceId(processInstanceId);
91 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() 91 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
92 - .processInstanceId(sourceInfo.getProcessInstanceId()) 92 + .processInstanceId(processInstanceId)
93 .singleResult(); 93 .singleResult();
94 if (null == processInstance) { 94 if (null == processInstance) {
95 log.warn("相关流程实例不存在 {}", sourceInfo.getTaskId()); 95 log.warn("相关流程实例不存在 {}", sourceInfo.getTaskId());
@@ -98,13 +98,13 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy @@ -98,13 +98,13 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
98 copyDO.setStartUserId(FlowableUtils.getStartUserIdFromProcessInstance(processInstance)); 98 copyDO.setStartUserId(FlowableUtils.getStartUserIdFromProcessInstance(processInstance));
99 copyDO.setProcessInstanceName(processInstance.getName()); 99 copyDO.setProcessInstanceName(processInstance.getName());
100 ProcessDefinition processDefinition = FlowableUtils.getProcessDefinition(processInstance.getProcessDefinitionId()); 100 ProcessDefinition processDefinition = FlowableUtils.getProcessDefinition(processInstance.getProcessDefinitionId());
101 - copyDO.setProcessDefinitionCategory(processDefinition.getCategory()); 101 + copyDO.setCategory(processDefinition.getCategory());
102 copyDO.setReason(sourceInfo.getReason()); 102 copyDO.setReason(sourceInfo.getReason());
103 copyDO.setCreator(sourceInfo.getCreator()); 103 copyDO.setCreator(sourceInfo.getCreator());
104 copyDO.setCreateTime(LocalDateTime.now()); 104 copyDO.setCreateTime(LocalDateTime.now());
105 List<BpmProcessInstanceCopyDO> copyList = new ArrayList<>(ccCandidates.size()); 105 List<BpmProcessInstanceCopyDO> copyList = new ArrayList<>(ccCandidates.size());
106 for (Long userId : ccCandidates) { 106 for (Long userId : ccCandidates) {
107 - BpmProcessInstanceCopyDO copy = BpmProcessInstanceCopyConvert.INSTANCE.copy(copyDO); 107 + BpmProcessInstanceCopyDO copy = BeanUtil.copyProperties(copyDO, BpmProcessInstanceCopyDO.class);
108 copy.setUserId(userId); 108 copy.setUserId(userId);
109 copyList.add(copy); 109 copyList.add(copy);
110 } 110 }
@@ -113,53 +113,53 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy @@ -113,53 +113,53 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
113 } 113 }
114 114
115 @Override 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 @Override 159 @Override
132 - public PageResult<BpmProcessInstanceCCPageItemRespVO> getMyProcessInstanceCCPage(Long loginUserId, BpmProcessInstanceCCMyPageReqVO pageReqVO) { 160 + public PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long loginUserId, BpmProcessInstanceCopyMyPageReqVO pageReqVO) {
133 // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 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 import org.flowable.bpmn.model.FlowElement; 3 import org.flowable.bpmn.model.FlowElement;
4 import org.flowable.bpmn.model.FlowableListener; 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 package cn.iocoder.yudao.module.bpm.util; 1 package cn.iocoder.yudao.module.bpm.util;
2 2
3 3
4 -import cn.hutool.core.collection.CollUtil;  
5 import cn.hutool.extra.spring.SpringUtil; 4 import cn.hutool.extra.spring.SpringUtil;
6 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 5 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
7 import org.flowable.bpmn.model.BpmnModel; 6 import org.flowable.bpmn.model.BpmnModel;
@@ -15,7 +14,8 @@ import org.flowable.engine.repository.ProcessDefinition; @@ -15,7 +14,8 @@ import org.flowable.engine.repository.ProcessDefinition;
15 import org.flowable.engine.runtime.ProcessInstance; 14 import org.flowable.engine.runtime.ProcessInstance;
16 import org.flowable.task.api.Task; 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,40 +88,4 @@ public class FlowableUtils {
88 return task.getName(); 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 package cn.iocoder.yudao.module.bpm.service.cc; 1 package cn.iocoder.yudao.module.bpm.service.cc;
2 2
3 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; 3 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.module.bpm.service.task.cc.BpmProcessInstanceCopyServiceImpl;
4 import jakarta.annotation.Resource; 5 import jakarta.annotation.Resource;
5 import org.junit.jupiter.api.Test; 6 import org.junit.jupiter.api.Test;
6 import org.springframework.context.annotation.Import; 7 import org.springframework.context.annotation.Import;