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 |
|
 chengmaandClaude Opus 5
|
1f95de373a
|
docs: 增加红线清单,并把约束下沉到代码文件
起因:实测发现 Codex 不会主动把 338 行的规则手册当判断依据——
问“能用 PySide6 吗”答“可以评估”,问“加个 emoji 图标”直接给改法,
问“改错别字要建工单吗”结论对但依据是通用常识、不是 §0 的实际条件。
三次都表现为“知道代码事实,但不应用项目规则”。
对策一:红线上收
- 根 AGENTS.md 开头新增 5 条红线(Qt 绑定、下单开关、风控、凭据、
不可逆阶段),并明确“不要论证其可行性,先停下来问用户”
对策二:把约束放到 agent 必然会打开的文件里
- pdd_ui.py / pdd_ui_event.py / settings_ui.py / settings_ui_event.py
写入模块 docstring,说明各自职责和最易踩的硬性规则
- 四个文件目前只有 docstring,无实现
同步修正
- ui_event.py 已拆成按页面分的四个文件,更新 client/AGENTS.md
的代码分层规则和 02 §3.1 的现状差异表
未包含:ui_main.py 和 demo1/auto_v1.py 的同类 docstring,
这两个文件承载尚未提交的代码,留待代码提交时一并处理。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-06 12:01:38 +08:00 |
|
 chengmaandClaude Opus 5
|
0b645ee8b3
|
docs: 建立面向初级程序员的文档基线
按初级程序员可读、可维护的目标重写项目文档,并定案三项设计决策。
新增
- docs/client/00-getting-started.md 上手指南:装环境、跑起来、常见报错
- docs/client/00-glossary.md 术语表:Outbox、幂等、不可逆阶段等
- docs/templates/task.md 工单与归档模板
- client/requirements.txt 固定依赖版本
- .gitignore 屏蔽 data/、打包产物和调试产物
设计定案
- 本地库只存已领取任务,不再镜像 Admin 任务池;已完成任务永久保留
- 去掉租约、心跳和状态回查;Admin 接口从 5 个降到 3 个
(本项目人工付款,重复下单只产生未付款订单,由人工审核处理)
- 打包采用 PyInstaller one-dir:launcher.exe + app/ + data/,便携模式
文档改进
- 补齐可直接抄的代码模板:Worker 线程、事务写库、幂等键、增量加载、错误提示、路径解析
- 状态机由 ASCII 图改为完整转换表,并补充崩溃恢复规则
- 消除文档与现有代码的冲突,02 新增“现状与目标差异”清单
- 待确认事项一律给出临时默认值,避免阻塞开发
- AGENTS.md 新增“小改动直通”,工单必填项由 8 项压缩到 6 项
说明:Gitea 尚未配置,本次无对应工单号;AGENTS.md §0 的 Gitea 信息待补。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-06 11:44:39 +08:00 |
|