import { createApiClient } from "../lib/apiClient"; import type { LabelMultipleOptionCreateInput, LabelMultipleOptionDto, LabelMultipleOptionGetListInput, LabelMultipleOptionUpdateInput, PagedResultDto, } from "../types/labelMultipleOption"; const api = createApiClient({ getToken: () => { try { return localStorage.getItem("access_token") ?? localStorage.getItem("token") ?? null; } catch { return null; } }, }); const PATH = "/label-multiple-option"; /** 接口存的是 JSON 字符串;列表/详情可能返回 string 或已反序列化的 array */ function parseOptionValuesJsonField(raw: unknown): string[] { if (raw == null) return []; if (Array.isArray(raw)) return raw.map((x) => String(x)); if (typeof raw === "string") { const t = raw.trim(); if (!t) return []; try { const p = JSON.parse(t) as unknown; if (Array.isArray(p)) return p.map((x) => String(x)); return []; } catch { return []; } } return []; } function normalizeLabelMultipleOptionDto(item: LabelMultipleOptionDto): LabelMultipleOptionDto { const raw = item as LabelMultipleOptionDto & { optionValuesJson?: unknown; lastEdited?: unknown; LastEdited?: unknown; }; const lastRaw = raw.lastEdited ?? raw.LastEdited; const lastEdited = typeof lastRaw === "string" ? lastRaw : lastRaw != null ? String(lastRaw) : null; const parseIds = (v: unknown): string[] | undefined => { if (!Array.isArray(v)) return undefined; return [...new Set(v.map((x) => String(x).trim()).filter(Boolean))]; }; const groupIds = parseIds( (raw as Record).groupIds ?? (raw as Record).GroupIds ?? (raw as Record).regionIds ?? (raw as Record).RegionIds, ); const locationIds = parseIds( (raw as Record).locationIds ?? (raw as Record).LocationIds, ); const partnerIds = parseIds( (raw as Record).partnerIds ?? (raw as Record).PartnerIds ?? (raw as Record).companyIds ?? (raw as Record).CompanyIds, ); const companyRaw = (raw as Record).company ?? (raw as Record).Company; return { ...item, optionValuesJson: parseOptionValuesJsonField(raw.optionValuesJson), lastEdited, appliedPartnerType: String( (raw as Record).appliedPartnerType ?? (raw as Record).AppliedPartnerType ?? "", ).trim() || undefined, partnerIds, companyIds: partnerIds, availabilityType: String( (raw as Record).availabilityType ?? (raw as Record).AvailabilityType ?? "", ).trim() || undefined, groupIds, regionIds: groupIds, locationIds, company: typeof companyRaw === "string" ? companyRaw : null, }; } function normalizePaged(res: PagedResultDto): PagedResultDto { return { totalCount: res.totalCount ?? 0, items: (res.items ?? []).map(normalizeLabelMultipleOptionDto), }; } /** 创建/更新 Body:`optionValuesJson` 须为 string[] 的 JSON 字符串 */ function optionValuesJsonToApiBody(values: string[]): string { return JSON.stringify(values); } function scopeBodyFromInput(input: LabelMultipleOptionCreateInput): Record { const groupIds = [ ...new Set( [...(input.groupIds ?? []), ...(input.regionIds ?? [])] .map((x) => String(x).trim()) .filter(Boolean), ), ]; const locationIds = [ ...new Set((input.locationIds ?? []).map((x) => String(x).trim()).filter(Boolean)), ]; const partnerIds = [ ...new Set( [...(input.partnerIds ?? []), ...(input.companyIds ?? [])] .map((x) => String(x).trim()) .filter(Boolean), ), ]; const body: Record = {}; const appliedPartnerType = String(input.appliedPartnerType ?? "").trim().toUpperCase(); if (appliedPartnerType === "ALL" || appliedPartnerType === "SPECIFIED") { body.appliedPartnerType = appliedPartnerType; } if (partnerIds.length) { body.partnerIds = partnerIds; body.companyIds = partnerIds; } const availabilityType = String(input.availabilityType ?? "").trim().toUpperCase(); if (availabilityType === "ALL" || availabilityType === "SPECIFIED") { body.availabilityType = availabilityType; } if (groupIds.length) { body.groupIds = groupIds; body.regionIds = groupIds; } if (locationIds.length) { body.locationIds = locationIds; } return body; } export async function getLabelMultipleOptions(input: LabelMultipleOptionGetListInput, signal?: AbortSignal): Promise> { const res = await api.requestJson>({ path: PATH, method: "GET", query: { SkipCount: input.skipCount, MaxResultCount: input.maxResultCount, Sorting: input.sorting, Keyword: input.keyword, State: input.state, GroupId: input.groupId, LocationId: input.locationId, }, signal, }); return normalizePaged(res); } export async function getLabelMultipleOption(id: string, signal?: AbortSignal): Promise { const d = await api.requestJson({ path: `${PATH}/${encodeURIComponent(id)}`, method: "GET", signal, }); return normalizeLabelMultipleOptionDto(d); } export async function createLabelMultipleOption(input: LabelMultipleOptionCreateInput): Promise { const d = await api.requestJson({ path: PATH, method: "POST", body: { optionCode: String(input.optionCode ?? "").trim() || null, optionName: input.optionName, optionValuesJson: optionValuesJsonToApiBody(input.optionValuesJson), state: input.state ?? true, orderNum: input.orderNum, ...scopeBodyFromInput(input), }, }); return normalizeLabelMultipleOptionDto(d); } export async function updateLabelMultipleOption(id: string, input: LabelMultipleOptionUpdateInput): Promise { const d = await api.requestJson({ path: `${PATH}/${encodeURIComponent(id)}`, method: "PUT", body: { optionCode: String(input.optionCode ?? "").trim() || null, optionName: input.optionName, optionValuesJson: optionValuesJsonToApiBody(input.optionValuesJson), state: input.state ?? true, orderNum: input.orderNum, ...scopeBodyFromInput(input), }, }); return normalizeLabelMultipleOptionDto(d); } export async function deleteLabelMultipleOption(id: string): Promise { await api.requestJson({ path: `${PATH}/${encodeURIComponent(id)}`, method: "DELETE", }); }