manager.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package handler
  2. import (
  3. "sort"
  4. "strconv"
  5. "sync"
  6. "time"
  7. "bet24.com/servers/common"
  8. "bet24.com/log"
  9. pb "bet24.com/servers/micros/userlabel/proto"
  10. )
  11. var mgr *labelMgr
  12. type labelMgr struct {
  13. config_list []*pb.LabelConfig // 标签配置
  14. user_list map[int]*userInfo // 用户列表
  15. lock *sync.RWMutex // 用户锁
  16. }
  17. func newLabelMgr() {
  18. mgr = new(labelMgr)
  19. mgr.lock = &sync.RWMutex{}
  20. mgr.user_list = make(map[int]*userInfo)
  21. mgr.loadConfig()
  22. mgr.doCheck()
  23. return
  24. }
  25. // 轮询
  26. func (this *labelMgr) doCheck() {
  27. ticker := time.NewTicker(2 * time.Minute)
  28. go func(t *time.Ticker) {
  29. for {
  30. select {
  31. case <-t.C:
  32. this.checkExpire()
  33. }
  34. }
  35. }(ticker)
  36. }
  37. // 检查用户
  38. func (this *labelMgr) checkExpire() {
  39. this.lock.Lock()
  40. defer this.lock.Unlock()
  41. // 遍历所有用户
  42. for _, u := range this.user_list {
  43. // 判断是否过期
  44. if !u.isExpire() {
  45. continue
  46. }
  47. // 删除
  48. delete(this.user_list, u.userId)
  49. log.Debug("manager.checkExpire userId=%d 已完成清理", u.userId)
  50. }
  51. return
  52. }
  53. // 获取用户
  54. func (this *labelMgr) getUser(userId int) *userInfo {
  55. this.lock.RLock()
  56. u, ok := this.user_list[userId]
  57. this.lock.RUnlock()
  58. if ok {
  59. u.updateTimeStamp()
  60. return u
  61. }
  62. u = newUserInfo(userId)
  63. this.lock.Lock()
  64. this.user_list[userId] = u
  65. this.lock.Unlock()
  66. return u
  67. }
  68. // 获取标签列表
  69. func (this *labelMgr) getLabel(userId, typeId int) []pb.LabelColor {
  70. u := this.getUser(userId)
  71. if u == nil {
  72. log.Debug("manager.getLabel userId=%d", userId)
  73. return nil
  74. }
  75. var ret []pb.LabelColor
  76. for _, v := range u.getLabelList() {
  77. if typeId > 0 && v.TypeId != typeId {
  78. continue
  79. }
  80. cfg := this.getConfigInfo(v.TypeId)
  81. if cfg == nil {
  82. log.Error("manager.getLabel userId=%d typeId=%d", userId, v.TypeId)
  83. continue
  84. }
  85. labelName, poolValue := this.getLabelName(v.TypeId, v.LabelId)
  86. if labelName == "" {
  87. labelName = v.LabelId
  88. }
  89. ret = append(ret, pb.LabelColor{
  90. TypeId: v.TypeId,
  91. TypeName: cfg.TypeName,
  92. LabelId: v.LabelId,
  93. LabelName: labelName,
  94. Color: cfg.Color,
  95. PoolValue: poolValue,
  96. })
  97. }
  98. sort.SliceStable(ret, func(i, j int) bool {
  99. return ret[i].TypeId < ret[j].TypeId
  100. })
  101. return ret
  102. }
  103. // 触发事件
  104. func (this *labelMgr) triggerEvent(userId, typeId int, scope pb.Scope) {
  105. if userId <= 0 {
  106. log.Debug("manager.triggerEvent userId=%d typeId=%d scope=%+v", userId, typeId, scope)
  107. return
  108. }
  109. log.Debug("manager.triggerEvent userId=%d typeId=%d scope=%+v", userId, typeId, scope)
  110. u := this.getUser(userId)
  111. if u == nil {
  112. log.Debug("manager.triggerCounter userId=%d typeId=%d scope=%+v", userId, typeId, scope)
  113. return
  114. }
  115. // 触发事件
  116. u.dispatch(typeId, scope)
  117. }
  118. // 用户标签列表
  119. func (this *labelMgr) GetListByLabelId(labelId, pageIndex, pageSize int) (int, []pb.LabelUser) {
  120. recordCount, list := trans_GetListByLabelId(labelId, pageIndex, pageSize)
  121. for i := 0; i < len(list); i++ {
  122. cfg := this.getConfigInfo(list[i].TypeId)
  123. if cfg == nil {
  124. continue
  125. }
  126. labelName, _ := this.getLabelName(list[i].TypeId, list[i].LabelId)
  127. if labelName == "" {
  128. labelName = list[i].LabelId
  129. }
  130. list[i].TypeName = cfg.TypeName
  131. list[i].LabelName = labelName
  132. }
  133. return recordCount, list
  134. }
  135. // 打印用户
  136. func (this *labelMgr) dumpUser(param1 string) {
  137. userId := 0
  138. if param1 != "" {
  139. userId, _ = strconv.Atoi(param1)
  140. }
  141. log.Debug(" ^_^ 开始打印用户数据,用户(%d)人", len(this.user_list))
  142. this.lock.RLock()
  143. for uid, v := range this.user_list {
  144. if userId > 0 && userId != uid {
  145. continue
  146. }
  147. log.Debug("用户[%d]信息,过期时间[%s],标签数据(%d)个:", uid, time.Unix(int64(v.timeStamp), 0).Format(common.Layout), len(v.label_list))
  148. for _, labelInfo := range v.label_list {
  149. log.Debug("TypeId=%d LabelId=%s TotalValue=%d 共(%d)条数据", labelInfo.TypeId, labelInfo.LabelId, labelInfo.TotalValue, len(labelInfo.Days))
  150. for _, dayInfo := range labelInfo.Days {
  151. log.Debug(" Index=%d Param=%s value=%d extValue=%d", dayInfo.Index, dayInfo.Param, dayInfo.Value, dayInfo.ExtValue)
  152. }
  153. }
  154. log.Debug("++++++++++++++++++++++++++++++++++++++++++++++")
  155. }
  156. this.lock.RUnlock()
  157. log.Debug("完成用户数据打印 ^_^")
  158. }
  159. // 打印配置
  160. func (this *labelMgr) dumpConfig() {
  161. log.Debug(" ^_^ 开始打印配置数据,共(%d)条记录", len(this.config_list))
  162. this.lock.RLock()
  163. for _, v := range this.config_list {
  164. log.Debug("配置信息:%+v", v)
  165. for _, c := range v.Content {
  166. log.Debug(" %+v", c)
  167. }
  168. log.Debug("++++++++++++++++++++++++++++++++++++++++++++++")
  169. }
  170. this.lock.RUnlock()
  171. log.Debug("完成配置数据打印 ^_^")
  172. }