160 lines
6.1 KiB
Go
160 lines
6.1 KiB
Go
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)
|
|
}
|