Files
stat_center/service/landpageSer/web.go
T
2026-05-20 16:13:58 +08:00

215 lines
5.4 KiB
Go

package landpageSer
import (
"context"
"fmt"
"stat/api/proto"
"stat/models/appInfoMod"
"stat/models/downloadstat"
"stat/models/landpageImg"
"stat/service/cacheSer"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
func ListDailyStat(ctx context.Context, param *proto.ListDailyStatReq) (*proto.ListLandPageStatRes, error) {
resp := &proto.ListLandPageStatRes{
Total: 0,
List: make([]*proto.DownloadStatInfo, 0),
}
filter := bson.M{"type": downloadstat.StatTypeDaily}
opt := &options.FindOptions{}
opt.SetSort(bson.D{{Key: "sumDate", Value: -1}})
opt.SetSkip((param.PageNum - 1) * param.PageSize)
opt.SetLimit(param.PageSize)
if param.AppId != nil {
filter["appId"] = bson.M{"$in": *param.AppId}
}
if param.StartTime != nil && param.EndTime != nil {
filter["sumDate"] = bson.M{"$gte": *param.StartTime, "$lt": *param.EndTime}
}
total, _ := downloadstat.CountStats(ctx, filter)
statList, err := downloadstat.FindManyStat(ctx, filter, opt)
if err != nil {
return nil, err
}
appMap, _ := appInfoMod.GetAllAppIdNameMap(ctx)
for _, item := range statList {
item.AppName = appMap[item.AppId]
tmp := &proto.DownloadStatInfo{
Stat: *item,
}
proto.StatSummation(&resp.Summary, tmp)
tmp.CalcConversionRate()
resp.List = append(resp.List, tmp)
}
resp.Total = total
resp.Summary.CalcConversionRate()
return resp, nil
}
func ListDailyHourStat(ctx context.Context, param *proto.ListDailyHourStatReq) (*proto.ListLandPageStatRes, error) {
resp := &proto.ListLandPageStatRes{
Total: 0,
List: make([]*proto.DownloadStatInfo, 0),
}
filter := bson.M{"type": downloadstat.StatTypeHour}
opt := &options.FindOptions{}
opt.SetSort(bson.D{{Key: "sumDate", Value: -1}, {Key: "hour", Value: -1}})
opt.SetSkip((param.PageNum - 1) * param.PageSize)
opt.SetLimit(param.PageSize)
if param.AppId != nil {
filter["appId"] = *param.AppId
}
if param.StartTime != nil && param.EndTime != nil {
filter["sumDate"] = bson.M{"$gte": *param.StartTime, "$lt": *param.EndTime}
}
if param.SumHour != nil {
filter["hour"] = *param.SumHour
}
total, _ := downloadstat.CountStats(ctx, filter)
statList, err := downloadstat.FindManyStat(ctx, filter, opt)
if err != nil {
return nil, err
}
appMap, _ := appInfoMod.GetAllAppIdNameMap(ctx)
for _, item := range statList {
item.AppName = appMap[item.AppId]
tmp := &proto.DownloadStatInfo{
Stat: *item,
}
proto.StatSummation(&resp.Summary, tmp)
tmp.CalcConversionRate()
resp.List = append(resp.List, tmp)
}
resp.Total = total
resp.Summary.CalcConversionRate()
return resp, nil
}
func LandpagePicture(ctx context.Context, req *proto.LandpagePictureSearch) (resp *proto.LandpagePictureSearchResp, err error) {
resp = &proto.LandpagePictureSearchResp{}
filter := bson.M{}
opt := &options.FindOptions{}
if req.Status != nil {
filter[landpageImg.FN.LandpageImg.Status] = *req.Status
}
if req.Name != nil {
filter[landpageImg.FN.LandpageImg.Name] = *req.Name
}
opt.SetSort(bson.M{landpageImg.FN.LandpageImg.CreatedAt: -1})
opt.SetSkip((req.PageNum - 1) * req.PageSize)
opt.SetLimit(req.PageSize)
resp.Total, err = landpageImg.CountLandpageImgs(ctx, filter)
if err != nil {
return nil, err
}
if resp.Total == 0 {
return resp, nil
}
landpagePictureList, serr := landpageImg.FindManyLandpageImg(ctx, filter, opt)
if serr != nil {
return nil, serr
}
resp.List = landpagePictureList
return
}
func AddLandpagePicture(ctx context.Context, req *proto.LandpagePictureAddReq) error {
now := time.Now()
req.CreatedAt = now
req.UpdatedAt = now
serr := landpageImg.InsertOneLandpageImg(ctx, &req.LandpageImg)
if serr != nil {
return serr
}
return nil
}
func DelLandpagePicture(ctx context.Context, id string) error {
objectId, err := primitive.ObjectIDFromHex(id)
if err != nil {
return err
}
adFilter := bson.M{landpageImg.FN.LandpageImg.ID: objectId}
//删除
_, serr := landpageImg.DelOneLandpageImg(ctx, adFilter)
if serr != nil {
return serr
}
return nil
}
func UpdateLandpagePicture(ctx context.Context, req *proto.LandpagePictureUpdateReq) error {
now := time.Now()
req.Param.UpdatedAt = &now
objectId, err := primitive.ObjectIDFromHex(req.Id)
if err != nil {
return err
}
adFilter := bson.M{landpageImg.FN.LandpageImg.ID: objectId}
updateDoc := bson.M{"$set": req.Param}
serr := landpageImg.UpdateOneLandpageImg(ctx, adFilter, updateDoc)
if serr != nil {
return serr
}
return nil
}
func ListSummaryDownload(ctx context.Context) (*proto.ListDownloadSummaryRes, error) {
resp := &proto.ListDownloadSummaryRes{
List: make([]proto.DownloadSummaryInfo, 0),
}
cacheKey := fmt.Sprintf("landPage#summary")
if cache, exists := cacheSer.Cache.Get(cacheKey); exists {
data, ok := cache.([]proto.DownloadSummaryInfo)
if !ok {
pipeline := []bson.M{
{"$group": bson.M{
"_id": "$appId",
"total": bson.M{"$sum": "$downTotal"},
}},
}
if err := downloadstat.AggregateStats(ctx, &resp.List, pipeline); err != nil {
return nil, err
}
cacheSer.Cache.Set(cacheKey, resp.List, 15*time.Minute)
} else {
resp.List = data
}
} else {
pipeline := []bson.M{
{"$group": bson.M{
"_id": "$appId",
"total": bson.M{"$sum": "$downTotal"},
}},
}
if err := downloadstat.AggregateStats(ctx, &resp.List, pipeline); err != nil {
return nil, err
}
cacheSer.Cache.Set(cacheKey, resp.List, 15*time.Minute)
}
return resp, nil
}