Files
vmall/openspec/MIGRATION-PLAN.md
T

79 lines
5.0 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.
# Tigshop → VMall Migration Plan
> 临时跟踪文档:每实现并验证一个 change(tasks 全勾、`openspec archive` 完成、`openspec validate --all --strict` 全绿)后,更新本文档状态表。**8 个 change 全部归档后删除本文件。**
来源:对 `/Users/chengdzhang/github/jamyun/tigshop`(Admin + Uniapp + PHP 后端)的只读盘点。迁移的是领域模型与信息架构,不是代码。
## 明确排除(不迁移)
- 微信小程序专属能力(wx.login / requestPayment / 订阅消息 / 分享 / 企业客服)
- 供应商(vendor)三层体系 —— 架构级决策,非功能迁移
- 分销(tigshop 自身半成品)、完整拖拽装修器、电子卡密/虚拟商品、直播、打印、内置 IM
## 交接说明(handoff)
**进度**:Wave 1 完成(P6/P0/P2/P1 已归档)。剩 P3、P5、P7(Wave 2)、P4(Wave 3)。
**下一个建议**:P3 `add-wallet-settlement`(P0 已归档,硬依赖解除)。
**工作流约定(用户明确要求)**:一次只实现一个 change,完成后停下来等人工 review;可以提议下一个,但不要自动连续实施,除非明确要求连续执行。
**实施要点**:
- 下一个可用迁移号:`0019`(0016 aftersales / 0017 freight / 0018 reviews 已占用)。各 proposal tasks.md 里的迁移号是提议时抢占的(P3 写 0018/0019、P5/P7 写 0016/0017),**实施时以实际顺序重编号**。
- 文档与索引已就位:改代码前先查 `docs/code_index/index.md`;`docs/backend-guidelines.md` 有并发/状态机模式与 PG 陷阱;`docs/design-guidelines.md` 管 UI;增删文件要同步索引。
- 前端派发模式已验证:我(主线)做迁移+共享契约+Rust 模块+集成测试,然后按 app 并行派三个子任务(mall/shop-admin/admin)写页面,主线统一构建+smoke+归档。
**踩过的坑(别再踩)**:
- `SUM(bigint)` 在 Postgres 返回 NUMERIC,解码 i64 前必须 `COALESCE(SUM(x),0)::bigint`(售后曾因此 500)。
- sqlx 运行时解码:`cargo check` 绿不代表 SQL 对——加列要同步所有列清单常量与 INSERT 的列数/参数数。
- 外币订单退款:客户无该币种账户会失败,用 `account::service::ensure_monetary_account` 懒建(已存在)。
- 共享契约改动要同时改 interface 和 createApi 实现两处;mall 还要 mock 实现 + LIVE_PICKS 精确挑方法(漏挑会静默落回 mock)。
- dev server:`pnpm build` 后要 `rm -rf apps/<app>/.nuxt` 再 dev;dev 绑 IPv6 localhost;页面卡 Loading 无报错=旧 tab 拿旧 chunk hash,重启+开新 tab。
- 测试库迁移校验和冲突(改了已应用的本地迁移):`DROP SCHEMA public CASCADE; CREATE SCHEMA public;`(vmall_test)。
## 依赖图
```
P6 content-admin-ui ──┐(无依赖,热身)
P1 product-reviews ───┤(无依赖,可并行)
P5 onboarding ────────┤(无依赖,可并行)
P7 membership ────────┤(无依赖,可并行)
│
P0 aftersale ─────────┤
│ │
├─→ P3 wallet-settlement(结算需扣减退款,硬依赖 P0 的 aftersales 表)
│ │
└────────┴─→ P4 mobile-h5(售后/钱包页面消费 P0/P3 API;核心链路只依赖现有 API,可与 P3 并行起步)
P2 freight ───────────┘(改 checkout/order totals,与 P0 同触 order 模块,建议与 P0 串行)
```
## 推荐实施波次
| 波次 | Changes | 说明 |
|---|---|---|
| Wave 1 | P6 → P0 → P2 → P1 | P6 热身(纯前端);P0/P2 都动 order 模块故串行;P1 任意位置插入 |
| Wave 2 | P3、P5、P7 | P3 必须在 P0 归档后启动;P5/P7 随时可插 |
| Wave 3 | P4 | 移动 H5 收尾,消费前面所有 API;P0/P3 未完成时对应页面降级 Coming soon |
## 状态跟踪
| # | Change | 依赖 | 状态 | 归档日期 |
|---|---|---|---|---|
| P0 | `add-aftersale-refunds` | — | archived | 2026-09-23 |
| P1 | `add-product-reviews` | — | archived | 2026-09-24 |
| P2 | `add-freight-templates` | —(与 P0 串行) | archived | 2026-09-24 |
| P3 | `add-wallet-settlement` | P0 | proposed | — |
| P4 | `add-mobile-h5` | P0、P3(软) | proposed | — |
| P5 | `add-merchant-onboarding` | — | proposed | — |
| P6 | `add-content-admin-ui` | — | archived | 2026-09-23 |
| P7 | `add-membership-messaging` | — | proposed | — |
状态取值:`proposed` → `implementing` → `verified`(tasks 全勾 + 测试/构建/smoke 通过)→ `archived`。
## 更新规则
1. 开始实现某 change:状态改 `implementing`。
2. 实现并验证完成(含 `cargo test -p vmall-api` 连跑两次全绿、受影响前端 build、浏览器 smoke):状态改 `verified`。
3. `openspec archive <name> --yes` 且 `openspec validate --all --strict` 全绿:状态改 `archived`,填归档日期。
4. 实施中发现新的跨 change 依赖:先更新本文件依赖图,再继续。
5. 全部 `archived` 后:删除本文件。