export type OaPersonValueItem = { id: string; name: string } export function isPersonValueItem(v: unknown): v is OaPersonValueItem { if (!v || typeof v !== 'object') return false const o = v as Record return String(o.id || '').trim() !== '' && String(o.name || '').trim() !== '' } export function normalizePersonModelValue( raw: unknown, multiple: boolean ): OaPersonValueItem | OaPersonValueItem[] | null { if (multiple) { if (Array.isArray(raw)) { return raw.filter(isPersonValueItem).map((x) => ({ id: String(x.id).trim(), name: String(x.name).trim() })) } if (isPersonValueItem(raw)) { return [{ id: String(raw.id).trim(), name: String(raw.name).trim() }] } return [] } if (isPersonValueItem(raw)) { return { id: String(raw.id).trim(), name: String(raw.name).trim() } } if (Array.isArray(raw) && raw.length === 1 && isPersonValueItem(raw[0])) { return { id: String(raw[0].id).trim(), name: String(raw[0].name).trim() } } return null } export function formatPersonDisplay(raw: unknown): string { if (Array.isArray(raw)) { return raw .filter(isPersonValueItem) .map((x) => x.name) .filter(Boolean) .join('、') } if (isPersonValueItem(raw)) return raw.name return '' } export function extractPersonIds(raw: unknown): string[] { const n = Array.isArray(raw) ? raw.filter(isPersonValueItem) : isPersonValueItem(raw) ? [raw] : [] const out: string[] = [] const seen = new Set() for (const x of n) { const id = String(x.id).trim() if (!id || seen.has(id)) continue seen.add(id) out.push(id) } return out }