处理后台管理系统、修复BUG、处理权限

This commit is contained in:
super
2026-04-22 01:09:28 +08:00
parent d691e53886
commit 236b73755c
77 changed files with 5157 additions and 522 deletions

View File

@@ -0,0 +1,126 @@
# 巡店删除 Python 提交接口
本文档给 Python 端同学说明 `patrol-delete` 的结果回传方式。前端不会再提供“手动归档”按钮任务收尾、XLSX 组装、OSS 上传与历史清理均由服务端自动完成。
## 1. 提交入口
- 方法:`POST`
- 路径:`/api/patrol-delete/tasks/{taskId}/result`
- Content-Type`application/json`
示例:
```http
POST /api/patrol-delete/tasks/123/result
Content-Type: application/json
```
```json
{
"shops": [
{
"shopName": "示例店铺",
"submissionId": "patrol-delete:123:示例店铺:1711111111111",
"chunkIndex": 1,
"chunkTotal": 3,
"shopDone": false,
"countrySections": [
{
"country": "德国",
"rows": [
{
"status": "正常",
"quantity": "12",
"deleteQuantity": "3",
"processStatus": "处理中"
}
]
}
],
"cartRatios": [
{
"country": "德国",
"ratio": "25%"
}
]
}
]
}
```
## 2. 字段说明
- `shops`: 本次提交的店铺结果分片列表,至少 1 条。
- `shopName`: 店铺名。服务端会按店铺名归并分片。
- `submissionId`: 建议每个店铺任务周期内保持同一个 submissionId方便排查日志。
- `chunkIndex`: 当前分片序号,建议从 1 开始。
- `chunkTotal`: 当前店铺总分片数。
- `shopDone`: 当前店铺是否已全部提交完成。最后一片必须传 `true`
- `error`: 当前店铺执行失败时传错误信息。传了 `error` 后该店铺会直接记为失败并结束。
- `countrySections`: 店铺各国家的状态数据。
- `cartRatios`: 店铺各国家的购物车比例数据。
## 3. 分片合并规则
- 服务端按 `taskId + shopName` 聚合缓存。
- 同一国家的 `countrySections[].rows` 会按提交顺序追加合并。
- `cartRatios` 按国家覆盖,后到数据覆盖先到数据。
-`shopDone=true` 时,该店铺会被标记为完成。
- 如果中途提交了 `error`,该店铺会被标记为失败,不再等待后续分片。
## 4. Excel 组装规则
最终结果文件使用 `xlsx/日常删除格式.xlsx` 对应的数据结构:
- 第 1 列:`店铺名`
- 接着是 5 个国家块,每个国家 4 列:
- 国家状态
- 数量
- 删除数量
- 删除结果
- 最后是 5 组购物车比例列:
- 国家
- 购物车比例
每个店铺输出规则:
- 一个店铺占用的行数 = 5 个国家中数据行数的最大值
- 每个店铺处理完成后会额外空一行
- 然后再写下一个店铺
任务整体完成后:
1. 服务端汇总所有已完成店铺的数据
2. 组装成 XLSX
3. 上传 OSS
4. 前端历史任务中出现下载按钮,用户可直接下载
## 5. 自动收尾与超时补偿
前端不会手动触发归档,服务端自动处理:
- Python 正常把所有店铺都提交完成后,服务端立即尝试收尾。
- 如果最后一次提交后未来得及触发收尾,定时补偿任务会再次尝试 finalize。
- 如果某店铺已有部分有效数据,但 Python 异常退出,补偿任务会尽量把已有数据收尾成成功店铺。
- 如果某店铺完全没有完整结果且已超时,服务端会将该店铺标记为失败。
当前超时配置来自后端配置项:
- `aiimage.delete-brand-progress.patrol-delete-stale-timeout-minutes`
- `aiimage.delete-brand-progress.patrol-delete-initial-timeout-minutes`
## 6. 历史清理
服务端会定时清理历史数据,但会跳过仍在执行中的任务。
- `RUNNING` 任务不会被历史清理删除
- 只有已完成或已失败的历史记录会进入清理范围
- 临时目录缓存与结果目录也会定期清理
## 7. Python 端建议
- 一个店铺处理结束的最后一片一定要传 `shopDone=true`
- 如果店铺失败,请直接回传 `error`
- 大店铺建议按国家或按分页做分片,避免一次提交过大
- 如果同一店铺会多次回传,`shopName` 必须保持一致
- 如果最后一片提交成功Python 端无需再调用额外“归档”接口