Files
cmbuyer/README.md
T

97 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# cmbuyer
自动化采购系统。**采购服务**(网页端,`admin/`)负责建单与人工决策,**采购工具**
(Windows 桌面端,`client/`)驱动 Android 手机在拼多多完成选规格和下单。
> **系统只创建待付款订单,任何情况下都不自动付款。**
## 它做什么
一笔外部订单进来,采购人员需要去拼多多找到同款、选对颜色尺码、下单、把订单号抄回系统。
cmbuyer 把这个过程自动化:管理员明确“买什么、买多少、最多多少钱”并点击开始采购,系统只
创建待付款订单,**是否付款始终由人决定**。
```text
手工填链接(MVP) / Excel · ERP(V2)
│
v
采购服务(admin/,Go) 建单 · 开始采购授权 · 围栏 · 审计
│ HTTP
v
采购工具(client/,Python) 领任务 · 跑流程 · 回传
│ ADB(USB / WiFi)
v
Android 手机(拼多多 App)
```
## 单趟执行
MVP 只做**任务自带商品链接**的情形:管理员先把任务保存为 `DRAFT`,再在表格中勾选并点击
“开始采购(只创建待付款订单)”。该点击创建一次性授权,锁定商品、颜色、尺码、数量和最高总价。
采购工具领取后在同一次设备会话中完成:打开商品 → 精确选择规格 → 闸门一读 SKU 单价并校验
上限 → 设置并复核数量 → 闸门二读取顶部总额 → 在同一最终面板读取闸门三最终控件金额 → 服务端
原子建立提交围栏 → 精确点击一次“提交订单” → 转待付款。中间不再回网页端等“机器选对了吗”。
价格只从拼多多 `8.17.0` 已取证合并式最终提交面板的两个独立角色读取:顶部金额承担 Gate1/Gate2,
结构化精确文本 `提交订单 ¥{金额}` 中的金额承担 Gate3;后者必须与 Gate2 严格相等且不能回流兜底。
## 现在处于什么阶段
**Phase 1 真机取证与 Phase 2 的安全服务端工作并行。** 两端骨架、基础模型、登录和真机基线已
落地;T-111 正在冻结单趟采购契约,T-103 随后继续规格精确选择与读价,T-202 等待主审合入。
详见 [`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. **三道价格闸门**,任一道读不到或不通过即停
7. **能力分层**——T-103 规格验证路径不得引用数量、最终提交面板或下单函数;后续能力逐段取证
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)。