shop-back-end/doc/sql/user_balance_action.sql

95 lines
3.8 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.

-- 首先,我们需要找到所有符合条件的订单(已支付且使用余额支付)
-- 然后关联到shop_order_goods计算每个用户的总余额使用情况
-- 最后更新user_balance表的use_balance字段
-- 先创建一个临时表来存储每个用户的use_balance计算结果
CREATE TEMPORARY TABLE IF NOT EXISTS temp_user_balance_calc (
ab98_user_id BIGINT NOT NULL,
total_use_balance BIGINT NOT NULL DEFAULT 0,
PRIMARY KEY (ab98_user_id)
);
-- 清空临时表
TRUNCATE TABLE temp_user_balance_calc;
-- 计算每个用户的use_balance
-- 规则status为1的total_amount总和 - status为2的total_amount总和
-- 注意total_amount是元需要转换为分乘以100
INSERT INTO temp_user_balance_calc (ab98_user_id, total_use_balance)
SELECT
COALESCE(
-- 优先使用ab98_user_id直接关联
so.ab98_user_id,
-- 通过openid关联ab98_user表
au.ab98_user_id,
-- 通过openid关联wx_user表再关联ab98_user表
wu.ab98_user_id,
-- 通过userid关联ab98_user表
au_by_userid.ab98_user_id,
-- 通过userid关联qy_user表再关联ab98_user表
qu.ab98_user_id
) AS final_ab98_user_id,
-- 计算总使用余额(单位:分)
SUM(
CASE sog.status
WHEN 1 THEN CAST(sog.total_amount * 100 AS UNSIGNED) -- 正常购买,增加使用余额
-- WHEN 2 THEN -CAST(sog.total_amount * 100 AS UNSIGNED) -- 退货,减少使用余额
ELSE 0
END
) AS total_use_balance
FROM shop_order so
-- 关联订单商品
INNER JOIN shop_order_goods sog ON so.order_id = sog.order_id
-- 通过openid关联ab98_user表
LEFT JOIN ab98_user au ON so.openid = au.openid COLLATE utf8mb4_unicode_ci
-- 通过openid关联wx_user表再获取ab98_user_id
LEFT JOIN wx_user wu ON so.openid = wu.openid COLLATE utf8mb4_unicode_ci
-- 通过userid关联ab98_user表使用userid字段
LEFT JOIN ab98_user au_by_userid ON so.userid = au_by_userid.userid COLLATE utf8mb4_unicode_ci
-- 通过userid关联qy_user表
LEFT JOIN qy_user qu ON so.userid = qu.userid COLLATE utf8mb4_unicode_ci
WHERE so.pay_status = 2 -- 已支付
AND so.payment_method = 'balance' -- 余额支付方式
-- 限定特定的corpid请将'wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw'替换为实际的corpid
AND so.corpid = 'wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw' COLLATE utf8mb4_unicode_ci
-- 确保商品状态是1或2
AND sog.status IN (1, 2)
-- 确保能关联到ab98_user
AND (
so.ab98_user_id IS NOT NULL
OR au.ab98_user_id IS NOT NULL
OR wu.ab98_user_id IS NOT NULL
OR au_by_userid.ab98_user_id IS NOT NULL
OR qu.ab98_user_id IS NOT NULL
)
GROUP BY final_ab98_user_id
HAVING final_ab98_user_id IS NOT NULL;
-- 更新user_balance表的use_balance字段
UPDATE user_balance ub
INNER JOIN temp_user_balance_calc calc ON ub.ab98_user_id = calc.ab98_user_id
SET ub.use_balance = calc.total_use_balance
-- 限定特定的corpid请将'wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw'替换为实际的corpid
WHERE ub.corpid = 'wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw' COLLATE utf8mb4_unicode_ci;
-- 修改user_balance的balance值为balance_limit - use_balance
UPDATE user_balance ub
SET ub.balance = ub.balance_limit - ub.use_balance
WHERE ub.corpid = 'wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw' COLLATE utf8mb4_unicode_ci;
-- 删除临时表
DROP TEMPORARY TABLE IF EXISTS temp_user_balance_calc;
-- 显示更新结果
SELECT
ub.user_balance_id,
ub.ab98_user_id,
ub.balance,
ub.use_balance,
ub.balance_limit,
CONCAT(FORMAT(ub.use_balance / 100, 2), '') AS use_balance_yuan,
CONCAT(FORMAT(ub.balance / 100, 2), '') AS balance_yuan,
CONCAT(FORMAT(ub.balance_limit / 100, 2), '') AS balance_limit_yuan
FROM user_balance ub
WHERE ub.corpid = 'wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw' COLLATE utf8mb4_unicode_ci
ORDER BY ub.ab98_user_id;