59 lines
1.6 KiB
Go
59 lines
1.6 KiB
Go
package main
|
||
|
||
import (
|
||
"database/sql"
|
||
"fmt"
|
||
"log"
|
||
|
||
_ "github.com/go-sql-driver/mysql"
|
||
)
|
||
|
||
func main() {
|
||
dsn := "root:bindbox2025kdy@tcp(150.158.78.154:3306)/bindbox_game"
|
||
db, err := sql.Open("mysql", dsn)
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
defer db.Close()
|
||
|
||
// 1. 检查直播间抽奖是否有重复 (Draw Count > Product Count)
|
||
// 注意:shop_order_id 是字符串,join 时注意字符集,不过这里都是 utf8mb4 应该没问题
|
||
query := `
|
||
SELECT
|
||
o.shop_order_id,
|
||
o.product_count,
|
||
COUNT(l.id) as draw_count,
|
||
o.user_nickname
|
||
FROM douyin_orders o
|
||
JOIN livestream_draw_logs l ON CONVERT(o.shop_order_id USING utf8mb4) = CONVERT(l.shop_order_id USING utf8mb4)
|
||
GROUP BY o.shop_order_id, o.product_count, o.user_nickname
|
||
HAVING draw_count > o.product_count
|
||
`
|
||
|
||
rows, err := db.Query(query)
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
defer rows.Close()
|
||
|
||
fmt.Println("--- Duplicate Rewards Check (Livestream) ---")
|
||
found := false
|
||
for rows.Next() {
|
||
var orderID, nickname string
|
||
var pCount, dCount int
|
||
if err := rows.Scan(&orderID, &pCount, &dCount, &nickname); err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
fmt.Printf("Order: %s | Nickname: %s | Bought: %d | Issued: %d\n", orderID, nickname, pCount, dCount)
|
||
found = true
|
||
}
|
||
|
||
if !found {
|
||
fmt.Println("No duplicate rewards found in livestream_draw_logs.")
|
||
}
|
||
|
||
// 2. 额外检查:是否有同一个 shop_order_id 在极短时间内产生多条 log (并发问题特质)
|
||
// 这里简单检查是否有完全重复的 log (除了主键不同,其他关键字段相同)
|
||
// 或者检查是否有订单在非直播抽奖表也发了奖 (如果两边系统混用)
|
||
}
|