api_util.go 1.7 KB

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