-- =============================================================================
-- 订单模块 biz_order / biz_order_item / biz_order_logistics_trace
-- 用途：C 端会员在店铺下单；平台 / 商家端共用同一套表履约
-- 关联文档：doc/平台后台/订单管理/订单管理技术方案.md
--           doc/店铺后台/订单管理/全部订单/全部订单技术方案.md
--           doc/消费者APP/确认订单页（多商品）/确认订单页（多商品）技术方案.md
--           doc/消费者APP/确认订单页（单商品）（取消支付前）/确认订单页（单商品）技术方案.md
-- 状态规则：order_status 0待支付 1待发货 2已发货 3已完成 4已关闭 5已删除
--           逻辑删除用 order_status=5，del_flag 保持 0（审计可查）
-- 存量库升级：若 biz_order_item 已建且无 checkout 字段，执行 sql/biz_order_item_checkout.sql
-- 存量库升级：若 biz_order 无 idx_stats_finish，见本文件末尾 § 升级脚本
-- =============================================================================

-- -----------------------------------------------------------------------------
-- 订单主表 biz_order
-- 说明：一单对应一次交易；商品明细见 biz_order_item；物流节点见 biz_order_logistics_trace
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `biz_order` (
  `order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单ID，主键',
  `order_no` varchar(32) NOT NULL COMMENT '订单编号，全平台唯一；格式 O+yyyyMMdd+6位序号',
  `member_id` bigint(20) NOT NULL COMMENT '买家会员ID（biz_member.member_id）',
  `shop_id` bigint(20) NOT NULL COMMENT '所属店铺ID（biz_shop.shop_id）；商家端列表按此字段隔离',
  `merchant_id` bigint(20) NOT NULL COMMENT '所属商户ID（biz_merchant.merchant_id）；冗余便于商户维度统计与删商户校验',
  `order_status` char(1) NOT NULL DEFAULT '0' COMMENT '订单状态：0待支付 1待发货 2已发货 3已完成 4已关闭 5已删除（逻辑删除）',
  `close_type` char(1) DEFAULT NULL COMMENT '关闭类型（order_status=4时填写）：1未支付超时 2买家取消 3运营关闭 4支付失败/退款',
  `close_reason` varchar(500) DEFAULT NULL COMMENT '关闭说明；运营手工关闭或系统关闭时记录原因',
  `pay_type` char(1) DEFAULT NULL COMMENT '支付方式字典 biz_order_pay_type；C端支付成功后写入',
  `pay_status` char(1) NOT NULL DEFAULT '0' COMMENT '支付状态：0未支付 1已支付；与 order_status 配合判断待支付/待发货',
  `trade_no` varchar(64) DEFAULT NULL COMMENT '支付渠道交易流水号；用于检索与对账',
  `goods_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '商品金额合计（不含运费）；下单时按明细行汇总',
  `freight_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '运费金额；默认0；列表可展示「含运费」',
  `pay_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '实付金额=goods_amount+freight_amount；会员累计消费O11统计字段',
  `consignee_name` varchar(64) NOT NULL COMMENT '收货人姓名（下单快照，后续不随会员地址变更）',
  `consignee_mobile` varchar(20) NOT NULL COMMENT '收货人手机号（下单快照；列表展示须脱敏）',
  `consignee_address` varchar(512) NOT NULL COMMENT '收货完整地址文本（下单快照）',
  `delivery_type` char(1) DEFAULT NULL COMMENT '配送方式（发货时写入）：1物流配送 2商家配送；待发货前为空',
  `logistics_company` varchar(64) DEFAULT NULL COMMENT '物流公司名称；delivery_type=1时发货填写',
  `tracking_no` varchar(64) DEFAULT NULL COMMENT '快递单号；delivery_type=1时发货填写',
  `vehicle_no` varchar(32) DEFAULT NULL COMMENT '车辆号码；delivery_type=2时商家配送发货填写',
  `courier_name` varchar(64) DEFAULT NULL COMMENT '配送员姓名；delivery_type=2时商家配送发货填写',
  `courier_mobile` varchar(20) DEFAULT NULL COMMENT '配送员手机号；delivery_type=2时商家配送发货填写',
  `ship_remark` varchar(500) DEFAULT NULL COMMENT '发货备注；选填',
  `shipper_name` varchar(64) DEFAULT NULL COMMENT '发货人快照（发货时自配送设置写入）',
  `shipper_mobile` varchar(20) DEFAULT NULL COMMENT '发货人联系方式快照',
  `ship_region_code` varchar(64) DEFAULT NULL COMMENT '发货地区编码快照（区县级 biz_region.code）',
  `ship_region_name` varchar(128) DEFAULT NULL COMMENT '发货地区名称快照（省/市/区）',
  `ship_detail_address` varchar(256) DEFAULT NULL COMMENT '发货详细地址快照',
  `member_nick_name` varchar(64) DEFAULT NULL COMMENT '下单时会员昵称快照；列表/详情展示买家名称',
  `shop_name` varchar(128) DEFAULT NULL COMMENT '下单时店铺名称快照；平台列表展示用',
  `create_time` datetime NOT NULL COMMENT '下单时间；列表默认按此字段降序',
  `pay_time` datetime DEFAULT NULL COMMENT '支付成功时间；pay_status=1时有值',
  `ship_time` datetime DEFAULT NULL COMMENT '发货时间；order_status>=2时有值；与发货表单 shipTime 一致',
  `pay_expire_time` datetime NOT NULL COMMENT '支付截止时间；创建订单时=create_time+超时分钟；O8定时关单扫描',
  `finish_time` datetime DEFAULT NULL COMMENT '确认收货时间；order_status=3时有值；C端确认收货写入',
  `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '物理删除标志：0存在；已删除订单用 order_status=5，本字段仍保持0',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者；C端下单可为空或系统标识',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者；发货/关闭/删除等写操作记录操作人',
  `update_time` datetime DEFAULT NULL COMMENT '最后更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`order_id`),
  UNIQUE KEY `uk_order_no` (`order_no`),
  KEY `idx_member` (`member_id`,`create_time`),
  KEY `idx_shop_status` (`shop_id`,`order_status`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_pay_expire` (`order_status`,`pay_expire_time`),
  KEY `idx_stats_finish` (`order_status`,`finish_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单主表（平台+商家端同源）';

-- -----------------------------------------------------------------------------
-- 订单商品明细 biz_order_item
-- 说明：下单时写入商品快照；整单发货不拆行；商品后续改价/改名不影响本表
--       buyer_remark/service_desc/cart_item_id/spec_key 供 C 端确认订单页使用
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `biz_order_item` (
  `item_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '明细行ID，主键',
  `order_id` bigint(20) NOT NULL COMMENT '订单ID（biz_order.order_id）',
  `goods_id` bigint(20) NOT NULL COMMENT '原商品ID（biz_goods.goods_id）；用于库存扣减/回滚关联',
  `goods_name` varchar(128) NOT NULL COMMENT '商品名称快照',
  `goods_spec` varchar(64) DEFAULT '默认' COMMENT '商品规格文案快照；首期单规格可固定为「默认」',
  `goods_image` varchar(512) DEFAULT NULL COMMENT '商品主图URL快照',
  `unit_price` decimal(12,2) NOT NULL COMMENT '成交单价快照',
  `quantity` int(11) NOT NULL COMMENT '购买数量',
  `line_amount` decimal(12,2) NOT NULL COMMENT '行小计=unit_price*quantity',
  `buyer_remark` varchar(500) NOT NULL DEFAULT '' COMMENT '买家行备注',
  `service_desc` varchar(500) NOT NULL DEFAULT '' COMMENT '服务快照摘要',
  `cart_item_id` bigint(20) DEFAULT NULL COMMENT '来源购物车行ID；立即购买(BUY_NOW)为NULL',
  `spec_key` varchar(64) NOT NULL DEFAULT '' COMMENT '规格键；v1统一规格为空串',
  `sort_no` int(11) NOT NULL DEFAULT '0' COMMENT '行排序号；列表展示首行取 sort_no 最小',
  PRIMARY KEY (`item_id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_cart_item_id` (`cart_item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单商品明细（下单快照）';

-- -----------------------------------------------------------------------------
-- 物流节点 biz_order_logistics_trace
-- 说明：发货/运输更新/送达/确认收货均追加节点，不覆盖历史；详情时间轴倒序展示
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `biz_order_logistics_trace` (
  `trace_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '节点ID，主键',
  `order_id` bigint(20) NOT NULL COMMENT '订单ID（biz_order.order_id）',
  `trace_type` char(1) NOT NULL COMMENT '节点类型：1已发货 2运输更新 3已送达 4确认收货',
  `trace_time` datetime NOT NULL COMMENT '节点发生时间（业务时间，可早于 create_time）',
  `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '节点描述/摘要；发货节点可含物流公司+单号摘要',
  `create_by` varchar(64) DEFAULT '' COMMENT '操作人；平台运营/商家账号/C端系统',
  `create_time` datetime DEFAULT NULL COMMENT '记录写入时间',
  PRIMARY KEY (`trace_id`),
  KEY `idx_order_id_time` (`order_id`,`trace_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单物流节点时间轴';

-- -----------------------------------------------------------------------------
-- 存量库升级：商城对外统计按 order_status + finish_time 扫描（《商城数据统计技术方案》）
-- 说明：新建库已在 biz_order 建表语句含 idx_stats_finish；已上线库执行下方语句一次
-- -----------------------------------------------------------------------------
-- ALTER TABLE `biz_order`
--   ADD INDEX `idx_stats_finish` (`order_status`, `finish_time`);
