user.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package service
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "go.uber.org/zap"
  7. "gorm.io/gorm"
  8. "log"
  9. "sfbase/global"
  10. "sfbase/utils"
  11. "sfis/db"
  12. "sfis/lock"
  13. "sfis/model"
  14. "strconv"
  15. "strings"
  16. "sync"
  17. utils2 "sfis/utils"
  18. )
  19. func CreateUserProduct(appId string, productArr []map[string]interface{}) (status int, haveProductId string, errArr []error) {
  20. //取出用户锁
  21. lock.MainLock.Lock()
  22. userLock := lock.UserLockMap[appId]
  23. lock.MainLock.Unlock()
  24. userLock.Lock()
  25. defer userLock.Unlock()
  26. var errs error
  27. haveProductId = "" //已经购买过的产品id
  28. //var errArr = make([]error, 0)
  29. for _, val := range productArr {
  30. productId := utils.IntAll(val["productId"])
  31. costModel := utils.IntAll(val["costModel"])
  32. userProduct := &model.UserProductModel{}
  33. userProduct.AppID = appId
  34. userProduct.CostModel = costModel
  35. userProduct.LeftNum = 0
  36. userProduct.InterfaceStatus = utils.IntAll(val["interfaceStatus"])
  37. userProduct.CallTimesLimitDay = utils.IntAll(val["callTimesLimitDay"])
  38. userProduct.DataNumLimitOneTimes = utils.IntAll(val["dataNumOneTimes"])
  39. userProduct.Discount = utils.IntAll(val["discount"])
  40. userProduct.ProductID = productId
  41. //查询产品是否购买过
  42. userProductInfo := model.UserProduct{}
  43. err := db.GetSFISDB().Where("product_id = ? and app_id = ?", productId, appId).Find(&userProductInfo).Error
  44. if err != nil {
  45. errArr = append(errArr, err)
  46. global.Logger.Error("CreateUserProduct查询user_product表出错:", zap.Any("err:", err))
  47. return 0, haveProductId, errArr
  48. }
  49. //用户第一次购买产品
  50. if userProductInfo.ID == 0 {
  51. err := db.GetSFISDB().Create(userProduct).Error
  52. if err != nil {
  53. errArr = append(errArr, errs)
  54. global.Logger.Info("用户购买产品失败:", zap.Any("appId:", appId), zap.Any("productId:", productId))
  55. continue
  56. }
  57. } else {
  58. haveProductId += "[" + strconv.Itoa(productId) + "]"
  59. global.Logger.Info("用户已购买过该产品", zap.Any("appId:", appId), zap.Any("productId:", productId))
  60. continue
  61. }
  62. }
  63. return 1, haveProductId, errArr
  64. }
  65. func UserProductList(appId string, c *gin.Context) (results []map[string]interface{}, err error) {
  66. err = db.GetSFISDB().Table("user_product").Select("user_product.app_id, user_product.product_id,user_product.create_at,user_product.start_at,user_product.end_at,user_product.left_num,user_product.cost_model,user_product.interface_status,user_product.call_times_limit_day,user_product.data_num_limit_one_times,product.name").Joins("left join product on product.id = user_product.product_id").Where("app_id = ? ", appId).Scan(&results).Error
  67. if err != nil {
  68. log.Printf("appID:[%s] find into user_product error:[%v]", appId, err)
  69. }
  70. return results, err
  71. }
  72. //创建用户
  73. func CreateUser(user model.User) (model.User, error) {
  74. var tempUser []model.User
  75. // 判断用户名是否重复
  76. db.GetSFISDB().Where("name = ?", user.Name).Find(&tempUser)
  77. if len(tempUser) > 0 {
  78. global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", "用户名已存在"))
  79. return user, errors.New("用户名已存在")
  80. }
  81. // 判断手机号是否重复
  82. var tempUser_ []model.User
  83. db.GetSFISDB().Where("phone = ?", user.Phone).Find(&tempUser_)
  84. if len(tempUser_) > 0 {
  85. global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", "手机号已存在"))
  86. return user, errors.New("手机号已存在")
  87. }
  88. errs := db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
  89. // 新增用户
  90. err := tx.Create(&user).Error
  91. if err != nil {
  92. global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", err))
  93. tx.Rollback()
  94. return err
  95. }
  96. // 初始化用户账户
  97. userAccount := model.UserAccount{AppID: user.AppID, Money: 0}
  98. err = tx.Create(&userAccount).Error
  99. if err != nil {
  100. global.Logger.Error("userAccountInit Error", zap.Any("user", user), zap.Any("userAccount", userAccount), zap.Any("error", err))
  101. tx.Rollback()
  102. return err
  103. }
  104. return nil
  105. })
  106. if errs != nil {
  107. global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", errs))
  108. return user, errors.New("创建失败")
  109. } else {
  110. global.Logger.Info("userCreate Success", zap.Any("user", user))
  111. // 生全局内存锁
  112. lock.MainLock.Lock()
  113. utils2.UserCaches.Map.Store(user.AppID, &user)
  114. lock.UserLockMap[user.AppID] = &sync.Mutex{}
  115. lock.MainLock.Unlock()
  116. return user, nil
  117. }
  118. }
  119. // 查询用户
  120. func ListUser(condMap map[string]interface{}, page int, limit int) ([]map[string]interface{}, int64, error) {
  121. // 拼查询sql
  122. var key []string
  123. var param []interface{}
  124. for k, v := range condMap {
  125. if v == "" {
  126. continue
  127. }
  128. var kStr string
  129. kStr = fmt.Sprintf("%s like ?", k)
  130. v = "%" + v.(string) + "%"
  131. key = append(key, kStr)
  132. param = append(param, v)
  133. }
  134. whereSql := strings.Join(key, " and ")
  135. var totalCount int64
  136. var userInfo []map[string]interface{}
  137. err := db.GetSFISDB().Table("user").Where(whereSql, param...).Where("delete_at is null").Count(&totalCount).Error
  138. if err != nil {
  139. return nil, 0, errors.New("查询失败")
  140. }
  141. if totalCount == 0 {
  142. return userInfo, 0, nil
  143. }
  144. if whereSql != "" {
  145. whereSql = " and " + whereSql
  146. }
  147. sql := "select user.app_id,user.name,user.phone,user.secret_key,user.ip_white_list,user.create_at,money from user LEFT JOIN user_account on user.app_id=user_account.app_id where user.delete_at is Null " + whereSql
  148. if limit != 0 && page > 0 {
  149. sql += fmt.Sprintf(" limit %d ,%d", (page-1)*limit, limit)
  150. }
  151. result := db.GetSFISDB().Raw(sql, param...).Scan(&userInfo)
  152. if result.Error != nil {
  153. return nil, 0, errors.New("查询失败")
  154. }
  155. return userInfo, totalCount, nil
  156. }