Android Agent 受控重新采集 #91

Closed
opened 2026-08-25 15:00:53 +08:00 by ila · 5 comments
Owner

所属与门禁

  • 父 MVP:#86
  • 依赖:#87 原型审核、#90 当前设备历史接口与详情。
  • 涉及服务端状态、权限与 Android UI。

目标

允许设备操作人员从采集任务详情发起重新采集,但所有状态变化仍由服务端租约和任务状态机控制。

做什么

  • 新增 Device Token 专用的幂等重新采集接口,复用现有 CollectionTask Reset 事务。
  • 只允许当前设备关联的 completed、completed_partial、failed 任务。
  • 服务端重新检查设备空闲、商品没有其他 pending/running 任务及任务可重置。
  • 保留 URL、goods_id、设备和规则快照,清除原任务结果后恢复 pending,并继续分配给当前设备。
  • 完成/部分完成任务二次确认明确提示会清除现有任务结果;失败任务仍需确认。
  • 服务端确认成功后 Agent 立即触发正常 next/claim/start 流程,不能本地绕过。

不做什么

  • 不允许离线排队重新采集。
  • 不允许重新采购、取消订单、支付或跨设备重置。
  • 不创建 Agent 管理员旁路。

验收

  • 越权、运行中、活动任务冲突和设备忙明确拒绝。
  • 重复 requestId 不重复重置。
  • 用户取消确认时不改变服务端状态。
  • 成功后显示已加入队列并由正常调度执行。
  • Android/API/事务测试和三星真机重新采集通过。

文档影响

更新业务规则、Agent API 契约和采集重置操作说明。

## 所属与门禁 - 父 MVP:#86 - 依赖:#87 原型审核、#90 当前设备历史接口与详情。 - 涉及服务端状态、权限与 Android UI。 ## 目标 允许设备操作人员从采集任务详情发起重新采集,但所有状态变化仍由服务端租约和任务状态机控制。 ## 做什么 - 新增 Device Token 专用的幂等重新采集接口,复用现有 CollectionTask Reset 事务。 - 只允许当前设备关联的 completed、completed_partial、failed 任务。 - 服务端重新检查设备空闲、商品没有其他 pending/running 任务及任务可重置。 - 保留 URL、goods_id、设备和规则快照,清除原任务结果后恢复 pending,并继续分配给当前设备。 - 完成/部分完成任务二次确认明确提示会清除现有任务结果;失败任务仍需确认。 - 服务端确认成功后 Agent 立即触发正常 next/claim/start 流程,不能本地绕过。 ## 不做什么 - 不允许离线排队重新采集。 - 不允许重新采购、取消订单、支付或跨设备重置。 - 不创建 Agent 管理员旁路。 ## 验收 - [ ] 越权、运行中、活动任务冲突和设备忙明确拒绝。 - [ ] 重复 requestId 不重复重置。 - [ ] 用户取消确认时不改变服务端状态。 - [ ] 成功后显示已加入队列并由正常调度执行。 - [ ] Android/API/事务测试和三星真机重新采集通过。 ## 文档影响 更新业务规则、Agent API 契约和采集重置操作说明。
Author
Owner

开始实施(2026-08-26)

依赖核对:

  • #87 v3 原型已审核。
  • #90 已验收并关闭。
  • 工作区仅有无关未跟踪文件 gitea.zip,本单不处理。

实施范围:

  1. 复用现有 CollectionTask Reset 事务,新增 Device Token 专用的幂等重置接口。
  2. 强制当前设备归属、终态、设备空闲和同商品活动任务冲突校验。
  3. Agent 采集详情增加 48dp“重新采集”入口、清除结果确认、提交中/成功/失败反馈。
  4. 成功后只恢复为服务端 pending,并唤醒现有 Agent 轮询;不从 UI 本地执行任务状态跳转。
  5. 更新 API 契约、业务规则和操作说明。

安全边界:

  • 不支持离线排队、跨设备重置或重新采购。
  • 不触发采购、创建订单或支付。
  • 代码与自动化测试先完成;真机实际重置会在再次获得用户确认后执行。
## 开始实施(2026-08-26) 依赖核对: - #87 v3 原型已审核。 - #90 已验收并关闭。 - 工作区仅有无关未跟踪文件 `gitea.zip`,本单不处理。 实施范围: 1. 复用现有 CollectionTask Reset 事务,新增 Device Token 专用的幂等重置接口。 2. 强制当前设备归属、终态、设备空闲和同商品活动任务冲突校验。 3. Agent 采集详情增加 48dp“重新采集”入口、清除结果确认、提交中/成功/失败反馈。 4. 成功后只恢复为服务端 pending,并唤醒现有 Agent 轮询;不从 UI 本地执行任务状态跳转。 5. 更新 API 契约、业务规则和操作说明。 安全边界: - 不支持离线排队、跨设备重置或重新采购。 - 不触发采购、创建订单或支付。 - 代码与自动化测试先完成;真机实际重置会在再次获得用户确认后执行。
Author
Owner

实施完成,等待高风险真机确认

提交:7b6cc00(已推送 main)

实现

  • 新增 POST /api/agent/v1/collection-tasks/{taskId}/reset。
  • 设备端与管理端 Reset 使用显式模式区分;缺少 Token 不会退化为管理端重置。
  • 强制当前设备归属、在线状态、终态、同商品活动任务、其他采集任务和采购任务忙碌校验。
  • 同一 requestId 幂等;成功后复用原任务,保留 URL/goods_id/设备/规则快照,清除旧结果并恢复 pending。
  • Android 只在 completed、completed_partial、failed 详情显示“重新采集”。
  • 所有状态均二次确认;取消不发请求;提交显示加载;成功唤醒现有 Agent 轮询;失败可返回详情。
  • Agent 版本:0.5.0 / versionCode 7。

验证

  • .\scripts\verify.ps1 -Component server:全量测试和构建通过。
  • .\scripts\verify.ps1 -Component android:Debug/Release 单测和 Debug APK 构建通过。
  • 自动测试覆盖空 Token、跨设备、设备正执行采集、设备正执行采购、同商品活动任务、结果清理、设备与快照复用、幂等重放和非终态拒绝。
  • python dev_scripts/harness.py check --strict、sync --check、git diff --check:通过。
  • 新 API 无 Token 实测返回 401。
  • APK 已安装 Samsung SM-G9700;版本 0.5.0,采集 Tab 正常,无障碍和在线状态保留。
  • 未点击确认重新采集,未清除真实任务结果。

Wiki revisions

  • Android-Agent-API-Contract:7f48742d36b23e7d2c01d83f714812b810bfc34f
  • Business-Rules-and-Glossary:e83a27ca331f23a9219fbf4bde9020104192762a
  • Architecture-and-Code-Map:9a52b45dc154e741ee2abcd9e74b947fa3745a28

待确认真机目标

当前三星在线且空闲。最新可用失败采集任务为 #62,goods_id=979630970295;当前没有设备忙碌或同商品活动任务冲突。实际点击确认会清除 #62 的失败结果并立即由三星重新采集,需用户再次明确授权。

## 实施完成,等待高风险真机确认 提交:`7b6cc00`(已推送 `main`) ### 实现 - 新增 `POST /api/agent/v1/collection-tasks/{taskId}/reset`。 - 设备端与管理端 Reset 使用显式模式区分;缺少 Token 不会退化为管理端重置。 - 强制当前设备归属、在线状态、终态、同商品活动任务、其他采集任务和采购任务忙碌校验。 - 同一 requestId 幂等;成功后复用原任务,保留 URL/goods_id/设备/规则快照,清除旧结果并恢复 pending。 - Android 只在 completed、completed_partial、failed 详情显示“重新采集”。 - 所有状态均二次确认;取消不发请求;提交显示加载;成功唤醒现有 Agent 轮询;失败可返回详情。 - Agent 版本:`0.5.0` / versionCode `7`。 ### 验证 - `.\scripts\verify.ps1 -Component server`:全量测试和构建通过。 - `.\scripts\verify.ps1 -Component android`:Debug/Release 单测和 Debug APK 构建通过。 - 自动测试覆盖空 Token、跨设备、设备正执行采集、设备正执行采购、同商品活动任务、结果清理、设备与快照复用、幂等重放和非终态拒绝。 - `python dev_scripts/harness.py check --strict`、`sync --check`、`git diff --check`:通过。 - 新 API 无 Token 实测返回 401。 - APK 已安装 Samsung SM-G9700;版本 0.5.0,采集 Tab 正常,无障碍和在线状态保留。 - 未点击确认重新采集,未清除真实任务结果。 ### Wiki revisions - Android-Agent-API-Contract:`7f48742d36b23e7d2c01d83f714812b810bfc34f` - Business-Rules-and-Glossary:`e83a27ca331f23a9219fbf4bde9020104192762a` - Architecture-and-Code-Map:`9a52b45dc154e741ee2abcd9e74b947fa3745a28` ### 待确认真机目标 当前三星在线且空闲。最新可用失败采集任务为 `#62`,goods_id=`979630970295`;当前没有设备忙碌或同商品活动任务冲突。实际点击确认会清除 #62 的失败结果并立即由三星重新采集,需用户再次明确授权。
Author
Owner

三星真机重新采集验证(2026-08-26)

用户已明确授权三星重新采集任务 #62。执行前检查:任务属于设备 4(Samsung SM-G9700)、设备在线,且不存在采集占用、采购占用或同商品活动任务。

通过 Agent 的“采集记录 → 搜索 #62 → 任务详情 → 重新采集 → 确认重新采集”完成操作,界面返回“已加入重新采集队列”。服务端证据:

  • reset_request_id 已生成,证明 Device Token 重置接口成功;
  • 旧结构化结果已清空(dimension/color_price/sku 均为 0);
  • 任务由三星正常调度并产生新的 started_at/finished_at = 2026-08-26 10:31:07;
  • 新一轮执行立即失败为 ACCESSIBILITY_NOT_READY(GoAuto 无障碍采集服务未开启或尚未绑定)。

只读检查三星系统后确认:GoAuto 无障碍服务当前在可用服务列表中,但 enabled/bound 均为空。未通过 ADB 强行修改权限。未进入采购、创建订单或支付流程。

结论:#91 的受控重置、清理旧结果、归属校验与重新进入正常 Agent 调度链路已完成真机验证;要继续完成商品采集,需要用户先在三星设置中重新开启 GoAuto 无障碍服务,再对 #62 发起新一轮重新采集。

### 三星真机重新采集验证(2026-08-26) 用户已明确授权三星重新采集任务 `#62`。执行前检查:任务属于设备 `4`(Samsung SM-G9700)、设备在线,且不存在采集占用、采购占用或同商品活动任务。 通过 Agent 的“采集记录 → 搜索 #62 → 任务详情 → 重新采集 → 确认重新采集”完成操作,界面返回“已加入重新采集队列”。服务端证据: - `reset_request_id` 已生成,证明 Device Token 重置接口成功; - 旧结构化结果已清空(dimension/color_price/sku 均为 0); - 任务由三星正常调度并产生新的 `started_at/finished_at = 2026-08-26 10:31:07`; - 新一轮执行立即失败为 `ACCESSIBILITY_NOT_READY`(GoAuto 无障碍采集服务未开启或尚未绑定)。 只读检查三星系统后确认:GoAuto 无障碍服务当前在可用服务列表中,但 enabled/bound 均为空。未通过 ADB 强行修改权限。未进入采购、创建订单或支付流程。 结论:#91 的受控重置、清理旧结果、归属校验与重新进入正常 Agent 调度链路已完成真机验证;要继续完成商品采集,需要用户先在三星设置中重新开启 GoAuto 无障碍服务,再对 #62 发起新一轮重新采集。
Author
Owner

三星真机重采集补充验证(2026-08-26 10:54)

用户重新开启 GoAuto 无障碍服务后,只读确认服务处于 enabled + bound、crashed 为空;任务 #62、设备 4 均无采集或采购占用。

再次从 Agent 详情执行“重新采集”后:

  • 生成新的 reset_request_id = e81a6d67-3b43-4b0c-8976-e56c9b0ba852;
  • 三星正常跳转到 PDD 商品页并执行新一轮采集;
  • started_at = 2026-08-26 10:54:44,finished_at = 2026-08-26 10:54:54;
  • 最终状态为 failed,错误码 PDD_CAPTCHA_REQUIRED,提示“页面要求验证码或人机验证,请人工处理”;
  • 本轮不再出现 ACCESSIBILITY_NOT_READY,证明无障碍绑定和 #91 重新调度链路均正常。

任务结束后 ADB 设备连接断开,但服务端已收到完整的结构化失败结果。未涉及采购、创建订单或支付。#91 保持待用户验收。

### 三星真机重采集补充验证(2026-08-26 10:54) 用户重新开启 GoAuto 无障碍服务后,只读确认服务处于 enabled + bound、crashed 为空;任务 #62、设备 4 均无采集或采购占用。 再次从 Agent 详情执行“重新采集”后: - 生成新的 `reset_request_id = e81a6d67-3b43-4b0c-8976-e56c9b0ba852`; - 三星正常跳转到 PDD 商品页并执行新一轮采集; - `started_at = 2026-08-26 10:54:44`,`finished_at = 2026-08-26 10:54:54`; - 最终状态为 `failed`,错误码 `PDD_CAPTCHA_REQUIRED`,提示“页面要求验证码或人机验证,请人工处理”; - 本轮不再出现 `ACCESSIBILITY_NOT_READY`,证明无障碍绑定和 #91 重新调度链路均正常。 任务结束后 ADB 设备连接断开,但服务端已收到完整的结构化失败结果。未涉及采购、创建订单或支付。#91 保持待用户验收。
Author
Owner

用户于 2026-08-26 明确验收通过。三星真机已验证:当前设备可从采集详情确认重新采集,服务端清理旧结果并通过正常 next/claim/start 调度执行;权限、冲突、幂等和取消路径已有自动化测试。工单关闭。

用户于 2026-08-26 明确验收通过。三星真机已验证:当前设备可从采集详情确认重新采集,服务端清理旧结果并通过正常 next/claim/start 调度执行;权限、冲突、幂等和取消路径已有自动化测试。工单关闭。
ila closed this issue 2026-08-26 11:08:55 +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#91