Files
zkxw/web-admin/src/utils/oa-resignation-kit-runtime.ts
T

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
}