fan.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. package data
  2. import (
  3. "context"
  4. "encoding/binary"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "go-common/app/interface/main/creative/model/data"
  9. "go-common/library/ecode"
  10. "go-common/library/log"
  11. "github.com/tsuna/gohbase/hrpc"
  12. )
  13. // 粉丝管理 - up_fans_analysis
  14. // mid倒置补0 (补满共10位)+0 +yyyyMMdd – 累计数据
  15. // mid倒置补0 (补满共10位)+1 +yyyyMMdd – 7日数据
  16. // mid倒置补0 (补满共10位)+2 +yyyyMMdd – 30日数据
  17. // mid倒置补0 (补满共10位)+3 +yyyyMMdd – 90日数据
  18. func fansRowKey(id int64, ty int) string {
  19. idStr := strconv.FormatInt(id, 10)
  20. s := reverseString(idStr)
  21. s = s + strconv.Itoa(ty) + time.Now().AddDate(0, 0, -1).Add(-12*time.Hour).Format("20060102")
  22. return s
  23. }
  24. // up主粉丝勋章 - up_fans_medal
  25. // mid倒置补0(补满共10位)+1 +yyyyMMdd
  26. func upFansMedalRowKey(id int64, ty int) string {
  27. idStr := strconv.FormatInt(id, 10)
  28. s := reverseString(idStr)
  29. s = s + strconv.Itoa(ty) + time.Now().AddDate(0, 0, -1).Add(-12*time.Hour).Format("20060102")
  30. return s
  31. }
  32. func byteToInt32(b []byte) int32 {
  33. return int32(b[3]) | int32(b[2])<<8 | int32(b[1])<<16 | int32(b[0])<<24
  34. }
  35. // UpFansAnalysisForApp for app fans analysis.
  36. func (d *Dao) UpFansAnalysisForApp(c context.Context, mid int64, ty int) (res *data.AppFan, err error) {
  37. var (
  38. result *hrpc.Result
  39. ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
  40. tableName = HBaseUpFansAnalysis
  41. rowkey = fansRowKey(mid, ty)
  42. summary = make(map[string]int64) //total & classify proportion
  43. rankDr = make(map[string]int32) //播放时长 mid list
  44. rankVideoAct = make(map[string]int32) //视频互动 mid list
  45. rankMap = make(map[string]map[string]int32) //top 10 rank list
  46. )
  47. defer cancel()
  48. log.Info("UpFansAnalysisForApp mid(%d)|rowkey(%s)", mid, rowkey)
  49. if result, err = d.hbase.GetStr(ctx, tableName, rowkey); err != nil {
  50. log.Error("d.hbase.GetStr tableName(%s)|mid(%d)|rowkey(%v)|error(%v)", tableName, mid, rowkey, err)
  51. err = ecode.CreativeDataErr
  52. return
  53. }
  54. if result == nil || len(result.Cells) == 0 {
  55. log.Warn("UpFansAnalysisForApp no data tableName(%s)|mid(%d)|", tableName, mid)
  56. return
  57. }
  58. for _, c := range result.Cells {
  59. if c == nil {
  60. continue
  61. }
  62. if string(c.Family) == "f" {
  63. if len(c.Value) != 4 {
  64. log.Error("UpFansAnalysisForApp family[f] get dirty value tableName(%s)|mid(%d)|rowkey(%s)|value(%+v)", tableName, mid, rowkey, c.Value)
  65. continue
  66. }
  67. v := int64(byteToInt32(c.Value))
  68. switch string(c.Qualifier[:]) {
  69. case "all": //总粉丝
  70. summary["total"] = v
  71. case "inc": //新增粉丝
  72. summary["inc"] = v
  73. case "act": //活跃粉丝
  74. summary["active"] = v
  75. case "v":
  76. summary["play"] = v
  77. case "dm":
  78. summary["dm"] = v
  79. case "r":
  80. summary["reply"] = v
  81. case "c":
  82. summary["coin"] = v
  83. case "inter": //互动活跃度*10000
  84. summary["inter"] = v
  85. case "vv": //观看活跃度*10000
  86. summary["vv"] = v
  87. case "da": //弹幕粉丝占比*10000
  88. summary["da"] = v
  89. case "re": //评论粉丝占比*10000
  90. summary["re"] = v
  91. case "co": //投币粉丝占比*10000
  92. summary["co"] = v
  93. case "fv": //收藏粉丝占比*10000
  94. summary["fv"] = v
  95. case "sh": //分享粉丝占比*10000
  96. summary["sh"] = v
  97. case "lk": //点赞粉丝占比*10000
  98. summary["lk"] = v
  99. }
  100. log.Info("UpFansAnalysisForApp family[f] value tableName(%s)|mid(%d)|rowkey(%s)|key(%s)|value(%+v|Uint32[%+v]|int32[%+v])", tableName, mid, rowkey, string(c.Qualifier[:]), c.Value, binary.BigEndian.Uint32(c.Value), v)
  101. }
  102. if string(c.Family) == "t" {
  103. var v int32
  104. if len(c.Value) == 4 {
  105. v = int32(binary.BigEndian.Uint32(c.Value))
  106. } else {
  107. log.Error("UpFansAnalysisForApp family t get dirty tableName(%s)|mid(%d)|rowkey(%s)|value(%+v)", tableName, mid, fansRowKey(mid, ty), c.Value)
  108. }
  109. if strings.Contains(string(c.Qualifier[:]), "dr") {
  110. rankDr[string(c.Qualifier[:])] = v
  111. }
  112. if strings.Contains(string(c.Qualifier[:]), "act") {
  113. rankVideoAct[string(c.Qualifier[:])] = v
  114. }
  115. }
  116. }
  117. rankMap[data.PlayDuration] = rankDr
  118. rankMap[data.VideoAct] = rankVideoAct
  119. log.Info("UpFansAnalysisForApp mid(%d)|rowkey(%s)|summary(%+v)|rankMap(%+v)", mid, rowkey, summary, rankMap)
  120. res = &data.AppFan{
  121. Summary: summary,
  122. RankMap: rankMap,
  123. }
  124. return
  125. }
  126. // UpFansAnalysisForWeb for web fans analysis.
  127. func (d *Dao) UpFansAnalysisForWeb(c context.Context, mid int64, ty int) (res *data.WebFan, err error) {
  128. var (
  129. result *hrpc.Result
  130. ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
  131. tableName = HBaseUpFansAnalysis
  132. summary = make(map[string]int32) //total & classify proportion
  133. rankDr = make(map[string]int32) //播放时长 mid list
  134. rankVideoAct = make(map[string]int32) //视频互动 mid list
  135. rankDyAct = make(map[string]int32) //动态互动 mid list
  136. rankMap = make(map[string]map[string]int32) //top 10 rank list
  137. source = make(map[string]int32) //source proportion
  138. rowkey = fansRowKey(mid, ty)
  139. )
  140. defer cancel()
  141. log.Info("UpFansAnalysisForWeb mid(%d)|rowkey(%s)", mid, rowkey)
  142. if result, err = d.hbase.GetStr(ctx, tableName, rowkey); err != nil {
  143. log.Error("d.hbase.GetStr tableName(%s)|mid(%d)|rowkey(%v)|error(%v)", tableName, mid, rowkey, err)
  144. err = ecode.CreativeDataErr
  145. return
  146. }
  147. if result == nil || len(result.Cells) == 0 {
  148. log.Warn("UpFansAnalysisForWeb no data tableName(%s)|mid(%d)|rowkey(%v)", tableName, mid, rowkey)
  149. return
  150. }
  151. var cells data.FansAnalysis
  152. err = parser.Parse(result.Cells, &cells)
  153. for k, v := range cells.F {
  154. if k == "all" { //总粉丝
  155. summary["total"] = v
  156. } else if k == "act" { //活跃粉丝
  157. summary["active"] = v
  158. } else if k == "mdl" { //领取勋章粉丝
  159. summary["medal"] = v
  160. } else {
  161. summary[k] = v
  162. }
  163. }
  164. for k, v := range cells.T {
  165. if strings.Contains(k, "dr") {
  166. rankDr[k] = v
  167. } else if strings.Contains(k, "act") {
  168. rankVideoAct[k] = v
  169. } else if strings.Contains(k, "dy") {
  170. rankDyAct[k] = v
  171. }
  172. }
  173. for k, v := range cells.S {
  174. if strings.Contains(k, "pf") {
  175. if pk, ok := fanSource[k]; ok {
  176. source[pk] = v
  177. }
  178. }
  179. }
  180. for _, k := range fanSource { //粉丝来源页面占比如果数据平台未返回,则设置对应的key
  181. if _, ok := source[k]; !ok {
  182. source[k] = 0
  183. }
  184. }
  185. rankMap[data.PlayDuration] = rankDr
  186. rankMap[data.VideoAct] = rankVideoAct
  187. rankMap[data.DynamicAct] = rankDyAct
  188. log.Info("UpFansAnalysisForWebRankMap mid(%d)|rowkey(%s)|summary(%+v)|rankMap(%+v)|source(%+v)", mid, rowkey, summary, rankMap, source)
  189. res = &data.WebFan{
  190. Summary: summary,
  191. RankMap: rankMap,
  192. Source: source,
  193. }
  194. return
  195. }
  196. // UpFansMedal get 领取勋章数+佩戴勋章数.
  197. func (d *Dao) UpFansMedal(c context.Context, mid int64) (res *data.UpFansMedal, err error) {
  198. var (
  199. result *hrpc.Result
  200. ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
  201. tableName = HBaseUpFansMedalQuery
  202. rowkey = upFansMedalRowKey(mid, 1)
  203. )
  204. defer cancel()
  205. log.Info("UpFansMedal aid(%d)|rowkey(%s)", mid, rowkey)
  206. if result, err = d.hbase.GetStr(ctx, tableName, rowkey); err != nil {
  207. log.Error("d.hbase.GetStr tableName(%s)|mid(%d)|rowkey(%+v)|error(%v)", tableName, mid, rowkey, err)
  208. err = ecode.CreativeDataErr
  209. return
  210. }
  211. if result == nil || len(result.Cells) == 0 {
  212. log.Warn("UpFansMedal no data tableName(%s)|mid(%d)|rowkey(%+v)", tableName, mid, rowkey)
  213. return
  214. }
  215. var cells data.UpFansMedal
  216. err = parser.Parse(result.Cells, &cells)
  217. if err != nil {
  218. log.Error("parser.Parse tableName(%s)|mid(%d)|rowkey(%+v)|error(%v)", tableName, mid, rowkey, err)
  219. err = ecode.CreativeDataErr
  220. return
  221. }
  222. res = &cells
  223. log.Info("UpFansMedal mid(%d)|rowkey(%s)|res(%+v)", mid, rowkey, *res)
  224. return
  225. }