import type { ResourceField } from './resources'; export type ResourceFormValue = string | number | boolean | string[] | undefined; export type ResourceFormMode = 'create' | 'edit'; export function isMissingField(value: ResourceFormValue | null): boolean { return value === '' || value === null || value === undefined || (Array.isArray(value) && value.length === 0); } export function isResourceFieldRequired( field: ResourceField, mode: ResourceFormMode, ): boolean { return Boolean(field.required && !(mode === 'edit' && field.type === 'password')); } export function buildResourcePayload( fields: ResourceField[], form: Record, mode: ResourceFormMode = 'create', ): Record { const payload: Record = {}; for (const field of fields) { if (mode === 'edit' && field.type === 'password') continue; const value = form[field.key]; if (field.type === 'identity-list' && Array.isArray(value)) { payload[field.key] = value; continue; } if (isMissingField(value)) { if (!field.required) continue; payload[field.key] = value; continue; } switch (field.type) { case 'number': { const number = Number(value); if (!Number.isFinite(number)) throw new Error(`${field.label}必须是数字`); payload[field.key] = number; break; } case 'money': { const amount = Number(value); if (!Number.isFinite(amount)) throw new Error(`${field.label}必须是有效金额`); payload[field.key] = Math.round(amount * 100); break; } case 'boolean': payload[field.key] = value === true || value === 'true'; break; case 'date': case 'datetime': { const date = new Date(String(value)); if (Number.isNaN(date.getTime())) throw new Error(`${field.label}必须是有效日期`); payload[field.key] = date.toISOString(); break; } default: payload[field.key] = value; } } return payload; }