Files
raisfast/docs/ecommerce-roadmap.md
T

286 lines
8.4 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.
# 电商系统现状与路线图
> 最后更新:2026-05-18
## 一、已实现能力
### 数据表(14 张)
| 表 | 说明 | 状态 |
|---|------|------|
| `products` | 商品主表(含变体标记、库存、成本价、售价) | ✅ |
| `product_variants` | SKU/变体(独立价格、库存、属性) | ✅ |
| `categories` | 分类 | ✅ |
| `cart_items` | 购物车(支持变体级唯一) | ✅ |
| `orders` | 订单(含税、优惠券ID、地址ID) | ✅ |
| `order_items` | 订单明细(含变体、SKU、税额) | ✅ |
| `user_addresses` | 地址簿(收货/账单、默认地址) | ✅ |
| `payment_channels` | 支付渠道配置 | ✅ |
| `payment_orders` | 支付单 | ✅ |
| `payment_transactions` | 支付流水 | ✅ |
| `payment_refunds` | 退款单 | ✅ |
| `wallets` | 钱包 | ✅ |
| `wallet_transactions` | 钱包流水 | ✅ |
| `wallet_outbox` | 钱包事件发件箱 | ✅ |
### 功能覆盖
| 能力 | 说明 |
|------|------|
| 商品管理 | 多类型(custom/download)、多规格变体、分类、排序、上下架 |
| 购物车 | 变体级加购、数量管理、清空、一键结算 |
| 订单流程 | 完整生命周期(pending → paid → shipped → completed / refunded |
| 支付 | 多渠道、钱包余额、第三方支付、退款 |
| 地址簿 | 收货/账单地址、默认地址、租户隔离 |
---
## 二、覆盖度评估
### 适用场景
-**虚拟商品电商**(充值卡、课程、数字下载)
-**小型 B2C**(简单实物,固定运费,无促销)
- ⚠️ **中型 B2C**(服装、3C)— 核心链路有,运营能力缺
### 关键缺失
| 缺失 | 影响程度 | 说明 |
|------|---------|------|
| **运费模板** | 🔴 高 | `orders.shipping_amount` 只是字段,无按重量/地区/件数计算的运费模板 |
| **优惠券/促销** | 🔴 高 | `orders.coupon_id` 有字段无表,无法满减、折扣码、限时促销 |
| **发货/物流** | 🔴 高 | `orders.tracking_no` 只是文本,无多包裹发货、物流商对接、物流追踪 |
| **退货/换货** | 🔴 高 | 退款有,退货流程无(买家寄回→商家验货→退款/换货) |
| **库存锁定** | 🔴 高 | `stock` 只是数字,下单时不预扣/锁定,并发超卖风险 |
| **评价系统** | 🟡 中 | 无商品评分/评价/追评,影响 SEO 和转化率 |
| **商品多分类** | 🟡 中 | products 只有单个 `category_id`,无法一品多类 |
| **商品图片库** | 🟡 中 | `image_ids` 是 JSON 字符串,无独立图片表(排序、裁剪、标签) |
| **税率配置** | 🟢 低 | `tax_amount` 有字段但无税率配置表,无法按地区/品类自动计算 |
| **秒杀/拼团** | 🟢 低 | 有 `min_purchase`/`max_purchase` 字段但无活动/库存抢占机制 |
| **供应商** | 🟢 低 | 无供应商管理,无法多供应商入驻 |
| **售后工单** | 🟢 低 | 无售后沟通记录,退款/退货缺乏买卖家交互流程 |
---
## 三、待建表规划
### Phase 2:核心运营能力(优先级 🔴)
#### 3.1 运费模板
```sql
-- 运费模板
shipping_methods (
id, document_id, tenant_id,
name, -- "顺丰标快"
provider, -- "sf" / "yto" / "sto" / "custom"
type, -- "by_weight" / "by_piece" / "fixed" / "free"
base_fee, -- 首重/首件费用(分)
base_unit, -- 首重克数 / 首件数
additional_fee, -- 续重/续件费用(分)
additional_unit, -- 续重克数 / 续件数
free_threshold, -- 满额包邮(分),NULL 表示不包邮
is_active,
sort_order,
created_at, updated_at
)
-- 运费区域规则(覆盖偏远地区加价等)
shipping_rates (
id, document_id, tenant_id,
shipping_method_id,
region_type, -- "province" / "city" / "district"
region_code, -- "XZ" / "540000"
base_fee, -- 覆盖模板默认值
additional_fee,
created_at
)
```
#### 3.2 优惠券
```sql
coupons (
id, document_id, tenant_id,
code, -- "SUMMER2026"
title, -- "夏季满减"
type, -- "percent" / "fixed" / "shipping_free"
value, -- 折扣百分比 / 固定金额(分)
min_order_amount, -- 最低订单金额(分)
max_discount, -- 最大优惠上限(分),用于 percent 类型
total_count, -- 发放总量
used_count, -- 已使用量
per_user_limit, -- 每人限领
starts_at, expires_at,
is_active,
created_at, updated_at
)
coupon_usages (
id, tenant_id,
coupon_id, user_id, order_id,
used_at
)
```
#### 3.3 发货/物流
```sql
shipments (
id, document_id, tenant_id,
order_id,
tracking_no,
carrier, -- "sf" / "yto" / "jd"
status, -- "pending" / "shipped" / "delivered"
shipped_at, delivered_at,
created_at, updated_at
)
shipment_items (
id, shipment_id, order_item_id,
quantity
)
-- 物流轨迹(可选,对接快递100等)
shipment_tracks (
id, shipment_id,
location, description,
tracked_at
)
```
#### 3.4 退货/换货
```sql
order_returns (
id, document_id, tenant_id,
order_id, user_id,
type, -- "refund" / "exchange" / "refund_and_return"
reason, -- "defective" / "wrong_item" / "not_as_described" / "other"
description,
status, -- "requested" / "approved" / "rejected" / "shipping_back" / "received" / "completed" / "cancelled"
refund_amount, -- 退款金额(分)
tracking_no, -- 买家退货物流单号
carrier,
admin_remark,
requested_at, approved_at, received_at, completed_at,
created_at, updated_at
)
order_return_items (
id, order_return_id, order_item_id,
quantity,
reason
)
order_return_photos (
id, order_return_id,
url, sort_order
)
```
#### 3.5 库存锁定
不需要新表,在现有流程中增加:
- `product_variants.stock` 下单时预扣(`stock - locked`
- 新增 `stock_locked` 字段到 `product_variants``products`
- 订单取消/超时时释放锁定
- 订单完成时确认扣减
```sql
-- products 和 product_variants 各加两列
ALTER TABLE products ADD COLUMN stock_locked INTEGER NOT NULL DEFAULT 0;
ALTER TABLE product_variants ADD COLUMN stock_locked INTEGER NOT NULL DEFAULT 0;
-- 可用库存 = stock - stock_locked
```
### Phase 3:增强运营能力(优先级 🟡)
#### 3.6 评价系统
```sql
product_reviews (
id, document_id, tenant_id,
product_id, variant_id, user_id, order_item_id,
rating, -- 1-5
title,
content,
images, -- JSON array of URLs
is_anonymous,
status, -- "pending" / "approved" / "rejected" / "hidden"
admin_reply,
replied_at,
created_at, updated_at
)
```
#### 3.7 商品多分类
```sql
-- junction table
product_category_junction (
product_id,
category_id,
sort_order,
PRIMARY KEY (product_id, category_id)
)
```
#### 3.8 商品图片库
```sql
product_images (
id, document_id, tenant_id,
product_id,
url,
alt,
sort_order,
is_cover,
created_at
)
```
#### 3.9 税率配置
```sql
tax_rates (
id, document_id, tenant_id,
name, -- "中国增值税"
rate, -- 0.13 (百分比,存 TEXT 精度)
region_code, -- 适用地区
product_type, -- 适用商品类型,NULL 表示全部
is_active,
created_at, updated_at
)
```
### Phase 4:营销与高级能力(优先级 🟢)
- 秒杀/限时购(`flash_sales` + `flash_sale_items`
- 拼团(`group_buys` + `group_buy_participants`
- 供应商入驻(`suppliers` + 供应商商品关联)
- 售后工单(`support_tickets` + `support_messages`
- 商品收藏/浏览历史
- 积分系统
---
## 四、实施建议
### 优先级排序
```
Phase 2.5 库存锁定 → Phase 2.1 运费模板 → Phase 2.2 优惠券
→ Phase 2.3 发货物流 → Phase 2.4 退货换货 → Phase 3 按需
```
### 原则
1. **只建表不写死逻辑** — 表结构先行,业务逻辑渐进
2. **所有金额存分**`INTEGER`,展示时 / 100
3. **无 ON DELETE CASCADE** — 应用层处理级联
4. **decimal 存 TEXT** — SQLite 下保持精度
5. **variant_id 可选** — 无变体商品 `variant_id = NULL`,有变体商品必须指定
6. **三套 schema 同步** — SQLite / PG / MySQL 结构对齐