cost_by_left_num.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package utils
  2. import (
  3. "errors"
  4. "log"
  5. "sfbase/global"
  6. "sfbase/utils"
  7. "sfis/db"
  8. "sfis/model"
  9. "gorm.io/gorm"
  10. )
  11. /**
  12. 扣产品剩余量
  13. */
  14. func costByLeftNum(getData func() ([]map[string]interface{}, int, error), appID string, productID int, userProduct *model.UserProduct, product *model.Product, param, ip string) ([]map[string]interface{}, string, error, string) {
  15. productType := product.ProductType
  16. datas := []map[string]interface{}{}
  17. var err error
  18. errStr := ""
  19. orderCode := ""
  20. beforeJudge := before(productType, userProduct)
  21. if beforeJudge {
  22. data, statusCode, errs := execute(getData, appID, productID)
  23. if errs == nil {
  24. datas = data
  25. if len(datas) == 0 {
  26. global.Logger.Info("无数据", getUserProductError(appID, productID, err)...)
  27. }
  28. orderCode, err = after(productType, len(data), userProduct, statusCode, param, ip)
  29. if err != nil {
  30. errStr = "内部错误"
  31. global.Logger.Error("数据库操作失败", getUserProductError(appID, productID, err)...)
  32. }
  33. } else {
  34. errStr = "查询错误"
  35. global.Logger.Error("查询错误", getUserProductError(appID, productID, err)...)
  36. }
  37. } else {
  38. errStr = "剩余量不足"
  39. err = errors.New("剩余量不足")
  40. }
  41. return datas, orderCode, err, errStr
  42. }
  43. /**
  44. 用户产品剩余量|账户余额判断
  45. */
  46. func before(productType int, userProduct *model.UserProduct) bool {
  47. switch productType {
  48. case 0:
  49. //按次扣费-判断left_num
  50. if userProduct.LeftNum == 0 {
  51. //response.FailWithDetailed(response.LeftNumEmpty, nil, "余额不足", context)
  52. return false
  53. }
  54. case 1:
  55. //按条扣费-判断单次调用的limit
  56. if userProduct.LeftNum < userProduct.DataNumLimitOneTimes {
  57. //response.FailWithDetailed(response.LeftNumEmpty, nil, "剩余数据量小于该产品每次返回数据量,可能造成数据量不准确", context)
  58. return false
  59. }
  60. }
  61. return true
  62. }
  63. /**
  64. 执行接口查询
  65. */
  66. func execute(getData func() ([]map[string]interface{}, int, error), appID string, productID int) ([]map[string]interface{}, int, error) {
  67. data, statusCode, err := getData()
  68. if err != nil {
  69. global.Logger.Error("调用数据出错:", getUserProductError(appID, productID, err)...)
  70. return nil, -1, err
  71. }
  72. dataLen := len(data)
  73. global.Logger.Info("调用成功:", getUserProductInfo(appID, productID, "数据长度", dataLen)...)
  74. return data, statusCode, nil
  75. }
  76. func after(productType int, dataLen int, userProduct *model.UserProduct, statusCode int, param, ip string) (string, error) {
  77. appID := userProduct.AppID
  78. productID := userProduct.ProductID
  79. userProductID := userProduct.ID
  80. var errs error
  81. orderCode := utils.CreateOrderCode()
  82. switch productType {
  83. case 0:
  84. //按次扣费-(每调一次剩余量-1)
  85. errs = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
  86. orderBefore := userProduct.LeftNum
  87. orderAfter := userProduct.LeftNum - 1
  88. //扣费
  89. 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
  90. if err != nil {
  91. log.Printf("appID:[%s],productID:[%d] execute cost left_num-1 error:[%v]", appID, productID, err)
  92. tx.Rollback()
  93. return err
  94. }
  95. //生调用记录
  96. err = tx.Exec("insert into user_call_record (app_id,user_product_id,status,ip,param,order_code) values (?,?,?,?,?,?)", appID, userProductID, statusCode, ip, param, orderCode).Error
  97. if err != nil {
  98. log.Printf("appID:[%s],productID:[%d] execute insert into user_call_record error:[%v]", appID, productID, err)
  99. tx.Rollback()
  100. return err
  101. }
  102. //生订单
  103. 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
  104. if err != nil {
  105. log.Printf("appID:[%s],productID:[%d] execute insert into interface_order error:[%v]", appID, productID, err)
  106. tx.Rollback()
  107. return err
  108. }
  109. //存历史数据
  110. return nil
  111. })
  112. case 1:
  113. //按条扣费-(每调一次剩余量-len(getDataList))
  114. errs = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
  115. orderBefore := userProduct.LeftNum
  116. orderAfter := userProduct.LeftNum - dataLen
  117. //扣费
  118. err := tx.Exec("update user_product set left_num = IF(`left_num`<1, 0, `left_num`-?) WHERE `app_id` = ? and product_id=?", dataLen, appID, productID).Error
  119. if err != nil {
  120. log.Printf("appID:[%s],productID:[%d] execute cost money error:[%v]", appID, productID, err)
  121. tx.Rollback()
  122. return err
  123. }
  124. //生调用记录
  125. err = tx.Exec("insert into user_call_record (app_id,user_product_id,status,ip,param,order_code) values (?,?,?,?,?,?)", appID, userProductID, statusCode, ip, param, orderCode).Error
  126. if err != nil {
  127. log.Printf("appID:[%s],productID:[%d] execute insert into user_call_record error:[%v]", appID, productID, err)
  128. tx.Rollback()
  129. return err
  130. }
  131. //生订单
  132. 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, dataLen).Error
  133. if err != nil {
  134. log.Printf("appID:[%s],productID:[%d] execute insert into interface_order error:[%v]", appID, productID, err)
  135. tx.Rollback()
  136. return err
  137. }
  138. //存历史数据
  139. return nil
  140. })
  141. }
  142. return orderCode, errs
  143. }