Commit d40fa0f929224e0eb2ac55236d651487cccf6318

Authored by YunaiV
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