OAFLOW1 支持负责人本人报销兜底审批

这个提交包含在:
2026-05-24 21:12:18 +08:00
父节点 d6ae1cff89
当前提交 2e778d3c9f
共修改 23 个文件,包含 1324 行新增和 86 行删除
+29 -9
查看文件
@@ -2,7 +2,7 @@ const { AppError } = require("../utils/AppError");
const { resolveApplicableBudgetPoolByContext } = require("./budgetPool");
const { FEATURE_FLAG_KEYS, evaluateFeatureFlag } = require("./featureFlags");
const {
buildWorkflowStepsFromApprovalRule,
buildApprovalWorkflowSnapshot,
parseWorkflowSteps,
resolveActionableStep,
} = require("../utils/workflow");
@@ -590,20 +590,40 @@ async function buildReimbursementPrecheck(tx, { reimbursementId, config, logger
level1_role: true,
level2_role: true,
level3_role: true,
owner_self_fallback_role: true,
priority: true,
},
});
if (!approvalRule) {
blocking.push(buildRiskFlagPreview("missing_approval_rule", RISK_LEVELS.high, "缺少审批规则", "当前金额范围未匹配到有效报销审批规则。"));
} else {
const workflowSteps = buildWorkflowStepsFromApprovalRule(approvalRule);
const { actionable, skipped } = await resolveActionableStep({
tx,
steps: workflowSteps,
startIndex: 0,
ownerId: reimbursement.owner_id,
logger,
});
let actionable = null;
let skipped = [];
try {
const workflowSteps = await buildApprovalWorkflowSnapshot({
tx,
approvalRule,
ownerId: reimbursement.owner_id,
logger,
});
const resolved = await resolveActionableStep({
tx,
steps: workflowSteps,
startIndex: 0,
ownerId: reimbursement.owner_id,
logger,
blockOnUnresolvedAssignee: true,
});
actionable = resolved.actionable;
skipped = resolved.skipped;
} catch (error) {
if (error instanceof AppError && error.details?.workflow === "no_actionable_approver") {
actionable = null;
skipped = [{ reason: error.details.reason ?? "no_actionable_approver" }];
} else {
throw error;
}
}
if (!actionable || skipped.length) {
blocking.push(buildRiskFlagPreview("no_actionable_approver", RISK_LEVELS.high, "缺少可执行审批人", "当前审批链未解析出有效审批人。"));
}