hyapp-server/tools/reset-lucky-gift-local-data.sh
2026-05-29 12:52:58 +08:00

178 lines
6.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# 清理本地 Docker MySQL 的幸运礼物运行态数据,不删除后台发布的 lucky_gift_rule_versions / stage_tiers。
# 常用:
# APP_CODE=lalu ./tools/reset-lucky-gift-local-data.sh
# APP_CODE=lalu USER_ID=123456 POOL_ID=lucky_100 ./tools/reset-lucky-gift-local-data.sh
APP_CODE="${APP_CODE:-lalu}"
USER_ID="${USER_ID:-}"
POOL_ID="${POOL_ID:-}"
RESET_SHARED="${RESET_SHARED:-1}"
MYSQL_CONTAINER="${MYSQL_CONTAINER:-hyapp-mysql}"
if [[ -n "$USER_ID" && ! "$USER_ID" =~ ^[0-9]+$ ]]; then
echo "USER_ID must be numeric: $USER_ID" >&2
exit 2
fi
sql_string() {
local value="${1//\\/\\\\}"
value="${value//\'/\'\'}"
printf "'%s'" "$value"
}
APP_SQL="$(sql_string "$APP_CODE")"
USER_SQL="$(sql_string "$USER_ID")"
POOL_SQL="$(sql_string "$POOL_ID")"
RESET_SHARED_SQL="$(sql_string "$RESET_SHARED")"
docker exec -i "$MYSQL_CONTAINER" mysql -uroot -proot <<SQL
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
USE hyapp_activity;
SET @app_code := ${APP_SQL};
SET @user_id := ${USER_SQL};
SET @pool_id := ${POOL_SQL};
SET @reset_shared := ${RESET_SHARED_SQL};
SET @run_id := REPLACE(UUID(), '-', '');
CREATE TABLE IF NOT EXISTS local_lucky_reset_draws (
run_id VARCHAR(64) NOT NULL,
draw_id VARCHAR(128) NOT NULL,
command_id VARCHAR(128) NOT NULL,
user_id BIGINT NOT NULL,
pool_id VARCHAR(96) NOT NULL,
room_id VARCHAR(96) NOT NULL,
anchor_id VARCHAR(96) NOT NULL,
device_id VARCHAR(128) NOT NULL,
PRIMARY KEY (run_id, draw_id),
KEY idx_local_lucky_reset_draw_command (run_id, command_id),
KEY idx_local_lucky_reset_draw_scope (run_id, pool_id, user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS local_lucky_reset_wallet_txs (
run_id VARCHAR(64) NOT NULL,
app_code VARCHAR(32) NOT NULL,
transaction_id VARCHAR(96) NOT NULL,
PRIMARY KEY (run_id, app_code, transaction_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DELETE FROM local_lucky_reset_draws WHERE run_id = @run_id;
DELETE FROM local_lucky_reset_wallet_txs WHERE run_id = @run_id;
INSERT INTO local_lucky_reset_draws (run_id, draw_id, command_id, user_id, pool_id, room_id, anchor_id, device_id)
SELECT @run_id, draw_id, command_id, user_id, pool_id, room_id, anchor_id, device_id
FROM hyapp_activity.lucky_draw_records
WHERE app_code = @app_code
AND (@user_id = '' OR user_id = CAST(NULLIF(@user_id, '') AS UNSIGNED))
AND (@pool_id = '' OR pool_id = @pool_id);
INSERT IGNORE INTO local_lucky_reset_wallet_txs (run_id, app_code, transaction_id)
SELECT @run_id, wt.app_code, wt.transaction_id
FROM hyapp_wallet.wallet_transactions wt
JOIN local_lucky_reset_draws d
ON d.run_id = @run_id
AND wt.app_code = @app_code
AND wt.biz_type = 'lucky_gift_reward'
AND wt.command_id = CONCAT('lucky_reward:', d.draw_id);
START TRANSACTION;
UPDATE hyapp_wallet.wallet_accounts a
JOIN (
SELECT e.app_code, e.user_id, e.asset_type,
SUM(e.available_delta) AS available_delta,
SUM(e.frozen_delta) AS frozen_delta
FROM hyapp_wallet.wallet_entries e
JOIN local_lucky_reset_wallet_txs t
ON t.run_id = @run_id AND t.app_code = e.app_code AND t.transaction_id = e.transaction_id
GROUP BY e.app_code, e.user_id, e.asset_type
) x
ON x.app_code = a.app_code AND x.user_id = a.user_id AND x.asset_type = a.asset_type
SET a.available_amount = a.available_amount - x.available_delta,
a.frozen_amount = a.frozen_amount - x.frozen_delta,
a.version = a.version + 1,
a.updated_at_ms = UNIX_TIMESTAMP(UTC_TIMESTAMP(3)) * 1000;
DELETE wo
FROM hyapp_wallet.wallet_outbox wo
JOIN local_lucky_reset_wallet_txs t
ON t.run_id = @run_id AND t.app_code = wo.app_code AND t.transaction_id = wo.transaction_id;
DELETE e
FROM hyapp_wallet.wallet_entries e
JOIN local_lucky_reset_wallet_txs t
ON t.run_id = @run_id AND t.app_code = e.app_code AND t.transaction_id = e.transaction_id;
DELETE wt
FROM hyapp_wallet.wallet_transactions wt
JOIN local_lucky_reset_wallet_txs t
ON t.run_id = @run_id AND t.app_code = wt.app_code AND t.transaction_id = wt.transaction_id;
DELETE ao
FROM hyapp_activity.activity_outbox ao
JOIN local_lucky_reset_draws d
ON d.run_id = @run_id
AND ao.app_code = @app_code
AND ao.event_type = 'LuckyGiftDrawn'
AND CONVERT(ao.payload USING utf8mb4) COLLATE utf8mb4_unicode_ci LIKE CONCAT('%', d.draw_id, '%') COLLATE utf8mb4_unicode_ci;
DELETE dr
FROM hyapp_activity.lucky_draw_records dr
JOIN local_lucky_reset_draws d
ON d.run_id = @run_id AND d.draw_id = dr.draw_id
WHERE dr.app_code = @app_code;
DELETE FROM hyapp_activity.lucky_user_states
WHERE app_code = @app_code
AND (@user_id = '' OR user_id = CAST(NULLIF(@user_id, '') AS UNSIGNED))
AND (@pool_id = '' OR gift_id = @pool_id);
DELETE rc
FROM hyapp_activity.lucky_risk_counters rc
LEFT JOIN (
SELECT 'user' AS scope_type, CONCAT(pool_id, ':', user_id) AS scope_id FROM local_lucky_reset_draws WHERE run_id = @run_id
UNION SELECT 'device', CONCAT(pool_id, ':', device_id) FROM local_lucky_reset_draws WHERE run_id = @run_id AND device_id <> ''
UNION SELECT 'room', CONCAT(pool_id, ':', room_id) FROM local_lucky_reset_draws WHERE run_id = @run_id AND room_id <> ''
UNION SELECT 'anchor', CONCAT(pool_id, ':', anchor_id) FROM local_lucky_reset_draws WHERE run_id = @run_id AND anchor_id <> ''
) s ON s.scope_type = rc.scope_type AND s.scope_id = rc.scope_id
WHERE rc.app_code = @app_code
AND (@user_id = '' OR s.scope_id IS NOT NULL)
AND (@pool_id = '' OR rc.scope_id = @pool_id OR rc.scope_id LIKE CONCAT(@pool_id, ':%'));
DELETE FROM hyapp_activity.lucky_rtp_windows
WHERE @reset_shared = '1'
AND app_code = @app_code
AND (@pool_id = '' OR scope_id = @pool_id OR scope_id LIKE CONCAT(@pool_id, ':%'));
DELETE FROM hyapp_activity.lucky_pools
WHERE @reset_shared = '1'
AND app_code = @app_code
AND (@pool_id = '' OR scope_id = @pool_id OR scope_id LIKE CONCAT(@pool_id, ':%'));
DELETE FROM hyapp_activity.lucky_room_atmosphere_pools
WHERE @reset_shared = '1'
AND app_code = @app_code
AND (@pool_id = '' OR room_id IN (SELECT room_id FROM local_lucky_reset_draws WHERE run_id = @run_id));
DELETE FROM hyapp_activity.lucky_activity_budgets
WHERE @reset_shared = '1'
AND app_code = @app_code
AND (@pool_id = '' OR gift_id = @pool_id);
COMMIT;
SELECT JSON_OBJECT(
'app_code', @app_code,
'user_id', @user_id,
'pool_id', @pool_id,
'reset_shared', @reset_shared,
'remaining_draw_records', (SELECT COUNT(*) FROM hyapp_activity.lucky_draw_records WHERE app_code = @app_code AND (@user_id = '' OR user_id = CAST(NULLIF(@user_id, '') AS UNSIGNED)) AND (@pool_id = '' OR pool_id = @pool_id)),
'remaining_user_states', (SELECT COUNT(*) FROM hyapp_activity.lucky_user_states WHERE app_code = @app_code AND (@user_id = '' OR user_id = CAST(NULLIF(@user_id, '') AS UNSIGNED)) AND (@pool_id = '' OR gift_id = @pool_id))
) AS result;
DELETE FROM local_lucky_reset_wallet_txs WHERE run_id = @run_id;
DELETE FROM local_lucky_reset_draws WHERE run_id = @run_id;
SQL