296 lines
14 KiB
SQL
296 lines
14 KiB
SQL
-- ========================================
|
||
-- 方案A:其他支付方式数据库脚本
|
||
-- 创建日期:2026-01-23
|
||
-- 数据库:peixue
|
||
-- 功能:次卡、套餐、优惠券、地址关联
|
||
-- ========================================
|
||
|
||
USE peixue;
|
||
|
||
-- ========================================
|
||
-- 1. 扩展订单表
|
||
-- ========================================
|
||
|
||
-- 检查并添加支付方式相关字段
|
||
SET @dbname = DATABASE();
|
||
SET @tablename = 'order';
|
||
|
||
-- payment_method
|
||
SET @columnname = 'payment_method';
|
||
SET @preparedStatement = (SELECT IF(
|
||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) > 0,
|
||
'SELECT ''payment_method字段已存在'' AS message',
|
||
CONCAT('ALTER TABLE `', @tablename, '` ADD COLUMN `', @columnname, '` VARCHAR(50) COMMENT ''支付方式:wallet,timecard,package,wechat,mixed'' AFTER `pay_status`')
|
||
));
|
||
PREPARE alterIfNotExists FROM @preparedStatement;
|
||
EXECUTE alterIfNotExists;
|
||
DEALLOCATE PREPARE alterIfNotExists;
|
||
|
||
-- wallet_amount
|
||
SET @columnname = 'wallet_amount';
|
||
SET @preparedStatement = (SELECT IF(
|
||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) > 0,
|
||
'SELECT ''wallet_amount字段已存在'' AS message',
|
||
CONCAT('ALTER TABLE `', @tablename, '` ADD COLUMN `', @columnname, '` DECIMAL(10,2) DEFAULT 0.00 COMMENT ''钱包支付金额''')
|
||
));
|
||
PREPARE alterIfNotExists FROM @preparedStatement;
|
||
EXECUTE alterIfNotExists;
|
||
DEALLOCATE PREPARE alterIfNotExists;
|
||
|
||
-- timecard_id
|
||
SET @columnname = 'timecard_id';
|
||
SET @preparedStatement = (SELECT IF(
|
||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) > 0,
|
||
'SELECT ''timecard_id字段已存在'' AS message',
|
||
CONCAT('ALTER TABLE `', @tablename, '` ADD COLUMN `', @columnname, '` BIGINT COMMENT ''使用的次卡ID''')
|
||
));
|
||
PREPARE alterIfNotExists FROM @preparedStatement;
|
||
EXECUTE alterIfNotExists;
|
||
DEALLOCATE PREPARE alterIfNotExists;
|
||
|
||
-- package_id
|
||
SET @columnname = 'package_id';
|
||
SET @preparedStatement = (SELECT IF(
|
||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) > 0,
|
||
'SELECT ''package_id字段已存在'' AS message',
|
||
CONCAT('ALTER TABLE `', @tablename, '` ADD COLUMN `', @columnname, '` BIGINT COMMENT ''使用的套餐ID''')
|
||
));
|
||
PREPARE alterIfNotExists FROM @preparedStatement;
|
||
EXECUTE alterIfNotExists;
|
||
DEALLOCATE PREPARE alterIfNotExists;
|
||
|
||
-- coupon_id
|
||
SET @columnname = 'coupon_id';
|
||
SET @preparedStatement = (SELECT IF(
|
||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) > 0,
|
||
'SELECT ''coupon_id字段已存在'' AS message',
|
||
CONCAT('ALTER TABLE `', @tablename, '` ADD COLUMN `', @columnname, '` BIGINT COMMENT ''使用的优惠券ID''')
|
||
));
|
||
PREPARE alterIfNotExists FROM @preparedStatement;
|
||
EXECUTE alterIfNotExists;
|
||
DEALLOCATE PREPARE alterIfNotExists;
|
||
|
||
-- coupon_discount
|
||
SET @columnname = 'coupon_discount';
|
||
SET @preparedStatement = (SELECT IF(
|
||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) > 0,
|
||
'SELECT ''coupon_discount字段已存在'' AS message',
|
||
CONCAT('ALTER TABLE `', @tablename, '` ADD COLUMN `', @columnname, '` DECIMAL(10,2) DEFAULT 0.00 COMMENT ''优惠券折扣金额''')
|
||
));
|
||
PREPARE alterIfNotExists FROM @preparedStatement;
|
||
EXECUTE alterIfNotExists;
|
||
DEALLOCATE PREPARE alterIfNotExists;
|
||
|
||
-- service_address_id
|
||
SET @columnname = 'service_address_id';
|
||
SET @preparedStatement = (SELECT IF(
|
||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) > 0,
|
||
'SELECT ''service_address_id字段已存在'' AS message',
|
||
CONCAT('ALTER TABLE `', @tablename, '` ADD COLUMN `', @columnname, '` BIGINT COMMENT ''服务地址ID''')
|
||
));
|
||
PREPARE alterIfNotExists FROM @preparedStatement;
|
||
EXECUTE alterIfNotExists;
|
||
DEALLOCATE PREPARE alterIfNotExists;
|
||
|
||
-- original_amount
|
||
SET @columnname = 'original_amount';
|
||
SET @preparedStatement = (SELECT IF(
|
||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) > 0,
|
||
'SELECT ''original_amount字段已存在'' AS message',
|
||
CONCAT('ALTER TABLE `', @tablename, '` ADD COLUMN `', @columnname, '` DECIMAL(10,2) COMMENT ''原价'' AFTER `pay_amount`')
|
||
));
|
||
PREPARE alterIfNotExists FROM @preparedStatement;
|
||
EXECUTE alterIfNotExists;
|
||
DEALLOCATE PREPARE alterIfNotExists;
|
||
|
||
-- discount_amount
|
||
SET @columnname = 'discount_amount';
|
||
SET @preparedStatement = (SELECT IF(
|
||
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) > 0,
|
||
'SELECT ''discount_amount字段已存在'' AS message',
|
||
CONCAT('ALTER TABLE `', @tablename, '` ADD COLUMN `', @columnname, '` DECIMAL(10,2) DEFAULT 0.00 COMMENT ''总折扣金额''')
|
||
));
|
||
PREPARE alterIfNotExists FROM @preparedStatement;
|
||
EXECUTE alterIfNotExists;
|
||
DEALLOCATE PREPARE alterIfNotExists;
|
||
|
||
-- 添加索引(使用IF NOT EXISTS避免重复)
|
||
SET @sql = 'ALTER TABLE `order` ADD INDEX `idx_timecard_id` (`timecard_id`)';
|
||
SET @indexExists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'order' AND INDEX_NAME = 'idx_timecard_id');
|
||
SET @sql = IF(@indexExists = 0, @sql, 'SELECT ''索引idx_timecard_id已存在'' AS message');
|
||
PREPARE stmt FROM @sql;
|
||
EXECUTE stmt;
|
||
DEALLOCATE PREPARE stmt;
|
||
|
||
SET @sql = 'ALTER TABLE `order` ADD INDEX `idx_package_id` (`package_id`)';
|
||
SET @indexExists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'order' AND INDEX_NAME = 'idx_package_id');
|
||
SET @sql = IF(@indexExists = 0, @sql, 'SELECT ''索引idx_package_id已存在'' AS message');
|
||
PREPARE stmt FROM @sql;
|
||
EXECUTE stmt;
|
||
DEALLOCATE PREPARE stmt;
|
||
|
||
SET @sql = 'ALTER TABLE `order` ADD INDEX `idx_coupon_id` (`coupon_id`)';
|
||
SET @indexExists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'order' AND INDEX_NAME = 'idx_coupon_id');
|
||
SET @sql = IF(@indexExists = 0, @sql, 'SELECT ''索引idx_coupon_id已存在'' AS message');
|
||
PREPARE stmt FROM @sql;
|
||
EXECUTE stmt;
|
||
DEALLOCATE PREPARE stmt;
|
||
|
||
SET @sql = 'ALTER TABLE `order` ADD INDEX `idx_service_address_id` (`service_address_id`)';
|
||
SET @indexExists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'order' AND INDEX_NAME = 'idx_service_address_id');
|
||
SET @sql = IF(@indexExists = 0, @sql, 'SELECT ''索引idx_service_address_id已存在'' AS message');
|
||
PREPARE stmt FROM @sql;
|
||
EXECUTE stmt;
|
||
DEALLOCATE PREPARE stmt;
|
||
|
||
SELECT '✅ 订单表扩展完成' AS message;
|
||
|
||
-- ========================================
|
||
-- 2. 创建优惠券表
|
||
-- ========================================
|
||
|
||
CREATE TABLE IF NOT EXISTS `coupon` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`name` VARCHAR(100) NOT NULL COMMENT '优惠券名称',
|
||
`type` TINYINT NOT NULL COMMENT '类型:1-满减券,2-折扣券,3-代金券',
|
||
`discount_type` TINYINT NOT NULL COMMENT '折扣类型:1-金额,2-折扣',
|
||
`discount_value` DECIMAL(10,2) NOT NULL COMMENT '折扣值(金额或折扣率)',
|
||
`min_amount` DECIMAL(10,2) DEFAULT 0.00 COMMENT '最低消费金额',
|
||
`max_discount` DECIMAL(10,2) COMMENT '最大折扣金额',
|
||
`total_quantity` INT NOT NULL COMMENT '发行总量',
|
||
`received_quantity` INT DEFAULT 0 COMMENT '已领取数量',
|
||
`used_quantity` INT DEFAULT 0 COMMENT '已使用数量',
|
||
`start_time` DATETIME NOT NULL COMMENT '开始时间',
|
||
`end_time` DATETIME NOT NULL COMMENT '结束时间',
|
||
`status` TINYINT DEFAULT 1 COMMENT '状态:0-停用,1-启用',
|
||
`tenant_id` BIGINT COMMENT '租户ID',
|
||
`created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_status` (`status`),
|
||
KEY `idx_start_end_time` (`start_time`, `end_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券表';
|
||
|
||
SELECT '✅ 优惠券表创建完成' AS message;
|
||
|
||
-- ========================================
|
||
-- 3. 创建用户优惠券表
|
||
-- ========================================
|
||
|
||
CREATE TABLE IF NOT EXISTS `user_coupon` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`coupon_id` BIGINT NOT NULL COMMENT '优惠券ID',
|
||
`order_id` BIGINT COMMENT '使用的订单ID',
|
||
`status` TINYINT DEFAULT 0 COMMENT '状态:0-未使用,1-已使用,2-已过期',
|
||
`receive_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '领取时间',
|
||
`use_time` DATETIME COMMENT '使用时间',
|
||
`expire_time` DATETIME NOT NULL COMMENT '过期时间',
|
||
`tenant_id` BIGINT COMMENT '租户ID',
|
||
`created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_user_id` (`user_id`),
|
||
KEY `idx_coupon_id` (`coupon_id`),
|
||
KEY `idx_order_id` (`order_id`),
|
||
KEY `idx_status` (`status`),
|
||
KEY `idx_expire_time` (`expire_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户优惠券表';
|
||
|
||
SELECT '✅ 用户优惠券表创建完成' AS message;
|
||
|
||
-- ========================================
|
||
-- 4. 创建用户地址表
|
||
-- ========================================
|
||
|
||
CREATE TABLE IF NOT EXISTS `user_address` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`contact_name` VARCHAR(50) NOT NULL COMMENT '联系人姓名',
|
||
`contact_phone` VARCHAR(20) NOT NULL COMMENT '联系电话',
|
||
`province` VARCHAR(50) COMMENT '省份',
|
||
`city` VARCHAR(50) COMMENT '城市',
|
||
`district` VARCHAR(50) COMMENT '区县',
|
||
`address` VARCHAR(200) NOT NULL COMMENT '详细地址',
|
||
`address_tag` VARCHAR(20) COMMENT '地址标签:家,公司,学校',
|
||
`longitude` DECIMAL(10,6) COMMENT '经度',
|
||
`latitude` DECIMAL(10,6) COMMENT '纬度',
|
||
`is_default` TINYINT DEFAULT 0 COMMENT '是否默认地址:0-否,1-是',
|
||
`tenant_id` BIGINT COMMENT '租户ID',
|
||
`created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_user_id` (`user_id`),
|
||
KEY `idx_is_default` (`is_default`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户地址表';
|
||
|
||
SELECT '✅ 用户地址表创建完成' AS message;
|
||
|
||
-- ========================================
|
||
-- 5. 创建用户套餐表
|
||
-- ========================================
|
||
|
||
CREATE TABLE IF NOT EXISTS `user_package` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`package_id` BIGINT NOT NULL COMMENT '套餐ID',
|
||
`package_name` VARCHAR(100) NOT NULL COMMENT '套餐名称',
|
||
`package_type` VARCHAR(50) COMMENT '套餐类型',
|
||
`total_hours` DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '总课时',
|
||
`used_hours` DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '已使用课时',
|
||
`remaining_hours` DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '剩余课时',
|
||
`service_count` INT DEFAULT 0 COMMENT '服务次数',
|
||
`used_count` INT DEFAULT 0 COMMENT '已使用次数',
|
||
`remaining_count` INT DEFAULT 0 COMMENT '剩余次数',
|
||
`price` DECIMAL(10,2) COMMENT '购买价格',
|
||
`purchase_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '购买时间',
|
||
`start_date` DATE COMMENT '开始日期',
|
||
`expire_date` DATE COMMENT '过期日期',
|
||
`status` TINYINT DEFAULT 1 COMMENT '状态:0-已过期,1-使用中,2-已用完',
|
||
`version` INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||
`tenant_id` BIGINT COMMENT '租户ID',
|
||
`created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` TINYINT DEFAULT 0 COMMENT '删除标记',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_user_id` (`user_id`),
|
||
KEY `idx_package_id` (`package_id`),
|
||
KEY `idx_status` (`status`),
|
||
KEY `idx_expire_date` (`expire_date`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户套餐表';
|
||
|
||
SELECT '✅ 用户套餐表创建完成' AS message;
|
||
|
||
-- ========================================
|
||
-- 6. 插入测试数据
|
||
-- ========================================
|
||
|
||
-- 插入测试优惠券
|
||
INSERT INTO `coupon` (`name`, `type`, `discount_type`, `discount_value`, `min_amount`, `max_discount`, `total_quantity`, `start_time`, `end_time`, `status`, `tenant_id`)
|
||
VALUES
|
||
('新用户专享券', 1, 1, 20.00, 100.00, 20.00, 1000, '2026-01-01 00:00:00', '2026-12-31 23:59:59', 1, 1),
|
||
('满200减50', 1, 1, 50.00, 200.00, 50.00, 500, '2026-01-01 00:00:00', '2026-12-31 23:59:59', 1, 1),
|
||
('8折优惠券', 2, 2, 0.80, 0.00, 100.00, 300, '2026-01-01 00:00:00', '2026-12-31 23:59:59', 1, 1)
|
||
ON DUPLICATE KEY UPDATE `name` = VALUES(`name`);
|
||
|
||
SELECT '✅ 测试数据插入完成' AS message;
|
||
|
||
-- ========================================
|
||
-- 完成
|
||
-- ========================================
|
||
|
||
SELECT '========================================' AS '';
|
||
SELECT '✅ 方案A数据库脚本执行完成' AS message;
|
||
SELECT '========================================' AS '';
|
||
SELECT '创建的表:' AS '';
|
||
SELECT ' 1. coupon - 优惠券表' AS '';
|
||
SELECT ' 2. user_coupon - 用户优惠券表' AS '';
|
||
SELECT ' 3. user_address - 用户地址表' AS '';
|
||
SELECT ' 4. user_package - 用户套餐表' AS '';
|
||
SELECT '扩展的表:' AS '';
|
||
SELECT ' 1. order - 添加支付方式相关字段' AS '';
|
||
SELECT '========================================' AS '';
|