123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- package model
- import (
- "active/tools"
- "encoding/json"
- "errors"
- "strings"
- "time"
- "git.jiaxianghudong.com/go/logs"
- "git.jiaxianghudong.com/webs/pkg/dbx"
- )
- var errOpenIDEmpty = errors.New("openid can not be empty")
- type FuncStatus struct {
- Val int32 `json:"v"` // 当前计数
- LastTime int64 `json:"lt"` // 上一次操作时间
- }
- // PlayerData 玩家信息
- type PlayerData struct {
- //Source string `json:"source,omitempty"` // 用户来源
- //RegDate time.Time `json:"rt,omitempty"` // 用户注册时间
- // ADFailTime tools.Time `json:"adft,omitempty"` // 用户上次拉取广告失败的时间
- // LastFissionTime tools.Time `json:"l_ft,omitempty"` // 最后一次拉新时间
- // LastADTime tools.Time `json:"l_adt,omitempty"` // 最后一次看广告的时间
- // 用户累计计数
- // FissionUsers int32 `json:"fu"` // 总拉新人数
- //LoginDays int32 `json:"ld"` // 总登陆天数
- // ShareToTimeline int32 `json:"stt"` // 总分享到朋友圈次数
- // ShareToTimelineDays int32 `json:"d_stt"` // 总分享到朋友圈行为的发生天数
- // ShareToGroup int32 `json:"stg"` // 总分享到群次数
- // ShareToGroupDays int32 `json:"d_stg"` // 总分享到群行为的发生天数
- // ShareToFriend int32 `json:"stf"` // 总分享到好友次数
- // ShareToFriendDays int32 `json:"d_stf"` // 总分享到好友行为的发生天数
- // AD int32 `json:"ad"` // 总看广告次数-小游戏
- // AppAD int32 `json:"app_ad"` // 总看广告次数-APP上观看
- // ADDays int32 `json:"d_ad"` // 总看广告行为的发生天数(小程序)
- // AppADDays int32 `json:"d_app_ad"` // 总看广告行为的发生天数(APP)
- // 用户本日计数
- // ShareRejectCount int32 `json:"src"` // 当前分享被拒次数, 成功后需清0
- // TodayShareToFriend int32 `json:"t_stf"` // 每日分享到指定好友数
- // TodayShareToGroup int32 `json:"t_stg"` // 本日分享到群的次数
- // TodayShareToTimeline int32 `json:"t_stt"` // 本日分享到朋友圈的次数
- // TodayAD int32 `json:"t_ad"` // 本日看广告的次数(小程序)
- // TodayAppAD int32 `json:"t_app_ad"` // 本日看广告的次数(APP)
- // TodayFissionUsers int32 `json:"t_fu"` // 本日拉新人数
- UpdateTime tools.Time `json:"up,omitempty"` // 数据更新时间
- TodayAwardShares int32 `json:"d_award_s"` // 奖励埋点分享次数
- TodayAwardAds int32 `json:"d_award_ad"` // 奖励埋点广告次数
- // 用户处理用户拉新分享次数控制
- // FissionUserShareCount int32 `json:"fusc"` // 未拉新的分享次数
- // 用户功能状态
- FuncStatusMap map[string]*FuncStatus `json:"fsm,omitempty"` // map[功能标识符]*funcStatus
- }
- // Player 玩家 数据表
- type Player struct {
- ID int64 `sql:"id" json:"id"`
- MchID string `sql:"mch_id" json:"mch_id"`
- OpenID string `sql:"openid" json:"openid"`
- Data PlayerData `sql:"-" json:"-"`
- UpdateTime string `sql:"update" json:"update"`
- }
- // GetPlayerData 获取数据
- func (p *Player) GetPlayerData() error {
- const strSQL = "SELECT `id`, `data`, `update` FROM players WHERE `openid`=? AND `mch_id`=? LIMIT 1"
- if p.OpenID != "" {
- var data []byte
- if err := dbx.MySQL.QueryRow(strSQL, p.OpenID, p.MchID).Scan(&p.ID, &data, &p.UpdateTime); err != nil {
- return err
- }
- if err := json.Unmarshal(data, &p.Data); err != nil {
- return err
- }
- now := time.Now()
- last := time.Time(p.Data.UpdateTime)
- // 不是当天,则重新计数
- if now.Year() != last.Year() || now.YearDay() != last.YearDay() {
- p.Data.TodayAwardAds = 0
- p.Data.TodayAwardShares = 0
- logs.Debug("重制时间: %v", last)
- // p.Data.ShareRejectCount = 0
- // p.Data.TodayAppAD = 0
- // p.Data.TodayAD = 0
- // p.Data.TodayFissionUsers = 0
- // p.Data.TodayShareToFriend = 0
- // p.Data.TodayShareToGroup = 0
- // p.Data.TodayShareToTimeline = 0
- }
- return nil
- }
- return errOpenIDEmpty
- }
- // GetPlayerByID
- func GetPlayerByID(p *Player) error {
- const strSQL = "SELECT `id`, `data`, `update` FROM players WHERE `id`=? LIMIT 1"
- if p.OpenID != "" {
- row := dbx.MySQL.QueryRow(strSQL, p.ID)
- var data []byte
- if err := row.Scan(&p.ID, &data, &p.UpdateTime); err != nil {
- return err
- }
- return json.Unmarshal(data, &p.Data)
- }
- return errOpenIDEmpty
- }
- // Save 将玩家数据落盘
- func (p *Player) Save() error {
- now := time.Now()
- p.Data.UpdateTime = tools.Time(now)
- data, err := json.Marshal(p.Data)
- if err != nil {
- return err
- }
- const strUpdate = "UPDATE players SET `data`=?, `update`=? WHERE `mch_id`=? AND `openid`=?"
- const strInsert = "INSERT INTO players(`mch_id`,`openid`, `data`, `update`) VALUES(?,?,?,?)"
- nowStr := tools.Time(now).String()
- res, err := dbx.MySQL.Exec(strInsert, p.MchID, p.OpenID, data, nowStr)
- if err == nil {
- if p.ID == 0 {
- p.ID, err = res.LastInsertId()
- return err
- }
- return nil
- }
- if strings.Contains(err.Error(), "Duplicate entry") {
- _, err := dbx.MySQL.Exec(strUpdate, data, nowStr, p.MchID, p.OpenID)
- return err
- }
- return err
- }
|