package statctrl import ( "fmt" "time" "91porn-server/common" "91porn-server/common/stderr" "91porn-server/common/timeutil/timerange" "91porn-server/models/commod" "91porn-server/models/s/statvidmod" "91porn-server/models/v/vidmod" "91porn-server/web/service/deduction" "91porn-server/web/service/payvidlgser" "github.com/gin-gonic/gin" "go.mongodb.org/mongo-driver/bson/primitive" ) const VideoAggregateStatsTopN = 20 // VideoEarnStats doc // @Summary 视屏收入统计 // @Description 统计从指定时间区间的视屏收入 // @Tags web-统计管理 // @Accept mpfd,json // @Produce json,html // @Param uid query string true "用户ID" // @Param startTime query string true "开始时间" // @Param endTime query string true "结束时间" // @Success 200 {string} json "{"msg": "操作成功"}" // @Failure 400 {string} json "{"msg": "操作失败"}" // @Router /web/stats/video/earn/list [get] func VideoEarnStats(c *gin.Context) { type Query struct { StartTime *time.Time `form:"startTime" json:"startTime,omitempty" binding:""` //开始时间 EndTime *time.Time `form:"endTime" json:"endTime,omitempty" binding:""` //结束时间 UID *uint64 `form:"uid" json:"uid" binding:""` //uid Vid *string `form:"vid" json:"vid" binding:""` //vid } var arg struct { commod.Page Query } if err := c.ShouldBind(&arg); err != nil { common.ServeJSON(c, stderr.ErrParamError, "stat VideoEarnStats arg error "+err.Error()) return } endTime := time.Now() if arg.EndTime != nil { endTime = timerange.LocDayRange(*arg.EndTime).Head } startTime := time.Time{} if arg.StartTime != nil { startTime = timerange.LocDayRange(*arg.StartTime).Head } var vid *primitive.ObjectID if arg.Vid != nil { id, _ := primitive.ObjectIDFromHex(*arg.Vid) vid = &id } var vids []primitive.ObjectID if arg.UID != nil { list, _ := vidmod.FindMany((&vidmod.PublisherIDMatch{PublisherID: arg.UID}).New()) vids = list.IDs() } limit := int64(arg.PageSize) skip := int64((arg.PageNumber - 1) * arg.PageSize) page, err := statvidmod.VideoStatPages(skip, limit, statvidmod.SumDateGTEAndLTMatch{GTE: &startTime, LT: &endTime}, statvidmod.VidMatch{Vid: vid}, statvidmod.VidInMatch{Vids: vids}, ) if err != nil { common.ServeJSON(c, stderr.Failure, "stat VideoEarnStats Failure, error: !"+err.Error()) return } common.ServeJSON(c, stderr.Success, page) } // VideoEarnStats doc // @Summary 视频收入聚合统计排序 // @Description 聚合统计指定时间区间内视频收入,取总收益前20展示 // @Tags web-统计管理 // @Accept mpfd,json // @Produce json,html // @Param uid query string true "用户ID" // @Param startTime query string true "开始时间" // @Param endTime query string true "结束时间" // @Success 200 {object} payvidlgser.VideoCoinIncomeAggregateTopNStat "success" // @Failure 400 {string} json "{"msg": "操作失败"}" // @Router /web/stats/video/earn/aggregate [get] func VideoAggregateStats(c *gin.Context) { type Query struct { StartTime *time.Time `form:"startTime" json:"startTime,omitempty" binding:""` //开始时间 EndTime *time.Time `form:"endTime" json:"endTime,omitempty" binding:""` //结束时间 UID *uint64 `form:"uid" json:"uid" binding:""` //uid } args := &Query{} if err := c.ShouldBind(args); err != nil { common.ServeJSON(c, stderr.ErrParamError, fmt.Sprintf("stat VideoAggregateStats arg error %s", err.Error())) return } endTime := time.Now() if args.EndTime != nil { endTime = timerange.LocDayRange(*args.EndTime).Head } //最多允许查半年内的数据,防止数据量过大 startTime := endTime.AddDate(0, -6, 0) if args.StartTime != nil && args.StartTime.After(startTime) { startTime = timerange.LocDayRange(*args.StartTime).Head } stat, err := payvidlgser.VideoCoinIncomeAggregateTopN(VideoAggregateStatsTopN, startTime, endTime) if err != nil { common.ServeJSON(c, stderr.Failure, "stat VideoAggregateStats Failure, error: !"+err.Error()) return } common.ServeJSON(c, stderr.Success, stat) } // VideoPublisherDeductionStats doc // @Summary 视频博主扣量前后视频总售卖 // @Description 统计博主扣量前视频总售卖,扣量后总售卖 // @Tags web-统计管理 // @Accept mpfd,json // @Produce json,html // @Param uid query string true "用户ID" // @Param startTime query string true "开始时间" // @Param endTime query string true "结束时间" // @Success 200 {string} json deduction.PublisherDeduction // @Failure 400 {string} json "{"msg": "操作失败"}" // @Router /web/stats/video/publisher/deduction [get] func VideoPublisherDeductionStats(c *gin.Context) { args := &deduction.Query{} if err := c.ShouldBind(args); err != nil { common.ServeJSON(c, stderr.ErrParamError, fmt.Sprintf("stat VideoPublisherDeductionStats arg error %s", err.Error())) return } if args.EndTime == nil { *args.EndTime = timerange.LocDayRange(time.Now()).Head } // 早于这之前的历史数据无法查询 startTime := time.Date(2021, time.October, 18, 23, 59, 59, 0, time.Local) if args.StartTime != nil && args.StartTime.Before(startTime) { common.ServeJSON(c, stderr.ErrParamError, fmt.Sprintf("stat VideoPublisherDeductionStats error %s", "start time too early")) return } if args.EndTime.Before(*args.StartTime) { common.ServeJSON(c, stderr.ErrParamError, fmt.Sprintf("stat VideoPublisherDeductionStats error %s", "start time is after end time")) return } stat, err := deduction.StatPublisherDeduction(args) if err != nil { common.ServeJSON(c, stderr.Failure, fmt.Sprintf("stat VideoPublisherDeductionStats error %s", err.Error())) return } common.ServeJSON(c, stderr.Success, stat) }