Commit ee1870802f84f4d9d94f0238ed0a87580d94c5f8

Authored by YunaiV
1 parent a5dc4e78

BPM:抄送任务的 code review

Showing 16 changed files with 84 additions and 74 deletions
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
@@ -2,20 +2,18 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task; @@ -2,20 +2,18 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task;
2 2
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.framework.security.core.util.SecurityFrameworkUtils;  
6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; 5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
7 import cn.iocoder.yudao.module.bpm.service.cc.BpmProcessInstanceCopyService; 6 import cn.iocoder.yudao.module.bpm.service.cc.BpmProcessInstanceCopyService;
8 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; 7 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
9 -import io.swagger.v3.oas.annotations.tags.Tag;  
10 -import io.swagger.v3.oas.annotations.Parameter;  
11 import io.swagger.v3.oas.annotations.Operation; 8 import io.swagger.v3.oas.annotations.Operation;
  9 +import io.swagger.v3.oas.annotations.Parameter;
  10 +import io.swagger.v3.oas.annotations.tags.Tag;
  11 +import jakarta.annotation.Resource;
  12 +import jakarta.validation.Valid;
12 import org.springframework.security.access.prepost.PreAuthorize; 13 import org.springframework.security.access.prepost.PreAuthorize;
13 import org.springframework.validation.annotation.Validated; 14 import org.springframework.validation.annotation.Validated;
14 import org.springframework.web.bind.annotation.*; 15 import org.springframework.web.bind.annotation.*;
15 16
16 -import jakarta.annotation.Resource;  
17 -import jakarta.validation.Valid;  
18 -  
19 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 17 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
20 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; 18 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
21 19
@@ -62,19 +60,21 @@ public class BpmProcessInstanceController { @@ -62,19 +60,21 @@ public class BpmProcessInstanceController {
62 return success(true); 60 return success(true);
63 } 61 }
64 62
  63 + // TODO @kyle:抄送要不单独 controller?
65 64
66 @PostMapping("/cc/create") 65 @PostMapping("/cc/create")
67 @Operation(summary = "抄送流程") 66 @Operation(summary = "抄送流程")
68 @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:create')") 67 @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:create')")
69 public CommonResult<Boolean> createProcessInstanceCC(@Valid @RequestBody BpmProcessInstanceCCReqVO createReqVO) { 68 public CommonResult<Boolean> createProcessInstanceCC(@Valid @RequestBody BpmProcessInstanceCCReqVO createReqVO) {
70 - return success(processInstanceCopyService.ccProcessInstance(SecurityFrameworkUtils.getLoginUserId(), createReqVO)); 69 + return success(processInstanceCopyService.ccProcessInstance(getLoginUserId(), createReqVO));
71 } 70 }
72 71
73 @GetMapping("/cc/my-page") 72 @GetMapping("/cc/my-page")
74 @Operation(summary = "获得抄送流程分页列表") 73 @Operation(summary = "获得抄送流程分页列表")
75 @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:query')") 74 @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:query')")
76 - public CommonResult<PageResult<BpmProcessInstanceCCPageItemRespVO>> getProcessInstanceCCPage(@Valid BpmProcessInstanceCCMyPageReqVO pageReqVO) {  
77 - return success(processInstanceCopyService.getMyProcessInstanceCCPage(SecurityFrameworkUtils.getLoginUserId(), pageReqVO)); 75 + public CommonResult<PageResult<BpmProcessInstanceCCPageItemRespVO>> getProcessInstanceCCPage(
  76 + @Valid BpmProcessInstanceCCMyPageReqVO pageReqVO) {
  77 + return success(processInstanceCopyService.getMyProcessInstanceCCPage(getLoginUserId(), pageReqVO));
78 } 78 }
79 79
80 } 80 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCCMyPageReqVO.java
@@ -11,7 +11,8 @@ import java.time.LocalDateTime; @@ -11,7 +11,8 @@ 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 -@Schema(description = "管理后台 - 流程实例抄送的分页 Item Response VO") 14 +// TODO @kyle:建议改成 BpmProcessInstanceCopyMyPageReqVO;cc 缩写不容易理解,所以改成 copy,虽然会长一点,但是可读性更重要;
  15 +@Schema(description = "管理后台 - 流程实例抄送的分页 Request VO")
15 @Data 16 @Data
16 @EqualsAndHashCode(callSuper = true) 17 @EqualsAndHashCode(callSuper = true)
17 @ToString(callSuper = true) 18 @ToString(callSuper = true)
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCCPageItemRespVO.java
@@ -9,6 +9,7 @@ import java.time.LocalDateTime; @@ -9,6 +9,7 @@ import java.time.LocalDateTime;
9 @Data 9 @Data
10 public class BpmProcessInstanceCCPageItemRespVO { 10 public class BpmProcessInstanceCCPageItemRespVO {
11 11
  12 + // TODO @kyle:如果已经写了 swagger 注解,可以不用写 java 注释哈;
12 /** 13 /**
13 * 编号 14 * 编号
14 */ 15 */
@@ -52,4 +53,5 @@ public class BpmProcessInstanceCCPageItemRespVO { @@ -52,4 +53,5 @@ public class BpmProcessInstanceCCPageItemRespVO {
52 53
53 @Schema(description = "抄送时间") 54 @Schema(description = "抄送时间")
54 private LocalDateTime createTime; 55 private LocalDateTime createTime;
  56 +
55 } 57 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCCReqVO.java
@@ -9,8 +9,7 @@ import lombok.Data; @@ -9,8 +9,7 @@ import lombok.Data;
9 import lombok.EqualsAndHashCode; 9 import lombok.EqualsAndHashCode;
10 import lombok.ToString; 10 import lombok.ToString;
11 11
12 -import java.util.Set;  
13 - 12 +// TODO @kyle:这个 VO 可以改成 BpmProcessInstanceCopyCreateReqVO
14 @Schema(description = "管理后台 - 流程实例的抄送 Request VO") 13 @Schema(description = "管理后台 - 流程实例的抄送 Request VO")
15 @Data 14 @Data
16 @EqualsAndHashCode(callSuper = true) 15 @EqualsAndHashCode(callSuper = true)
@@ -33,7 +32,6 @@ public class BpmProcessInstanceCCReqVO extends BpmTaskCandidateRuleVO { @@ -33,7 +32,6 @@ public class BpmProcessInstanceCCReqVO extends BpmTaskCandidateRuleVO {
33 @NotNull(message = "发起流程的用户的编号不能为空") 32 @NotNull(message = "发起流程的用户的编号不能为空")
34 private Long startUserId; 33 private Long startUserId;
35 34
36 -  
37 @Schema(description = "任务实例名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 35 @Schema(description = "任务实例名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
38 @NotEmpty(message = "任务实例名称不能为空") 36 @NotEmpty(message = "任务实例名称不能为空")
39 private String processInstanceName; 37 private String processInstanceName;
@@ -41,4 +39,9 @@ public class BpmProcessInstanceCCReqVO extends BpmTaskCandidateRuleVO { @@ -41,4 +39,9 @@ public class BpmProcessInstanceCCReqVO extends BpmTaskCandidateRuleVO {
41 @Schema(description = "抄送原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "请帮忙审查下!") 39 @Schema(description = "抄送原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "请帮忙审查下!")
42 @NotBlank(message = "抄送原因不能为空") 40 @NotBlank(message = "抄送原因不能为空")
43 private String reason; 41 private String reason;
  42 +
  43 + // TODO @kyle:看了下字段有点多,尽量不传递可推导的字段;
  44 + // 需要传递:taskId(任务编号)、reason、userIds(被抄送的人)
  45 + // 不需要传递:taskKey、taskName、processInstanceKey、startUserId、processInstanceName 因为这些可以后端查询到
  46 +
44 } 47 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/cc/BpmProcessInstanceCopyConvert.java
@@ -11,6 +11,7 @@ import org.mapstruct.factory.Mappers; @@ -11,6 +11,7 @@ import org.mapstruct.factory.Mappers;
11 import java.util.List; 11 import java.util.List;
12 import java.util.Map; 12 import java.util.Map;
13 13
  14 +// TODO kyle:类注释不太对
14 /** 15 /**
15 * 动态表单 Convert 16 * 动态表单 Convert
16 * 17 *
@@ -21,14 +22,14 @@ public interface BpmProcessInstanceCopyConvert { @@ -21,14 +22,14 @@ public interface BpmProcessInstanceCopyConvert {
21 22
22 BpmProcessInstanceCopyConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceCopyConvert.class); 23 BpmProcessInstanceCopyConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceCopyConvert.class);
23 24
  25 + // TODO @kyle:可以使用 BeanUtils copy 替代这些简单的哈;
24 BpmProcessInstanceCopyDO copy(BpmProcessInstanceCopyDO bean); 26 BpmProcessInstanceCopyDO copy(BpmProcessInstanceCopyDO bean);
25 27
26 BpmProcessInstanceCopyVO convert(BpmProcessInstanceCopyDO bean); 28 BpmProcessInstanceCopyVO convert(BpmProcessInstanceCopyDO bean);
27 29
28 - List<BpmProcessInstanceCopyVO> convertList2(List<BpmProcessInstanceCopyDO> list);  
29 -  
30 List<BpmProcessInstanceCCPageItemRespVO> convertList(List<BpmProcessInstanceCopyDO> list); 30 List<BpmProcessInstanceCCPageItemRespVO> convertList(List<BpmProcessInstanceCopyDO> list);
31 31
  32 + // TODO @kyle:/* taskId */ 这种注释一般不用写,可以一眼看明白的;避免变量看着略微不清晰哈
32 default PageResult<BpmProcessInstanceCCPageItemRespVO> convertPage(PageResult<BpmProcessInstanceCopyDO> page 33 default PageResult<BpmProcessInstanceCCPageItemRespVO> convertPage(PageResult<BpmProcessInstanceCopyDO> page
33 , Map<String/* taskId */, String/* taskName */> taskMap 34 , Map<String/* taskId */, String/* taskName */> taskMap
34 , Map<String/* processInstaneId */, String/* processInstaneName */> processInstaneMap 35 , Map<String/* processInstaneId */, String/* processInstaneName */> processInstaneMap
@@ -45,6 +46,15 @@ public interface BpmProcessInstanceCopyConvert { @@ -45,6 +46,15 @@ public interface BpmProcessInstanceCopyConvert {
45 MapUtils.findAndThen(processInstaneMap, vo.getProcessInstanceId(), 46 MapUtils.findAndThen(processInstaneMap, vo.getProcessInstanceId(),
46 vo::setProcessInstanceName); 47 vo::setProcessInstanceName);
47 } 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 +// });
48 return new PageResult<>(list, page.getTotal()); 58 return new PageResult<>(list, page.getTotal());
49 } 59 }
50 60
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/cc/BpmProcessInstanceCopyDO.java
@@ -6,10 +6,10 @@ import com.baomidou.mybatisplus.annotation.TableName; @@ -6,10 +6,10 @@ import com.baomidou.mybatisplus.annotation.TableName;
6 import lombok.*; 6 import lombok.*;
7 7
8 /** 8 /**
9 - * 流程抄送对象 9 + * 流程抄送 DO
10 * 10 *
11 * @author kyle 11 * @author kyle
12 - * @date 2022-05-19 12 + * @date 2022-05-19 TODO @kyle:@date 不是标准 java doc,可以使用 @since 替代,然后日期是不是不对
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,8 +26,9 @@ public class BpmProcessInstanceCopyDO extends BaseDO { @@ -26,8 +26,9 @@ public class BpmProcessInstanceCopyDO extends BaseDO {
26 @TableId 26 @TableId
27 private Long id; 27 private Long id;
28 28
  29 + // TODO @kyle:字段如果是关联或者冗余,要写下注释。以 processInstanceId 举例子。
29 /** 30 /**
30 - * 发起人Id 31 + * 发起人 Id
31 */ 32 */
32 private Long startUserId; 33 private Long startUserId;
33 /** 34 /**
@@ -35,7 +36,9 @@ public class BpmProcessInstanceCopyDO extends BaseDO { @@ -35,7 +36,9 @@ public class BpmProcessInstanceCopyDO extends BaseDO {
35 */ 36 */
36 private String processInstanceName; 37 private String processInstanceName;
37 /** 38 /**
38 - * 流程主键 39 + * 流程实例的编号
  40 + *
  41 + * 关联 ProcessInstance 的 id 属性
39 */ 42 */
40 private String processInstanceId; 43 private String processInstanceId;
41 44
@@ -50,7 +53,7 @@ public class BpmProcessInstanceCopyDO extends BaseDO { @@ -50,7 +53,7 @@ public class BpmProcessInstanceCopyDO extends BaseDO {
50 private String taskName; 53 private String taskName;
51 54
52 /** 55 /**
53 - * 用户主键 56 + * 用户编号
54 */ 57 */
55 private Long userId; 58 private Long userId;
56 59
@@ -59,6 +62,7 @@ public class BpmProcessInstanceCopyDO extends BaseDO { @@ -59,6 +62,7 @@ public class BpmProcessInstanceCopyDO extends BaseDO {
59 */ 62 */
60 private String reason; 63 private String reason;
61 64
  65 + // TODO @kyle:这个字段,可以用 category 简化点
62 /** 66 /**
63 * 流程分类 67 * 流程分类
64 */ 68 */
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/cc/BpmProcessInstanceCopyMapper.java
@@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; @@ -8,7 +8,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> { 11 +public interface BpmProcessInstanceCopyMapper extends BaseMapperX<BpmProcessInstanceCopyDO> { // TODO @kyle:方法和类之间要空行下;
12 default PageResult<BpmProcessInstanceCopyDO> selectPage(Long loginUserId, BpmProcessInstanceCCMyPageReqVO reqVO){ 12 default PageResult<BpmProcessInstanceCopyDO> selectPage(Long loginUserId, BpmProcessInstanceCCMyPageReqVO reqVO){
13 return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceCopyDO>() 13 return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceCopyDO>()
14 .eqIfPresent(BpmProcessInstanceCopyDO::getUserId, loginUserId) 14 .eqIfPresent(BpmProcessInstanceCopyDO::getUserId, loginUserId)
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/bpm/config/BpmCandidateProcessorConfiguration.java
@@ -6,8 +6,7 @@ import org.springframework.beans.factory.ObjectProvider; @@ -6,8 +6,7 @@ import org.springframework.beans.factory.ObjectProvider;
6 import org.springframework.context.annotation.Bean; 6 import org.springframework.context.annotation.Bean;
7 import org.springframework.context.annotation.Configuration; 7 import org.springframework.context.annotation.Configuration;
8 8
9 -import java.util.List;  
10 - 9 +// TODO @芋艿:Candidate 相关还在完善中,用户可以暂时忽略,仅 yudao 开发的同学需要关注~计划是把 Candidate 和 Assign 融合成一套
11 /** 10 /**
12 * BPM 通用的 Configuration 配置类,提供给 Activiti 和 Flowable 11 * BPM 通用的 Configuration 配置类,提供给 Activiti 和 Flowable
13 * @author kyle 12 * @author kyle
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/cc/BpmProcessInstanceCopyService.java
@@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessI @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessI
6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCCReqVO; 6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCCReqVO;
7 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo; 7 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo;
8 8
  9 +// TODO @kyle:这个 Service 要不挪到 task 包下;保持统一,task 下有流程、任务、抄送等;
  10 +// TODO @kyle:中文和英文之间,有个空格,会更清晰点;例如说;流程抄送 Service 接口;中文写作习惯~
9 /** 11 /**
10 * 流程抄送Service接口 12 * 流程抄送Service接口
11 * 13 *
@@ -13,6 +15,7 @@ import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo; @@ -13,6 +15,7 @@ import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo;
13 */ 15 */
14 public interface BpmProcessInstanceCopyService { 16 public interface BpmProcessInstanceCopyService {
15 17
  18 + // TODO @kyle:无用的方法,可以去掉哈;另外,考虑到避免过多的 VO,这里就可以返回 BpmProcessInstanceCopyDO
16 /** 19 /**
17 * 查询流程抄送 20 * 查询流程抄送
18 * 21 *
@@ -21,6 +24,7 @@ public interface BpmProcessInstanceCopyService { @@ -21,6 +24,7 @@ public interface BpmProcessInstanceCopyService {
21 */ 24 */
22 BpmProcessInstanceCopyVO queryById(Long copyId); 25 BpmProcessInstanceCopyVO queryById(Long copyId);
23 26
  27 + // TODO 芋艿:这块要 review 下;思考下~~
24 /** 28 /**
25 * 抄送 29 * 抄送
26 * @param sourceInfo 抄送源信息,方便抄送处理 30 * @param sourceInfo 抄送源信息,方便抄送处理
@@ -28,13 +32,15 @@ public interface BpmProcessInstanceCopyService { @@ -28,13 +32,15 @@ public interface BpmProcessInstanceCopyService {
28 */ 32 */
29 boolean makeCopy(BpmCandidateSourceInfo sourceInfo); 33 boolean makeCopy(BpmCandidateSourceInfo sourceInfo);
30 34
  35 + // TODO @kyle:可以方法名改成 createProcessInstanceCopy;现在项目一般新增都用 create 为主;
31 /** 36 /**
32 * 流程实例的抄送 37 * 流程实例的抄送
33 - * @param loginUserId 当前登录用户 38 + *
  39 + * @param userId 当前登录用户
34 * @param createReqVO 创建的抄送请求 40 * @param createReqVO 创建的抄送请求
35 - * @return 是否抄送成功,抄送成功则返回true 41 + * @return 是否抄送成功,抄送成功则返回true TODO @kyle:这里可以不用返回哈;目前一般是失败,就抛出业务异常;
36 */ 42 */
37 - boolean ccProcessInstance(Long loginUserId, BpmProcessInstanceCCReqVO createReqVO); 43 + boolean ccProcessInstance(Long userId, BpmProcessInstanceCCReqVO createReqVO);
38 44
39 /** 45 /**
40 * 抄送的流程 46 * 抄送的流程
@@ -42,5 +48,6 @@ public interface BpmProcessInstanceCopyService { @@ -42,5 +48,6 @@ public interface BpmProcessInstanceCopyService {
42 * @param pageReqVO 分页请求 48 * @param pageReqVO 分页请求
43 * @return 抄送的分页结果 49 * @return 抄送的分页结果
44 */ 50 */
45 - PageResult<BpmProcessInstanceCCPageItemRespVO> getMyProcessInstanceCCPage(Long loginUserId, BpmProcessInstanceCCMyPageReqVO pageReqVO); 51 + PageResult<BpmProcessInstanceCCPageItemRespVO> getMyProcessInstanceCCPage(Long loginUserId,
  52 + BpmProcessInstanceCCMyPageReqVO pageReqVO);
46 } 53 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/cc/BpmProcessInstanceCopyServiceImpl.java
@@ -11,10 +11,12 @@ import cn.iocoder.yudao.module.bpm.dal.mysql.cc.BpmProcessInstanceCopyMapper; @@ -11,10 +11,12 @@ import cn.iocoder.yudao.module.bpm.dal.mysql.cc.BpmProcessInstanceCopyMapper;
11 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo; 11 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfo;
12 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfoProcessorChain; 12 import cn.iocoder.yudao.module.bpm.service.candidate.BpmCandidateSourceInfoProcessorChain;
13 import cn.iocoder.yudao.module.bpm.service.cc.dto.BpmDelegateExecutionDTO; 13 import cn.iocoder.yudao.module.bpm.service.cc.dto.BpmDelegateExecutionDTO;
  14 +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
14 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; 15 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
15 import cn.iocoder.yudao.module.bpm.util.FlowableUtils; 16 import cn.iocoder.yudao.module.bpm.util.FlowableUtils;
16 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 17 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
17 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 18 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  19 +import jakarta.annotation.Resource;
18 import lombok.extern.slf4j.Slf4j; 20 import lombok.extern.slf4j.Slf4j;
19 import org.flowable.engine.RuntimeService; 21 import org.flowable.engine.RuntimeService;
20 import org.flowable.engine.delegate.DelegateExecution; 22 import org.flowable.engine.delegate.DelegateExecution;
@@ -24,33 +26,37 @@ import org.springframework.context.annotation.Lazy; @@ -24,33 +26,37 @@ import org.springframework.context.annotation.Lazy;
24 import org.springframework.stereotype.Service; 26 import org.springframework.stereotype.Service;
25 import org.springframework.validation.annotation.Validated; 27 import org.springframework.validation.annotation.Validated;
26 28
27 -import jakarta.annotation.Resource;  
28 import java.time.LocalDateTime; 29 import java.time.LocalDateTime;
29 import java.util.*; 30 import java.util.*;
30 import java.util.stream.Collectors; 31 import java.util.stream.Collectors;
31 32
32 -@Slf4j 33 +// TODO @kyle:类注释要写下
  34 +@Slf4j // TODO @kyle:按照 @Service、@Validated、@Slf4j,从重要到不重要的顺序;
33 @Service 35 @Service
34 @Validated 36 @Validated
35 public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopyService { 37 public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopyService {
36 - @Resource 38 + @Resource // TODO @kyle:第一个变量,和类之间要有空行;
37 private BpmProcessInstanceCopyMapper processInstanceCopyMapper; 39 private BpmProcessInstanceCopyMapper processInstanceCopyMapper;
38 40
39 /** 41 /**
40 - * 和flowable有关的,查询流程名用的 42 + * 和flowable有关的,查询流程名用的 TODO @kyle:可以不写哈注释;
41 */ 43 */
42 @Resource 44 @Resource
43 private RuntimeService runtimeService; 45 private RuntimeService runtimeService;
44 46
45 /** 47 /**
46 - * 找抄送人用的 48 + * 找抄送人用的 TODO @kyle:可以不写哈注释;
47 */ 49 */
48 @Resource 50 @Resource
49 private BpmCandidateSourceInfoProcessorChain processorChain; 51 private BpmCandidateSourceInfoProcessorChain processorChain;
50 52
  53 + // TODO @kyle:多余的变量,可以去掉哈
51 @Resource 54 @Resource
52 @Lazy // 解决循环依赖 55 @Lazy // 解决循环依赖
53 - private BpmTaskService taskService; 56 + private BpmTaskService bpmTaskService;
  57 + @Resource
  58 + @Lazy // 解决循环依赖
  59 + private BpmProcessInstanceService bpmProcessInstanceService;
54 @Resource 60 @Resource
55 private AdminUserApi adminUserApi; 61 private AdminUserApi adminUserApi;
56 62
@@ -60,6 +66,10 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy @@ -60,6 +66,10 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
60 return BpmProcessInstanceCopyConvert.INSTANCE.convert(bpmProcessInstanceCopyDO); 66 return BpmProcessInstanceCopyConvert.INSTANCE.convert(bpmProcessInstanceCopyDO);
61 } 67 }
62 68
  69 + // TODO @kyle:makeCopy 和 ccProcessInstance 的调用关系,感受上反了;
  70 + // makeCopy 有点像基于规则,查找抄送人,然后创建;
  71 + // ccProcessInstance 是已经有了抄送人,然后创建;
  72 + // 建议的改造:独立基于 processInstanceCopyMapper 做 insert
63 @Override 73 @Override
64 public boolean makeCopy(BpmCandidateSourceInfo sourceInfo) { 74 public boolean makeCopy(BpmCandidateSourceInfo sourceInfo) {
65 if (null == sourceInfo) { 75 if (null == sourceInfo) {
@@ -103,13 +113,13 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy @@ -103,13 +113,13 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
103 } 113 }
104 114
105 @Override 115 @Override
106 - public boolean ccProcessInstance(Long loginUserId, BpmProcessInstanceCCReqVO reqVO) { 116 + public boolean ccProcessInstance(Long userId, BpmProcessInstanceCCReqVO reqVO) {
107 // 在能正常审批的情况下抄送流程 117 // 在能正常审批的情况下抄送流程
108 BpmCandidateSourceInfo sourceInfo = new BpmCandidateSourceInfo(); 118 BpmCandidateSourceInfo sourceInfo = new BpmCandidateSourceInfo();
109 sourceInfo.setTaskId(reqVO.getTaskKey()); 119 sourceInfo.setTaskId(reqVO.getTaskKey());
110 sourceInfo.setProcessInstanceId(reqVO.getProcessInstanceKey()); 120 sourceInfo.setProcessInstanceId(reqVO.getProcessInstanceKey());
111 sourceInfo.addRule(reqVO); 121 sourceInfo.addRule(reqVO);
112 - sourceInfo.setCreator(String.valueOf(loginUserId)); 122 + sourceInfo.setCreator(String.valueOf(userId));
113 sourceInfo.setReason(reqVO.getReason()); 123 sourceInfo.setReason(reqVO.getReason());
114 if (!makeCopy(sourceInfo)) { 124 if (!makeCopy(sourceInfo)) {
115 throw new RuntimeException("抄送任务失败"); 125 throw new RuntimeException("抄送任务失败");
@@ -117,15 +127,20 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy @@ -117,15 +127,20 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
117 return false; 127 return false;
118 } 128 }
119 129
120 - //获取流程抄送分页 130 + //获取流程抄送分页 TODO @kyle:接口已经注释,这里不用注释了哈;
121 @Override 131 @Override
122 public PageResult<BpmProcessInstanceCCPageItemRespVO> getMyProcessInstanceCCPage(Long loginUserId, BpmProcessInstanceCCMyPageReqVO pageReqVO) { 132 public PageResult<BpmProcessInstanceCCPageItemRespVO> getMyProcessInstanceCCPage(Long loginUserId, BpmProcessInstanceCCMyPageReqVO pageReqVO) {
123 // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 133 // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页
  134 + // TODO @kyle:一般读逻辑,Service 返回 PageResult<BpmProcessInstanceCopyDO> 即可。关联数据的查询和拼接,交给 Controller;目的是:保证 Service 聚焦写逻辑,清晰简洁;
124 PageResult<BpmProcessInstanceCopyDO> pageResult = processInstanceCopyMapper.selectPage(loginUserId, pageReqVO); 135 PageResult<BpmProcessInstanceCopyDO> pageResult = processInstanceCopyMapper.selectPage(loginUserId, pageReqVO);
125 if (CollUtil.isEmpty(pageResult.getList())) { 136 if (CollUtil.isEmpty(pageResult.getList())) {
126 return new PageResult<>(pageResult.getTotal()); 137 return new PageResult<>(pageResult.getTotal());
127 } 138 }
128 139
  140 + // TODO @kyle:这种可以简洁点;参考如下
  141 +// Map<String, ProcessInstance> processInstanceMap = bpmProcessInstanceService.getProcessInstanceMap(
  142 +// convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId));
  143 +
129 Set<String/* taskId */> taskIds = new HashSet<>(); 144 Set<String/* taskId */> taskIds = new HashSet<>();
130 Set<String/* processInstaneId */> processInstaneIds = new HashSet<>(); 145 Set<String/* processInstaneId */> processInstaneIds = new HashSet<>();
131 Set<Long/* userId */> userIds = new HashSet<>(); 146 Set<Long/* userId */> userIds = new HashSet<>();
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/cc/BpmProcessInstanceCopyVO.java
1 package cn.iocoder.yudao.module.bpm.service.cc; 1 package cn.iocoder.yudao.module.bpm.service.cc;
2 2
3 -import com.baomidou.mybatisplus.annotation.TableId;  
4 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 4 import lombok.Data;
6 5
7 import java.time.LocalDateTime; 6 import java.time.LocalDateTime;
8 -import java.util.Date;  
9 -  
10 7
  8 +// TODO @kyle:看看是不是要删除
11 /** 9 /**
12 * 流程抄送视图对象 wf_copy 10 * 流程抄送视图对象 wf_copy
13 * 11 *
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/util/FlowableUtils.java
@@ -88,6 +88,7 @@ public class FlowableUtils { @@ -88,6 +88,7 @@ public class FlowableUtils {
88 return task.getName(); 88 return task.getName();
89 } 89 }
90 90
  91 + // TODO @kyle:Utils 里不做查询;可以封装到 bpmTaskService 里
91 public static Map<String/* taskId */, String/* taskName */> getTaskNameByTaskIds(Collection<String> taskIds) { 92 public static Map<String/* taskId */, String/* taskName */> getTaskNameByTaskIds(Collection<String> taskIds) {
92 TaskService taskService = SpringUtil.getBean(TaskService.class); 93 TaskService taskService = SpringUtil.getBean(TaskService.class);
93 List<Task> tasks = taskService.createTaskQuery().taskIds(taskIds).list(); 94 List<Task> tasks = taskService.createTaskQuery().taskIds(taskIds).list();
@@ -109,6 +110,7 @@ public class FlowableUtils { @@ -109,6 +110,7 @@ public class FlowableUtils {
109 return processInstance.getName(); 110 return processInstance.getName();
110 } 111 }
111 112
  113 + // TODO @kyle:Utils 里不做查询;可以封装到 bpmTaskService 里
112 public static Map<String/* processInstaneId */, String/* processInstaneName */> getProcessInstanceNameByTaskIds(Set<String> taskIds) { 114 public static Map<String/* processInstaneId */, String/* processInstaneName */> getProcessInstanceNameByTaskIds(Set<String> taskIds) {
113 RuntimeService runtimeService = SpringUtil.getBean(RuntimeService.class); 115 RuntimeService runtimeService = SpringUtil.getBean(RuntimeService.class);
114 List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processInstanceIds(taskIds).list(); 116 List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processInstanceIds(taskIds).list();
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/ip/AreaController.java
@@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.system.controller.admin.ip; @@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.system.controller.admin.ip;
2 2
3 import cn.hutool.core.lang.Assert; 3 import cn.hutool.core.lang.Assert;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 import cn.iocoder.yudao.framework.ip.core.Area; 6 import cn.iocoder.yudao.framework.ip.core.Area;
6 import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; 7 import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
7 import cn.iocoder.yudao.framework.ip.core.utils.IPUtils; 8 import cn.iocoder.yudao.framework.ip.core.utils.IPUtils;
8 import cn.iocoder.yudao.module.system.controller.admin.ip.vo.AreaNodeRespVO; 9 import cn.iocoder.yudao.module.system.controller.admin.ip.vo.AreaNodeRespVO;
9 -import cn.iocoder.yudao.module.system.convert.ip.AreaConvert;  
10 import io.swagger.v3.oas.annotations.Operation; 10 import io.swagger.v3.oas.annotations.Operation;
11 import io.swagger.v3.oas.annotations.Parameter; 11 import io.swagger.v3.oas.annotations.Parameter;
12 import io.swagger.v3.oas.annotations.tags.Tag; 12 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -31,7 +31,7 @@ public class AreaController { @@ -31,7 +31,7 @@ public class AreaController {
31 public CommonResult<List<AreaNodeRespVO>> getAreaTree() { 31 public CommonResult<List<AreaNodeRespVO>> getAreaTree() {
32 Area area = AreaUtils.getArea(Area.ID_CHINA); 32 Area area = AreaUtils.getArea(Area.ID_CHINA);
33 Assert.notNull(area, "获取不到中国"); 33 Assert.notNull(area, "获取不到中国");
34 - return success(AreaConvert.INSTANCE.convertList(area.getChildren())); 34 + return success(BeanUtils.toBean(area.getChildren(), AreaNodeRespVO.class));
35 } 35 }
36 36
37 @GetMapping("/get-by-ip") 37 @GetMapping("/get-by-ip")
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/user/SocialUserBindReqVO.java
@@ -31,7 +31,4 @@ public class SocialUserBindReqVO { @@ -31,7 +31,4 @@ public class SocialUserBindReqVO {
31 @NotEmpty(message = "state 不能为空") 31 @NotEmpty(message = "state 不能为空")
32 private String state; 32 private String state;
33 33
34 - public Integer getType() {  
35 - return type;  
36 - }  
37 } 34 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/ip/AppAreaController.java
@@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.system.controller.app.ip; @@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.system.controller.app.ip;
2 2
3 import cn.hutool.core.lang.Assert; 3 import cn.hutool.core.lang.Assert;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 import cn.iocoder.yudao.framework.ip.core.Area; 6 import cn.iocoder.yudao.framework.ip.core.Area;
6 import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; 7 import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
7 import cn.iocoder.yudao.module.system.controller.app.ip.vo.AppAreaNodeRespVO; 8 import cn.iocoder.yudao.module.system.controller.app.ip.vo.AppAreaNodeRespVO;
8 -import cn.iocoder.yudao.module.system.convert.ip.AreaConvert;  
9 import io.swagger.v3.oas.annotations.Operation; 9 import io.swagger.v3.oas.annotations.Operation;
10 import io.swagger.v3.oas.annotations.tags.Tag; 10 import io.swagger.v3.oas.annotations.tags.Tag;
11 import org.springframework.validation.annotation.Validated; 11 import org.springframework.validation.annotation.Validated;
@@ -28,7 +28,7 @@ public class AppAreaController { @@ -28,7 +28,7 @@ public class AppAreaController {
28 public CommonResult<List<AppAreaNodeRespVO>> getAreaTree() { 28 public CommonResult<List<AppAreaNodeRespVO>> getAreaTree() {
29 Area area = AreaUtils.getArea(Area.ID_CHINA); 29 Area area = AreaUtils.getArea(Area.ID_CHINA);
30 Assert.notNull(area, "获取不到中国"); 30 Assert.notNull(area, "获取不到中国");
31 - return success(AreaConvert.INSTANCE.convertList3(area.getChildren())); 31 + return success(BeanUtils.toBean(area.getChildren(), AppAreaNodeRespVO.class));
32 } 32 }
33 33
34 } 34 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/ip/AreaConvert.java deleted
1 -package cn.iocoder.yudao.module.system.convert.ip;  
2 -  
3 -import cn.iocoder.yudao.framework.ip.core.Area;  
4 -import cn.iocoder.yudao.module.system.controller.admin.ip.vo.AreaNodeRespVO;  
5 -import cn.iocoder.yudao.module.system.controller.app.ip.vo.AppAreaNodeRespVO;  
6 -import org.mapstruct.Mapper;  
7 -import org.mapstruct.factory.Mappers;  
8 -  
9 -import java.util.List;  
10 -  
11 -@Mapper  
12 -public interface AreaConvert {  
13 -  
14 - AreaConvert INSTANCE = Mappers.getMapper(AreaConvert.class);  
15 -  
16 - List<AreaNodeRespVO> convertList(List<Area> list);  
17 -  
18 - List<AppAreaNodeRespVO> convertList3(List<Area> list);  
19 -  
20 - /**  
21 - * 缺少单个转换  
22 - * @param value  
23 - * @return  
24 - */  
25 - AreaNodeRespVO map(Area value);  
26 -  
27 - AppAreaNodeRespVO map3(Area value);  
28 -}