417a2bf831
Build Backend JAR / build (push) Has been cancelled
- 管理后台:店铺数据记录改为列表分页展示(去任务号/文件列/累计标题,'最新'改'更新时间'),新增'重复 ASIN' Tab 按跨店聚合展示 ASIN/店铺/分组/国家/日期/价格;修复失败/进行中任务被过滤不显示的问题 - task-169: BrandCheckHttpConfigResolver 从 aiimage.http-client.* 读取品牌检查超时/重试(默认同现状、钳制),附 8 条测试 - task-170: surefire 内存调整为 1536m - dedupe: DedupeRunService 重构(事务边界/进度)、新增 DedupeRunProgressVo、Controller 与结果 VO 调整,PermissionMenuService 相应适配 - brand/dedupe 前端:BrandDedupeTab/BrandPatrolDeleteTab 改造、新增 CountrySelector 组件与 country-options、类型与接口端对齐、测试更新 - 移除无引用文件:backend/static/logo.jpg、prompts/
44 lines
1.5 KiB
TypeScript
44 lines
1.5 KiB
TypeScript
/**
|
|
* 各功能页共用的欧洲五国选项。
|
|
*
|
|
* 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]
|
|
}
|