REQ-2924-修复自动审批节点审批任务计算错误问题

This commit is contained in:
yangqicheng 2024-09-18 15:38:46 +08:00
parent e235952257
commit 2b98fc5311
2 changed files with 51 additions and 39 deletions

View File

@ -39,7 +39,7 @@ public enum BpmnTaskRespCode implements IModuleRespCode {
ASSIGNER_NUMBER_EXCEEDS_NUMBER_LIMIT("022", String.format("人员数量超过限制,节点审批人限制数量为: %d!", APPROVAL_ASSIGNER_LIMIT_NUMBER)),
BACK_TARGET_ACTIVITY_NOT_EXISTS("023", "回退到指定节点【{}】失败!"),
BACK_NODE_CANNOT_REACHABLE("024", "退回节点【{}】不可达,不允许退回"),
REACHED_BACKED_MAXIMUM_NUM("025", "达到退回操作次数上限【{}】次"),
REACHED_BACKED_MAXIMUM_NUM("025", "达到退操作次数上限【{}】次"),
;
private final String code;

View File

@ -24,6 +24,7 @@ import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
@ -57,8 +58,8 @@ public class CheckApproverServiceImpl implements CheckApproverService {
//业务节点,指定业务审批人,或者业务设置了审批人,也要参与自动过审,node_type为NODE_BUSINESS,节点元素类型为UserTask
//业务节点审批人为空,或者人员未指定,此时不进行自动过审操作,需要再业务指定审批人后,再做自动过审动作
if (!(Objects.equals(currentNodeType, NODE_TASK) || Objects.equals(currentNodeType, NODE_BUSINESS)) ||
!StringUtils.hasText(delegateTask.getAssignee()) ||
delegateTask.getAssignee().equals(NO_ASSIGNEE)) {
!StringUtils.hasText(delegateTask.getAssignee()) ||
delegateTask.getAssignee().equals(NO_ASSIGNEE)) {
return exists.get();
}
Optional<BpmnButtonConf> optConfig = BpmnMetaParserHelper.getButtonConfig(mainProcess, delegateTask.getTaskDefinitionKey());
@ -71,49 +72,60 @@ public class CheckApproverServiceImpl implements CheckApproverService {
return exists.get();
}
Optional<BpmnButtonMetaInfo> agreeButton = currentButtons.stream()
.filter(button -> button.getType().equals("SYSTEM") //系统按钮
&& button.getChecked() != null && button.getChecked() //选中
&& (button.getDisabled() == null || !button.getDisabled()) //没用禁用
&& button.getBtnKey().equals(BpmnButtonEnum.BPMN_APPROVE.getBtnKey())) //类型为同意
.findFirst();
.filter(button -> button.getType().equals("SYSTEM") //系统按钮
&& button.getChecked() != null && button.getChecked() //选中
&& (button.getDisabled() == null || !button.getDisabled()) //没用禁用
&& button.getBtnKey().equals(BpmnButtonEnum.BPMN_APPROVE.getBtnKey())) //类型为同意
.findFirst();
//不存在同意按钮
if (!agreeButton.isPresent()) {
return exists.get();
}
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
processEngineConfiguration.getActivityInstanceEntityManager()
.findActivityInstancesByProcessInstanceId(delegateTask.getProcessInstanceId(), false)
.stream()
.filter(i -> !Objects.equals(i.getActivityId(), userTask.getId()))
.filter(i -> !Objects.equals(i.getActivityType(), "exclusiveGateway"))
.filter(i -> !Objects.equals(i.getActivityType(), "sequenceFlow"))
.max(Comparator.comparing(ActivityInstanceEntity::getStartTime))
.ifPresent(i -> {
// 与发起人比对
if (Objects.equals(NODE_STARTER.getType(), i.getActivityId())) {
BpmnTaskDelegateAssigner initiator = BpmnTaskDelegateAssigner.toObjectCompatible(delegateTask.getVariable(INTERNAL_INITIATOR));
if (Objects.nonNull(initiator) && initiator.comparePersonIdToOther(delegateTask.getAssignee())) {
exists.compareAndSet(false, true);
}
} else {
FlowElement flowElement = mainProcess.getFlowElement(i.getActivityId());
BpmnMetaParserHelper.getNodeType(flowElement).ifPresent(j -> {
//上一节点如果是业务节点,但是是人员审批,也需要加入到自动过审
if (Objects.equals(NODE_TASK, j) || (Objects.equals(NODE_BUSINESS, j) && flowElement.getClass().isAssignableFrom(UserTask.class))) {
ExtHiTaskSearchDTO searchDTO = new ExtHiTaskSearchDTO();
searchDTO.setProcessInstanceId(delegateTask.getProcessInstanceId());
searchDTO.setTaskDefinitionKey(i.getActivityId());
taskOperationContext.getExtAxHiTaskInsts(() -> extAxHiTaskInstService.queryList(searchDTO))
.stream().filter(e -> Objects.equals(e.getStatus(), APPROVED.getStatus()))
.map(ExtAxHiTaskInst::getAssignee)
.filter(Objects::nonNull)
.filter(StringUtils::hasText)
.filter(k -> specialApproverComparison(k, delegateTask.getAssignee()))
.findAny().ifPresent(k -> exists.compareAndSet(false, true));
}
});
.findActivityInstancesByProcessInstanceId(delegateTask.getProcessInstanceId(), false)
.stream()
.filter(i -> !Objects.equals(i.getActivityId(), userTask.getId()))
.filter(i -> !Objects.equals(i.getActivityType(), "exclusiveGateway"))
.filter(i -> !Objects.equals(i.getActivityType(), "sequenceFlow"))
.max(Comparator.comparing(ActivityInstanceEntity::getStartTime))
.ifPresent(i -> {
// 与发起人比对
if (Objects.equals(NODE_STARTER.getType(), i.getActivityId())) {
BpmnTaskDelegateAssigner initiator = BpmnTaskDelegateAssigner.toObjectCompatible(delegateTask.getVariable(INTERNAL_INITIATOR));
if (Objects.nonNull(initiator) && initiator.comparePersonIdToOther(delegateTask.getAssignee())) {
exists.compareAndSet(false, true);
}
});
} else {
FlowElement flowElement = mainProcess.getFlowElement(i.getActivityId());
BpmnMetaParserHelper.getNodeType(flowElement).ifPresent(j -> {
//上一节点如果是业务节点,但是是人员审批,也需要加入到自动过审
if (Objects.equals(NODE_TASK, j) || (Objects.equals(NODE_BUSINESS, j) && flowElement.getClass().isAssignableFrom(UserTask.class))) {
ExtHiTaskSearchDTO searchDTO = new ExtHiTaskSearchDTO();
searchDTO.setProcessInstanceId(delegateTask.getProcessInstanceId());
List<ExtAxHiTaskInst> extAxHiTaskInsts = extAxHiTaskInstService.queryList(searchDTO);
extAxHiTaskInsts.sort(Comparator.comparing(ExtAxHiTaskInst::getCreateAt));
List<ExtAxHiTaskInst> previousTasks = new ArrayList<>();
for (int k = extAxHiTaskInsts.size() - 1; k > 0; k--) {
ExtAxHiTaskInst extAxHiTaskInst = extAxHiTaskInsts.get(k);
if (!extAxHiTaskInst.getTaskDefinitionKey().equals(i.getActivityId()) && !CollectionUtils.isEmpty(previousTasks)) {
break;
}
if (extAxHiTaskInst.getTaskDefinitionKey().equals(i.getActivityId())) {
previousTasks.add(extAxHiTaskInst);
}
}
previousTasks.stream()
.filter(e -> Objects.equals(e.getStatus(), APPROVED.getStatus()))
.map(ExtAxHiTaskInst::getAssignee)
.filter(Objects::nonNull)
.filter(StringUtils::hasText)
.filter(k -> specialApproverComparison(k, delegateTask.getAssignee()))
.findAny().ifPresent(k -> exists.compareAndSet(false, true));
}
});
}
});
return exists.get();
}