api_util.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package utils
  2. import (
  3. "log"
  4. "sfbase/global"
  5. "sfis/db"
  6. "sfis/lock"
  7. "sfis/model"
  8. "sfis/model/response"
  9. "time"
  10. "github.com/gin-gonic/gin"
  11. "go.uber.org/zap"
  12. )
  13. func Check(appID string, productID int, context *gin.Context, getData func() ([]map[string]interface{}, int, error), param, ip string) {
  14. lock.MainLock.Lock()
  15. userLock := lock.UserLockMap[appID]
  16. lock.MainLock.Unlock()
  17. var err error
  18. datas := []map[string]interface{}{}
  19. orderCode := ""
  20. /**
  21. 第二步:用户接口产品校验-加锁处理
  22. */
  23. //2.1 取用户接口状态校验-可加锁也可不加锁 这个没有太严谨
  24. //userLock.Lock()
  25. userProduct := &model.UserProduct{}
  26. db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID})
  27. //userLock.Unlock()
  28. if userProduct.ID == 0 {
  29. response.FailWithDetailed(response.InterfaceDeleted, nil, "该用户接口未购买", context)
  30. return
  31. } else if userProduct.InterfaceStatus != 0 {
  32. response.FailWithDetailed(response.InterfaceDeleted, nil, "该用户接口暂不提供服务", context)
  33. return
  34. }
  35. //2.2 取用户(产品余量|钱包账户余额)校验-必须加锁
  36. costModel := userProduct.CostModel //扣费模式 0扣余量,1-扣余额
  37. product := GetProductByID(productID)
  38. userLock.Lock()
  39. log.Println(param + "锁住......")
  40. db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID})
  41. // costModel = 0
  42. switch costModel {
  43. case 0:
  44. //按剩余量扣费
  45. datas, orderCode, err = costByLeftNum(getData, appID, productID, userProduct, product, param, ip)
  46. case 1:
  47. //按账户钱包余额扣费
  48. datas, orderCode, err = costByAccountBalance(getData, appID, productID, userProduct, product, param, ip)
  49. case 2:
  50. //优先扣剩余量,剩余量为0,扣钱包余额
  51. }
  52. userLock.Unlock()
  53. log.Println(param + "解锁......")
  54. if err == nil {
  55. db.GetQyfw().Save("user_data", map[string]interface{}{
  56. "app_id": appID,
  57. "result_num": len(datas),
  58. "result_content": datas,
  59. "order_code": orderCode,
  60. "status": 200,
  61. "user_product_id": userProduct.ID,
  62. "create_at": time.Now().Unix(),
  63. })
  64. response.OkWithDatas(datas, context)
  65. } else {
  66. global.Logger.Error("数据库操作失败", zap.Any("error:", err))
  67. response.FailWithDetailed(response.InterfaceDeleted, nil, "查询失败", context)
  68. }
  69. }