cost_by_left_num.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package utils
  2. import (
  3. "gorm.io/gorm"
  4. "log"
  5. "sfbase/global"
  6. "sfbase/utils"
  7. "sfis/db"
  8. "sfis/model"
  9. )
  10. /**
  11. 扣产品剩余量
  12. */
  13. func costByLeftNum(getData func() ([]interface{}, int, error), appID string, productID int, userProduct *model.UserProduct, product *model.Product, param, ip string) {
  14. productType := product.ProductType
  15. beforeJudge := before(productType, userProduct)
  16. if beforeJudge {
  17. data, statusCode, _ := execute(getData, appID, productID)
  18. after(productType, len(data), userProduct, statusCode, param, ip)
  19. }
  20. }
  21. /**
  22. 用户产品剩余量|账户余额判断
  23. */
  24. func before(productType int, userProduct *model.UserProduct) bool {
  25. switch productType {
  26. case 0:
  27. //按次扣费-判断left_num
  28. if userProduct.LeftNum == 0 {
  29. //response.FailWithDetailed(response.LeftNumEmpty, nil, "余额不足", context)
  30. return false
  31. }
  32. case 1:
  33. //按条扣费-判断单次调用的limit
  34. if userProduct.LeftNum < userProduct.DataNumLimitOneTimes {
  35. //response.FailWithDetailed(response.LeftNumEmpty, nil, "剩余数据量小于该产品每次返回数据量,可能造成数据量不准确", context)
  36. return false
  37. }
  38. }
  39. return true
  40. }
  41. /**
  42. 执行接口查询
  43. */
  44. func execute(getData func() ([]interface{}, int, error), appID string, productID int) ([]interface{}, int, error) {
  45. data, statusCode, err := getData()
  46. if err != nil {
  47. global.Logger.Error("调用数据出错:", getUserProductError(appID, productID, err)...)
  48. return nil, -1, err
  49. }
  50. dataLen := len(data)
  51. global.Logger.Info("调用成功:", getUserProductInfo(appID, productID, "数据长度", dataLen)...)
  52. return data, statusCode, nil
  53. }
  54. func after(productType int, dataLen int, userProduct *model.UserProduct, statusCode int, param, ip string) {
  55. appID := userProduct.AppID
  56. productID := userProduct.ProductID
  57. userProductID := userProduct.ID
  58. switch productType {
  59. case 0:
  60. //按次扣费-(每调一次剩余量-1)
  61. _ = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
  62. orderBefore := userProduct.LeftNum
  63. orderAfter := userProduct.LeftNum - 1
  64. //扣费
  65. err := tx.Exec("update user_product set left_num = IF(`left_num`<1, 0, `left_num`-1) WHERE `app_id` = ? and product_id=?", appID, productID).Error
  66. if err != nil {
  67. log.Printf("appID:[%s],productID:[%d] execute cost left_num-1 error:[%v]", appID, productID, err)
  68. tx.Rollback()
  69. return err
  70. }
  71. //生调用记录
  72. err = tx.Exec("insert into user_call_record (app_id,user_product_id,status,ip,param) values (?,?,?,?,?)", appID, userProductID, statusCode, ip, param).Error
  73. if err != nil {
  74. log.Printf("appID:[%s],productID:[%d] execute insert into user_call_record error:[%v]", appID, productID, err)
  75. tx.Rollback()
  76. return err
  77. }
  78. //生订单
  79. orderCode := utils.GenerateSimpleToken()
  80. err = tx.Exec("insert into interface_order (order_code,app_id,user_product_id,`before`,`after`,cost_model,trade_num) values (?,?,?,?,?,?,?)", orderCode, appID, userProductID, orderBefore, orderAfter, 0, 1).Error
  81. if err != nil {
  82. log.Printf("appID:[%s],productID:[%d] execute insert into interface_order error:[%v]", appID, productID, err)
  83. tx.Rollback()
  84. return err
  85. }
  86. //存历史数据
  87. return nil
  88. })
  89. case 1:
  90. //按条扣费-(每调一次剩余量-len(getDataList))
  91. _ = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
  92. //扣费
  93. tx.Exec("update user_product set left_num = IF(`left_num`<1, 0, `left_num`-?) WHERE `app_id` = ? and product_id=?", dataLen, appID, productID)
  94. //生调用记录
  95. //生订单
  96. //存历史数据
  97. return nil
  98. })
  99. }
  100. }