feat(android): 采集详情和采购详情新增「在拼多多中打开」按钮,设备忙时禁用 #375

Open
opened 2026-10-09 14:55:44 +08:00 by ila · 0 comments
Owner

基本信息

  • 类型:新功能(Android Agent:采集详情页和采购详情页新增「在拼多多中打开」按钮,方便失败后人工查看商品)。
  • 状态:待实施;依赖 #373 合并。本次只建单。
  • 来源:2026-10-09 用户提出:「现在agent采集采购失败后,为了更好debug,需要在agent的采集或采购任务里增加个按钮,点击后使用浏览器打开pdd商品链接跳转到pdd app商品页」。之后按问答逐项确认(见下表),并确认「现在建」。
  • 关联:#373(复用其他任务商品页;本单是 #373 方案 1 中「会操作 PDD 的入口」之一)、#232(采购直达打开)、#226。

用户确认的需求(2026-10-09 问答)

项目 结论 用户原话
用途 在 PDD App 看一眼商品,不用于复现 Agent 执行过程 「为了在pdd app上看一眼这个商品」
打开方式 采集、采购各自复用已有方式 「agent 采集tab和采购tab里复用各自已有的方式实现在pdd app打开指定的商品页」
依赖 等 #373 合并后再实施 「可以等#373修改再来」
忙时 执行采集或采购任务时不能点 「在执行采集或采购任务时,不允许点击」
位置 采集详情页、采购详情页里合适的位置 「放在采集详情页和采购详情页里合适的位置」
链接来源 A:Agent 用商品编号拼链接 「A」
忙的范围 按 Claude Code 建议(见方案) 「同意」
查看时来了新任务 A:不拦,轻提示 「A」
失败提示 B:完全失败提示;采购改走浏览器时也提示异常类型 「B」

已核验事实(origin/main e26743c817275137f7dc8a3659461d552371b9e3)

  • 采集打开商品走浏览器:AgentForegroundService.kt:1196、:1211 调用 PddLinkLauncher(this).open(url)。浏览器打开后,Agent 在自动化流程中会代点「打开拼多多APP」;本单的人工入口不代点,由用户自己点。
  • 采购打开商品先直达:AgentForegroundService.kt:786 调用 PddLinkLauncher(this).open(it, preferDirect = true);直达抛异常才退回浏览器(PddLaunchFallback.kt:5-6,#232)。
  • 历史详情 DTO 只有商品编号、没有链接:CollectionHistoryItem.goodsId、PurchaseHistoryItem.pddGoodsId(AgentApiClient.kt)。
  • 线上只读查询(2026-10-09):purchase_task.pdd_url_snapshot 2152 条、collection_task.url_snapshot 2160 条,全部是 https://mobile.yangkeduo.com/goods.html?goods_id=<编号>,没有附加参数;另有 489 条采集任务链接为空(图搜)。所以用商品编号拼出的链接与服务端保存的一致。
  • 详情页渲染:TaskHistoryFragment.renderCollectionDetail(:708,标题行 :721 显示 goodsId)、renderPurchaseDetail(:893,「PDD 商品:…」在 :898;同页已有实心按钮「重试采购」)。
  • 设备空闲判断:AgentForegroundService.repurchaseLocalIdle()(!working && 无互斥任务 && 无进行中采购 && 无未上传结果 && 当前任务为空 && 未在回填),目前是服务内私有函数;重购状态通过 repurchaseState 和广播发布给界面。

目标

在采集详情页和采购详情页提供「在拼多多中打开」按钮,让用户在 PDD App 中查看该任务的商品,不影响正在进行的自动化工作。

非目标

  • 不改服务端、API、数据库、Web 和 Agent API 契约。
  • 不在列表行上放按钮。
  • 不代点浏览器中的「打开拼多多APP」,不在 PDD 内点击任何控件。
  • 不暂停领取任务,不改调度、心跳和租约。
  • 不上传打开结果、不写日志或诊断记录。
  • 不用于复现后台执行的打开过程(后台打开路径记录在 #373 方案 3)。

方案

  1. 链接:Agent 用详情里的商品编号拼成 https://mobile.yangkeduo.com/goods.html?goods_id=<编号>。编号为空或不是纯数字时不显示按钮。所有任务状态都显示。
  2. 打开方式(复用现有代码,不新增打开逻辑):
    • 采集详情:PddLinkLauncher.open(url)(浏览器)。
    • 采购详情:PddLinkLauncher.open(url, preferDirect = true)(先直达,失败退回浏览器)。为了能提示打开方式,需要让 PddLinkLauncher/PddLaunchFallback 返回走了哪条路以及直达失败的异常类名;实现时与 #373 方案 3 共用同一个返回结构,不各写一套。
  3. 忙时置灰:以下情况按钮置灰,按钮下方显示原因:正在执行采集或采购任务、重购一轮进行中(包括两个任务之间)、订单回填中、当前页采集或图搜进行中、有未上传的采购结果或待恢复的采购。判断标准与 repurchaseLocalIdle 一致:由服务发布一个只读的「设备忙」状态和原因,界面监听,不在界面另写一套判断。任务结束后的冷却期不置灰。状态变化时按钮实时更新;点击时再判断一次,忙则不打开并提示原因。
  4. #373 联动:点按钮打开链接属于「会操作 PDD 的入口」,必须调用 #373 的统一作废入口,使交接凭证作废。
  5. 提示(toast):
    • 点击后:「打开期间如有新任务,Agent 会接管屏幕」。
    • 采购按钮直达失败、改用浏览器:「拼多多直接打开失败,已改用浏览器(<异常类名>)」。
    • 都失败:「无法打开拼多多链接」。
    • 提示中不含链接,也不含异常消息原文。

设计证据(低保真,2026-10-09)

采购详情                                   采集详情
┌──────────────────────────────┐          ┌──────────────────────────────┐
│ CG-2131                      │          │ #233 · 第 2 次 · 825093359197 │
│ 失败                         │          │ [在拼多多中打开]  ← 新增,描边 │
│ 蝦皮订单号:…                │          │ …其余内容不变…               │
│ PDD 商品:825093359197       │          └──────────────────────────────┘
│ [在拼多多中打开]  ← 新增,描边│
│ 商品标题:… / 规格 / 数量 …  │
└──────────────────────────────┘
[重试采购](现有,实心,位置不变)
  • 样式:描边按钮(materialButtonOutlinedStyle),最小高度 48dp,与实心的「重试采购」「重新采集」区分,降低误点。contentDescription:「在拼多多中打开商品 <编号>」。
  • 状态:
    • 正常:可点。
    • 忙:置灰,下方小字显示原因,例如「设备正在执行任务」「重购进行中」「订单回填中」。
    • 无编号:不显示。
    • 打开失败:toast 提示,按钮恢复可点。
  • 不新增权限;能看到详情的人都能用。

子项目影响、依赖与并行

  • Android:TaskHistoryFragment.kt、AgentForegroundService.kt(发布只读的忙状态)、PddNavigation.kt/PddLaunchFallback.kt(返回打开方式,与 #373 共用),以及对应测试。
  • Server/Web:无。数据库、API:无。
  • 依赖 #373 合并(作废入口和打开方式返回结构);不可与 #373 并行。

验收标准

  • 单元测试:拼出的链接格式正确;编号为空或非纯数字时不显示按钮。
  • 单元测试:采集按钮只走浏览器;采购按钮先直达,直达抛异常时改走浏览器并给出异常类名;两者都失败时提示「无法打开拼多多链接」。
  • 单元测试:各种忙的情况(执行任务、重购一轮进行中含两个任务之间、回填、当前页采集或图搜、未上传或待恢复的采购)→ 置灰并显示对应原因;冷却期 → 可点;忙状态变化时按钮更新;点击时如已变忙 → 不打开。
  • 单元测试:点按钮打开后,#373 的交接凭证作废,下一次 purchase 必须重新打开本任务链接。
  • 人工入口不代点浏览器中的「打开拼多多APP」,不在 PDD 内点击任何控件。
  • Android 构建与相关测试通过,如实记录。
  • 真机验证(只打开商品,不执行任务、不下单):采集详情和采购详情各点一次,确认进入对应商品页;记录采购按钮在前台是直达还是改走浏览器。装机需用户另行确认。

风险与回退

  • 用户查看期间,Agent 领到新任务会接管屏幕;已用提示告知,任务本身依赖 #373 重新打开自己的链接,不会在用户打开的商品上操作。
  • 忙判断如果漏掉某种情况,可能在执行中被打断;所以复用 repurchaseLocalIdle 的统一判断,并在点击时再判断一次。
  • 回退:移除按钮和忙状态发布;无数据迁移。

文档影响

  • 更新 Wiki Business-Rules-and-Glossary:Agent 详情页的人工查看商品入口、忙时禁用的范围、不代点和不暂停调度的限制。
  • 先改线上 Wiki 并回读 revision,再执行一次 sync 与 sync --check。

备注

本单由 Claude Code 依据与用户的逐项问答、代码阅读和线上只读查询起草;不含账号、地址、Cookie 或 Token。

## 基本信息 - 类型:新功能(Android Agent:采集详情页和采购详情页新增「在拼多多中打开」按钮,方便失败后人工查看商品)。 - 状态:**待实施;依赖 #373 合并**。本次只建单。 - 来源:2026-10-09 用户提出:「现在agent采集采购失败后,为了更好debug,需要在agent的采集或采购任务里增加个按钮,点击后使用浏览器打开pdd商品链接跳转到pdd app商品页」。之后按问答逐项确认(见下表),并确认「现在建」。 - 关联:#373(复用其他任务商品页;本单是 #373 方案 1 中「会操作 PDD 的入口」之一)、#232(采购直达打开)、#226。 ## 用户确认的需求(2026-10-09 问答) | 项目 | 结论 | 用户原话 | |---|---|---| | 用途 | 在 PDD App 看一眼商品,不用于复现 Agent 执行过程 | 「为了在pdd app上看一眼这个商品」 | | 打开方式 | 采集、采购各自复用已有方式 | 「agent 采集tab和采购tab里复用各自已有的方式实现在pdd app打开指定的商品页」 | | 依赖 | 等 #373 合并后再实施 | 「可以等#373修改再来」 | | 忙时 | 执行采集或采购任务时不能点 | 「在执行采集或采购任务时,不允许点击」 | | 位置 | 采集详情页、采购详情页里合适的位置 | 「放在采集详情页和采购详情页里合适的位置」 | | 链接来源 | A:Agent 用商品编号拼链接 | 「A」 | | 忙的范围 | 按 Claude Code 建议(见方案) | 「同意」 | | 查看时来了新任务 | A:不拦,轻提示 | 「A」 | | 失败提示 | B:完全失败提示;采购改走浏览器时也提示异常类型 | 「B」 | ## 已核验事实(`origin/main` `e26743c817275137f7dc8a3659461d552371b9e3`) - 采集打开商品走浏览器:`AgentForegroundService.kt:1196`、`:1211` 调用 `PddLinkLauncher(this).open(url)`。浏览器打开后,Agent 在自动化流程中会代点「打开拼多多APP」;本单的人工入口**不代点**,由用户自己点。 - 采购打开商品先直达:`AgentForegroundService.kt:786` 调用 `PddLinkLauncher(this).open(it, preferDirect = true)`;直达抛异常才退回浏览器(`PddLaunchFallback.kt:5-6`,#232)。 - 历史详情 DTO 只有商品编号、没有链接:`CollectionHistoryItem.goodsId`、`PurchaseHistoryItem.pddGoodsId`(`AgentApiClient.kt`)。 - 线上只读查询(2026-10-09):`purchase_task.pdd_url_snapshot` 2152 条、`collection_task.url_snapshot` 2160 条,全部是 `https://mobile.yangkeduo.com/goods.html?goods_id=<编号>`,没有附加参数;另有 489 条采集任务链接为空(图搜)。所以用商品编号拼出的链接与服务端保存的一致。 - 详情页渲染:`TaskHistoryFragment.renderCollectionDetail`(:708,标题行 :721 显示 goodsId)、`renderPurchaseDetail`(:893,「PDD 商品:…」在 :898;同页已有实心按钮「重试采购」)。 - 设备空闲判断:`AgentForegroundService.repurchaseLocalIdle()`(`!working && 无互斥任务 && 无进行中采购 && 无未上传结果 && 当前任务为空 && 未在回填`),目前是服务内私有函数;重购状态通过 `repurchaseState` 和广播发布给界面。 ## 目标 在采集详情页和采购详情页提供「在拼多多中打开」按钮,让用户在 PDD App 中查看该任务的商品,不影响正在进行的自动化工作。 ## 非目标 - 不改服务端、API、数据库、Web 和 Agent API 契约。 - 不在列表行上放按钮。 - 不代点浏览器中的「打开拼多多APP」,不在 PDD 内点击任何控件。 - 不暂停领取任务,不改调度、心跳和租约。 - 不上传打开结果、不写日志或诊断记录。 - 不用于复现后台执行的打开过程(后台打开路径记录在 #373 方案 3)。 ## 方案 1. **链接**:Agent 用详情里的商品编号拼成 `https://mobile.yangkeduo.com/goods.html?goods_id=<编号>`。编号为空或不是纯数字时不显示按钮。所有任务状态都显示。 2. **打开方式**(复用现有代码,不新增打开逻辑): - 采集详情:`PddLinkLauncher.open(url)`(浏览器)。 - 采购详情:`PddLinkLauncher.open(url, preferDirect = true)`(先直达,失败退回浏览器)。为了能提示打开方式,需要让 `PddLinkLauncher`/`PddLaunchFallback` 返回走了哪条路以及直达失败的异常类名;实现时与 #373 方案 3 共用同一个返回结构,不各写一套。 3. **忙时置灰**:以下情况按钮置灰,按钮下方显示原因:正在执行采集或采购任务、重购一轮进行中(包括两个任务之间)、订单回填中、当前页采集或图搜进行中、有未上传的采购结果或待恢复的采购。判断标准与 `repurchaseLocalIdle` 一致:由服务发布一个只读的「设备忙」状态和原因,界面监听,不在界面另写一套判断。任务结束后的冷却期不置灰。状态变化时按钮实时更新;点击时再判断一次,忙则不打开并提示原因。 4. **#373 联动**:点按钮打开链接属于「会操作 PDD 的入口」,必须调用 #373 的统一作废入口,使交接凭证作废。 5. **提示**(toast): - 点击后:「打开期间如有新任务,Agent 会接管屏幕」。 - 采购按钮直达失败、改用浏览器:「拼多多直接打开失败,已改用浏览器(<异常类名>)」。 - 都失败:「无法打开拼多多链接」。 - 提示中不含链接,也不含异常消息原文。 ## 设计证据(低保真,2026-10-09) ``` 采购详情 采集详情 ┌──────────────────────────────┐ ┌──────────────────────────────┐ │ CG-2131 │ │ #233 · 第 2 次 · 825093359197 │ │ 失败 │ │ [在拼多多中打开] ← 新增,描边 │ │ 蝦皮订单号:… │ │ …其余内容不变… │ │ PDD 商品:825093359197 │ └──────────────────────────────┘ │ [在拼多多中打开] ← 新增,描边│ │ 商品标题:… / 规格 / 数量 … │ └──────────────────────────────┘ [重试采购](现有,实心,位置不变) ``` - 样式:描边按钮(`materialButtonOutlinedStyle`),最小高度 48dp,与实心的「重试采购」「重新采集」区分,降低误点。`contentDescription`:「在拼多多中打开商品 <编号>」。 - 状态: - 正常:可点。 - 忙:置灰,下方小字显示原因,例如「设备正在执行任务」「重购进行中」「订单回填中」。 - 无编号:不显示。 - 打开失败:toast 提示,按钮恢复可点。 - 不新增权限;能看到详情的人都能用。 ## 子项目影响、依赖与并行 - Android:`TaskHistoryFragment.kt`、`AgentForegroundService.kt`(发布只读的忙状态)、`PddNavigation.kt`/`PddLaunchFallback.kt`(返回打开方式,与 #373 共用),以及对应测试。 - Server/Web:无。数据库、API:无。 - **依赖 #373 合并**(作废入口和打开方式返回结构);不可与 #373 并行。 ## 验收标准 - [ ] 单元测试:拼出的链接格式正确;编号为空或非纯数字时不显示按钮。 - [ ] 单元测试:采集按钮只走浏览器;采购按钮先直达,直达抛异常时改走浏览器并给出异常类名;两者都失败时提示「无法打开拼多多链接」。 - [ ] 单元测试:各种忙的情况(执行任务、重购一轮进行中含两个任务之间、回填、当前页采集或图搜、未上传或待恢复的采购)→ 置灰并显示对应原因;冷却期 → 可点;忙状态变化时按钮更新;点击时如已变忙 → 不打开。 - [ ] 单元测试:点按钮打开后,#373 的交接凭证作废,下一次 `purchase` 必须重新打开本任务链接。 - [ ] 人工入口不代点浏览器中的「打开拼多多APP」,不在 PDD 内点击任何控件。 - [ ] Android 构建与相关测试通过,如实记录。 - [ ] 真机验证(只打开商品,不执行任务、不下单):采集详情和采购详情各点一次,确认进入对应商品页;记录采购按钮在前台是直达还是改走浏览器。装机需用户另行确认。 ## 风险与回退 - 用户查看期间,Agent 领到新任务会接管屏幕;已用提示告知,任务本身依赖 #373 重新打开自己的链接,不会在用户打开的商品上操作。 - 忙判断如果漏掉某种情况,可能在执行中被打断;所以复用 `repurchaseLocalIdle` 的统一判断,并在点击时再判断一次。 - 回退:移除按钮和忙状态发布;无数据迁移。 ## 文档影响 - 更新 Wiki Business-Rules-and-Glossary:Agent 详情页的人工查看商品入口、忙时禁用的范围、不代点和不暂停调度的限制。 - 先改线上 Wiki 并回读 revision,再执行一次 sync 与 sync --check。 ## 备注 本单由 Claude Code 依据与用户的逐项问答、代码阅读和线上只读查询起草;不含账号、地址、Cookie 或 Token。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#375