chengmaandClaude Opus 5 d2de7331bb fix: 修复迁移被原地改写导致老库缺表 (#20)
#16 原地改写了 migration v1 而不是新增一条。Migrate 只在
user_version < 版本数时才跑,老库版本号已越过 v1,改写后的语句
永远不会重跑——程序拿着对不上的库静默启动,点到 PDD 商品页才 500。

修法:v1 逐字恢复成 7ad82b7 的原样,#16 的结构改动全部挪进 v3。
全新库也走 v1→v2→v3,与老库升级跑的是同一份 v3 代码,
不需要维护两条路径。

v3 必须认两种 user_version=2:#16 的原地改写让这个版本号对应
两种不同结构(原始 v1 建的没有 pdd_products,改写后的 v1 建的已经有)。
所以 v3 每一步先查 PRAGMA table_info / sqlite_master 看实际结构
再决定做不做,只有版本号推进是无条件的;已是最终结构的库
只推版本号,日志也照实说,不谎称"新增 pdd_products"。

旧 sku_mappings 数据丢弃并打日志:新主键需要 pdd_option_key,
那是 Go 的 OptionKey() 用 json.Marshal 算的,SQL 复现不了。
硬凑一个键出来,轻则映射静默失效,重则撞上别的规格静默买错东西——
后者正是 #16 存在的全部意义。

collecting 映射成 pending:原样保留会让 MarkCollecting 永远不成功,
那个商品再也建不了采集任务,界面上表现为按钮永远置灰且无法解开。

表重建按 SQLite 官方 12 步顺序:先建 _new 再 RENAME。
实测 ALTER TABLE RENAME TO 会自动重写别的表里指向它的外键子句,
先 RENAME 让位会把 shopee_skus 的外键改成指向一张马上被删的表。

另加两道闸:启动时 CheckSchema 缺表即拒绝启动(不是警告后继续);
admin/AGENTS.md 写死"migrations 只追加、不得修改已发布条目"。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 12:23:24 +08:00
2026-08-06 15:51:05 +08:00

项目文档索引

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

项目由两部分组成

子项目 是什么 技术栈 规则文件
Client Windows 桌面客户端,控制安卓设备在拼多多采集和下单 Python 3.10 + PyQt5 client/AGENTS.md
Admin 本地 Web 管理端,管理商品、货运单、采购任务和客户端 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
改给 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 开发者:怎么让新设备登记成功

文档标注说明

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

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

文档生命周期

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

S
Description
No description provided
Readme
96 KiB
Languages
Markdown 100%