Initial commit

This commit is contained in:
2026-05-20 16:13:58 +08:00
commit ceffbe382e
500 changed files with 157469 additions and 0 deletions
+311
View File
@@ -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
}
+151
View File
@@ -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
}
+265
View File
@@ -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
}
+74
View File
@@ -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"`
}
+155
View File
@@ -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)
}
}