5af4e1c23e
- query-asin-filter: toQueryAsinQuery 输出 page_size/group_id/shop_name(35bed42b 后端已改显式 snake, camel 参数被静默忽略导致分组/店铺名筛选无作用、pageSize 固定回落 15) - 新增 query-asin-export: 按当前筛选构建导出 URL,页面「导出 XLSX」不再恒为全量 - query-asin-import-api: 导入兜底分组 groupId→group_id(后端 importExcel 已改名,此前同样被丢弃) - query-asin-delete-import-api: 保持 groupId 并加注释(后端仍隐式 camel,统一需两端同步部署) - task-71 测试断言更新为 snake 契约(含 camel 不下发反断言)+ 新增导出 URL 用例 已上线 admin-vue-20260910-145200,线上 chunk 验证含 snake 参数;task-71 10/10 通过,vue-tsc 通过
25 lines
1.3 KiB
TypeScript
25 lines
1.3 KiB
TypeScript
/** 查询 ASIN 导出 URL 构建:按当前筛选下发 group_id/shop_name/asin/country(对齐 Java export @RequestParam snake_case)。 */
|
|
import { normalizeQueryAsinCountry, type QueryAsinFilterState } from './query-asin-filter.ts'
|
|
|
|
export const QUERY_ASIN_EXPORT_ENDPOINT = '/api/admin/query-asins/export'
|
|
|
|
/** 按导出可用筛选(分组/店铺名/ASIN/国家)构建查询串;空白/非法条件不下发,避免导出范围被误解。 */
|
|
export function buildQueryAsinExportQuery(state: QueryAsinFilterState): string {
|
|
const params = new URLSearchParams()
|
|
const groupId = state.groupId
|
|
if (typeof groupId === 'number' && groupId >= 1) params.set('group_id', String(Math.floor(groupId)))
|
|
const shopName = (state.shopName || '').trim()
|
|
if (shopName) params.set('shop_name', shopName)
|
|
const asin = (state.asin || '').trim()
|
|
if (asin) params.set('asin', asin)
|
|
const country = normalizeQueryAsinCountry(state.country)
|
|
if (country) params.set('country', country)
|
|
return params.toString()
|
|
}
|
|
|
|
/** 导出下载地址:浏览器直接访问该 URL 触发流式下载;无筛选时为全量导出。 */
|
|
export function toQueryAsinExportUrl(state: QueryAsinFilterState): string {
|
|
const query = buildQueryAsinExportQuery(state)
|
|
return query ? `${QUERY_ASIN_EXPORT_ENDPOINT}?${query}` : QUERY_ASIN_EXPORT_ENDPOINT
|
|
}
|