cost_by_left_num.go 5.6 KB

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