# 订单系统表结构说明

## 一、新增表

### 1. 购物车表（store_cart）

```sql
CREATE TABLE `store_cart` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `table_id` int(11) NOT NULL COMMENT '桌号ID',
  `store_id` int(11) NOT NULL COMMENT '门店ID',
  `cuisine_id` int(11) NOT NULL COMMENT '菜品ID',
  `cuisine_name` varchar(200) NOT NULL COMMENT '菜品名称',
  `cuisine_image` varchar(500) DEFAULT NULL COMMENT '菜品图片',
  `unit_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '单价',
  `quantity` int(11) NOT NULL DEFAULT '1' COMMENT '数量',
  `subtotal_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '小计金额',
  `add_user_id` int(11) DEFAULT NULL COMMENT '添加该菜品的用户ID',
  `add_user_phone` varchar(20) DEFAULT NULL COMMENT '添加该菜品的用户手机号',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_user_id` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `updated_user_id` int(11) DEFAULT NULL COMMENT '修改人ID',
  PRIMARY KEY (`id`),
  KEY `idx_table_id` (`table_id`),
  KEY `idx_store_id` (`store_id`),
  KEY `idx_cuisine_id` (`cuisine_id`),
  KEY `idx_add_user_id` (`add_user_id`),
  KEY `idx_created_time` (`created_time`),
  KEY `idx_table_delete` (`table_id`, `delete_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='购物车表';
```

**说明：** 用于持久化购物车数据，Redis作为缓存层，避免Redis宕机导致数据丢失。

---

### 2. 优惠券使用记录表（store_coupon_usage）

```sql
CREATE TABLE `store_coupon_usage` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `table_id` int(11) NOT NULL COMMENT '桌号ID',
  `store_id` int(11) NOT NULL COMMENT '门店ID',
  `order_id` int(11) DEFAULT NULL COMMENT '订单ID',
  `coupon_id` int(11) NOT NULL COMMENT '优惠券ID',
  `coupon_name` varchar(200) DEFAULT NULL COMMENT '优惠券名称',
  `discount_amount` decimal(10,2) DEFAULT '0.00' COMMENT '优惠金额',
  `usage_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '使用状态(0:已标记使用, 1:已下单, 2:已支付, 3:已取消)',
  `from_table_id` int(11) DEFAULT NULL COMMENT '换桌前的桌号ID',
  `migrate_time` datetime DEFAULT NULL COMMENT '换桌迁移时间',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_user_id` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `updated_user_id` int(11) DEFAULT NULL COMMENT '修改人ID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_table_coupon` (`table_id`, `coupon_id`, `delete_flag`),
  KEY `idx_table_id` (`table_id`),
  KEY `idx_store_id` (`store_id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_coupon_id` (`coupon_id`),
  KEY `idx_usage_status` (`usage_status`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券使用记录表';
```

**说明：** 记录每张桌子的优惠券使用情况，支持换桌场景的优惠券迁移。

---

### 3. 订单锁定记录表（store_order_lock）

```sql
CREATE TABLE `store_order_lock` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `table_id` int(11) DEFAULT NULL COMMENT '桌号ID',
  `order_id` int(11) DEFAULT NULL COMMENT '订单ID',
  `lock_type` tinyint(4) NOT NULL COMMENT '锁定类型(1:下单锁定, 2:结算锁定)',
  `lock_user_id` int(11) NOT NULL COMMENT '锁定用户ID',
  `lock_user_phone` varchar(20) DEFAULT NULL COMMENT '锁定用户手机号',
  `lock_expire_time` datetime NOT NULL COMMENT '锁定过期时间',
  `lock_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '锁定状态(0:已释放, 1:锁定中)',
  `release_time` datetime DEFAULT NULL COMMENT '释放时间',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  KEY `idx_table_id` (`table_id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_lock_type` (`lock_type`),
  KEY `idx_lock_status` (`lock_status`),
  KEY `idx_lock_expire_time` (`lock_expire_time`),
  KEY `idx_table_lock` (`table_id`, `lock_type`, `lock_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单锁定记录表';
```

**说明：** 记录下单和结算时的锁定信息，便于排查问题和数据恢复。

---

## 二、优化后的表

### 4. 订单表（store_order）

**基础字段：**
```sql
CREATE TABLE `store_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `order_no` varchar(64) NOT NULL COMMENT '订单号',
  `store_id` int(11) NOT NULL COMMENT '门店ID',
  `table_id` int(11) NOT NULL COMMENT '桌号ID',
  `table_number` varchar(50) DEFAULT NULL COMMENT '桌号',
  `diner_count` int(11) DEFAULT NULL COMMENT '就餐人数',
  `pay_user_id` int(11) DEFAULT NULL COMMENT '支付用户ID',
  `pay_user_phone` varchar(20) DEFAULT NULL COMMENT '支付用户手机号',
  `contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
  `tableware_fee` decimal(10,2) DEFAULT '0.00' COMMENT '餐具费',
  `order_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态(0:待支付, 1:已支付, 2:已取消, 3:已完成)',
  `total_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单总金额',
  `coupon_id` int(11) DEFAULT NULL COMMENT '优惠券ID',
  `discount_amount` decimal(10,2) DEFAULT '0.00' COMMENT '优惠金额',
  `pay_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '实付金额',
  `pay_type` tinyint(4) DEFAULT NULL COMMENT '支付方式(1:微信, 2:支付宝, 3:现金)',
  `pay_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付状态(0:未支付, 1:已支付, 2:已退款)',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `pay_trade_no` varchar(128) DEFAULT NULL COMMENT '支付交易号',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_user_id` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `updated_user_id` int(11) DEFAULT NULL COMMENT '修改人ID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_order_no` (`order_no`),
  KEY `idx_store_id` (`store_id`),
  KEY `idx_table_id` (`table_id`),
  KEY `idx_pay_user_id` (`pay_user_id`),
  KEY `idx_order_status` (`order_status`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
```

**新增字段：**
- `current_coupon_id` int(11) DEFAULT NULL COMMENT '当前使用的优惠券ID' - 用于换桌场景
- `lock_user_id` int(11) DEFAULT NULL COMMENT '锁定用户ID' - 下单或结算时锁定
- `lock_expire_time` datetime DEFAULT NULL COMMENT '锁定过期时间' - 锁定过期时间

**新增索引：**
- `idx_current_coupon_id` (`current_coupon_id`)
- `idx_lock_user_id` (`lock_user_id`)
- `idx_table_status` (`table_id`, `order_status`)
- `idx_store_status` (`store_id`, `order_status`)

---

### 5. 订单明细表（store_order_detail）

**基础字段：**
```sql
CREATE TABLE `store_order_detail` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `order_id` int(11) NOT NULL COMMENT '订单ID',
  `order_no` varchar(64) NOT NULL COMMENT '订单号',
  `cuisine_id` int(11) NOT NULL COMMENT '菜品ID',
  `cuisine_name` varchar(200) NOT NULL COMMENT '菜品名称',
  `cuisine_type` tinyint(4) NOT NULL COMMENT '菜品类型(1:单品, 2:套餐)',
  `cuisine_image` varchar(500) DEFAULT NULL COMMENT '菜品图片',
  `unit_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '单价',
  `quantity` int(11) NOT NULL DEFAULT '1' COMMENT '数量',
  `subtotal_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '小计金额',
  `add_user_id` int(11) DEFAULT NULL COMMENT '添加该菜品的用户ID',
  `add_user_phone` varchar(20) DEFAULT NULL COMMENT '添加该菜品的用户手机号',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_user_id` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `updated_user_id` int(11) DEFAULT NULL COMMENT '修改人ID',
  PRIMARY KEY (`id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_order_no` (`order_no`),
  KEY `idx_cuisine_id` (`cuisine_id`),
  KEY `idx_add_user_id` (`add_user_id`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单明细表';
```

**新增字段：**
- `is_add_dish` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否加餐(0:初始下单, 1:加餐)' - 区分初始下单和加餐
- `add_dish_time` datetime DEFAULT NULL COMMENT '加餐时间' - 加餐时间

**新增索引：**
- `idx_order_cuisine` (`order_id`, `cuisine_id`)
- `idx_is_add_dish` (`is_add_dish`)
- `idx_add_dish_time` (`add_dish_time`)

---

### 6. 桌号表（store_table）

**说明：** 此表为已存在的表，新增以下字段和索引。

**新增字段：**
- `current_coupon_id` int(11) DEFAULT NULL COMMENT '当前使用的优惠券ID' - 便于查询和换桌迁移
- `cart_item_count` int(11) DEFAULT '0' COMMENT '购物车商品数量' - 购物车商品数量（缓存）
- `cart_total_amount` decimal(10,2) DEFAULT '0.00' COMMENT '购物车总金额' - 购物车总金额（缓存）

**新增索引：**
- `idx_current_coupon_id` (`current_coupon_id`)
- `idx_store_status` (`store_id`, `status`)

---

## 三、表关系说明

1. **store_order** ←→ **store_order_detail**：一对多关系，通过 `order_id` 关联
2. **store_table** ←→ **store_order**：一对多关系，通过 `table_id` 关联
3. **store_table** ←→ **store_cart**：一对多关系，通过 `table_id` 关联
4. **store_table** ←→ **store_coupon_usage**：一对多关系，通过 `table_id` 关联
5. **store_order** ←→ **store_coupon_usage**：一对一关系，通过 `order_id` 关联
6. **store_table** ←→ **store_order_lock**：一对多关系，通过 `table_id` 关联（下单锁定）
7. **store_order** ←→ **store_order_lock**：一对一关系，通过 `order_id` 关联（结算锁定）

---

## 四、字段说明

### 订单状态（order_status）
- `0`: 待支付
- `1`: 已支付
- `2`: 已取消
- `3`: 已完成

### 支付状态（pay_status）
- `0`: 未支付
- `1`: 已支付
- `2`: 已退款

### 支付方式（pay_type）
- `1`: 微信
- `2`: 支付宝
- `3`: 现金

### 优惠券使用状态（usage_status）
- `0`: 已标记使用
- `1`: 已下单
- `2`: 已支付
- `3`: 已取消

### 锁定类型（lock_type）
- `1`: 下单锁定
- `2`: 结算锁定

### 锁定状态（lock_status）
- `0`: 已释放
- `1`: 锁定中

### 是否加餐（is_add_dish）
- `0`: 初始下单
- `1`: 加餐

### 餐桌状态（status）
- `0`: 空闲
- `1`: 就餐中
- `2`: 其他
- `3`: 加餐（当首次订单发生变化时，状态从"就餐中"变为"加餐"）

---

## 五、索引说明

### 主要查询场景索引：

1. **按桌号查询订单**：`idx_table_id`, `idx_table_status`
2. **按门店查询订单**：`idx_store_id`, `idx_store_status`
3. **按订单号查询**：`uk_order_no`（唯一索引）
4. **按用户查询订单**：`idx_pay_user_id`
5. **按状态查询订单**：`idx_order_status`
6. **按时间查询订单**：`idx_created_time`
7. **购物车查询**：`idx_table_id`, `idx_table_delete`
8. **优惠券查询**：`uk_table_coupon`（唯一索引），`idx_table_id`, `idx_coupon_id`
9. **锁定查询**：`idx_table_lock`, `idx_lock_expire_time`

---

## 六、执行顺序

1. 先执行 `store_order_tables.sql` 创建基础表（如果表不存在）
2. 再执行 `store_order_optimization_final.sql` 进行优化（添加字段和索引）
