feat(REQ-7125) - 查找审批人策略实现,适配“管理员指定审批人”

This commit is contained in:
wangli 2026-02-28 15:33:04 +08:00
parent b04f9d00eb
commit 4313158f48
8 changed files with 16 additions and 64 deletions

View File

@ -247,9 +247,11 @@ public class EngineExecutionStartListener implements ExecutionListener {
if (categoryVersion < 2) {
assigners.addAll(approverSelect(ApproverEmptyHandleTypeEnum.transferToAdmin.getType(), userTask,
execution, true));
finalEmptyAssigneeHandle(assigners, userTask, execution, "未找到审批人且转交管理员失败,系统终止", "karma: " + (refreshProperties.getUseNewToAdminApi() ? "api/flow/listTaskAssignerAdmin/v2" : "api/flow/listTaskAssignerAdmin"));
break;
}
finalEmptyAssigneeHandle(assigners, userTask, execution, "未找到审批人且转交管理员失败,系统终止", "karma: " + (refreshProperties.getUseNewToAdminApi() ? "api/flow/listTaskAssignerAdmin/v2" : "api/flow/listTaskAssignerAdmin"));
finalEmptyAssigneeHandle(assigners, userTask, execution, "未找到审批人且转交管理员失败,系统终止", "org-gateway: api/node-user/flow-task-assigner/v2/list");
// 新版配置是在上 v2 版本的 selector 中实现的/api/node-user/flow-task-assigner/v2/list
break;
case specifyAssignee:
assigners.addAll(approverSelect(ApproverEmptyHandleTypeEnum.specifyAssignee.getType(), userTask,
@ -258,8 +260,7 @@ public class EngineExecutionStartListener implements ExecutionListener {
break;
case transferToAdminSpecify:
// REQ-7125 新增管理员指定审批人策略
assigners.addAll(approverSelect(ApproverEmptyHandleTypeEnum.transferToAdminSpecify.getType(), userTask, execution, true));
finalEmptyAssigneeHandle(assigners, userTask, execution, "未找到审批人且转交管理员失败,系统终止", "karma: " + (refreshProperties.getUseNewToAdminApi() ? "api/flow/listTaskAssignerAdmin/v2" : "api/flow/listTaskAssignerAdmin"));
finalEmptyAssigneeHandle(assigners, userTask, execution, "未找到审批人且转交管理员失败,系统终止", "org-gateway: api/node-user/flow-task-assigner/v2/list");
break;
default:
break;

View File

@ -322,6 +322,7 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
.ouId(String.valueOf(i.getOuId()))
.avatar(i.getAvatarUrl())
.nodeId(i.getNodeId())
// TODO 将接口返回的管理员数据映射到 isTransferToAdminSpecify
.build())
.collect(Collectors.toList());
}

View File

@ -38,6 +38,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIG
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_LOG_NODE_HAS_BEEN_HIDDEN;
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdminSpecify;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
@ -82,7 +83,7 @@ public class BasedIdentityV2TaskAssigneeSelector extends AbstractBpmnTaskAssigne
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
.projectIds(getOnlyInProjectEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getProjectIds())) : Sets.newHashSet())
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin) || Objects.equals(type, transferToAdminSpecify)).isPresent());
switch (optRange.get()) {
case within_the_project:
log.info("executing role v2 with within_the_project");

View File

@ -28,6 +28,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_LOG_NODE_HAS_BEEN_HIDDEN;
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdminSpecify;
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
@ -75,7 +76,7 @@ public class BasedInitiatorLeaderV2TaskAssigneeSelector extends AbstractBpmnTask
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
.projectIds(getOnlyInProjectEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getProjectIds())) : Sets.newHashSet())
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin) || Objects.equals(type, transferToAdminSpecify)).isPresent());
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
List<FlowTaskAssignerV2Resp> apiResultUsers = new ArrayList<>();

View File

@ -38,6 +38,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIG
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_LOG_NODE_HAS_BEEN_HIDDEN;
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdminSpecify;
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
@ -86,7 +87,7 @@ public class BasedPositionV2TaskAssigneeSelector extends AbstractBpmnTaskAssigne
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
.projectIds(getOnlyInProjectEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getProjectIds())) : Sets.newHashSet())
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin) || Objects.equals(type, transferToAdminSpecify)).isPresent());
switch (optRange.get()) {
case within_the_project:
log.info("executing position v2 with within_the_project");

View File

@ -39,6 +39,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIG
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_LOG_NODE_HAS_BEEN_HIDDEN;
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdminSpecify;
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
@ -88,7 +89,7 @@ public class BasedRoleV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSel
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
.projectIds(getOnlyInProjectEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getProjectIds())) : Sets.newHashSet())
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin) || Objects.equals(type, transferToAdminSpecify)).isPresent());
switch (optRange.get()) {
case within_the_project:
log.info("executing role v2 with within_the_project");

View File

@ -1,56 +0,0 @@
package cn.axzo.workflow.server.controller.delegate;
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.conf.SupportRefreshProperties;
import cn.axzo.workflow.core.deletage.approverscope.ApproverScopeDTO;
import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* 基于"转交给管理员"查询审批人
*
* @author wangli
* @since 2023/11/16 11:44
*/
@Slf4j
@Component
public class TransferToAdminSpecifyTaskAssigneeSelector extends TransferToAdminTaskAssigneeSelector {
@Resource
private SupportRefreshProperties supportRefreshProperties;
@Override
public String getType() {
return ApproverEmptyHandleTypeEnum.transferToAdminSpecify.getType();
}
@Override
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) {
return super.select(flowElement, execution, throwException);
}
@Override
protected List<BpmnTaskDelegateAssigner> invokeService(FlowElement flowElement, DelegateExecution execution,
ApproverScopeDTO scopeDto) {
log.info("transferToAdmin invokeService executing...");
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
if (Boolean.TRUE.equals(supportRefreshProperties.getUseNewToAdminApi())) {
assigners.addAll(invokeNewQuery(flowElement, execution, scopeDto));
} else {
assigners.addAll(invokeOldQuery(flowElement, execution, scopeDto));
}
// 这里的审批人仅只能有指定审批人按钮的权限
assigners.forEach(i -> i.setIsTransferToAdminSpecify(true));
return assigners;
}
}

View File

@ -38,6 +38,8 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_WO
/**
* 基于"转交给管理员"查询审批人
*
* 仅适用于旧版本模型配置新版本配置又 v2 selector 实现
*
* @author wangli
* @since 2023/11/16 11:44
*/