Files
Mycontent/soul-api/scripts/manual-order-referrer-bind.sql
乘风 2645212d47 feat: update API base URLs and enhance icon designs
- Updated the API base URLs in app.js to point to local development server for testing.
- Enhanced SVG icons with gradient fills for improved visual appeal across various components.
- Refactored the avatar upload functionality in avatar-nickname.js and profile-edit.js to utilize a new upload utility for better code maintainability.
- Improved the layout and styling of the my page and super article editor for a more user-friendly interface.

This update aims to streamline development processes and enhance the overall user experience in the application.
2026-05-09 16:00:16 +08:00

133 lines
5.2 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.

-- 手工补录订单推荐人 + 与支付回调一致的分佣累计pending_earnings、referral_bindings
-- 逻辑对齐 soul-api/internal/handler/miniprogram.go processReferralCommission
-- 与 referral_commission.go computeOrderCommission
--
-- 使用前填写下面两个变量,并在测试库先执行「第四节」预览佣金。
-- MySQL 5.7+ / 8.0+(需 JSON 函数)
--
-- 若报 1267 Illegal mix of collations表字段与客户端/会话默认 collation 不一致(常见 unicode_ci vs general_ci
-- 下面 SET NAMES + 字符串比较处 COLLATE 已对齐;若库表统一为 general_ci可把脚本中 utf8mb4_unicode_ci 全部改为 utf8mb4_general_ci。
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
-- ============ 1. 填写 ============
SET @order_sn = 'MP20260508082957878950';
SET @referrer_id = 'ogpTW5QBRQNUOm4-zvg8it2XySrI';
-- =================================
SET @cfg := (
SELECT config_value FROM system_config
WHERE config_key COLLATE utf8mb4_unicode_ci = CONVERT('referral_config' USING utf8mb4) COLLATE utf8mb4_unicode_ci
LIMIT 1
);
SELECT id, user_id, amount, product_type, status, pay_time
INTO @order_id, @buyer_id, @amt, @ptype, @ostatus, @pay_time
FROM orders
WHERE order_sn COLLATE utf8mb4_unicode_ci = (@order_sn COLLATE utf8mb4_unicode_ci)
LIMIT 1;
SELECT COUNT(*) INTO @ref_exists FROM users
WHERE id COLLATE utf8mb4_unicode_ci = (@referrer_id COLLATE utf8mb4_unicode_ci);
SET @ref_code := NULL;
SELECT referral_code INTO @ref_code FROM users
WHERE id COLLATE utf8mb4_unicode_ci = (@referrer_id COLLATE utf8mb4_unicode_ci)
LIMIT 1;
SET @dist_pct := COALESCE(CAST(JSON_UNQUOTE(JSON_EXTRACT(@cfg, '$.distributorShare')) AS DECIMAL(18,6)), 90);
SET @disc_pct := COALESCE(CAST(JSON_UNQUOTE(JSON_EXTRACT(@cfg, '$.userDiscount')) AS DECIMAL(18,6)), 0);
SET @vip_vip_pct := COALESCE(CAST(JSON_UNQUOTE(JSON_EXTRACT(@cfg, '$.vipOrderShareVip')) AS DECIMAL(18,6)), 20);
SET @vip_non_pct := COALESCE(CAST(JSON_UNQUOTE(JSON_EXTRACT(@cfg, '$.vipOrderShareNonVip')) AS DECIMAL(18,6)), 10);
SET @disc := @disc_pct / 100;
SET @dist := @dist_pct / 100;
SET @ref_is_vip := IFNULL((
SELECT (COALESCE(u.is_vip, 0) <> 0)
AND (u.vip_expire_date IS NULL OR u.vip_expire_date > NOW())
FROM users u
WHERE u.id COLLATE utf8mb4_unicode_ci = (@referrer_id COLLATE utf8mb4_unicode_ci)
LIMIT 1
), 0);
SET @commission := CASE
WHEN @order_id IS NULL THEN NULL
WHEN @ref_exists = 0 THEN NULL
WHEN (@ostatus COLLATE utf8mb4_unicode_ci) <> (CONVERT('paid' USING utf8mb4) COLLATE utf8mb4_unicode_ci) THEN NULL
WHEN (@buyer_id COLLATE utf8mb4_unicode_ci) = (@referrer_id COLLATE utf8mb4_unicode_ci) THEN 0
WHEN @ptype COLLATE utf8mb4_unicode_ci IN (
CONVERT('link_karuo_tip' USING utf8mb4) COLLATE utf8mb4_unicode_ci,
CONVERT('mentor_consultation' USING utf8mb4) COLLATE utf8mb4_unicode_ci
) THEN 0
WHEN (@ptype COLLATE utf8mb4_unicode_ci) = (CONVERT('vip' USING utf8mb4) COLLATE utf8mb4_unicode_ci) THEN @amt * IF(
@ref_is_vip,
@vip_vip_pct / 100,
@vip_non_pct / 100
)
ELSE
(
CASE
WHEN @disc > 0 THEN @amt / (1 - @disc)
ELSE @amt
END
) * @dist
END;
SET @commission := ROUND(IFNULL(@commission, 0), 2);
-- ============ 4. 预览(先单独执行到上一行,检查变量)============
SELECT
@order_id AS order_id,
@order_sn AS order_sn,
@buyer_id AS buyer_user_id,
@referrer_id AS referrer_user_id,
@amt AS amount,
@ptype AS product_type,
@ostatus AS order_status,
@commission AS commission_to_add,
@ref_code AS referrer_code_for_order,
@pay_time AS order_pay_time;
-- 若 @order_id / @ref_exists / status 异常,不要执行下面事务。
-- ============ 5. 执行变更(确认预览无误后执行)============
START TRANSACTION;
UPDATE orders
SET
referrer_id = @referrer_id,
referral_code = IFNULL(@ref_code, referral_code)
WHERE id = @order_id
AND order_sn COLLATE utf8mb4_unicode_ci = (@order_sn COLLATE utf8mb4_unicode_ci)
AND @ref_exists > 0
AND (@buyer_id COLLATE utf8mb4_unicode_ci) <> (@referrer_id COLLATE utf8mb4_unicode_ci);
UPDATE users
SET pending_earnings = COALESCE(pending_earnings, 0) + @commission
WHERE id COLLATE utf8mb4_unicode_ci = (@referrer_id COLLATE utf8mb4_unicode_ci)
AND @commission > 0;
UPDATE referral_bindings rb
INNER JOIN (
SELECT id
FROM referral_bindings
WHERE referee_id COLLATE utf8mb4_unicode_ci = (@buyer_id COLLATE utf8mb4_unicode_ci)
AND referrer_id COLLATE utf8mb4_unicode_ci = (@referrer_id COLLATE utf8mb4_unicode_ci)
AND status COLLATE utf8mb4_unicode_ci = (CONVERT('active' USING utf8mb4) COLLATE utf8mb4_unicode_ci)
ORDER BY binding_date DESC
LIMIT 1
) t ON rb.id = t.id
SET
last_purchase_date = COALESCE(@pay_time, NOW()),
purchase_count = COALESCE(purchase_count, 0) + 1,
total_commission = COALESCE(total_commission, 0) + @commission
WHERE @commission > 0;
COMMIT;
-- ============ 6. 备注 ============
-- · 若 referral_bindings 无对应 (买家,推荐人) 的 active 行UPDATE 影响 0 行,属正常;
-- 需业务上是否补插绑定记录另行处理。
-- · 若订单已有 referrer_id本脚本会覆盖为 @referrer_id。
-- · commission 为 0 时仍会更新 orders 的推荐人字段,但不加 pending_earnings / 绑定累计。