Commit 986f9533192a4651d496eb85e3ecfd1d705c96d5
Committed by
Gitee
!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
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; | ... | ... |