缺陷:采购列表刷新不得触发 AI 规格匹配 #63

Closed
opened 2026-08-21 17:59:25 +08:00 by ila · 2 comments
Owner

原始需求与问题

来源:用户于 2026-08-21 反馈,使用 start-all.bat 或分别启动前后端后,其他模块刷新正常,只有采购管理提示“服务器连接异常,请检查服务器!”。用户确认按分析建议建工单并实施。

已确认事实

  • 前端 9527、服务端 8010、MySQL、CORS 和采购路由连通性正常;不存在旧进程占用。
  • 当前测试库 5 条采购任务中有 4 条 failed,且规格来源均为 unresolved;相应 PDD 商品档案存在可选颜色和尺码,虾皮目标规格没有已确认映射。
  • AI Provider 已启用,单次超时 60 秒;Web Axios 超时为 10 秒。
  • AdminList / AdminDetail 为展示 retryable 调用 retryEligibility,后者调用 previewOne,在未确认映射时可能进入 matcher.Resolve 并访问外部 AI Provider。
  • 因此读取采购列表可能串行等待外部 AI,超过 Web 超时后被误显示为服务器连接异常。
  • Gitea MCP 当前仍指向旧地址并对 OPC/goauto 返回 404,本工单按项目规则使用本机 gitea.env 的 REST 配置创建。

目标

采购列表和采购详情必须快速、只读地返回,禁止在查询过程中调用 AI Provider。完整的当前档案校验、确定性规格匹配和 AI 回退只允许在用户提交“重试”时执行。

非目标

  • 不改变采购任务数据库结构或接口响应字段。
  • 不修改 AI Provider 配置、超时或密钥规则。
  • 不修改 Admin 页面布局和交互。
  • 不创建采购任务、PDD 订单,不执行付款,不调用真实 AI 做验证。

依赖与并行性

  • 依赖已完成的 #57 批量重试和 #62 服务端规格匹配。
  • 属于服务端单元缺陷,不与采购创建订单真机验证并行耦合。

实施方案

  1. 将失败任务的“基础安全资格”与“提交重试时的完整预检”拆开。
  2. Admin 列表和详情只执行基础安全资格:失败/正式任务、未进入不可逆边界、最新任务、设备基础状态与忙碌状态等;不得调用 previewOne 或 SpecMatcher.Resolve。
  3. POST /api/admin/v1/purchase-tasks/batch-retry 保持完整预检:读取当前 SYB/PDD/映射/价格,先确定性匹配,必要时才调用 AI,并逐项返回失败原因。
  4. 增加回归测试:列表/详情即使使用会报错或阻塞的 Matcher 也不得调用;批量重试仍保留完整匹配门禁。

设计证据

恢复既有页面的后端缺陷,不改变 UI、接口字段、流程、权限或状态,无需新增原型。复用 #57 已确认的采购管理批量重试交互。

验收标准

  • 采购列表和详情查询不调用 AI Provider。
  • 当前包含 4 条 failed/unresolved 任务的测试数据下,采购列表可在 Web 10 秒超时内返回。
  • 列表仍返回 retryable、retryDisabledCode、retryDisabledReason,基础安全限制不放松。
  • 点击批量重试时仍重新读取当前档案并执行完整规格匹配;AI/映射失败逐项返回可读原因。
  • 服务端相关单元测试和全量 Go 测试通过。
  • 不调用真实 AI、不创建订单、不修改数据库结构和数据。

风险

列表显示“可重试”只代表基础安全条件允许;当前商品、映射、价格或 AI 的最终结果在提交重试时重新检查,可能逐项失败。页面已有批量重试结果对话框承载具体失败原因,因此不需要新增 UI。

文档影响

无长期文档影响:采购规则仍是“重试提交时按当前档案完整校验”,本修复只移除查询接口中的意外外部调用,不改变既有业务规则、API 字段或操作入口。

## 原始需求与问题 来源:用户于 2026-08-21 反馈,使用 `start-all.bat` 或分别启动前后端后,其他模块刷新正常,只有采购管理提示“服务器连接异常,请检查服务器!”。用户确认按分析建议建工单并实施。 ## 已确认事实 - 前端 `9527`、服务端 `8010`、MySQL、CORS 和采购路由连通性正常;不存在旧进程占用。 - 当前测试库 5 条采购任务中有 4 条 `failed`,且规格来源均为 `unresolved`;相应 PDD 商品档案存在可选颜色和尺码,虾皮目标规格没有已确认映射。 - AI Provider 已启用,单次超时 60 秒;Web Axios 超时为 10 秒。 - `AdminList` / `AdminDetail` 为展示 `retryable` 调用 `retryEligibility`,后者调用 `previewOne`,在未确认映射时可能进入 `matcher.Resolve` 并访问外部 AI Provider。 - 因此读取采购列表可能串行等待外部 AI,超过 Web 超时后被误显示为服务器连接异常。 - Gitea MCP 当前仍指向旧地址并对 `OPC/goauto` 返回 404,本工单按项目规则使用本机 `gitea.env` 的 REST 配置创建。 ## 目标 采购列表和采购详情必须快速、只读地返回,禁止在查询过程中调用 AI Provider。完整的当前档案校验、确定性规格匹配和 AI 回退只允许在用户提交“重试”时执行。 ## 非目标 - 不改变采购任务数据库结构或接口响应字段。 - 不修改 AI Provider 配置、超时或密钥规则。 - 不修改 Admin 页面布局和交互。 - 不创建采购任务、PDD 订单,不执行付款,不调用真实 AI 做验证。 ## 依赖与并行性 - 依赖已完成的 #57 批量重试和 #62 服务端规格匹配。 - 属于服务端单元缺陷,不与采购创建订单真机验证并行耦合。 ## 实施方案 1. 将失败任务的“基础安全资格”与“提交重试时的完整预检”拆开。 2. Admin 列表和详情只执行基础安全资格:失败/正式任务、未进入不可逆边界、最新任务、设备基础状态与忙碌状态等;不得调用 `previewOne` 或 `SpecMatcher.Resolve`。 3. `POST /api/admin/v1/purchase-tasks/batch-retry` 保持完整预检:读取当前 SYB/PDD/映射/价格,先确定性匹配,必要时才调用 AI,并逐项返回失败原因。 4. 增加回归测试:列表/详情即使使用会报错或阻塞的 Matcher 也不得调用;批量重试仍保留完整匹配门禁。 ## 设计证据 恢复既有页面的后端缺陷,不改变 UI、接口字段、流程、权限或状态,无需新增原型。复用 #57 已确认的采购管理批量重试交互。 ## 验收标准 - [ ] 采购列表和详情查询不调用 AI Provider。 - [ ] 当前包含 4 条 `failed/unresolved` 任务的测试数据下,采购列表可在 Web 10 秒超时内返回。 - [ ] 列表仍返回 `retryable`、`retryDisabledCode`、`retryDisabledReason`,基础安全限制不放松。 - [ ] 点击批量重试时仍重新读取当前档案并执行完整规格匹配;AI/映射失败逐项返回可读原因。 - [ ] 服务端相关单元测试和全量 Go 测试通过。 - [ ] 不调用真实 AI、不创建订单、不修改数据库结构和数据。 ## 风险 列表显示“可重试”只代表基础安全条件允许;当前商品、映射、价格或 AI 的最终结果在提交重试时重新检查,可能逐项失败。页面已有批量重试结果对话框承载具体失败原因,因此不需要新增 UI。 ## 文档影响 无长期文档影响:采购规则仍是“重试提交时按当前档案完整校验”,本修复只移除查询接口中的意外外部调用,不改变既有业务规则、API 字段或操作入口。
Author
Owner

实施完成,待用户验收

实现

  • AdminList 和 AdminDetail 改为轻量重试资格检查,不再调用 previewOne 或 SpecMatcher.Resolve。
  • 保留失败/正式任务、不可逆边界、最新任务、设备在线/能力/忙碌等基础安全限制。
  • BatchRetry 仍执行完整当前档案预检、确定性匹配和必要的 AI 回退,并逐项返回失败原因。
  • 无数据库、API 字段或 Web 页面改动;未调用真实 AI,未创建任务或订单。

验证

  • go test ./app/goauto/purchase -run 'TestAdmin|TestBatchRetry' -count=1:通过。
  • go test ./...:通过。
  • .\scripts\verify.ps1 -Component server:测试和构建通过。
  • 回归测试:列表和详情 Matcher 调用次数为 0;提交批量重试时调用次数为 1。
  • python dev_scripts/harness.py check --strict:通过。
  • python dev_scripts/harness.py sync --check:Gitea Wiki API 当前返回 404;核心镜像无改动,已按既有回退使用 Wiki Git 归档并在线回读。

提交与归档

  • 代码提交:ec9f47f2abfcef7157932d24f3bfdebd189aa372
  • Wiki 归档:Task-63-采购列表刷新不得触发 AI 规格匹配
  • Wiki revision:d5176ace1734f40eefe590b90e5d65d7fcddec5e

人工验收

当前运行中的服务端进程仍是修改前版本。请重启服务端后刷新采购管理,确认列表正常返回;批量重试若规格仍无法匹配,应在提交后的结果中显示具体失败原因,而不是列表刷新时报服务器连接异常。

## 实施完成,待用户验收 ### 实现 - `AdminList` 和 `AdminDetail` 改为轻量重试资格检查,不再调用 `previewOne` 或 `SpecMatcher.Resolve`。 - 保留失败/正式任务、不可逆边界、最新任务、设备在线/能力/忙碌等基础安全限制。 - `BatchRetry` 仍执行完整当前档案预检、确定性匹配和必要的 AI 回退,并逐项返回失败原因。 - 无数据库、API 字段或 Web 页面改动;未调用真实 AI,未创建任务或订单。 ### 验证 - `go test ./app/goauto/purchase -run 'TestAdmin|TestBatchRetry' -count=1`:通过。 - `go test ./...`:通过。 - `.\scripts\verify.ps1 -Component server`:测试和构建通过。 - 回归测试:列表和详情 Matcher 调用次数为 0;提交批量重试时调用次数为 1。 - `python dev_scripts/harness.py check --strict`:通过。 - `python dev_scripts/harness.py sync --check`:Gitea Wiki API 当前返回 404;核心镜像无改动,已按既有回退使用 Wiki Git 归档并在线回读。 ### 提交与归档 - 代码提交:`ec9f47f2abfcef7157932d24f3bfdebd189aa372` - Wiki 归档:`Task-63-采购列表刷新不得触发 AI 规格匹配` - Wiki revision:`d5176ace1734f40eefe590b90e5d65d7fcddec5e` ### 人工验收 当前运行中的服务端进程仍是修改前版本。请重启服务端后刷新采购管理,确认列表正常返回;批量重试若规格仍无法匹配,应在提交后的结果中显示具体失败原因,而不是列表刷新时报服务器连接异常。
Author
Owner

用户验收通过

  • 用户于 2026-08-21 重启服务端并刷新采购管理后,明确确认 #63 验收通过。
  • 代码提交:ec9f47f2abfcef7157932d24f3bfdebd189aa372
  • Wiki 任务归档已更新为“用户已验收通过”。
  • Wiki revision:ae74e433ea23c2faf21233b33d60718ec6471a81
  • 核心 Wiki 页面没有变化,未导出 docs/task/。
  • sync --check 仍受当前 Wiki API 404 阻塞;任务页已通过 Wiki Git 远端回读确认。

工单关闭。

## 用户验收通过 - 用户于 2026-08-21 重启服务端并刷新采购管理后,明确确认 #63 验收通过。 - 代码提交:`ec9f47f2abfcef7157932d24f3bfdebd189aa372` - Wiki 任务归档已更新为“用户已验收通过”。 - Wiki revision:`ae74e433ea23c2faf21233b33d60718ec6471a81` - 核心 Wiki 页面没有变化,未导出 `docs/task/`。 - `sync --check` 仍受当前 Wiki API 404 阻塞;任务页已通过 Wiki Git 远端回读确认。 工单关闭。
ila closed this issue 2026-08-21 20:49:59 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#63