采购管理失败任务批量重试 #58

Closed
opened 2026-08-21 11:58:53 +08:00 by ila · 5 comments
Owner

基本信息

  • 类型:需求
  • 所属 Epic:无
  • 所属 MVP / 版本:采购闭环真机验收 #39
  • 阶段:待验收(实现已提交)

依赖与并行

  • 前置工单:#35、#44
  • 是否允许与前置工单并行:是
  • 原因:复用已实现的采购任务查询与从 SYB 创建正式采购任务能力;不依赖物流回填。#36 正式下单能力尚待真机验收不阻塞页面和服务端批量重试实现,但真实订单验证仍须单独人工授权。

子项目影响

  • 仅影响的子项目 / 交付单元:server / web / prototypes / shared-docs
  • 是否跨子项目:是
  • 是否修改共享接口或契约:修改 Admin API,不修改 Android Agent API;Android Agent 无改动
  • 各子项目需要执行的验证:服务端采购域单元/契约测试;Web lint、构建与页面交互;本地 HTML 原型资源与交互检查;Wiki 镜像检查

原始需求

  • 来源:用户对话
  • 提出时间:2026-08-21
  • 关键原话或脱敏摘要:采购管理列表增加多选,只允许选择失败任务;在筛选栏“重置”同行最右侧增加重试按钮,把选中的失败采购任务批量加入重新采购队列。

要解决什么

当前失败重试需要进入任务详情进行一次性重新采购授权,再返回 SYB 商品列表重新查找、勾选和创建任务。服务端对未创建订单的失败任务本来允许直接新建任务,现有页面流程多余且容易误解。

目标是在采购管理列表内完成批量失败重试:保留旧失败任务和执行记录,为每条可重试失败记录创建新的待执行任务,使采购员不必返回 SYB 页面。

做什么 / 不做什么

  • 做:
    • 采购管理表格增加当前页多选;最多 100 条。
    • 只有状态为 failed 且服务端判定可重试的任务允许勾选;表头全选只选择当前页可重试项。
    • 筛选栏重置按钮同行最右侧显示“重试(N)”;无选择、加载和提交中有明确禁用态。
    • 点击后显示一次简明确认;确认后批量创建新的 pending 采购任务。
    • 新任务使用当前 SYB/PDD 档案、当前规格映射、当前价格保护和最新内置采购规则;生成新任务编号与地址后缀。
    • 默认沿用原任务设备;原任务未指定设备时仍允许空闲设备领取。原设备离线、停用、忙碌或能力不足时该项失败并显示可读原因,不静默换机。
    • 同一 SYB 商品只允许选择最新的失败任务;已有更新任务、活动任务或订单事实时禁选/拒绝。
    • 逐条处理并允许部分成功;结果展示新任务编号或失败原因。
    • 失败任务不再要求“允许重新采购”授权;该授权只保留给已经创建过订单且符合重新采购条件的任务。
  • 不做:
    • 不重置、删除或覆盖原失败任务及 attempt 记录。
    • 不自动重试、不定时重试、不自动换设备。
    • 不处理 order_result_unknown;必须先人工核对。
    • 不创建新队列表,不修改 Android Agent,不执行付款。
    • 本工单原型审核前不编写生产代码。

已确认方案

  1. 新增 Admin 批量重试接口,输入稳定 requestId 和原失败任务 taskIds,服务端逐项锁定、校验、幂等创建新任务并返回部分成功结果。
  2. 采购任务列表响应补充可重试标记和普通人可理解的禁用原因,前端不只依赖状态猜测。
  3. “重新采购队列”复用 purchase_task.status=pending,不新增数据库表;预计不需要数据库迁移。
  4. 新任务沿用失败任务的设备选择语义,但业务输入和规则取当前最新事实,以便修复映射或规则后真正生效。
  5. 进入 order_submit_started、order_result_unknown、已有订单号/下单时间或其他订单事实的记录禁止走失败重试。
  6. 批次按原任务 ID 派生稳定创建请求标识;请求重放返回原创建结果,不重复创建。
  7. 管理员和采购员均可操作;真实创建订单仍由 Agent 后续执行,本接口本身只创建待执行任务。

预计修改文件:

  • prototypes/58/v1/index.html
  • web/src/views/goauto/purchase-tasks/index.vue
  • web/src/api/goauto/purchase-tasks.js
  • server/app/goauto/purchase/ 下批量重试、查询和测试文件
  • server/app/goauto/router.go(如需注册新路由)
  • Wiki Business-Rules-and-Glossary、Architecture-and-Code-Map(实现阶段)

需求变化记录

日期 变化内容 原因 用户确认
2026-08-21 失败重试由逐条授权+返回 SYB 创建,调整为采购管理列表批量重试 简化采购员操作 是

设计与原型门禁

  • 修改类型:重大交互(现有页面新增表格多选、批量确认和部分成功反馈)
  • 所需设计证据:可交互本地 HTML 原型
  • 可编辑设计源链接、版本或事实来源:沿用 #32 已确认采购闭环和 #35 已实现采购管理页面;本次 Gitea MCP 指向旧地址返回 404,工单创建回退到 gitea.env 配置的 Gitea API。当前会话没有可用 QuantUX MCP,使用等效本地 HTML 审核方案。
  • 本地 HTML 审核快照路径和版本:prototypes/58/v1/index.html
  • 本地浏览方式和资源完整性检查:直接打开 index.html,全部资源内嵌;DOCTYPE、语言、必需组件、禁用原因、页面状态、唯一 ID、自包含资源、JavaScript 语法和 git diff --check 均通过。当前会话没有可用浏览器实例,真实点击检查待用户本地审核
  • 版本、revision 或确认日期:v1,Git 提交 0d13ed4,已推送 main
  • 状态:已确认
  • 确认人、确认时间和覆盖范围:用户于 2026-08-21 确认 v1,覆盖列表多选、禁选、批量重试确认与部分成功反馈
  • 无需 UI 原型或无需任何原型的原因:不适用

文档影响

  • 不影响长期文档,原因:
  • 更新架构与代码地图 Wiki
  • 更新业务规则与术语 Wiki
  • 更新 API 契约 Wiki(不修改 Android Agent API)
  • 创建或更新 Wiki 任务归档;本地快照仅在用户明确要求时导出

交付文档影响

  • 无交付文档影响,原因:管理端内部操作优化,长期规则写入 Wiki
  • 更新已有交付文档,受众与页面:
  • 新增交付文档,受众与页面:
  • 需要目标岗位或客户代表验证:是;由用户审核 HTML 原型并在实现后验证批量选择、禁用原因和部分成功结果

验收标准

  • 列表存在复选框,非可重试行明确禁用;表头全选不跨页且最多 100 条。
  • 重试按钮与重置同行靠右,显示已选数量;无选择和提交时状态正确。
  • 点击重试只需一次确认,不要求原因或固定确认文字。
  • 批量重试为每个成功项创建一条新 pending 任务,保留旧任务,并返回新任务编号。
  • 使用最新业务资料和规则;新任务生成新地址后缀。
  • 原设备不可用、同一 SYB 已有后续/活动任务、存在订单事实、重复 SYB 和非失败状态均不会创建任务,并给出清楚原因。
  • 同一请求重放不产生重复任务;批量允许部分成功。
  • order_result_unknown、已创建订单和已支付订单不能通过本入口重试。
  • 管理员和采购员可用;页面和接口没有支付能力。
  • 原型先经用户确认,之后才允许生产编码。

验证方式

  • 原型阶段:浏览器检查 1440×900 和 1280×720;键盘操作复选框、按钮和弹窗;验证正常、空、加载、失败、禁用、权限与部分成功状态。
  • 实现阶段:go test ./app/goauto/purchase/...;Web lint/生产构建;python dev_scripts/harness.py sync --check;python dev_scripts/harness.py check --strict;git diff --check。
  • 不在本工单自动执行真实 PDD 下单;若需真机验收必须再次获得独立人工授权。

风险和回退

  • 风险:历史失败任务重复选择可能造成同一 SYB 多个新任务;通过“最新失败任务”校验、SYB 活动槽、事务锁和幂等请求控制。
  • 风险:失败状态与不可逆订单边界不一致可能重复下单;存在不可逆时间、订单号、下单时间或未知订单状态时一律拒绝。
  • 回退:撤销 Web 批量入口和 Admin 批量重试路由即可;旧任务与新任务均为独立事实,无需回滚或删除业务数据。

实施结果

  • 实现提交:01d8520(已推送 main)
  • 服务端:新增 POST /api/admin/v1/purchase-tasks/batch-retry、可重试资格字段、逐项幂等创建与部分成功;旧失败任务保留。
  • Web:采购任务当前页多选、服务端禁选原因、一次确认、提交中锁定和部分成功结果。
  • Android / 数据库:无改动、无迁移;未执行真实 PDD 下单或支付。
  • 长期 Wiki:Business Rules revision cd1b56cf3edd6a6a88b2de0c9a174136a3c90132;Architecture revision 86f5a5432ee1683b466e87d127768239d3492b54。
  • 任务归档:Task-58-采购管理失败任务批量重试,revision b4df395f7194542f4b3a64bbe57fde69835dc6f4。
## 基本信息 - 类型:需求 - 所属 Epic:无 - 所属 MVP / 版本:采购闭环真机验收 #39 - 阶段:待验收(实现已提交) ## 依赖与并行 - 前置工单:#35、#44 - 是否允许与前置工单并行:是 - 原因:复用已实现的采购任务查询与从 SYB 创建正式采购任务能力;不依赖物流回填。#36 正式下单能力尚待真机验收不阻塞页面和服务端批量重试实现,但真实订单验证仍须单独人工授权。 ## 子项目影响 - 仅影响的子项目 / 交付单元:server / web / prototypes / shared-docs - 是否跨子项目:是 - 是否修改共享接口或契约:修改 Admin API,不修改 Android Agent API;Android Agent 无改动 - 各子项目需要执行的验证:服务端采购域单元/契约测试;Web lint、构建与页面交互;本地 HTML 原型资源与交互检查;Wiki 镜像检查 ## 原始需求 - 来源:用户对话 - 提出时间:2026-08-21 - 关键原话或脱敏摘要:采购管理列表增加多选,只允许选择失败任务;在筛选栏“重置”同行最右侧增加重试按钮,把选中的失败采购任务批量加入重新采购队列。 ## 要解决什么 当前失败重试需要进入任务详情进行一次性重新采购授权,再返回 SYB 商品列表重新查找、勾选和创建任务。服务端对未创建订单的失败任务本来允许直接新建任务,现有页面流程多余且容易误解。 目标是在采购管理列表内完成批量失败重试:保留旧失败任务和执行记录,为每条可重试失败记录创建新的待执行任务,使采购员不必返回 SYB 页面。 ## 做什么 / 不做什么 - 做: - 采购管理表格增加当前页多选;最多 100 条。 - 只有状态为 `failed` 且服务端判定可重试的任务允许勾选;表头全选只选择当前页可重试项。 - 筛选栏重置按钮同行最右侧显示“重试(N)”;无选择、加载和提交中有明确禁用态。 - 点击后显示一次简明确认;确认后批量创建新的 `pending` 采购任务。 - 新任务使用当前 SYB/PDD 档案、当前规格映射、当前价格保护和最新内置采购规则;生成新任务编号与地址后缀。 - 默认沿用原任务设备;原任务未指定设备时仍允许空闲设备领取。原设备离线、停用、忙碌或能力不足时该项失败并显示可读原因,不静默换机。 - 同一 SYB 商品只允许选择最新的失败任务;已有更新任务、活动任务或订单事实时禁选/拒绝。 - 逐条处理并允许部分成功;结果展示新任务编号或失败原因。 - 失败任务不再要求“允许重新采购”授权;该授权只保留给已经创建过订单且符合重新采购条件的任务。 - 不做: - 不重置、删除或覆盖原失败任务及 attempt 记录。 - 不自动重试、不定时重试、不自动换设备。 - 不处理 `order_result_unknown`;必须先人工核对。 - 不创建新队列表,不修改 Android Agent,不执行付款。 - 本工单原型审核前不编写生产代码。 ## 已确认方案 1. 新增 Admin 批量重试接口,输入稳定 `requestId` 和原失败任务 `taskIds`,服务端逐项锁定、校验、幂等创建新任务并返回部分成功结果。 2. 采购任务列表响应补充可重试标记和普通人可理解的禁用原因,前端不只依赖状态猜测。 3. “重新采购队列”复用 `purchase_task.status=pending`,不新增数据库表;预计不需要数据库迁移。 4. 新任务沿用失败任务的设备选择语义,但业务输入和规则取当前最新事实,以便修复映射或规则后真正生效。 5. 进入 `order_submit_started`、`order_result_unknown`、已有订单号/下单时间或其他订单事实的记录禁止走失败重试。 6. 批次按原任务 ID 派生稳定创建请求标识;请求重放返回原创建结果,不重复创建。 7. 管理员和采购员均可操作;真实创建订单仍由 Agent 后续执行,本接口本身只创建待执行任务。 预计修改文件: - `prototypes/58/v1/index.html` - `web/src/views/goauto/purchase-tasks/index.vue` - `web/src/api/goauto/purchase-tasks.js` - `server/app/goauto/purchase/` 下批量重试、查询和测试文件 - `server/app/goauto/router.go`(如需注册新路由) - Wiki `Business-Rules-and-Glossary`、`Architecture-and-Code-Map`(实现阶段) ## 需求变化记录 | 日期 | 变化内容 | 原因 | 用户确认 | |---|---|---|---| | 2026-08-21 | 失败重试由逐条授权+返回 SYB 创建,调整为采购管理列表批量重试 | 简化采购员操作 | 是 | ## 设计与原型门禁 - 修改类型:重大交互(现有页面新增表格多选、批量确认和部分成功反馈) - 所需设计证据:可交互本地 HTML 原型 - 可编辑设计源链接、版本或事实来源:沿用 #32 已确认采购闭环和 #35 已实现采购管理页面;本次 Gitea MCP 指向旧地址返回 404,工单创建回退到 `gitea.env` 配置的 Gitea API。当前会话没有可用 QuantUX MCP,使用等效本地 HTML 审核方案。 - 本地 HTML 审核快照路径和版本:`prototypes/58/v1/index.html` - 本地浏览方式和资源完整性检查:直接打开 `index.html`,全部资源内嵌;DOCTYPE、语言、必需组件、禁用原因、页面状态、唯一 ID、自包含资源、JavaScript 语法和 `git diff --check` 均通过。当前会话没有可用浏览器实例,真实点击检查待用户本地审核 - 版本、revision 或确认日期:v1,Git 提交 `0d13ed4`,已推送 `main` - 状态:已确认 - 确认人、确认时间和覆盖范围:用户于 2026-08-21 确认 v1,覆盖列表多选、禁选、批量重试确认与部分成功反馈 - 无需 UI 原型或无需任何原型的原因:不适用 ## 文档影响 - [ ] 不影响长期文档,原因: - [x] 更新架构与代码地图 Wiki - [x] 更新业务规则与术语 Wiki - [ ] 更新 API 契约 Wiki(不修改 Android Agent API) - [x] 创建或更新 Wiki 任务归档;本地快照仅在用户明确要求时导出 ## 交付文档影响 - [x] 无交付文档影响,原因:管理端内部操作优化,长期规则写入 Wiki - [ ] 更新已有交付文档,受众与页面: - [ ] 新增交付文档,受众与页面: - [x] 需要目标岗位或客户代表验证:是;由用户审核 HTML 原型并在实现后验证批量选择、禁用原因和部分成功结果 ## 验收标准 - [x] 列表存在复选框,非可重试行明确禁用;表头全选不跨页且最多 100 条。 - [x] 重试按钮与重置同行靠右,显示已选数量;无选择和提交时状态正确。 - [x] 点击重试只需一次确认,不要求原因或固定确认文字。 - [x] 批量重试为每个成功项创建一条新 `pending` 任务,保留旧任务,并返回新任务编号。 - [x] 使用最新业务资料和规则;新任务生成新地址后缀。 - [x] 原设备不可用、同一 SYB 已有后续/活动任务、存在订单事实、重复 SYB 和非失败状态均不会创建任务,并给出清楚原因。 - [x] 同一请求重放不产生重复任务;批量允许部分成功。 - [x] `order_result_unknown`、已创建订单和已支付订单不能通过本入口重试。 - [x] 管理员和采购员可用;页面和接口没有支付能力。 - [x] 原型先经用户确认,之后才允许生产编码。 ## 验证方式 - 原型阶段:浏览器检查 1440×900 和 1280×720;键盘操作复选框、按钮和弹窗;验证正常、空、加载、失败、禁用、权限与部分成功状态。 - 实现阶段:`go test ./app/goauto/purchase/...`;Web lint/生产构建;`python dev_scripts/harness.py sync --check`;`python dev_scripts/harness.py check --strict`;`git diff --check`。 - 不在本工单自动执行真实 PDD 下单;若需真机验收必须再次获得独立人工授权。 ## 风险和回退 - 风险:历史失败任务重复选择可能造成同一 SYB 多个新任务;通过“最新失败任务”校验、SYB 活动槽、事务锁和幂等请求控制。 - 风险:失败状态与不可逆订单边界不一致可能重复下单;存在不可逆时间、订单号、下单时间或未知订单状态时一律拒绝。 - 回退:撤销 Web 批量入口和 Admin 批量重试路由即可;旧任务与新任务均为独立事实,无需回滚或删除业务数据。 ## 实施结果 - 实现提交:`01d8520`(已推送 `main`) - 服务端:新增 `POST /api/admin/v1/purchase-tasks/batch-retry`、可重试资格字段、逐项幂等创建与部分成功;旧失败任务保留。 - Web:采购任务当前页多选、服务端禁选原因、一次确认、提交中锁定和部分成功结果。 - Android / 数据库:无改动、无迁移;未执行真实 PDD 下单或支付。 - 长期 Wiki:Business Rules revision `cd1b56cf3edd6a6a88b2de0c9a174136a3c90132`;Architecture revision `86f5a5432ee1683b466e87d127768239d3492b54`。 - 任务归档:[Task-58-采购管理失败任务批量重试](https://git.ilapage.cn/OPC/goauto/wiki/Task-58-%E9%87%87%E8%B4%AD%E7%AE%A1%E7%90%86%E5%A4%B1%E8%B4%A5%E4%BB%BB%E5%8A%A1%E6%89%B9%E9%87%8F%E9%87%8D%E8%AF%95.-),revision `b4df395f7194542f4b3a64bbe57fde69835dc6f4`。
Author
Owner

#58 原型 v1 已提交,等待审核

  • 本地 HTML:prototypes/58/v1/index.html
  • Git 提交:0d13ed4 docs(#58): add batch retry prototype
  • 已推送:main
  • 覆盖:当前页可重试任务多选、非可重试行禁选及原因、筛选栏最右侧“重试(N)”、一次确认、提交中锁定、部分成功结果、正常/加载/空列表/加载失败状态。
  • 安全边界:旧失败任务保留;新任务才进入 pending;订单结果未知不可重试;不自动换机;原型不创建订单、不支付。

验证结果:

  • 静态结构与所需交互元素:PASS
  • 自包含资源与重复 ID:PASS
  • JavaScript 语法:PASS
  • python dev_scripts/harness.py sync --check:PASS
  • python dev_scripts/harness.py check --strict:PASS
  • git diff --cached --check:PASS

限制:当前会话没有可用 QuantUX MCP,也没有可连接的浏览器实例,因此没有把浏览器真实点击检查标记为通过。请直接打开本地 HTML 审核;原型确认前不会编写 server/web 生产代码。

## #58 原型 v1 已提交,等待审核 - 本地 HTML:`prototypes/58/v1/index.html` - Git 提交:`0d13ed4 docs(#58): add batch retry prototype` - 已推送:`main` - 覆盖:当前页可重试任务多选、非可重试行禁选及原因、筛选栏最右侧“重试(N)”、一次确认、提交中锁定、部分成功结果、正常/加载/空列表/加载失败状态。 - 安全边界:旧失败任务保留;新任务才进入 `pending`;订单结果未知不可重试;不自动换机;原型不创建订单、不支付。 验证结果: - 静态结构与所需交互元素:PASS - 自包含资源与重复 ID:PASS - JavaScript 语法:PASS - `python dev_scripts/harness.py sync --check`:PASS - `python dev_scripts/harness.py check --strict`:PASS - `git diff --cached --check`:PASS 限制:当前会话没有可用 QuantUX MCP,也没有可连接的浏览器实例,因此没有把浏览器真实点击检查标记为通过。请直接打开本地 HTML 审核;原型确认前不会编写 server/web 生产代码。
Author
Owner

用户已于 2026-08-21 确认 prototypes/58/v1/index.html 原型。#58 解除生产编码门禁,开始按已确认范围实施;不执行真实 PDD 订单或付款。

用户已于 2026-08-21 确认 `prototypes/58/v1/index.html` 原型。#58 解除生产编码门禁,开始按已确认范围实施;不执行真实 PDD 订单或付款。
Author
Owner

#58 已完成实现并进入待验收。

验证结果:

  • go test ./app/goauto/purchase:通过(含新建任务/保留旧失败、幂等重放、部分成功、订单事实拒绝、离线/忙碌原设备、旧任务失效和权限边界)
  • .\scripts\verify.ps1 -Component server:通过(go test ./... + go build)
  • .\scripts\verify.ps1 -Component web:通过(Lint 0 error,30 条仓库既有 warning;生产构建通过,保留既有 CSS/大包 warning)
  • python dev_scripts/harness.py sync --verify、check --strict、最终 sync --check:通过
  • git diff --check:通过

提交:01d8520,已推送 main。没有数据库迁移、Android 改动、真实下单或支付操作。请按已确认 v1 原型验收采购管理列表批量重试。

#58 已完成实现并进入待验收。 验证结果: - `go test ./app/goauto/purchase`:通过(含新建任务/保留旧失败、幂等重放、部分成功、订单事实拒绝、离线/忙碌原设备、旧任务失效和权限边界) - `.\scripts\verify.ps1 -Component server`:通过(`go test ./...` + `go build`) - `.\scripts\verify.ps1 -Component web`:通过(Lint 0 error,30 条仓库既有 warning;生产构建通过,保留既有 CSS/大包 warning) - `python dev_scripts/harness.py sync --verify`、`check --strict`、最终 `sync --check`:通过 - `git diff --check`:通过 提交:`01d8520`,已推送 `main`。没有数据库迁移、Android 改动、真实下单或支付操作。请按已确认 v1 原型验收采购管理列表批量重试。
Author
Owner

任务归档已补全实现、验收、测试、未验证项和提交信息,并在线回读确认;最新 revision:b4df395f7194542f4b3a64bbe57fde69835dc6f4。

任务归档已补全实现、验收、测试、未验证项和提交信息,并在线回读确认;最新 revision:`b4df395f7194542f4b3a64bbe57fde69835dc6f4`。
Author
Owner

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。
ila closed this issue 2026-08-29 20:43:27 +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#58