userRecharge.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package service
  2. import (
  3. "sfis/db"
  4. "sfis/lock"
  5. "sfis/model"
  6. "github.com/gin-gonic/gin"
  7. "log"
  8. "sfis/utils"
  9. "time"
  10. "gorm.io/gorm"
  11. )
  12. func MoneyRecharge(appid string, money int, context *gin.Context) error {
  13. //取出用户锁
  14. lock.MainLock.Lock()
  15. userLock := lock.UserLockMap[appid]
  16. lock.MainLock.Unlock()
  17. userLock.Lock()
  18. defer userLock.Unlock()
  19. //查用户当前余额
  20. userAccount := &model.UserAccount{}
  21. db.GetSFISDB().First(userAccount, &model.UserAccount{AppID: appid})
  22. errs := db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
  23. moneyBefore := userAccount.Money
  24. moneyAfter := userAccount.Money + money
  25. //充值
  26. err := tx.Exec("update user_account set money = ? WHERE `app_id` = ?", moneyAfter, appid).Error
  27. if err != nil {
  28. log.Printf("appID:[%s],money:[%d] execute cost user_account error:[%v]", appid, moneyAfter, err)
  29. tx.Rollback()
  30. return err
  31. }
  32. //生充值记录
  33. err = tx.Exec("insert into user_money_record (app_id,`before`,`after`,trade_money) values (?,?,?,?)", appid, moneyBefore, moneyAfter, money).Error
  34. if err != nil {
  35. log.Printf("appID:[%s],trade_money:[%d] execute insert into user_money_record error:[%v]", appid, money, err)
  36. tx.Rollback()
  37. return err
  38. }
  39. return nil
  40. })
  41. return errs
  42. }
  43. func ProductRecharge(appid string, productId, rechargeNum int, endTime string, context *gin.Context) error {
  44. //取出用户锁
  45. lock.MainLock.Lock()
  46. userLock := lock.UserLockMap[appid]
  47. lock.MainLock.Unlock()
  48. userLock.Lock()
  49. defer userLock.Unlock()
  50. endTimes := ""
  51. if endTime != "" {
  52. end := endTime + " 23:59:59"
  53. loc, _ := time.LoadLocation("Local")
  54. if ends, err := time.ParseInLocation("2006-01-02 15:04:05", end, loc); err == nil {
  55. endTimes = ends.Local().Format("2006-01-02 15:04:05")
  56. }
  57. }
  58. //查用户当前剩余量
  59. userProduct := &model.UserProduct{}
  60. db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appid, ProductID: productId})
  61. product := &model.Product{}
  62. if products, ok := utils.ProductCaches.Map.Load(productId); ok {
  63. product = products.(*model.Product)
  64. }
  65. errs := db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
  66. before := userProduct.LeftNum
  67. after := userProduct.LeftNum + rechargeNum
  68. //充值
  69. var err error
  70. if endTimes != "" {
  71. err = tx.Exec("update user_product set left_num = ?,end_at = ? WHERE `app_id` = ? and product_id = ?", after, endTimes, appid, productId).Error
  72. if err != nil {
  73. log.Printf("appID:[%s],left_num:[%d],endtime:[%s] execute cost user_product error:[%v]", appid, after, endTimes, err)
  74. tx.Rollback()
  75. return err
  76. }
  77. } else {
  78. err = tx.Exec("update user_product set left_num = ? WHERE `app_id` = ? and product_id = ?", after, appid, productId).Error
  79. if err != nil {
  80. log.Printf("appID:[%s],left_num:[%d] execute cost user_product error:[%v]", appid, after, err)
  81. tx.Rollback()
  82. return err
  83. }
  84. }
  85. //生购买记录
  86. err = tx.Exec("insert into user_buy_record (app_id,product_id,user_product_id,`before`,`after`,trade_money,buy_type,history_unit_price) values (?,?,?,?,?,?,?,?)", appid, productId, userProduct.ID, before, after, product.UnitPrice*rechargeNum, 1, product.UnitPrice).Error
  87. if err != nil {
  88. log.Printf("appID:[%s],product_id:[%d],user_product_id:[%d],after:[%d],trade_money:[%d] execute insert into user_buy_record error:[%v]", appid, productId, userProduct.ID, after, product.UnitPrice*rechargeNum, err)
  89. tx.Rollback()
  90. return err
  91. }
  92. return nil
  93. })
  94. return errs
  95. }