fix(#54): unify device state across task domains

This commit is contained in:
QiuSW
2026-08-20 22:53:15 +08:00
parent 997f4e7463
commit b0f33bf679
8 changed files with 318 additions and 37 deletions
+5 -4
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Business-Rules-and-Glossary
wiki_url: https://git.ilapage.cn/OPC/goauto/wiki/Business-Rules-and-Glossary.-
wiki_revision: 5da7f2250f851caab6d0d1713f869b619ed55eb2
synchronized_at: 2026-08-20T08:47:11Z
wiki_revision: 39297e8886ddcd441c9cb874f399b3962055a3a1
synchronized_at: 2026-08-20T14:49:50Z
<!-- gitea-wiki-mirror:end -->
# 业务规则与术语
@@ -140,8 +140,9 @@ synchronized_at: 2026-08-20T08:47:11Z
- Device Token 明文只返回给客户端,服务端数据库只保存不可逆摘要。
- 设备状态只保存在线、离线或停用;是否忙碌由运行中的任务关系确定。
- Agent 默认每 15 秒心跳一次,45 秒没有心跳即离线;离线扫描每 15 秒执行。
- 心跳上报的 `currentTaskId` 必须与服务端该设备唯一运行任务一致,否则拒绝更新心跳。
- 设备超时离线时,其运行任务立即以 `DEVICE_OFFLINE` 失败,清除租约且不自动重试。
- 心跳上报的 `currentTaskId` 必须与服务端该设备唯一运行任务一致;采集任务和采购任务共用这一设备级忙碌事实,异常出现跨域同时运行时按服务端一致性错误处理。
- 设备超时离线时,运行中的采集任务和尚未提交订单的采购任务立即以 `DEVICE_OFFLINE` 失败,清除租约及运行槽且不自动重试;采购 attempt 同步结束并标为失败。
- 采购任务已进入 `order_submit_started` 后设备离线时,任务转为 `order_result_unknown` 并释放设备/账号运行槽,必须人工核对,禁止自动重派或再次点击创建订单。
## 术语
+4 -4
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Android-Agent-API-Contract
wiki_url: https://git.ilapage.cn/OPC/goauto/wiki/Android-Agent-API-Contract.-
wiki_revision: 8b81c816989f9063a6927939a3391c103ddc08ad
synchronized_at: 2026-08-20T09:51:45Z
wiki_revision: 60e8cebb504e23f1a42076977d8d99b486909594
synchronized_at: 2026-08-20T14:51:34Z
<!-- gitea-wiki-mirror:end -->
# MVP 共享 API 契约
@@ -273,9 +273,9 @@ POST /api/admin/v1/devices/{deviceId}/token/revoke
}
```
服务端校验 `currentTaskId` 必须与该设备唯一的 `running` 任务一致,不一致返回 HTTP 409 和 `DEVICE_TASK_MISMATCH`,不更新心跳。响应返回服务端确认的 `currentTaskId`、`online`、由运行任务派生的 `busy`、服务端时间和下一次心跳间隔。相同 `requestId` 重放不推进心跳时间。
服务端校验 `currentTaskId` 必须与该设备唯一的执行中任务一致;执行中任务统一覆盖采集任务的 `running`,以及采购任务的 `running` / `order_submit_started`。不一致返回 HTTP 409 和 `DEVICE_TASK_MISMATCH`,不更新心跳。响应返回服务端确认的 `currentTaskId`、`online`、由两类任务统一派生的 `busy`、服务端时间和下一次心跳间隔。相同 `requestId` 重放不推进心跳时间;若数据库异常存在跨任务域同时运行,服务端返回内部一致性错误,不静默选择其中一条。
默认心跳间隔 15 秒、离线阈值 45 秒、扫描间隔 15 秒。超过阈值后设备标为 `offline`;其 `running` 任务同时清除租约和活动 guard,转为 `failed`,错误码为 `DEVICE_OFFLINE`,且不自动重试或换机。设备重新发送合法心跳后可以恢复 `online`,但失败任务不会自动恢复。
默认心跳间隔 15 秒、离线阈值 45 秒、扫描间隔 15 秒。超过阈值后设备标为 `offline`:运行中的采集任务和未进入订单提交边界的采购任务清除租约与运行 guard,转为 `failed`,对应采购 attempt 同步失败并结束,错误码为 `DEVICE_OFFLINE`,且不自动重试或换机。采购任务已处于 `order_submit_started` 时必须转为 `order_result_unknown`,释放设备/账号运行槽并等待人工核对,禁止自动重派或再次点击创建订单。设备重新发送合法心跳后可以恢复 `online`,但失败或结果未知的任务不会自动恢复。
## Android:获取、领取和开始任务
+4 -3
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Delivery-Issues
wiki_url: https://git.ilapage.cn/OPC/goauto/wiki/Delivery-Issues.-
wiki_revision: 89a8d94f95fb4b3a572e7e1094c82d8cbd129220
synchronized_at: 2026-08-20T10:04:18Z
wiki_revision: 7c3027260213a9b4dc969349f41cdd25d8337e13
synchronized_at: 2026-08-20T14:51:37Z
<!-- gitea-wiki-mirror:end -->
# 当前 MVP 交付工单索引
@@ -62,7 +62,7 @@ synchronized_at: 2026-08-20T10:04:18Z
| T37 | [#39](https://git.ilapage.cn/OPC/goauto/issues/39) | 采购闭环真机端到端验收 | #33~#38、#42 |
| T38 | [#40](https://git.ilapage.cn/OPC/goauto/issues/40) | 虾皮商品档案、PDD 关联与规格映射(2026-08-20 已验收) | 已完成 |
| T39 | [#41](https://git.ilapage.cn/OPC/goauto/issues/41) | SYB 货运单商品导入与虾皮信息提取(2026-08-20 已验收) | 已完成 |
| T40 | [#42](https://git.ilapage.cn/OPC/goauto/issues/42) | Android 采购演练规则与持久执行基线 | #33、#34、#53;只演练,不改地址、不创建订单 |
| T40 | [#42](https://git.ilapage.cn/OPC/goauto/issues/42) | Android 采购演练规则与持久执行基线 | #33、#34、#53、#54;只演练,不改地址、不创建订单 |
| T43 | [#45](https://git.ilapage.cn/OPC/goauto/issues/45) | Admin PDD 商品列表多选与批量采集任务创建(2026-08-18 已验收) | 已完成 |
| T46 | [#48](https://git.ilapage.cn/OPC/goauto/issues/48) | SYB ERP 客户端移植与真实导入 | #41;已实施,等待验收 |
| T47 | [#49](https://git.ilapage.cn/OPC/goauto/issues/49) | 店铺管理与 SYB 同步店铺过滤(2026-08-20 已验收) | 已完成 |
@@ -70,6 +70,7 @@ synchronized_at: 2026-08-20T10:04:18Z
| T49 | [#51](https://git.ilapage.cn/OPC/goauto/issues/51) | 优化 SYB 商品列表工具栏与列宽(2026-08-20 已验收) | 已完成 |
| T50 | [#52](https://git.ilapage.cn/OPC/goauto/issues/52) | 修复 SYB 同步预创建失败无法定位(2026-08-20 已验收) | 已完成 |
| T51 | [#53](https://git.ilapage.cn/OPC/goauto/issues/53) | 补齐采购规则参数化动作契约(2026-08-20 已验收) | 已完成;#42 阻塞已解除 |
| T52 | [#54](https://git.ilapage.cn/OPC/goauto/issues/54) | 统一采集与采购任务的设备心跳、忙碌和离线处理 | 已实施,等待验收;解除 #42 服务端联调阻塞 |
推荐依赖顺序:#31、#40、#41 完成商品域 → #33、#34 建立采购契约和服务端状态机 → #53 补齐参数化动作契约 → #42 完成不下单演练 → #35 管理端人工处理 → #36 高风险真实订单动作 → #37、#38 物流闭环 → #39 真机总验收。