Commit d40fa0f929224e0eb2ac55236d651487cccf6318
1 parent
7967a2a1
BPM:流程任务的 `status` 状态实现,使用 Flowable 的 `variables` 存储,移除 `bpm_task_ext` 表
Showing
15 changed files
with
262 additions
and
300 deletions
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
| @@ -55,12 +55,8 @@ public interface ErrorCodeConstants { | @@ -55,12 +55,8 @@ public interface ErrorCodeConstants { | ||
| 55 | ErrorCode TASK_ADD_SIGN_USER_REPEAT = new ErrorCode(1_009_005_011, "任务加签失败,加签人与现有审批人[{}]重复"); | 55 | ErrorCode TASK_ADD_SIGN_USER_REPEAT = new ErrorCode(1_009_005_011, "任务加签失败,加签人与现有审批人[{}]重复"); |
| 56 | ErrorCode TASK_SUB_SIGN_NO_PARENT = new ErrorCode(1_009_005_011, "任务减签失败,被减签的任务必须是通过加签生成的任务"); | 56 | ErrorCode TASK_SUB_SIGN_NO_PARENT = new ErrorCode(1_009_005_011, "任务减签失败,被减签的任务必须是通过加签生成的任务"); |
| 57 | 57 | ||
| 58 | - // ========== 流程任务分配规则 1-009-006-000 ========== | ||
| 59 | - ErrorCode TASK_ASSIGN_RULE_EXISTS = new ErrorCode(1_009_006_000, "流程({}) 的任务({}) 已经存在分配规则"); | ||
| 60 | - ErrorCode TASK_ASSIGN_RULE_NOT_EXISTS = new ErrorCode(1_009_006_001, "流程任务分配规则不存在"); | ||
| 61 | - ErrorCode TASK_UPDATE_FAIL_NOT_MODEL = new ErrorCode(1_009_006_002, "只有流程模型的任务分配规则,才允许被修改"); | 58 | + // ========== 流程任务分配规则 1-009-006-000 TODO 芋艿:这里要改下 ========== |
| 62 | ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!"); | 59 | ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!"); |
| 63 | - ErrorCode TASK_ASSIGN_SCRIPT_NOT_EXISTS = new ErrorCode(1_009_006_004, "操作失败,原因:任务分配脚本({}) 不存在"); | ||
| 64 | 60 | ||
| 65 | // ========== 动态表单模块 1-009-010-000 ========== | 61 | // ========== 动态表单模块 1-009-010-000 ========== |
| 66 | ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在"); | 62 | ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在"); |
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java
| @@ -4,9 +4,6 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | @@ -4,9 +4,6 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | ||
| 4 | import lombok.AllArgsConstructor; | 4 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Getter; | 5 | import lombok.Getter; |
| 6 | 6 | ||
| 7 | -import java.util.Arrays; | ||
| 8 | -import java.util.List; | ||
| 9 | - | ||
| 10 | /** | 7 | /** |
| 11 | * 流程实例的结果 | 8 | * 流程实例的结果 |
| 12 | * | 9 | * |
| @@ -16,38 +13,34 @@ import java.util.List; | @@ -16,38 +13,34 @@ import java.util.List; | ||
| 16 | @AllArgsConstructor | 13 | @AllArgsConstructor |
| 17 | public enum BpmProcessInstanceResultEnum { | 14 | public enum BpmProcessInstanceResultEnum { |
| 18 | 15 | ||
| 19 | - PROCESS(1, "处理中"), | ||
| 20 | - APPROVE(2, "通过"), | ||
| 21 | - REJECT(3, "不通过"), | 16 | + RUNNING(1, "审批中"), |
| 17 | + APPROVE(2, "审批通过"), | ||
| 18 | + REJECT(3, "审批不通过"), | ||
| 22 | CANCEL(4, "已取消"), | 19 | CANCEL(4, "已取消"), |
| 23 | 20 | ||
| 24 | // ========== 流程任务独有的状态 ========== | 21 | // ========== 流程任务独有的状态 ========== |
| 25 | 22 | ||
| 26 | - BACK(5, "驳回"), // 退回 | ||
| 27 | - DELEGATE(6, "委派"), | 23 | + BACK(5, "已驳回"), // 退回 |
| 24 | + DELEGATE(6, "委派中"), | ||
| 25 | + | ||
| 28 | /** | 26 | /** |
| 29 | * 【加签】源任务已经审批完成,但是它使用了后加签,后加签的任务未完成,源任务就会是这个状态 | 27 | * 【加签】源任务已经审批完成,但是它使用了后加签,后加签的任务未完成,源任务就会是这个状态 |
| 30 | * 相当于是 通过 APPROVE 的特殊状态 | 28 | * 相当于是 通过 APPROVE 的特殊状态 |
| 31 | - * 例如:A审批, A 后加签了 B,并且审批通过了任务,但是 B 还未审批,则当前任务状态为“待后加签任务完成” | 29 | + * 例如:A 审批,A 后加签了 B,并且审批通过了任务,但是 B 还未审批,则当前任务状态为“待后加签任务完成” |
| 32 | */ | 30 | */ |
| 33 | - SIGN_AFTER(7, "待后加签任务完成"), | 31 | + APPROVING(7, "审批通过中"), |
| 34 | /** | 32 | /** |
| 35 | * 【加签】源任务未审批,但是向前加签了,所以源任务状态变为“待前加签任务完成” | 33 | * 【加签】源任务未审批,但是向前加签了,所以源任务状态变为“待前加签任务完成” |
| 36 | * 相当于是 处理中 PROCESS 的特殊状态 | 34 | * 相当于是 处理中 PROCESS 的特殊状态 |
| 37 | - * 例如:A 审批, A 前加签了 B,B 还未审核 | ||
| 38 | - */ | ||
| 39 | - SIGN_BEFORE(8, "待前加签任务完成"), | ||
| 40 | - /** | ||
| 41 | - * 【加签】后加签任务被创建时的初始状态 | ||
| 42 | - * 相当于是 处理中 PROCESS 的特殊状态 | ||
| 43 | - * 因为需要源任务先完成,才能到后加签的人来审批,所以加了一个状态区分 | ||
| 44 | - */ | ||
| 45 | - WAIT_BEFORE_TASK(9, "待前置任务完成"); | ||
| 46 | - | ||
| 47 | - /** | ||
| 48 | - * 能被减签的状态 | 35 | + * 例如:A 审批,A 前加签了 B,B 还未审核 |
| 49 | */ | 36 | */ |
| 50 | - public static final List<Integer> CAN_SUB_SIGN_STATUS_LIST = Arrays.asList(PROCESS.result, WAIT_BEFORE_TASK.result); | 37 | + WAIT(0, "待审批"); |
| 38 | +// /** | ||
| 39 | +// * 【加签】后加签任务被创建时的初始状态 | ||
| 40 | +// * 相当于是 处理中 PROCESS 的特殊状态 | ||
| 41 | +// * 因为需要源任务先完成,才能到后加签的人来审批,所以加了一个状态区分 | ||
| 42 | +// */ | ||
| 43 | +// WAIT_BEFORE_TASK(9, "处理中【待前置任务完成】"); | ||
| 51 | 44 | ||
| 52 | /** | 45 | /** |
| 53 | * 结果 | 46 | * 结果 |
| @@ -69,9 +62,9 @@ public enum BpmProcessInstanceResultEnum { | @@ -69,9 +62,9 @@ public enum BpmProcessInstanceResultEnum { | ||
| 69 | * @return 是否 | 62 | * @return 是否 |
| 70 | */ | 63 | */ |
| 71 | public static boolean isEndResult(Integer result) { | 64 | public static boolean isEndResult(Integer result) { |
| 72 | - return ObjectUtils.equalsAny(result, APPROVE.getResult(), REJECT.getResult(), | ||
| 73 | - CANCEL.getResult(), BACK.getResult(), | ||
| 74 | - SIGN_AFTER.getResult()); | 65 | + return ObjectUtils.equalsAny(result, |
| 66 | + APPROVE.getResult(), REJECT.getResult(), CANCEL.getResult(), | ||
| 67 | + BACK.getResult(), APPROVING.getResult()); | ||
| 75 | } | 68 | } |
| 76 | 69 | ||
| 77 | } | 70 | } |
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java
| @@ -12,9 +12,9 @@ import lombok.Getter; | @@ -12,9 +12,9 @@ import lombok.Getter; | ||
| 12 | @AllArgsConstructor | 12 | @AllArgsConstructor |
| 13 | public enum BpmProcessInstanceStatusEnum { | 13 | public enum BpmProcessInstanceStatusEnum { |
| 14 | 14 | ||
| 15 | - RUNNING(1, "进行中"), | ||
| 16 | - APPROVE(2, "通过"), | ||
| 17 | - REJECT(3, "不通过"), | 15 | + RUNNING(1, "审批中"), |
| 16 | + APPROVE(2, "审批通过"), | ||
| 17 | + REJECT(3, "审批不通过"), | ||
| 18 | CANCEL(4, "已取消"); | 18 | CANCEL(4, "已取消"); |
| 19 | 19 | ||
| 20 | /** | 20 | /** |
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmTaskAddSignTypeEnum.java
| @@ -17,15 +17,11 @@ public enum BpmTaskAddSignTypeEnum { | @@ -17,15 +17,11 @@ public enum BpmTaskAddSignTypeEnum { | ||
| 17 | /** | 17 | /** |
| 18 | * 向后加签,需要后置任务全部审批完,才会通过原审批人节点 | 18 | * 向后加签,需要后置任务全部审批完,才会通过原审批人节点 |
| 19 | */ | 19 | */ |
| 20 | - AFTER("after", "向后加签"), | ||
| 21 | - /** | ||
| 22 | - * 创建后置加签时的过度状态,用于控制向后加签生成的任务状态 | ||
| 23 | - */ | ||
| 24 | - AFTER_CHILDREN_TASK("afterChildrenTask", "向后加签生成的子任务"); | 20 | + AFTER("after", "向后加签"); |
| 25 | 21 | ||
| 26 | private final String type; | 22 | private final String type; |
| 27 | 23 | ||
| 28 | - private final String desc; | 24 | + private final String desc; // TODO 芋艿:desc |
| 29 | 25 | ||
| 30 | public static String formatDesc(String type) { | 26 | public static String formatDesc(String type) { |
| 31 | for (BpmTaskAddSignTypeEnum value : values()) { | 27 | for (BpmTaskAddSignTypeEnum value : values()) { |
| @@ -37,4 +33,3 @@ public enum BpmTaskAddSignTypeEnum { | @@ -37,4 +33,3 @@ public enum BpmTaskAddSignTypeEnum { | ||
| 37 | } | 33 | } |
| 38 | 34 | ||
| 39 | } | 35 | } |
| 40 | - | ||
| 41 | \ No newline at end of file | 36 | \ No newline at end of file |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskDonePageItemRespVO.java
| @@ -18,8 +18,9 @@ public class BpmTaskDonePageItemRespVO extends BpmTaskTodoPageItemRespVO { | @@ -18,8 +18,9 @@ public class BpmTaskDonePageItemRespVO extends BpmTaskTodoPageItemRespVO { | ||
| 18 | @Schema(description = "持续时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") | 18 | @Schema(description = "持续时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") |
| 19 | private Long durationInMillis; | 19 | private Long durationInMillis; |
| 20 | 20 | ||
| 21 | - @Schema(description = "任务结果-参见 bpm_process_instance_result", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | ||
| 22 | - private Integer result; | 21 | + @Schema(description = "任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") |
| 22 | + private Integer status; // 参见 BpmProcessInstanceResultEnum 枚举 | ||
| 23 | + | ||
| 23 | @Schema(description = "审批建议", requiredMode = Schema.RequiredMode.REQUIRED, example = "不请假了!") | 24 | @Schema(description = "审批建议", requiredMode = Schema.RequiredMode.REQUIRED, example = "不请假了!") |
| 24 | private String reason; | 25 | private String reason; |
| 25 | 26 |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskSubSignRespVO.java
| @@ -6,10 +6,14 @@ import lombok.Data; | @@ -6,10 +6,14 @@ import lombok.Data; | ||
| 6 | @Schema(description = "管理后台 - 减签流程任务的 Response VO") | 6 | @Schema(description = "管理后台 - 减签流程任务的 Response VO") |
| 7 | @Data | 7 | @Data |
| 8 | public class BpmTaskSubSignRespVO { | 8 | public class BpmTaskSubSignRespVO { |
| 9 | + | ||
| 9 | @Schema(description = "审核的用户信息", requiredMode = Schema.RequiredMode.REQUIRED, example = "小李") | 10 | @Schema(description = "审核的用户信息", requiredMode = Schema.RequiredMode.REQUIRED, example = "小李") |
| 10 | private BpmTaskRespVO.User assigneeUser; | 11 | private BpmTaskRespVO.User assigneeUser; |
| 12 | + | ||
| 11 | @Schema(description = "任务 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12312") | 13 | @Schema(description = "任务 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12312") |
| 12 | private String id; | 14 | private String id; |
| 15 | + | ||
| 13 | @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "经理审批") | 16 | @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "经理审批") |
| 14 | private String name; | 17 | private String name; |
| 18 | + | ||
| 15 | } | 19 | } |
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.date.LocalDateTimeUtil; | ||
| 4 | import cn.hutool.core.util.ObjectUtil; | 3 | import cn.hutool.core.util.ObjectUtil; |
| 5 | import cn.hutool.core.util.StrUtil; | 4 | import cn.hutool.core.util.StrUtil; |
| 6 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| @@ -8,7 +7,7 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | @@ -8,7 +7,7 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | ||
| 8 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; | 7 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; |
| 9 | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | 8 | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; |
| 10 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; | 9 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; |
| 11 | -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; | 10 | +import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants; |
| 12 | import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; | 11 | import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; |
| 13 | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; | 12 | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| 14 | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | 13 | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| @@ -19,7 +18,10 @@ import org.flowable.engine.runtime.ProcessInstance; | @@ -19,7 +18,10 @@ import org.flowable.engine.runtime.ProcessInstance; | ||
| 19 | import org.flowable.task.api.Task; | 18 | import org.flowable.task.api.Task; |
| 20 | import org.flowable.task.api.history.HistoricTaskInstance; | 19 | import org.flowable.task.api.history.HistoricTaskInstance; |
| 21 | import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; | 20 | import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; |
| 22 | -import org.mapstruct.*; | 21 | +import org.mapstruct.Mapper; |
| 22 | +import org.mapstruct.Mapping; | ||
| 23 | +import org.mapstruct.Mappings; | ||
| 24 | +import org.mapstruct.Named; | ||
| 23 | import org.mapstruct.factory.Mappers; | 25 | import org.mapstruct.factory.Mappers; |
| 24 | 26 | ||
| 25 | import java.util.Date; | 27 | import java.util.Date; |
| @@ -62,12 +64,12 @@ public interface BpmTaskConvert { | @@ -62,12 +64,12 @@ public interface BpmTaskConvert { | ||
| 62 | } | 64 | } |
| 63 | 65 | ||
| 64 | default List<BpmTaskDonePageItemRespVO> convertList2(List<HistoricTaskInstance> tasks, | 66 | default List<BpmTaskDonePageItemRespVO> convertList2(List<HistoricTaskInstance> tasks, |
| 65 | - Map<String, BpmTaskExtDO> bpmTaskExtDOMap, Map<String, HistoricProcessInstance> historicProcessInstanceMap, | 67 | + Map<String, HistoricProcessInstance> historicProcessInstanceMap, |
| 66 | Map<Long, AdminUserRespDTO> userMap) { | 68 | Map<Long, AdminUserRespDTO> userMap) { |
| 67 | return CollectionUtils.convertList(tasks, task -> { | 69 | return CollectionUtils.convertList(tasks, task -> { |
| 68 | BpmTaskDonePageItemRespVO respVO = convert2(task); | 70 | BpmTaskDonePageItemRespVO respVO = convert2(task); |
| 69 | - BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); | ||
| 70 | - copyTo(taskExtDO, respVO); | 71 | + respVO.setStatus((Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS)); |
| 72 | + // 流程实例 | ||
| 71 | HistoricProcessInstance processInstance = historicProcessInstanceMap.get(task.getProcessInstanceId()); | 73 | HistoricProcessInstance processInstance = historicProcessInstanceMap.get(task.getProcessInstanceId()); |
| 72 | if (processInstance != null) { | 74 | if (processInstance != null) { |
| 73 | AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); | 75 | AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); |
| @@ -89,12 +91,12 @@ public interface BpmTaskConvert { | @@ -89,12 +91,12 @@ public interface BpmTaskConvert { | ||
| 89 | BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, AdminUserRespDTO startUser); | 91 | BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, AdminUserRespDTO startUser); |
| 90 | 92 | ||
| 91 | default List<BpmTaskRespVO> convertList3(List<HistoricTaskInstance> tasks, | 93 | default List<BpmTaskRespVO> convertList3(List<HistoricTaskInstance> tasks, |
| 92 | - Map<String, BpmTaskExtDO> bpmTaskExtDOMap, HistoricProcessInstance processInstance, | 94 | + HistoricProcessInstance processInstance, |
| 93 | Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) { | 95 | Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) { |
| 94 | return CollectionUtils.convertList(tasks, task -> { | 96 | return CollectionUtils.convertList(tasks, task -> { |
| 95 | BpmTaskRespVO respVO = convert3(task); | 97 | BpmTaskRespVO respVO = convert3(task); |
| 96 | - BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); | ||
| 97 | - copyTo(taskExtDO, respVO); | 98 | + respVO.setStatus((Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS)); |
| 99 | + // 流程实例 | ||
| 98 | if (processInstance != null) { | 100 | if (processInstance != null) { |
| 99 | AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); | 101 | AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); |
| 100 | respVO.setProcessInstance(convert(processInstance, startUser)); | 102 | respVO.setProcessInstance(convert(processInstance, startUser)); |
| @@ -116,9 +118,6 @@ public interface BpmTaskConvert { | @@ -116,9 +118,6 @@ public interface BpmTaskConvert { | ||
| 116 | 118 | ||
| 117 | BpmTaskRespVO.User convert3(AdminUserRespDTO bean); | 119 | BpmTaskRespVO.User convert3(AdminUserRespDTO bean); |
| 118 | 120 | ||
| 119 | - @Mapping(target = "id", ignore = true) | ||
| 120 | - void copyTo(BpmTaskExtDO from, @MappingTarget BpmTaskDonePageItemRespVO to); | ||
| 121 | - | ||
| 122 | @Mappings({@Mapping(source = "processInstance.id", target = "id"), | 121 | @Mappings({@Mapping(source = "processInstance.id", target = "id"), |
| 123 | @Mapping(source = "processInstance.name", target = "name"), | 122 | @Mapping(source = "processInstance.name", target = "name"), |
| 124 | @Mapping(source = "processInstance.startUserId", target = "startUserId"), | 123 | @Mapping(source = "processInstance.startUserId", target = "startUserId"), |
| @@ -127,14 +126,6 @@ public interface BpmTaskConvert { | @@ -127,14 +126,6 @@ public interface BpmTaskConvert { | ||
| 127 | BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, | 126 | BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, |
| 128 | AdminUserRespDTO startUser); | 127 | AdminUserRespDTO startUser); |
| 129 | 128 | ||
| 130 | - default BpmTaskExtDO convert2TaskExt(Task task) { | ||
| 131 | - BpmTaskExtDO taskExtDO = new BpmTaskExtDO().setTaskId(task.getId()) | ||
| 132 | - .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())).setName(task.getName()) | ||
| 133 | - .setProcessDefinitionId(task.getProcessDefinitionId()).setProcessInstanceId(task.getProcessInstanceId()); | ||
| 134 | - taskExtDO.setCreateTime(LocalDateTimeUtil.of(task.getCreateTime())); | ||
| 135 | - return taskExtDO; | ||
| 136 | - } | ||
| 137 | - | ||
| 138 | default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, | 129 | default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, |
| 139 | Task task) { | 130 | Task task) { |
| 140 | BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); | 131 | BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); |
| @@ -161,6 +152,7 @@ public interface BpmTaskConvert { | @@ -161,6 +152,7 @@ public interface BpmTaskConvert { | ||
| 161 | task.setParentTaskId(parentTask.getId()); | 152 | task.setParentTaskId(parentTask.getId()); |
| 162 | task.setProcessDefinitionId(parentTask.getProcessDefinitionId()); | 153 | task.setProcessDefinitionId(parentTask.getProcessDefinitionId()); |
| 163 | task.setProcessInstanceId(parentTask.getProcessInstanceId()); | 154 | task.setProcessInstanceId(parentTask.getProcessInstanceId()); |
| 155 | +// task.setExecutionId(parentTask.getExecutionId()); // TODO 芋艿:新加的,不太确定;尴尬,不加时,子任务不通过会失败(报错);加了,子任务审批通过会失败(报错) | ||
| 164 | task.setTaskDefinitionKey(parentTask.getTaskDefinitionKey()); | 156 | task.setTaskDefinitionKey(parentTask.getTaskDefinitionKey()); |
| 165 | task.setTaskDefinitionId(parentTask.getTaskDefinitionId()); | 157 | task.setTaskDefinitionId(parentTask.getTaskDefinitionId()); |
| 166 | task.setPriority(parentTask.getPriority()); | 158 | task.setPriority(parentTask.getPriority()); |
| @@ -168,15 +160,14 @@ public interface BpmTaskConvert { | @@ -168,15 +160,14 @@ public interface BpmTaskConvert { | ||
| 168 | return task; | 160 | return task; |
| 169 | } | 161 | } |
| 170 | 162 | ||
| 171 | - default List<BpmTaskSubSignRespVO> convertList(List<BpmTaskExtDO> bpmTaskExtDOList, | ||
| 172 | - Map<Long, AdminUserRespDTO> userMap, | ||
| 173 | - Map<String, Task> idTaskMap){ | 163 | + default List<BpmTaskSubSignRespVO> convertList(List<Task> bpmTaskExtDOList, |
| 164 | + Map<Long, AdminUserRespDTO> userMap){ | ||
| 174 | return CollectionUtils.convertList(bpmTaskExtDOList, task -> { | 165 | return CollectionUtils.convertList(bpmTaskExtDOList, task -> { |
| 175 | BpmTaskSubSignRespVO bpmTaskSubSignRespVO = new BpmTaskSubSignRespVO() | 166 | BpmTaskSubSignRespVO bpmTaskSubSignRespVO = new BpmTaskSubSignRespVO() |
| 176 | - .setId(task.getTaskId()).setName(task.getName()); | 167 | + .setId(task.getId()).setName(task.getName()); |
| 177 | // 后加签任务不会直接设置 assignee ,所以不存在 assignee 的情况,则去取 owner | 168 | // 后加签任务不会直接设置 assignee ,所以不存在 assignee 的情况,则去取 owner |
| 178 | - Task sourceTask = idTaskMap.get(task.getTaskId()); | ||
| 179 | - String assignee = ObjectUtil.defaultIfBlank(sourceTask.getOwner(),sourceTask.getAssignee()); | 169 | +// Task sourceTask = idTaskMap.get(task.getTaskId()); |
| 170 | + String assignee = ObjectUtil.defaultIfBlank(task.getOwner(), task.getAssignee()); | ||
| 180 | MapUtils.findAndThen(userMap,NumberUtils.parseLong(assignee), | 171 | MapUtils.findAndThen(userMap,NumberUtils.parseLong(assignee), |
| 181 | assignUser-> bpmTaskSubSignRespVO.setAssigneeUser(convert3(assignUser))); | 172 | assignUser-> bpmTaskSubSignRespVO.setAssigneeUser(convert3(assignUser))); |
| 182 | return bpmTaskSubSignRespVO; | 173 | return bpmTaskSubSignRespVO; |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmTaskExtDO.java
| @@ -20,6 +20,7 @@ import java.time.LocalDateTime; | @@ -20,6 +20,7 @@ import java.time.LocalDateTime; | ||
| 20 | @Data | 20 | @Data |
| 21 | @EqualsAndHashCode(callSuper = true) | 21 | @EqualsAndHashCode(callSuper = true) |
| 22 | @ToString(callSuper = true) | 22 | @ToString(callSuper = true) |
| 23 | +@Deprecated | ||
| 23 | public class BpmTaskExtDO extends BaseDO { | 24 | public class BpmTaskExtDO extends BaseDO { |
| 24 | 25 | ||
| 25 | /** | 26 | /** |
| @@ -61,6 +62,7 @@ public class BpmTaskExtDO extends BaseDO { | @@ -61,6 +62,7 @@ public class BpmTaskExtDO extends BaseDO { | ||
| 61 | /** | 62 | /** |
| 62 | * 审批建议 | 63 | * 审批建议 |
| 63 | */ | 64 | */ |
| 65 | + @Deprecated | ||
| 64 | private String reason; | 66 | private String reason; |
| 65 | /** | 67 | /** |
| 66 | * 任务的结束时间 | 68 | * 任务的结束时间 |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java
| 1 | package cn.iocoder.yudao.module.bpm.dal.mysql.task; | 1 | package cn.iocoder.yudao.module.bpm.dal.mysql.task; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||
| 5 | import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; | 4 | import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; |
| 6 | -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; | ||
| 7 | -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
| 8 | import org.apache.ibatis.annotations.Mapper; | 5 | import org.apache.ibatis.annotations.Mapper; |
| 9 | 6 | ||
| 10 | -import java.util.Collection; | ||
| 11 | -import java.util.List; | ||
| 12 | - | ||
| 13 | @Mapper | 7 | @Mapper |
| 14 | public interface BpmTaskExtMapper extends BaseMapperX<BpmTaskExtDO> { | 8 | public interface BpmTaskExtMapper extends BaseMapperX<BpmTaskExtDO> { |
| 15 | 9 | ||
| 16 | - default void updateByTaskId(BpmTaskExtDO entity) { | ||
| 17 | - update(entity, new LambdaQueryWrapper<BpmTaskExtDO>().eq(BpmTaskExtDO::getTaskId, entity.getTaskId())); | ||
| 18 | - } | 10 | +// default void updateByTaskId(BpmTaskExtDO entity) { |
| 11 | +// update(entity, new LambdaQueryWrapper<BpmTaskExtDO>().eq(BpmTaskExtDO::getTaskId, entity.getTaskId())); | ||
| 12 | +// } | ||
| 19 | 13 | ||
| 20 | - default List<BpmTaskExtDO> selectListByTaskIds(Collection<String> taskIds) { | ||
| 21 | - return selectList(BpmTaskExtDO::getTaskId, taskIds); | ||
| 22 | - } | 14 | +// default List<BpmTaskExtDO> selectListByTaskIds(Collection<String> taskIds) { |
| 15 | +// return selectList(BpmTaskExtDO::getTaskId, taskIds); | ||
| 16 | +// } | ||
| 23 | 17 | ||
| 24 | // TODO @海:BpmProcessInstanceResultEnum.CAN_SUB_SIGN_STATUS_LIST) 应该作为条件,mapper 不要有业务 | 18 | // TODO @海:BpmProcessInstanceResultEnum.CAN_SUB_SIGN_STATUS_LIST) 应该作为条件,mapper 不要有业务 |
| 25 | - default List<BpmTaskExtDO> selectProcessListByTaskIds(Collection<String> taskIds) { | ||
| 26 | - return selectList(new LambdaQueryWrapperX<BpmTaskExtDO>() | ||
| 27 | - .in(BpmTaskExtDO::getTaskId, taskIds) | ||
| 28 | - .in(BpmTaskExtDO::getResult, BpmProcessInstanceResultEnum.CAN_SUB_SIGN_STATUS_LIST)); | ||
| 29 | - } | ||
| 30 | - | ||
| 31 | - default BpmTaskExtDO selectByTaskId(String taskId) { | ||
| 32 | - return selectOne(BpmTaskExtDO::getTaskId, taskId); | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - default void updateBatchByTaskIdList(List<String> taskIdList, BpmTaskExtDO updateObj) { | ||
| 36 | - update(updateObj, new LambdaQueryWrapper<BpmTaskExtDO>().in(BpmTaskExtDO::getTaskId, taskIdList)); | ||
| 37 | - } | 19 | +// default List<BpmTaskExtDO> selectProcessListByTaskIds(Collection<String> taskIds) { |
| 20 | +// return selectList(new LambdaQueryWrapperX<BpmTaskExtDO>() | ||
| 21 | +// .in(BpmTaskExtDO::getTaskId, taskIds) | ||
| 22 | +// .in(BpmTaskExtDO::getResult, BpmProcessInstanceResultEnum.CAN_SUB_SIGN_STATUS_LIST)); | ||
| 23 | +// } | ||
| 24 | + | ||
| 25 | +// default BpmTaskExtDO selectByTaskId(String taskId) { | ||
| 26 | +// return selectOne(BpmTaskExtDO::getTaskId, taskId); | ||
| 27 | +// } | ||
| 28 | + | ||
| 29 | +// default void updateBatchByTaskIdList(List<String> taskIdList, BpmTaskExtDO updateObj) { | ||
| 30 | +// update(updateObj, new LambdaQueryWrapper<BpmTaskExtDO>().in(BpmTaskExtDO::getTaskId, taskIdList)); | ||
| 31 | +// } | ||
| 38 | 32 | ||
| 39 | } | 33 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmConstants.java
| @@ -16,4 +16,11 @@ public class BpmConstants { | @@ -16,4 +16,11 @@ public class BpmConstants { | ||
| 16 | */ | 16 | */ |
| 17 | public static final String PROCESS_INSTANCE_VARIABLE_STATUS = "PROCESS_STATUS"; | 17 | public static final String PROCESS_INSTANCE_VARIABLE_STATUS = "PROCESS_STATUS"; |
| 18 | 18 | ||
| 19 | + /** | ||
| 20 | + * 任务的变量 - 状态 | ||
| 21 | + * | ||
| 22 | + * @see org.flowable.task.api.Task#getTaskLocalVariables() | ||
| 23 | + */ | ||
| 24 | + public static final String TASK_VARIABLE_STATUS = "TASK_STATUS"; | ||
| 25 | + | ||
| 19 | } | 26 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java
| @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.listener; | @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.listener; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.util.StrUtil; | 4 | import cn.hutool.core.util.StrUtil; |
| 5 | -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; | ||
| 6 | import cn.iocoder.yudao.module.bpm.service.task.BpmActivityService; | 5 | import cn.iocoder.yudao.module.bpm.service.task.BpmActivityService; |
| 7 | import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; | 6 | import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; |
| 8 | import com.google.common.collect.ImmutableSet; | 7 | import com.google.common.collect.ImmutableSet; |
| @@ -21,7 +20,7 @@ import java.util.List; | @@ -21,7 +20,7 @@ import java.util.List; | ||
| 21 | import java.util.Set; | 20 | import java.util.Set; |
| 22 | 21 | ||
| 23 | /** | 22 | /** |
| 24 | - * 监听 {@link org.flowable.task.api.Task} 的开始与完成,创建与更新对应的 {@link BpmTaskExtDO} 记录 | 23 | + * 监听 {@link org.flowable.task.api.Task} 的开始与完成 |
| 25 | * | 24 | * |
| 26 | * @author jason | 25 | * @author jason |
| 27 | */ | 26 | */ |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java
| @@ -48,7 +48,7 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService { | @@ -48,7 +48,7 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService { | ||
| 48 | // 插入 OA 请假单 | 48 | // 插入 OA 请假单 |
| 49 | long day = LocalDateTimeUtil.between(createReqVO.getStartTime(), createReqVO.getEndTime()).toDays(); | 49 | long day = LocalDateTimeUtil.between(createReqVO.getStartTime(), createReqVO.getEndTime()).toDays(); |
| 50 | BpmOALeaveDO leave = BpmOALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day) | 50 | BpmOALeaveDO leave = BpmOALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day) |
| 51 | - .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); | 51 | + .setResult(BpmProcessInstanceResultEnum.RUNNING.getResult()); |
| 52 | leaveMapper.insert(leave); | 52 | leaveMapper.insert(leave); |
| 53 | 53 | ||
| 54 | // 发起 BPM 流程 | 54 | // 发起 BPM 流程 |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java
| 1 | package cn.iocoder.yudao.module.bpm.service.task; | 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.framework.common.util.collection.CollectionUtils; | ||
| 5 | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; | 4 | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| 6 | -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; | 5 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCancelReqVO; |
| 6 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; | ||
| 7 | import jakarta.validation.Valid; | 9 | import jakarta.validation.Valid; |
| 8 | import org.flowable.engine.delegate.event.FlowableCancelledEvent; | 10 | import org.flowable.engine.delegate.event.FlowableCancelledEvent; |
| 9 | import org.flowable.engine.history.HistoricProcessInstance; | 11 | import org.flowable.engine.history.HistoricProcessInstance; |
| @@ -13,6 +15,8 @@ import java.util.List; | @@ -13,6 +15,8 @@ import java.util.List; | ||
| 13 | import java.util.Map; | 15 | import java.util.Map; |
| 14 | import java.util.Set; | 16 | import java.util.Set; |
| 15 | 17 | ||
| 18 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; | ||
| 19 | + | ||
| 16 | /** | 20 | /** |
| 17 | * 流程实例 Service 接口 | 21 | * 流程实例 Service 接口 |
| 18 | * | 22 | * |
| @@ -43,7 +47,7 @@ public interface BpmProcessInstanceService { | @@ -43,7 +47,7 @@ public interface BpmProcessInstanceService { | ||
| 43 | * @return 流程实例列表 Map | 47 | * @return 流程实例列表 Map |
| 44 | */ | 48 | */ |
| 45 | default Map<String, ProcessInstance> getProcessInstanceMap(Set<String> ids) { | 49 | default Map<String, ProcessInstance> getProcessInstanceMap(Set<String> ids) { |
| 46 | - return CollectionUtils.convertMap(getProcessInstances(ids), ProcessInstance::getProcessInstanceId); | 50 | + return convertMap(getProcessInstances(ids), ProcessInstance::getProcessInstanceId); |
| 47 | } | 51 | } |
| 48 | 52 | ||
| 49 | /** | 53 | /** |
| @@ -53,7 +57,7 @@ public interface BpmProcessInstanceService { | @@ -53,7 +57,7 @@ public interface BpmProcessInstanceService { | ||
| 53 | * @return 对应的映射关系 | 57 | * @return 对应的映射关系 |
| 54 | */ | 58 | */ |
| 55 | default Map<String, String> getProcessInstanceNameMap(Set<String> ids) { | 59 | default Map<String, String> getProcessInstanceNameMap(Set<String> ids) { |
| 56 | - return CollectionUtils.convertMap(getProcessInstances(ids), | 60 | + return convertMap(getProcessInstances(ids), |
| 57 | ProcessInstance::getProcessInstanceId, ProcessInstance::getName); | 61 | ProcessInstance::getProcessInstanceId, ProcessInstance::getName); |
| 58 | } | 62 | } |
| 59 | 63 | ||
| @@ -80,7 +84,7 @@ public interface BpmProcessInstanceService { | @@ -80,7 +84,7 @@ public interface BpmProcessInstanceService { | ||
| 80 | * @return 历史的流程实例列表 Map | 84 | * @return 历史的流程实例列表 Map |
| 81 | */ | 85 | */ |
| 82 | default Map<String, HistoricProcessInstance> getHistoricProcessInstanceMap(Set<String> ids) { | 86 | default Map<String, HistoricProcessInstance> getHistoricProcessInstanceMap(Set<String> ids) { |
| 83 | - return CollectionUtils.convertMap(getHistoricProcessInstances(ids), HistoricProcessInstance::getId); | 87 | + return convertMap(getHistoricProcessInstances(ids), HistoricProcessInstance::getId); |
| 84 | } | 88 | } |
| 85 | 89 | ||
| 86 | /** | 90 | /** |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
| @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.bpm.service.task; | @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.bpm.service.task; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 4 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 5 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; | 5 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; |
| 6 | -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; | ||
| 7 | import jakarta.validation.Valid; | 6 | import jakarta.validation.Valid; |
| 8 | import org.flowable.task.api.Task; | 7 | import org.flowable.task.api.Task; |
| 9 | 8 | ||
| @@ -64,15 +63,6 @@ public interface BpmTaskService { | @@ -64,15 +63,6 @@ public interface BpmTaskService { | ||
| 64 | */ | 63 | */ |
| 65 | List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId); | 64 | List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId); |
| 66 | 65 | ||
| 67 | - | ||
| 68 | - /** | ||
| 69 | - * 通过任务 ID 集合,获取任务扩展表信息集合 | ||
| 70 | - * | ||
| 71 | - * @param taskIdList 任务 ID 集合 | ||
| 72 | - * @return 任务列表 | ||
| 73 | - */ | ||
| 74 | - List<BpmTaskExtDO> getTaskListByTaskIdList(List<String> taskIdList); | ||
| 75 | - | ||
| 76 | /** | 66 | /** |
| 77 | * 通过任务 | 67 | * 通过任务 |
| 78 | * | 68 | * |
| @@ -151,7 +141,6 @@ public interface BpmTaskService { | @@ -151,7 +141,6 @@ public interface BpmTaskService { | ||
| 151 | */ | 141 | */ |
| 152 | void returnTask(Long userId, BpmTaskReturnReqVO reqVO); | 142 | void returnTask(Long userId, BpmTaskReturnReqVO reqVO); |
| 153 | 143 | ||
| 154 | - | ||
| 155 | /** | 144 | /** |
| 156 | * 将指定任务委派给其他人处理,等接收人处理后再回到原审批人手中审批 | 145 | * 将指定任务委派给其他人处理,等接收人处理后再回到原审批人手中审批 |
| 157 | * | 146 | * |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
| @@ -13,12 +13,11 @@ import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils; | @@ -13,12 +13,11 @@ import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils; | ||
| 13 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | 13 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; |
| 14 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; | 14 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; |
| 15 | import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; | 15 | import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; |
| 16 | -import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO; | ||
| 17 | import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper; | 16 | import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper; |
| 18 | import cn.iocoder.yudao.module.bpm.enums.task.BpmCommentTypeEnum; | 17 | import cn.iocoder.yudao.module.bpm.enums.task.BpmCommentTypeEnum; |
| 19 | -import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; | ||
| 20 | import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; | 18 | import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; |
| 21 | import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskAddSignTypeEnum; | 19 | import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskAddSignTypeEnum; |
| 20 | +import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants; | ||
| 22 | import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; | 21 | import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; |
| 23 | import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; | 22 | import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; |
| 24 | import cn.iocoder.yudao.module.system.api.dept.DeptApi; | 23 | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| @@ -39,7 +38,6 @@ import org.flowable.engine.history.HistoricProcessInstance; | @@ -39,7 +38,6 @@ import org.flowable.engine.history.HistoricProcessInstance; | ||
| 39 | import org.flowable.engine.runtime.ProcessInstance; | 38 | import org.flowable.engine.runtime.ProcessInstance; |
| 40 | import org.flowable.task.api.DelegationState; | 39 | import org.flowable.task.api.DelegationState; |
| 41 | import org.flowable.task.api.Task; | 40 | import org.flowable.task.api.Task; |
| 42 | -import org.flowable.task.api.TaskInfo; | ||
| 43 | import org.flowable.task.api.TaskQuery; | 41 | import org.flowable.task.api.TaskQuery; |
| 44 | import org.flowable.task.api.history.HistoricTaskInstance; | 42 | import org.flowable.task.api.history.HistoricTaskInstance; |
| 45 | import org.flowable.task.api.history.HistoricTaskInstanceQuery; | 43 | import org.flowable.task.api.history.HistoricTaskInstanceQuery; |
| @@ -51,7 +49,6 @@ import org.springframework.transaction.support.TransactionSynchronization; | @@ -51,7 +49,6 @@ import org.springframework.transaction.support.TransactionSynchronization; | ||
| 51 | import org.springframework.transaction.support.TransactionSynchronizationManager; | 49 | import org.springframework.transaction.support.TransactionSynchronizationManager; |
| 52 | import org.springframework.util.Assert; | 50 | import org.springframework.util.Assert; |
| 53 | 51 | ||
| 54 | -import java.time.LocalDateTime; | ||
| 55 | import java.util.*; | 52 | import java.util.*; |
| 56 | import java.util.stream.Stream; | 53 | import java.util.stream.Stream; |
| 57 | 54 | ||
| @@ -115,8 +112,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -115,8 +112,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 115 | } | 112 | } |
| 116 | 113 | ||
| 117 | // 获得 ProcessInstance Map | 114 | // 获得 ProcessInstance Map |
| 118 | - Map<String, ProcessInstance> processInstanceMap = | ||
| 119 | - processInstanceService.getProcessInstanceMap(convertSet(tasks, Task::getProcessInstanceId)); | 115 | + Map<String, ProcessInstance> processInstanceMap = processInstanceService.getProcessInstanceMap( |
| 116 | + convertSet(tasks, Task::getProcessInstanceId)); | ||
| 120 | // 获得 User Map | 117 | // 获得 User Map |
| 121 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( | 118 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| 122 | convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); | 119 | convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); |
| @@ -129,11 +126,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -129,11 +126,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 129 | public PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageVO) { | 126 | public PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageVO) { |
| 130 | // 查询已办任务 | 127 | // 查询已办任务 |
| 131 | HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery().finished() // 已完成 | 128 | HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery().finished() // 已完成 |
| 129 | + .includeTaskLocalVariables() | ||
| 132 | .taskAssignee(String.valueOf(userId)) // 分配给自己 | 130 | .taskAssignee(String.valueOf(userId)) // 分配给自己 |
| 133 | .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序 | 131 | .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序 |
| 134 | if (StrUtil.isNotBlank(pageVO.getName())) { | 132 | if (StrUtil.isNotBlank(pageVO.getName())) { |
| 135 | taskQuery.taskNameLike("%" + pageVO.getName() + "%"); | 133 | taskQuery.taskNameLike("%" + pageVO.getName() + "%"); |
| 136 | } | 134 | } |
| 135 | + // TODO @芋艿:传参风格,统一 | ||
| 137 | if (pageVO.getBeginCreateTime() != null) { | 136 | if (pageVO.getBeginCreateTime() != null) { |
| 138 | taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getBeginCreateTime())); | 137 | taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getBeginCreateTime())); |
| 139 | } | 138 | } |
| @@ -146,20 +145,15 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -146,20 +145,15 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 146 | return PageResult.empty(taskQuery.count()); | 145 | return PageResult.empty(taskQuery.count()); |
| 147 | } | 146 | } |
| 148 | 147 | ||
| 149 | - // 获得 TaskExtDO Map | ||
| 150 | - List<BpmTaskExtDO> bpmTaskExtDOs = | ||
| 151 | - taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId)); | ||
| 152 | - Map<String, BpmTaskExtDO> bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId); | ||
| 153 | // 获得 ProcessInstance Map | 148 | // 获得 ProcessInstance Map |
| 154 | - Map<String, HistoricProcessInstance> historicProcessInstanceMap = | ||
| 155 | - processInstanceService.getHistoricProcessInstanceMap( | ||
| 156 | - convertSet(tasks, HistoricTaskInstance::getProcessInstanceId)); | 149 | + Map<String, HistoricProcessInstance> historicProcessInstanceMap = processInstanceService.getHistoricProcessInstanceMap( |
| 150 | + convertSet(tasks, HistoricTaskInstance::getProcessInstanceId)); | ||
| 157 | // 获得 User Map | 151 | // 获得 User Map |
| 158 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( | 152 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| 159 | convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); | 153 | convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); |
| 160 | // 拼接结果 | 154 | // 拼接结果 |
| 161 | return new PageResult<>( | 155 | return new PageResult<>( |
| 162 | - BpmTaskConvert.INSTANCE.convertList2(tasks, bpmTaskExtDOMap, historicProcessInstanceMap, userMap), | 156 | + BpmTaskConvert.INSTANCE.convertList2(tasks, historicProcessInstanceMap, userMap), |
| 163 | taskQuery.count()); | 157 | taskQuery.count()); |
| 164 | } | 158 | } |
| 165 | 159 | ||
| @@ -175,6 +169,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -175,6 +169,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 175 | public List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId) { | 169 | public List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId) { |
| 176 | // 获得任务列表 | 170 | // 获得任务列表 |
| 177 | List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery() | 171 | List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery() |
| 172 | + .includeTaskLocalVariables() | ||
| 178 | .processInstanceId(processInstanceId) | 173 | .processInstanceId(processInstanceId) |
| 179 | .orderByHistoricTaskInstanceStartTime().desc() // 创建时间倒序 | 174 | .orderByHistoricTaskInstanceStartTime().desc() // 创建时间倒序 |
| 180 | .list(); | 175 | .list(); |
| @@ -182,9 +177,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -182,9 +177,6 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 182 | return Collections.emptyList(); | 177 | return Collections.emptyList(); |
| 183 | } | 178 | } |
| 184 | 179 | ||
| 185 | - // 获得 TaskExtDO Map | ||
| 186 | - List<BpmTaskExtDO> bpmTaskExtDOs = taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId)); | ||
| 187 | - Map<String, BpmTaskExtDO> bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId); | ||
| 188 | // 获得 ProcessInstance Map | 180 | // 获得 ProcessInstance Map |
| 189 | HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId); | 181 | HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId); |
| 190 | // 获得 User Map | 182 | // 获得 User Map |
| @@ -195,16 +187,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -195,16 +187,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 195 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); | 187 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); |
| 196 | 188 | ||
| 197 | // 拼接数据 | 189 | // 拼接数据 |
| 198 | - List<BpmTaskRespVO> result = BpmTaskConvert.INSTANCE.convertList3(tasks, bpmTaskExtDOMap, processInstance, userMap, deptMap); | 190 | + List<BpmTaskRespVO> result = BpmTaskConvert.INSTANCE.convertList3(tasks, processInstance, userMap, deptMap); |
| 199 | return BpmTaskConvert.INSTANCE.convertChildrenList(result); | 191 | return BpmTaskConvert.INSTANCE.convertChildrenList(result); |
| 200 | } | 192 | } |
| 201 | 193 | ||
| 202 | @Override | 194 | @Override |
| 203 | - public List<BpmTaskExtDO> getTaskListByTaskIdList(List<String> taskIdList) { | ||
| 204 | - return taskExtMapper.selectListByTaskIds(taskIdList); | ||
| 205 | - } | ||
| 206 | - | ||
| 207 | - @Override | ||
| 208 | @Transactional(rollbackFor = Exception.class) | 195 | @Transactional(rollbackFor = Exception.class) |
| 209 | public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) { | 196 | public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) { |
| 210 | // 1.1 校验任务存在 | 197 | // 1.1 校验任务存在 |
| @@ -230,16 +217,17 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -230,16 +217,17 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 230 | 217 | ||
| 231 | // 情况三:自己审批的任务,调用 complete 去完成任务 | 218 | // 情况三:自己审批的任务,调用 complete 去完成任务 |
| 232 | // 完成任务,审批通过 | 219 | // 完成任务,审批通过 |
| 220 | + updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.APPROVE.getResult()); | ||
| 233 | taskService.complete(task.getId(), instance.getProcessVariables()); | 221 | taskService.complete(task.getId(), instance.getProcessVariables()); |
| 234 | - // 更新任务拓展表为通过 | ||
| 235 | - taskExtMapper.updateByTaskId( | ||
| 236 | - new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()) | ||
| 237 | - .setReason(reqVO.getReason())); | 222 | +// // 更新任务拓展表为通过 |
| 223 | +// taskExtMapper.updateByTaskId( | ||
| 224 | +// new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()) | ||
| 225 | +// .setReason(reqVO.getReason())); | ||
| 238 | // 处理加签任务 | 226 | // 处理加签任务 |
| 239 | - handleParentTask(task); | 227 | +// handleParentTask(task); |
| 228 | + handleParentTaskNew(task.getParentTaskId()); | ||
| 240 | } | 229 | } |
| 241 | 230 | ||
| 242 | - | ||
| 243 | /** | 231 | /** |
| 244 | * 审批通过存在“后加签”的任务。 | 232 | * 审批通过存在“后加签”的任务。 |
| 245 | * <p> | 233 | * <p> |
| @@ -250,133 +238,59 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -250,133 +238,59 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 250 | */ | 238 | */ |
| 251 | private void approveAfterSignTask(Task task, BpmTaskApproveReqVO reqVO) { | 239 | private void approveAfterSignTask(Task task, BpmTaskApproveReqVO reqVO) { |
| 252 | // 1. 有向后加签,则该任务状态临时设置为 ADD_SIGN_AFTER 状态 | 240 | // 1. 有向后加签,则该任务状态临时设置为 ADD_SIGN_AFTER 状态 |
| 253 | - taskExtMapper.updateByTaskId( | ||
| 254 | - new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.SIGN_AFTER.getResult()) | ||
| 255 | - .setReason(reqVO.getReason()).setEndTime(LocalDateTime.now())); | 241 | +// taskExtMapper.updateByTaskId( |
| 242 | +// new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.SIGN_AFTER.getResult()) | ||
| 243 | +// .setReason(reqVO.getReason()).setEndTime(LocalDateTime.now())); | ||
| 244 | + // TODO @芋艿:reqVO.reason??? | ||
| 245 | + updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.APPROVING.getResult()); | ||
| 256 | 246 | ||
| 257 | // 2. 激活子任务 | 247 | // 2. 激活子任务 |
| 258 | List<String> childrenTaskIdList = getChildrenTaskIdList(task.getId()); | 248 | List<String> childrenTaskIdList = getChildrenTaskIdList(task.getId()); |
| 259 | for (String childrenTaskId : childrenTaskIdList) { | 249 | for (String childrenTaskId : childrenTaskIdList) { |
| 260 | taskService.resolveTask(childrenTaskId); | 250 | taskService.resolveTask(childrenTaskId); |
| 251 | + // 更新任务扩展表中子任务为进行中 | ||
| 252 | + updateTaskStatus(childrenTaskId, BpmProcessInstanceResultEnum.RUNNING.getResult()); | ||
| 261 | } | 253 | } |
| 262 | // 2.1 更新任务扩展表中子任务为进行中 | 254 | // 2.1 更新任务扩展表中子任务为进行中 |
| 263 | - taskExtMapper.updateBatchByTaskIdList(childrenTaskIdList, | ||
| 264 | - new BpmTaskExtDO().setResult(BpmProcessInstanceResultEnum.PROCESS.getResult())); | 255 | +// taskExtMapper.updateBatchByTaskIdList(childrenTaskIdList, |
| 256 | +// new BpmTaskExtDO().setResult(BpmProcessInstanceResultEnum.PROCESS.getResult())); | ||
| 265 | } | 257 | } |
| 266 | 258 | ||
| 267 | - /** | ||
| 268 | - * 处理当前任务的父任务,主要处理“加签”的情况 | ||
| 269 | - * | ||
| 270 | - * @param task 当前任务 | ||
| 271 | - */ | ||
| 272 | - private void handleParentTask(Task task) { | ||
| 273 | - String parentTaskId = task.getParentTaskId(); | 259 | + // TODO 芋艿:名字 |
| 260 | + private void handleParentTaskNew(String parentTaskId) { | ||
| 274 | if (StrUtil.isBlank(parentTaskId)) { | 261 | if (StrUtil.isBlank(parentTaskId)) { |
| 275 | return; | 262 | return; |
| 276 | } | 263 | } |
| 277 | - // 1. 判断当前任务的父任务是否还有子任务 | 264 | + // 1.1 判断是否还有子任务。如果没有,就不处理 |
| 278 | Long childrenTaskCount = getChildrenTaskCount(parentTaskId); | 265 | Long childrenTaskCount = getChildrenTaskCount(parentTaskId); |
| 279 | if (childrenTaskCount > 0) { | 266 | if (childrenTaskCount > 0) { |
| 280 | return; | 267 | return; |
| 281 | } | 268 | } |
| 282 | - // 2. 获取父任务 | 269 | + // 1.2 只处理加签的父任务 |
| 283 | Task parentTask = validateTaskExist(parentTaskId); | 270 | Task parentTask = validateTaskExist(parentTaskId); |
| 284 | - | ||
| 285 | - // 3. 处理加签情况 | ||
| 286 | String scopeType = parentTask.getScopeType(); | 271 | String scopeType = parentTask.getScopeType(); |
| 287 | - if(!validateSignType(scopeType)){ | 272 | + if (!validateSignType(scopeType)){ |
| 288 | return; | 273 | return; |
| 289 | } | 274 | } |
| 290 | - // 3.1 情况一:处理向前加签 | ||
| 291 | - if (BpmTaskAddSignTypeEnum.BEFORE.getType().equals(scopeType)) { | ||
| 292 | - // 3.1.1 如果是向前加签的任务,则调用 resolveTask 指派父任务,将 owner 重新赋值给父任务的 assignee,这样它就可以被审批 | ||
| 293 | - taskService.resolveTask(parentTaskId); | ||
| 294 | - // 3.1.2 更新任务拓展表为处理中 | ||
| 295 | - taskExtMapper.updateByTaskId( | ||
| 296 | - new BpmTaskExtDO().setTaskId(parentTask.getId()).setResult(BpmProcessInstanceResultEnum.PROCESS.getResult())); | ||
| 297 | - } else if (BpmTaskAddSignTypeEnum.AFTER.getType().equals(scopeType)) { | ||
| 298 | - // 3.2 情况二:处理向后加签 | ||
| 299 | - handleParentTaskForAfterSign(parentTask); | ||
| 300 | - } | ||
| 301 | 275 | ||
| 302 | - // 4. 子任务已处理完成,清空 scopeType 字段,修改 parentTask 信息,方便后续可以继续向前后向后加签 | ||
| 303 | - // 再查询一次的原因是避免报错:Task was updated by another transaction concurrently | ||
| 304 | - // 因为前面处理后可能会导致 parentTask rev 字段被修改,需要重新获取最新的 | ||
| 305 | - parentTask = getTask(parentTaskId); | ||
| 306 | - if (parentTask == null) { | ||
| 307 | - // 为空的情况是:已经通过 handleAfterSign 方法将任务完成了,所以 ru_task 表会查不到数据 | ||
| 308 | - return; | ||
| 309 | - } | 276 | + // 2. 子任务已处理完成,清空 scopeType 字段,修改 parentTask 信息,方便后续可以继续向前后向后加签 |
| 310 | clearTaskScopeTypeAndSave(parentTask); | 277 | clearTaskScopeTypeAndSave(parentTask); |
| 311 | - } | ||
| 312 | - | ||
| 313 | 278 | ||
| 314 | - /** | ||
| 315 | - * 处理后加签任务 | ||
| 316 | - * | ||
| 317 | - * @param parentTask 当前审批任务的父任务 | ||
| 318 | - */ | ||
| 319 | - // TODO @海:这个逻辑,怎么感觉可以是 parentTask 的 parent,再去调用 handleParentTask 方法;可以微信聊下; | ||
| 320 | - private void handleParentTaskForAfterSign(Task parentTask) { | ||
| 321 | - String parentTaskId = parentTask.getId(); | ||
| 322 | - // 1. 更新 parentTask 的任务拓展表为通过,并调用 complete 完成自己 | ||
| 323 | - BpmTaskExtDO currentTaskExt = taskExtMapper.selectByTaskId(parentTask.getId()); | ||
| 324 | - BpmTaskExtDO currentTaskExtUpdateObj = new BpmTaskExtDO().setTaskId(parentTask.getId()) | ||
| 325 | - .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); | ||
| 326 | - if (currentTaskExt.getEndTime() == null) { | ||
| 327 | - // 1.1 有这个判断是因为,以前没设置过结束时间,才去设置 | ||
| 328 | - currentTaskExtUpdateObj.setEndTime(LocalDateTime.now()); | ||
| 329 | - } | ||
| 330 | - taskExtMapper.updateByTaskId(currentTaskExtUpdateObj); | ||
| 331 | - // 1.2 完成自己(因为它已经没有子任务,所以也可以完成) | ||
| 332 | - taskService.complete(parentTaskId); | ||
| 333 | - | ||
| 334 | - // 2. 如果有父级,递归查询上级任务是否都已经完成 | ||
| 335 | - if (StrUtil.isEmpty(parentTask.getParentTaskId())) { | ||
| 336 | - return; | ||
| 337 | - } | ||
| 338 | - // 2.1 判断整条链路的任务是否完成 | ||
| 339 | - // 例如从 A 任务加签了一个 B 任务,B 任务又加签了一个 C 任务,C 任务加签了 D 任务 | ||
| 340 | - // 此时,D 任务完成,要一直往上找到祖先任务 A调用 complete 方法完成 A 任务 | ||
| 341 | - boolean allChildrenTaskFinish = true; | ||
| 342 | - while (StrUtil.isNotBlank(parentTask.getParentTaskId())) { | ||
| 343 | - parentTask = validateTaskExist(parentTask.getParentTaskId()); | ||
| 344 | - BpmTaskExtDO parentTaskExt = taskExtMapper.selectByTaskId(parentTask.getId()); | ||
| 345 | - if (parentTaskExt == null) { | ||
| 346 | - break; | ||
| 347 | - } | ||
| 348 | - boolean currentTaskFinish = BpmProcessInstanceResultEnum.isEndResult(parentTaskExt.getResult()); | ||
| 349 | - // 2.2 如果 allChildrenTaskFinish 已经被赋值为 false,则不会再赋值为 true,因为整个链路没有完成 | ||
| 350 | - if (allChildrenTaskFinish) { | ||
| 351 | - allChildrenTaskFinish = currentTaskFinish; | ||
| 352 | - } | ||
| 353 | - // 2.3 任务已完成则不处理 | ||
| 354 | - if (currentTaskFinish) { | ||
| 355 | - continue; | ||
| 356 | - } | ||
| 357 | - | ||
| 358 | - // 3 处理非完成状态的任务 | ||
| 359 | - // 3.1 判断当前任务的父任务是否还有子任务 | ||
| 360 | - Long childrenTaskCount = getChildrenTaskCount(parentTaskExt.getTaskId()); | ||
| 361 | - if (childrenTaskCount > 0) { | ||
| 362 | - continue; | ||
| 363 | - } | ||
| 364 | - // 3.2 没有子任务,判断当前任务状态是否为 ADD_SIGN_BEFORE 待前加签任务完成 | ||
| 365 | - if (BpmProcessInstanceResultEnum.SIGN_BEFORE.getResult().equals(parentTaskExt.getResult())) { | ||
| 366 | - // 3.3 需要修改该任务状态为处理中 | ||
| 367 | - taskService.resolveTask(parentTaskExt.getTaskId()); | ||
| 368 | - parentTaskExt.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); | ||
| 369 | - taskExtMapper.updateByTaskId(parentTaskExt); | ||
| 370 | - } | ||
| 371 | - // 3.4 清空 scopeType 字段,用于任务没有子任务时使用该方法,方便任务可以再次被不同的方式加签 | ||
| 372 | - parentTask = validateTaskExist(parentTaskExt.getTaskId()); | ||
| 373 | - clearTaskScopeTypeAndSave(parentTask); | 279 | + // 3.1 情况一:处理向【向前】加签 |
| 280 | + if (BpmTaskAddSignTypeEnum.BEFORE.getType().equals(scopeType)) { | ||
| 281 | + // 3.1.1 owner 重新赋值给父任务的 assignee,这样它就可以被审批 | ||
| 282 | + taskService.resolveTask(parentTaskId); | ||
| 283 | + // 3.1.2 更新流程任务 status | ||
| 284 | + updateTaskStatus(parentTaskId, BpmProcessInstanceResultEnum.RUNNING.getResult()); | ||
| 285 | + // 3.2 情况二:处理向【向后】加签 | ||
| 286 | + } else if (BpmTaskAddSignTypeEnum.AFTER.getType().equals(scopeType)) { | ||
| 287 | + // 3.2.1 完成自己(因为它已经没有子任务,所以也可以完成) | ||
| 288 | + updateTaskStatus(parentTaskId, BpmProcessInstanceResultEnum.APPROVE.getResult()); | ||
| 289 | + taskService.complete(parentTaskId); | ||
| 374 | } | 290 | } |
| 375 | 291 | ||
| 376 | - // 4. 完成最后的顶级祖先任务 | ||
| 377 | - if (allChildrenTaskFinish) { | ||
| 378 | - taskService.complete(parentTask.getId()); | ||
| 379 | - } | 292 | + // 4. 递归处理父任务 |
| 293 | + handleParentTaskNew(parentTask.getParentTaskId()); | ||
| 380 | } | 294 | } |
| 381 | 295 | ||
| 382 | /** | 296 | /** |
| @@ -422,9 +336,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -422,9 +336,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 422 | // 底层调用 TaskHelper.changeTaskAssignee(task, task.getOwner()):将 owner 设置为 assignee | 336 | // 底层调用 TaskHelper.changeTaskAssignee(task, task.getOwner()):将 owner 设置为 assignee |
| 423 | taskService.resolveTask(task.getId()); | 337 | taskService.resolveTask(task.getId()); |
| 424 | // 2.2 更新任务拓展表为【处理中】 | 338 | // 2.2 更新任务拓展表为【处理中】 |
| 425 | - taskExtMapper.updateByTaskId( | ||
| 426 | - new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()) | ||
| 427 | - .setReason(reqVO.getReason())); | 339 | +// taskExtMapper.updateByTaskId( |
| 340 | +// new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.RUNNING.getResult()) | ||
| 341 | +// .setReason(reqVO.getReason())); | ||
| 342 | + updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.RUNNING.getResult()); | ||
| 428 | } | 343 | } |
| 429 | 344 | ||
| 430 | @Override | 345 | @Override |
| @@ -438,12 +353,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -438,12 +353,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 438 | } | 353 | } |
| 439 | 354 | ||
| 440 | // 更新流程实例为不通过 | 355 | // 更新流程实例为不通过 |
| 356 | + updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.REJECT.getResult()); | ||
| 441 | processInstanceService.updateProcessInstanceExtReject(instance.getProcessInstanceId(), reqVO.getReason()); | 357 | processInstanceService.updateProcessInstanceExtReject(instance.getProcessInstanceId(), reqVO.getReason()); |
| 442 | 358 | ||
| 443 | - // 更新任务拓展表为不通过 | ||
| 444 | - taskExtMapper.updateByTaskId( | ||
| 445 | - new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.REJECT.getResult()) | ||
| 446 | - .setEndTime(LocalDateTime.now()).setReason(reqVO.getReason())); | 359 | +// // 更新任务拓展表为不通过 |
| 360 | +// taskExtMapper.updateByTaskId( | ||
| 361 | +// new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.REJECT.getResult()) | ||
| 362 | +// .setEndTime(LocalDateTime.now()).setReason(reqVO.getReason())); | ||
| 447 | } | 363 | } |
| 448 | 364 | ||
| 449 | @Override | 365 | @Override |
| @@ -460,6 +376,20 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -460,6 +376,20 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 460 | } | 376 | } |
| 461 | 377 | ||
| 462 | /** | 378 | /** |
| 379 | + * 更新流程任务的 status 状态 | ||
| 380 | + * | ||
| 381 | + * @param id 任务编号 | ||
| 382 | + * @param status 状态 | ||
| 383 | + */ | ||
| 384 | + private void updateTaskStatus(String id, Integer status) { | ||
| 385 | +// try { | ||
| 386 | +// } catch (FlowableObjectNotFoundException exception) { | ||
| 387 | +// historyService. | ||
| 388 | +// } | ||
| 389 | + taskService.setVariableLocal(id, BpmConstants.TASK_VARIABLE_STATUS, status); | ||
| 390 | + } | ||
| 391 | + | ||
| 392 | + /** | ||
| 463 | * 校验任务是否存在, 并且是否是分配给自己的任务 | 393 | * 校验任务是否存在, 并且是否是分配给自己的任务 |
| 464 | * | 394 | * |
| 465 | * @param userId 用户 id | 395 | * @param userId 用户 id |
| @@ -475,25 +405,56 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -475,25 +405,56 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 475 | 405 | ||
| 476 | @Override | 406 | @Override |
| 477 | public void createTaskExt(Task task) { | 407 | public void createTaskExt(Task task) { |
| 478 | - BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task) | ||
| 479 | - .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); | 408 | +// BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task) |
| 409 | +// .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); | ||
| 410 | +// // 向后加签生成的任务,状态不能为进行中,需要等前面父任务完成 | ||
| 411 | +// if (BpmTaskAddSignTypeEnum.AFTER_CHILDREN_TASK.getType().equals(task.getScopeType())) { | ||
| 412 | +// taskExtDO.setResult(BpmProcessInstanceResultEnum.WAIT_BEFORE_TASK.getResult()); | ||
| 413 | +// } | ||
| 414 | +// taskExtMapper.insert(taskExtDO); | ||
| 415 | +// Integer status = (Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS); | ||
| 416 | +// if (status != null) { | ||
| 417 | +// return; | ||
| 418 | +// } | ||
| 419 | +// | ||
| 420 | +// status = BpmProcessInstanceResultEnum.RUNNING.getResult(); | ||
| 480 | // 向后加签生成的任务,状态不能为进行中,需要等前面父任务完成 | 421 | // 向后加签生成的任务,状态不能为进行中,需要等前面父任务完成 |
| 481 | - if (BpmTaskAddSignTypeEnum.AFTER_CHILDREN_TASK.getType().equals(task.getScopeType())) { | ||
| 482 | - taskExtDO.setResult(BpmProcessInstanceResultEnum.WAIT_BEFORE_TASK.getResult()); | ||
| 483 | - } | ||
| 484 | - taskExtMapper.insert(taskExtDO); | 422 | +// if (BpmTaskAddSignTypeEnum.AFTER_CHILDREN_TASK.getType().equals(task.getScopeType())) { |
| 423 | +// status = BpmProcessInstanceResultEnum.WAIT_BEFORE_TASK.getResult(); | ||
| 424 | +// } | ||
| 425 | + updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.RUNNING.getResult()); | ||
| 485 | } | 426 | } |
| 486 | 427 | ||
| 487 | @Override | 428 | @Override |
| 488 | public void updateTaskExtComplete(Task task) { | 429 | public void updateTaskExtComplete(Task task) { |
| 489 | - BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task) | ||
| 490 | - .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()) // 不设置也问题不大,因为 Complete 一般是审核通过,已经设置 | ||
| 491 | - .setEndTime(LocalDateTime.now()); | ||
| 492 | - taskExtMapper.updateByTaskId(taskExtDO); | 430 | +// BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task) |
| 431 | +// .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()) // 不设置也问题不大,因为 Complete 一般是审核通过,已经设置 | ||
| 432 | +// .setEndTime(LocalDateTime.now()); | ||
| 433 | +// taskExtMapper.updateByTaskId(taskExtDO); | ||
| 434 | + | ||
| 435 | + updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.APPROVE.getResult()); | ||
| 493 | } | 436 | } |
| 494 | 437 | ||
| 495 | @Override | 438 | @Override |
| 496 | public void updateTaskExtCancel(String taskId) { | 439 | public void updateTaskExtCancel(String taskId) { |
| 440 | + Task task = getTask(taskId); | ||
| 441 | + // 可能只是活动,不是任务,所以查询不到 | ||
| 442 | + if (task == null) { | ||
| 443 | + log.error("[updateTaskExtCancel][taskId({}) 任务不存在]", taskId); | ||
| 444 | + return; | ||
| 445 | + } | ||
| 446 | + | ||
| 447 | + Integer status = (Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS); | ||
| 448 | + if (BpmProcessInstanceResultEnum.isEndResult(status)) { | ||
| 449 | + log.error("[updateTaskExtCancel][taskId({}) 处于结果({}),无需进行更新]", taskId, status); | ||
| 450 | + return; | ||
| 451 | + } | ||
| 452 | + updateTaskStatus(taskId, BpmProcessInstanceResultEnum.CANCEL.getResult()); | ||
| 453 | + | ||
| 454 | + if (true) { | ||
| 455 | + return; | ||
| 456 | + } | ||
| 457 | + | ||
| 497 | // 需要在事务提交后,才进行查询。不然查询不到历史的原因 | 458 | // 需要在事务提交后,才进行查询。不然查询不到历史的原因 |
| 498 | TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { | 459 | TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { |
| 499 | 460 | ||
| @@ -505,21 +466,27 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -505,21 +466,27 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 505 | return; | 466 | return; |
| 506 | } | 467 | } |
| 507 | 468 | ||
| 508 | - // 如果任务拓展表已经是完成的状态,则跳过 | ||
| 509 | - BpmTaskExtDO taskExt = taskExtMapper.selectByTaskId(taskId); | ||
| 510 | - if (taskExt == null) { | ||
| 511 | - log.error("[updateTaskExtCancel][taskId({}) 查找不到对应的记录,可能存在问题]", taskId); | ||
| 512 | - return; | ||
| 513 | - } | ||
| 514 | - // 如果已经是最终的结果,则跳过 | ||
| 515 | - if (BpmProcessInstanceResultEnum.isEndResult(taskExt.getResult())) { | ||
| 516 | - log.error("[updateTaskExtCancel][taskId({}) 处于结果({}),无需进行更新]", taskId, taskExt.getResult()); | 469 | +// // 如果任务拓展表已经是完成的状态,则跳过 |
| 470 | +// BpmTaskExtDO taskExt = taskExtMapper.selectByTaskId(taskId); | ||
| 471 | +// if (taskExt == null) { | ||
| 472 | +// log.error("[updateTaskExtCancel][taskId({}) 查找不到对应的记录,可能存在问题]", taskId); | ||
| 473 | +// return; | ||
| 474 | +// } | ||
| 475 | +// // 如果已经是最终的结果,则跳过 | ||
| 476 | +// if (BpmProcessInstanceResultEnum.isEndResult(taskExt.getResult())) { | ||
| 477 | +// log.error("[updateTaskExtCancel][taskId({}) 处于结果({}),无需进行更新]", taskId, taskExt.getResult()); | ||
| 478 | +// return; | ||
| 479 | +// } | ||
| 480 | + Integer status = (Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS); | ||
| 481 | + if (BpmProcessInstanceResultEnum.isEndResult(status)) { | ||
| 482 | + log.error("[updateTaskExtCancel][taskId({}) 处于结果({}),无需进行更新]", taskId, status); | ||
| 517 | return; | 483 | return; |
| 518 | } | 484 | } |
| 519 | 485 | ||
| 520 | // 更新任务 | 486 | // 更新任务 |
| 521 | - taskExtMapper.updateById(new BpmTaskExtDO().setId(taskExt.getId()).setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()) | ||
| 522 | - .setEndTime(LocalDateTime.now()).setReason(BpmProcessInstanceDeleteReasonEnum.translateReason(task.getDeleteReason()))); | 487 | +// taskExtMapper.updateById(new BpmTaskExtDO().setId(taskExt.getId()).setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()) |
| 488 | +// .setEndTime(LocalDateTime.now()).setReason(BpmProcessInstanceDeleteReasonEnum.translateReason(task.getDeleteReason()))); | ||
| 489 | + updateTaskStatus(taskId, BpmProcessInstanceResultEnum.CANCEL.getResult()); | ||
| 523 | } | 490 | } |
| 524 | 491 | ||
| 525 | }); | 492 | }); |
| @@ -527,9 +494,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -527,9 +494,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 527 | 494 | ||
| 528 | @Override | 495 | @Override |
| 529 | public void updateTaskExtAssign(Task task) { | 496 | public void updateTaskExtAssign(Task task) { |
| 530 | - BpmTaskExtDO taskExtDO = | ||
| 531 | - new BpmTaskExtDO().setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())).setTaskId(task.getId()); | ||
| 532 | - taskExtMapper.updateByTaskId(taskExtDO); | 497 | +// BpmTaskExtDO taskExtDO = |
| 498 | +// new BpmTaskExtDO().setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())).setTaskId(task.getId()); | ||
| 499 | +// taskExtMapper.updateByTaskId(taskExtDO); | ||
| 500 | + | ||
| 533 | // 发送通知。在事务提交时,批量执行操作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监听事务的提交来实现。 | 501 | // 发送通知。在事务提交时,批量执行操作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监听事务的提交来实现。 |
| 534 | TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { | 502 | TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { |
| 535 | @Override | 503 | @Override |
| @@ -555,11 +523,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -555,11 +523,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 555 | 523 | ||
| 556 | @Override | 524 | @Override |
| 557 | public Task getTask(String id) { | 525 | public Task getTask(String id) { |
| 558 | - return taskService.createTaskQuery().taskId(id).singleResult(); | 526 | + return taskService.createTaskQuery().taskId(id).includeTaskLocalVariables().singleResult(); |
| 559 | } | 527 | } |
| 560 | 528 | ||
| 561 | private HistoricTaskInstance getHistoricTask(String id) { | 529 | private HistoricTaskInstance getHistoricTask(String id) { |
| 562 | - return historyService.createHistoricTaskInstanceQuery().taskId(id).singleResult(); | 530 | + return historyService.createHistoricTaskInstanceQuery().taskId(id).includeTaskLocalVariables().singleResult(); |
| 563 | } | 531 | } |
| 564 | 532 | ||
| 565 | @Override | 533 | @Override |
| @@ -594,13 +562,17 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -594,13 +562,17 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 594 | // 1.2 校验源头和目标节点的关系,并返回目标元素 | 562 | // 1.2 校验源头和目标节点的关系,并返回目标元素 |
| 595 | FlowElement targetElement = validateTargetTaskCanReturn(task.getTaskDefinitionKey(), reqVO.getTargetDefinitionKey(), task.getProcessDefinitionId()); | 563 | FlowElement targetElement = validateTargetTaskCanReturn(task.getTaskDefinitionKey(), reqVO.getTargetDefinitionKey(), task.getProcessDefinitionId()); |
| 596 | 564 | ||
| 565 | + // 3. 更新任务扩展表 TODO 芋艿:需要提前搞 | ||
| 566 | + updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.BACK.getResult()); | ||
| 567 | + | ||
| 597 | // 2. 调用 flowable 框架的回退逻辑 | 568 | // 2. 调用 flowable 框架的回退逻辑 |
| 598 | returnTask0(task, targetElement, reqVO); | 569 | returnTask0(task, targetElement, reqVO); |
| 599 | 570 | ||
| 600 | // 3. 更新任务扩展表 | 571 | // 3. 更新任务扩展表 |
| 601 | - taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(task.getId()) | ||
| 602 | - .setResult(BpmProcessInstanceResultEnum.BACK.getResult()) | ||
| 603 | - .setEndTime(LocalDateTime.now()).setReason(reqVO.getReason())); | 572 | +// updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.BACK.getResult()); |
| 573 | +// taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(task.getId()) | ||
| 574 | +// .setResult(BpmProcessInstanceResultEnum.BACK.getResult()) | ||
| 575 | +// .setEndTime(LocalDateTime.now()).setReason(reqVO.getReason())); | ||
| 604 | } | 576 | } |
| 605 | 577 | ||
| 606 | /** | 578 | /** |
| @@ -654,6 +626,9 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -654,6 +626,9 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 654 | } | 626 | } |
| 655 | taskService.addComment(task.getId(), currentTask.getProcessInstanceId(), | 627 | taskService.addComment(task.getId(), currentTask.getProcessInstanceId(), |
| 656 | BpmCommentTypeEnum.BACK.getType().toString(), reqVO.getReason()); | 628 | BpmCommentTypeEnum.BACK.getType().toString(), reqVO.getReason()); |
| 629 | + | ||
| 630 | + // TODO 芋艿:这里加下驳回的 | ||
| 631 | + updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.BACK.getResult()); | ||
| 657 | }); | 632 | }); |
| 658 | 633 | ||
| 659 | // 3. 执行驳回 | 634 | // 3. 执行驳回 |
| @@ -688,9 +663,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -688,9 +663,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 688 | // 3.2 执行委派,将任务委派给 receiveId | 663 | // 3.2 执行委派,将任务委派给 receiveId |
| 689 | taskService.delegateTask(taskId, reqVO.getDelegateUserId().toString()); | 664 | taskService.delegateTask(taskId, reqVO.getDelegateUserId().toString()); |
| 690 | // 3.3 更新任务拓展表为【委派】 | 665 | // 3.3 更新任务拓展表为【委派】 |
| 691 | - taskExtMapper.updateByTaskId( | ||
| 692 | - new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.DELEGATE.getResult()) | ||
| 693 | - .setReason(reqVO.getReason())); | 666 | +// taskExtMapper.updateByTaskId( |
| 667 | +// new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.DELEGATE.getResult()) | ||
| 668 | +// .setReason(reqVO.getReason())); | ||
| 669 | + updateTaskStatus(taskId, BpmProcessInstanceResultEnum.DELEGATE.getResult()); | ||
| 694 | } | 670 | } |
| 695 | 671 | ||
| 696 | /** | 672 | /** |
| @@ -729,15 +705,20 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -729,15 +705,20 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 729 | taskEntity.setOwner(taskEntity.getAssignee()); | 705 | taskEntity.setOwner(taskEntity.getAssignee()); |
| 730 | taskEntity.setAssignee(null); | 706 | taskEntity.setAssignee(null); |
| 731 | // 2.3 更新扩展表状态 | 707 | // 2.3 更新扩展表状态 |
| 732 | - taskExtMapper.updateByTaskId( | ||
| 733 | - new BpmTaskExtDO().setTaskId(taskEntity.getId()) | ||
| 734 | - .setResult(BpmProcessInstanceResultEnum.SIGN_BEFORE.getResult()) | ||
| 735 | - .setReason(reqVO.getReason())); | 708 | +// taskExtMapper.updateByTaskId( |
| 709 | +// new BpmTaskExtDO().setTaskId(taskEntity.getId()) | ||
| 710 | +// .setResult(BpmProcessInstanceResultEnum.SIGN_BEFORE.getResult()) | ||
| 711 | +// .setReason(reqVO.getReason())); | ||
| 712 | +// taskEntity.setTransientVariableLocal(BpmConstants.TASK_VARIABLE_STATUS, BpmProcessInstanceResultEnum.SIGN_BEFORE.getResult()); | ||
| 713 | +// updateTaskStatus(taskEntity.getId(), BpmProcessInstanceResultEnum.SIGN_BEFORE.getResult()); // TODO 芋艿:貌似会有实物并发的问题;所以不能用这个调用,只能 set | ||
| 736 | } | 714 | } |
| 737 | // 2.4 记录加签方式,完成任务时需要用到判断 | 715 | // 2.4 记录加签方式,完成任务时需要用到判断 |
| 738 | taskEntity.setScopeType(reqVO.getType()); | 716 | taskEntity.setScopeType(reqVO.getType()); |
| 739 | // 2.5 保存当前任务修改后的值 | 717 | // 2.5 保存当前任务修改后的值 |
| 740 | taskService.saveTask(taskEntity); | 718 | taskService.saveTask(taskEntity); |
| 719 | + if (reqVO.getType().equals(BpmTaskAddSignTypeEnum.BEFORE.getType())) { | ||
| 720 | + updateTaskStatus(taskEntity.getId(), BpmProcessInstanceResultEnum.WAIT.getResult()); // TODO 芋艿:貌似只能放在这个地方,不然会有并发修改的报错 | ||
| 721 | + } | ||
| 741 | 722 | ||
| 742 | // 3. 创建加签任务 | 723 | // 3. 创建加签任务 |
| 743 | createSignTask(convertList(reqVO.getUserIdList(), String::valueOf), taskEntity); | 724 | createSignTask(convertList(reqVO.getUserIdList(), String::valueOf), taskEntity); |
| @@ -764,12 +745,12 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -764,12 +745,12 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 764 | private TaskEntityImpl validateAddSign(Long userId, BpmTaskAddSignReqVO reqVO) { | 745 | private TaskEntityImpl validateAddSign(Long userId, BpmTaskAddSignReqVO reqVO) { |
| 765 | TaskEntityImpl taskEntity = (TaskEntityImpl) validateTask(userId, reqVO.getId()); | 746 | TaskEntityImpl taskEntity = (TaskEntityImpl) validateTask(userId, reqVO.getId()); |
| 766 | // 向前加签和向后加签不能同时存在 | 747 | // 向前加签和向后加签不能同时存在 |
| 767 | - if (StrUtil.isNotBlank(taskEntity.getScopeType()) | ||
| 768 | - && ObjectUtil.notEqual(BpmTaskAddSignTypeEnum.AFTER_CHILDREN_TASK.getType(), taskEntity.getScopeType()) | 748 | + if (taskEntity.getScopeType() != null |
| 769 | && ObjectUtil.notEqual(taskEntity.getScopeType(), reqVO.getType())) { | 749 | && ObjectUtil.notEqual(taskEntity.getScopeType(), reqVO.getType())) { |
| 770 | throw exception(TASK_ADD_SIGN_TYPE_ERROR, | 750 | throw exception(TASK_ADD_SIGN_TYPE_ERROR, |
| 771 | BpmTaskAddSignTypeEnum.formatDesc(taskEntity.getScopeType()), BpmTaskAddSignTypeEnum.formatDesc(reqVO.getType())); | 751 | BpmTaskAddSignTypeEnum.formatDesc(taskEntity.getScopeType()), BpmTaskAddSignTypeEnum.formatDesc(reqVO.getType())); |
| 772 | } | 752 | } |
| 753 | + | ||
| 773 | // 同一个 key 的任务,审批人不重复 | 754 | // 同一个 key 的任务,审批人不重复 |
| 774 | List<Task> taskList = taskService.createTaskQuery().processInstanceId(taskEntity.getProcessInstanceId()) | 755 | List<Task> taskList = taskService.createTaskQuery().processInstanceId(taskEntity.getProcessInstanceId()) |
| 775 | .taskDefinitionKey(taskEntity.getTaskDefinitionKey()).list(); | 756 | .taskDefinitionKey(taskEntity.getTaskDefinitionKey()).list(); |
| @@ -819,17 +800,23 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -819,17 +800,23 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 819 | // 2.2.1 设置 owner 不设置 assignee 是因为不能同时审批,需要等父任务完成 | 800 | // 2.2.1 设置 owner 不设置 assignee 是因为不能同时审批,需要等父任务完成 |
| 820 | task.setOwner(assignee); | 801 | task.setOwner(assignee); |
| 821 | // 2.2.2 设置向后加签任务的 scopeType 为 afterChildrenTask,用于设置任务扩展表的状态 | 802 | // 2.2.2 设置向后加签任务的 scopeType 为 afterChildrenTask,用于设置任务扩展表的状态 |
| 822 | - task.setScopeType(BpmTaskAddSignTypeEnum.AFTER_CHILDREN_TASK.getType()); | 803 | +// task.setScopeType(BpmTaskAddSignTypeEnum.AFTER_CHILDREN_TASK.getType()); |
| 804 | +// task.setVariableLocal(BpmConstants.TASK_VARIABLE_STATUS, BpmProcessInstanceResultEnum.WAIT.getResult()); | ||
| 823 | } | 805 | } |
| 824 | // 2. 保存子任务 | 806 | // 2. 保存子任务 |
| 825 | taskService.saveTask(task); | 807 | taskService.saveTask(task); |
| 808 | + // 3. TODO | ||
| 809 | + if (BpmTaskAddSignTypeEnum.AFTER.getType().equals(parentTask.getScopeType())) { | ||
| 810 | + updateTaskStatus(task.getId(), BpmProcessInstanceResultEnum.WAIT.getResult()); | ||
| 811 | + } | ||
| 826 | } | 812 | } |
| 827 | 813 | ||
| 828 | @Override | 814 | @Override |
| 829 | @Transactional(rollbackFor = Exception.class) | 815 | @Transactional(rollbackFor = Exception.class) |
| 830 | public void deleteSignTask(Long userId, BpmTaskSubSignReqVO reqVO) { | 816 | public void deleteSignTask(Long userId, BpmTaskSubSignReqVO reqVO) { |
| 831 | // 1.1 校验 task 可以被减签 | 817 | // 1.1 校验 task 可以被减签 |
| 832 | - Task task = validateSubSign(reqVO.getId()); | 818 | +// Task task = validateSubSign(reqVO.getId()); // TODO 芋艿:这个判断,暂时有点问题!在前置加签的时候 |
| 819 | + Task task = validateTaskExist(reqVO.getId()); | ||
| 833 | // 1.2 校验取消人存在 | 820 | // 1.2 校验取消人存在 |
| 834 | AdminUserRespDTO cancelUser = null; | 821 | AdminUserRespDTO cancelUser = null; |
| 835 | if (StrUtil.isNotBlank(task.getAssignee())) { | 822 | if (StrUtil.isNotBlank(task.getAssignee())) { |
| @@ -846,17 +833,18 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -846,17 +833,18 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 846 | // 2.2 删除任务和所有子任务 | 833 | // 2.2 删除任务和所有子任务 |
| 847 | taskService.deleteTasks(allTaskIdList); | 834 | taskService.deleteTasks(allTaskIdList); |
| 848 | // 2.3 修改扩展表状态为取消 | 835 | // 2.3 修改扩展表状态为取消 |
| 849 | - AdminUserRespDTO user = adminUserApi.getUser(userId); | ||
| 850 | - taskExtMapper.updateBatchByTaskIdList(allTaskIdList, new BpmTaskExtDO().setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()) | ||
| 851 | - .setReason(StrUtil.format("由于{}操作[减签],任务被取消", user.getNickname()))); | 836 | +// taskExtMapper.updateBatchByTaskIdList(allTaskIdList, new BpmTaskExtDO().setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()) |
| 837 | +// .setReason(StrUtil.format("由于{}操作[减签],任务被取消", user.getNickname()))); | ||
| 838 | +// allTaskIdList.forEach(taskId -> updateTaskStatus(taskId, BpmProcessInstanceResultEnum.CANCEL.getResult())); // TODO @芋艿:交给取消;考虑到理由,可能不能直接给; | ||
| 852 | 839 | ||
| 853 | // 3. 记录日志到父任务中。先记录日志是因为,通过 handleParentTask 方法之后,任务可能被完成了,并且不存在了,会报异常,所以先记录 | 840 | // 3. 记录日志到父任务中。先记录日志是因为,通过 handleParentTask 方法之后,任务可能被完成了,并且不存在了,会报异常,所以先记录 |
| 841 | + AdminUserRespDTO user = adminUserApi.getUser(userId); | ||
| 854 | String comment = StrUtil.format(BpmCommentTypeEnum.SUB_SIGN.getComment(), user.getNickname(), cancelUser.getNickname()); | 842 | String comment = StrUtil.format(BpmCommentTypeEnum.SUB_SIGN.getComment(), user.getNickname(), cancelUser.getNickname()); |
| 855 | taskService.addComment(task.getParentTaskId(), task.getProcessInstanceId(), | 843 | taskService.addComment(task.getParentTaskId(), task.getProcessInstanceId(), |
| 856 | BpmCommentTypeEnum.SUB_SIGN.getType().toString(), comment); | 844 | BpmCommentTypeEnum.SUB_SIGN.getType().toString(), comment); |
| 857 | 845 | ||
| 858 | // 4. 处理当前任务的父任务 | 846 | // 4. 处理当前任务的父任务 |
| 859 | - handleParentTask(task); | 847 | + handleParentTaskNew(task.getParentTaskId()); |
| 860 | } | 848 | } |
| 861 | 849 | ||
| 862 | /** | 850 | /** |
| @@ -954,17 +942,16 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -954,17 +942,16 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 954 | if (CollUtil.isEmpty(taskList)) { | 942 | if (CollUtil.isEmpty(taskList)) { |
| 955 | return Collections.emptyList(); | 943 | return Collections.emptyList(); |
| 956 | } | 944 | } |
| 957 | - List<String> childrenTaskIdList = convertList(taskList, Task::getId); | ||
| 958 | 945 | ||
| 959 | // 2.1 将 owner 和 assignee 统一到一个集合中 | 946 | // 2.1 将 owner 和 assignee 统一到一个集合中 |
| 960 | List<Long> userIds = convertListByFlatMap(taskList, control -> | 947 | List<Long> userIds = convertListByFlatMap(taskList, control -> |
| 961 | Stream.of(NumberUtils.parseLong(control.getAssignee()), NumberUtils.parseLong(control.getOwner())) | 948 | Stream.of(NumberUtils.parseLong(control.getAssignee()), NumberUtils.parseLong(control.getOwner())) |
| 962 | - .filter(Objects::nonNull)); | 949 | + .filter(Objects::nonNull)); // TODO 芋艿:这里可能可以优化下 |
| 963 | // 2.2 组装数据 | 950 | // 2.2 组装数据 |
| 964 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); | 951 | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| 965 | - List<BpmTaskExtDO> taskExtList = taskExtMapper.selectProcessListByTaskIds(childrenTaskIdList); | ||
| 966 | - Map<String, Task> idTaskMap = convertMap(taskList, TaskInfo::getId); | ||
| 967 | - return BpmTaskConvert.INSTANCE.convertList(taskExtList, userMap, idTaskMap); | 952 | +// List<BpmTaskExtDO> taskExtList = taskExtMapper.selectProcessListByTaskIds(childrenTaskIdList); |
| 953 | +// Map<String, Task> idTaskMap = convertMap(taskList, TaskInfo::getId); | ||
| 954 | + return BpmTaskConvert.INSTANCE.convertList(taskList, userMap); | ||
| 968 | } | 955 | } |
| 969 | 956 | ||
| 970 | @Override | 957 | @Override |