player.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package model
  2. import (
  3. "active/tools"
  4. "encoding/json"
  5. "errors"
  6. "strings"
  7. "time"
  8. "git.jiaxianghudong.com/go/logs"
  9. "git.jiaxianghudong.com/webs/pkg/dbx"
  10. )
  11. var errOpenIDEmpty = errors.New("openid can not be empty")
  12. type FuncStatus struct {
  13. Val int32 `json:"v"` // 当前计数
  14. LastTime int64 `json:"lt"` // 上一次操作时间
  15. }
  16. // PlayerData 玩家信息
  17. type PlayerData struct {
  18. //Source string `json:"source,omitempty"` // 用户来源
  19. //RegDate time.Time `json:"rt,omitempty"` // 用户注册时间
  20. // ADFailTime tools.Time `json:"adft,omitempty"` // 用户上次拉取广告失败的时间
  21. // LastFissionTime tools.Time `json:"l_ft,omitempty"` // 最后一次拉新时间
  22. // LastADTime tools.Time `json:"l_adt,omitempty"` // 最后一次看广告的时间
  23. // 用户累计计数
  24. // FissionUsers int32 `json:"fu"` // 总拉新人数
  25. //LoginDays int32 `json:"ld"` // 总登陆天数
  26. // ShareToTimeline int32 `json:"stt"` // 总分享到朋友圈次数
  27. // ShareToTimelineDays int32 `json:"d_stt"` // 总分享到朋友圈行为的发生天数
  28. // ShareToGroup int32 `json:"stg"` // 总分享到群次数
  29. // ShareToGroupDays int32 `json:"d_stg"` // 总分享到群行为的发生天数
  30. // ShareToFriend int32 `json:"stf"` // 总分享到好友次数
  31. // ShareToFriendDays int32 `json:"d_stf"` // 总分享到好友行为的发生天数
  32. // AD int32 `json:"ad"` // 总看广告次数-小游戏
  33. // AppAD int32 `json:"app_ad"` // 总看广告次数-APP上观看
  34. // ADDays int32 `json:"d_ad"` // 总看广告行为的发生天数(小程序)
  35. // AppADDays int32 `json:"d_app_ad"` // 总看广告行为的发生天数(APP)
  36. // 用户本日计数
  37. // ShareRejectCount int32 `json:"src"` // 当前分享被拒次数, 成功后需清0
  38. // TodayShareToFriend int32 `json:"t_stf"` // 每日分享到指定好友数
  39. // TodayShareToGroup int32 `json:"t_stg"` // 本日分享到群的次数
  40. // TodayShareToTimeline int32 `json:"t_stt"` // 本日分享到朋友圈的次数
  41. // TodayAD int32 `json:"t_ad"` // 本日看广告的次数(小程序)
  42. // TodayAppAD int32 `json:"t_app_ad"` // 本日看广告的次数(APP)
  43. // TodayFissionUsers int32 `json:"t_fu"` // 本日拉新人数
  44. UpdateTime tools.Time `json:"up,omitempty"` // 数据更新时间
  45. TodayAwardShares int32 `json:"d_award_s"` // 奖励埋点分享次数
  46. TodayAwardAds int32 `json:"d_award_ad"` // 奖励埋点广告次数
  47. // 用户处理用户拉新分享次数控制
  48. // FissionUserShareCount int32 `json:"fusc"` // 未拉新的分享次数
  49. // 用户功能状态
  50. FuncStatusMap map[string]*FuncStatus `json:"fsm,omitempty"` // map[功能标识符]*funcStatus
  51. }
  52. // Player 玩家 数据表
  53. type Player struct {
  54. ID int64 `sql:"id" json:"id"`
  55. MchID string `sql:"mch_id" json:"mch_id"`
  56. OpenID string `sql:"openid" json:"openid"`
  57. Data PlayerData `sql:"-" json:"-"`
  58. UpdateTime string `sql:"update" json:"update"`
  59. }
  60. // GetPlayerData 获取数据
  61. func (p *Player) GetPlayerData() error {
  62. const strSQL = "SELECT `id`, `data`, `update` FROM players WHERE `openid`=? AND `mch_id`=? LIMIT 1"
  63. if p.OpenID != "" {
  64. var data []byte
  65. if err := dbx.MySQL.QueryRow(strSQL, p.OpenID, p.MchID).Scan(&p.ID, &data, &p.UpdateTime); err != nil {
  66. return err
  67. }
  68. if err := json.Unmarshal(data, &p.Data); err != nil {
  69. return err
  70. }
  71. now := time.Now()
  72. last := time.Time(p.Data.UpdateTime)
  73. // 不是当天,则重新计数
  74. if now.Year() != last.Year() || now.YearDay() != last.YearDay() {
  75. p.Data.TodayAwardAds = 0
  76. p.Data.TodayAwardShares = 0
  77. logs.Debug("重制时间: %v", last)
  78. // p.Data.ShareRejectCount = 0
  79. // p.Data.TodayAppAD = 0
  80. // p.Data.TodayAD = 0
  81. // p.Data.TodayFissionUsers = 0
  82. // p.Data.TodayShareToFriend = 0
  83. // p.Data.TodayShareToGroup = 0
  84. // p.Data.TodayShareToTimeline = 0
  85. }
  86. return nil
  87. }
  88. return errOpenIDEmpty
  89. }
  90. // GetPlayerByID
  91. func GetPlayerByID(p *Player) error {
  92. const strSQL = "SELECT `id`, `data`, `update` FROM players WHERE `id`=? LIMIT 1"
  93. if p.OpenID != "" {
  94. row := dbx.MySQL.QueryRow(strSQL, p.ID)
  95. var data []byte
  96. if err := row.Scan(&p.ID, &data, &p.UpdateTime); err != nil {
  97. return err
  98. }
  99. return json.Unmarshal(data, &p.Data)
  100. }
  101. return errOpenIDEmpty
  102. }
  103. // Save 将玩家数据落盘
  104. func (p *Player) Save() error {
  105. now := time.Now()
  106. p.Data.UpdateTime = tools.Time(now)
  107. data, err := json.Marshal(p.Data)
  108. if err != nil {
  109. return err
  110. }
  111. const strUpdate = "UPDATE players SET `data`=?, `update`=? WHERE `mch_id`=? AND `openid`=?"
  112. const strInsert = "INSERT INTO players(`mch_id`,`openid`, `data`, `update`) VALUES(?,?,?,?)"
  113. nowStr := tools.Time(now).String()
  114. res, err := dbx.MySQL.Exec(strInsert, p.MchID, p.OpenID, data, nowStr)
  115. if err == nil {
  116. if p.ID == 0 {
  117. p.ID, err = res.LastInsertId()
  118. return err
  119. }
  120. return nil
  121. }
  122. if strings.Contains(err.Error(), "Duplicate entry") {
  123. _, err := dbx.MySQL.Exec(strUpdate, data, nowStr, p.MchID, p.OpenID)
  124. return err
  125. }
  126. return err
  127. }