userRecharge.go 3.8 KB

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