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

386 lines
18 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.

-- ============================================
-- 核心支付流程 - 数据库脚本(修复版)
-- 创建日期: 2026-01-23
-- 数据库: peixue
-- 说明: 兼容MySQL 5.7+,不使用 IF NOT EXISTS
-- ============================================
USE peixue;
-- ============================================
-- 1. 扩展订单表 (order)
-- ============================================
-- 检查并添加支付方式相关字段
SET @dbname = 'peixue';
SET @tablename = 'order';
-- payment_method
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'payment_method';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `payment_method` VARCHAR(50) COMMENT ''支付方式wallet,timecard,package,wechat,mixed'' AFTER `payment_status`',
'SELECT ''Column payment_method already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- wallet_amount
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'wallet_amount';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `wallet_amount` DECIMAL(10,2) DEFAULT 0.00 COMMENT ''钱包支付金额''',
'SELECT ''Column wallet_amount already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- timecard_id
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'timecard_id';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `timecard_id` BIGINT COMMENT ''使用的次卡ID''',
'SELECT ''Column timecard_id already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- package_id
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'package_id';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `package_id` BIGINT COMMENT ''使用的套餐ID''',
'SELECT ''Column package_id already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- coupon_id
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'coupon_id';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `coupon_id` BIGINT COMMENT ''使用的优惠券ID''',
'SELECT ''Column coupon_id already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- coupon_discount
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'coupon_discount';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `coupon_discount` DECIMAL(10,2) DEFAULT 0.00 COMMENT ''优惠券折扣金额''',
'SELECT ''Column coupon_discount already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- service_address_id
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'service_address_id';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `service_address_id` BIGINT COMMENT ''服务地址ID''',
'SELECT ''Column service_address_id already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- original_amount
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'original_amount';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `original_amount` DECIMAL(10,2) COMMENT ''原价''',
'SELECT ''Column original_amount already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- discount_amount
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'discount_amount';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `discount_amount` DECIMAL(10,2) DEFAULT 0.00 COMMENT ''总折扣金额''',
'SELECT ''Column discount_amount already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- teacher_income
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'teacher_income';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `teacher_income` DECIMAL(10,2) DEFAULT 0.00 COMMENT ''陪伴员收益''',
'SELECT ''Column teacher_income already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- manager_commission
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'manager_commission';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `manager_commission` DECIMAL(10,2) DEFAULT 0.00 COMMENT ''管理师提成''',
'SELECT ''Column manager_commission already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- platform_income
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'platform_income';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `platform_income` DECIMAL(10,2) DEFAULT 0.00 COMMENT ''平台收益''',
'SELECT ''Column platform_income already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- settlement_status
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'settlement_status';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `settlement_status` TINYINT DEFAULT 0 COMMENT ''结算状态0-未结算1-已结算''',
'SELECT ''Column settlement_status already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- settlement_time
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = 'settlement_time';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `order` ADD COLUMN `settlement_time` DATETIME COMMENT ''结算时间''',
'SELECT ''Column settlement_time already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加索引(忽略已存在的索引错误)
ALTER TABLE `order` ADD INDEX `idx_timecard_id` (`timecard_id`);
ALTER TABLE `order` ADD INDEX `idx_package_id` (`package_id`);
ALTER TABLE `order` ADD INDEX `idx_coupon_id` (`coupon_id`);
ALTER TABLE `order` ADD INDEX `idx_service_address_id` (`service_address_id`);
ALTER TABLE `order` ADD INDEX `idx_settlement_status` (`settlement_status`);
-- ============================================
-- 2. 创建钱包表 (wallet)
-- ============================================
CREATE TABLE IF NOT EXISTS `wallet` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`balance` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '余额',
`frozen_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '冻结金额',
`total_recharge` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '累计充值',
`total_consume` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '累计消费',
`total_withdraw` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '累计提现',
`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`),
UNIQUE KEY `uk_user_id` (`user_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='钱包表';
-- ============================================
-- 3. 创建钱包交易记录表 (wallet_transaction)
-- ============================================
CREATE TABLE IF NOT EXISTS `wallet_transaction` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`wallet_id` BIGINT NOT NULL COMMENT '钱包ID',
`order_id` BIGINT COMMENT '关联订单ID',
`transaction_type` VARCHAR(50) NOT NULL COMMENT '交易类型recharge-充值consume-消费refund-退款withdraw-提现income-收益',
`amount` DECIMAL(10,2) NOT NULL COMMENT '交易金额',
`balance_before` DECIMAL(10,2) NOT NULL COMMENT '交易前余额',
`balance_after` DECIMAL(10,2) NOT NULL COMMENT '交易后余额',
`transaction_no` VARCHAR(100) COMMENT '交易流水号',
`payment_channel` VARCHAR(50) COMMENT '支付渠道wechat,alipay',
`status` TINYINT DEFAULT 1 COMMENT '状态0-失败1-成功2-处理中',
`remark` VARCHAR(500) 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_wallet_id` (`wallet_id`),
KEY `idx_order_id` (`order_id`),
KEY `idx_transaction_no` (`transaction_no`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='钱包交易记录表';
-- ============================================
-- 4. 创建次卡表 (time_card)
-- ============================================
CREATE TABLE IF NOT EXISTS `time_card` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`name` VARCHAR(100) NOT NULL COMMENT '次卡名称',
`total_times` INT NOT NULL DEFAULT 0 COMMENT '总次数',
`used_times` INT NOT NULL DEFAULT 0 COMMENT '已使用次数',
`remaining_times` INT NOT NULL DEFAULT 0 COMMENT '剩余次数',
`price` DECIMAL(10,2) NOT NULL 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_status` (`status`),
KEY `idx_expire_date` (`expire_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='次卡表';
-- ============================================
-- 5. 创建次卡使用记录表 (time_card_usage)
-- ============================================
CREATE TABLE IF NOT EXISTS `time_card_usage` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`timecard_id` BIGINT NOT NULL COMMENT '次卡ID',
`order_id` BIGINT NOT NULL COMMENT '订单ID',
`used_times` INT NOT NULL DEFAULT 1 COMMENT '使用次数',
`remaining_times` INT NOT NULL COMMENT '剩余次数',
`remark` VARCHAR(500) 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_timecard_id` (`timecard_id`),
KEY `idx_order_id` (`order_id`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='次卡使用记录表';
-- ============================================
-- 6. 创建优惠券表 (coupon)
-- ============================================
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='优惠券表';
-- ============================================
-- 7. 创建用户优惠券表 (user_coupon)
-- ============================================
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='用户优惠券表';
-- ============================================
-- 8. 创建用户地址表 (user_address)
-- ============================================
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='用户地址表';
-- ============================================
-- 9. 创建管理师提成表 (manager_commission)
-- ============================================
CREATE TABLE IF NOT EXISTS `manager_commission` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`manager_id` BIGINT NOT NULL COMMENT '管理师ID',
`order_id` BIGINT NOT NULL COMMENT '订单ID',
`order_amount` DECIMAL(10,2) NOT NULL COMMENT '订单金额',
`commission_ratio` DECIMAL(5,2) NOT NULL DEFAULT 10.00 COMMENT '提成比例(%',
`commission_amount` DECIMAL(10,2) NOT NULL COMMENT '提成金额',
`status` TINYINT DEFAULT 0 COMMENT '状态0-未结算1-已结算',
`settlement_time` DATETIME COMMENT '结算时间',
`remark` VARCHAR(500) 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_manager_id` (`manager_id`),
KEY `idx_order_id` (`order_id`),
KEY `idx_status` (`status`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理师提成表';
-- ============================================
-- 完成提示
-- ============================================
SELECT '✅ 核心支付流程数据库脚本执行完成!' AS message;