Commit Graph
52 Commits
Author SHA1 Message Date
chengma 399aa0ebc6 fix: 简化待付款订单核单条件 (#126) 2026-08-10 20:13:55 +08:00
chengma 59de08b752 perf: 减少采购重复前台查询 (#120) 2026-08-10 19:31:21 +08:00
chengma b789b50a16 fix: 下单后自动进入只读核单 (#119) 2026-08-10 19:18:26 +08:00
chengma b182effa7e fix: 安全处理采购数量输入法 (#117) 2026-08-10 18:52:36 +08:00
chengma 894238508f fix: 采集商品页轮询避开慢速前台查询 (#115) 2026-08-10 18:39:18 +08:00
chengma 10bb892e6c feat: 移除 Client 真实采购手工授权 (#114) 2026-08-10 18:37:35 +08:00
chengma 8c9dbfed44 fix: 识别失效商品链接返回首页 (#111) 2026-08-10 18:20:34 +08:00
chengma 70cedc34d4 refactor: 复用持久设备工作线程 (#110) 2026-08-10 18:00:38 +08:00
chengma e1b32ea024 feat: 固定创建真实采购任务 (#112) 2026-08-10 17:52:48 +08:00
chengma ba0706dc47 perf: 量化商品页打开耗时并去重检查 (#109) 2026-08-10 17:40:44 +08:00
chengma b2721071c9 feat: 安全移除本地任务记录 (#108) 2026-08-10 17:23:24 +08:00
chengma 39686d7b3b fix: 领取任务后立即刷新列表 (#107) 2026-08-10 17:11:59 +08:00
chengma df67b0eaaa feat: 完善真实采购订单核对与恢复 (#100) 2026-08-10 16:54:06 +08:00
chengma e960cab1fb feat: 实现受控真实下单安全边界 (#99) 2026-08-10 16:35:38 +08:00
chengma 3aaa40cfe0 feat: 增加真实采购任务安全模式 (#98) 2026-08-10 15:11:38 +08:00
chengma 4dbe519029 fix: 使用固定便携包清单名称 (#102) 2026-08-10 15:10:03 +08:00
chengma 240626f945 feat: 统一 Client 发布产物命名 (#102) 2026-08-10 14:55:17 +08:00
chengma dc375ff2af feat: 增加认证更新配置与自动检查 (#94) 2026-08-10 14:31:44 +08:00
chengma 6d6829e374 feat: 实现 Client 在线更新与安全回退 (#93) 2026-08-10 12:32:39 +08:00
chengma 99252aecce feat: 增加 Client Windows 打包基础 (#92) 2026-08-10 11:59:13 +08:00
chengma 077cba6831 fix: 修复重新上报任务状态不一致 (#91) 2026-08-10 11:18:06 +08:00
chengma 34ff39a200 feat: 增加任务批量勾选和重新上报 (#89) 2026-08-10 10:56:48 +08:00
chengma 977af345b5 fix: 统一重新执行提示位置 (#87) 2026-08-10 10:16:11 +08:00
chengma bf816bce02 fix: 任务错误提示改为顶部居中 (#87) 2026-08-10 10:05:45 +08:00
chengma 74198bd70d fix: 放大任务错误提示并自动关闭 (#84) 2026-08-10 09:59:34 +08:00
chengma e7fb06d7aa fix: 任务执行前检查 Android 设备连接 (#84) 2026-08-10 09:35:46 +08:00
chengma 39f4a8ee4f fix: 优化重新采集取消交互 (#82) 2026-08-10 09:08:54 +08:00
chengma 7e90af0dc9 feat: 接入采购演练真机适配器 (#75) 2026-08-10 01:07:57 +08:00
chengma c86c7482d9 feat: 完善采购任务安全恢复 (#73) 2026-08-10 00:27:52 +08:00
chengma f201bcc4bf feat: 安全领取并分派采购任务 (#72) 2026-08-10 00:05:40 +08:00
chengma 311d55f0da feat: 实现采购任务安全演练 (#71) 2026-08-09 23:39:37 +08:00
chengma a6c573a76a fix: 允许等待重试任务手动重新执行 (#70) 2026-08-09 22:47:44 +08:00
chengma ff8cdd77c3 fix: Wi-Fi 恢复失败后继续搜索设备 (#66) 2026-08-09 22:18:55 +08:00
chengma eda3661604 feat: 增加采集任务重新执行入口 (#63) 2026-08-09 21:44:29 +08:00
chengma 5fd71981e0 feat: 支持持续自动获取任务 (#45) 2026-08-09 10:54:18 +08:00
chengma 5aaf0a937e fix: 允许颜色缺价后继续采集 (#42) 2026-08-08 11:25:06 +08:00
chengma 9dadac2bff feat: 滚动采集评价数量和店铺名 (#40) 2026-08-08 10:30:04 +08:00
chengma 2f83be5e40 fix: 中文显示任务当前步骤 (#39) 2026-08-08 10:29:59 +08:00
chengma cb323d37ba feat: 实现 PDD 任务详情窗口 (#39) 2026-08-08 09:46:58 +08:00
chengma 9562da9aad fix: 蛇形遍历颜色并逐色采价 (#37) 2026-08-08 09:25:40 +08:00
chengma e65cc2afda fix: 商品页就绪后立即进入规格面板 (#36) 2026-08-07 18:13:10 +08:00
chengma c59b4b0d59 fix: 修复 PDD 页面误判与失败回执 (#35) 2026-08-07 17:58:30 +08:00
chengma 2d1fdbea3f feat: 执行并提交 PDD 采集任务 (#32) 2026-08-07 17:38:29 +08:00
chengma 93beef8b36 feat: 保存并展示 PDD 店铺与价格采样信息 (#31) 2026-08-07 17:13:25 +08:00
chengma 51062f4c7b feat: 领取 Admin 采集任务并保存本地 (#30) 2026-08-07 16:42:31 +08:00
chengmaandClaude Opus 5 dd387e3ee5 feat: claim 支持领取无主任务 (#17)
PDD 商品页要能「创建采集任务」而不指定客户端——采集只是浏览商品页,
没有副作用,哪台设备采都一样。但原来的查询是

    WHERE assigned_client = ? AND status = 'assigned'

无主任务(assigned_client 为空 + pending)永远没人能领,建出来就是死的。

改动
- ClaimNextTask 同时查两种:指定给本机的 + 无主的
- 排序 ORDER BY (assigned_client IS NULL), priority DESC, created_at
  ——指定给本机的优先。显式分配是人为决定,应当先兑现
- 原子更新两种情况合成一条语句:对"指定给我的"写 assigned_client
  是写同一个值无副作用;对无主的,这一步就是"谁领到就标记谁"
- 表结构不用动(assigned_client 本来可空,status 已有 pending)

推翻了一条已定案的规则
Client 契约 §5.1 原写「Admin 只把任务分配给指定的 Client」,
现改为两种并存并说明各自适用场景:
- 采集任务不指定客户端
- 采购任务可指定可留空。涉及钱和账号——不同设备可能登着不同的
  拼多多账号,需要指定账号时必须显式分配,留空即接受"谁先抢到谁下单"

Client 侧对两种没有区别,不需要知道任务原来有没有主。

已验证(Go 1.23.0)
- 新增 7 个测试,全量 62 个全过
- 并发抢占用例重复 20 次稳定:8 个客户端抢同一条无主任务,
  正好 1 个拿到,且 assigned_client 记的就是那个赢家
- 既有测试未受影响,"只领分配给自己的"仍然成立

一处仍未解决的风险(已记入 #17 风险表)
tasks 表没有字段标记"该任务需要真实下单",所以契约里
"不向 dry_run 客户端分配真实下单任务"实际无法执行。
真实下单开关关闭时不出问题,开启前必须补该字段。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 10:53:32 +08:00
chengma 02073eab37 docs: define idempotent Client registration contract (#12) 2026-08-06 17:21:36 +08:00
chengmaandClaude Opus 5 62d46bf10a docs: 新增设备登记联调手册,并定案 client.name
面向 Client 开发者的实操文档,目标是让一台新设备出现在 Admin 的
客户端列表里。文中所有请求和响应都是在真实运行的 Admin 上跑出来的。

新增 docs/admin/07-设备登记联调手册.md
- 先讲清"没有注册接口,登记是 claim 的副作用"
- **重点提示 204 不是错误**:新设备第一次 claim 必然 204,
  它同时意味着登记成功。这是最容易被 Client 误判成失败的地方
- 设备号必须持久化、永不变——变了 Admin 会当成新机器,
  列表里会堆一串僵尸记录
- 设备名只在首次登记时采纳,之后 Admin 侧改名不会被覆盖。
  这个行为会让人困惑("我改了 Client 怎么 Admin 没变"),先说清楚
- 四步验证流程 + 可直接复制的 curl + 手工插测试任务的 SQL
- 7 条常见问题,含"列表里多出好几台一样的机器"这类实际会碰到的
- 列出 Client 侧待办清单,标明前两条做完就能登记成功

定案 client.name(原 [待定])
Client 设置页本来就有「设备名」输入框(deviceNameInput,50 字上限),
只是没接进 ClientInfo。Admin 仍容忍它缺失,缺了用 X-Client-Id 兜底,
所以 Client 先不发也不影响登记。

同步更新
- docs/client/04-admin-api-contract.md §5:请求示例补 client 字段,
  加"204 不是错误"的必须项,并指向本手册
- docs/README.md:两处导航加入口,Client 侧"对接 Admin"那行也指过来

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 17:08:58 +08:00
chengmaandClaude Opus 5 0279ffd60e docs: 更新 Client 现状差异表
核对代码后重写 02 §3.1,删掉两行已完成的、更新其余行的现状描述。

已对齐(移出差异表)
- 顶级导航:已是 2 个(pdd任务 / 参数设置)
- PDD 任务页:已有表格、筛选、搜索、状态条和 canFetchMore 增量加载
- 顺带核对:db_schema.py 已建 4 张表,status 的 8 个取值与
  03 §3 完全一致,也没有残留已废弃的 sync_state / lease_token / admin_status

仍是差异的行更新了现状描述,主按钮文案那行的行号从 485/487 改为 470/472。

新发现一处文档自相矛盾:02 §3 建议目录写 src/ui/main_window.py,
但 client/AGENTS.md 的代码分层规则写 src/ui_main.py,代码按后者走。
已在表下说明,建议把建议目录改成与代码一致,需另开工单决定。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 16:55:55 +08:00
chengmaandClaude Opus 5 4f920f9d8b docs: 排除蝦皮原始报表,并同步主按钮文案
raw_data 不进 Git
原始报表含逐商品台币销售额等商业数据,进了 Git 就是永久历史。
- .gitignore 排除 raw_data/
- 改掉三处"仓库里有一份样本"的失真表述,改为向项目负责人索取
- 06 §2.1 相应加强:既然大样本不进库,admin/testdata/ 下的脱敏小样本
  就必须提交,否则别人拉下来测试跑不了;并写明脱敏做法

主按钮文案 开始自动获取 → 获取任务 ⇄ 停止获取
只改按钮标签。"自动获取"作为功能名保留(状态栏、Tab 顺序、
协调器开关等处不动),05 §4.1 加了一句说明两者不是一回事。

已知遗留:pdd_ui.py 自身仍不一致——构造时用「获取任务」,
但状态机 485/487 行仍是「开始自动获取」/「停止自动获取」,
会覆盖掉构造时的文字。该文件有未提交改动,本次未触碰,
差异已记入 02 §3.1,需另开工单修。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 15:58:09 +08:00