fix(shop-data-crawl): 后台店铺数据记录改读每店最新累计档,删除任务不再连坐后台

后台“店铺数据记录”此前以每次抓取的 file_result/file_task 为源,前台删除任务会物理删
这两张表,导致该店在后台退档/消失。现改为以采集归档维护、删除任务时保留的
biz_shop_data_crawl_daily_file 每店最新一档为数据源:
- V113:daily_file 冗余 shop_name 列并回填;归档写档三处入口同步写入
- 列表/批量下载/单档下载/删除端点改按每日累计档 id(daily-files/{id})
- 管理端删除=真删该店这条数据记录(档+文件+明细),前台任务历史保留但清文件指针
- 明细行 daily_file_id 跨天滚动删旧档时改指新档,修存量悬空引用(另附修复脚本)
This commit is contained in:
2026-09-08 15:02:25 +08:00
parent b12acf7793
commit 630bfc3eee
10 changed files with 278 additions and 122 deletions
@@ -216,15 +216,15 @@ async function downloadBatch() {
}
async function removeRowByRow(row: ShopDataResultRow) {
// 对齐旧版:原生 confirm。
if (!window.confirm(`确认删除店铺“${row.shopName}的任务 ${row.taskId || row.taskNo || row.resultId} 及结果文件?`)) return
// 管理端真删:删除该店这条店铺数据记录(累计档 + 文件 + 明细),前台任务记录仍保留但文件不可再下载
if (!window.confirm(`确认删除店铺“${row.shopName}这条店铺数据记录及其数据文件?此操作不可恢复。`)) return
deletingKey.value = row.resultId
try {
await deleteShopDataResultHistory(row.resultId)
ElMessage.success('删除成功')
await load()
} catch (error) {
ElMessage.error(error instanceof Error ? error.message : `正在删除任务 ${row.taskId || row.taskNo || row.resultId}...`)
ElMessage.error(error instanceof Error ? error.message : `删除店铺“${row.shopName}”的记录失败`)
} finally {
deletingKey.value = ''
}
@@ -41,18 +41,18 @@ export interface ShopDataResultDownload {
filename: string
}
/** 下载单个结果文件(服务端原文件名):GET /api/admin/shop-data-crawl/results/{resultId}/download。 */
/** 下载单店最新采集文件(按每日累计档 id):GET /api/admin/shop-data-crawl-tasks/daily-files/{id}/download。 */
export async function fetchShopDataResultDownload(resultId: number | string): Promise<ShopDataResultDownload> {
const { data, headers } = await http.get<Blob>(`${SHOP_DATA_SINGLE_ENDPOINT}/results/${resultId}/download`, {
const { data, headers } = await http.get<Blob>(`${SHOP_DATA_CRAWL_TASKS_ENDPOINT}/daily-files/${resultId}/download`, {
responseType: 'blob',
})
const disposition = (headers as Record<string, string> | undefined)?.['content-disposition']
return { blob: data, filename: shopDataFilenameFromDisposition(disposition, `shop-data-task-${resultId}.xlsx`) }
}
/** 删除单条结果历史(仅终态):DELETE /api/admin/shop-data-crawl/history/{resultId}。 */
/** 删除该店这条店铺数据记录(按每日累计档 id,管理端显式操作):DELETE .../daily-files/{id}。 */
export async function deleteShopDataResultHistory(resultId: number | string): Promise<void> {
await http.delete<unknown>(`${SHOP_DATA_SINGLE_ENDPOINT}/history/${resultId}`)
await http.delete<unknown>(`${SHOP_DATA_CRAWL_TASKS_ENDPOINT}/daily-files/${resultId}`)
}
/** 加载店铺数据任务数据范围授权用户:GET /api/admin/shop-data-crawl-task-permissions。 */