package utils import ( "github.com/gin-gonic/gin" "log" "sfis/db" "sfis/lock" "sfis/model" "sfis/model/response" ) func Check(appID string, productID int, context *gin.Context, getData func() ([]interface{}, int, error), param, ip string) { lock.MainLock.Lock() userLock := lock.UserLockMap[appID] lock.MainLock.Unlock() /** 第二步:用户接口产品校验-加锁处理 */ //2.1 取用户接口状态校验-可加锁也可不加锁 这个没有太严谨 //userLock.Lock() userProduct := &model.UserProduct{} db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID}) //userLock.Unlock() if userProduct.InterfaceStatus != 0 { response.FailWithDetailed(response.InterfaceDeleted, nil, "该用户接口暂不提供服务", context) return } //2.2 取用户(产品余量|钱包账户余额)校验-必须加锁 costModel := userProduct.CostModel //扣费模式 0扣余量,1-扣余额 product := GetProductByID(productID) userLock.Lock() log.Println(param + "锁住......") db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID}) costModel = 0 switch costModel { case 0: //按剩余量扣费 costByLeftNum(getData, appID, productID, userProduct, product, param, ip) case 1: //按账户钱包余额扣费 costByAccountBalance(getData, appID, userProduct, product) case 2: //优先扣剩余量,剩余量为0,扣钱包余额 } userLock.Unlock() log.Println(param + "解锁......") }