Commit ba502fc5282b7f00a731abd7f352561f7409dfcd
1 parent
3fce4827
BPM:调整抄送逻辑的实现,改成审批通过、不通过时,可选择抄送
Showing
15 changed files
with
236 additions
and
683 deletions
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmCommentTypeEnum.java
| @@ -4,25 +4,29 @@ import lombok.AllArgsConstructor; | @@ -4,25 +4,29 @@ import lombok.AllArgsConstructor; | ||
| 4 | import lombok.Getter; | 4 | import lombok.Getter; |
| 5 | 5 | ||
| 6 | /** | 6 | /** |
| 7 | - * 流程任务 -- comment类型枚举 | 7 | + * 流程任务的 Comment 评论类型枚举 |
| 8 | + * | ||
| 9 | + * @author kehaiyou | ||
| 8 | */ | 10 | */ |
| 9 | @Getter | 11 | @Getter |
| 10 | @AllArgsConstructor | 12 | @AllArgsConstructor |
| 11 | public enum BpmCommentTypeEnum { | 13 | public enum BpmCommentTypeEnum { |
| 12 | 14 | ||
| 13 | - APPROVE(1, "通过", ""), | ||
| 14 | - REJECT(2, "不通过", ""), | ||
| 15 | - CANCEL(3, "已取消", ""), | ||
| 16 | - BACK(4, "退回", ""), | ||
| 17 | - DELEGATE(5, "委派", ""), | ||
| 18 | - ADD_SIGN(6, "加签", "[{}]{}给了[{}],理由为:{}"), | ||
| 19 | - SUB_SIGN(7, "减签", "[{}]操作了【减签】,审批人[{}]的任务被取消"), | 15 | + APPROVE("1", "审批通过", ""), // 理由:直接使用用户的评论 |
| 16 | + REJECT("2", "不通过", ""), | ||
| 17 | + CANCEL("3", "已取消", ""), | ||
| 18 | + BACK("4", "退回", ""), | ||
| 19 | + DELEGATE("5", "委派", ""), | ||
| 20 | + ADD_SIGN("6", "加签", "[{}]{}给了[{}],理由为:{}"), | ||
| 21 | + SUB_SIGN("7", "减签", "[{}]操作了【减签】,审批人[{}]的任务被取消"), | ||
| 20 | ; | 22 | ; |
| 21 | 23 | ||
| 22 | /** | 24 | /** |
| 23 | * 操作类型 | 25 | * 操作类型 |
| 26 | + * | ||
| 27 | + * 由于 BPM Comment 类型为 String,所以这里就不使用 Integer | ||
| 24 | */ | 28 | */ |
| 25 | - private final Integer type; | 29 | + private final String type; |
| 26 | /** | 30 | /** |
| 27 | * 操作名字 | 31 | * 操作名字 |
| 28 | */ | 32 | */ |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java
| @@ -3,23 +3,27 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task; | @@ -3,23 +3,27 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task; | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 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.pojo.PageResult; | 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; | 6 | +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| 7 | +import cn.iocoder.yudao.framework.common.util.date.DateUtils; | ||
| 8 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 9 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.cc.BpmProcessInstanceCopyRespVO; | ||
| 10 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO; | ||
| 10 | import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; | 11 | import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; |
| 12 | +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceCopyService; | ||
| 11 | import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; | 13 | import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; |
| 12 | import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; | 14 | 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.AdminUserApi; |
| 15 | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | 16 | 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.Operation; |
| 17 | import io.swagger.v3.oas.annotations.tags.Tag; | 18 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 18 | import jakarta.annotation.Resource; | 19 | import jakarta.annotation.Resource; |
| 19 | import jakarta.validation.Valid; | 20 | import jakarta.validation.Valid; |
| 21 | +import org.flowable.engine.history.HistoricProcessInstance; | ||
| 20 | import org.springframework.security.access.prepost.PreAuthorize; | 22 | import org.springframework.security.access.prepost.PreAuthorize; |
| 21 | import org.springframework.validation.annotation.Validated; | 23 | import org.springframework.validation.annotation.Validated; |
| 22 | -import org.springframework.web.bind.annotation.*; | 24 | +import org.springframework.web.bind.annotation.GetMapping; |
| 25 | +import org.springframework.web.bind.annotation.RequestMapping; | ||
| 26 | +import org.springframework.web.bind.annotation.RestController; | ||
| 23 | 27 | ||
| 24 | import java.util.Map; | 28 | import java.util.Map; |
| 25 | import java.util.stream.Stream; | 29 | import java.util.stream.Stream; |
| @@ -31,35 +35,27 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti | @@ -31,35 +35,27 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti | ||
| 31 | 35 | ||
| 32 | @Tag(name = "管理后台 - 流程实例抄送") | 36 | @Tag(name = "管理后台 - 流程实例抄送") |
| 33 | @RestController | 37 | @RestController |
| 34 | -@RequestMapping("/bpm/process-instance/cc") | 38 | +@RequestMapping("/bpm/process-instance/copy") |
| 35 | @Validated | 39 | @Validated |
| 36 | public class BpmProcessInstanceCopyController { | 40 | public class BpmProcessInstanceCopyController { |
| 37 | 41 | ||
| 38 | @Resource | 42 | @Resource |
| 39 | private BpmProcessInstanceCopyService processInstanceCopyService; | 43 | private BpmProcessInstanceCopyService processInstanceCopyService; |
| 40 | @Resource | 44 | @Resource |
| 41 | - private BpmProcessInstanceService bpmProcessInstanceService; | ||
| 42 | - | ||
| 43 | - @Resource | ||
| 44 | - private AdminUserApi adminUserApi; | ||
| 45 | - | 45 | + private BpmProcessInstanceService processInstanceService; |
| 46 | @Resource | 46 | @Resource |
| 47 | private BpmTaskService bpmTaskService; | 47 | private BpmTaskService bpmTaskService; |
| 48 | 48 | ||
| 49 | - @PostMapping("/create") | ||
| 50 | - @Operation(summary = "抄送流程") | ||
| 51 | - @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:create')") | ||
| 52 | - public CommonResult<Boolean> createProcessInstanceCopy(@Valid @RequestBody BpmProcessInstanceCopyCreateReqVO createReqVO) { | ||
| 53 | - processInstanceCopyService.createProcessInstanceCopy(getLoginUserId(), createReqVO); | ||
| 54 | - return success(true); | ||
| 55 | - } | 49 | + @Resource |
| 50 | + private AdminUserApi adminUserApi; | ||
| 56 | 51 | ||
| 57 | - @GetMapping("/my-page") | 52 | + @GetMapping("/page") |
| 58 | @Operation(summary = "获得抄送流程分页列表") | 53 | @Operation(summary = "获得抄送流程分页列表") |
| 59 | @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:query')") | 54 | @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:query')") |
| 60 | - public CommonResult<PageResult<BpmProcessInstanceCopyPageItemRespVO>> getProcessInstanceCopyPage( | ||
| 61 | - @Valid BpmProcessInstanceCopyMyPageReqVO pageReqVO) { | ||
| 62 | - PageResult<BpmProcessInstanceCopyDO> pageResult = processInstanceCopyService.getMyProcessInstanceCopyPage(getLoginUserId(), pageReqVO); | 55 | + public CommonResult<PageResult<BpmProcessInstanceCopyRespVO>> getProcessInstanceCopyPage( |
| 56 | + @Valid BpmProcessInstanceCopyPageReqVO pageReqVO) { | ||
| 57 | + PageResult<BpmProcessInstanceCopyDO> pageResult = processInstanceCopyService.getProcessInstanceCopyPage( | ||
| 58 | + getLoginUserId(), pageReqVO); | ||
| 63 | if (CollUtil.isEmpty(pageResult.getList())) { | 59 | if (CollUtil.isEmpty(pageResult.getList())) { |
| 64 | return success(new PageResult<>(pageResult.getTotal())); | 60 | return success(new PageResult<>(pageResult.getTotal())); |
| 65 | } | 61 | } |
| @@ -67,11 +63,17 @@ public class BpmProcessInstanceCopyController { | @@ -67,11 +63,17 @@ public class BpmProcessInstanceCopyController { | ||
| 67 | // 拼接返回 | 63 | // 拼接返回 |
| 68 | Map<String, String> taskNameMap = bpmTaskService.getTaskNameByTaskIds( | 64 | Map<String, String> taskNameMap = bpmTaskService.getTaskNameByTaskIds( |
| 69 | convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getTaskId)); | 65 | convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getTaskId)); |
| 70 | - Map<String, String> processNameMap = bpmProcessInstanceService.getProcessInstanceNameMap( | 66 | + Map<String, HistoricProcessInstance> processInstanceMap = processInstanceService.getHistoricProcessInstanceMap( |
| 71 | convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId)); | 67 | convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId)); |
| 72 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(), | 68 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(), |
| 73 | copy -> Stream.of(copy.getStartUserId(), Long.parseLong(copy.getCreator())))); | 69 | copy -> Stream.of(copy.getStartUserId(), Long.parseLong(copy.getCreator())))); |
| 74 | - return success(BpmProcessInstanceCopyConvert.INSTANCE.convertPage(pageResult, taskNameMap, processNameMap, userMap)); | 70 | + return success(BeanUtils.toBean(pageResult, BpmProcessInstanceCopyRespVO.class, copyVO -> { |
| 71 | + MapUtils.findAndThen(userMap, Long.valueOf(copyVO.getCreator()), user -> copyVO.setCreatorName(user.getNickname())); | ||
| 72 | + MapUtils.findAndThen(userMap, copyVO.getStartUserId(), user -> copyVO.setStartUserName(user.getNickname())); | ||
| 73 | + MapUtils.findAndThen(taskNameMap, copyVO.getTaskId(), copyVO::setTaskName); | ||
| 74 | + MapUtils.findAndThen(processInstanceMap, copyVO.getProcessInstanceId(), | ||
| 75 | + processInstance -> copyVO.setProcessInstanceStartTime(DateUtils.of(processInstance.getStartTime()))); | ||
| 76 | + })); | ||
| 75 | } | 77 | } |
| 76 | 78 | ||
| 77 | } | 79 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
| 1 | package cn.iocoder.yudao.module.bpm.controller.admin.task; | 1 | package cn.iocoder.yudao.module.bpm.controller.admin.task; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | -import cn.hutool.core.util.StrUtil; | ||
| 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 8 | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | 6 | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; |
| 9 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 7 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 10 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; | 8 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; |
| 11 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; | 9 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; |
| 12 | -import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants; | 10 | +import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; |
| 13 | import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; | 11 | import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; |
| 14 | import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; | 12 | import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; |
| 15 | import cn.iocoder.yudao.module.system.api.dept.DeptApi; | 13 | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| @@ -66,15 +64,7 @@ public class BpmTaskController { | @@ -66,15 +64,7 @@ public class BpmTaskController { | ||
| 66 | convertSet(pageResult.getList(), Task::getProcessInstanceId)); | 64 | convertSet(pageResult.getList(), Task::getProcessInstanceId)); |
| 67 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( | 65 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| 68 | convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); | 66 | convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); |
| 69 | - return success(BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> { | ||
| 70 | - ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); | ||
| 71 | - if (processInstance == null) { | ||
| 72 | - return; | ||
| 73 | - } | ||
| 74 | - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); | ||
| 75 | - taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class, | ||
| 76 | - processInstanceVO -> processInstanceVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class)))); | ||
| 77 | - })); | 67 | + return success(BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap)); |
| 78 | } | 68 | } |
| 79 | 69 | ||
| 80 | @GetMapping("done-page") | 70 | @GetMapping("done-page") |
| @@ -87,18 +77,9 @@ public class BpmTaskController { | @@ -87,18 +77,9 @@ public class BpmTaskController { | ||
| 87 | convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId)); | 77 | convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId)); |
| 88 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( | 78 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| 89 | convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); | 79 | convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); |
| 90 | - return success(BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> { | ||
| 91 | - HistoricProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); | ||
| 92 | - if (processInstance == null) { | ||
| 93 | - return; | ||
| 94 | - } | ||
| 95 | - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); | ||
| 96 | - taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class, | ||
| 97 | - processInstanceVO -> processInstanceVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class)))); | ||
| 98 | - })); | 80 | + return success(BpmTaskConvert.INSTANCE.buildDoneTaskPage(pageResult, processInstanceMap, userMap)); |
| 99 | } | 81 | } |
| 100 | 82 | ||
| 101 | - // TODO @芋艿:怎么优化下 | ||
| 102 | @GetMapping("/list-by-process-instance-id") | 83 | @GetMapping("/list-by-process-instance-id") |
| 103 | @Operation(summary = "获得指定流程实例的任务列表", description = "包括完成的、未完成的") | 84 | @Operation(summary = "获得指定流程实例的任务列表", description = "包括完成的、未完成的") |
| 104 | @Parameter(name = "processInstanceId", description = "流程实例的编号", required = true) | 85 | @Parameter(name = "processInstanceId", description = "流程实例的编号", required = true) |
| @@ -118,33 +99,7 @@ public class BpmTaskController { | @@ -118,33 +99,7 @@ public class BpmTaskController { | ||
| 118 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); | 99 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| 119 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap( | 100 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap( |
| 120 | convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); | 101 | convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); |
| 121 | - List<BpmTaskRespVO> taskVOList = CollectionUtils.convertList(taskList, task -> { | ||
| 122 | - BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class); | ||
| 123 | - taskVO.setStatus((Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS)); | ||
| 124 | - // 流程实例 | ||
| 125 | - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); | ||
| 126 | - taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class, | ||
| 127 | - processInstanceVO -> processInstanceVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class)))); | ||
| 128 | - // 用户信息 | ||
| 129 | - AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); | ||
| 130 | - if (assignUser != null) { | ||
| 131 | - taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class)); | ||
| 132 | - DeptRespDTO dept = deptMap.get(assignUser.getDeptId()); | ||
| 133 | - if (dept != null) { | ||
| 134 | - taskVO.getAssigneeUser().setDeptName(dept.getName()); | ||
| 135 | - } | ||
| 136 | - } | ||
| 137 | - return taskVO; | ||
| 138 | - }); | ||
| 139 | - | ||
| 140 | - // 拼接父子关系 | ||
| 141 | - Map<String, List<BpmTaskRespVO>> childrenTaskMap = convertMultiMap( | ||
| 142 | - filterList(taskVOList, r -> StrUtil.isNotEmpty(r.getParentTaskId())), | ||
| 143 | - BpmTaskRespVO::getParentTaskId); | ||
| 144 | - for (BpmTaskRespVO taskVO : taskVOList) { | ||
| 145 | - taskVO.setChildren(childrenTaskMap.get(taskVO.getId())); | ||
| 146 | - } | ||
| 147 | - return success(filterList(taskVOList, r -> StrUtil.isEmpty(r.getParentTaskId()))); | 102 | + return success(BpmTaskConvert.INSTANCE.buildTaskListByProcessInstanceId(taskList, processInstance, userMap, deptMap)); |
| 148 | } | 103 | } |
| 149 | 104 | ||
| 150 | @PutMapping("/approve") | 105 | @PutMapping("/approve") |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyPageItemRespVO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/cc/BpmProcessInstanceCopyRespVO.java
| 1 | -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; | 1 | +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.cc; |
| 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; |
| @@ -7,37 +7,32 @@ import java.time.LocalDateTime; | @@ -7,37 +7,32 @@ 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 BpmProcessInstanceCopyPageItemRespVO { | 10 | +public class BpmProcessInstanceCopyRespVO { |
| 11 | 11 | ||
| 12 | - @Schema(description = "抄送主键") | 12 | + @Schema(description = "抄送主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 13 | private Long id; | 13 | private Long id; |
| 14 | 14 | ||
| 15 | - @Schema(description = "发起人 ID") | 15 | + @Schema(description = "发起人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "888") |
| 16 | private Long startUserId; | 16 | private Long startUserId; |
| 17 | + @Schema(description = "发起人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") | ||
| 18 | + private String startUserName; | ||
| 17 | 19 | ||
| 18 | - @Schema(description = "发起人别名") | ||
| 19 | - private String startUserNickname; | ||
| 20 | - | ||
| 21 | - @Schema(description = "流程实例的主键") | 20 | + @Schema(description = "流程实例编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "A233") |
| 22 | private String processInstanceId; | 21 | private String processInstanceId; |
| 23 | - | ||
| 24 | @Schema(description = "流程实例的名称") | 22 | @Schema(description = "流程实例的名称") |
| 25 | private String processInstanceName; | 23 | private String processInstanceName; |
| 24 | + @Schema(description = "流程实例的发起时间") | ||
| 25 | + private LocalDateTime processInstanceStartTime; | ||
| 26 | 26 | ||
| 27 | @Schema(description = "发起抄送的任务编号") | 27 | @Schema(description = "发起抄送的任务编号") |
| 28 | private String taskId; | 28 | private String taskId; |
| 29 | - | ||
| 30 | @Schema(description = "发起抄送的任务名称") | 29 | @Schema(description = "发起抄送的任务名称") |
| 31 | private String taskName; | 30 | private String taskName; |
| 32 | 31 | ||
| 33 | - @Schema(description = "抄送原因") | ||
| 34 | - private String reason; | ||
| 35 | - | ||
| 36 | @Schema(description = "抄送人") | 32 | @Schema(description = "抄送人") |
| 37 | private String creator; | 33 | private String creator; |
| 38 | - | ||
| 39 | - @Schema(description = "抄送人别名") | ||
| 40 | - private String creatorNickname; | 34 | + @Schema(description = "抄送人昵称") |
| 35 | + private String creatorName; | ||
| 41 | 36 | ||
| 42 | @Schema(description = "抄送时间") | 37 | @Schema(description = "抄送时间") |
| 43 | private LocalDateTime createTime; | 38 | private LocalDateTime createTime; |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyCreateReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; | ||
| 2 | - | ||
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | -import jakarta.validation.constraints.NotBlank; | ||
| 5 | -import jakarta.validation.constraints.NotEmpty; | ||
| 6 | -import lombok.Data; | ||
| 7 | - | ||
| 8 | -@Schema(description = "管理后台 - 流程实例抄送的创建 Request VO") | ||
| 9 | -@Data | ||
| 10 | -public class BpmProcessInstanceCopyCreateReqVO { | ||
| 11 | - | ||
| 12 | - @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||
| 13 | - @NotEmpty(message = "任务编号不能为空") | ||
| 14 | - private String taskId; | ||
| 15 | - | ||
| 16 | - @Schema(description = "抄送原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "请帮忙审查下!") | ||
| 17 | - @NotBlank(message = "抄送原因不能为空") | ||
| 18 | - private String reason; | ||
| 19 | - | ||
| 20 | -} |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyMyPageReqVO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceCopyPageReqVO.java
| @@ -15,14 +15,11 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ | @@ -15,14 +15,11 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ | ||
| 15 | @Data | 15 | @Data |
| 16 | @EqualsAndHashCode(callSuper = true) | 16 | @EqualsAndHashCode(callSuper = true) |
| 17 | @ToString(callSuper = true) | 17 | @ToString(callSuper = true) |
| 18 | -public class BpmProcessInstanceCopyMyPageReqVO extends PageParam { | 18 | +public class BpmProcessInstanceCopyPageReqVO extends PageParam { |
| 19 | 19 | ||
| 20 | @Schema(description = "流程名称", example = "芋道") | 20 | @Schema(description = "流程名称", example = "芋道") |
| 21 | private String processInstanceName; | 21 | private String processInstanceName; |
| 22 | 22 | ||
| 23 | - @Schema(description = "流程编号", example = "123456768") | ||
| 24 | - private String processInstanceId; | ||
| 25 | - | ||
| 26 | @Schema(description = "创建时间") | 23 | @Schema(description = "创建时间") |
| 27 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | 24 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 28 | private LocalDateTime[] createTime; | 25 | private LocalDateTime[] createTime; |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java
| 1 | package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; | 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 jakarta.validation.constraints.NotEmpty; | ||
| 4 | import lombok.Data; | 5 | import lombok.Data; |
| 5 | 6 | ||
| 6 | -import jakarta.validation.constraints.NotEmpty; | 7 | +import java.util.Collection; |
| 7 | 8 | ||
| 8 | @Schema(description = "管理后台 - 通过流程任务的 Request VO") | 9 | @Schema(description = "管理后台 - 通过流程任务的 Request VO") |
| 9 | @Data | 10 | @Data |
| @@ -17,4 +18,7 @@ public class BpmTaskApproveReqVO { | @@ -17,4 +18,7 @@ public class BpmTaskApproveReqVO { | ||
| 17 | @NotEmpty(message = "审批意见不能为空") | 18 | @NotEmpty(message = "审批意见不能为空") |
| 18 | private String reason; | 19 | private String reason; |
| 19 | 20 | ||
| 21 | + @Schema(description = "抄送的用户编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2") | ||
| 22 | + private Collection<Long> copyUserIds; | ||
| 23 | + | ||
| 20 | } | 24 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/cc/BpmProcessInstanceCopyConvert.java deleted
| 1 | -package cn.iocoder.yudao.module.bpm.convert.cc; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | ||
| 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.dal.dataobject.cc.BpmProcessInstanceCopyDO; | ||
| 8 | -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | ||
| 9 | -import org.mapstruct.Mapper; | ||
| 10 | -import org.mapstruct.factory.Mappers; | ||
| 11 | - | ||
| 12 | -import java.util.List; | ||
| 13 | -import java.util.Map; | ||
| 14 | - | ||
| 15 | -/** | ||
| 16 | - * 流程抄送 Convert | ||
| 17 | - * | ||
| 18 | - * @author 芋艿 | ||
| 19 | - */ | ||
| 20 | -@Mapper | ||
| 21 | -public interface BpmProcessInstanceCopyConvert { | ||
| 22 | - | ||
| 23 | - BpmProcessInstanceCopyConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceCopyConvert.class); | ||
| 24 | - | ||
| 25 | - default PageResult<BpmProcessInstanceCopyPageItemRespVO> convertPage(PageResult<BpmProcessInstanceCopyDO> page, | ||
| 26 | - Map<String, String> taskNameMap, | ||
| 27 | - Map<String, String> processInstaneNameMap, | ||
| 28 | - Map<Long, AdminUserRespDTO> userMap) { | ||
| 29 | - List<BpmProcessInstanceCopyPageItemRespVO> list = BeanUtils.toBean(page.getList(), | ||
| 30 | - BpmProcessInstanceCopyPageItemRespVO.class, | ||
| 31 | - copy -> { | ||
| 32 | - MapUtils.findAndThen(userMap, Long.valueOf(copy.getCreator()), user -> user.setNickname(user.getNickname())); | ||
| 33 | - MapUtils.findAndThen(userMap, copy.getStartUserId(), user -> copy.setStartUserNickname(user.getNickname())); | ||
| 34 | - MapUtils.findAndThen(taskNameMap, copy.getTaskId(), copy::setTaskName); | ||
| 35 | - MapUtils.findAndThen(processInstaneNameMap, copy.getProcessInstanceId(), copy::setProcessInstanceName); | ||
| 36 | - }); | ||
| 37 | - return new PageResult<>(list, page.getTotal()); | ||
| 38 | - } | ||
| 39 | - | ||
| 40 | -} |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
| 1 | package cn.iocoder.yudao.module.bpm.convert.task; | 1 | package cn.iocoder.yudao.module.bpm.convert.task; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.util.StrUtil; | ||
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 3 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; | 6 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; |
| 4 | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | 7 | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; |
| 8 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 9 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; | ||
| 10 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; | ||
| 11 | +import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants; | ||
| 5 | import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; | 12 | import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; |
| 13 | +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; | ||
| 6 | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | 14 | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| 15 | +import org.flowable.engine.history.HistoricProcessInstance; | ||
| 7 | import org.flowable.engine.runtime.ProcessInstance; | 16 | import org.flowable.engine.runtime.ProcessInstance; |
| 8 | import org.flowable.task.api.Task; | 17 | import org.flowable.task.api.Task; |
| 18 | +import org.flowable.task.api.history.HistoricTaskInstance; | ||
| 9 | import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; | 19 | import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; |
| 10 | import org.mapstruct.Mapper; | 20 | import org.mapstruct.Mapper; |
| 11 | import org.mapstruct.factory.Mappers; | 21 | import org.mapstruct.factory.Mappers; |
| 12 | 22 | ||
| 13 | import java.util.Date; | 23 | import java.util.Date; |
| 24 | +import java.util.List; | ||
| 25 | +import java.util.Map; | ||
| 26 | + | ||
| 27 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; | ||
| 28 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; | ||
| 14 | 29 | ||
| 15 | /** | 30 | /** |
| 16 | * Bpm 任务 Convert | 31 | * Bpm 任务 Convert |
| @@ -22,6 +37,71 @@ public interface BpmTaskConvert { | @@ -22,6 +37,71 @@ public interface BpmTaskConvert { | ||
| 22 | 37 | ||
| 23 | BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class); | 38 | BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class); |
| 24 | 39 | ||
| 40 | + default PageResult<BpmTaskRespVO> buildTodoTaskPage(PageResult<Task> pageResult, | ||
| 41 | + Map<String, ProcessInstance> processInstanceMap, | ||
| 42 | + Map<Long, AdminUserRespDTO> userMap) { | ||
| 43 | + return BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> { | ||
| 44 | + ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); | ||
| 45 | + if (processInstance == null) { | ||
| 46 | + return; | ||
| 47 | + } | ||
| 48 | + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); | ||
| 49 | + taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class, | ||
| 50 | + processInstanceVO -> processInstanceVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class)))); | ||
| 51 | + }); | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + default PageResult<BpmTaskRespVO> buildDoneTaskPage(PageResult<HistoricTaskInstance> pageResult, | ||
| 55 | + Map<String, HistoricProcessInstance> processInstanceMap, | ||
| 56 | + Map<Long, AdminUserRespDTO> userMap) { | ||
| 57 | + List<BpmTaskRespVO> taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> { | ||
| 58 | + BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class); | ||
| 59 | + taskVO.setStatus((Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS)); | ||
| 60 | + // 流程实例 | ||
| 61 | + HistoricProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); | ||
| 62 | + if (processInstance != null) { | ||
| 63 | + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); | ||
| 64 | + taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class, | ||
| 65 | + processInstanceVO -> processInstanceVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class)))); | ||
| 66 | + } | ||
| 67 | + return taskVO; | ||
| 68 | + }); | ||
| 69 | + return new PageResult<>(taskVOList, pageResult.getTotal()); | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + default List<BpmTaskRespVO> buildTaskListByProcessInstanceId(List<HistoricTaskInstance> taskList, | ||
| 73 | + HistoricProcessInstance processInstance, | ||
| 74 | + Map<Long, AdminUserRespDTO> userMap, | ||
| 75 | + Map<Long, DeptRespDTO> deptMap) { | ||
| 76 | + List<BpmTaskRespVO> taskVOList = CollectionUtils.convertList(taskList, task -> { | ||
| 77 | + BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class); | ||
| 78 | + taskVO.setStatus((Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS)); | ||
| 79 | + // 流程实例 | ||
| 80 | + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); | ||
| 81 | + taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class, | ||
| 82 | + processInstanceVO -> processInstanceVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class)))); | ||
| 83 | + // 用户信息 | ||
| 84 | + AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); | ||
| 85 | + if (assignUser != null) { | ||
| 86 | + taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class)); | ||
| 87 | + DeptRespDTO dept = deptMap.get(assignUser.getDeptId()); | ||
| 88 | + if (dept != null) { | ||
| 89 | + taskVO.getAssigneeUser().setDeptName(dept.getName()); | ||
| 90 | + } | ||
| 91 | + } | ||
| 92 | + return taskVO; | ||
| 93 | + }); | ||
| 94 | + | ||
| 95 | + // 拼接父子关系 | ||
| 96 | + Map<String, List<BpmTaskRespVO>> childrenTaskMap = convertMultiMap( | ||
| 97 | + filterList(taskVOList, r -> StrUtil.isNotEmpty(r.getParentTaskId())), | ||
| 98 | + BpmTaskRespVO::getParentTaskId); | ||
| 99 | + for (BpmTaskRespVO taskVO : taskVOList) { | ||
| 100 | + taskVO.setChildren(childrenTaskMap.get(taskVO.getId())); | ||
| 101 | + } | ||
| 102 | + return filterList(taskVOList, r -> StrUtil.isEmpty(r.getParentTaskId())); | ||
| 103 | + } | ||
| 104 | + | ||
| 25 | default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, | 105 | default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, |
| 26 | Task task) { | 106 | Task task) { |
| 27 | BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); | 107 | BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/cc/BpmProcessInstanceCopyDO.java
| @@ -29,7 +29,7 @@ public class BpmProcessInstanceCopyDO extends BaseDO { | @@ -29,7 +29,7 @@ public class BpmProcessInstanceCopyDO extends BaseDO { | ||
| 29 | /** | 29 | /** |
| 30 | * 发起人 Id | 30 | * 发起人 Id |
| 31 | * | 31 | * |
| 32 | - * 关联 system_users 的 id 属性 | 32 | + * 冗余 ProcessInstance 的 startUserId 字段 |
| 33 | */ | 33 | */ |
| 34 | private Long startUserId; | 34 | private Long startUserId; |
| 35 | /** | 35 | /** |
| @@ -44,6 +44,12 @@ public class BpmProcessInstanceCopyDO extends BaseDO { | @@ -44,6 +44,12 @@ public class BpmProcessInstanceCopyDO extends BaseDO { | ||
| 44 | * 关联 ProcessInstance 的 id 属性 | 44 | * 关联 ProcessInstance 的 id 属性 |
| 45 | */ | 45 | */ |
| 46 | private String processInstanceId; | 46 | private String processInstanceId; |
| 47 | + /** | ||
| 48 | + * 流程分类 | ||
| 49 | + * | ||
| 50 | + * 冗余 ProcessInstance 的 category 字段 | ||
| 51 | + */ | ||
| 52 | + private String category; | ||
| 47 | 53 | ||
| 48 | /** | 54 | /** |
| 49 | * 任务主键 | 55 | * 任务主键 |
| @@ -51,7 +57,6 @@ public class BpmProcessInstanceCopyDO extends BaseDO { | @@ -51,7 +57,6 @@ public class BpmProcessInstanceCopyDO extends BaseDO { | ||
| 51 | * 关联 Task 的 id 属性 | 57 | * 关联 Task 的 id 属性 |
| 52 | */ | 58 | */ |
| 53 | private String taskId; | 59 | private String taskId; |
| 54 | - | ||
| 55 | /** | 60 | /** |
| 56 | * 任务名称 | 61 | * 任务名称 |
| 57 | * | 62 | * |
| @@ -60,22 +65,10 @@ public class BpmProcessInstanceCopyDO extends BaseDO { | @@ -60,22 +65,10 @@ public class BpmProcessInstanceCopyDO extends BaseDO { | ||
| 60 | private String taskName; | 65 | private String taskName; |
| 61 | 66 | ||
| 62 | /** | 67 | /** |
| 63 | - * 用户编号 | 68 | + * 用户编号(被抄送的用户编号) |
| 64 | * | 69 | * |
| 65 | * 关联 system_users 的 id 属性 | 70 | * 关联 system_users 的 id 属性 |
| 66 | */ | 71 | */ |
| 67 | private Long userId; | 72 | private Long userId; |
| 68 | 73 | ||
| 69 | - /** | ||
| 70 | - * 抄送原因 | ||
| 71 | - */ | ||
| 72 | - private String reason; | ||
| 73 | - | ||
| 74 | - /** | ||
| 75 | - * 流程分类 | ||
| 76 | - * | ||
| 77 | - * 冗余 ProcessInstance 的 category 字段 | ||
| 78 | - */ | ||
| 79 | - private String category; | ||
| 80 | - | ||
| 81 | } | 74 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/cc/BpmProcessInstanceCopyMapper.java
| @@ -3,19 +3,19 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.cc; | @@ -3,19 +3,19 @@ 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.BpmProcessInstanceCopyMyPageReqVO; | 6 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO; |
| 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> { | 11 | public interface BpmProcessInstanceCopyMapper extends BaseMapperX<BpmProcessInstanceCopyDO> { |
| 12 | 12 | ||
| 13 | - default PageResult<BpmProcessInstanceCopyDO> selectPage(Long loginUserId, BpmProcessInstanceCopyMyPageReqVO reqVO) { | 13 | + default PageResult<BpmProcessInstanceCopyDO> selectPage(Long loginUserId, BpmProcessInstanceCopyPageReqVO reqVO) { |
| 14 | return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceCopyDO>() | 14 | return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessInstanceCopyDO>() |
| 15 | .eqIfPresent(BpmProcessInstanceCopyDO::getUserId, loginUserId) | 15 | .eqIfPresent(BpmProcessInstanceCopyDO::getUserId, loginUserId) |
| 16 | - .eqIfPresent(BpmProcessInstanceCopyDO::getProcessInstanceId, reqVO.getProcessInstanceId()) | ||
| 17 | .likeIfPresent(BpmProcessInstanceCopyDO::getProcessInstanceName, reqVO.getProcessInstanceName()) | 16 | .likeIfPresent(BpmProcessInstanceCopyDO::getProcessInstanceName, reqVO.getProcessInstanceName()) |
| 18 | .betweenIfPresent(BpmProcessInstanceCopyDO::getCreateTime, reqVO.getCreateTime()) | 17 | .betweenIfPresent(BpmProcessInstanceCopyDO::getCreateTime, reqVO.getCreateTime()) |
| 19 | .orderByDesc(BpmProcessInstanceCopyDO::getId)); | 18 | .orderByDesc(BpmProcessInstanceCopyDO::getId)); |
| 20 | } | 19 | } |
| 20 | + | ||
| 21 | } | 21 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/cc/BpmProcessInstanceCopyService.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java
| 1 | -package cn.iocoder.yudao.module.bpm.service.task.cc; | 1 | +package cn.iocoder.yudao.module.bpm.service.task; |
| 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.BpmProcessInstanceCopyCreateReqVO; | ||
| 5 | -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyMyPageReqVO; | 4 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO; |
| 6 | import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; | 5 | import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; |
| 7 | 6 | ||
| 7 | +import java.util.Collection; | ||
| 8 | + | ||
| 8 | /** | 9 | /** |
| 9 | * 流程抄送 Service 接口 | 10 | * 流程抄送 Service 接口 |
| 10 | * | 11 | * |
| @@ -15,17 +16,19 @@ public interface BpmProcessInstanceCopyService { | @@ -15,17 +16,19 @@ public interface BpmProcessInstanceCopyService { | ||
| 15 | /** | 16 | /** |
| 16 | * 流程实例的抄送 | 17 | * 流程实例的抄送 |
| 17 | * | 18 | * |
| 18 | - * @param userId 当前登录用户 | ||
| 19 | - * @param createReqVO 创建的抄送请求 | 19 | + * @param userIds 抄送的用户编号 |
| 20 | + * @param taskId 流程任务编号 | ||
| 20 | */ | 21 | */ |
| 21 | - void createProcessInstanceCopy(Long userId, BpmProcessInstanceCopyCreateReqVO createReqVO); | 22 | + void createProcessInstanceCopy(Collection<Long> userIds, String taskId); |
| 22 | 23 | ||
| 23 | /** | 24 | /** |
| 24 | - * 抄送的流程的分页 | 25 | + * 获得抄送的流程的分页 |
| 26 | + * | ||
| 25 | * @param userId 当前登录用户 | 27 | * @param userId 当前登录用户 |
| 26 | * @param pageReqVO 分页请求 | 28 | * @param pageReqVO 分页请求 |
| 27 | * @return 抄送的分页结果 | 29 | * @return 抄送的分页结果 |
| 28 | */ | 30 | */ |
| 29 | - PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long userId, | ||
| 30 | - BpmProcessInstanceCopyMyPageReqVO pageReqVO); | 31 | + PageResult<BpmProcessInstanceCopyDO> getProcessInstanceCopyPage(Long userId, |
| 32 | + BpmProcessInstanceCopyPageReqVO pageReqVO); | ||
| 33 | + | ||
| 31 | } | 34 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/cc/BpmProcessInstanceCopyServiceImpl.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java
| 1 | -package cn.iocoder.yudao.module.bpm.service.task.cc; | 1 | +package cn.iocoder.yudao.module.bpm.service.task; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.util.ObjectUtil; | 3 | import cn.hutool.core.util.ObjectUtil; |
| 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.BpmProcessInstanceCopyCreateReqVO; | ||
| 6 | -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyMyPageReqVO; | 5 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO; |
| 7 | import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; | 6 | import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO; |
| 8 | import cn.iocoder.yudao.module.bpm.dal.mysql.cc.BpmProcessInstanceCopyMapper; | 7 | import cn.iocoder.yudao.module.bpm.dal.mysql.cc.BpmProcessInstanceCopyMapper; |
| 9 | import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants; | 8 | import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants; |
| 10 | -import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; | ||
| 11 | -import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; | 9 | +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; |
| 12 | import jakarta.annotation.Resource; | 10 | import jakarta.annotation.Resource; |
| 13 | import lombok.extern.slf4j.Slf4j; | 11 | import lombok.extern.slf4j.Slf4j; |
| 12 | +import org.flowable.engine.repository.ProcessDefinition; | ||
| 14 | import org.flowable.engine.runtime.ProcessInstance; | 13 | import org.flowable.engine.runtime.ProcessInstance; |
| 15 | import org.flowable.task.api.Task; | 14 | import org.flowable.task.api.Task; |
| 16 | import org.springframework.context.annotation.Lazy; | 15 | import org.springframework.context.annotation.Lazy; |
| 17 | import org.springframework.stereotype.Service; | 16 | import org.springframework.stereotype.Service; |
| 18 | import org.springframework.validation.annotation.Validated; | 17 | import org.springframework.validation.annotation.Validated; |
| 19 | 18 | ||
| 19 | +import java.util.Collection; | ||
| 20 | +import java.util.List; | ||
| 21 | + | ||
| 20 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 22 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 23 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | ||
| 21 | 24 | ||
| 22 | /** | 25 | /** |
| 23 | * 流程抄送 Service 实现类 | 26 | * 流程抄送 Service 实现类 |
| @@ -33,38 +36,47 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy | @@ -33,38 +36,47 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy | ||
| 33 | private BpmProcessInstanceCopyMapper processInstanceCopyMapper; | 36 | private BpmProcessInstanceCopyMapper processInstanceCopyMapper; |
| 34 | 37 | ||
| 35 | @Resource | 38 | @Resource |
| 36 | - @Lazy | ||
| 37 | - private BpmTaskService bpmTaskService; | 39 | + @Lazy // 延迟加载,避免循环依赖 |
| 40 | + private BpmTaskService taskService; | ||
| 41 | + | ||
| 42 | + @Resource | ||
| 43 | + @Lazy // 延迟加载,避免循环依赖 | ||
| 44 | + private BpmProcessInstanceService processInstanceService; | ||
| 38 | @Resource | 45 | @Resource |
| 39 | - @Lazy | ||
| 40 | - private BpmProcessInstanceService bpmProcessInstanceService; | 46 | + @Lazy // 延迟加载,避免循环依赖 |
| 47 | + private BpmProcessDefinitionService processDefinitionService; | ||
| 41 | 48 | ||
| 42 | @Override | 49 | @Override |
| 43 | - public void createProcessInstanceCopy(Long userId, BpmProcessInstanceCopyCreateReqVO reqVO) { | 50 | + public void createProcessInstanceCopy(Collection<Long> userIds, String taskId) { |
| 44 | // 1.1 校验任务存在 | 51 | // 1.1 校验任务存在 |
| 45 | - Task task = bpmTaskService.getTask(reqVO.getTaskId()); | 52 | + Task task = taskService.getTask(taskId); |
| 46 | if (ObjectUtil.isNull(task)) { | 53 | if (ObjectUtil.isNull(task)) { |
| 47 | throw exception(ErrorCodeConstants.TASK_NOT_EXISTS); | 54 | throw exception(ErrorCodeConstants.TASK_NOT_EXISTS); |
| 48 | } | 55 | } |
| 49 | - // 1.2 校验流程存在 | 56 | + // 1.2 校验流程实例存在 |
| 50 | String processInstanceId = task.getProcessInstanceId(); | 57 | String processInstanceId = task.getProcessInstanceId(); |
| 51 | - ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(processInstanceId); | 58 | + ProcessInstance processInstance = processInstanceService.getProcessInstance(processInstanceId); |
| 52 | if (processInstance == null) { | 59 | if (processInstance == null) { |
| 53 | - log.warn("[createProcessInstanceCopy][任务({}) 对应的流程不存在]", reqVO.getTaskId()); | ||
| 54 | throw exception(ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS); | 60 | throw exception(ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS); |
| 55 | } | 61 | } |
| 62 | + // 1.3 校验流程定义存在 | ||
| 63 | + ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( | ||
| 64 | + processInstance.getProcessDefinitionId()); | ||
| 65 | + if (processDefinition == null) { | ||
| 66 | + throw exception(ErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS); | ||
| 67 | + } | ||
| 56 | 68 | ||
| 57 | // 2. 创建抄送流程 | 69 | // 2. 创建抄送流程 |
| 58 | - BpmProcessInstanceCopyDO copy = new BpmProcessInstanceCopyDO() | ||
| 59 | - .setTaskId(reqVO.getTaskId()).setTaskName(task.getName()) | ||
| 60 | - .setProcessInstanceId(processInstanceId).setStartUserId(Long.valueOf(processInstance.getStartUserId())) | ||
| 61 | - .setProcessInstanceName(processInstance.getName()).setCategory(processInstance.getProcessDefinitionCategory()) | ||
| 62 | - .setReason(reqVO.getReason()); | ||
| 63 | - processInstanceCopyMapper.insert(copy); | 70 | + List<BpmProcessInstanceCopyDO> copyList = convertList(userIds, userId -> new BpmProcessInstanceCopyDO() |
| 71 | + .setUserId(userId).setStartUserId(Long.valueOf(processInstance.getStartUserId())) | ||
| 72 | + .setProcessInstanceId(processInstanceId).setProcessInstanceName(processInstance.getName()) | ||
| 73 | + .setCategory(processDefinition.getCategory()).setTaskId(taskId).setTaskName(task.getName())); | ||
| 74 | + processInstanceCopyMapper.insertBatch(copyList); | ||
| 64 | } | 75 | } |
| 65 | 76 | ||
| 66 | @Override | 77 | @Override |
| 67 | - public PageResult<BpmProcessInstanceCopyDO> getMyProcessInstanceCopyPage(Long userId, BpmProcessInstanceCopyMyPageReqVO pageReqVO) { | 78 | + public PageResult<BpmProcessInstanceCopyDO> getProcessInstanceCopyPage(Long userId, |
| 79 | + BpmProcessInstanceCopyPageReqVO pageReqVO) { | ||
| 68 | return processInstanceCopyMapper.selectPage(userId, pageReqVO); | 80 | return processInstanceCopyMapper.selectPage(userId, pageReqVO); |
| 69 | } | 81 | } |
| 70 | 82 |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
| @@ -68,10 +68,14 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -68,10 +68,14 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 68 | private HistoryService historyService; | 68 | private HistoryService historyService; |
| 69 | @Resource | 69 | @Resource |
| 70 | private RuntimeService runtimeService; | 70 | private RuntimeService runtimeService; |
| 71 | + @Resource | ||
| 72 | + private ManagementService managementService; | ||
| 71 | 73 | ||
| 72 | @Resource | 74 | @Resource |
| 73 | private BpmProcessInstanceService processInstanceService; | 75 | private BpmProcessInstanceService processInstanceService; |
| 74 | @Resource | 76 | @Resource |
| 77 | + private BpmProcessInstanceCopyService processInstanceCopyService; | ||
| 78 | + @Resource | ||
| 75 | private BpmModelService bpmModelService; | 79 | private BpmModelService bpmModelService; |
| 76 | @Resource | 80 | @Resource |
| 77 | private BpmMessageService messageService; | 81 | private BpmMessageService messageService; |
| @@ -79,12 +83,12 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -79,12 +83,12 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 79 | @Resource | 83 | @Resource |
| 80 | private AdminUserApi adminUserApi; | 84 | private AdminUserApi adminUserApi; |
| 81 | 85 | ||
| 82 | - @Resource | ||
| 83 | - private ManagementService managementService; | ||
| 84 | - | ||
| 85 | @Override | 86 | @Override |
| 86 | public PageResult<Task> getTodoTaskPage(Long userId, BpmTaskPageReqVO pageVO) { | 87 | public PageResult<Task> getTodoTaskPage(Long userId, BpmTaskPageReqVO pageVO) { |
| 87 | - TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(String.valueOf(userId)) // 分配给自己 | 88 | + TaskQuery taskQuery = taskService.createTaskQuery() |
| 89 | + .taskAssignee(String.valueOf(userId)) // 分配给自己 | ||
| 90 | + .active() | ||
| 91 | + .includeProcessVariables() | ||
| 88 | .orderByTaskCreateTime().desc(); // 创建时间倒序 | 92 | .orderByTaskCreateTime().desc(); // 创建时间倒序 |
| 89 | if (StrUtil.isNotBlank(pageVO.getName())) { | 93 | if (StrUtil.isNotBlank(pageVO.getName())) { |
| 90 | taskQuery.taskNameLike("%" + pageVO.getName() + "%"); | 94 | taskQuery.taskNameLike("%" + pageVO.getName() + "%"); |
| @@ -103,9 +107,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -103,9 +107,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 103 | 107 | ||
| 104 | @Override | 108 | @Override |
| 105 | public PageResult<HistoricTaskInstance> getDoneTaskPage(Long userId, BpmTaskPageReqVO pageVO) { | 109 | public PageResult<HistoricTaskInstance> getDoneTaskPage(Long userId, BpmTaskPageReqVO pageVO) { |
| 106 | - HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery().finished() // 已完成 | ||
| 107 | - .includeTaskLocalVariables() | 110 | + HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery() |
| 111 | + .finished() // 已完成 | ||
| 108 | .taskAssignee(String.valueOf(userId)) // 分配给自己 | 112 | .taskAssignee(String.valueOf(userId)) // 分配给自己 |
| 113 | + .includeTaskLocalVariables() | ||
| 109 | .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序 | 114 | .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序 |
| 110 | if (StrUtil.isNotBlank(pageVO.getName())) { | 115 | if (StrUtil.isNotBlank(pageVO.getName())) { |
| 111 | taskQuery.taskNameLike("%" + pageVO.getName() + "%"); | 116 | taskQuery.taskNameLike("%" + pageVO.getName() + "%"); |
| @@ -155,30 +160,34 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -155,30 +160,34 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 155 | throw exception(PROCESS_INSTANCE_NOT_EXISTS); | 160 | throw exception(PROCESS_INSTANCE_NOT_EXISTS); |
| 156 | } | 161 | } |
| 157 | 162 | ||
| 163 | + // 2. 抄送用户 | ||
| 164 | + if (CollUtil.isNotEmpty(reqVO.getCopyUserIds())) { | ||
| 165 | + processInstanceCopyService.createProcessInstanceCopy(reqVO.getCopyUserIds(), reqVO.getId()); | ||
| 166 | + } | ||
| 167 | + | ||
| 158 | // 情况一:被委派的任务,不调用 complete 去完成任务 | 168 | // 情况一:被委派的任务,不调用 complete 去完成任务 |
| 159 | if (DelegationState.PENDING.equals(task.getDelegationState())) { | 169 | if (DelegationState.PENDING.equals(task.getDelegationState())) { |
| 160 | approveDelegateTask(reqVO, task); | 170 | approveDelegateTask(reqVO, task); |
| 161 | return; | 171 | return; |
| 162 | } | 172 | } |
| 163 | 173 | ||
| 164 | - // 情况二:后加签的任务 | 174 | + // 情况二:审批有【后】加签的任务 |
| 165 | if (BpmTaskAddSignTypeEnum.AFTER.getType().equals(task.getScopeType())) { | 175 | if (BpmTaskAddSignTypeEnum.AFTER.getType().equals(task.getScopeType())) { |
| 166 | - // 后加签处理 | ||
| 167 | approveAfterSignTask(task, reqVO); | 176 | approveAfterSignTask(task, reqVO); |
| 168 | return; | 177 | return; |
| 169 | } | 178 | } |
| 170 | 179 | ||
| 171 | - // 情况三:自己审批的任务,调用 complete 去完成任务 | ||
| 172 | - // 完成任务,审批通过 | 180 | + // 情况三:审批普通的任务。大多数情况下,都是这样 |
| 181 | + // 更新流程任务 status 为审批通过 | ||
| 173 | updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.APPROVE.getResult()); | 182 | updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.APPROVE.getResult()); |
| 183 | + // 添加评论 | ||
| 184 | + taskService.addComment(task.getId(), task.getProcessInstanceId(), | ||
| 185 | + BpmCommentTypeEnum.APPROVE.getType(), reqVO.getReason()); | ||
| 186 | + // 调用 BPM complete 去完成任务 | ||
| 174 | taskService.complete(task.getId(), instance.getProcessVariables()); | 187 | taskService.complete(task.getId(), instance.getProcessVariables()); |
| 175 | -// // 更新任务拓展表为通过 | ||
| 176 | -// taskExtMapper.updateByTaskId( | ||
| 177 | -// new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()) | ||
| 178 | -// .setReason(reqVO.getReason())); | 188 | + |
| 179 | // 处理加签任务 | 189 | // 处理加签任务 |
| 180 | -// handleParentTask(task); | ||
| 181 | - handleParentTaskNew(task.getParentTaskId()); | 190 | + handleParentTaskIfSign(task.getParentTaskId()); |
| 182 | } | 191 | } |
| 183 | 192 | ||
| 184 | /** | 193 | /** |
| @@ -209,8 +218,15 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -209,8 +218,15 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 209 | // new BpmTaskExtDO().setResult(BpmProcessInstanceResultEnum.PROCESS.getResult())); | 218 | // new BpmTaskExtDO().setResult(BpmProcessInstanceResultEnum.PROCESS.getResult())); |
| 210 | } | 219 | } |
| 211 | 220 | ||
| 212 | - // TODO 芋艿:名字 | ||
| 213 | - private void handleParentTaskNew(String parentTaskId) { | 221 | + /** |
| 222 | + * 如果父任务是有前后【加签】的任务,如果它【加签】出来的子任务都被处理,需要处理父任务: | ||
| 223 | + * | ||
| 224 | + * 1. 如果是【向前】加签,则需要重新激活父任务,让它可以被审批 | ||
| 225 | + * 2. 如果是【向后】加签,则需要完成父任务,让它完成审批 | ||
| 226 | + * | ||
| 227 | + * @param parentTaskId 父任务编号 | ||
| 228 | + */ | ||
| 229 | + private void handleParentTaskIfSign(String parentTaskId) { | ||
| 214 | if (StrUtil.isBlank(parentTaskId)) { | 230 | if (StrUtil.isBlank(parentTaskId)) { |
| 215 | return; | 231 | return; |
| 216 | } | 232 | } |
| @@ -227,7 +243,9 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -227,7 +243,9 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 227 | } | 243 | } |
| 228 | 244 | ||
| 229 | // 2. 子任务已处理完成,清空 scopeType 字段,修改 parentTask 信息,方便后续可以继续向前后向后加签 | 245 | // 2. 子任务已处理完成,清空 scopeType 字段,修改 parentTask 信息,方便后续可以继续向前后向后加签 |
| 230 | - clearTaskScopeTypeAndSave(parentTask); | 246 | + TaskEntityImpl parentTaskImpl = (TaskEntityImpl) parentTask; |
| 247 | + parentTaskImpl.setScopeType(null); | ||
| 248 | + taskService.saveTask(parentTaskImpl); | ||
| 231 | 249 | ||
| 232 | // 3.1 情况一:处理向【向前】加签 | 250 | // 3.1 情况一:处理向【向前】加签 |
| 233 | if (BpmTaskAddSignTypeEnum.BEFORE.getType().equals(scopeType)) { | 251 | if (BpmTaskAddSignTypeEnum.BEFORE.getType().equals(scopeType)) { |
| @@ -243,18 +261,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -243,18 +261,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 243 | } | 261 | } |
| 244 | 262 | ||
| 245 | // 4. 递归处理父任务 | 263 | // 4. 递归处理父任务 |
| 246 | - handleParentTaskNew(parentTask.getParentTaskId()); | ||
| 247 | - } | ||
| 248 | - | ||
| 249 | - /** | ||
| 250 | - * 清空 scopeType 字段,用于任务没有子任务时使用该方法,方便任务可以再次被不同的方式加签 | ||
| 251 | - * | ||
| 252 | - * @param task 需要被清空的任务 | ||
| 253 | - */ | ||
| 254 | - private void clearTaskScopeTypeAndSave(Task task) { | ||
| 255 | - TaskEntityImpl taskImpl = (TaskEntityImpl) task; | ||
| 256 | - taskImpl.setScopeType(null); | ||
| 257 | - taskService.saveTask(task); | 264 | + handleParentTaskIfSign(parentTask.getParentTaskId()); |
| 258 | } | 265 | } |
| 259 | 266 | ||
| 260 | /** | 267 | /** |
| @@ -797,7 +804,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -797,7 +804,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 797 | BpmCommentTypeEnum.SUB_SIGN.getType().toString(), comment); | 804 | BpmCommentTypeEnum.SUB_SIGN.getType().toString(), comment); |
| 798 | 805 | ||
| 799 | // 4. 处理当前任务的父任务 | 806 | // 4. 处理当前任务的父任务 |
| 800 | - handleParentTaskNew(task.getParentTaskId()); | 807 | + handleParentTaskIfSign(task.getParentTaskId()); |
| 801 | } | 808 | } |
| 802 | 809 | ||
| 803 | /** | 810 | /** |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/cc/dto/BpmDelegateExecutionDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.bpm.service.task.cc.dto; | ||
| 2 | - | ||
| 3 | -import org.flowable.bpmn.model.FlowElement; | ||
| 4 | -import org.flowable.bpmn.model.FlowableListener; | ||
| 5 | -import org.flowable.engine.delegate.DelegateExecution; | ||
| 6 | -import org.flowable.engine.delegate.ReadOnlyDelegateExecution; | ||
| 7 | -import org.flowable.variable.api.persistence.entity.VariableInstance; | ||
| 8 | - | ||
| 9 | -import java.util.Collection; | ||
| 10 | -import java.util.List; | ||
| 11 | -import java.util.Map; | ||
| 12 | -import java.util.Set; | ||
| 13 | - | ||
| 14 | -/** | ||
| 15 | - * 仅为了传输processInstanceId | ||
| 16 | - */ | ||
| 17 | -public class BpmDelegateExecutionDTO implements DelegateExecution { | ||
| 18 | - | ||
| 19 | - public BpmDelegateExecutionDTO(String getProcessInstanceId) { | ||
| 20 | - this.getProcessInstanceId = getProcessInstanceId; | ||
| 21 | - } | ||
| 22 | - | ||
| 23 | - private final String getProcessInstanceId; | ||
| 24 | - | ||
| 25 | - @Override | ||
| 26 | - public String getId() { | ||
| 27 | - return null; | ||
| 28 | - } | ||
| 29 | - | ||
| 30 | - @Override | ||
| 31 | - public String getProcessInstanceId() { | ||
| 32 | - return null; | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - @Override | ||
| 36 | - public String getRootProcessInstanceId() { | ||
| 37 | - return null; | ||
| 38 | - } | ||
| 39 | - | ||
| 40 | - @Override | ||
| 41 | - public String getEventName() { | ||
| 42 | - return null; | ||
| 43 | - } | ||
| 44 | - | ||
| 45 | - @Override | ||
| 46 | - public void setEventName(String eventName) { | ||
| 47 | - | ||
| 48 | - } | ||
| 49 | - | ||
| 50 | - @Override | ||
| 51 | - public String getProcessInstanceBusinessKey() { | ||
| 52 | - return null; | ||
| 53 | - } | ||
| 54 | - | ||
| 55 | - @Override | ||
| 56 | - public String getProcessInstanceBusinessStatus() { | ||
| 57 | - return null; | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - @Override | ||
| 61 | - public String getProcessDefinitionId() { | ||
| 62 | - return null; | ||
| 63 | - } | ||
| 64 | - | ||
| 65 | - @Override | ||
| 66 | - public String getPropagatedStageInstanceId() { | ||
| 67 | - return null; | ||
| 68 | - } | ||
| 69 | - | ||
| 70 | - @Override | ||
| 71 | - public String getParentId() { | ||
| 72 | - return null; | ||
| 73 | - } | ||
| 74 | - | ||
| 75 | - @Override | ||
| 76 | - public String getSuperExecutionId() { | ||
| 77 | - return null; | ||
| 78 | - } | ||
| 79 | - | ||
| 80 | - @Override | ||
| 81 | - public String getCurrentActivityId() { | ||
| 82 | - return null; | ||
| 83 | - } | ||
| 84 | - | ||
| 85 | - @Override | ||
| 86 | - public String getTenantId() { | ||
| 87 | - return null; | ||
| 88 | - } | ||
| 89 | - | ||
| 90 | - @Override | ||
| 91 | - public FlowElement getCurrentFlowElement() { | ||
| 92 | - return null; | ||
| 93 | - } | ||
| 94 | - | ||
| 95 | - @Override | ||
| 96 | - public void setCurrentFlowElement(FlowElement flowElement) { | ||
| 97 | - | ||
| 98 | - } | ||
| 99 | - | ||
| 100 | - @Override | ||
| 101 | - public FlowableListener getCurrentFlowableListener() { | ||
| 102 | - return null; | ||
| 103 | - } | ||
| 104 | - | ||
| 105 | - @Override | ||
| 106 | - public void setCurrentFlowableListener(FlowableListener currentListener) { | ||
| 107 | - | ||
| 108 | - } | ||
| 109 | - | ||
| 110 | - @Override | ||
| 111 | - public ReadOnlyDelegateExecution snapshotReadOnly() { | ||
| 112 | - return null; | ||
| 113 | - } | ||
| 114 | - | ||
| 115 | - @Override | ||
| 116 | - public DelegateExecution getParent() { | ||
| 117 | - return null; | ||
| 118 | - } | ||
| 119 | - | ||
| 120 | - @Override | ||
| 121 | - public List<? extends DelegateExecution> getExecutions() { | ||
| 122 | - return null; | ||
| 123 | - } | ||
| 124 | - | ||
| 125 | - @Override | ||
| 126 | - public void setActive(boolean isActive) { | ||
| 127 | - | ||
| 128 | - } | ||
| 129 | - | ||
| 130 | - @Override | ||
| 131 | - public boolean isActive() { | ||
| 132 | - return false; | ||
| 133 | - } | ||
| 134 | - | ||
| 135 | - @Override | ||
| 136 | - public boolean isEnded() { | ||
| 137 | - return false; | ||
| 138 | - } | ||
| 139 | - | ||
| 140 | - @Override | ||
| 141 | - public void setConcurrent(boolean isConcurrent) { | ||
| 142 | - | ||
| 143 | - } | ||
| 144 | - | ||
| 145 | - @Override | ||
| 146 | - public boolean isConcurrent() { | ||
| 147 | - return false; | ||
| 148 | - } | ||
| 149 | - | ||
| 150 | - @Override | ||
| 151 | - public boolean isProcessInstanceType() { | ||
| 152 | - return false; | ||
| 153 | - } | ||
| 154 | - | ||
| 155 | - @Override | ||
| 156 | - public void inactivate() { | ||
| 157 | - | ||
| 158 | - } | ||
| 159 | - | ||
| 160 | - @Override | ||
| 161 | - public boolean isScope() { | ||
| 162 | - return false; | ||
| 163 | - } | ||
| 164 | - | ||
| 165 | - @Override | ||
| 166 | - public void setScope(boolean isScope) { | ||
| 167 | - | ||
| 168 | - } | ||
| 169 | - | ||
| 170 | - @Override | ||
| 171 | - public boolean isMultiInstanceRoot() { | ||
| 172 | - return false; | ||
| 173 | - } | ||
| 174 | - | ||
| 175 | - @Override | ||
| 176 | - public void setMultiInstanceRoot(boolean isMultiInstanceRoot) { | ||
| 177 | - | ||
| 178 | - } | ||
| 179 | - | ||
| 180 | - @Override | ||
| 181 | - public Map<String, Object> getVariables() { | ||
| 182 | - return null; | ||
| 183 | - } | ||
| 184 | - | ||
| 185 | - @Override | ||
| 186 | - public Map<String, VariableInstance> getVariableInstances() { | ||
| 187 | - return null; | ||
| 188 | - } | ||
| 189 | - | ||
| 190 | - @Override | ||
| 191 | - public Map<String, Object> getVariables(Collection<String> collection) { | ||
| 192 | - return null; | ||
| 193 | - } | ||
| 194 | - | ||
| 195 | - @Override | ||
| 196 | - public Map<String, VariableInstance> getVariableInstances(Collection<String> collection) { | ||
| 197 | - return null; | ||
| 198 | - } | ||
| 199 | - | ||
| 200 | - @Override | ||
| 201 | - public Map<String, Object> getVariables(Collection<String> collection, boolean b) { | ||
| 202 | - return null; | ||
| 203 | - } | ||
| 204 | - | ||
| 205 | - @Override | ||
| 206 | - public Map<String, VariableInstance> getVariableInstances(Collection<String> collection, boolean b) { | ||
| 207 | - return null; | ||
| 208 | - } | ||
| 209 | - | ||
| 210 | - @Override | ||
| 211 | - public Map<String, Object> getVariablesLocal() { | ||
| 212 | - return null; | ||
| 213 | - } | ||
| 214 | - | ||
| 215 | - @Override | ||
| 216 | - public Map<String, VariableInstance> getVariableInstancesLocal() { | ||
| 217 | - return null; | ||
| 218 | - } | ||
| 219 | - | ||
| 220 | - @Override | ||
| 221 | - public Map<String, Object> getVariablesLocal(Collection<String> collection) { | ||
| 222 | - return null; | ||
| 223 | - } | ||
| 224 | - | ||
| 225 | - @Override | ||
| 226 | - public Map<String, VariableInstance> getVariableInstancesLocal(Collection<String> collection) { | ||
| 227 | - return null; | ||
| 228 | - } | ||
| 229 | - | ||
| 230 | - @Override | ||
| 231 | - public Map<String, Object> getVariablesLocal(Collection<String> collection, boolean b) { | ||
| 232 | - return null; | ||
| 233 | - } | ||
| 234 | - | ||
| 235 | - @Override | ||
| 236 | - public Map<String, VariableInstance> getVariableInstancesLocal(Collection<String> collection, boolean b) { | ||
| 237 | - return null; | ||
| 238 | - } | ||
| 239 | - | ||
| 240 | - @Override | ||
| 241 | - public Object getVariable(String s) { | ||
| 242 | - return null; | ||
| 243 | - } | ||
| 244 | - | ||
| 245 | - @Override | ||
| 246 | - public VariableInstance getVariableInstance(String s) { | ||
| 247 | - return null; | ||
| 248 | - } | ||
| 249 | - | ||
| 250 | - @Override | ||
| 251 | - public Object getVariable(String s, boolean b) { | ||
| 252 | - return null; | ||
| 253 | - } | ||
| 254 | - | ||
| 255 | - @Override | ||
| 256 | - public VariableInstance getVariableInstance(String s, boolean b) { | ||
| 257 | - return null; | ||
| 258 | - } | ||
| 259 | - | ||
| 260 | - @Override | ||
| 261 | - public Object getVariableLocal(String s) { | ||
| 262 | - return null; | ||
| 263 | - } | ||
| 264 | - | ||
| 265 | - @Override | ||
| 266 | - public VariableInstance getVariableInstanceLocal(String s) { | ||
| 267 | - return null; | ||
| 268 | - } | ||
| 269 | - | ||
| 270 | - @Override | ||
| 271 | - public Object getVariableLocal(String s, boolean b) { | ||
| 272 | - return null; | ||
| 273 | - } | ||
| 274 | - | ||
| 275 | - @Override | ||
| 276 | - public VariableInstance getVariableInstanceLocal(String s, boolean b) { | ||
| 277 | - return null; | ||
| 278 | - } | ||
| 279 | - | ||
| 280 | - @Override | ||
| 281 | - public <T> T getVariable(String s, Class<T> aClass) { | ||
| 282 | - return null; | ||
| 283 | - } | ||
| 284 | - | ||
| 285 | - @Override | ||
| 286 | - public <T> T getVariableLocal(String s, Class<T> aClass) { | ||
| 287 | - return null; | ||
| 288 | - } | ||
| 289 | - | ||
| 290 | - @Override | ||
| 291 | - public Set<String> getVariableNames() { | ||
| 292 | - return null; | ||
| 293 | - } | ||
| 294 | - | ||
| 295 | - @Override | ||
| 296 | - public Set<String> getVariableNamesLocal() { | ||
| 297 | - return null; | ||
| 298 | - } | ||
| 299 | - | ||
| 300 | - @Override | ||
| 301 | - public void setVariable(String s, Object o) { | ||
| 302 | - | ||
| 303 | - } | ||
| 304 | - | ||
| 305 | - @Override | ||
| 306 | - public void setVariable(String s, Object o, boolean b) { | ||
| 307 | - | ||
| 308 | - } | ||
| 309 | - | ||
| 310 | - @Override | ||
| 311 | - public Object setVariableLocal(String s, Object o) { | ||
| 312 | - return null; | ||
| 313 | - } | ||
| 314 | - | ||
| 315 | - @Override | ||
| 316 | - public Object setVariableLocal(String s, Object o, boolean b) { | ||
| 317 | - return null; | ||
| 318 | - } | ||
| 319 | - | ||
| 320 | - @Override | ||
| 321 | - public void setVariables(Map<String, ?> map) { | ||
| 322 | - | ||
| 323 | - } | ||
| 324 | - | ||
| 325 | - @Override | ||
| 326 | - public void setVariablesLocal(Map<String, ?> map) { | ||
| 327 | - | ||
| 328 | - } | ||
| 329 | - | ||
| 330 | - @Override | ||
| 331 | - public boolean hasVariables() { | ||
| 332 | - return false; | ||
| 333 | - } | ||
| 334 | - | ||
| 335 | - @Override | ||
| 336 | - public boolean hasVariablesLocal() { | ||
| 337 | - return false; | ||
| 338 | - } | ||
| 339 | - | ||
| 340 | - @Override | ||
| 341 | - public boolean hasVariable(String s) { | ||
| 342 | - return false; | ||
| 343 | - } | ||
| 344 | - | ||
| 345 | - @Override | ||
| 346 | - public boolean hasVariableLocal(String s) { | ||
| 347 | - return false; | ||
| 348 | - } | ||
| 349 | - | ||
| 350 | - @Override | ||
| 351 | - public void removeVariable(String s) { | ||
| 352 | - | ||
| 353 | - } | ||
| 354 | - | ||
| 355 | - @Override | ||
| 356 | - public void removeVariableLocal(String s) { | ||
| 357 | - | ||
| 358 | - } | ||
| 359 | - | ||
| 360 | - @Override | ||
| 361 | - public void removeVariables(Collection<String> collection) { | ||
| 362 | - | ||
| 363 | - } | ||
| 364 | - | ||
| 365 | - @Override | ||
| 366 | - public void removeVariablesLocal(Collection<String> collection) { | ||
| 367 | - | ||
| 368 | - } | ||
| 369 | - | ||
| 370 | - @Override | ||
| 371 | - public void removeVariables() { | ||
| 372 | - | ||
| 373 | - } | ||
| 374 | - | ||
| 375 | - @Override | ||
| 376 | - public void removeVariablesLocal() { | ||
| 377 | - | ||
| 378 | - } | ||
| 379 | - | ||
| 380 | - @Override | ||
| 381 | - public void setTransientVariable(String s, Object o) { | ||
| 382 | - | ||
| 383 | - } | ||
| 384 | - | ||
| 385 | - @Override | ||
| 386 | - public void setTransientVariableLocal(String s, Object o) { | ||
| 387 | - | ||
| 388 | - } | ||
| 389 | - | ||
| 390 | - @Override | ||
| 391 | - public void setTransientVariables(Map<String, Object> map) { | ||
| 392 | - | ||
| 393 | - } | ||
| 394 | - | ||
| 395 | - @Override | ||
| 396 | - public Object getTransientVariable(String s) { | ||
| 397 | - return null; | ||
| 398 | - } | ||
| 399 | - | ||
| 400 | - @Override | ||
| 401 | - public Map<String, Object> getTransientVariables() { | ||
| 402 | - return null; | ||
| 403 | - } | ||
| 404 | - | ||
| 405 | - @Override | ||
| 406 | - public void setTransientVariablesLocal(Map<String, Object> map) { | ||
| 407 | - | ||
| 408 | - } | ||
| 409 | - | ||
| 410 | - @Override | ||
| 411 | - public Object getTransientVariableLocal(String s) { | ||
| 412 | - return null; | ||
| 413 | - } | ||
| 414 | - | ||
| 415 | - @Override | ||
| 416 | - public Map<String, Object> getTransientVariablesLocal() { | ||
| 417 | - return null; | ||
| 418 | - } | ||
| 419 | - | ||
| 420 | - @Override | ||
| 421 | - public void removeTransientVariableLocal(String s) { | ||
| 422 | - | ||
| 423 | - } | ||
| 424 | - | ||
| 425 | - @Override | ||
| 426 | - public void removeTransientVariable(String s) { | ||
| 427 | - | ||
| 428 | - } | ||
| 429 | - | ||
| 430 | - @Override | ||
| 431 | - public void removeTransientVariables() { | ||
| 432 | - | ||
| 433 | - } | ||
| 434 | - | ||
| 435 | - @Override | ||
| 436 | - public void removeTransientVariablesLocal() { | ||
| 437 | - | ||
| 438 | - } | ||
| 439 | -} |