81 lines
2.6 KiB
TypeScript
81 lines
2.6 KiB
TypeScript
/** 离职套件运行时:入职日期默认申请人 */
|
|
|
|
function asRules(schema: unknown): Record<string, unknown>[] {
|
|
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<string, unknown>[], out: Record<string, unknown>[]) {
|
|
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<string, unknown>): 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<string, any>[]
|
|
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<string, unknown>[] = []
|
|
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<string, unknown>,
|
|
user: Record<string, unknown> | null | undefined
|
|
): Record<string, unknown> {
|
|
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
|
|
}
|