feat(agent): 采购结束后显示可提前关闭的结果气泡 #218

Open
opened 2026-09-05 09:50:10 +08:00 by ila · 4 comments
Owner

原始需求摘要

来源:用户于 2026-09-05 确认采用建议方案。采购执行期间不显示悬浮步骤提示;采购结束后显示结果气泡。失败气泡展示“中止步骤 + 真实原因”,用户通过 Agent 系统无障碍悬浮图标切回 Agent 时提前关闭气泡。

目标

  • 正式采购或采购演练结束后,在 PDD 前台显示不接收触摸的短时结果气泡。
  • 成功气泡显示约 3 秒,简述已完成的真实结果。
  • 失败气泡显示约 8 秒,包含中止步骤和脱敏、限长的真实失败原因。
  • 用户点击 Agent 系统无障碍按钮返回 Agent,或 Agent 以其他方式回到前台时,立即关闭未到期气泡。
  • 结果仍保留在 Agent 状态、采购历史和既有结构化日志中。

非目标

  • 不显示执行中逐步骤浮层。
  • 不改变采购动作、规格决策、订单创建门禁、状态机或服务端 API。
  • 不增加支付动作或可点击支付目标。
  • 不保存控件树、截图或敏感数据。
  • 不在本工单发布、安装 APK 或执行真机采购。

当前事实与范围

  • 当前 Android 在采购结束后只更新本地状态和前台通知,未发现 PDD 页面上的结果气泡实现。
  • GoAutoAccessibilityService 已处理系统无障碍按钮并通过 openAgentPreservingTab() 返回 Agent。
  • 交付单元仅限 android/,不修改服务端、Web 或共享 API。
  • 前置依赖:无阻塞依赖;以当前分支已完成的采购执行基线为实现基础。
  • 可并行性:不与采购执行状态机修改并行,以免同一结果收敛路径冲突。

方案

  1. 在无障碍服务中提供基于 TYPE_ACCESSIBILITY_OVERLAY 的采购结果气泡控制器,不申请普通应用悬浮窗权限;窗口使用不可聚焦、不可触摸标志。
  2. 气泡只接受结构化状态、任务编号、中止步骤和既有执行结果;统一脱敏、去换行和限长。
  3. 采购结果安全写入本地 Outbox 后显示;成功 3 秒,失败 8 秒。
  4. 无障碍按钮回 Agent 前主动关闭;检测 Agent 回到前台时再次幂等关闭。
  5. 新任务开始、无障碍服务销毁或新结果替换旧结果时清理旧气泡。
  6. 以纯 Kotlin 策略类覆盖文案、时长、限长和步骤映射;Android 视图层保持最小。

设计证据

  • 类型:现有 PDD 页面上的小范围新组件,采用会话内交互原型与文字确认,不新增页面或导航。
  • 原型:goauto-purchase-step-overlay.html(会话内临时原型,未导出到仓库)。
  • 确认人:用户。
  • 确认日期:2026-09-05。
  • 最终确认覆盖:执行中无浮层;成功/失败后才显示;失败展示真实原因;点击 Agent 无障碍悬浮图标返回时提前关闭。
  • 状态边界:正常运行时无组件;成功 3 秒自动关闭;失败 8 秒自动关闭;返回 Agent/服务销毁/新任务开始立即关闭;无障碍服务不可用时不影响结果提交,仅无气泡。

验收标准

  • 执行中不显示结果气泡。
  • 成功结果显示约 3 秒,文字与真实结果一致。
  • 失败结果显示约 8 秒,并包含最后执行步骤和真实失败原因。
  • 气泡不拦截 PDD 页面点击,不获得输入焦点。
  • 点击 Agent 系统无障碍按钮返回时立即关闭气泡;Agent 回到前台时也不会残留。
  • 连续任务或连续结果不会叠加多个气泡。
  • 气泡文字去换行、限长,且不新增 Token、地址、订单详情等敏感日志。
  • Android 受影响单元测试与 APK 构建通过。

验证计划

  • 策略单元测试:成功/失败时长、步骤映射、文案限长与换行清理、空原因回退。
  • 控制器单元测试:替换旧气泡、超时关闭、返回 Agent 关闭(通过可测试状态策略覆盖)。
  • Android:gradlew.bat testDebugUnitTest 与 gradlew.bat assembleDebug。
  • 未验证项:本工单不执行真机采购、订单创建或支付;气泡的真机位置和系统无障碍按钮联动留待用户安装后验收。

风险与安全

  • 气泡使用无障碍 Overlay,必须不可触摸、不可聚焦,避免影响 PDD 自动化。
  • 失败原因只消费既有 Agent 执行结果并限长;不得额外采集页面文字、控件树或截图。
  • 本工单不新增或扩大订单创建、地址修改、支付权限。
  • Gitea MCP 当前未提供可调用工具,按仓库规则回退 Gitea API;凭据仅从已忽略的 gitea.env 读取。

文档影响

无长期文档影响:只增加既有采购结果的短时本机展示方式,不改变 API、数据结构、采购状态、业务规则、安全边界、启动/部署或排错命令,因此跳过 Wiki 更新与镜像同步。

## 原始需求摘要 来源:用户于 2026-09-05 确认采用建议方案。采购执行期间不显示悬浮步骤提示;采购结束后显示结果气泡。失败气泡展示“中止步骤 + 真实原因”,用户通过 Agent 系统无障碍悬浮图标切回 Agent 时提前关闭气泡。 ## 目标 - 正式采购或采购演练结束后,在 PDD 前台显示不接收触摸的短时结果气泡。 - 成功气泡显示约 3 秒,简述已完成的真实结果。 - 失败气泡显示约 8 秒,包含中止步骤和脱敏、限长的真实失败原因。 - 用户点击 Agent 系统无障碍按钮返回 Agent,或 Agent 以其他方式回到前台时,立即关闭未到期气泡。 - 结果仍保留在 Agent 状态、采购历史和既有结构化日志中。 ## 非目标 - 不显示执行中逐步骤浮层。 - 不改变采购动作、规格决策、订单创建门禁、状态机或服务端 API。 - 不增加支付动作或可点击支付目标。 - 不保存控件树、截图或敏感数据。 - 不在本工单发布、安装 APK 或执行真机采购。 ## 当前事实与范围 - 当前 Android 在采购结束后只更新本地状态和前台通知,未发现 PDD 页面上的结果气泡实现。 - GoAutoAccessibilityService 已处理系统无障碍按钮并通过 openAgentPreservingTab() 返回 Agent。 - 交付单元仅限 android/,不修改服务端、Web 或共享 API。 - 前置依赖:无阻塞依赖;以当前分支已完成的采购执行基线为实现基础。 - 可并行性:不与采购执行状态机修改并行,以免同一结果收敛路径冲突。 ## 方案 1. 在无障碍服务中提供基于 TYPE_ACCESSIBILITY_OVERLAY 的采购结果气泡控制器,不申请普通应用悬浮窗权限;窗口使用不可聚焦、不可触摸标志。 2. 气泡只接受结构化状态、任务编号、中止步骤和既有执行结果;统一脱敏、去换行和限长。 3. 采购结果安全写入本地 Outbox 后显示;成功 3 秒,失败 8 秒。 4. 无障碍按钮回 Agent 前主动关闭;检测 Agent 回到前台时再次幂等关闭。 5. 新任务开始、无障碍服务销毁或新结果替换旧结果时清理旧气泡。 6. 以纯 Kotlin 策略类覆盖文案、时长、限长和步骤映射;Android 视图层保持最小。 ## 设计证据 - 类型:现有 PDD 页面上的小范围新组件,采用会话内交互原型与文字确认,不新增页面或导航。 - 原型:goauto-purchase-step-overlay.html(会话内临时原型,未导出到仓库)。 - 确认人:用户。 - 确认日期:2026-09-05。 - 最终确认覆盖:执行中无浮层;成功/失败后才显示;失败展示真实原因;点击 Agent 无障碍悬浮图标返回时提前关闭。 - 状态边界:正常运行时无组件;成功 3 秒自动关闭;失败 8 秒自动关闭;返回 Agent/服务销毁/新任务开始立即关闭;无障碍服务不可用时不影响结果提交,仅无气泡。 ## 验收标准 - [ ] 执行中不显示结果气泡。 - [ ] 成功结果显示约 3 秒,文字与真实结果一致。 - [ ] 失败结果显示约 8 秒,并包含最后执行步骤和真实失败原因。 - [ ] 气泡不拦截 PDD 页面点击,不获得输入焦点。 - [ ] 点击 Agent 系统无障碍按钮返回时立即关闭气泡;Agent 回到前台时也不会残留。 - [ ] 连续任务或连续结果不会叠加多个气泡。 - [ ] 气泡文字去换行、限长,且不新增 Token、地址、订单详情等敏感日志。 - [ ] Android 受影响单元测试与 APK 构建通过。 ## 验证计划 - 策略单元测试:成功/失败时长、步骤映射、文案限长与换行清理、空原因回退。 - 控制器单元测试:替换旧气泡、超时关闭、返回 Agent 关闭(通过可测试状态策略覆盖)。 - Android:gradlew.bat testDebugUnitTest 与 gradlew.bat assembleDebug。 - 未验证项:本工单不执行真机采购、订单创建或支付;气泡的真机位置和系统无障碍按钮联动留待用户安装后验收。 ## 风险与安全 - 气泡使用无障碍 Overlay,必须不可触摸、不可聚焦,避免影响 PDD 自动化。 - 失败原因只消费既有 Agent 执行结果并限长;不得额外采集页面文字、控件树或截图。 - 本工单不新增或扩大订单创建、地址修改、支付权限。 - Gitea MCP 当前未提供可调用工具,按仓库规则回退 Gitea API;凭据仅从已忽略的 gitea.env 读取。 ## 文档影响 无长期文档影响:只增加既有采购结果的短时本机展示方式,不改变 API、数据结构、采购状态、业务规则、安全边界、启动/部署或排错命令,因此跳过 Wiki 更新与镜像同步。
Author
Owner

开始实施。基线提交:8d2e61b;工作分支:feat/218-purchase-result-bubble。已核对工单范围、Android 采购/设备规则与现有工作区;无阻塞依赖。保留 docs/12-syb-erp-interface.md、server/config/settings.yml 及既有未跟踪文件等无关改动,不纳入本工单。设计门禁采用 2026-09-05 用户确认的会话内小组件原型与最终交互说明。

开始实施。基线提交:8d2e61b;工作分支:feat/218-purchase-result-bubble。已核对工单范围、Android 采购/设备规则与现有工作区;无阻塞依赖。保留 docs/12-syb-erp-interface.md、server/config/settings.yml 及既有未跟踪文件等无关改动,不纳入本工单。设计门禁采用 2026-09-05 用户确认的会话内小组件原型与最终交互说明。
Author
Owner

实施中发现必要版本绑定:当前 Agent 为 0.9.40(versionCode 53),若功能包不升级版本,已安装设备及后台版本策略无法识别更新。工单范围补充 android/app/build.gradle.kts 升级至 0.9.41(54),并同步 server/app/goauto/apprelease/apk_test.go 的 APK 元数据断言;该服务端文件仅是构建产物版本绑定测试,不改变接口、数据或运行行为。

实施中发现必要版本绑定:当前 Agent 为 0.9.40(versionCode 53),若功能包不升级版本,已安装设备及后台版本策略无法识别更新。工单范围补充 android/app/build.gradle.kts 升级至 0.9.41(54),并同步 server/app/goauto/apprelease/apk_test.go 的 APK 元数据断言;该服务端文件仅是构建产物版本绑定测试,不改变接口、数据或运行行为。
Author
Owner

实施完成,等待验收

实现

  • 新增不可触摸、不可聚焦的 Android 无障碍结果气泡;仅在 PDD 仍处于前台且采购最终结果已安全写入本地 Outbox 后显示。
  • 成功显示 3 秒;失败或订单结果不明确显示 8 秒。
  • 失败标题包含最后执行步骤,正文使用现有执行结果的真实原因,并统一去换行、隐藏 URL/Token/Cookie/Authorization 片段、最长 96 字符。
  • 首趟规格探测完成不显示“采购成功”,避免误导;order_result_unknown 明确显示“待人工核对”。
  • 点击系统无障碍 Agent 按钮、自动返回 Agent、手工打开 Agent、新任务开始或无障碍服务销毁时立即清除旧气泡;连续结果以新气泡替换旧气泡,不叠加。
  • Overlay 使用 FLAG_NOT_FOCUSABLE、FLAG_NOT_TOUCHABLE、FLAG_NOT_TOUCH_MODAL,不拦截 PDD 页面操作;位置避开系统状态栏,文字状态不只依赖颜色。
  • Agent 版本由 0.9.40(53)升级为 0.9.41(54);同步更新 APK 元数据绑定测试,未改变服务端运行逻辑。

验收对照

  • 执行中不显示结果气泡。
  • 成功结果约 3 秒且为事实摘要。
  • 失败结果约 8 秒,包含中止步骤与真实原因。
  • 气泡不接收焦点或触摸。
  • 返回 Agent、服务销毁和新任务开始会提前关闭。
  • 连续结果不会叠加。
  • 文案去换行、限长并隐藏常见敏感片段。
  • Android 单元测试、Debug APK 构建与服务端 APK 版本绑定测试通过。

验证

  • scripts/verify.ps1 -Component android:通过(Debug/Release 单元测试 + Debug APK)。
  • android/gradlew.bat test assembleDebug:通过。
  • server:go test ./app/goauto/apprelease:通过。
  • git diff --check:通过。
  • 生成包:android/app/build/outputs/apk/debug/app-debug.apk,版本 0.9.41(54)。

提交与分支

  • 提交:5859a819c8d39ae91a1bca238a6ca720436ad7fe
  • 分支:feat/218-purchase-result-bubble
  • 已推送至 origin,远端提交与本地一致。

未验证与风险

  • 未安装真机,未执行真实采购、地址修改、订单创建或支付。
  • 真机上的系统状态栏避让、字体放大和无障碍按钮提前关闭需安装后验收。
  • 永久禁止支付边界未变化。

文档影响

无长期文档影响:未改变 API、数据结构、采购状态、业务规则、安全边界、部署或排错方式,按工单方案跳过 Wiki 更新和镜像同步。

状态:待验收,工单保持打开。

## 实施完成,等待验收 ### 实现 - 新增不可触摸、不可聚焦的 Android 无障碍结果气泡;仅在 PDD 仍处于前台且采购最终结果已安全写入本地 Outbox 后显示。 - 成功显示 3 秒;失败或订单结果不明确显示 8 秒。 - 失败标题包含最后执行步骤,正文使用现有执行结果的真实原因,并统一去换行、隐藏 URL/Token/Cookie/Authorization 片段、最长 96 字符。 - 首趟规格探测完成不显示“采购成功”,避免误导;order_result_unknown 明确显示“待人工核对”。 - 点击系统无障碍 Agent 按钮、自动返回 Agent、手工打开 Agent、新任务开始或无障碍服务销毁时立即清除旧气泡;连续结果以新气泡替换旧气泡,不叠加。 - Overlay 使用 FLAG_NOT_FOCUSABLE、FLAG_NOT_TOUCHABLE、FLAG_NOT_TOUCH_MODAL,不拦截 PDD 页面操作;位置避开系统状态栏,文字状态不只依赖颜色。 - Agent 版本由 0.9.40(53)升级为 0.9.41(54);同步更新 APK 元数据绑定测试,未改变服务端运行逻辑。 ### 验收对照 - [x] 执行中不显示结果气泡。 - [x] 成功结果约 3 秒且为事实摘要。 - [x] 失败结果约 8 秒,包含中止步骤与真实原因。 - [x] 气泡不接收焦点或触摸。 - [x] 返回 Agent、服务销毁和新任务开始会提前关闭。 - [x] 连续结果不会叠加。 - [x] 文案去换行、限长并隐藏常见敏感片段。 - [x] Android 单元测试、Debug APK 构建与服务端 APK 版本绑定测试通过。 ### 验证 - scripts/verify.ps1 -Component android:通过(Debug/Release 单元测试 + Debug APK)。 - android/gradlew.bat test assembleDebug:通过。 - server:go test ./app/goauto/apprelease:通过。 - git diff --check:通过。 - 生成包:android/app/build/outputs/apk/debug/app-debug.apk,版本 0.9.41(54)。 ### 提交与分支 - 提交:5859a819c8d39ae91a1bca238a6ca720436ad7fe - 分支:feat/218-purchase-result-bubble - 已推送至 origin,远端提交与本地一致。 ### 未验证与风险 - 未安装真机,未执行真实采购、地址修改、订单创建或支付。 - 真机上的系统状态栏避让、字体放大和无障碍按钮提前关闭需安装后验收。 - 永久禁止支付边界未变化。 ### 文档影响 无长期文档影响:未改变 API、数据结构、采购状态、业务规则、安全边界、部署或排错方式,按工单方案跳过 Wiki 更新和镜像同步。 状态:待验收,工单保持打开。
Author
Owner

真机安装补充(用户于 2026-09-05 明确授权):已通过 adb -s 192.168.0.9:40425 install -r 覆盖安装 Debug APK,命令返回 Success;安装后只读核对为 versionCode=54、versionName=0.9.41,应用数据未清除,Agent 进程已由系统恢复。此次未手工发起采购、重试或支付;结果气泡仍需下一次经授权的真实采购结果进行界面验收。

真机安装补充(用户于 2026-09-05 明确授权):已通过 adb -s 192.168.0.9:40425 install -r 覆盖安装 Debug APK,命令返回 Success;安装后只读核对为 versionCode=54、versionName=0.9.41,应用数据未清除,Agent 进程已由系统恢复。此次未手工发起采购、重试或支付;结果气泡仍需下一次经授权的真实采购结果进行界面验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#218