功能:所有失败采集任务复用原任务重新采集并保留执行审计 #155

Closed
opened 2026-08-29 15:44:36 +08:00 by ila · 3 comments
Owner

需求来源

  • 提出时间:2026-08-29
  • 用户确认:Admin 和 Agent 都由采购员使用;所有失败采集任务,无论由 Admin 创建还是 Agent 当前页创建,都应允许在规则或代码更新后重新采集。
  • 关键约束:重新采集复用原 collection_task.id,不创建新采集任务;旧次执行信息必须可追溯。
  • 现场样本:采集任务 99,source=agent_current_page、status=failed,在商品身份识别前因 PDD_COPY_LINK_UNAVAILABLE 失败,目前客户端详情未提供“重新采集”。

当前事实与根因

  1. 服务端重置逻辑明确拒绝 agent_current_page,并要求任务已有 PDD 商品。
  2. Android 列表与详情的重置策略也排除了 agent_current_page。
  3. 现有重置会清空失败结果并继续使用旧 rule_snapshot,无法满足“更新规则/代码后按最新规则重采且保留旧次审计”。
  4. Android 前台执行器已经具备当前页来源任务的恢复 PDD、重新复制链接、识别商品和采集流程,可复用原任务进入下一次执行。
  5. Gitea MCP 在当前会话不可用,本工单按仓库规则回退 Gitea API 创建。

目标

  • 所有 failed 采集任务均可在 Agent 列表和详情发起“重新采集”。
  • 复用原任务 ID,把每次执行视为同一任务的不同 attempt。
  • 新 attempt 使用当前有效规则及最新版 Agent 代码;旧 attempt 的规则、错误和时间信息可追溯。
  • 保持设备串行、任务租约、幂等、商品冲突和当前页身份安全边界。

非目标

  • 不把“重新采集”实现为新建采集任务。
  • 不自动替换失效/售罄商品;商品替换仍由 #129 → #131 → #130 → #132 的流程负责。
  • 不保存原始控件树、设备截图或个人数据。
  • 不放宽验证码、风控、登录失效、OCR/VLM 等既有安全规则。

依赖与关系

  • 与 #129~#132 的商品替换能力互补但不互相替代:本工单处理原商品的失败重采;替换工单处理已识别商品失效/售罄后的人工换品。
  • 当前页任务第一次失败在身份识别前时允许首次绑定商品;已有商品身份时,重新识别必须仍为同一商品,否则按商品冲突失败。

实施方案

1. 数据模型与执行审计(需数据库迁移授权)

  • collection_task 增加 attempt_number,历史任务默认/回填为 1。
  • 新增 collection_task_attempt(最终命名以项目迁移规范为准),按 task_id + attempt_number 唯一保存已结束 attempt 的最小审计信息:
    • 任务 ID、attempt 序号、来源、设备;
    • 当次 rule_id、规则快照(或等价可复核快照);
    • 最终状态、错误码、脱敏错误信息;
    • 开始、结束、归档时间;
    • 必要的结构化结果摘要,不保存原始控件树和截图。
  • 重置事务中先归档当前失败 attempt,再清理当前任务的旧错误/结果/租约数据,递增 attempt,并重新置为 pending。
  • 同一幂等请求重复到达不得重复归档、重复递增或重复清理。
  • 所有前置检查在持久化变更前完成;事务失败不得留下半归档或半重置状态。

2. 最新规则快照

  • Admin 来源:按任务原 rule_id 读取当前有效规则内容并生成新快照;规则已删除或停用时明确拒绝,不退回旧快照。
  • Agent 当前页来源:读取当前有效的 Agent 手动采集默认规则,更新任务 rule_id 与 rule_snapshot;没有可用默认规则时明确拒绝。
  • 每次实际动作继续与 taskId、deviceId、当次 ruleSnapshot、attemptNumber 关联。

3. 服务端重置

  • 放开 agent_current_page 的失败任务重置限制,不再要求其在重置前必须已有 PDD 商品。
  • 继续校验任务必须为 failed、设备归属/在线/空闲、同设备串行、采集/采购冲突、同商品活动任务冲突和任务租约。
  • 重置成功返回同一 task ID 及新的 attempt 序号;不会新建 collection_task。
  • 已有商品身份的当前页任务沿用现有 identify 冲突保护;未识别任务(如任务 99)允许下一次执行首次绑定。

4. Android Agent

  • 失败任务列表和详情对 Admin、Agent 当前页两种来源统一显示既有“重新采集”入口。
  • 当前页来源点击前复用当前页采集的就绪检查:要求 PDD 可恢复且采购员已准备目标商品页;不满足时不提交重置。
  • 确认文案明确:复用原任务、使用最新规则、旧次失败保留在执行记录。
  • 重置成功后启动既有前台调度,展示同一任务及新 attempt;保留本地冷却、互斥和重复点击防护。
  • 不新增独立页面,复用既有按钮、确认框和状态反馈;以现有界面标注截图作为设计证据,实施前补入工单。

5. API 与契约

  • 继续使用既有采集任务 reset 接口,保持同一任务语义;响应补充/返回 attemptNumber(若现有 DTO 已覆盖则复用)。
  • 同步更新共享 Agent API 契约:删除“当前页来源不可重置”的旧约束,补充 attempt、最新规则与身份绑定规则。

验收标准

  1. Admin 创建的失败采集任务点击重新采集后,任务 ID 不变、attempt +1,并使用原规则 ID 的最新有效内容。
  2. Agent 当前页创建的失败采集任务在列表和详情均可重新采集,任务 ID 不变,并使用当前手动采集默认规则。
  3. 类似任务 99 的“身份识别前失败”任务可在下一 attempt 首次绑定商品并继续采集。
  4. 已绑定商品的当前页任务:相同商品可继续,不同商品被明确拒绝,不能覆盖原身份。
  5. 旧 attempt 的规则快照、状态、错误和时间可查询/复核;当前任务旧错误和结果只在全部校验成功后的事务内清理。
  6. 重放相同 reset 请求不会二次递增 attempt 或产生重复归档。
  7. 规则删除/停用、无默认规则、设备忙、活动任务冲突等场景明确失败且不改变原任务。
  8. 既有设备单任务串行、租约、冷却、离线失败与安全边界无回归。
  9. 不创建新的采集任务记录;Admin 与 Agent 均继续看到原任务的最新状态。

验证计划

  • 服务端:迁移的全新安装、历史升级和回滚边界;reset 事务、attempt 唯一性和幂等测试。
  • 服务端:Admin/当前页两种来源、已识别/未识别、最新规则、规则不可用、设备/商品冲突测试。
  • Android:列表与详情按钮策略、当前页就绪检查、确认/失败/重复点击、前台服务启动测试。
  • 契约/集成:同一 task ID 跨 attempt 的 identify、claim、complete/fail;不同商品冲突。
  • 真机:使用失败测试任务验证“同一 ID 重采”,不执行采购或付款;任务 99 是否作为验证样本由实施时环境状态决定。

风险与门禁

  • 本工单涉及数据库迁移、任务状态机、并发与幂等,属于高风险修改。
  • 在用户明确授权本工单按上述方案执行数据库迁移前,仅创建工单,不修改生产代码、不执行迁移。
  • 实施前补充既有按钮/确认框的标注截图并记录设计确认;若主要流程或异常交互发生变化,重新确认设计证据。

文档影响

有长期事实变化,待实施时更新:

  • Business-Rules-and-Glossary:所有失败任务允许复用原任务重采、attempt 审计、最新规则与当前页身份规则。
  • Agent-API-Contract:reset、attemptNumber、幂等和当前页来源契约。
  • 如数据结构章节已在线维护,再同步更新对应架构/数据模型页面。

实施完成后按 Wiki-first 规则在线更新并回读 revision,再执行一次 harness.py sync 与一次 sync --check。

## 需求来源 - 提出时间:2026-08-29 - 用户确认:Admin 和 Agent 都由采购员使用;所有失败采集任务,无论由 Admin 创建还是 Agent 当前页创建,都应允许在规则或代码更新后重新采集。 - 关键约束:重新采集复用原 `collection_task.id`,不创建新采集任务;旧次执行信息必须可追溯。 - 现场样本:采集任务 99,`source=agent_current_page`、`status=failed`,在商品身份识别前因 `PDD_COPY_LINK_UNAVAILABLE` 失败,目前客户端详情未提供“重新采集”。 ## 当前事实与根因 1. 服务端重置逻辑明确拒绝 `agent_current_page`,并要求任务已有 PDD 商品。 2. Android 列表与详情的重置策略也排除了 `agent_current_page`。 3. 现有重置会清空失败结果并继续使用旧 `rule_snapshot`,无法满足“更新规则/代码后按最新规则重采且保留旧次审计”。 4. Android 前台执行器已经具备当前页来源任务的恢复 PDD、重新复制链接、识别商品和采集流程,可复用原任务进入下一次执行。 5. Gitea MCP 在当前会话不可用,本工单按仓库规则回退 Gitea API 创建。 ## 目标 - 所有 `failed` 采集任务均可在 Agent 列表和详情发起“重新采集”。 - 复用原任务 ID,把每次执行视为同一任务的不同 attempt。 - 新 attempt 使用当前有效规则及最新版 Agent 代码;旧 attempt 的规则、错误和时间信息可追溯。 - 保持设备串行、任务租约、幂等、商品冲突和当前页身份安全边界。 ## 非目标 - 不把“重新采集”实现为新建采集任务。 - 不自动替换失效/售罄商品;商品替换仍由 #129 → #131 → #130 → #132 的流程负责。 - 不保存原始控件树、设备截图或个人数据。 - 不放宽验证码、风控、登录失效、OCR/VLM 等既有安全规则。 ## 依赖与关系 - 与 #129~#132 的商品替换能力互补但不互相替代:本工单处理原商品的失败重采;替换工单处理已识别商品失效/售罄后的人工换品。 - 当前页任务第一次失败在身份识别前时允许首次绑定商品;已有商品身份时,重新识别必须仍为同一商品,否则按商品冲突失败。 ## 实施方案 ### 1. 数据模型与执行审计(需数据库迁移授权) - `collection_task` 增加 `attempt_number`,历史任务默认/回填为 1。 - 新增 `collection_task_attempt`(最终命名以项目迁移规范为准),按 `task_id + attempt_number` 唯一保存已结束 attempt 的最小审计信息: - 任务 ID、attempt 序号、来源、设备; - 当次 `rule_id`、规则快照(或等价可复核快照); - 最终状态、错误码、脱敏错误信息; - 开始、结束、归档时间; - 必要的结构化结果摘要,不保存原始控件树和截图。 - 重置事务中先归档当前失败 attempt,再清理当前任务的旧错误/结果/租约数据,递增 attempt,并重新置为 `pending`。 - 同一幂等请求重复到达不得重复归档、重复递增或重复清理。 - 所有前置检查在持久化变更前完成;事务失败不得留下半归档或半重置状态。 ### 2. 最新规则快照 - Admin 来源:按任务原 `rule_id` 读取当前有效规则内容并生成新快照;规则已删除或停用时明确拒绝,不退回旧快照。 - Agent 当前页来源:读取当前有效的 Agent 手动采集默认规则,更新任务 `rule_id` 与 `rule_snapshot`;没有可用默认规则时明确拒绝。 - 每次实际动作继续与 `taskId`、`deviceId`、当次 `ruleSnapshot`、`attemptNumber` 关联。 ### 3. 服务端重置 - 放开 `agent_current_page` 的失败任务重置限制,不再要求其在重置前必须已有 PDD 商品。 - 继续校验任务必须为 `failed`、设备归属/在线/空闲、同设备串行、采集/采购冲突、同商品活动任务冲突和任务租约。 - 重置成功返回同一 task ID 及新的 attempt 序号;不会新建 `collection_task`。 - 已有商品身份的当前页任务沿用现有 identify 冲突保护;未识别任务(如任务 99)允许下一次执行首次绑定。 ### 4. Android Agent - 失败任务列表和详情对 Admin、Agent 当前页两种来源统一显示既有“重新采集”入口。 - 当前页来源点击前复用当前页采集的就绪检查:要求 PDD 可恢复且采购员已准备目标商品页;不满足时不提交重置。 - 确认文案明确:复用原任务、使用最新规则、旧次失败保留在执行记录。 - 重置成功后启动既有前台调度,展示同一任务及新 attempt;保留本地冷却、互斥和重复点击防护。 - 不新增独立页面,复用既有按钮、确认框和状态反馈;以现有界面标注截图作为设计证据,实施前补入工单。 ### 5. API 与契约 - 继续使用既有采集任务 reset 接口,保持同一任务语义;响应补充/返回 `attemptNumber`(若现有 DTO 已覆盖则复用)。 - 同步更新共享 Agent API 契约:删除“当前页来源不可重置”的旧约束,补充 attempt、最新规则与身份绑定规则。 ## 验收标准 1. Admin 创建的失败采集任务点击重新采集后,任务 ID 不变、attempt +1,并使用原规则 ID 的最新有效内容。 2. Agent 当前页创建的失败采集任务在列表和详情均可重新采集,任务 ID 不变,并使用当前手动采集默认规则。 3. 类似任务 99 的“身份识别前失败”任务可在下一 attempt 首次绑定商品并继续采集。 4. 已绑定商品的当前页任务:相同商品可继续,不同商品被明确拒绝,不能覆盖原身份。 5. 旧 attempt 的规则快照、状态、错误和时间可查询/复核;当前任务旧错误和结果只在全部校验成功后的事务内清理。 6. 重放相同 reset 请求不会二次递增 attempt 或产生重复归档。 7. 规则删除/停用、无默认规则、设备忙、活动任务冲突等场景明确失败且不改变原任务。 8. 既有设备单任务串行、租约、冷却、离线失败与安全边界无回归。 9. 不创建新的采集任务记录;Admin 与 Agent 均继续看到原任务的最新状态。 ## 验证计划 - 服务端:迁移的全新安装、历史升级和回滚边界;reset 事务、attempt 唯一性和幂等测试。 - 服务端:Admin/当前页两种来源、已识别/未识别、最新规则、规则不可用、设备/商品冲突测试。 - Android:列表与详情按钮策略、当前页就绪检查、确认/失败/重复点击、前台服务启动测试。 - 契约/集成:同一 task ID 跨 attempt 的 identify、claim、complete/fail;不同商品冲突。 - 真机:使用失败测试任务验证“同一 ID 重采”,不执行采购或付款;任务 99 是否作为验证样本由实施时环境状态决定。 ## 风险与门禁 - 本工单涉及数据库迁移、任务状态机、并发与幂等,属于高风险修改。 - 在用户明确授权本工单按上述方案执行数据库迁移前,仅创建工单,不修改生产代码、不执行迁移。 - 实施前补充既有按钮/确认框的标注截图并记录设计确认;若主要流程或异常交互发生变化,重新确认设计证据。 ## 文档影响 有长期事实变化,待实施时更新: - `Business-Rules-and-Glossary`:所有失败任务允许复用原任务重采、attempt 审计、最新规则与当前页身份规则。 - `Agent-API-Contract`:reset、attemptNumber、幂等和当前页来源契约。 - 如数据结构章节已在线维护,再同步更新对应架构/数据模型页面。 实施完成后按 Wiki-first 规则在线更新并回读 revision,再执行一次 `harness.py sync` 与一次 `sync --check`。
Author
Owner

已收到用户于 2026-08-29 的明确授权:授权 #155 按工单方案实施数据库迁移。

设计证据采用既有界面复用:

  • Android 复用采集记录列表/详情现有“重新采集”按钮、Material 确认框、加载态、成功/失败反馈和当前页采集就绪检查;不新增页面、导航或权限边界。
  • Admin 复用采集任务列表“重置”入口与详情抽屉,只把文案改为“复用原任务、最新规则、历史 attempt 归档”,并在详情内使用既有 Element Plus 表格展示历史执行记录。
  • 正常、失败、禁用边界沿用现有状态设计:仅终态可操作,服务端仍作为最终资格事实;当前页来源额外要求最近 PDD 前台证据和无障碍就绪。

因此本工单属于既有组件的小范围行为/文案扩展,不建立新的完整原型。Gitea MCP 当前已恢复可用,后续评论与 Wiki 操作切回 MCP。

已收到用户于 2026-08-29 的明确授权:`授权 #155 按工单方案实施数据库迁移`。 设计证据采用既有界面复用: - Android 复用采集记录列表/详情现有“重新采集”按钮、Material 确认框、加载态、成功/失败反馈和当前页采集就绪检查;不新增页面、导航或权限边界。 - Admin 复用采集任务列表“重置”入口与详情抽屉,只把文案改为“复用原任务、最新规则、历史 attempt 归档”,并在详情内使用既有 Element Plus 表格展示历史执行记录。 - 正常、失败、禁用边界沿用现有状态设计:仅终态可操作,服务端仍作为最终资格事实;当前页来源额外要求最近 PDD 前台证据和无障碍就绪。 因此本工单属于既有组件的小范围行为/文案扩展,不建立新的完整原型。Gitea MCP 当前已恢复可用,后续评论与 Wiki 操作切回 MCP。
Author
Owner

实施完成,等待验收

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

实现结果

  • 所有失败采集任务均复用原任务 ID 重新采集,不再创建新任务。
  • 每次重置递增 attemptNumber,事务归档旧执行的规则快照、状态、错误和结果摘要。
  • 重置时使用最新有效规则;Admin 来源规则已删除时拒绝重置且不破坏旧结果。
  • Agent 当前商品页失败任务允许再次绑定商品:已有商品身份时仍要求 goods_id 一致;未识别任务可在下次执行时绑定。
  • Admin 与 Agent 均展示当前执行次数及历史执行摘要;Agent 不返回历史规则快照。
  • 保留设备在线、空闲、租约、采集/采购冲突及商品冲突校验。

数据库

本机数据库迁移已执行成功:

  • 版本:1787983500000
  • 新增采集任务执行次数及 collection_task_attempt 执行审计表
  • 结果:新执行 1 个,已应用迁移跳过 31 个

验证

  • go test ./...:通过
  • Android testDebugUnitTest assembleDebug:通过
  • Admin 定向 ESLint:通过
  • Admin build:prod:通过(仅既有 CSS/分包警告)
  • python dev_scripts/harness.py check --strict:通过
  • git diff --check:通过
  • 全量 verify.ps1 -Component all 的服务端阶段通过;Web 全量 lint 被与本工单无关的既有文件 web/src/views/goauto/purchase-tasks/index.vue 24 个 tab/space 错误阻断,本工单文件的定向 lint 已通过。

Wiki

已更新、在线回读并同步本地镜像:

  • Business-Rules-and-Glossary:d8444503e7d5828d05fc7cdce5c6f503bb08adbc
  • Android-Agent-API-Contract:ec45e8baa2f55221bee3f9d6951379178020de17
  • Architecture-and-Code-Map:fdc3e2871913ea7c64fa9729296ce41273866c2b

交付

  • 提交:cc326eb feat(#155): reuse failed collection tasks by attempt
  • 已推送:origin/main
  • 真机已安装 Agent 0.9.27 (40)

尚未验证

当前授权仅包含数据库迁移,未执行 Admin/API 重启或发布。因此尚未用任务 #99 完成“同任务 ID 重置并再次采集”的真机端到端验证,避免新 Agent 与旧服务端混合验证。工单保持待验收。

## 实施完成,等待验收 已按确认方案完成 #155,并推送到 `main`。 ### 实现结果 - 所有失败采集任务均复用原任务 ID 重新采集,不再创建新任务。 - 每次重置递增 `attemptNumber`,事务归档旧执行的规则快照、状态、错误和结果摘要。 - 重置时使用最新有效规则;Admin 来源规则已删除时拒绝重置且不破坏旧结果。 - Agent 当前商品页失败任务允许再次绑定商品:已有商品身份时仍要求 goods_id 一致;未识别任务可在下次执行时绑定。 - Admin 与 Agent 均展示当前执行次数及历史执行摘要;Agent 不返回历史规则快照。 - 保留设备在线、空闲、租约、采集/采购冲突及商品冲突校验。 ### 数据库 本机数据库迁移已执行成功: - 版本:`1787983500000` - 新增采集任务执行次数及 `collection_task_attempt` 执行审计表 - 结果:新执行 1 个,已应用迁移跳过 31 个 ### 验证 - `go test ./...`:通过 - Android `testDebugUnitTest assembleDebug`:通过 - Admin 定向 ESLint:通过 - Admin `build:prod`:通过(仅既有 CSS/分包警告) - `python dev_scripts/harness.py check --strict`:通过 - `git diff --check`:通过 - 全量 `verify.ps1 -Component all` 的服务端阶段通过;Web 全量 lint 被与本工单无关的既有文件 `web/src/views/goauto/purchase-tasks/index.vue` 24 个 tab/space 错误阻断,本工单文件的定向 lint 已通过。 ### Wiki 已更新、在线回读并同步本地镜像: - Business-Rules-and-Glossary:`d8444503e7d5828d05fc7cdce5c6f503bb08adbc` - Android-Agent-API-Contract:`ec45e8baa2f55221bee3f9d6951379178020de17` - Architecture-and-Code-Map:`fdc3e2871913ea7c64fa9729296ce41273866c2b` ### 交付 - 提交:`cc326eb feat(#155): reuse failed collection tasks by attempt` - 已推送:`origin/main` - 真机已安装 Agent `0.9.27 (40)` ### 尚未验证 当前授权仅包含数据库迁移,未执行 Admin/API 重启或发布。因此尚未用任务 #99 完成“同任务 ID 重置并再次采集”的真机端到端验证,避免新 Agent 与旧服务端混合验证。工单保持待验收。
Author
Owner

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

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