feat(goauto): 完善替代采集与颜色图片详情 (#184 #185)

This commit is contained in:
QiuSW
2026-09-01 09:55:27 +08:00
parent c07c3451f1
commit 3aab1f013d
13 changed files with 537 additions and 41 deletions
+5 -4
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Business-Rules-and-Glossary
wiki_url: https://git.ilapage.cn/OPC/goauto/wiki/Business-Rules-and-Glossary.-
wiki_revision: 51de401da3555517a5e560ca72e064fb11bd8d89
synchronized_at: 2026-09-01T00:58:04Z
wiki_revision: 36d7285beb3f0c8441e38b4e9e81e5cf7256b603
synchronized_at: 2026-09-01T01:50:05Z
<!-- gitea-wiki-mirror:end -->
# 业务规则与术语
@@ -340,8 +340,8 @@ synchronized_at: 2026-09-01T00:58:04Z
## Agent 手动采集替代商品(#130)
- 只有同一设备上的失败采集或失败采购任务,且错误码逐字等于 `PDD_LINK_INVALID` 或 `PDD_GOODS_SOLD_OUT` 时,Agent 详情才显示“采集替代商品”;Android 不自行推断资格。
- Agent 创建当前页面采集任务时携带 `replacementOrigin.type`(`collection` / `purchase`)和来源 `taskId`。服务端再次校验设备、任务终态、错误码、源商品、既有替换与进行中的替换流程,并把来源和激活状态持久化到采集任务,保证进程重启后仍可恢复。
- 采集来源不再按任务状态或错误码白名单限制“采集替代商品”:同一设备的采集任务只要仍关联 PDD 商品、该商品没有进行中的替换,且名下不存在 `running`、`order_submit_started`、`order_result_unknown` 采购任务,即可由人工判断是否替换。命中这三种采购状态时必须硬拦截并提示等待任务结束,不提供强制绕过。采购来源仍只允许失败任务且错误码逐字等于 `PDD_LINK_INVALID` 或 `PDD_GOODS_SOLD_OUT`;Android 只呈现服务端资格,不自行放宽。
- Agent 创建当前页面采集任务时携带 `replacementOrigin.type`(`collection` / `purchase`)和来源 `taskId`。服务端再次校验设备、来源对应的资格边界、源商品、既有替换与进行中的替换流程,并把来源和激活状态持久化到采集任务,保证进程重启后仍可恢复。采集来源确认替换时必须明确提示:所有关联虾皮商品会改指新商品并清空规格映射、尚未开始的采购任务会取消、原商品会停用且暂不能自动撤销。
- 替代商品采集结果先按普通采集事务完整保存。随后调用 #131 的原子生效流程;生效失败不得回滚或覆盖已采集商品、规格和 SKU,而是记录稳定的 `failed` 激活状态与限长错误,服务启动后可按同一幂等键仅重试生效,不重新采集。
- 任务详情的 `replacementMappingStatus` 必须由来源任务对应的替换分项推导,不能只读取主表总体状态。状态为 `matching` 时等待自动匹配,`manual_required` 时由 Admin 人工处理,`matched` 后才进入 #132 的继续采购流程。
- 替换采集沿用设备级单任务互斥、采集间隔、无障碍安全边界和禁止支付规则;不会增加轮询,也不会创建采购任务或订单。
@@ -364,6 +364,7 @@ synchronized_at: 2026-09-01T00:58:04Z
- 服务端只接受该任务已提交颜色维度中的 JPEG,校验 Device Token、任务归属、终态、内容、尺寸和数量;按“PDD 商品 + 颜色值”维护最新一张,记录来源 task、device,并沿任务关联不可变规则快照。
- 只允许保存裁剪后的商品图片区域;裁剪结果不得包含账号、地址、订单、支付及其他个人数据。原始控件树、XML、整屏截图仍禁止保存。
- 诊断阶段 `COLOR_IMAGE` 只记录成功及不支持、定位失败、裁剪失败、压缩失败、上传失败分类,不记录颜色文案、坐标或图片内容。
- Agent 采集任务详情只返回并展示当前仍以该任务为 `source_task_id` 的颜色图片,按颜色分组提供缩略图、明确空态/加载失败占位和只读放大查看;同商品同颜色被后续任务覆盖后,旧任务详情不再显示该图。图片仍沿用既有受控商品裁剪文件,不新增整屏截图、原始控件树、下载、分享或编辑能力。
## Admin 采集采购与采采管理导航(#142)
+4 -4
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Android-Agent-API-Contract
wiki_url: https://git.ilapage.cn/OPC/goauto/wiki/Android-Agent-API-Contract.-
wiki_revision: 94a99754058be22ec1fbb4e2e661b91a23fc026d
synchronized_at: 2026-09-01T00:58:35Z
wiki_revision: 0f448673dbec00a351c397d30926f0c5090a1141
synchronized_at: 2026-09-01T01:50:29Z
<!-- gitea-wiki-mirror:end -->
# MVP 共享 API 契约
@@ -583,7 +583,7 @@ GET /api/agent/v1/purchase-tasks/{taskId}
- `pageSize` 最大为 50;`status` 与 `taskNo` 可以组合过滤。
- 采集任务编号允许 `35` 或 `#35`,采购任务编号允许 `12` 或不区分大小写的 `CG-12`;服务端按精确编号匹配。
- 列表和详情不返回 Device Token、URL、收货地址、规则快照或原始控件树。采购项额外返回服务端计算的 `retryable` 和可选 `retryDisabledReason`;除受控失败重试外,不提供取消、修改既有订单或支付入口。
- 采集摘要返回当前 `attemptNumber`;采集详情返回标题、店铺、销量、评价数、规格维度、颜色价格、SKU、缺失项、结构化错误,以及不含规则快照的历史 attempt 序号、状态、规则 ID、错误和时间摘要。
- 采集摘要返回当前 `attemptNumber`;采集详情返回标题、店铺、销量、评价数、规格维度、颜色价格、SKU、缺失项、结构化错误,以及不含规则快照的历史 attempt 序号、状态、规则 ID、错误和时间摘要。详情另返回 `colorImages` 数组,元素为 `{color,imagePath,width,height}`,只包含 `source_task_id` 等于当前任务的颜色图片并按颜色排序;无图时必须为 `[]`。`imagePath` 是既有 `/static/uploadfile/goauto-color/` 相对路径,Agent 使用已配置服务端 Origin 加载,加载失败不得影响其他详情字段。
- 采购列表和详情分别返回任务目标规格 `targetColor` / `targetSize` 与最终执行规格 `mappedColor` / `mappedSize`。Agent 界面必须分开展示;自动化只执行服务端下发的 `mapped*` 精确规格,映射为空时仍可查看原始目标,不得以目标值替代执行值。详情另返回蝦皮订单号、PDD 商品、数量、实际单价、PDD 订单号、下单时间和结构化错误。
- Agent 提交采购结果时可携带 `actualUnitPriceCent`(人民币分,非负)。服务端只保存 Agent 实际观察到的值;历史任务或未观察到价格的结果保持 `null`,客户端显示“未记录”。
@@ -733,7 +733,7 @@ Content-Type: application/json
}
```
- `replacementEligible=true` 仅适用于当前 Device Token 对应设备、任务状态为 `failed`,且错误码逐字等于 `PDD_LINK_INVALID` 或 `PDD_GOODS_SOLD_OUT`;其他错误、其他设备、无源商品、已存在生效替换或已有待处理替换均不得由 Android 自行放宽。
- 采集来源的 `replacementEligible=true` 不再要求任务为 `failed`,也不检查错误码;当前 Device Token 对应设备、源商品存在、没有生效或待处理替换,且该商品名下不存在 `running`、`order_submit_started`、`order_result_unknown` 采购任务时即可返回。命中采购硬拦截时 `replacementDisabledReason` 明确说明正在执行或结果待核对。采购来源仍要求失败任务且错误码逐字等于 `PDD_LINK_INVALID` 或 `PDD_GOODS_SOLD_OUT`;其他设备、无源商品或进行中的替换均不得由 Android 自行放宽。
- `replacementMappingStatus` 取当前来源对应的分项状态:`matching`、`matched` 或 `manual_required`。采购来源必须限定到该任务的 `shopeeProductId`;不能以替换主表总体状态代替。
- `replacementActivationStatus` 为 `pending`、`activated` 或 `failed`;激活失败时已采集数据仍为完成态,并返回限长的 `replacementActivationErrorMessage`。