peixue-dev/Archive/peidu-temp-files/sql/plan_a_payment_system_database_2026-01-23.sql

296 lines
14 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ========================================
-- 方案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 '';