user.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package services
  2. import (
  3. "errors"
  4. "eta/eta_mini_api/models"
  5. "eta/eta_mini_api/services/go_redis"
  6. "eta/eta_mini_api/utils"
  7. "fmt"
  8. "time"
  9. )
  10. // BindUser 用户绑定
  11. func BindUser(unionId, openId, phone, areaCode string) (userItem *models.UsersItem, tips string, err error) {
  12. users := new(models.Users)
  13. {
  14. cond := fmt.Sprintf(` AND %s = ?`, users.Cols().OpenId)
  15. pars := make([]interface{}, 0)
  16. pars = append(pars, openId)
  17. item, e := users.GetItemByCondition(cond, pars, "")
  18. if e != nil && e.Error() != utils.ErrNoRow() {
  19. err = fmt.Errorf("OpenId获取用户信息失败, %v", e)
  20. return
  21. }
  22. if item != nil {
  23. users = item
  24. }
  25. }
  26. // open_id用户存在
  27. var updateUsers, insertUsers bool
  28. var updateCols []string
  29. if users.UserId > 0 {
  30. if users.Mobile != "" && users.Mobile != phone {
  31. tips = "该微信号已绑定其他手机号"
  32. err = fmt.Errorf("该微信号已绑定其他手机号, Mobile: %s, OpenId: %s", phone, openId)
  33. return
  34. }
  35. if users.Mobile == "" {
  36. updateUsers = true
  37. updateCols = append(updateCols, users.Cols().Mobile, users.Cols().AreaCode)
  38. users.Mobile = phone
  39. users.AreaCode = areaCode
  40. }
  41. if users.IsRegistered == models.UserNoRegistered {
  42. updateUsers = true
  43. updateCols = append(updateCols, users.Cols().IsRegistered, users.Cols().RegisterTime)
  44. users.IsRegistered = models.UserRegistered
  45. users.RegisterTime = time.Now().Local()
  46. }
  47. }
  48. // 匹配后台添加的用户
  49. if users.UserId <= 0 {
  50. cond := fmt.Sprintf(` AND %s = ?`, users.Cols().Mobile)
  51. pars := make([]interface{}, 0)
  52. pars = append(pars, phone)
  53. item, e := users.GetItemByCondition(cond, pars, "")
  54. if e != nil && e.Error() != utils.ErrNoRow() {
  55. err = fmt.Errorf("手机号获取用户信息失败, %v", e)
  56. return
  57. }
  58. if item != nil {
  59. users = item
  60. }
  61. if users.UserId > 0 {
  62. if users.OpenId != "" && users.OpenId != openId {
  63. tips = "该手机号已绑定其他微信号"
  64. err = fmt.Errorf("该手机号已绑定其他微信号, Mobile: %s, OpenId: %s", phone, openId)
  65. return
  66. }
  67. updateUsers = true
  68. updateCols = append(updateCols, users.Cols().OpenId, users.Cols().UnionId, users.Cols().IsRegistered, users.Cols().RegisterTime)
  69. users.OpenId = openId
  70. users.UnionId = unionId
  71. users.IsRegistered = models.UserRegistered
  72. users.RegisterTime = time.Now().Local()
  73. }
  74. }
  75. // 匹配不上后台添加的,那么新增试用
  76. if users.UserId <= 0 {
  77. key := fmt.Sprint(utils.CACHE_ACCESS_WX_BIND, phone)
  78. locked := go_redis.IsExist(key)
  79. if locked {
  80. err = errors.New("多次提交,请关闭页面重新进入")
  81. return
  82. }
  83. go_redis.SetNX(key, "ok", time.Second*300)
  84. defer func() {
  85. _ = go_redis.Delete(key)
  86. }()
  87. users.Mobile = phone
  88. users.AreaCode = areaCode
  89. users.Status = models.UserStatusTrial
  90. users.AuthStatus = models.AuthStatusOpen
  91. users.IsRegistered = models.UserRegistered
  92. users.RegisterTime = time.Now().Local()
  93. users.OpenId = openId
  94. users.UnionId = unionId
  95. users.CreateTime = time.Now().Local()
  96. users.ModifyTime = time.Now().Local()
  97. insertUsers = true
  98. }
  99. // 新增/更新用户
  100. if insertUsers {
  101. if e := users.Create(); e != nil {
  102. err = fmt.Errorf("新增试用用户失败, %v", e)
  103. return
  104. }
  105. }
  106. if updateUsers {
  107. updateCols = append(updateCols, users.Cols().ModifyTime)
  108. users.ModifyTime = time.Now().Local()
  109. if e := users.Update(updateCols); e != nil {
  110. err = fmt.Errorf("更新用户失败, %v", e)
  111. return
  112. }
  113. }
  114. userItem = users.Format2Item()
  115. // 绑定UserId
  116. userRecord := new(models.UserRecord)
  117. {
  118. cond := fmt.Sprintf(` AND %s = ?`, userRecord.Cols().UnionId)
  119. pars := make([]interface{}, 0)
  120. pars = append(pars, unionId)
  121. ur, e := userRecord.GetItemByCondition(cond, pars, "")
  122. if e != nil && e.Error() != utils.ErrNoRow() {
  123. err = fmt.Errorf("获取订阅记录失败, %v", e)
  124. return
  125. }
  126. if ur != nil && ur.UserRecordId > 0 {
  127. userRecord = ur
  128. }
  129. }
  130. if userRecord != nil && userRecord.UserRecordId > 0 {
  131. users.Subscribe = userRecord.Subscribe
  132. users.ModifyTime = time.Now().Local()
  133. if e := users.Update([]string{users.Cols().Subscribe, users.Cols().ModifyTime}); e != nil {
  134. err = fmt.Errorf("更新用户关注状态失败, %v", e)
  135. return
  136. }
  137. userRecord.UserId = users.UserId
  138. if e := userRecord.Update([]string{userRecord.Cols().UserId}); e != nil {
  139. err = fmt.Errorf("更新订阅记录绑定状态失败, %v", e)
  140. return
  141. }
  142. }
  143. return
  144. }