Files
cmautobuy/docs
chengmaandClaude Opus 5 5e426cacf6 feat: 顺运宝货运单同步 (#46)
顺运宝模块此前是骨架,「同步」点了提示"待接入"。5195 个蝦皮商品已经
进系统,但货运单(真实订单)一条都没有,后面的规格匹配无从谈起。

按接口契约(docs/admin/08,从 4 份 HAR 还原)实现:配置、登录(界面
手工输验证码)、会话缓存到 SQLite、按日期范围增量同步、落 syb_orders。

shopee_sku_id 绝不被同步覆盖。它是规格匹配的结果,顺运宝那边根本没有
这个值(只给 11 位商品ID,蝦皮規格ID 是 12 位)。同步写进去就是写空,
把人工攒的匹配成果洗掉且不报错。它只出现在 INSERT 列清单里,不在
DO UPDATE SET 里;repository 层和 service 端到端各有一个测试守着。

增量从「上次同步日期当天」重拉,不是第二天。created 筛选粒度是日期而
last_synced_at 精确到秒,从第二天拉会漏掉当天晚些时候创建的单且不报错。
宁可重复拉(upsert 幂等)也不能漏。中途失败不更新 last_synced_at,
否则下次跳过这段区间,漏的单永远补不回来。

日期运算用 UTC+8,不是 UTC。审查时从 HAR 确认 created 是当地时间:
抓包于 2026-07-28T03:31:45Z(= 11:31 UTC+8),同一响应里 created 是
"2026-07-28 10:37:59";若它是 UTC 则等于 18:37 UTC+8,比抓包晚 7 小时,
订单创建于未来,不成立。用 UTC 算会在本地 00:00-08:00 把"今天"算成昨天,
当天早晨的单这轮拉不到。用 time.FixedZone 写死,不用 LoadLocation——
那要读系统 tzdata,Windows 默认没有,打包成 exe 会失败。

金额一律取 detail/listByStock 的值:08 §5.1 实测同一响应里 amtOrder
在列表接口是分、escrowAmount 却不是,单位不统一,取错差 100 倍。

迁移 v5 纯追加(syb_session、syb_sync_state、syb_orders.product_spec),
v1-v4 逐字未动,CheckSchema 覆盖新表新列。

会话有效性判断把「网络故障」和「明确未登录」的分类集中在 Client.do()
一处——网络抖一下就判定登出的话,验证码会弹个不停,还会丢掉有效会话。

测试全部用 httptest 假服务端,不打真实站点。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 11:49:13 +08:00
..
2026-08-09 11:12:51 +08:00

项目文档索引

本目录保存项目级文档。长期稳定的基线文档按子项目放在 docs/client 和 docs/admin, 实施过程和完成记录放在 docs/task,两者不得混用。

项目由两部分组成

子项目 是什么 技术栈 规则文件
Client Windows 桌面客户端,控制安卓设备在拼多多采集和下单 Python 3.10 + PyQt5 client/AGENTS.md
Admin 本地 Web 管理端,管理蝦皮商品、PDD 商品、货运单、采集采购和客户端 Go + Gin + HTML 模板 admin/AGENTS.md

两者通过三个 HTTP 接口交互,契约以 Client 侧的接口契约 为准。

两个子项目技术栈完全不同,规则不通用。 别拿 Client 的经验套 Admin,反之亦然。

新人从这里开始

我要做 先读
上手 Client Client 上手指南 + Client 术语表
上手 Admin Admin 上手指南 + Admin 术语表
搞清楚整条业务链路 Admin 需求 §3

按任务找文档

不用通读全部文档,按你要做的事挑:

Client(桌面客户端)

我要做的事 主要看 顺带看
第一次把项目跑起来 00 上手指南 —
改界面、加页面、调表格 05 界面交互规范 02 架构 §5 线程
加字段、改表、写 SQL 03 数据模型 02 架构 §7 数据所有权
对接 Admin、写 Gateway 04 接口契约 07 联调手册
写自动化、控制手机 02 架构 §9 06 质量与安全 §4
碰采购、下单相关代码 06 质量与安全 §3 01 需求 §4.2
写测试 06 质量与安全 §2 —
搞不清这功能到底要不要做 01 产品需求基线 —
打包成 exe、改文件路径 01 需求 §8.1 03 数据模型 §2

Admin(Web 管理端)

我要做的事 主要看 顺带看
第一次把项目跑起来 00 上手指南 —
改页面、加表格列 05 界面规范 02 架构 §4 模板
加字段、改表、写 SQL 03 数据模型 02 架构 §2 分层
改 Excel 导入 03 数据模型 §3.3 00 术语表 §3 upsert
改顺运宝同步 08 顺运宝接口 03 数据模型
改给 Client 的接口 04 Client 接口实现 Client 侧契约
和 Admin 联调、登记新设备 07 设备登记联调手册 Client 侧契约 §5
写测试 06 质量与安全 §2 —
搞不清这功能到底要不要做 01 产品需求基线 —

通用

我要做的事 看这里
建工单、写归档 模板 + 根目录 AGENTS.md

无论做哪一样,都必须先看一遍对应子项目的 AGENTS.md(技术栈和红线)。

Client 基线文档

文档 用途
00 上手指南 装环境、连手机、跑起来、常见报错
00 术语表 Outbox、幂等、不可逆阶段等
01 产品需求基线 目标、范围、任务类型、打包策略
02 系统架构 分层、线程模型、Worker 模板
03 数据模型 SQLite 表、状态机、pdd_data 结构
04 Admin 接口契约 两个子项目的接口边界,改动需同步 Admin
05 界面交互规范 PDD 任务页、设置页、表格交互
06 质量、安全与测试 测试策略、采购安全、发布门禁

Admin 基线文档

文档 用途
00 上手指南 装 Go、跑起来、常见报错
00 术语表 货运单、upsert、SKU 映射等
01 产品需求基线 业务链路、五个模块、状态定义
02 系统架构 分层、目录、模板组织、前端约束
03 数据模型 SQLite 表、Excel 导入规则
04 Client 接口实现 服务端怎么实现那三个接口
05 界面规范 三段式布局、五个页面、弹窗
06 质量、安全与测试 测试、Web 安全、发布门禁
07 设备登记联调手册 给 Client 开发者:怎么让新设备登记成功
08 顺运宝接口 从抓包还原的外部 ERP 契约:登录、会话、货运单列表与明细

文档标注说明

基线文档中的条目按下面三档标注,没有标注的默认是 [必须]:

标注 含义
[必须] 不许改。要改先走工单,并经用户确认
[建议] 默认这么做;有更合适的做法可以换,但要在工单里说明原因
[待定] 还没定下来。文档会给一个临时默认值,先按临时值做,别停工

文档生命周期

  • docs/client 和 docs/admin 只记录不随单个任务频繁变化的产品和技术基线。
  • 日常需求、缺陷、进度、阻塞和方案变更以 Gitea 工单为事实来源。
  • 单元任务完成后,按 AGENTS.md 归档到 docs/task/<工单号>-<简短名称>.md。
  • 基线发生实质变化时,必须先更新对应 Gitea 工单并完成评审,再在同一任务中更新这里的相关文档。
  • 接口契约改动必须两边同步:docs/client/04-* 和 docs/admin/04-* 在同一个工单里一起改。

文档和代码对不上怎么办

现在的代码还没做到文档描述的目标状态,对不上是正常的。 Client 的已知差异列在 02 架构 §3.1; Admin 目前尚未开始编码。

按下面处理,不要一发现不一致就停工:

情况 怎么办
差异已经列在差异清单里 按代码现状继续做,不用停
差异不在清单里,但只影响写法、不影响业务结果 按文档做,并在工单里记一句
差异会影响业务结果(金额、数量、状态、下单与否、数据结构) 停下来,在工单里说明,等用户确认哪边是对的

判断不了算不算"影响业务结果"时,按最后一行处理。

文档状态

Client 和 Admin 文档均为 基线草案。

Admin 尚未开始编码;顺运宝同步方式、认证方式和部分字段仍需确认, 这些事项已在对应文档中标注为 [待定],并给出了临时默认值。