userRecharge.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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) 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. //充值
  28. err := tx.Exec("update user_account set money = ?,update_at = ? WHERE `app_id` = ?", moneyAfter, nowStr,appid).Error
  29. if err != nil {
  30. log.Printf("appID:[%s],money:[%d] execute cost user_account error:[%v]", appid, moneyAfter, err)
  31. tx.Rollback()
  32. return err
  33. }
  34. //生充值记录
  35. 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
  36. if err != nil {
  37. log.Printf("appID:[%s],trade_money:[%d] execute insert into user_money_record error:[%v]", appid, money, err)
  38. tx.Rollback()
  39. return err
  40. }
  41. return nil
  42. })
  43. return errs
  44. }
  45. func ProductRecharge(appid string, productId, rechargeNum int, startTime string, endTime string, tradeMoney int, context *gin.Context) error {
  46. //取出用户锁
  47. lock.MainLock.Lock()
  48. userLock := lock.UserLockMap[appid]
  49. lock.MainLock.Unlock()
  50. userLock.Lock()
  51. defer userLock.Unlock()
  52. //查用户当前剩余量
  53. userProduct := &model.UserProduct{}
  54. db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appid, ProductID: productId})
  55. product := &model.Product{}
  56. if products, ok := utils.ProductCaches.Map.Load(productId); ok {
  57. product = products.(*model.Product)
  58. }
  59. // 更新时间
  60. nowStr := time.Now().Local().Format("2006-01-02 15:04:05")
  61. errs := db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
  62. before := userProduct.LeftNum
  63. after := userProduct.LeftNum + rechargeNum
  64. //充值
  65. var err error
  66. if endTime != "" && startTime != "" {
  67. 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
  68. if err != nil {
  69. log.Printf("appID:[%s],left_num:[%d],endtime:[%s],starttime:[%s] execute cost user_product error:[%v]", appid, after, endTime, startTime, err)
  70. tx.Rollback()
  71. return err
  72. }
  73. } else {
  74. err = tx.Exec("update user_product set left_num = ?,update_at = ? WHERE `app_id` = ? and product_id = ?", after, nowStr, appid, productId).Error
  75. if err != nil {
  76. log.Printf("appID:[%s],left_num:[%d] execute cost user_product error:[%v]", appid, after, err)
  77. tx.Rollback()
  78. return err
  79. }
  80. }
  81. //生购买记录
  82. 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
  83. if err != nil {
  84. 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)
  85. tx.Rollback()
  86. return err
  87. }
  88. return nil
  89. })
  90. return errs
  91. }