Commit 937fd731609def86c9bf09a12107d7c8cea88501

Authored by 芋道源码
Committed by Gitee
2 parents 176e8714 d2bf9945

!1395 feat: 工作流支持审批人撤回

Merge pull request !1395 from Lesan/feature/bpm-审批人撤回
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java
@@ -97,6 +97,9 @@ public class BpmModelMetaInfoVO { @@ -97,6 +97,9 @@ public class BpmModelMetaInfoVO {
97 @Schema(description = "任务后置通知设置", example = "{}") 97 @Schema(description = "任务后置通知设置", example = "{}")
98 private HttpRequestSetting taskAfterTriggerSetting; 98 private HttpRequestSetting taskAfterTriggerSetting;
99 99
  100 + @Schema(description = "允许允许审批人撤回任务", example = "false")
  101 + private Boolean allowWithdrawTask;
  102 +
100 @Schema(description = "流程 ID 规则") 103 @Schema(description = "流程 ID 规则")
101 @Data 104 @Data
102 @Valid 105 @Valid
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
@@ -219,6 +219,14 @@ public class BpmTaskController { @@ -219,6 +219,14 @@ public class BpmTaskController {
219 return success(true); 219 return success(true);
220 } 220 }
221 221
  222 + @PutMapping("/withdraw")
  223 + @Operation(summary = "撤回任务")
  224 + @PreAuthorize("@ss.hasPermission('bpm:task:update')")
  225 + public CommonResult<Boolean> withdrawTask(@RequestParam("taskId") String taskId) {
  226 + taskService.withdrawTask(getLoginUserId(), taskId);
  227 + return success(true);
  228 + }
  229 +
222 @GetMapping("/list-by-parent-task-id") 230 @GetMapping("/list-by-parent-task-id")
223 @Operation(summary = "获得指定父级任务的子任务列表") // 目前用于,减签的时候,获得子任务列表 231 @Operation(summary = "获得指定父级任务的子任务列表") // 目前用于,减签的时候,获得子任务列表
224 @Parameter(name = "parentTaskId", description = "父级任务编号", required = true) 232 @Parameter(name = "parentTaskId", description = "父级任务编号", required = true)
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java
@@ -219,4 +219,9 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { @@ -219,4 +219,9 @@ public class BpmProcessDefinitionInfoDO extends BaseDO {
219 @TableField(typeHandler = JacksonTypeHandler.class) 219 @TableField(typeHandler = JacksonTypeHandler.class)
220 private BpmModelMetaInfoVO.HttpRequestSetting taskAfterTriggerSetting; 220 private BpmModelMetaInfoVO.HttpRequestSetting taskAfterTriggerSetting;
221 221
  222 + /**
  223 + * 是否允许审批人撤回任务
  224 + */
  225 + private Boolean allowWithdrawTask;
  226 +
222 } 227 }
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
@@ -61,6 +61,10 @@ public interface ErrorCodeConstants { @@ -61,6 +61,10 @@ public interface ErrorCodeConstants {
61 ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!"); 61 ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!");
62 ErrorCode TASK_SIGNATURE_NOT_EXISTS = new ErrorCode(1_009_005_015, "签名不能为空!"); 62 ErrorCode TASK_SIGNATURE_NOT_EXISTS = new ErrorCode(1_009_005_015, "签名不能为空!");
63 ErrorCode TASK_REASON_REQUIRE = new ErrorCode(1_009_005_016, "审批意见不能为空!"); 63 ErrorCode TASK_REASON_REQUIRE = new ErrorCode(1_009_005_016, "审批意见不能为空!");
  64 + ErrorCode TASK_WITHDRAW_FAIL_PROCESS_NOT_RUNNING = new ErrorCode(1_009_005_017, "撤回失败,流程实例未运行!");
  65 + ErrorCode TASK_WITHDRAW_FAIL_TASK_NOT_EXISTS = new ErrorCode(1_009_005_018, "撤回失败,未查询到用户已办任务!");
  66 + ErrorCode TASK_WITHDRAW_FAIL_NOT_ALLOW = new ErrorCode(1_009_005_019, "撤回失败,此流程不允许撤回操作!");
  67 + ErrorCode TASK_WITHDRAW_FAIL_NEXT_TASK_NOT_ALLOW = new ErrorCode(1_009_005_019, "撤回失败,下一节点不满足撤回条件!");
64 68
65 // ========== 动态表单模块 1-009-010-000 ========== 69 // ========== 动态表单模块 1-009-010-000 ==========
66 ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在"); 70 ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在");
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java
@@ -35,6 +35,7 @@ public enum BpmReasonEnum { @@ -35,6 +35,7 @@ public enum BpmReasonEnum {
35 APPROVE_TYPE_AUTO_APPROVE("非人工审核,自动通过"), 35 APPROVE_TYPE_AUTO_APPROVE("非人工审核,自动通过"),
36 APPROVE_TYPE_AUTO_REJECT("非人工审核,自动不通过"), 36 APPROVE_TYPE_AUTO_REJECT("非人工审核,自动不通过"),
37 CANCEL_BY_PROCESS_CLEAN("进程清理自动取消"), 37 CANCEL_BY_PROCESS_CLEAN("进程清理自动取消"),
  38 + CANCEL_BY_WITHDRAW("前一任务撤回,系统自动取消"),
38 ; 39 ;
39 40
40 private final String reason; 41 private final String reason;
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java
@@ -909,6 +909,48 @@ public class BpmnModelUtils { @@ -909,6 +909,48 @@ public class BpmnModelUtils {
909 } 909 }
910 910
911 /** 911 /**
  912 + * 查找起始节点下一个用户任务列表列表
  913 + * @param source 起始节点
  914 + * @return 结果
  915 + */
  916 + public static List<UserTask> getNextUserTasks(FlowElement source) {
  917 + return getNextUserTasks(source, null, null);
  918 + }
  919 +
  920 + /**
  921 + * 查找起始节点下一个用户任务列表列表
  922 + * @param source 起始节点
  923 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复
  924 + * @param userTaskList 用户任务列表
  925 + * @return 结果
  926 + */
  927 + public static List<UserTask> getNextUserTasks(FlowElement source, Set<String> hasSequenceFlow, List<UserTask> userTaskList) {
  928 + hasSequenceFlow = Optional.ofNullable(hasSequenceFlow).orElse(new HashSet<>());
  929 + userTaskList = Optional.ofNullable(userTaskList).orElse(new ArrayList<>());
  930 + // 获取出口连线
  931 + List<SequenceFlow> sequenceFlows = getElementOutgoingFlows(source);
  932 + if (!sequenceFlows.isEmpty()) {
  933 + for (SequenceFlow sequenceFlow : sequenceFlows) {
  934 + // 如果发现连线重复,说明循环了,跳过这个循环
  935 + if (hasSequenceFlow.contains(sequenceFlow.getId())) {
  936 + continue;
  937 + }
  938 + // 添加已经走过的连线
  939 + hasSequenceFlow.add(sequenceFlow.getId());
  940 + FlowElement targetFlowElement = sequenceFlow.getTargetFlowElement();
  941 + if (targetFlowElement instanceof UserTask) {
  942 + // 若节点为用户任务,加入到结果列表中
  943 + userTaskList.add((UserTask) targetFlowElement);
  944 + } else {
  945 + // 若节点非用户任务,继续递归查找下一个节点
  946 + getNextUserTasks(targetFlowElement, hasSequenceFlow, userTaskList);
  947 + }
  948 + }
  949 + }
  950 + return userTaskList;
  951 + }
  952 +
  953 + /**
912 * 处理排它网关 954 * 处理排它网关
913 * 955 *
914 * @param gateway 排他网关 956 * @param gateway 排他网关
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
@@ -250,6 +250,14 @@ public interface BpmTaskService { @@ -250,6 +250,14 @@ public interface BpmTaskService {
250 */ 250 */
251 void copyTask(Long userId, @Valid BpmTaskCopyReqVO reqVO); 251 void copyTask(Long userId, @Valid BpmTaskCopyReqVO reqVO);
252 252
  253 + /**
  254 + * 撤回任务
  255 + *
  256 + * @param userId 用户编号
  257 + * @param taskId 任务编号
  258 + */
  259 + void withdrawTask(Long userId, String taskId);
  260 +
253 // ========== Event 事件相关方法 ========== 261 // ========== Event 事件相关方法 ==========
254 262
255 /** 263 /**
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -40,10 +40,9 @@ import jakarta.annotation.Resource; @@ -40,10 +40,9 @@ import jakarta.annotation.Resource;
40 import jakarta.validation.Valid; 40 import jakarta.validation.Valid;
41 import lombok.extern.slf4j.Slf4j; 41 import lombok.extern.slf4j.Slf4j;
42 import org.flowable.bpmn.model.*; 42 import org.flowable.bpmn.model.*;
43 -import org.flowable.engine.HistoryService;  
44 -import org.flowable.engine.ManagementService;  
45 -import org.flowable.engine.RuntimeService;  
46 -import org.flowable.engine.TaskService; 43 +import org.flowable.common.engine.api.FlowableException;
  44 +import org.flowable.common.engine.api.FlowableObjectNotFoundException;
  45 +import org.flowable.engine.*;
47 import org.flowable.engine.history.HistoricActivityInstance; 46 import org.flowable.engine.history.HistoricActivityInstance;
48 import org.flowable.engine.runtime.ActivityInstance; 47 import org.flowable.engine.runtime.ActivityInstance;
49 import org.flowable.engine.runtime.Execution; 48 import org.flowable.engine.runtime.Execution;
@@ -62,6 +61,7 @@ import org.springframework.transaction.support.TransactionSynchronization; @@ -62,6 +61,7 @@ import org.springframework.transaction.support.TransactionSynchronization;
62 import org.springframework.transaction.support.TransactionSynchronizationManager; 61 import org.springframework.transaction.support.TransactionSynchronizationManager;
63 62
64 import java.util.*; 63 import java.util.*;
  64 +import java.util.stream.Collectors;
65 import java.util.stream.Stream; 65 import java.util.stream.Stream;
66 66
67 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 67 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -196,7 +196,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -196,7 +196,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
196 /** 196 /**
197 * 获得用户指定 processInstanceId 流程编号下的首个“待办”(未审批、且可审核)的任务 197 * 获得用户指定 processInstanceId 流程编号下的首个“待办”(未审批、且可审核)的任务
198 * 198 *
199 - * @param userId 用户编号 199 + * @param userId 用户编号
200 * @param processInstanceId 流程编号 200 * @param processInstanceId 流程编号
201 * @return 任务 201 * @return 任务
202 */ 202 */
@@ -599,15 +599,15 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -599,15 +599,15 @@ public class BpmTaskServiceImpl implements BpmTaskService {
599 599
600 /** 600 /**
601 * 校验选择的下一个节点的审批人,是否合法 601 * 校验选择的下一个节点的审批人,是否合法
602 - * 602 + * <p>
603 * 1. 是否有漏选:没有选择审批人 603 * 1. 是否有漏选:没有选择审批人
604 * 2. 是否有多选:非下一个节点 604 * 2. 是否有多选:非下一个节点
605 * 605 *
606 * @param taskDefinitionKey 当前任务节点标识 606 * @param taskDefinitionKey 当前任务节点标识
607 - * @param variables 流程变量  
608 - * @param bpmnModel 流程模型  
609 - * @param nextAssignees 下一个节点审批人集合(参数)  
610 - * @param processInstance 流程实例 607 + * @param variables 流程变量
  608 + * @param bpmnModel 流程模型
  609 + * @param nextAssignees 下一个节点审批人集合(参数)
  610 + * @param processInstance 流程实例
611 */ 611 */
612 @SuppressWarnings("unchecked") 612 @SuppressWarnings("unchecked")
613 private Map<String, Object> validateAndSetNextAssignees(String taskDefinitionKey, Map<String, Object> variables, BpmnModel bpmnModel, 613 private Map<String, Object> validateAndSetNextAssignees(String taskDefinitionKey, Map<String, Object> variables, BpmnModel bpmnModel,
@@ -659,7 +659,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -659,7 +659,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
659 approveUserSelectAssignees = new HashMap<>(); 659 approveUserSelectAssignees = new HashMap<>();
660 } 660 }
661 approveUserSelectAssignees.put(nextFlowNode.getId(), assignees); 661 approveUserSelectAssignees.put(nextFlowNode.getId(), assignees);
662 - Map<String,List<Long>> existingApproveUserSelectAssignees = (Map<String,List<Long>>) variables.get( 662 + Map<String, List<Long>> existingApproveUserSelectAssignees = (Map<String, List<Long>>) variables.get(
663 BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES); 663 BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES);
664 if (CollUtil.isNotEmpty(existingApproveUserSelectAssignees)) { 664 if (CollUtil.isNotEmpty(existingApproveUserSelectAssignees)) {
665 approveUserSelectAssignees.putAll(existingApproveUserSelectAssignees); 665 approveUserSelectAssignees.putAll(existingApproveUserSelectAssignees);
@@ -1177,6 +1177,70 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -1177,6 +1177,70 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1177 processInstanceCopyService.createProcessInstanceCopy(reqVO.getCopyUserIds(), reqVO.getReason(), reqVO.getId()); 1177 processInstanceCopyService.createProcessInstanceCopy(reqVO.getCopyUserIds(), reqVO.getReason(), reqVO.getId());
1178 } 1178 }
1179 1179
  1180 + @Override
  1181 + @Transactional(rollbackFor = Exception.class)
  1182 + public void withdrawTask(Long userId, String taskId) {
  1183 + // 1.查询本人已办任务
  1184 + HistoricTaskInstance taskInstance = historyService.createHistoricTaskInstanceQuery()
  1185 + .taskId(taskId).taskAssignee(userId.toString()).finished().singleResult();
  1186 + if (ObjectUtil.isNull(taskInstance)) {
  1187 + throw exception(TASK_WITHDRAW_FAIL_TASK_NOT_EXISTS);
  1188 + }
  1189 + // 2.校验流程是否结束
  1190 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
  1191 + .processInstanceId(taskInstance.getProcessInstanceId())
  1192 + .active()
  1193 + .singleResult();
  1194 + if (ObjectUtil.isNull(processInstance)) {
  1195 + throw exception(TASK_WITHDRAW_FAIL_PROCESS_NOT_RUNNING);
  1196 + }
  1197 + // 3.判断此流程是否允许撤回
  1198 + BpmProcessDefinitionInfoDO processDefinitionInfo = bpmProcessDefinitionService
  1199 + .getProcessDefinitionInfo(processInstance.getProcessDefinitionId());
  1200 + if (ObjectUtil.isNull(processDefinitionInfo) || !Boolean.TRUE.equals(processDefinitionInfo.getAllowWithdrawTask())) {
  1201 + throw exception(TASK_WITHDRAW_FAIL_NOT_ALLOW);
  1202 + }
  1203 + // 4.判断此任务下一节点是否满足撤回
  1204 + BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(taskInstance.getProcessDefinitionId());
  1205 + UserTask userTask = (UserTask) BpmnModelUtils.getFlowElementById(bpmnModel, taskInstance.getTaskDefinitionKey());
  1206 + List<UserTask> nextUserTaskList = BpmnModelUtils.getNextUserTasks(userTask);
  1207 + List<String> nextUserTaskKeys = nextUserTaskList.stream().map(UserTask::getId).toList();
  1208 + if (CollUtil.isEmpty(nextUserTaskKeys)) {
  1209 + throw exception(TASK_WITHDRAW_FAIL_NEXT_TASK_NOT_ALLOW);
  1210 + }
  1211 + long nextUserTaskFinishedCount = historyService.createHistoricTaskInstanceQuery()
  1212 + .processInstanceId(processInstance.getProcessInstanceId())
  1213 + .taskDefinitionKeys(nextUserTaskKeys)
  1214 + .taskCreatedAfter(taskInstance.getEndTime()) // TODO @芋艿:是否选择升级flowable版本解决taskCreatedAfter、taskCreatedBefore问题,升级7.1.0可以
  1215 + .finished()
  1216 + .count();
  1217 + if (nextUserTaskFinishedCount > 0) {
  1218 + throw exception(TASK_WITHDRAW_FAIL_NEXT_TASK_NOT_ALLOW);
  1219 + }
  1220 + // 5.获取需要撤回的运行任务
  1221 + List<Task> runningTaskList = taskService.createTaskQuery()
  1222 + .processInstanceId(processInstance.getProcessInstanceId())
  1223 + .taskDefinitionKeys(nextUserTaskKeys)
  1224 + .active().list();
  1225 + if (CollUtil.isEmpty(runningTaskList)) {
  1226 + throw exception(TASK_WITHDRAW_FAIL_NEXT_TASK_NOT_ALLOW);
  1227 + }
  1228 + List<String> withdrawExecutionIds = new ArrayList<>();
  1229 + for (Task task : runningTaskList) {
  1230 + // 标记撤回任务为取消
  1231 + // TODO @芋艿:是否需要添加被撤回状态?
  1232 + taskService.addComment(task.getId(), taskInstance.getProcessInstanceId(), BpmCommentTypeEnum.CANCEL.getType(),
  1233 + BpmCommentTypeEnum.CANCEL.formatComment("前一节点撤回"));
  1234 + updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.CANCEL.getStatus(), BpmReasonEnum.CANCEL_BY_WITHDRAW.getReason());
  1235 + withdrawExecutionIds.add(task.getExecutionId());
  1236 + }
  1237 + // 6.执行撤回操作
  1238 + runtimeService.createChangeActivityStateBuilder()
  1239 + .processInstanceId(processInstance.getProcessInstanceId())
  1240 + .moveExecutionsToSingleActivityId(withdrawExecutionIds, taskInstance.getTaskDefinitionKey())
  1241 + .changeState();
  1242 + }
  1243 +
1180 /** 1244 /**
1181 * 校验任务是否能被减签 1245 * 校验任务是否能被减签
1182 * 1246 *
@@ -1223,7 +1287,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -1223,7 +1287,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1223 } 1287 }
1224 1288
1225 // 2. 任务前置通知 1289 // 2. 任务前置通知
1226 - if (ObjUtil.isNotNull(processDefinitionInfo.getTaskBeforeTriggerSetting())){ 1290 + if (ObjUtil.isNotNull(processDefinitionInfo.getTaskBeforeTriggerSetting())) {
1227 BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getTaskBeforeTriggerSetting(); 1291 BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getTaskBeforeTriggerSetting();
1228 BpmHttpRequestUtils.executeBpmHttpRequest(processInstance, 1292 BpmHttpRequestUtils.executeBpmHttpRequest(processInstance,
1229 setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse()); 1293 setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse());
@@ -1350,7 +1414,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -1350,7 +1414,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1350 .taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, BpmTaskStatusEnum.APPROVE.getStatus()) 1414 .taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, BpmTaskStatusEnum.APPROVE.getStatus())
1351 .finished(); 1415 .finished();
1352 if (BpmAutoApproveTypeEnum.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType()) 1416 if (BpmAutoApproveTypeEnum.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType())
1353 - && sameAssigneeQuery.count() > 0) { 1417 + && sameAssigneeQuery.count() > 0) {
1354 getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) 1418 getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId())
1355 .setReason(BpmAutoApproveTypeEnum.APPROVE_ALL.getName())); 1419 .setReason(BpmAutoApproveTypeEnum.APPROVE_ALL.getName()));
1356 return; 1420 return;
@@ -1362,7 +1426,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -1362,7 +1426,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1362 return; 1426 return;
1363 } 1427 }
1364 List<String> sourceTaskIds = convertList(BpmnModelUtils.getElementIncomingFlows( // 获取所有上一个节点 1428 List<String> sourceTaskIds = convertList(BpmnModelUtils.getElementIncomingFlows( // 获取所有上一个节点
1365 - BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey())), 1429 + BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey())),
1366 SequenceFlow::getSourceRef); 1430 SequenceFlow::getSourceRef);
1367 if (sameAssigneeQuery.taskDefinitionKeys(sourceTaskIds).count() > 0) { 1431 if (sameAssigneeQuery.taskDefinitionKeys(sourceTaskIds).count() > 0) {
1368 getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) 1432 getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId())
@@ -1387,7 +1451,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -1387,7 +1451,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1387 PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE, String.class)); 1451 PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE, String.class));
1388 if (userTaskElement.getId().equals(START_USER_NODE_ID) 1452 if (userTaskElement.getId().equals(START_USER_NODE_ID)
1389 && (skipStartUserNodeFlag == null // 目的:一般是“主流程”,发起人节点,自动通过审核 1453 && (skipStartUserNodeFlag == null // 目的:一般是“主流程”,发起人节点,自动通过审核
1390 - || BooleanUtil.isTrue(skipStartUserNodeFlag)) // 目的:一般是“子流程”,发起人节点,按配置自动通过审核 1454 + || BooleanUtil.isTrue(skipStartUserNodeFlag)) // 目的:一般是“子流程”,发起人节点,按配置自动通过审核
1391 && ObjUtil.notEqual(returnTaskFlag, Boolean.TRUE)) { 1455 && ObjUtil.notEqual(returnTaskFlag, Boolean.TRUE)) {
1392 getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) 1456 getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId())
1393 .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_SKIP_START_USER_NODE.getReason())); 1457 .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_SKIP_START_USER_NODE.getReason()));
@@ -1456,7 +1520,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -1456,7 +1520,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1456 } 1520 }
1457 1521
1458 // 任务后置通知 1522 // 任务后置通知
1459 - if (ObjUtil.isNotNull(processDefinitionInfo.getTaskAfterTriggerSetting())){ 1523 + if (ObjUtil.isNotNull(processDefinitionInfo.getTaskAfterTriggerSetting())) {
1460 BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getTaskAfterTriggerSetting(); 1524 BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getTaskAfterTriggerSetting();
1461 BpmHttpRequestUtils.executeBpmHttpRequest(processInstance, 1525 BpmHttpRequestUtils.executeBpmHttpRequest(processInstance,
1462 setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse()); 1526 setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse());