Files
toutoukan/kills/kill.go

144 lines
4.0 KiB
Go
Raw Normal View History

2025-09-13 20:00:27 +08:00
package kills
import (
2025-09-14 17:01:36 +08:00
"context"
2025-09-13 20:00:27 +08:00
"encoding/base64"
"fmt"
"github.com/gin-gonic/gin"
"log"
"math/rand"
"time"
2025-09-14 17:01:36 +08:00
"toutoukan/init/redisInit"
"toutoukan/utill/scripts"
2025-09-13 20:00:27 +08:00
)
const (
colorRed = "\033[31m" // 红色
colorGreen = "\033[32m" // 绿色
colorYellow = "\033[33m" // 黄色
colorBlue = "\033[34m" // 蓝色
colorReset = "\033[0m" // 重置颜色
)
type Goods struct {
GID uint `gorm:"column:gid"`
Stock int `gorm:"column:stock"`
StartTime time.Time `gorm:"column:start_time"`
EndTime time.Time `gorm:"column:end_time"`
}
// Order 订单模型,对应 orders_list 表
type Order struct {
OrderId string `gorm:"column:order_id"` // 关联商品ID
TradeTime time.Time `gorm:"column:trade_time"`
}
// 为模型指定数据库表名
func (Goods) TableName() string {
return "goods_list"
}
func (Order) TableName() string {
return "oders_list"
}
func GenerateOrderID() string {
2025-09-14 17:01:36 +08:00
timestamp := time.Now().Format("20060102150405")
2025-09-13 20:00:27 +08:00
2025-09-14 17:01:36 +08:00
randomBytes := make([]byte, 8)
2025-09-13 20:00:27 +08:00
_, err := rand.Read(randomBytes)
if err != nil {
return fmt.Sprintf("ORD%s%011d", timestamp, time.Now().UnixNano()%100000000000)
}
2025-09-14 17:01:36 +08:00
randomStr := base64.URLEncoding.EncodeToString(randomBytes)[:11]
2025-09-13 20:00:27 +08:00
return fmt.Sprintf("ORD%s%s", timestamp, randomStr)
}
func Userkill(c *gin.Context) {
2025-09-14 17:01:36 +08:00
result, err := redisInit.RedisClient.Eval(context.Background(), scripts.Luascript_forkill, []string{"stock:10000", "mayiming"}, 1, GenerateOrderID()).Int()
if err != nil {
log.Printf("Redis 脚本执行错误: %v", err)
c.JSON(500, gin.H{"error": "库存操作失败", "detail": err.Error()})
2025-09-13 20:00:27 +08:00
return
}
2025-09-14 17:01:36 +08:00
if result == 1 {
c.JSON(200, gin.H{"result": "库存扣减成功"})
} else {
c.JSON(200, gin.H{"result": "库存不足,扣减失败"})
2025-09-13 20:00:27 +08:00
}
}
2025-09-14 17:01:36 +08:00
//func Userkill(c *gin.Context) {
// // 直接使用全局初始化好的 UserDB 连接池
// db := databaseInit.UserDB
// if db == nil {
// log.Printf("%sUserDB 未初始化,请先调用 InitUserDB()%s\n", colorRed, colorReset)
// c.JSON(500, gin.H{"error": "系统数据库未初始化"})
// return
// }
// fmt.Printf("%s用户请求处理完成%s\n", colorBlue, colorReset)
//
// // 定义要查询的商品ID
// var targetGID uint = 1
// var goods Goods
//
// tx := db.Begin()
// if tx.Error != nil {
// log.Printf("%s开启事务失败: %v%s\n", colorRed, tx.Error, colorReset)
// c.JSON(500, gin.H{"body": "事务开启失败"})
// return
// }
// result := tx.Set("gorm:query_option", "FOR UPDATE").Where("gid = ?", targetGID).First(&goods)
// if result.Error != nil {
// tx.Rollback() // 失败回滚事务
// log.Printf("%s查询商品失败: %v%s\n", colorRed, result.Error, colorReset)
// c.JSON(404, gin.H{"error": "商品不存在"})
// return
// }
//
// // 2. 检查库存是否充足
// if goods.Stock <= 0 {
// tx.Rollback()
// log.Printf("%s商品库存不足%s\n", colorYellow, colorReset)
// c.JSON(400, gin.H{"error": "商品库存不足"})
// return
// }
//
// // 3. 生成订单
// userorder := Order{
// OrderId: GenerateOrderID(),
// TradeTime: time.Now(),
// }
// if err := tx.Create(&userorder).Error; err != nil {
// tx.Rollback()
// log.Printf("%s创建订单失败: %v%s\n", colorRed, err, colorReset)
// c.JSON(500, gin.H{"error": "创建订单失败"})
// return
// }
//
// // 4. 扣减库存(库存-1
// if err := tx.Model(&Goods{}).Where("gid = ?", targetGID).Update("stock", goods.Stock-1).Error; err != nil {
// tx.Rollback()
// log.Printf("%s扣减库存失败: %v%s\n", colorRed, err, colorReset)
// c.JSON(500, gin.H{"error": "库存更新失败"})
// return
// }
//
// // 5. 提交事务
// if err := tx.Commit().Error; err != nil {
// tx.Rollback()
// log.Printf("%s提交事务失败: %v%s\n", colorRed, err, colorReset)
// c.JSON(500, gin.H{"error": "系统错误"})
// return
// }
//
// log.Printf("%s订单创建成功订单ID: %s剩余库存: %d%s\n", colorGreen, userorder.OrderId, goods.Stock-1, colorReset)
// c.JSON(200, gin.H{
// "message": "下单成功",
// "order_id": userorder.OrderId,
// "stock": goods.Stock - 1,
// })
//}