2026-01-27 01:33:32 +08:00

124 lines
4.4 KiB
Go

package main
import (
"bindbox-game/configs"
"bindbox-game/internal/repository/mysql"
"bindbox-game/internal/repository/mysql/model"
"flag"
"fmt"
)
type RevenueStat struct {
ActivityID int64
TotalRevenue int64
TotalDiscount int64
}
type DrawStat struct {
ActivityID int64
TotalCount int64
GamePassCount int64
PaymentCount int64
RefundCount int64
PlayerCount int64
}
func main() {
flag.Parse()
configs.Init()
dbRepo, err := mysql.New()
if err != nil {
panic(err)
}
db := dbRepo.GetDbR()
activityIDs := []int64{89}
// 1. Debug Step 2: Draw Stats
var drawStats []DrawStat
err = db.Table(model.TableNameActivityDrawLogs).
Select(`
activity_issues.activity_id,
COUNT(activity_draw_logs.id) as total_count,
SUM(CASE WHEN orders.status = 2 AND orders.actual_amount = 0 THEN 1 ELSE 0 END) as game_pass_count,
SUM(CASE WHEN orders.status = 2 AND orders.actual_amount > 0 THEN 1 ELSE 0 END) as payment_count,
SUM(CASE WHEN orders.status IN (3, 4) THEN 1 ELSE 0 END) as refund_count,
COUNT(DISTINCT CASE WHEN orders.status = 2 THEN activity_draw_logs.user_id END) as player_count
`).
Joins("JOIN activity_issues ON activity_issues.id = activity_draw_logs.issue_id").
Joins("LEFT JOIN orders ON orders.id = activity_draw_logs.order_id").
Where("activity_issues.activity_id IN ?", activityIDs).
Group("activity_issues.activity_id").
Scan(&drawStats).Error
if err != nil {
fmt.Printf("DrawStats Error: %v\n", err)
} else {
fmt.Printf("DrawStats: %+v\n", drawStats)
}
// 2. Debug Step 3: Revenue Stats (With WHERE filter)
var revenueStats []RevenueStat
err = db.Table(model.TableNameOrders).
Select(`
activity_issues.activity_id,
SUM(orders.actual_amount * order_activity_draws.draw_count / order_total_draws.total_count) as total_revenue,
SUM(orders.discount_amount * order_activity_draws.draw_count / order_total_draws.total_count) as total_discount
`).
Joins(`JOIN (
SELECT activity_draw_logs.order_id, activity_issues.activity_id, COUNT(*) as draw_count
FROM activity_draw_logs
JOIN activity_issues ON activity_issues.id = activity_draw_logs.issue_id
GROUP BY activity_draw_logs.order_id, activity_issues.activity_id
) as order_activity_draws ON order_activity_draws.order_id = orders.id`).
Joins(`JOIN (
SELECT order_id, COUNT(*) as total_count
FROM activity_draw_logs
GROUP BY order_id
) as order_total_draws ON order_total_draws.order_id = orders.id`).
Joins("JOIN activity_issues ON activity_issues.activity_id = order_activity_draws.activity_id").
Where("orders.status = ? AND orders.status != ?", 2, 4).
Where("orders.actual_amount > ?", 0). // <--- The problematic filter?
Where("activity_issues.activity_id IN ?", activityIDs).
Group("activity_issues.activity_id").
Scan(&revenueStats).Error
if err != nil {
fmt.Printf("RevenueStats (With Filter) Error: %v\n", err)
} else {
fmt.Printf("RevenueStats (With Filter): %+v\n", revenueStats)
}
// 3. Debug Step 3: Revenue Stats (Without WHERE filter, using CASE in Select)
var revenueStats2 []RevenueStat
err = db.Table(model.TableNameOrders).
Select(`
activity_issues.activity_id,
SUM(orders.actual_amount * order_activity_draws.draw_count / order_total_draws.total_count) as total_revenue,
SUM(CASE WHEN orders.actual_amount > 0 THEN orders.discount_amount * order_activity_draws.draw_count / order_total_draws.total_count ELSE 0 END) as total_discount
`).
Joins(`JOIN (
SELECT activity_draw_logs.order_id, activity_issues.activity_id, COUNT(*) as draw_count
FROM activity_draw_logs
JOIN activity_issues ON activity_issues.id = activity_draw_logs.issue_id
GROUP BY activity_draw_logs.order_id, activity_issues.activity_id
) as order_activity_draws ON order_activity_draws.order_id = orders.id`).
Joins(`JOIN (
SELECT order_id, COUNT(*) as total_count
FROM activity_draw_logs
GROUP BY order_id
) as order_total_draws ON order_total_draws.order_id = orders.id`).
Joins("JOIN activity_issues ON activity_issues.activity_id = order_activity_draws.activity_id").
Where("orders.status = ? AND orders.status != ?", 2, 4).
// Where("orders.actual_amount > ?", 0). // Removed
Where("activity_issues.activity_id IN ?", activityIDs).
Group("activity_issues.activity_id").
Scan(&revenueStats2).Error
if err != nil {
fmt.Printf("RevenueStats (With CASE) Error: %v\n", err)
} else {
fmt.Printf("RevenueStats (With CASE): %+v\n", revenueStats2)
}
}