Commit 1767b4bb authored by hujiebin's avatar hujiebin

Feature/girl support

parent 5e2eba47
package mic_m package mic_m
import ( import (
"git.hilo.cn/hilo-common/_const/enum/timezone_e"
"git.hilo.cn/hilo-common/domain" "git.hilo.cn/hilo-common/domain"
"git.hilo.cn/hilo-common/resource/mysql" "git.hilo.cn/hilo-common/resource/mysql"
"git.hilo.cn/hilo-common/utils" "git.hilo.cn/hilo-common/utils"
...@@ -17,14 +18,15 @@ type UserOnMic struct { ...@@ -17,14 +18,15 @@ type UserOnMic struct {
LastCalTs int64 LastCalTs int64
CreatedTime time.Time `gorm:"->"` CreatedTime time.Time `gorm:"->"`
UpdatedTime time.Time `gorm:"->"` UpdatedTime time.Time `gorm:"->"`
Tz timezone_e.Timezone
} }
// 获取用户当日上麦 // 获取用户当日上麦
// 允许返回gorm.ErrRecordNotFound // 允许返回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) res := new(UserOnMic)
day := time.Now().Format("2006-01-02") 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 nil, err
} }
return res, nil return res, nil
...@@ -34,37 +36,40 @@ func GetUserOnMic(model *domain.Model, userId mysql.ID) (*UserOnMic, error) { ...@@ -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 { func IncrUserOnMic(model *domain.Model, userId mysql.ID, joinMicTimestamp int64) error {
return model.Transaction(func(model *domain.Model) error { return model.Transaction(func(model *domain.Model) error {
omMic, err := GetUserOnMic(model, userId) for _, tz := range timezone_e.Timezones {
if err != nil && err != gorm.ErrRecordNotFound { omMic, err := GetUserOnMic(model, userId, tz)
return err if err != nil && err != gorm.ErrRecordNotFound {
} return err
curTs := joinMicTimestamp }
nowTs := time.Now().Unix() curTs := joinMicTimestamp
day0Ts := utils.GetZeroTime(time.Now()).Unix() nowTs := time.Now().Unix()
if omMic != nil && joinMicTimestamp < omMic.LastCalTs { // 加入的时间比上次计算时间小 day0Ts := utils.GetZeroTime(time.Now().In(timezone_e.TimezoneLocMap[tz])).Unix()
curTs = omMic.LastCalTs if omMic != nil && joinMicTimestamp < omMic.LastCalTs { // 加入的时间比上次计算时间小
} curTs = omMic.LastCalTs
// 跨天 }
if curTs < day0Ts { // 跨天
curTs = day0Ts if curTs < day0Ts {
} curTs = day0Ts
score := nowTs - curTs }
day := time.Now().Format("2006-01-02") score := nowTs - curTs
onMicNew := &UserOnMic{ day := time.Now().In(timezone_e.TimezoneLocMap[tz]).Format("2006-01-02")
Date: day, onMicNew := &UserOnMic{
UserId: userId, Date: day,
Seconds: mysql.Num(score), UserId: userId,
LastCalTs: nowTs, Seconds: mysql.Num(score),
} LastCalTs: nowTs,
if err := model.DB().Model(UserOnMic{}).Clauses(clause.OnConflict{ Tz: tz,
Columns: []clause.Column{{Name: "date"}, {Name: "user_id"}}, }
DoUpdates: clause.Assignments(map[string]interface{}{ if err := model.DB().Model(UserOnMic{}).Clauses(clause.OnConflict{
"seconds": gorm.Expr("seconds + ?", onMicNew.Seconds), Columns: []clause.Column{{Name: "date"}, {Name: "user_id"}, {Name: "tz"}},
"last_cal_ts": nowTs, DoUpdates: clause.Assignments(map[string]interface{}{
}), "seconds": gorm.Expr("seconds + ?", onMicNew.Seconds),
}).Create(onMicNew).Error; err != nil { "last_cal_ts": nowTs,
model.Log.Errorf("IncrUserOnMic fail:%v", err) }),
return err }).Create(onMicNew).Error; err != nil {
model.Log.Errorf("IncrUserOnMic fail:%v", err)
return err
}
} }
return nil return nil
}) })
...@@ -72,10 +77,25 @@ func IncrUserOnMic(model *domain.Model, userId mysql.ID, joinMicTimestamp int64) ...@@ -72,10 +77,25 @@ func IncrUserOnMic(model *domain.Model, userId mysql.ID, joinMicTimestamp int64)
// 批量获取用户上麦时长 // 批量获取用户上麦时长
// @return userId->seconds // @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 var rows []UserOnMic
res := make(map[mysql.ID]mysql.Num) 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) model.Log.Errorf("MGetUserOnMic fail:%v", err)
return res, err return res, err
} }
......
package mic_r package mic_r
import ( import (
"git.hilo.cn/hilo-common/_const/enum/timezone_e"
"git.hilo.cn/hilo-common/domain" "git.hilo.cn/hilo-common/domain"
"git.hilo.cn/hilo-common/mycontext" "git.hilo.cn/hilo-common/mycontext"
"git.hilo.cn/hilo-common/resource/mysql" "git.hilo.cn/hilo-common/resource/mysql"
...@@ -10,14 +11,16 @@ import ( ...@@ -10,14 +11,16 @@ import (
) )
type MGetUserOnMicSecondsReq struct { type MGetUserOnMicSecondsReq struct {
Day string `form:"day" binding:"required"` Day string `form:"day" binding:"required"`
Ids []mysql.ID `form:"ids" binding:"required"` Ids []mysql.ID `form:"ids" binding:"required"`
Tz timezone_e.Timezone `form:"tz"`
} }
// @Tags 麦位-内部 // @Tags 麦位-内部
// @Summary 批量获取用户天上麦时长 // @Summary 批量获取用户天上麦时长
// @Param day query string true "天 格式2006-001-02" // @Param day query string true "天 格式2006-001-02"
// @Param ids query string true "用户id,如:ids=1&ids=2&ids=3" // @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 // @Success 200 {object} map[uint64]uint32
// @Router /inner/mic/onMicSeconds [get] // @Router /inner/mic/onMicSeconds [get]
func MGetUserOnMicSeconds(c *gin.Context) (*mycontext.MyContext, error) { func MGetUserOnMicSeconds(c *gin.Context) (*mycontext.MyContext, error) {
...@@ -27,7 +30,38 @@ 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 { if err := c.ShouldBindQuery(&req); err != nil {
return myCtx, err 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 { if err != nil {
return myCtx, err return myCtx, err
} }
......
...@@ -161,6 +161,7 @@ func InitRouter() *gin.Engine { ...@@ -161,6 +161,7 @@ func InitRouter() *gin.Engine {
innerMic := inner.Group("/mic") innerMic := inner.Group("/mic")
{ {
innerMic.GET("/onMicSeconds", wrapper(mic_r.MGetUserOnMicSeconds)) innerMic.GET("/onMicSeconds", wrapper(mic_r.MGetUserOnMicSeconds))
innerMic.GET("/onMicSeconds/range", wrapper(mic_r.MGetUserOnMicSecondsRange))
} }
r.GET("/test", wrapper(group_power_r.Test)) r.GET("/test", wrapper(group_power_r.Test))
return r return r
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment