task-64(ASIN 数据中心): 实现去重汇总导出等待状态

新增 dedupe-total-export.ts 纯模型:buildDedupeExportQuery/toExportUrl 按用户名/日期区间/
分组/国家构造 /api/admin/dedupe-total-data/export 下载地址(空白/非法条件不下发),
DedupeExportStage + exportStageHint 提供运行/完成/失败等待提示。8 用例全过,467 单测 + build 绿。
This commit is contained in:
2026-09-05 15:37:31 +08:00
parent fb420c2988
commit 23037c669d
2 changed files with 123 additions and 0 deletions
@@ -0,0 +1,42 @@
/** 去重汇总导出等待模型(任务 64):导出 URL 构建 + 运行等待态提示,纯逻辑。 */
import { validIsoDateOrUndefined } from './asin-filter.ts'
import type { DedupeTotalFilterState } from './dedupe-total-filter.ts'
export const DEDUPE_TOTAL_EXPORT_ENDPOINT = '/api/admin/dedupe-total-data/export'
export type DedupeExportStage = 'idle' | 'running' | 'done' | 'error'
/** 运行中/完成等待提示;idle 无提示。 */
export function exportStageHint(stage: DedupeExportStage): string | undefined {
switch (stage) {
case 'running':
return '正在生成并下载导出文件,请稍候…'
case 'done':
return '导出完成'
case 'error':
return '导出失败,请重试'
default:
return undefined
}
}
/** 按导出可用筛选(用户名/日期区间/分组/国家)构建查询串;空白/非法条件不下发。 */
export function buildDedupeExportQuery(state: DedupeTotalFilterState): string {
const params = new URLSearchParams()
const username = (state.username || '').trim()
const country = (state.country || '').trim()
if (username) params.set('username', username)
if (country) params.set('country', country)
const startDate = validIsoDateOrUndefined(state.startDate)
const endDate = validIsoDateOrUndefined(state.endDate)
if (startDate) params.set('start_date', startDate)
if (endDate) params.set('end_date', endDate)
if (typeof state.groupId === 'number' && state.groupId >= 1) params.set('group_id', String(state.groupId))
return params.toString()
}
/** 导出下载地址:浏览器直接访问该 URL 触发流式下载。 */
export function toExportUrl(state: DedupeTotalFilterState): string {
const query = buildDedupeExportQuery(state)
return query ? `${DEDUPE_TOTAL_EXPORT_ENDPOINT}?${query}` : DEDUPE_TOTAL_EXPORT_ENDPOINT
}