/*
 paopao 电商系统数据库设计
 适配功能明细.md + 核心业务流程整理.md
 更新版本: 2026-05-08
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- =============================================
-- 一、用户模块
-- =============================================

-- 用户表
DROP TABLE IF EXISTS `app_user`;
CREATE TABLE `app_user` (
  `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `openid` varchar(100) DEFAULT NULL COMMENT '微信openid',
  `unionid` varchar(100) DEFAULT NULL COMMENT '微信unionid',
  `nickname` varchar(100) DEFAULT NULL COMMENT '昵称',
  `avatar` varchar(500) DEFAULT NULL COMMENT '头像',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `gender` tinyint DEFAULT '0' COMMENT '性别: 0未知 1男 2女',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `balance` decimal(15,2) DEFAULT '0.00' COMMENT '余额',
  `points` int DEFAULT '0' COMMENT '积分',
  `member_level_id` int DEFAULT NULL COMMENT '会员等级ID',
  `member_expire_time` datetime DEFAULT NULL COMMENT '会员到期时间',
  `inviter_id` bigint DEFAULT NULL COMMENT '邀请人用户ID',
  `display_id` varchar(20) DEFAULT NULL COMMENT '显示ID(用户专属推广码)',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用 1正常',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `register_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
  `last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `uk_openid` (`openid`),
  UNIQUE KEY `uk_phone` (`phone`),
  UNIQUE KEY `uk_display_id` (`display_id`),
  KEY `idx_inviter_id` (`inviter_id`),
  KEY `idx_member_level` (`member_level_id`),
  KEY `idx_status` (`status`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';

-- 用户地址表
DROP TABLE IF EXISTS `app_user_address`;
CREATE TABLE `app_user_address` (
  `address_id` bigint NOT NULL AUTO_INCREMENT COMMENT '地址ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `consignee` varchar(50) NOT NULL COMMENT '收货人姓名',
  `phone` varchar(20) NOT NULL COMMENT '收货人电话',
  `province` varchar(50) DEFAULT NULL COMMENT '省份',
  `city` varchar(50) DEFAULT NULL COMMENT '城市',
  `district` varchar(50) DEFAULT NULL COMMENT '区/县',
  `detail` varchar(200) NOT NULL COMMENT '详细地址',
  `is_default` tinyint DEFAULT '0' COMMENT '是否默认: 0否 1是',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`address_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_is_default` (`is_default`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户地址表';

-- 会员等级表
DROP TABLE IF EXISTS `app_member_level`;
CREATE TABLE `app_member_level` (
  `level_id` int NOT NULL AUTO_INCREMENT COMMENT '等级ID',
  `level_name` varchar(50) NOT NULL COMMENT '等级名称',
  `level_code` varchar(20) DEFAULT NULL COMMENT '等级编码',
  `price` decimal(10,2) NOT NULL COMMENT '开通价格(注册费)',
  `member_fee` decimal(10,2) DEFAULT '0.00' COMMENT '下级会员费(会员收取下级的费用)',
  `duration_days` int DEFAULT NULL COMMENT '时长(天),NULL表示永久',
  `discount_rate` decimal(5,2) DEFAULT '100.00' COMMENT '折扣率(%)',
  `commission_rate` decimal(5,2) DEFAULT '0.00' COMMENT '分销佣金比例(%)',
  `description` varchar(500) DEFAULT NULL COMMENT '等级描述',
  `privileges` text COMMENT '会员权益(JSON)',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用 1启用',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`level_id`),
  UNIQUE KEY `uk_level_code` (`level_code`),
  KEY `idx_status` (`status`),
  KEY `idx_sort_number` (`sort_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员等级表';

-- 用户会员购买记录表
DROP TABLE IF EXISTS `app_user_member_order`;
CREATE TABLE `app_user_member_order` (
  `order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `order_no` varchar(64) NOT NULL COMMENT '订单编号',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `level_id` int NOT NULL COMMENT '会员等级ID',
  `level_name` varchar(50) DEFAULT NULL COMMENT '等级名称(冗余)',
  `price` decimal(10,2) NOT NULL COMMENT '支付金额(注册费)',
  `pay_type` tinyint DEFAULT '0' COMMENT '支付方式: 0余额 1微信 2支付宝',
  `pay_status` tinyint DEFAULT '0' COMMENT '支付状态: 0未支付 1已支付',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `transaction_id` varchar(128) DEFAULT NULL COMMENT '第三方交易号',
  `start_time` datetime DEFAULT NULL COMMENT '开始时间',
  `expire_time` datetime DEFAULT NULL COMMENT '到期时间',
  `status` tinyint DEFAULT '0' COMMENT '状态: 0待支付 1已支付 2已取消',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`order_id`),
  UNIQUE KEY `uk_order_no` (`order_no`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_level_id` (`level_id`),
  KEY `idx_pay_status` (`pay_status`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户会员购买记录表';

-- 会员推广下级记录表（会员录入下级手机号）
DROP TABLE IF EXISTS `app_member_subordinate`;
CREATE TABLE `app_member_subordinate` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `member_id` bigint NOT NULL COMMENT '会员ID(上级)',
  `sub_phone` varchar(20) NOT NULL COMMENT '下级手机号',
  `sub_user_id` bigint DEFAULT NULL COMMENT '下级用户ID(注册后填充)',
  `member_fee` decimal(10,2) NOT NULL COMMENT '收取的下级会员费',
  `fee_paid` tinyint DEFAULT '0' COMMENT '会员费是否已收: 0未确认 1已确认',
  `register_status` tinyint DEFAULT '0' COMMENT '注册状态: 0待注册 1已注册',
  `status` tinyint DEFAULT '0' COMMENT '状态: 0待处理 1已完成 2已取消',
  `remark` varchar(200) DEFAULT NULL COMMENT '备注',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_member_id` (`member_id`),
  KEY `idx_sub_phone` (`sub_phone`),
  KEY `idx_sub_user_id` (`sub_user_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员推广下级记录表';

-- =============================================
-- 二、商品模块
-- =============================================

-- 商品分类表（三级分类）
DROP TABLE IF EXISTS `app_product_category`;
CREATE TABLE `app_product_category` (
  `category_id` int NOT NULL AUTO_INCREMENT COMMENT '分类ID',
  `category_name` varchar(100) NOT NULL COMMENT '分类名称',
  `parent_id` int DEFAULT '0' COMMENT '父级分类ID,0表示一级分类',
  `level` tinyint DEFAULT '1' COMMENT '分类层级: 1一级 2二级 3三级',
  `image` varchar(500) DEFAULT NULL COMMENT '分类图片',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `is_show` tinyint DEFAULT '1' COMMENT '是否显示: 0否 1是',
  `is_recommend` tinyint DEFAULT '0' COMMENT '是否推荐: 0否 1是',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`category_id`),
  KEY `idx_parent_id` (`parent_id`),
  KEY `idx_level` (`level`),
  KEY `idx_is_show` (`is_show`),
  KEY `idx_sort_number` (`sort_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品分类表（三级分类）';

-- 商品品牌表
DROP TABLE IF EXISTS `app_product_brand`;
CREATE TABLE `app_product_brand` (
  `brand_id` int NOT NULL AUTO_INCREMENT COMMENT '品牌ID',
  `brand_name` varchar(100) NOT NULL COMMENT '品牌名称',
  `brand_logo` varchar(500) DEFAULT NULL COMMENT '品牌LOGO',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `is_show` tinyint DEFAULT '1' COMMENT '是否显示: 0否 1是',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`brand_id`),
  KEY `idx_is_show` (`is_show`),
  KEY `idx_sort_number` (`sort_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品品牌表';

-- 商品规格表
DROP TABLE IF EXISTS `app_product_spec`;
CREATE TABLE `app_product_spec` (
  `spec_id` int NOT NULL AUTO_INCREMENT COMMENT '规格ID',
  `spec_name` varchar(50) NOT NULL COMMENT '规格名称(如:颜色、尺码)',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`spec_id`),
  KEY `idx_sort_number` (`sort_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品规格表';

-- 商品规格值表
DROP TABLE IF EXISTS `app_product_spec_value`;
CREATE TABLE `app_product_spec_value` (
  `value_id` int NOT NULL AUTO_INCREMENT COMMENT '规格值ID',
  `spec_id` int NOT NULL COMMENT '规格ID',
  `spec_value` varchar(100) NOT NULL COMMENT '规格值(如:红色、XL)',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`value_id`),
  KEY `idx_spec_id` (`spec_id`),
  KEY `idx_sort_number` (`sort_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品规格值表';

-- 商品表
DROP TABLE IF EXISTS `app_product`;
CREATE TABLE `app_product` (
  `product_id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品ID',
  `product_name` varchar(200) NOT NULL COMMENT '商品名称',
  `product_code` varchar(100) DEFAULT NULL COMMENT '商品编码',
  `category_id` int DEFAULT NULL COMMENT '三级分类ID',
  `brand_id` int DEFAULT NULL COMMENT '品牌ID',
  `main_image` varchar(500) NOT NULL COMMENT '主图',
  `images` text COMMENT '商品图片(JSON数组)',
  `video_url` varchar(500) DEFAULT NULL COMMENT '商品视频URL',
  `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '售价',
  `market_price` decimal(10,2) DEFAULT NULL COMMENT '市场价/划线价',
  `cost_price` decimal(10,2) DEFAULT NULL COMMENT '成本价',
  `stock` int DEFAULT '0' COMMENT '总库存',
  `sales` int DEFAULT '0' COMMENT '销量',
  `description` longtext COMMENT '商品详情',
  `spec_type` tinyint DEFAULT '0' COMMENT '规格类型: 0单规格 1多规格',
  `commission_rate` decimal(5,2) DEFAULT '0.00' COMMENT '分销佣金比例(%)',
  `points_give` int DEFAULT '0' COMMENT '赠送积分',
  `is_hot` tinyint DEFAULT '0' COMMENT '是否热销: 0否 1是',
  `is_recommend` tinyint DEFAULT '0' COMMENT '是否推荐: 0否 1是',
  `is_new` tinyint DEFAULT '0' COMMENT '是否新品: 0否 1是',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0下架 1上架',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`product_id`),
  UNIQUE KEY `uk_product_code` (`product_code`),
  KEY `idx_category_id` (`category_id`),
  KEY `idx_brand_id` (`brand_id`),
  KEY `idx_status` (`status`),
  KEY `idx_is_hot` (`is_hot`),
  KEY `idx_is_recommend` (`is_recommend`),
  KEY `idx_sales` (`sales`),
  KEY `idx_sort_number` (`sort_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品表';

-- 商品SKU表（多规格）
DROP TABLE IF EXISTS `app_product_sku`;
CREATE TABLE `app_product_sku` (
  `sku_id` bigint NOT NULL AUTO_INCREMENT COMMENT 'SKU ID',
  `product_id` bigint NOT NULL COMMENT '商品ID',
  `sku_code` varchar(100) DEFAULT NULL COMMENT 'SKU编码',
  `spec_json` text COMMENT '规格组合JSON(如: [{"spec_name":"颜色","spec_value":"红色"},...])',
  `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '售价',
  `market_price` decimal(10,2) DEFAULT NULL COMMENT '市场价',
  `stock` int DEFAULT '0' COMMENT '库存',
  `sales` int DEFAULT '0' COMMENT '销量',
  `image` varchar(500) DEFAULT NULL COMMENT 'SKU图片',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用 1启用',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`sku_id`),
  UNIQUE KEY `uk_sku_code` (`sku_code`),
  KEY `idx_product_id` (`product_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品SKU表（多规格）';

-- =============================================
-- 三、订单模块
-- =============================================

-- 购物车表
DROP TABLE IF EXISTS `app_cart`;
CREATE TABLE `app_cart` (
  `cart_id` bigint NOT NULL AUTO_INCREMENT COMMENT '购物车ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `product_id` bigint NOT NULL COMMENT '商品ID',
  `sku_id` bigint DEFAULT NULL COMMENT 'SKU ID,单规格为NULL',
  `quantity` int NOT NULL DEFAULT '1' COMMENT '数量',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`cart_id`),
  UNIQUE KEY `uk_user_product_sku` (`user_id`,`product_id`,`sku_id`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='购物车表';

-- 订单表
DROP TABLE IF EXISTS `app_order`;
CREATE TABLE `app_order` (
  `order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `order_no` varchar(64) NOT NULL COMMENT '订单编号',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `total_amount` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '订单总金额',
  `discount_amount` decimal(15,2) DEFAULT '0.00' COMMENT '优惠金额(优惠券等)',
  `shipping_fee` decimal(10,2) DEFAULT '0.00' COMMENT '运费',
  `pay_amount` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '实际支付金额',
  `points_used` int DEFAULT '0' COMMENT '使用积分',
  `points_discount` decimal(10,2) DEFAULT '0.00' COMMENT '积分抵扣金额',
  `coupon_id` bigint DEFAULT NULL COMMENT '使用优惠券ID',
  `coupon_discount` decimal(10,2) DEFAULT '0.00' COMMENT '优惠券优惠金额',
  `pay_type` tinyint DEFAULT '0' COMMENT '支付方式: 0余额 1微信 2支付宝',
  `pay_status` tinyint DEFAULT '0' COMMENT '支付状态: 0未支付 1已支付 2已退款',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `transaction_id` varchar(128) DEFAULT NULL COMMENT '第三方交易号',
  `order_status` tinyint DEFAULT '0' COMMENT '订单状态: 0待支付 1待发货 2待收货 3已完成 4已取消 5已关闭 6退款中 7已退款',
  `shipping_name` varchar(50) DEFAULT NULL COMMENT '快递公司',
  `shipping_no` varchar(100) DEFAULT NULL COMMENT '快递单号',
  `shipping_time` datetime DEFAULT NULL COMMENT '发货时间',
  `receive_time` datetime DEFAULT NULL COMMENT '收货时间',
  `cancel_time` datetime DEFAULT NULL COMMENT '取消时间',
  `cancel_reason` varchar(200) DEFAULT NULL COMMENT '取消原因',
  `address_id` bigint DEFAULT NULL COMMENT '收货地址ID',
  `consignee` varchar(50) DEFAULT NULL COMMENT '收货人姓名',
  `consignee_phone` varchar(20) DEFAULT NULL COMMENT '收货人电话',
  `consignee_address` varchar(500) DEFAULT NULL COMMENT '收货地址',
  `remark` varchar(500) DEFAULT NULL COMMENT '订单备注',
  `commission_status` tinyint DEFAULT '0' COMMENT '佣金结算状态: 0未结算 1已结算',
  `commission_amount` decimal(15,2) DEFAULT '0.00' COMMENT '佣金总额',
  `aftersale_end_time` datetime DEFAULT NULL COMMENT '售后期结束时间',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`order_id`),
  UNIQUE KEY `uk_order_no` (`order_no`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_pay_status` (`pay_status`),
  KEY `idx_order_status` (`order_status`),
  KEY `idx_commission_status` (`commission_status`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_pay_time` (`pay_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='订单表';

-- 订单商品表
DROP TABLE IF EXISTS `app_order_item`;
CREATE TABLE `app_order_item` (
  `item_id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单商品ID',
  `order_id` bigint NOT NULL COMMENT '订单ID',
  `product_id` bigint NOT NULL COMMENT '商品ID',
  `product_name` varchar(200) DEFAULT NULL COMMENT '商品名称(冗余)',
  `sku_id` bigint DEFAULT NULL COMMENT 'SKU ID',
  `spec_json` text COMMENT '规格组合JSON(冗余)',
  `price` decimal(10,2) NOT NULL COMMENT '商品单价',
  `quantity` int NOT NULL COMMENT '购买数量',
  `total_price` decimal(15,2) NOT NULL COMMENT '商品总价',
  `image` varchar(500) DEFAULT NULL COMMENT '商品图片(冗余)',
  `commission_rate` decimal(5,2) DEFAULT '0.00' COMMENT '佣金比例(%)',
  `commission_amount` decimal(10,2) DEFAULT '0.00' COMMENT '佣金金额',
  `refund_status` tinyint DEFAULT '0' COMMENT '退款状态: 0无退款 1申请退款 2退款中 3已退款',
  `refund_amount` decimal(10,2) DEFAULT '0.00' COMMENT '退款金额',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`item_id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_product_id` (`product_id`),
  KEY `idx_refund_status` (`refund_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='订单商品表';

-- 订单支付记录表
DROP TABLE IF EXISTS `app_order_payment`;
CREATE TABLE `app_order_payment` (
  `payment_id` bigint NOT NULL AUTO_INCREMENT COMMENT '支付记录ID',
  `order_id` bigint NOT NULL COMMENT '订单ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `pay_amount` decimal(15,2) NOT NULL COMMENT '支付金额',
  `pay_type` tinyint NOT NULL COMMENT '支付方式: 0余额 1微信 2支付宝',
  `pay_status` tinyint DEFAULT '0' COMMENT '支付状态: 0失败 1成功',
  `transaction_id` varchar(128) DEFAULT NULL COMMENT '第三方交易号',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`payment_id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_pay_status` (`pay_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='订单支付记录表';

-- 退款/售后表
DROP TABLE IF EXISTS `app_order_refund`;
CREATE TABLE `app_order_refund` (
  `refund_id` bigint NOT NULL AUTO_INCREMENT COMMENT '退款ID',
  `refund_no` varchar(64) NOT NULL COMMENT '退款单号',
  `order_id` bigint NOT NULL COMMENT '订单ID',
  `order_item_id` bigint DEFAULT NULL COMMENT '订单商品ID(部分退款)',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `refund_amount` decimal(10,2) NOT NULL COMMENT '退款金额',
  `refund_reason` varchar(500) DEFAULT NULL COMMENT '退款原因',
  `refund_desc` text COMMENT '退款说明',
  `images` text COMMENT '凭证图片(JSON数组)',
  `refund_status` tinyint DEFAULT '0' COMMENT '退款状态: 0待审核 1审核通过 2审核拒绝 3退款中 4已退款 5已关闭',
  `review_time` datetime DEFAULT NULL COMMENT '审核时间',
  `review_note` varchar(500) DEFAULT NULL COMMENT '审核备注',
  `refund_time` datetime DEFAULT NULL COMMENT '退款完成时间',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`refund_id`),
  UNIQUE KEY `uk_refund_no` (`refund_no`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_refund_status` (`refund_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='退款/售后表';

-- =============================================
-- 四、积分与营销模块
-- =============================================

-- 积分记录表
DROP TABLE IF EXISTS `app_points_record`;
CREATE TABLE `app_points_record` (
  `record_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `points` int NOT NULL COMMENT '积分变动(正数为获得,负数为消费)',
  `balance` int DEFAULT '0' COMMENT '变动后余额',
  `type` varchar(20) NOT NULL COMMENT '类型: signin签到 shop购物 consume消费 refund退款 admin管理员操作',
  `relation_id` bigint DEFAULT NULL COMMENT '关联ID(订单ID等)',
  `remark` varchar(200) DEFAULT NULL COMMENT '备注',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`record_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_type` (`type`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='积分记录表';

-- 签到记录表
DROP TABLE IF EXISTS `app_signin_record`;
CREATE TABLE `app_signin_record` (
  `record_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `signin_date` date NOT NULL COMMENT '签到日期',
  `points` int NOT NULL COMMENT '获得积分',
  `continuous_days` int DEFAULT '1' COMMENT '连续签到天数',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`record_id`),
  UNIQUE KEY `uk_user_date` (`user_id`,`signin_date`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_signin_date` (`signin_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='签到记录表';

-- 优惠券表
DROP TABLE IF EXISTS `app_coupon`;
CREATE TABLE `app_coupon` (
  `coupon_id` bigint NOT NULL AUTO_INCREMENT COMMENT '优惠券ID',
  `coupon_name` varchar(100) NOT NULL COMMENT '优惠券名称',
  `type` tinyint NOT NULL COMMENT '类型: 1无门槛 2满减券 3折扣券 4场地使用券',
  `discount_amount` decimal(10,2) DEFAULT NULL COMMENT '减免金额(满减券)',
  `discount_rate` decimal(5,2) DEFAULT NULL COMMENT '折扣率(折扣券,如: 80表示8折)',
  `min_amount` decimal(10,2) DEFAULT '0.00' COMMENT '最低消费金额',
  `valid_days` int DEFAULT NULL COMMENT '领取后有效天数',
  `start_time` datetime DEFAULT NULL COMMENT '有效期开始',
  `end_time` datetime DEFAULT NULL COMMENT '有效期结束',
  `total_count` int DEFAULT '0' COMMENT '发放总量,0表示不限',
  `receive_count` int DEFAULT '0' COMMENT '已领取数量',
  `per_limit` int DEFAULT '1' COMMENT '每人限领数量',
  `is_member_only` tinyint DEFAULT '0' COMMENT '是否仅会员领取: 0否 1是',
  `is_specified_user` tinyint DEFAULT '0' COMMENT '是否指定用户: 0否 1是',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用 1启用',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`coupon_id`),
  KEY `idx_type` (`type`),
  KEY `idx_status` (`status`),
  KEY `idx_start_time` (`start_time`),
  KEY `idx_end_time` (`end_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='优惠券表';

-- 用户优惠券表
DROP TABLE IF EXISTS `app_user_coupon`;
CREATE TABLE `app_user_coupon` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `coupon_id` bigint NOT NULL COMMENT '优惠券ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `coupon_name` varchar(100) DEFAULT NULL COMMENT '优惠券名称(冗余)',
  `type` tinyint DEFAULT NULL COMMENT '类型(冗余)',
  `discount_amount` decimal(10,2) DEFAULT NULL COMMENT '减免金额(冗余)',
  `discount_rate` decimal(5,2) DEFAULT NULL COMMENT '折扣率(冗余)',
  `min_amount` decimal(10,2) DEFAULT NULL COMMENT '最低消费金额(冗余)',
  `status` tinyint DEFAULT '0' COMMENT '状态: 0未使用 1已使用 2已过期',
  `use_time` datetime DEFAULT NULL COMMENT '使用时间',
  `order_id` bigint DEFAULT NULL COMMENT '使用的订单ID',
  `receive_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '领取时间',
  `expire_time` datetime DEFAULT NULL COMMENT '过期时间',
  `receive_type` tinyint DEFAULT '0' COMMENT '领取方式: 0主动领取 1后台发放 2活动奖励',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_coupon_id` (`coupon_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_status` (`status`),
  KEY `idx_expire_time` (`expire_time`),
  KEY `idx_receive_time` (`receive_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户优惠券表';

-- 优惠券指定用户表（后台定向发放）
DROP TABLE IF EXISTS `app_coupon_specified_user`;
CREATE TABLE `app_coupon_specified_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `coupon_id` bigint NOT NULL COMMENT '优惠券ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `status` tinyint DEFAULT '0' COMMENT '发送状态: 0待发送 1已发送 2已拒绝',
  `send_time` datetime DEFAULT NULL COMMENT '发送时间',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_coupon_id` (`coupon_id`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='优惠券指定用户表';

-- 积分兑换商品表
DROP TABLE IF EXISTS `app_points_product`;
CREATE TABLE `app_points_product` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `product_name` varchar(200) NOT NULL COMMENT '商品名称',
  `product_image` varchar(500) DEFAULT NULL COMMENT '商品图片',
  `product_type` tinyint DEFAULT '0' COMMENT '商品类型: 0实物 1优惠券 2虚拟商品',
  `coupon_id` bigint DEFAULT NULL COMMENT '优惠券ID(商品类型为优惠券时)',
  `points_price` int NOT NULL COMMENT '兑换所需积分',
  `money_price` decimal(10,2) DEFAULT '0.00' COMMENT '补差价金额',
  `stock` int DEFAULT '0' COMMENT '库存',
  `sales` int DEFAULT '0' COMMENT '兑换量',
  `description` text COMMENT '商品描述',
  `is_hot` tinyint DEFAULT '0' COMMENT '是否热门: 0否 1是',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0下架 1上架',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_status` (`status`),
  KEY `idx_is_hot` (`is_hot`),
  KEY `idx_sort_number` (`sort_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='积分兑换商品表';

-- 积分兑换订单表
DROP TABLE IF EXISTS `app_points_order`;
CREATE TABLE `app_points_order` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `order_no` varchar(64) NOT NULL COMMENT '订单编号',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `product_id` bigint NOT NULL COMMENT '积分商品ID',
  `product_name` varchar(200) DEFAULT NULL COMMENT '商品名称(冗余)',
  `points_price` int NOT NULL COMMENT '兑换积分',
  `money_price` decimal(10,2) DEFAULT '0.00' COMMENT '补差价金额',
  `pay_type` tinyint DEFAULT '0' COMMENT '支付方式: 0余额 1微信 2支付宝',
  `pay_status` tinyint DEFAULT '0' COMMENT '支付状态: 0未支付 1已支付',
  `order_status` tinyint DEFAULT '0' COMMENT '订单状态: 0待处理 1已发货 2已完成 3已取消',
  `shipping_name` varchar(50) DEFAULT NULL COMMENT '快递公司',
  `shipping_no` varchar(100) DEFAULT NULL COMMENT '快递单号',
  `shipping_time` datetime DEFAULT NULL COMMENT '发货时间',
  `receive_time` datetime DEFAULT NULL COMMENT '收货时间',
  `address_id` bigint DEFAULT NULL COMMENT '收货地址ID',
  `consignee` varchar(50) DEFAULT NULL COMMENT '收货人姓名',
  `consignee_phone` varchar(20) DEFAULT NULL COMMENT '收货人电话',
  `consignee_address` varchar(500) DEFAULT NULL COMMENT '收货地址',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_order_no` (`order_no`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_order_status` (`order_status`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='积分兑换订单表';

-- =============================================
-- 五、会员分销模块
-- =============================================

-- 分销关系表
DROP TABLE IF EXISTS `app_distribution_relation`;
CREATE TABLE `app_distribution_relation` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `inviter_id` bigint NOT NULL COMMENT '邀请人ID',
  `level` tinyint DEFAULT '1' COMMENT '关系层级: 1直接下级 2间接下级',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_inviter` (`user_id`,`inviter_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_inviter_id` (`inviter_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='分销关系表';

-- 佣金记录表
DROP TABLE IF EXISTS `app_commission_record`;
CREATE TABLE `app_commission_record` (
  `record_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
  `user_id` bigint NOT NULL COMMENT '获得佣金的用户ID(上级)',
  `from_user_id` bigint NOT NULL COMMENT '消费用户ID(下级)',
  `order_id` bigint DEFAULT NULL COMMENT '订单ID',
  `order_item_id` bigint DEFAULT NULL COMMENT '订单商品ID',
  `product_id` bigint DEFAULT NULL COMMENT '商品ID',
  `product_name` varchar(200) DEFAULT NULL COMMENT '商品名称',
  `order_amount` decimal(15,2) DEFAULT '0.00' COMMENT '订单金额',
  `commission_rate` decimal(5,2) DEFAULT '0.00' COMMENT '佣金比例(%)',
  `commission_amount` decimal(15,2) NOT NULL COMMENT '佣金金额',
  `status` tinyint DEFAULT '0' COMMENT '状态: 0待结算 1已结算 2已失效',
  `settle_time` datetime DEFAULT NULL COMMENT '结算时间',
  `order_settle_time` datetime DEFAULT NULL COMMENT '订单过售后期时间',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`record_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_from_user_id` (`from_user_id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_status` (`status`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_settle_time` (`settle_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='佣金记录表';

-- 佣金提现表
DROP TABLE IF EXISTS `app_commission_withdraw`;
CREATE TABLE `app_commission_withdraw` (
  `withdraw_id` bigint NOT NULL AUTO_INCREMENT COMMENT '提现ID',
  `withdraw_no` varchar(64) NOT NULL COMMENT '提现单号',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `amount` decimal(15,2) NOT NULL COMMENT '提现金额',
  `balance_before` decimal(15,2) DEFAULT '0.00' COMMENT '提现前余额',
  `balance_after` decimal(15,2) DEFAULT '0.00' COMMENT '提现后余额',
  `payee_account` varchar(100) DEFAULT NULL COMMENT '收款账号(微信openid等)',
  `payee_name` varchar(50) DEFAULT NULL COMMENT '收款人姓名',
  `status` tinyint DEFAULT '0' COMMENT '状态: 0待审核 1审核通过 2审核拒绝 3提现中 4已到账 5已取消',
  `review_time` datetime DEFAULT NULL COMMENT '审核时间',
  `review_note` varchar(500) DEFAULT NULL COMMENT '审核备注',
  `transfer_time` datetime DEFAULT NULL COMMENT '转账时间',
  `transaction_id` varchar(128) DEFAULT NULL COMMENT '第三方交易号',
  `daily_limit` decimal(15,2) DEFAULT '2000.00' COMMENT '每日提现限额',
  `single_limit` decimal(15,2) DEFAULT '200.00' COMMENT '单次提现限额(最低)',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`withdraw_id`),
  UNIQUE KEY `uk_withdraw_no` (`withdraw_no`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_status` (`status`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='佣金提现表';

-- =============================================
-- 六、活动与预约模块
-- =============================================

-- 活动表
DROP TABLE IF EXISTS `app_activity`;
CREATE TABLE `app_activity` (
  `activity_id` bigint NOT NULL AUTO_INCREMENT COMMENT '活动ID',
  `activity_name` varchar(200) NOT NULL COMMENT '活动名称',
  `activity_type` tinyint DEFAULT '0' COMMENT '活动类型: 0比赛 1普通活动',
  `image` varchar(500) DEFAULT NULL COMMENT '活动封面图',
  `images` text COMMENT '活动图片(JSON数组)',
  `content` longtext COMMENT '活动详情',
  `start_time` datetime NOT NULL COMMENT '活动开始时间',
  `end_time` datetime NOT NULL COMMENT '活动结束时间',
  `signup_start` datetime DEFAULT NULL COMMENT '报名开始时间',
  `signup_end` datetime DEFAULT NULL COMMENT '报名结束时间',
  `max_participants` int DEFAULT '0' COMMENT '最大报名人数,0表示不限',
  `max_teams` int DEFAULT '0' COMMENT '最大报名队伍数,0表示不限',
  `current_participants` int DEFAULT '0' COMMENT '当前报名人数',
  `price` decimal(10,2) DEFAULT '0.00' COMMENT '报名费用,0表示免费',
  `size_options` text COMMENT '尺码选项JSON(比赛活动用,如: ["S","M","L","XL"])',
  `required_fields` text COMMENT '必填项JSON(如: ["姓名","手机号","身份证"])',
  `is_hot` tinyint DEFAULT '0' COMMENT '是否热门: 0否 1是',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用 1启用',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`activity_id`),
  KEY `idx_activity_type` (`activity_type`),
  KEY `idx_status` (`status`),
  KEY `idx_is_hot` (`is_hot`),
  KEY `idx_start_time` (`start_time`),
  KEY `idx_end_time` (`end_time`),
  KEY `idx_sort_number` (`sort_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='活动表';

-- 活动报名表
DROP TABLE IF EXISTS `app_activity_signup`;
CREATE TABLE `app_activity_signup` (
  `signup_id` bigint NOT NULL AUTO_INCREMENT COMMENT '报名ID',
  `activity_id` bigint NOT NULL COMMENT '活动ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `signup_data` text COMMENT '报名填写数据JSON(根据活动必填项)',
  `size_option` varchar(20) DEFAULT NULL COMMENT '尺码选择(比赛活动)',
  `pay_amount` decimal(10,2) DEFAULT '0.00' COMMENT '支付金额',
  `pay_status` tinyint DEFAULT '0' COMMENT '支付状态: 0未支付 1已支付',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `transaction_id` varchar(128) DEFAULT NULL COMMENT '第三方交易号',
  `status` tinyint DEFAULT '0' COMMENT '状态: 0已报名 1已取消',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`signup_id`),
  UNIQUE KEY `uk_activity_user` (`activity_id`,`user_id`),
  KEY `idx_activity_id` (`activity_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_pay_status` (`pay_status`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='活动报名表';

-- 门店表
DROP TABLE IF EXISTS `app_store`;
CREATE TABLE `app_store` (
  `store_id` bigint NOT NULL AUTO_INCREMENT COMMENT '门店ID',
  `store_name` varchar(100) NOT NULL COMMENT '门店名称',
  `address` varchar(500) NOT NULL COMMENT '门店地址',
  `longitude` decimal(10,7) DEFAULT NULL COMMENT '经度',
  `latitude` decimal(10,7) DEFAULT NULL COMMENT '纬度',
  `phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
  `business_hours` varchar(200) DEFAULT NULL COMMENT '营业时间(如: 09:00-21:00)',
  `description` text COMMENT '门店描述',
  `images` text COMMENT '门店图片(JSON数组)',
  `username` varchar(50) DEFAULT NULL COMMENT '登录账号',
  `password` varchar(255) DEFAULT NULL COMMENT '登录密码(加密)',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用 1启用',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`store_id`),
  UNIQUE KEY `uk_username` (`username`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='门店表';

-- 穿线预约表
DROP TABLE IF EXISTS `app_stringing_appointment`;
CREATE TABLE `app_stringing_appointment` (
  `appointment_id` bigint NOT NULL AUTO_INCREMENT COMMENT '预约ID',
  `appointment_no` varchar(64) NOT NULL COMMENT '预约编号',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `store_id` bigint NOT NULL COMMENT '门店ID',
  `store_name` varchar(100) DEFAULT NULL COMMENT '门店名称(冗余)',
  `appointment_time` datetime NOT NULL COMMENT '预约时间',
  `contact_name` varchar(50) NOT NULL COMMENT '联系人姓名',
  `contact_phone` varchar(20) NOT NULL COMMENT '联系人电话',
  `racket_info` varchar(500) DEFAULT NULL COMMENT '球拍信息',
  `string_info` varchar(500) DEFAULT NULL COMMENT '穿线信息',
  `remark` text COMMENT '备注',
  `status` tinyint DEFAULT '0' COMMENT '状态: 0待处理 1已确认 2已完成 3已取消',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`appointment_id`),
  UNIQUE KEY `uk_appointment_no` (`appointment_no`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_store_id` (`store_id`),
  KEY `idx_appointment_time` (`appointment_time`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='穿线预约表';

-- =============================================
-- 七、内容管理模块
-- =============================================

-- 轮播图表
DROP TABLE IF EXISTS `app_banner`;
CREATE TABLE `app_banner` (
  `banner_id` int NOT NULL AUTO_INCREMENT COMMENT '轮播图ID',
  `title` varchar(100) DEFAULT NULL COMMENT '标题',
  `image` varchar(500) NOT NULL COMMENT '图片地址',
  `link_type` tinyint DEFAULT '0' COMMENT '链接类型: 0无 1商品 2活动 3文章 4外链',
  `link_id` bigint DEFAULT NULL COMMENT '链接ID(商品ID/活动ID等)',
  `link_url` varchar(500) DEFAULT NULL COMMENT '外链地址',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `is_show` tinyint DEFAULT '1' COMMENT '是否显示: 0否 1是',
  `position` varchar(20) DEFAULT 'home' COMMENT '展示位置: home首页 store商城 activity活动',
  `start_time` datetime DEFAULT NULL COMMENT '开始时间',
  `end_time` datetime DEFAULT NULL COMMENT '结束时间',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`banner_id`),
  KEY `idx_is_show` (`is_show`),
  KEY `idx_position` (`position`),
  KEY `idx_sort_number` (`sort_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='轮播图表';

-- 文章/公告表
DROP TABLE IF EXISTS `app_article`;
CREATE TABLE `app_article` (
  `article_id` int NOT NULL AUTO_INCREMENT COMMENT '文章ID',
  `title` varchar(200) NOT NULL COMMENT '文章标题',
  `type` varchar(20) DEFAULT 'article' COMMENT '类型: article普通文章 announcement公告',
  `category_id` int DEFAULT NULL COMMENT '分类ID',
  `image` varchar(500) DEFAULT NULL COMMENT '封面图',
  `content` longtext COMMENT '正文内容',
  `overview` varchar(500) DEFAULT NULL COMMENT '摘要',
  `source` varchar(120) DEFAULT NULL COMMENT '来源',
  `author` varchar(80) DEFAULT NULL COMMENT '作者',
  `views` int DEFAULT '0' COMMENT '阅读量',
  `is_recommend` tinyint DEFAULT '0' COMMENT '是否推荐: 0否 1是',
  `is_show_index` tinyint DEFAULT '0' COMMENT '是否首页显示: 0否 1是',
  `sort_number` int DEFAULT '0' COMMENT '排序值',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0草稿 1已发布 2已下架',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `publish_time` datetime DEFAULT NULL COMMENT '发布时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`article_id`),
  KEY `idx_type` (`type`),
  KEY `idx_category_id` (`category_id`),
  KEY `idx_status` (`status`),
  KEY `idx_is_recommend` (`is_recommend`),
  KEY `idx_sort_number` (`sort_number`),
  KEY `idx_publish_time` (`publish_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文章/公告表';

-- 协议内容表（隐私政策、服务协议等）
DROP TABLE IF EXISTS `app_agreement`;
CREATE TABLE `app_agreement` (
  `agreement_id` int NOT NULL AUTO_INCREMENT COMMENT '协议ID',
  `agreement_key` varchar(50) NOT NULL COMMENT '协议标识: privacy隐私政策 service服务协议 copyright版权信息 about关于我们',
  `agreement_name` varchar(100) NOT NULL COMMENT '协议名称',
  `title` varchar(200) DEFAULT NULL COMMENT '前端显示标题',
  `content` longtext COMMENT '协议正文内容',
  `version` varchar(20) DEFAULT '1.0' COMMENT '版本号',
  `is_show` tinyint DEFAULT '1' COMMENT '是否显示: 0否 1是',
  `is_required` tinyint DEFAULT '1' COMMENT '是否必读: 0否 1是',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用 1启用',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`agreement_id`),
  UNIQUE KEY `uk_agreement_key` (`agreement_key`),
  KEY `idx_status` (`status`),
  KEY `idx_is_show` (`is_show`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='协议内容表';

-- 消息通知表
DROP TABLE IF EXISTS `app_notification`;
CREATE TABLE `app_notification` (
  `notification_id` bigint NOT NULL AUTO_INCREMENT COMMENT '通知ID',
  `user_id` bigint NOT NULL COMMENT '接收用户ID,0表示全站通知',
  `type` varchar(20) NOT NULL COMMENT '类型: system系统 order订单 payment支付 commission佣金 activity活动',
  `title` varchar(200) NOT NULL COMMENT '通知标题',
  `content` varchar(500) DEFAULT NULL COMMENT '通知内容',
  `ref_id` bigint DEFAULT NULL COMMENT '关联ID(订单ID/活动ID等)',
  `ref_type` varchar(30) DEFAULT NULL COMMENT '关联类型',
  `is_read` tinyint DEFAULT '0' COMMENT '是否已读: 0未读 1已读',
  `read_time` datetime DEFAULT NULL COMMENT '读取时间',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`notification_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_type` (`type`),
  KEY `idx_is_read` (`is_read`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='消息通知表';

-- =============================================
-- 八、系统管理模块
-- =============================================

-- 系统用户表（后台管理员）
DROP TABLE IF EXISTS `app_admin_user`;
CREATE TABLE `app_admin_user` (
  `admin_id` int NOT NULL AUTO_INCREMENT COMMENT '管理员ID',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(255) NOT NULL COMMENT '密码(加密)',
  `nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
  `avatar` varchar(500) DEFAULT NULL COMMENT '头像',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `role_id` int DEFAULT NULL COMMENT '角色ID',
  `last_login_ip` varchar(50) DEFAULT NULL COMMENT '最后登录IP',
  `last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用 1正常',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`admin_id`),
  UNIQUE KEY `uk_username` (`username`),
  KEY `idx_role_id` (`role_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='后台管理员表';

-- 角色表
DROP TABLE IF EXISTS `app_role`;
CREATE TABLE `app_role` (
  `role_id` int NOT NULL AUTO_INCREMENT COMMENT '角色ID',
  `role_name` varchar(50) NOT NULL COMMENT '角色名称',
  `role_code` varchar(50) DEFAULT NULL COMMENT '角色编码',
  `description` varchar(200) DEFAULT NULL COMMENT '角色描述',
  `permissions` text COMMENT '权限列表(JSON或逗号分隔)',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用 1启用',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`role_id`),
  UNIQUE KEY `uk_role_code` (`role_code`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色表';

-- 系统配置表
DROP TABLE IF EXISTS `app_system_config`;
CREATE TABLE `app_system_config` (
  `config_id` int NOT NULL AUTO_INCREMENT COMMENT '配置ID',
  `config_key` varchar(100) NOT NULL COMMENT '配置键',
  `config_value` text COMMENT '配置值',
  `config_group` varchar(50) DEFAULT 'base' COMMENT '配置分组: base基础 wechat微信 payment支付 sms短信',
  `config_type` varchar(20) DEFAULT 'string' COMMENT '值类型: string/json/number/boolean',
  `description` varchar(200) DEFAULT NULL COMMENT '配置说明',
  `is_public` tinyint DEFAULT '0' COMMENT '是否公开: 0否 1是(前端可读取)',
  `sort_number` int DEFAULT '0' COMMENT '排序号',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用 1启用',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`config_id`),
  UNIQUE KEY `uk_config_key` (`config_key`),
  KEY `idx_config_group` (`config_group`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统配置表';

-- 文件上传记录表
DROP TABLE IF EXISTS `app_file_upload`;
CREATE TABLE `app_file_upload` (
  `file_id` bigint NOT NULL AUTO_INCREMENT COMMENT '文件ID',
  `file_name` varchar(200) NOT NULL COMMENT '文件原始名称',
  `file_path` varchar(500) NOT NULL COMMENT '文件路径',
  `file_url` varchar(500) NOT NULL COMMENT '文件访问URL',
  `file_size` bigint DEFAULT '0' COMMENT '文件大小(字节)',
  `file_type` varchar(50) DEFAULT NULL COMMENT '文件类型(MIME)',
  `file_ext` varchar(10) DEFAULT NULL COMMENT '文件扩展名',
  `user_id` bigint DEFAULT NULL COMMENT '上传用户ID,0表示系统',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`file_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_file_type` (`file_type`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文件上传记录表';

-- =============================================
-- 九、财务模块
-- =============================================

-- 余额充值记录表
DROP TABLE IF EXISTS `app_recharge_record`;
CREATE TABLE `app_recharge_record` (
  `record_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
  `record_no` varchar(64) NOT NULL COMMENT '充值单号',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `amount` decimal(15,2) NOT NULL COMMENT '充值金额',
  `pay_type` tinyint DEFAULT '0' COMMENT '支付方式: 0余额 1微信 2支付宝(实际是从余额扣)',
  `pay_status` tinyint DEFAULT '0' COMMENT '支付状态: 0未支付 1已支付',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `transaction_id` varchar(128) DEFAULT NULL COMMENT '第三方交易号',
  `balance_before` decimal(15,2) DEFAULT '0.00' COMMENT '充值前余额',
  `balance_after` decimal(15,2) DEFAULT '0.00' COMMENT '充值后余额',
  `status` tinyint DEFAULT '0' COMMENT '状态: 0待支付 1已完成 2已取消',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`record_id`),
  UNIQUE KEY `uk_record_no` (`record_no`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_pay_status` (`pay_status`),
  KEY `idx_status` (`status`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='余额充值记录表';

-- 资金流水表
DROP TABLE IF EXISTS `app_fund_flow`;
CREATE TABLE `app_fund_flow` (
  `flow_id` bigint NOT NULL AUTO_INCREMENT COMMENT '流水ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `flow_type` varchar(20) NOT NULL COMMENT '流水类型: recharge充值 consume消费 refund退款 commission佣金 withdraw提现',
  `amount` decimal(15,2) NOT NULL COMMENT '变动金额(正数为收入,负数为支出)',
  `balance` decimal(15,2) DEFAULT '0.00' COMMENT '变动后余额',
  `relation_id` bigint DEFAULT NULL COMMENT '关联ID(订单ID/充值ID等)',
  `remark` varchar(200) DEFAULT NULL COMMENT '备注',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`flow_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_flow_type` (`flow_type`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='资金流水表';

-- 积分抵扣配置表
DROP TABLE IF EXISTS `app_points_config`;
CREATE TABLE `app_points_config` (
  `config_id` int NOT NULL AUTO_INCREMENT COMMENT '配置ID',
  `points_per_yuan` int DEFAULT '1' COMMENT '多少积分抵1元',
  `max_percent` decimal(5,2) DEFAULT '10.00' COMMENT '最多可抵扣订单金额比例(%)',
  `status` tinyint DEFAULT '1' COMMENT '状态: 0禁用(不可使用积分抵扣) 1启用',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`config_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='积分抵扣配置表';

-- 签到配置表
DROP TABLE IF EXISTS `app_signin_config`;
CREATE TABLE `app_signin_config` (
  `config_id` int NOT NULL AUTO_INCREMENT COMMENT '配置ID',
  `day_number` int NOT NULL COMMENT '第几天(1-7循环)',
  `points` int NOT NULL COMMENT '获得积分数',
  `deleted` tinyint DEFAULT '0' COMMENT '是否删除: 0否 1是',
  PRIMARY KEY (`config_id`),
  KEY `idx_day_number` (`day_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='签到积分配置表';

-- =============================================
-- 初始化数据
-- =============================================

-- 初始化默认协议
INSERT INTO `app_agreement` (`agreement_key`, `agreement_name`, `title`, `content`, `version`, `is_show`, `is_required`) VALUES
('privacy', '隐私政策', '隐私政策', '隐私政策内容...', '1.0', 1, 1),
('service', '服务协议', '服务协议', '服务协议内容...', '1.0', 1, 1);

-- 初始化系统配置
INSERT INTO `app_system_config` (`config_key`, `config_value`, `config_group`, `config_type`, `description`, `is_public`) VALUES
('app_name', '泡菜甄选', 'base', 'string', '小程序名称', 1),
('app_logo', '/uploads/logo.png', 'base', 'string', '小程序LOGO', 1),
('signin_points', '10', 'base', 'number', '每日签到积分', 1),
('withdraw_min_amount', '200', 'base', 'number', '最低提现金额', 1),
('withdraw_daily_limit', '2000', 'base', 'number', '每日提现上限', 1);

SET FOREIGN_KEY_CHECKS = 1;
