/** 离职套件运行时:入职日期默认申请人 */ function asRules(schema: unknown): Record[] { if (Array.isArray(schema)) return schema.filter((r) => r && typeof r === 'object') as any if (schema && typeof schema === 'object') { const s = schema as any const rules = s.rule || s.rules || s.fields if (Array.isArray(rules)) return rules.filter((r: any) => r && typeof r === 'object') if (s.type || s.field) return [s] } return [] } function walk(rules: Record[], out: Record[]) { for (const r of rules) { out.push(r) if (Array.isArray(r.children)) { walk(r.children as any, out) } const props = r.props as any if (props && Array.isArray(props.rule)) walk(props.rule, out) } } export type ResignationKitBinding = { hireDateField?: string lastWorkDayField?: string } function resolveBinding(kit: Record): ResignationKitBinding { const props = (kit.props && typeof kit.props === 'object' ? kit.props : {}) as Record< string, any > let hireDateField = props.hireDateField ? String(props.hireDateField) : undefined let lastWorkDayField = props.lastWorkDayField ? String(props.lastWorkDayField) : undefined const children = ( Array.isArray(kit.children) ? kit.children : Array.isArray(props.rule) ? props.rule : [] ) as Record[] for (const c of children) { if (!c?.field) continue const sem = String(c.props?._fc_kit_field || '') if (sem === 'hireDate' && !hireDateField) hireDateField = String(c.field) if (sem === 'lastWorkDay' && !lastWorkDayField) lastWorkDayField = String(c.field) } return { hireDateField, lastWorkDayField } } export function listResignationKitBindings(schema: unknown): ResignationKitBinding[] { const flat: Record[] = [] walk(asRules(schema), flat) return flat .filter((r) => String(r.type || '') === 'resignationKit') .map(resolveBinding) } function isEmpty(raw: unknown): boolean { return raw == null || raw === '' } /** 仅对空入职日期写入申请人 hireDate */ export function applyResignationKitDefaults( schema: unknown, formData: Record, user: Record | null | undefined ): Record { const data = { ...formData } if (!user) return data const hireDate = String(user.hireDate || '').trim() if (!hireDate) return data for (const kit of listResignationKitBindings(schema)) { const f = kit.hireDateField if (f && isEmpty(data[f])) data[f] = hireDate } return data }