feat:审批通过时,查询下一个执行节点,校验流程执行正确与否

This commit is contained in:
smallNorthLee 2025-03-03 22:38:05 +08:00
parent d41cce94cd
commit 6e2d00d561
2 changed files with 11 additions and 6 deletions

View File

@ -169,7 +169,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
Long startUserId = loginUserId; // 流程发起人 Long startUserId = loginUserId; // 流程发起人
HistoricProcessInstance historicProcessInstance = null; // 流程实例 HistoricProcessInstance historicProcessInstance = null; // 流程实例
Integer processInstanceStatus = BpmProcessInstanceStatusEnum.NOT_START.getStatus(); // 流程状态 Integer processInstanceStatus = BpmProcessInstanceStatusEnum.NOT_START.getStatus(); // 流程状态
Map<String, Object> processVariables = reqVO.getProcessVariables(); // 流程变量 Map<String, Object> processVariables = new HashMap<>(); // 流程变量
// 1.2 如果是流程已发起的场景则使用流程实例的数据 // 1.2 如果是流程已发起的场景则使用流程实例的数据
if (reqVO.getProcessInstanceId() != null) { if (reqVO.getProcessInstanceId() != null) {
historicProcessInstance = getHistoricProcessInstance(reqVO.getProcessInstanceId()); historicProcessInstance = getHistoricProcessInstance(reqVO.getProcessInstanceId());
@ -180,10 +180,12 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
processInstanceStatus = FlowableUtils.getProcessInstanceStatus(historicProcessInstance); processInstanceStatus = FlowableUtils.getProcessInstanceStatus(historicProcessInstance);
// 合并 DB 和前端传递的流量变量以前端的为主 // 合并 DB 和前端传递的流量变量以前端的为主
Map<String, Object> historicVariables = historicProcessInstance.getProcessVariables(); Map<String, Object> historicVariables = historicProcessInstance.getProcessVariables();
if (CollUtil.isNotEmpty(processVariables)) { if (CollUtil.isNotEmpty(historicVariables)) {
historicVariables.putAll(processVariables); processVariables.putAll(historicVariables);
} }
processVariables = historicVariables; }
if (CollUtil.isNotEmpty(reqVO.getProcessVariables())) {
processVariables.putAll(reqVO.getProcessVariables());
} }
// 1.3 读取其它相关数据 // 1.3 读取其它相关数据
ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition(

View File

@ -531,6 +531,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
// 校验传递的参数中是否为下一个将要执行的任务节点 // 校验传递的参数中是否为下一个将要执行的任务节点
Map<String, Object> variables = validateAndSetNextAssignees(task.getTaskDefinitionKey(), reqVO.getVariables(), Map<String, Object> variables = validateAndSetNextAssignees(task.getTaskDefinitionKey(), reqVO.getVariables(),
bpmnModel, reqVO.getNextAssignees(), instance); bpmnModel, reqVO.getNextAssignees(), instance);
runtimeService.setVariables(task.getProcessInstanceId(), variables);
taskService.complete(task.getId(), variables, true); taskService.complete(task.getId(), variables, true);
} else { } else {
taskService.complete(task.getId()); taskService.complete(task.getId());
@ -555,6 +556,10 @@ public class BpmTaskServiceImpl implements BpmTaskService {
*/ */
private Map<String, Object> validateAndSetNextAssignees(String taskDefinitionKey, Map<String, Object> variables, BpmnModel bpmnModel, private Map<String, Object> validateAndSetNextAssignees(String taskDefinitionKey, Map<String, Object> variables, BpmnModel bpmnModel,
Map<String, List<Long>> nextAssignees, ProcessInstance processInstance) { Map<String, List<Long>> nextAssignees, ProcessInstance processInstance) {
// 下一个节点参数为空不做处理表示流程正常流转无需选择下一个节点的审判人
if (CollUtil.isEmpty(nextAssignees)){
return variables;
}
// 1. 获取当前任务节点的信息 // 1. 获取当前任务节点的信息
FlowElement flowElement = bpmnModel.getFlowElement(taskDefinitionKey); FlowElement flowElement = bpmnModel.getFlowElement(taskDefinitionKey);
// 2. 获取下一个将要执行的节点集合 // 2. 获取下一个将要执行的节点集合
@ -587,7 +592,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
// 4.3.3 校验通过的全部节点和审批人 // 4.3.3 校验通过的全部节点和审批人
allNextAssignees.put(nextFlowNode.getId(), nextAssignees.get(nextFlowNode.getId())); allNextAssignees.put(nextFlowNode.getId(), nextAssignees.get(nextFlowNode.getId()));
} }
// TODO @小北加一个审批人选择的校验
} }
// variables 是存储动态表单到 local 任务级别过滤一下避免 ProcessInstance 系统级的变量被占用 // variables 是存储动态表单到 local 任务级别过滤一下避免 ProcessInstance 系统级的变量被占用
Map<String, Object> newVariables = FlowableUtils.filterTaskFormVariable(variables); Map<String, Object> newVariables = FlowableUtils.filterTaskFormVariable(variables);
@ -599,7 +603,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
newVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES, hisProcessVariables); newVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_APPROVE_USER_SELECT_ASSIGNEES, hisProcessVariables);
// 设置流程变量,发起人自选后续的节点或者回退后再或者驳回重新发起的场景可能存在发起人自选或者审批人自选所以中两个变量值要保持一致否则会查询不到审批人 // 设置流程变量,发起人自选后续的节点或者回退后再或者驳回重新发起的场景可能存在发起人自选或者审批人自选所以中两个变量值要保持一致否则会查询不到审批人
newVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, hisProcessVariables); newVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, hisProcessVariables);
runtimeService.setVariables(processInstance.getProcessInstanceId(), newVariables);
} }
return newVariables; return newVariables;
} }