T60 优化 SYB 商品列表加载与采购准备预检 #73

Closed
opened 2026-08-24 11:34:45 +08:00 by ila · 2 comments
Owner

原始需求摘要

用户于 2026-08-24 反馈 SYB 商品页面比其他模块加载慢。只读定位确认:页面把 SYB 列表请求与采购准备预检串行绑定在同一个表格 loading 中;预检按当前页商品逐条查询关联档案,并在规格未确定时复用采购创建的 AI 匹配,因此被动浏览页面可能等待多次数据库查询和外部 AI 请求。用户确认按优化建议建工单并实施。

目标

  1. SYB 列表返回后立即展示,采购准备列独立异步显示“正在检查”。
  2. 被动浏览和显式预览均不调用 AI Provider。
  3. 采购任务创建仍执行完整的规格决策:人工映射 → 确定性匹配 → 必要时 AI,不削弱创建前校验。
  4. 服务端批量预检一次批量加载当前页需要的 SYB、蝦皮、PDD 和最新采购任务数据,消除逐商品 N+1 查询。
  5. 列表翻页、查询或刷新并发时,旧预检结果不能覆盖新页面。

非目标

  • 不修改采购状态机、价格保护、规格映射规则或创建订单流程。
  • 不新增数据库字段或迁移。
  • 不修改 Android Agent。
  • 不触发正式采购、创建订单或支付。
  • 不缓存或持久化预检结果。

实施方案

Server

  • 将预检拆分为两种内部策略:
    • 快速只读预检:供 batch-preview 使用,只读取已确认映射并执行本地确定性匹配;若仍需 AI,返回普通人可读的“创建采购时将继续自动匹配”或明确待处理状态,绝不访问 AI Provider。
    • 完整创建预检:仅 batch-create 使用,保留必要时 AI 匹配的现有能力。
  • 为批量预检预加载:
    • 请求中的 SYB 商品;
    • 关联的存活蝦皮商品;
    • 关联的存活 PDD 商品;
    • 每个 SYB 商品最新采购任务。
  • 在内存中按请求 ID 顺序组装结果,保持现有响应结构、禁选原因和部分成功语义。
  • 创建接口仍在事务内按当前数据重新校验,不能信任页面预检。

Web

  • load() 只等待 SYB 列表;列表成功后立即关闭表格 loading。
  • 采购准备使用已有“正在检查”状态独立异步加载。
  • 用加载序号或取消标记忽略过期预检响应,防止快速翻页/查询时旧结果污染新列表。
  • 预检失败不清空已成功显示的商品列表;采购准备列显示可理解的失败状态并允许刷新。
  • 保留 #72 首次列表网络失败的一次有界重试;不把业务错误改成重试。

设计证据

本工单恢复和优化既有 SYB 列表与既有“采购准备/正在检查”组件,不新增页面、入口、权限、业务流程或新组件。视觉行为沿用当前页面:

  • 列表加载:现有表格 loading。
  • 列表已显示但预检未完成:现有采购准备列“正在检查”。
  • 预检失败:仅采购准备列显示可读失败原因,商品列表保持可用。

属于现有界面的性能缺陷修复,不需要新增 QuantUX/HTML 原型。

验收标准

  • SYB 列表接口返回后即可看到表格,不等待 batch-preview。
  • batch-preview 延迟或失败时,商品列表仍可查看;采购准备列独立显示检查中/失败状态。
  • 被动列表预检和采购弹窗预览不会调用 AI Matcher。
  • 创建采购任务时,未能确定性匹配的规格仍可按现有规则调用 AI;AI 失败则创建失败。
  • 20/100 条批量预检对 SYB、蝦皮、PDD、最新任务使用批量查询,不按行重复查询。
  • 快速切换查询条件或页码时,旧预检响应不会覆盖新页面。
  • 现有采购可用、禁选原因、设备校验、批量部分成功和幂等语义保持。
  • Server 受影响单元测试、Web lint/构建及针对异步加载的 Playwright 测试通过。
  • python dev_scripts/harness.py check --strict 与 sync --check 通过。

依赖、并行与风险

  • 依赖既有 SYB 商品、蝦皮/PDD 关联、#46/#62 规格决策和 #44 批量采购入口。
  • 与修改 purchase/batch.go 或 SYB 页面加载逻辑的任务不可并行。
  • 风险是快速预检与真实创建之间数据变化;创建接口继续按最新数据完整复核,因此预览只作 UI 提示,不作为创建授权。

文档影响

需要更新 Business Rules and Glossary / Architecture and Code Map:明确浏览和只读预检不调用 AI,完整匹配只在采购创建时执行;记录批量预加载与异步页面加载边界。

## 原始需求摘要 用户于 2026-08-24 反馈 SYB 商品页面比其他模块加载慢。只读定位确认:页面把 SYB 列表请求与采购准备预检串行绑定在同一个表格 loading 中;预检按当前页商品逐条查询关联档案,并在规格未确定时复用采购创建的 AI 匹配,因此被动浏览页面可能等待多次数据库查询和外部 AI 请求。用户确认按优化建议建工单并实施。 ## 目标 1. SYB 列表返回后立即展示,采购准备列独立异步显示“正在检查”。 2. 被动浏览和显式预览均不调用 AI Provider。 3. 采购任务创建仍执行完整的规格决策:人工映射 → 确定性匹配 → 必要时 AI,不削弱创建前校验。 4. 服务端批量预检一次批量加载当前页需要的 SYB、蝦皮、PDD 和最新采购任务数据,消除逐商品 N+1 查询。 5. 列表翻页、查询或刷新并发时,旧预检结果不能覆盖新页面。 ## 非目标 - 不修改采购状态机、价格保护、规格映射规则或创建订单流程。 - 不新增数据库字段或迁移。 - 不修改 Android Agent。 - 不触发正式采购、创建订单或支付。 - 不缓存或持久化预检结果。 ## 实施方案 ### Server - 将预检拆分为两种内部策略: - 快速只读预检:供 `batch-preview` 使用,只读取已确认映射并执行本地确定性匹配;若仍需 AI,返回普通人可读的“创建采购时将继续自动匹配”或明确待处理状态,绝不访问 AI Provider。 - 完整创建预检:仅 `batch-create` 使用,保留必要时 AI 匹配的现有能力。 - 为批量预检预加载: - 请求中的 SYB 商品; - 关联的存活蝦皮商品; - 关联的存活 PDD 商品; - 每个 SYB 商品最新采购任务。 - 在内存中按请求 ID 顺序组装结果,保持现有响应结构、禁选原因和部分成功语义。 - 创建接口仍在事务内按当前数据重新校验,不能信任页面预检。 ### Web - `load()` 只等待 SYB 列表;列表成功后立即关闭表格 loading。 - 采购准备使用已有“正在检查”状态独立异步加载。 - 用加载序号或取消标记忽略过期预检响应,防止快速翻页/查询时旧结果污染新列表。 - 预检失败不清空已成功显示的商品列表;采购准备列显示可理解的失败状态并允许刷新。 - 保留 #72 首次列表网络失败的一次有界重试;不把业务错误改成重试。 ## 设计证据 本工单恢复和优化既有 SYB 列表与既有“采购准备/正在检查”组件,不新增页面、入口、权限、业务流程或新组件。视觉行为沿用当前页面: - 列表加载:现有表格 loading。 - 列表已显示但预检未完成:现有采购准备列“正在检查”。 - 预检失败:仅采购准备列显示可读失败原因,商品列表保持可用。 属于现有界面的性能缺陷修复,不需要新增 QuantUX/HTML 原型。 ## 验收标准 - [ ] SYB 列表接口返回后即可看到表格,不等待 batch-preview。 - [ ] batch-preview 延迟或失败时,商品列表仍可查看;采购准备列独立显示检查中/失败状态。 - [ ] 被动列表预检和采购弹窗预览不会调用 AI Matcher。 - [ ] 创建采购任务时,未能确定性匹配的规格仍可按现有规则调用 AI;AI 失败则创建失败。 - [ ] 20/100 条批量预检对 SYB、蝦皮、PDD、最新任务使用批量查询,不按行重复查询。 - [ ] 快速切换查询条件或页码时,旧预检响应不会覆盖新页面。 - [ ] 现有采购可用、禁选原因、设备校验、批量部分成功和幂等语义保持。 - [ ] Server 受影响单元测试、Web lint/构建及针对异步加载的 Playwright 测试通过。 - [ ] `python dev_scripts/harness.py check --strict` 与 `sync --check` 通过。 ## 依赖、并行与风险 - 依赖既有 SYB 商品、蝦皮/PDD 关联、#46/#62 规格决策和 #44 批量采购入口。 - 与修改 `purchase/batch.go` 或 SYB 页面加载逻辑的任务不可并行。 - 风险是快速预检与真实创建之间数据变化;创建接口继续按最新数据完整复核,因此预览只作 UI 提示,不作为创建授权。 ## 文档影响 需要更新 Business Rules and Glossary / Architecture and Code Map:明确浏览和只读预检不调用 AI,完整匹配只在采购创建时执行;记录批量预加载与异步页面加载边界。
Author
Owner

实施完成,等待验收

已按确认方案完成并推送到 main。

实现

  • SYB 列表接口返回后立即展示表格,采购准备列独立异步加载。
  • 预检失败不清空商品列表,只在采购准备列显示可读错误并允许刷新。
  • 使用加载序号隔离并发查询,旧列表/预检响应不能覆盖新页面。
  • batch-preview 批量预加载 SYB、蝦皮、PDD 和每条 SYB 最新采购任务;测试固定为两条商品仍只有 4 次批量查询。
  • 只读预检只做已确认映射和确定性匹配,绝不调用 AI Matcher。
  • batch-create 保留按最新数据完整复核及必要时 AI 匹配的原行为。
  • 无数据库迁移、无 Android 变更、未触发采购、创建订单或支付。

验证

  • go test ./app/goauto/...:通过。
  • pnpm exec eslint src/views/goauto/syb-products/index.vue src/utils/request.js:通过。
  • pnpm build:prod:通过(仅项目既有 CSS/chunk 警告)。
  • pnpm exec playwright test tests/e2e/syb-network-retry.spec.ts --reporter=line:5/5 通过。
  • python dev_scripts/harness.py sync --check:通过。
  • python dev_scripts/harness.py check --strict:通过。

文档与提交

  • Architecture Wiki revision:9bb0da18b68d368b37c060af9867983ace6b49f6
  • Business Rules Wiki revision:14e4596838288a4685ffac6b55b17fcecba40326
  • 任务归档:Task-73-优化-SYB-商品列表加载与采购准备预检,revision db15add4270bb10df6e9a686d8870882d159a732
  • 提交:634bd467299cc0d6e941dc4e75cb949cddd4a910,已推送 main

回退说明与未验证项

本机 gitea.env 仍保存旧 Gitea 地址/Token:核心 Wiki 同步通过进程级临时覆盖当前地址完成;归档脚本因旧 Token 返回 401,按 MCP 优先规则改用当前 Gitea MCP 创建,并已在线验证正文。未修改或输出本机 Token。

未验证:等待用户使用本机真实 SYB 数据人工确认页面加载体感。工单保持待验收。

## 实施完成,等待验收 已按确认方案完成并推送到 `main`。 ### 实现 - SYB 列表接口返回后立即展示表格,采购准备列独立异步加载。 - 预检失败不清空商品列表,只在采购准备列显示可读错误并允许刷新。 - 使用加载序号隔离并发查询,旧列表/预检响应不能覆盖新页面。 - `batch-preview` 批量预加载 SYB、蝦皮、PDD 和每条 SYB 最新采购任务;测试固定为两条商品仍只有 4 次批量查询。 - 只读预检只做已确认映射和确定性匹配,绝不调用 AI Matcher。 - `batch-create` 保留按最新数据完整复核及必要时 AI 匹配的原行为。 - 无数据库迁移、无 Android 变更、未触发采购、创建订单或支付。 ### 验证 - `go test ./app/goauto/...`:通过。 - `pnpm exec eslint src/views/goauto/syb-products/index.vue src/utils/request.js`:通过。 - `pnpm build:prod`:通过(仅项目既有 CSS/chunk 警告)。 - `pnpm exec playwright test tests/e2e/syb-network-retry.spec.ts --reporter=line`:5/5 通过。 - `python dev_scripts/harness.py sync --check`:通过。 - `python dev_scripts/harness.py check --strict`:通过。 ### 文档与提交 - Architecture Wiki revision:`9bb0da18b68d368b37c060af9867983ace6b49f6` - Business Rules Wiki revision:`14e4596838288a4685ffac6b55b17fcecba40326` - 任务归档:[Task-73-优化-SYB-商品列表加载与采购准备预检](https://git.ilapage.cn/OPC/goauto/wiki/Task-73-%E4%BC%98%E5%8C%96-SYB-%E5%95%86%E5%93%81%E5%88%97%E8%A1%A8%E5%8A%A0%E8%BD%BD%E4%B8%8E%E9%87%87%E8%B4%AD%E5%87%86%E5%A4%87%E9%A2%84%E6%A3%80.-),revision `db15add4270bb10df6e9a686d8870882d159a732` - 提交:`634bd467299cc0d6e941dc4e75cb949cddd4a910`,已推送 `main` ### 回退说明与未验证项 本机 `gitea.env` 仍保存旧 Gitea 地址/Token:核心 Wiki 同步通过进程级临时覆盖当前地址完成;归档脚本因旧 Token 返回 401,按 MCP 优先规则改用当前 Gitea MCP 创建,并已在线验证正文。未修改或输出本机 Token。 未验证:等待用户使用本机真实 SYB 数据人工确认页面加载体感。工单保持待验收。
Author
Owner

用户于 2026-08-28 明确确认本工单验收通过。按项目流程记录验收结论并关闭工单;本次仅更新工单状态,无新增长期文档事实,不重复同步 Wiki。

用户于 2026-08-28 明确确认本工单验收通过。按项目流程记录验收结论并关闭工单;本次仅更新工单状态,无新增长期文档事实,不重复同步 Wiki。
ila closed this issue 2026-08-28 15:07:34 +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#73