Client:领取 Admin 创建的采集任务 #30

Closed
opened 2026-08-07 16:00:04 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:需求(跨模块联调)
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 关联:Admin #17(无主任务领取)、#18(采集任务创建)、#19(任务页可见)
  • 前置:Admin 侧已全部就绪,见下
  • 当前状态:待验收

要解决什么

Admin 侧从建商品到接收采集结果整条链路已经通了,但 Client 领不到任务。

实测现状:在 Admin 的 PDD 商品页点「创建采集任务」,任务确实建出来了
(tasks 表里状态 pending、assigned_client 为 NULL),
Admin 的采集采购页也能看到,但它会一直停在「待分配」——没有客户端来领。

三层原因,逐层查证

① HttpAdminGateway 从设计上就不含领取能力

class HttpAdminGateway(ClientRegistrationGateway):
    """通过 HTTP 登记 Client;访问令牌只保存在内存。"""

它继承的是 ClientRegistrationGateway——只有 register_client 一个方法的窄接口,
注释写着「设置页只依赖登记能力,不依赖任务领取和提交」。

完整的 AdminGateway 有 4 个方法,目前只有 MockAdminGateway 全实现了。

② 界面上「获取任务」按钮的信号没人接

pdd_ui.py:276    autoFetchRequested = pyqtSignal()
pdd_ui.py:409    self.autoFetchButton.clicked.connect(self.autoFetchRequested.emit)

autoFetchRequested 全项目只有这两处——定义和发射,没有任何地方监听。

③ 没有任何生产代码调用 claim_next

做什么 / 不做什么

做:

  1. 实现走 HTTP 的 claim_next
  2. 接通「获取任务」按钮:后台线程领取 → 存本地库 → 刷新表格
  3. 只领采集任务

不做(各自独立工单):

  • 不执行采集(不碰 uiautomator2、不连手机)
  • 不提交结果(submit_result / submit_failure 仍不实现)
  • 不做采购任务
  • 不改 MockAdminGateway
  • 不动 settings_ui.py / settings_ui_event.py / android_device_service.py
    —— 另一个会话正在改这几个文件

怎么做

字段名对不上,这是最容易踩的坑

Admin 实际返回的报文(admin/handler/api/client_api.go 的 taskPayload):

{
  "task": {
    "id":         "COL-8020a8729f111c15",
    "type":       "collect",
    "version":    1,
    "priority":   0,
    "payload": {
      "goods_id":  "737116531267",
      "goods_url": "https://mobile.yangkeduo.com/goods.html?goods_id=737116531267"
    },
    "created_at": "2026-08-07T03:19:49Z",
    "updated_at": "2026-08-07T03:19:49Z"
  }
}

而 Client 的 AdminTask(client/src/admin_gateway.py:71)字段是
task_id 和 task_type。

[必须] 映射必须显式写,不要用 AdminTask(**data) 这种自动展开——
字段名对不上会得到 task_id=None,而 __post_init__ 抛的是
「task_id 不能为空」,看不出真正原因是字段名不一致。

[必须] 测试里用上面这段真实报文做输入,不要自己编一个字段名恰好对得上的。
这是唯一能挡住这类错误的办法。

204 不是错误

[必须] 没有可领的任务时 Admin 返回 204 No Content,不是 200 加空对象
(client_api.go:134 有注释说明)。

claim_next 收到 204 要返回 None,界面显示「暂无可领取的任务」这类中性提示,
不得当成错误弹窗。新客户端第一次来必然走到这里,是正常情况。

只报 collect,不报 purchase

[必须] claim 请求里 supported_types 只填 ["collect"],写死,不要从设置里读。

理由:client/AGENTS.md 写着「『获取任务』会真的去操作手机、可能下单」。
本工单只领不执行,所以这个按钮仍然是安全的。但如果现在就把
purchase 报上去,等以后接上执行能力的那一刻,这个按钮会悄悄地
从安全变成会花钱,而且没有任何一次代码评审会注意到——因为改的是别处。

采购任务要等 docs/client/06-quality-security.md §3 的采购安全门禁满足后再开,
届时单独走工单。

一次只领一个,不做循环

client/AGENTS.md 描述的最终形态是「获取任务」点击后变「停止获取」,
循环领取执行。本工单不做这个循环。

[必须] 点一次只领一个任务。理由:本工单不执行任务,循环领会把 Admin 上
所有任务一次性领空,而它们一个都不会被执行——比领不到更糟,
Admin 那边全变成 claimed 却永远等不到结果。

[必须] 按钮文案保持「获取任务」,不实现「停止获取」的切换。
在 docs/client/05-ui-specification.md 标注这是过渡状态,接上执行能力时再改。

不得在主线程发 HTTP

[必须] 这是根 AGENTS.md 的红线。用 QObject + moveToThread 的 Worker 写法,
模板见 02 架构 §5.1。
不得用 QThread 子类、QRunnable 或 threading。

[必须] 窗口关闭时按 [02 架构 §5.2] 断开连接,防止迟到结果访问已销毁控件。

先存库再更新界面,存库失败要说清楚

[必须] 顺序是:claim 成功 → task_repository.add_claimed_task → 刷新表格。

[必须] 存库失败必须明确告诉用户任务号,例如:

任务 COL-8020a8729f111c15 已在服务端领取,但本地保存失败:<原因>。
请记下这个任务号联系维护者。

原因:claim 成功后 Admin 已经把任务标成 claimed,本地却没有记录——
这个任务从此谁也不会执行,Admin 那边也看不出异常。
不报任务号的话,事后完全无法定位是哪一条。

[建议] 这个缺口(claim 成功但本地写库失败 → 任务悬空)本工单不解决,
在 docs/client/04-admin-api-contract.md 的「已知缺口」里记一条。

[必须] add_claimed_task 遇到相同 remote_task_id 会抛 DuplicateTaskError。
要捕获它并当成正常情况处理(提示「这个任务本地已有」),不是错误——
不捕获的话界面会弹一个看不懂的异常。

预计修改文件

文件 改什么
client/src/admin_gateway.py 加一个只含 claim_next 的窄接口(照 ClientRegistrationGateway 的写法)
client/src/http_admin_gateway.py 实现 claim_next,含字段名映射和 204 处理
client/src/pdd_ui_event.py 接 autoFetchRequested → Worker → 存库 → 刷新
client/test/test_http_admin_gateway.py 新建:用真实报文测映射、204、错误码
client/test/test_pdd_ui_event.py 新建或补充:领取流程、重复任务、存库失败提示
docs/client/04-admin-api-contract.md 标注 claim 已实现;记「任务悬空」缺口
docs/client/05-ui-specification.md 标注「获取任务」当前是单次领取的过渡状态

[注意] client/src/pdd_ui.py 和 ui_main.py 工作区里有未提交的改动(不是你的)。
本工单不需要改这两个文件——autoFetchRequested 信号已经存在,
接线在 pdd_ui_event.py 里做。如果发现非改不可,先停下来说明原因。

验收标准

claim_next

  • 用上面那段真实 Admin 报文能正确解析出 task_id / task_type / payload
  • 204 返回 None,不抛异常
  • 请求头带 X-Client-Id、X-Request-Id、Content-Type
  • supported_types 只有 ["collect"]
  • HTTP 错误(4xx/5xx)转成能看懂的异常,带 request_id

界面

  • 点「获取任务」能领到 Admin 上的采集任务,表格出现这一行
  • 没有任务时显示中性提示,不弹错误框
  • 领取期间界面不卡(HTTP 在后台线程)
  • 重复领到同一任务时提示「本地已有」,不弹异常
  • 存库失败时提示里包含任务号
  • 一次只领一个任务
  • 按钮文案仍是「获取任务」,没有实现「停止获取」切换

红线

  • 主线程内没有任何 HTTP 调用
  • 用的是 QObject + moveToThread,不是 QThread 子类 / QRunnable / threading
  • 窗口关闭后迟到的结果不会访问已销毁控件
  • 没有任何 uiautomator2 / ADB 调用(本工单不碰手机)

其他

  • 没有改 settings_ui.py / settings_ui_event.py / android_device_service.py
  • 没有改 MockAdminGateway
  • 两份文档已同步

怎么验证

全部从 client/ 目录执行。

1. 语法与单元测试

C:/Python310/python.exe -m pytest test/ -q

2. 界面离屏冒烟

$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()"
Remove-Item Env:QT_QPA_PLATFORM

3. 真实联调(不需要手机)

先起 Admin:

cd D:\chengma\cmautobuy\admin
go run .

在 http://127.0.0.1:8080/pdd 添加一个商品、勾选、点「创建采集任务」。

再起 Client,在设置页登记一次,回 PDD 页点「获取任务」。

期望:

  • 表格出现刚才那个任务
  • Admin 的采集采购页(http://127.0.0.1:8080/tasks )里这条从「待分配」变成
    「已领取」,客户端列显示你的客户端编号
  • 再点一次「获取任务」→ 提示暂无可领取的任务(因为只建了一个)

[必须] 交付报告里要贴这三步的实际截图或输出,
以及 Admin 那边任务状态变化的证据。

风险和回退

风险 应对
字段名映射写错,拿到空任务 用真实报文做测试输入,已列为验收项
HTTP 跑在主线程,界面卡死 已列为红线验收项
claim 成功但本地写库失败,任务悬空 本工单不解决,但提示里必须带任务号;缺口记进文档
和另一个会话改同一批文件 「不做」清单里已排除那三个文件

回退:git revert。本工单不操作手机、不采集、不下单,但 claim 会把 Admin 任务改成 claimed;
最坏情况是 Admin 上几条任务停在 claimed。

开工前补充确认(2026-08-07)

  • 当前 Client 编号或已保存 Android 设备号缺失时,不���送 claim,请用户先到设置页保存。
  • PDDTaskPageEvent 支持注入领取 Gateway 和 Settings Repository;生产默认读取同一 SQLite 配置,不修改当前脏状态的 ui_main.py。
  • 领取期间只禁用“获取任务”按钮并更新底部状态,不切换成持续获取/停止获取模式。
  • claim 已成功后即使窗口正在关闭,Worker 仍优先完成本地保存;界面关闭只断开迟到的 UI 回调,避免把任务留在服务端。
  • 真实联调使用可丢弃的采集测试任务,并以 HTTP/数据库输出作为 Admin 状态变化证据。
## 基本信息 - 类型:需求(跨模块联调) - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 关联:Admin #17(无主任务领取)、#18(采集任务创建)、#19(任务页可见) - 前置:Admin 侧**已全部就绪**,见下 - 当前状态:待验收 ## 要解决什么 Admin 侧从建商品到接收采集结果整条链路已经通了,但 **Client 领不到任务**。 实测现状:在 Admin 的 PDD 商品页点「创建采集任务」,任务确实建出来了 (`tasks` 表里状态 `pending`、`assigned_client` 为 NULL), Admin 的采集采购页也能看到,但它会**一直停在「待分配」**——没有客户端来领。 ### 三层原因,逐层查证 **① `HttpAdminGateway` 从设计上就不含领取能力** ```python class HttpAdminGateway(ClientRegistrationGateway): """通过 HTTP 登记 Client;访问令牌只保存在内存。""" ``` 它继承的是 `ClientRegistrationGateway`——只有 `register_client` 一个方法的窄接口, 注释写着「设置页只依赖登记能力,不依赖任务领取和提交」。 完整的 `AdminGateway` 有 4 个方法,**目前只有 `MockAdminGateway` 全实现了**。 **② 界面上「获取任务」按钮的信号没人接** ```python pdd_ui.py:276 autoFetchRequested = pyqtSignal() pdd_ui.py:409 self.autoFetchButton.clicked.connect(self.autoFetchRequested.emit) ``` `autoFetchRequested` 全项目**只有这两处**——定义和发射,没有任何地方监听。 **③ 没有任何生产代码调用 `claim_next`** ## 做什么 / 不做什么 做: 1. 实现走 HTTP 的 `claim_next` 2. 接通「获取任务」按钮:后台线程领取 → 存本地库 → 刷新表格 3. **只领采集任务** 不做(各自独立工单): - **不执行采集**(不碰 uiautomator2、不连手机) - **不提交结果**(`submit_result` / `submit_failure` 仍不实现) - 不做采购任务 - 不改 `MockAdminGateway` - 不动 `settings_ui.py` / `settings_ui_event.py` / `android_device_service.py` —— 另一个会话正在改这几个文件 ## 怎么做 ### 字段名对不上,这是最容易踩的坑 Admin 实际返回的报文(`admin/handler/api/client_api.go` 的 `taskPayload`): ```json { "task": { "id": "COL-8020a8729f111c15", "type": "collect", "version": 1, "priority": 0, "payload": { "goods_id": "737116531267", "goods_url": "https://mobile.yangkeduo.com/goods.html?goods_id=737116531267" }, "created_at": "2026-08-07T03:19:49Z", "updated_at": "2026-08-07T03:19:49Z" } } ``` 而 Client 的 `AdminTask`(`client/src/admin_gateway.py:71`)字段是 **`task_id`** 和 **`task_type`**。 `[必须]` 映射必须显式写,**不要用 `AdminTask(**data)` 这种自动展开**—— 字段名对不上会得到 `task_id=None`,而 `__post_init__` 抛的是 「task_id 不能为空」,看不出真正原因是字段名不一致。 `[必须]` 测试里**用上面这段真实报文**做输入,不要自己编一个字段名恰好对得上的。 这是唯一能挡住这类错误的办法。 ### 204 不是错误 `[必须]` 没有可领的任务时 Admin 返回 **204 No Content**,不是 200 加空对象 (`client_api.go:134` 有注释说明)。 `claim_next` 收到 204 要返回 `None`,界面显示「暂无可领取的任务」这类中性提示, **不得当成错误弹窗**。新客户端第一次来必然走到这里,是正常情况。 ### 只报 collect,不报 purchase `[必须]` claim 请求里 `supported_types` **只填 `["collect"]`**,写死,不要从设置里读。 理由:`client/AGENTS.md` 写着「『获取任务』会真的去操作手机、可能下单」。 本工单只领不执行,所以这个按钮**仍然是安全的**。但如果现在就把 `purchase` 报上去,等以后接上执行能力的那一刻,这个按钮会**悄悄地** 从安全变成会花钱,而且没有任何一次代码评审会注意到——因为改的是别处。 采购任务要等 `docs/client/06-quality-security.md` §3 的采购安全门禁满足后再开, 届时单独走工单。 ### 一次只领一个,不做循环 `client/AGENTS.md` 描述的最终形态是「获取任务」点击后变「停止获取」, 循环领取执行。**本工单不做这个循环。** `[必须]` 点一次只领**一个**任务。理由:本工单不执行任务,循环领会把 Admin 上 所有任务一次性领空,而它们**一个都不会被执行**——比领不到更糟, Admin 那边全变成 `claimed` 却永远等不到结果。 `[必须]` 按钮文案保持「获取任务」,**不实现「停止获取」的切换**。 在 `docs/client/05-ui-specification.md` 标注这是过渡状态,接上执行能力时再改。 ### 不得在主线程发 HTTP `[必须]` 这是根 `AGENTS.md` 的红线。用 `QObject` + `moveToThread` 的 Worker 写法, 模板见 [02 架构 §5.1](../docs/client/02-architecture.md)。 **不得**用 `QThread` 子类、`QRunnable` 或 `threading`。 `[必须]` 窗口关闭时按 [02 架构 §5.2] 断开连接,防止迟到结果访问已销毁控件。 ### 先存库再更新界面,存库失败要说清楚 `[必须]` 顺序是:claim 成功 → `task_repository.add_claimed_task` → 刷新表格。 `[必须]` **存库失败必须明确告诉用户任务号**,例如: ```text 任务 COL-8020a8729f111c15 已在服务端领取,但本地保存失败:<原因>。 请记下这个任务号联系维护者。 ``` 原因:claim 成功后 Admin 已经把任务标成 `claimed`,本地却没有记录—— 这个任务从此**谁也不会执行**,Admin 那边也看不出异常。 不报任务号的话,事后完全无法定位是哪一条。 `[建议]` 这个缺口(claim 成功但本地写库失败 → 任务悬空)本工单不解决, 在 `docs/client/04-admin-api-contract.md` 的「已知缺口」里记一条。 `[必须]` `add_claimed_task` 遇到相同 `remote_task_id` 会抛 `DuplicateTaskError`。 要捕获它并当成**正常情况**处理(提示「这个任务本地已有」),不是错误—— 不捕获的话界面会弹一个看不懂的异常。 ## 预计修改文件 | 文件 | 改什么 | |---|---| | `client/src/admin_gateway.py` | 加一个只含 `claim_next` 的窄接口(照 `ClientRegistrationGateway` 的写法) | | `client/src/http_admin_gateway.py` | 实现 `claim_next`,含字段名映射和 204 处理 | | `client/src/pdd_ui_event.py` | 接 `autoFetchRequested` → Worker → 存库 → 刷新 | | `client/test/test_http_admin_gateway.py` | 新建:用真实报文测映射、204、错误码 | | `client/test/test_pdd_ui_event.py` | 新建或补充:领取流程、重复任务、存库失败提示 | | `docs/client/04-admin-api-contract.md` | 标注 claim 已实现;记「任务悬空」缺口 | | `docs/client/05-ui-specification.md` | 标注「获取任务」当前是单次领取的过渡状态 | `[注意]` `client/src/pdd_ui.py` 和 `ui_main.py` 工作区里有**未提交的改动**(不是你的)。 本工单**不需要改这两个文件**——`autoFetchRequested` 信号已经存在, 接线在 `pdd_ui_event.py` 里做。如果发现非改不可,先停下来说明原因。 ## 验收标准 **claim_next** - [x] 用上面那段**真实 Admin 报文**能正确解析出 `task_id` / `task_type` / `payload` - [x] 204 返回 `None`,不抛异常 - [x] 请求头带 `X-Client-Id`、`X-Request-Id`、`Content-Type` - [x] `supported_types` 只有 `["collect"]` - [x] HTTP 错误(4xx/5xx)转成能看懂的异常,带 `request_id` **界面** - [x] 点「获取任务」能领到 Admin 上的采集任务,表格出现这一行 - [x] 没有任务时显示中性提示,**不弹错误框** - [x] 领取期间界面不卡(HTTP 在后台线程) - [x] 重复领到同一任务时提示「本地已有」,不弹异常 - [x] 存库失败时提示里**包含任务号** - [x] 一次只领一个任务 - [x] 按钮文案仍是「获取任务」,没有实现「停止获取」切换 **红线** - [x] 主线程内没有任何 HTTP 调用 - [x] 用的是 `QObject` + `moveToThread`,不是 `QThread` 子类 / `QRunnable` / `threading` - [x] 窗口关闭后迟到的结果不会访问已销毁控件 - [x] **没有任何 uiautomator2 / ADB 调用**(本工单不碰手机) **其他** - [x] 没有改 `settings_ui.py` / `settings_ui_event.py` / `android_device_service.py` - [x] 没有改 `MockAdminGateway` - [x] 两份文档已同步 ## 怎么验证 全部从 `client/` 目录执行。 **1. 语法与单元测试** ```powershell C:/Python310/python.exe -m pytest test/ -q ``` **2. 界面离屏冒烟** ```powershell $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()" Remove-Item Env:QT_QPA_PLATFORM ``` **3. 真实联调(不需要手机)** 先起 Admin: ```powershell cd D:\chengma\cmautobuy\admin go run . ``` 在 http://127.0.0.1:8080/pdd 添加一个商品、勾选、点「创建采集任务」。 再起 Client,在设置页登记一次,回 PDD 页点「获取任务」。 期望: - 表格出现刚才那个任务 - Admin 的采集采购页(http://127.0.0.1:8080/tasks )里这条从「待分配」变成 **「已领取」**,客户端列显示你的客户端编号 - 再点一次「获取任务」→ 提示暂无可领取的任务(因为只建了一个) `[必须]` 交付报告里要贴**这三步的实际截图或输出**, 以及 Admin 那边任务状态变化的证据。 ## 风险和回退 | 风险 | 应对 | |---|---| | 字段名映射写错,拿到空任务 | 用真实报文做测试输入,已列为验收项 | | HTTP 跑在主线程,界面卡死 | 已列为红线验收项 | | claim 成功但本地写库失败,任务悬空 | 本工单不解决,但提示里必须带任务号;缺口记进文档 | | 和另一个会话改同一批文件 | 「不做」清单里已排除那三个文件 | 回退:`git revert`。本工单不操作手机、不采集、不下单,但 claim 会把 Admin 任务改成 `claimed`; 最坏情况是 Admin 上几条任务停在 `claimed`。 ## 开工前补充确认(2026-08-07) - 当前 Client 编号或已保存 Android 设备号缺失时,不���送 claim,请用户先到设置页保存。 - `PDDTaskPageEvent` 支持注入领取 Gateway 和 Settings Repository;生产默认读取同一 SQLite 配置,不修改当前脏状态的 `ui_main.py`。 - 领取期间只禁用“获取任务”按钮并更新底部状态,不切换成持续获取/停止获取模式。 - claim 已成功后即使窗口正在关闭,Worker 仍优先完成本地保存;界面关闭只断开迟到的 UI 回调,避免把任务留在服务端。 - 真实联调使用可丢弃的采集测试任务,并以 HTTP/数据库输出作为 Admin 状态变化证据。
Author
Owner

实施记录(2026-08-07)

代码已完成并进入待验收:

  • 新增 TaskClaimGateway 窄接口,HttpAdminGateway.claim_next 显式映射 Admin 的 id/type/payload 字段;
  • 204 返回 None,请求只声明 supported_types: ["collect"];
  • “获取任务”连接 QObject + moveToThread Worker,一次只领一个;
  • Worker 中完成配置读取、HTTP claim、NewClaimedTask 显式转换和 SQLite 保存,成功后主线程刷新表格;
  • 重复任务为中性提示;本地保存失败会持续显示任务号并弹出可关闭 InfoBar;
  • 窗口关闭后不更新 UI,但已经 claim 的任务仍优先完成本地保存;
  • 未修改 pdd_ui.py、ui_main.py、Mock Gateway、设置页和 Android/手机代码。

实现提交:51062f4 feat: 领取 Admin 采集任务并保存本地 (#30)

自动验证

  • Client 全量:130 passed;
  • compileall、离屏主窗口启动/关闭和 git diff --check 通过;
  • Admin 基线:go test ./... -count=1 通过。

真实联调输出(不连接手机)

使用独立 18080 临时 Admin 进程连接现有本地 Admin 数据库,完成后已停止临时进程,原 8080 热重载进程未改动。

首次点击:
status=已领取任务 COL-ce3fefe75ff3c2b0,已保存到本地任务列表
rows=1
saved=True

第二次点击:
status=暂无可领取的采集任务
button=获取任务

Admin:pending -> claimed,assigned_client 与本机已保存 Client 编号一致
Client SQLite:task_type=collect,goods_id=737116531267,status=claimed

本次真实联调只改变了这条测试采集任务的领取状态,没有调用 uiautomator2/ADB,没有采集或下单。

## 实施记录(2026-08-07) 代码已完成并进入待验收: - 新增 `TaskClaimGateway` 窄接口,`HttpAdminGateway.claim_next` 显式映射 Admin 的 `id/type/payload` 字段; - 204 返回 `None`,请求只声明 `supported_types: ["collect"]`; - “获取任务”连接 `QObject + moveToThread` Worker,一次只领一个; - Worker 中完成配置读取、HTTP claim、`NewClaimedTask` 显式转换和 SQLite 保存,成功后主线程刷新表格; - 重复任务为中性提示;本地保存失败会持续显示任务号并弹出可关闭 InfoBar; - 窗口关闭后不更新 UI,但已经 claim 的任务仍优先完成本地保存; - 未修改 `pdd_ui.py`、`ui_main.py`、Mock Gateway、设置页和 Android/手机代码。 实现提交:`51062f4` `feat: 领取 Admin 采集任务并保存本地 (#30)` ### 自动验证 - Client 全量:`130 passed`; - `compileall`、离屏主窗口启动/关闭和 `git diff --check` 通过; - Admin 基线:`go test ./... -count=1` 通过。 ### 真实联调输出(不连接手机) 使用独立 18080 临时 Admin 进程连接现有本地 Admin 数据库,完成后已停止临时进程,原 8080 热重载进程未改动。 ```text 首次点击: status=已领取任务 COL-ce3fefe75ff3c2b0,已保存到本地任务列表 rows=1 saved=True 第二次点击: status=暂无可领取的采集任务 button=获取任务 Admin:pending -> claimed,assigned_client 与本机已保存 Client 编号一致 Client SQLite:task_type=collect,goods_id=737116531267,status=claimed ``` 本次真实联调只改变了这条测试采集任务的领取状态,没有调用 uiautomator2/ADB,没有采集或下单。
Author
Owner

本地任务归档已提交:

  • 文档:docs/task/30-client-领取-admin-创建的采集任务.md
  • 归档提交:a2fc150 docs: 归档任务 #30

父工单 #1、#2 已确认包含 #30,当前保持未勾选;用户验收后再关闭本工单并同步父工单。

本地任务归档已提交: - 文档:`docs/task/30-client-领取-admin-创建的采集任务.md` - 归档提交:`a2fc150` `docs: 归档任务 #30` 父工单 #1、#2 已确认包含 #30,当前保持未勾选;用户验收后再关闭本工单并同步父工单。
Author
Owner

用户已于 2026-08-11 明确验收通过。

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58:02 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#30