114 lines
3.8 KiB
Go
114 lines
3.8 KiB
Go
package main
|
|
|
|
import (
|
|
"bindbox-game/internal/repository/mysql/model"
|
|
"fmt"
|
|
"log"
|
|
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func main() {
|
|
dsn := "root:bindbox2025kdy@tcp(150.158.78.154:3306)/bindbox_game?charset=utf8mb4&parseTime=True&loc=Local"
|
|
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
|
|
if err != nil {
|
|
log.Fatalf("failed to connect database: %v", err)
|
|
}
|
|
|
|
userID := int64(9082) // User from the report
|
|
|
|
// 1. Check Orders (ALL Status)
|
|
var orders []model.Orders
|
|
if err := db.Where("user_id = ?", userID).Find(&orders).Error; err != nil {
|
|
log.Printf("Error querying orders: %v", err)
|
|
}
|
|
|
|
var totalAmount int64
|
|
var discountAmount int64
|
|
var pointsAmount int64
|
|
|
|
fmt.Printf("--- ALL Orders for User %d ---\n", userID)
|
|
for _, o := range orders {
|
|
fmt.Printf("ID: %d, OrderNo: %s, Status: %d, Total: %d, Actual: %d, Discount: %d, Points: %d, Source: %d\n",
|
|
o.ID, o.OrderNo, o.Status, o.TotalAmount, o.ActualAmount, o.DiscountAmount, o.PointsAmount, o.SourceType)
|
|
if o.Status == 2 { // Only count Paid for Spending simulation (if that's the logic)
|
|
totalAmount += o.TotalAmount
|
|
discountAmount += o.DiscountAmount
|
|
pointsAmount += o.PointsAmount
|
|
}
|
|
}
|
|
fmt.Printf("Total Points (Status 2): %d\n", pointsAmount)
|
|
|
|
// 1.5 Check Points Ledger (Redemptions)
|
|
var ledgers []model.UserPointsLedger
|
|
if err := db.Where("user_id = ? AND action = ?", userID, "redeem_reward").Find(&ledgers).Error; err != nil {
|
|
log.Printf("Error querying ledgers: %v", err)
|
|
}
|
|
var totalRedeemedPoints int64
|
|
fmt.Printf("\n--- Points Redemption (Decomposition) ---\n")
|
|
for _, l := range ledgers {
|
|
fmt.Printf("ID: %d, Points: %d, Remark: %s, CreatedAt: %v\n", l.ID, l.Points, l.Remark, l.CreatedAt)
|
|
totalRedeemedPoints += l.Points
|
|
}
|
|
fmt.Printf("Total Redeemed Points: %d\n", totalRedeemedPoints)
|
|
|
|
// 2. Check Inventory (Output)
|
|
type InvItem struct {
|
|
ID int64
|
|
ProductID int64
|
|
Status int32
|
|
Price int64
|
|
Name string
|
|
Remark string // Added Remark field
|
|
}
|
|
var invItems []InvItem
|
|
|
|
// Show ALL status
|
|
err = db.Table("user_inventory").
|
|
Select("user_inventory.id, user_inventory.product_id, user_inventory.status, user_inventory.remark, products.price, products.name").
|
|
Joins("JOIN products ON products.id = user_inventory.product_id").
|
|
Where("user_inventory.user_id = ?", userID).
|
|
Where("user_inventory.remark NOT LIKE ? AND user_inventory.remark NOT LIKE ?", "%redeemed%", "%void%").
|
|
Scan(&invItems).Error
|
|
if err != nil {
|
|
log.Printf("Error querying inventory: %v", err)
|
|
}
|
|
|
|
var totalPrizeValue int64
|
|
var status1Value int64
|
|
var status2Value int64
|
|
var status3Value int64
|
|
|
|
fmt.Printf("\n--- Inventory (ALL Status) for User %d ---\n", userID)
|
|
for _, item := range invItems {
|
|
fmt.Printf("InvID: %d, ProductID: %d, Name: %s, Price: %d, Status: %d, Remark: %s\n",
|
|
item.ID, item.ProductID, item.Name, item.Price, item.Status, item.Remark)
|
|
|
|
if item.Status == 1 || item.Status == 3 {
|
|
totalPrizeValue += item.Price
|
|
}
|
|
if item.Status == 1 {
|
|
status1Value += item.Price
|
|
}
|
|
if item.Status == 2 {
|
|
status2Value += item.Price
|
|
}
|
|
if item.Status == 3 {
|
|
status3Value += item.Price
|
|
}
|
|
}
|
|
fmt.Printf("Status 1 (Holding) Value: %d\n", status1Value)
|
|
fmt.Printf("Status 2 (Void/Decomposed) Value: %d\n", status2Value)
|
|
fmt.Printf("Status 3 (Shipped/Used) Value: %d\n", status3Value)
|
|
fmt.Printf("Total Effective Prize Value (1+3): %d\n", totalPrizeValue)
|
|
|
|
// 3. Calculate Profit
|
|
profit := totalAmount - totalPrizeValue - discountAmount
|
|
fmt.Printf("\n--- Calculation ---\n")
|
|
fmt.Printf("Profit = Spending (%d) - PrizeValue (%d) - Discount (%d) = %d\n",
|
|
totalAmount, totalPrizeValue, discountAmount, profit)
|
|
|
|
fmt.Printf("Formatted:\nSpending: %.2f\nOutput: %.2f\nProfit: %.2f\n", float64(totalAmount)/100, float64(totalPrizeValue)/100, float64(profit)/100)
|
|
}
|