From 4be5481e13d56c8b497c72199293de56e8930ed1 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 11 Apr 2023 11:18:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=B8=8A=E9=BA=A6=E6=97=B6=E9=95=BF?= =?UTF-8?q?=E5=8A=A0=E4=B8=8Atz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/model/mic_m/mic.go | 75 +++++++++++++++++++++------------------ route/mic_r/inner.go | 9 +++-- 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/domain/model/mic_m/mic.go b/domain/model/mic_m/mic.go index 64b44ef..5530205 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,10 @@ 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 user_id in ?", day, userIds).Find(&rows).Error; err != nil { + 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 } diff --git a/route/mic_r/inner.go b/route/mic_r/inner.go index d212ae9..06ca920 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,7 @@ 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 } -- 2.22.0