import type { BizType, ProjectRecord } from '@/api/project-management' /** Drill-down uses the last successful statistics query, never unsaved filter edits. */ export function buildDrillFilters( applied: ProjectRecord, row: ProjectRecord, bizType: BizType ): ProjectRecord { const { groupBy, ...filters } = applied const result = { ...filters, bizType, unassigned: row.id === 'unassigned' } as ProjectRecord if (!result.unassigned && row.id !== 'total') { result[groupBy === 'team' ? 'teamId' : 'projectId'] = row.id } return result } export function assignmentSnapshot(records: ProjectRecord[]) { return records.map(({ bizType, id, projectId }) => ({ bizType, id, projectId: projectId ?? null })) } /** Write bodies intentionally exclude response-only labels and timestamps. */ export function managementPayload(kind: 'teams' | 'projects', form: ProjectRecord): ProjectRecord { const fields = kind === 'teams' ? ['teamName', 'leaderUserId', 'enabled', 'remark'] : [ 'projectName', 'projectNo', 'teamId', 'leaderUserId', 'bizTypes', 'startDate', 'endDate', 'status', 'remark' ] const data = Object.fromEntries( fields.filter((key) => form[key] !== undefined).map((key) => [key, form[key]]) ) if (kind === 'teams') { for (const [key, field] of [ ['members', 'userId'], ['regions', 'regionId'], ['hospitals', 'hospitalId'] ]) { data[key] = (form[key] || []).map((row: ProjectRecord) => ({ ...(row.id ? { id: row.id } : {}), [field]: row[field] })) } } return data } export function projectOptionsParams(bizType: BizType, filter = false) { return filter ? { bizType, usage: 'filter' as const } : { bizType } } /** List cells join child display names; empty entries are dropped. */ export function joinChildNames(items?: ProjectRecord[]) { return (items || []) .map((item) => item?.name) .filter(Boolean) .join('、') }