diff --git a/domain/model/mic_m/mic.go b/domain/model/mic_m/mic.go index 64b44ef4ecac3a0a46a476f47b09cc0b8271338f..d83f144c4d8ad7973b2097256d3dd0f42673358b 100644 --- a/domain/model/mic_m/mic.go +++ b/domain/model/mic_m/mic.go @@ -1,6 +1,7 @@ package mic_m import ( + "git.hilo.cn/hilo-common/_const/enum/timezone_e" "git.hilo.cn/hilo-common/domain" "git.hilo.cn/hilo-common/resource/mysql" "git.hilo.cn/hilo-common/utils" @@ -17,14 +18,15 @@ type UserOnMic struct { LastCalTs int64 CreatedTime time.Time `gorm:"->"` UpdatedTime time.Time `gorm:"->"` + Tz timezone_e.Timezone } // 获取用户当日上麦 // 允许返回gorm.ErrRecordNotFound -func GetUserOnMic(model *domain.Model, userId mysql.ID) (*UserOnMic, error) { +func GetUserOnMic(model *domain.Model, userId mysql.ID, tz timezone_e.Timezone) (*UserOnMic, error) { res := new(UserOnMic) day := time.Now().Format("2006-01-02") - if err := model.DB().Where("date = ? AND user_id = ?", day, userId).First(res).Error; err != nil { + if err := model.DB().Where("date = ? AND user_id = ? AND tz = ?", day, userId, tz).First(res).Error; err != nil { return nil, err } return res, nil @@ -34,37 +36,40 @@ func GetUserOnMic(model *domain.Model, userId mysql.ID) (*UserOnMic, error) { // 事务操作 func IncrUserOnMic(model *domain.Model, userId mysql.ID, joinMicTimestamp int64) error { return model.Transaction(func(model *domain.Model) error { - omMic, err := GetUserOnMic(model, userId) - if err != nil && err != gorm.ErrRecordNotFound { - return err - } - curTs := joinMicTimestamp - nowTs := time.Now().Unix() - day0Ts := utils.GetZeroTime(time.Now()).Unix() - if omMic != nil && joinMicTimestamp < omMic.LastCalTs { // 加入的时间比上次计算时间小 - curTs = omMic.LastCalTs - } - // 跨天 - if curTs < day0Ts { - curTs = day0Ts - } - score := nowTs - curTs - day := time.Now().Format("2006-01-02") - onMicNew := &UserOnMic{ - Date: day, - UserId: userId, - Seconds: mysql.Num(score), - LastCalTs: nowTs, - } - if err := model.DB().Model(UserOnMic{}).Clauses(clause.OnConflict{ - Columns: []clause.Column{{Name: "date"}, {Name: "user_id"}}, - DoUpdates: clause.Assignments(map[string]interface{}{ - "seconds": gorm.Expr("seconds + ?", onMicNew.Seconds), - "last_cal_ts": nowTs, - }), - }).Create(onMicNew).Error; err != nil { - model.Log.Errorf("IncrUserOnMic fail:%v", err) - return err + for _, tz := range timezone_e.Timezones { + omMic, err := GetUserOnMic(model, userId, tz) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + curTs := joinMicTimestamp + nowTs := time.Now().Unix() + day0Ts := utils.GetZeroTime(time.Now().In(timezone_e.TimezoneLocMap[tz])).Unix() + if omMic != nil && joinMicTimestamp < omMic.LastCalTs { // 加入的时间比上次计算时间小 + curTs = omMic.LastCalTs + } + // 跨天 + if curTs < day0Ts { + curTs = day0Ts + } + score := nowTs - curTs + day := time.Now().In(timezone_e.TimezoneLocMap[tz]).Format("2006-01-02") + onMicNew := &UserOnMic{ + Date: day, + UserId: userId, + Seconds: mysql.Num(score), + LastCalTs: nowTs, + Tz: tz, + } + if err := model.DB().Model(UserOnMic{}).Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "date"}, {Name: "user_id"}, {Name: "tz"}}, + DoUpdates: clause.Assignments(map[string]interface{}{ + "seconds": gorm.Expr("seconds + ?", onMicNew.Seconds), + "last_cal_ts": nowTs, + }), + }).Create(onMicNew).Error; err != nil { + model.Log.Errorf("IncrUserOnMic fail:%v", err) + return err + } } return nil }) @@ -72,10 +77,25 @@ func IncrUserOnMic(model *domain.Model, userId mysql.ID, joinMicTimestamp int64) // 批量获取用户上麦时长 // @return userId->seconds -func MGetUserOnMicSeconds(model *domain.Model, day string, userIds []uint64) (map[mysql.ID]mysql.Num, error) { +func MGetUserOnMicSeconds(model *domain.Model, day string, tz timezone_e.Timezone, userIds []uint64) (map[mysql.ID]mysql.Num, error) { + var rows []UserOnMic + res := make(map[mysql.ID]mysql.Num) + if err := model.DB().Model(UserOnMic{}).Where("`date`= ? AND tz = ? AND user_id in ?", day, tz, userIds).Find(&rows).Error; err != nil { + model.Log.Errorf("MGetUserOnMic fail:%v", err) + return res, err + } + for _, r := range rows { + res[r.UserId] = r.Seconds + } + return res, nil +} + +// 批量获取用户上麦时长 +// @return userId->seconds +func MGetUserOnMicSecondsRange(model *domain.Model, beginDate, endDate string, tz timezone_e.Timezone, userIds []uint64) (map[mysql.ID]mysql.Num, error) { var rows []UserOnMic res := make(map[mysql.ID]mysql.Num) - if err := model.DB().Model(UserOnMic{}).Where("`date`= ? AND user_id in ?", day, userIds).Find(&rows).Error; err != nil { + if err := model.DB().Model(UserOnMic{}).Where("`date` >= ? AND `date` <= ? AND tz = ? AND user_id in ?", beginDate, endDate, tz, userIds).Find(&rows).Error; err != nil { model.Log.Errorf("MGetUserOnMic fail:%v", err) return res, err } diff --git a/route/mic_r/inner.go b/route/mic_r/inner.go index d212ae9833ca38c8631deed207490a666a9f710c..fd263e40c8c5c4342e2774baf820899f59d3f7bf 100644 --- a/route/mic_r/inner.go +++ b/route/mic_r/inner.go @@ -1,6 +1,7 @@ package mic_r import ( + "git.hilo.cn/hilo-common/_const/enum/timezone_e" "git.hilo.cn/hilo-common/domain" "git.hilo.cn/hilo-common/mycontext" "git.hilo.cn/hilo-common/resource/mysql" @@ -10,14 +11,16 @@ import ( ) type MGetUserOnMicSecondsReq struct { - Day string `form:"day" binding:"required"` - Ids []mysql.ID `form:"ids" binding:"required"` + Day string `form:"day" binding:"required"` + Ids []mysql.ID `form:"ids" binding:"required"` + Tz timezone_e.Timezone `form:"tz"` } // @Tags 麦位-内部 // @Summary 批量获取用户天上麦时长 // @Param day query string true "天 格式2006-001-02" // @Param ids query string true "用户id,如:ids=1&ids=2&ids=3" +// @Param tz query string false "时区 0:北京时间(默认) 1:沙特时间" // @Success 200 {object} map[uint64]uint32 // @Router /inner/mic/onMicSeconds [get] func MGetUserOnMicSeconds(c *gin.Context) (*mycontext.MyContext, error) { @@ -27,7 +30,38 @@ func MGetUserOnMicSeconds(c *gin.Context) (*mycontext.MyContext, error) { if err := c.ShouldBindQuery(&req); err != nil { return myCtx, err } - onMic, err := mic_m.MGetUserOnMicSeconds(model, req.Day, req.Ids) + onMic, err := mic_m.MGetUserOnMicSeconds(model, req.Day, req.Tz, req.Ids) + if err != nil { + return myCtx, err + } + response := onMic + resp.ResponseOk(c, response) + return myCtx, nil +} + +type MGetUserOnMicSecondsRangeReq struct { + BeginDate string `form:"beginDate" binding:"required"` + EndDate string `form:"endDate" binding:"required"` + Ids []mysql.ID `form:"ids" binding:"required"` + Tz timezone_e.Timezone `form:"tz"` +} + +// @Tags 麦位-内部 +// @Summary 批量获取用户范围上麦时长 +// @Param beginDate query string true "天 格式2006-001-02" +// @Param endDate query string true "天 格式2006-001-02" +// @Param ids query string true "用户id,如:ids=1&ids=2&ids=3" +// @Param tz query string false "时区 0:北京时间(默认) 1:沙特时间" +// @Success 200 {object} map[uint64]uint32 +// @Router /inner/mic/onMicSeconds/range [get] +func MGetUserOnMicSecondsRange(c *gin.Context) (*mycontext.MyContext, error) { + myCtx := mycontext.CreateMyContext(c.Keys) + var model = domain.CreateModelContext(myCtx) + var req MGetUserOnMicSecondsRangeReq + if err := c.ShouldBindQuery(&req); err != nil { + return myCtx, err + } + onMic, err := mic_m.MGetUserOnMicSecondsRange(model, req.BeginDate, req.EndDate, req.Tz, req.Ids) if err != nil { return myCtx, err } diff --git a/route/router.go b/route/router.go index 19d523c3660980c670557001cd1c88a125ada903..5d7115fa3cd600060027c7d3053ef93ec95f9591 100644 --- a/route/router.go +++ b/route/router.go @@ -161,6 +161,7 @@ func InitRouter() *gin.Engine { innerMic := inner.Group("/mic") { innerMic.GET("/onMicSeconds", wrapper(mic_r.MGetUserOnMicSeconds)) + innerMic.GET("/onMicSeconds/range", wrapper(mic_r.MGetUserOnMicSecondsRange)) } r.GET("/test", wrapper(group_power_r.Test)) return r