user.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package service
  2. import (
  3. "errors"
  4. "github.com/gin-gonic/gin"
  5. "go.uber.org/zap"
  6. "gorm.io/gorm"
  7. "log"
  8. "sfbase/global"
  9. "sfbase/utils"
  10. "sfis/db"
  11. "sfis/lock"
  12. "sfis/model"
  13. "sfis/model/response"
  14. "strconv"
  15. "sync"
  16. "time"
  17. )
  18. func CreateUserProduct(appId string, productArr []map[string]interface{}, buyType int) (status int, haveProductId string, err error) {
  19. //取出用户锁
  20. lock.MainLock.Lock()
  21. userLock := lock.UserLockMap[appId]
  22. lock.MainLock.Unlock()
  23. userLock.Lock()
  24. defer userLock.Unlock()
  25. var errs error
  26. haveProductId = "" //已经购买过的产品id
  27. for _, val := range productArr {
  28. productId := utils.IntAll(val["productId"])
  29. costModel := utils.IntAll(val["costModel"])
  30. leftNum := utils.IntAll(val["leftNum"])
  31. tradeMoney := utils.IntAll(val["tradeMoney"]) * 100
  32. userProduct := &model.UserProduct{}
  33. userProduct.AppID = appId
  34. userProduct.StartAt, _ = time.ParseInLocation("2006-01-02 15:04:05", utils.ObjToString(val["startTime"]), time.Local)
  35. userProduct.EndAt, _ = time.ParseInLocation("2006-01-02 15:04:05", utils.ObjToString(val["endTime"]), time.Local)
  36. userProduct.LeftNum = leftNum
  37. userProduct.CostModel = costModel
  38. userProduct.InterfaceStatus = utils.IntAll(val["interfaceStatus"])
  39. userProduct.CallTimesLimitDay = utils.IntAll(val["callTimesLimitDay"])
  40. userProduct.DataNumLimitOneTimes = utils.IntAll(val["dataNumOneTimes"])
  41. userProduct.ProductID = productId
  42. userProductInfo := model.UserProduct{}
  43. product := model.Product{}
  44. //查询产品信息,获取购买时候产品单价、试用次数
  45. err := db.GetSFISDB().Where("id = ?", productId).Find(&product).Error
  46. if err != nil {
  47. global.Logger.Error("CreateUserProduct查询product表出错:", zap.Any("err:", err))
  48. return 0, haveProductId, err
  49. }
  50. historyUnitPrice := product.UnitPrice
  51. err = db.GetSFISDB().Where("product_id = ? and app_id = ?", productId, appId).Find(&userProductInfo).Error
  52. if err != nil {
  53. global.Logger.Error("CreateUserProduct查询user_product表出错:", zap.Any("err:", err))
  54. return 0, haveProductId, err
  55. }
  56. //用户第一次购买产品
  57. if userProductInfo.ID == 0 {
  58. errs = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
  59. rechargeAmount := 0
  60. remark := ""
  61. //第一次购买产品赠送试用量
  62. testNum := product.TestNum
  63. //扣费类型为扣余额,user_buy_record中tradeMoney金额为0
  64. if costModel == 0 {
  65. rechargeAmount = tradeMoney
  66. leftNum += testNum
  67. } else if costModel == 1 {
  68. leftNum = 0
  69. //扣余额,把赠送量转化成金额
  70. freeMoney := testNum * product.UnitPrice
  71. log.Println(freeMoney, "freeMoney")
  72. remark = "充值金额为:" + strconv.Itoa(tradeMoney) + ",赠送金额为:" + strconv.Itoa(freeMoney)
  73. tradeMoney += freeMoney
  74. }
  75. userProduct.LeftNum = leftNum
  76. //生用户产品
  77. err := tx.Create(userProduct).Error
  78. if err != nil {
  79. log.Printf("appID:[%s],productId:[%d] execute insert user_product error:[%v]", appId, productId, err)
  80. tx.Rollback()
  81. return err
  82. }
  83. userProductId := userProduct.ID
  84. //生成购买产品记录
  85. 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, userProductId, 0, leftNum, rechargeAmount, buyType, historyUnitPrice).Error
  86. if err != nil {
  87. log.Printf("appID:[%s],productId[%d],trade_money:[%d] execute insert into user_buy_record error:[%v]", appId, productId, tradeMoney, err)
  88. tx.Rollback()
  89. return err
  90. }
  91. //扣费类型是扣余额,充值用户余额
  92. if costModel == 1 {
  93. userAccount := model.UserAccount{}
  94. err = tx.First(&userAccount, model.UserAccount{AppID: appId}).Error
  95. if err != nil {
  96. log.Printf("appID:[%s],productId[%d],trade_money:[%d] execute find user_account error:[%v]", appId, productId, tradeMoney, err)
  97. tx.Rollback()
  98. return err
  99. }
  100. moneyBefore := userAccount.Money
  101. moneyAfter := userAccount.Money + tradeMoney
  102. //充值
  103. err := tx.Exec("update user_account set money = ? WHERE `app_id` = ?", moneyAfter, appId).Error
  104. if err != nil {
  105. log.Printf("appID:[%s],money:[%d] execute update user_account error:[%v]", appId, moneyAfter, err)
  106. tx.Rollback()
  107. return err
  108. }
  109. //生充值记录
  110. err = tx.Exec("insert into user_money_record (app_id,`before`,`after`,trade_money,remark) values (?,?,?,?,?)", appId, moneyBefore, moneyAfter, tradeMoney, remark).Error
  111. if err != nil {
  112. log.Printf("appID:[%s],trade_money:[%d] execute insert into user_money_record error:[%v]", appId, tradeMoney, err)
  113. tx.Rollback()
  114. return err
  115. }
  116. }
  117. return nil
  118. })
  119. if errs == nil {
  120. global.Logger.Info("用户已购买产品失败:", zap.Any("appId:", appId), zap.Any("productId:", productId))
  121. continue
  122. }
  123. } else {
  124. haveProductId += "[" + strconv.Itoa(productId) + "]"
  125. global.Logger.Info("用户已购买过该产品", zap.Any("appId:", appId), zap.Any("productId:", productId))
  126. continue
  127. }
  128. }
  129. return 1, haveProductId, nil
  130. }
  131. func UserProductList(appId string, c *gin.Context) {
  132. userProduct := []model.UserProduct{}
  133. err := db.GetSFISDB().Where("app_id = ? and ", appId).Find(&userProduct).Error
  134. if err != nil {
  135. log.Printf("appID:[%s] find into user_product error:[%v]", appId, err)
  136. response.FailWithMessage("查询出错", c)
  137. } else {
  138. response.OkWithData(userProduct, c)
  139. }
  140. }
  141. //创建用户
  142. func CreateUser(user model.User) (model.User, error) {
  143. var tempUser []model.User
  144. // 判断用户名是否重复
  145. db.GetSFISDB().Where("name = ?", user.Name).Find(&tempUser)
  146. if len(tempUser) > 0 {
  147. global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", "用户名已存在"))
  148. return user, errors.New("用户名已存在")
  149. }
  150. // 判断手机号是否重复
  151. var tempUser_ []model.User
  152. db.GetSFISDB().Where("phone = ?", user.Phone).Find(&tempUser_)
  153. if len(tempUser_) > 0 {
  154. global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", "手机号已存在"))
  155. return user, errors.New("手机号已存在")
  156. }
  157. errs := db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
  158. // 新增用户
  159. err := tx.Create(&user).Error
  160. if err != nil {
  161. global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", err))
  162. tx.Rollback()
  163. return err
  164. }
  165. // 初始化用户账户
  166. userAccount := model.UserAccount{AppID: user.AppID, Money: 0}
  167. err = tx.Create(&userAccount).Error
  168. if err != nil {
  169. global.Logger.Error("userAccountInit Error", zap.Any("user", user), zap.Any("userAccount", userAccount), zap.Any("error", err))
  170. tx.Rollback()
  171. return err
  172. }
  173. return nil
  174. })
  175. if errs != nil {
  176. global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", errs))
  177. return user, errors.New("创建失败")
  178. } else {
  179. global.Logger.Info("userCreate Success", zap.Any("user", user))
  180. // 生全局内存锁
  181. lock.MainLock.Lock()
  182. lock.UserLockMap[user.AppID] = &sync.Mutex{}
  183. lock.MainLock.Unlock()
  184. return user, nil
  185. }
  186. }