api_util.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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.ID == 0 {
  25. response.FailWithDetailed(response.InterfaceDeleted, nil, "该用户接口未购买", context)
  26. return
  27. }else if userProduct.InterfaceStatus != 0 {
  28. response.FailWithDetailed(response.InterfaceDeleted, nil, "该用户接口暂不提供服务", context)
  29. return
  30. }
  31. //2.2 取用户(产品余量|钱包账户余额)校验-必须加锁
  32. costModel := userProduct.CostModel //扣费模式 0扣余量,1-扣余额
  33. product := GetProductByID(productID)
  34. userLock.Lock()
  35. log.Println(param + "锁住......")
  36. db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID})
  37. // costModel = 0
  38. switch costModel {
  39. case 0:
  40. //按剩余量扣费
  41. datas, err = costByLeftNum(getData, appID, productID, userProduct, product, param, ip)
  42. case 1:
  43. //按账户钱包余额扣费
  44. datas, err = costByAccountBalance(getData, appID, productID, userProduct, product, param, ip)
  45. case 2:
  46. //优先扣剩余量,剩余量为0,扣钱包余额
  47. }
  48. userLock.Unlock()
  49. log.Println(param + "解锁......")
  50. if err == nil {
  51. response.OkWithDatas(datas, context)
  52. } else {
  53. response.FailWithDetailed(response.InterfaceDeleted, nil, "查询失败", context)
  54. }
  55. }