package utils import ( "log" "sfbase/global" "sfis/db" "sfis/lock" "sfis/model" "sfis/model/response" "time" "github.com/gin-gonic/gin" "go.uber.org/zap" ) func Check(appID string, productID int, context *gin.Context, getData func() ([]map[string]interface{}, int, error), param, ip string) { lock.MainLock.Lock() userLock := lock.UserLockMap[appID] lock.MainLock.Unlock() var err error datas := []map[string]interface{}{} orderCode := "" /** 第二步:用户接口产品校验-加锁处理 */ //2.1 取用户接口状态校验-可加锁也可不加锁 这个没有太严谨 //userLock.Lock() userProduct := &model.UserProduct{} db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID}) //userLock.Unlock() if userProduct.ID == 0 { response.FailWithDetailed(response.InterfaceDeleted, nil, "该用户接口未购买", context) return } else 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: //按剩余量扣费 datas, orderCode, err = costByLeftNum(getData, appID, productID, userProduct, product, param, ip) case 1: //按账户钱包余额扣费 datas, orderCode, err = costByAccountBalance(getData, appID, productID, userProduct, product, param, ip) case 2: //优先扣剩余量,剩余量为0,扣钱包余额 } userLock.Unlock() log.Println(param + "解锁......") if err == nil { db.GetQyfw().Save("user_data", map[string]interface{}{ "app_id": appID, "result_num": len(datas), "result_content": datas, "order_code": orderCode, "status": 200, "user_product_id": userProduct.ID, "create_at": time.Now().Unix(), }) response.OkWithDatas(datas, context) } else { global.Logger.Error("数据库操作失败", zap.Any("error:", err)) response.FailWithDetailed(response.InterfaceDeleted, nil, "查询失败", context) } }