Files
toutoukan/kills/kill.go
JACKYMYPERSON db98ed80e2 914-17:00修改
2025-09-14 17:01:36 +08:00

144 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package kills
import (
"context"
"encoding/base64"
"fmt"
"github.com/gin-gonic/gin"
"log"
"math/rand"
"time"
"toutoukan/init/redisInit"
"toutoukan/utill/scripts"
)
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 {
timestamp := time.Now().Format("20060102150405")
randomBytes := make([]byte, 8)
_, err := rand.Read(randomBytes)
if err != nil {
return fmt.Sprintf("ORD%s%011d", timestamp, time.Now().UnixNano()%100000000000)
}
randomStr := base64.URLEncoding.EncodeToString(randomBytes)[:11]
return fmt.Sprintf("ORD%s%s", timestamp, randomStr)
}
func Userkill(c *gin.Context) {
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()})
return
}
if result == 1 {
c.JSON(200, gin.H{"result": "库存扣减成功"})
} else {
c.JSON(200, gin.H{"result": "库存不足,扣减失败"})
}
}
//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,
// })
//}