package main import ( "bindbox-game/configs" "bindbox-game/internal/repository/mysql" "context" "flag" "fmt" ) func main() { flag.Parse() configs.Init() ctx := context.Background() db, err := mysql.New() if err != nil { panic(err) } rawDB := db.GetDbR() // 1. status IN (2,4) 但 balance_amount > 0 的券(有余额却被标记为已使用/占用中) fmt.Println("=== 异常券:status=2或4 但余额>0(应改为 status=1) ===") var abnormal []struct { ID int64 `gorm:"column:id"` UserID int64 `gorm:"column:user_id"` CouponID int64 `gorm:"column:coupon_id"` Status int32 `gorm:"column:status"` BalanceAmount int64 `gorm:"column:balance_amount"` ValidEnd string `gorm:"column:valid_end"` UsedAt string `gorm:"column:used_at"` UsedOrderID int64 `gorm:"column:used_order_id"` } rawDB.WithContext(ctx).Raw(` SELECT uc.id, uc.user_id, uc.coupon_id, uc.status, uc.balance_amount, uc.valid_end, uc.used_at, uc.used_order_id FROM user_coupons uc WHERE uc.status IN (2, 4) AND uc.balance_amount > 0 ORDER BY uc.user_id, uc.id `).Scan(&abnormal) fmt.Printf("共 %d 条\n\n", len(abnormal)) for _, c := range abnormal { statusText := map[int32]string{2: "已使用", 4: "占用中"}[c.Status] // 查券名 var name string rawDB.WithContext(ctx).Raw("SELECT name FROM system_coupons WHERE id = ?", c.CouponID).Scan(&name) fmt.Printf("券#%d | 用户#%d | %s(模板#%d) | status=%d(%s) | 余额=%d分(%.2f元) | 有效期至=%s\n", c.ID, c.UserID, name, c.CouponID, c.Status, statusText, c.BalanceAmount, float64(c.BalanceAmount)/100, c.ValidEnd) } // 2. status=1 但 balance_amount=0 的券(没余额却还标记为未使用) fmt.Println("\n=== 异常券:status=1 但余额=0(应改为 status=2) ===") var zeroBalance []struct { ID int64 `gorm:"column:id"` UserID int64 `gorm:"column:user_id"` CouponID int64 `gorm:"column:coupon_id"` BalanceAmount int64 `gorm:"column:balance_amount"` } rawDB.WithContext(ctx).Raw(` SELECT id, user_id, coupon_id, balance_amount FROM user_coupons WHERE status = 1 AND balance_amount = 0 ORDER BY user_id, id `).Scan(&zeroBalance) fmt.Printf("共 %d 条\n\n", len(zeroBalance)) for _, c := range zeroBalance { var name string rawDB.WithContext(ctx).Raw("SELECT name FROM system_coupons WHERE id = ?", c.CouponID).Scan(&name) fmt.Printf("券#%d | 用户#%d | %s(模板#%d) | status=1(未使用) | 余额=0\n", c.ID, c.UserID, name, c.CouponID) } }