Files
Mycontent/soul-api/scripts/fix-vip-orders.sql
2026-03-07 22:58:43 +08:00

84 lines
3.4 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.

-- ============================================================
-- VIP 订单修复脚本
-- 场景:甲方开发的 VIP 支付可能未正确设置 product_type
-- 会员价1980 元
-- 执行前请先备份数据库!
-- ============================================================
-- 1. 诊断:查看当前疑似 VIP 订单的状态(执行后人工确认)
-- --------------------------------------------------------
SELECT id, order_sn, user_id, product_type, amount, status, pay_time, created_at
FROM orders
WHERE amount = 1980
AND (status = 'paid' OR status = 'completed')
ORDER BY pay_time DESC;
-- 2. 统计:有多少条需要修复
-- --------------------------------------------------------
SELECT COUNT(*) AS need_fix_count
FROM orders
WHERE amount = 1980
AND (status = 'paid' OR status = 'completed')
AND (product_type IS NULL OR product_type = '' OR product_type NOT IN ('vip', 'fullbook'));
-- 3. 修复:将 1980 元已支付订单的 product_type 设为 'vip'
-- --------------------------------------------------------
-- 条件:金额=1980 且 已支付 且 product_type 不是 vip/fullbook
UPDATE orders
SET product_type = 'vip'
WHERE amount = 1980
AND (status = 'paid' OR status = 'completed')
AND (product_type IS NULL OR product_type = '' OR product_type NOT IN ('vip', 'fullbook'));
-- 4. 兼容大小写:若 product_type 为 'VIP'、'Vip' 等,统一为小写
-- --------------------------------------------------------
UPDATE orders
SET product_type = 'vip'
WHERE amount = 1980
AND (status = 'paid' OR status = 'completed')
AND LOWER(TRIM(product_type)) = 'vip'
AND product_type != 'vip';
-- 5. 验证:修复后应无遗漏
-- --------------------------------------------------------
SELECT id, order_sn, user_id, product_type, amount, status
FROM orders
WHERE amount = 1980
AND (status = 'paid' OR status = 'completed')
AND product_type NOT IN ('vip', 'fullbook');
-- 期望结果0 行
-- ============================================================
-- 可选:若线上 next-project 用 users 表存 is_vip需确保字段存在
-- 执行前请确认 users 表是否已有这些列!
-- ============================================================
-- 6. 检查 users 表是否有 VIP 相关列MySQL
-- SHOW COLUMNS FROM users LIKE 'is_vip';
-- SHOW COLUMNS FROM users LIKE 'vip_expire_date';
-- 7. 若 users 表无 VIP 列,可执行以下 ALTER按需取消注释
-- --------------------------------------------------------
-- ALTER TABLE users ADD COLUMN is_vip TINYINT(1) DEFAULT 0;
-- ALTER TABLE users ADD COLUMN vip_expire_date DATETIME NULL;
-- ALTER TABLE users ADD COLUMN vip_name VARCHAR(100) NULL;
-- ALTER TABLE users ADD COLUMN vip_avatar VARCHAR(500) NULL;
-- ALTER TABLE users ADD COLUMN vip_project VARCHAR(200) NULL;
-- ALTER TABLE users ADD COLUMN vip_contact VARCHAR(100) NULL;
-- ALTER TABLE users ADD COLUMN vip_bio TEXT NULL;
-- 8. 从 orders 同步到 users仅当用 users 表存 VIP 时)
-- 将 1980 元已支付订单对应的用户标记为 VIP过期日 = pay_time + 365 天
-- --------------------------------------------------------
-- UPDATE users u
-- INNER JOIN (
-- SELECT user_id, MAX(pay_time) AS last_pay
-- FROM orders
-- WHERE amount = 1980
-- AND (status = 'paid' OR status = 'completed')
-- AND product_type IN ('vip', 'fullbook')
-- GROUP BY user_id
-- ) o ON u.id = o.user_id
-- SET u.is_vip = 1,
-- u.vip_expire_date = DATE_ADD(o.last_pay, INTERVAL 365 DAY);