From fe3141e2b5dc5f05fa23472d743d2fe34b9b1db1 Mon Sep 17 00:00:00 2001 From: Zuncle <34310384@qq.com> Date: Fri, 20 Mar 2026 21:02:21 +0800 Subject: [PATCH] =?UTF-8?q?fix(dashboard):=20=E7=9B=88=E4=BA=8F=E5=88=86?= =?UTF-8?q?=E6=9E=90=E5=95=86=E5=93=81=E4=BA=A7=E5=87=BA=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E6=A6=9C=E8=AE=A1=E7=AE=97=E5=8F=A3=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: 盈亏分析(GetUserProfitLossTrend)和用户画像(GetUserProfile)中的 "商品产出"与玩家消费排行榜(DashboardPlayerSpendingLeaderboard) 计算口径不一致,导致同一用户的商品产出差异巨大。 排行榜显示用户9110商品产出¥16,913.40,盈亏分析显示¥0.00。 差异点: 1. status条件: 盈亏用 status=1(仅待发货),排行榜用 status IN (1,3) 2. 价格回退链: 盈亏缺少 price_snapshot_cents 回退层级 3. 道具卡倍率: 盈亏未计算 reward_multiplier_x1000 4. void排除: 盈亏未排除 remark 含 void 的作废项 修复: - users_profit_loss.go: 商品产出查询完全对齐排行榜公式 - users_profile.go: 库存价值查询同步对齐 - 公式: COALESCE(value_cents, snapshot_cents, price, 0) * GREATEST(COALESCE(multiplier, 1000), 1000) / 1000 - 条件: status IN (1,3) AND remark NOT LIKE '%void%' --- internal/api/admin/users_profile.go | 12 ++++++++++-- internal/api/admin/users_profit_loss.go | 10 +++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/internal/api/admin/users_profile.go b/internal/api/admin/users_profile.go index 24dfc93..20faf47 100755 --- a/internal/api/admin/users_profile.go +++ b/internal/api/admin/users_profile.go @@ -195,12 +195,20 @@ func (h *handler) GetUserProfile() core.HandlerFunc { } var is invStats _ = h.repo.GetDbR().Raw(` - SELECT + SELECT COUNT(ui.id) as count, - COALESCE(SUM(COALESCE(NULLIF(ui.value_cents, 0), p.price, 0)), 0) as value + COALESCE(SUM( + COALESCE(NULLIF(ui.value_cents, 0), ars.price_snapshot_cents, p.price, 0) + * GREATEST(COALESCE(sic.reward_multiplier_x1000, 1000), 1000) / 1000 + ), 0) as value FROM user_inventory ui LEFT JOIN products p ON p.id = ui.product_id + LEFT JOIN activity_reward_settings ars ON ars.id = ui.reward_id + LEFT JOIN orders o ON o.id = ui.order_id + LEFT JOIN user_item_cards uic ON uic.id = o.item_card_id + LEFT JOIN system_item_cards sic ON sic.id = uic.card_id WHERE ui.user_id = ? AND ui.status IN (1, 3) + AND COALESCE(ui.remark, '') NOT LIKE '%%void%%' `, userID).Scan(&is).Error rsp.CurrentAssets.InventoryCount = is.Count rsp.CurrentAssets.InventoryValue = is.Value diff --git a/internal/api/admin/users_profit_loss.go b/internal/api/admin/users_profit_loss.go index ee0cba5..48ba554 100755 --- a/internal/api/admin/users_profit_loss.go +++ b/internal/api/admin/users_profit_loss.go @@ -88,10 +88,18 @@ func (h *handler) GetUserProfitLossTrend() core.HandlerFunc { } _ = h.repo.GetDbR().Raw("SELECT COALESCE(SUM(points), 0) FROM user_points WHERE user_id = ? AND (valid_end IS NULL OR valid_end > NOW())", userID).Scan(&curAssets.Points).Error _ = h.repo.GetDbR().Raw(` - SELECT COALESCE(SUM(COALESCE(NULLIF(ui.value_cents, 0), p.price, 0)), 0) + SELECT COALESCE(SUM( + COALESCE(NULLIF(ui.value_cents, 0), ars.price_snapshot_cents, p.price, 0) + * GREATEST(COALESCE(sic.reward_multiplier_x1000, 1000), 1000) / 1000 + ), 0) FROM user_inventory ui LEFT JOIN products p ON p.id = ui.product_id + LEFT JOIN activity_reward_settings ars ON ars.id = ui.reward_id + LEFT JOIN orders o ON o.id = ui.order_id + LEFT JOIN user_item_cards uic ON uic.id = o.item_card_id + LEFT JOIN system_item_cards sic ON sic.id = uic.card_id WHERE ui.user_id = ? AND ui.status IN (1, 3) + AND COALESCE(ui.remark, '') NOT LIKE '%%void%%' `, userID).Scan(&curAssets.Products).Error _ = h.repo.GetDbR().Raw("SELECT COALESCE(SUM(sc.price), 0) FROM user_item_cards uic LEFT JOIN system_item_cards sc ON sc.id = uic.card_id WHERE uic.user_id = ? AND uic.status = 1", userID).Scan(&curAssets.Cards).Error _ = h.repo.GetDbR().Raw("SELECT COALESCE(SUM(balance_amount), 0) FROM user_coupons WHERE user_id = ? AND status = 1", userID).Scan(&curAssets.Coupons).Error