useraccount.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/1/13 14:07
  4. * @Modify : 2021/1/13 14:07
  5. */
  6. package mtpcache
  7. import (
  8. "fmt"
  9. "mtp2_if/db"
  10. "mtp2_if/logger"
  11. "sync"
  12. "time"
  13. )
  14. var vUsrMgr userAccountMgr
  15. // 用户缓存
  16. type userAccountMgr struct {
  17. mtx sync.RWMutex //锁
  18. data map[int64]usrAccData //数据[userId]accountName
  19. last time.Time
  20. }
  21. type usrAccData struct {
  22. USERID int64 `json:"userid" xorm:"'USERID'"` // 用户ID
  23. USERTYPE int32 `json:"usertype" xorm:"'USERTYPE'"` // 账户类型 - 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户
  24. ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 账户名称(机构名称)
  25. PARENTUSERID int64 `json:"parentuserid" xorm:"'PARENTUSERID'"` // 所属机构ID
  26. MEMBERUSERID int64 `json:"memberuserid" xorm:"'MEMBERUSERID'"` // 所属会员ID
  27. ROOTUSERID int64 `json:"rootuserid" xorm:"'ROOTUSERID'"` // 根用户ID
  28. NICKNAME string `json:"nickname" xorm:"'NICKNAME'"` // 昵称
  29. }
  30. func init() {
  31. go func() {
  32. time.Sleep(time.Second * 3)
  33. vUsrMgr.load(0)
  34. }()
  35. }
  36. // 加载数据, userId=0时, 加载所有记录
  37. func (r *userAccountMgr) load(userId int64) {
  38. now := time.Now()
  39. // 间隔3秒以上才重新加载
  40. if d := now.Sub(r.last); d.Seconds() < 3 {
  41. return
  42. }
  43. r.mtx.Lock()
  44. defer r.mtx.Unlock()
  45. e := db.GetEngine()
  46. if e == nil {
  47. return
  48. }
  49. sqlId := "select t.USERID," +
  50. " t.USERTYPE," +
  51. " t.ACCOUNTNAME," +
  52. " t.PARENTUSERID," +
  53. " t.MEMBERUSERID," +
  54. " t.ROOTUSERID," +
  55. " u.nickname" +
  56. " from useraccount t" +
  57. " left join userinfo u" +
  58. " on t.userid = u.userid" +
  59. " where 1 = 1"
  60. if userId > 0 {
  61. sqlId += fmt.Sprintf(" and t.userid = %v", userId)
  62. }
  63. sData := make([]usrAccData, 0)
  64. s := e.SQL(sqlId)
  65. if err := s.Find(&sData); err != nil {
  66. logger.GetLogger().Errorf("cache load useraccount, %v", err)
  67. } else {
  68. if userId == 0 || r.data == nil {
  69. r.data = make(map[int64]usrAccData)
  70. }
  71. for i := range sData {
  72. r.data[sData[i].USERID] = sData[i]
  73. }
  74. r.last = time.Now()
  75. }
  76. }
  77. func (r *userAccountMgr) get(userId int64) string {
  78. r.mtx.RLock()
  79. defer r.mtx.RUnlock()
  80. if r.data == nil {
  81. return ""
  82. }
  83. now := time.Now()
  84. // 用户名可能会修改, 间隔5分钟失效, 返回空, 需要重新加载
  85. if d := now.Sub(r.last); d.Seconds() > 300 {
  86. return ""
  87. }
  88. if v, ok := r.data[userId]; ok {
  89. return v.ACCOUNTNAME
  90. }
  91. return ""
  92. }
  93. // getEx 返回 accountname, nickname
  94. func (r *userAccountMgr) getEx(userId int64) (string, string) {
  95. r.mtx.RLock()
  96. defer r.mtx.RUnlock()
  97. if r.data == nil {
  98. return "", ""
  99. }
  100. now := time.Now()
  101. // 用户名可能会修改, 间隔5分钟失效, 返回空, 需要重新加载
  102. if d := now.Sub(r.last); d.Seconds() > 300 {
  103. return "", ""
  104. }
  105. if v, ok := r.data[userId]; ok {
  106. return v.ACCOUNTNAME, v.NICKNAME
  107. }
  108. return "", ""
  109. }
  110. func (r *userAccountMgr) getData(userId int64) (usrAccData, bool) {
  111. r.mtx.RLock()
  112. defer r.mtx.RUnlock()
  113. if r.data == nil {
  114. return usrAccData{}, false
  115. }
  116. v, ok := r.data[userId]
  117. return v, ok
  118. }
  119. // GetUserNameByUserId 根据UserId获取名称
  120. func GetUserNameByUserId(userId int64) string {
  121. if userId == 0 {
  122. return ""
  123. }
  124. if v := vUsrMgr.get(userId); v != "" {
  125. return v
  126. } else {
  127. vUsrMgr.load(userId)
  128. }
  129. return vUsrMgr.get(userId)
  130. }
  131. // GetUserNameAndNickName 获取名称和昵称
  132. func GetUserNameAndNickName(userId int64) (string, string) {
  133. if userId == 0 {
  134. return "", ""
  135. }
  136. if userName, nickName := vUsrMgr.getEx(userId); userName != "" {
  137. return userName, nickName
  138. } else {
  139. vUsrMgr.load(userId)
  140. }
  141. return vUsrMgr.getEx(userId)
  142. }
  143. // GetAreaUserId 获取所属机构id
  144. func GetAreaUserId(userId int64, userType int32) (areaUserId int64) {
  145. _ = userType
  146. if userId == 0 {
  147. return userId
  148. }
  149. areaUserId = userId
  150. if v, ok := vUsrMgr.getData(userId); ok {
  151. areaUserId = v.ROOTUSERID
  152. return
  153. } else {
  154. vUsrMgr.load(userId)
  155. }
  156. if v, ok := vUsrMgr.getData(userId); ok {
  157. areaUserId = v.ROOTUSERID
  158. }
  159. return
  160. }
  161. // IsAreaUserId 是否是机构id
  162. func IsAreaUserId(userId int64) bool {
  163. areaUserId := GetAreaUserId(userId, 0)
  164. return areaUserId == userId
  165. }