/** * 各功能页共用的欧洲五国选项。 * * code 用于接口参数与本地存储(和店铺数据抓取 / 跟价 / 商品风险等页面的 * country_codes 保持一致),label 用于界面展示;巡店删除的模板结构直接以 * 中文国家名作为 key,取 label 即可。 */ export interface CountryOption { code: string label: string } export const EU_COUNTRY_OPTIONS: readonly CountryOption[] = [ { code: 'DE', label: '德国' }, { code: 'UK', label: '英国' }, { code: 'FR', label: '法国' }, { code: 'IT', label: '意大利' }, { code: 'ES', label: '西班牙' }, ] export const EU_COUNTRY_CODES: readonly string[] = EU_COUNTRY_OPTIONS.map((row) => row.code) export function countryLabel(code: string) { return EU_COUNTRY_OPTIONS.find((row) => row.code === code)?.label || code } /** * 过滤出合法国家代码并去重,用于校验本地缓存或接口返回的顺序。 * 结果为空时回落到 fallback,避免出现「一个国家都没有」导致任务空转。 */ export function sanitizeCountryCodes( raw: unknown, fallback: readonly string[] = EU_COUNTRY_CODES, ): string[] { if (!Array.isArray(raw)) return [...fallback] const valid = new Set(EU_COUNTRY_CODES) const result: string[] = [] for (const item of raw) { const code = String(item ?? '').trim().toUpperCase() if (valid.has(code) && !result.includes(code)) result.push(code) } return result.length ? result : [...fallback] }