/** 上游员工状态码。5 已离职,2 试用、3 正式均视为在职。 */ const STATUS_CODE_RESIGNED = 5 const STATUS_CODE_ACTIVE = [2, 3] const RESIGNED_STATUS_KEYWORDS = ['离职', '停用', '退休'] export const EMPLOYMENT_STATE = { ACTIVE: 'ACTIVE', RESIGNED: 'RESIGNED', UNKNOWN: 'UNKNOWN', } as const function clean(value: unknown): string | null { if (value === null || value === undefined) return null const normalized = String(value).trim() return normalized === '' ? null : normalized } /** * 将各上游来源的明确信号归一成系统使用的在职状态。 * * 花名册里有一批离职人员没有钉钉 userid:其 employmentStatus 已明确为「离职」, * 但旧逻辑只在 userid 存在时查询离职表/注册表,最终把这些人保守落成 UNKNOWN。 * 明确的离职信号必须优先于在职状态码;其余模糊中文和空值仍保持 UNKNOWN。 */ export function resolveEmploymentState(signals: { hasResignationRecord: boolean rawEmploymentStatus?: unknown registeredStatusCode?: number | null }): string { const rawStatus = clean(signals.rawEmploymentStatus) const rawStatusCode = rawStatus ? Number(rawStatus) : Number.NaN const rawExplicitlyResigned = Boolean( rawStatus && (rawStatusCode === STATUS_CODE_RESIGNED || RESIGNED_STATUS_KEYWORDS.some((keyword) => rawStatus.includes(keyword))), ) if ( signals.hasResignationRecord || rawExplicitlyResigned || signals.registeredStatusCode === STATUS_CODE_RESIGNED ) { return EMPLOYMENT_STATE.RESIGNED } if ( signals.registeredStatusCode !== null && signals.registeredStatusCode !== undefined && STATUS_CODE_ACTIVE.includes(signals.registeredStatusCode) ) { return EMPLOYMENT_STATE.ACTIVE } return EMPLOYMENT_STATE.UNKNOWN }