124 lines
4.4 KiB
Go
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)
|
|
}
|
|
}
|