/** * 各业务模块与审批模板类型的映射(配置化入口) * * 使用方式: * 1. 在业务页引入 ApprovalTemplateBindDialog,传入 moduleKey * 2. 或在表单内嵌 ApprovalTemplateFormSection + useApprovalTemplateBinding({ moduleKey }) * * businessType:若后端 TypeEnums 已固定 code,可直接写死 value;否则用 typeLabels 按名称匹配 */ export const APPROVAL_MODULE_KEYS = { REGULAR: "regular", TRANSFER: "transfer", RESIGN: "resign", WORK_HANDOVER: "work_handover", LEAVE: "leave", OVERTIME: "overtime", TRAVEL_REIMBURSE: "travel_reimburse", COST_REIMBURSE: "cost_reimburse", }; /** @type {Record} */ export const APPROVAL_MODULE_REGISTRY = { [APPROVAL_MODULE_KEYS.REGULAR]: { label: "转正申请", approvalType: "regular", typeLabels: ["转正", "转正申请"], }, [APPROVAL_MODULE_KEYS.TRANSFER]: { label: "调岗申请", approvalType: "transfer", typeLabels: ["调岗", "调动", "调岗申请", "调动申请"], }, [APPROVAL_MODULE_KEYS.RESIGN]: { label: "离职申请", approvalType: "resign", typeLabels: ["离职", "离职申请", "离职审批"], }, [APPROVAL_MODULE_KEYS.WORK_HANDOVER]: { label: "工作交接", approvalType: "work_handover", typeLabels: ["工作交接", "交接", "工作交接审批"], }, [APPROVAL_MODULE_KEYS.LEAVE]: { label: "请假申请", approvalType: "leave", typeLabels: ["请假", "请假申请", "请假审批"], }, [APPROVAL_MODULE_KEYS.OVERTIME]: { label: "加班申请", approvalType: "overtime", typeLabels: ["加班", "加班申请", "加班审批"], }, [APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE]: { label: "差旅报销", approvalType: "travel_reimburse", typeLabels: ["差旅", "差旅报销"], }, [APPROVAL_MODULE_KEYS.COST_REIMBURSE]: { label: "费用报销", approvalType: "cost_reimburse", typeLabels: ["费用", "费用报销"], }, }; /** * @typedef {object} ApprovalModuleConfig * @property {string} label * @property {string} [approvalType] 列表样式用 * @property {string|number} [businessType] 与 TypeEnums value 一致时可写死 * @property {string[]} [typeLabels] 与 TypeEnums label 模糊匹配 */ export function getApprovalModuleConfig(moduleKey) { if (!moduleKey) return null; return APPROVAL_MODULE_REGISTRY[moduleKey] || null; } export function listApprovalModuleEntries() { return Object.entries(APPROVAL_MODULE_REGISTRY).map(([moduleKey, cfg]) => ({ moduleKey, ...cfg, })); } /** 从 TypeEnums 选项中解析本模块的 businessType */ export function resolveModuleBusinessType(moduleKey, typeOptions = []) { const cfg = getApprovalModuleConfig(moduleKey); if (!cfg) return null; if (cfg.businessType != null && cfg.businessType !== "") return cfg.businessType; const labels = [cfg.label, ...(cfg.typeLabels || [])].filter(Boolean); const hit = (typeOptions || []).find((opt) => { const optLabel = String(opt?.label || "").trim(); if (!optLabel) return false; return labels.some( (l) => optLabel === l || optLabel.includes(l) || l.includes(optLabel) ); }); if (hit?.value != null && hit.value !== "") return hit.value; return cfg.approvalType || null; } /** 收集与模块相关的全部 businessType 取值(枚举值 + approvalType),用于模板列表过滤 */ export function getModuleMatchingBusinessTypes(moduleKey, typeOptions = []) { const cfg = getApprovalModuleConfig(moduleKey); if (!cfg) return []; const values = new Set(); const primary = resolveModuleBusinessType(moduleKey, typeOptions); if (primary != null && primary !== "") values.add(primary); if (cfg.approvalType) values.add(cfg.approvalType); const labels = [cfg.label, ...(cfg.typeLabels || [])].filter(Boolean); for (const opt of typeOptions || []) { const optLabel = String(opt?.label || "").trim(); if (!optLabel) continue; const matched = labels.some( (l) => optLabel === l || optLabel.includes(l) || l.includes(optLabel) ); if (matched && opt.value != null && opt.value !== "") { values.add(opt.value); } } return [...values]; }