# 订单系统表结构说明 ## 一、新增表 ### 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` 进行优化(添加字段和索引)