2026-08-03 12:13:39 +08:00
|
|
|
|
# cmbuyer
|
|
|
|
|
|
|
2026-08-03 16:27:05 +08:00
|
|
|
|
自动化采购系统。**采购服务**(网页端,`admin/`)负责建单与人工决策,**采购工具**
|
|
|
|
|
|
(Windows 桌面端,`client/`)驱动 Android 手机在拼多多完成选规格和下单。
|
2026-08-03 12:13:39 +08:00
|
|
|
|
|
|
|
|
|
|
> **系统只创建待付款订单,任何情况下都不自动付款。**
|
|
|
|
|
|
|
|
|
|
|
|
## 它做什么
|
|
|
|
|
|
|
|
|
|
|
|
一笔外部订单进来,采购人员需要去拼多多找到同款、选对颜色尺码、下单、把订单号抄回系统。
|
2026-08-04 16:25:34 +08:00
|
|
|
|
cmbuyer 把这个过程自动化:管理员明确“买什么、买多少、最多多少钱”并点击开始采购,系统只
|
|
|
|
|
|
创建待付款订单,**是否付款始终由人决定**。
|
2026-08-03 12:13:39 +08:00
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
手工填链接(MVP) / Excel · ERP(V2)
|
|
|
|
|
|
│
|
|
|
|
|
|
v
|
2026-08-04 16:25:34 +08:00
|
|
|
|
采购服务(admin/,Go) 建单 · 开始采购授权 · 围栏 · 审计
|
2026-08-03 12:13:39 +08:00
|
|
|
|
│ HTTP
|
|
|
|
|
|
v
|
2026-08-03 16:27:05 +08:00
|
|
|
|
采购工具(client/,Python) 领任务 · 跑流程 · 回传
|
2026-08-03 12:13:39 +08:00
|
|
|
|
│ ADB(USB / WiFi)
|
|
|
|
|
|
v
|
|
|
|
|
|
Android 手机(拼多多 App)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-08-04 16:25:34 +08:00
|
|
|
|
## 单趟执行
|
2026-08-03 12:13:39 +08:00
|
|
|
|
|
2026-08-04 16:25:34 +08:00
|
|
|
|
MVP 只做**任务自带商品链接**的情形:管理员先把任务保存为 `DRAFT`,再在表格中勾选并点击
|
|
|
|
|
|
“开始采购(只创建待付款订单)”。该点击创建一次性授权,锁定商品、颜色、尺码、数量和最高总价。
|
2026-08-03 12:13:39 +08:00
|
|
|
|
|
2026-08-04 16:25:34 +08:00
|
|
|
|
采购工具领取后在同一次设备会话中完成:打开商品 → 精确选择规格 → 闸门一读 SKU 单价并校验
|
|
|
|
|
|
上限 → 设置并复核数量 → 闸门二重读规格与同价 → 进入确认页 → 闸门三校验应付总额 → 服务端
|
|
|
|
|
|
原子建立提交围栏 → 精确点击一次“提交订单” → 转待付款。中间不再回网页端等“机器选对了吗”。
|
2026-08-03 12:13:39 +08:00
|
|
|
|
|
|
|
|
|
|
价格**只在规格面板和订单确认页读**——别处的价格文本被拆成多个节点、带券后前缀、
|
|
|
|
|
|
实付价与原价混在一起,不可靠。
|
|
|
|
|
|
|
|
|
|
|
|
## 现在处于什么阶段
|
|
|
|
|
|
|
2026-08-04 16:25:34 +08:00
|
|
|
|
**Phase 1 真机取证与 Phase 2 的安全服务端工作并行。** 两端骨架、基础模型、登录和真机基线已
|
|
|
|
|
|
落地;T-111 正在冻结单趟采购契约,T-103 随后继续规格精确选择与读价,T-202 等待主审合入。
|
2026-08-03 12:13:39 +08:00
|
|
|
|
详见 [`docs/current-state.md`](docs/current-state.md)。
|
|
|
|
|
|
|
|
|
|
|
|
**生死线是 M2**:真机能按链接打开商品、精确勾选颜色分类和尺码、**读到该 SKU 单价**。
|
|
|
|
|
|
前序项目正是卡在这里,M2 不通过之前不要写页面。
|
|
|
|
|
|
|
|
|
|
|
|
## 从哪读起
|
|
|
|
|
|
|
|
|
|
|
|
| 你是 | 读这个 |
|
|
|
|
|
|
| --- | --- |
|
|
|
|
|
|
| AI coding agent | [`AGENTS.md`](AGENTS.md) → [`docs/00-ai-start-here.md`](docs/00-ai-start-here.md) |
|
|
|
|
|
|
| Claude Code | [`CLAUDE.md`](CLAUDE.md) |
|
|
|
|
|
|
| 想了解业务 | [`docs/01-vision.md`](docs/01-vision.md) → [`docs/02-requirements.md`](docs/02-requirements.md) |
|
|
|
|
|
|
| 想了解技术结构 | [`docs/04-architecture.md`](docs/04-architecture.md) |
|
|
|
|
|
|
| 全部文档 | [`docs/README.md`](docs/README.md) |
|
|
|
|
|
|
|
|
|
|
|
|
## 十一条安全边界
|
|
|
|
|
|
|
|
|
|
|
|
以下每条都必须有单元测试证明,**不得在任务中放宽**:
|
|
|
|
|
|
|
|
|
|
|
|
1. 不点击任何支付、免密支付、先用后付或扣款控件
|
|
|
|
|
|
2. **提交订单四条件**:授权未消费且服务端提交围栏已建立 + 闸门二通过 + 闸门三通过 +
|
|
|
|
|
|
控件唯一,**只点一次**;围栏后只调和,不释放、不重试
|
|
|
|
|
|
3. 订单确认页上除提交与返回外零点击
|
|
|
|
|
|
4. 规格按维度精确匹配,防前缀碰撞,找不到即停
|
|
|
|
|
|
5. 数量设置后必须读回复核
|
|
|
|
|
|
6. **三道价格闸门**,任一道读不到或不通过即停
|
2026-08-04 16:25:34 +08:00
|
|
|
|
7. **能力分层**——T-103 规格验证路径不得引用数量、确认页或下单函数;后续能力逐段取证
|
2026-08-03 12:13:39 +08:00
|
|
|
|
8. 检测到外部支付交接立即停止,不读取不保存凭据
|
|
|
|
|
|
9. 检测到验证码 / 风控 / 人脸 / 短信校验立即停止,不绕过
|
|
|
|
|
|
10. 只读非敏感摘要,不提取收货地址原文、手机号、支付凭据
|
|
|
|
|
|
11. 授权一次性,重复提交幂等;点击后无论结果一律不重试
|
|
|
|
|
|
|
|
|
|
|
|
完整说明见 [`docs/04-architecture.md`](docs/04-architecture.md) 第四节。
|
|
|
|
|
|
|
|
|
|
|
|
## 与前序项目的关系
|
|
|
|
|
|
|
|
|
|
|
|
cmbuyer 是 `cmroubao`(Go 后端 + Android AccessibilityService)与 `cmpdd`
|
|
|
|
|
|
(Python + uiautomator2)的合并重启,取各自已验证的一半:
|
|
|
|
|
|
|
|
|
|
|
|
- 保留 cmroubao 的后端任务生命周期、设备侧 API 形状、下单授权状态机、ERP 对接、管理 Web
|
|
|
|
|
|
- 保留 cmpdd 的 uiautomator2 真机自动化、按维度精确选规格、订单确认页读取、付款闸门
|
|
|
|
|
|
- 丢弃自研 Android APK 与 AccessibilityService 感知层
|
|
|
|
|
|
|
|
|
|
|
|
**前序项目是设计依据,不是事实来源。** 其中的页面判据必须在本项目用真机重新验证。
|
|
|
|
|
|
|
|
|
|
|
|
## 技术栈
|
|
|
|
|
|
|
|
|
|
|
|
| 端 | 栈 |
|
|
|
|
|
|
| --- | --- |
|
|
|
|
|
|
| web | Go 1.23+ / gin / `html/template` / SQLite / goose |
|
|
|
|
|
|
| desk | Python 3.11+ / uiautomator2 / PySide6 / Pillow |
|
|
|
|
|
|
| 设备 | Android 手机 + 拼多多 App,ADB over USB 或 WiFi |
|
|
|
|
|
|
|
|
|
|
|
|
详见 [`docs/03-tech-stack.md`](docs/03-tech-stack.md)。
|