forked from all_user/stat_center
Initial commit
This commit is contained in:
@@ -0,0 +1,311 @@
|
||||
package advertiseSer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"stat/api/proto"
|
||||
"stat/common/genId"
|
||||
"stat/common/log"
|
||||
"stat/common/redis"
|
||||
"stat/common/stdLog"
|
||||
"stat/common/utils"
|
||||
"stat/models/advertiseLocMod"
|
||||
"stat/models/advertiseMod"
|
||||
"stat/models/appInfoMod"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
)
|
||||
|
||||
// 获取广告列表
|
||||
func ListAds(ctx context.Context, param proto.ListAdsReq) (code stdLog.CodeType, data interface{}, err error) {
|
||||
resp := proto.ListAdsRes{
|
||||
Total: 0,
|
||||
List: make([]proto.AdsInfo, 0),
|
||||
}
|
||||
|
||||
skip, limit := utils.ToDBPage(param.PageNum, param.PageSize)
|
||||
|
||||
// 获取广告位置信息
|
||||
total, adsList, err := advertiseMod.FindAdvertiseList(ctx, param.AppId, param.IsActive,
|
||||
param.LocId, skip, limit, param.Link, param.Title, param.DaoLiangTitle)
|
||||
if err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
resp.Total = total
|
||||
|
||||
// 获取app信息
|
||||
appIds := make([]int32, 0)
|
||||
for _, v := range adsList {
|
||||
appIds = append(appIds, v.AppId)
|
||||
}
|
||||
appList, err := appInfoMod.GetAppInfosByAppIds(ctx, appIds)
|
||||
if err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
appMap := make(map[int32]appInfoMod.AppInfo)
|
||||
for _, v := range appList {
|
||||
appMap[v.AppId] = v
|
||||
}
|
||||
|
||||
for _, v := range adsList {
|
||||
appName := ""
|
||||
if appInfo, ok := appMap[v.AppId]; ok {
|
||||
appName = appInfo.Name
|
||||
}
|
||||
|
||||
// 获取位置信息
|
||||
adsLocInfo, err := advertiseLocMod.FindLocationByAppIdAndLocId(ctx, v.AppId, v.LocId)
|
||||
if err != nil {
|
||||
code = stdLog.Failure
|
||||
return code, data, err
|
||||
}
|
||||
str := make([]string, 0)
|
||||
if v.Tags != "" {
|
||||
split := strings.Split(strings.TrimSpace(v.Tags), ",")
|
||||
for _, s := range split {
|
||||
str = append(str, s)
|
||||
}
|
||||
}
|
||||
tmp := proto.AdsInfo{
|
||||
Id: v.Id,
|
||||
AppId: v.AppId,
|
||||
AppName: appName,
|
||||
Title: v.Title,
|
||||
DaoLiangTitle: v.DaoLiangTitle,
|
||||
Tags: str,
|
||||
CoverImg: v.CoverImg,
|
||||
VisibleChannels: v.VisibleChannels,
|
||||
LocId: v.LocId,
|
||||
LocName: adsLocInfo.Name,
|
||||
ImgSizeDesc: adsLocInfo.ImgSizeDesc,
|
||||
Links: make([]proto.LinkInfo, 0),
|
||||
Sort: v.Sort,
|
||||
IsActive: v.IsActive,
|
||||
StartTime: v.StartTime,
|
||||
EndTime: v.EndTime,
|
||||
Remark: v.Remark,
|
||||
ClickCount: v.ClickCount,
|
||||
AmbientColor: v.AmbientColor,
|
||||
CreatedAt: v.CreatedAt,
|
||||
UpdatedAt: v.UpdatedAt,
|
||||
}
|
||||
|
||||
for _, v := range v.Links {
|
||||
tmp.Links = append(tmp.Links, proto.LinkInfo{
|
||||
Link: v.Link,
|
||||
Foreign: v.Foreign,
|
||||
Weight: v.Weight,
|
||||
})
|
||||
}
|
||||
|
||||
resp.List = append(resp.List, tmp)
|
||||
}
|
||||
|
||||
code = stdLog.Success
|
||||
data = resp
|
||||
return
|
||||
}
|
||||
|
||||
// 新增广告
|
||||
func AddAds(ctx context.Context, param proto.AddAdsReq, account string) (code stdLog.CodeType, data interface{}, err error) {
|
||||
adsId := genId.GetNextAdsId()
|
||||
now := time.Now()
|
||||
|
||||
doc := advertiseMod.Advertise{
|
||||
Id: adsId,
|
||||
AppId: param.AppId,
|
||||
Title: param.Title,
|
||||
Tags: param.Tags,
|
||||
CoverImg: param.CoverImg,
|
||||
LocId: param.LocId,
|
||||
Sort: param.Sort,
|
||||
IsActive: param.IsActive,
|
||||
StartTime: param.StartTime,
|
||||
EndTime: param.EndTime,
|
||||
Remark: param.Remark,
|
||||
AmbientColor: param.AmbientColor,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
}
|
||||
|
||||
for _, v := range param.Links {
|
||||
doc.Links = append(doc.Links, advertiseMod.LinkInfo{
|
||||
Link: v.Link,
|
||||
Foreign: v.Foreign,
|
||||
Weight: v.Weight,
|
||||
})
|
||||
}
|
||||
|
||||
if err = advertiseMod.AddAdvertise(ctx, &doc); err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
newInfo, _ := advertiseMod.FindOneAdvertise(ctx, bson.M{"_id": adsId})
|
||||
if newInfo != nil {
|
||||
CheckChange(ctx, nil, newInfo, account)
|
||||
}
|
||||
|
||||
code = stdLog.Success
|
||||
return
|
||||
}
|
||||
|
||||
// 修改广告位置
|
||||
func UpdateAds(ctx context.Context, param proto.UpdateAdsReq, account string) (code stdLog.CodeType, data interface{}, err error) {
|
||||
now := time.Now()
|
||||
|
||||
doc := advertiseMod.UpdateAds{
|
||||
AppId: param.AppId,
|
||||
Title: param.Title,
|
||||
DaoLiangTitle: param.DaoLiangTitle,
|
||||
Tags: param.Tags,
|
||||
CoverImg: param.CoverImg,
|
||||
Location: param.Location,
|
||||
JumpType: param.JumpType,
|
||||
Sort: param.Sort,
|
||||
IsActive: param.IsActive,
|
||||
StartTime: param.StartTime,
|
||||
EndTime: param.EndTime,
|
||||
Remark: param.Remark,
|
||||
AmbientColor: param.AmbientColor,
|
||||
UpdatedAt: &now,
|
||||
}
|
||||
if *param.Links != nil {
|
||||
links := make([]advertiseMod.LinkInfo, 0)
|
||||
for _, v := range *param.Links {
|
||||
links = append(links, advertiseMod.LinkInfo{
|
||||
Link: v.Link,
|
||||
Foreign: v.Foreign,
|
||||
Weight: v.Weight,
|
||||
})
|
||||
}
|
||||
doc.Links = &links
|
||||
}
|
||||
|
||||
if param.VisibleChannels != nil {
|
||||
channels := make([]string, 0)
|
||||
if len(*param.VisibleChannels) > 0 {
|
||||
ch := strings.Split(*param.VisibleChannels, ",")
|
||||
channels = append(channels, ch...)
|
||||
}
|
||||
|
||||
doc.VisibleChannels = &channels
|
||||
}
|
||||
if doc.Location != nil {
|
||||
locId := int32(*doc.Location)
|
||||
doc.LocId = &locId
|
||||
}
|
||||
oldInfo, err := advertiseMod.FindOneAdvertise(ctx, bson.M{"_id": *param.Id})
|
||||
if err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
if err = advertiseMod.UpdateAdvertise(ctx, *param.Id, doc); err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
newInfo, err := advertiseMod.FindOneAdvertise(ctx, bson.M{"_id": *param.Id})
|
||||
if err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
CheckChange(ctx, oldInfo, newInfo, account)
|
||||
|
||||
code = stdLog.Success
|
||||
return
|
||||
}
|
||||
|
||||
// 删除广告
|
||||
func DelAds(ctx context.Context, param proto.DelAdsReq, account string) (code stdLog.CodeType, data interface{}, err error) {
|
||||
|
||||
oldInfo, err := advertiseMod.FindOneAdvertise(ctx, bson.M{"_id": *param.Id})
|
||||
if err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
if err = advertiseMod.DelAdvertise(ctx, *param.Id); err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
CheckChange(ctx, oldInfo, nil, account)
|
||||
|
||||
code = stdLog.Success
|
||||
return
|
||||
}
|
||||
|
||||
// 外部获取广告
|
||||
func GetAdvertise(ctx context.Context, param proto.AdvertiseReq) (code stdLog.CodeType, resp *proto.AdvertiseRes, err error) {
|
||||
resp = &proto.AdvertiseRes{AdvertiseList: make([]*proto.AdvertiseInfo, 0)}
|
||||
log.Info("GetAdvertise", log.Any("param", param))
|
||||
|
||||
adsList, err := advertiseMod.FindAdsByAppAndLocation(ctx, param.AppId, param.LocId)
|
||||
if err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
log.Info("GetAdvertise", log.Any("param", param), log.Any("adsList", len(adsList)))
|
||||
|
||||
// 遍历广告,处理系统广告
|
||||
for _, v := range adsList {
|
||||
adsInfo := &proto.AdvertiseInfo{
|
||||
Id: v.Id,
|
||||
Title: v.Title,
|
||||
CoverImg: v.CoverImg,
|
||||
LocId: v.LocId,
|
||||
JumpType: v.JumpType,
|
||||
Sort: v.Sort,
|
||||
Type: 0,
|
||||
Tags: v.Tags,
|
||||
Remark: v.Remark,
|
||||
AmbientColor: v.AmbientColor,
|
||||
}
|
||||
if len(v.Links) >= 1 {
|
||||
adsInfo.Link = v.Links[0].Link
|
||||
}
|
||||
resp.AdvertiseList = append(resp.AdvertiseList, adsInfo)
|
||||
}
|
||||
code = stdLog.Success
|
||||
err = nil
|
||||
return
|
||||
}
|
||||
|
||||
// 增加广告点击次数
|
||||
func IncAdsClickCount(ctx context.Context, param proto.AdsClickReq) (code stdLog.CodeType, data interface{}, err error) {
|
||||
// 获取广告信息
|
||||
adsInfo, err := advertiseMod.FindAdsById(ctx, *param.Id)
|
||||
if err != nil || adsInfo.Id == 0 {
|
||||
code = stdLog.AdvertiseInvalid
|
||||
return
|
||||
}
|
||||
|
||||
if adsInfo.AppId != *param.AppId {
|
||||
code = stdLog.AppInfoError
|
||||
return
|
||||
}
|
||||
// save to redis
|
||||
now := time.Now().Local()
|
||||
set := redis.GetAdvertiseClickDayHash(now)
|
||||
name := redis.GetAdvertiseClickHourName(adsInfo.AppId, adsInfo.Id, now.Hour())
|
||||
if _, err = set.IncInt(name, 1); err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
// update click+1 to db
|
||||
if err = advertiseMod.IncAdsClickCount(ctx, *param.Id); err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
code = stdLog.Success
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
package advertiseSer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"stat/api/proto"
|
||||
"stat/common/genId"
|
||||
"stat/common/stdLog"
|
||||
"stat/common/utils"
|
||||
"stat/models/advertiseLocMod"
|
||||
"stat/models/advertiseMod"
|
||||
"stat/models/appInfoMod"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 获取广告位置列表
|
||||
func ListAdsLoc(ctx context.Context, param proto.ListAdsLocReq) (code stdLog.CodeType, data interface{}, err error) {
|
||||
resp := proto.ListAdsLocRes{
|
||||
Total: 0,
|
||||
List: make([]proto.AdsLocInfo, 0),
|
||||
}
|
||||
|
||||
skip, limit := utils.ToDBPage(param.PageNum, param.PageSize)
|
||||
|
||||
// 获取广告位置信息
|
||||
total, adsList, err := advertiseLocMod.FindAdvertiseLocationList(ctx, param.AppId, skip, limit)
|
||||
if err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
resp.Total = total
|
||||
|
||||
// 获取app信息
|
||||
appIds := make([]int32, 0)
|
||||
for _, v := range adsList {
|
||||
appIds = append(appIds, v.AppId)
|
||||
}
|
||||
appList, err := appInfoMod.GetAppInfosByAppIds(ctx, appIds)
|
||||
if err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
appMap := make(map[int32]appInfoMod.AppInfo)
|
||||
for _, v := range appList {
|
||||
appMap[v.AppId] = v
|
||||
}
|
||||
|
||||
for _, v := range adsList {
|
||||
appName := ""
|
||||
if appInfo, ok := appMap[v.AppId]; ok {
|
||||
appName = appInfo.Name
|
||||
}
|
||||
tmp := proto.AdsLocInfo{
|
||||
Id: v.Id,
|
||||
AppId: v.AppId,
|
||||
AppName: appName,
|
||||
LocId: v.LocId,
|
||||
Name: v.Name,
|
||||
ImgSizeDesc: v.ImgSizeDesc,
|
||||
Remark: v.Remark,
|
||||
CreatedAt: v.CreatedAt,
|
||||
UpdatedAt: v.UpdatedAt,
|
||||
}
|
||||
|
||||
resp.List = append(resp.List, tmp)
|
||||
}
|
||||
|
||||
code = stdLog.Success
|
||||
data = resp
|
||||
return
|
||||
}
|
||||
|
||||
// 新增广告位置
|
||||
func AddAdsLoc(ctx context.Context, param proto.AddAdsLocReq) (code stdLog.CodeType, data interface{}, err error) {
|
||||
// 获取位置信息
|
||||
locInfo, err := advertiseLocMod.FindLocationByAppIdAndLocId(ctx, *param.AppId, *param.LocId)
|
||||
if err != nil || locInfo.Id > 0 {
|
||||
code = stdLog.AdvertiseLocExists
|
||||
return
|
||||
}
|
||||
|
||||
adsLocId := genId.GetNextAdsLocId()
|
||||
now := time.Now()
|
||||
|
||||
doc := advertiseLocMod.AdvertiseLocation{
|
||||
Id: adsLocId,
|
||||
AppId: *param.AppId,
|
||||
LocId: *param.LocId,
|
||||
Name: *param.Name,
|
||||
ImgSizeDesc: param.ImgSizeDesc,
|
||||
Remark: param.Remark,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
}
|
||||
|
||||
if err = advertiseLocMod.AddAdvertiseLocation(ctx, &doc); err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
code = stdLog.Success
|
||||
return
|
||||
}
|
||||
|
||||
// 修改广告位置
|
||||
func UpdateAdsLoc(ctx context.Context, param proto.UpdateAdsLocReq) (code stdLog.CodeType, data interface{}, err error) {
|
||||
// 获取位置信息
|
||||
locInfo, err := advertiseLocMod.FindLocationById(ctx, *param.Id)
|
||||
if err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
|
||||
doc := advertiseLocMod.UpdateAdsLoc{
|
||||
AppId: param.AppId,
|
||||
LocId: param.LocId,
|
||||
Name: param.Name,
|
||||
ImgSizeDesc: param.ImgSizeDesc,
|
||||
Remark: param.Remark,
|
||||
UpdatedAt: &now,
|
||||
}
|
||||
|
||||
if err = advertiseLocMod.UpdateAdvertiseLocation(ctx, *param.Id, doc); err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
// 修改广告的位置id
|
||||
if param.LocId != nil && *param.LocId != locInfo.LocId {
|
||||
if err = advertiseMod.UpdateLocInfo(ctx, locInfo.AppId, locInfo.LocId, *param.LocId); err != nil {
|
||||
code = stdLog.Failure
|
||||
return code, data, err
|
||||
}
|
||||
}
|
||||
|
||||
code = stdLog.Success
|
||||
return
|
||||
}
|
||||
|
||||
// 删除广告位置
|
||||
func DelAdsLoc(ctx context.Context, param proto.DelAdsLocReq) (code stdLog.CodeType, data interface{}, err error) {
|
||||
if err = advertiseLocMod.DelAdvertiseLocation(ctx, *param.Id); err != nil {
|
||||
code = stdLog.Failure
|
||||
return
|
||||
}
|
||||
|
||||
code = stdLog.Success
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,265 @@
|
||||
package advertiseSer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"stat/common/log"
|
||||
"stat/models/advertiseLocMod"
|
||||
"stat/models/advertiseMod"
|
||||
"stat/models/advertisestat"
|
||||
"stat/models/appInfoMod"
|
||||
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
)
|
||||
|
||||
// GetAdvertiseStatList 获取广告统计列表
|
||||
func GetAdvertiseStatList(ctx context.Context, param *GetAdvertiseStatReq) (*GetAdvertiseStatResp, error) {
|
||||
resp := &GetAdvertiseStatResp{}
|
||||
statFilter := bson.M{}
|
||||
if param.AppId != nil {
|
||||
statFilter[advertisestat.FN.AdvertiseStat.AppId] = bson.M{"$in": *param.AppId}
|
||||
}
|
||||
if param.AdsId != nil {
|
||||
statFilter[advertisestat.FN.AdvertiseStat.AdsId] = *param.AdsId
|
||||
}
|
||||
if param.AdsName != nil {
|
||||
adsInfos, err := advertiseMod.FindAdvertiselist(ctx, bson.M{"title": param.AdsName})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
adsIds := make([]int64, 0)
|
||||
for _, ad := range adsInfos {
|
||||
adsIds = append(adsIds, ad.Id)
|
||||
}
|
||||
|
||||
statFilter[advertisestat.FN.AdvertiseStat.AdsId] = bson.M{"$in": adsIds}
|
||||
}
|
||||
if param.Start != nil || param.End != nil {
|
||||
statFilter[advertisestat.FN.AdvertiseStat.SumData] = bson.M{"$gte": *param.Start, "$lte": *param.End}
|
||||
}
|
||||
filter := bson.M{}
|
||||
// app dict
|
||||
appDict, err := appInfoMod.GetAllAppIdMap(ctx, filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// ads dict
|
||||
adsDict, err := advertiseMod.GetAllAdvertiseMap(ctx, filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// ads location dict
|
||||
locDict, err := advertiseLocMod.GetAllAdvertiseLocationMap(ctx, filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
opt := &options.FindOptions{}
|
||||
opt.SetSort(bson.D{
|
||||
{advertisestat.FN.AdvertiseStat.SumData, -1},
|
||||
{advertisestat.FN.AdvertiseStat.Total, -1},
|
||||
})
|
||||
opt.SetLimit(param.PageSize)
|
||||
opt.SetSkip((param.PageNum - 1) * param.PageSize)
|
||||
totalStats, err := advertisestat.FindManyAdvertiseStat(ctx, statFilter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pageStats, err := advertisestat.FindManyAdvertiseStat(ctx, statFilter, opt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, stat := range totalStats {
|
||||
resp.Summary.TotalClick += stat.Total
|
||||
}
|
||||
for _, stat := range pageStats {
|
||||
appName := ""
|
||||
if app := appDict[stat.AppId]; app != nil {
|
||||
appName = app.Name
|
||||
}
|
||||
adsName := ""
|
||||
locId := int32(0)
|
||||
if ads := adsDict[stat.AdsId]; ads != nil {
|
||||
adsName = ads.Title
|
||||
locId = ads.LocId
|
||||
}
|
||||
locName := ""
|
||||
if appLoc := locDict[stat.AppId]; appLoc != nil {
|
||||
if loc := appLoc[locId]; loc != nil {
|
||||
locName = loc.Name
|
||||
}
|
||||
}
|
||||
hours := make([]int64, 24)
|
||||
for hour := range hours {
|
||||
hours[hour] = stat.HourData[hour]
|
||||
}
|
||||
resp.List = append(resp.List, &AdvertiseStatInfo{
|
||||
Id: stat.Id,
|
||||
AdsId: stat.AdsId,
|
||||
AdsName: adsName,
|
||||
AppId: stat.AppId,
|
||||
AppName: appName,
|
||||
LocId: locId,
|
||||
LocName: locName,
|
||||
SumDate: stat.SumDate,
|
||||
Total: stat.Total,
|
||||
HourData: hours,
|
||||
CreatedAt: stat.CreatedAt,
|
||||
UpdatedAt: stat.UpdatedAt,
|
||||
})
|
||||
}
|
||||
resp.Total = int64(len(totalStats))
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
// GetAdvertiseStatList 获取广告统计列表
|
||||
func GetAdvertiseTotalStatList(ctx context.Context, param *GetAdvertiseTotalStatReq) (*GetAdvertiseTotalStatResp,
|
||||
error) {
|
||||
resp := &GetAdvertiseTotalStatResp{
|
||||
List: make([]*AdvertiseTotalStatInfo, 0),
|
||||
}
|
||||
/*
|
||||
statFilter := bson.M{}
|
||||
if param.AppId != nil {
|
||||
statFilter[advertisestat.FN.AdvertiseStat.AppId] = *param.AppId
|
||||
}
|
||||
if param.Start != nil || param.End != nil {
|
||||
statFilter[advertisestat.FN.AdvertiseStat.SumData] = bson.M{"$gte": *param.Start, "$lte": *param.End}
|
||||
}
|
||||
*/
|
||||
// app dict
|
||||
appFilter := bson.M{}
|
||||
if param.AppId != nil {
|
||||
appFilter[appInfoMod.FN.AppInfo.AppId] = bson.M{"$in": *param.AppId}
|
||||
}
|
||||
apps, serr := appInfoMod.GetAllAppIdMap(ctx, appFilter)
|
||||
if serr != nil {
|
||||
return nil, serr
|
||||
}
|
||||
// ads dict
|
||||
adsFilter := bson.M{}
|
||||
if param.AppId != nil {
|
||||
adsFilter["appId"] = bson.M{"$in": *param.AppId}
|
||||
}
|
||||
if param.AdsId != nil {
|
||||
adsFilter["_id"] = *param.AdsId
|
||||
}
|
||||
if param.AdsName != nil {
|
||||
adsFilter["title"] = *param.AdsName
|
||||
}
|
||||
adsDict, err := advertiseMod.GetAllAdvertiseMap(ctx, adsFilter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// ads location dict
|
||||
locFilter := bson.M{}
|
||||
if param.AppId != nil {
|
||||
locFilter[appInfoMod.FN.AppInfo.AppId] = bson.M{"$in": *param.AppId}
|
||||
}
|
||||
locDict, err := advertiseLocMod.GetAllAdvertiseLocationMap(ctx, locFilter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
filter := bson.M{}
|
||||
if param.AppId != nil {
|
||||
filter["appId"] = bson.M{"$in": *param.AppId}
|
||||
}
|
||||
if param.AdsId != nil {
|
||||
filter["adsId"] = *param.AdsId
|
||||
}
|
||||
if param.AdsName != nil {
|
||||
adsInfos, err := advertiseMod.FindAdvertiselist(ctx, bson.M{"title": param.AdsName})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
adsIds := make([]int64, 0)
|
||||
for _, ad := range adsInfos {
|
||||
adsIds = append(adsIds, ad.Id)
|
||||
}
|
||||
|
||||
filter["adsId"] = bson.M{"$in": adsIds}
|
||||
}
|
||||
if param.Start != nil && param.End != nil {
|
||||
filter["sumDate"] = bson.M{"$gte": *param.Start, "$lte": *param.End}
|
||||
}
|
||||
pipeline := []bson.M{
|
||||
{
|
||||
"$match": filter,
|
||||
},
|
||||
{
|
||||
"$group": bson.M{
|
||||
"_id": "$adsId",
|
||||
"total": bson.M{"$sum": "$total"},
|
||||
},
|
||||
},
|
||||
{"$sort": bson.D{{Key: "_id", Value: -1}}},
|
||||
}
|
||||
|
||||
list := make([]AdvertiseTempInfo, 0)
|
||||
serr1 := advertisestat.AggregateAdvertiseStat(ctx, &list, pipeline)
|
||||
if serr1 != nil {
|
||||
log.Info("", log.Any("serr1", serr1))
|
||||
return nil, serr1
|
||||
}
|
||||
|
||||
pipeline = []bson.M{
|
||||
{
|
||||
"$match": filter,
|
||||
},
|
||||
{
|
||||
"$group": bson.M{
|
||||
"_id": "$adsId",
|
||||
"total": bson.M{"$sum": "$total"},
|
||||
},
|
||||
},
|
||||
{"$sort": bson.D{{Key: "_id", Value: -1}}},
|
||||
{"$skip": (param.PageNum - 1) * param.PageSize},
|
||||
{"$limit": param.PageSize},
|
||||
}
|
||||
|
||||
info := make([]AdvertiseTempInfo, 0)
|
||||
serr1 = advertisestat.AggregateAdvertiseStat(ctx, &info, pipeline)
|
||||
if serr1 != nil {
|
||||
log.Info("", log.Any("serr1", serr1))
|
||||
return nil, serr1
|
||||
}
|
||||
|
||||
for _, temp := range list {
|
||||
resp.Summary.TotalClick += temp.Total
|
||||
}
|
||||
|
||||
for _, stat := range info {
|
||||
appName := ""
|
||||
adsName := ""
|
||||
locName := ""
|
||||
locId := int32(0)
|
||||
appId := int32(0)
|
||||
if ads := adsDict[stat.AdsId]; ads != nil {
|
||||
adsName = ads.Title
|
||||
locId = ads.LocId
|
||||
if app := apps[ads.AppId]; app != nil {
|
||||
appName = app.Name
|
||||
appId = app.AppId
|
||||
if appLoc := locDict[app.AppId]; appLoc != nil {
|
||||
if loc := appLoc[locId]; loc != nil {
|
||||
locName = loc.Name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resp.List = append(resp.List, &AdvertiseTotalStatInfo{
|
||||
AdsId: stat.AdsId,
|
||||
AdsName: adsName,
|
||||
AppId: appId,
|
||||
AppName: appName,
|
||||
LocId: int64(locId),
|
||||
LocName: locName,
|
||||
Total: stat.Total,
|
||||
})
|
||||
}
|
||||
|
||||
resp.Total = int64(len(list))
|
||||
return resp, nil
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package advertiseSer
|
||||
|
||||
import (
|
||||
"stat/common"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
type AdvertiseStatSummary struct {
|
||||
TotalClick int64 `json:"totalClick"` // 总点击
|
||||
}
|
||||
|
||||
type AdvertiseStatInfo struct {
|
||||
Id primitive.ObjectID `json:"id" bson:"_id,omitempty"`
|
||||
AdsId int64 `json:"adsId" bson:"adsId"` //广告ID
|
||||
AdsName string `json:"adsName" bson:"adsName"` //广告名称
|
||||
AppId int32 `json:"appId" bson:"appId"` //应用ID
|
||||
AppName string `json:"appName" bson:"appName"` //应用名称
|
||||
LocId int32 `json:"locId" bson:"locId"` //位置ID
|
||||
LocName string `json:"locName" bson:"locName"` //位置名称
|
||||
SumDate time.Time `json:"sumDate" bson:"sumDate"` //记录时间
|
||||
Total int64 `json:"total" bson:"total"` //当日点击
|
||||
HourData []int64 `json:"hourData" bson:"hourData"` //小时数据
|
||||
CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //创建时间
|
||||
UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //更新时间
|
||||
}
|
||||
|
||||
// GetAdvertiseStatReq 获取app点击统计请求
|
||||
type GetAdvertiseStatReq struct {
|
||||
common.Page
|
||||
Start *time.Time `json:"start"` // 开始时间
|
||||
End *time.Time `json:"end"` // 结束时间
|
||||
AdsId *int64 `json:"adsId"` // 广告ID
|
||||
AppId *[]int64 `json:"appId"` // 应用ID
|
||||
AdsName *string `json:"adsName"` // 广告名称
|
||||
}
|
||||
|
||||
type GetAdvertiseStatResp struct {
|
||||
Total int64 `json:"total"`
|
||||
List []*AdvertiseStatInfo `json:"list"`
|
||||
Summary AdvertiseStatSummary `json:"summary"`
|
||||
}
|
||||
|
||||
type AdvertiseTempInfo struct {
|
||||
AdsId int64 `json:"id" bson:"_id"` //广告ID
|
||||
Total int64 `json:"total" bson:"total"` //当日点击
|
||||
}
|
||||
|
||||
// GetAdvertiseTotalStatReq 获取app点击统计请求
|
||||
type GetAdvertiseTotalStatReq struct {
|
||||
common.Page
|
||||
Start *time.Time `json:"start"` // 开始时间
|
||||
End *time.Time `json:"end"` // 结束时间
|
||||
AppId *[]int64 `json:"appId"` // 应用ID
|
||||
AdsId *int64 `json:"adsId"` // 广告ID
|
||||
AdsName *string `json:"adsName"` // 广告名称
|
||||
}
|
||||
|
||||
type AdvertiseTotalStatInfo struct {
|
||||
AdsId int64 `json:"adsId" bson:"adsId"` //广告ID
|
||||
AdsName string `json:"adsName" bson:"adsName"` //广告名称
|
||||
AppId int32 `json:"appId" bson:"appId"` //应用ID
|
||||
AppName string `json:"appName" bson:"appName"` //应用名称
|
||||
LocId int64 `json:"locId" bson:"locId"` //位置ID
|
||||
LocName string `json:"locName" bson:"locName"` //位置名称
|
||||
Total int64 `json:"total" bson:"total"` //当日点击
|
||||
}
|
||||
|
||||
type GetAdvertiseTotalStatResp struct {
|
||||
Total int64 `json:"total"`
|
||||
List []*AdvertiseTotalStatInfo `json:"list"`
|
||||
Summary AdvertiseStatSummary `json:"summary"`
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
package advertiseSer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sort"
|
||||
"stat/common/enum/consts"
|
||||
"stat/common/utils"
|
||||
"stat/models/advertiseLocMod"
|
||||
"stat/models/advertiseMod"
|
||||
"stat/models/appInfoMod"
|
||||
"stat/statg"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
)
|
||||
|
||||
func CheckChange(ctx context.Context, oldDoc, newDoc *advertiseMod.Advertise, account string) {
|
||||
msg := ""
|
||||
changed := false
|
||||
apps, _ := appInfoMod.GetAllAppIdNameMap(ctx)
|
||||
appId := int32(0)
|
||||
// 检测更新
|
||||
if oldDoc != nil && newDoc != nil {
|
||||
warnChar := "☢️"
|
||||
appId = oldDoc.AppId
|
||||
msg += fmt.Sprintf("检测到广告内容变更:\n广告ID:【%d】\n名称:【%s】\n", oldDoc.Id, oldDoc.Title)
|
||||
locs, _ := advertiseLocMod.GetAllAdvertiseLocationMap(ctx, bson.M{})
|
||||
locName := ""
|
||||
if nm := locs[oldDoc.AppId]; nm != nil {
|
||||
if loc := nm[oldDoc.LocId]; loc != nil {
|
||||
locName = loc.Name
|
||||
}
|
||||
}
|
||||
msg += fmt.Sprintf("位置ID:【%d】\n位置名称:【%s】\n", oldDoc.LocId, locName)
|
||||
if oldDoc.AppId != newDoc.AppId {
|
||||
changed = true
|
||||
warnChar = "🔯"
|
||||
msg += fmt.Sprintf("应用变更:\n┏旧值【%s】(%d)\n┗新值【%s】(%d)\n", apps[oldDoc.AppId], oldDoc.AppId, apps[newDoc.AppId], newDoc.AppId)
|
||||
}
|
||||
if oldDoc.IsActive != newDoc.IsActive {
|
||||
changed = true
|
||||
msg += fmt.Sprintf("激活变更:\n┏旧值【%v】【%v】\n┗新值【%v】【%v】\n", oldDoc.IsActive, consts.StatusDesc[oldDoc.IsActive],
|
||||
newDoc.IsActive, consts.StatusDesc[newDoc.IsActive])
|
||||
}
|
||||
if oldDoc.Title != newDoc.Title {
|
||||
changed = true
|
||||
msg += fmt.Sprintf("标题变更:\n┏旧值【%s】\n┗新值【%s】\n", oldDoc.Title, newDoc.Title)
|
||||
}
|
||||
if oldDoc.Sort != newDoc.Sort {
|
||||
changed = true
|
||||
msg += fmt.Sprintf("排序变更:\n┏旧值【%d】\n┗新值【%d】\n", oldDoc.Sort, newDoc.Sort)
|
||||
}
|
||||
if oldDoc.StartTime != newDoc.StartTime {
|
||||
changed = true
|
||||
msg += fmt.Sprintf("开始时间变更:\n┏旧值【%s】\n┗新值【%s】\n", oldDoc.StartTime.Format("2006-01-02T15:04:05"), newDoc.StartTime.Format("2006-01-02T15:04:05"))
|
||||
}
|
||||
if oldDoc.EndTime != newDoc.EndTime {
|
||||
changed = true
|
||||
msg += fmt.Sprintf("结束时间变更:\n┏旧值【%s】\n┗新值【%s】\n", oldDoc.EndTime.Format("2006-01-02T15:04:05"), newDoc.EndTime.Format("2006-01-02T15:04:05"))
|
||||
}
|
||||
if oldDoc.LocId != newDoc.LocId {
|
||||
changed = true
|
||||
oName := ""
|
||||
if om := locs[oldDoc.AppId]; om != nil {
|
||||
if loc := om[oldDoc.LocId]; loc != nil {
|
||||
oName = loc.Name
|
||||
}
|
||||
}
|
||||
nName := ""
|
||||
if nm := locs[newDoc.AppId]; nm != nil {
|
||||
if loc := nm[newDoc.LocId]; loc != nil {
|
||||
nName = loc.Name
|
||||
}
|
||||
}
|
||||
msg += fmt.Sprintf("位置变更:\n┏旧值【%s】(%d)\n┗新值【%s】(%d)\n", oName, oldDoc.LocId, nName, newDoc.LocId)
|
||||
}
|
||||
oLinks := utils.StrSliceConstruct(len(oldDoc.Links), func(index int) (string, bool) {
|
||||
link := oldDoc.Links[index]
|
||||
return link.Link, true
|
||||
})
|
||||
nLinks := utils.StrSliceConstruct(len(newDoc.Links), func(index int) (string, bool) {
|
||||
link := newDoc.Links[index]
|
||||
return link.Link, true
|
||||
})
|
||||
sort.Sort(sort.StringSlice(oLinks))
|
||||
sort.Sort(sort.StringSlice(nLinks))
|
||||
if strings.Join(oLinks, "") != strings.Join(nLinks, "") {
|
||||
warnChar = "🛑"
|
||||
changed = true
|
||||
msg += fmt.Sprintf("链接变更:\n")
|
||||
for index, link := range oLinks {
|
||||
msg += fmt.Sprintf("┣%d.旧值: %s\n", index+1, link)
|
||||
}
|
||||
for index, link := range nLinks {
|
||||
msg += fmt.Sprintf("┣%d.新值: %s\n", index+1, link)
|
||||
}
|
||||
} else {
|
||||
msg += fmt.Sprintf("链接不变:【%d个】\n", len(nLinks))
|
||||
for index, link := range nLinks {
|
||||
msg += fmt.Sprintf("┣%d.链接: %s\n", index+1, link)
|
||||
}
|
||||
}
|
||||
msg = warnChar + msg
|
||||
} else if oldDoc == nil && newDoc != nil {
|
||||
changed = true
|
||||
appId = newDoc.AppId
|
||||
msg += fmt.Sprintf("🟢检测到新增广告:\n广告ID:【%d】\n广告标题:【%s】\n", newDoc.Id, newDoc.Title)
|
||||
locs, _ := advertiseLocMod.GetAllAdvertiseLocationMap(ctx, bson.M{})
|
||||
locName := ""
|
||||
if nm := locs[newDoc.AppId]; nm != nil {
|
||||
if loc := nm[newDoc.LocId]; loc != nil {
|
||||
locName = loc.Name
|
||||
}
|
||||
}
|
||||
msg += fmt.Sprintf("位置ID:【%d】\n位置名称:【%s】\n", newDoc.LocId, locName)
|
||||
nLinks := utils.StrSliceConstruct(len(newDoc.Links), func(index int) (string, bool) {
|
||||
link := newDoc.Links[index]
|
||||
return link.Link, true
|
||||
})
|
||||
msg += fmt.Sprintf("链接:【%d个】\n", len(nLinks))
|
||||
for index, link := range nLinks {
|
||||
msg += fmt.Sprintf("┣%d.链接: %s\n", index+1, link)
|
||||
}
|
||||
} else if oldDoc != nil && newDoc == nil {
|
||||
changed = true
|
||||
appId = oldDoc.AppId
|
||||
msg += fmt.Sprintf("⛔️检测到删除广告:\n广告ID:【%d】\n广告标题:【%s】\n", oldDoc.Id, oldDoc.Title)
|
||||
locs, _ := advertiseLocMod.GetAllAdvertiseLocationMap(ctx, bson.M{})
|
||||
locName := ""
|
||||
if nm := locs[oldDoc.AppId]; nm != nil {
|
||||
if loc := nm[oldDoc.LocId]; loc != nil {
|
||||
locName = loc.Name
|
||||
}
|
||||
}
|
||||
msg += fmt.Sprintf("位置ID:【%d】\n位置名称:【%s】\n", oldDoc.LocId, locName)
|
||||
nLinks := utils.StrSliceConstruct(len(oldDoc.Links), func(index int) (string, bool) {
|
||||
link := oldDoc.Links[index]
|
||||
return link.Link, true
|
||||
})
|
||||
msg += fmt.Sprintf("链接:【%d个】\n", len(nLinks))
|
||||
for index, link := range nLinks {
|
||||
msg += fmt.Sprintf("┣%d.链接: %s\n", index+1, link)
|
||||
}
|
||||
}
|
||||
|
||||
if changed {
|
||||
msg += fmt.Sprintf("广告所属应用:【%s】(%d)\n", apps[appId], appId)
|
||||
msg += fmt.Sprintf("操作人员账号:【%s】\n", account)
|
||||
msg += fmt.Sprintf("操作发生时间:【%s】\n", time.Now().Format("2006-01-02T15:04:05"))
|
||||
msg += fmt.Sprintf("请确认是否异常: %s \n", statg.Tgbotsend)
|
||||
statg.Bot.SendAdvertiseMessage(msg)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user