api_util.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package utils
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "log"
  5. "sfis/db"
  6. "sfis/lock"
  7. "sfis/model"
  8. "sfis/model/response"
  9. )
  10. func Check(appID string, productID int, context *gin.Context, getData func() ([]interface{}, int, error), param, ip string) {
  11. lock.MainLock.Lock()
  12. userLock := lock.UserLockMap[appID]
  13. lock.MainLock.Unlock()
  14. /**
  15. 第二步:用户接口产品校验-加锁处理
  16. */
  17. //2.1 取用户接口状态校验-可加锁也可不加锁 这个没有太严谨
  18. //userLock.Lock()
  19. userProduct := &model.UserProduct{}
  20. db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID})
  21. //userLock.Unlock()
  22. if userProduct.InterfaceStatus != 0 {
  23. response.FailWithDetailed(response.InterfaceDeleted, nil, "该用户接口暂不提供服务", context)
  24. return
  25. }
  26. //2.2 取用户(产品余量|钱包账户余额)校验-必须加锁
  27. costModel := userProduct.CostModel //扣费模式 0扣余量,1-扣余额
  28. product := GetProductByID(productID)
  29. userLock.Lock()
  30. log.Println(param + "锁住......")
  31. db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID})
  32. costModel = 0
  33. switch costModel {
  34. case 0:
  35. //按剩余量扣费
  36. costByLeftNum(getData, appID, productID, userProduct, product, param, ip)
  37. case 1:
  38. //按账户钱包余额扣费
  39. costByAccountBalance(getData, appID, userProduct, product)
  40. case 2:
  41. //优先扣剩余量,剩余量为0,扣钱包余额
  42. }
  43. userLock.Unlock()
  44. log.Println(param + "解锁......")
  45. }