# 即时配送小程序 - 数据库设计

**表前缀**：`ot_`（ordertake 即时配送）

**数据库详情（字段级、多租户、站点权限、审计）**：见同目录 **`database_schema_detail.md`** 与 **`database_schema.html`**。

---

## 0. 全库通用字段（摘要）

业务主表建议统一：`tenant_id`、`agent_id`（可选）、`station_id`（可选）、`created_by`、`updated_by`、`created_at`、`updated_at`、**`deleted_at`（伪删除）**、`version`（乐观锁，可选）。  
索引建议：`(tenant_id, deleted_at)`、`(tenant_id, station_id, deleted_at)`。

**新增支撑表（多租户与站点权限）**：`ot_tenant`、`ot_agent_node`、`ot_admin_user`、`ot_admin_role`、`ot_admin_permission`、`ot_admin_role_permission`、`ot_admin_user_role`、`ot_admin_user_station`、`ot_data_change_log`、`ot_operation_log`。  
详见 `database_schema_detail.md`。

---

## 1. 核心表清单

### 1.1 订单相关（5张）

| 表名 | 说明 |
|------|------|
| ot_order | 订单主表 |
| ot_order_address | 订单地址（发件/收件） |
| ot_order_item | 订单物品明细 |
| ot_order_trace | 订单轨迹 |

### 1.2 配送员相关（4张）

| 表名 | 说明 |
|------|------|
| ot_courier | 配送员档案 |
| ot_courier_account | 配送员账户 |
| ot_courier_location | 骑手实时位置 |
| ot_courier_trace | 骑手配送轨迹 |

### 1.3 用户与会员（6张）

| 表名 | 说明 |
|------|------|
| ot_user | 用户表 |
| ot_user_member | 用户会员信息 |
| ot_member_level | 会员等级配置 |
| ot_point_rule | 积分规则 |
| ot_point_log | 积分变动日志 |
| ot_address | 用户地址簿 |

### 1.4 钱包与财务（4张）

| 表名 | 说明 |
|------|------|
| ot_wallet | 用户/骑手钱包 |
| ot_wallet_log | 钱包流水 |
| ot_withdraw | 提现记录 |
| ot_recharge | 充值记录 |

### 1.5 红包与优惠券（4张）

| 表名 | 说明 |
|------|------|
| ot_coupon | 优惠券/红包模板 |
| ot_user_coupon | 用户优惠券/红包 |
| ot_coupon_grant | 红包发放记录 |
| ot_exchange_code | 兑换码 |

### 1.6 积分商城（3张）

| 表名 | 说明 |
|------|------|
| ot_mall_goods | 积分商城商品 |
| ot_mall_order | 积分商城订单 |
| ot_mall_address | 商城收货地址 |

### 1.7 配置与辅助（6张）

| 表名 | 说明 |
|------|------|
| ot_category | 服务分类 |
| ot_fare_rule | 运费规则 |
| ot_region | 配送区域 |
| ot_announcement | 公告 |
| ot_feedback | 用户反馈 |
| ot_complaint | 投诉 |

---

## 2. 核心表结构

### 2.1 ot_order（订单主表）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| order_no | varchar(32) UK | 订单号 |
| user_id | bigint FK | 下单用户 |
| courier_id | bigint FK | 配送员 |
| category_id | bigint FK | 分类ID |
| type | tinyint | 1:帮我送 2:帮我买 3:帮我办 |
| status | smallint | 订单状态 |
| sender_name | varchar(32) | 发件人 |
| sender_phone | varchar(20) | 发件电话 |
| sender_address | varchar(256) | 发件地址 |
| sender_lat | decimal(10,6) | 发件纬度 |
| sender_lng | decimal(10,6) | 发件经度 |
| receiver_name | varchar(32) | 收件人 |
| receiver_phone | varchar(20) | 收件电话 |
| receiver_address | varchar(256) | 收件地址 |
| receiver_lat | decimal(10,6) | 收件纬度 |
| receiver_lng | decimal(10,6) | 收件经度 |
| goods_type | tinyint | 物品类型 |
| goods_weight | decimal(8,2) | 物品重量 |
| goods_remark | varchar(256) | 物品备注 |
| is_insured | tinyint | 是否保价 |
| insured_amount | decimal(10,2) | 保价金额 |
| distance_km | decimal(8,2) | 配送距离 |
| delivery_fee | decimal(8,2) | 配送费 |
| insurance_fee | decimal(8,2) | 保价费 |
| coupon_id | bigint FK | 优惠券ID |
| coupon_amount | decimal(8,2) | 优惠券金额 |
| redpacket_id | bigint FK | 红包ID |
| redpacket_amount | decimal(8,2) | 红包金额 |
| total_amount | decimal(8,2) | 总费用 |
| pay_status | tinyint | 支付状态 |
| pay_time | datetime | 支付时间 |
| pick_time | datetime | 取件时间 |
| deliver_time | datetime | 送达时间 |
| confirm_time | datetime | 确认时间 |
| cancel_time | datetime | 取消时间 |
| cancel_reason | varchar(256) | 取消原因 |
| create_time | datetime | |
| update_time | datetime | |

### 2.2 ot_courier（配送员档案）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| user_id | bigint FK | 用户ID |
| name | varchar(32) | 姓名 |
| phone | varchar(20) | 电话 |
| avatar | varchar(256) | 头像 |
| status | tinyint | 0:休息 1:接单中 2:配送中 |
| district | varchar(64) | 服务区域 |
| total_orders | int | 总订单数 |
| finish_orders | int | 完成订单数 |
| total_income | decimal(12,2) | 累计收入 |
| rating | decimal(3,2) | 评分 |
| verify_status | tinyint | 审核状态 |
| create_time | datetime | |

### 2.3 ot_courier_location（骑手实时位置）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| courier_id | bigint FK | |
| lat | decimal(10,6) | 纬度 |
| lng | decimal(10,6) | 经度 |
| address | varchar(256) | 地址 |
| battery | int | 电量(0-100) |
| is_online | tinyint | 是否在线 |
| update_time | datetime | |

### 2.4 ot_courier_trace（骑手配送轨迹）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| courier_id | bigint FK | |
| order_id | bigint FK | 配送订单 |
| lat | decimal(10,6) | 纬度 |
| lng | decimal(10,6) | 经度 |
| create_time | datetime | |

### 2.5 ot_user_member（用户会员信息）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| user_id | bigint FK | 用户ID |
| level_id | bigint FK | 等级ID |
| growth_value | int | 成长值 |
| total_points | int | 累计积分 |
| available_points | int | 可用积分 |
| frozen_points | int | 冻结积分 |
| total_consume | decimal(12,2) | 累计消费 |
| join_time | datetime | 加入时间 |
| level_expire_time | datetime | 等级到期时间 |

### 2.6 ot_member_level（会员等级配置）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| name | varchar(32) | 等级名称 |
| icon | varchar(128) | 等级图标 |
| growth_min | int | 成长值下限 |
| growth_max | int | 成长值上限 |
| point_rate | decimal(4,2) | 积分倍率 |
| discount | decimal(4,2) | 折扣率(0.85=85折) |
| benefits | text | 权益说明JSON |
| sort | int | 排序 |
| status | tinyint | 状态 |
| create_time | datetime | |

### 2.7 ot_point_rule（积分规则）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| type | varchar(32) | 规则类型 |
| name | varchar(64) | 规则名称 |
| event | varchar(32) | 触发事件 |
| points | int | 积分值 |
| points_type | tinyint | 1:获得 2:消耗 |
| condition | json | 条件配置 |
| limit_times | int | 限制次数/天 |
| status | tinyint | 状态 |
| create_time | datetime | |

### 2.8 ot_coupon（优惠券/红包模板）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| name | varchar(64) | 名称 |
| type | tinyint | 1:优惠券 2:红包 |
| subtype | tinyint | 1:满减 2:随机 3:新人 4:节日 |
| amount | decimal(8,2) | 面额/随机最大值 |
| min_amount | decimal(8,2) | 满减门槛 |
| max_deduct | decimal(8,2) | 最高抵扣 |
| total_count | int | 发放总量 |
| remain_count | int | 剩余数量 |
| per_limit | int | 每人限领 |
| start_time | datetime | 开始时间 |
| end_time | datetime | 结束时间 |
| valid_days | int | 领取后有效天数 |
| apply_range | varchar(128) | 适用范围 |
| status | tinyint | 状态 |
| create_time | datetime | |

### 2.9 ot_user_coupon（用户优惠券/红包）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| user_id | bigint FK | 用户ID |
| coupon_id | bigint FK | 优惠券ID |
| order_id | bigint FK | 使用订单(可为空) |
| type | tinyint | 1:优惠券 2:红包 |
| name | varchar(64) | 名称 |
| amount | decimal(8,2) | 面额 |
| min_amount | decimal(8,2) | 满减门槛 |
| status | tinyint | 1:未使用 2:已使用 3:已过期 |
| receive_time | datetime | 领取时间 |
| use_time | datetime | 使用时间 |
| expire_time | datetime | 过期时间 |

### 2.10 ot_coupon_grant（红包发放记录）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| coupon_id | bigint FK | 优惠券ID |
| user_id | bigint FK | 用户ID(可为空批量) |
| grant_type | tinyint | 1:主动 2:批量 3:兑换码 4:任务 5:积分 |
| grant_no | varchar(64) | 发放批次号 |
| code | varchar(32) | 兑换码 |
| code_status | tinyint | 兑换码状态 |
| grant_count | int | 发放数量 |
| use_count | int | 使用数量 |
| status | tinyint | 状态 |
| create_time | datetime | |

### 2.11 ot_mall_goods（积分商城商品）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| name | varchar(64) | 商品名称 |
| type | tinyint | 1:优惠券 2:实物 3:红包 |
| image | varchar(256) | 商品图片 |
| points | int | 所需积分 |
| stock | int | 库存 |
| sold_count | int | 已兑换数 |
| cost | decimal(8,2) | 成本价 |
| link_coupon_id | bigint FK | 关联优惠券ID |
| link_redpacket_amount | decimal(8,2) | 关联红包金额 |
| description | text | 商品描述 |
| status | tinyint | 状态 |
| sort | int | 排序 |
| create_time | datetime | |

### 2.12 ot_mall_order（积分商城订单）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| order_no | varchar(32) UK | 订单号 |
| user_id | bigint FK | 用户ID |
| goods_id | bigint FK | 商品ID |
| points | int | 消耗积分 |
| coupon_id | bigint FK | 获得优惠券ID |
| status | tinyint | 1:待发货 2:已发货 3:已完成 |
| address_id | bigint FK | 收货地址 |
| express_no | varchar(64) | 快递单号 |
| express_company | varchar(32) | 快递公司 |
| ship_time | datetime | 发货时间 |
| receive_time | datetime | 收货时间 |
| create_time | datetime | |

### 2.13 ot_wallet（钱包）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| user_id | bigint FK | 用户/骑手ID |
| type | tinyint | 1:用户 2:骑手 |
| balance | decimal(12,2) | 余额 |
| freeze_amount | decimal(12,2) | 冻结金额 |
| total_income | decimal(12,2) | 累计收入 |
| total_expense | decimal(12,2) | 累计支出 |
| create_time | datetime | |

### 2.14 ot_withdraw（提现记录）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | |
| withdraw_no | varchar(32) UK | 提现单号 |
| user_id | bigint FK | 用户/骑手ID |
| wallet_id | bigint FK | 钱包ID |
| amount | decimal(10,2) | 提现金额 |
| fee | decimal(10,2) | 手续费 |
| real_amount | decimal(10,2) | 实到金额 |
| type | tinyint | 1:微信 2:银行卡 |
| account | varchar(64) | 账号 |
| status | tinyint | 1:待审核 2:已通过 3:已拒绝 4:已打款 |
| remark | varchar(256) | 备注 |
| audit_time | datetime | 审核时间 |
| audit_remark | varchar(256) | 审核备注 |
| create_time | datetime | |

---

## 3. 索引设计

| 表名 | 索引字段 | 类型 |
|------|---------|------|
| ot_order | order_no | UNIQUE |
| ot_order | user_id, status |
| ot_order | courier_id, status |
| ot_order | create_time |
| ot_courier | user_id | UNIQUE |
| ot_courier | phone | UNIQUE |
| ot_courier_location | courier_id | UNIQUE |
| ot_user_member | user_id | UNIQUE |
| ot_coupon | status |
| ot_user_coupon | user_id, status |
| ot_user_coupon | coupon_id |
| ot_mall_order | order_no | UNIQUE |
| ot_mall_order | user_id |
| ot_wallet | user_id, type | UNIQUE |
| ot_withdraw | withdraw_no | UNIQUE |

---

## 4. ER 关系

```
ot_user ──> ot_user_member ──> ot_member_level
ot_user ──> ot_order (1:N)
ot_user ──> ot_wallet
ot_user ──> ot_address

ot_order ──> ot_order_address (发件)
ot_order ──> ot_order_address (收件)
ot_order ──> ot_user_coupon (红包)
ot_order ──> ot_courier

ot_courier ──> ot_courier_account
ot_courier ──> ot_courier_location
ot_courier ──> ot_courier_trace

ot_coupon ──> ot_user_coupon
ot_coupon ──> ot_coupon_grant
ot_mall_goods ──> ot_mall_order
```

---

## 5. 订单状态机

| 状态码 | 名称 | 说明 |
|--------|------|------|
| 10 | 待支付 | 等待付款 |
| 20 | 待接单 | 等待骑手接单 |
| 30 | 已接单 | 骑手已接单，待取货 |
| 40 | 配送中 | 骑手取件配送中 |
| 50 | 已送达 | 已送达，待确认 |
| 60 | 已完成 | 订单完结 |
| 70 | 已评价 | 用户已评价 |
| 90 | 已取消 | 订单取消 |

---

**文档版本**：v4.0  
**创建日期**：2026-04-01  
**更新**：关联数据库详情页；补充多租户/站点权限/审计/软删除约定
