commit ceffbe382e8a1ba2d3c2789cdc9e95ae2829f9a7 Author: root Date: Wed May 20 16:13:58 2026 +0800 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0904c85 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +logs +.DS_Store +.idea +.vscode +/conf/server.json +/conf/server_bck.json +stat-center +stat-center.tar.gz +/temp +/run +/stat diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5db40ba --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +GOPATH:=$(shell go env GOPATH) + +VERSION_PATH:=stat/common/version +GIT_BRANCH:=$(shell git symbolic-ref --short -q HEAD) +GIT_VERSION:=$(shell git log --pretty=oneline -p -1 | head -n 1 | awk '{print $$1}') +BUILD_DATE:=$(shell date '+%Y-%m-%d %H:%M:%S %z') +BUILD_IP:=$(shell ifconfig | grep inet | grep -v grep | grep -v "inet6" | grep -v "127.0.0.1" | awk '{print $$2, $$3}') +APP_BUILD_FLAG:=-ldflags "-X '$(VERSION_PATH).GIT_BRANCH=$(GIT_BRANCH)' -X '$(VERSION_PATH).GIT_VERSION=$(GIT_VERSION)' -X '$(VERSION_PATH).BUILD_DATE=$(BUILD_DATE)' -X '$(VERSION_PATH).BUILD_IP=$(BUILD_IP)'" + +.PHONY: test deploy +deploy: + go clean + rm -f stat-center + env GOOS=linux GOARCH=amd64 go build $(APP_BUILD_FLAG) -o stat-center -v + tar -zcf stat-center.tar.gz stat-center docs + rm -f stat-center + +test: + go clean + env GOOS=linux GOARCH=amd64 go build $(APP_BUILD_FLAG) -o stat-center -v + tar -zcf stat-center.tar.gz stat-center docs + rm -f stat-center diff --git a/README.md b/README.md new file mode 100644 index 0000000..9432764 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# 渠道统计 后台服务 + +## 安装swag +go install github.com/swaggo/swag/cmd/swag@latest + +## Swagger文档生成 +swag init --parseDependency + +## 依赖 +1. kafka + 主要用作消息队列 +2. redis + 实时数据统计 + +## 发布 +使用一下参数,本地生成mv-app-server.zip压缩包。包换app、配置文件和加密key。 +``` sh +$ sudo make deploy +``` + +## 路径 +知乎: /server/zhihu/stat-center/conf + +逼哩: /server/bili/stat-center/conf + +麻豆: /server/stat-center/conf \ No newline at end of file diff --git a/api/activityApi/activity.go b/api/activityApi/activity.go new file mode 100644 index 0000000..26fc862 --- /dev/null +++ b/api/activityApi/activity.go @@ -0,0 +1,166 @@ +package activityApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/activitySer" + + "github.com/gin-gonic/gin" +) + +// @Tags 活动管理 +// @Summary 活动信息列表 +// @Description 活动信息列表 +// @Accept json +// @Produce json +// @Param param body proto.ActivityListReq true "参数" +// @Success 200 {object} proto.ActivityListResp "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/list [GET] +func ActivityList(ctx *gin.Context) { + + var param proto.ActivityListReq + + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + code, data, err := activitySer.GetActivityList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 活动管理 +// @Summary 添加活动 +// @Description 添加活动 +// @Accept json +// @Produce json +// @Param param body proto.AddActivityReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/add [POST] +func AddActivity(ctx *gin.Context) { + param := proto.AddActivityReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, err := activitySer.AddOneAct(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 更新一个活动 +// @Description 更新一个活动 +// @Accept json +// @Produce json +// @Param param body proto.UpdateActivityReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/update [POST] +func ActUpdate(ctx *gin.Context) { + param := proto.UpdateActivityReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, err := activitySer.UpdateOneAct(ctx, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 删除一个活动 +// @Description 删除一个活动 +// @Accept json +// @Produce json +// @Param param body proto.DelActivityReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/del [POST] +func DelOneAct(ctx *gin.Context) { + param := proto.DelActivityReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, err := activitySer.DeleteOneAct(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 活动访问量 +// @Description 活动访问量 +// @Accept json +// @Produce json +// @Param param body proto.ActivityVisitCountReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/visit [POST] +func ActivityVisitCount(ctx *gin.Context) { + + var param proto.ActivityVisitCountReq + + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + code, err := activitySer.UpdateActivityVisitCount(ctx, ctx.ClientIP(), param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 活动访问量 +// @Description 活动访问量 +// @Accept json +// @Produce json +// @Param param body proto.ActivityVisitCountReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/visit/list [GET] +func ActivityVisitCountList(ctx *gin.Context) { + var param proto.ActivityVisitCountListReq + + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + code, resp, err := activitySer.GetActivityVisitList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, resp) +} diff --git a/api/activityApi/activityh5.go b/api/activityApi/activityh5.go new file mode 100644 index 0000000..f811ce1 --- /dev/null +++ b/api/activityApi/activityh5.go @@ -0,0 +1,110 @@ +package activityApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/activitySer" + + "github.com/gin-gonic/gin" +) + +// @Tags 活动管理 +// @Summary h5页面活动信息 +// @Description h5页面活动信息 +// @Accept json +// @Produce json +// @Param param body proto.ActivityInfoReq true "参数" +// @Success 200 {object} proto.ActivityInfoResp "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/activity/h5/info [POST] +func ActivityInfo(ctx *gin.Context) { + + var param proto.ActivityInfoReq + + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + code, data, err := activitySer.GetActivityInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 活动管理 +// @Summary h5页面活动奖品信息 +// @Description h5页面活动奖品信息 +// @Accept json +// @Produce json +// @Param param body proto.ActivityGiftInfoReq true "参数" +// @Success 200 {object} proto.ActivityGiftInfoResp "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/activity/h5/giftinfo [POST] +func ActivityGiftInfo(ctx *gin.Context) { + param := proto.ActivityGiftInfoReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := activitySer.GetActivityGiftInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 活动管理 +// @Summary 抽奖 +// @Description 抽奖 +// @Accept json +// @Produce json +// @Param param body proto.DrawReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/activity/h5/draw [POST] +func LuckyDraw(ctx *gin.Context) { + param := proto.DrawReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := activitySer.Draw(ctx, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 活动管理 +// @Summary 删除一个活动 +// @Description 删除一个活动 +// @Accept json +// @Produce json +// @Param param body proto.DelActivityReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/del [POST] +// func DelOneAct(ctx *gin.Context) { +// param := proto.DelActivityReq{} +// if err := ctx.ShouldBind(¶m); err != nil { +// stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) +// return +// } +// code, err := activitySer.DeleteOneAct(ctx, param) +// if err != nil { +// stdLog.ServerJSON(ctx, code, err) +// return +// } + +// stdLog.ServerJSON(ctx, code, "") +// } diff --git a/api/activityApi/loterrycode.go b/api/activityApi/loterrycode.go new file mode 100644 index 0000000..32236bf --- /dev/null +++ b/api/activityApi/loterrycode.go @@ -0,0 +1,138 @@ +package activityApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/service/activitySer" + "stat/service/opLogSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 活动管理 +// @Summary 生成活动抽奖码 +// @Description 生成活动抽奖码 +// @Accept json +// @Produce json +// @Param param body proto.GenLotteryCodeReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/lotterycode/gen [POST] +func GenLotCode(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.GenLotteryCodeReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + code, err := activitySer.GenLotteryCodes(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 修改活动抽奖码 +// @Description 修改活动抽奖码 +// @Accept json +// @Produce json +// @Param param body proto.UpdateLotteryCodeReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/lotterycode/update [POST] +func UpdateLotCode(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.UpdateLotteryCodeReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, err := activitySer.UpdateLotteryCode(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 删除活动抽奖码 +// @Description 删除活动抽奖码 +// @Accept json +// @Produce json +// @Param param body proto.DelLotteryCodeReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/lotterycode/del [POST] +func DelLotCode(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.DelLotteryCodeReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, err := activitySer.DeleteOneLotteryCode(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 活动抽奖码列表 +// @Description 活动抽奖码列表 +// @Accept json +// @Produce json +// @Param param body proto.LotteryCodeListReq true "参数列表" +// @Success 200 {object} proto.LotteryCodeListResp "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/lotterycode/list [POST] +func LotteryCodeList(ctx *gin.Context) { + param := proto.LotteryCodeListReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := activitySer.GetLotteryCodeList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/activityApi/lotterygetgift.go b/api/activityApi/lotterygetgift.go new file mode 100644 index 0000000..667e711 --- /dev/null +++ b/api/activityApi/lotterygetgift.go @@ -0,0 +1,113 @@ +package activityApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/activitySer" + + "github.com/gin-gonic/gin" +) + +// @Tags 活动管理 +// @Summary 奖品兑换详情 +// @Description 奖品兑换详情 +// @Accept json +// @Produce json +// @Param param body proto.GetGiftInfoReq true "参数" +// @Success 200 {object} proto.GetGiftInfoResp "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/getgift/list [GET] +func ReceiveGiftInfoList(ctx *gin.Context) { + + var param proto.GetGiftInfoReq + + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + code, data, err := activitySer.GetReceiveGiftInfoList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 活动管理 +// @Summary 生成奖品兑换码 +// @Description 生成奖品兑换码 +// @Accept json +// @Produce json +// @Param param body proto.GenGiftCodeRes true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/getgift/gen [POST] +func GenGiftCode(ctx *gin.Context) { + param := proto.GenGiftCodeRes{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, err := activitySer.GenManyGiftCode(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 更新一个奖品兑换信息 +// @Description 更新一个奖品兑换信息 +// @Accept json +// @Produce json +// @Param param body proto.UpdateGiftReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/getgift/update [POST] +func UpdateRecvGiftInfo(ctx *gin.Context) { + param := proto.UpdateGetGiftReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, err := activitySer.UpdateOneRecvGiftInfo(ctx, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 删除一个奖品兑换信息 +// @Description 删除一个奖品兑换信息 +// @Accept json +// @Produce json +// @Param param body proto.DelGiftReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/getgift/del [POST] +func DelReceiveGiftInfo(ctx *gin.Context) { + param := proto.DelGetGiftReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, err := activitySer.DelOneRecvGiftInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, "") +} diff --git a/api/activityApi/lotterygift.go b/api/activityApi/lotterygift.go new file mode 100644 index 0000000..142756d --- /dev/null +++ b/api/activityApi/lotterygift.go @@ -0,0 +1,113 @@ +package activityApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/activitySer" + + "github.com/gin-gonic/gin" +) + +// @Tags 活动管理 +// @Summary 活动奖励列表 +// @Description 活动奖励列表 +// @Accept json +// @Produce json +// @Param param body proto.GiftListReq true "参数" +// @Success 200 {object} proto.GiftListResp "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/gift/list [GET] +func LotteryGiftList(ctx *gin.Context) { + + var param proto.GiftListReq + + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + code, data, err := activitySer.GetLotteryGiftList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 活动管理 +// @Summary 添加活动奖励 +// @Description 添加活动奖励 +// @Accept json +// @Produce json +// @Param param body proto.AddGiftReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/gift/add [POST] +func AddLotGift(ctx *gin.Context) { + param := proto.AddGiftReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, err := activitySer.AddOneGift(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 更新一个活动奖励 +// @Description 更新一个活动奖励 +// @Accept json +// @Produce json +// @Param param body proto.UpdateGiftReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/gift/update [POST] +func UpdateLotGift(ctx *gin.Context) { + param := proto.UpdateGiftReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, err := activitySer.UpdateOneGift(ctx, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, "") +} + +// @Tags 活动管理 +// @Summary 删除一个活动奖励 +// @Description 删除一个活动奖励 +// @Accept json +// @Produce json +// @Param param body proto.DelGiftReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/activity/gift/del [POST] +func DelLotGift(ctx *gin.Context) { + param := proto.DelGiftReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, err := activitySer.DeleteOneGift(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, "") +} diff --git a/api/adminApi/admin.go b/api/adminApi/admin.go new file mode 100644 index 0000000..bdd4645 --- /dev/null +++ b/api/adminApi/admin.go @@ -0,0 +1,440 @@ +package adminApi + +import ( + "encoding/base32" + "fmt" + + "github.com/gin-gonic/gin" + "github.com/skip2/go-qrcode" + "stat/api/proto" + "stat/common" + "stat/common/googauth" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/adminMod" + "stat/models/authorityMod" + "stat/service/adminSer" + "stat/service/opLogSer" +) + +// @Tags 系统管理 +// @Summary 管理员登录 +// @Description 传入用户信息登录 +// @Accept json +// @Produce json +// @Param param body proto.AdminLoginReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/admin/login [POST] +func AdminLogin(ctx *gin.Context) { + var param struct { + proto.AdminLoginReq + } + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + adminInfo, err := adminMod.FindOneByAccount(ctx, *param.Account) + if err != nil || adminInfo.Account == "" { + stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, err) + return + } + if adminInfo.Secret == "" { + secret := base32.StdEncoding.EncodeToString([]byte(fmt.Sprintf("admin%s", common.RandStr(10)))) + _ = adminMod.TwoStepSecretSet(ctx, adminInfo.Account, secret) + } + + // 通过验证,再次验证密码是否正确 + if adminInfo.Password != *param.Password || adminInfo.BlocRole == 1 { + stdLog.ServerJSON(ctx, stdLog.AdminPasswordError, err) + return + } + + qrCodePNG := make([]byte, 0) + if !adminInfo.HasBind { + url := googauth.New(adminInfo.Secret, adminInfo.Account+"@sc") + qrCodePNG, err = qrcode.Encode(url, qrcode.Medium, 256) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, "Admin login get QRCodePNG error: "+err.Error()) + return + } + } + + stdLog.ServerJSON(ctx, stdLog.Success, gin.H{ + "qrCodePNG": qrCodePNG, + }) +} + +// @Tags 系统管理 +// @Summary 管理员登录 +// @Description 传入用户信息登录 +// @Accept json +// @Produce json +// @Param param body proto.AdminLoginReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/adminbloc/login [POST] +func AdminLoginBloc(ctx *gin.Context) { + param := proto.AdminLoginReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + adminInfo, err := adminMod.FindOneByAccount(ctx, *param.Account) + if err != nil || adminInfo.Account == "" { + stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, err) + return + } + + if adminInfo.Secret == "" { + secret := base32.StdEncoding.EncodeToString([]byte(fmt.Sprintf("admin%s", common.RandStr(10)))) + _ = adminMod.TwoStepSecretSet(ctx, adminInfo.Account, secret) + } + + // 通过验证,再次验证密码是否正确 + if adminInfo.Password != *param.Password { + stdLog.ServerJSON(ctx, stdLog.AdminPasswordError, err) + return + } + + qrCodePNG := make([]byte, 0) + if !adminInfo.HasBind { + url := googauth.New(adminInfo.Secret, adminInfo.Account+"@sc") + qrCodePNG, err = qrcode.Encode(url, qrcode.Medium, 256) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, "Admin login get QRCodePNG error: "+err.Error()) + return + } + } + + stdLog.ServerJSON(ctx, stdLog.Success, gin.H{ + "qrCodePNG": qrCodePNG, + }) +} + +// @Tags 系统管理 +// @Summary 管理员登录验证 +// @Description 谷歌验证 +// @Accept json +// @Produce json +// @Param param body proto.AdminVerifyReq true "参数" +// @Success 200 {object} proto.AdminLoginRes "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/admin/verify [POST] +func AdminVerify(ctx *gin.Context) { + param := proto.AdminVerifyReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + adminInfo, err := adminMod.FindOneByAccount(ctx, *param.Account) + if err != nil || adminInfo.Account == "" { + stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, err) + return + } + + //测试模式不使用两步验证 + if gin.Mode() == gin.ReleaseMode { + ok, err := googauth.Verify(adminInfo.Secret, *param.VerifyCode) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.GoogleAuthFailed, "admin Verification 2-step error: "+err.Error()) + return + } + if !ok { + stdLog.ServerJSON(ctx, stdLog.GoogleAuthFailed, "admin Verification 2-step verification failed") + return + } + } + + code, adminInfo, err := adminSer.AdminLogin(ctx, param) + if err != nil || code != stdLog.Success { + stdLog.ServerJSON(ctx, code, err) + return + } + + roleInfo, err := authorityMod.GetAuthorityById(ctx, adminInfo.RoleId) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.AdminGetAuthorityFailed, err) + return + } + + resp := proto.AdminLoginRes{ + Account: adminInfo.Account, + Token: adminInfo.Token, + Name: adminInfo.Name, + RoleInfo: proto.RoleInfo{ + RoleId: roleInfo.Id, + Role: roleInfo.Role, + AuthJson: roleInfo.AuthJson, + }, + } + + stdLog.ServerJSON(ctx, code, resp) +} + +// @Tags 系统管理 +// @Summary 管理员列表 +// @Description 管理员列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AdminListReq true "参数列表" +// @Success 200 {object} proto.AdminListRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/admin/list [POST] +func AdminList(ctx *gin.Context) { + param := proto.AdminListReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := adminSer.AdminList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 系统管理 +// @Summary 增加管理员 +// @Description 增加管理员 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AddAdminReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/admin/add [POST] +func AddAdmin(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.AddAdminReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := adminSer.AddAdmin(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 系统管理 +// @Summary 修改管理员 +// @Description 修改管理员 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.UpdateAdminReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/admin/update [POST] +func UpdateAdmin(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.UpdateAdminReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := adminSer.UpdateAdmin(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 系统管理 +// @Summary 删除管理员 +// @Description 删除管理员 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.DelAdminReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/admin/del [DELETE] +func DelAdmin(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.DelAdminReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := adminSer.DelAdmin(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 系统管理 +// @Summary 管理员列表 +// @Description 管理员列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AdminListReq true "参数列表" +// @Success 200 {object} proto.AdminListRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/adminbloc/list [POST] +func AdminListBloc(ctx *gin.Context) { + param := proto.AdminListReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + blocRole := 1 + param.BlocRole = &blocRole + code, data, err := adminSer.AdminList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Security ApiKeyAuth +// @Param param body proto.AddAdminReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/adminbloc/add [POST] +func AddAdminBloc(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.AddAdminReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + blocRole := 1 + param.BlocRole = &blocRole + + code, data, err := adminSer.AddAdmin(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 系统管理 +// @Summary 修改管理员 +// @Description 修改管理员 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.UpdateAdminReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/adminbloc/update [POST] +func UpdateAdminBloc(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.UpdateAdminReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + blocRole := 1 + param.BlocRole = &blocRole + + code, data, err := adminSer.UpdateAdmin(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 系统管理 +// @Summary 删除管理员 +// @Description 删除管理员 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.DelAdminReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/adminbloc/del [DELETE] +func DelAdminBloc(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.DelAdminReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := adminSer.DelAdmin(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/advertiseApi/advertise.go b/api/advertiseApi/advertise.go new file mode 100644 index 0000000..3c88053 --- /dev/null +++ b/api/advertiseApi/advertise.go @@ -0,0 +1,190 @@ +package advertiseApi + +import ( + "net/http" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/service/advertiseSer" + "stat/service/opLogSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 广告管理 +// @Summary 广告列表 +// @Description 广告列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListAdsReq true "参数" +// @Success 200 {object} proto.ListAdsRes "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/ads/list [POST] +func ListAds(ctx *gin.Context) { + param := proto.ListAdsReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := advertiseSer.ListAds(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 广告管理 +// @Summary 新增广告信息 +// @Description 新增广告信息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AddAdsReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/ads/add [POST] +func AddAds(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + param := proto.AddAdsReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := advertiseSer.AddAds(ctx, param, account) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 广告管理 +// @Summary 修改广告信息 +// @Description 修改广告信息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.UpdateAdsReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/ads/update [POST] +func UpdateAds(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.UpdateAdsReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := advertiseSer.UpdateAds(ctx, param, account) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 广告管理 +// @Summary 删除广告信息 +// @Description 删除广告信息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.DelAdsReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/ads/del [POST] +func DelAds(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + param := proto.DelAdsReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := advertiseSer.DelAds(ctx, param, account) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 广告管理 +// @Summary 外部获取广告信息 +// @Description 外部获取广告信息 +// @Accept json +// @Produce json +// @Param param body proto.AdvertiseReq true "参数" +// @Success 200 {object} proto.AdvertiseRes "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/ads/get [POST] +func GetAds(ctx *gin.Context) { + param := proto.AdvertiseReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := advertiseSer.GetAdvertise(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + ctx.JSON(http.StatusOK, data) +} + +// @Tags 广告管理 +// @Summary 广告点击 +// @Description 广告点击 +// @Accept json +// @Produce json +// @Param param body proto.AdsClickReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/ads/click [POST] +func ClickAds(ctx *gin.Context) { + param := proto.AdsClickReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := advertiseSer.IncAdsClickCount(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/advertiseApi/advertiseLoc.go b/api/advertiseApi/advertiseLoc.go new file mode 100644 index 0000000..3a76a69 --- /dev/null +++ b/api/advertiseApi/advertiseLoc.go @@ -0,0 +1,142 @@ +package advertiseApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/service/advertiseSer" + "stat/service/opLogSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 广告管理 +// @Summary 广告位置列表 +// @Description 广告位置列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListAdsLocReq true "参数" +// @Success 200 {object} proto.ListAdsLocRes "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/adsLoc/list [POST] +func ListAdsLoc(ctx *gin.Context) { + param := proto.ListAdsLocReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := advertiseSer.ListAdsLoc(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 广告管理 +// @Summary 新增广告位置信息 +// @Description 谷歌验证 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AddAdsLocReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/adsLoc/add [POST] +func AddAdsLoc(ctx *gin.Context) { + param := proto.AddAdsLocReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := advertiseSer.AddAdsLoc(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 广告管理 +// @Summary 修改广告位置信息 +// @Description 修改广告位置信息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.UpdateAdsLocReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/adsLoc/update [POST] +func UpdateAdsLoc(ctx *gin.Context) { + param := proto.UpdateAdsLocReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + code, data, err := advertiseSer.UpdateAdsLoc(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 广告管理 +// @Summary 删除广告位置信息 +// @Description 删除广告位置信息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.DelAdsLocReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/adsLoc/del [POST] +func DelAdsLoc(ctx *gin.Context) { + param := proto.DelAdsLocReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := advertiseSer.DelAdsLoc(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/advertiseApi/advertisestat.go b/api/advertiseApi/advertisestat.go new file mode 100644 index 0000000..e0cc102 --- /dev/null +++ b/api/advertiseApi/advertisestat.go @@ -0,0 +1,56 @@ +package advertiseApi + +import ( + "stat/common/stdLog" + "stat/service/advertiseSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 广告管理 +// @Summary 广告统计 +// @Description 广告统计 +// @Accept json +// @Produce json +// @Param param body advertiseSer.GetAdvertiseStatReq true "参数列表" +// @Success 200 {object} advertiseSer.GetAdvertiseStatResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/ads/stat [POST] +func GetAdvertiseStat(ctx *gin.Context) { + param := &advertiseSer.GetAdvertiseStatReq{} + err := ctx.ShouldBind(¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + result, err := advertiseSer.GetAdvertiseStatList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.QueryError, err.Error()) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, result) +} + +// @Tags 广告管理 +// @Summary 广告统计不分时统计 +// @Description 广告统计不分时统计 +// @Accept json +// @Produce json +// @Param param body advertiseSer.GetAdvertiseTotalStatReq true "参数列表" +// @Success 200 {object} advertiseSer.GetAdvertiseTotalStatResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/ads/stattotal [POST] +func GetAdvertiseTotalStat(ctx *gin.Context) { + param := &advertiseSer.GetAdvertiseTotalStatReq{} + err := ctx.ShouldBind(¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + result, err := advertiseSer.GetAdvertiseTotalStatList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.QueryError, err.Error()) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, result) +} diff --git a/api/agentApi/agent.go b/api/agentApi/agent.go new file mode 100644 index 0000000..5bc1e1e --- /dev/null +++ b/api/agentApi/agent.go @@ -0,0 +1,424 @@ +package agentApi + +import ( + "bytes" + "fmt" + "image/jpeg" + "stat/api/proto" + "stat/common" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/channelmod" + "stat/service/agentSer" + "stat/statg" + + "go.mongodb.org/mongo-driver/bson" + + "github.com/dchest/captcha" + "github.com/gin-gonic/gin" +) + +// @Tags 渠道后台 +// @Summary 获取图片验证码 +// @Description 获取图片验证码 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Success 200 {object} proto.AgentImgVerifyCode "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/agent/imgVerify [POST] +func AgentImgVerifyCode(ctx *gin.Context) { + codeB := captcha.RandomDigits(4) + id := common.RandStr(8) + + statg.VerifyIMGStore.Set(id, codeB) + img := captcha.NewImage(id, codeB, 180, 65) + var buf bytes.Buffer + _ = jpeg.Encode(&buf, img, nil) + + resp := proto.AgentImgVerifyCode{ + VerifyImg: buf.Bytes(), + ImgId: id, + } + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道后台 +// @Summary 代理商登陆 +// @Description 代理商登陆 +// @Accept json +// @Produce json +// @Param param body proto.AgentLoginReq true "参数" +// @Success 200 {object} proto.AgentLoginRes "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/agent/login [POST] +func AgentLogin(ctx *gin.Context) { + param := proto.AgentLoginReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + ip := ctx.ClientIP() + code, agentInfo := agentSer.AgentLogin(ctx, ip, param) + if code != stdLog.Success { + stdLog.ServerJSON(ctx, code, "") + return + } + + detail := &proto.ChannelAgentInfo{ + Channel: agentInfo.Channel, + AppIds: agentInfo.AppIds, + UserName: agentInfo.UserName, + ParentAgent: agentInfo.ParentAgent, + ChildCount: agentInfo.ChildCount, + Status: agentInfo.Status, + Mobile: agentInfo.Mobile, + Type: agentInfo.Type, + Remark: agentInfo.Remark, + Lock: agentInfo.Lock, + Wallet: agentInfo.Wallet, + CreatedAt: agentInfo.CreatedAt, + UpdatedAt: agentInfo.UpdatedAt, + ChildShowDivideRate: agentInfo.ChildShowDivideRate, + } + + ruleFilter := bson.M{ + channelmod.FN.ChannelDeductionRule.Channel: agentInfo.Channel, + } + ruleInfoList, _ := channelmod.FindManyChannelDeductionRule(ctx, ruleFilter) + for _, ruleinfo := range ruleInfoList { + detail.Settlement = ruleinfo.Settlement + detail.CPAPrice = ruleinfo.CPAPrice + detail.CPSRate = ruleinfo.CPSRate + detail.DivideRate = 100 // + } + + resp := proto.AgentLoginRes{ + Token: agentInfo.Token, + Channel: agentInfo.Channel, + Detail: detail, + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道后台 +// @Summary 获取渠道列表 +// @Description 获取渠道列表 +// @Accept json +// @Produce json +// @Param param body proto.AgentChannelInfoSearch true "参数" +// @Success 200 {object} proto.AgentChannelInfoSearchResp "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/agent/channel/list [POST] +func AgentChannelList(ctx *gin.Context) { + channel, err := utils.GetAdmin(ctx) + if err != nil || channel == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + //fmt.Println("channel") + + param := proto.AgentChannelInfoSearch{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + resp, err := agentSer.AgentChannelListInfo(ctx, channel, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道后台 +// @Summary 更新渠道规则 +// @Description 更新渠道规则 +// @Accept json +// @Produce json +// @Param param body proto.AgentChannelRuleUpdate true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/agent/channel/rule/update [POST] +func AgentChannelRuleUpdate(ctx *gin.Context) { + channel, err := utils.GetAdmin(ctx) + if err != nil || channel == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + + param := proto.AgentChannelRuleUpdate{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + err = agentSer.AgentChannelRuleUpdate(ctx, channel, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道后台 +// @Summary 更新渠道信息 +// @Description 更新渠道信息 +// @Accept json +// @Produce json +// @Param param body proto.AgentChannelInfoUpdate true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/agent/channel/info/update [POST] +func AgentChannelInfoUpdate(ctx *gin.Context) { + channel, err := utils.GetAdmin(ctx) + if err != nil || channel == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + param := proto.AgentChannelInfoUpdate{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + err = agentSer.AgentChannelInfoUpdate(ctx, channel, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道后台 +// @Summary 修改渠道密码 +// @Description 修改渠道密码 +// @Accept json +// @Produce json +// @Param param body proto.AgentChannelPasswordUpdate true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/agent/channel/password/update [POST] +func AgentChannelPasswordUpdate(ctx *gin.Context) { + channel, err := utils.GetAdmin(ctx) + if err != nil || channel == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + fmt.Println("channel") + + param := proto.AgentChannelPasswordUpdate{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + err = agentSer.AgentChannelPasswordUpdate(ctx, channel, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道后台 +// @Summary 重置子渠道密码 +// @Description 重置子渠道密码 +// @Accept json +// @Produce json +// @Param param body proto.AgentChannelPasswordReset true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/agent/channel/password/reset [POST] +func AgentChannelPasswordReset(ctx *gin.Context) { + channel, err := utils.GetAdmin(ctx) + if err != nil || channel == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + fmt.Println("channel") + + param := proto.AgentChannelPasswordReset{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + err = agentSer.AgentChannelPasswordReset(ctx, channel, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道后台 +// @Summary 添加一个子渠道 +// @Description 添加一个子渠道 +// @Accept json +// @Produce json +// @Param param body proto.AgentChannelInfoAdd true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/agent/channel/add [POST] +func AddAgentChannel(ctx *gin.Context) { + channel, err := utils.GetAdmin(ctx) + if err != nil || channel == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + + param := proto.AgentChannelInfoAdd{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + err = agentSer.AddAgentChannelInfo(ctx, channel, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道后台 +// @Summary 获取渠道统计Ex +// @Description 获取渠道日常统计Ex +// @Accept json +// @Produce json +// @Param param body proto.AgentChannelStatSearch true "参数" +// @Success 200 {object} proto.AgentChannelStatResp "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/agent/channel/stat [POST] +func GetAgentChannelStat(ctx *gin.Context) { + channel, err := utils.GetAdmin(ctx) + if err != nil || channel == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + + param := proto.AgentChannelStatSearch{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + resp, err := agentSer.GetAgentChannelStat(ctx, channel, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道后台 +// @Summary 获取首页渠道数据汇总 +// @Description 获取首页渠道数据汇总 +// @Accept json +// @Produce json +// @Param param body proto.AgentSummaryStatHomeSearch true "参数" +// @Success 200 {object} proto.AgentSummaryStatHomeResp "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/agent/summary/home [POST] +func GetAgentSummaryStatHome(ctx *gin.Context) { + channel, err := utils.GetAdmin(ctx) + if err != nil || channel == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + + param := proto.AgentSummaryStatHomeSearch{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + resp, err := agentSer.GetAgentSummaryStatHome(ctx, channel, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道后台 +// @Summary 获取子渠道数据汇总 +// @Description 获取子渠道数据汇总 +// @Accept json +// @Produce json +// @Param param body proto.AgentSummaryStatChildSearch true "参数" +// @Success 200 {object} proto.AgentSummaryStatChildResp "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/agent/summary/child [POST] +func GetAgentSummaryStatChild(ctx *gin.Context) { + channel, err := utils.GetAdmin(ctx) + if err != nil || channel == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + + param := proto.AgentSummaryStatChildSearch{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + resp, err := agentSer.GetAgentSummaryStatChild(ctx, channel, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道后台 +// @Summary 获取落地页列表 +// @Description 获取落地页列表 +// @Accept json +// @Produce json +// @Param param body proto.ChannelAppInfoReq true "参数" +// @Success 200 {object} proto.ChannelAppInfoResp "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/agent/channel/landpage [POST] +func ChannelAppInfo(ctx *gin.Context) { + channel, err := utils.GetAdmin(ctx) + if err != nil || channel == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + + param := proto.ChannelAppInfoReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + resp, err := agentSer.AgentChannelAppInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} diff --git a/api/announApi/announ.go b/api/announApi/announ.go new file mode 100644 index 0000000..1e56a97 --- /dev/null +++ b/api/announApi/announ.go @@ -0,0 +1,142 @@ +package announApi + +import ( + "github.com/gin-gonic/gin" + "stat/api/proto" + "stat/common/stdLog" + "stat/service/announInfoSer" +) + +// @Tags 公告管理 +// @Summary 公告列表 +// @Description 公告列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListAnnounReq true "参数" +// @Success 200 {object} proto.ListAnnounRes "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/announce/list [POST] +func ListAnnounce(ctx *gin.Context) { + param := proto.ListAnnounReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := announInfoSer.ListAnnoun(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 公告管理 +// @Summary 新增公告信息 +// @Description 新增公告信息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AddAnnounReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/announce/add [POST] +func AddAnnounce(ctx *gin.Context) { + param := proto.AddAnnounReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := announInfoSer.AddAnnounce(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 公告管理 +// @Summary 修改公告信息 +// @Description 修改公告信息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.UpdateAnnounReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/announce/update [POST] +func UpdateAnnounce(ctx *gin.Context) { + param := proto.UpdateAnnounReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := announInfoSer.UpdateAnnounce(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 公告管理 +// @Summary 删除公告信息 +// @Description 删除公告信息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.DelAnnounReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/announce/del [POST] +func DelAnnounce(ctx *gin.Context) { + param := proto.DelAnnounReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := announInfoSer.DelAnnounce(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 公告管理 +// @Summary 外部获取公告信息 +// @Description 外部获取公告信息 +// @Accept json +// @Produce json +// @Param param body proto.AnnouncementReq true "参数" +// @Success 200 {object} proto.AnnouncementRes "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/announce/get [POST] +func GetAnnounce(ctx *gin.Context) { + param := proto.AnnouncementReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := announInfoSer.GetAnnounce(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/appInfoApi/appInfo.go b/api/appInfoApi/appInfo.go new file mode 100644 index 0000000..f203254 --- /dev/null +++ b/api/appInfoApi/appInfo.go @@ -0,0 +1,142 @@ +package appInfoApi + +import ( + "github.com/gin-gonic/gin" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/service/appInfoSer" + "stat/service/opLogSer" +) + +// @Tags 应用管理 +// @Summary app列表 +// @Description app列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListAppInfoReq true "参数列表" +// @Success 200 {object} proto.ListAppInfoRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/appInfo/list [POST] +func ListAppInfo(ctx *gin.Context) { + param := proto.ListAppInfoReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := appInfoSer.GetAppInfoList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 应用管理 +// @Summary 添加app +// @Description 添加app +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AddAppInfoReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/appInfo/add [POST] +func AddAppInfo(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.AddAppInfoReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.AddAppInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 应用管理 +// @Summary 修改app +// @Description 修改app +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.UpdateAppInfoReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/appInfo/update [POST] +func UpdateAppInfo(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.UpdateAppInfoReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.UpdateAppInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 应用管理 +// @Summary 删除app +// @Description 删除app +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.DelAppInfoReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/appInfo/del [DELETE] +func DelAppInfo(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.DelAppInfoReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.DelAppInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/appInfoApi/landPage.go b/api/appInfoApi/landPage.go new file mode 100644 index 0000000..626496d --- /dev/null +++ b/api/appInfoApi/landPage.go @@ -0,0 +1,143 @@ +package appInfoApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/service/appInfoSer" + "stat/service/opLogSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 落地页 +// @Summary 落地页列表 +// @Description 落地页列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.FindLandingPageReq true "参数列表" +// @Success 200 {object} proto.LandingPageListRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landingPage/list [POST] +func ListLandingPageInfo(ctx *gin.Context) { + param := proto.FindLandingPageReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := appInfoSer.GetLandingPageList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 落地页 +// @Summary 添加落地页 +// @Description 添加落地页 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AddLandingPageReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landingPage/add [POST] +func AddLandingPageInfo(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.AddLandingPageReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.AddLandingPage(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 落地页 +// @Summary 修改落地页 +// @Description 修改落地页 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.UpdateLandingPageReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landingPage/update [POST] +func UpdateLandingPageInfo(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.UpdateLandingPageReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.UpdateLandingPage(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 落地页 +// @Summary 删除落地页 +// @Description 删除落地页 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.DelLandingPageReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landingPage/del [DELETE] +func DelLandingPageInfo(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.DelLandingPageReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.DelLandingPage(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/appInfoApi/landPageConfig.go b/api/appInfoApi/landPageConfig.go new file mode 100644 index 0000000..062f56b --- /dev/null +++ b/api/appInfoApi/landPageConfig.go @@ -0,0 +1,155 @@ +package appInfoApi + +import ( + "github.com/gin-gonic/gin" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/landPageConfig" + "stat/service/appInfoSer" + "stat/service/opLogSer" +) + +// @Tags 落地页配置 +// @Summary 落地页配置列表 +// @Description 落地页配置列表 +// @Accept json +// @Produce json +// @Param param body proto.FindLandPageConfigReq true "参数列表" +// @Success 200 {object} proto.LandPageConfigListResp "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landPageConfig/list [POST] +func ListLandPageConfig(ctx *gin.Context) { + param := &proto.FindLandPageConfigReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.GetLandPageConfigList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 落地页配置 +// @Summary 添加落地页配置 +// @Description 添加落地页配置 +// @Accept json +// @Produce json +// @Param param body proto.AddLandPageConfigReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landPageConfig/add [POST] +func AddLandPageConfig(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := &proto.AddLandPageConfigReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.AddLandPageConfig(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 落地页配置 +// @Summary 修改落地页配置 +// @Description 修改落地页配置 +// @Accept json +// @Produce json +// @Param param body landPageConfig.LandPageConfig true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landPageConfig/update [POST] +func UpdateLandPageConfig(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := &landPageConfig.LandPageConfig{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.UpdateLandPageConfig(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 落地页配置 +// @Summary 删除落地页配置 +// @Description 删除落地页配置 +// @Accept json +// @Produce json +// @Param param body proto.DelLandPageConfigReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landPageConfig/del [POST] +func DelLandPageConfig(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + param := &proto.DelLandPageConfigReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.DelLandPageConfig(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 落地页配置 +// @Summary 根据类型获取落地页配置 +// @Description 根据类型获取落地页配置 +// @Accept json +// @Produce json +// @Param param body proto.GetLandPageConfigByTypeReq true "参数列表" +// @Success 200 {object} proto.LandingPageConfigList "成功" +// @Failure 400 {string} string "失败" +// @Router /api/stat/landPageConfig/getByType [POST] +func GetLandPageConfigByType(ctx *gin.Context) { + param := &proto.GetLandPageConfigByTypeReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := appInfoSer.GetLandPageConfigByType(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/applicationapi/application.go b/api/applicationapi/application.go new file mode 100644 index 0000000..288e9d6 --- /dev/null +++ b/api/applicationapi/application.go @@ -0,0 +1,62 @@ +package applicationapi + +import ( + "github.com/gin-gonic/gin" + "net/http" + "stat/api/proto" + "stat/common/log" + "stat/common/stdLog" + "stat/service/applicationser" +) + +// @Tags 配置应用app管理 +// @Summary 外部app获取统计中心配置应用app信息 +// @Description 外部app获取配置应用app信息 +// @Accept json +// @Produce json +// @Param param body proto.CenterApplicationReq true "参数" +// @Success 200 {object} proto.CenterApplicationRes "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/web/apps/get [POST] +func GetApplication(ctx *gin.Context) { + req := proto.CenterApplicationReq{} + if err := ctx.ShouldBindJSON(&req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := applicationser.GetApplication(ctx, req) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + ctx.JSON(http.StatusOK, data) +} + +// @Tags 配置应用app管理 +// @Summary app点击申请到统计中心redis +// @Description app点击 +// @Accept json +// @Produce json +// @Param param body proto.ApplicationClickReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Router /api/stat/web/apps/click [POST] +func ApplicationClick(ctx *gin.Context) { + param := &proto.ApplicationClickReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + log.Error("ApplicationClick ShouldBindJSON", log.Any("err ", err)) + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + serr := applicationser.IncApplicationClickCount(ctx, param) + if serr != nil { + log.Error("ApplicationClick", log.Any("serr", serr), log.Any("param", param)) + stdLog.ServerJSON(ctx, serr.Code, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, nil) +} diff --git a/api/applicationapi/applicationLoc.go b/api/applicationapi/applicationLoc.go new file mode 100644 index 0000000..a60f042 --- /dev/null +++ b/api/applicationapi/applicationLoc.go @@ -0,0 +1,142 @@ +package applicationapi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/service/applicationser" + "stat/service/opLogSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 广告管理 +// @Summary 广告位置列表 +// @Description 广告位置列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListAppLocReq true "参数" +// @Success 200 {object} proto.ListAppLocRes "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/appLoc/list [POST] +func ListAppLoc(ctx *gin.Context) { + param := proto.ListAppLocReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := applicationser.ListAppLoc(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 广告管理 +// @Summary 新增广告位置信息 +// @Description 谷歌验证 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AddAppLocReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/appLoc/add [POST] +func AddAppLoc(ctx *gin.Context) { + param := proto.AddAppLocReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := applicationser.AddAppLoc(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 广告管理 +// @Summary 修改广告位置信息 +// @Description 修改广告位置信息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.UpdateAppLocReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/appLoc/update [POST] +func UpdateAppLoc(ctx *gin.Context) { + param := proto.UpdateAppLocReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + code, data, err := applicationser.UpdateAppLoc(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 广告管理 +// @Summary 删除广告位置信息 +// @Description 删除广告位置信息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.DelAppLocReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/appLoc/del [POST] +func DelAppLoc(ctx *gin.Context) { + param := proto.DelAppLocReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + code, data, err := applicationser.DelAppLoc(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/authorityApi/authority.go b/api/authorityApi/authority.go new file mode 100644 index 0000000..e0458d6 --- /dev/null +++ b/api/authorityApi/authority.go @@ -0,0 +1,142 @@ +package authorityApi + +import ( + "github.com/gin-gonic/gin" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/service/authoritySer" + "stat/service/opLogSer" +) + +// @Tags 权限管理 +// @Summary 权限角色列表 +// @Description 权限角色列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.RoleListReq true "参数列表" +// @Success 200 {object} proto.RoleListRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/authority/list [POST] +func RoleList(ctx *gin.Context) { + param := proto.RoleListReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := authoritySer.RoleList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 权限管理 +// @Summary 添加角色 +// @Description 添加角色 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AddRoleReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/authority/add [POST] +func AddRole(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.AddRoleReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := authoritySer.AddRole(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 权限管理 +// @Summary 修改角色 +// @Description 修改角色 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.UpdateRoleReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/authority/update [POST] +func UpdateRole(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.UpdateRoleReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := authoritySer.UpdateRole(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 权限管理 +// @Summary 删除角色 +// @Description 删除角色 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.DelRoleReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/authority/del [DELETE] +func DelRole(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + param := proto.DelRoleReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := authoritySer.DelRole(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/channelApi/channel.go b/api/channelApi/channel.go new file mode 100644 index 0000000..150fdb6 --- /dev/null +++ b/api/channelApi/channel.go @@ -0,0 +1,240 @@ +package channelApi + +import ( + "fmt" + "net/http" + "path/filepath" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/adminMod" + "stat/service/channelSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 渠道管理 +// @Summary 分组分页获取渠道管理 +// @Description 分组分页获取渠道管理 +// @Accept json +// @Produce json +// @Param param body proto.ChannelInfoSearch true "参数列表" +// @Success 200 {object} proto.ChannelInfoSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelInfo/list [POST] +func GetChannelInfo(ctx *gin.Context) { + var req = &proto.ChannelInfoSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchChannelInfo(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道管理 +// @Summary 分组分页获取渠道列表导出 +// @Description 分组分页获取渠道列表导出 +// @Accept json +// @Produce json +// @Param param body proto.ChannelInfoSearch true "参数列表" +// @Success 200 {object} proto.ChannelInfoSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelInfo/export [POST] +func GetChannelInfoExport(ctx *gin.Context) { + var req = &proto.ChannelInfoSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + fPath, serr := channelSer.SearchChannelInfoExport(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + ctx.Writer.WriteHeader(http.StatusOK) + ctx.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filepath.Base(fPath))) + ctx.Header("Content-Type", "application/octet-stream") + ctx.File(fPath) +} + +// @Tags 渠道管理 +// @Summary 添加一个渠道管理 +// @Description 添加一个渠道管理 +// @Accept json +// @Produce json +// @Param param body proto.ChannelInfoAdd true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelInfo/add [POST] +func AddOneChannelInfo(ctx *gin.Context) { + var req = &proto.ChannelInfoAdd{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + account, err := utils.GetAdmin(ctx) + if err != nil || account == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + + adminInfo, err := adminMod.FindOneByAccount(ctx, account) + if err != nil || adminInfo.Account == "" { + stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, err) + return + } + + resp, serr := channelSer.AddChannelInfo(ctx, adminInfo.Name, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道管理 +// @Summary 删除一个渠道管理 +// @Description 删除一个渠道管理 +// @Accept json +// @Produce json +// @Param param body proto.ChannelInfoDelete true "参数列表" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelInfo/del [POST] +func DelOneChannelInfo(ctx *gin.Context) { + var req = &proto.ChannelInfoDelete{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + serr := channelSer.DelChannelInfo(ctx, req.ID) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道管理 +// @Summary 更新一个渠道管理 +// @Description 更新一个渠道管理 +// @Accept json +// @Produce json +// @Param param body proto.ChannelInfoUpdate true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelInfo/update [POST] +func UpdateOneChannelInfo(ctx *gin.Context) { + var req = &proto.ChannelInfoUpdate{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + serr := channelSer.UpdateChannelInfo(ctx, req.ID, *req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道管理 +// @Summary 获取用户信息 +// @Description 获取用户信息 +// @Accept json +// @Produce json +// @Param param body proto.UserInfoSearch true "参数列表" +// @Success 200 {object} registermod.RegisterMod "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/user/info [POST] +func SearchUserInfo(ctx *gin.Context) { + var req = &proto.UserInfoSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchUserInfo(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道管理 +// @Summary 更新一个渠道管理的所有者 +// @Description 更新一个渠道管理的所有者 +// @Accept json +// @Produce json +// @Param param body proto.ChannelOwnerUpdate true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelInfo/owner/update [POST] +func UpdateOneChannelOwner(ctx *gin.Context) { + var req = &proto.ChannelOwnerUpdate{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + + account, err := utils.GetAdmin(ctx) + if err != nil || account == "" { + stdLog.ServerJSON(ctx, stdLog.NoToken, err) + return + } + + adminInfo, err := adminMod.FindOneByAccount(ctx, account) + if err != nil || adminInfo.Account == "" { + stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, err) + return + } + + serr := channelSer.UpdateOneChannelOwner(ctx, adminInfo.Name, adminInfo.Account, *req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道管理 +// @Summary 渠道所有者变更信息 +// @Description 渠道所有者变更信息 +// @Accept json +// @Produce json +// @Param param body proto.ChannelOwnerChangeInfoSearch true "参数列表" +// @Success 200 {object} proto.ChannelOwnerChangeInfoSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelInfo/ownerchange/list [POST] +func SearchChannelOwnerChange(ctx *gin.Context) { + var req = &proto.ChannelOwnerChangeInfoSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchChannelOwnerChangeInfo(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} diff --git a/api/channelApi/rule.go b/api/channelApi/rule.go new file mode 100644 index 0000000..b2cd584 --- /dev/null +++ b/api/channelApi/rule.go @@ -0,0 +1,109 @@ +package channelApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/channelSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 渠道管理 +// @Summary 获取渠道扣量规则列表 +// @Description 获取渠道扣量规则列表 +// @Accept json +// @Produce json +// @Param param body proto.ChannelDeductionRuleSearch true "参数列表" +// @Success 200 {object} proto.ChannelDeductionRuleSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelRule/list [POST] +func GetChannelDeductionRule(ctx *gin.Context) { + var req = &proto.ChannelDeductionRuleSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchChannelDeductionRule(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道管理 +// @Summary 添加一个渠道管理 +// @Description 添加一个渠道管理 +// @Accept json +// @Produce json +// @Param param body proto.ChannelDeductionRuleAdd true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelRule/add [POST] +func AddOneChannelDeductionRule(ctx *gin.Context) { + var req = &proto.ChannelDeductionRuleAdd{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + resp, serr := channelSer.AddChannelDeductionRule(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道管理 +// @Summary 删除一个渠道管理 +// @Description 删除一个渠道管理 +// @Accept json +// @Produce json +// @Param param body proto.ChannelDeductionRuleDelete true "参数列表" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelRule/del [POST] +func DelOneChannelDeductionRule(ctx *gin.Context) { + var req = &proto.ChannelDeductionRuleDelete{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + serr := channelSer.DelChannelDeductionRule(ctx, req.ID) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道管理 +// @Summary 更新一个渠道管理 +// @Description 更新一个渠道管理 +// @Accept json +// @Produce json +// @Param param body proto.ChannelDeductionRuleUpdate true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelRule/update [POST] +func UpdateOneChannelDeductionRule(ctx *gin.Context) { + var req = &proto.ChannelDeductionRuleUpdate{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + serr := channelSer.UpdateChannelDeductionRule(ctx, req.ID, *req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} diff --git a/api/channelApi/settlement.go b/api/channelApi/settlement.go new file mode 100644 index 0000000..f12827a --- /dev/null +++ b/api/channelApi/settlement.go @@ -0,0 +1,364 @@ +package channelApi + +import ( + "fmt" + "net/http" + "path/filepath" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/middleware/define" + "stat/service/channelSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 渠道结算 +// @Summary 分组分页获取渠道结算 +// @Description 分组分页获取渠道结算 +// @Accept json +// @Produce json +// @Param param body proto.SettlementInfoSearch true "参数列表" +// @Success 200 {object} proto.SettlementInfoSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/list [POST] +func GetSearchSettlementInfo(ctx *gin.Context) { + var req = &proto.SettlementInfoSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchSettlementInfo(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道结算 +// @Summary 分组分页获取渠道结算申请表(渠道账号看的) +// @Description 分组分页获取渠道结算申请表(渠道账号看的) +// @Accept json +// @Produce json +// @Param param body proto.GetApplyFormReq true "参数列表" +// @Success 200 {object} proto.GetApplyFormResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/agent/channel/applies [POST] +func GetApplyForm(ctx *gin.Context) { + var req = &proto.GetApplyFormReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + } + accType, err := utils.GetAccountType(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + } + if accType != define.Channel { + stdLog.ServerJSON(ctx, stdLog.Failure, fmt.Errorf("代理账号才可以查看")) + } + resp, serr := channelSer.SearchApplyForm(ctx, req, account) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道结算 +// @Summary 获取结算申请人名字列表 +// @Description 获取结算申请人名字列表 +// @Accept json +// @Produce json +// @Param param body proto.GetSettlementApplicantListReq true "参数列表" +// @Success 200 {object} proto.GetSettlementApplicantListResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/applicant/list [POST] +func GetSettlementApplicantList(ctx *gin.Context) { + var req = &proto.GetSettlementApplicantListReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.GetSettlementApplicantList(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道结算 +// @Summary 分组分页获取渠道结算已删除列表 +// @Description 分组分页获取渠道结算已删除列表 +// @Accept json +// @Produce json +// @Param param body proto.SettlementInfoSearch true "参数列表" +// @Success 200 {object} proto.SettlementInfoSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/deleted/list [POST] +func GetSearchDeletedSettlementInfo(ctx *gin.Context) { + var req = &proto.SettlementInfoSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchDeletedSettlementInfo(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道结算 +// @Summary 分组分页获取渠道结算导出 +// @Description 分组分页获取渠道结算导出 +// @Accept json +// @Produce json +// @Param param body proto.SettlementInfoSearch true "参数列表" +// @Success 200 {object} proto.SettlementInfoSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/export [POST] +func GetSearchSettlementInfoExport(ctx *gin.Context) { + var req = &proto.SettlementInfoSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + fPath, serr := channelSer.SearchSettlementInfoExport(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + ctx.Writer.WriteHeader(http.StatusOK) + ctx.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filepath.Base(fPath))) + ctx.Header("Content-Type", "application/octet-stream") + ctx.File(fPath) +} + +// @Tags 渠道结算 +// @Summary 分组分页获取渠道结算申请表导出 +// @Description 分组分页获取渠道结算申请表导出 +// @Accept json +// @Produce json +// @Param param body proto.SettlementInfoSearch true "参数列表" +// @Success 200 {object} proto.SettlementInfoSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/v2/export [POST] +func GetSearchSettlementInfoApplyExport(ctx *gin.Context) { + var req = &proto.SettlementInfoSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + fPath, serr := channelSer.SearchSettlementInfoApplyExport(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + ctx.Writer.WriteHeader(http.StatusOK) + ctx.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filepath.Base(fPath))) + ctx.Header("Content-Type", "application/octet-stream") + ctx.File(fPath) +} + +// @Tags 渠道结算 +// @Summary 添加一个渠道结算 +// @Description 添加一个渠道结算 +// @Accept json +// @Produce json +// @Param param body proto.SettlementInfoAdd true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/add [POST] +func AddOneSettlementInfo(ctx *gin.Context) { + var req = &proto.SettlementInfoAdd{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + serr := channelSer.AddSettlementInfo(ctx, req) + if serr != nil { + if serr.Error() == "重复结算" { + stdLog.ServerJSON(ctx, stdLog.SettlementDouble, serr.Error()) + } else { + stdLog.ServerJSON(ctx, stdLog.Failure, serr.Error()) + } + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道结算 +// @Summary 添加一个渠道结算2 +// @Description 添加一个渠道结算2 +// @Accept json +// @Produce json +// @Param param body proto.SettlementInfoAdd true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/v2/add [POST] +func AddOneSettlementInfo2(ctx *gin.Context) { + var req = &proto.SettlementInfoAdd2{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + } + accType, err := utils.GetAccountType(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + } + + serr := channelSer.AddSettlementInfo2(ctx, req, accType, account) + if serr != nil { + if serr.Error() == "重复结算" { + stdLog.ServerJSON(ctx, stdLog.SettlementDouble, serr.Error()) + } else { + stdLog.ServerJSON(ctx, stdLog.Failure, serr.Error()) + } + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道结算 +// @Summary 更新一个渠道结算 +// @Description 更新一个渠道结算 +// @Accept json +// @Produce json +// @Param param body proto.SettlementInfoUpdate true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/update [POST] +func UpdateOneSettlementInfo(ctx *gin.Context) { + var req = &proto.SettlementInfoUpdate{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + serr := channelSer.UpdateSettlementInfo(ctx, *req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道结算 +// @Summary 更新一个渠道结算2 +// @Description 更新一个渠道结算2 +// @Accept json +// @Produce json +// @Param param body proto.SettlementInfoUpdate true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/v2/update [POST] +func UpdateOneSettlementInfo2(ctx *gin.Context) { + var req = &proto.SettlementInfoUpdate2{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + } + accType, err := utils.GetAccountType(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + } + serr := channelSer.UpdateSettlementInfo2(ctx, *req, accType, account) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道结算 +// @Summary 删除一个渠道结算项 +// @Description 删除一个渠道结算(只有特定状态的结算项可以删除) +// @Accept json +// @Produce json +// @Param param body proto.SettlementInfoDelete true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/v2/del [POST] +func DelOneSettlementInfo(ctx *gin.Context) { + var req = &proto.SettlementInfoDelete{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + } + accType, err := utils.GetAccountType(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + } + serr := channelSer.DeleteSettlementInfo(ctx, *req, accType, account) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 渠道结算 +// @Summary 查看渠道结算项的详情 +// @Description 查看渠道结算项的详情 +// @Accept json +// @Produce json +// @Param param body proto.SettlementInfoDetail true "参数列表" +// @Success 200 {object} proto.SettlementInfoDetailResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/settlementinfo/v2/detail [POST] +func DetailOneSettlementInfo(ctx *gin.Context) { + var req = proto.SettlementInfoDetail{} + if err := ctx.ShouldBind(&req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + resp, serr := channelSer.DetailSettlementInfo(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} diff --git a/api/channelApi/stat.go b/api/channelApi/stat.go new file mode 100644 index 0000000..05b9e2d --- /dev/null +++ b/api/channelApi/stat.go @@ -0,0 +1,191 @@ +package channelApi + +import ( + "fmt" + "net/http" + "path/filepath" + "stat/api/proto" + "stat/common/stdLog" + "stat/service/channelSer" + "stat/service/statSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 渠道管理 +// @Summary 获取渠道统计列表 +// @Description 获取渠道统计列表 +// @Accept json +// @Produce json +// @Param param body proto.ChannelStatSearch true "参数列表" +// @Success 200 {object} proto.ChannelStatSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelStat/list [POST] +func GetChannelStat(ctx *gin.Context) { + var req = &proto.ChannelStatSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchChannelStat(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道同时段对比 +// @Summary 渠道同时段对比 +// @Description 渠道同时段对比 +// @Accept json +// @Produce json +// @Param param body proto.SearchChannelStatComparedReq true "参数列表" +// @Success 200 {object} proto.SearchChannelStatComparedResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelStat/compare/list [POST] +func SearchChannelStatCompared(ctx *gin.Context) { + var req = &proto.SearchChannelStatComparedReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchChannelStatCompared(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道结算 +// @Summary 获取渠道统计信息 +// @Description 获取渠道统计信息 +// @Accept json +// @Produce json +// @Param param body proto.ChannelStatSettlementSearch true "参数列表" +// @Success 200 {object} proto.ChannelStatSettlementSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelStat/settlement/list [POST] +func GetChannelSettlementStat(ctx *gin.Context) { + var req = &proto.ChannelStatSettlementSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchChannelSettlementStat(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道结算 +// @Summary 获取渠道统计信息v2 +// @Description 获取渠道统计信息v2 +// @Accept json +// @Produce json +// @Param param body proto.ChannelStatSettlementSearch true "参数列表" +// @Success 200 {object} proto.ChannelStatSettlementSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelStat/settlement/v2/list [POST] +func GetChannelSettlementStat2(ctx *gin.Context) { + var req = &proto.ChannelStatSettlementSearch2{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchChannelSettlementStat2(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道结算 +// @Summary 对结算页用户选择的结算项目进行计算 +// @Description 对结算页用户选择的结算项目进行计算 +// @Accept json +// @Produce json +// @Param param body proto.SettlementCalcReq true "参数列表" +// @Success 200 {object} proto.SettlementCalcResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelStat/settlement/v2/calc [POST] +func GetChannelSettlementCalc(ctx *gin.Context) { + var req = &proto.SettlementCalcReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.ChannelSettlementCalc(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 渠道管理 +// @Summary 分组分页获取渠道结算表 +// @Description 分组分页获取渠道结算表 +// @Accept json +// @Produce json +// @Param param body proto.ChannelSettlementSearch true "参数列表" +// @Success 200 {object} proto.ChannelSettlementSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/channelSettlement/list [POST] +func GetChannelSettlement(ctx *gin.Context) { + var req = &proto.ChannelSettlementSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := channelSer.SearchChannelSettlement(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 日常统计 +// @Summary 渠道统计导出 +// @Description 渠道统计导出 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ChannelStatExportReq true "参数列表" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/channelStat/export [POST] +func ListChannelStatExport(ctx *gin.Context) { + param := proto.ChannelStatExportReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + fPath, serr := statSer.ChannelStatExport(ctx, param) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + ctx.Writer.WriteHeader(http.StatusOK) + ctx.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filepath.Base(fPath))) + ctx.Header("Content-Type", "application/octet-stream") + ctx.File(fPath) +} diff --git a/api/dailystatadvertise/activity.go b/api/dailystatadvertise/activity.go new file mode 100644 index 0000000..9b115d3 --- /dev/null +++ b/api/dailystatadvertise/activity.go @@ -0,0 +1,108 @@ +package dailystatadvertise + +import ( + "stat/common/stdLog" + "stat/models/dailystatadvertise" + "stat/service/dailystatadvertiseser" + + "github.com/gin-gonic/gin" +) + +// @Tags 统计数据(广告) +// @Summary 分组分页获取统计数据(广告) +// @Description 分组分页获取统计数据(广告) +// @Accept json +// @Produce json +// @Param param body dailystatadvertiseser.DailyStatAdvertiseSearch true "参数列表" +// @Success 200 {object} dailystatadvertiseser.DailyStatAdvertiseSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/statadvertise/list [POST] +func GetDailyStatAdvertise(ctx *gin.Context) { + var req = &dailystatadvertiseser.DailyStatAdvertiseSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + resp, serr := dailystatadvertiseser.GetDailyStatAdvertise(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 统计数据(广告) +// @Summary 添加一个统计数据(广告) +// @Description 添加一个统计数据(广告) +// @Accept json +// @Produce json +// @Param param body dailystatadvertise.DailyStatAdvertise true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/statadvertise/add [POST] +func AddOneDailyStatAdvertise(ctx *gin.Context) { + var req = &dailystatadvertise.DailyStatAdvertise{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + //fmt.Println("err", err) + return + } + serr := dailystatadvertiseser.AddDailyStatAdvertise(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 统计数据(广告) +// @Summary 删除一个统计数据(广告) +// @Description 删除一个统计数据(广告) +// @Accept json +// @Produce json +// @Param param body dailystatadvertiseser.DailyStatAdvertiseDelReq true "参数列表" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/statadvertise/del [POST] +func DelOneDailyStatAdvertise(ctx *gin.Context) { + var req = &dailystatadvertiseser.DailyStatAdvertiseDelReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + serr := dailystatadvertiseser.DelDailyStatAdvertise(ctx, req.Id) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 统计数据(广告) +// @Summary 更新一个统计数据(广告) +// @Description 更新一个统计数据(广告) +// @Accept json +// @Produce json +// @Param param body dailystatadvertiseser.DailyStatAdvertiseUpdateReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/statadvertise/update [POST] +func UpdateOneDailyStatAdvertise(ctx *gin.Context) { + var req = &dailystatadvertiseser.DailyStatAdvertiseUpdateReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + serr := dailystatadvertiseser.UpdateDailyStatAdvertise(ctx, req.Id, &req.Param) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} diff --git a/api/domainapi/domain.go b/api/domainapi/domain.go new file mode 100644 index 0000000..aead53a --- /dev/null +++ b/api/domainapi/domain.go @@ -0,0 +1,112 @@ +package domainapi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/domainser" + + "github.com/gin-gonic/gin" +) + +// @Tags 域名管理 +// @Summary 域名列表 +// @Description 域名列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListDomainInfoReq true "参数列表" +// @Success 200 {object} proto.ListDomainInfoRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/domain/list [POST] +func ListDomainInfo(ctx *gin.Context) { + param := proto.ListDomainInfoReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := domainser.GetDomainInfoList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 域名管理 +// @Summary 添加域名 +// @Description 添加域名 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.AddDomainInfoReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/domain/add [POST] +func AddDomainInfo(ctx *gin.Context) { + param := proto.AddDomainInfoReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := domainser.AddDomainInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 域名管理 +// @Summary 修改域名 +// @Description 修改域名 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.UpdateDomainInfoReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/domain/update [POST] +func UpdateDomainInfo(ctx *gin.Context) { + param := proto.UpdateDomainInfoReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := domainser.UpdateDomainInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 域名管理 +// @Summary 删除域名 +// @Description 删除域名 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.DelDomainInfoReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/domain/del [DELETE] +func DelDomainInfo(ctx *gin.Context) { + param := proto.DelDomainInfoReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + code, data, err := domainser.DelDomainInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/fileApi/file.go b/api/fileApi/file.go new file mode 100644 index 0000000..17e54d3 --- /dev/null +++ b/api/fileApi/file.go @@ -0,0 +1,44 @@ +package fileApi + +import ( + "stat/common/file" + "stat/common/log" + "stat/common/stdLog" + "stat/statg" + "strings" + + "github.com/gin-gonic/gin" +) + +// @Tags 文件上传 +// @Summary 文件上传 +// @Description 文件上传 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param file formData file true "文件数据" +// @Success 200 {string}} string "成功" +// @Failure 400 {string} string "失败" +// @Router /api/stat/file/upload [POST] +func FileUpload(ctx *gin.Context) { + f, err := ctx.FormFile("file") + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + // 上传到桶2 + data, err := file.PutObject(ctx, statg.Conf.ProxyUrl.FileRes, &file.FileObject{ + File: f, + }) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + } else { + + if !strings.HasPrefix(data, "v2/") { + data = "v2/" + data + } + log.Error("file upload", log.Any("url", statg.Conf.ProxyUrl.FileRes), log.Any("path", data)) + stdLog.ServerJSON(ctx, stdLog.Success, data) + } + return +} diff --git a/api/innerapi/inner.go b/api/innerapi/inner.go new file mode 100644 index 0000000..1c2b8d3 --- /dev/null +++ b/api/innerapi/inner.go @@ -0,0 +1,216 @@ +package innerapi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/appInfoSer" + "stat/service/botser" + "stat/service/innerserverser" + "stat/service/versionSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 服务器数据同步 +// @Summary 请求机器人日时数据列表 +// @Description 请求机器人日时数据列表 +// @Accept json +// @Produce json +// @Param param body proto.BotDailyHourListReq true "参数列表" +// @Success 200 {object} proto.BotDailyHourListResp "成功" +// @Failure 400 {string} string "失败" +// @Router /api/stat/inner/botStatList [POST] +func BotDailyHourList(ctx *gin.Context) { + param := &proto.BotDailyHourListReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + resp, err := botser.GetBotDailyHourList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.QueryError, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 服务器数据同步 +// @Summary 请求机器人日时数据列表 +// @Description 请求机器人日时数据列表 +// @Accept json +// @Produce json +// @Param param body proto.BotDailyHourOneReq true "参数列表" +// @Success 200 {object} proto.BotDailyHourOneResp "成功" +// @Failure 400 {string} string "失败" +// @Router /api/stat/inner/botDailyHourOne [POST] +func BotDailyHourOne(ctx *gin.Context) { + param := &proto.BotDailyHourOneReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + resp, err := botser.GetBotDailyHourOne(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.QueryError, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 服务器数据同步 +// @Summary 发送TG消息 +// @Description 发送TG消息 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.SendTgMessageReq true "参数列表" +// @Success 200 {object} proto.SendTgMessageRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/inner/sendTgMessage [POST] +func SendTgMessage(ctx *gin.Context) { + param := proto.SendTgMessageReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + if res, err := botser.RecvTgMessage(ctx, ¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } else { + stdLog.ServerJSON(ctx, stdLog.Success, res) + } +} + +// @Tags 服务器数据同步 +// @Summary 获取服务器的app列表 +// @Description 获取服务器的app列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListAppInfoReq true "参数列表" +// @Success 200 {object} proto.ListAppInfoRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/inner/appList [POST] +func ListAppInfo(ctx *gin.Context) { + param := proto.ListAppInfoReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := appInfoSer.GetAppInfoList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 服务器数据同步 +// @Summary 请求机器人月数据列表 +// @Description 请求机器人月数据列表 +// @Accept json +// @Produce json +// @Param param body proto.BotMonthStatReq true "参数列表" +// @Success 200 {object} proto.BotMonthStatResp "成功" +// @Failure 400 {string} string "失败" +// @Router /api/stat/inner/botMonthStat [POST] +func BotMonthStatList(ctx *gin.Context) { + param := &proto.BotMonthStatReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + resp, err := botser.GetBotMonthStatList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.QueryError, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 服务器数据同步 +// @Summary 请求APP下载链接 +// @Description 请求APP下载链接 +// @Accept json +// @Produce json +// @Param param body proto.PageButtonClickReq true "参数列表" +// @Success 200 {object} proto.PageButtonClickResp "成功" +// @Failure 400 {string} string "失败" +// @Router /api/stat/inner/appDownload [POST] +func AppDownload(ctx *gin.Context) { + param := &proto.PageButtonClickReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + ip := ctx.ClientIP() + userAgent := ctx.Request.Header.Get("User-Agent") + data, err := versionSer.PageButtonClick(ctx, userAgent, ip, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 服务器数据同步 +// @Summary 请求别的服务器充值数据 +// @Description 请求别的服务器充值数据 +// @Accept json +// @Produce json +// @Param param body proto.InnerRechargeReq true "参数列表" +// @Success 200 {object} proto.PageButtonClickResp "成功" +// @Failure 400 {string} string "失败" +// @Router /api/stat/inner/recharge/list [POST] +func InnerRechargeList(ctx *gin.Context) { + param := &proto.InnerRechargeReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + data, err := innerserverser.InnerRecgaregeList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 服务器数据同步 +// @Summary 请求别的服务器充值数据 +// @Description 请求别的服务器充值数据 +// @Accept json +// @Produce json +// @Param param body proto.InnerRechargeReq true "参数列表" +// @Success 200 {object} proto.PageButtonClickResp "成功" +// @Failure 400 {string} string "失败" +// @Router /api/stat/inner/rechargebotcmd/list [POST] +func InnerRechargeBotcmdList(ctx *gin.Context) { + param := &proto.InnerRechargeBotcmdReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + data, err := innerserverser.InnerRecgaregeBotcmdList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} diff --git a/api/mediaapi/media.go b/api/mediaapi/media.go new file mode 100644 index 0000000..804dc85 --- /dev/null +++ b/api/mediaapi/media.go @@ -0,0 +1,193 @@ +package mediaapi + +import ( + "bytes" + "io" + "net/http" + "stat/common/m3u8" + "stat/common/stdLog" + "stat/service/storage" + "stat/service/storage/proxy" + "stat/statg" + + "github.com/gin-gonic/gin" +) + +// @Tags 视频列表 +// @Summary 视频body上传 +// @Description 视频body上传 +// @Accept json +// @Produce json +// @Success 200 {object}} proxy.UploadVideoBodyResp "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/media/videoBody [POST] +func VideoBody(ctx *gin.Context) { + form, err := ctx.MultipartForm() + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + videoUploadDomain := "http://118.107.15.137:18092" + result, err := storage.UploadVideoBody(ctx, form, videoUploadDomain) + if err != nil || result.Code != http.StatusOK { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + resp := &proxy.UploadVideoBodyResp{ + Id: result.Data.Id, + VideoUri: result.Data.VideoUri, + } + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 视频列表 +// @Summary 视频body上传完成信息调用 +// @Description 视频body上传完成信息调用 +// @Accept json +// @Produce json +// @Param req body proxy.BaseInfo true "参数列表" +// @Success 200 {int} int "ok" +// @Security ApiKeyAuth +// @Router /api/stat/media/videoOk [post] +func VideoOK(ctx *gin.Context) { + var req proxy.BaseInfo + if err := ctx.ShouldBind(&req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + videoUploadDomain := "http://118.107.15.137:18092" + result, err := storage.UploadVideoOK(ctx, &req, videoUploadDomain) + if err != nil || result.Code != http.StatusOK { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, result.Data) +} + +// @Tags 视频列表 +// @Summary 根据参数获取视频列表 +// @Description 获取视频列表 +// @Accept json +// @Produce json +// @Param req body proxy.MediaSearchReq true "参数列表" +// @Success 200 {object} proxy.MediaSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/media/search [post] +func VideoSearch(ctx *gin.Context) { + var req proxy.MediaSearchReq + if err := ctx.ShouldBind(&req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + videoUploadDomain := "http://118.107.15.137:18092" + result, err := proxy.PostSearch(&req, videoUploadDomain) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, result) + +} + +// @Tags 视频列表 +// @Summary 更新视频信息 +// @Description 更新视频信息 +// @Accept json +// @Produce json +// @Param req body proxy.MediasUpdateReq true "参数列表" +// @Success 200 {object} proxy.MediasUpdateResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/media/update [post] +func VideoUpdate(ctx *gin.Context) { + var req proxy.MediasUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + videoUploadDomain := "http://118.107.15.137:18092" + result, err := proxy.PostUpdate(&req, videoUploadDomain) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, result) +} + +// @Tags 视频列表 +// @Summary 删除视频列表 +// @Description 删除视频列表 +// @Accept json +// @Produce json +// @Param req body proxy.MediasDelReq true "参数列表" +// @Success 200 {object} proxy.MediasDelResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/media/delete [post] +func VideoDelete(ctx *gin.Context) { + var req proxy.MediasDelReq + if err := ctx.ShouldBind(&req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + videoUploadDomain := "http://118.107.15.137:18092" + result, err := proxy.PostDelete(&req, videoUploadDomain) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, result) +} + +type fileHandler func(ctx *gin.Context) (contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string, err error) + +func Enkey(ctx *gin.Context) { + fn := func(c *gin.Context) (contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string, err error) { + buffer, err := m3u8.Enkey(c) + if err != nil { + return + } + contentLength = int64(buffer.Len()) + contentType = "application/octet-stream" + reader = buffer + extraHeaders = map[string]string{} + return + } + handlerFile(ctx, fn) +} + +func handlerFile(ctx *gin.Context, h fileHandler) { + contentLength, contentType, reader, extraHeaders, err := h(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.DownloadM3u8File, err) + return + } + ctx.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders) +} + +func GetM3U8(ctx *gin.Context) { + fn := func(c *gin.Context) (contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string, err error) { + m3u8Name := ctx.Param("key") + var req m3u8.Req + if err = ctx.BindQuery(&req); err != nil { + return + } + req.Name = m3u8Name + cdnDomain := statg.Conf.LandPageCDN + originDomain := "https://resourceyuan.bbaazz.me" + _, buff, err := m3u8.TransFormWithSafely(&req, cdnDomain, originDomain, req.NeedHeader, 1) + if err != nil { + return + } + contentType = "application/vnd.apple.mpegurl" + reader = bytes.NewReader(buff.Bytes()) + contentLength = int64(buff.Len()) + extraHeaders = map[string]string{} + return + } + + handlerFile(ctx, fn) +} diff --git a/api/mediaapi/tag.go b/api/mediaapi/tag.go new file mode 100644 index 0000000..f082441 --- /dev/null +++ b/api/mediaapi/tag.go @@ -0,0 +1,109 @@ +package mediaapi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/mediatagSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 视频标签 +// @Summary 分组分页获取视频标签 +// @Description 分组分页获取视频标签 +// @Accept json +// @Produce json +// @Param param body proto.MediaTagSearch true "参数列表" +// @Success 200 {object} proto.MediaTagSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/mediatag/list [POST] +func GetMediaTag(ctx *gin.Context) { + var req = &proto.MediaTagSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := mediatagSer.MediaTag(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 视频标签 +// @Summary 添加一个视频标签 +// @Description 添加一个视频标签 +// @Accept json +// @Produce json +// @Param param body proto.MediaTagAddReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/mediatag/add [POST] +func AddOneLandpage(ctx *gin.Context) { + var req = &proto.MediaTagAddReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + serr := mediatagSer.AddMediaTag(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 视频标签 +// @Summary 删除一个视频标签 +// @Description 删除一个视频标签 +// @Accept json +// @Produce json +// @Param param body proto.MediaTagDelReq true "参数列表" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/mediatag/del [POST] +func DelOneLandpage(ctx *gin.Context) { + var req = &proto.MediaTagDelReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + serr := mediatagSer.DelMediaTag(ctx, req.Id) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 视频标签 +// @Summary 更新一个视频标签 +// @Description 更新一个视频标签 +// @Accept json +// @Produce json +// @Param param body proto.MediaTagUpdateReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/mediatag/update [POST] +func UpdateOneLandpage(ctx *gin.Context) { + var req = &proto.MediaTagUpdateReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + serr := mediatagSer.UpdateMediaTag(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} diff --git a/api/monitorApi/monitor.go b/api/monitorApi/monitor.go new file mode 100644 index 0000000..550da51 --- /dev/null +++ b/api/monitorApi/monitor.go @@ -0,0 +1,109 @@ +package monitorApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/monitorSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 应用监控 +// @Summary 分组分页获取应用监控 +// @Description 分组分页获取应用监控 +// @Accept json +// @Produce json +// @Param param body proto.MonitorSearch true "参数列表" +// @Success 200 {object} proto.MonitorSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/monitor/list [POST] +func SearchMonitor(ctx *gin.Context) { + var req = &proto.MonitorSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := monitorSer.SearchMonitor(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 应用监控 +// @Summary 添加一个应用监控 +// @Description 添加一个应用监控 +// @Accept json +// @Produce json +// @Param param body proto.MonitorAddReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/monitor/add [POST] +func AddMonitor(ctx *gin.Context) { + var req = &proto.MonitorAddReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + serr := monitorSer.AddMonitor(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 应用监控 +// @Summary 删除一个应用监控 +// @Description 删除一个应用监控 +// @Accept json +// @Produce json +// @Param param body proto.MonitorDelReq true "参数列表" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/monitor/del [DELETE] +func DelMonitor(ctx *gin.Context) { + var req = &proto.MonitorDelReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + serr := monitorSer.DelMonitor(ctx, req.Id) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 应用监控 +// @Summary 更新一个应用监控 +// @Description 更新一个应用监控 +// @Accept json +// @Produce json +// @Param param body proto.MonitorUpdateReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/monitor/update [POST] +func UpdateMonitor(ctx *gin.Context) { + var req = &proto.MonitorUpdateReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + serr := monitorSer.UpdateMonitor(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} diff --git a/api/opLogApi/opLog.go b/api/opLogApi/opLog.go new file mode 100644 index 0000000..ed62e0c --- /dev/null +++ b/api/opLogApi/opLog.go @@ -0,0 +1,35 @@ +package opLogApi + +import ( + "github.com/gin-gonic/gin" + "stat/api/proto" + "stat/common/stdLog" + "stat/service/opLogSer" +) + +// @Tags 操作日志 +// @Summary 操作日志列表 +// @Description 操作日志列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListOpLogReq true "参数列表" +// @Success 200 {object} proto.ListOpLogRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/opLog/list [POST] +func ListOpLog(ctx *gin.Context) { + param := proto.ListOpLogReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := opLogSer.GetOpLogList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} diff --git a/api/proto/activity.go b/api/proto/activity.go new file mode 100644 index 0000000..237f896 --- /dev/null +++ b/api/proto/activity.go @@ -0,0 +1,291 @@ +package proto + +import ( + "stat/common" + "stat/models/activitymod" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 活动列表 请求数据 +type ActivityListReq struct { + common.Page + Enable *bool `json:"enable" form:"enable"` // 开关 + Name *string `json:"name" form:"name"` // 活动名称 +} + +// 活动列表 返回数据 +type ActivityListResp struct { + Total int64 `json:"total" bson:"total"` // 数量 + List []*ActivityInfo `json:"list" bson:"list"` // 活动信息列表 +} + +type ActivityInfo struct { + Id primitive.ObjectID `json:"id" bson:"_id"` // 唯一ID + Name string `json:"name" bson:"name"` // 活动名称 + Desc string `json:"desc" bson:"desc"` // 活动说明 + SortCode int `json:"sortCode" bson:"sortCode"` // 排序号 + H5Domain string `json:"h5Domain" bson:"h5Domain"` // 活动H5地址 + GiftDesc string `json:"giftDesc" bson:"giftDesc"` // 奖励说明 + Enable bool `json:"enable" bson:"enable"` // 活动开关 + Background string `json:"background" bson:"background"` // 背景图 + StartTime time.Time `json:"startTime" bson:"startTime"` // 活动开始时间 + EndTime time.Time `json:"endTime" bson:"endTime"` // 活动结束时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` + Banner []activitymod.BannerInfo `json:"banner" bson:"banner"` // banner列表 + LotteryCodeNum int64 `json:"lotteryCodeNum" bson:"lotteryCodeNum"` // 抽奖码总数量 + UsedLotteryCodeNum int64 `json:"usedLotteryCodeNum" bson:"usedLotteryCodeNum"` // 抽奖码已使用数量 + GiftCodeNum int64 `json:"giftCodeNum" bson:"giftCodeNum"` // 奖品兑换码总数量 + GiftCodeGivedNum int64 `json:"giftCodeGivedNum" bson:"giftCodeGivedNum"` // 奖品兑换码已发放数量 + GiftCodeUsedNum int64 `json:"giftCodeUsedNum" bson:"giftCodeUsedNum"` // 奖品兑换码已使用数量 +} + +// 新增活动 请求数据 +type AddActivityReq struct { + Name string `json:"name" bson:"name"` // 活动名称 + Desc string `json:"desc" bson:"desc"` // 活动描述 + SortCode int32 `json:"sortCode" bson:"sortCode"` // 排序号 + H5Domain string `json:"h5Domain" bson:"h5Domain"` // 活动H5地址 + GiftDesc string `json:"giftDesc" bson:"giftDesc"` // 奖励说明 + Enable bool `json:"enable" bson:"enable"` // 活动开关 + Background string `json:"background" bson:"background"` // 背景图 + StartTime time.Time `json:"startTime" bson:"startTime"` // 活动开始时间 + EndTime time.Time `json:"endTime" bson:"endTime"` // 活动结束时间 + Banner []activitymod.BannerInfo `json:"banner" bson:"banner"` // banner列表 +} + +// 修改活动 请求数据 +type UpdateActivityReq struct { + Id primitive.ObjectID `json:"id" bson:"_id,omitempty" binding:"required"` // 唯一ID + Name *string `json:"name" bson:"name,omitempty"` // 活动名称 + Desc *string `json:"desc" bson:"desc,omitempty"` // 活动描述 + SortCode *int `json:"sortCode" bson:"sortCode,omitempty"` // 排序号 + H5Domain *string `json:"h5Domain" bson:"h5Domain,omitempty"` // 活动H5地址 + GiftDesc *string `json:"giftDesc" bson:"giftDesc,omitempty"` // 奖励说明 + Enable *bool `json:"enable" bson:"enable,omitempty"` // 活动开关 + Background *string `json:"background" bson:"background,omitempty"` // 背景图 + StartTime *time.Time `json:"startTime" bson:"startTime,omitempty"` // 活动开始时间 + EndTime *time.Time `json:"endTime" bson:"endTime,omitempty"` // 活动结束时间 + Banner *[]activitymod.BannerInfo `json:"banner" bson:"banner"` // banner列表 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` +} + +// 删除活动 请求数据 +type DelActivityReq struct { + Id primitive.ObjectID `json:"id" binding:"required"` // 唯一ID +} + +// 生成抽奖码 请求数据 +type GenLotteryCodeReq struct { + CodeNum int32 `json:"codeNum" bson:"codeNum" binding:"required,gt=0"` // 生产的抽奖码个数 + ActId primitive.ObjectID `json:"actId" bson:"actId" binding:"required"` // 所属活动的ID + CodeLen int32 `json:"codeLen" bson:"codeLen" binding:"required,gt=0"` // 抽奖码长度 +} + +// 修改抽奖码 请求数据 +type UpdateLotteryCodeReq struct { + LotteryCodeId primitive.ObjectID `json:"lotteryCodeId" bson:"lotteryCodeId" binding:"required"` // 抽奖码Id + Mark string `json:"mark" bson:"mark"` // 备注 +} + +// 删除活动抽奖码 请求数据 +type DelLotteryCodeReq struct { + LotteryCodeId primitive.ObjectID `json:"lotteryCodeId" binding:"required"` // 唯一ID +} + +// 活动抽奖码列表 请求数据 +type LotteryCodeListReq struct { + common.Page + LotteryCode *string `json:"lotteryCode" form:"lotteryCode"` // 抽奖码 + ActId *string `json:"actId" form:"actId"` // 所属活动的ID + ActName *string `json:"actName" form:"actName"` // 活动名称 + UserIp *string `json:"userIp" form:"userIp"` // 抽奖者IP + IsUsed *bool `json:"isUsed" form:"isUsed"` // 抽奖码是否已使用 + GiftCode *string `json:"giftCode" form:"giftCode"` // 奖品兑换码 +} + +// 活动抽奖码列表 返回数据 +type LotteryCodeListResp struct { + Total int64 `json:"total" bson:"total"` // 数量 + List activitymod.LottertyCodeInfoList `json:"list" bson:"list"` // 活动抽奖码列表 +} + +// 活动奖品列表 请求数据 +type GiftListReq struct { + common.Page + ActId *string `json:"actId" form:"actId"` // 所属活动的ID + GiftName *string `json:"giftName" form:"giftName"` // 奖品名称 + GiftDesc *string `json:"giftDesc" form:"giftDesc"` // 奖品描述 + Rate *int32 `json:"rate" form:"rate"` // 备注 +} + +// 活动奖品列表 返回数据 +type GiftListResp struct { + Total int64 `json:"total" bson:"total"` // 数量 + List []*GiftInfo `json:"list" bson:"list"` +} + +type GiftInfo struct { + Id primitive.ObjectID `json:"id" bson:"_id"` // 唯一ID + ActId string `json:"actId" bson:"actId"` // 所属活动的ID + ActName string `json:"actName" bson:"actName"` // 所属活动的名称 + GiftName string `json:"giftName" bson:"giftName"` // 奖品名称 + GiftDesc string `json:"giftDesc" bson:"giftDesc"` // 奖品描述 + Rate int32 `json:"rate" bson:"rate"` // 备注 + Sort int32 `json:"sort" bson:"sort"` // 排序 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` + GiftNum int64 `json:"giftNum" bson:"giftNum"` // 抽奖码总数量 + ReceivedGiftNum int64 `json:"receivedGiftNum" bson:"receivedGiftNum"` // 抽奖码已使用数量 +} + +// 添加活动奖品 请求数据 +type AddGiftReq struct { + ActId primitive.ObjectID `json:"actId" bson:"actId" binding:"required"` // 所属活动的ID + GiftName string `json:"giftName" bson:"giftName"` // 奖品名称 + GiftDesc string `json:"giftDesc" bson:"giftDesc"` // 奖品描述 + Sort int32 `json:"sort" bson:"sort"` // 排序 + Rate int32 `json:"rate" bson:"rate"` // 中奖率 +} + +// 更新活动奖品 请求数据 +type UpdateGiftReq struct { + Id primitive.ObjectID `json:"id" bson:"_id" binding:"required"` // 奖品唯一ID + ActId *string `json:"actId" bson:"actId,omitempty" binding:"required"` // 所属活动的ID + ActName *string `json:"actName" bson:"actName,omitempty"` // 所属活动的名称 + GiftName *string `json:"giftName" bson:"giftName,omitempty"` // 奖品名称 + GiftDesc *string `json:"giftDesc" bson:"giftDesc,omitempty"` // 奖品描述 + Rate *int32 `json:"rate" bson:"rate,omitempty"` // 中奖率 + Sort *int32 `json:"sort" bson:"sort,omitempty"` // 排序 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` +} + +// 删除活动奖品 请求数据 +type DelGiftReq struct { + Id primitive.ObjectID `json:"id" binding:"required"` // 奖品唯一ID +} + +// 生成奖品兑换码 请求数据 +type GenGiftCodeRes struct { + GiftId primitive.ObjectID `json:"giftId" bson:"giftId"` // 奖品唯一ID + CodeNum int32 `json:"codeNum" bson:"codeNum"` // 生成奖品兑换码的数量 + CodeLen int32 `json:"codeLen" bson:"codeLen"` // 生成奖品兑换码的长度 +} + +// 奖品兑换详情列表 请求数据 +type GetGiftInfoReq struct { + common.Page + LotteryCode *string `json:"lotteryCode" form:"lotteryCode"` // 抽奖码 + ActId *string `json:"actId" form:"actId"` // 所属活动的ID + ActName *string `json:"actName" form:"actName"` // 所属活动的名称 + GiftId *string `json:"giftId" form:"giftId"` // 所属活动奖品的ID + GiftName *string `json:"giftName" form:"giftName"` // 奖品名称 + UserId *string `json:"userId" form:"userId"` // 兑换者Id + AppName *string `json:"appName" form:"appName"` // 所属app的名字 + IsGaveOut *bool `json:"isGaveOut" form:"isGaveOut"` // 兑换码是否已发放 + IsUsed *bool `json:"isUsed" form:"isUsed"` // 奖品兑换码是否已使用 + GiftCode *string `json:"giftCode" form:"giftCode"` // 奖品兑换码 +} + +// 奖品兑换详情列表 返回数据 +type GetGiftInfoResp struct { + Total int64 `json:"total" bson:"total"` // 数量 + List activitymod.LotteryGetGiftList `json:"list" bson:"list"` +} + +// 删除兑换详情 请求数据 +type DelGetGiftReq struct { + Id primitive.ObjectID `json:"id" binding:"required"` // 兑换详情唯一ID +} + +// 更新活动奖品兑换详情 请求数据 +type UpdateGetGiftReq struct { + Id primitive.ObjectID `json:"id" binding:"required"` // 奖品唯一ID + UserId *string `json:"userId"` // 兑换者Id + AppName *string `json:"appName"` // 所属app的名字 + Remark *string `json:"remark"` // 备注 + GiftCode string `json:"giftCode" binding:"required"` // 奖品兑换码 +} + +// h5活动信息 请求数据 +type ActivityInfoReq struct { + ActId primitive.ObjectID `json:"actId" bson:"actId"` // 活动ID +} + +type ActivityInfoResp struct { + Id primitive.ObjectID `json:"id" bson:"_id"` // 唯一ID + Name string `json:"name" bson:"name"` // 活动名称 + Desc string `json:"desc" bson:"desc"` // 活动说明 + H5Domain string `json:"h5Domain" bson:"h5Domain"` // 活动H5地址 + GiftDesc string `json:"giftDesc" bson:"giftDesc"` // 奖励说明 + Enable bool `json:"enable" bson:"enable"` // 活动开关 + StartTime time.Time `json:"startTime" bson:"startTime"` // 活动开始时间 + EndTime time.Time `json:"endTime" bson:"endTime"` // 活动结束时间 + Banner []activitymod.BannerInfo `json:"banner" bson:"banner"` // banner列表 +} + +// h5活动奖品信息 请求数据 +type ActivityGiftInfoReq struct { + ActId string `json:"actId" binding:"required"` // 活动ID +} + +// h5活动奖品信息 返回数据 +type ActivityGiftInfoResp struct { + Count int64 `json:"count" bson:"count"` // 奖品总数 + List []*H5GiftInfo `json:"list" bson:"list"` +} + +type H5GiftInfo struct { + Id string `json:"id" bson:"_id"` // 奖品ID + GiftName string `json:"giftName" bson:"giftName"` // 奖品名称 +} + +// h5抽奖 请求数据 +type DrawReq struct { + Ip string `json:"ip" binding:"required"` // 用户IP + ActId primitive.ObjectID `json:"actId" binding:"required"` // 活动ID + LotteryCode string `json:"lotteryCode" binding:"required"` // 抽奖码 +} + +// h5抽奖 返回数据 +type DrawResp struct { + GiftCode string `json:"giftCode" bson:"giftCode"` // 奖品兑换码 + GiftId string `json:"giftId" bson:"giftId"` // 奖品ID + GiftName string `json:"giftName" bson:"giftName"` // 奖品名称 +} + +type ActivityVisitCountReq struct { + AppId int32 `from:"appId" json:"appId"` //AppID + Ip string `from:"ip" json:"ip"` //ip + Domain string `from:"domain" json:"domain"` //落地页域名 + CH string `from:"ch" json:"ch"` //渠道号 + ActivityId primitive.ObjectID `json:"activityId"` //活动ID + ActivityName string `json:"activityName"` //活动名字 +} + +type ActivityVisitCountListReq struct { + common.Page + ActivityId *string `json:"activityId" form:"activityId"` // 活动ID + AppId *int32 `json:"appId" form:"appId"` // AppID + CH *string `json:"ch" form:"ch"` // 渠道名字 +} + +type ActivityVisitListResp struct { + Total int64 `json:"total" bson:"total"` // 数量 + List []*ActivityVisitInfo `json:"list" bson:"list"` // 活动信息列表 +} + +type ActivityVisitInfo struct { + AppId int32 `json:"appId"` // appId + CH string `json:"ch"` // 商区序列 + IP string `json:"ip"` // 用户IP + DevType string `json:"devType"` // 设备类型 + SysType string `json:"sysType"` // 系统类型 + PeerIP string `json:"peerIP"` // 网站IP + ActivityId string `json:"activityId"` // 活动Id + ActivityName string `json:"activityName"` // 活动名字 + CreatedAt time.Time `json:"createdAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} diff --git a/api/proto/admin.go b/api/proto/admin.go new file mode 100644 index 0000000..6186fc9 --- /dev/null +++ b/api/proto/admin.go @@ -0,0 +1,75 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 管理员登陆请求 +type AdminLoginReq struct { + Account *string `form:"account" json:"account" binding:"required"` // 账号 + Password *string `form:"password" json:"password" binding:"required"` // 密码 +} + +// 管理员验证请求 +type AdminVerifyReq struct { + Account *string `form:"account" json:"account" binding:"required"` // 账号 + VerifyCode *string `form:"verifyCode" json:"verifyCode" binding:"required"` // 验证码 +} + +// 管理员登陆响应 +type AdminLoginRes struct { + Account string `json:"account"` // 用户名 + Token string `json:"token"` // token + Name string `json:"name"` // 名称 + RoleInfo RoleInfo `json:"roleInfo"` // 角色信息 +} + +// 请求管理员列表 +type AdminListReq struct { + common.Page + BlocRole *int `json:"blocRole"` // 角色 +} + +type AdminInfo struct { + Account string `json:"account"` // 账号 + Password string `json:"password"` // 密码 + Name string `json:"name"` // 名称 + RoleId int64 `json:"roleId"` // 角色 + Role string `json:"role"` // 角色 + MerchantId string `json:"merchantId"` // 商人id + CreatedAt time.Time `json:"createdAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 + LastTime time.Time `json:"lastTime"` // 登录时间 +} + +// 响应管理员列表 +type AdminListRes struct { + Total int64 `json:"total"` + List []AdminInfo `json:"list"` +} + +// 新增管理员账号 +type AddAdminReq struct { + Account *string `form:"account" json:"account" binding:"required"` // 账号(唯一) + Password *string `form:"password" json:"password" binding:"required"` // 密码 + Name *string `form:"name" json:"name" binding:"required"` // 名称 + RoleId *int64 `form:"roleId" json:"roleId" binding:"required"` // 角色id + MerchantId *string `form:"merchantId" json:"merchantId" binding:"omitempty"` // 商人id + BlocRole *int `json:"blocRole"` // 角色 +} + +// 更新管理员信息 +type UpdateAdminReq struct { + Account *string `form:"account" json:"account" binding:"required"` // 用户名 + Password *string `form:"password" json:"password" binding:"omitempty"` // 密码 + Name *string `form:"name" json:"name" binding:"omitempty"` // 名称 + RoleId *int64 `form:"roleId" json:"roleId" binding:"omitempty"` // 角色id + Status *int64 `form:"status" json:"status" binding:"omitempty"` // 状态 + MerchantId *string `form:"merchantId" json:"merchantId" binding:"omitempty"` // 商人id + BlocRole *int `json:"blocRole"` // 角色 +} + +type DelAdminReq struct { + Account *string `form:"account" json:"account" binding:"required"` // 用户id +} diff --git a/api/proto/advertise.go b/api/proto/advertise.go new file mode 100644 index 0000000..30806e0 --- /dev/null +++ b/api/proto/advertise.go @@ -0,0 +1,127 @@ +package proto + +import ( + "stat/common" + "stat/models/advertiseMod" + "time" +) + +// 广告位置列表请求 +type ListAdsReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId,过滤条件 + IsActive *bool `form:"isActive" json:"isActive" binding:"omitempty"` // appId,过滤条件 + LocId *int32 `json:"locId"` // 位置id + common.Page + Link *string `form:"link" json:"link"` // 链接地址 + Title *string `form:"title" json:"title"` // 广告标题 + DaoLiangTitle *string `json:"daoLiangTitle"` // 广告导量标题 +} + +type ListAdsRes struct { + Total int64 `json:"total"` + List []AdsInfo `json:"list"` +} + +type LinkInfo struct { + Link string `json:"link"` // 链接地址 + Foreign bool `json:"foreign"` // true 国外用户 + Weight int `json:"weight"` // 权重 +} + +type AdsInfo struct { + Id int64 `json:"id"` // 广告id + AppId int32 `json:"appId"` // 应用id + AppName string `json:"appName"` // 应用名称 + Title string `json:"title"` // 广告标题 + DaoLiangTitle string `json:"daoLiangTitle"` // 广告导量标题 + Tags []string `json:"tags"` // 广告标签 + CoverImg string `json:"coverImg"` // 封面 + VisibleChannels []string `json:"visibleChannels"` // 可见的渠道 + LocId int32 `json:"locId"` // 位置id + ImgSizeDesc string `json:"imgSizeDesc"` // 图片尺寸 + LocName string `json:"locName"` // 位置名称 + Links []LinkInfo `json:"links"` // 链接地址 + Sort int64 `json:"sort"` // 排序值--优先级 + IsActive bool `json:"isActive"` // 是否激活 + StartTime time.Time `json:"startTime"` // 开始时间 + EndTime time.Time `json:"endTime"` // 结束时间 + Remark string `json:"remark"` // 备注 + ClickCount int64 `json:"clickCount"` // 点击次数 + AmbientColor string `json:"ambientColor"` // 氛围色 + CreatedAt time.Time `json:"createAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} + +// 添加广告请求 +type AddAdsReq struct { + AppId int32 `form:"appId" json:"appId"` // 应用id + Title string `form:"title" json:"title" ` // 广告标题 + Tags string `form:"tags" json:"tags" ` // 广告标签 + CoverImg string `form:"coverImg" json:"coverImg"` // 封面 + LocId int32 `form:"locId" json:"locId"` // 位置id + Sort int64 `form:"sort" json:"sort"` // 排序值--优先级 + IsActive bool `form:"isActive" json:"isActive"` // 是否激活 + Links []LinkInfo `form:"links" json:"links"` // 链接地址 + StartTime time.Time `form:"startTime" json:"startTime" ` // 开始时间 + EndTime time.Time `form:"endTime" json:"endTime"` // 结束时间 + Remark string `form:"remark" json:"remark"` // 备注 + AmbientColor string `form:"ambientColor" json:"ambientColor"` // 氛围色 +} + +// 更新广告请求 +type UpdateAdsReq struct { + Id *int64 `form:"id" json:"id" binding:"omitempty"` // 广告id + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // 应用id + Title *string `form:"title" json:"title" binding:"omitempty"` // 广告标题 + DaoLiangTitle *string `form:"daoLiangTitle" json:"daoLiangTitle" binding:"omitempty"` // 广告导量标题 + Tags *string `form:"tags" json:"tags" binding:"omitempty"` // 广告标签 + CoverImg *string `form:"coverImg" json:"coverImg" binding:"omitempty"` // 封面 + VisibleChannels *string `form:"visibleChannels" json:"visibleChannels" binding:"omitempty"` // 可见的渠道,可输入多个渠道,用英文逗号","分隔开 + Location *int64 `form:"locId" json:"locId" binding:"omitempty"` // 位置 + JumpType *advertiseMod.JumpType `form:"jumpType" json:"jumpType" binding:"omitempty"` // 跳转方式 0:外部浏览器跳转 1:内部浏览器跳转 2:app内部跳转 + Links *[]LinkInfo `form:"links" json:"links" binding:"omitempty"` // 链接地址 + Sort *int64 `form:"sort" json:"sort" binding:"omitempty"` // 排序值--优先级 + IsActive *bool `form:"isActive" json:"isActive" binding:"omitempty"` // 是否激活 + StartTime *time.Time `form:"startTime" json:"startTime" binding:"omitempty"` // 开始时间s + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 结束时间 + Remark *string `form:"remark" json:"remark" binding:"omitempty"` + AmbientColor *string `form:"ambientColor" json:"ambientColor" binding:"omitempty"` //氛围色 +} + +// 删除广告请求 +type DelAdsReq struct { + Id *int64 `form:"id" json:"id" binding:"required"` // 应用id +} + +// 外部获取广告 +type AdvertiseReq struct { + AppId int32 `form:"appId" json:"appId" binding:"required"` // 应用id + LocId *int32 `form:"locId" json:"locId" binding:"omitempty"` // 位置id + UserId *uint64 `form:"userId" json:"userId" binding:"omitempty"` // 用户ID + IP *string `form:"ip" json:"ip" binding:"omitempty"` // 用户IP +} + +type AdvertiseRes struct { + AdvertiseList []*AdvertiseInfo `json:"advertiseList"` // 广告列表 +} + +// 外部广告信息 +type AdvertiseInfo struct { + Id int64 `json:"id"` // 广告id + Title string `json:"title"` // 广告标题 + CoverImg string `json:"coverImg"` // 封面 + LocId int32 `json:"locId"` // 位置id + JumpType advertiseMod.JumpType `json:"jumpType"` // 跳转方式 0:外部浏览器跳转 1:内部浏览器跳转 2:app内部跳转 + Link string `json:"link"` // 链接地址 + Sort int64 `json:"sort"` // 排序 + Tags string `json:"tags"` // 标签 + Remark string `json:"remark"` // 备注描述 + AmbientColor string `json:"ambientColor"` // 氛围色(逼哩漫画) + Type int // 0:系统 1:渠道 +} + +// 广告点击请求 +type AdsClickReq struct { + Id *int64 `from:"id" json:"id" binding:"required"` // 广告id + AppId *int32 `from:"appId" json:"appId" binding:"required"` // 应用id +} diff --git a/api/proto/advertiseLoc.go b/api/proto/advertiseLoc.go new file mode 100644 index 0000000..10e3a6e --- /dev/null +++ b/api/proto/advertiseLoc.go @@ -0,0 +1,53 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 广告位置列表请求 +type ListAdsLocReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId,过滤条件 + common.Page +} + +type ListAdsLocRes struct { + Total int64 `json:"total"` + List []AdsLocInfo `json:"list"` +} + +type AdsLocInfo struct { + Id int64 `json:"id"` // 唯一id + AppId int32 `json:"appId"` // 应用id + AppName string `json:"appName"` // 应用名称 + LocId int32 `json:"locId"` // 位置id + Name string `json:"name"` // 位置名称 + ImgSizeDesc string `json:"imgSizeDesc"` // 图片尺寸描述 + Remark string `json:"remark"` // 备注 + CreatedAt time.Time `json:"createAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} + +// 添加广告位置信息请求 +type AddAdsLocReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"required"` // 应用Id + LocId *int32 `form:"locId" json:"locId" binding:"required"` // 位置id + Name *string `form:"name" json:"name" binding:"required"` // 位置名称 + ImgSizeDesc string `form:"imgSizeDesc" json:"imgSizeDesc" binding:"omitempty"` // 图片尺寸描述 + Remark string `form:"remark" json:"remark" binding:"omitempty"` // 备注 +} + +// 更新广告位置信息请求 +type UpdateAdsLocReq struct { + Id *int64 `form:"id" json:"id" binding:"required"` // id + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // 应用id + LocId *int32 `form:"locId" json:"locId" binding:"omitempty"` // 位置id + Name *string `form:"name" json:"name" binding:"omitempty"` // 位置名称 + ImgSizeDesc *string `form:"imgSizeDesc" json:"imgSizeDesc" binding:"omitempty"` // 图片尺寸描述 + Remark *string `form:"remark" json:"remark" binding:"omitempty"` // 备注 +} + +// 删除广告位置信息请求 +type DelAdsLocReq struct { + Id *int64 `form:"id" json:"id" binding:"required"` // 应用id +} diff --git a/api/proto/announ.go b/api/proto/announ.go new file mode 100644 index 0000000..d80a4cd --- /dev/null +++ b/api/proto/announ.go @@ -0,0 +1,85 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 公告列表请求 +type ListAnnounReq struct { + AppId *int32 `json:"appId"` // 应用id 筛选条件 + common.Page +} + +// 公告列表响应 +type ListAnnounRes struct { + Total int64 `json:"total"` + List []AnnounInfo `json:"list"` +} + +// 公告信息 +type AnnounInfo struct { + ID string `json:"id"` // 公告id + AppId int32 `json:"appId"` // 应用id + AppName string `json:"appName"` // 应用名称 + Title string `json:"title"` // 公告标题 + Content string `json:"content"` // 公告内容 + Cover string `json:"cover"` // 公告封面图 + Href string `json:"href"` // 公告跳转地址 + Type int `json:"type"` // 公告类型 0,外部连接;1,直接安装app + Active bool `json:"active"` // 是否激活 + StartTime time.Time `json:"startTime"` // 开始时间 + EndTime time.Time `json:"endTime"` // 结束时间 +} + +// 添加公告 +type AddAnnounReq struct { + AppId *int32 `from:"appId" json:"appId" binding:"required"` // 应用id + Title *string `from:"title" json:"title" binding:"required"` // 公告标题 + Content *string `from:"content" json:"content" binding:"required"` // 公告内容 + Cover *string `from:"cover" json:"cover" binding:"omitempty"` // 公告封面图 + Href *string `from:"href" json:"href" binding:"omitempty"` // 公告跳转地址 + Type *int `from:"type" json:"type" binding:"required"` // 公告类型 0,外部连接;1,直接安装app + Active *bool `from:"active" json:"active" binding:"required"` // 是否激活 + StartTime *time.Time `from:"startTime" json:"startTime" binding:"required"` // 公告开始时间 + EndTime *time.Time `from:"endTime" json:"endTime" binding:"required"` // 公告结束时间 +} + +// 修改公告 +type UpdateAnnounReq struct { + Id *string `form:"id" json:"id" binding:"required"` // 公告id + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // 应用id + Title *string `form:"title" json:"title" binding:"omitempty"` // 公告标题 + Content *string `form:"content" json:"content" binding:"omitempty"` // 公告内容 + Cover *string `form:"cover" json:"cover" binding:"omitempty"` // 公告封面图 + Href *string `form:"href" json:"href" binding:"omitempty"` // 公告跳转地址 + Type *int `form:"type" json:"type" binding:"omitempty"` // 公告类型 0,外部连接;1,直接安装app + Active *bool `from:"active" json:"active" binding:"omitempty"` // 是否激活 + StartTime *time.Time `from:"startTime" json:"startTime" binding:"omitempty"` // 公告开始时间 + EndTime *time.Time `from:"endTime" json:"endTime" binding:"omitempty"` // 公告结束时间 +} + +// 删除公告 +type DelAnnounReq struct { + Id *string `json:"id" binding:"required"` // 公告id +} + +// 外部获取公告请求 +type AnnouncementReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"required"` // 应用id +} + +// 外部获取公告响应 +type AnnouncementRes struct { + AnnounceList []AnnouncementInfo `json:"announceList"` // 公告列表 +} + +// 外部获取公告 +type AnnouncementInfo struct { + ID string `json:"id"` // 公告id + Title string `json:"title"` // 公告标题 + Content string `json:"content"` // 公告内容 + Cover string `json:"cover"` // 公告封面图 + Href string `json:"href"` // 公告跳转地址 + Type int `json:"type"` // 公告类型 0,外部连接;1,直接安装app +} diff --git a/api/proto/appInfo.go b/api/proto/appInfo.go new file mode 100644 index 0000000..b9a42b1 --- /dev/null +++ b/api/proto/appInfo.go @@ -0,0 +1,53 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 请求app列表 +type ListAppInfoReq struct { + AppName *string `form:"appName" json:"appName" binding:"omitempty"` // appId + Used *bool `form:"used" json:"used" binding:"omitempty"` // 渠道 + common.Page +} + +// 响应app列表 +type ListAppInfoRes struct { + Total int64 `json:"total"` + List []AppInfoRes `json:"list"` +} + +type AppInfoRes struct { + AppId int32 `json:"appId"` // appId,唯一id + Name string `json:"name"` // app名称 + LandPages []string `json:"landPages"` // 落地页列表 + IconImg string `json:"iconImg"` // 应用图标 + AdvertiseNum int64 `json:"advertiseNum"` // 广告系数 + AdvertiseNewNum int64 `json:"advertiseNewNum"` // 广告新增系数 + CreatedAt time.Time `json:"createdAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} + +// 添加app +type AddAppInfoReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"required"` // appId,唯一id + Name *string `form:"name" json:"name" binding:"required"` // app名称 + IconImg *string `form:"iconImg" json:"iconImg" binding:"required"` // 应用图标 + // LandPages *[]string `form:"landPages" json:"landPages" binding:"required"` // 落地页列表 +} + +// 修改app +type UpdateAppInfoReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"required"` // appId,唯一id + Name *string `form:"name" json:"name" binding:"omitempty"` // app名称 + IconImg *string `form:"iconImg" json:"iconImg" binding:"omitempty"` // 应用图标 + AdvertiseNum *int64 `form:"advertiseNum" json:"advertiseNum" binding:"omitempty"` // 广告系数 + AdvertiseNewNum *int64 `form:"advertiseNewNum" json:"advertiseNewNum" binding:"omitempty"` // 广告新增系数 + LandPages *[]string `form:"landPages" json:"landPages" binding:"omitempty"` // 落地页列表 +} + +// 删除app +type DelAppInfoReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"required"` // appId,唯一id +} diff --git a/api/proto/application.go b/api/proto/application.go new file mode 100644 index 0000000..747ab17 --- /dev/null +++ b/api/proto/application.go @@ -0,0 +1,108 @@ +package proto + +import ( + "stat/common" + "stat/models/applicationmod" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// DelAppReq +type DelAppReq struct { + Id primitive.ObjectID `json:"id"` +} + +type GetApplicationsReq struct { + Id *string `json:"id" bson:"_id"` + ParentAppId *int64 `json:"parentAppId" bson:"parentAppId"` //所属appId + Name *string `json:"name" bson:"name"` //应用名 + DaoLiangTitle *string `bson:"daoLiangTitle"` // 广告导量标题 + //Tag *common.AppReqType `json:"tag" bson:"tag"` //标签 + Status *bool `json:"status" bson:"status"` //状态 + Category *int64 `json:"category" bson:"category"` //分类ID + PageNum int64 `json:"pageNum"` // 分页参数 + PageSize int64 `json:"pageSize" binding:"required"` // 分页参数 + LocIds []int32 `json:"locIds"` // 位置id + + DownloadUrl *string `json:"download_url"` //下载地址 + IosUrl *string `json:"iosUrl"` //ios链接 + AndroidUrl *string `json:"androidUrl"` //安卓链接 + IsHighQuality *bool `json:"isHighQuality"` // 是否是优质APP推荐 +} + +type GetApplicationsResp struct { + List applicationmod.ApplicationList `json:"list"` + Total int64 `json:"total"` +} + +type AppCategoryInfo struct { + Id int64 `json:"id"` // 分类ID + Name string `json:"name" bson:"name"` // 名称 + Applications CenterApplicationList `json:"applications" bson:"applications"` // 分类app列表 +} + +type ApplicationClickReq struct { + Id string `from:"id" json:"id" binding:"required"` // applicationid +} + +// 应用中心 +type CenterApplication struct { + Id primitive.ObjectID `json:"id" bson:"_id"` + AppId int64 `json:"appId" bson:"appId"` //appId + ParentAppId int64 `json:"parentAppId" bson:"parentAppId"` //所属appId + Name string `json:"name" bson:"name"` //应用名 + Tag int32 `json:"tag" bson:"tag"` //标签 + Internal bool `json:"internal" bson:"internal"` //是否内部应用 + Categories []*common.CategoryRank `json:"categories" bson:"categories"` //分类排序 + Desc string `json:"desc" bson:"desc"` //描述 + DownloadUrl string `json:"download_url" bson:"download_url"` //下载地址 + IosUrl string `json:"iosUrl" bson:"iosUrl"` //ios链接 + AndroidUrl string `json:"androidUrl" bson:"androidUrl"` //安卓链接 + Avatar string `json:"avatar" bson:"avatar"` //头像图片 + Status bool `json:"status" bson:"status"` //状态 + Rank int64 `json:"rank" bson:"rank"` //默认排序 + Total int64 `json:"total" bson:"total"` //总点击 + CreatedId int64 `json:"created_id" bson:"created_id"` //创建人 + UpdatedId int64 `json:"updated_id" bson:"updated_id"` //最后更新人 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //创建时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //更新时间 + NineShow bool `json:"nineShow" bson:"nineShow"` //是否九宫格 + RecreationShow bool `json:"recreationShow" bson:"recreationShow"` //是否娱乐中心显示 + IsRecommend bool `json:"isRecommend" bson:"isRecommend"` //是否推荐 + IsGame bool `json:"isGame" bson:"isGame"` //是否游戏 + HomeShow bool `json:"homeShow" bson:"homeShow"` //是否首页展示 + LocIds []int64 `json:"locIds" bson:"locIds"` //位置id + SmallImg string `json:"smallImg" bson:"smallImg"` // 小图标 + BigImg string `json:"bigImg" bson:"bigImg"` // 大图标 + IsHighQuality bool `json:"isHighQuality" bson:"isHighQuality"` // 是否是优质APP推荐 + HighQualityType int64 `json:"highQualityType" bson:"highQualityType"` // 优质APP推荐展示方式 0:应用图标 1:展示描述文字 +} + +type CenterApplicationList []*CenterApplication + +// 外部获取app +type CenterApplicationReq struct { + ParentAppId int64 `json:"parentAppId" binding:"required"` // 所属应用appId + LocId *int32 `json:"locId"` // 位置id + UserId *uint64 `json:"userId"` // 用户ID +} + +type CenterAppCategory struct { + Id int64 `json:"id" bson:"_id,omitempty"` + ParentAppId int64 `json:"parentAppId" bson:"parentAppId"` + Name string `json:"name" bson:"name"` // 名称 + Desc string `json:"desc" bson:"desc"` // 描述 + Status bool `json:"status" bson:"status"` // 状态 + Rank int64 `json:"rank" bson:"rank"` // 应用排序 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 更新时间 + ImgType int64 `json:"imgType" bson:"imgType"` // 图片展示类型 0:应用图标 1.小图标 2.大图标 +} + +type CenterAppCategoryList []*CenterAppCategory + +type CenterApplicationRes struct { + List CenterApplicationList `json:"list"` // 应用列表 + AppCategoryList CenterAppCategoryList `json:"appCategoryList"` // 列表 +} diff --git a/api/proto/applicationLoc.go b/api/proto/applicationLoc.go new file mode 100644 index 0000000..c21440c --- /dev/null +++ b/api/proto/applicationLoc.go @@ -0,0 +1,53 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 广告位置列表请求 +type ListAppLocReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId,过滤条件 + common.Page +} + +type ListAppLocRes struct { + Total int64 `json:"total"` + List []AppLocInfo `json:"list"` +} + +type AppLocInfo struct { + Id int64 `json:"id"` // 唯一id + AppId int32 `json:"appId"` // 应用id + AppName string `json:"appName"` // 应用名称 + LocId int32 `json:"locId"` // 位置id + Name string `json:"name"` // 位置名称 + ImgSizeDesc string `json:"imgSizeDesc"` // 图片尺寸描述 + Remark string `json:"remark"` // 备注 + CreatedAt time.Time `json:"createAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} + +// 添加广告位置信息请求 +type AddAppLocReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"required"` // 应用Id + LocId *int32 `form:"locId" json:"locId" binding:"required"` // 位置id + Name *string `form:"name" json:"name" binding:"required"` // 位置名称 + ImgSizeDesc string `form:"imgSizeDesc" json:"imgSizeDesc" binding:"omitempty"` // 图片尺寸描述 + Remark string `form:"remark" json:"remark" binding:"omitempty"` // 备注 +} + +// 更新广告位置信息请求 +type UpdateAppLocReq struct { + Id *int64 `form:"id" json:"id" binding:"required"` // id + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // 应用id + LocId *int32 `form:"locId" json:"locId" binding:"omitempty"` // 位置id + Name *string `form:"name" json:"name" binding:"omitempty"` // 位置名称 + ImgSizeDesc *string `form:"imgSizeDesc" json:"imgSizeDesc" binding:"omitempty"` // 图片尺寸描述 + Remark *string `form:"remark" json:"remark" binding:"omitempty"` // 备注 +} + +// 删除广告位置信息请求 +type DelAppLocReq struct { + Id *int64 `form:"id" json:"id" binding:"required"` // 应用id +} diff --git a/api/proto/authority.go b/api/proto/authority.go new file mode 100644 index 0000000..612659b --- /dev/null +++ b/api/proto/authority.go @@ -0,0 +1,38 @@ +package proto + +import ( + "stat/common" + "time" +) + +type RoleListReq struct { + common.Page +} + +type RoleInfo struct { + RoleId int64 `json:"roleId"` // id + Role string `json:"role"` // 角色 + AuthJson string `json:"authJson"` // 权限json数据 + CreatedAt time.Time `json:"createdAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt"` // 修改时间 +} + +type RoleListRes struct { + Total int64 `json:"total"` + List []RoleInfo `json:"list"` +} + +type AddRoleReq struct { + Role *string `form:"role" json:"role" binding:"required"` // 角色 + AuthJson *string `form:"authJson" json:"authJson" binding:"required"` // 权限json数据 +} + +type UpdateRoleReq struct { + RoleId *int64 `form:"roleId" json:"roleId" binding:"required"` // id + Role *string `form:"role" json:"role" binding:"omitempty"` // 角色 + AuthJson *string `form:"authJson" json:"authJson" binding:"omitempty"` // 权限json数据 +} + +type DelRoleReq struct { + RoleId *int64 `form:"roleId" json:"roleId" binding:"required"` // id +} diff --git a/api/proto/bill.go b/api/proto/bill.go new file mode 100644 index 0000000..f5cb0df --- /dev/null +++ b/api/proto/bill.go @@ -0,0 +1,43 @@ +package proto + +// 发起提现 +type AgentWithdraw struct { + Mobile string `form:"mobile" json:"mobile" binding:"required"` //手机号 + Captcha string `form:"captcha" json:"captcha" binding:"required"` //验证码 + PayMentAct string `form:"act" json:"act" binding:"required"` //交易账户 + PayMentName string `form:"actName" json:"actName" binding:"required"` //交易账户持有人 + PaymentMethod string `form:"paymentMethod" json:"paymentMethod" binding:"required"` //提现方式,alipay,bankcard,USDT + Yuan float64 `form:"yuan" json:"yuan" binding:"required,min=100"` //提现金额 + WithdrawType int `form:"withdrawType" json:"withdrawType"` //提现类型 1:财务转账 0:提现 + AppId int32 `form:"appId" json:"appId" binding:"required"` //所选APP +} + +// 提现审核 +type WithdrawAllow struct { + ID string `json:"id"` //订单id + Allow bool `json:"allow"` //true:允许 false:拒绝 + StatusDesc string `json:"statusDesc"` //描述 +} + +type TransStatus int + +const ( + Transferred TransStatus = 1 //已转账 + TransRefund TransStatus = 2 //转账被拒绝 +) + +// 财务转账回执 +type FinancialReceipt struct { + ID string `form:"id" json:"id" binding:"required"` //ID + TransState TransStatus `form:"transState" json:"transState" binding:"required"` //转账状态 1:已转账 2:转账被拒绝 + Remark string `form:"remark" json:"remark"` //备注 +} + +// ExchgBack 回掉结构体 +type ExchgBack struct { + OID string `json:"oid" binding:"required"` //支付平台订单号 + Money int64 `json:"money" binding:"required"` //兑换金额 + TradeNo string `json:"tradeNo" binding:"required"` //商户订单号 + Status string `json:"status"` //200成功 + Mark string `json:"mark"` //拒绝兑换理由 +} diff --git a/api/proto/blocDailyStat.go b/api/proto/blocDailyStat.go new file mode 100644 index 0000000..c52942a --- /dev/null +++ b/api/proto/blocDailyStat.go @@ -0,0 +1,88 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 日常统计列表请求 +type ListBlocDailyStatReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId + StartTime *time.Time `form:"startTime" json:"startTime"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 结束时间 + common.Page +} + +type ListBlocDailyStatRes struct { + Total int64 `json:"total"` + TotalInfo BlocDailyStatInfo `json:"totalInfo"` + List []BlocDailyStatInfo `json:"list"` +} + +type BlocDailyStatInfo struct { + SumDate time.Time `json:"sumDate"` // 记录时间 按天对齐 + AppId int32 `json:"appId"` // appId + AppName string `json:"appName"` // app名称 + TotalVisitCount int64 `json:"totalVisitCount"` // 日活 + TotalNewCount int64 `json:"totalNewCount"` // 新增 + TotalAmount int64 `json:"totalAmount"` // 总充值 + ARPU int64 `json:"ARPU"` // 人均充值 + ARPPU int64 `json:"ARPPU"` // 付费用户人均充值 + NewDirectCount int64 `json:"newDirectCount"` // 新增直推 + NewFissionCount int64 `json:"newFissionCount"` // 新增裂变 + DirectVisitCount int64 `json:"directVisitCount"` // 直推访问数 + FissionVisitCount int64 `json:"fissionVisitCount"` // 裂变访问数 + Day1RetainRate float64 `json:"day1RetainRate"` // 次日留存率 + Day3RetainRate float64 `json:"day3RetainRate"` // 3日留存率 + Day7RetainRate float64 `json:"day7RetainRate"` // 7日留存率 + DirectAmount int64 `json:"directAmount"` // 直推充值金额 + FissionAmount int64 `json:"fissionAmount"` // 裂变充值金额 + NewRechargeCount int64 `json:"newRechargeCount"` // 新增充值数 + NewRechargeAmount int64 `json:"newRechargeAmount"` // 新增充值金额 + OldRechargeAmount int64 `json:"oldRechargeAmount"` // 老用户充值金额 + DaichongAmout int64 `json:"daichongAmout"` // 代充充值金额 + OnlineAmount int64 `json:"onlineAmount"` // 在线充值金额 + NewRechargeRate float64 `json:"newRechargeRate"` // 新增充值率 + VisitRechargeRate float64 `json:"visitRechargeRate"` // 登陆充值率 + UserWithDrawAmount int64 `json:"userWithDrawAmount"` // 用户提现金额 + UserWithDrawPaymoneyAmount int64 `json:"userWithDrawPaymoneyAmount"` // 用户提现金额(实际到账) + GameRechageAmount int64 `json:"gameRechageAmount"` // 游戏充值 + GameWithdrawAmount int64 `json:"gameWithdrawAmount"` // 游戏提现 + TotalRechargeCount int64 `json:"totalRechargeCount"` // 总充值人数 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} + +type ListBlocDailyStatTotalReq struct { + StartTime *time.Time `form:"startTime" json:"startTime"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 结束时间 + common.Page +} + +type ListBlocDailyStatTotalRes struct { + Total int64 `json:"total"` + List []BlocDailyStatTotalInfo `json:"list"` +} + +type BlocDailyStatTotalInfo struct { + SumDate time.Time `json:"sumDate"` // 记录时间 按天对齐 + TotalVisitCount int64 `json:"totalVisitCount"` // 日活 + TotalNewCount int64 `json:"totalNewCount"` // 新增 + TotalAmount int64 `json:"totalAmount"` // 总充值 + NewDirectCount int64 `json:"newDirectCount"` // 新增直推 + NewFissionCount int64 `json:"newFissionCount"` // 新增裂变 + DirectVisitCount int64 `json:"directVisitCount"` // 直推访问数 + FissionVisitCount int64 `json:"fissionVisitCount"` // 裂变访问数 + DirectAmount int64 `json:"directAmount"` // 直推充值金额 + FissionAmount int64 `json:"fissionAmount"` // 裂变充值金额 + NewRechargeCount int64 `json:"newRechargeCount"` // 新增充值数 + NewRechargeAmount int64 `json:"newRechargeAmount"` // 新增充值金额 + OldRechargeAmount int64 `json:"oldRechargeAmount"` // 老用户充值金额 + DaichongAmout int64 `json:"daichongAmout"` // 代充充值金额 + OnlineAmount int64 `json:"onlineAmount"` // 在线充值金额 + UserWithDrawAmount int64 `json:"userWithDrawAmount"` // 用户提现金额 + UserWithDrawPaymoneyAmount int64 `json:"userWithDrawPaymoneyAmount"` // 用户提现金额(实际到账) + GameRechageAmount int64 `json:"gameRechageAmount"` // 游戏充值 + GameWithdrawAmount int64 `json:"gameWithdrawAmount"` // 游戏提现 + TotalRechargeCount int64 `json:"totalRechargeCount"` // 总充值人数 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} diff --git a/api/proto/blocStatDetails.go b/api/proto/blocStatDetails.go new file mode 100644 index 0000000..a779b4c --- /dev/null +++ b/api/proto/blocStatDetails.go @@ -0,0 +1,111 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 日常统计列表请求 +type ListBlocRegisterDetailsReq struct { + AppId *int32 `form:"appId" json:"appId"` // appId + StartTime *time.Time `form:"startTime" json:"startTime"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime"` // 结束时间 + common.Page +} + +type ListBlocRegisterDetailsRes struct { + Total int64 `json:"total"` + List []BlocRegisterDetailsInfo `json:"list"` +} + +type BlocRegisterDetailsInfo struct { + UserId string `json:"userId" bson:"userId"` // 用户ID + AppName string `json:"appName" bson:"appName"` // appID + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 安卓 IOS + DevType string `json:"devType" bson:"devType"` // 设备类型 + Mobile string `json:"mobile" bson:"mobile"` // 手机号 + IP string `json:"ip,omitempty" bson:"ip"` // IP + Name string `json:"name" bson:"name"` // 名称 + IsDirect bool `json:"isDirect" bson:"isDirect"` // true:直推用户 + RegisterTime time.Time `json:"registerTime" bson:"registerTime"` // 注册时间 +} + +// 日常统计列表请求 +type ListBlocRechargeDetailsReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId + StartTime *time.Time `form:"startTime" json:"startTime"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 结束时间 + common.Page +} + +type ListBlocRechargeDetailsRes struct { + Total int64 `json:"total"` + List []BlocRechargeDetailsInfo `json:"list"` +} + +type BlocRechargeDetailsInfo struct { + UserId string `json:"userId" bson:"userId"` // 用户ID + AppName string `json:"appName" bson:"appName"` // appID + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 安卓 IOS + DevType string `json:"devType" bson:"devType"` // 设备类型 + ChannelName string `json:"channelName" bson:"channelName"` // 支付渠道名字 + CID string `json:"cid" bson:"cid"` // 渠道id + Type string `bson:"type" json:"type"` // 充值方式 + OrderId string `json:"orderId" bson:"orderId"` // 流水id + Money int64 `json:"money" bson:"money"` // 充值金额 订单金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` // 实际到账金额 用户实际支付金额 + Status int `json:"status" bson:"status"` // 3付款成功 + SuccessAt time.Time `json:"successAt,omitempty" bson:"successAt,omitempty"` // 成功时间 +} + +type ListBlocWithdrawDetailsReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId + StartTime *time.Time `form:"startTime" json:"startTime"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 结束时间 + common.Page +} + +type ListBlocWithdrawDetailsRes struct { + Total int64 `json:"total"` + List []ListBlocWithdrawDetailsInfo `json:"list"` +} + +type ListBlocWithdrawDetailsInfo struct { + UID string `json:"uid" bson:"uid"` //用户Id + Name string `json:"name" bson:"name"` //用户名 + AppName string `json:"appName" bson:"appName"` // appID + Amount int64 `json:"amount" bson:"amount"` //金币数量 + Money int64 `json:"money" bson:"money" binding:"required"` //提现金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` //实际到账 + PayType string `json:"payType" bson:"payType" binding:"required"` //提现方式,alipay,bankcard + OID string `json:"oid" bson:"oid"` //第三方支付平台id + ActName string `json:"actName" bson:"actName"` //交易账户持有人 + Act string `json:"act" bson:"act"` //交易账户 + UserIP string `json:"userIp" bson:"userIp"` //用户ip + DeviceType string `json:"deviceType" bson:"deviceType"` //设备类型 + DevID string `json:"devID" bson:"devID"` //设备id + Status int `json:"status" bson:"status"` //1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败 + StatusDesc string `json:"statusDesc" bson:"statusDesc"` //状态说明 + SuccessAt time.Time `json:"successAt" bson:"successAt"` //回调成功时间 + ReceivedAt time.Time `json:"receivedAt" bson:"receivedAt"` //到账时间 李秋山确认 三方出款时间 +} + +type ListBlocRechargeChannelReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId + StartTime *time.Time `form:"startTime" json:"startTime"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 结束时间 + ChannelName *string `form:"channelName" json:"channelName" binding:"omitempty"` // 渠道名称筛选 + common.Page +} + +type ListBlocRechargeChannelRes struct { + Total int64 `json:"total"` + List []ListBlocRechargeChannelInfo `json:"list"` +} + +type ListBlocRechargeChannelInfo struct { + SumDate time.Time `json:"sumDate"` // 记录时间 按天对齐 + ChannelName string `json:"channelName"` // 支付渠道名称 + BlocOrderMoney int64 `json:"blocOrderMoney"` // 订单金额 + BlocChannelRate int64 `json:"blocChannelRate"` // 费率 +} diff --git a/api/proto/channelAgent.go b/api/proto/channelAgent.go new file mode 100644 index 0000000..1c947cf --- /dev/null +++ b/api/proto/channelAgent.go @@ -0,0 +1,279 @@ +package proto + +import ( + "stat/common" + "stat/models/channelmod" + "time" +) + +type AgentLoginReq struct { + Account *string `form:"account" json:"account" binding:"required"` // 账号 + Password *string `form:"password" json:"password" binding:"required"` // 密码 + ImgCode string `form:"imgCode" json:"imgCode"` // 图片验证码 + ImgID string `form:"imgID" json:"imgID"` // 图片编号 +} + +type AgentLoginRes struct { + Token string `json:"token"` // token + Channel string `json:"channel"` // 渠道 + Detail *ChannelAgentInfo `json:"detail"` // 渠道详情 +} + +type AgentImgVerifyCode struct { + VerifyImg []byte `form:"verifyImg" json:"verifyImg"` // 验证码数据 + ImgId string `form:"imgId" json:"imgId"` // 验证码ID +} + +type AgentChannelInfoSearch struct { + ID *string `json:"id"` // ID + AppId *int32 `json:"appId"` // 渠道对应的appId + Type *channelmod.ChannelType `json:"Type"` // 渠道类型:1 一级 2:二级 + common.Page +} + +type ChannelAppInfoReq struct { + Channel string `bson:"channel" json:"channel"` // 渠道 +} +type ChannelAppInfo struct { + AppId int32 `bson:"appId" json:"appId"` // 应用ID + AppName string `bson:"appName" json:"appName"` // 应用名称 + LandingPage string `bson:"landingPage" json:"landingPage"` // 落地页 +} +type ChannelAppInfoResp struct { + List []ChannelAppInfo `bson:"list" json:"list"` +} + +type ChannelAgentInfo struct { + Channel string `bson:"channel" json:"channel"` // 渠道 + AppIds []int32 `bson:"appIds" json:"appIds"` // 渠道对应的app + UserName string `bson:"userName" json:"userName"` // 所有者 + ParentAgent string `bson:"parentAgent" json:"parentAgent"` // 父代理 + ChildCount int64 `bson:"childCount" json:"childCount"` // 子渠道数量 + Status bool `bson:"status" json:"status"` // 状态 开/关 + Mobile string `bson:"mobile" json:"mobile"` // 手机号 + Type channelmod.ChannelType `bson:"type" json:"type"` // 渠道类型:1 一级 2:二级 + Remark string `bson:"remark" json:"remark"` // 备注 + Lock bool `bson:"lock" json:"lock"` // 禁止登陆 + Settlement channelmod.SettlementWay `bson:"settlement" json:"settlement"` // 结算方式 cps/cpa/cpt/cpc + CPAPrice int64 `bson:"cpaPrice" json:"cpaPrice"` // 单价 + CPSRate int64 `bson:"cpsRate" json:"cpsRate"` // CPS 分成比列 0-100 + DivideRate int64 `bson:"divideRate" json:"divideRate"` // 分成比例 + ChildShowDivideRate bool `bson:"childShowDivideRate" json:"childShowDivideRate"` // 下级是否显示分成比例 + Wallet channelmod.Wallet `bson:"wallet" json:"wallet"` // 钱包地址 + AppType channelmod.AppType `bson:"appType" json:"appType"` // 应用类型 + PromoteMode channelmod.PromoteMode `bson:"promoteMode" json:"promoteMode"` // 推广类型 + CreatedAt time.Time `bson:"createdAt" json:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` // 更新时间 +} +type AgentChannelInfoSearchResp struct { + Total int64 `json:"total"` + List []ChannelAgentInfo `json:"list"` +} + +type AgentChannelRuleUpdate struct { + Channel string `bson:"channel" json:"channel"` // 渠道 + CPAPrice *int64 `bson:"cpaPrice" json:"cpaPrice"` // 单价 + CPSRate *int64 `bson:"cpsRate" json:"cpsRate"` // CPS 分成比列 0-100 + DivideRate *int64 `bson:"divideRate" json:"divideRate"` // 分成比例 + ChildShowDivideRate *bool `bson:"childShowDivideRate" json:"childShowDivideRate"` // 渠道:下级是否显示分成比例 + Remark *string `bson:"remark" json:"remark"` // 备注 +} + +type AgentChannelInfoUpdate struct { + Channel string `json:"channel"` // 渠道 + Mobile *string `json:"mobile"` // 手机号 + WalletAddr1 *string `json:"walletAddr1"` // 钱包地址1 + WalletAddr2 *string `json:"walletAddr2"` // 钱包地址2 + Status *bool `json:"status"` // 状态 开/关 +} + +type AgentChannelPasswordUpdate struct { + OldPassword string `json:"oldPassword"` // 代理商旧密码 + NewPassword string `json:"newPassword"` // 代理商新密码 +} + +type AgentChannelPasswordReset struct { + Channel string `json:"channel"` // 下级渠道 + Password string `json:"password"` // 新密码 +} + +// AgentChannelInfoAdd 新增渠道 +type AgentChannelInfoAdd struct { + Password string `json:"password"` // 代理商密码 + Mobile string `json:"mobile"` // 手机号 + WalletAddr1 string `json:"walletAddr1"` // 钱包地址1 + WalletAddr2 string `json:"walletAddr2"` // 钱包地址2 + Status bool `bson:"status"` // 状态 开/关 + Remark string `json:"remark"` // 备注 +} + +// AgentDeductedStat 渠道后台查询结算 +type AgentDeductedStat struct { + Channel string `bson:"channel" json:"channel"` // 渠道 + AppName string `bson:"appName" json:"appName"` // 应用名称 + AppId int32 `bson:"appId" json:"appId"` // appId + Settlement channelmod.SettlementWay `bson:"settlement" json:"settlement"` // 结算方式 cps/cpa/cpt/cpc + CPAPrice int64 `bson:"cpaPrice" json:"cpaPrice"` // 单价 + CPSRate int64 `bson:"cpsRate" json:"cpsRate"` // CPS 分成比列 0-100 + DivideRate int64 `bson:"divideRate" json:"divideRate"` // 分成比例 + SumDate time.Time `bson:"sumDate" json:"sumDate"` // 记录时间 + VisitCount int64 `bson:"visitCount" json:"visitCount"` // 访问量 + DirectCount int64 `bson:"directCount" json:"directCount"` // 新增量(包含子渠道和渠道本身) + DirectCountSelf int64 `bson:"directCountSelf" json:"directCountSelf"` // 自身渠道新增量 + DirectCountChild int64 `bson:"directCountChild" json:"directCountChild"` // 子渠道新增量 + Recharge int64 `bson:"recharge" json:"recharge"` // 充值金额(包含子渠道和渠道本身) + RechargeSelf int64 `bson:"rechargeSelf" json:"rechargeSelf"` // 来自自身渠道充值金额 + RechargeChild int64 `bson:"rechargeChild" json:"rechargeChild"` // 来自子渠道充值金额 + Income int64 `bson:"income" json:"income"` // 当日收益(自身+子渠道) + IncomeChild int64 `bson:"incomeChild" json:"incomeChild"` // 来自子渠道的当日收益 + IncomeSelf int64 `bson:"incomeSelf" json:"incomeSelf"` // 来自自身渠道的当日收益 + ChildRebate int64 `bson:"childRebate" json:"childRebate"` // 子渠道返佣 + UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` // 更新时间 +} + +type AgentChannelStatSearch struct { + AppId *int32 `json:"appId"` // appId + Channel *string `bson:"channel" json:"channel"` // 渠道 + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + common.Page +} + +type AgentChannelStatResp struct { + Total int64 `json:"total"` + List []*AgentDeductedStat `json:"list"` + TotalInfo AgentDeductedStat `json:"totalInfo"` +} + +type AgentChannelStatOldSearch struct { + AppId *int32 `json:"appId"` // appId + Channel *string `bson:"channel" json:"channel"` // 渠道 + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + common.Page +} + +// AgentChannelStat 渠道后台查询结算 +type AgentChannelStatOld struct { + Channel string `bson:"channel" json:"channel"` // 渠道 + AppName string `bson:"appName" json:"appName"` // 应用名称 + AppId int32 `bson:"appId" json:"appId"` // appId + SumDate time.Time `bson:"sumDate" json:"sumDate"` // 记录时间 + DirectCount int64 `bson:"newDirectCount,omitempty" json:"newDirectCount"` // 下载量 + VisitCount int64 `bson:"directVisitCount" json:"directVisitCount"` // 访问量 + RechargeAmount int64 `bson:"directAmount" json:"directAmount"` // 充值金额 + TodayIncome int64 `bson:"todayIncome" json:"todayIncome"` // 当日收益 + UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` // 更新时间 +} + +type AgentChannelStatOldResp struct { + Total int64 `json:"total"` + List []AgentChannelStatOld `json:"list"` + TotalInfo AgentChannelStatOld `json:"totalInfo"` +} + +type StatDataSimple struct { + VisitCount int64 `bson:"visitCount" json:"visitCount"` // 访问总量(包含子渠道和渠道本身) + DirectCount int64 `bson:"directCount" json:"directCount"` // 新增总量(包含子渠道和渠道本身) + Recharge int64 `bson:"recharge" json:"recharge"` // 充值金额(包含子渠道和渠道本身) + Income int64 `bson:"income" json:"income"` // 收益(自身+子渠道) +} + +type StatDataDetail struct { + StatDataSimple + DirectCountSelf int64 `bson:"directCountSelf" json:"directCountSelf"` // 自身渠道新增量 + DirectCountChild int64 `bson:"directCountChild" json:"directCountChild"` // 子渠道新增量 + RechargeSelf int64 `bson:"rechargeSelf" json:"rechargeSelf"` // 来自自身渠道充值金额 + RechargeChild int64 `bson:"rechargeChild" json:"rechargeChild"` // 来自子渠道充值金额 + IncomeChild int64 `bson:"incomeChild" json:"incomeChild"` // 子渠道的收益 + IncomeSelf int64 `bson:"incomeSelf" json:"incomeSelf"` // 自身渠道的收益 + ChildRebate int64 `bson:"childRebate" json:"childRebate"` // 子渠道返佣 +} + +func (s *StatDataDetail) ToStatDataSimple() *StatDataSimple { + return &s.StatDataSimple +} + +// AgentSummaryStatHome 渠道汇总 +type AgentSummaryStatHome struct { + Channel string `bson:"channel" json:"channel"` // 渠道 + ParentAgent string `bson:"parentAgent" json:"parentAgent"` // 父代理 + ChildCount int64 `bson:"childCount" json:"childCount"` // 子渠道数量 + AppName string `bson:"appName" json:"appName"` // 应用名称 + AppId int32 `bson:"appId" json:"appId"` // appId + Settlement channelmod.SettlementWay `bson:"settlement" json:"settlement"` // 结算方式 cps/cpa/cpt/cpc + CPAPrice int64 `bson:"cpaPrice" json:"cpaPrice"` // 单价 + CPSRate int64 `bson:"cpsRate" json:"cpsRate"` // CPS 分成比列 0-100 + DivideRate int64 `bson:"divideRate" json:"divideRate"` // 分成比例 + TotalStat *StatDataDetail `bson:"totalStat" json:"totalStat"` // 所有统计 + TodayStat *StatDataDetail `bson:"todayStat" json:"todayStat"` // 今日统计 + WeekStat *StatDataDetail `bson:"weekStat" json:"weekStat"` // 本周统计 + MonthStat *StatDataDetail `bson:"monthStat" json:"monthStat"` // 本月统计 + YearStat *StatDataDetail `bson:"yearStat" json:"yearStat"` // 本年统计 +} + +func (s *AgentSummaryStatHome) ToAgentSummaryStatChild() *AgentSummaryStatChild { + stat := &AgentSummaryStatChild{ + Channel: s.Channel, + ParentAgent: s.ParentAgent, + ChildCount: s.ChildCount, + AppName: s.AppName, + AppId: s.AppId, + Settlement: s.Settlement, + CPAPrice: s.CPAPrice, + CPSRate: s.CPSRate, + DivideRate: s.DivideRate, + TotalStat: s.TotalStat.ToStatDataSimple(), + TodayStat: s.TodayStat.ToStatDataSimple(), + WeekStat: s.WeekStat.ToStatDataSimple(), + MonthStat: s.MonthStat.ToStatDataSimple(), + YearStat: s.YearStat.ToStatDataSimple(), + } + return stat +} + +type AgentSummaryStatHomeList []*AgentSummaryStatHome + +func (a AgentSummaryStatHomeList) Len() int { return len(a) } +func (a AgentSummaryStatHomeList) Less(i, j int) bool { + return a[i].TotalStat.Income > a[j].TotalStat.Income +} +func (a AgentSummaryStatHomeList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type AgentSummaryStatHomeSearch struct { + common.Page +} + +type AgentSummaryStatHomeResp struct { + Total int64 `json:"total"` + List AgentSummaryStatHomeList `json:"list"` +} + +// AgentSummaryStatChild 下级渠道汇总 +type AgentSummaryStatChild struct { + Channel string `bson:"channel" json:"channel"` // 渠道 + ParentAgent string `bson:"parentAgent" json:"parentAgent"` // 父代理 + ChildCount int64 `bson:"childCount" json:"childCount"` // 子渠道数量 + AppName string `bson:"appName" json:"appName"` // 应用名称 + AppId int32 `bson:"appId" json:"appId"` // appId + Settlement channelmod.SettlementWay `bson:"settlement" json:"settlement"` // 结算方式 cps/cpa/cpt/cpc + CPAPrice int64 `bson:"cpaPrice" json:"cpaPrice"` // 单价 + CPSRate int64 `bson:"cpsRate" json:"cpsRate"` // CPS 分成比列 0-100 + DivideRate int64 `bson:"divideRate" json:"divideRate"` // 分成比例 + TotalStat *StatDataSimple `bson:"totalStat" json:"totalStat"` // 所有统计 + TodayStat *StatDataSimple `bson:"todayStat" json:"todayStat"` // 今日统计 + WeekStat *StatDataSimple `bson:"weekStat" json:"weekStat"` // 本周统计 + MonthStat *StatDataSimple `bson:"monthStat" json:"monthStat"` // 本月统计 + YearStat *StatDataSimple `bson:"yearStat" json:"yearStat"` // 本年统计 +} + +type AgentSummaryStatChildList []*AgentSummaryStatChild + +type AgentSummaryStatChildSearch struct { + common.Page +} + +type AgentSummaryStatChildResp struct { + Total int64 `json:"total"` + List AgentSummaryStatChildList `json:"list"` +} diff --git a/api/proto/channelCode.go b/api/proto/channelCode.go new file mode 100644 index 0000000..b117449 --- /dev/null +++ b/api/proto/channelCode.go @@ -0,0 +1,114 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 请求渠道码列表 +type ListChannelCodeReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId + Channel *string `form:"channel" json:"channel" binding:"omitempty"` // 渠道 + ChannelCode *string `form:"channelCode" json:"channelCode" binding:"omitempty"` // 渠道码 + IsAdmin *bool `form:"isAdmin" json:"isAdmin" binding:"omitempty"` // 是否是管理员 + common.Page +} + +// 响应渠道码列表 +type ListChannelCodeRes struct { + Total int64 `json:"total"` + List []ChannelCodeInfo `json:"list"` +} + +// 渠道码信息 +type ChannelCodeInfo struct { + ID string `json:"id"` // 公告id + ChannelCode string `json:"channelCode"` // 渠道码 + AppId int32 `json:"appId"` // appId + AppName string `json:"appName"` // app名称 + Channel string `json:"channel"` // 该渠道码所属渠道渠道 + ParentChannel string `json:"parentChannel"` // 该渠道码所属渠道渠道的父渠道 + // Settlement channelmod.SettlementWay `json:"settlement"` // 结算方式 cps/cpa/cpt + // DeductionStatus bool `json:"deductionStatus"` // 是否需要扣量 + // DedNewRule DeductionRuleInfo `json:"dedNewRule"` // 新增扣量规则 + // DedRechargeRule DeductionRuleInfo `json:"dedRechargeRule"` // 充值扣量规则 + Status bool `json:"status"` // 状态 开/关 + Links []string `json:"links"` // 推广链接 + OpeninstallLink string `json:"openinstallLink"` // 推广链接 + SharePassword string `json:"sharePassword"` // 推广链接 密码 + CreatedAt time.Time `json:"createdAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} + +// 请求添加渠道码 +type AddChannelCodeReq struct { + Channel *string `form:"channel" json:"channel" binding:"required"` // 渠道 + AppId *int32 `form:"appId" json:"appId" binding:"required"` // appId + ChannelCode *string `form:"channelCode" json:"channelCode" binding:"required"` // 渠道码 + Status *bool `form:"status" json:"status" binding:"required"` // 状态 开/关 + IsAdmin *bool `form:"isAdmin" json:"isAdmin" binding:"required"` // 是否是管理员 +} + +// 请求修改渠道 +type UpdateChannelCodeReq struct { + Id *string `form:"id" json:"id" binding:"required"` // ID + ChannelCode *string `form:"channelCode" json:"channelCode"` // 渠道码 + AppId *int32 `form:"appId" json:"appId"` // appId + Status *bool `form:"status" json:"status" ` // 状态 开/关 + IsAdmin *bool `form:"isAdmin" json:"isAdmin"` // 是否是管理员 + SharePassword *string `form:"sharePassword" json:"sharePassword"` // 渠道码 +} + +// 请求删除渠道 +type DelChannelCodeReq struct { + ChannelCode *string `form:"channel" json:"channel" binding:"required"` // 渠道 + AppId *int32 `form:"appId" json:"appId" binding:"required"` // appId + IsAdmin *bool `form:"isAdmin" json:"isAdmin" binding:"required"` // 是否是管理员 +} + +// 代理商渠道码列表请求 +type ListAgentChannelCodeReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"required"` // appId + ChannelCode *string `json:"channelCode"` // 渠道码 + common.Page +} + +// 代理商响应渠道码列表 +type ListAgentChannelCodeRes struct { + Total int64 `json:"total"` + List []AgentChannelCodeInfo `json:"list"` +} + +// 渠道码信息 +type AgentChannelCodeInfo struct { + ChannelCode string `json:"channelCode"` // 渠道码 + AppId int32 `json:"appId"` // appId + AppName string `json:"appName"` // app名称 + Channel string `json:"channel"` // 该渠道码所属渠道渠道 + ParentChannel string `json:"parentChannel"` // 该渠道码所属渠道渠道的父渠道 + Status bool `json:"status"` // 状态 开/关 + Links []string `json:"links"` // 推广链接 + CreatedAt time.Time `json:"createdAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} + +// 请求添加渠道码 +type AddAgentChannelCodeReq struct { + Channel *string `form:"channel" json:"channel" binding:"required"` // 渠道 + AppId *int32 `form:"appId" json:"appId" binding:"required"` // appId + ChannelCode *string `form:"channelCode" json:"channelCode" binding:"required"` // 渠道码 + Status *bool `form:"status" json:"status" binding:"required"` // 状态 开/关 +} + +// 请求修改渠道 +type UpdateAgentChannelCodeReq struct { + ChannelCode *string `form:"channelCode" json:"channelCode" binding:"required"` // 渠道码 + AppId *int32 `form:"appId" json:"appId" binding:"required"` // appId + Status *bool `form:"status" json:"status" binding:"required"` // 状态 开/关 +} + +// 请求删除渠道 +type DelAgentChannelCodeReq struct { + ChannelCode *string `form:"channel" json:"channel" binding:"required"` // 渠道码 + AppId *int32 `form:"appId" json:"appId" binding:"required"` // appId +} diff --git a/api/proto/channelCodeStat.go b/api/proto/channelCodeStat.go new file mode 100644 index 0000000..fbf0d85 --- /dev/null +++ b/api/proto/channelCodeStat.go @@ -0,0 +1,47 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 渠道码统计信息列表请求 +type BlocListChannelCodeStatReq struct { + Channel *string `form:"channel" json:"channel" binding:"omitempty"` // 渠道 + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId + StartTime *time.Time `form:"startTime" json:"startTime" binding:"omitempty"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 结束时间 + WithChild *bool `form:"withChild" json:"withChild" binding:"omitempty"` // 包含子渠道 + common.Page +} + +type BlocListChannelCodeStatRes struct { + Total int64 `json:"total"` + TotalInfo BlocChannelCodeStatInfo `json:"totalInfo"` + List []BlocChannelCodeStatInfo `json:"list"` +} + +type BlocChannelCodeStatInfo struct { + SumDate time.Time `json:"sumDate"` // 记录时间 按天对齐 + ChannelCode string `json:"channelCode"` // 渠道码 + AppId int32 `json:"appId"` // appId + AppName string `json:"appName"` // app名称 + Channel string `json:"channel"` // 该渠道码所属渠道渠道 + NewDirectCount int64 `json:"newDirectCount"` // 新增直推 + NewFissionCount int64 `json:"newFissionCount"` // 新增裂变 + NewDeductionCount int64 `json:"newDeductionCount"` // 新增扣量(新增 = 新增直推+新增裂变+扣量) + DirectVisitCount int64 `json:"directVisitCount"` // 直推访问数 + FissionVisitCount int64 `json:"fissionVisitCount"` // 裂变访问数 + Day1RetainRate float64 `json:"day1RetainRate"` // 次日留存率 + Day3RetainRate float64 `json:"day3RetainRate"` // 3日留存率 + Day7RetainRate float64 `json:"day7RetainRate"` // 7日留存率 + RechargeAmount int64 `json:"rechargeAmount"` // 直推充值金额 + FissionAmount int64 `json:"fissionAmount"` // 裂变充值金额 + DeductionAmount int64 `json:"deductionAmount"` // 扣量金额 + NewRechargeCount int64 `json:"newRechargeCount"` // 新增充值数 + NewRechargeAmount int64 `json:"newRechargeAmount"` // 新增充值金额 + LandPageVisitCount int64 `json:"landPageVisitCount"` // 落地页访问次数 + Settlement string `json:"settlement"` // 结算方式 cps/cpa/cpt/cpc + TodayIncome int64 `json:"todayIncome"` // 当日收益 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} diff --git a/api/proto/channelinfo.go b/api/proto/channelinfo.go new file mode 100644 index 0000000..f79995d --- /dev/null +++ b/api/proto/channelinfo.go @@ -0,0 +1,403 @@ +package proto + +import ( + "stat/common" + "stat/models/channelmod" + "stat/models/channelsettlementrecord" + "stat/models/registermod" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// ChannelInfoSearch 渠道信息查询 +type ChannelInfoSearch struct { + ID *string `json:"id"` // ID + Channel *string `json:"channel"` // 渠道 + AppId *int32 `json:"appId"` // 渠道对应的appId + Type *channelmod.ChannelType `json:"Type"` // 渠道类型:1 一级 2:二级 + ParentChannel *string `json:"parentChannel"` // 父渠道 二级:存在父渠道 + UserName *string `json:"userName"` // 所有者 + Status *bool `json:"status"` // 状态 开/关 + Remark *string `json:"remark"` // 备注 + Mobile *string `json:"mobile"` // 手机号 + common.Page +} +type ChannelInfoSearchResp struct { + Total int64 `json:"total"` + List channelmod.ChannelInfoList `json:"list"` +} + +// ChannelInfoUpdate 渠道更新 +type ChannelInfoUpdate struct { + ID string `json:"id,omitempty" binding:"required"` // ID + Password *string `json:"password" bson:"password,omitempty"` // 渠道密码 + Status *bool `json:"status" bson:"status,omitempty"` // 状态 开/关 + Remark *string `json:"remark" bson:"remark,omitempty"` // 备注 + Mobile *string `json:"mobile" bson:"mobile,omitempty"` // 手机号 + ShowMagic *int32 `json:"showMagic" bson:"showMagic,omitempty"` // 异常登陆次数 + Lock *bool `json:"lock" bson:"lock,omitempty"` // 禁止登陆 + WalletAddr1 *string `json:"walletAddr1" bson:"wallet.addr1,omitempty"` // 钱包地址1 + WalletAddr2 *string `json:"walletAddr2" bson:"wallet.addr2,omitempty"` // 钱包地址2 + AutoGenApk *bool `bson:"autoGenApk" json:"autoGenApk,omitempty"` // 自动生成渠道包 + ChildShowDivideRate *bool `bson:"childShowDivideRate" json:"childShowDivideRate,omitempty"` // 下级是否显示分成比例 + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` // 更新时间 +} + +// ChannelOwnerUpdate 渠道所有者更新 +type ChannelOwnerUpdate struct { + Channel string `json:"channel" bson:"channel" binding:"required"` // 渠道ID + UserName string `json:"userName" bson:"userName"` // 所有者名字 + Mark string `json:"mark" bson:"mark"` // 备注 +} + +// ChannelInfoAdd 新增渠道 +type ChannelInfoAdd struct { + Channel string `json:"channel" binding:"required"` // 渠道 + Type channelmod.ChannelType `json:"type" binding:"required"` // 渠道类型:1 一级 2:二级 + ParentChannel string `json:"parentChannel"` // 父渠道 如果为空字符串,则为渠道,否则为代理 + Password string `json:"password"` // 代理商密 + Status bool `json:"status"` // 状态 开/关 + Remark string `json:"remark"` // 备注 + Mobile string `json:"mobile"` // 手机号 + Lock bool `json:"lock"` // 禁止登陆 + ChildShowDivideRate bool `bson:"childShowDivideRate" json:"childShowDivideRate"` // 下级是否显示分成比例 +} + +// ChannelInfoDelete 删除渠道信息 +type ChannelInfoDelete struct { + ID string `json:"id,omitempty" binding:"required"` // ID +} + +// ChannelDeductionRuleSearch 渠道扣量规则查询 +type ChannelDeductionRuleSearch struct { + AppId *int32 `json:"appId"` // 应用ID + Channel *string `json:"channel"` // 渠道 + common.Page +} + +type ChannelDeductionRuleSearchResp struct { + Total int64 `json:"total"` + List channelmod.ChannelDeductionRuleList `json:"list"` +} + +// ChannelDeductionRuleUpdate 更新扣量规则 +type ChannelDeductionRuleUpdate struct { + ID string `json:"id" binding:"required"` // ID + AppType *channelmod.AppType `json:"appType" bson:"appType,omitempty"` // 应用类型 + PromoteMode *channelmod.PromoteMode `json:"promoteMode" bson:"promoteMode,omitempty"` // 推广类型 + First *int32 `json:"first" bson:"first,omitempty" ` // 一阶(1单) + Second *int32 `json:"second" bson:"second,omitempty"` // 二阶(2-3单) + Third *int32 `json:"third" bson:"third,omitempty"` // 三阶(4-5单) + Fourth *int32 `json:"fourth" bson:"fourth,omitempty"` // 四阶(6-10单) + Fifth *int32 `json:"fifth" bson:"fifth,omitempty"` // 5阶(11单以上) + CPAPrice *int64 `json:"cpaPrice" bson:"cpaPrice,omitempty"` // 单价 + CPSRate *int64 `json:"cpsRate" bson:"cpsRate,omitempty"` // CPS分成比列 0-100 + CPSBegin *int64 `json:"cpsBegin" bson:"cpsBegin,omitempty"` // CPS 开始扣量金额 + CPSDeductionRate *int64 `json:"cpsDeductionRate" bson:"cpsDeductionRate,omitempty"` // CPS 扣量比例 + BeginTime *time.Time `json:"deductionAt" bson:"deductionAt,omitempty"` // 扣量开始时间 + LandingPage *string `json:"landingPage" bson:"landingPage,omitempty"` // 落地页 + ProxyDeduction *int64 `json:"proxyDeduction" bson:"proxyDeduction,omitempty"` // 代理扣量比例 + DivideRate *int64 `json:"divideRate" bson:"divideRate,omitempty"` // 代理分成比例 + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` // 更新时间 + AutoDeduction *bool `json:"autoDeduction" bson:"autoDeduction,omitempty"` // 自动扣量开关 + LessIncomeRate *float64 `json:"lessIncomeRate" bson:"lessIncomeRate,omitempty"` // 最低收益比 CPA低于该值开启扣量(0.1 - 3.0) +} + +// ChannelDeductionRuleAdd 新增扣量规则 +type ChannelDeductionRuleAdd struct { + AppId int32 `json:"appId" binding:"required"` // 应用ID + Channel string `json:"channel" binding:"required"` // 渠道 + Settlement channelmod.SettlementWay `json:"settlement" binding:"required"` // 结算方式 cps/cpa/cpt/cpc (cpt/cpc 1-5阶设置100 不可编辑) + AppType channelmod.AppType `json:"appType" bson:"appType,omitempty"` // 应用类型 + PromoteMode channelmod.PromoteMode `json:"promoteMode" bson:"promoteMode,omitempty"` // 推广类型 + First int32 `json:"first" binding:"min=0,max=100"` // 一阶 + Second int32 `json:"second" binding:"min=0,max=100"` // 二阶 + Third int32 `json:"third" binding:"min=0,max=100"` // 三阶 + Fourth int32 `json:"fourth" binding:"min=0,max=100"` // 四阶 + Fifth int32 `json:"fifth" binding:"min=0,max=100"` // 5阶 + CPAPrice int64 `json:"cpaPrice"` // 单价(分) 前端可设置1.80 + CPSRate int64 `json:"cpsRate" binding:"min=0,max=100"` // CPS分成比列 + CPSBegin int64 `json:"cpsBegin"` // CPS 开始扣量金额 + CPSDeductionRate int64 `json:"cpsDeductionRate"` // CPS 扣量比例 + LandingPage string `json:"landingPage"` // 落地页 + ProxyDeduction int64 `json:"proxyDeduction" binding:"min=0,max=100"` // 代理扣量比例 + DivideRate int64 `bson:"divideRate" json:"divideRate"` // 代理分成比例 + BeginTime time.Time `json:"deductionAt"` // 扣量开始时间(默认当前时间) + AutoDeduction bool `json:"autoDeduction" bson:"autoDeduction"` // 自动扣量开关 + LessIncomeRate *float64 `json:"lessIncomeRate" bson:"lessIncomeRate"` // 最低收益比 CPA低于该值开启扣量(0.1 - 3.0) + +} + +type ChannelDeductionRuleDelete struct { + ID string `json:"id,omitempty" binding:"required"` // ID +} + +// ChannelStatSearch 渠道统计(每天)查询 +type ChannelStatSearch struct { + DayType *int8 `json:"dayType"` // 天数 + RankType *int8 `json:"rankType"` // 排序方式:统计时间+1充值,2新增,3收益 + Channel *string `json:"channel"` // 渠道 + AppId *[]int32 `json:"appId"` // appId + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + WithChild *bool `json:"withChild"` // 包含子渠道 + Detail *bool `json:"detail"` // true 渠道详细 + SumDate *time.Time `json:"sumDate"` // 哪一天 + UserName *string `json:"userName"` // 所有者 + Settlement *channelmod.SettlementWay `bson:"settlement"` // 结算方式 cps/cpa/cpt/cpc + common.Page +} + +func (s *ChannelStatSearch) CanCalcTotal() bool { + return s.Start != nil && s.End != nil && s.AppId != nil && s.Channel != nil +} + +type ChannelStatSearchResp struct { + Total int64 `json:"total"` + TotalInfo channelmod.ChannelStat `json:"totalInfo"` + List channelmod.ChannelStatList `json:"list"` + Income int64 `bson:"income" json:"income"` // 总收益 + Desc string `bson:"desc" json:"desc"` // 描述 +} + +// 结算对话框搜索 +type ChannelStatSettlementSearch struct { + Channel *string `json:"channel" binding:"required"` // 渠道 + AppId *int32 `json:"appId" binding:"required"` // appId + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + WithChild *bool `json:"withChild"` // 包含子渠道 + UserName *string `json:"userName"` // 所有者 + Settlement *channelmod.SettlementWay `json:"settlement"` // 结算方式 cps/cpa/cpt/cpc/hz + common.Page +} + +type ChannelStatSettlementSearchResp struct { + Total int64 `json:"total"` + TotalInfo channelmod.ChannelStat `json:"totalInfo"` + List channelmod.ChannelStatList `json:"list"` + Income int64 `bson:"income" json:"income"` // 总收益 + Desc string `bson:"desc" json:"desc"` // 描述 +} + +type ChannelStatSettlementSearch2 struct { + Channel *string `json:"channel" binding:"required"` // 渠道 + AppId *int32 `json:"appId" binding:"required"` // appId + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + IsPayed *bool `json:"isPayed"` // 结算状态 true:已结算或正在结算,false:未结算 + UserName *string `json:"userName"` // 所有者 + common.Page +} + +type ChannelStatSettlementSearch2Resp struct { + Channel string `json:"channel"` // 渠道 + AppId int32 `json:"appId"` // appId + TotalCount int64 `json:"totalCount"` // 总条数 + TotalInfo channelmod.ChannelStat `json:"totalInfo"` // 按总条数合计的数据 + TotalIncome int64 `json:"totalIncome"` // 总收益(列表的所有数据合计) + TotalDesc string `json:"totalDesc"` // 总收益描述 + ValidCount int64 `json:"validCount"` // 有效条数 + ValidInfo channelmod.ChannelStat `json:"validInfo"` // 按有效条数合计的数据 + ValidIncome int64 `json:"validIncome"` // 有效收益(可结算的收益) + ValidDesc string `json:"validDesc"` // 有效收益描述 + InvalidCount int64 `json:"invalidCount"` // 无效条数 + InvalidInfo channelmod.ChannelStat `json:"invalidInfo"` // 按无效条数合计的数据 + InvalidIncome int64 `json:"invalidIncome"` // 无效收益(不可结算的收益) + InvalidDesc string `json:"invalidDesc"` // 无效收益描述 + List channelmod.ChannelStatList `json:"list"` // 全部记录 + RuleId primitive.ObjectID `json:"ruleId"` // 扣量规则ID + Wallet channelmod.Wallet `json:"wallet"` // 钱包信息 +} + +// ChannelSettlementSearch 渠道结算(每15分钟) +type ChannelSettlementSearch struct { + Channel *string `json:"channel"` // 渠道 + AppId *int32 `json:"appId"` // appId + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + WithChild *bool `json:"withChild"` // 包含子渠道 + common.Page +} + +type ChannelSettlementSearchResp struct { + Total int64 `json:"total"` + List channelmod.ChannelSettlementList `json:"list"` +} + +type UserInfoSearch struct { + UserId *int64 `json:"id"` // 用户ID + AppId *int32 `json:"appId"` // 渠道对应的appId + Channel *string `json:"channel"` // 渠道 + IP *string `json:"ip"` // IP + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + common.Page +} + +type UserInfoSearchResp struct { + Total int64 `json:"total"` + List []registermod.RegisterMod `json:"list"` +} + +type GetSettlementApplicantListReq struct { +} + +type GetSettlementApplicantListResp struct { + List []string `json:"list" bson:"list"` +} + +type GetApplyFormReq struct { + AppId *int32 `json:"appId"` // appId + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + Status *channelsettlementrecord.SettlementStatus `json:"status"` // 状态 + common.Page +} + +type ApplyFormRecord struct { + ID primitive.ObjectID `json:"id,omitempty"` // ID + Channel string `json:"channel"` // 渠道 + AppId int32 `json:"appId"` // appId + BeginTime time.Time `json:"beginTime"` // 开始时间 + EndTime time.Time `json:"endTime"` // 结束时间 + TotalMoney int64 `json:"totalMoney"` // 计算出的总金额 + SettleMoney int64 `json:"settleMoney"` // 手动输入的要结算的真实金额() + Settlement channelmod.SettlementWay `json:"settlement"` // 结算方式 cps/cpa/cpt/cpc + Wallet channelmod.Wallet `json:"wallet"` // 钱包地址 + PayMoney int64 `json:"payMoney"` // 打款金额 + Usdt int64 `json:"usdt"` // 打款Usdt 还是分 + Status channelsettlementrecord.SettlementStatus `json:"status"` // 状态 + Remark string `json:"remark"` // 备注 + Pictures []string `json:"pictures"` // 上传的图片 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 + CreatedAt time.Time `json:"createdAt"` // 创建时间 +} + +type ApplyFormRecordList []*ApplyFormRecord + +type GetApplyFormResp struct { + Total int64 `json:"total"` + List ApplyFormRecordList `json:"list"` +} + +type SettlementInfoSearch struct { + PayType *int8 `json:"payType"` // 支付类型,1ERC 2TRC 3銀行卡 4支付寶 + Channel *string `json:"channel"` // 渠道 + AppId *int32 `json:"appId"` // appId + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + Remark *string `json:"remark"` // 备注 + Status []channelsettlementrecord.SettlementStatus `json:"status"` // 状态数组 + Applicants []string `json:"applicants"` // 申请人列表 + common.Page +} +type SettlementInfoSearchResp struct { + Total int64 `json:"total"` + List channelsettlementrecord.ChannelSettlementRecordList `json:"list"` +} + +type SettlementInfoUpdate struct { + ID primitive.ObjectID `json:"id" binding:"required"` // ID + PayMoney *int64 `json:"payMoney"` // 打款金额 + Status *channelsettlementrecord.SettlementStatus `json:"status"` // 状态 + Remark *string `json:"remark"` // 备注 + Usdt *int64 `json:"usdt"` // 打款Usdt 还是分 +} + +type SettlementInfoUpdate2 struct { + ID primitive.ObjectID `json:"id" binding:"required"` // ID + Remark *string `json:"remark"` // 备注 + Status *channelsettlementrecord.SettlementStatus `json:"status"` // 状态 + // 财务(可修改) + PayMoney *int64 `json:"payMoney"` // 打款金额 + Usdt *int64 `json:"usdt"` // 打款Usdt 还是分 + + SettleMoney *int64 `json:"settleMoney"` // 申请结算的金额 + // 图片 + Pictures []string `json:"pictures"` // 上传的图片 + +} + +// SettlementInfoAdd 渠道结算信息 +type SettlementInfoAdd struct { + AppId int32 `json:"appId" binding:"required"` // 应用ID + Channel string `json:"channel" binding:"required"` // 渠道 + BeginTime time.Time `json:"beginTime" binding:"required"` // 开始时间 + EndTime time.Time `json:"endTime" binding:"required"` // 结束时间 + TotalMoney int64 `json:"totalMoney" binding:"required"` // 总金额 +} + +// SettlementInfoAdd2 渠道结算信息 +type SettlementInfoAdd2 struct { + AppId int32 `json:"appId" binding:"required"` // 应用ID + Channel string `json:"channel" binding:"required"` // 渠道 + TotalMoney int64 `json:"totalMoney"` // 总金额(提交的总金额,必须和按ids条数合计出来数据按ruleId扣量后一致) + SettleMoney int64 `json:"settleMoney" binding:"required"` // 手动输入的要结算的金额(为什么和TotalMoney不一致,因为可能已经预付过了) + RuleId primitive.ObjectID `json:"ruleId" binding:"required"` // 扣量RuleId + SettleIds []primitive.ObjectID `json:"settleIds" binding:"required"` // 要结算的天记录ID列表 + BeginTime *time.Time `json:"beginTime"` // 开始时间 + EndTime *time.Time `json:"endTime"` // 结束时间 + Remark *string `json:"remark"` // 备注 + WalletAddr1 *string `json:"walletAddr1"` // 钱包地址1 + WalletAddr2 *string `json:"walletAddr2"` // 钱包地址2 +} + +type SettlementCalcReq struct { + AppId int32 `json:"appId" binding:"required"` // 应用ID + Channel string `json:"channel" binding:"required"` // 渠道 + BeginTime *time.Time `json:"beginTime"` // 开始时间 + EndTime *time.Time `json:"endTime"` // 结束时间 + RuleId primitive.ObjectID `json:"ruleId" binding:"required"` // 扣量RuleId + SettleIds []primitive.ObjectID `json:"settleIds" binding:"required"` // 要结算的天记录ID列表 +} + +type SettlementCalcResp struct { + TotalCount int64 `json:"totalCount"` // 总条数 + TotalInfo channelmod.ChannelStat `json:"totalInfo"` // 按总条数合计的数据 + TotalIncome int64 `json:"totalIncome"` // 总收益(列表的所有数据合计) + TotalDesc string `json:"totalDesc"` // 总收益描述 +} + +type SettlementInfoDelete struct { + ID primitive.ObjectID `json:"id" binding:"required"` // ID +} + +type SettlementInfoDetail struct { + ID primitive.ObjectID `json:"id" binding:"required"` // ID + common.Page +} + +type SettlementInfoDetailResp struct { + Count int64 `json:"count"` // 总条数 + List channelmod.ChannelStatList `json:"list"` // 全部记录 +} + +type SearchChannelStatComparedReq struct { + Channel *string `json:"channel"` // 渠道 + AppId *int32 `json:"appId"` // appId + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + WithChild *bool `json:"withChild"` // 包含子渠道 + Settlement *channelmod.SettlementWay `bson:"settlement"` // 结算方式 cps/cpa/cpt/cpc + common.Page +} + +type SearchChannelStatComparedResp struct { + Total int64 `json:"total"` + List channelmod.ChannelStatYestodayList `json:"list"` +} + +// ChannelOwnerChangeInfoSearch 渠道所有者变更信息查询 +type ChannelOwnerChangeInfoSearch struct { + ID *primitive.ObjectID `json:"id"` // ID + Channel *string `json:"channel"` // 渠道 + OldUser *string `json:"oldUser"` // 变更前的所有者 + NewUser *string `json:"newUser"` // 变更后的所有者 + common.Page +} +type ChannelOwnerChangeInfoSearchResp struct { + Total int64 `json:"total"` + List channelmod.ChannelOwnerChangeList `json:"list"` +} diff --git a/api/proto/dailyStat.go b/api/proto/dailyStat.go new file mode 100644 index 0000000..0bd4c9e --- /dev/null +++ b/api/proto/dailyStat.go @@ -0,0 +1,348 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 日常统计列表请求 +type ListDailyStatReq struct { + AppId *[]int32 `form:"appId" json:"appId"` // appId + StartTime *time.Time `form:"startTime" json:"startTime"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime"` // 结束时间 + common.Page +} + +type ListDailyHourStatReq struct { + AppId *int32 `form:"appId" json:"appId"` // appId + SumHour *int `form:"sumHour" json:"sumHour"` // 小时数 + StartTime *time.Time `form:"startTime" json:"startTime"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime"` // 结束时间 + common.Page +} + +type BlocDailyStatReq struct { + StartTime *time.Time `form:"time" json:"time"` // 开始时间 +} + +type ListDailyStatRes struct { + Total int64 `json:"total"` + TotalInfo *DailyStatInfo `json:"totalInfo"` + List []*DailyStatInfo `json:"list"` +} +type HourStatText struct { + Title string `json:"title"` //标题 + Desc string `json:"desc"` //描述 + Content string `json:"content"` //正文 +} + +type AppHourDataStatInfoRes struct { + Data []HourStatText `json:"data"` +} + +type DailyStatInfo struct { + SumDate time.Time `json:"sumDate"` // 记录时间 按天对齐 + AppId int32 `json:"appId"` // appId + AppName string `json:"appName"` // app名称 + // 注册统计 + TotalNewCount int64 `json:"totalNewCount"` // 新增总数 + NewDirectCount int64 `json:"newDirectCount"` // 新增直推 + NewFissionCount int64 `json:"newFissionCount"` // 新增裂变 + NewDeductionCount int64 `json:"newDeductionCount"` // 新增扣量 + NewNaturalCount int64 `json:"newNaturalCount"` // 自然新增 + NewWebCount int64 `json:"newWebCount"` // 官网注册 + NewDistrictCount int64 `json:"newDistrictCount"` // 渠道注册 + NewNormalCount int64 `json:"newNormalCount"` // 自来注册 + AndroidAddCount int64 `json:"androidAddCount"` // android新增 + IosAddCount int64 `json:"iosAddCount"` // ios新增 + // 轻量注册 + LightAddCount int64 `json:"lightAddCount"` // ##轻量注册 + LightGuestAddCount int64 `json:"lightGuestAddCount"` // 轻量游客 + LightFormalAddCount int64 `json:"lightFormalAddCount"` // 轻量注册 + LightDirectCount int64 `json:"lightDirectCount"` // 轻量直推注册 + LightFissionCount int64 `json:"lightFissionCount"` // 轻量裂变注册 + LightDeductionCount int64 `json:"lightDeductionCount"` // 轻量扣量注册 + LightNaturalCount int64 `json:"lightNaturalCount"` // 轻量自然注册 + LightWebCount int64 `json:"lightWebCount"` // 轻量官网注册 + LightDistrictCount int64 `json:"lightDistrictCount"` // 轻量渠道注册 + LightNormalCount int64 `json:"lightNormalCount"` // 轻量自来注册 + // H5注册 + H5FormalCount int64 `json:"h5FormalCount"` // H5正式注册 + H5AddCount int64 `json:"h5AddCount"` // H5新增 + H5PcAddCount int64 `json:"h5PcAddCount"` // H5Pc新增 + H5IosAddCount int64 `json:"h5IosAddCount"` // H5Ios新增 + H5AndroidAddCount int64 `json:"h5AndroidAddCount"` // H5Android新增 + // 访问统计 + TotalVisitCount int64 `json:"totalVisitCount"` // 日活 + DirectVisitCount int64 `json:"directVisitCount"` // 直推访问数 + FissionVisitCount int64 `json:"fissionVisitCount"` // 裂变访问数 + DeductionVisitCount int64 `json:"deductionVisitCount"` // 扣量访问数 + NaturalVisitCount int64 `json:"naturalVisitCount"` // 自然访问数 + TodayDistrictVisitCount int64 `json:"todayDistrictVisitCount"` // 当日渠道访问量 + TodayWebVisitCount int64 `json:"todayWebVisitCount"` // 当日官网访问量 + TodayNormalVisitCount int64 `json:"todayNormalVisitCount"` // 当日自来访问量 + TodayIosVisitCount int64 `json:"todayIosVisitCount"` // 当日IOS访问量(日活) + TodayAndroidVisitCount int64 `json:"todayAndroidVisitCount"` // 当日安卓访问量(日活) + TodayH5VisitCount int64 `json:"todayH5VisitCount"` // 当日H5访问量(日活) + TodayH5PcVisitCount int64 `json:"todayH5PcVisitCount"` // 当日H5Pc访问量(日活) + TodayH5IosVisitCount int64 `json:"todayH5IosVisitCount"` // 当日H5Ios访问量(日活) + TodayH5AndroidVisitCount int64 `json:"todayH5AndroidVisitCount"` // 当日H5Android访问量(日活) + // 轻量访问 + LightVisitCount int64 `json:"lightVisitCount"` // 当日Light访问量 + LightDirectVisitCount int64 `json:"lightDirectVisitCount"` // 轻量直推访问 + LightFissionVisitCount int64 `json:"lightFissionVisitCount"` // 轻量裂变访问 + LightDeductionVisitCount int64 `json:"lightDeductionVisitCount"` // 轻量扣量访问 + LightNaturalVisitCount int64 `json:"lightNaturalVisitCount"` // 轻量自然访问 + LightWebVisitCount int64 `json:"lightWebVisitCount"` // 轻量官网访问 + LightDistrictVisitCount int64 `json:"lightDistrictVisitCount"` // 轻量渠道访问 + LightNormalVisitCount int64 `json:"lightNormalVisitCount"` // 轻量自来访问 + // 充值统计 + TotalAmount int64 `json:"totalAmount"` // 总充值 + DirectAmount int64 `json:"directAmount"` // 直推充值金额 + FissionAmount int64 `json:"fissionAmount"` // 裂变充值金额 + DeductionAmount int64 `json:"deductionAmount"` // 扣量充值金额 + NaturalAmount int64 `json:"naturalAmount"` // 自然充值 + TodayDistrictRecharge int64 `json:"todayDistrictRecharge"` // 当日渠道充值新增 + TodayWebRecharge int64 `json:"todayWebRecharge"` // 当日官网充值新增 + TodayNormalRecharge int64 `json:"todayNormalRecharge"` // 当日自来量充值新增 + TodayAndroidRecharge int64 `json:"todayAndroidRecharge"` // 当日android充值 + TodayIosRecharge int64 `json:"todayIosRecharge"` // 当日Ios充值 + TodayH5Recharge int64 `json:"todayH5Recharge"` // 当日H5充值 + TodayH5FormalRecharge int64 `json:"todayH5FormalRecharge"` // 当日H5Formal充值 + TodayH5PcRecharge int64 `json:"todayH5PcRecharge"` // 当日H5Pc充值 + TodayH5IosRecharge int64 `json:"todayH5IosRecharge"` // 当日H5Ios充值 + TodayH5AndroidRecharge int64 `json:"todayH5AndroidRecharge"` // 当日H5Android充值 + // 轻量充值次数 + LightRechargeCount int64 `json:"lightRechargeCount"` // 当日轻量充值次数 + LightDirectRechargeCount int64 `json:"lightDirectRechargeCount"` // 轻量直推充值次数 + LightFissionRechargeCount int64 `json:"lightFissionRechargeCount"` // 轻量裂变充值次数 + LightDeductionRechargeCount int64 `json:"lightDeductionRechargeCount"` // 轻量扣量充值次数 + LightNaturalRechargeCount int64 `json:"lightNaturalRechargeCount"` // 轻量自然充值次数 + LightWebRechargeCount int64 `json:"lightWebRechargeCount"` // 轻量官网充值次数 + LightDistrictRechargeCount int64 `json:"lightDistrictRechargeCount"` // 轻量渠道充值次数 + LightNormalRechargeCount int64 `json:"lightNormalRechargeCount"` // 轻量自来充值次数 + // 轻量充值钱数 + LightRechargeAmount int64 `json:"lightRechargeAmount"` // 当日轻量充值钱数 + LightDirectRechargeAmount int64 `json:"lightDirectRechargeAmount"` // 轻量直推充值钱数 + LightFissionRechargeAmount int64 `json:"lightFissionRechargeAmount"` // 轻量裂变充值钱数 + LightDeductionRechargeAmount int64 `json:"lightDeductionRechargeAmount"` // 轻量扣量充值钱数 + LightNaturalRechargeAmount int64 `json:"lightNaturalRechargeAmount"` // 轻量自然充值钱数 + LightWebRechargeAmount int64 `json:"lightWebRechargeAmount"` // 轻量官网充值钱数 + LightDistrictRechargeAmount int64 `json:"lightDistrictRechargeAmount"` // 轻量渠道充值钱数 + LightNormalRechargeAmount int64 `json:"lightNormalRechargeAmount"` // 轻量自来充值钱数 + // 其他充值 + ARPU int64 `json:"ARPU"` // 人均充值 + ARPPU int64 `json:"ARPPU"` // 付费用户人均充值 + VipPayByMoney int64 `json:"vipPayByMoney"` // 会员充值 + PayForAthor int64 `json:"payForAthor"` // 金币充值 + RepeatAmount int64 `json:"repeatAmount"` // 复冲金额 + RepeatVipMoney int64 `json:"repeatVipMoney"` // 复冲VIP + GameRechageAmount int64 `json:"gameRechageAmount"` // 游戏充值 + GameWithdrawAmount int64 `json:"gameWithdrawAmount"` // 游戏提现 + // 新用户和老用户充值 + OldRechargeAmount int64 `json:"oldRechargeAmount"` // 老用户充值金额 + OldVipRecharge int64 `json:"oldVipRecharge"` // 老用户VIP充值 + OldCoinRecharge int64 `json:"oldCoinRecharge"` // 老用户金币充值 + // 新增充值 + NewRechargeCount int64 `json:"newRechargeCount"` // 新增充值数 + NewRechargeAmount int64 `json:"newRechargeAmount"` // 新增充值金额 + NewVipRecharge int64 `json:"newVipRecharge"` // 新增VIP充值 + NewCoinRecharge int64 `json:"newCoinRecharge"` // 新增金币充值 + // 充值率 + NewRechargeRate float64 `json:"newRechargeRate"` // 新增充值率 + VisitRechargeRate float64 `json:"visitRechargeRate"` // 登陆充值率 + // 订单统计 + SuccessRechargeOrder int64 `json:"successRechargeOrder"` // 充值成功订单数 + TotalRechargeOrder int64 `json:"totalRechargeOrder"` // 拉起订单数 + RechargeSuccessRate string `json:"rechargeSuccessRate"` // 支付成功率 + // 留存率 + Day1RetainRate float64 `json:"day1RetainRate"` // 次日留存率 + Day3RetainRate float64 `json:"day3RetainRate"` // 3日留存率 + Day7RetainRate float64 `json:"day7RetainRate"` // 7日留存率 + // 落地页点击 + LandpageAndroidClick int64 `json:"landpageAndroidClick"` // 落地页android访问次数 + LandpageIosAppstoreClick int64 `json:"landpageIosAppstoreClick"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick int64 `json:"landpageIosAthorClick"` // 落地页iOS其他包访问次数 + LandpageIosH5Click int64 `json:"landpageIosH5Click"` // 落地页H5访问次数 + // 更新时间 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} +type DailyStatInfoExport struct { + SumDate time.Time `json:"sumDate"` // 记录时间 按天对齐 + TotalVisitCount int64 `json:"totalVisitCount"` // 总日活 + TotalNewCount int64 `json:"totalNewCount"` // 总新增 + TotalAmount int64 `json:"totalAmount"` // 总充值 + // 新增详细 + TotalNewCountAndroid int64 `json:"totalNewCountAndroid"` // android新增 + TotalNewCountIos int64 `json:"totalNewCountIos"` // ios新增 + TotalNewCountH5 int64 `json:"totalNewCountH5"` // H5新增 + TotalNewCountChannel int64 `json:"totalNewCountChannel"` // 渠道新增 + // 充值详细 + TotalAmountChannel int64 `json:"totalAmountAndroid"` // 渠道充值 + TotalAmountOldUser int64 `json:"totalAmountOldUser"` // 老用户充值 + TotalAmountNewUser int64 `json:"totalAmountNewUser"` // 新用户充值 + TotalRepeatAmount int64 `json:"totalRepeatAmount"` // 复冲金额 + TotalRepeatVipMoney int64 `json:"totalRepeatVipMoney"` // 复冲VIP + // 订单统计 + TotalLunchOrder int64 `json:"totalLunchOrder"` // 拉起订单数 + TotalSuccessOrder int64 `json:"totalSuccessOrder"` // 成功订单数 +} + +type ListDailyHourStatRes struct { + Total int64 `json:"total"` + List []*DailyHourStatInfo `json:"list"` +} + +type ListLandPageStatRes struct { + Total int64 `json:"total"` + Summary DownloadStatInfo `json:"summary"` + List []*DownloadStatInfo `json:"list"` +} + +type DailyHourStatInfo struct { + SumDate time.Time `json:"sumDate"` // 记录时间 按天对齐 + AppId int32 `json:"appId"` // appId + SumHour int `json:"sumHour"` // 小时数 + AppName string `json:"appName"` // app名称 + // 注册 + NewTotalCount int64 `json:"newTotalCount"` // **新增总量 + NewDirectCount int64 `json:"newDirectCount"` // 新增直推 + NewFissionCount int64 `json:"newFissionCount"` // 新增裂变 + NewDeductionCount int64 `json:"newDeductionCount"` // 新增扣量 + NewNaturalCount int64 `json:"newNaturalCount"` // 自然新增 + NewWebCount int64 `json:"newWebCount"` // **官网新增 + NewNormalCount int64 `json:"newNormalCount"` // **自来新增 + NewDistrictCount int64 `json:"newDistrictCount"` // **渠道新增 + NewAndroidCount int64 `json:"newAndroidCount"` // android新增 + NewIosCount int64 `json:"newIosCount"` // ios新增 + // 轻量注册 + NewLightCount int64 `json:"newLightCount"` // light新增 + NewLightGuestCount int64 `json:"newLightGuestCount"` // light新增安装 + NewLightFormalCount int64 `json:"newLightFormalCount"` // light新增注册 + NewLightDirectCount int64 `json:"newLightDirectCount"` // light新增直推 + NewLightFissionCount int64 `json:"newLightFissionCount"` // light新增裂变 + NewLightDeductionCount int64 `json:"newLightDeductionCount"` // light新增扣量 + NewLightNaturalCount int64 `json:"newLightNaturalCount"` // light自然新增 + NewLightWebCount int64 `json:"newLightWebCount"` // light官网新增 + NewLightNormalCount int64 `json:"newLightNormalCount"` // light自来新增 + NewLightDistrictCount int64 `json:"newLightDistrictCount"` // light渠道新增 + // H5注册 + NewH5Count int64 `json:"newH5Count"` // H5新增 + NewH5FormalCount int64 `json:"newH5FormalCount"` // H5注册新增 + NewH5PcCount int64 `json:"newH5PcCount"` // +H5PC新增 + NewH5IosCount int64 `json:"NewH5IosCount"` // +H5IOS新增 + NewH5AndroidCount int64 `json:"newH5AndroidCount"` // +H5Android新增 + // 访问 + TotalVisitCount int64 `json:"totalVisitCount"` // 访问总量 + DirectVisitCount int64 `json:"directVisitCount"` // 直推访问数 + FissionVisitCount int64 `json:"fissionVisitCount"` // 裂变访问数 + NaturalVisitCount int64 `json:"naturalVisitCount"` // 自然访问数 + WebVisitCount int64 `json:"webVisitCount"` // 官网访问 + NormalVisitCount int64 `json:"normalVisitCount"` // 自来访问 + DistrictVisitCount int64 `json:"districtVisitCount"` // 渠道访问 + IosVisitCount int64 `json:"iosVisitCount"` // Ios访问量 + AndroidVisitCount int64 `json:"androidVisitCount"` // Android访问量 + LightVisitCount int64 `json:"lightVisitCount"` // light访问量 + LightVisitDirectCount int64 `json:"lightVisitDirectCount"` // light访问量直推 + LightVisitFissionCount int64 `json:"lightVisitFissionCount"` // light访问量裂变 + LightVisitDeductionCount int64 `json:"lightVisitDeductionCount"` // light访问量扣量 + LightVisitNaturalCount int64 `json:"lightVisitNaturalCount"` // light访问量自然 + LightVisitWebCount int64 `json:"lightVisitWebCount"` // light访问量官网 + LightVisitNormalCount int64 `json:"lightVisitNormalCount"` // light访问量自来 + LightVisitDistrictCount int64 `json:"lightVisitDistrictCount"` // light访问量渠道 + H5VisitCount int64 `json:"h5VisitCount"` // +H5访问量 + H5PcVisitCount int64 `json:"h5PcVisitCount"` // +H5Pc访问量 + H5IosVisitCount int64 `json:"h5IosVisitCount"` // +H5Ios访问量 + H5AndroidVisitCount int64 `json:"h5AndroidVisitCount"` // +H5Android访问量 + // 充值 + TotalAmount int64 `json:"totalAmount"` // 充值金额总量 + SuccessRechargeOrder int64 `json:"successRechargeOrder"` // 充值成功订单数 + DirectAmount int64 `json:"directAmount"` // 直推充值金额 + DirectAmountCount int64 `json:"directAmountCount"` // +直推充值订单数 + FissionAmount int64 `json:"fissionAmount"` // 裂变充值金额 + FissionAmountCount int64 `json:"fissionAmountCount"` // +裂变充值订单数 + NaturalAmount int64 `json:"naturalAmount"` // 自然充值 + NaturalAmountCount int64 `json:"naturalAmountCount"` // +自然充值订单数 + DeductionAmount int64 `json:"deductionAmount"` // 充值扣量 + DeductionAmountCount int64 `json:"deductionAmountCount"` // 充值扣量次数 + WebAmount int64 `json:"webAmount"` // 官网充值 + WebAmountCount int64 `json:"webAmountCount"` // 官网充值次数 + NormalAmount int64 `json:"normalAmount"` // 自来充值 + NormalAmountCount int64 `json:"normalAmountCount"` // 自来充值次数 + DistrictAmount int64 `json:"districtAmount"` // 渠道充值 + DistrictAmountCount int64 `json:"districtAmountCount"` // 渠道充值次数 + AndroidAmount int64 `json:"androidAmount"` // 安卓充值金额 + AndroidAmountCount int64 `json:"androidAmountCount"` // 安卓充值次数 + IosAmount int64 `json:"iosAmount"` // Ios充值金额 + IosAmountCount int64 `json:"iosAmountCount"` // Ios充值次数 + LightAmount int64 `json:"lightAmount"` // light充值金额 + LightAmountCount int64 `json:"lightAmountCount"` // light充值次数 + LightDirectAmount int64 `json:"lightDirectAmount"` // light充值金额直推 + LightDirectAmountCount int64 `json:"lightDirectAmountCount"` // light充值次数直推 + LightFissionAmount int64 `json:"lightFissionAmount"` // light充值金额裂变 + LightFissionAmountCount int64 `json:"lightFissionAmountCount"` // light充值次数裂变 + LightDeductionAmount int64 `json:"lightDeductionAmount"` // light充值金额扣量 + LightDeductionAmountCount int64 `json:"lightDeductionAmountCount"` // light充值次数扣量 + LightNaturalAmount int64 `json:"lightNaturalAmount"` // light充值金额自然 + LightNaturalAmountCount int64 `json:"lightNaturalAmountCount"` // light充值次数自然 + LightWebAmount int64 `json:"lightWebAmount"` // light充值金额官网 + LightWebAmountCount int64 `json:"lightWebAmountCount"` // light充值次数官网 + LightNormalAmount int64 `json:"lightNormalAmount"` // light充值金额自来 + LightNormalAmountCount int64 `json:"lightNormalAmountCount"` // light充值次数自来 + LightDistrictAmount int64 `json:"lightDistrictAmount"` // light充值金额渠道 + LightDistrictAmountCount int64 `json:"lightDistrictAmountCount"` // light充值次数渠道 + H5Amount int64 `json:"h5Amount"` // +H5充值金额 + H5AmountCount int64 `json:"h5AmountCount"` // +H5充值次数 + H5FormalAmount int64 `json:"h5FormalAmount"` // 当日H5Formal充值 + H5FormalAmountCount int64 `json:"h5FormalAmountCount"` // 当日H5Formal充值次数 + H5PcAmount int64 `json:"h5PcAmount"` // 当日H5Pc充值 + H5PcAmountCount int64 `json:"h5PcAmountCount"` // 当日H5Pc充值次数 + H5IosAmount int64 `json:"todayH5IosRecharge"` // 当日H5Ios充值 + H5IosAmountCount int64 `json:"h5IosAmountCount"` // 当日H5Ios充值次数 + H5AndroidAmount int64 `json:"h5AndroidAmount"` // 当日H5Android充值 + H5AndroidAmountCount int64 `json:"h5AndroidAmountCount"` // 当日H5Android充值次数 + + RepeatAmount int64 `json:"repeatAmount"` // 复冲金额 + RepeatAmountCount int64 `json:"repeatAmountCount"` // +复冲订单数 + VipPayByMoney int64 `json:"vipPayByMoney"` // 会员购买 + VipPayByAmount int64 `json:"vipPayByAmount"` // 金币购买 + VipRepeatAmount int64 `json:"vipRepeatAmount"` // VIP复冲金额 + TotalRechargeOrder int64 `json:"totalRechargeOrder"` // 拉起订单数 + RechargeSuccessRate string `json:"rechargeSuccessRate"` // 支付成功率 + GameRechageAmount int64 `json:"gameRechageAmount"` // 游戏充值 + GameWithdrawAmount int64 `json:"gameWithdrawAmount"` // 游戏提现 + + // 新用户和老用户充值 + OldRechargeAmount int64 `json:"oldRechargeAmount"` // ¥老用户充值金额 + OldVipRecharge int64 `json:"oldVipRecharge"` // ¥老用户VIP充值 + OldCoinRecharge int64 `json:"oldCoinRecharge"` // ¥老用户金币充值 + // 新增充值 + NewRechargeCount int64 `json:"newRechargeCount"` // 新增充值数 + NewRechargeAmount int64 `json:"newRechargeAmount"` // 新增充值金额 + NewVipRecharge int64 `json:"newVipRecharge"` // ¥新增VIP充值 + NewCoinRecharge int64 `json:"newCoinRecharge"` // ¥新增金币充值 + + // 落地页点击 + LandpageAndroidClick int64 `json:"landpageAndroidClick"` // 落地页android访问次数 + LandpageIosAppstoreClick int64 `json:"landpageIosAppstoreClick"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick int64 `json:"landpageIosAthorClick"` // 落地页iOS其他包访问次数 + LandpageIosH5Click int64 `json:"landpageIosH5Click"` // 落地页H5访问次数 + UpdatedAt time.Time `json:"updatedAt"` // 更新时间 +} + +type ListDownloadSummaryRes struct { + List []DownloadSummaryInfo `json:"list"` +} + +type DownloadSummaryInfo struct { + AppId int `json:"appId" bson:"_id"` + Total int `json:"total" bson:"total"` +} + +// 日常统计列表请求 +type ChannelStatExportReq struct { + AppId *[]int32 `form:"appId" json:"appId"` // appId + Channel *string `form:"channel" json:"channel"` // 渠道 + StartTime *time.Time `form:"startTime" json:"startTime"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime"` // 结束时间 +} diff --git a/api/proto/districtMinuteStat.go b/api/proto/districtMinuteStat.go new file mode 100644 index 0000000..8ff6e64 --- /dev/null +++ b/api/proto/districtMinuteStat.go @@ -0,0 +1,25 @@ +package proto + +import "time" + +// 请求曲线图数据 +type ListDistrictMinuteStatReq struct { + SumDate *time.Time `form:"sumDate" json:"sumDate" binding:"required"` // 请求日的零点时间 + ChannelCode *string `form:"channelCode" json:"channelCode"` // 请求的渠道码 + ChannelRemark *string `form:"channelRemark" json:"channelRemark"` // 渠道备注 + AppId *int32 `form:"appId" json:"appId"` // 应用id +} + +type ListDistrictMinuteStatRes struct { + AppInfo AppInfoRes `json:"appInfo"` // app信息 + TodayGraphList []DistrictMinuteStatInfo `json:"todayGraphList"` // 今日曲线图数据 + YesterdayGraphList []DistrictMinuteStatInfo `json:"yesterdayGraphList"` // 昨日曲线图数据 +} + +type DistrictMinuteStatInfo struct { + SumDate time.Time `json:"sumDate"` // 记录时间,当日零点时间 + NewCount int64 `json:"newCount"` // 新增数 + AndroidAddCount int64 `json:"androidAddCount"` // android新增 + IosAddCount int64 `json:"iosAddCount"` // ios新增 + FissionCount int64 `json:"fissionCount"` // 新增裂变 +} diff --git a/api/proto/domainInfo.go b/api/proto/domainInfo.go new file mode 100644 index 0000000..78ad66b --- /dev/null +++ b/api/proto/domainInfo.go @@ -0,0 +1,41 @@ +package proto + +import ( + "stat/common" + "stat/models/domainmod" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 请求域名列表 +type ListDomainInfoReq struct { + Name *string `json:"name"` + AppId *int32 `json:"appId"` + Enable *bool `json:"enable"` + Category *domainmod.Category `json:"category" ` // 分类 + Status *domainmod.CheckStatus `json:"status"` // 状态 + Check *domainmod.CheckType `json:"check"` // 检测方式 + common.Page +} + +// 响应域名列表 +type ListDomainInfoRes struct { + Total int64 `json:"total"` + List domainmod.DomainList `json:"list"` +} + +// 添加域名 +type AddDomainInfoReq struct { + domainmod.Domain +} + +// 修改域名 +type UpdateDomainInfoReq struct { + Id primitive.ObjectID `json:"id" binding:"required"` + Update domainmod.DomainDoc `json:"update"` +} + +// 删除域名 +type DelDomainInfoReq struct { + Id primitive.ObjectID `json:"id" binding:"required"` +} diff --git a/api/proto/inner.go b/api/proto/inner.go new file mode 100644 index 0000000..4145d2e --- /dev/null +++ b/api/proto/inner.go @@ -0,0 +1,76 @@ +package proto + +import ( + "time" +) + +type TgMsgType int32 + +const ( + TgMsgTypeNone TgMsgType = 0 + TgMsgTypeBackendRechargeMonitor TgMsgType = 1 // 后台充值监控 +) + +type SendTgMessageReq struct { + AppId int32 `json:"appId"` + MsgType TgMsgType `json:"msgType"` + Message string `json:"message"` +} + +type SendTgMessageRes struct { +} + +// InnerRechargeReq +type InnerRechargeReq struct { + InnerId int32 `json:"innerId"` + Begin time.Time `json:"begin"` + End time.Time `json:"end"` +} + +// InnerRechargeReq +type InnerRechargeBotcmdReq struct { + InnerId int32 `json:"innerId"` + BeginTime time.Time `json:"beginTime"` + EndTime time.Time `json:"endTime"` +} + +type InnerDailyMap struct { + Id string `json:"id"` + List []*InnerDailyRecharge `json:"list"` +} +type InnerDailyRecharge struct { + AppId int32 `json:"appId"` + Name string `json:"name"` + Type string `json:"type"` + DateTime string `json:"dateTime"` + SumDate time.Time `json:"sumDate"` + DailyVistCount int64 `json:"dailyVistCount"` + DailyRegister int64 `json:"dailyRegister"` + DailyAppAmount int64 `json:"dailyAppAmount"` + DailyGameAmount int64 `json:"dailyGameAmount"` + RechargeOrder int64 `json:"rechargeOrder"` + CellType int64 `json:"cellType"` + IsOld bool `json:"isOld"` + BeginRow int `json:"beginRow"` + BeginCol int `json:"beginCol"` +} + +type InnerDailyRechargeList struct { + List []*InnerDailyRecharge `json:"List"` +} + +type InnerDailyRechargeResp struct { + Code int32 `json:"code"` + Msg string `json:"msg"` + Tip string `json:"tip"` + Data InnerDailyRechargeList `json:"data"` + Time time.Time `json:"time"` +} + +/* +type InnerRechargeXlsl struct { + BeginRow int `json:"beginRow"` + BeginCol int `json:"beginCol"` + Recharge *InnerDailyRecharge `json:"recharge"` +} +*/ diff --git a/api/proto/landPageConfig.go b/api/proto/landPageConfig.go new file mode 100644 index 0000000..e9d3a73 --- /dev/null +++ b/api/proto/landPageConfig.go @@ -0,0 +1,71 @@ +package proto + +import ( + "stat/common" + "stat/models/landPageConfig" + "time" +) + +// LandingPageConfig +type LandingPageConfig struct { + Title string `json:"title" bson:"title"` //主题 + Desc string `json:"desc" bson:"desc"` //描述 + Actor string `json:"actor" bson:"actor"` //演员 + Bango string `json:"bango" bson:"bango"` //番号,唯一 + AddedTime time.Time `json:"addedTime" bson:"addedTime"` //上架时间(审核通过时间) + Picture string `json:"picture" bson:"picture"` //图片 + Media string `json:"media" bson:"media"` //视频 + Rank int64 `json:"rank" bson:"rank"` //排序 +} +type LandingPageConfigList []*LandingPageConfig + +// 响应落地页配置列表 +type LandPageConfigListResp struct { + Total int64 `json:"total"` + List landPageConfig.LandPageConfigList `json:"list"` +} + +// 新增落地页账号 +type AddLandPageConfigReq struct { + AppId *int32 `json:"appId" binding:"required"` //appId + LandPageType *int8 `json:"landPageType" binding:"required"` //类型,1PC端,2移动端 + Title *string `json:"title" binding:"required"` //主题 + Desc *string `json:"desc" bson:"desc"` //描述 + Actor *string `json:"actor" bson:"actor"` //演员 + Bango *string `json:"bango" bson:"bango"` //番号,唯一 + AddedTime *time.Time `json:"addedTime" bson:"addedTime"` //上架时间(审核通过时间) + Picture *string `json:"picture" bson:"picture"` //图片 + Media *string `json:"media" bson:"media"` //视频 + Rank *int64 `json:"rank" bson:"rank"` //排序 + Status *bool `json:"status"` //状态 +} + +// 更新落地页信息 +type UpdateLandPageConfigReq struct { + ID int64 `json:"id" binding:"required"` //Id + Title *string `json:"title" binding:"required"` //主题 + Desc *string `json:"desc" bson:"desc"` //描述 + Actor *string `json:"actor" bson:"actor"` //演员 + Bango *string `json:"bango" bson:"bango"` //番号,唯一 + AddedTime *time.Time `json:"addedTime" bson:"addedTime"` //上架时间(审核通过时间) + Picture *string `json:"picture" bson:"picture"` //图片 + Media *string `json:"media" bson:"media"` //视频 + Rank *int64 `json:"rank" bson:"rank"` //排序 + Status *bool `json:"status"` //状态 +} + +type DelLandPageConfigReq struct { + ID int64 `form:"id" json:"id" binding:"required"` //Id +} + +type FindLandPageConfigReq struct { + AppId *int32 `json:"appId"` //appId + Type *int8 `json:"type"` + Status *bool `json:"status"` + common.Page +} +type GetLandPageConfigByTypeReq struct { + AppId int32 `json:"appId" binding:"required"` //appId + Type int8 `json:"type"` + common.Page +} diff --git a/api/proto/landPageStat.go b/api/proto/landPageStat.go new file mode 100644 index 0000000..113e03d --- /dev/null +++ b/api/proto/landPageStat.go @@ -0,0 +1,28 @@ +package proto + +import "stat/models/downloadstat" + +type ConversionRate struct { + VisitToDownloadRate float64 `json:"visitToDownloadRate"` // 浏览下载转化率 + VisitToInstallRate float64 `json:"visitToInstallRate"` // 浏览安装转化率 + DownloadToInstallRate float64 `json:"downloadToInstallRate"` // 下载安装转化率 +} + +type DownloadStatInfo struct { + downloadstat.Stat + ConversionRate +} + +func (s *DownloadStatInfo) CalcConversionRate() { + if s.VisitUnique != 0 { + s.VisitToDownloadRate = float64(s.DownUnique*100) / float64(s.VisitUnique) + s.VisitToInstallRate = float64(s.InstallUnique*100) / float64(s.VisitUnique) + } + if s.DownUnique != 0 { + s.DownloadToInstallRate = float64(s.InstallUnique*100) / float64(s.DownUnique) + } +} + +func StatSummation(base, value *DownloadStatInfo) { + downloadstat.StatSummation(&base.Stat, &value.Stat) +} diff --git a/api/proto/landingpage.go b/api/proto/landingpage.go new file mode 100644 index 0000000..2c04f90 --- /dev/null +++ b/api/proto/landingpage.go @@ -0,0 +1,49 @@ +package proto + +import "stat/common" + +// LandingPageInfo 落地页管理 +type LandingPageInfo struct { + ID int64 `form:"id" json:"id"` //Id + AppId int32 `form:"appId" json:"appId"` //appId + Url string `form:"url" json:"url"` //Url + Status bool `form:"status" json:"status" binding:"required"` //状态 默认true + ChannelCode string `form:"channelCode" json:"channelCode"` //渠道码 + Type int32 `form:"type" json:"type" binding:"required"` //类型 1:渠道 2:分享 + Remark string `form:"remark" json:"remark"` //备注 +} + +// 响应落地页列表 +type LandingPageListRes struct { + Total int64 `json:"total"` + List []LandingPageInfo `json:"list"` +} + +// 新增落地页账号 +type AddLandingPageReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"required"` //appId + Url *string `form:"url" json:"url" binding:"required"` //Url + Status *bool `form:"status" json:"status" binding:"required"` //状态 默认true + ChannelCode *string `form:"channelCode" json:"channelCode"` //渠道码 + Remark *string `form:"remark" json:"remark"` //备注 + Type *int32 `form:"type" json:"type" binding:"required"` //类型 1:渠道 2:分享 +} + +// 更新落地页信息 +type UpdateLandingPageReq struct { + ID int64 `form:"id" json:"id" binding:"required"` //Id + Status *bool `form:"status" json:"status" binding:"omitempty"` //状态 默认true + Url *string `form:"url" json:"url" binding:"omitempty"` //Url + ChannelCode *string `form:"channelCode" json:"channelCode"` //渠道码 + Remark *string `form:"remark" json:"remark" binding:"omitempty"` //备注 + Type *int32 `form:"type" json:"type" binding:"required"` //类型 1:渠道 2:分享 +} + +type DelLandingPageReq struct { + ID int64 `form:"id" json:"id" binding:"required"` //Id +} + +type FindLandingPageReq struct { + AppId int32 `form:"appId" json:"appId" binding:"required"` //appId + common.Page +} diff --git a/api/proto/langpage.go b/api/proto/langpage.go new file mode 100644 index 0000000..b7f2d64 --- /dev/null +++ b/api/proto/langpage.go @@ -0,0 +1,43 @@ +package proto + +import ( + "stat/models/landpageImg" + "time" +) + +type LandpagePictureSearch struct { + Name *string `json:"name" bson:"name"` // 分类名称 + Status *bool `json:"status" bson:"status"` // 是否启用 + PageNum int64 `json:"pageNum"` + PageSize int64 `json:"pageSize"` +} + +type LandpagePictureSearchResp struct { + Total int64 `json:"total"` + List landpageImg.LandpageImgList `json:"list"` +} + +type LandpagePictureUpdate struct { + Name *string `bson:"name,omitempty" json:"name,omitempty"` // 名称 + PcAvatar *string `json:"pcAvatar" bson:"pcAvatar,omitempty"` // PC端图片 + MobileAvatar *string `json:"mobileAvatar" bson:"mobileAvatar,omitempty"` // 移动端图片 + PcBackgroud *string `json:"pcBackgroud" bson:"pcBackgroud,omitempty"` // PC端背景图 + MobileBackgroud *string `json:"mobileBackgroud" bson:"mobileBackgroud,omitempty"` // 移动端背景图 + Music *string `json:"music" bson:"music,omitempty"` // 音频文件 + Rank *int64 `json:"rank" bson:"rank,omitempty"` // 排序 + Status *bool `json:"status,omitempty" bson:"status,omitempty"` // 是否启用 + PcTitle *string `json:"pcTitle" bson:"pcTitle,omitempty"` // PC端标语 + MobileTiltle *string `json:"mobileTiltle" bson:"mobileTiltle,omitempty"` // 移动端标语 + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` // 更新时间 +} + +type LandpagePictureUpdateReq struct { + Id string `json:"id"` + Param *LandpagePictureUpdate `json:"param"` // 参数 +} +type LandpagePictureAddReq struct { + landpageImg.LandpageImg +} +type LandpagePictureDelReq struct { + Id string `json:"id"` +} diff --git a/api/proto/mediatag.go b/api/proto/mediatag.go new file mode 100644 index 0000000..7c93759 --- /dev/null +++ b/api/proto/mediatag.go @@ -0,0 +1,38 @@ +package proto + +import ( + "stat/models/mediatag" + "time" +) + +type MediaTagSearch struct { + Name *string `json:"name" bson:"name"` // 分类名称 + Status *bool `json:"status" bson:"status"` // 是否启用 + Type *mediatag.MediaTagType `json:"type" bson:"type"` // 类别 + PageNum int64 `json:"pageNum"` + PageSize int64 `json:"pageSize"` +} + +type MediaTagSearchResp struct { + Total int64 `json:"total"` + List mediatag.MediaTagList `json:"list"` +} + +type MediaTagUpdate struct { + Name *string `bson:"name,omitempty" json:"name,omitempty"` // 名称 + Rank *int64 `json:"rank" bson:"rank,omitempty"` // 排序 + Status *bool `json:"status,omitempty" bson:"status,omitempty"` // 是否启用 + Type *mediatag.MediaTagType `json:"type" bson:"type,omitempty"` // 类 + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` // 更新时间 +} + +type MediaTagUpdateReq struct { + Id string `json:"id"` + Param *MediaTagUpdate `json:"param"` // 参数 +} +type MediaTagAddReq struct { + mediatag.MediaTag +} +type MediaTagDelReq struct { + Id string `json:"id"` +} diff --git a/api/proto/minuteStat.go b/api/proto/minuteStat.go new file mode 100644 index 0000000..8bfc5c6 --- /dev/null +++ b/api/proto/minuteStat.go @@ -0,0 +1,75 @@ +package proto + +import "time" + +// 请求曲线图数据 +type ListMinuteStatReq struct { + SumDate *time.Time `form:"sumDate" json:"sumDate" binding:"required"` // 请求日的零点时间 + CompareTime *time.Time `form:"compareTime" json:"compareTime"` // 对比时间 + AppId *int32 `form:"appId" json:"appId" binding:"required"` // 应用id +} + +type ListMinuteStatRes struct { + AppInfo AppInfoRes `json:"appInfo"` // app信息 + TodayGraphList []MinuteStatInfo `json:"todayGraphList"` // 今日曲线图数据 + YesterdayGraphList []MinuteStatInfo `json:"yesterdayGraphList"` // 昨日曲线图数据 +} + +type MinuteStatInfo struct { + SumDate time.Time `json:"sumDate"` // 记录时间,当日零点时间 + NewCount int64 `json:"newCount"` // 新增数 + AndroidAddCount int64 `json:"androidAddCount"` // android新增 + IosAddCount int64 `json:"iosAddCount"` // ios新增 + H5AddCount int64 `json:"h5AddCount"` // H5新增 + RechargetCount int64 `json:"rechageCount"` // 充值订单 + RechargetMoney int64 `json:"rechageMoney"` // 充值金额 + AccessCount int64 `json:"accessCount"` // 访问量 + AndroidAccessCount int64 `json:"androidAccessCount"` // android访问量 + IosAccessCount int64 `json:"iosAccessCount"` // ios访问量 + LandpageAndroidClick int64 `json:"landpageAndroidClick"` // 落地页android访问次数 + LandpageIosAppstoreClick int64 `json:"landpageIosAppstoreClick"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick int64 `json:"landpageIosAthorClick"` // 落地页iOS其他包访问次数 + LandpageIosH5Click int64 `json:"landpageIosH5Click"` // 落地页H5访问次数 + LightGuestAddCount int64 `json:"lightGuestAddCount"` // 轻量版新增 +} + +type ListHourStatLineReq struct { + SumDate *time.Time `form:"sumDate" json:"sumDate" binding:"required"` // 请求日的零点时间 + CompareTime *time.Time `form:"compareTime" json:"compareTime"` // 对比时间 + AppId *int32 `form:"appId" json:"appId" binding:"required"` // 应用id +} + +type ListHourStatLineResp struct { + AppInfo AppInfoRes `json:"appInfo"` // app信息 + TodayGraphList []ListHourStatLineInfo `json:"todayGraphList"` // 今日曲线图数据 + YesterdayGraphList []ListHourStatLineInfo `json:"yesterdayGraphList"` // 昨日曲线图数据 +} + +type ListHourStatLineInfo struct { + SumDate time.Time `json:"sumDate"` // 记录时间,当日零点时间 + HourNew int64 `json:"hourNew" bson:"hourNew"` // 新增 + HourNewDistrict int64 `json:"hourNewDistrict" bson:"hourNewDistrict"` // 渠道新增 + HourNewWeb int64 `json:"hourNewWeb" bson:"hourNewWeb"` // 官网新增 + HourNewNormal int64 `json:"hourNewNormal" bson:"hourNewNormal"` // 自来量新增 + HourAndroidNew int64 `json:"hourAndroidNew" bson:"hourAndroidNew"` // android新增 + HourIosNew int64 `json:"hourIosNew" bson:"hourIosNew"` // Ios新增 + HourH5New int64 `json:"hourH5New" bson:"hourH5New"` // H5新增 + HourH5PcNew int64 `json:"hourH5PcNew" bson:"hourH5PcNew"` // H5Pc新增 + HourH5IosNew int64 `json:"hourH5IosNew" bson:"hourH5IosNew"` // H5Ios新增 + HourH5AndroidNew int64 `json:"hourH5AndroidNew" bson:"hourH5AndroidNew"` // H5Android新增 + //////// + HourDistrictRecharge int64 `json:"hourDistrictRecharge" bson:"hourDistrictRecharge"` // 渠道充值 + HourWebRecharge int64 `json:"hourWebRecharge" bson:"hourWebRecharge"` // 官网充值 + HourNormalRecharge int64 `json:"hourNormalRecharge" bson:"hourNormalRecharge"` // 自来量充值 + HourVipRecharge int64 `json:"hourVipRecharge" bson:"hourVipRecharge"` // VIP充值 + HourDistrictVip int64 `json:"hourDistrictVip" bson:"hourDistrictVip"` // 渠道VIP充值 + HourWebVip int64 `json:"hourWebVip" bson:"hourWeVip"` // 官网VIP充值 + HourNormalVip int64 `json:"hourNormalVip" bson:"hourNormalVip"` // 自来量VIP充值 + HourAndroidRecharge int64 `json:"hourAndroidRecharge" bson:"hourAndroidRecharge"` // android充值 + HourIosRecharge int64 `json:"hourIosRecharge" bson:"hourIosRecharge"` // Ios充值 + HourH5Recharge int64 `json:"HourH5Recharge" bson:"HourH5Recharge"` // H5充值 + HourH5PcRecharge int64 `json:"hourH5PcRecharge" bson:"hourH5PcRecharge"` // H5Pc充值 + HourH5IosRecharge int64 `json:"hourH5IosRecharge" bson:"hourH5IosRecharge"` // H5Ios充值 + HourH5AndroidRecharge int64 `json:"hourH5AndroidRecharge" bson:"hourH5AndroidRecharge"` // H5Android充值 + +} diff --git a/api/proto/monitor.go b/api/proto/monitor.go new file mode 100644 index 0000000..0c35d4d --- /dev/null +++ b/api/proto/monitor.go @@ -0,0 +1,46 @@ +package proto + +import ( + "stat/common/statutils" + "stat/models/monitormod" + "time" +) + +type MonitorSearch struct { + Name *string `json:"name" bson:"name"` // 分类名称 + AppId *int32 `json:"appId" bson:"appId"` // appId + Status *bool `json:"status" bson:"status"` // 是否启用 + Device *statutils.DeviceName `json:"device" bson:"device"` // 设备类型 + Category *monitormod.MonitorCategory `json:"category" bson:"category"` // 监控分类 + PageNum int64 `json:"pageNum"` + PageSize int64 `json:"pageSize"` +} + +type MonitorSearchResp struct { + Total int64 `json:"total"` + List monitormod.MonitorList `json:"list"` +} + +type MonitorUpdate struct { + Name *string `json:"name" bson:"name,omitempty"` // 分类名称 + AppId *int32 `bson:"appId" json:"appId,omitempty"` // appId + Status *bool `json:"status" bson:"status,omitempty"` // 是否启用 + Category *monitormod.MonitorCategory `bson:"category" json:"category"` // 分类 + Device *statutils.DeviceName `bson:"device" json:"device"` // 设备 + Duration *int64 `bson:"duration" json:"duration"` // 时间段,单位分钟 + Compare *monitormod.Compare `bson:"compare" json:"compare"` // 比较 + Threshold *int64 `bson:"threshold" json:"threshold"` // 阀值 + Comment *string `bson:"comment" json:"comment"` // 注释 + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` // 更新时间 +} + +type MonitorUpdateReq struct { + Id string `json:"id" binding:"required"` + Param *MonitorUpdate `json:"param" binding:"required"` // 参数 +} +type MonitorAddReq struct { + monitormod.Monitor +} +type MonitorDelReq struct { + Id string `json:"id"` +} diff --git a/api/proto/opLog.go b/api/proto/opLog.go new file mode 100644 index 0000000..27270ce --- /dev/null +++ b/api/proto/opLog.go @@ -0,0 +1,26 @@ +package proto + +import ( + "stat/common" + "time" +) + +type ListOpLogReq struct { + Operator *string `form:"operator" json:"operator" binding:"omitempty"` // 操作人员 + IsAdmin *bool `form:"isAdmin" json:"isAdmin" binding:"omitempty"` // 是否是管理员 true: 管理员 false: 代理商 + Router *string `form:"router" json:"router" binding:"omitempty"` // 路由 + common.Page +} + +type ListOpLogRes struct { + Total int64 `json:"total"` + List []OpLogInfo `json:"list"` +} + +type OpLogInfo struct { + Operator string `json:"operator"` // 操作人员 + Router string `json:"router"` // 接口路由 + Data string `json:"data"` // 操作数据 + IsAdmin bool `json:"isAdmin"` // 是否是管理员 + CreatedAt time.Time `json:"createdAt"` // 创建时间 +} diff --git a/api/proto/openinstall.go b/api/proto/openinstall.go new file mode 100644 index 0000000..ac4af9b --- /dev/null +++ b/api/proto/openinstall.go @@ -0,0 +1,82 @@ +package proto + +import "time" + +type ChannelAuthReq struct { + SharePassword string `json:"sharePassword" form:"sharePassword" binding:"required"` + AppId int32 `json:"appId" form:"appId" binding:"required"` + ChannelId string `json:"channelId" form:"channelId" binding:"required"` +} + +type ChannelInfoReq struct { + AppId int32 `json:"appId" form:"appId" binding:"required"` + ChannelId string `json:"channelId" form:"channelId" binding:"required"` +} + +type ChannelInfoResp struct { + Platform string `json:"platform" form:"platform"` + AppIcon string `json:"appIcon" form:"appIcon"` + AppName string `json:"appName" form:"appName"` + ChannelCode string `json:"channelCode" form:"channelCode"` + ChannelName string `json:"channelName" form:"channelName"` +} + +type OpenInstallReq struct { + AppId int32 `json:"appId" form:"appId" binding:"required"` + ChannelId string `json:"channelId" form:"channelId" binding:"required"` + StartTime time.Time `json:"startTime" form:"startTime" time_format:"2006/01/02"` + EndTime time.Time `json:"endTime" form:"endTime" time_format:"2006/01/02"` +} + +type GrowthData struct { + // Day1 []int64 `json:"1日后留存数"` + // Day7 []int64 `json:"7日后留存数"` + // Day30 []int64 `json:"30日后留存数"` + Installation []int64 `json:"安装量"` + Exposure []int64 `json:"曝光量"` + Register []int64 `json:"注册量"` + Click []int64 `json:"点击量"` +} + +type GrowthResp struct { + Time []time.Time `json:"time" form:"time"` + Data GrowthData `json:"data" form:"data"` +} + +type TotalData struct { + // Day1 int64 `json:"平均1日后留存率"` + // Day7 int64 `json:"平均7日后留存率"` + // Day30 int64 `json:"平均30日后留存率"` + Installation int64 `json:"安装量"` + Exposure int64 `json:"曝光量"` + Click int64 `json:"点击量"` + Register int64 `json:"注册量"` +} + +type TotalResp struct { + Installation int64 `json:"安装量"` + Exposure int64 `json:"曝光量"` + Click int64 `json:"点击量"` + Register int64 `json:"注册量"` + Active int64 `json:"访问量"` + Recharge int64 `json:"充值"` +} + +type ActiveData struct { + Active []int64 `json:"活跃用户数"` +} + +type ActiveResp struct { + Time []time.Time `json:"time" form:"time"` + Data ActiveData `json:"data" form:"data"` +} + +type AllStatsData struct { + Recharge []int64 `json:"充值金额"` + // ......... +} + +type AllStatsResp struct { + Time []time.Time `json:"time" form:"time"` + Data AllStatsData `json:"data" form:"data"` +} diff --git a/api/proto/sync.go b/api/proto/sync.go new file mode 100644 index 0000000..d6db42d --- /dev/null +++ b/api/proto/sync.go @@ -0,0 +1,39 @@ +package proto + +import ( + "go.mongodb.org/mongo-driver/bson/primitive" + "stat/common" + "stat/models/botdailyhourstat" + "time" +) + +type BotDailyHourListReq struct { + common.Page + SumDateStart time.Time `json:"sumDateStart" binding:"required"` + SumDateStop time.Time `json:"sumDateStop" binding:"required"` + AppId *int32 `json:"appId"` +} + +type BotDailyHourListResp struct { + Total int64 `json:"total"` + List botdailyhourstat.BotHourStatList `json:"list"` +} + +type BotMonthStatReq struct { + Month time.Time `json:"month" binding:"required"` // 只关注这个日期的年月 + AppId *int32 `json:"appId"` // 如果AppId为空,则计算所有APP +} + +type BotMonthStatResp struct { + List botdailyhourstat.BotHourStatList `json:"list"` +} + +type BotDailyHourOneReq struct { + Id primitive.ObjectID `json:"id" binding:"required"` + SumDate time.Time `json:"sumDate"` + AppId int32 `json:"appId"` +} + +type BotDailyHourOneResp struct { + Stat *botdailyhourstat.BotHourStat `json:"stat"` +} diff --git a/api/proto/tfpackage.go b/api/proto/tfpackage.go new file mode 100644 index 0000000..830ea44 --- /dev/null +++ b/api/proto/tfpackage.go @@ -0,0 +1,55 @@ +package proto + +import ( + "stat/models/tfpackagemod" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type AddTFReq struct { + AppId int32 `json:"appId" binding:"required"` // appID + DownloadUrl string `json:"downloadUrl" binding:"required"` // 下载链接 + DayMaxDownloadNum int64 `json:"dayMaxDownloadNum" binding:"required"` // 当天设置最大下载数量 + HourMaxDownloadNum int64 `json:"hourMaxDownloadNum" binding:"required"` // 每小时设置最大下载数量 + Status tfpackagemod.TFStatus `json:"status"` // 状态;0未使用,1下架,2上架 +} + +type DelTFReq struct { + Id primitive.ObjectID `json:"id"` // +} + +type UpdateTFReq struct { + Id primitive.ObjectID `json:"id"` // + AppId *int32 `json:"appId"` // appID + DownloadUrl *string `json:"downloadUrl"` // 下载链接 + DayMaxDownloadNum *int64 `json:"dayMaxDownloadNum"` // 当天设置最大下载数量 + HourMaxDownloadNum *int64 `json:"hourMaxDownloadNum"` // 每小时设置最大下载数量 + Status *tfpackagemod.TFStatus `json:"status"` // 状态;0未使用,1下架,2上架 +} + +type GetTFReq struct { + AppId *int32 `json:"appId"` // appID + Status *tfpackagemod.TFStatus `json:"status"` + PageNum int64 `json:"pageNum"` + PageSize int64 `json:"pageSize"` +} + +type GetTFResp struct { + Total int64 `json:"total"` + tfpackagemod.TfPackageList +} + +// 缓存 +type TfCacheInfo struct { + Id primitive.ObjectID `json:"id"` // + AppId int32 `json:"appId"` // appID + DownloadUrl string `json:"downloadUrl"` + DayMaxDownloadNum int64 `json:"dayMaxDownloadNum"` // 当天设置最大下载数量 + HourMaxDownloadNum int64 `json:"hourMaxDownloadNum"` // 每小时设置最大下载数量 + DayDownloadedNum int64 `bson:"dayDownloadedNum" json:"dayDownloadedNum"` // 当天已经下载数量 + HourDLNum int64 `bson:"hourDlNum" json:"hourDlNum"` // 每小时实际下载数量 + LastDownloadTime time.Time `json:"lastDownload"` // 上一次下载时间 + CountDownloadNum int64 `bson:"countDownloadNum" json:"countDownloadNum"` // 总已经下载数量 + Status tfpackagemod.TFStatus `json:"status"` // 状态;0未使用,1下架,2上架 +} diff --git a/api/proto/userInvite.go b/api/proto/userInvite.go new file mode 100644 index 0000000..71950c9 --- /dev/null +++ b/api/proto/userInvite.go @@ -0,0 +1,159 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 全民代理查询 +type UserInviteUserListReq struct { + PageNumber int64 `form:"pageNumber" json:"pageNumber" binding:"required,min=1"` // 当前页 + PageSize int64 `form:"pageSize" json:"pageSize" binding:"required,min=1,max=50"` // 每页条数 + UserId uint64 `form:"userId" json:"userId" binding:"required"` // 用户ID + Appid int32 `form:"appId" json:"appId" binding:"required"` // APPID +} + +type UserInviteUserListRes struct { + Total int64 `json:"total"` + BindUser int64 `json:"bindUser"` + List []UserInviteUserInfo `json:"list"` +} + +type UserInviteUserInfo struct { + UserId uint64 `json:"userId"` + Name string `json:"name"` + BindPhone string `json:"bindPhone"` // true 绑定 + CreateAt time.Time `json:"createAt"` // 注册时间 +} + +type UserInviteIncomeListReq struct { + PageNumber int64 `form:"pageNumber" json:"pageNumber" binding:"required,min=1"` // 当前页 + PageSize int64 `form:"pageSize" json:"pageSize" binding:"required,min=1,max=50"` // 每页条数 + UserId uint64 `form:"userId" json:"userId" binding:"required"` // 用户ID + Appid int32 `form:"appId" json:"appId" binding:"required"` // APPID +} + +type UserInviteIncomeListRes struct { + TotalInvites int64 `json:"totalInvites"` + TodayInvites int64 `json:"todayInvites"` + // YesterdayInvites int64 `json:"yesterdayInvites"` + // MouthInvites int64 `json:"mouthInvites"` + TotalInviteAmount int64 `json:"totalInviteAmount"` + TodayInviteAmount int64 `json:"todayInviteAmount"` + Total int64 `json:"total"` + List []UserInviteIncomeInfo `json:"list"` +} + +type UserInviteIncomeInfo struct { + UserId uint64 `json:"userId"` // 充值用户 + UserName string `json:"userName"` // 用户名称 + IncomeAmount int64 `json:"incomeAmount"` // 收入金币 + IncomeRate float64 `json:"incomeRate"` // 分成比例 + RechargeAt time.Time `json:"rechargeAt"` // 充值时间 +} + +type UserInviteInfoReq struct { + PageNumber int64 `form:"pageNumber" json:"pageNumber" binding:"required,min=1"` // 当前页 + PageSize int64 `form:"pageSize" json:"pageSize" binding:"required,min=1,max=50"` // 每页条数 + UserId uint64 `form:"userId" json:"userId" binding:"required"` // 用户ID + Appid int32 `form:"appId" json:"appId" binding:"required"` // APPID +} + +type UserDistrictReq struct { + AppId int32 `form:"appId" json:"appId" binding:"required"` // APPID + DistrictCode string `json:"dc"` // 剪切板信息 dc(渠道) + PromSeqe string `json:"pc"` // 剪切板信息 pc(代理) + IP string `json:"ip"` // IP信息 + SysType string `json:"sysType"` // 操作系统类型 安卓 IOS +} + +type UserDistrictCodeReq struct { + AppId int32 `form:"appId" json:"appId" binding:"required"` // AppId + UserIds []uint64 `form:"userIds" json:"userIds" binding:"required"` // 用户ID +} +type UserDistrictCodeInfo struct { + UserId uint64 `form:"userId" json:"userId" binding:"required"` // 用户ID + DistrictCode string `json:"districtCode" bson:"districtCode"` // 渠道码(兼容天宇老业务,查询本地(log_register)失败使用) + RegisterTime time.Time `json:"registerTime,omitempty" bson:"registerTime"` // 注册时间 +} +type UserDistrictCodeResp struct { + UserList []UserDistrictCodeInfo `form:"userList" json:"userList" binding:"required"` // 用户列表 +} + +type UserDistrictInfo struct { + IsDirect bool `json:"isDirect"` // 是否是直推 + DistrictCode string `json:"districtCode"` // 渠道码 + ParentPromCode string `json:"parentPromCode"` // 全民代理 上级用户推广码 + ParentId uint64 `json:"parentId"` // 全名代理 上级用户 + ParentInviteCount int64 `json:"parentInviteCount"` // 全名代理 上级用户下级用户 +} + +type ListUserInviteReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId + UserId *uint64 `form:"userId" json:"userId" binding:"omitempty"` // 渠道 + UserName *string `form:"userName" json:"userName" binding:"omitempty"` // 用户名称 + Remark *string `form:"remark" json:"remark" binding:"omitempty"` // 备注 + common.Page +} +type ListUserInviteRes struct { + Total int64 `json:"total"` + TodayInviteUser int64 `json:"todayInviteUser"` // 今日新增人数 + YesterdayInviteUser int64 `json:"yesterdayInviteUser"` // 昨日新增人数 + TodayRechargeAmount int64 `json:"todayRechargeAmount"` // 今日充值金额 + YesterdayRechargeAmount int64 `json:"yesterdayRechargeAmount"` // 昨日充值金额 + List []ListUserInviteInfo `json:"list"` +} + +type ListUserInviteInfo struct { + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + AppId int32 `json:"appId" bson:"appId"` // appID + AppName string `json:"appName"` // app名称 + UserName string `json:"userName"` // 用户名称 + PromCode string `json:"promCode" bson:"promCode"` // 用户推广序列 + BalanceCent int64 `json:"balance"` // 累计充值单位:分 + BalanceIncome int64 `json:"balanceIncome"` // 累计收益:分 + DeductionBalanceCent int64 `json:"deductionBalanceCent"` // 累计扣量单位:分 + InviteUser int64 `json:"inviteUser"` // 推广总人数 + TodayInviteUser int64 `json:"todayInviteUser"` // 今日推广人数 (定时器每天0) + DeductionRatio float64 `json:"deductionRatio"` // 扣量比例 0.0-1.00 默认:0.2 + DeductionLowerOutset int64 `json:"deductionLowerOutset" ` // 扣量起点 默认:2000元开始扣 + CreatedAt time.Time `json:"createdAt"` // 创建时间 +} + +type UpdateUserInviteInfo struct { + UserId uint64 `json:"userId" bson:"userId" binding:"required"` // 用户ID + AppId int32 `json:"appId" bson:"appId" binding:"required"` // appID + DeductionRatio float64 `json:"deductionRatio" binding:"required"` // 扣量比例 0.0-1.00 默认:0.2 + DeductionLowerOutset int64 `json:"deductionLowerOutset" binding:"required"` // 扣量起点 默认:2000元开始扣 + Remark string `json:"remark"` // 备注 +} + +type ListUserInviteOrderReq struct { + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // appId + UserId *uint64 `form:"userId" json:"userId" binding:"omitempty"` // 渠道 + IsDeduction *bool `json:"isDeduction" bson:"isDeduction" binding:"omitempty"` // 是否是扣量订单 + OrderId *string `json:"orderId" bson:"orderId" binding:"omitempty"` // 流水id + StartTime *time.Time `form:"startTime" json:"startTime" binding:"omitempty"` // 开始时间 + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 结束时间 + common.Page +} +type ListUserInviteOrderRes struct { + Total int64 `json:"total"` + List []ListUserInviteOrder `json:"list"` +} + +type ListUserInviteOrder struct { + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + UserName string `json:"userName" bson:"userName"` // 用户名称 + AppId int32 `json:"appId" bson:"appId"` // appID + AppName string `json:"appName"` // app名称 + InvitedUserId uint64 `json:"invitedUserId" bson:"invitedUserId"` // 充值用户 + PromCode string `json:"promCode" bson:"promCode"` // 用户推广序列 + IsDeduction bool `json:"isDeduction" bson:"isDeduction"` // 是否是扣量订单 + OrderId string `json:"orderId" bson:"orderId"` // 流水id + Money int64 `json:"money" bson:"money"` // 充值金额 订单金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` // 实际到账金额 用户实际支付金额 + IncomeAmount int64 `json:"incomeAmount" bson:"incomeAmount"` // 收入金币 + IncomeRate float64 `json:"incomeRate" bson:"incomeRate"` // 分成比例 + CallBack int `json:"callBack" bson:"callBack"` // 回调成功 +} diff --git a/api/proto/version.go b/api/proto/version.go new file mode 100644 index 0000000..2adf404 --- /dev/null +++ b/api/proto/version.go @@ -0,0 +1,188 @@ +package proto + +import ( + "stat/common" + "stat/models/versionMod" +) + +// VersionInfo 版本信息 +type VersionInfo struct { + Id int64 `from:"_id" json:"id"` // ID + AppId int32 `from:"appId" json:"appId"` //APPID + AppName string `from:"appname" json:"appname"` //APP名称 + VersionNum string `from:"versionNum" json:"versionNum"` //版本号 + Terminal string `from:"terminal" json:"terminal"` //终端ios android + Link []string `from:"link" json:"link"` //下载链接 + Info string `from:"info" json:"info"` //版本描述 + PackageType versionMod.PkgType `from:"packageType" json:"packageType"` //包类型:1-企业包、2-商店包、3-tf、4-超级签 + IsForceUpdate bool `from:"isForceUpdate" json:"isForceUpdate"` //是否强更 + MinVersion string `from:"minVersion" json:"minVersion"` //最小版本 + Status bool `from:"status" json:"status"` //是否启用 + Size string `from:"size" json:"size"` //更新版本大小M + BackLink string `from:"backLink" json:"backLink"` //企业签(备用连接) + Md5 string `from:"md5" json:"md5"` //MD5验证 +} + +type VersionListReq struct { + AppId *int32 `from:"appId" json:"appId"` //APPID + common.Page +} + +type VersionListResp struct { + Count int64 `json:"count" ` //总条数 + Data []*VersionInfo `json:"data" ` //数据 +} + +type VersionDelReq struct { + Id int64 `from:"id" json:"id" binding:"required"` //版本ID +} + +type VersionAddReq struct { + AppId int32 `from:"appId" json:"appId" binding:"required"` //APPID + VersionNum string `from:"versionNum" json:"versionNum" binding:"required"` //版本号 + Terminal string `from:"terminal" json:"terminal" binding:"required" ` //终端 ios android(安卓,苹果下拉框选择) + Link []string `from:"link" json:"link" binding:"required"` //下载链接 + Info string `from:"info" json:"info" binding:"omitempty"` //版本描述 + PackageType versionMod.PkgType `from:"packageType" json:"packageType" binding:"required"` //包类型:1-企业包、2-商店包、3-tf包(下拉框) + IsForceUpdate bool `from:"isForceUpdate" json:"isForceUpdate" binding:"omitempty"` //是否强更 + MinVersion string `from:"minVersion" json:"minVersion" binding:"omitempty"` //最小版本 + Status bool `from:"status" json:"status"` //是否启用 + Size string `from:"size" json:"size" binding:"omitempty" ` //更新版本大小M + BackLink string `from:"backLink" json:"backLink" binding:"omitempty"` //企业签 + Md5 string `from:"md5" json:"md5" binding:"omitempty"` //MD5验证 +} + +type VersionUpdateReq struct { + Id int64 `from:"_id" json:"id" binding:"required"` // ID + AppId *int32 `from:"appId" json:"appId" binding:"omitempty"` //APPID + VersionNum *string `from:"versionNum" json:"versionNum" binding:"omitempty"` //版本号 + Terminal *string `from:"terminal" json:"terminal" binding:"omitempty"` //终端ios android + Link *[]string `from:"link" json:"link" binding:"omitempty"` //下载链接 + Info *string `from:"info" json:"info" binding:"omitempty"` //版本描述 + PackageType *versionMod.PkgType `from:"packageType" json:"packageType" binding:"omitempty"` //包类型:1-企业包、2-商店包、3-tf + IsForceUpdate *bool `from:"isForceUpdate" json:"isForceUpdate" binding:"omitempty"` //是否强更 + MinVersion *string `from:"minVersion" json:"minVersion" binding:"omitempty"` //最小版本 + Status *bool `from:"status" json:"status" binding:"omitempty"` //是否启用 + BackLink *string `from:"backLink" json:"backLink" binding:"omitempty"` //企业签 + Size *string `from:"size" json:"size" binding:"omitempty"` //更新版本大小M + Md5 *string `from:"md5" json:"md5" binding:"omitempty"` //MD5验证 +} + +// 点击按钮(上报客户端IP信息和渠道信息) +type PageButtonClickReq struct { + AppId int32 `json:"appId"` //AppID + Ip string `from:"ip" json:"ip"` //ip + Channel string `from:"channel" json:"channel"` //渠道(json字符串) + Domain string `from:"domain" json:"domain"` //落地页域名 + PackageType versionMod.PkgType `from:"packageType" json:"packageType"` //包类型 1:企业包 2:商店包 3:TF包 4:超级签 5:轻量版 + Terminal string `from:"terminal" json:"terminal" binding:"required"` //终端ios android +} + +type TfInfo struct { + AppName string `bson:"appName" json:"appName"` //应用名称 + AppIcon string `bson:"appIcon" json:"appIcon"` //应用图标 + URL string `bson:"url" json:"url"` //URL + BackUrl string `bson:"backUrl" json:"BackUrl"` //企业签URL +} + +// 返回下载链接 +type PageButtonClickResp struct { + VersionNum string `from:"versionNum" json:"versionNum"` //版本号 + Terminal string `from:"terminal" json:"terminal"` //终端ios android light + Link []string `from:"link" json:"link"` //下载链接 + Tf []TfInfo `from:"tf" json:"tf"` //TFinfo + BackUrl string `bson:"backUrl" json:"BackUrl"` //企业签URL (不用) + PackageType versionMod.PkgType `from:"packageType" json:"packageType" binding:"required"` //包类型 1:企业包 2:商店包 3:TF包 + Status bool `from:"status" json:"status"` //是否启用 + LightData []byte `from:"lightData" json:"lightData"` //如果是轻量版,返回数据 +} + +// 落地页获取显示的按钮信息(appid标示具体应用) +type PageButtonListReq struct { + AppId int32 `from:"appId" json:"appId"` //AppID + Ip string `from:"ip" json:"ip"` //ip + Domain string `from:"domain" json:"domain"` //落地页域名 + Channel string `from:"channel" json:"channel"` //渠道(json字符串) +} + +// 落地页获取显示的按钮信息 +type PageButtonListResp struct { + IosDown bool `json:"iosDown"` // 显示完整版,是企业包 + IosStore bool `json:"iosStore"` // 显示商店包 + IosTF bool `json:"iosTF"` // TF包 + IosH5 bool `json:"iosH5"` // H5跳转链接 + IosLink string `json:"iosLink"` // 商店包下载链接 + AndroidButton int `json:"androidButton"` // android下载按钮 + HasChannelApk bool `json:"hasChannelApk"` // 有安卓渠道包 + PictureList []PageButtonPicture `json:"pictureList"` // 资源数据 + Contact ContactInfo `json:"contact"` // 联系方式 +} + +type PageButtonPicture struct { + PcAvatar string `json:"pcAvatar" bson:"pcAvatar"` // PC端图片 + MobileAvatar string `json:"mobileAvatar" bson:"mobileAvatar"` // 移动端图片 + PcBackgroud string `json:"pcBackgroud" bson:"pcBackgroud"` // PC端背景图 + MobileBackgroud string `json:"mobileBackgroud" bson:"mobileBackgroud"` // 移动端背景图 + Music string `json:"music" bson:"music"` // 音频文件 + PcTitle string `json:"pcTitle" bson:"pcTitle"` // PC端标语 + MobileTiltle string `json:"mobileTiltle" bson:"mobileTiltle"` // 移动端标语 +} +type ContactInfo struct { + Telegram string `json:"telegram" bson:"telegram"` // PC端图片 + Paoto string `json:"paoto" bson:"paoto"` // 土豆 + Madou string `json:"madou" bson:"madou"` // 官网 +} + +type PacketType int32 + +const ( + PacketTypeEnterprise PacketType = 1 // 企业签 + PacketTypeShop PacketType = 2 // 商店包 + PacketTypeTestFlight PacketType = 3 // TF包 +) + +type AppVersionReq struct { + AppId int32 `json:"appId" binding:"required"` // AppID + SysType string `json:"sysType,omitempty"` // 终端类型 + PktType PacketType `json:"pktType,omitempty"` // 包类型 + CurVersion string `json:"curVersion,omitempty"` // 当前版本 + CurPackageName string `json:"curPackageName,omitempty"` // 包名 +} + +type AppVersionResp struct { + HasNewVersion bool `json:"hasNewVersion,omitempty"` // 是否存在新版本 + ServerVersion string `json:"serverVersion,omitempty"` // 服务器新版本 + DownloadLink []string `json:"downloadLink,omitempty"` // 下载地址 + Description string `json:"description,omitempty"` // 描述 + IsForceUpdate bool `json:"isForceUpdate,omitempty"` // 是否强制升级 +} + +type ShareUrlReq struct { + AppId int32 `from:"appid" json:"appid"` // AppID +} + +// 落地页获取显示的按钮信息 +type ShareUrlResp struct { + Url []string `form:"url" json:"url"` // 分享地址 +} + +type ChannelDownLoadLinkReq struct { + AppId int32 `form:"appId" json:"appId"` // AppID + Channel string `form:"channel" json:"channel"` // 商区渠道号 +} + +type ChannelDownLoadLinkResp struct { + DownLoadLink string `json:"downLoadLink"` // 下载链接 + CmdInfo string `json:"cmdInfo"` // 下载链接 +} + +type H5ConfigReq struct { + AppId int32 `form:"appId" json:"appId"` // AppID + DC string `form:"dc" json:"dc"` // 商区渠道号 + PC string `form:"pc" json:"pc"` // 用户渠道号,即用户邀请码 + Domain string `from:"domain" json:"domain"` // 落地页域名 +} + +type H5ConfigV2Resp struct { + URL string `form:"url" json:"url"` // 描述文件链接 +} diff --git a/api/proto/withdrawOrder.go b/api/proto/withdrawOrder.go new file mode 100644 index 0000000..f596d91 --- /dev/null +++ b/api/proto/withdrawOrder.go @@ -0,0 +1,98 @@ +package proto + +import ( + "stat/common" + "time" +) + +// 请求转账订单 +type ListWithdrawOrderReq struct { + Channel *string `form:"channel" json:"channel" binding:"omitempty"` // 筛选条件 过滤条件-渠道 + Status *int `form:"status" json:"status" binding:"omitempty"` // 筛选条件 1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败 + Act *string `form:"act" json:"act" binding:"omitempty"` // 筛选条件 交易账户 + AppId *int32 `form:"appId" json:"appId" binding:"omitempty"` // 筛选条件 APP + OID *string `form:"oid" json:"oid" binding:"omitempty"` // 筛选条件 第三方支付平台id + PayType *string `form:"payType" json:"payType" binding:"omitempty"` // 筛选条件 提现方式,alipay,bankcard,usdt + TimeFilter *int64 `form:"timeFilter" json:"timeFilter" binding:"omitempty"` // 时间过滤类型 1:提现申请时间 2:第三方支付时间 3:第三方回调成功时间 + StartTime *time.Time `form:"startTime" json:"startTime" binding:"omitempty"` // 筛选条件 过滤条件-开始时间 + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 筛选条件 过滤条件-结束时间 + DistrictRemark *string `form:"districtRemark" json:"districtRemark" binding:"omitempty"` // 备注过滤 + common.Page +} + +// 转账订单结果 +type ListWithdrawOrderRes struct { + Total int64 `json:"total"` + List []WithdrawOrderInfo `json:"list"` +} + +// 提现订单信息 +type WithdrawOrderInfo struct { + ID string `json:"id"` //流水id + Channel string `json:"channel" ` //渠道 + AppId int32 `json:"appId"` //应用名称 + AppName string `json:"appName"` //应用名称 + OID string `json:"oid" ` //第三方支付平台id + Money int64 `json:"money"` //提现金额 + PayMoney int64 `json:"payMoney" ` //实际到账 + PayType string `json:"payType"` //提现方式,alipay,bankcard + ActName string `json:"actName" ` //交易账户持有人 + Act string `json:"act" ` //交易账户 + Status int `json:"status" ` //1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败 + StatusDesc string `json:"statusDesc" ` //状态说明 + CheckedAt time.Time `json:"checkedAt" ` //审核时间 + ProgressAt time.Time `json:"progressAt" ` //第三方下单成功时间 + FailureAt *time.Time `json:"failureAt,omitempty" ` //回调失败时间 + SuccessAt *time.Time `json:"successAt,omitempty" ` //回调成功时间 + UpdatedAt time.Time `json:"updatedAt" ` //刷新时间 + CreatedAt time.Time `json:"createdAt" ` //提现申请时间 + ReceivedAt time.Time `json:"receivedAt" ` //到账时间 + Operator string `json:"operator"` //操作人员 + DistrictRemark string `json:"districtRemark" ` //备注 +} + +// 代理商请求转账订单 +type ListWithdrawOrderAgentReq struct { + Status *int `form:"status" json:"status" binding:"omitempty"` // 筛选条件 1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败 + Act *string `form:"act" json:"act" binding:"omitempty"` // 筛选条件 交易账户 + OID *string `form:"oid" json:"oid" binding:"omitempty"` // 筛选条件 第三方支付平台id + PayType *string `form:"payType" json:"payType" binding:"omitempty"` // 筛选条件 提现方式,alipay,bankcard + StartTime *time.Time `form:"startTime" json:"startTime" binding:"omitempty"` // 筛选条件 过滤条件-开始时间 + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 筛选条件 过滤条件-结束时间 + common.Page +} + +// 导出提现订单请求 +type ExportWithdrawOrderReq struct { + Channel *string `form:"channel" json:"channel" binding:"omitempty"` // 筛选条件 过滤条件-渠道 + Status *int `form:"status" json:"status" binding:"omitempty"` // 筛选条件 1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败 + Act *string `form:"act" json:"act" binding:"omitempty"` // 筛选条件 交易账户 + OID *string `form:"oid" json:"oid" binding:"omitempty"` // 筛选条件 第三方支付平台id + PayType *string `form:"payType" json:"payType" binding:"omitempty"` // 筛选条件 提现方式,alipay,bankcard + TimeFilter *int64 `form:"timeFilter" json:"timeFilter" binding:"omitempty"` // 时间过滤类型 1:提现申请时间 2:第三方支付时间 3:第三方回调成功时间 + StartTime *time.Time `form:"startTime" json:"startTime" binding:"omitempty"` // 筛选条件 过滤条件-开始时间 + EndTime *time.Time `form:"endTime" json:"endTime" binding:"omitempty"` // 筛选条件 过滤条件-结束时间 +} + +// 提现订单信息 +type WithdrawOrderExportInfo struct { + ID string `json:"id"` //流水id + Channel string `json:"channel" ` //渠道 + AppName string `json:"appName"` //应用列表 + OID string `json:"oid" ` //第三方支付平台id + Money int64 `json:"money"` //提现金额 + PayMoney int64 `json:"payMoney" ` //实际到账 + PayType string `json:"payType"` //提现方式,alipay,bankcard + ActName string `json:"actName" ` //交易账户持有人 + Act string `json:"act" ` //交易账户 + Status string `json:"status" ` //1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败 + StatusDesc string `json:"statusDesc" ` //状态说明 + CheckedAt time.Time `json:"checkedAt" ` //审核时间 + ProgressAt time.Time `json:"progressAt" ` //第三方下单成功时间 + FailureAt *time.Time `json:"failureAt,omitempty" ` //回调失败时间 + SuccessAt *time.Time `json:"successAt,omitempty" ` //回调成功时间 + UpdatedAt time.Time `json:"updatedAt" ` //刷新时间 + CreatedAt time.Time `json:"createdAt" ` //提现申请时间 + ReceivedAt time.Time `json:"receivedAt" ` //到账时间 + DistrictRemark string `json:"districtRemark" ` //备注 +} diff --git a/api/statApi/game.go b/api/statApi/game.go new file mode 100644 index 0000000..062dadd --- /dev/null +++ b/api/statApi/game.go @@ -0,0 +1,63 @@ +package statApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/statSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 游戏统计 +// @Summary 提现列表 +// @Description 提现列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListBlocWithdrawDetailsReq true "参数列表" +// @Success 200 {object} proto.ListBlocWithdrawDetailsRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/game/withdraw/list [POST] +func GameWithdrawDetails(ctx *gin.Context) { + param := proto.ListBlocWithdrawDetailsReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.GameWithdrawList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 日常统计 +// @Summary日常统计充值详情(集团) +// @Description 日常统计列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListBlocRechargeDetailsReq true "参数列表" +// @Success 200 {object} proto.ListBlocRechargeDetailsRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/game/recharge/list [POST] +func GameRechargerDetails(ctx *gin.Context) { + param := proto.ListBlocRechargeDetailsReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.GameRechargeList(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} diff --git a/api/statApi/stat.go b/api/statApi/stat.go new file mode 100644 index 0000000..2f1e2c2 --- /dev/null +++ b/api/statApi/stat.go @@ -0,0 +1,569 @@ +package statApi + +import ( + "fmt" + "net/http" + "path/filepath" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/service/botser" + "stat/service/innerserverser" + "stat/service/landpageSer" + "stat/service/statSer" + "stat/statg" + "time" + + "github.com/gin-gonic/gin" +) + +// @Tags 渠道码统计 +// @Summary 渠道码统计(集团) +// @Description 渠道码统计(集团) +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.BlocListChannelCodeStatReq true "参数列表" +// @Success 200 {object} proto.BlocListChannelCodeStatRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/blocChannelCodeStat/list [POST] +func ListBlocChannelCodeStat(ctx *gin.Context) { + param := &proto.BlocListChannelCodeStatReq{} + if err := ctx.ShouldBind(param); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.ListBlocChannelCodeStat(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 渠道码统计 +// @Summary 渠道码统计(集团) +// @Description 渠道码统计(集团) +// @Accept json +// @Produce json +// @Param param body proto.BlocListChannelCodeStatReq{} true "参数列表" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/blocChannelCodeStat/export [GET] +func ExportBlocChannelCodeStat(ctx *gin.Context) { + param := &proto.BlocListChannelCodeStatReq{} + if err := ctx.ShouldBind(param); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + fPath, err := statSer.ListBlocChannelExport(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + ctx.Writer.WriteHeader(http.StatusOK) + ctx.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filepath.Base(fPath))) + ctx.Header("Content-Type", "application/octet-stream") + ctx.File(fPath) +} + +// @Tags 日常统计 +// @Summary 日常统计列表 +// @Description 日常统计列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListDailyStatReq true "参数列表" +// @Success 200 {object} proto.ListDailyStatRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/dailyStat/list [POST] +func ListDailyStat(ctx *gin.Context) { + param := proto.ListDailyStatReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.ListDailyStat(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 日常统计 +// @Summary 日常统计列表导出 +// @Description 日常统计列表导出 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListDailyStatReq true "参数列表" +// @Success 200 {object} proto.ListDailyStatRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/dailyStat/export [POST] +func ListDailyStatExport(ctx *gin.Context) { + param := proto.ListDailyStatReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + fPath, serr := statSer.ListDailyStatExport(ctx, param) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + ctx.Writer.WriteHeader(http.StatusOK) + ctx.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filepath.Base(fPath))) + ctx.Header("Content-Type", "application/octet-stream") + ctx.File(fPath) +} + +// @Tags 日常统计 +// @Summary 日常统计列表 +// @Description 日常统计列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListDailyHourStatReq true "参数列表" +// @Success 200 {object} proto.ListDailyHourStatRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/dailyhour/list [POST] +func ListDailyHourStat(ctx *gin.Context) { + param := &proto.ListDailyHourStatReq{} + if err := ctx.ShouldBind(param); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.ListDailyHourStat(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 日常统计 +// @Summary 日常统计导出 +// @Description 日常统计导出 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListDailyHourStatReq true "参数列表" +// @Success 200 {object} proto.ListDailyHourStatRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/dailyhour/export [POST] +func ListDailyHourStatExport(ctx *gin.Context) { + param := &proto.ListDailyHourStatReq{} + if err := ctx.ShouldBind(param); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + buf, err := statSer.ListDailyHourStatExport(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.DownloadFileError, err.Error()) + return + } + header := map[string]string{ + "Content-Disposition": fmt.Sprintf("attachment; filename=export.xlsx"), + } + ctx.DataFromReader(http.StatusOK, int64(buf.Len()), "application/octet-stream", buf, header) +} + +// @Tags 日常统计 +// @Summary 日常统计列表(集团) +// @Description 日常统计列表(集团) +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListBlocDailyStatReq true "参数列表" +// @Success 200 {object} proto.ListBlocDailyStatRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/blocDailyStat/list [POST] +func ListBlocDailyStat(ctx *gin.Context) { + param := proto.ListBlocDailyStatReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.BlocListDailyStat(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 日常统计 +// @Summary 日常汇总列表(集团) +// @Description 日常统计列表(集团) +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListBlocDailyStatTotalReq true "参数列表" +// @Success 200 {object} proto.ListBlocDailyStatTotalRes "成功" +// @Failure 400 {string} string "失败" +// @Router /api/stat/blocDailyStatTotal/list [POST] +func ListBlocDailyTotalStat(ctx *gin.Context) { + param := proto.ListBlocDailyStatTotalReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.BlocListDailyTotalStat(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 日常统计 +// @Summary日常统计注册详情(集团) +// @Description 日常统计列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListBlocRegisterDetailsReq true "参数列表" +// @Success 200 {object} proto.ListBlocRegisterDetailsRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/blocRegisterDetails/list [POST] +func ListBlocRegisterDetails(ctx *gin.Context) { + param := proto.ListBlocRegisterDetailsReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.BlocListRegisterDetailsInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 日常统计 +// @Summary日常统计注册详情(集团) +// @Description 日常统计列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListBlocWithdrawDetailsReq true "参数列表" +// @Success 200 {object} proto.ListBlocWithdrawDetailsRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/blocBlocWithdrawDetails/list [POST] +func ListBlocWithdrawDetails(ctx *gin.Context) { + param := proto.ListBlocWithdrawDetailsReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.BlocListWithdrawDetailsInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 日常统计 +// @Summary 支付渠道统计 +// @Description 支付渠道统计 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListBlocRechargeChannelReq true "参数列表" +// @Success 200 {object} proto.ListBlocRechargeChannelRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/BlocRechargeChannel/list [POST] +func ListBlocRechargeChannel(ctx *gin.Context) { + param := proto.ListBlocRechargeChannelReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.ListBlocRechargeChannelInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 日常统计 +// @Summary日常统计充值详情(集团) +// @Description 日常统计列表 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListBlocRechargeDetailsReq true "参数列表" +// @Success 200 {object} proto.ListBlocRechargeDetailsRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/blocRechargeDetails/list [POST] +func ListBlocRechargerDetails(ctx *gin.Context) { + param := proto.ListBlocRechargeDetailsReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.BlocListRechargeDetailsInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 主后台首页曲线图 +// @Summary 曲线图列表数据 +// @Description 曲线图列表数据 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListMinuteStatReq true "参数列表" +// @Success 200 {object} proto.ListMinuteStatRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/minuteStat/list [POST] +func ListMinuteStat(ctx *gin.Context) { + param := proto.ListMinuteStatReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.ListMinuteStat(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 主后台首页曲线图 +// @Summary 曲线图列表数据 +// @Description 曲线图列表数据 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListHourStatLineReq true "参数列表" +// @Success 200 {object} proto.ListHourStatLineResp "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/hourStat/list [POST] +func ListHourStatLine(ctx *gin.Context) { + param := proto.ListHourStatLineReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + code, data, err := statSer.ListHourStatLine(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, code, err.Error()) + return + } + + stdLog.ServerJSON(ctx, code, data) +} + +// @Tags 日常统计 +// @Summary 落地页每日统计 +// @Description 落地页每日统计 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListDailyStatReq true "参数列表" +// @Success 200 {object} proto.ListLandPageStatRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landPage/daily/list [POST] +func ListLandPageDailyStat(ctx *gin.Context) { + param := proto.ListDailyStatReq{} + if err := ctx.ShouldBind(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + data, err := landpageSer.ListDailyStat(ctx, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 日常统计 +// @Summary 落地页小时统计 +// @Description 落地页小时统计 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListDailyHourStatReq true "参数列表" +// @Success 200 {object} proto.ListLandPageStatRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landPage/hour/list [POST] +func ListLandPageHourStat(ctx *gin.Context) { + param := &proto.ListDailyHourStatReq{} + if err := ctx.ShouldBind(param); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + data, err := landpageSer.ListDailyHourStat(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 日常统计 +// @Summary 落地页下载数统计 +// @Description 落地下载数统计 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Success 200 {object} proto.ListDownloadSummaryRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/landPage/summary/downTotal/list [POST] +func ListLandPageSummaryDownTotal(ctx *gin.Context) { + data, err := landpageSer.ListSummaryDownload(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 日常统计 +// @Summary 日常统计导出 +// @Description 日常统计导出 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Param param body proto.ListDailyHourStatReq true "参数列表" +// @Success 200 {object} proto.ListDailyHourStatRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/daily-stat/jtspV2 [POST] +func GetBlocDailyStatTgbotInfo(ctx *gin.Context) { + param := &proto.BlocDailyStatReq{} + if err := ctx.ShouldBind(param); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + data := botser.GetBlocDailyStatTgbotInfo(ctx, *param.StartTime) + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 日常统计 +// @Summary 日常统计导出 +// @Description 日常统计导出 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Success 200 {object} proto.AppHourDataStatInfoRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/daily-stat/hour [POST] +func GetAppHourDataStatInfo(ctx *gin.Context) { + + data := make([]proto.HourStatText, 0) + + // 发送消息 统计数据 + curStatTime := utils.RecentMinute(time.Now(), 60) // 按60分钟对齐 + endpoints := statg.GlobalEndpoints.GetIndexEndpoints(statg.Conf.ServerIndex).GetBotStatEndpoints() + + for _, end := range endpoints { + id := end.AppId + tm := curStatTime + text, title, desc, err := botser.DailyBotReportInfo(ctx, id, tm) + if err == nil { + data = append(data, proto.HourStatText{ + Title: title, + Content: text, + Desc: desc, + }) + } + } + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 日常统计 +// @Summary 日常统计导出 +// @Description 日常统计导出 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Success 200 {object} proto.AppHourDataStatInfoRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/daily-stat/rank [POST] +func GetAppHourDataStatInfoRank(ctx *gin.Context) { + + curStatTime := utils.RecentMinute(time.Now(), 60) + // 发送消息 统计数据 + _, buf, _ := botser.DailyBotRankTaskInfo(ctx, curStatTime) + if buf != nil { + stdLog.ServerJSON(ctx, stdLog.Success, buf) + } else { + stdLog.ServerJSON(ctx, stdLog.Success, "") + } +} + +// @Tags 日常统计 +// @Summary 日常统计导出 +// @Description 日常统计导出 +// @Accept json +// @Produce json +// @Security ApiKeyAuth +// @Success 200 {object} proto.AppHourDataStatInfoRes "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/daily-stat/total [POST] +func GetTianyuAppDailyData(ctx *gin.Context) { + + // 发送消息 统计数据 + resp, _ := innerserverser.TianyuAppDailyData(ctx) + + stdLog.ServerJSON(ctx, stdLog.Success, resp) + +} diff --git a/api/userinviteapi/userinvite.go b/api/userinviteapi/userinvite.go new file mode 100644 index 0000000..b7084fa --- /dev/null +++ b/api/userinviteapi/userinvite.go @@ -0,0 +1,66 @@ +package userinviteapi + +import ( + "net/http" + + "stat/api/proto" + "stat/common/log" + "stat/common/stdLog" + "stat/service/userinviteser" + + "github.com/gin-gonic/gin" +) + +// @Tags 全民代理 +// @Summary 全民代理 +// @Description 传入用户信息登录 +// @Accept json +// @Produce json +// @Param param body proto.AdminLoginReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Router /userInvite/district [POST] +func UserDistictInfo(ctx *gin.Context) { + param := proto.UserDistrictReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + data, err := userinviteser.UserDistictInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + log.Info("district info", log.Any("request", param), log.Any("resp", data)) + + ctx.JSON(http.StatusOK, data) +} + +// @Tags 全民代理 +// @Summary 全民代理 +// @Description 传入用户信息登录 +// @Accept json +// @Produce json +// @Param param body proto.AdminLoginReq true "参数" +// @Success 200 {string} string "成功" +// @Success 400 {string} string "失败" +// @Router /user/districtcode [POST] +func UserDistrictCode(ctx *gin.Context) { + param := proto.UserDistrictCodeReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + data, err := userinviteser.UserDistrictCodeInfo(ctx, param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + log.Info("district info", log.Any("request", param), log.Any("resp", data)) + + ctx.JSON(http.StatusOK, data) +} diff --git a/api/versionApi/landingpage.go b/api/versionApi/landingpage.go new file mode 100644 index 0000000..c4ec596 --- /dev/null +++ b/api/versionApi/landingpage.go @@ -0,0 +1,182 @@ +package versionApi + +import ( + "net/http" + "stat/api/proto" + "stat/common/stdLog" + "stat/models/landingPage" + "stat/service/versionSer" + "strings" + + "github.com/gin-gonic/gin" +) + +// @Tags 落地页 +// @Summary 点击下载[跨服支持所有app] +// @Description 点击下载事件[跨服支持所有app] +// @Param req body proto.PageButtonClickReq true "参数页码" +// @Success 200 {object} proto.PageButtonClickResp "ok" +// @Router /api/stat/version/crossbottonclick [post] +func CrossButtonClick(ctx *gin.Context) { + param := proto.PageButtonClickReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + ip := ctx.ClientIP() + userAgent := ctx.Request.Header.Get("User-Agent") + data, err := versionSer.CrossButtonClick(ctx, userAgent, ip, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 落地页 +// @Summary 点击下载事件 +// @Description 点击下载事件 +// @Param req body proto.PageButtonClickReq true "参数页码" +// @Success 200 {object} proto.PageButtonClickResp "ok" +// @Router /api/stat/version/bottonclick [post] +func LandingpageButtonClick(ctx *gin.Context) { + param := proto.PageButtonClickReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + userAgent := ctx.Request.Header.Get("User-Agent") + ip := ctx.ClientIP() + data, err := versionSer.PageButtonClick(ctx, userAgent, ip, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 落地页 +// @Summary 下载按钮 +// @Description 下载按钮 +// @Param req body proto.PageButtonListReq true "参数页码" +// @Success 200 {object} proto.PageButtonListResp "ok" +// @Router /api/stat/version/bottonlist [post] +func LandingpageButtonList(ctx *gin.Context) { + param := proto.PageButtonListReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + userAgent := ctx.Request.Header.Get("User-Agent") + isIos := strings.Contains(userAgent, "iPhone") + ip := ctx.ClientIP() + data, err := versionSer.PageButtonList(ctx, isIos, ip, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 落地页 +// @Summary 下载按钮 +// @Description 下载按钮 +// @Param req body proto.ShareUrlReq true "参数页码" +// @Success 200 {object} proto.PageButtonListResp "ok" +// @Router /api/stat/share/list [post] +func ShareUrlList(ctx *gin.Context) { + param := proto.ShareUrlReq{} + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + data, err := landingPage.FindShareLandingPage(ctx, param.AppId) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + resp := proto.ShareUrlResp{ + Url: make([]string, 0), + } + for _, v := range data { + resp.Url = append(resp.Url, v.Url) + } + + ctx.JSON(http.StatusOK, resp) +} + +// @Tags 落地页 +// @Summary 获取H5下载 +// @Description 获取H5下载 +// @Accept json +// @Produce json +// @Param param body proto.H5ConfigReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/version/h5/config [POST] +func GetH5Config(ctx *gin.Context) { + ip := ctx.ClientIP() + var req = &proto.H5ConfigReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + userAgent := ctx.Request.Header.Get("User-Agent") + data, fileName := versionSer.GetH5Config(ctx, req, userAgent, ip) + + ctx.Header("Content-Type", "application/octet-stream") + ctx.Header("Content-Disposition", "attachment; filename="+fileName) + ctx.Header("Content-Transfer-Encoding", "binary") + ctx.Writer.Write(data) +} + +// @Tags 落地页 +// @Summary 获取H5下载 +// @Description 获取H5下载 +// @Accept json +// @Produce json +// @Param param body proto.ChannelDownLoadLinkReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/version/channel/newLink [POST] +func NewChannelDownLoadLink(ctx *gin.Context) { + var req = &proto.ChannelDownLoadLinkReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + resp := versionSer.NewChannelDownLoadLink(ctx, req) + + if resp == nil { + stdLog.ServerJSON(ctx, stdLog.Failure, "") + return + } + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 落地页 +// @Summary 获取H5下载 +// @Description 获取H5下载 +// @Accept json +// @Produce json +// @Param param body proto.H5ConfigReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/version/h5/config/v2 [POST] +func GetH5ConfigV2(ctx *gin.Context) { + ip := ctx.ClientIP() + var req = &proto.H5ConfigReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + resp := versionSer.GetH5ConfigV2(ctx, req, ip) + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} diff --git a/api/versionApi/landpagePicture.go b/api/versionApi/landpagePicture.go new file mode 100644 index 0000000..fd3f152 --- /dev/null +++ b/api/versionApi/landpagePicture.go @@ -0,0 +1,109 @@ +package versionApi + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/service/landpageSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 落地页资源 +// @Summary 分组分页获取落地页资源 +// @Description 分组分页获取落地页资源 +// @Accept json +// @Produce json +// @Param param body proto.LandpagePictureSearch true "参数列表" +// @Success 200 {object} proto.LandpagePictureSearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/web/landpage/picture/list [POST] +func GetLandpagePicture(ctx *gin.Context) { + var req = &proto.LandpagePictureSearch{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + resp, serr := landpageSer.LandpagePicture(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, resp) +} + +// @Tags 落地页资源 +// @Summary 添加一个落地页资源 +// @Description 添加一个落地页资源 +// @Accept json +// @Produce json +// @Param param body proto.LandpagePictureAddReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/web/landpage/picture/add [POST] +func AddOneLandpage(ctx *gin.Context) { + var req = &proto.LandpagePictureAddReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + + serr := landpageSer.AddLandpagePicture(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 落地页资源 +// @Summary 删除一个落地页资源 +// @Description 删除一个落地页资源 +// @Accept json +// @Produce json +// @Param param body proto.LandpagePictureDelReq true "参数列表" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/landpage/picture/del [POST] +func DelOneLandpage(ctx *gin.Context) { + var req = &proto.LandpagePictureDelReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err) + return + } + serr := landpageSer.DelLandpagePicture(ctx, req.Id) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 落地页资源 +// @Summary 更新一个落地页资源 +// @Description 更新一个落地页资源 +// @Accept json +// @Produce json +// @Param param body proto.LandpagePictureUpdateReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Security ApiKeyAuth +// @Router /api/stat/landpage/picture/update [POST] +func UpdateOneLandpage(ctx *gin.Context) { + var req = &proto.LandpagePictureUpdateReq{} + if err := ctx.ShouldBind(req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + serr := landpageSer.UpdateLandpagePicture(ctx, req) + if serr != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, serr) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} diff --git a/api/versionApi/version.go b/api/versionApi/version.go new file mode 100644 index 0000000..aa12cf5 --- /dev/null +++ b/api/versionApi/version.go @@ -0,0 +1,166 @@ +package versionApi + +import ( + "net/http" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/service/opLogSer" + "stat/service/versionSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 版本管理 +// @Summary 版本列表 +// @Description 版本列表 +// @Accept json +// @Produce json +// @Param param body common.Page true "参数列表" +// @Success 200 {object} proto.VersionListResp "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/version/list [POST] +func VersionList(ctx *gin.Context) { + var req proto.VersionListReq + if err := ctx.ShouldBindJSON(&req); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + data, err := versionSer.ListVersion(ctx, &req) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + stdLog.ServerJSON(ctx, stdLog.Success, data) +} + +// @Tags 版本管理 +// @Summary 版本删除 +// @Description 版本删除 +// @Accept json +// @Produce json +// @Param param body proto.VersionDelReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/version/del [POST] +func VersionDelete(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + var param proto.VersionDelReq + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + err = versionSer.DeleteVersion(ctx, param.Id) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 版本管理 +// @Summary 版本添加 +// @Description 版本添加 +// @Accept json +// @Produce json +// @Param param body proto.VersionAddReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/version/add [POST] +func VersionAdd(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + var param proto.VersionAddReq + if err := ctx.ShouldBindJSON(¶m); nil != err { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + + err = versionSer.AddVersion(ctx, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 版本管理 +// @Summary 版本更新 +// @Description 版本更新 +// @Accept json +// @Produce json +// @Param param body proto.VersionUpdateReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "失败" +// @Security ApiKeyAuth +// @Router /api/stat/version/update [POST] +func VersionUpdate(ctx *gin.Context) { + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + + var param proto.VersionUpdateReq + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + err = versionSer.UpdateVersion(ctx, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, stdLog.Success, "") +} + +// @Tags 版本管理 +// @Summary App获取版本 +// @Description app获取版本 +// @Accept json +// @Produce json +// @Param param body proto.VersionUpdateReq true "参数列表" +// @Success 200 {object} proto.AppVersionResp "成功" +// @Failure 400 {string} string "失败" +// @Router /api/stat/version/app [POST] +func AppVersion(ctx *gin.Context) { + + var param proto.AppVersionReq + if err := ctx.ShouldBindJSON(¶m); err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error()) + return + } + data, err := versionSer.AppVersion(ctx, ¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.Failure, err.Error()) + return + } + + ctx.JSON(http.StatusOK, data) +} diff --git a/api/web_appcategory/appcategory.go b/api/web_appcategory/appcategory.go new file mode 100644 index 0000000..31019e4 --- /dev/null +++ b/api/web_appcategory/appcategory.go @@ -0,0 +1,106 @@ +package web_appcategory + +import ( + "github.com/gin-gonic/gin" + "stat/common/stdLog" + "stat/models/appcategory" + "stat/service/srv_appcategory" +) + +// @Tags 应用分类 +// @Summary 添加分类 +// @Description 添加分类 +// @Accept json +// @Produce json +// @Param param body appcategory.AppCategory true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/web/appcategory/add [POST] +func AddAppCategory(ctx *gin.Context) { + params := &appcategory.AppCategory{} + err := ctx.ShouldBind(params) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + + serr := srv_appcategory.AddAppCategory(ctx, params) + if serr != nil { + stdLog.ServerJSON(ctx, serr.Code, serr.Error()) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, nil) + +} + +// @Tags 应用分类 +// @Summary 删除分类 +// @Description 删除分类 +// @Accept json +// @Produce json +// @Param param body srv_appcategory.AppCategoryDelReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/web/appcategory/del [POST] +func DelAppCategory(ctx *gin.Context) { + param := &srv_appcategory.AppCategoryDelReq{} + err := ctx.ShouldBind(param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + serr := srv_appcategory.DelAppCategory(ctx, param.Id) + if serr != nil { + stdLog.ServerJSON(ctx, serr.Code, serr.Error()) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, nil) +} + +// @Tags 应用分类 +// @Summary 更新分类 +// @Description 更新分类 +// @Accept json +// @Produce json +// @Param param body srv_appcategory.AppCategoryUpdateReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/web/appcategory/update [POST] +func UpdateAppCategory(ctx *gin.Context) { + params := &srv_appcategory.AppCategoryUpdateReq{} + err := ctx.ShouldBind(params) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + serr := srv_appcategory.UpdateAppCategory(ctx, params.Id, ¶ms.Param) + if serr != nil { + stdLog.ServerJSON(ctx, serr.Code, serr.Error()) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, nil) +} + +// @Tags 应用分类 +// @Summary 查询分类列表 +// @Description 查询分类列表 +// @Accept json +// @Produce json +// @Param param body srv_appcategory.AppCategorySearch true "参数列表" +// @Success 200 {object} srv_appcategory.AppCategorySearchResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/web/appcategory/list [POST] +func GetAppCategories(ctx *gin.Context) { + param := &srv_appcategory.AppCategorySearch{} + err := ctx.ShouldBind(¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + result, sErr := srv_appcategory.GetAppCategory(ctx, param) + if sErr != nil { + stdLog.ServerJSON(ctx, sErr.Code, sErr.Error()) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, result) +} diff --git a/api/web_application/application.go b/api/web_application/application.go new file mode 100644 index 0000000..52bcf13 --- /dev/null +++ b/api/web_application/application.go @@ -0,0 +1,136 @@ +package web_application + +import ( + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/applicationmod" + "stat/service/applicationser" + "stat/service/opLogSer" + + "github.com/gin-gonic/gin" +) + +// @Tags 应用中心 +// @Summary 添加应用 +// @Description 添加应用 +// @Accept json +// @Produce json +// @Param param body applicationmod.Application true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/web/apps/add [POST] +func AddApplication(ctx *gin.Context) { + params := &applicationmod.Application{} + err := ctx.ShouldBind(params) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + serr := applicationser.AddApplication(ctx, params, account) + if serr != nil { + stdLog.ServerJSON(ctx, serr.Code, serr.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, params) + + stdLog.ServerJSON(ctx, stdLog.Success, nil) + +} + +// @Tags 应用中心 +// @Summary 删除应用 +// @Description 删除应用 +// @Accept json +// @Produce json +// @Param param body proto.DelAppReq true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/web/apps/del [POST] +func DelApplication(ctx *gin.Context) { + param := &proto.DelAppReq{} + err := ctx.ShouldBind(param) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + serr := applicationser.DelApplication(ctx, param.Id, account) + if serr != nil { + stdLog.ServerJSON(ctx, serr.Code, serr.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, param) + + stdLog.ServerJSON(ctx, stdLog.Success, nil) +} + +// @Tags 应用中心 +// @Summary 更新应用 +// @Description 更新应用 +// @Accept json +// @Produce json +// @Param param body applicationmod.AppUpdate true "参数列表" +// @Success 200 {string} string "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/web/apps/update [POST] +func UpdateApplication(ctx *gin.Context) { + req := &applicationmod.AppUpdate{} + err := ctx.ShouldBind(req) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + account, err := utils.GetAdmin(ctx) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error()) + return + } + serr := applicationser.UpdateApplication(ctx, req, account) + if serr != nil { + stdLog.ServerJSON(ctx, serr.Code, serr.Error()) + return + } + + // 增加操作日志 + opLogSer.AddOpLog(ctx, account, true, req) + + stdLog.ServerJSON(ctx, stdLog.Success, nil) +} + +// @Tags 应用中心 +// @Summary 查询应用列表 +// @Description 查询应用列表 +// @Accept json +// @Produce json +// @Param param body proto.GetApplicationsReq true "参数列表" +// @Success 200 {object} proto.GetApplicationsResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/web/apps/list [POST] +func GetApplications(ctx *gin.Context) { + param := &proto.GetApplicationsReq{} + err := ctx.ShouldBind(¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + result, sErr := applicationser.GetAppList(ctx, param) + if sErr != nil { + stdLog.ServerJSON(ctx, sErr.Code, sErr.Error()) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, result) +} diff --git a/api/web_applicationstat/applicationstat.go b/api/web_applicationstat/applicationstat.go new file mode 100644 index 0000000..c88d07d --- /dev/null +++ b/api/web_applicationstat/applicationstat.go @@ -0,0 +1,55 @@ +package web_applicationstat + +import ( + "github.com/gin-gonic/gin" + "stat/common/stdLog" + "stat/service/srv_applicationstat" +) + +// @Tags 应用中心 +// @Summary 查询应用统计 +// @Description 查询应用统计 +// @Accept json +// @Produce json +// @Param param body srv_applicationstat.GetApplicationStatReq true "参数列表" +// @Success 200 {object} srv_applicationstat.GetApplicationStatResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/web/apps/stat [POST] +func GetApplicationStat(ctx *gin.Context) { + param := &srv_applicationstat.GetApplicationStatReq{} + err := ctx.ShouldBind(¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + result, sErr := srv_applicationstat.GetAppStatList(ctx, param) + if sErr != nil { + stdLog.ServerJSON(ctx, sErr.Code, sErr.Error()) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, result) +} + +// @Tags 应用中心 +// @Summary 查询应用统计 +// @Description 查询应用统计 +// @Accept json +// @Produce json +// @Param param body srv_applicationstat.GetApplicationStatTotalReq true "参数列表" +// @Success 200 {object} srv_applicationstat.GetApplicationStatTotalResp "成功" +// @Failure 400 {string} string "获取失败的返回结果" +// @Router /api/stat/web/apps/stattotal [POST] +func GetApplicationTotalStat(ctx *gin.Context) { + param := &srv_applicationstat.GetApplicationStatTotalReq{} + err := ctx.ShouldBind(¶m) + if err != nil { + stdLog.ServerJSON(ctx, stdLog.ParamError, nil) + return + } + result, sErr := srv_applicationstat.GetAppTotalStatList(ctx, param) + if sErr != nil { + stdLog.ServerJSON(ctx, sErr.Code, sErr.Error()) + return + } + stdLog.ServerJSON(ctx, stdLog.Success, result) +} diff --git a/common/checkWx/checkWx.go b/common/checkWx/checkWx.go new file mode 100644 index 0000000..af512e6 --- /dev/null +++ b/common/checkWx/checkWx.go @@ -0,0 +1,64 @@ +package checkWx + +import ( + "bytes" + "context" + "stat/common/httputil" + "stat/common/log" + + "time" +) + +const ApiToken string = "866mcJyA4teCehxivaCJec3qbghWStjA" + +type Resp struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data interface{} `json:"data"` +} + +type CheckResp struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data struct { + Pass bool `json:"pass"` + } `json:"data"` +} + +//获取订单信息 +func CheckWx(execUrl, domian string) (checkResp CheckResp, err error) { + c, cancle := context.WithTimeout(context.Background(), 5*time.Second) + defer cancle() + code, err := httputil.NewCtx(c).GetWithJResp(&checkResp, execUrl+"?"+bindUrl(domian), nil) + log.Info("http method CheckWx response code ==>", log.Any("statusCode", code), log.Any("checkResp", checkResp)) + if err != nil { + log.Error("CheckWx failed", log.Any("Error", err)) + } + return +} + +func TgSend(msgPayload, text string) (resp Resp, err error) { + params := map[string]interface{}{ + "tgName": "ys_bot", + "text": text, + "msgPayload": msgPayload, + "chatId": -228259065, + } + c, cancle := context.WithTimeout(context.Background(), 5*time.Second) + defer cancle() + code, err := httputil.NewCtx(c).POSTJsonWithJResp(&resp, "http://uni.ysappb.me/api/tg/send", nil, params) + log.Info("http method TgSend response code ==>", log.Any("statusCode", code), log.Any("resp", resp)) + if err != nil { + log.Error("TgSend failed", log.Any("Error", err)) + } + return +} + +func bindUrl(domain string) string { + buf := bytes.Buffer{} + buf.WriteString("apiToken=") + buf.WriteString(ApiToken + "&") + buf.WriteString("req_url=") + buf.WriteString(domain) + return buf.String() +} diff --git a/common/common.go b/common/common.go new file mode 100644 index 0000000..20361c8 --- /dev/null +++ b/common/common.go @@ -0,0 +1,6 @@ +package common + +type Page struct { + PageNum int64 `form:"pageNum" json:"pageNum" binding:"required"` // 页数 + PageSize int64 `form:"pageSize" json:"pageSize" binding:"required"` // 条数 +} diff --git a/common/config/base.go b/common/config/base.go new file mode 100644 index 0000000..f4ea824 --- /dev/null +++ b/common/config/base.go @@ -0,0 +1,27 @@ +package config + +import ( + "encoding/json" + "io/ioutil" + "os" + "stat/common/log" +) + +func LoadJSON(path string, cfg interface{}) error { + f, err := os.Open(path) + if err != nil { + log.Error("common conf load json open file", log.Any("path", path), log.E(err)) + return err + } + bs, err := ioutil.ReadAll(f) + if err != nil { + log.Error("common conf load json real all", log.Any("path", path), log.E(err)) + return err + } + err = json.Unmarshal(bs, cfg) + if err != nil { + log.Error("common conf load json Unmarshal", log.Any("path", path), log.E(err)) + return err + } + return nil +} diff --git a/common/crypt/aesecb.go b/common/crypt/aesecb.go new file mode 100644 index 0000000..a75f817 --- /dev/null +++ b/common/crypt/aesecb.go @@ -0,0 +1,43 @@ +package crypt + +import ( + "bytes" + "crypto/aes" +) + +func PKCS7PaddingEx(ciphertext []byte, blockSize int) []byte { + padding := blockSize - len(ciphertext)%blockSize + padtext := bytes.Repeat([]byte{byte(padding)}, padding) + return append(ciphertext, padtext...) +} + +func PKCS7UnPaddingEx(origData []byte) []byte { + length := len(origData) + unpadding := int(origData[length-1]) + return origData[:(length - unpadding)] +} + +func EcbDecrypt(data, key []byte) []byte { + block, _ := aes.NewCipher(key) + decrypted := make([]byte, len(data)) + size := block.BlockSize() + + for bs, be := 0, size; bs < len(data); bs, be = bs+size, be+size { + block.Decrypt(decrypted[bs:be], data[bs:be]) + } + + return PKCS7UnPaddingEx(decrypted) +} + +func EcbEncrypt(data, key []byte) []byte { + block, _ := aes.NewCipher(key) + data = PKCS7PaddingEx(data, block.BlockSize()) + decrypted := make([]byte, len(data)) + size := block.BlockSize() + + for bs, be := 0, size; bs < len(data); bs, be = bs+size, be+size { + block.Encrypt(decrypted[bs:be], data[bs:be]) + } + + return decrypted +} diff --git a/common/crypt/crypt.go b/common/crypt/crypt.go new file mode 100644 index 0000000..68bb269 --- /dev/null +++ b/common/crypt/crypt.go @@ -0,0 +1,566 @@ +package crypt + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/hmac" + "crypto/md5" + "crypto/rand" + "crypto/sha1" + "crypto/sha256" + "encoding/base64" + "encoding/hex" + "encoding/json" + "errors" + "hash/crc32" + "io" + "net/url" + "os" + "reflect" + "sort" + "strconv" + "strings" + + "github.com/dgrijalva/jwt-go" +) + +// CreateToken 生成Token算法 +func CreateToken(secret string, tokenClaims map[string]interface{}) (tokeness string, err error) { + if secret == "" { + return "", errors.New("secret is empty") + } + claims := jwt.MapClaims(tokenClaims) + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + tokeness, err = token.SignedString([]byte(secret)) + if err != nil { + return "", err + } + return tokeness, nil +} + +func keyFunc(secret string) jwt.Keyfunc { + return func(token *jwt.Token) (interface{}, error) { + return []byte(secret), nil + } +} + +// ParseToken 解析Token +func ParseToken(secret string, tokeness string) (map[string]interface{}, error) { + if secret == "" || tokeness == "" { + return nil, errors.New("secret or tokeness is empty") + } + token, err := jwt.Parse(tokeness, keyFunc(secret)) + if err != nil { + return nil, err + } + //验证token,如果token被修改过则为false + if !token.Valid { + return nil, errors.New("token is invalid") + } + claimsToken, ok := token.Claims.(jwt.MapClaims) + if !ok { + return nil, errors.New("cannot convert claim to MapClaim") + } + return claimsToken, nil +} + +// StructToStr 结构体转json 先对结构体按照字典顺序排序 并返回字符串 +func StructToStr(obj interface{}) (string, error) { + if obj == nil { + return "", errors.New("obj is not nil") + } + data := make(map[string]interface{}) + bytes, err := json.Marshal(obj) + if err != nil { + return "", err + } + err = json.Unmarshal(bytes, &data) + if err != nil { + return "", err + } + str, err := MapToStr(data) + if err != nil { + return "", err + } + return str, nil +} + +// MapToStr 对map按照字典顺序排序 并返回字符串 +func MapToStr(data map[string]interface{}) (string, error) { + if data == nil || len(data) == 0 { + return "", errors.New("data is nil or empty") + } + newData := make(map[string]interface{}) + keys := make([]string, 0, len(data)) + for k := range data { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + newData[k] = data[k] + } + b, err := json.Marshal(newData) + if err != nil { + return "", err + } + str := string(b) + return str, nil +} + +// JSON2Struct json转struct +func JSON2Struct(str string, obj interface{}) { + if err := json.Unmarshal([]byte(str), &obj); err != nil { + return + } +} + +// JSONArray2Struct json转struct +func JSONArray2Struct(str []string, obj interface{}) []interface{} { + var data []interface{} + for _, v := range str { + JSON2Struct(v, &obj) + data = append(data, obj) + } + return data +} + +// JSON2Map json转map +func JSON2Map(str string) (map[string]interface{}, error) { + var mapResult map[string]interface{} + if err := json.Unmarshal([]byte(str), &mapResult); err != nil { + return nil, err + } + return mapResult, nil +} + +// StructToStrNormal 结构体转str +func StructToStrNormal(obj interface{}) (string, error) { + str, err := json.Marshal(obj) + if err != nil { + return "", err + } + return string(str), nil +} + +func UrlValueToStr(values url.Values, exclude string) (string, string) { + if values == nil { + return "", "" + } + var buf bytes.Buffer + var sign string + keys := make([]string, 0, len(values)) + for k, _ := range values { + if k == exclude { + sign = strings.Join(values[k], "") + continue + } + keys = append(keys, k) + } + sort.Strings(keys) + for i, k := range keys { + if i != 0 { + buf.WriteString("&") + } + buf.WriteString(k) + buf.WriteString("=") + buf.WriteString(strings.Join(values[k], "")) + } + return buf.String(), sign +} + +// 对参数进行排序后 拼接成url字符串 只对一级字符串类型的参数做处理 +func MapToUrlOnlyStr(data map[string]interface{}) string { + if data == nil || len(data) == 0 { + return "" + } + var buf bytes.Buffer + keys := make([]string, 0, len(data)) + for k := range data { + keys = append(keys, k) + } + sort.Strings(keys) + for i, k := range keys { + if i != 0 { + buf.WriteString("&") + } + buf.WriteString(k) + buf.WriteString("=") + if v, ok := data[k].(string); ok { + buf.WriteString(v) + } + } + return buf.String() +} + +// MapToStr 对map按照字典顺序排序 并返回字符串url 拼接的字段 +func MapToUrlStr(data map[string]interface{}) string { + if data == nil || len(data) == 0 { + return "" + } + var buf bytes.Buffer + keys := make([]string, 0, len(data)) + for k := range data { + keys = append(keys, k) + } + sort.Strings(keys) + for i, k := range keys { + if i != 0 { + buf.WriteString("&") + } + buf.WriteString(k) + buf.WriteString("=") + if v, ok := data[k].(string); ok { + buf.WriteString(v) + } else { + t := reflect.TypeOf(data[k]) + if t != nil && t.Kind() == reflect.Map { + if v, ok := data[k].(map[string]interface{}); ok { + buf.WriteString("{") + str := MapToUrlStr(v) + buf.WriteString(str) + buf.WriteString("}") + } + } + if t != nil && (t.Kind() == reflect.Slice || t.Kind() == reflect.Array) { + arraybyte, _ := json.Marshal(data[k]) + buf.WriteString(string(arraybyte)) + } + } + } + return buf.String() +} + +// MapToURL 集合转URL +func MapToURL(m map[string]string) string { + if m == nil || len(m) == 0 { + return "" + } + v := url.Values{} + for k := range m { + v.Set(k, string(m[k])) + } + return v.Encode() +} + +func Strcut2UrlValue(obj interface{}) (string, error) { + t := reflect.TypeOf(obj) + v := reflect.ValueOf(obj) + if t.Kind() != reflect.Struct { + return "", errors.New("obj must be struct type") + } + u := url.Values{} + for i := 0; i < t.NumField(); i++ { + var value string + tag := t.Field(i).Tag.Get("json") + switch t.Field(i).Type.Kind() { + case reflect.String: + value = v.Field(i).String() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + value = strconv.Itoa(int(v.Field(i).Int())) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + value = strconv.FormatUint(v.Field(i).Uint(), 10) + case reflect.Slice, reflect.Array: + buf := bytes.Buffer{} + b, _ := json.Marshal(v.Field(i).Interface()) + t := strings.TrimRight(strings.TrimLeft(string(b), "["), "]") + array := strings.Split(t, ",") + if len(array) == 0 { + value = "" + } + if len(array) == 1 { + value = array[0] + } else { + for i, v := range array { + if i == 0 { + buf.WriteString(v) + continue + } + buf.WriteString("&") + buf.WriteString(tag) + buf.WriteString("=") + buf.WriteString(v) + value = buf.String() + } + } + } + u.Add(tag, value) + } + dcodeurl, err := url.QueryUnescape(u.Encode()) + return dcodeurl, err +} + +// StrToMd5 字符串转md5 +func StrToMd5(str string) string { + data := []byte(str) + return ByteToMd5(data) +} + +// ByteToMd5 数组转md5 +func ByteToMd5(data []byte) string { + md5Ctx := md5.New() + md5Ctx.Write(data) + cipherStr := md5Ctx.Sum(nil) + return hex.EncodeToString(cipherStr) +} + +// FileToMd5 文件转MD5 +func FileToMd5(fileName string) string { + file, err := os.Open(fileName) + if err != nil { + return "" + } + defer file.Close() + md5Ctx := md5.New() + if _, err := io.Copy(md5Ctx, file); err != nil { + return "" + } + cipherStr := md5Ctx.Sum(nil) + return hex.EncodeToString(cipherStr) +} + +// HashCode 对一个字符串生成唯一的hasHcode 码 +func HashCode(src string) int { + v := int(crc32.ChecksumIEEE([]byte(src))) + if v > 0 { + return v + } + if -v > 0 { + return -v + } + return 0 +} + +// HexToString converts +func HexToString(data []byte) string { + return hex.EncodeToString(data) +} + +// StrToSha256 字符串转sha256 +func StrToSha256(str string) string { + shaCtx := sha256.New() + shaCtx.Write([]byte(str)) + shaBytes := shaCtx.Sum(nil) + cipherStr := hex.EncodeToString(shaBytes[:]) + return cipherStr +} + +// StrToSha1 字符串转sha1 +func StrToSha1(str string, secret string) []byte { + h := hmac.New(sha1.New, []byte(secret)) + h.Write([]byte(str)) + return h.Sum(nil) +} + +// StrToSha1 字符串转sha1 转16进制后 +func StrToHmacSha1(str, secret string) string { + return hex.EncodeToString(StrToSha1(str, secret)) +} + +// StrToHmacSha256 加密 字符串转sha256加密字符串 +func StrToHmacSha256(str string, secret string) string { + h := hmac.New(sha256.New, []byte(secret)) + h.Write([]byte(str)) + cipherStr := hex.EncodeToString(h.Sum(nil)) + return cipherStr +} + +func PKCS7Padding(ciphertext []byte, blockSize int) []byte { + padding := blockSize - len(ciphertext)%blockSize + padtext := bytes.Repeat([]byte{byte(padding)}, padding) + return append(ciphertext, padtext...) +} + +func PKCS7UnPadding(origData []byte) []byte { + length := len(origData) + unpadding := int(origData[length-1]) + return origData[:(length - unpadding)] +} + +// AesEncrypt AES加密 +func AesEncrypt(origData, key string) ([]byte, error) { + origDataByte := []byte(origData) + return CoreAesEncrypt(origDataByte, key) +} + +// AesDecrypt AES解密 +func AesDecrypt(crypted, key string) (string, error) { + cryptedByte := []byte(crypted) + return CoreAesDecrypt(cryptedByte, key) +} + +// AesDecrypt AES解密 +func AesDecryptByte(cryptedByte []byte, key string) (string, error) { + return CoreAesDecrypt(cryptedByte, key) +} + +// CoreAesEncrypt AES加密 +func CoreAesEncrypt(origData []byte, key string) ([]byte, error) { + keybyte := []byte(key) + block, err := aes.NewCipher(keybyte) + if err != nil { + return nil, err + } + blockSize := block.BlockSize() + origData = PKCS7Padding(origData, blockSize) + blockMode := cipher.NewCBCEncrypter(block, keybyte[:blockSize]) + crypted := make([]byte, len(origData)) + blockMode.CryptBlocks(crypted, origData) + return crypted, nil +} + +// CoreAesDecrypt AES解密 +func CoreAesDecrypt(crypted []byte, key string) (string, error) { + keybyte := []byte(key) + block, err := aes.NewCipher(keybyte) + if err != nil { + return "", err + } + blockSize := block.BlockSize() + blockMode := cipher.NewCBCDecrypter(block, keybyte[:blockSize]) + origData := make([]byte, len(crypted)) + blockMode.CryptBlocks(origData, crypted) + origData = PKCS7UnPadding(origData) + return string(origData), nil +} + +// XorEnc +func XorEnc(src string, xorKey string) string { + var result string + j := 0 + bt := []rune(src) + xor := []rune(xorKey) + for i := 0; i < len(bt); i++ { + s := strconv.FormatInt(int64(bt[i]^xor[j]), 10) + result = result + s + j = 1 % len(xor) + } + return result +} + +// XorDec +func XorDec(src string, xorKey string) string { + var result string + j := 0 + bt := []rune(src) + xor := []rune(xorKey) + for i := 0; i < len(bt); i++ { + s := strconv.FormatInt(int64(bt[i]^xor[j]), 10) + result = result + s + j = i % len(xor) + } + return result +} + +func XorDecode(src, key string) string { + srcByte, _ := base64.StdEncoding.DecodeString(src) + keyByte, _ := base64.StdEncoding.DecodeString(key) + srcByte = xor(srcByte, keyByte) + return base64.StdEncoding.EncodeToString(srcByte) +} + +func XorEncode(src, key string) string { + return XorDecode(src, key) +} + +func xor(src []byte, key []byte) []byte { + for i := 0; i < len(src); i++ { + src[i] ^= key[i%len(key)] + } + return src +} + +func XORLength(src []byte, key []byte, length int) []byte { + for i := 0; i < length; i++ { + src[i] ^= key[i%len(key)] + } + return src[:length] +} + +// https://core.telegram.org/api/end-to-end#sending-and-receiving-messages-in-a-secret-chat +func CoreAesEncryptEx(plain []byte, nonceLen int, key string) ([]byte, error) { + nonce := make([]byte, nonceLen) + _, err := io.ReadFull(rand.Reader, nonce) + if err != nil { + return nil, err + } + var largeShaRaw []byte + largeShaRaw = append(largeShaRaw, []byte(key)...) + largeShaRaw = append(largeShaRaw, nonce...) + largeShaRawMid := len(largeShaRaw) / 2 + msgKeyLarge := sha256.Sum256(largeShaRaw) + msgKey := msgKeyLarge[8:24] //16 bytes + + var shaRawA []byte + shaRawA = append(shaRawA, msgKey...) + shaRawA = append(shaRawA, largeShaRaw[:largeShaRawMid]...) + sha256a := sha256.Sum256(shaRawA) //32 bytes + + var shaRawB []byte + shaRawB = append(shaRawB, largeShaRaw[largeShaRawMid:]...) + shaRawB = append(shaRawB, msgKey...) + sha256b := sha256.Sum256(shaRawB) //32 bytes + + var aesKey []byte //32 bytes AES-256 + aesKey = append(aesKey, sha256a[:8]...) //a: 8 bytes + aesKey = append(aesKey, sha256b[8:24]...) //b: 16 bytes + aesKey = append(aesKey, sha256a[24:32]...) //a: 8 bytes + + var aesIV []byte // 16 bytes + aesIV = append(aesIV, sha256b[:4]...) //b: 4 bytes + aesIV = append(aesIV, sha256a[12:20]...) //a: 8 bytes + aesIV = append(aesIV, sha256b[28:]...) //b: 4 bytes + + block, err := aes.NewCipher(aesKey) + if err != nil { + return nil, err + } + blockSize := block.BlockSize() + ciphertext := PKCS7Padding(plain, blockSize) + mode := cipher.NewCBCEncrypter(block, aesIV) + cipher := make([]byte, nonceLen+len(ciphertext)) + copy(cipher, nonce) + mode.CryptBlocks(cipher[nonceLen:], ciphertext) + return cipher, nil +} + +func CoreAesDecryptEx(crypt []byte, nonceLen int, key string) ([]byte, error) { + nonce := make([]byte, nonceLen) + copy(nonce, crypt) + var largeShaRaw []byte + largeShaRaw = append(largeShaRaw, []byte(key)...) + largeShaRaw = append(largeShaRaw, nonce...) + largeShaRawMid := len(largeShaRaw) / 2 + msgKeyLarge := sha256.Sum256(largeShaRaw) + msgKey := msgKeyLarge[8:24] //16 bytes + + var shaRawA []byte + shaRawA = append(shaRawA, msgKey...) + shaRawA = append(shaRawA, largeShaRaw[:largeShaRawMid]...) + sha256a := sha256.Sum256(shaRawA) //32 bytes + + var shaRawB []byte + shaRawB = append(shaRawB, largeShaRaw[largeShaRawMid:]...) + shaRawB = append(shaRawB, msgKey...) + sha256b := sha256.Sum256(shaRawB) //32 bytes + + var aesKey []byte //32 bytes AES-256 + aesKey = append(aesKey, sha256a[:8]...) //a: 8 bytes + aesKey = append(aesKey, sha256b[8:24]...) //b: 16 bytes + aesKey = append(aesKey, sha256a[24:32]...) //a: 8 bytes + + var aesIV []byte // 16 bytes + aesIV = append(aesIV, sha256b[:4]...) //b: 4 bytes + aesIV = append(aesIV, sha256a[12:20]...) //a: 8 bytes + aesIV = append(aesIV, sha256b[28:]...) //b: 4 bytes + + block, err := aes.NewCipher(aesKey) + if err != nil { + return nil, err + } + realData := crypt[nonceLen:] + blockMode := cipher.NewCBCDecrypter(block, aesIV) + origData := make([]byte, len(realData)) + blockMode.CryptBlocks(origData, realData) + return PKCS7UnPadding(origData), nil +} diff --git a/common/crypt/crypt_test.go b/common/crypt/crypt_test.go new file mode 100644 index 0000000..49cc43b --- /dev/null +++ b/common/crypt/crypt_test.go @@ -0,0 +1,27 @@ +package crypt + +import ( + "stat/common/log" + "testing" +) + +var ( + PlatPublicKey = ` +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCWtWnWmTgLemO+GBMWIX9N5yx2 +YMc+4MczBogNdTFjF4rrd/+Y1G9qJ8ZDHR7qjBQgJjzcZrGYRUf2wiY6T9ble9+h +s14pYPpXqkSoD2VOQI4+idb6nRgVQ6rXyMQps7ORcshmEtIS/Ra3aG3XaAFAUCfO +E3nHGyldtNIGvuBTAQIDAQAB +-----END PUBLIC KEY-----` +) + +func TestRSA(t *testing.T) { + //data := make([]byte, 0) + testData := "是对的发送打赏打赏打赏打赏的" + rawContext, err := RSAEncryptByPublicKey(PlatPublicKey, []byte(testData)) + if err != nil { + log.Error("wnth RSAEncryptByPublicKey err", log.Any("err", err)) + return + } + log.Info(string(rawContext)) +} diff --git a/common/crypt/rsa.go b/common/crypt/rsa.go new file mode 100644 index 0000000..b733c8e --- /dev/null +++ b/common/crypt/rsa.go @@ -0,0 +1,164 @@ +package crypt + +import ( + "bytes" + "crypto" + "crypto/rand" + "crypto/rsa" + "crypto/sha256" + "crypto/x509" + "encoding/pem" + "errors" + "fmt" + "stat/common/log" +) + +func splitBytesSlice(data []byte, n int) [][]byte { + var chunk []byte + chunks := make([][]byte, 0, len(data)/n+1) + for len(data) >= n { + chunk, data = data[:n], data[n:] + chunks = append(chunks, chunk) + } + if len(data) > 0 { + chunks = append(chunks, data[:]) + } + return chunks +} + +func rsaBytesToPublicKey(pub []byte) (*rsa.PublicKey, error) { + // fmt.Printf("pubKey is %s", string(pub)) + block, _ := pem.Decode(pub) + enc := x509.IsEncryptedPEMBlock(block) + b := block.Bytes + var err error + if enc { + b, err = x509.DecryptPEMBlock(block, nil) + if err != nil { + log.Error("RSABytesToPublicKey DecryptPEMBlock err", log.E(err)) + return nil, err + } + } + + pk, err := x509.ParsePKIXPublicKey(b) + if err != nil { + log.Error("RSABytesToPublicKey ParsePKIXPublicKey err", log.E(err)) + return nil, err + } + if pk_, ok := pk.(*rsa.PublicKey); ok { + return pk_, nil + } + log.Error("RSABytesToPublicKey error input not PublicKey") + return nil, errors.New("Not RSA PublicKey format") +} + +func rsaBytesToPrivateKey(priv []byte) (*rsa.PrivateKey, error) { + block, _ := pem.Decode(priv) + enc := x509.IsEncryptedPEMBlock(block) + b := block.Bytes + var err error + if enc { + b, err = x509.DecryptPEMBlock(block, nil) + if err != nil { + log.Error("RSABytesToPrivateKey DecryptPEMBlock err", log.E(err)) + return nil, err + } + } + key, err := x509.ParsePKCS8PrivateKey(b) + if err != nil { + log.Error("RSABytesToPrivateKey ParsePKCS8PrivateKey err", log.E(err)) + return nil, err + } + if pk_, ok := key.(*rsa.PrivateKey); ok { + return pk_, nil + } + log.Error("RSABytesToPrivateKey error input not PrivateKey") + return nil, errors.New("Not RSA PrivateKey format") +} + +// 公钥加密 +func RSAEncryptByPublicKey(pemPubKey string, data []byte) ([]byte, error) { + pubKey, err := rsaBytesToPublicKey([]byte(pemPubKey)) + if err != nil { + log.Error("RSAEncryptByPublicKey rsaBytesToPublicKey err", log.E(err)) + return nil, err + } + partLen := pubKey.N.BitLen()/8 - 11 + chunks := splitBytesSlice(data, partLen) + result := bytes.Buffer{} + for _, chunk := range chunks { + cipherSilce, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, chunk) + if err != nil { + log.Error("RSAEncryptByPublicKey EncryptPKCS1v15 err", log.E(err)) + return nil, err + } + result.Write(cipherSilce) + } + return result.Bytes(), nil +} + +// 私玥签名 +func RSASignByPrivateKey(pemPrivateKey string, data []byte, hash crypto.Hash) ([]byte, error) { + fmt.Printf("pemPrivateKey is %s\n", pemPrivateKey) + privateKey, err := rsaBytesToPrivateKey([]byte(pemPrivateKey)) + if err != nil { + log.Error("RSASignByPrivateKey rsaBytesToPrivateKey err", log.E(err)) + return nil, err + } + h := hash.New() + h.Write(data) + hashed := make([]byte, 0) + hashed = h.Sum(hashed) + + return rsa.SignPKCS1v15(rand.Reader, privateKey, hash, hashed) + +} +func RSAVerifyByPublicKey(publicKey string, data, sign []byte, hash crypto.Hash) (err error) { + pubKey, err := rsaBytesToPublicKey([]byte(publicKey)) + if err != nil { + log.Error("RSAEncryptByPublicKey rsaBytesToPublicKey err", log.E(err)) + return err + } + h := hash.New() + h.Write(data) + hashed := make([]byte, 0) + hashed = h.Sum(hashed) + return rsa.VerifyPKCS1v15(pubKey, hash, hashed, sign) +} + +// 公钥解密 +func RSADecryptByPrivateKey(pemPrivateKey string, cipherData []byte) ([]byte, error) { + privateKey, err := rsaBytesToPrivateKey([]byte(pemPrivateKey)) + if err != nil { + log.Error("RSADecryptByPrivateKey rsaBytesToPrivateKey err", log.E(err)) + return nil, err + } + blockLen := privateKey.N.BitLen() / 8 + chunks := splitBytesSlice(cipherData, blockLen) + result := bytes.Buffer{} + for _, chunk := range chunks { + plain, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, chunk) + if err != nil { + log.Error("RSADecryptByPrivateKey DecryptPKCS1v15 err", log.E(err)) + return nil, err + } + result.Write(plain) + } + return result.Bytes(), nil +} + +// 私玥签名 +func RSASignByPrivateKeySHA256(pemPrivateKey string, data []byte, hash crypto.Hash) ([]byte, error) { + fmt.Printf("pemPrivateKey is %s\n", pemPrivateKey) + privateKey, err := rsaBytesToPrivateKey([]byte(pemPrivateKey)) + if err != nil { + log.Error("RSASignByPrivateKey rsaBytesToPrivateKey err", log.E(err)) + return nil, err + } + h := sha256.New() + h.Write(data) + // hashed := make([]byte, 0) + hashed := h.Sum(nil) + + return rsa.SignPSS(rand.Reader, privateKey, hash, hashed, nil) +} diff --git a/common/enum/consts/consts.go b/common/enum/consts/consts.go new file mode 100644 index 0000000..b95005d --- /dev/null +++ b/common/enum/consts/consts.go @@ -0,0 +1,22 @@ +package consts + +type RunMod string + +const ( + RunModeDev RunMod = "dev" + RunModeTest RunMod = "test" + RunModRelease RunMod = "release" +) +const ( + ShowMagic int = 8564 +) + +var StatusDesc = map[bool]string{ + true: "打开", + false: "关闭", +} + +var IsShowDesc = map[bool]string{ + true: "展示", + false: "不展示", +} diff --git a/common/enum/redisconst/const.go b/common/enum/redisconst/const.go new file mode 100644 index 0000000..6e31aa7 --- /dev/null +++ b/common/enum/redisconst/const.go @@ -0,0 +1,120 @@ +package redisconst + +import ( + "fmt" + "strings" + "time" +) + +const ( + visitLogFmt = "visitlog:%s:%d" + AvSearchPre = "yc_av_search_cache:%s:%d" + PostSearchPre = "yc_post_search_cache:%s:%d" + //SpCache = "sp_cache" + FiveMVisit = "yc_visitFmt:%s" + BloomUser = "yc_bloom_user:%d" + AppUserToken = "yc_app_user_token:%d" + H5AppUserToken = "yc_h5app_user_token:%d" + captchaKey = "yc_captcha_mobile_%s" + CaptchaExpire = 5 * time.Minute + + traderChatCacheFmt = "trader:cache:%d" + TraderChatCacheExpire = 2 * time.Minute + + mediaM3U8Fmt = "m3u8cache:%s" + MediaM3U8CacheExpire = time.Hour * 24 * 7 + + //禁止登陆设置 + userForbit = "userForbit:%d" + ipForbit = "ipForbit:%s" + + //用户关注限制 + careLimitKey = "carelimit:%d" + CareLimitKeyExpire = 15 * time.Second + + //用户发帖限制 + commentLimitKey = "commentlimit:%d" + CommentLimitKeyExpire = 15 * time.Second + //用户firstVipGiftCheck + firstVipGiftCheck = "gameVipCheck:%d" + + //每用户访问次数限制 + userCallLimit = "userCall:%d" + ipCallLimit = "ipCall:%s" + CallLimitExpire = time.Second * 10 + + //游戏orderkey + gameOrderKey = "gameOrderKey:%s" + GameOrderKeyExpire = time.Second * 10 +) + +func BloomUserKey(userId int64) string { + return fmt.Sprintf(BloomUser, userId) +} + +func FiveMVisitKey(time string) string { + return fmt.Sprintf(FiveMVisit, time) +} + +func UserVisitLogKey(uid int64, t time.Time) string { + return fmt.Sprintf(visitLogFmt, t.Format("20060102"), uid) +} + +func AvSearchCacheKey(keyword string, skip int64) string { + return fmt.Sprintf(AvSearchPre, keyword, skip) +} + +func PostSearchCacheKey(keyword string, skip int64) string { + return fmt.Sprintf(PostSearchPre, keyword, skip) +} + +func MobileCaptchaKey(mobile string) string { + return fmt.Sprintf(captchaKey, mobile) +} + +func AppUserTokenKey(userId int64) string { + return fmt.Sprintf(AppUserToken, userId) +} +func H5AppUserTokenKey(userId int64) string { + return fmt.Sprintf(H5AppUserToken, userId) +} + +func TraderChatCacheKey(uid uint64) string { + return fmt.Sprintf(traderChatCacheFmt, uid) +} + +func MediaM3U8Key(name string) string { + return fmt.Sprintf(mediaM3U8Fmt, name) +} +func UserForbitKey(userId int64) string { + return fmt.Sprintf(userForbit, userId) +} + +func CareLimitKey(userId int64) string { + return fmt.Sprintf(careLimitKey, userId) +} + +func CommentLimitKey(userId int64) string { + return fmt.Sprintf(commentLimitKey, userId) +} + +func FirstVipGiftCheck(userId int64) string { + return fmt.Sprintf(firstVipGiftCheck, userId) +} + +func UserCallLimitKey(userId int64) string { + return fmt.Sprintf(userCallLimit, userId) +} + +func IpCallLimitKey(ip string) string { + return fmt.Sprintf(ipCallLimit, ip) +} + +func IpForbitKey(ip string) string { + ip = strings.ReplaceAll(ip, ":", "-") + return fmt.Sprintf(ipForbit, ip) +} + +func GameOrderKey(orderId string) string { + return fmt.Sprintf(gameOrderKey, orderId) +} diff --git a/common/errors/code.go b/common/errors/code.go new file mode 100644 index 0000000..430410d --- /dev/null +++ b/common/errors/code.go @@ -0,0 +1,168 @@ +package errors + +type CodeType int64 + +const NotFind = "mongo: no documents in result" + +// 错误级别 +const ( + ParamLevel = 1000 // 参数级 + StoreLevel = 3000 // 存储级 + ServerLevel = 4000 // 服务级 + BusinessLevel = 6000 // 业务逻辑级 +) + +// app 端用到了 +// 1000, 重新登陆 +// 4002 短信发送失败 +// 6017 手机号码已绑定 +// 6023 user_video操作错误 +// 这里作出兼容 + +func (c CodeType) Error() string { + return "" +} + +const ( + InvalidateToken CodeType = ParamLevel + iota // 不可用的token,客户端需要重新登陆 + MethodNotFound // 方法为找到,指gin方法未找到 + ApiNotFound // api未找到 + Limiting // 限流 + NoToken // 无token 1004 +) + +const ( + DBQuery CodeType = StoreLevel + iota + DBInsert + DBUpdate + DBDelete + RedisSet + RedisGet + RedisDel + ProxyPutObject + EtcdGet + EtcdPut + RedisRPush + RedisLPop +) + +const ( + HttpClient CodeType = ServerLevel + iota // httpclient + TypePointer // 指针类型 + SmsLimit // 短信限制 + SmsSend // 短信发送失败 + SmsTmp // 短信模版 + SmsTmpParse // 短信模版解析 + UserId // 用户ID + OpenFile // 打开文件 + FsErr // seaweedfs + CtxTimeout // context超时 + UnmarshalJson // json + FSFiler // fs filer + HttpGet // + ReadData // read data + IOCopy // io copy + Pass // pass + PassConfID // pass config id + Tips // 提示错误 +) + +const ( + // 用户权限 + UserPermission CodeType = BusinessLevel + iota + Unknown // 未知错误 + InvalidKeyword // 无效的关键字 + UserName // 用户名称 + Mobile // 手机号码 + Captcha // 验证码 + CaptchaErr // 验证码错误 + Psw // 密码 + PayCode // 用户支付密码 + Number // 数字类型 + String // 字符串类型 + VideoId // 视频ID + Progress // 进度 + Ids // id数组 + CatagoryExist // 视频种类已存在 + MobileBinded // 手机号码已绑定 + Rate // 返佣金比例 + Brokerage // 返佣 + Logo // 用户logo + UploadFile // + EmptyFile // + Operate // user_video操作错误 + UserDisable // + NickName // + Gender // + InviteCode // + Coat // + ReLogin // + PopType // + AgentBinded // + M3u8FileName // + M3u8Read // + VideoName // + ExchangeCodeErr // 兑换码错误 + ChanAcount // + Recharge // + Withdraw // + ExportErr // 导出参数错误 + DomainErr // 主域名错误 + ForbiddenWord // 禁言 + ForbiddenLogin // 禁止登陆 + DuplicateLike // 重复点赞 + AliPayUnBind // 支付宝未绑定 + BankCardUnBind // 银行卡未绑定 + VideoUploadExist // 视频重复上传 + Task // + PostsNewArgsInvalid // 帖子参数错误 + PostDupi // 帖子重复发送 + PostNotExisted // 帖子不存在 + PostLikeOnLiked // 重复点赞帖子 + PostUndoLikeOnUnliked // 尚未点赞,不可取消点赞 + PostFavOnFaved // 重复 收藏 + PostUndoFavOnUnfaved // 尚未收藏,不可取消收藏 + PostDisLikeOnDisLiked // 重复屏蔽帖子 + PostUndoDisLikeOnUnliked // 尚未屏蔽,不可取消屏蔽 + UserDoNotForSelf // 用户不能对自己进行此项操作 + UserWatchDupi // 不可重复关注同一用户 + UserNoWatch // 没有关注该用户,不可取消关注 + PostRepleNewArgsInvalid // 帖子 回复 参数错误 + PostReplyNotExisted // 评论不存在 + PostReplyAlready // 评论不存在 + NoWatchableUsers // 没有可以关注的用户池 + PostReplyLikeOnLiked // 重复点赞帖子 + PostReplyUndoLikeOnUnliked // 尚未点赞,不可取消点赞 + PostPriceInvalid // 帖子定价异常,不可购买 + PostIsBuyed // 帖子已购买,不可重复购买 + NoBalance // 余额不足 + BalanceErr // 编辑余额错误 + NoAccount // 没账户 + AccountDisabled // 账户已被封禁 + BuySelf // 自己帖子,不用购买 + RedisError // 服务器繁忙 + Button // 落地页按钮 + ReplyTimeShort // 回复间隔时间太短 + OperateLog // 日志出错 + RoleErr // 角色权限不够 + DocExists // 查找的文档已存在 + PostUnknownError // 未知错误 + SeekScoreConfirm // 商人追分确认 + GetOrderInfo // 商人充值订单报错 + PromSeq // 商区错误 + SignErr // 签名错误 + BadRequest // 传参错误 + ReplyPoolExisted // 评论已存在 +) + +//代充专用 +const ( + TakeChatFail CodeType = iota + 18000 //发起代充聊天失败 18000 + GetOrderInfoFail //获取代理充值订单信息失败 18001 + AppIDNotExist //代充AppID 不存在 18002 + TraderNotExist //此商人不存在 18003 + TraderBalanceNotEnough //商人余额不足 18004 + TraderHasLocked //商人被禁止登陆 18005 + TraderSeekScoreFail //商人追分失败 18006 + TraderSeekScoreFailDueNotEnough //商人追分失败 18007 +) diff --git a/common/errors/error.go b/common/errors/error.go new file mode 100644 index 0000000..1421715 --- /dev/null +++ b/common/errors/error.go @@ -0,0 +1,39 @@ +package errors + +import ( + "fmt" +) + +// SrvErr 错误定义 +type SrvErr struct { + Code CodeType `json:"code"` + Msg string `json:"msg"` + Tips string `json:"tip,omitempty"` + Cause string `json:"-"` +} + +// New create an error +func New(code CodeType, msg string, cause string) *SrvErr { + return &SrvErr{ + Code: code, + Msg: msg, + Cause: cause, + } +} + +// New create an error +func NewTips(code CodeType, tips string, cause string) *SrvErr { + return &SrvErr{ + Code: code, + Msg: tips, + Tips: tips, + Cause: cause, + } +} + +func (s *SrvErr) Error() string { + if s == nil { + return "" + } + return fmt.Sprintf("code = %d, msg = %s ,case = %v", s.Code, s.Msg, s.Cause) +} diff --git a/common/errors/make.go b/common/errors/make.go new file mode 100644 index 0000000..4d6cf54 --- /dev/null +++ b/common/errors/make.go @@ -0,0 +1,24 @@ +package errors + +import ( + "fmt" + "runtime" +) + +func MakeWithErr(code CodeType, err error) error { + pc, fn, line, _ := runtime.Caller(1) + cause := fmt.Sprintf("[error] in %s[%s:%d] %v", runtime.FuncForPC(pc).Name(), fn, line, err.Error()) + return New(code, err.Error(), cause) +} + +func MakeWithMsg(code CodeType, msg string) error { + pc, fn, line, _ := runtime.Caller(1) + cause := fmt.Sprintf("[error] in %s[%s:%d] %v", runtime.FuncForPC(pc).Name(), fn, line, msg) + return New(code, msg, cause) +} + +func MakeWithTips(code CodeType, tips string) error { + pc, fn, line, _ := runtime.Caller(1) + cause := fmt.Sprintf("[error] in %s[%s:%d] %v", runtime.FuncForPC(pc).Name(), fn, line, tips) + return NewTips(code, tips, cause) +} diff --git a/common/file/proxy.go b/common/file/proxy.go new file mode 100644 index 0000000..bfc8876 --- /dev/null +++ b/common/file/proxy.go @@ -0,0 +1,30 @@ +package file + +import ( + "context" + "errors" + "fmt" + "mime/multipart" + "stat/common/proxy" +) + +type FileObject struct { + File *multipart.FileHeader +} + +// PutObject 上传文件 +func PutObject(ctx context.Context, apiUrl string, fo *FileObject) (urlstr string, err error) { + if fo.File == nil { + err = errors.New("invalid file") + return + } + + file, err := fo.File.Open() + if err != nil { + err = errors.New(fmt.Sprintf("invalid file %+v", err)) + return + } + defer file.Close() + urlstr, err = proxy.PutObject(ctx, apiUrl, fo.File.Filename, file) + return +} diff --git a/common/genId/lid.go b/common/genId/lid.go new file mode 100644 index 0000000..a015593 --- /dev/null +++ b/common/genId/lid.go @@ -0,0 +1,161 @@ +package genId + +import ( + "stat/common/genId/lid" + "stat/common/mongos" +) + +var roleIdLid *lid.Lid // 角色id +var landingpageIdLid *lid.Lid // 落地页id +var versionLid *lid.Lid // 版本id自增器 +var commodityLid *lid.Lid // 商品自增器 +var adsLocLid *lid.Lid // 广告位置id自增器 +var adsLid *lid.Lid // 广告id自增器 +var lfLid *lid.Lid // 楼凤id自增器 +var lfComplaintLid *lid.Lid // 楼凤投诉自增器 +var modelBrokerLid *lid.Lid // 嫩模经纪人(茶老板)自增器 +var modelLid *lid.Lid // 嫩模自增器 +var novelLid *lid.Lid // 小说自增器 +var audioBook *lid.Lid // 有声小说自增器 +var landpageConfig *lid.Lid // 落地页配置id +var appCategory *lid.Lid // +var appLocLid *lid.Lid // 应用中心位置id自增器 + +func Start() { + var err error + collection := mongos.MgoManager.Database().Collection("generate_id") + + roleIdLid, err = lid.NewLid(collection, "role_id", 1) + if err != nil { + panic(err) + } + landingpageIdLid, err = lid.NewLid(collection, "langdingpage_id", 1) + if err != nil { + panic(err) + } + + versionLid, err = lid.NewLid(collection, "version_id", 1) + if err != nil { + panic(err) + } + + commodityLid, err = lid.NewLid(collection, "commodity_id", 1) + if err != nil { + panic(err) + } + + adsLocLid, err = lid.NewLid(collection, "advertise_loc_id", 1) + if err != nil { + panic(err) + } + + adsLid, err = lid.NewLid(collection, "advertise_id", 1) + if err != nil { + panic(err) + } + + lfLid, err = lid.NewLid(collection, "loufeng_id", 1) + if err != nil { + panic(err) + } + + lfComplaintLid, err = lid.NewLid(collection, "loufeng_complaint_id", 1) + if err != nil { + panic(err) + } + + modelBrokerLid, err = lid.NewLid(collection, "young_model_broker_id", 1) + if err != nil { + panic(err) + } + + modelLid, err = lid.NewLid(collection, "young_model_id", 1) + if err != nil { + panic(err) + } + + novelLid, err = lid.NewLid(collection, "novel_id", 100) + if err != nil { + panic(err) + } + + audioBook, err = lid.NewLid(collection, "audio_book_id", 100) + if err != nil { + panic(err) + } + + landpageConfig, err = lid.NewLid(collection, "landpage_config_id", 100) + if err != nil { + panic(err) + } + + appCategory, err = lid.NewLid(collection, "app_category_id", 100) + if err != nil { + panic(err) + } + + appLocLid, err = lid.NewLid(collection, "app_loc_id", 100) + if err != nil { + panic(err) + } +} + +func GetNextRoleId() int64 { + return roleIdLid.Get() +} + +func GetNextLandingpageId() int64 { + return landingpageIdLid.Get() +} + +func GetNextVersionId() int64 { + return versionLid.Get() +} + +func GetNextCommodity() int64 { + return commodityLid.Get() +} + +func GetNextAdsLocId() int64 { + return adsLocLid.Get() +} + +func GetNextAdsId() int64 { + return adsLid.Get() +} + +func GetNextLfId() int64 { + return lfLid.Get() +} + +func GetNextLfComplaintId() int64 { + return lfComplaintLid.Get() +} + +func GetNextModelBrokerId() int64 { + return modelBrokerLid.Get() +} + +func GetNextModelId() int64 { + return modelLid.Get() +} + +func GetNextNovelId() int64 { + return novelLid.Get() +} + +func GetNextAudioBookId() int64 { + return audioBook.Get() +} + +func GetLandpageConfigId() int64 { + return landpageConfig.Get() +} + +func GetAppCategoryId() int64 { + return appCategory.Get() +} + +func GetNextAppLocId() int64 { + return appLocLid.Get() +} diff --git a/common/genId/lid/lid.go b/common/genId/lid/lid.go new file mode 100644 index 0000000..2da056d --- /dev/null +++ b/common/genId/lid/lid.go @@ -0,0 +1,102 @@ +package lid + +import ( + "context" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" +) + +const notFindMsg = "mongo: no documents in result" + +type IdModel struct { + BusinessId string `bson:"business_id"` //业务id + Step int64 `bson:"step"` //步长 + MaxId int64 `bson:"max_id"` //最大id + Description string `bson:"description"` //描述 + CreatedAt time.Time `bson:"createdAt"` //创建时间 + UpdatedAt time.Time `bson:"updatedAt"` //更改时间 +} + +type Lid struct { + db *mongo.Collection // 数据库连接 + businessId string // 业务id + ch chan int64 // id缓冲池 + min, max int64 // id段最小值,最大值 +} + +// NewLid 创建一个lid,db:数据库连接;businessId:业务id;len:缓冲池大小 +func NewLid(db *mongo.Collection, businessId string, len int) (*Lid, error) { + lid := Lid{ + db: db, + businessId: businessId, + ch: make(chan int64, len), + } + go lid.productId() + return &lid, nil +} + +// Get 获取自增id +func (l *Lid) Get() int64 { + return <-l.ch +} + +// productId 生产id +func (l *Lid) productId() { + l.reset() + for { + if l.min >= l.max { + l.reset() + + } + + l.min++ + l.ch <- l.min + } +} + +// reset 不断尝试从数据库获取,直到成功 +func (l *Lid) reset() { + for { + err := l.getFromDB() + if err == nil { + return + } + time.Sleep(time.Second) + continue + } +} + +// getFromDB 从数据库获取id段 +func (l *Lid) getFromDB() error { + var ( + maxId int64 + step int64 + idModel IdModel + ) + txErr := mongos.Transaction(context.Background(), func(sctx mongo.SessionContext) (err error) { + err = l.db.FindOne(sctx, bson.M{"business_id": l.businessId}).Decode(&idModel) + if err != nil { + if err.Error() == notFindMsg { + _, err = l.db.InsertOne(sctx, bson.M{"business_id": l.businessId, "max_id": 0, "step": 10, "description": "id自增器", "createdAt": time.Now(), "updatedAt": time.Now()}) + if err != nil { + return + } + } else { + return + } + } + maxId = idModel.MaxId + step = idModel.Step + _, err = l.db.UpdateOne(sctx, bson.M{"business_id": l.businessId}, bson.M{"$set": bson.M{"max_id": maxId + step}}) + if err != nil { + return + } + l.min = maxId + l.max = maxId + step + return + }) + return txErr +} diff --git a/common/gencode/generate.go b/common/gencode/generate.go new file mode 100644 index 0000000..6aec1ec --- /dev/null +++ b/common/gencode/generate.go @@ -0,0 +1,40 @@ +package gencode + +import ( + "math/rand" + "time" +) + +/** + * 生成邀请码 + */ +var ( + //所有的字符 + ALL_CHARS = []string{ + "1", "2", "3", "4", "5", + "6", "7", "8", "9", "A", + "B", "C", "D", "E", "F", + "G", "H", "J", "K", + "L", "M", "N", "O", "P", + "Q", "R", "S", "T", "U", + "V", "W", "X", "Y", "Z"} + aLen = len(ALL_CHARS) +) + +const ( + //默认长度 + DEFAULT_LEN = 6 +) + +func init() { + rand.Seed(time.Now().Unix()) +} + +// 生成指定长度的码 +func CodeGenerate(len int) (code string) { + for i := 0; i < len; i++ { + index := rand.Intn(aLen) + code += ALL_CHARS[index] + } + return +} diff --git a/common/go.go b/common/go.go new file mode 100644 index 0000000..1994433 --- /dev/null +++ b/common/go.go @@ -0,0 +1,67 @@ +package common + +import ( + "fmt" + "runtime/debug" + "stat/common/log" + "sync/atomic" + "time" +) + +var ( + routinePanicHandler func(string) + routineCount int64 +) + +func SetPanicHandler(handler func(string)) { + routinePanicHandler = handler +} + +func Go(f func()) { + atomic.AddInt64(&routineCount, 1) + go func() { + defer func() { + atomic.AddInt64(&routineCount, -1) + if r := recover(); r != nil { + log.Error("【Warning】server occur error,please attention", log.Any("Detail", r)) + if routinePanicHandler != nil { + routinePanicHandler(fmt.Sprintf("[Panic] routineCount:%d \n err: %+v\n", routineCount, r) + string(debug.Stack())) + } + } + }() + f() + }() +} + +func GoParam(i int, f func(i int)) { + atomic.AddInt64(&routineCount, 1) + go func(i int) { + defer func() { + atomic.AddInt64(&routineCount, -1) + if r := recover(); r != nil { + log.Error("【Warning】serevr occour error,please attention", log.Any("Detail", r)) + if routinePanicHandler != nil { + routinePanicHandler(fmt.Sprintf("[Panic] routineCount:%d \n err: %+v\n", routineCount, r) + string(debug.Stack())) + } + } + }() + f(i) + }(i) +} + +// WaitGoQuit 等待go退出,timeoutSec 超时秒数,<=0表示不超时 +func WaitGoQuit(timeoutSec int32) { + for { + count := atomic.LoadInt64(&routineCount) + if count == 0 { + return + } + time.Sleep(time.Second) + if timeoutSec > 0 { + timeoutSec-- + if timeoutSec == 0 { + return + } + } + } +} diff --git a/common/googauth/googauth.go b/common/googauth/googauth.go new file mode 100644 index 0000000..fb0fd66 --- /dev/null +++ b/common/googauth/googauth.go @@ -0,0 +1,34 @@ +package googauth + +import ( + "github.com/dgryski/dgoogauth" +) + +const windowSize = 30 +const htopWindowSize = 5 + +var HotpCfg = dgoogauth.OTPConfig{ + Secret: "MRSHM6LTMFYHAMJSGM2DKNQ=", + HotpCounter: 1, + WindowSize: htopWindowSize, +} + +func New(secret string, name string) string { + cfg := &dgoogauth.OTPConfig{ + Secret: secret, + WindowSize: windowSize, + } + return cfg.ProvisionURI(name) +} + +func Verify(secret string, pwd string) (bool, error) { + cfg := &dgoogauth.OTPConfig{ + Secret: secret, + WindowSize: windowSize, + } + return cfg.Authenticate(pwd) +} + +func VerifyHtop(cfg *dgoogauth.OTPConfig, authCode string, counter int) (bool, error) { + return cfg.Authenticate(authCode) +} diff --git a/common/googauth/googauth_test.go b/common/googauth/googauth_test.go new file mode 100644 index 0000000..c0721b0 --- /dev/null +++ b/common/googauth/googauth_test.go @@ -0,0 +1,93 @@ +package googauth + +import ( + "encoding/base32" + "fmt" + "stat/common" + "testing" + + "github.com/dgryski/dgoogauth" +) + +func TestHotp(t *testing.T) { + secret := base32.StdEncoding.EncodeToString([]byte(fmt.Sprintf("admin%s", common.RandStr(10)))) + fmt.Printf(secret) + //d := int64(rand.Intn(100000)) + //randstr := strconv.FormatInt(d, 10) + //ra := strconv.FormatInt(120868, 10) + ////serc := NewHotp("MFSG22LOORUXAVTINJRFGZ2Q", randstr) + //res, _ := VerifyHotp("MFSG22LOORUXAVTINJRFGZ2Q", ra) + ////fmt.Println(err) + ////fmt.Println(res) + ////fmt.Println(serc) + //fmt.Println(res) + //h := NewHOTP([]byte("abcdefghijk"), 6) + //fmt.Println(h.GenerateCode()) + //fmt.Println(h) +} + +// func TestRandBase(t *testing.T) { + +// for i := 0; i < 10; i++ { +// tn := common.RandIntBase(1564, 1, 5000) +// fmt.Println(tn) +// h := NewHOTP([]byte("abcdefghijk"), 5) +// code := h.GenerateCode(uint64(tn)) +// res := h.VerifyCode(code, uint64(tn)) +// fmt.Println(res) +// } +// } + +//func TestCode(t *testing.T) { +// for i := 0; i < 10; i++ { +// count := common.RandIntBase(12345678, 1, 99999999) +// fmt.Println(count) +// dd := dgoogauth.ComputeCode("MRSHM6LTMFYHAMJSGM2DKNQ=", 1234) +// authCode := strconv.FormatInt(int64(dd), 10) +// re, _ := VerifyHotp("MRSHM6LTMFYHAMJSGM2DKNQ=", authCode, 1234) +// fmt.Println(re) +// } +//} + +func TestHotpCode(t *testing.T) { + + var HotpCfg = dgoogauth.OTPConfig{ + Secret: "MRSHM6LTMFYHAMJSGM2DKNQ=", + HotpCounter: 1, + WindowSize: 3, + } + + var cotp dgoogauth.OTPConfig + + // reuse our test values from above + // perhaps create more? + cotp.Secret = "2SH3V3GDW7ZNMGYE" + cotp.HotpCounter = 1 + cotp.WindowSize = 10 + + //var counterCodes = []struct { + // code int + // result bool + // counter int + //}{ + // { /* 1 */ 293240, true, 2}, // increments on success + // { /* 1 */ 293240, false, 3}, // and failure + // { /* 5 */ 932068, true, 6}, // inside of window + // { /* 10 */ 481725, false, 7}, // outside of window + // { /* 10 */ 481725, false, 8}, // outside of window + // { /* 10 */ 481725, true, 11}, // now inside of window + //} + + //for _, s := range counterCodes { + // authCode := strconv.FormatInt(int64(s.code), 10) + // res, _ := cotp.Authenticate(authCode) + // fmt.Println(res) + //} + for i := 0; i < 5; i++ { + res, _ := VerifyHtop(&HotpCfg, "807708", 322904702) + //res2, _ := cotp.Authenticate("293240") + fmt.Println(res) + //fmt.Println(res2) + //fmt.Println(cotp) + } +} diff --git a/common/googauth/htop.go b/common/googauth/htop.go new file mode 100644 index 0000000..fa1e02b --- /dev/null +++ b/common/googauth/htop.go @@ -0,0 +1,67 @@ +package googauth + +import ( + "crypto/hmac" + "crypto/sha1" + "encoding/binary" + "strconv" +) + +// HOTP implementation +type HOTP struct { + secret []byte + digits int +} + +// At generate code +func (h HOTP) At(counter uint64) string { + counterBytes := make([]byte, 8) + binary.BigEndian.PutUint64(counterBytes, counter) + hash := hmac.New(sha1.New, h.secret) + hash.Write(counterBytes) + hs := hash.Sum(nil) + offset := hs[19] & 0x0f + binCodeBytes := make([]byte, 4) + binCodeBytes[0] = hs[offset] & 0x7f + binCodeBytes[1] = hs[offset+1] & 0xff + binCodeBytes[2] = hs[offset+2] & 0xff + binCodeBytes[3] = hs[offset+3] & 0xff + binCode := binary.BigEndian.Uint32(binCodeBytes) + mod := uint32(1) + for i := 0; i < h.digits; i++ { + mod *= 10 + } + code := binCode % mod + codeString := strconv.FormatUint(uint64(code), 10) + if len(codeString) < h.digits { + paddingByteLength := h.digits - len(codeString) + paddingBytes := make([]byte, paddingByteLength) + for i := 0; i < paddingByteLength; i++ { + paddingBytes[i] = '0' + } + codeString = string(paddingBytes) + codeString + } + return codeString +} + +// Verify verify OTP code +func (h HOTP) VerifyCode(code string, counter uint64) bool { + realCode := h.At(counter) + if realCode == code { + return true + } + return false +} + +// Verify verify OTP code +func (h HOTP) GenerateCode(counter uint64) string { + return h.At(counter) +} + +// NewHOTP generate new HOTP instance +func NewHOTP(secret []byte, digits int) (h *HOTP) { + h = new(HOTP) + h.secret = secret + h.digits = digits + return +} diff --git a/common/http/http.go b/common/http/http.go new file mode 100644 index 0000000..a9e26b5 --- /dev/null +++ b/common/http/http.go @@ -0,0 +1,190 @@ +package http + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "mime/multipart" + "net/http" + "reflect" + "time" +) + +var ( + client = http.Client{ + Timeout: 30 * time.Second, + Transport: &http.Transport{ + MaxIdleConnsPerHost: 5, + MaxConnsPerHost: 100, + }, + } +) + +type ByteSize int64 + +const ( + _ = iota // ignore first value by assigning to blank identifier + KB ByteSize = 1 << (10 * iota) + MB +) + +var ( + outOfBodySizeErr = errors.New("out of body size limit") +) + +type ResponseBody struct { + StatusCode int + Data []byte +} + +type RequestFormData map[string]string + +// Post +// Note: 只会读取小于1M的数据 +func Post(url string, header map[string]string, body io.Reader) (fr *ResponseBody, err error) { + fr, err = do(http.MethodPost, url, header, body, int64(1024*MB)) + return +} + +// PostFormData 提交标准的form表单 +func PostFormData(url string, fromdata RequestFormData) (fr *ResponseBody, err error) { + var b bytes.Buffer + writer := multipart.NewWriter(&b) + + for k, v := range fromdata { + if err = writer.WriteField(k, v); err != nil { + return + } + } + if err = writer.Close(); err != nil { + return + } + + header := map[string]string{"Content-Type": writer.FormDataContentType()} + fr, err = do(http.MethodPost, url, header, &b, 2*int64(KB)) + return +} + +// Get +// Note: 只会读取小于1M的数据 +func Get(url string, header map[string]string) (fr *ResponseBody, err error) { + fr, err = do(http.MethodGet, url, header, nil, int64(KB)) + return +} + +// GetLargeFile 获取大文件。2M +func GetLargeFile(url string, header map[string]string) (fr *ResponseBody, err error) { + fr, err = do(http.MethodGet, url, header, nil, int64(20*MB)) + return +} + +func do(method string, url string, header map[string]string, body io.Reader, size int64) (fr *ResponseBody, err error) { + req, err := http.NewRequest(method, url, body) + if err != nil { + return + } + for k, v := range header { + req.Header.Set(k, v) + } + + resp, err := client.Do(req) + if err != nil { + return + } + defer resp.Body.Close() + + if resp.ContentLength > size { + err = outOfBodySizeErr + return + } + + data, err := ioutil.ReadAll(io.LimitReader(resp.Body, size)) + if err != nil { + return + } + fr = &ResponseBody{ + StatusCode: resp.StatusCode, + Data: data, + } + return +} + +// 推送对象到文件服务器 +func PostObject(ctx context.Context, url string, header map[string]string, body []byte, objName string) (string, error) { + base64data := base64.StdEncoding.EncodeToString(body) + + req := struct { + Name string `json:"fileName"` + Data string `json:"fileData"` + }{ + Name: objName, + Data: base64data, + } + + jsonBytes, _ := json.Marshal(req) + + resp, err := Post(url, header, bytes.NewReader(jsonBytes)) + if err != nil { + return "", err + } + + type Obj struct { + Domain string `json:"domain"` + Name string `json:"fileName"` + } + + fsResp := struct { + Code int `json:"code"` + Object Obj `json:"data"` + Msg string `json:"msg"` + }{} + + if err = json.Unmarshal(resp.Data, &fsResp); err != nil { + return "", err + } + + if fsResp.Code != 200 || fsResp.Object.Name == "" { + return "", fmt.Errorf("上传fs失败") + } + + return fsResp.Object.Name, nil +} + +func PostWithBind(ctx context.Context, bind interface{}, url string, body io.Reader) error { + if err := verifyBind(bind); err != nil { + return err + } + req, err := http.NewRequestWithContext(ctx, "POST", url, body) + if err != nil { + return err + } + req.Header.Add("Content-Type", "application/json") + + resp, err := client.Do(req) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("response status code:%d", resp.StatusCode) + } + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + return json.Unmarshal(data, bind) +} + +func verifyBind(bind interface{}) error { + bType := reflect.TypeOf(bind) + if bType.Kind() != reflect.Ptr { + return errors.New("bind must be a Ptr") + } + return nil +} diff --git a/common/http/http_test.go b/common/http/http_test.go new file mode 100644 index 0000000..d99de2f --- /dev/null +++ b/common/http/http_test.go @@ -0,0 +1,16 @@ +package http + +import "fmt" + +func ExampleGet() { + urlstr := "https://palce.hzbeisheng.com/api/sms" + data, err := Get(urlstr, nil) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(data.Data)) + + // Output: + +} diff --git a/common/httpUtils/http.go b/common/httpUtils/http.go new file mode 100644 index 0000000..84aef9e --- /dev/null +++ b/common/httpUtils/http.go @@ -0,0 +1,110 @@ +package httpUtils + +import ( + "bytes" + "errors" + "io" + "io/ioutil" + "mime/multipart" + "net/http" + "time" +) + +var ( + client = http.Client{ + Timeout: 30 * time.Second, + Transport: &http.Transport{ + MaxIdleConnsPerHost: 5, + MaxConnsPerHost: 100, + }, + } +) + +type ByteSize int64 + +const ( + _ = iota // ignore first value by assigning to blank identifier + KB ByteSize = 1 << (10 * iota) + MB +) + +var ( + outOfBodySizeErr = errors.New("out of body size limit") +) + +type ResponseBody struct { + StatusCode int + Data []byte +} + +type RequestFormData map[string]string + +// Post +// Note: 只会读取小于1M的数据 +func Post(url string, header map[string]string, body io.Reader) (fr *ResponseBody, err error) { + fr, err = do(http.MethodPost, url, header, body, int64(1024*MB)) + return +} + +// PostFormData 提交标准的form表单 +func PostFormData(url string, fromdata RequestFormData) (fr *ResponseBody, err error) { + var b bytes.Buffer + writer := multipart.NewWriter(&b) + + for k, v := range fromdata { + if err = writer.WriteField(k, v); err != nil { + return + } + } + if err = writer.Close(); err != nil { + return + } + + header := map[string]string{"Content-Type": writer.FormDataContentType()} + fr, err = do(http.MethodPost, url, header, &b, 2*int64(KB)) + return +} + +// Get +// Note: 只会读取小于1M的数据 +func Get(url string, header map[string]string) (fr *ResponseBody, err error) { + fr, err = do(http.MethodGet, url, header, nil, int64(KB)) + return +} + +// GetLargeFile 获取大文件。8M +func GetLargeFile(url string, header map[string]string) (fr *ResponseBody, err error) { + fr, err = do(http.MethodGet, url, header, nil, int64(8*MB)) + return +} + +func do(method string, url string, header map[string]string, body io.Reader, size int64) (fr *ResponseBody, err error) { + req, err := http.NewRequest(method, url, body) + if err != nil { + return + } + for k, v := range header { + req.Header.Set(k, v) + } + + resp, err := client.Do(req) + if err != nil { + return + } + defer resp.Body.Close() + + if resp.ContentLength > size { + err = outOfBodySizeErr + return + } + + data, err := ioutil.ReadAll(io.LimitReader(resp.Body, size)) + if err != nil { + return + } + fr = &ResponseBody{ + StatusCode: resp.StatusCode, + Data: data, + } + return +} diff --git a/common/httpUtils/http_test.go b/common/httpUtils/http_test.go new file mode 100644 index 0000000..7f20843 --- /dev/null +++ b/common/httpUtils/http_test.go @@ -0,0 +1,18 @@ +package httpUtils + +import ( + "fmt" +) + +func ExampleGet() { + urlstr := "https://palce.hzbeisheng.com/api/sms" + data, err := Get(urlstr, nil) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(data.Data)) + + // Output: + +} diff --git a/common/httpUtils/http_v1.go b/common/httpUtils/http_v1.go new file mode 100644 index 0000000..8152351 --- /dev/null +++ b/common/httpUtils/http_v1.go @@ -0,0 +1,303 @@ +package httpUtils + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "stat/common/log" + "strconv" + + "github.com/ddliu/go-httpclient" +) + +// HTTPClient htttp客户端 +type HTTPClient struct { + client *httpclient.HttpClient +} + +type ProxyCfg struct { + Host string + Timeout int //秒 + Source string + IsActive bool //是否开启代理 +} + +func (p *ProxyCfg) Build(rawurl string, rawHeaders map[string]string) (string, map[string]string, error) { + if !p.IsActive { + return rawurl, rawHeaders, nil + } + u, err := url.Parse(rawurl) + if err != nil { + return "", nil, err + } + target := url.URL{Scheme: u.Scheme, Host: u.Host} + u.Host = p.Host + u.Scheme = "http" + m := make(map[string]string) + m["X-Proxy-Target-Host"] = target.String() + m["X-Proxy-Source"] = "ys" + if p.Timeout > 0 { + m["X-Proxy-Timeout"] = strconv.Itoa(p.Timeout) + } + if len(rawHeaders) > 0 { + for k, v := range rawHeaders { + m[k] = v + } + } + return u.String(), m, nil +} + +type httpClientPool struct { + cliPool map[string]*httpclient.HttpClient + poolSize int + offset int +} + +// HTTPResponse http响应 +type HTTPResponse struct { + StatusCode int `json:"statusCode"` + Body *httpclient.Response `json:"boby"` +} + +var httpCliPool = httpClientPool{cliPool: map[string]*httpclient.HttpClient{}, poolSize: 50} + +func New() *HTTPClient { + h := httpclient.NewHttpClient().Defaults(httpclient.Map{ + httpclient.OPT_CONNECTTIMEOUT: 60, + httpclient.OPT_TIMEOUT: 300, + }) + return &HTTPClient{client: h} +} + +func Begin() *HTTPClient { + h := httpclient.NewHttpClient().Defaults(httpclient.Map{ + httpclient.OPT_CONNECTTIMEOUT: 10, + httpclient.OPT_TIMEOUT: 60, + }) + return &HTTPClient{client: h.Begin()} +} + +// GetHTTPClient 获取httpclient +func Client() *HTTPClient { + cliID := "CLIENT-ID-" + if len(httpCliPool.cliPool) < httpCliPool.poolSize { + h := httpclient.NewHttpClient().Defaults(httpclient.Map{ + httpclient.OPT_CONNECTTIMEOUT: 10, + httpclient.OPT_TIMEOUT: 120, + }) + cliID = cliID + strconv.FormatInt(int64(len(httpCliPool.cliPool)+1), 10) + httpCliPool.cliPool[cliID] = h + httpCliPool.offset = httpCliPool.poolSize + return &HTTPClient{client: h} + } + if httpCliPool.offset == httpCliPool.poolSize+1 { + httpCliPool.offset = 1 + } + cliID = cliID + strconv.FormatInt(int64(httpCliPool.offset), 10) + httpCliPool.offset = httpCliPool.offset + 1 + h, ok := httpCliPool.cliPool[cliID] + if !ok || h == nil { + h = httpclient.NewHttpClient().WithOption(httpclient.OPT_TIMEOUT, 60) + httpCliPool.cliPool[cliID] = h + return &HTTPClient{client: h} + } + return &HTTPClient{client: h} +} + +func jsonUnmarshalResp(bind interface{}, resp *HTTPResponse) error { + defer func() { _ = resp.Body.Body.Close() }() + if bind == nil { //传入空表示只执行 defer + return nil + } + b, err := resp.Body.ReadAll() + if err != nil { + log.Error("httputil jsonUnmarshalResp readall err", log.E(err)) + return err + } + err = json.Unmarshal(b, bind) + if err != nil { + log.Error("httputil jsonUnmarshalResp Unmarshal err", log.E(err)) + } + return err +} + +// Get Get方法 +func (h *HTTPClient) Get(url string, headers map[string]string, params ...interface{}) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.Get(url, params...) + if err != nil { + log.Error(fmt.Sprintf("http client Get method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +func (h *HTTPClient) PGet(p *ProxyCfg, url string, headers map[string]string, params ...interface{}) (*HTTPResponse, error) { + purl, pheaders, err := p.Build(url, headers) + if err != nil { + return nil, err + } + return h.Get(purl, pheaders, params) +} + +// Get GetBytes +func (h *HTTPClient) GetBytes(url string, headers map[string]string, params ...interface{}) ([]byte, error) { + h.client.WithHeaders(headers) + response, err := h.client.Get(url, params...) + if err != nil { + log.Error(fmt.Sprintf("http client Get method failed %+v:", err)) + return nil, err + } + data, err := response.ReadAll() + if err != nil { + log.ZapLog.Error("resp readAll errror", log.Any("Error", err)) + return data, err + } + defer func() { + _ = response.Body.Close() + }() + return data, nil +} + +// GetWithJResp 结果json.Unmarshal到bind中 +func (h *HTTPClient) GetWithJResp(bind interface{}, url string, headers map[string]string, params ...interface{}) (int, error) { + resp, err := h.Get(url, headers, params...) + if err != nil { + return 0, err + } + if resp.StatusCode == http.StatusOK { + err = jsonUnmarshalResp(bind, resp) + } + return resp.StatusCode, err +} + +func (h *HTTPClient) PGetWithJResp(p *ProxyCfg, bind interface{}, url string, headers map[string]string, params ...interface{}) (int, error) { + purl, pheaders, err := p.Build(url, headers) + if err != nil { + return 0, err + } + return h.GetWithJResp(bind, purl, pheaders, params...) +} + +// Post Post方法 +func (h *HTTPClient) Post(url string, headers map[string]string, params interface{}) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.Post(url, params) + if err != nil { + log.Error(fmt.Sprintf("http client Post method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +func (h *HTTPClient) PPost(p *ProxyCfg, bind interface{}, url string, headers map[string]string, params interface{}) (*HTTPResponse, error) { + purl, pheaders, err := p.Build(url, headers) + if err != nil { + return nil, err + } + return h.Post(purl, pheaders, params) +} + +// POSTJson PostJson方法 +func (h *HTTPClient) POSTJson(url string, headers map[string]string, data interface{}) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.PostJson(url, data) + if err != nil { + log.Error(fmt.Sprintf("http client POSTJson method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +// POSTJson PostJson方法, bind json.Unmarshal +func (h *HTTPClient) POSTJsonWithJResp(bind interface{}, url string, headers map[string]string, data interface{}) (int, error) { + resp, err := h.POSTJson(url, headers, data) + if err != nil { + log.Error("POSTJsonWithResp err", log.E(err)) + return 0, err + } + if resp.StatusCode == http.StatusOK { + err = jsonUnmarshalResp(bind, resp) + } + return resp.StatusCode, err +} + +func (h *HTTPClient) PPOSTJsonWithJResp(p *ProxyCfg, bind interface{}, url string, headers map[string]string, data interface{}) (int, error) { + if p == nil { + return 0, fmt.Errorf("ProxyCfg is nil") + } + purl, pheaders, err := p.Build(url, headers) + if err != nil { + return 0, err + } + return h.POSTJsonWithJResp(bind, purl, pheaders, data) +} + +// PostMultipart PostMultipart 上传文件 +func (h *HTTPClient) PostMultipart(url string, headers map[string]string, params interface{}) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.PostMultipart(url, params) + if err != nil { + log.Error(fmt.Sprintf("http client PostMultipart method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +// Put 流式传输 可用于上传文件 +func (h *HTTPClient) Put(url string, headers map[string]string, body io.Reader) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.Put(url, body) + if err != nil { + log.Error(fmt.Sprintf("http client PostMultipart method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +// PutJSON PutJSON方法 +func (h *HTTPClient) PutJSON(url string, headers map[string]string, data interface{}) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.PutJson(url, data) + if err != nil { + log.Error(fmt.Sprintf("http client PostMultipart method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +// Header Header +func (h *HTTPClient) Header(url string) (*HTTPResponse, error) { + response, err := h.client.Head(url) + if err != nil { + log.Error(fmt.Sprintf("http client PostMultipart method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +// POSTWithJResp 结果json.Unmarshal到bind中 用于上传文件, content-type :"application/x-www-form-urlencoded" 如参数以@开头 则为上传文件 +func (h *HTTPClient) POSTWithJResp(bind interface{}, url string, headers map[string]string, params interface{}) (int, error) { + resp, err := h.Post(url, headers, params) + if err != nil { + return 0, err + } + if resp.StatusCode == http.StatusOK { + err = jsonUnmarshalResp(bind, resp) + } + return resp.StatusCode, err +} + +// POSTWithJResp 结果json.Unmarshal到bind中 用于上传文件, content-type :"application/x-www-form-urlencoded" 如参数以@开头 则为上传文件 +func (h *HTTPClient) PPOSTWithJResp(p *ProxyCfg, bind interface{}, url string, headers map[string]string, params interface{}) (int, error) { + resp, err := h.PPost(p, bind, url, headers, params) + if err != nil { + return 0, err + } + if resp.StatusCode == http.StatusOK { + err = jsonUnmarshalResp(bind, resp) + } + return resp.StatusCode, err +} diff --git a/common/httputil/httputil.go b/common/httputil/httputil.go new file mode 100644 index 0000000..44b4f8c --- /dev/null +++ b/common/httputil/httputil.go @@ -0,0 +1,307 @@ +package httputil + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "stat/common/log" + "strconv" + + "github.com/ddliu/go-httpclient" +) + +//HTTPClient htttp客户端 +type HTTPClient struct { + client *httpclient.HttpClient +} + +type ProxyCfg struct { + Host string + Timeout int //秒 + Source string + IsActive bool //是否开启代理 +} + +func NewHTTPClient(client *httpclient.HttpClient) *HTTPClient { + return &HTTPClient{client} +} + +func (p *ProxyCfg) Build(rawurl string, rawHeaders map[string]string) (string, map[string]string, error) { + if !p.IsActive { + return rawurl, rawHeaders, nil + } + u, err := url.Parse(rawurl) + if err != nil { + return "", nil, err + } + target := url.URL{Scheme: u.Scheme, Host: u.Host} + u.Host = p.Host + u.Scheme = "http" + m := make(map[string]string) + m["X-Proxy-Target-Host"] = target.String() + m["X-Proxy-Source"] = "ys" + if p.Timeout > 0 { + m["X-Proxy-Timeout"] = strconv.Itoa(p.Timeout) + } + if len(rawHeaders) > 0 { + for k, v := range rawHeaders { + m[k] = v + } + } + return u.String(), m, nil +} + +type httpClientPool struct { + cliPool map[string]*httpclient.HttpClient + poolSize int + offset int +} + +//HTTPResponse http响应 +type HTTPResponse struct { + StatusCode int `json:"statusCode"` + Body *httpclient.Response `json:"boby"` +} + +var httpCliPool = httpClientPool{cliPool: map[string]*httpclient.HttpClient{}, poolSize: 50} + +func New() *HTTPClient { + h := httpclient.NewHttpClient().Defaults(httpclient.Map{ + httpclient.OPT_CONNECTTIMEOUT: 5, + httpclient.OPT_TIMEOUT: 60, + }) + return &HTTPClient{client: h} +} + +func NewCtx(ctx context.Context) *HTTPClient { + h := httpclient.NewHttpClient().WithOptions(httpclient.Map{ + httpclient.OPT_CONNECTTIMEOUT: 5, + httpclient.OPT_TIMEOUT: 60, + httpclient.OPT_CONTEXT: ctx, + }) + return &HTTPClient{client: h.Begin()} +} + +//GetHTTPClient 获取httpclient +func Client() *HTTPClient { + cliID := "CLIENT-ID-" + if len(httpCliPool.cliPool) < httpCliPool.poolSize { + h := httpclient.NewHttpClient().Defaults(httpclient.Map{ + httpclient.OPT_CONNECTTIMEOUT: 5, + httpclient.OPT_TIMEOUT: 60, + }) + cliID = cliID + strconv.FormatInt(int64(len(httpCliPool.cliPool)+1), 10) + httpCliPool.cliPool[cliID] = h + httpCliPool.offset = httpCliPool.poolSize + return &HTTPClient{client: h} + } + if httpCliPool.offset == httpCliPool.poolSize+1 { + httpCliPool.offset = 1 + } + cliID = cliID + strconv.FormatInt(int64(httpCliPool.offset), 10) + httpCliPool.offset = httpCliPool.offset + 1 + h, ok := httpCliPool.cliPool[cliID] + if !ok || h == nil { + h = httpclient.NewHttpClient().WithOption(httpclient.OPT_TIMEOUT, 60) + httpCliPool.cliPool[cliID] = h + return &HTTPClient{client: h} + } + return &HTTPClient{client: h} +} + +func jsonUnmarshalResp(bind interface{}, resp *HTTPResponse) error { + defer func() { _ = resp.Body.Body.Close() }() + if bind == nil { //传入空表示只执行 defer + return nil + } + b, err := resp.Body.ReadAll() + if err != nil { + log.Error("httputil jsonUnmarshalResp readall err", log.E(err)) + return err + } + err = json.Unmarshal(b, bind) + if err != nil { + log.Error("httputil jsonUnmarshalResp Unmarshal err", log.E(err)) + } + return err +} + +// Get Get方法 +func (h *HTTPClient) Get(url string, headers map[string]string, params ...interface{}) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.Get(url, params...) + if err != nil { + log.Error(fmt.Sprintf("http client Get method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +func (h *HTTPClient) PGet(p *ProxyCfg, url string, headers map[string]string, params ...interface{}) (*HTTPResponse, error) { + purl, pheaders, err := p.Build(url, headers) + if err != nil { + return nil, err + } + return h.Get(purl, pheaders, params) +} + +// Get GetBytes +func (h *HTTPClient) GetBytes(url string, headers map[string]string, params ...interface{}) ([]byte, error) { + h.client.WithHeaders(headers) + response, err := h.client.Get(url, params...) + if err != nil { + log.Error(fmt.Sprintf("http client Get method failed %+v:", err)) + return nil, err + } + data, err := response.ReadAll() + if err != nil { + log.ZapLog.Error("resp readAll errror", log.Any("Error", err)) + return data, err + } + defer func() { + _ = response.Body.Close() + }() + return data, nil +} + +// GetWithJResp 结果json.Unmarshal到bind中 +func (h *HTTPClient) GetWithJResp(bind interface{}, url string, headers map[string]string, params ...interface{}) (int, error) { + resp, err := h.Get(url, headers, params...) + if err != nil { + return 0, err + } + if resp.StatusCode == http.StatusOK { + err = jsonUnmarshalResp(bind, resp) + } + return resp.StatusCode, err +} + +func (h *HTTPClient) PGetWithJResp(p *ProxyCfg, bind interface{}, url string, headers map[string]string, params ...interface{}) (int, error) { + purl, pheaders, err := p.Build(url, headers) + if err != nil { + return 0, err + } + return h.GetWithJResp(bind, purl, pheaders, params...) +} + +//Post Post方法 +func (h *HTTPClient) Post(url string, headers map[string]string, params interface{}) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.Post(url, params) + if err != nil { + log.Error(fmt.Sprintf("http client Post method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +func (h *HTTPClient) PPost(p *ProxyCfg, bind interface{}, url string, headers map[string]string, params interface{}) (*HTTPResponse, error) { + purl, pheaders, err := p.Build(url, headers) + if err != nil { + return nil, err + } + return h.Post(purl, pheaders, params) +} + +//POSTJson PostJson方法 +func (h *HTTPClient) POSTJson(url string, headers map[string]string, data interface{}) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.PostJson(url, data) + if err != nil { + log.Error(fmt.Sprintf("http client POSTJson method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +//POSTJson PostJson方法, bind json.Unmarshal +func (h *HTTPClient) POSTJsonWithJResp(bind interface{}, url string, headers map[string]string, data interface{}) (int, error) { + resp, err := h.POSTJson(url, headers, data) + if err != nil { + log.Error("POSTJsonWithResp err", log.E(err)) + return 0, err + } + err = jsonUnmarshalResp(bind, resp) + return resp.StatusCode, err +} + +func (h *HTTPClient) PPOSTJsonWithJResp(p *ProxyCfg, bind interface{}, url string, headers map[string]string, data interface{}) (int, error) { + if p == nil { + return 0, fmt.Errorf("ProxyCfg is nil") + } + purl, pheaders, err := p.Build(url, headers) + if err != nil { + return 0, err + } + return h.POSTJsonWithJResp(bind, purl, pheaders, data) +} + +//PostMultipart PostMultipart 上传文件 +func (h *HTTPClient) PostMultipart(url string, headers map[string]string, params interface{}) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.PostMultipart(url, params) + if err != nil { + log.Error(fmt.Sprintf("http client PostMultipart method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +//Put 流式传输 可用于上传文件 +func (h *HTTPClient) Put(url string, headers map[string]string, body io.Reader) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.Put(url, body) + if err != nil { + log.Error(fmt.Sprintf("http client PostMultipart method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +//PutJSON PutJSON方法 +func (h *HTTPClient) PutJSON(url string, headers map[string]string, data interface{}) (*HTTPResponse, error) { + h.client.WithHeaders(headers) + response, err := h.client.PutJson(url, data) + if err != nil { + log.Error(fmt.Sprintf("http client PostMultipart method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +//Header Header +func (h *HTTPClient) Header(url string) (*HTTPResponse, error) { + response, err := h.client.Head(url) + if err != nil { + log.Error(fmt.Sprintf("http client PostMultipart method failed %+v:", err)) + return nil, err + } + return &HTTPResponse{StatusCode: response.StatusCode, Body: response}, nil +} + +// POSTWithJResp 结果json.Unmarshal到bind中 用于上传文件, content-type :"application/x-www-form-urlencoded" 如参数以@开头 则为上传文件 +func (h *HTTPClient) POSTWithJResp(bind interface{}, url string, headers map[string]string, params interface{}) (int, error) { + resp, err := h.Post(url, headers, params) + if err != nil { + return 0, err + } + if resp.StatusCode == http.StatusOK { + err = jsonUnmarshalResp(bind, resp) + } + return resp.StatusCode, err +} + +// POSTWithJResp 结果json.Unmarshal到bind中 用于上传文件, content-type :"application/x-www-form-urlencoded" 如参数以@开头 则为上传文件 +func (h *HTTPClient) PPOSTWithJResp(p *ProxyCfg, bind interface{}, url string, headers map[string]string, params interface{}) (int, error) { + resp, err := h.PPost(p, bind, url, headers, params) + if err != nil { + return 0, err + } + if resp.StatusCode == http.StatusOK { + err = jsonUnmarshalResp(bind, resp) + } + return resp.StatusCode, err +} diff --git a/common/httputil/httputil_test.go b/common/httputil/httputil_test.go new file mode 100644 index 0000000..3c2ea11 --- /dev/null +++ b/common/httputil/httputil_test.go @@ -0,0 +1,105 @@ +package httputil + +import ( + "encoding/json" + "fmt" + "os" + "strconv" + "testing" +) + +type ResponseInfo struct { + Gzipped bool `json:"gzipped"` + Method string `json:"method"` + Origin string `json:"origin"` + Useragent string `json:"user-agent"` // http://httpbin.org/user-agent + Form map[string]string `json:"form"` + Files map[string]string `json:"files"` + Headers map[string]string `json:"headers"` + Cookies map[string]string `json:"cookies"` +} + +var info ResponseInfo + +type Resport struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data interface{} `json:"data"` +} + +func Test_Get_Httpcli(t *testing.T) { + client := Client() + var headers = map[string]string{"auth_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVjZTJiNzNmZTI3Y2YyMmE4ZjQyMTVkMCIsInVzZXJOYW1lIjoidHVib2xpbmcxNjgiLCJpc0xvZ2luIjp0cnVlLCJsb2dpblRpbWUiOjE1NjQxNDYwNzI5MDUsImlhdCI6MTU2NDE0NjA3Mn0.VQICBk71KDITus83pZEq3C1y_WbKPZc0HUfmIm_eby8"} + respo, err := client.Get("https://no5.xiexiaojia.com/appjmall/api/showCore/appShowList", headers) + defer respo.Body.Body.Close() + if err != nil { + fmt.Printf("%+v", err) + } + resport := Resport{} + body, err := respo.Body.ReadAll() + //反序列化 + err = json.Unmarshal(body, &resport) + fmt.Println("response", resport) + //案例获取数据 + fmt.Println("response comName:", resport.Data.([]interface{})[0].(map[string]interface{})["comName"]) +} + +func Test_Post_Httpcli(t *testing.T) { + client := Client() + fmt.Println("http 客户端", client) + var headers = map[string]string{"auth_token": "xxxxx"} + var params = map[string]string{"userId": "5ce2b73fe27cf22a8f4215d0", "price": "5000", "count": "1", "commId": "5ce40e03e27cf22a8f4215d8", + "comName": "日本ceruru.b 脐带血面膜保湿补水修复5片", + "comImageCar": "http://oam.szbslhb.com/4,01fb06b4adf1.jpg", + "attributeCar": "", + } + respo, err := client.Post("https://no5.xiexiaojia.com/appjmall/api/cart/addCommToCart", headers, params) + defer respo.Body.Body.Close() + if err != nil { + fmt.Printf("%+v", err) + } + resport := Resport{} + body, err := respo.Body.ReadAll() + if err != nil { + res, _ := respo.Body.ToString() + fmt.Println("response", res) + return + } + //反序列化 + err = json.Unmarshal(body, &resport) + fmt.Println("response", resport) +} + +func Test_PostJson_Httpcli(t *testing.T) { + client := Client() + var headers = map[string]string{"Content-Type": "application/json"} + fmt.Println("http 客户端", client) + respo, err := client.Get("https://www.kancloud.cn/cattong/go_command_tutorial/261347", headers) + defer respo.Body.Body.Close() + if err != nil { + fmt.Printf("%+v", err) + } + body, err := respo.Body.ToString() + fmt.Println("response", body) +} + +func Test_PutFile_Httpcli(t *testing.T) { + client := Client() + file, err := os.Open("/Users/mac/Downloads/1567069549ABBQCTFC.mp4") + info, _ := file.Stat() + + var headers = map[string]string{ + "Content-Type": "application/octet-stream", + "Authorization": "bucketName=bucket-01;accessKey=FSd58ed59fccc16812903c37068de8969b;ttl=1h", + "Content-Disposition": "fileName=test02.mp4;size=" + strconv.FormatInt(info.Size(), 10), + "Signature": "9cea21bf95f235e7d9c5a70888cf742cfb9c946ed25aef8b70ce77c953ccbff0", + } + fmt.Println("http 客户端", client) + respo, err := client.Put("http://localhost:8888/fs/api/uploadStream", headers, file) + defer respo.Body.Body.Close() + if err != nil { + fmt.Printf("%+v", err) + } + body, err := respo.Body.ToString() + fmt.Println("response", body) +} diff --git a/common/ip.go b/common/ip.go new file mode 100644 index 0000000..e665e67 --- /dev/null +++ b/common/ip.go @@ -0,0 +1,113 @@ +package common + +import ( + "context" + "fmt" + "net" + "stat/common/httputil" + "stat/common/log" + "time" +) + +var ( + defaultCity = "广州" + defaultProvince = "广东" + ipNewURL = "https://loc.ztgba.com/self/getLocationByIp" + ipNewURLV2 = "https://loc.ztgba.com/self/isChina" + NoChina int32 = 0 +) + +//老接口 +type LocationResp struct { + RegionName string `json:"region_name"` + CityName string `json:"city_name"` + IP string `json:"ip"` +} + +func GetLocationByIP(ip string) (string, string) { + //return defaultCity, defaultProvince + var params = map[string]string{"ip": ip} + loc := LocationResp{} + c, cancle := context.WithTimeout(context.Background(), 3*time.Second) + defer cancle() + _, err := httputil.NewCtx(c).POSTJsonWithJResp(&loc, ipNewURL, nil, params) + if err != nil { + log.Error("GetLocationByIP error", log.Any("ip", ip), log.Any("err", err)) + return defaultCity, defaultProvince + } + Go(func() { + select { + case <-c.Done(): + fmt.Print("current http method GetLocationByIP ctx", c.Err()) + } + }) + if len(loc.RegionName) == 0 && len(loc.CityName) == 0 { + return defaultCity, defaultProvince + } + if loc.RegionName == "局域网" { + return defaultCity, defaultProvince + } + if loc.RegionName == "柬埔寨" { + return defaultCity, defaultProvince + } + if len(loc.CityName) == 0 { + return loc.RegionName, loc.RegionName + } + return loc.CityName, loc.RegionName +} + +type CountryResp struct { + Country string `json:"country_name"` + RegionName string `json:"region_name"` + IP string `json:"ip"` +} + +type CountryRespV2 struct { + Code int32 `json:"code"` + Data map[string]int32 `json:"data"` +} + +//InChina +//香港返回false +func InChina(ip string) bool { + var params = map[string]string{"ip": ip} + resp := CountryResp{} + _, err := httputil.New().POSTJsonWithJResp(&resp, ipNewURL, nil, params) + if err != nil { + log.Error("InChina error", log.Any("ip", ip), log.Any("err", err)) + return true + } + if resp.RegionName == "香港" { + return false + } + return resp.Country == "中国" +} +func GetLocalIP() string { + addrs, err := net.InterfaceAddrs() + if err != nil { + return "" + } + for _, addr := range addrs { + if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + if ipnet.IP.To4() != nil && ipnet.IP.IsGlobalUnicast() { + return ipnet.IP.String() + } + } + } + return "" +} + +func InChinaV2(ip string) bool { + var params = map[string]string{"ip": ip} + resp := CountryRespV2{} + _, err := httputil.New().GetWithJResp(&resp, ipNewURLV2, nil, params) + if err != nil { + log.Error("InChina error", log.Any("ip", ip), log.Any("err", err)) + return true + } + if value, ok := resp.Data[ip]; ok { + return value != NoChina + } + + return false +} diff --git a/common/kafka/kafka.go b/common/kafka/kafka.go new file mode 100644 index 0000000..756384b --- /dev/null +++ b/common/kafka/kafka.go @@ -0,0 +1,85 @@ +package kafka + +import ( + "fmt" + "stat/common/log" + "time" + + "github.com/Shopify/sarama" +) + +const ( + ClientID string = "pf_sp_kafka" +) + +//kafka 使用 +var ( + gSyncProducer sarama.SyncProducer +) + +/**********************************************客户端 *********************/ +// 初始化kafka生产者 发送消息入口 +func InitKafkaProducter(addrs []string) error { + config := sarama.NewConfig() + config.Version = sarama.V2_0_0_0 + config.Producer.Return.Successes = true + config.Net.KeepAlive = 2 * time.Hour + + cli, err := sarama.NewClient(addrs, config) + if err != nil { + log.Error("startUp Kafka Init Kafka error", log.E(err)) + return err + } + + gSyncProducer, err = SyncProducter(cli) + if err != nil { + log.Error("startUp Kafka new SyncProducter error", log.E(err)) + return nil + } + return nil +} + +// SyncSendMessage 同步发送确保消息成功 +func SyncSendMessage(topic string, message []byte) { + if gSyncProducer != nil { + msg := sarama.ProducerMessage{ + Topic: topic, + Value: sarama.ByteEncoder(message), + } + partition, offset, err := gSyncProducer.SendMessage(&msg) + if err != nil { + log.Error("gSyncProducer SendMessage Fail", log.Any("topic", topic), log.E(err)) + + return + } + fmt.Println(partition, offset) + } else { + fmt.Println("err err") + } +} + +//创建同步生产者 用于对消息的顺序有严格要求的场景 性能相对较低 +func SyncProducter(client sarama.Client) (sarama.SyncProducer, error) { + producer, err := sarama.NewSyncProducerFromClient(client) + if err != nil { + log.Error("create syncProducer error", log.E(err)) + return nil, err + } + return producer, nil +} + +/**********************************************客户端 end*********************/ + +/**********************************************服务端 *********************/ +func InitKafkaConsumerGroup(addrs []string, groupName string) sarama.ConsumerGroup { + config := sarama.NewConfig() + config.Version = sarama.V2_0_0_0 + config.Consumer.Return.Errors = true + + group, err := sarama.NewConsumerGroup(addrs, groupName, config) + if err != nil { + panic(err) + } + + return group +} diff --git a/common/log/log.go b/common/log/log.go new file mode 100644 index 0000000..5ac4554 --- /dev/null +++ b/common/log/log.go @@ -0,0 +1,64 @@ +package log + +import ( + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "os" + "time" +) + +var ( + zapLogger *zap.Logger + ZapLog *zap.Logger + Debug = zapLogger.Debug + Info = zapLogger.Info + Warn = zapLogger.Warn + Error = zapLogger.Error + Fatal = zapLogger.Fatal +) + +func newEncoderConfig() zapcore.EncoderConfig { + return zapcore.EncoderConfig{ + // Keys can be anything except the empty string. + TimeKey: "T", + LevelKey: "L", + NameKey: "N", + CallerKey: "C", + MessageKey: "M", + StacktraceKey: "S", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.CapitalLevelEncoder, + EncodeTime: timeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } +} + +func init() { + core := zapcore.NewCore( + zapcore.NewConsoleEncoder(newEncoderConfig()), + zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout)), + zap.DebugLevel, + ) + zapLogger = zap.New(core, zap.AddCaller()) + ZapLog = zapLogger + Debug = zapLogger.Debug + Info = zapLogger.Info + Warn = zapLogger.Warn + Error = zapLogger.Error + Fatal = zapLogger.Fatal +} + +func timeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) { + enc.AppendString(t.Format("2006-01-02 15:04:05")) +} + +type Field = zap.Field + +func Any(key string, value interface{}) Field { + return zap.Any(key, value) +} + +func E(err error) Field { + return Any("err", err) +} diff --git a/common/log/utils.go b/common/log/utils.go new file mode 100644 index 0000000..3b78e91 --- /dev/null +++ b/common/log/utils.go @@ -0,0 +1,19 @@ +package log + +import ( + "fmt" + "log" +) + +type Logger struct{} + +// Info logs routine messages about cron's operation. +func (s *Logger) Info(msg string, keysAndValues ...interface{}) { + log.Default().Output(2, msg+" "+fmt.Sprint(keysAndValues...)) +} + +// Error logs an error condition. +func (s *Logger) Error(err error, msg string, keysAndValues ...interface{}) { + line := fmt.Sprintf("%s %v %s", msg, err, fmt.Sprint(keysAndValues...)) + log.Default().Output(2, line) +} diff --git a/common/m3u8/enkey.go b/common/m3u8/enkey.go new file mode 100644 index 0000000..af343e5 --- /dev/null +++ b/common/m3u8/enkey.go @@ -0,0 +1,34 @@ +package m3u8 + +import ( + "bytes" + "context" + "io/ioutil" + "sync" +) + +var ( + cacheEnkey []byte + cacheTvEnkey []byte + initOnce sync.Once +) + +// 安全初始化 m3u8 key +func init() { + initOnce.Do(func() { + if len(cacheEnkey) == 0 { + data, err := ioutil.ReadFile("conf/m3u8.key") + if err != nil { + panic(err) + } + cacheEnkey = data + } + }) + +} + +// Enkey 密匙key +func Enkey(ctx context.Context) (buffer *bytes.Buffer, err error) { + buffer = bytes.NewBuffer(cacheEnkey) + return +} diff --git a/common/m3u8/media_play_list.go b/common/m3u8/media_play_list.go new file mode 100644 index 0000000..f2640d0 --- /dev/null +++ b/common/m3u8/media_play_list.go @@ -0,0 +1,114 @@ +package m3u8 + +import ( + //"sz-app-server/pub/common/utils" + + "crypto/md5" + "encoding/hex" + "fmt" + "stat/common/utils" + "strings" + "time" + + "github.com/grafov/m3u8" +) + +// makeMediaPlayList 根据from,重新生成播放列表 +func makeMediaPlayList(from *m3u8.MediaPlaylist, cdnDomain string, dirPath string, keyUri string, authKey string) (media *m3u8.MediaPlaylist, err error) { + media, err = m3u8.NewMediaPlaylist(from.WinSize(), from.Count()) + if err != nil { + return + } + base := utils.JoinUrlPath(cdnDomain, dirPath) + now := time.Now() + for _, segment := range from.Segments { + if segment == nil { + continue + } + sg := new(m3u8.MediaSegment) + sg.URI = utils.JoinUrlPath(base, segment.URI) + if len(authKey) > 0 { + //生成鉴权url + urlPath := utils.JoinUrlPath(dirPath, segment.URI) + urlAuth := generateUrlAuth(now, urlPath, authKey) + sg.URI = sg.URI + urlAuth + } + sg.Title = segment.Title + sg.Duration = segment.Duration + if err = media.AppendSegment(sg); err != nil { + return + } + } + _ = media.SetDefaultKey("AES-128", keyUri, "", "", "") + media.Close() + return +} + +// 生成鉴权url +func generateUrlAuth(now time.Time, path string, authKey string) string { + timestamp := now.Unix() + // randId := maths.GenUUID() + signStr := fmt.Sprintf("%s-%d-0-0-%s", path, timestamp, authKey) + md5Str := getMD5Sign(signStr) + urlAuth := fmt.Sprintf("?md=%d-0-0-%s", timestamp, md5Str) + return urlAuth +} + +// getMD5Sign 得到签名 +func getMD5Sign(buf string) string { + md5Ctx := md5.New() + md5Ctx.Write([]byte(buf)) + cipherStr := md5Ctx.Sum(nil) + nsign := hex.EncodeToString(cipherStr) + return nsign +} + +func newMediaPlayList(from *m3u8.MediaPlaylist, cdnDomain, origDomain, dirPath, keyUri string, needHeader bool) (media *m3u8.MediaPlaylist, err error) { + if needHeader { + return makeMediaPlayListWithHeader(from, cdnDomain, origDomain, dirPath, keyUri) + } else { + return makeMediaPlayList(from, cdnDomain, dirPath, keyUri, AuthKey) + } +} + +func makeMediaPlayListWithHeader(from *m3u8.MediaPlaylist, cdnDomain, origDomain string, dirPath string, keyUri string) (media *m3u8.MediaPlaylist, err error) { + media, err = m3u8.NewMediaPlaylist(from.WinSize(), from.Count()+headerMediaPlayList.Count()) + if err != nil { + return + } + + //合并片m3u8 + for _, v := range headerMediaPlayList.Segments { + if v == nil { + continue + } + sg := new(m3u8.MediaSegment) + sg.URI = v.URI + if origDomain != "" && strings.HasPrefix(v.URI, origDomain) && origDomain != cdnDomain { + sg.URI = strings.ReplaceAll(v.URI, origDomain, cdnDomain) + } + sg.Title = v.Title + sg.Duration = v.Duration + if err = media.AppendSegment(sg); err != nil { + return + } + } + + base := utils.JoinUrlPath(cdnDomain, dirPath) + for k, segment := range from.Segments { + if segment == nil { + continue + } + sg := new(m3u8.MediaSegment) + sg.Discontinuity = k == 0 + sg.URI = utils.JoinUrlPath(base, segment.URI) + sg.Title = segment.Title + sg.Duration = segment.Duration + if err = media.AppendSegment(sg); err != nil { + return + } + } + _ = media.SetDefaultKey("AES-128", keyUri, "", "", "") + media.Close() + return +} diff --git a/common/m3u8/play_list.go b/common/m3u8/play_list.go new file mode 100644 index 0000000..dbfa769 --- /dev/null +++ b/common/m3u8/play_list.go @@ -0,0 +1,135 @@ +package m3u8 + +import ( + "bytes" + "fmt" + "io" + "stat/common/enum/redisconst" + "stat/common/errors" + "stat/common/http" + "stat/common/log" + "stat/common/redis" + "stat/common/utils" + "strings" + + "github.com/grafov/m3u8" +) + +const ( + keyUri = "/api/stat/media/enkey" + AuthKey = "fT5xSg4hltHpzVy6aV9rVECDJ1J1pN" +) + +var headerMediaPlayList *m3u8.MediaPlaylist + +// TransFormWithSafely 被检查权限的播放列表 +// 主要检查用户是否有观看该视频的权限 +// apiType(1:app,2:h5app,3:web) +func TransFormWithSafely(req *Req, cdnDomain, origDomain string, needHeader bool, apiType int) (*m3u8.MediaPlaylist, *bytes.Buffer, error) { + if req.Name == "" { + return nil, nil, errors.MakeWithMsg(errors.M3u8FileName, "file name is empty") + } + if cdnDomain == "" || origDomain == "" { + return nil, nil, errors.MakeWithMsg(errors.DomainErr, "cdnDomain or origDomain is empty") + } + + return transform(req.Name, cdnDomain, origDomain, needHeader, apiType) +} +func AppendsMediaS3Version(name string) string { + // 默认使用V1 + if name != "" && !strings.HasPrefix(name, "v2/") && !strings.HasPrefix(name, "v1/") && !strings.HasPrefix(name, "v3/") && + !strings.HasPrefix(name, "/v2") && !strings.HasPrefix(name, "/v1") && !strings.HasPrefix(name, "/v3") { + return "/v1" + } + return "" +} + +// transform m3u8文件转换,将不正确的m3u8文件,替换为正确的m3u8文件 +func transform(name string, cdnDomain, origDomain string, needHeader bool, apiType int) (media *m3u8.MediaPlaylist, buff *bytes.Buffer, err error) { + m3u8reader, err := readFromRedis(name, origDomain) + if err != nil { + return + } + p, t, err := m3u8.DecodeFrom(m3u8reader, false) + if err != nil { + err = errors.MakeWithErr(errors.M3u8Read, err) + return + } + tmptKeyurl := keyUri + + fmt.Println("<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>") + switch t { + case m3u8.MEDIA: + pl := p.(*m3u8.MediaPlaylist) + dirPath := utils.PathForInfo(name).Dir + media, err = newMediaPlayList(pl, cdnDomain, origDomain, dirPath, tmptKeyurl, needHeader) + if err != nil { + return + } + buff = media.Encode() + case m3u8.MASTER: + mpl := p.(*m3u8.MasterPlaylist) + buff = mpl.Encode() + default: + err = errors.MakeWithMsg(errors.M3u8FileName, fmt.Sprintf("invalid m3u8 type %d", t)) + } + return +} + +//func readFromCDN(name, domain string) (reader io.Reader, err error) { +// requestUrl := utils.JoinUrlPath(domain, name) +// resp, err := http.GetLargeFile(requestUrl, nil) +// if err != nil { +// return +// } +// if resp.StatusCode != 200 { +// msg := fmt.Sprintf("read m3u8 fail, url: %s, status code %d", requestUrl, resp.StatusCode) +// err = errors.MakeWithMsg(errors.M3u8Read, msg) +// return +// } +// reader = bytes.NewReader(resp.Data) +// return +//} + +// 从redis缓存中读取 +func readFromRedis(name, domain string) (reader io.Reader, err error) { + m3u8Key := redisconst.MediaM3U8Key(name) + data, err := redis.StatRds.GetBytes(m3u8Key) + if err == nil && len(data) > 0 { + reader = bytes.NewReader(data) + return + } + requestUrl := utils.JoinUrlPath(domain, name) + resp, err := http.GetLargeFile(requestUrl, nil) + if err != nil { + //fmt.Println("requestUrl111", requestUrl) + return + } + + if resp.StatusCode != 200 { + msg := fmt.Sprintf("read m3u8 fail, url: %s, status code %d", requestUrl, resp.StatusCode) + //fmt.Println(msg) + err = errors.MakeWithMsg(errors.M3u8Read, msg) + return + } + if err := redis.StatRds.Set(m3u8Key, resp.Data, + redisconst.MediaM3U8CacheExpire); err != nil { + log.Info("m3u8:readFromRedis redis set err", log.E(err)) + } + reader = bytes.NewReader(resp.Data) + return +} + +func GetHeaderMediaSegUrls() []string { + urls := make([]string, 0) + if headerMediaPlayList == nil { + return urls + } + for _, segment := range headerMediaPlayList.Segments { + if segment == nil { + continue + } + urls = append(urls, segment.URI) + } + return urls +} diff --git a/common/m3u8/types.go b/common/m3u8/types.go new file mode 100644 index 0000000..97a1614 --- /dev/null +++ b/common/m3u8/types.go @@ -0,0 +1,13 @@ +package m3u8 + +type Req struct { + Token string `json:"token" form:"token"` + VId int64 `json:"vId" form:"vId"` + Name string `json:"name" form:"name"` + NeedHeader bool `json:"needHeader" form:"needHeader"` +} + +type PostVideoReq struct { + Token string `json:"token" form:"token"` + Name string `json:"name" form:"name" binding:"required" comment:"must be set"` +} diff --git a/common/mongos/client.go b/common/mongos/client.go new file mode 100644 index 0000000..9d2d6c3 --- /dev/null +++ b/common/mongos/client.go @@ -0,0 +1,507 @@ +package mongos + +import ( + "context" + "errors" + "reflect" + "stat/common/utils" + "strings" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type MongoTool struct { + db *Manager + collName string +} + +type PageAndSort struct { + Page int64 + PageSize int64 + Sort bson.M //bson.M{_id : -1 } +} + +func New(db *Manager, collName string) *MongoTool { + return &MongoTool{db: db, collName: collName} +} + +func (b *MongoTool) GetCollection() *mongo.Collection { + return b.collection() +} + +func (b *MongoTool) collection() *mongo.Collection { + opts := options.CollectionOptions{Registry: Registry} + return b.db.Database().Collection(b.collName, &opts) +} + +func (b *MongoTool) FindById(ctx context.Context, bind interface{}, id interface{}, opts ...*options.FindOneOptions) error { + param := bson.M{"_id": id} + return b.FindOne(ctx, bind, param, opts...) +} + +func (b *MongoTool) FindOne(ctx context.Context, bind interface{}, query bson.M, opts ...*options.FindOneOptions) error { + err := b.collection().FindOne(ctx, query, opts...).Decode(bind) + if err != nil && err == mongo.ErrNoDocuments { + return nil + } + return err +} + +func (b *MongoTool) FindOneEx(ctx context.Context, bind interface{}, query bson.M, opts ...*options.FindOneOptions) error { + err := b.collection().FindOne(ctx, query, opts...).Decode(bind) + return err +} + +func (b *MongoTool) FindMOneAndUpdate(ctx context.Context, bind interface{}, query bson.M, update interface{}, opts ...*options.FindOneAndUpdateOptions) error { + setReturn := false + for _, opt := range opts { + if opt != nil && opt.ReturnDocument != nil { + setReturn = true + break + } + } + if !setReturn { + after := options.After + opts = append(opts, &options.FindOneAndUpdateOptions{ReturnDocument: &after}) + } + um := utils.Struct2Map(update) + um["updatedAt"] = time.Now() + set := bson.M{ + "$set": um, + } + result := b.collection().FindOneAndUpdate(ctx, query, set, opts...) + err := result.Decode(bind) + return err +} + +func (b *MongoTool) FindMOneAndUpdateInc(ctx context.Context, bind interface{}, query bson.M, update interface{}, inc interface{}, opts ...*options.FindOneAndUpdateOptions) error { + um := utils.Struct2Map(update) + um["updatedAt"] = time.Now() + im := utils.Struct2Map(inc) + set := bson.M{ + "$set": um, + } + if im != nil { + set["$inc"] = inc + } + + setReturn := false + for _, opt := range opts { + if opt != nil && opt.ReturnDocument != nil { + setReturn = true + break + } + } + if !setReturn { + after := options.After + opts = append(opts, &options.FindOneAndUpdateOptions{ReturnDocument: &after}) + } + + result := b.collection().FindOneAndUpdate(ctx, query, set, opts...) + err := result.Decode(bind) + return err +} + +func (b *MongoTool) FindOneAndUpdateTiny( + ctx context.Context, + query bson.M, + update bson.M, + opts ...*options.FindOneAndUpdateOptions) error { + result := b.collection().FindOneAndUpdate(ctx, query, update, opts...) + return result.Err() +} + +func (b *MongoTool) FindOneAndUpdateReturnTiny(ctx context.Context, + bind interface{}, + query bson.M, + update bson.M, + afterDoc bool, + opts ...*options.FindOneAndUpdateOptions) error { + + if afterDoc { + opts = append(opts, options.FindOneAndUpdate().SetReturnDocument(options.After)) + } else { + opts = append(opts, options.FindOneAndUpdate().SetReturnDocument(options.Before)) + } + + result := b.collection().FindOneAndUpdate(ctx, query, update, opts...).Decode(bind) + return result +} + +func (b *MongoTool) FindOneAndUpdate(ctx context.Context, bind interface{}, query bson.M, update bson.M, opts ...*options.FindOneAndUpdateOptions) error { + setReturn := false + for _, opt := range opts { + if opt != nil && opt.ReturnDocument != nil { + setReturn = true + break + } + } + if !setReturn { + after := options.After + opts = append(opts, &options.FindOneAndUpdateOptions{ReturnDocument: &after}) + } + b.setUpdatedAt(update, time.Now()) + result := b.collection().FindOneAndUpdate(ctx, query, update, opts...) + err := result.Decode(bind) + return err +} + +func (b *MongoTool) Find(ctx context.Context, bind interface{}, query bson.M, opt ...*options.FindOptions) error { + err := b.validSlice(bind) + cur, err := b.collection().Find(ctx, query, opt...) + if err != nil && err == mongo.ErrNoDocuments { + return nil + } else if err != nil { + return err + } + err = cur.All(ctx, bind) + return err +} + +func (b *MongoTool) FindByPage(ctx context.Context, bind interface{}, query bson.M, pageAndSort *PageAndSort, opts ...*options.FindOptions) error { + err := b.validSlice(bind) + if err != nil { + return err + } + opt := &options.FindOptions{} + if pageAndSort == nil { + return errors.New("page must not nil") + } + if pageAndSort.Page == 0 || pageAndSort.PageSize == 0 { + return errors.New("page and PageSize must not nil") + } + skip := (pageAndSort.Page - 1) * pageAndSort.PageSize + opt.Skip = &skip + opt.Limit = &pageAndSort.PageSize + if pageAndSort.Sort != nil { + opt.Sort = pageAndSort.Sort + } + opts = append(opts, opt) + cur, err := b.collection().Find(ctx, query, opts...) + if err != nil && err == mongo.ErrNoDocuments { + return nil + } else if err != nil { + return err + } + err = cur.All(ctx, bind) + return err + +} + +func (b *MongoTool) FindOneAndDelete(ctx context.Context, bind interface{}, query bson.M, opts ...*options.FindOneAndDeleteOptions) error { + result := b.collection().FindOneAndDelete(ctx, query, opts...) + if result.Err() != nil { + return result.Err() + } + return result.Decode(bind) +} + +func (b *MongoTool) InsertOneTiny(ctx context.Context, doc interface{}) (err error) { + _, err = b.collection().InsertOne(ctx, doc) + return +} + +func (b *MongoTool) InsertOne(ctx context.Context, doc interface{}) (string, error) { + //设置创建时间 + b.addCreatedAt(doc) + //设置修改时间 + b.addUpdatedAt(doc) + result, err := b.collection().InsertOne(ctx, doc) + if err != nil { + return "", err + } + if id, ok := result.InsertedID.(primitive.ObjectID); ok { + return id.Hex(), nil + } + return "", err +} + +func (b *MongoTool) InsertMany(ctx context.Context, docs interface{}) ([]interface{}, error) { + err := b.validSlice(docs) + if err != nil { + return nil, err + } + res := b.setTimeForSlice(docs) + result, err := b.collection().InsertMany(ctx, res) + if err != nil { + return nil, err + } + return result.InsertedIDs, err +} + +// struct方式 +func (b *MongoTool) UpdateMOne(ctx context.Context, query bson.M, update interface{}) (*mongo.UpdateResult, error) { + um := utils.Struct2Map(update) + um["updatedAt"] = time.Now() + set := bson.M{ + "$set": um, + } + return b.collection().UpdateOne(ctx, query, set) +} + +func (b *MongoTool) UpdateMOneInc(ctx context.Context, query bson.M, update interface{}, inc interface{}) (*mongo.UpdateResult, error) { + um := utils.Struct2Map(update) + um["updatedAt"] = time.Now() + set := bson.M{ + "$set": um, + } + im := utils.Struct2Map(inc) + if im != nil { + set["$inc"] = im + } + return b.collection().UpdateOne(ctx, query, set) +} + +// 原生bson.M 方式 +func (b *MongoTool) UpdateOne(ctx context.Context, query bson.M, update bson.M) (*mongo.UpdateResult, error) { + b.setUpdatedAt(update, time.Now()) + return b.collection().UpdateOne(ctx, query, update) +} + +// struct方式 +func (b *MongoTool) UpsertMOne(ctx context.Context, query bson.M, update interface{}) (*mongo.UpdateResult, error) { + um := utils.Struct2Map(update) + um["updatedAt"] = time.Now() + set := bson.M{ + "$set": um, + } + upsert := true + opt := &options.UpdateOptions{ + Upsert: &upsert, + } + now := time.Now() + result, err := b.collection().UpdateOne(ctx, query, set, opt) + if err == nil { + if result.UpsertedCount >= 1 { + _, err = b.collection().UpdateOne(ctx, query, bson.M{"$set": bson.M{"createdAt": now}}) + } + } + return result, err + +} + +func (b *MongoTool) UpsertOneEx(ctx context.Context, query bson.M, update bson.M) (*mongo.UpdateResult, error) { + opt := &options.UpdateOptions{} + opt.SetUpsert(true) + result, err := b.collection().UpdateOne(ctx, query, update, opt) + return result, err + +} + +func (b *MongoTool) UpsertOne(ctx context.Context, query bson.M, update bson.M) (*mongo.UpdateResult, error) { + + upsert := true + opt := &options.UpdateOptions{ + Upsert: &upsert, + } + now := time.Now() + b.setUpdatedAt(update, now) + result, err := b.collection().UpdateOne(ctx, query, update, opt) + if err == nil { + if result.UpsertedCount >= 1 { + _, err = b.collection().UpdateOne(ctx, query, bson.M{"$set": bson.M{"createdAt": now}}) + } + } + return result, err + +} + +func (b *MongoTool) UpdateMMany(ctx context.Context, query bson.M, update interface{}) (*mongo.UpdateResult, error) { + //b.setUpdatedAt(update, time.Now()) + return b.collection().UpdateMany(ctx, query, update) +} + +func (b *MongoTool) UpdateMany(ctx context.Context, query bson.M, update bson.M) (*mongo.UpdateResult, error) { + b.setUpdatedAt(update, time.Now()) + return b.collection().UpdateMany(ctx, query, update) +} + +func (b *MongoTool) DeleteById(ctx context.Context, id interface{}) (int64, error) { + + param := bson.M{"_id": id} + result, err := b.collection().DeleteOne(ctx, param) + if err != nil { + return 0, err + } + return result.DeletedCount, nil + +} + +func (b *MongoTool) DeleteOne(ctx context.Context, query bson.M, opts ...*options.DeleteOptions) (int64, error) { + + result, err := b.collection().DeleteOne(ctx, query) + if err != nil { + return 0, err + } + return result.DeletedCount, nil +} + +func (b *MongoTool) DeleteMany(ctx context.Context, query bson.M, opts ...*options.DeleteOptions) (int64, error) { + + result, err := b.collection().DeleteMany(ctx, query, opts...) + if err != nil { + return 0, err + } + deletedCount := result.DeletedCount + return deletedCount, nil +} + +func (b *MongoTool) Aggregate(ctx context.Context, bind interface{}, pipeline []bson.M, opts ...*options.AggregateOptions) error { + + err := b.validSlice(bind) + if err != nil { + return err + } + cur, err := b.collection().Aggregate(ctx, pipeline, opts...) + if err != nil { + return err + } + return cur.All(ctx, bind) +} + +func (b *MongoTool) ObjectAggregate(ctx context.Context, bind interface{}, pipeline []bson.M, opts ...*options.AggregateOptions) error { + cur, err := b.collection().Aggregate(ctx, pipeline, opts...) + if err != nil { + return err + } + if cur.Next(ctx) { + return cur.Decode(bind) + } + return nil +} + +func (b *MongoTool) QueryOne(ctx context.Context, bind interface{}, query interface{}, opts ...*options.FindOneOptions) error { + err := b.collection().FindOne(ctx, query, opts...).Decode(bind) + if err != nil && err == mongo.ErrNoDocuments { + return nil + } + return err +} + +func (b *MongoTool) Count(ctx context.Context, query interface{}, opts ...*options.CountOptions) (int64, error) { + return b.collection().CountDocuments(ctx, query, opts...) +} + +func (b *MongoTool) EstimatedCount(ctx context.Context, opts ...*options.EstimatedDocumentCountOptions) (int64, error) { + return b.collection().EstimatedDocumentCount(ctx, opts...) +} + +func (b *MongoTool) BulkWrite(ctx context.Context, models []mongo.WriteModel, opts ...*options.BulkWriteOptions) (*mongo.BulkWriteResult, error) { + return b.collection().BulkWrite(ctx, models, opts...) +} + +// CreateIndex 创建数据索引.options 在index里面创建 +func (b *MongoTool) CreateIndex(ctx context.Context, models []mongo.IndexModel) ([]string, error) { + data, err := b.collection().Indexes().CreateMany(ctx, models) + if err != nil { + if strings.Contains(err.Error(), "IndexKeySpecsConflict") { + return data, nil + } + if strings.Contains(err.Error(), "IndexOptionsConflict") { + return data, nil + } + return data, err + } + return data, nil +} + +// DropIndex 删除数据索引.options 在index里面创建 +func (b *MongoTool) DropIndex(ctx context.Context, indexName string) error { + _, err := b.collection().Indexes().DropOne(ctx, indexName) + if err != nil { + return err + } + return nil +} + +func (b *MongoTool) addCreatedAt(val interface{}) { + if _, ok := val.(bson.M); ok { + return + } + if _, ok := val.(map[string]interface{}); ok { + return + } + v := reflect.ValueOf(val).Elem().FieldByName("CreatedAt") + if v.IsValid() { + v.Set(reflect.ValueOf(time.Now())) + } + +} +func (b *MongoTool) addUpdatedAt(val interface{}) { + if _, ok := val.(bson.M); ok { + return + } + if _, ok := val.(map[string]interface{}); ok { + return + } + v := reflect.ValueOf(val).Elem().FieldByName("UpdatedAt") + if v.IsValid() { + v.Set(reflect.ValueOf(time.Now())) + } +} + +func (b *MongoTool) setTimeForSlice(docs interface{}) []interface{} { + arr := reflect.ValueOf(docs).Elem() + result := make([]interface{}, 0) + for i := 0; i < arr.Len(); i++ { + ele := arr.Index(i).Elem() + now := time.Now() + if ma := ele.FieldByName("UpdatedAt"); ma.IsValid() { + ma.Set(reflect.ValueOf(now)) + } + if ca := ele.FieldByName("CreatedAt"); ca.IsValid() { + ca.Set(reflect.ValueOf(now)) + } + result = append(result, ele.Interface()) + } + return result +} +func (b *MongoTool) validSlice(bind interface{}) error { + + if reflect.TypeOf(bind).Kind() != reflect.Ptr { + return errors.New("interface must be a Ptr") + } + if reflect.TypeOf(bind).Elem().Kind() != reflect.Slice { + return errors.New("interface must be a slice") + } + return nil +} + +func (b *MongoTool) setUpdatedAt(doc bson.M, now time.Time) { + set, exists := doc["$set"] + if !exists { + doc["$set"] = bson.M{"updatedAt": now} + return + } + + if res, ok := set.(bson.M); ok { + res["updatedAt"] = now + } +} + +func (b *MongoTool) setCreatedAt(doc bson.M, now time.Time) { + set, exists := doc["$set"] + if !exists { + doc["$set"] = bson.M{"createdAt": now} + return + } + if res, ok := set.(bson.M); ok { + res["createdAt"] = now + } + +} + +// Exists 是否存在数据 +func (b *MongoTool) Exists(ctx context.Context, filter interface{}, opts ...*options.FindOneOptions) (bool, error) { + var limit int64 = 1 + lo := &options.CountOptions{Limit: &limit} + n, err := b.Count(ctx, filter, lo) + if err != nil { + return false, err + } + return n > 0, nil +} diff --git a/common/mongos/codec.go b/common/mongos/codec.go new file mode 100644 index 0000000..9d9fb30 --- /dev/null +++ b/common/mongos/codec.go @@ -0,0 +1,119 @@ +package mongos + +import ( + "fmt" + "github.com/shopspring/decimal" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/bsoncodec" + "go.mongodb.org/mongo-driver/bson/bsonrw" + "go.mongodb.org/mongo-driver/bson/bsontype" + "go.mongodb.org/mongo-driver/bson/primitive" + "reflect" + "time" +) + +var Registry = func() *bsoncodec.Registry { + builder := bson.NewRegistryBuilder() + builder.RegisterDecoder(reflect.TypeOf(time.Time{}), &localTimeDecoder{}) + builder.RegisterDecoder(reflect.TypeOf(decimal.Decimal{}), &decimalDecoder{}) + builder.RegisterEncoder(reflect.TypeOf(decimal.Decimal{}), &decimalEncoder{}) + builder.RegisterDefaultDecoder(reflect.Float32, &floatDecoder{}) + builder.RegisterDefaultDecoder(reflect.Float64, &floatDecoder{}) + return builder.Build() +}() + +type floatDecoder struct { +} + +func (dvd *floatDecoder) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + var f float64 + var err error + switch vr.Type() { + case bsontype.Int32: + i32, err := vr.ReadInt32() + if err != nil { + return err + } + f = float64(i32) + case bsontype.Int64: + i64, err := vr.ReadInt64() + if err != nil { + return err + } + f = float64(i64) + case bsontype.Double: + f, err = vr.ReadDouble() + if err != nil { + return err + } + default: + return fmt.Errorf("cannot decode %v into a float32 or float64 type", vr.Type()) + } + val.SetFloat(f) + return nil +} + +type localTimeDecoder struct{} + +func (*localTimeDecoder) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + dvd := bsoncodec.DefaultValueDecoders{} + err := dvd.TimeDecodeValue(dc, vr, val) + if err != nil { + return err + } + t := val.Interface().(time.Time) + val.Set(reflect.ValueOf(t.Local())) + return nil +} + +type decimalDecoder struct{} + +func (*decimalDecoder) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if !val.IsValid() || val.Type() != reflect.TypeOf(decimal.Decimal{}) { + return bsoncodec.ValueDecoderError{Name: "DecimalDecodeValue", Types: []reflect.Type{reflect.TypeOf(decimal.Decimal{})}, Received: val} + } + var ( + num bool + ) + if vr.Type() == bson.TypeInt32 || vr.Type() == bson.TypeInt64 { + vr.ReadInt32() + vr.ReadInt64() + num = true + } + if num { + d := decimal.NewFromFloat(0.0) + val.Set(reflect.ValueOf(d)) + return nil + } + + mongodecimal, err := vr.ReadDecimal128() + if err != nil { + return err + } + d, err := decimal.NewFromString(mongodecimal.String()) + if err != nil { + return err + } + val.Set(reflect.ValueOf(d)) + return nil +} + +// + +type decimalEncoder struct{} + +func (*decimalEncoder) EncodeValue(ctx bsoncodec.EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { + if !val.IsValid() || val.Type() != reflect.TypeOf(decimal.Decimal{}) { + return bsoncodec.ValueDecoderError{Name: "DecimalEncodeValue", Types: []reflect.Type{reflect.TypeOf(decimal.Decimal{})}, Received: val} + } + + if d, ok := val.Interface().(decimal.Decimal); ok { + mongodecimal, err := primitive.ParseDecimal128(d.StringFixed(2)) + if err != nil { + return err + } + val = reflect.ValueOf(mongodecimal) + } + dve := bsoncodec.DefaultValueEncoders{} + return dve.Decimal128EncodeValue(ctx, vw, val) +} diff --git a/common/mongos/manager.go b/common/mongos/manager.go new file mode 100644 index 0000000..e4143b5 --- /dev/null +++ b/common/mongos/manager.go @@ -0,0 +1,138 @@ +package mongos + +import ( + "context" + "stat/common/log" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/x/mongo/driver/connstring" + + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var MgoManager *Manager + +type Options struct { + Url string `json:"url"` // 数据库连接 +} + +// Manager 数据库连接管理器 +// 重置连接等 +type Manager struct { + client *mongo.Client + url string + db string +} + +func NewManager(url string) *Manager { + return &Manager{url: url} +} + +func (m *Manager) Database() *mongo.Database { + return m.client.Database(m.db) +} + +func (m *Manager) Connect() error { + cs, err := connstring.Parse(m.url) + if err != nil { + log.Error("db connect parse err", log.E(err)) + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + client, err := mongo.Connect(ctx, options.Client().ApplyURI(m.url)) + if err != nil { + log.Error("[warn] connect mongo db err", log.E(err)) + return err + } + if err = client.Ping(ctx, nil); err != nil { + log.Error("[warn] ping mongo db err", log.E(err)) + return err + } + + m.db = cs.Database + m.client = client + + log.Info("mongos:Init ok!", log.Any("dbName", m.db), log.Any("dbHost", cs.Hosts)) + return nil +} + +func (m *Manager) DisConnect() { + if m.client != nil { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := m.client.Disconnect(ctx); err != nil { + log.Error("db disconnect err", log.E(err)) + } + m.client = nil + } +} + +//Transaction 开启事务处理包裹处理,里面处理的全是利用的事务的ctx +func (m *Manager) Transaction(ctx context.Context, fn func(sctx mongo.SessionContext) error) error { + return m.client.UseSession( + ctx, + func(sctx mongo.SessionContext) error { + return runTransactionWithRetry(sctx, func(ctx mongo.SessionContext) error { + err := sctx.StartTransaction() + if err != nil { + return err + } + err = fn(sctx) + if err != nil { + sctx.AbortTransaction(sctx) + return err + } + return commitWithRetry(sctx) + }) + }, + ) +} + +func runTransactionWithRetry(sctx mongo.SessionContext, txnFn func(mongo.SessionContext) error) error { + for { + err := txnFn(sctx) // Performs transaction. + if err == nil { + return nil + } + // If transient error, retry the whole transaction + if cmdErr, ok := err.(mongo.CommandError); ok && cmdErr.HasErrorLabel("TransientTransactionError") { + continue + } + return err + } +} + +// commitWithRetry is an example function demonstrating transaction retry logic. +func commitWithRetry(sctx mongo.SessionContext) error { + for { + err := sctx.CommitTransaction(sctx) + switch e := err.(type) { + case nil: + return nil + case mongo.CommandError: + // Can retry commit + if e.HasErrorLabel("UnknownTransactionCommitResult") { + continue + } + return e + default: + return e + } + } +} + +func Transaction(ctx context.Context, fn func(sctx mongo.SessionContext) error) error { + return MgoManager.Transaction(ctx, fn) +} + +func ToBsonM(v interface{}) bson.M { + b, _ := bson.Marshal(v) + var r = bson.M{} + _ = bson.Unmarshal(b, &r) + return r +} diff --git a/common/pollute/ce8.go b/common/pollute/ce8.go new file mode 100644 index 0000000..019ad65 --- /dev/null +++ b/common/pollute/ce8.go @@ -0,0 +1,259 @@ +package pollute + +import ( + "bytes" + "compress/gzip" + "encoding/json" + "errors" + "fmt" + "github.com/PuerkitoBio/goquery" + "github.com/xxjwxc/gowp/workpool" + "io/ioutil" + "math/rand" + "net/http" + "net/url" + "stat/common/log" + "strings" + "time" +) + +//http://www.ce8.com/check +type ce8PolluteServerConfig struct { + DotNetApi string `json:"dotNetApi"` +} +type ce8PollutionFullReq struct { + URL string `json:"url"` +} +type ce8PollutionFullResp struct { + Code int `json:"code"` + State bool `json:"state"` + Runtime interface{} `json:"runtime"` + Data struct { + URL string `json:"url"` + Pollution bool `json:"pollution"` + PollutionNodeCount int `json:"pollution_node_count"` + NodeList []struct { + PollutionResult struct { + IP string `json:"ip"` + Location string `json:"location"` + Pollution bool `json:"pollution"` + IsTimeout bool `json:"is_timeout"` + } `json:"pollution_result"` + } `json:"node_list"` + } `json:"data"` +} + +func ce8PolluteCheck(domains []CheckReq) ([]CheckResult, error) { + if len(domains) == 0 { + return nil, nil + } + doc, err := ce8GetCheckDoc() + if err != nil { + log.Warn("ce8PolluteCheck ce8GetCheckDoc err", log.Any("domain", domains), log.E(err)) + return nil, err + } + sc, err := ce8GetPolluteServerConfig(doc) + if err != nil { + log.Warn("ce8PolluteCheck ce8GetPolluteServerConfig err", log.Any("domain", domains), log.E(err)) + return nil, err + } + csrfToken := ce8GetCSRFToken(doc) + if csrfToken == "" { + log.Warn("ce8PolluteCheck ce8GetCSRFToken empty", log.Any("domain", domains)) + } + log.Info("ce8PolluteCheck ce8PollutionFulls start", log.Any("domainsLen", len(domains))) + checkResult, err := ce8PollutionFulls(domains, *sc, csrfToken) + if err != nil { + log.Info("ce8PolluteCheck ce8PollutionFulls Finish Err", log.Any("domain", domains), log.E(err)) + return nil, err + } + log.Info("ce8PolluteCheck ce8PollutionFulls Finish OK", log.Any("checkResultLen", len(checkResult))) + return checkResult, err +} + +func ce8GetCheckDoc() (*goquery.Document, error) { + const ce8CheckURL = "https://ce8.com/define" + req, err := http.NewRequest("GET", ce8CheckURL, nil) + if err != nil { + log.Warn("ce8GetCheckDoc newRequest", log.Any("url", ce8CheckURL), log.E(err)) + return nil, err + } + req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9") + req.Header.Add("Accept-Language", " en-US,en;q=0.9") + req.Header.Add("Accept-Encoding", "gzip") + req.Header.Add("Cache-Control", "no-cache") + req.Header.Add("Connection", "keep-alive") + req.Header.Add("Host", "www.ce8.com") + req.Header.Add("Pragma", "no-cache") + req.Header.Add("sec-ch-ua", "\"Chromium\";v=\"88\", \"Google Chrome\";v=\"88\", \";Not A Brand\";v=\"99\"") + req.Header.Add("sec-ch-ua-mobile", "?0") + req.Header.Add("Sec-Fetch-Dest", "document") + req.Header.Add("Sec-Fetch-Mode", "navigate") + req.Header.Add("Sec-Fetch-Site", "none") + req.Header.Add("Sec-Fetch-User", "?1") + req.Header.Add("Upgrade-Insecure-Requests", "1") + req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36") + res, err := http.DefaultClient.Do(req) + if err != nil { + log.Warn("ce8GetCheckDoc Client Do", log.Any("url", ce8CheckURL), log.E(err)) + return nil, err + } + defer func() { _ = res.Body.Close() }() + if res.StatusCode != http.StatusOK { + log.Warn("ce8GetCheckDoc err http statusCode", log.Any("statusCode", res.StatusCode)) + return nil, errors.New(fmt.Sprintf("StatusCode:%d", res.StatusCode)) + } + bodyReader := res.Body + switch res.Header.Get("Content-Encoding") { + case "gzip": + bodyReader, err = gzip.NewReader(res.Body) + if err != nil { + log.Warn("ce8GetCheckDoc gzip newReader", log.E(err)) + return nil, err + } + defer func() { _ = bodyReader.Close() }() + default: + } + doc, err := goquery.NewDocumentFromReader(bodyReader) + if err != nil { + log.Warn("ce8GetCheckDoc NewDocumentFromReader err", log.Any("url", ce8CheckURL), log.E(err)) + return nil, err + } + return doc, nil +} + +func ce8GetPolluteServerConfig(doc *goquery.Document) (*ce8PolluteServerConfig, error) { + script := doc.Find("script").Text() + scriptLines := strings.Split(script, "\n") + var serverConfigLine = "" + for _, line := range scriptLines { + if strings.Contains(line, "serverConfig") && strings.Contains(line, "dotNetApi") { + serverConfigLine = line + break + } + } + if serverConfigLine == "" { + log.Warn("ce8GetPolluteServerConfig Get Line Fail") + return nil, errors.New("not found serverConfig") + } + start := strings.Index(serverConfigLine, "{") + end := strings.LastIndex(serverConfigLine, "}") + if start == -1 || end == -1 { + log.Warn("ce8GetPolluteServerConfig err Line Content", log.Any("line", serverConfigLine)) + return nil, errors.New("parseServerConfig error") + } + jsonString := serverConfigLine[start : end+1] + var serverConfig ce8PolluteServerConfig + err := json.Unmarshal([]byte(jsonString), &serverConfig) + if err != nil { + log.Warn("ce8GetPolluteServerConfig unmarshal ServerConfig err", log.E(err)) + return nil, err + } + if serverConfig.DotNetApi == "" { + log.Warn("ce8GetPolluteServerConfig dotNetApi empty", log.Any("jsonString", jsonString)) + return nil, errors.New("serverConfig dotNetApi empty") + } + return &serverConfig, nil +} + +func ce8GetCSRFToken(doc *goquery.Document) string { + var csrfToken = "" + doc.Find("meta").EachWithBreak(func(i int, s *goquery.Selection) bool { + if name, _ := s.Attr("name"); name == "csrf-token" { + csrfToken, _ = s.Attr("content") + return false + } + return true + }) + return csrfToken +} + +func ce8PollutionFulls(reqs []CheckReq, sc ce8PolluteServerConfig, csrfToken string) ([]CheckResult, error) { + ch := make(chan CheckResult, len(reqs)) + wp := workpool.New(15) + reqs = reqs[:] //copy + //在服务器上经常出现超时,这里先做下随机 + rand.Shuffle(len(reqs), func(i, j int) { reqs[i], reqs[j] = reqs[j], reqs[i] }) + for i := range reqs { + req := reqs[i] + wp.Do(func() error { + domain := req.Domain + r := CheckResult{Domain: domain, Payload: req.Payload, Err: errors.New("exception occurred")} + polled, err := ce8PollutionFull(domain, sc, csrfToken) + r.Polled = polled + r.Err = err + ch <- r + return nil + }) + } + err := wp.Wait() + if err != nil { + return nil, err + } + + var result []CheckResult + count := len(ch) + for i := 0; i < count; i++ { + result = append(result, <-ch) + } + close(ch) + ch = nil + + return result, nil +} + +func ce8PollutionFull(domain string, sc ce8PolluteServerConfig, csrfToken string) (bool, error) { + u, err := url.Parse(sc.DotNetApi) + if err != nil { + log.Warn("ce8PollutionFull parseAPI", log.Any("DotNetApi", sc.DotNetApi), log.E(err)) + return false, err + } + u.Path = "/api/define/pollution_full" + reqBody, _ := json.Marshal(&ce8PollutionFullReq{URL: domain}) + checkURL := u.String() + req, err := http.NewRequest("POST", checkURL, bytes.NewReader(reqBody)) + if err != nil { + log.Warn("ce8PollutionFull newRequest", log.Any("url", checkURL), log.E(err)) + return false, err + } + req.Header.Add("Connection", "keep-alive") + req.Header.Add("Pragma", "no-cache") + req.Header.Add("Cache-Control", "no-cache") + req.Header.Add("Accept", "application/json, text/javascript, */*; q=0.01") + if csrfToken != "" { + req.Header.Add("X-CSRF-TOKEN", csrfToken) + } + req.Header.Add("User-Agent", "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36") + req.Header.Add("Content-Type", "application/json; charset=UTF-8") + req.Header.Add("Origin", "http://www.ce8.com") + req.Header.Add("Referer", "http://www.ce8.com/") + req.Header.Add("Accept-Language", "en-US,en;q=0.9") + client := http.Client{Timeout: 150 * time.Second} + res, err := client.Do(req) + if err != nil { + log.Warn("ce8PollutionFull Client Do", log.Any("checkURL", checkURL), log.Any("domain", domain), log.E(err)) + return false, err + } + defer func() { _ = res.Body.Close() }() + if res.StatusCode != http.StatusOK { + log.Warn("ce8PollutionFull Resp not OK", log.Any("checkURL", checkURL), log.Any("domain", domain), log.Any("statusCode", res.StatusCode)) + return false, errors.New(fmt.Sprintf("StatusCode:%d", res.StatusCode)) + } + body, err := ioutil.ReadAll(res.Body) + if err != nil { + log.Warn("ce8PollutionFull Resp ReadAll", log.Any("checkURL", checkURL), log.Any("domain", domain), log.E(err)) + return false, err + } + var fullResp ce8PollutionFullResp + err = json.Unmarshal(body, &fullResp) + if err != nil { + log.Warn("ce8PollutionFull Unmarshal", log.Any("checkURL", checkURL), log.Any("domain", domain), log.Any("body", body), log.E(err)) + return false, err + } + if fullResp.Code == 0 { + log.Info("ce8PollutionFull Code OK", log.Any("checkURL", checkURL), log.Any("domain", domain), log.Any("pollution", fullResp.Data.Pollution)) + return fullResp.Data.Pollution, nil + } + log.Warn("ce8PollutionFull Code", log.Any("checkURL", checkURL), log.Any("domain", domain), log.Any("code", fullResp.Code)) + return false, errors.New(fmt.Sprintf("respcode expect 0,got:%d", fullResp.Code)) +} diff --git a/common/pollute/pollute.go b/common/pollute/pollute.go new file mode 100644 index 0000000..5e8a850 --- /dev/null +++ b/common/pollute/pollute.go @@ -0,0 +1,28 @@ +package pollute + +type CheckFrom = int + +const ( + Ce8 CheckFrom = iota +) + +type CheckReq struct { + Domain string + Payload string +} + +type CheckResult struct { + Domain string + Polled bool + Err error + Payload string +} + +func Check(domains []CheckReq, checkFrom CheckFrom) ([]CheckResult, error) { + switch checkFrom { + case Ce8: + fallthrough + default: + return ce8PolluteCheck(domains) + } +} diff --git a/common/pollute/pollute_test.go b/common/pollute/pollute_test.go new file mode 100644 index 0000000..e31ea9f --- /dev/null +++ b/common/pollute/pollute_test.go @@ -0,0 +1,15 @@ +package pollute + +import ( + "fmt" + "testing" +) + +func TestPolluteCheck(t *testing.T) { + var reqs []CheckReq + reqs = append(reqs, CheckReq{Domain: "https://ppfff.me", Payload: "1"}) + reqs = append(reqs, CheckReq{Domain: "pppff.me", Payload: "2"}) + reqs = append(reqs, CheckReq{Domain: "https://ppff.live", Payload: "3"}) + result, err := Check(reqs, Ce8) + fmt.Println(result, err) +} diff --git a/common/proxy/object.go b/common/proxy/object.go new file mode 100644 index 0000000..6203b78 --- /dev/null +++ b/common/proxy/object.go @@ -0,0 +1,96 @@ +package proxy + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io" + "stat/common/httpUtils" + "stat/common/utils" + "sync" +) + +var ( + buffer = bytes.Buffer{} + lock sync.Mutex +) + +var ( + header = map[string]string{"Content-Type": "application/json"} +) + +const ( + Success = 200 +) + +// PutObject put object to proxy +func PutObject(ctx context.Context, apiUrl, objpath string, body io.Reader) (path string, err error) { + lock.Lock() + defer lock.Unlock() + + buffer.Reset() + _, err = buffer.ReadFrom(body) + if err != nil { + return + } + base64data := base64.StdEncoding.EncodeToString(buffer.Bytes()) + + r := objreq{ + Name: utils.PathForInfo(objpath).FullFileName, + Data: base64data, + } + + jsonBytes, err := json.Marshal(r) + if err != nil { + return + } + resp, err := httpUtils.Post(apiUrl, header, bytes.NewReader(jsonBytes)) + if err != nil { + return + } + + var or objresp + err = json.Unmarshal(resp.Data, &or) + if err != nil { + fmt.Println(apiUrl, string(resp.Data)) + return + } + if or.Code != Success { + err = errors.New(or.Msg) + return + } + path = or.Object.Name + return +} + +func PutBase64Object(ctx context.Context, apiUrl, objpath string, base64data string) (path string, err error) { + r := objreq{ + Name: utils.PathForInfo(objpath).FullFileName, + Data: base64data, + } + + jsonbytes, err := json.Marshal(r) + if err != nil { + return + } + + resp, err := httpUtils.Post(apiUrl, header, bytes.NewReader(jsonbytes)) + if err != nil { + return + } + + var or objresp + err = json.Unmarshal(resp.Data, &or) + if err != nil { + return + } + if or.Code != Success { + err = errors.New(or.Msg) + return + } + path = or.Object.Name + return +} diff --git a/common/proxy/object_test.go b/common/proxy/object_test.go new file mode 100644 index 0000000..1f8eb03 --- /dev/null +++ b/common/proxy/object_test.go @@ -0,0 +1,31 @@ +package proxy + +import ( + "context" + "fmt" + "log" + "os" +) + +func ExamplePutObject() { + file, err := os.OpenFile("/Users/mac/Desktop/abc.jpeg", os.O_RDONLY, 0655) + if err != nil { + fmt.Println(err) + return + } + + filestat, err := file.Stat() + if err != nil { + fmt.Println(err) + return + } + + path, err := PutObject(context.TODO(), "http://img.bbaazz.me/file/upload", filestat.Name(), file) + if err != nil { + fmt.Println(err) + return + } + log.Println("path", path, "err", err) + + // Output: +} diff --git a/common/proxy/types.go b/common/proxy/types.go new file mode 100644 index 0000000..7ebd9a0 --- /dev/null +++ b/common/proxy/types.go @@ -0,0 +1,17 @@ +package proxy + +type objreq struct { + Name string `json:"fileName"` + Data string `json:"fileData"` +} + +type Obj struct { + Domain string `json:"domain"` + Name string `json:"fileName"` +} + +type objresp struct { + Code int `json:"code"` + Object Obj `json:"data"` + Msg string `json:"msg"` +} diff --git a/common/pub.go b/common/pub.go new file mode 100644 index 0000000..cfe1439 --- /dev/null +++ b/common/pub.go @@ -0,0 +1,15 @@ +package common + +/*type AppReqType int32 + +const ( + AppRecommend AppReqType = 1 //推荐 + AppFree AppReqType = 2 //免费约妹神器 +) +*/ + +type CategoryRank struct { + CID int64 `json:"cid" bson:"cid"` + Name string `json:"name" bson:"-"` + Rank int64 `json:"rank" bson:"rank"` +} diff --git a/common/rand.go b/common/rand.go new file mode 100644 index 0000000..c71033c --- /dev/null +++ b/common/rand.go @@ -0,0 +1,37 @@ +package common + +import ( + "math/rand" + "time" +) + +//生成随机字符串 +func RandStr(strLen int) string { + rand.Seed(time.Now().UnixNano()) + data := make([]byte, strLen) + var num int + for i := 0; i < strLen; i++ { + num = rand.Intn(57) + 65 + for { + if num > 90 && num < 97 { + num = rand.Intn(57) + 65 + } else { + break + } + } + data[i] = byte(num) + } + return string(data) +} +func ArrayReverseInt(s []int) []int { + for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } + return s +} +func ArrayReverseByte(s []byte) []byte { + for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } + return s +} \ No newline at end of file diff --git a/common/redis/client.go b/common/redis/client.go new file mode 100644 index 0000000..08b6c67 --- /dev/null +++ b/common/redis/client.go @@ -0,0 +1,33 @@ +package redis + +import ( + "errors" + "fmt" + + "github.com/go-redis/redis" +) + +var StatRds *Manager + +type Manager struct { + client *redis.Client + options *redis.Options +} + +// Redis 配置项 +type Options = redis.Options + +func NewManagerWithUrl(url string, fn func(opt *Options)) (*Manager, error) { + opts, err := redis.ParseURL(url) + if err != nil { + return nil, err + } + if opts == nil { + err = errors.New(fmt.Sprintf("NewManagerWithUrl failed url %s", url)) + return nil, err + } + if fn != nil { + fn(opts) + } + return &Manager{options: opts}, nil +} diff --git a/common/redis/define.go b/common/redis/define.go new file mode 100644 index 0000000..f7dce78 --- /dev/null +++ b/common/redis/define.go @@ -0,0 +1,73 @@ +package redis + +import ( + "fmt" + "time" +) + +const ( + AdvertiseClickDayHashTemplate = "stat-center.advertise.day.click.%s" // 广告点击 + AdvertiseClickDayHashIdHourSep = "@" + IpLimiterKeyTemplate = "stat-center.%s:%d.ip.limiter.key#%s" + IpLimiterDayRecordKey = "stat-center.ip.limiter.day.record.key" + DownloadCheckBotMsgHashKeyTmpl = "stat-center.download.check.bot.msg.hash.key.%s" // 下载提示消息 + ServerStartTimeHashKeyTemplate = "stat-center.server.start_time.hash.key.%d" + ServerKeepAliveHashKeyTemplate = "stat-center.server.keepalive.hash.key.%d" + ServerCloseFlagHashKeyTemplate = "stat-center.server.close.flag.hash.key.%d" +) + +func GetServerStartTimeHashKey(index int) string { + return fmt.Sprintf(ServerStartTimeHashKeyTemplate, index) +} + +func GetServerKeepAliveHashKey(index int) string { + return fmt.Sprintf(ServerKeepAliveHashKeyTemplate, index) +} + +func GetServerCloseFlagHashKey(index int) string { + return fmt.Sprintf(ServerCloseFlagHashKeyTemplate, index) +} + +func GetDownloadCheckBotMsgHashKey() string { + return fmt.Sprintf(DownloadCheckBotMsgHashKeyTmpl, time.Now().Format("2006-02-01-15")) +} + +func GetIpLimitDayKey(serverIp string, serverPort int) string { + ts := time.Now().Local().Format("2006-02-01") + return fmt.Sprintf(IpLimiterKeyTemplate, serverIp, serverPort, ts) +} + +func GetIpLimitSpecifiedDayKey(serverIp string, serverPort int, day time.Time) string { + ts := day.Local().Format("2006-02-01") + return fmt.Sprintf(IpLimiterKeyTemplate, serverIp, serverPort, ts) +} + +func GetAdvertiseClickDayHash(now time.Time) *Hash { + t := now.Local().Format("2006-02-01") + return NewHash(StatRds.Client(), fmt.Sprintf(AdvertiseClickDayHashTemplate, t)) +} + +func GetAdvertiseClickHourName(appId int32, adsId int64, hour int) string { + return fmt.Sprintf("%d%s%d%s%d", appId, AdvertiseClickDayHashIdHourSep, adsId, AdvertiseClickDayHashIdHourSep, hour) +} + +const ( + NameSource = "name:source" //姓名池 + NameSourceExpire = 2 * 24 * time.Hour + + AppClickDaySetTemplate = "nh.app.day.click.%s" // app点击 + AppClickDaySetIdHourSep = "@" +) + +func GetAppClickDaySet(now time.Time) *Hash { + t := now.Local().Format("2006-02-01") + return NewHash(StatRds.Client(), fmt.Sprintf(AppClickDaySetTemplate, t)) +} + +func GetAppClickHourName(appId string, hour int) string { + return fmt.Sprintf("%s%s%d", appId, AppClickDaySetIdHourSep, hour) +} + +func GetAppClickHourNameByAppId(appId int64, parentAppId int64, hour int) string { + return fmt.Sprintf("%s_%s%s%d", appId, parentAppId, AppClickDaySetIdHourSep, hour) +} diff --git a/common/redis/hash.go b/common/redis/hash.go new file mode 100644 index 0000000..e416da5 --- /dev/null +++ b/common/redis/hash.go @@ -0,0 +1,107 @@ +package redis + +import ( + "time" + + "github.com/go-redis/redis" +) + +//key: {name:value, name:value, name:value} + +type Hash struct { + key string + client *redis.Client +} + +func NewHash(client *redis.Client, key string) *Hash { + return &Hash{ + key: key, + client: client, + } +} + +func (s *Hash) Key() string { + return s.key +} + +// Expire 设置集合过期时间 +func (s *Hash) Expire(expiration time.Duration) (bool, error) { + return s.client.Expire(s.key, expiration).Result() +} + +// Delete 删除一个或多个 Name +func (s *Hash) Delete(names ...string) (int64, error) { + return s.client.HDel(s.key, names...).Result() +} + +// Exists 检测Name是否在哈希表中 +func (s *Hash) Exists(name string) (bool, error) { + return s.client.HExists(s.key, name).Result() +} + +// NameValues 获取所有哈希表数据 +func (s *Hash) NameValues() (map[string]string, error) { + return s.client.HGetAll(s.key).Result() +} + +// Names 获取所有哈希表的 Name +func (s *Hash) Names() ([]string, error) { + return s.client.HKeys(s.key).Result() +} + +// Values 获取所有哈希表的 Total +func (s *Hash) Values() ([]string, error) { + return s.client.HVals(s.key).Result() +} + +// SetNX 当name不存在时才向哈希表中设置一对Name:Total +func (s *Hash) SetNX(name string, value interface{}) (bool, error) { + return s.client.HSetNX(s.key, name, value).Result() +} + +// Set 向哈希表中设置一对Name:Total +func (s *Hash) Set(name string, value interface{}) (bool, error) { + return s.client.HSet(s.key, name, value).Result() +} + +// Get 获取哈希表中Name对应的Value +func (s *Hash) Get(name string) (string, error) { + return s.client.HGet(s.key, name).Result() +} + +// IncInt 返回累加之后的新值 +func (s *Hash) IncInt(name string, value int64) (int64, error) { + return s.client.HIncrBy(s.key, name, value).Result() +} + +// IncFloat 返回累加之后的新值 +func (s *Hash) IncFloat(name string, value float64) (float64, error) { + return s.client.HIncrByFloat(s.key, name, value).Result() +} + +// Len 返回哈希表的大小 +func (s *Hash) Len() (int64, error) { + return s.client.HLen(s.key).Result() +} + +// Scan 扫描哈希表数据 +func (s *Hash) Scan(match string, piece int64, callback func(name, value string)) error { + proc := func(l []string) { + for i := 0; i+1 < len(l); i += 2 { + callback(l[i], l[i+1]) + } + } + lst, cur, err := s.client.HScan(s.key, 0, match, piece).Result() + if err != nil { + return err + } + proc(lst) + for cur > 0 { + lst, cur, err = s.client.HScan(s.key, cur, match, piece).Result() + if err != nil { + return err + } + proc(lst) + } + return nil +} diff --git a/common/redis/limit.go b/common/redis/limit.go new file mode 100644 index 0000000..434eb07 --- /dev/null +++ b/common/redis/limit.go @@ -0,0 +1,110 @@ +package redis + +import ( + _ "embed" + "encoding/json" + "errors" + "fmt" + "sync" + "time" + + "github.com/go-redis/redis" +) + +//go:embed limit.lua +var lua string + +const ( + SUCCESS = "success" + FAILED = "failed" +) + +type Bucket struct { + Name string `json:"na"` + Capacity int64 `json:"ca"` + Rate int64 `json:"ra"` + Size int64 `json:"si"` + GenerateAt int64 `json:"ge_at"` + CreatedAt int64 `json:"cr_at"` + UpdatedAt int64 `json:"up_at"` + PassedCount int64 `json:"pa_co"` + RejectCount int64 `json:"re_co"` + PassedHours map[int64]int64 `json:"pa_ho"` + RejectHours map[int64]int64 `json:"re_ho"` +} + +type BucketList []*Bucket + +func (a BucketList) Len() int { return len(a) } +func (a BucketList) Less(i, j int) bool { + return a[i].PassedCount > a[j].PassedCount +} +func (a BucketList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type TokenBucket struct { + keyGen func() string + capacity int64 + rate int64 + script *redis.Script + client *redis.Client + expire time.Duration + lock sync.RWMutex + curKey string +} + +func NewTokenBucket(client *redis.Client, keyGen func() string, capacity, rate int64, expire time.Duration) *TokenBucket { + return &TokenBucket{ + expire: expire, + capacity: capacity, + rate: rate, + client: client, + script: redis.NewScript(lua), + keyGen: keyGen, + } +} + +func (s *TokenBucket) TakeTokens(name string, count int64) error { + key := s.keyGen() + now := time.Now().Local() + cmd := []string{ + key, //key + name, //name + fmt.Sprintf("%d", s.capacity), + fmt.Sprintf("%d", s.rate), + fmt.Sprintf("%d", count), + fmt.Sprintf("%d", now.UnixMilli()), + fmt.Sprintf("%d", now.Hour()), + } + ret, err := s.script.Run(s.client, cmd).String() + if err != nil { + return err + } + if ret != SUCCESS { + return errors.New("sorry, I can't work anymore~") + } + var same = false + if s.lock.TryRLock() { + same = key == s.curKey + s.lock.RUnlock() + } else { + return nil + } + if !same { + if s.lock.TryLock() { + if ok, err := s.client.Expire(key, s.expire).Result(); err == nil && ok { + s.curKey = key + } + s.lock.Unlock() + } + } + return nil +} + +func (s *TokenBucket) Traverse(callback func(key string, item *Bucket)) error { + return NewHash(s.client, s.keyGen()).Scan("", 1000, func(name, value string) { + bucket := Bucket{} + if err := json.Unmarshal([]byte(value), &bucket); err == nil { + callback(name, &bucket) + } + }) +} diff --git a/common/redis/limit.lua b/common/redis/limit.lua new file mode 100644 index 0000000..9178df1 --- /dev/null +++ b/common/redis/limit.lua @@ -0,0 +1,90 @@ +local CAPACITY = "ca" +local RATE = "ra" +local SIZE = "si" +local GENERATE_AT = "ge_at" +local CREATED_AT = "cr_at" +local UPDATED_AT = "up_at" +local PASSED_COUNT = "pa_co" +local REJECT_COUNT = "re_co" +local PASSED_HOURS = "pa_ho" +local REJECT_HOURS = "re_ho" +local SUCCESS = "success" +local FAILED = "failed" + +local sKey = tostring(KEYS[1] or "") +local sName = tostring(KEYS[2] or "") +local iCapacity = tonumber(KEYS[3] or 0) +local iRate = tonumber(KEYS[4] or 0) +local iCount = tonumber(KEYS[5] or 0) +local iNow = tonumber(KEYS[6] or 0) +local sHour = tostring(KEYS[7] or "") + +if sKey == "" or sName == "" or sHour == "" then + return FAILED .. " param error1" +end +if iCapacity <= 0 or iRate <= 0 or iCount <= 0 or iNow <= 0 then + return FAILED .. "param error2" +end +local bucket = {} +local data = redis.pcall("HGET", sKey, sName) +local init = false +if data == nil or data == false or data == "" then + init = true +else + bucket = cjson.decode(data) + if bucket == nil then + init = true + end +end +if init then + bucket[CAPACITY] = iCapacity + bucket[RATE] = iRate + bucket[SIZE] = iCapacity + bucket[GENERATE_AT] = iNow + bucket[CREATED_AT] = iNow + bucket[UPDATED_AT] = iNow + bucket[PASSED_COUNT] = 0 + bucket[REJECT_COUNT] = 0 + bucket[PASSED_HOURS] = {} + bucket[REJECT_HOURS] = {} +else + bucket[CAPACITY] = iCapacity + bucket[RATE] = iRate +end +local bk_size = tonumber(bucket[SIZE] or 0) +local bk_capacity = tonumber(bucket[CAPACITY] or 0) +if bk_size < bk_capacity then + local bk_last = tonumber(bucket[GENERATE_AT] or 0) + local dura = iNow - bk_last + local incr = math.floor(dura * iRate / 1000) + if incr >= 1 then + bk_size = math.min(bk_size + incr, bk_capacity) + bucket[SIZE] = bk_size + bucket[GENERATE_AT] = iNow + end +end +local message = FAILED +if iCount <= bk_size then + bucket[SIZE] = bk_size - iCount + bucket[PASSED_COUNT] = tonumber(bucket[PASSED_COUNT] or 0) + 1 + local hours = bucket[PASSED_HOURS] + if hours == nil then + hours = {} + end + hours[sHour] = tonumber(hours[sHour] or 0) + 1 + bucket[PASSED_HOURS] = hours + message = SUCCESS +else + bucket[REJECT_COUNT] = tonumber(bucket[REJECT_COUNT] or 0) + 1 + local hours = bucket[REJECT_HOURS] + if hours == nil then + hours = {} + end + hours[sHour] = tonumber(hours[sHour] or 0) + 1 + bucket[REJECT_HOURS] = hours + message = FAILED +end +bucket[UPDATED_AT] = iNow +data = cjson.encode(bucket) +redis.pcall("HSET", sKey, sName, data) +return message \ No newline at end of file diff --git a/common/redis/limit_test.go b/common/redis/limit_test.go new file mode 100644 index 0000000..dcd7b2c --- /dev/null +++ b/common/redis/limit_test.go @@ -0,0 +1,28 @@ +package redis + +import ( + "fmt" + "testing" + "time" +) + +func TestF2(t *testing.T) { + ts := time.Now().Local().Format("2006-02-01-15") + t.Log(ts) +} + +func TestScan(t *testing.T) { + mgr, err := NewManagerWithUrl("redis://127.0.0.1:6379/1", nil) + if err != nil { + t.Error(err) + } + set := NewHash(mgr.Client(), "set-test-key") + for i := 0; i < 1000; i++ { + set.Set(fmt.Sprintf("name:%d", i), fmt.Sprintf("value:%d", i)) + } + + err = set.Scan("", 20, func(name, value string) { + t.Logf("N: %s, V:%s\n", name, value) + }) + t.Log(err) +} diff --git a/common/redis/manager.go b/common/redis/manager.go new file mode 100644 index 0000000..f6479f0 --- /dev/null +++ b/common/redis/manager.go @@ -0,0 +1,34 @@ +package redis + +import ( + "github.com/go-redis/redis" + "log" +) + +func (m *Manager) Client() *redis.Client { + if m.client == nil { + m.initConnect() + } + return m.client +} + +func (m *Manager) Close() { + if m.client != nil { + m.client.Close() + m.client = nil + } +} + +func (m *Manager) initConnect() error { + return m.Connect(m.options) +} + +func (m *Manager) Connect(opts *Options) error { + c := redis.NewClient(opts) + if err := c.Ping().Err(); err != nil { + log.Panicf("[error] ping redis err %+v\n", err) + return err + } + m.client = c + return nil +} diff --git a/common/redis/redis.go b/common/redis/redis.go new file mode 100644 index 0000000..3c57266 --- /dev/null +++ b/common/redis/redis.go @@ -0,0 +1,93 @@ +package redis + +import ( + "errors" + "time" + + goredis "github.com/go-redis/redis" +) + +func (m *Manager) Get(key string) (*string, error) { + if key == "" { + return nil, errors.New("key is empty") + } + data, err := m.Client().Get(key).Result() + if err != nil { + if err == goredis.Nil { + return nil, nil + } + return nil, err + } else { + return &data, nil + } +} + +func (m *Manager) Set(key string, value interface{}, expire time.Duration) error { + if err := m.Client().Set(key, value, expire).Err(); err != nil { + return err + } + return nil +} + +func (m *Manager) Del(keys ...string) error { + if err := m.Client().Del(keys...).Err(); err != nil { + return err + } + return nil +} + +func (m *Manager) GetBytes(key string) ([]byte, error) { + cmd := m.Client().Get(key) + if err := cmd.Err(); err != nil { + return []byte{}, err + } + return cmd.Bytes() +} + +func (m *Manager) SAdd(key string, members ...interface{}) error { + if err := m.Client().SAdd(key, members...).Err(); err != nil { + return err + } + return nil +} + +func (m *Manager) Exists(keys ...string) (bool, error) { + cmd := m.Client().Exists(keys...) + if err := cmd.Err(); err != nil { + return false, err + } + return cmd.Val() > 0, nil +} + +func (m *Manager) Expire(key string, expire time.Duration) error { + if err := m.Client().Expire(key, expire).Err(); err != nil { + return err + } + return nil +} + +func (m *Manager) Keys(pattern string) ([]string, error) { + list := m.Client().Keys(pattern) + if err := list.Err(); err != nil { + return []string{}, err + } + return list.Val(), nil + +} + +func (m *Manager) Incr(pattern string) (int64, error) { + val, err := m.Client().Incr(pattern).Result() + if err != nil { + return 0, err + } + return val, nil +} + +//获取key的剩余生存时间 +func (m *Manager) TTL(pattern string) time.Duration { + durCmd := m.Client().TTL(pattern) + if durCmd != nil { + return durCmd.Val() + } + return 0 +} diff --git a/common/sms/fengniao/fengniao.go b/common/sms/fengniao/fengniao.go new file mode 100644 index 0000000..549fda0 --- /dev/null +++ b/common/sms/fengniao/fengniao.go @@ -0,0 +1,75 @@ +package fengniao + +import ( + "crypto/sha1" + "errors" + "fmt" + "net/http" + "stat/common/httputil" + "stat/common/log" + "stat/common/utils" +) + +type requestBody struct { + MercId string `json:"mercId"` + Secret string `json:"secret"` + TemplateId string `json:"templateId"` + SmsCode string `json:"smsCode"` + Mobile string `json:"mobile"` + SignType string `json:"signType"` // 固定sha1 + Sign string `json:"sign"` // 签名 +} + +type msg struct { + Status string `json:"status"` + TaskId string `json:"taskId"` +} + +type responseBody struct { + Code int `json:"code"` + Msg msg `json:"msg"` + Err string `json:"err"` +} + +type FengNiao struct { + Url string + MercId string + Secret string + Tmpl string +} + +// Send 发送, 目前蜂鸟貌似只支持数字 +func (f *FengNiao) Send(mobile string, code string) error { + data := fmt.Sprintf("mercId=%s&templateId=%s&smsCode=%s&mobile=%s&secret=%s", f.MercId, f.Tmpl, code, mobile, f.Secret) + sha := sha1.New() + _, err := sha.Write([]byte(data)) + if err != nil { + log.Error("fengniao send error", log.Any("mobile", mobile), log.Any("templateId", f.Tmpl), log.E(err)) + return err + } + + args, _ := utils.JSONStruct2Map(&requestBody{ + MercId: f.MercId, + Secret: f.Secret, + TemplateId: f.Tmpl, + SmsCode: code, + SignType: "sha1", + Mobile: mobile, + Sign: fmt.Sprintf("%x", sha.Sum(nil)), + }) + rp := responseBody{} + statusCode, err := httputil.Client().POSTJsonWithJResp(&rp, f.Url, nil, args) + if err != nil { + log.Error("fengniao POSTJsonWithResp err", log.E(err)) + return err + } + if statusCode != http.StatusOK { + log.Error("fengniao status code not 200") + return errors.New("fengniao statusCode not 200") + } + if rp.Code != 200 { + log.Error("fengniao code not 200", log.Any("errdesc", rp.Err)) + err = errors.New(rp.Err) + } + return err +} diff --git a/common/sms/sms.go b/common/sms/sms.go new file mode 100644 index 0000000..44e176d --- /dev/null +++ b/common/sms/sms.go @@ -0,0 +1,58 @@ +package sms + +import ( + "stat/common/sms/fengniao" + "stat/common/sms/yunpian" + "stat/common/ysphone" + "strings" +) + +type Provider = int + +const ( + tmplChinaId = "5ecfc70ab6a62a37c00baf74" //大陆模版 + interNationId = "5ecfbfc3b6a62a37c00ba945" //国际模版 + chinaTmpl = "【PFYH】您的验证码是:%s。请不要把验证码泄露给其他人。" + interTmpl = "[YueHui] Your verification code is: %s Please do not disclose the verification code to others." + tmplYunPian = "【泡芙官网】您的验证码是:%s。请不要把验证码泄漏给其他人。" +) + +const ( + FengNiao Provider = 1 //蜂鸟 + YunPian Provider = 2 //云片 +) + +func sendByFengNiao(mobile string, code string) error { + newMobile := ysphone.FormatPhoneNumber(mobile) + var tmplId string + if strings.HasPrefix(newMobile, "+86") { + tmplId = tmplChinaId + } else { + tmplId = interNationId + } + return (&fengniao.FengNiao{ + Url: "https://rise.sudukj.com/api/sms/sendSms", + MercId: "10103", + Secret: "a7934623f508122fab27373fdee0e410", + Tmpl: tmplId, + }).Send(newMobile, code) +} + +func sendByYunPian(mobile string, code string) error { + return (&yunpian.YunPian{ + Apikey: "a2c52f92f570d839e203ce0c41eb4bc5", + Tmpl: tmplYunPian, + }).Send(mobile, code) +} + +// Send 发送短信 +func Send(p Provider, mobile string, code string) error { + switch p { + case FengNiao: + return sendByFengNiao(mobile, code) + case YunPian: + return sendByYunPian(mobile, code) + default: + return sendByFengNiao(mobile, code) + } +} diff --git a/common/sms/sms_test.go b/common/sms/sms_test.go new file mode 100644 index 0000000..49c6575 --- /dev/null +++ b/common/sms/sms_test.go @@ -0,0 +1,11 @@ +package sms + +import ( + "testing" +) + +func TestSend(t *testing.T) { + // log.Init(log.Options{Level: "debug"}) + err := Send(FengNiao, "+85581359280", "221156") + t.Log(err) +} diff --git a/common/sms/yunpian/yunpian.go b/common/sms/yunpian/yunpian.go new file mode 100644 index 0000000..9d3b814 --- /dev/null +++ b/common/sms/yunpian/yunpian.go @@ -0,0 +1,34 @@ +package yunpian + +import ( + "errors" + "fmt" + "stat/common/log" + + ypclnt "github.com/yunpian/yunpian-go-sdk/sdk" +) + +//YunPian 云片短信 +type YunPian struct { + Apikey string + Tmpl string +} + +//Send 发送验证码 +func (yun *YunPian) Send(mobile string, code string) error { + text := fmt.Sprintf(yun.Tmpl, code) + clnt := ypclnt.New(yun.Apikey) + param := ypclnt.NewParam(2) + param[ypclnt.MOBILE] = mobile + param[ypclnt.TEXT] = text + resp := clnt.Sms().SingleSend(param) + if resp == nil { + log.Error("YunPian send error", log.Any("mobile", mobile), log.Any("code", code)) + return errors.New("SingleSend error") + } + if !resp.IsSucc() { + log.Error("YunPian send fail:", log.Any("resp", resp)) + return errors.New("SingleSend fail") + } + return nil +} diff --git a/common/statutils/define.go b/common/statutils/define.go new file mode 100644 index 0000000..4deb69b --- /dev/null +++ b/common/statutils/define.go @@ -0,0 +1,42 @@ +package statutils + +type DeviceName string + +const ( + DeviceNameAndroid DeviceName = "android" + DeviceNameIos DeviceName = "ios" + DeviceNamePc DeviceName = "pc" + DeviceNameLight DeviceName = "light" + DeviceNameH5 DeviceName = "h5" + DeviceNameH5Android DeviceName = "h5_android" + DeviceNameH5Ios DeviceName = "h5_ios" + DeviceNameH5Pc DeviceName = "h5_pc" +) + +func (d DeviceName) String() string { + return string(d) +} + +const ( + StatProjectRecharge = "recharge" + StatProjectRechargeOld = "recharge_old" + StatProjectRechargeNew = "recharge_new" + StatProjectRechargeGold = "recharge_gold" + StatProjectRechargeVip = "recharge_vip" + StatProjectOrder = "order" + StatProjectRegister = "register" + StatProjectVisit = "visit" + StatProjectGame = "game" +) + +var StatProjectNameDict = map[string]string{ + StatProjectRecharge: "充值统计", + StatProjectRechargeOld: "老用户充", + StatProjectRechargeNew: "新用户充", + StatProjectRechargeGold: "金币充值", + StatProjectRechargeVip: "会员充值", + StatProjectOrder: "订单统计", + StatProjectRegister: "注册用户", + StatProjectVisit: "访问统计", + StatProjectGame: "游戏统计", +} diff --git a/common/statutils/global.go b/common/statutils/global.go new file mode 100644 index 0000000..8dbd1aa --- /dev/null +++ b/common/statutils/global.go @@ -0,0 +1,110 @@ +package statutils + +import ( + "stat/common/utils" + "stat/models/syncrecord" + "sync" + "time" +) + +type SyncItem struct { + AppID int32 // 应用ID + JobName string // 任务名称 + JobDesc string // 任务描述 + today time.Time // 内部日期 + todayCount int64 // 今日拉取条数 + CurrentCount int64 // 当前拉取条数 + RequestBegin time.Time // 请求开始时间 + RequestEnd time.Time // 请求结束时间 + ProcessBegin time.Time // 处理开始时间 + ProcessEnd time.Time // 处理结束时间 + jobBegin time.Time // 任务开始时间 + jobEnd time.Time // 任务结束时间 + DataLatest time.Time // 拉到的数据的最后时间 + Error error // 失败错误 + load bool // 是否载入redis数据 +} + +func (s *SyncItem) IncCount(value int64) { + s.todayCount += value + s.CurrentCount += value +} + +func (s *SyncItem) TodayCount() int64 { + return s.todayCount +} + +func (s *SyncItem) JobBegin() time.Time { + return s.jobBegin +} + +func (s *SyncItem) SetJobBegin(start time.Time) { + today := utils.BeginningOfDay(start) + s.jobBegin = start + if !s.load { + s.load = true + s.today = today + GetTodayCount(s) + } + if !s.today.Equal(today) { + s.today = today + s.todayCount = 0 + s.CurrentCount = 0 + } +} + +func (s *SyncItem) JobEnd() time.Time { + return s.jobEnd +} + +func (s *SyncItem) SetJobEnd(end time.Time) { + s.jobEnd = end + SetTodayCount(s) +} + +type SyncMonitor struct { + mu sync.Mutex + dict map[int32]map[string]*SyncItem +} + +func (s *SyncMonitor) SetData(appId int32, job string, setFunc func(item *SyncItem)) { + s.mu.Lock() + defer s.mu.Unlock() + + jobs := s.dict[appId] + if jobs == nil { + jobs = map[string]*SyncItem{} + s.dict[appId] = jobs + } + item := jobs[job] + if item == nil { + item = &SyncItem{AppID: appId, JobName: job, JobDesc: syncrecord.SyncJobDescribe[job]} + jobs[job] = item + } + item.AppID = appId + item.JobName = job + + setFunc(item) + + // protect some item attr + item.AppID = appId + item.JobName = job + item.JobDesc = syncrecord.SyncJobDescribe[job] +} + +func (s *SyncMonitor) Traverse(fn func(item *SyncItem)) { + s.mu.Lock() + defer s.mu.Unlock() + + for _, jobs := range s.dict { + for _, item := range jobs { + fn(item) + } + } +} + +var ( + GlobalSyncMonitor = &SyncMonitor{ + dict: map[int32]map[string]*SyncItem{}, + } +) diff --git a/common/statutils/redis.go b/common/statutils/redis.go new file mode 100644 index 0000000..e289d4a --- /dev/null +++ b/common/statutils/redis.go @@ -0,0 +1,65 @@ +package statutils + +import ( + "errors" + "fmt" + "stat/common/redis" + "strconv" + "time" +) + +var hash *redis.Hash + +func getHash(key string) (*redis.Hash, error) { + if hash != nil { + if hash.Key() == key { + return hash, nil + } else { + client := redis.StatRds.Client() + if client != nil { + hash = redis.NewHash(client, key) + hash.Expire(48 * time.Hour) + return hash, nil + } + return nil, errors.New("can not get redis client") + } + } else { + client := redis.StatRds.Client() + if client != nil { + hash = redis.NewHash(client, key) + hash.Expire(48 * time.Hour) + return hash, nil + } + return nil, errors.New("can not get redis client") + } +} + +func SetTodayCount(item *SyncItem) error { + hashKey := fmt.Sprintf("sync-job-data-count-%s", item.JobBegin().Local().Format("2006-02-01")) + jobKey := fmt.Sprintf("app:%d-job:%s", item.AppID, item.JobName) + todayHash, err := getHash(hashKey) + if err != nil { + return err + } + _, err = todayHash.Set(jobKey, item.todayCount) + return err +} + +func GetTodayCount(item *SyncItem) error { + hashKey := fmt.Sprintf("sync-job-data-count-%s", item.JobBegin().Local().Format("2006-02-01")) + jobKey := fmt.Sprintf("app:%d-job:%s", item.AppID, item.JobName) + todayHash, err := getHash(hashKey) + if err != nil { + return err + } + countS, err := todayHash.Get(jobKey) + if err != nil { + return err + } + countI, err := strconv.ParseInt(countS, 10, 64) + if err != nil { + return err + } + item.todayCount += countI + return nil +} diff --git a/common/statutils/servermon.go b/common/statutils/servermon.go new file mode 100644 index 0000000..ed338ac --- /dev/null +++ b/common/statutils/servermon.go @@ -0,0 +1,243 @@ +package statutils + +import ( + "encoding/json" + "fmt" + "runtime" + "sort" + "stat/common/utils" + "sync" + "time" + "unsafe" +) + +var ServerMon = Monitor{} + +type ErrorRecord struct { + Error error `json:"error"` + Occur time.Time `json:"occur"` +} + +type JobItem struct { + Name string `json:"name"` + Call string `json:"call"` + Count int64 `json:"count"` + Start time.Time `json:"start"` + Stop time.Time `json:"stop"` + Avg time.Duration `json:"avg"` + Gap time.Duration `json:"gap"` + Error error `json:"error"` + SuccCount int64 `json:"succ_count"` + ErrorCount int64 `json:"error_count"` + Errors []*ErrorRecord `json:"errors"` +} + +func SpendTimeIcon(d time.Duration) string { + if d < 5*time.Second { + return "\U0001F7E2\U0001F7E2\U0001F7E2" + } else if d < 10*time.Second { + return "\U0001F7E2\U0001F7E2\U0001F7E0" + } else if d < 30*time.Second { + return "\U0001F7E2\U0001F7E0\U0001F7E0" + } else if d < 80*time.Second { + return "\U0001F7E0\U0001F7E0\U0001F7E0" + } else if d < 220*time.Second { + return "\U0001F7E0\U0001F7E0🔴" + } else if d < 600*time.Second { + return "\U0001F7E0🔴🔴" + } else if d < 1640*time.Second { + return "🔴🔴🔴" + } else { + return "🆘🆘🆘" + } +} + +func (s *JobItem) Status() string { + if s.Count > s.SuccCount+s.ErrorCount { + return "💛执行中" + } else { + if s.Error != nil { + return "💔执行出错" + } else { + return "💚执行成功" + } + } +} + +func (s *JobItem) Display() string { + text := fmt.Sprintf("【函数】%s\n", s.Name) + text += fmt.Sprintf("【调用】%s\n", s.Call) + text += fmt.Sprintf("【进入】%d次\n", s.Count) + text += fmt.Sprintf("【状态】%s\n", s.Status()) + text += fmt.Sprintf("【开始】%s\n", s.Start.Format("15:04:05")) + text += fmt.Sprintf("【结束】%s\n", s.Stop.Format("15:04:05")) + text += fmt.Sprintf("【用时】%s\n", s.Stop.Sub(s.Start)) + text += fmt.Sprintf("【速度】%s\n", SpendTimeIcon(s.Stop.Sub(s.Start))) + text += fmt.Sprintf("【平均】%s\n", s.Avg) + text += fmt.Sprintf("【间隔】%s\n", s.Gap) + text += fmt.Sprintf("【成功】%d次\n", s.SuccCount) + text += fmt.Sprintf("【出错】%d次\n", s.ErrorCount) + if len(s.Errors) > 0 { + text += fmt.Sprintf("【最前出错信息】🔻%s\n", s.Errors[0].Error.Error()) + } + if len(s.Errors) > 1 { + text += fmt.Sprintf("【最后出错信息】🔺%s\n", s.Errors[len(s.Errors)-1].Error.Error()) + } + return text +} + +func newJob(name string, call string) *JobItem { + now := time.Now() + return &JobItem{ + Name: name, + Call: call, + Count: 1, + Start: now, + Stop: now, + Errors: make([]*ErrorRecord, 0), + } +} + +func (s *JobItem) Begin() { + now := time.Now() + if s.Count > 0 { + s.Gap = now.Sub(s.Start) + } + s.Start = now + s.Count++ +} + +func (s *JobItem) End(err error) { + now := time.Now() + s.Error = err + s.Stop = now + if err != nil { + s.ErrorCount++ + s.Errors = append(s.Errors, &ErrorRecord{ + Error: err, + Occur: now, + }) + } else { + s.SuccCount++ + s.Avg = time.Duration(int64(s.Avg+(s.Stop.Sub(s.Start))) / s.SuccCount) + } +} + +type Monitor struct { + lock sync.Mutex + jobs map[string]*JobItem +} + +func (s *Monitor) call(callFunc func() error, funcName string, callName string) error { + func() { + s.lock.Lock() + defer s.lock.Unlock() + if s.jobs == nil { + s.jobs = make(map[string]*JobItem) + } + job, ok := s.jobs[funcName] + if !ok { + job = newJob(funcName, callName) + s.jobs[funcName] = job + } else { + job.Begin() + } + }() + err := callFunc() + func() { + s.lock.Lock() + defer s.lock.Unlock() + job := s.jobs[funcName] + if job != nil { + job.End(err) + } + }() + return err +} + +func (s *Monitor) Run(fn func() error) error { + defer utils.RecoverError(nil) + callName := GetCallName(2) + funcName := GetFuncName(fn) + call := func() (err error) { + defer utils.RecoverError(func(err1 error) { + err = err1 + }) + err = fn() + return err + } + return s.call(call, funcName, callName) +} + +func (s *Monitor) RunWithName(fn func() error, funcName string) error { + defer utils.RecoverError(nil) + callName := GetCallName(2) + call := func() (err error) { + defer utils.RecoverError(func(err1 error) { + err = err1 + }) + err = fn() + return err + } + return s.call(call, funcName, callName) +} + +func (s *Monitor) Run1(fn func(v time.Time) error, param time.Time) error { + defer utils.RecoverError(nil) + callName := GetCallName(2) + funcName := GetFuncName(fn) + call := func() (err error) { + defer utils.RecoverError(func(err1 error) { + err = err1 + }) + err = fn(param) + return err + } + return s.call(call, funcName, callName) +} + +func (s *Monitor) ToJson() string { + s.lock.Lock() + defer s.lock.Unlock() + data, _ := json.Marshal(s.jobs) + return string(data) +} + +func (s *Monitor) Display() string { + s.lock.Lock() + defer s.lock.Unlock() + list := make(JobItemList, 0) + for _, job := range s.jobs { + list = append(list, job) + } + sort.Sort(list) + + text := fmt.Sprintf("后台自动任务(%d个):\n", len(s.jobs)) + for _, job := range list { + text += job.Display() + text += "***** *****\n" + } + return text +} + +func GetCallName(skip int) string { + pc, _, _, _ := runtime.Caller(skip) + return runtime.FuncForPC(pc).Name() +} + +func GetFuncName(fn interface{}) string { + funcPC := func(fn interface{}) uintptr { + ptr := (*[2]uintptr)(unsafe.Pointer(&fn))[1] + return **((**uintptr)(unsafe.Pointer(&ptr))) + } + pc := funcPC(fn) + return runtime.FuncForPC(pc).Name() +} + +type JobItemList []*JobItem + +func (a JobItemList) Len() int { return len(a) } +func (a JobItemList) Less(i, j int) bool { + return a[i].Name < a[j].Name +} +func (a JobItemList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } diff --git a/common/statutils/servermon_test.go b/common/statutils/servermon_test.go new file mode 100644 index 0000000..7653d3e --- /dev/null +++ b/common/statutils/servermon_test.go @@ -0,0 +1,20 @@ +package statutils + +import ( + "testing" +) + +func AAA() error { + return nil +} + +func TTT(fn func() error) string { + return GetFuncName(fn) +} + +func TestGetFuncName(t *testing.T) { + + s := TTT(AAA) + t.Log("函数名:" + s) + +} diff --git a/common/statutils/stat.go b/common/statutils/stat.go new file mode 100644 index 0000000..e8e4a24 --- /dev/null +++ b/common/statutils/stat.go @@ -0,0 +1,728 @@ +package statutils + +import ( + "fmt" + "math" +) + +type Value struct { + Value int64 `json:"value" bson:"value"` // Value + Count int64 `json:"count" bson:"count"` // Count +} + +func (s *Value) CountRef() *int64 { + return &s.Count +} + +func (s *Value) ValueRef() *int64 { + return &s.Value +} + +func (s *Value) Add(value int64) { + s.Count++ + s.Value += value +} + +func (s *Value) Sub(d *Value) *Value { + ret := &Value{ + Count: s.Count - d.Count, + Value: s.Value - d.Value, + } + return ret +} + +func (s *Value) Plus(d *Value) *Value { + ret := &Value{ + Count: s.Count + d.Count, + Value: s.Value + d.Value, + } + return ret +} + +func (s *Value) ACC(d *Value) { + s.Count += d.Count + s.Value += d.Value +} + +func (s *Value) Percentage(den *Value) *Value { + ret := &Value{ + Count: percentageDiv(s.Count, den.Count), + Value: percentageDiv(s.Value, den.Value), + } + return ret +} + +func (s *Value) Permil(den *Value) *Value { + ret := &Value{ + Count: permilDiv(s.Count, den.Count), + Value: permilDiv(s.Value, den.Value), + } + return ret +} + +func (s *Value) Mul(v int64) *Value { + ret := &Value{ + Count: s.Count * v, + Value: s.Value * v, + } + return ret +} + +type Direct struct { + Total Value `json:"total" bson:"total"` // Total + Natural Value `json:"natural" bson:"natural"` // Natural +} + +func (s *Direct) CountRef() *int64 { + return &s.Total.Count +} + +func (s *Direct) Count() int64 { + return s.Total.Count +} + +func (s *Direct) ValueRef() *int64 { + return &s.Total.Value +} + +func (s *Direct) Value() int64 { + return s.Total.Value +} + +func (s *Direct) Add(value int64, device *ClientInfo) { + s.Total.Add(value) + if device.Natural { + s.Natural.Add(value) + } +} + +func (s *Direct) Sub(d *Direct) *Direct { + ret := &Direct{ + Total: *s.Total.Sub(&d.Total), + Natural: *s.Natural.Sub(&d.Natural), + } + return ret +} + +func (s *Direct) Plus(d *Direct) *Direct { + ret := &Direct{ + Total: *s.Total.Plus(&d.Total), + Natural: *s.Natural.Plus(&d.Natural), + } + return ret +} + +func (s *Direct) ACC(d *Direct) { + s.Total.ACC(&d.Total) + s.Natural.ACC(&d.Natural) +} + +func (s *Direct) Percentage(den *Direct) *Direct { + ret := &Direct{ + Total: *s.Total.Percentage(&den.Total), + Natural: *s.Total.Percentage(&den.Total), + } + return ret +} + +func (s *Direct) Permil(den *Direct) *Direct { + ret := &Direct{ + Total: *s.Total.Permil(&den.Total), + Natural: *s.Natural.Permil(&den.Natural), + } + return ret +} + +func (s *Direct) Mul(v int64) *Direct { + ret := &Direct{ + Total: *s.Total.Mul(v), + Natural: *s.Natural.Mul(v), + } + return ret +} + +type From struct { + Total Value `json:"total" bson:"total"` // Total + // ---------------------分类1------------------------ + Web Value `json:"web" bson:"web"` // 网站 + Share Value `json:"share" bson:"share"` // 分享 + Normal Value `json:"normal" bson:"normal"` // 自来 + District Value `json:"district" bson:"district"` // 渠道 + // ---------------------分类2------------------------ + Direct Direct `json:"direct" bson:"direct"` // 直推 + Fission Value `json:"fission" bson:"fission"` // 裂变 + Deduction Value `json:"deduction" bson:"deduction"` // 扣量 +} + +type StatH5 struct { + // 总计 + Total From `json:"total" bson:"total"` // Total = Pc + Ios + Android + // 分类1 + Pc From `json:"h5Pc" bson:"h5Pc"` // H5PC + Ios From `json:"h5Ios" bson:"h5Ios"` // H5IOS + Android From `json:"h5Android" bson:"h5Android"` // Android + // 分类2 + Guest From `json:"h5Guest" bson:"h5Guest"` // Guest + Formal From `json:"h5Formal" bson:"h5Formal"` // H5正式用户 +} + +func (s *StatH5) Sub(d *StatH5) *StatH5 { + ret := &StatH5{ + Total: *s.Total.Sub(&d.Total), + Pc: *s.Pc.Sub(&d.Pc), + Ios: *s.Ios.Sub(&d.Ios), + Android: *s.Android.Sub(&d.Android), + Guest: *s.Guest.Sub(&d.Guest), + Formal: *s.Formal.Sub(&d.Formal), + } + return ret +} + +func (s *StatH5) Plus(d *StatH5) *StatH5 { + ret := &StatH5{ + Total: *s.Total.Plus(&d.Total), + Pc: *s.Pc.Plus(&d.Pc), + Ios: *s.Ios.Plus(&d.Ios), + Android: *s.Android.Plus(&d.Android), + Guest: *s.Guest.Plus(&d.Guest), + Formal: *s.Formal.Plus(&d.Formal), + } + return ret +} + +func (s *StatH5) ACC(d *StatH5) { + s.Total.ACC(&d.Total) + s.Pc.ACC(&d.Pc) + s.Ios.ACC(&d.Ios) + s.Android.ACC(&d.Android) + s.Guest.ACC(&d.Guest) + s.Formal.ACC(&d.Formal) +} + +func (s *StatH5) Mul(v int64) *StatH5 { + ret := &StatH5{ + Total: *s.Total.Mul(v), + Pc: *s.Pc.Mul(v), + Ios: *s.Ios.Mul(v), + Android: *s.Android.Mul(v), + Guest: *s.Guest.Mul(v), + Formal: *s.Formal.Mul(v), + } + return ret +} + +func (s *StatH5) Add(value int64, device *ClientInfo) { + s.Total.Add(value, device) + if device.H5Android { + s.Android.Add(value, device) + } else if device.H5Ios { + s.Ios.Add(value, device) + } else if device.H5Pc { + s.Pc.Add(value, device) + } + if device.Formal { + s.Formal.Add(value, device) + } else { + s.Guest.Add(value, device) + } +} + +func (s *StatH5) CountRef() *int64 { + return s.Total.CountRef() +} + +func (s *StatH5) Count() int64 { + return s.Total.Count() +} + +func (s *StatH5) ValueRef() *int64 { + return s.Total.ValueRef() +} + +func (s *StatH5) Value() int64 { + return s.Total.Value() +} + +func (s *StatH5) Percentage(den *StatH5) *StatH5 { + ret := &StatH5{ + Total: *s.Total.Percentage(&den.Total), + Pc: *s.Pc.Percentage(&den.Pc), + Ios: *s.Ios.Percentage(&den.Ios), + Android: *s.Android.Percentage(&den.Android), + Guest: *s.Guest.Percentage(&den.Guest), + Formal: *s.Formal.Percentage(&den.Formal), + } + return ret +} + +func (s *StatH5) Permil(den *StatH5) *StatH5 { + ret := &StatH5{ + Total: *s.Total.Permil(&den.Total), + Pc: *s.Pc.Permil(&den.Pc), + Ios: *s.Ios.Permil(&den.Ios), + Android: *s.Android.Permil(&den.Android), + Guest: *s.Guest.Permil(&den.Guest), + Formal: *s.Formal.Permil(&den.Formal), + } + return ret +} + +func (s *StatH5) Rows(div int64, compare *StatH5) [][]string { + if div == 0 { + div = 1 + } + ret := make([][]string, 0) + if compare != nil { + ret = append(ret, s.Total.Row("H5总计", div, &compare.Total)) + ret = append(ret, s.Android.Row("H5安卓", div, &compare.Android)) + ret = append(ret, s.Ios.Row("H5苹果", div, &compare.Ios)) + ret = append(ret, s.Pc.Row("H5电脑", div, &compare.Pc)) + ret = append(ret, s.Guest.Row("H5游客", div, &compare.Guest)) + ret = append(ret, s.Formal.Row("H5注册", div, &compare.Formal)) + } else { + ret = append(ret, s.Total.Row("H5总计", div, nil)) + ret = append(ret, s.Android.Row("H5安卓", div, nil)) + ret = append(ret, s.Ios.Row("H5苹果", div, nil)) + ret = append(ret, s.Pc.Row("H5电脑", div, nil)) + ret = append(ret, s.Guest.Row("H5游客", div, nil)) + ret = append(ret, s.Formal.Row("H5注册", div, nil)) + } + return ret +} + +type Stat struct { + Total From `json:"total" bson:"total"` // Total + Android From `json:"android" bson:"android"` // Android + Ios From `json:"ios" bson:"ios"` // IOS + Light StatLight `json:"light" bson:"light"` // Light + H5 StatH5 `json:"h5" bson:"h5"` // H5 +} + +func (s *Stat) Mul(v int64) *Stat { + ret := &Stat{ + Total: *s.Total.Mul(v), + Android: *s.Android.Mul(v), + Ios: *s.Ios.Mul(v), + Light: *s.Light.Mul(v), + H5: *s.H5.Mul(v), + } + return ret +} + +func (s *Stat) Percentage(den *Stat) *Stat { + ret := &Stat{ + Total: *s.Total.Percentage(&den.Total), + Android: *s.Android.Percentage(&den.Android), + Ios: *s.Ios.Percentage(&den.Ios), + Light: *s.Light.Percentage(&den.Light), + H5: *s.H5.Percentage(&den.H5), + } + return ret +} + +func (s *Stat) Permil(den *Stat) *Stat { + ret := &Stat{ + Total: *s.Total.Permil(&den.Total), + Android: *s.Android.Permil(&den.Android), + Ios: *s.Ios.Permil(&den.Ios), + Light: *s.Light.Permil(&den.Light), + H5: *s.H5.Permil(&den.H5), + } + return ret +} + +func (s *Stat) Sub(d *Stat) *Stat { + ret := &Stat{ + Total: *s.Total.Sub(&d.Total), + Android: *s.Android.Sub(&d.Android), + Ios: *s.Ios.Sub(&d.Ios), + Light: *s.Light.Sub(&d.Light), + H5: *s.H5.Sub(&d.H5), + } + return ret +} + +func (s *Stat) Plus(d *Stat) *Stat { + ret := &Stat{ + Total: *s.Total.Plus(&d.Total), + Android: *s.Android.Plus(&d.Android), + Ios: *s.Ios.Plus(&d.Ios), + Light: *s.Light.Plus(&d.Light), + H5: *s.H5.Plus(&d.H5), + } + return ret +} + +func (s *Stat) ACC(d *Stat) { + s.Total.ACC(&d.Total) + s.Android.ACC(&d.Android) + s.Ios.ACC(&d.Ios) + s.Light.ACC(&d.Light) + s.H5.ACC(&d.H5) +} + +func (s *Stat) Add(value int64, device *ClientInfo) { + s.Total.Add(value, device) + if device.Android { + s.Android.Add(value, device) + } else if device.Ios { + s.Ios.Add(value, device) + } else if device.Light { + s.Light.Add(value, device) + } else if device.H5 { + s.H5.Add(value, device) + } +} + +func (s *Stat) CountRef() *int64 { + return s.Total.CountRef() +} + +func (s *Stat) Count() int64 { + return s.Total.Count() +} + +func (s *Stat) ValueRef() *int64 { + return s.Total.ValueRef() +} + +func (s *Stat) Value() int64 { + return s.Total.Value() +} + +func (s *Stat) Rows(div int64, compare *Stat) [][]string { + if div == 0 { + div = 1 + } + ret := make([][]string, 0) + if compare != nil { + ret = append(ret, s.Android.Row("安卓", div, &compare.Android)) + ret = append(ret, s.Ios.Row("苹果", div, &compare.Ios)) + ret = append(ret, s.Light.Rows(div, &compare.Light)...) + ret = append(ret, s.H5.Rows(div, &compare.H5)...) + ret = append(ret, s.Total.Row("合计", div, &compare.Total)) + } else { + ret = append(ret, s.Android.Row("安卓", div, nil)) + ret = append(ret, s.Ios.Row("苹果", div, nil)) + ret = append(ret, s.Light.Rows(div, nil)...) + ret = append(ret, s.H5.Rows(div, nil)...) + ret = append(ret, s.Total.Row("合计", div, nil)) + } + return ret +} + +func (s *From) Sub(d *From) *From { + ret := &From{ + Total: *s.Total.Sub(&d.Total), + Web: *s.Web.Sub(&d.Web), + Normal: *s.Normal.Sub(&d.Normal), + District: *s.District.Sub(&d.District), + Share: *s.Share.Sub(&d.Share), + Direct: *s.Direct.Sub(&d.Direct), + Fission: *s.Fission.Sub(&d.Fission), + Deduction: *s.Deduction.Sub(&d.Deduction), + } + return ret +} + +func (s *From) Plus(d *From) *From { + ret := &From{ + Total: *s.Total.Plus(&d.Total), + Web: *s.Web.Plus(&d.Web), + Normal: *s.Normal.Plus(&d.Normal), + District: *s.District.Plus(&d.District), + Share: *s.Share.Plus(&d.Share), + Direct: *s.Direct.Plus(&d.Direct), + Fission: *s.Fission.Plus(&d.Fission), + Deduction: *s.Deduction.Plus(&d.Deduction), + } + return ret +} + +func (s *From) ACC(d *From) { + s.Total.ACC(&d.Total) + s.Web.ACC(&d.Web) + s.Normal.ACC(&d.Normal) + s.District.ACC(&d.District) + s.Share.ACC(&d.Share) + s.Direct.ACC(&d.Direct) + s.Fission.ACC(&d.Fission) + s.Deduction.ACC(&d.Deduction) +} + +func (s *From) Mul(v int64) *From { + ret := &From{ + Total: *s.Total.Mul(v), + Web: *s.Web.Mul(v), + Normal: *s.Normal.Mul(v), + District: *s.District.Mul(v), + Share: *s.Share.Mul(v), + Direct: *s.Direct.Mul(v), + Fission: *s.Fission.Mul(v), + Deduction: *s.Deduction.Mul(v), + } + return ret +} + +func (s *From) Percentage(den *From) *From { + ret := &From{ + Total: *s.Total.Percentage(&den.Total), + Web: *s.Web.Percentage(&den.Web), + Normal: *s.Normal.Percentage(&den.Normal), + District: *s.District.Percentage(&den.District), + Share: *s.Share.Percentage(&den.Share), + Direct: *s.Direct.Percentage(&den.Direct), + Fission: *s.Fission.Percentage(&den.Fission), + Deduction: *s.Deduction.Percentage(&den.Deduction), + } + return ret +} + +func (s *From) Permil(den *From) *From { + ret := &From{ + Total: *s.Total.Permil(&den.Total), + Web: *s.Web.Permil(&den.Web), + Normal: *s.Normal.Permil(&den.Normal), + District: *s.District.Permil(&den.District), + Share: *s.Share.Permil(&den.Share), + Direct: *s.Direct.Permil(&den.Direct), + Fission: *s.Fission.Permil(&den.Fission), + Deduction: *s.Deduction.Permil(&den.Deduction), + } + return ret +} + +func (s *From) Row(title string, div int64, compare *From) []string { + if div == 0 { + div = 1 + } + if compare == nil { + return []string{ + title, + fmt.Sprintf("%d", s.Total.Value/div), + fmt.Sprintf("%d", s.Web.Value/div), + fmt.Sprintf("%d", s.Normal.Value/div), + fmt.Sprintf("%d", s.District.Value/div), + fmt.Sprintf("%d", s.Share.Value/div), + fmt.Sprintf("%d", s.Direct.Total.Value/div), + fmt.Sprintf("%d", s.Fission.Value/div), + fmt.Sprintf("%d", s.Deduction.Value/div), + } + } else { + diff := s.Sub(compare) + rate := diff.Permil(compare) + return []string{ + title, + fmt.Sprintf("%d\n%s", s.Total.Value/div, DisplayPermilToPercentage(rate.Total.Value)), + fmt.Sprintf("%d\n%s", s.Web.Value/div, DisplayPermilToPercentage(rate.Web.Value)), + fmt.Sprintf("%d\n%s", s.Normal.Value/div, DisplayPermilToPercentage(rate.Normal.Value)), + fmt.Sprintf("%d\n%s", s.District.Value/div, DisplayPermilToPercentage(rate.District.Value)), + fmt.Sprintf("%d\n%s", s.Share.Value/div, DisplayPermilToPercentage(rate.Share.Value)), + fmt.Sprintf("%d\n%s", s.Direct.Total.Value/div, DisplayPermilToPercentage(rate.Direct.Total.Value)), + fmt.Sprintf("%d\n%s", s.Fission.Value/div, DisplayPermilToPercentage(rate.Fission.Value)), + fmt.Sprintf("%d\n%s", s.Deduction.Value/div, DisplayPermilToPercentage(rate.Deduction.Value)), + } + } +} + +func (s *From) Header(title string) []string { + return []string{title, "总量", "官网", "自来", "渠道", "分享", "直推", "裂变", "扣量"} +} + +func (s *From) Add(value int64, client *ClientInfo) { + s.Total.Add(value) + // 分类1统计 + if client.Web { + s.Web.Add(value) + } else if client.Share { + s.Share.Add(value) + } else if client.Normal { + s.Normal.Add(value) + } else if client.District { + s.District.Add(value) + } + // 分类2统计 + if client.Deduction { + s.Deduction.Add(value) + } else { + if client.Direct { + s.Direct.Add(value, client) + } else { + s.Fission.Add(value) + } + } +} + +func (s *From) CountRef() *int64 { + return s.Total.CountRef() +} + +func (s *From) Count() int64 { + return s.Total.Count +} + +func (s *From) ValueRef() *int64 { + return s.Total.ValueRef() +} + +func (s *From) Value() int64 { + return s.Total.Value +} + +func percentageDiv(num, den int64) int64 { + if num == 0 { + return 0 + } else { + if den == 0 { + return math.MaxInt64 + } else { + return num * 100 / den + } + } +} + +func permilDiv(num, den int64) int64 { + if num == 0 { + return 0 + } else { + if den == 0 { + return math.MaxInt64 + } else { + return num * 1000 / den + } + } +} + +func DisplayPermilToPercentage(v int64) string { + var ret string + var x float64 + if v == math.MaxInt64 { + s := "##.##" + ret = fmt.Sprintf("%s", s) + return ret + } + if v < -99999 { + s := "--.--" + ret = fmt.Sprintf("%s", s) + return ret + } + if v > 99999 { + s := "++.++" + ret = fmt.Sprintf("%s", s) + return ret + } + if v < 0 { + x = float64(v) / -10.0 + s := fmt.Sprintf("-%.1f%%", x) + ret = fmt.Sprintf("%s", s) + } else if v > 0 { + x = float64(v) / 10.0 + s := fmt.Sprintf("+%.1f%%", x) + ret = fmt.Sprintf("%s", s) + } else { + s := "00.0%" + ret = fmt.Sprintf("%s", s) + } + return ret +} + +type StatLight struct { + // 总计 + Total From `json:"total" bson:"total"` // Total = Pc + Ios + Android + // 分类 + Guest From `json:"guest" bson:"guest"` // Guest + Formal From `json:"formal" bson:"formal"` // 正式用户 +} + +func (s *StatLight) Sub(d *StatLight) *StatLight { + ret := &StatLight{ + Total: *s.Total.Sub(&d.Total), + Guest: *s.Guest.Sub(&d.Guest), + Formal: *s.Formal.Sub(&d.Formal), + } + return ret +} + +func (s *StatLight) Plus(d *StatLight) *StatLight { + ret := &StatLight{ + Total: *s.Total.Plus(&d.Total), + Guest: *s.Guest.Plus(&d.Guest), + Formal: *s.Formal.Plus(&d.Formal), + } + return ret +} + +func (s *StatLight) ACC(d *StatLight) { + s.Total.ACC(&d.Total) + s.Guest.ACC(&d.Guest) + s.Formal.ACC(&d.Formal) +} + +func (s *StatLight) Mul(v int64) *StatLight { + ret := &StatLight{ + Total: *s.Total.Mul(v), + Guest: *s.Guest.Mul(v), + Formal: *s.Formal.Mul(v), + } + return ret +} + +func (s *StatLight) Add(value int64, device *ClientInfo) { + s.Total.Add(value, device) + if device.Formal { + s.Formal.Add(value, device) + } else { + s.Guest.Add(value, device) + } +} + +func (s *StatLight) CountRef() *int64 { + return s.Total.CountRef() +} + +func (s *StatLight) Count() int64 { + return s.Total.Count() +} + +func (s *StatLight) ValueRef() *int64 { + return s.Total.ValueRef() +} + +func (s *StatLight) Value() int64 { + return s.Total.Value() +} + +func (s *StatLight) Percentage(den *StatLight) *StatLight { + ret := &StatLight{ + Total: *s.Total.Percentage(&den.Total), + Guest: *s.Guest.Percentage(&den.Guest), + Formal: *s.Formal.Percentage(&den.Formal), + } + return ret +} + +func (s *StatLight) Permil(den *StatLight) *StatLight { + ret := &StatLight{ + Total: *s.Total.Permil(&den.Total), + Guest: *s.Guest.Permil(&den.Guest), + Formal: *s.Formal.Permil(&den.Formal), + } + return ret +} + +func (s *StatLight) Rows(div int64, compare *StatLight) [][]string { + if div == 0 { + div = 1 + } + ret := make([][]string, 0) + if compare != nil { + ret = append(ret, s.Total.Row("轻量合计", div, &compare.Total)) + ret = append(ret, s.Guest.Row("轻量安装", div, &compare.Guest)) + ret = append(ret, s.Formal.Row("轻量注册", div, &compare.Formal)) + } else { + ret = append(ret, s.Total.Row("轻量合计", div, nil)) + ret = append(ret, s.Guest.Row("轻量安装", div, nil)) + ret = append(ret, s.Formal.Row("轻量注册", div, nil)) + } + return ret +} diff --git a/common/statutils/table.go b/common/statutils/table.go new file mode 100644 index 0000000..d846f1c --- /dev/null +++ b/common/statutils/table.go @@ -0,0 +1,162 @@ +package statutils + +import ( + _ "embed" + "os" + "strings" + + "golang.org/x/exp/slices" + + "github.com/vicanso/go-charts/v2" + "github.com/wcharczuk/go-chart/v2/drawing" + + "github.com/golang/freetype" + + "github.com/golang/freetype/truetype" +) + +//go:embed 微软雅黑.ttf +var FontData []byte +var Font *truetype.Font + +func init() { + f, err := freetype.ParseFont(FontData) + if err == nil { + Font = f + } +} + +func (s *Stat) Table(title string, div int64, compare *Stat, filePath string) error { + if div == 0 { + div = 1 + } + rows := make([][]string, 0) + if compare != nil { + rows = append(rows, s.Android.Row("安卓", div, &compare.Android)) + rows = append(rows, s.Ios.Row("苹果", div, &compare.Ios)) + rows = append(rows, s.Light.Rows(div, &compare.Light)...) + rows = append(rows, s.H5.Rows(div, &compare.H5)...) + rows = append(rows, s.Total.Row("合计", div, &compare.Total)) + } else { + rows = append(rows, s.Android.Row("安卓", div, nil)) + rows = append(rows, s.Ios.Row("苹果", div, nil)) + rows = append(rows, s.Light.Rows(div, nil)...) + rows = append(rows, s.H5.Rows(div, nil)...) + rows = append(rows, s.Total.Row("合计", div, nil)) + } + + charts.SetDefaultWidth(810) + bgColor := drawing.ColorWhite + p, err := charts.TableOptionRender(charts.TableChartOption{ + Header: s.Total.Header(title), + BackgroundColor: bgColor, + HeaderBackgroundColor: drawing.ColorFromHex("808080"), + RowBackgroundColors: []charts.Color{ + bgColor, + }, + HeaderFontColor: drawing.ColorBlack, + FontColor: drawing.ColorBlack, + Padding: charts.Box{ + Top: 15, + Right: 10, + Bottom: 15, + Left: 10, + }, + Data: rows, + Font: Font, + TextAligns: []string{ + charts.AlignCenter, + charts.AlignLeft, + }, + CellStyle: func(tc charts.TableCell) *charts.Style { + text := strings.TrimSpace(tc.Text) + style := &charts.Style{ + Padding: charts.Box{ + Bottom: 5, + }, + } + if strings.Contains(text, "-") { + style.FontColor = drawing.ColorRed + } else if strings.Contains(text, "+") { + style.FontColor = drawing.ColorGreen + } + + if slices.Contains([]int{1, 2, 3}, tc.Row) { + style.FillColor = drawing.ColorFromHex("ec8f75") + } else if slices.Contains([]int{4, 5, 6}, tc.Row) { + style.FillColor = drawing.ColorFromHex("788fc7") + } else if slices.Contains([]int{7, 8}, tc.Row) { + style.FillColor = drawing.ColorFromHex("ced6d2") + } else if slices.Contains([]int{9}, tc.Row) { + style.FillColor = drawing.ColorFromHex("808080") + } + return style + }, + }) + if err != nil { + return err + } + + buf, err := p.Bytes() + if err != nil { + return err + } + return WriteBytesToFile(buf, filePath) +} + +func WriteBytesToFile(buf []byte, filename string) error { + err := os.WriteFile(filename, buf, 0600) + if err != nil { + return err + } + return nil +} + +func CommonTable(headers []string, rows [][]string, tableWidth int, filePath string) error { + charts.SetDefaultWidth(tableWidth) + bgColor := drawing.ColorWhite + p, err := charts.TableOptionRender(charts.TableChartOption{ + Header: headers, + BackgroundColor: bgColor, + HeaderBackgroundColor: drawing.ColorFromHex("808080"), + RowBackgroundColors: []charts.Color{ + bgColor, + }, + HeaderFontColor: drawing.ColorBlack, + FontColor: drawing.ColorBlack, + Padding: charts.Box{ + Top: 15, + Right: 10, + Bottom: 15, + Left: 10, + }, + Data: rows, + Font: Font, + TextAligns: []string{ + charts.AlignCenter, + charts.AlignLeft, + }, + CellStyle: func(tc charts.TableCell) *charts.Style { + style := &charts.Style{ + Padding: charts.Box{ + Bottom: 5, + }, + } + if tc.Row%2 == 0 { + style.FillColor = drawing.ColorFromHex("f8f8f8") + } else { + style.FillColor = drawing.ColorWhite + } + return style + }, + }) + if err != nil { + return err + } + + buf, err := p.Bytes() + if err != nil { + return err + } + return WriteBytesToFile(buf, filePath) +} diff --git a/common/statutils/utils.go b/common/statutils/utils.go new file mode 100644 index 0000000..188d049 --- /dev/null +++ b/common/statutils/utils.go @@ -0,0 +1,145 @@ +package statutils + +import ( + "stat/common/utils" + "stat/models/channelmod" + "strings" +) + +type DeviceCategory struct { + Android bool + Ios bool + Light bool + H5 bool + H5Android bool + H5Ios bool + H5Pc bool +} + +type SourceCategory struct { + Web bool // 是否官网 + Normal bool // 是否自来 + District bool // 是否渠道 + Share bool // 是否分享 +} + +type OtherCategory struct { + Direct bool // 是否直推 + Deduction bool // 是否扣量 + Natural bool // 是否自然 + Formal bool // H5正式用户 +} + +type ClientInfo struct { + //------设备------ + DeviceCategory + //------来源------ + SourceCategory + //------其他------ + OtherCategory +} + +func IsClientH5OrLight(devs ...string) bool { + for _, name := range devs { + dev := strings.ToLower(strings.TrimSpace(name)) + if dev == string(DeviceNameLight) || dev == string(DeviceNameH5) || dev == string(DeviceNameH5Android) || dev == string(DeviceNameH5Ios) || dev == string(DeviceNameH5Pc) { + return true + } + } + return false +} + +func IsClientH5(devs ...string) bool { + for _, name := range devs { + dev := strings.ToLower(strings.TrimSpace(name)) + if dev == string(DeviceNameH5) || dev == string(DeviceNameH5Android) || dev == string(DeviceNameH5Ios) || dev == string(DeviceNameH5Pc) { + return true + } + } + return false +} + +func IsClientPkg(devs ...string) bool { + for _, name := range devs { + dev := strings.ToLower(strings.TrimSpace(name)) + if dev == string(DeviceNameIos) || dev == string(DeviceNameAndroid) { + return true + } + } + return false +} + +func IsClientLight(devs ...string) bool { + for _, name := range devs { + dev := strings.ToLower(strings.TrimSpace(name)) + if dev == string(DeviceNameLight) { + return true + } + } + return false +} + +func IsClientAndroid(devs ...string) bool { + for _, name := range devs { + dev := strings.ToLower(strings.TrimSpace(name)) + if dev == string(DeviceNameAndroid) { + return true + } + } + return false +} + +func IsClientIos(devs ...string) bool { + for _, name := range devs { + dev := strings.ToLower(strings.TrimSpace(name)) + if dev == string(DeviceNameIos) { + return true + } + } + return false +} + +func GetDeviceInfo(dev1, dev2 string) DeviceCategory { + ret := DeviceCategory{} + ret.Android = utils.TowIsOR(dev1, dev2, string(DeviceNameAndroid)) + if !ret.Android { + ret.Ios = utils.TowIsOR(dev1, dev2, string(DeviceNameIos)) + if !ret.Ios { + ret.Light = utils.TowIsOR(dev1, dev2, string(DeviceNameLight)) + if !ret.Light { + ret.H5 = true + ret.H5Android = utils.TowIsOR(dev1, dev2, string(DeviceNameH5Android)) + if !ret.H5Android { + ret.H5Ios = utils.TowIsOR(dev1, dev2, string(DeviceNameH5Ios)) + if !ret.H5Ios { + ret.H5Pc = true + } + } + } + } + } + return ret +} + +func GetClientInfo(dev1, dev2 string, districtCode string, isDirect bool, isDeduction bool, isFormal bool) *ClientInfo { + ret := &ClientInfo{ + DeviceCategory: GetDeviceInfo(dev1, dev2), + } + isOfficial := channelmod.IsOfficialChannelOrEmpty(districtCode) + if districtCode == "modelweb" { + ret.Web = true + } else if districtCode == "h5share" { + ret.Share = true + } else if isOfficial || !isDirect { + ret.Normal = true + } else { + ret.District = true + } + ret.Direct = isDirect + if isDirect && isOfficial { + ret.Natural = true + } + ret.Deduction = isDeduction + ret.Formal = isFormal + return ret +} diff --git a/common/statutils/utils_test.go b/common/statutils/utils_test.go new file mode 100644 index 0000000..6c6217b --- /dev/null +++ b/common/statutils/utils_test.go @@ -0,0 +1,81 @@ +package statutils + +import "testing" + +func TestIsDeviceH5(t *testing.T) { + type args struct { + devs []string + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "a", + args: args{ + devs: []string{"andro", "android", "h5_android"}, + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := IsClientH5(tt.args.devs...); got != tt.want { + t.Errorf("IsClientH5() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestIsDeviceAndroid(t *testing.T) { + type args struct { + devs []string + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "a", + args: args{ + devs: []string{"andro", "android", "h5_android1"}, + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := IsClientAndroid(tt.args.devs...); got != tt.want { + t.Errorf("IsClientH5() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestIsDeviceIos(t *testing.T) { + type args struct { + devs []string + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "a", + args: args{ + devs: []string{"ios", "android", "h5_android1"}, + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := IsClientIos(tt.args.devs...); got != tt.want { + t.Errorf("IsClientH5() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/common/statutils/微软雅黑.ttf b/common/statutils/微软雅黑.ttf new file mode 100644 index 0000000..238a941 Binary files /dev/null and b/common/statutils/微软雅黑.ttf differ diff --git a/common/stdLog/code.go b/common/stdLog/code.go new file mode 100644 index 0000000..6eab3c1 --- /dev/null +++ b/common/stdLog/code.go @@ -0,0 +1,86 @@ +package stdLog + +import "fmt" + +type CodeType int + +type CodeMsg struct { + Code int `json:"code"` + Msg string `json:"msg"` + Tip string `json:"tip,omitempty"` +} + +// 错误级别 +const ( + ParamLevel = 10000 // 参数级 + StoreLevel = 20000 // 存储级 + ServerLevel = 30000 // 服务级 + BusinessLevel = 40000 // 业务逻辑级 +) + +// 通用code +const ( + Success CodeType = 200 //Success 通用成功 + Failure CodeType = 400 //Failure 通用失败 +) + +const ( + ParamError CodeType = ParamLevel + iota // 10000 参数错误 + NoToken // 10001 没有token + ParamDeductionRatioError // 10002 无效的扣量值 + InvalidPhoneNumber // 10003 无效的手机号 + QueryError // 10004 查询失败 +) + +const ( + AdminAccountNotExists CodeType = ServerLevel + iota // 30000 管理员账号不存在 + AdminPasswordError // 30001 管理员密码错误 + AdminGetAuthorityFailed // 30002 获取权限失败 + ChannelNotExists // 30003 渠道不存在 + AgentAccountNotExists // 30004 代理商账号不存在 + AgentPasswordError // 30005 代理商密码错误 + AuthorityRoleExists // 30006 该权限角色已存在 + AgentHasLocked // 30007 禁止登陆 + VerifySmsCodeFailed // 30008 验证码错误 + DisableWithdraw // 30009 禁止提现 + WithdrawBalanceLess // 30010 提现金额不足 + WithdrawFailed // 30011 提现失败 + WithdrawHasDone // 30012 提现已经处理 + WithdrawRequestFailed // 30013 提现第三方请求失败 + WithdrawMobileError // 30014 手机号不一致 + NotSupportWithdraw // 30015 不支持提现 + AccountExists // 30016 账号已存在 + AgentAccountBanned // 30017 账号已禁用 + GoogleAuthFailed // 30018 谷歌验证失败 + AdvertiseLocExists // 30019 广告位置已存在 + AdvertiseInvalid // 30020 无效的广告 + AppInfoError // 30021 应用信息错误 + InvalidPrice // 30022 无效的金额 + ChannelExists // 30023 渠道已存在 + ActivityNoExistErr // 30024 活动不存在 + LotteryNumReachedTheLimit // 30025 今日抽奖次数达到限制 + LotteryCodeIsInvalid // 30026 兑换码无效 + LotteryCodeIsUsed // 30026 兑换码已使用 + SettlementDouble // 30028 重复结算 + DownloadM3u8File // 30029 文件服务器访问失败 + DownloadFileError // 30030 文件服务器访问失败 + ErrApplicationNotExist // 应用不存在 + RedisSet // 设置redis错误 + AppDbError // app数据库错误 + AppCategoryDbError // appcategory数据库错误 + AppExistErr // app不能重复 + ApplicationLocExists // 30036 广告位置已存在 +) + +const ( + QueryDataError CodeType = BusinessLevel + iota // 数据查询失败 + InsertDataError // 添加数据失败 + UpdateDataError // 更新数据失败 + DelDataError // 删除数据失败 + DataNotExist // 数据不存在 + DataEmpty +) + +func (c CodeType) Error() string { + return fmt.Sprintf("code=%d,msg=%v,tip=%v", c, c.Msg(), c.Tip()) +} diff --git a/common/stdLog/error.go b/common/stdLog/error.go new file mode 100644 index 0000000..9cca914 --- /dev/null +++ b/common/stdLog/error.go @@ -0,0 +1,44 @@ +package stdLog + +import ( + "fmt" +) + +// SrvErr 错误定义 +type SrvErr struct { + Code CodeType `json:"code"` + Msg string `json:"msg"` + Cause string `json:"-"` +} + +// New create an error +func New(code CodeType, msg string, cause string) *SrvErr { + return &SrvErr{ + Code: code, + Msg: msg, + Cause: cause, + } +} + +func (s *SrvErr) Error() string { + if s == nil { + return "" + } + return fmt.Sprintf("code = %d, msg = %s ,case = %v", s.Code, s.Msg, s.Cause) +} + +func (c CodeType) Msg() string { + msg, ok := codeAndMsg[c] + if ok { + return msg + } + return "" +} + +func (c CodeType) Tip() string { + tip, ok := codeAndTip[c] + if ok { + return tip + } + return "" +} diff --git a/common/stdLog/logApi.go b/common/stdLog/logApi.go new file mode 100644 index 0000000..2b712f0 --- /dev/null +++ b/common/stdLog/logApi.go @@ -0,0 +1,70 @@ +package stdLog + +import ( + "errors" + "net/http" + "os" + "reflect" + "stat/common/log" + "stat/common/utils" + "time" + + "github.com/gin-gonic/gin" +) + +//ServeJSON 返回数据并处理多语言 +func ServerJSON(c *gin.Context, code CodeType, data interface{}) { + if code != Success { //发生错误,记录日志 + var version, sysType, devType string + admin, _ := utils.GetAdmin(c) + + log.Warn("Error:", + log.Any("admin", admin), + log.Any("IP", c.ClientIP()), + log.Any("Version", version), + log.Any("SysType", sysType), + log.Any("DevType", devType), + log.Any("Router", c.Request.RequestURI), + log.Any("PID", os.Getpid()), + log.Any("Error", data), + log.Any("Code", code)) + + c.JSON(http.StatusOK, gin.H{ + "code": code, + "msg": code.Msg(), + "tip": code.Tip(), + "data": data, + "time": time.Now().UTC().Format("2006-01-02T15:04:05.000Z"), + }) + } else { + if data != nil { + t := reflect.TypeOf(data) + if !(t.Kind() == reflect.Map || t.Kind() == reflect.Struct) { + //log.Warn("[===TypeError===] Return Data Type error is not struct", log.Any("path", c.Request.URL.Path)) + } + } + // 返回数据加密 + c.JSON(http.StatusOK, gin.H{ + "code": code, + "msg": code.Msg(), + "tip": code.Tip(), + "data": data, + "time": time.Now().UTC().Format("2006-01-02T15:04:05.000Z"), + }) + } +} + +//GetUID 获取用户uid +//oauth.Auth执行后uid有效 +func GetUID(ctx *gin.Context) (uid uint64, err error) { + val, exists := ctx.Get("USER_ID") + if !exists { + err = errors.New("userId not exist") + return + } + uid, ok := val.(uint64) + if !ok { + return 0, errors.New("userId type error") + } + return +} diff --git a/common/stdLog/msg.go b/common/stdLog/msg.go new file mode 100644 index 0000000..b5b803f --- /dev/null +++ b/common/stdLog/msg.go @@ -0,0 +1,41 @@ +package stdLog + +var codeAndMsg = map[CodeType]string{ + Success: "success", + Failure: "Failed", + ParamError: "Param error", + AdminAccountNotExists: "Account is not exists", + AdminPasswordError: "Password error", + AdminGetAuthorityFailed: "Get authority failed", + NoToken: "no token", + ParamDeductionRatioError: "invalid deduction ratio", + ChannelNotExists: "channel not exists", + AgentAccountNotExists: "Account is not exists", + AgentPasswordError: "Password error", + AuthorityRoleExists: "authority role is existed", + AgentHasLocked: "agent has been locked", + DisableWithdraw: "trader disabled", + NotSupportWithdraw: "not support withdraw", + AccountExists: "account is exists", + InvalidPhoneNumber: "Invalid phone number", + AgentAccountBanned: "account is banned", + GoogleAuthFailed: "google two step auth failed", + AdvertiseLocExists: "advertise location exists", + WithdrawBalanceLess: "balance not enough", + WithdrawMobileError: "mobile is different", + VerifySmsCodeFailed: "sms code is not correct", + WithdrawFailed: "withdraw failed", + AdvertiseInvalid: "invalid advertisement", + AppInfoError: "application info error", + InvalidPrice: "invliad price", + ChannelExists: "channel exists", + QueryDataError: "query data error", + UpdateDataError: "update data error", + DelDataError: "delete data error", + DataNotExist: "data does not exist", + ActivityNoExistErr: "activity does not exist", + LotteryNumReachedTheLimit: "lottery num reached the limit", + LotteryCodeIsInvalid: "lottery code is invalid", + LotteryCodeIsUsed: "lottery code is used", + ApplicationLocExists: "application location exists", +} diff --git a/common/stdLog/tip.go b/common/stdLog/tip.go new file mode 100644 index 0000000..288e5af --- /dev/null +++ b/common/stdLog/tip.go @@ -0,0 +1,41 @@ +package stdLog + +var codeAndTip = map[CodeType]string{ + Success: "成功", + Failure: "失败", + ParamError: "参数错误", + AdminAccountNotExists: "该账号不存在", + AdminPasswordError: "密码错误", + AdminGetAuthorityFailed: "获取权限失败", + NoToken: "没有token", + ParamDeductionRatioError: "无效的扣量值", + ChannelNotExists: "渠道不存在", + AgentAccountNotExists: "该账号不存在", + AgentPasswordError: "密码错误", + AuthorityRoleExists: "该权限角色已存在", + AgentHasLocked: "禁止登陆", + DisableWithdraw: "禁止交易", + NotSupportWithdraw: "不支持提现", + AccountExists: "账号已存在", + InvalidPhoneNumber: "手机号码无效", + AgentAccountBanned: "该账号已禁用", + GoogleAuthFailed: "两步验证失败", + AdvertiseLocExists: "该广告位置已经存在,请重新输入位置id", + WithdrawBalanceLess: "余额不足,请确认!", + WithdrawMobileError: "手机号码不一致,请确认!", + VerifySmsCodeFailed: "验证码不正确,请确认!", + WithdrawFailed: "提现失败!", + AdvertiseInvalid: "无效的广告", + AppInfoError: "应用信息不正确", + InvalidPrice: "无效的金额", + ChannelExists: "渠道已存在", + QueryDataError: "数据查询失败", + UpdateDataError: "更新数据失败", + DelDataError: "删除数据失败", + DataNotExist: "数据不存在", + ActivityNoExistErr: "活动不存在", + LotteryNumReachedTheLimit: "今日抽奖次数达到限制", + LotteryCodeIsInvalid: "兑换码无效", + LotteryCodeIsUsed: "兑换码已使用", + ApplicationLocExists: "该广告位置已经存在,请重新输入位置id", +} diff --git a/common/tf/tf.go b/common/tf/tf.go new file mode 100644 index 0000000..2ac00ae --- /dev/null +++ b/common/tf/tf.go @@ -0,0 +1,148 @@ +package tf + +import ( + "fmt" + "net/http" + "stat/common/log" + "strings" + + "github.com/PuerkitoBio/goquery" +) + +type Result struct { + Valid bool + Desc string + AppName string + AppIcon string +} + +// address: https://testflight.apple.com/join/whsnQnSb +// https://testflight.apple.com/join/M3cBOOzR +func CheckTFValid(address string) (*Result, error) { + var checkResult Result + req, err := http.NewRequest("GET", address, nil) + if err != nil { + log.Warn("CheckTFValid newRequest", log.Any("address", address), log.E(err)) + checkResult.Desc = err.Error() + return nil, err + } + req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9") + req.Header.Add("Accept-Language", "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6") + req.Header.Add("Cache-Control", "no-cache") + req.Header.Add("Connection", "keep-alive") + req.Header.Add("Pragma", "no-cache") + req.Header.Add("Sec-Fetch-Dest", "document") + req.Header.Add("Sec-Fetch-Mode", "navigate") + req.Header.Add("Sec-Fetch-Site", "none") + req.Header.Add("Sec-Fetch-User", "?1") + req.Header.Add("Upgrade-Insecure-Requests", "1") + req.Header.Add("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1") + res, err := http.DefaultClient.Do(req) + if err != nil { + log.Warn("CheckTFValid Client Do", log.Any("address", address), log.E(err)) + return nil, err + } + defer func() { _ = res.Body.Close() }() + //不为200 肯定出问题了 + if res.StatusCode != http.StatusOK { + checkResult.Desc = fmt.Sprintf("HttpStatus:%d", res.StatusCode) + return &checkResult, nil + } + + //状态为200,解析内容 + doc, err := goquery.NewDocumentFromReader(res.Body) + if err != nil { + log.Warn("CheckTFValid NewDocumentFromReader err", log.Any("address", address), log.E(err)) + return &checkResult, err + } + + valid, desc := checkValid(doc) + if !valid { + checkResult.Desc = desc + return &checkResult, nil + } + appName := getAppName(doc) + appIcon := getAppIcon(doc) + checkResult.Valid = true + checkResult.AppName = appName + checkResult.AppIcon = appIcon + return &checkResult, nil +} + +func checkValid(doc *goquery.Document) (bool, string) { + foundStartTesting := false + doc.Find("a").EachWithBreak(func(i int, s *goquery.Selection) bool { + text := strings.TrimSpace(s.Text()) + if text == "Start Testing" || text == "开始测试" { + foundStartTesting = true + return false + } + return true + }) + if foundStartTesting { + return true, "" //TF包有效 + } + betaStatus := "" + doc.Find(".beta-status").EachWithBreak(func(i int, s *goquery.Selection) bool { + betaStatus = strings.TrimSpace(s.Text()) + return false + }) + if betaStatus == "" { + return true, "" + } + if strings.Contains(betaStatus, "install TestFlight") || strings.Contains(betaStatus, "安装 TestFlight") { + return true, "" + } + + //TODO: 这里还需要测试,目前来看,出现betaStatus就是无效的 + return false, betaStatus +} + +func getAppName(doc *goquery.Document) string { + var appName string + doc.Find("title").EachWithBreak(func(i int, selection *goquery.Selection) bool { + //加入 Beta 版“原创短视频” - TestFlight - Apple + //Join the READ-O beta - TestFlight - Apple + v := strings.TrimSpace(selection.Text()) + rawLen := len(v) + v = strings.TrimPrefix(v, "加入 Beta 版") + v = strings.TrimPrefix(v, "Join the") + v = strings.TrimSuffix(v, "beta - TestFlight - Apple") + v = strings.TrimSuffix(v, "- TestFlight - Apple") + v = strings.TrimSpace(v) + v = strings.TrimLeft(v, "“") + v = strings.TrimRight(v, "”") + currLen := len(v) + + if rawLen == currLen { + return true + } + appName = v + return false + }) + return appName +} + +func getAppIcon(doc *goquery.Document) string { + var iconUrl string + doc.Find(".app-icon.callout.ios").EachWithBreak(func(i int, selection *goquery.Selection) bool { + nodes := selection.Nodes + if len(nodes) == 0 { + return true + } + attrs := selection.Nodes[0].Attr + for _, attr := range attrs { + if attr.Key == "style" { + href := attr.Val + href = strings.TrimPrefix(href, "background-image: url(") + href = strings.TrimSuffix(href, ");") + if len(href) != len(attr.Val) { + iconUrl = href + return false + } + } + } + return true + }) + return iconUrl +} diff --git a/common/tf/tf_test.go b/common/tf/tf_test.go new file mode 100644 index 0000000..9cb3235 --- /dev/null +++ b/common/tf/tf_test.go @@ -0,0 +1,20 @@ +package tf + +import ( + "fmt" + "testing" +) + +func TestCheckTFValid(t *testing.T) { + tfs := []string{ + "https://testflight.apple.com/join/70PGk4lI", + //"https://testflight.apple.com/join/M3cBOOzR", + } + check := func(url string) { + result, err := CheckTFValid(url) + fmt.Println(url, result, err) + } + for i := 0; i < len(tfs); i++ { + check(tfs[i]) + } +} diff --git a/common/tgbot/bot.go b/common/tgbot/bot.go new file mode 100644 index 0000000..0cd6d41 --- /dev/null +++ b/common/tgbot/bot.go @@ -0,0 +1,441 @@ +package tgbot + +import ( + "context" + "errors" + "fmt" + "go.uber.org/zap" + "stat/common/log" + "stat/common/utils" + "strings" + "sync" + "time" + + "golang.org/x/exp/slices" + + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" +) + +type TgChats struct { + BroadcastChats []int64 // 广播群 + CommandChats []int64 // 命令群 + MonitorChats []int64 // 监控群 + DownloadChats []int64 // 下载监控群 + DomainChats []int64 // 域名监控群 + DevelopChats []int64 // 开发调试群 + PrivateUsers []int64 // 私聊用户列表 + BlocStats []int64 // 集团统计群 + Advertise []int64 // 广告监控群 + ChannelApk []int64 // 渠道包生成 + Project []int64 // 项目的消息 + AdvsSend []int64 //广告群 + Rchssend []int64 //充值群 +} + +type FileType int32 + +const ( + FileTypeNone FileType = 0 + FileTypePhoto FileType = 1 + FileTypeDocument FileType = 2 + FileTypeMusic FileType = 3 + FileTypeVideo FileType = 4 +) + +type TgBot struct { + bot *tgbotapi.BotAPI + commands *TgCommands + chats *TgChats + messages *TgMessageList + shutdown chan interface{} + allow map[int64][]string + executing sync.Map +} + +func NewTgBot(token string, chats *TgChats, allow map[int64][]string) (*TgBot, error) { + ret := &TgBot{ + chats: chats, + commands: &TgCommands{ + commands: make(map[string]*Command), + }, + messages: &TgMessageList{ + list: make([]tgbotapi.Chattable, 0), + }, + shutdown: make(chan interface{}), + allow: allow, + } + if allow == nil { + ret.allow = make(map[int64][]string) + } + if chats == nil { + return nil, errors.New("chats can not be nil") + } + bot, err := tgbotapi.NewBotAPI(token) + if err != nil { + return nil, err + } + ret.bot = bot + ret.processMessages() + go ret.start() + return ret, nil +} + +func (s *TgBot) RegisterCommand(cmds ...*Command) { + for _, cmd := range cmds { + s.commands.SetCommand(cmd) + } +} + +func (s *TgBot) start() { + defer utils.RecoverError(func(err error) { + fmt.Printf("TgBot Start panic:%v", err) + }) + ctx := context.Background() + u := tgbotapi.NewUpdate(0) + u.Timeout = 1 + updates := s.bot.GetUpdatesChan(u) + for update := range updates { + if update.Message != nil { + if update.Message.IsCommand() { + go func() { + defer utils.RecoverError(func(err error) { + fmt.Printf("TgBot processCommand panic:%v", err) + }) + if err := s.processCommand(ctx, update.Message); err != nil { + var uErr *UserError + if errors.As(err, &uErr) { + uErr.SendBack() + } else { + s.SendDevelopMessage(err.Error()) + } + } + }() + } + } else if update.CallbackQuery != nil { + go func() { + defer utils.RecoverError(func(err error) { + fmt.Printf("TgBot processCallback panic:%v", err) + }) + if err := s.processCallback(ctx, update.CallbackQuery); err != nil { + var uErr *UserError + if errors.As(err, &uErr) { + uErr.SendBack() + } else { + s.SendDevelopMessage(err.Error()) + } + } + }() + } + } + close(s.shutdown) +} + +func (s *TgBot) Stop() { + s.bot.StopReceivingUpdates() + close(s.shutdown) +} + +func (s *TgBot) processMessages() { + go func() { + defer utils.RecoverError(func(err error) { + log.Error("TgBot processMessages panic", zap.Error(err)) + }) + for { + select { + case <-s.shutdown: + return + default: + } + if msg := s.messages.Pop(); msg != nil { + if _, err1 := s.bot.Send(msg); err1 != nil { + log.Error("TgBot Send error", zap.Error(err1)) + } + } + time.Sleep(time.Second) + } + }() +} + +func (s *TgBot) SendBroadcastMessage(text string, filePath string, fileType FileType) error { + if s == nil { + return errors.New("bot can not be nil") + } + msgs := getMessageList(text, s.chats.BroadcastChats, filePath, fileType) + for _, msg := range msgs { + s.messages.Push(msg) + } + return nil +} + +func (s *TgBot) SendBroadcastEntity(ent *EntityList) error { + if s == nil { + return errors.New("bot can not be nil") + } + if ent == nil { + return errors.New("entity can not be nil") + } + + for _, chat := range s.chats.BroadcastChats { + entities, text := ent.ToEntities() + msg := tgbotapi.NewMessage(chat, text) + msg.Entities = entities + s.messages.Push(msg) + } + return nil +} + +func (s *TgBot) SendBroadcastMessageToChats(text string, filePath string, fileType FileType, chats []int64) error { + if s == nil { + return errors.New("bot can not be nil") + } + msgs := getMessageList(text, chats, filePath, fileType) + for _, msg := range msgs { + s.messages.Push(msg) + } + return nil +} + +func (s *TgBot) SendMonitorMessage(text string) error { + if s == nil { + return errors.New("bot can not be nil") + } + msgs := getMessageList(text, s.chats.MonitorChats, "", FileTypeNone) + for _, msg := range msgs { + s.messages.Push(msg) + } + return nil +} + +func (s *TgBot) SendChannelApkMessage(text string) { + if s == nil { + return + } + msgs := getMessageList(text, s.chats.ChannelApk, "", FileTypeNone) + for _, msg := range msgs { + s.messages.Push(msg) + } + return +} + +func (s *TgBot) SendDevelopMessage(text string) { + if s == nil { + return + } + msgs := getMessageList(text, s.chats.DevelopChats, "", FileTypeNone) + for _, msg := range msgs { + s.messages.Push(msg) + } + return +} + +func (s *TgBot) SendBlocStatMessage(text string) { + if s == nil { + return + } + msgs := getMessageList(text, s.chats.BlocStats, "", FileTypeNone) + for _, msg := range msgs { + s.messages.Push(msg) + } + return +} + +func (s *TgBot) SendDownloadMessage(text string) error { + if s == nil { + return errors.New("bot can not be nil") + } + msgs := getMessageList(text, s.chats.DownloadChats, "", FileTypeNone) + for _, msg := range msgs { + s.messages.Push(msg) + } + return nil +} + +func (s *TgBot) SendDomainMessage(text string) error { + if s == nil { + return errors.New("bot can not be nil") + } + msgs := getMessageList(text, s.chats.DomainChats, "", FileTypeNone) + for _, msg := range msgs { + s.messages.Push(msg) + } + return nil +} + +func (s *TgBot) SendAdvertiseMessage(text string) error { + if s == nil { + return errors.New("bot can not be nil") + } + msgs := getMessageList(text, s.chats.Advertise, "", FileTypeNone) + for _, msg := range msgs { + s.messages.Push(msg) + } + return nil +} + +func (s *TgBot) SendProjectMessage(text string) error { + if s == nil { + return errors.New("bot can not be nil") + } + msgs := getMessageList(text, s.chats.Project, "", FileTypeNone) + for _, msg := range msgs { + s.messages.Push(msg) + } + return nil +} + +func (s *TgBot) isCmdAuthenticated(cmd *Command) bool { + chatAllowCmds := s.allow[cmd.message.Chat.ID] + if slices.Contains(s.chats.CommandChats, cmd.message.Chat.ID) || // 在命令群 1 + slices.Contains(s.chats.Rchssend, cmd.message.Chat.ID) || // 在命令群 2 + (cmd.message.Chat.IsPrivate() && slices.Contains(s.chats.PrivateUsers, cmd.message.From.ID)) || // 允许的私聊用户ID + slices.Contains(chatAllowCmds, cmd.Cmd) || // 群已指定允许的命令 + cmd.Cmd == "what" { // 公共命令,显示群信息 + return true + } else { + return false + } +} + +func (s *TgBot) processCommand(ctx context.Context, message *tgbotapi.Message) error { + cmd, err := s.parseCommand(message, CommandTypeCommand) + if err != nil { + return UnknownCommandError(message) + } + if cmd.skip { // not to this bot + return nil + } + if s.isCmdAuthenticated(cmd) { // 群已指定允许的命令 + return s.handleCommand(ctx, cmd) + } else { + return AuthError(message) + } +} + +func (s *TgBot) processCallback(ctx context.Context, callback *tgbotapi.CallbackQuery) error { + message := callback.Message + message.From = callback.From + message.Text = callback.Data + cmd, err := s.parseCommand(message, CommandTypeCallback) + if err != nil { + return UnknownCommandError(message) + } + if cmd.skip { // not to this bot + return nil + } + if s.isCmdAuthenticated(cmd) { + return s.handleCommand(ctx, cmd) + } else { + return AuthError(message) + } +} + +func (s *TgBot) handleCommand(ctx context.Context, cmd *Command) (ret error) { + defer utils.RecoverError(func(err error) { + ret = CommandPanic(cmd, err) + }) + userID := cmd.message.From.ID + if _, loaded := s.executing.LoadOrStore(userID, cmd.Cmd); loaded { + return NewUserError(cmd, "你上次的命令尚未执行完成,请稍后再重试。。。") + } + defer s.executing.Delete(userID) + + if cmd.Process != nil { + if err := cmd.Process(ctx, cmd); err != nil { + var uErr *UserError + if errors.As(err, &uErr) { + return uErr.SendBack() + } else { + return CommandError(cmd, err) + } + } + } else { + ret = UnknownCommandError(cmd.message) + return + } + return +} + +func (s *TgBot) parseCommand(msg *tgbotapi.Message, cmdType CommandType) (*Command, error) { + ret := Command{owner: s, message: msg} + quoted := false + fields := strings.FieldsFunc(msg.Text, func(r rune) bool { + if r == '"' { + quoted = !quoted + } + return !quoted && r == ' ' + }) + + args := make([]string, 0) + for _, field := range fields { + _field := strings.TrimSpace(field) + if strings.HasPrefix(field, "@") { + ret.botNames = append(ret.botNames, strings.Replace(_field, "@", "", 1)) + } else { + args = append(args, _field) + } + } + + if len(args) > 0 { + if strings.HasPrefix(args[0], "/") { + ret.Cmd = strings.Replace(args[0], "/", "", 1) + args = DeleteSliceElem(args, args[0]) + } + } + + ret.skip = !(slices.Contains(ret.botNames, s.bot.Self.UserName) || len(ret.botNames) == 0) + ret.Params = args + item := s.commands.GetCommand(ret.Cmd) + if item != nil { + ret.Desc = item.Desc + ret.Help = item.Help + ret.Process = item.Process + ret.CmdType = cmdType + return &ret, nil + } else { + return nil, errors.New("unknown tg command") + } +} + +func (s *TgBot) Sendrchstesttochat(text string, filePath string, fileType FileType) error { + if s == nil { + return errors.New("bot can not be nil") + } + msgs := getMessageList(text, s.chats.AdvsSend, filePath, fileType) + for _, msg := range msgs { + s.messages.Push(msg) + } + return nil +} + +func (s *TgBot) Sendrchstochat(text string, filePath string, fileType FileType) error { + if s == nil { + return errors.New("bot can not be nil") + } + msgs := getMessageList(text, s.chats.Rchssend, filePath, fileType) + for _, msg := range msgs { + s.messages.Push(msg) + } + return nil +} + +func (s *TgBot) SendAdvsSendMessage(text string) { + if s == nil { + return + } + msgs := getMessageList(text, s.chats.AdvsSend, "", FileTypeNone) + for _, msg := range msgs { + s.messages.Push(msg) + } + return +} + +func (s *TgBot) SendrchssendMessage(text string) { + if s == nil { + return + } + msgs := getMessageList(text, s.chats.Rchssend, "", FileTypeNone) + for _, msg := range msgs { + s.messages.Push(msg) + } + return +} diff --git a/common/tgbot/cmd.go b/common/tgbot/cmd.go new file mode 100644 index 0000000..47ed0af --- /dev/null +++ b/common/tgbot/cmd.go @@ -0,0 +1,254 @@ +package tgbot + +import ( + "context" + "errors" + "strconv" + "strings" + "sync" + + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" +) + +type CommandType int32 + +const ( + CommandTypeUnknown CommandType = 0 + CommandTypeCommand CommandType = 1 + CommandTypeCallback CommandType = 2 +) + +type TgMessageList struct { + lock sync.Mutex + list []tgbotapi.Chattable +} + +func (s *TgMessageList) Push(msg tgbotapi.Chattable) { + s.lock.Lock() + defer s.lock.Unlock() + if s.list == nil { + s.list = make([]tgbotapi.Chattable, 0) + } + s.list = append(s.list, msg) +} + +func (s *TgMessageList) Pop() tgbotapi.Chattable { + s.lock.Lock() + defer s.lock.Unlock() + var ret tgbotapi.Chattable + if len(s.list) > 0 { + ret = s.list[0] + s.list = s.list[1:] + } + return ret +} + +type TgCommands struct { + commands map[string]*Command + lock sync.Mutex +} + +func (s *TgCommands) GetCommand(cmd string) *Command { + s.lock.Lock() + defer s.lock.Unlock() + return s.commands[cmd] +} + +func (s *TgCommands) SetCommand(cmd *Command) { + s.lock.Lock() + defer s.lock.Unlock() + s.commands[cmd.Cmd] = cmd +} + +type CommandFunc func(ctx context.Context, cmd *Command) error + +type Command struct { + Cmd string // 命令 + Help string // 命令帮助 + Desc string // 命令描述 + CmdType CommandType // 命令类型 + Process CommandFunc // 处理函数 + Params []string // 参数 + botNames []string // @ + skip bool // 是否跳过处理 + owner *TgBot + ParseMode string + PhotoPath string + FilePath string + message *tgbotapi.Message +} + +func (c *Command) Message() *tgbotapi.Message { + return c.message +} + +func (c *Command) HasFlag(flag string) bool { + for _, arg := range c.Params { + if strings.Contains(arg, "=") { + ss := strings.Split(arg, "=") + if len(ss) > 0 { + if ss[0] == flag { + return true + } + } + } else { + if arg == flag { + return true + } + } + } + return false +} + +func (c *Command) GetFlagStringValue(flag string) string { + for index, arg := range c.Params { + pos := strings.Index(arg, "=") + if pos > 0 { + cmd := arg[:pos] + if cmd == flag { + content := arg[pos+1:] + if strings.HasPrefix(content, `"`) && strings.HasSuffix(content, `"`) { + if text, err := strconv.Unquote(content); err != nil { + return content + } else { + return text + } + } else { + return content + } + } + } else { + if arg == flag { + if index+1 < len(c.Params) { + return c.Params[index+1] + } + } + } + } + return "" +} + +func (c *Command) GetFlagInt64Value(flag string) (int64, error) { + s := c.GetFlagStringValue(flag) + if s != "" { + return strconv.ParseInt(s, 10, 64) + } + return 0, errors.New("flag value is empty") +} + +func (c *Command) GetFlagInt32Value(flag string) (int32, error) { + s := c.GetFlagStringValue(flag) + if s != "" { + i, err := strconv.ParseInt(s, 10, 64) + return int32(i), err + } + return 0, errors.New("flag value is empty") +} + +func (c *Command) GetFlagStringSlice(flag string) []string { + s := c.GetFlagStringValue(flag) + return strings.Split(s, ",") +} + +func (c *Command) GetFlagInt64Slice(flag string) []int64 { + ret := make([]int64, 0) + s := c.GetFlagStringValue(flag) + ss := strings.Split(s, ",") + for _, v := range ss { + if i, err := strconv.ParseInt(v, 10, 64); err == nil { + ret = append(ret, i) + } + } + return ret +} + +func (c *Command) GetFlagInt32Slice(flag string) []int32 { + ret := make([]int32, 0) + s := c.GetFlagStringValue(flag) + ss := strings.Split(s, ",") + for _, v := range ss { + if i, err := strconv.ParseInt(v, 10, 64); err == nil { + ret = append(ret, int32(i)) + } + } + return ret +} + +func (c *Command) SendBack(text string) error { + if c.message != nil { + if c.CmdType == CommandTypeCallback { + if c.PhotoPath != "" || c.FilePath != "" { + return c.SendReply(text, nil) + } else { + return c.SendEdit(text, nil) + } + } else if c.CmdType == CommandTypeCommand { + return c.SendReply(text, nil) + } else { + return c.SendText(text) + } + } else { + return errors.New("tg message is nil") + } +} + +func (c *Command) SendEntity(ent *EntityList) error { + if c == nil { + return errors.New("bot cmd can not be nil") + } + if ent == nil { + return errors.New("entity can not be nil") + } + if c.message == nil { + return errors.New("tg message is nil") + } + chat := c.message.Chat.ID + entities, text := ent.ToEntities() + msg := tgbotapi.NewMessage(chat, text) + msg.Entities = entities + c.owner.messages.Push(msg) + return nil +} + +func (c *Command) SendReply(text string, replyMarkup interface{}) error { + if c.message != nil { + return replyMessage(c.owner, c.message, text, replyMarkup, c.ParseMode, c.PhotoPath, c.FilePath) + } else { + return errors.New("tg message is nil") + } +} + +func (c *Command) SendEdit(text string, replyMarkup interface{}) error { + if c.message != nil { + return editMessage(c.owner, c.message, text, replyMarkup, c.ParseMode) + } else { + return errors.New("tg message is nil") + } +} + +func (c *Command) SendText(text string) error { + if c.message != nil { + return sendMessageToChat(c.owner, text, c.message.Chat.ID, c.ParseMode, c.PhotoPath, c.FilePath) + } else { + return errors.New("tg message is nil") + } +} + +func (c *Command) SendFile(text string, fileName string) error { + if c.message != nil { + c.FilePath = fileName + return sendMessageToChat(c.owner, text, c.message.Chat.ID, c.ParseMode, c.PhotoPath, c.FilePath) + } else { + return errors.New("tg message is nil") + } +} + +func (c *Command) SendDelete() error { + if c.message != nil { + msg := tgbotapi.NewDeleteMessage(c.message.Chat.ID, c.message.MessageID) + _, err := c.owner.bot.Request(msg) + return err + } else { + return errors.New("tg message is nil") + } +} diff --git a/common/tgbot/entity.go b/common/tgbot/entity.go new file mode 100644 index 0000000..3fa7c50 --- /dev/null +++ b/common/tgbot/entity.go @@ -0,0 +1,109 @@ +package tgbot + +import ( + "fmt" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + "strings" + "unicode/utf16" +) + +type Entity struct { + Title string + Content string +} + +func (p *Entity) GetTitle() string { + return fmt.Sprintf("%s", p.Title) +} + +func (p *Entity) Entity(startOffset int) ([]tgbotapi.MessageEntity, string) { + ret := make([]tgbotapi.MessageEntity, 0) + ret = append(ret, tgbotapi.MessageEntity{ + Type: "expandable_blockquote", + Offset: startOffset, + Length: p.TextU16Len(), + }) + if p.TitleU16Len() > 0 { + ret = append(ret, tgbotapi.MessageEntity{ + Type: "bold", + Offset: startOffset, + Length: p.TitleU16Len(), + }) + } + if p.ContentU16Len() > 0 { + ret = append(ret, tgbotapi.MessageEntity{ + Type: "bold", + Offset: startOffset + p.TitleU16Len() + 1, + Length: p.ContentU16Len(), + }) + } + if p.TitleU16Len() > 0 { + return ret, p.GetTitle() + "\n" + p.Content + } + return ret, p.Content +} + +func (p *Entity) TextU16Len() int { + text := p.GetTitle() + if text != "" { + text += "\n" + } + text += p.Content + return len(utf16.Encode([]rune(text))) +} + +func (p *Entity) TitleU16Len() int { + return len(utf16.Encode([]rune(p.GetTitle()))) +} + +func (p *Entity) ContentU16Len() int { + return len(utf16.Encode([]rune(p.Content))) +} + +type EntityList struct { + Title string + Desc string + Entities []*Entity +} + +func NewEntityList(title, desc string, entities []*Entity) *EntityList { + return &EntityList{ + Title: strings.TrimSpace(title), + Desc: strings.TrimSpace(desc), + Entities: entities, + } +} + +func (p *EntityList) ToEntities() ([]tgbotapi.MessageEntity, string) { + ret := make([]tgbotapi.MessageEntity, 0) + var text string + var startOffset int + // 添加总标题 + titleU16Len := len(utf16.Encode([]rune(p.Title))) + ret = append(ret, tgbotapi.MessageEntity{ + Type: "bold", + Offset: 0, + Length: titleU16Len, + }) + text += p.Title + "\n" + startOffset += titleU16Len + 1 + // 添加总描述 + if p.Desc != "" { + descU16Len := len(utf16.Encode([]rune(p.Desc))) + ret = append(ret, tgbotapi.MessageEntity{ + Type: "bold", + Offset: startOffset, + Length: descU16Len, + }) + text += p.Desc + "\n" + startOffset += descU16Len + 1 + } + // 添加每个Prompt + for _, ent := range p.Entities { + promptEntities, promptText := ent.Entity(startOffset) + ret = append(ret, promptEntities...) + text += promptText + "\n" + startOffset += ent.TextU16Len() + 1 + } + return ret, text +} diff --git a/common/tgbot/error.go b/common/tgbot/error.go new file mode 100644 index 0000000..694ad1b --- /dev/null +++ b/common/tgbot/error.go @@ -0,0 +1,50 @@ +package tgbot + +import ( + "fmt" + + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" +) + +type UserError struct { + msg string + cmd *Command +} + +func NewUserError(cmd *Command, text string) error { + ret := &UserError{ + msg: text, + cmd: cmd, + } + return ret +} + +func (e *UserError) Error() string { + return e.msg +} + +func (e *UserError) SendBack() error { + if e.cmd.CmdType == CommandTypeCallback { + return e.cmd.SendEdit(e.msg, nil) + } else if e.cmd.CmdType == CommandTypeCommand { + return e.cmd.SendReply(e.msg, nil) + } else { + return e.cmd.SendText(e.msg) + } +} + +func CommandError(cmd *Command, err error) error { + return fmt.Errorf("命令失败,来自【%s:%d】%s,命令【%s】错误:\n%s", cmd.message.Chat.Title, cmd.message.Chat.ID, UserDisplay(cmd.message), cmd.Cmd, err.Error()) +} + +func CommandPanic(cmd *Command, err error) error { + return fmt.Errorf("命令异常,来自【%s:%d】%s,命令【%s】错误:\n%s", cmd.message.Chat.Title, cmd.message.Chat.ID, UserDisplay(cmd.message), cmd.Cmd, err.Error()) +} + +func AuthError(message *tgbotapi.Message) error { + return fmt.Errorf("非官方群,来自【%s:%d】%s, 内容:\n%s", message.Chat.Title, message.Chat.ID, UserDisplay(message), message.Text) +} + +func UnknownCommandError(message *tgbotapi.Message) error { + return fmt.Errorf("未知命令,来自【%s:%d】%s, 内容:\n%s", message.Chat.Title, message.Chat.ID, UserDisplay(message), message.Text) +} diff --git a/common/tgbot/msg.go b/common/tgbot/msg.go new file mode 100644 index 0000000..13bf9e0 --- /dev/null +++ b/common/tgbot/msg.go @@ -0,0 +1,155 @@ +package tgbot + +import ( + "errors" + "strings" + + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" +) + +func sendMessageToChat(bot *TgBot, text string, chat int64, parseMode string, photoPath string, filePath string) error { + blocks := getTextBlocks(text) + if len(blocks) == 0 { + return errors.New("发送的文本为空") + } + var msg tgbotapi.Chattable + for _, block := range blocks { + if photoPath != "" { + tmp := tgbotapi.NewPhoto(chat, tgbotapi.FilePath(photoPath)) + tmp.Caption = text + tmp.ParseMode = parseMode + msg = tmp + } else if filePath != "" { + tmp := tgbotapi.NewDocument(chat, tgbotapi.FilePath(filePath)) + tmp.Caption = text + tmp.ParseMode = parseMode + msg = tmp + } else { + tmp := tgbotapi.NewMessage(chat, block) + tmp.ParseMode = parseMode + msg = tmp + } + bot.messages.Push(msg) + } + return nil +} + +func replyMessage(bot *TgBot, message *tgbotapi.Message, text string, replyMarkup interface{}, parseMode string, photoPath string, filePath string) error { + blocks := getTextBlocks(text) + if len(blocks) == 0 { + return errors.New("发送的文本为空") + } + var msg tgbotapi.Chattable + for _, block := range blocks { + if photoPath != "" { + tmp := tgbotapi.NewPhoto(message.Chat.ID, tgbotapi.FilePath(photoPath)) + tmp.Caption = text + tmp.ParseMode = parseMode + tmp.ReplyMarkup = replyMarkup + tmp.ReplyToMessageID = message.MessageID + msg = tmp + } else if filePath != "" { + tmp := tgbotapi.NewDocument(message.Chat.ID, tgbotapi.FilePath(filePath)) + tmp.Caption = text + tmp.ParseMode = parseMode + tmp.ReplyMarkup = replyMarkup + tmp.ReplyToMessageID = message.MessageID + msg = tmp + } else { + tmp := tgbotapi.NewMessage(message.Chat.ID, block) + tmp.ParseMode = parseMode + tmp.ReplyMarkup = replyMarkup + tmp.ReplyToMessageID = message.MessageID + msg = tmp + } + bot.messages.Push(msg) + } + return nil +} + +func editMessage(bot *TgBot, message *tgbotapi.Message, text string, replyMarkup interface{}, parseMode string) error { + blocks := getTextBlocks(text) + if len(blocks) == 0 { + return errors.New("发送的文本为空") + } + var msg tgbotapi.Chattable + for index, block := range blocks { + if index == 0 { + tmp := tgbotapi.NewEditMessageText(message.Chat.ID, message.MessageID, block) + tmp.ParseMode = parseMode + msg = tmp + if markup, ok := replyMarkup.(tgbotapi.InlineKeyboardMarkup); ok { + tmp = tgbotapi.NewEditMessageTextAndMarkup(message.Chat.ID, message.MessageID, block, markup) + tmp.ParseMode = parseMode + msg = tmp + } + } else { + tmp := tgbotapi.NewMessage(message.Chat.ID, block) + tmp.ParseMode = parseMode + msg = tmp + } + bot.messages.Push(msg) + } + + return nil +} + +func getMessageList(text string, chats []int64, filePath string, fileType FileType) []tgbotapi.Chattable { + msgList := make([]tgbotapi.Chattable, 0) + blocks := getTextBlocks(text) + + chatfile := filePath + for _, chat := range chats { + filePath = chatfile + for _, block := range blocks { + if filePath != "" { + if fileType == FileTypePhoto { + msg := tgbotapi.NewPhoto(chat, tgbotapi.FilePath(filePath)) + msg.Caption = block + + msgList = append(msgList, msg) + } else if fileType == FileTypeDocument { + if chat == -1002009498163 { + if text != "天宇公司综合日报" { + continue + } + } + msg := tgbotapi.NewDocument(chat, tgbotapi.FilePath(filePath)) + msg.Caption = block + msgList = append(msgList, msg) + } else { + msgList = append(msgList, tgbotapi.NewMessage(chat, block)) + } + filePath = "" + } else { + if fileType == FileTypeDocument { + continue + } + msgList = append(msgList, tgbotapi.NewMessage(chat, block)) + } + } + } + return msgList +} + +func getTextBlocks(content string) []string { + blocks := make([]string, 0) + lines := strings.Split(content, "\n") + text := "" + for _, line := range lines { + if len(text)+len(line) < MaxMessageSize { + text += line + "\n" + } else { + blocks = append(blocks, text) + if len(line) > MaxMessageSize { + text = "[此行太长被忽略...]\n" + } else { + text = line + "\n" + } + } + } + if len(text) > 0 { + blocks = append(blocks, text) + } + return blocks +} diff --git a/common/tgbot/show.go b/common/tgbot/show.go new file mode 100644 index 0000000..6bd2cb8 --- /dev/null +++ b/common/tgbot/show.go @@ -0,0 +1,14 @@ +package tgbot + +import ( + "fmt" + + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" +) + +func UserDisplay(message *tgbotapi.Message) string { + if message.From != nil { + return fmt.Sprintf("用户【%s:%d】", message.From.FirstName+message.From.LastName, message.From.ID) + } + return "" +} diff --git a/common/tgbot/utils.go b/common/tgbot/utils.go new file mode 100644 index 0000000..d4a2fac --- /dev/null +++ b/common/tgbot/utils.go @@ -0,0 +1,13 @@ +package tgbot + +const MaxMessageSize = 4090 + +func DeleteSliceElem(slice []string, elem string) []string { + tmp := make([]string, 0, len(slice)) + for _, v := range slice { + if v != elem { + tmp = append(tmp, v) + } + } + return tmp +} diff --git a/common/topicmessage/topicMessage.go b/common/topicmessage/topicMessage.go new file mode 100644 index 0000000..1f9a6bd --- /dev/null +++ b/common/topicmessage/topicMessage.go @@ -0,0 +1,203 @@ +package topicmessage + +import ( + "time" +) + +/* 通信协议,第三版*/ + +// StatcenterSyncReq +type StatcenterSyncReq struct { + Job string `json:"job" bson:"job"` // 同步 + UserId uint64 `json:"userId" bson:"userId"` // 用户(注册) + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台Id(访问) + SuccessTime time.Time `json:"successTime"` // 成功时间(购买会员、提现、充值) + MaxSize int64 `json:"maxSize" bson:"maxSize"` // 最大条数 +} + +type StatcenterSyncResp struct { + Code int `json:"code"` // 200正常 其他异常 + Msg string `json:"msg"` // 错误消息 + Job string `json:"job" bson:"job"` // 类型 + VisitList []*UserVisitMsg `json:"visitList"` // 日活记录 + RegisterList []*UserRegisterMsg `json:"registerList"` // 注册记录 + WithdrawList []*UserWithdrawMsg `json:"withdrawList"` // 提现记录 + RechargeList []*UserRechargeMsg `json:"rechargeList"` // 充值记录 + VipList []*UserBuyVIPMsg `json:"buyVipList"` // VIP购买记录 + GameRecharge []*UserRechargeMsg `json:"gameRecharge"` // 游戏充值订单 + GameWithdraw []*UserWithdrawMsg `json:"gameWithdraw"` // 游戏提现订单 + GameWater []*UserGameWaterMsg `json:"gameWater"` // 游戏流水 +} + +// 用户访问消息 +type UserVisitMsg struct { + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台流水Id + AppId int32 `json:"appId" bson:"appId"` // appID + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 安卓 IOS + DevType string `json:"devType,omitempty" bson:"devType"` // 设备型号 + IP string `json:"ip,omitempty" bson:"ip"` // IP + Version string `json:"version,omitempty" bson:"version"` // APP版本号 + DevID string `json:"devID,omitempty" bson:"devID"` // 设备ID + VisitAt time.Time `json:"visitAt,omitempty" bson:"visitAt"` // 访问时间 +} + +// 用户用户注册消息 +type UserRegisterMsg struct { + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + AppId int32 `json:"appId" bson:"appId"` // appID + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 安卓 IOS + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台流水Id + DevType string `json:"devType" bson:"devType"` // 设备类型 + Mobile string `json:"mobile" bson:"mobile"` // 手机号 + IP string `json:"ip,omitempty" bson:"ip"` // IP + Name string `json:"name" bson:"name"` // 名称 + IsDirect bool `json:"isDirect" bson:"isDirect"` // true:是直推用户 + DistrictCode string `json:"districtCode" bson:"districtCode" ` // 渠道码 + PromSeqe string `json:"promSeqe" bson:"promSeqe"` // 全名代理 + PromCode string `json:"promCode" bson:"promCode"` // 推广序列 + UserAgent string `json:"userAgent" bson:"userAgent"` // User-Agent识别 + RegisterTime time.Time `json:"registerTime" bson:"registerTime"` // 注册时间时间 +} + +// 用户充值消息 +type UserRechargeMsg struct { + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + AppId int32 `json:"appId" bson:"appId"` // appID + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台流水Id + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 安卓 IOS + DevType string `json:"devType" bson:"devType"` // 设备类型 + ChannelName string `json:"channelName" bson:"channelName"` // 支付渠道名字 + CID string `json:"cid" bson:"cid"` // 渠道id + Type string `bson:"type" json:"type"` // 充值方式 + Repeat bool `bson:"repeat" json:"repeat"` // 复冲: true 重复充值 false 第一次 + OrderId string `json:"orderId" bson:"orderId"` // 流水id + Money int64 `json:"money" bson:"money"` // 充值金额 订单金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` // 实际到账金额 用户实际支付金额 + Status int `json:"status" bson:"status"` // 2付款失败 3付款成功(目前只有成功才发送) + Rate string `json:"rate"` // 渠道费率 + SyncStatus int64 `json:"syncStatus" bson:"syncStatus"` // 同步大白鲨:0 需要同步 1:不需要同步 + SuccessAt time.Time `json:"successAt" bson:"successAt"` // 成功时间 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间 +} + +// 用户提现接口 +type UserWithdrawMsg struct { + AppId int32 `json:"appId" bson:"appId"` //appID + UID uint64 `json:"uid" bson:"uid"` //用户id + PlatformId string `json:"platformId" bson:"platformId"` //原始平台流水Id + Name string `json:"name" bson:"name"` //用户名 + OID string `json:"oid" bson:"oid"` //第三方支付平台id + Money int64 `json:"money" bson:"money"` //提现金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` //实际到账 + PayType string `json:"payType" bson:"payType"` //提现方式,alipay,bankcard + ActName string `json:"actName" bson:"actName"` //交易账户持有人 + Act string `json:"act" bson:"act"` //交易账户 + DeviceType string `json:"deviceType" bson:"deviceType"` //设备类型 + DevID string `json:"devID" bson:"devID"` //设备id + Status int `json:"status" bson:"status"` //5提现成功 + SuccessAt time.Time `json:"successAt" bson:"successAt"` //回调成功时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //刷新时间 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //提现申请时间 + IsDirect bool `json:"isDirect" bson:"isDirect"` //true:是直推用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` //渠道码 + SyncStatus int64 `json:"syncStatus" bson:"syncStatus"` // 同步大白鲨:0 需要同步 1:不需要同步 + PayChannel string `json:"payChannel" bson:"payChannel"` //提现渠道 + PromCode string `json:"promCode" bson:"promCode"` //用户推广序列 +} + +/* 通信协议,第三版*/ +type BuyVIPType int64 + +const ( + BuyVIPTypeMoney BuyVIPType = 0 + iota // 访问 + BuyVIPTypeGold // 金币 +) + +// 用户购买VIP +type UserBuyVIPMsg struct { + AppId int32 `json:"appId" bson:"appId"` //appID + UID uint64 `json:"uid" bson:"uid"` //用户id + PlatformId string `json:"platformId" bson:"platformId"` //原始平台流水Id + Name string `json:"name" bson:"name"` //用户名 + Money int64 `json:"money" bson:"money"` //提现金额 + Amount int64 `json:"amount" bson:"amount"` //金币 + BuyVIPType BuyVIPType `json:"buyVIPType" bson:"buyVIPType"` //支付方式 + OID string `json:"oid" bson:"oid"` //第三方支付平台id + DeviceType string `json:"deviceType" bson:"deviceType"` //设备类型 + Status int `json:"status" bson:"status"` //1未审核 5提现成功 + SuccessAt time.Time `json:"successTime"` //成功时间(购买会员、提现、充值) + IsDirect bool `json:"isDirect" bson:"isDirect"` //true:是直推用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` //渠道码 + PromCode string `json:"promCode" bson:"promCode"` //用户推广序列 +} + +type StatcenterGameReq struct { + Date time.Time `json:"date" bson:"date"` +} +type GetReportStatResp struct { + Code int `json:"code"` // 200正常 其他异常 + Msg string `json:"msg"` // 错误消息 + Date string `json:"date" bson:"date"` + GameRchgAmount int64 `json:"gameRchgAmount" bson:"gameRchgAmount"` //充值总金额 + GameDCRchgAmount int64 `json:"gameDCRchgAmount" bson:"gameDCRchgAmount"` //代充总金额 + GameWtdrAmount int64 `json:"gameWtdrAmount" bson:"gameWtdrAmount"` //游戏提现总金额 + GameWtdrRealAmount int64 `json:"gameWtdrRealAmount" bson:"gameWtdrRealAmount"` //游戏实际提现总金额 + GameIncAmount int64 `json:"gameIncAmount" bson:"gameIncAmount"` //游戏上分总金额 + GameDecAmount int64 `json:"gameDecAmount" bson:"gameDecAmount"` //游戏下分总金额 + ValidBet int64 `json:"validBet" bson:"validBet"` //有效投注金额 + Profit int64 `json:"profit" bson:"profit"` //系统盈利 + //游戏成功充值次数 + GameRchgCount int64 `json:"gameRchgCount" bson:"gameRchgCount"` + //活跃人数 + GamePlayCount int64 `json:"gamePlayCount" bson:"gamePlayCount"` + //游戏成功充值人数 + GameRchgUsers int64 `json:"gameRchgUsers" bson:"gameRchgUsers"` + //游戏首次充值总金额 + GameFirstRchgAmount int64 `json:"gameFirstRchgAmount" bson:"gameFirstRchgAmount"` + //游戏首次成功充值次数 + GameFirstRchgCount int64 `json:"gameFirstRchgCount" bson:"gameFirstRchgCount"` + //游戏首次成功充值人数 + GameFirstRchgUsers int64 `json:"gameFirstRchgUsers" bson:"gameFirstRchgUsers"` + //游戏成功代充次数 + GameDCRchgCount int64 `json:"gameDCRchgCount" bson:"gameDCRchgCount"` + //游戏成功提现次数 + GameWtdrCount int64 `json:"gameWtdrCount" bson:"gameWtdrCount"` + + //游戏上分次数 + GameInchCount int64 `json:"gameInchCount" bson:"gameInchCount"` + + //游戏下分次数 + GameDecCount int64 `json:"gameDecCount" bson:"gameDecCount"` + //游戏6元赠送总金额 + GameGiftIncAmount int64 `json:"gameGiftIncAmount" bson:"gameGiftIncAmount"` + //游戏6元赠送次数 + GameGiftIncCount int64 `json:"gameGiftIncCount" bson:"gameGiftIncCount"` + //游戏充值赠送总金额 + GameRchGiftIncAmount int64 `json:"gameRchGiftIncAmount" bson:"gameRchGiftIncAmount"` + //游戏充值赠送次数 + GameRchGiftIncCount int64 `json:"gameRchGiftIncCount" bson:"gameRchGiftIncCount"` + //游戏VIP赠送总金额 + GameVipGiftIncAmount int64 `json:"gameVipGiftIncAmount" bson:"gameVipGiftIncAmount"` + //游戏VIP赠送次数 + GameVipGiftIncCount int64 `json:"gameVipGiftIncCount" bson:"gameVipGiftIncCount"` + // 游戏抽水 + Revenue int64 `json:"revenue" bson:"revenue"` + //更新时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //创建时间 +} + +// 用户棋牌流水 +type UserGameWaterMsg struct { + AppId int32 `json:"appId" bson:"appId"` // appID + UID uint64 `json:"uid" bson:"uid"` // 用户id + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台流水Id + Date time.Time `json:"date" bson:"date"` // 日期(2021-04-14) + ValidBet int64 `bson:"validBet" json:"validBet"` // 有效投注金额vs + Profit int64 `bson:"profit" json:"profit"` // 系统盈利 + Revenue int64 `bson:"revenue" json:"revenue"` // 游戏抽水 + SuccessAt time.Time `json:"successTime"` // 成功时间(购买会员、提现、充值) + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 更新时间 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间 +} diff --git a/common/utils/convertUtil.go b/common/utils/convertUtil.go new file mode 100644 index 0000000..c4f58e4 --- /dev/null +++ b/common/utils/convertUtil.go @@ -0,0 +1,64 @@ +package utils + +import ( + "encoding/json" + "fmt" + + "go.mongodb.org/mongo-driver/bson" +) + +//ToBsonM 将struct转换为 Bson Map +func ToBsonM(s interface{}) (bson.M, error) { + data, err := bson.Marshal(s) + if err != nil { + return nil, err + } + m := make(bson.M) + if err := bson.Unmarshal(data, &m); err != nil { + return nil, err + } + return m, nil +} + +// 将page转换为数据库的skip、limit +func ToDBPage(pageNum int64, pageSize int64) (skip int64, limit int64) { + return (pageNum - 1) * pageSize, pageSize +} + +//JSONStruct2Map 将struct转换为Map +func JSONStruct2Map(obj interface{}) (map[string]interface{}, error) { + m := make(map[string]interface{}) + j, err := json.Marshal(obj) + if err != nil { + return nil, err + } + if err := json.Unmarshal(j, &m); err != nil { + return nil, err + } + return m, err +} + +//Map2JSONStruct 将map转换为Json struct +func Map2JSONStruct(v interface{}, m map[string]interface{}) error { + j, err := json.Marshal(m) + if err != nil { + return err + } + if err := json.Unmarshal(j, v); err != nil { + return err + } + return err +} + +// struct转换为Map +func Struct2Map(obj interface{}) map[string]interface{} { + m := make(map[string]interface{}) + b, err := json.Marshal(obj) + if err != nil { + return m + } + if err = json.Unmarshal(b, &m); err != nil { + fmt.Println(err) + } + return m +} diff --git a/common/utils/http.go b/common/utils/http.go new file mode 100644 index 0000000..64c18d0 --- /dev/null +++ b/common/utils/http.go @@ -0,0 +1,108 @@ +package utils + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net" + "net/http" + "sync" + "time" +) + +var once sync.Once +var _client *http.Client + +func GetHttpClient() *http.Client { + once.Do(func() { + _client = &http.Client{ + Timeout: time.Minute * 1, //设置超时时间 + Transport: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + TLSHandshakeTimeout: 10 * time.Second, //限制 TLS握手的时间 + ResponseHeaderTimeout: 10 * time.Second, //限制读取response header的时间,默认 timeout + 5*time.Second + ExpectContinueTimeout: 1 * time.Second, //限制client在发送包含 Expect: 100-continue的header到收到继续发送body的response之间的时间等待。 + MaxIdleConns: 100, //所有host的连接池最大连接数量,默认无穷大 + MaxIdleConnsPerHost: 30, //每个host的连接池最大空闲连接数,默认2 + MaxConnsPerHost: 10, //每个host的最大连接数量 + IdleConnTimeout: 3 * time.Minute, //how long an idle connection is kept in the connection pool. + }, + } + }) + return _client +} + +func getBytes(request interface{}) ([]byte, error) { + var body []byte + switch t := request.(type) { + case []byte: + body = t + case string: + body = []byte(t) + default: + var err error + body, err = json.Marshal(request) + if err != nil { + return nil, err + } + } + return body, nil +} + +type OnHttpResponse func(res *http.Response) error + +func HttpRequest(req *http.Request, onResponse OnHttpResponse) error { + client := GetHttpClient() + res, err := client.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + if onResponse != nil { + err = onResponse(res) + } + return err +} + +func HttpMethod(url, method string, header http.Header, body io.Reader, onResponse OnHttpResponse) error { + req, err := http.NewRequest(method, url, body) + if err != nil { + return err + } + if header != nil { + req.Header = header + } + return HttpRequest(req, onResponse) +} + +func HttpGet(url string, header http.Header, body io.Reader, onResponse OnHttpResponse) error { + return HttpMethod(url, http.MethodGet, header, body, onResponse) +} + +func HttpPost(url string, header http.Header, body io.Reader, onResponse OnHttpResponse) error { + return HttpMethod(url, http.MethodPost, header, body, onResponse) +} + +func HttpPostRequestJson(url string, request interface{}, resp interface{}) error { + header := make(http.Header) + header.Set("Content-Type", "application/json") + body, err := getBytes(request) + if err != nil { + return err + } + return HttpPost(url, header, bytes.NewReader(body), func(res *http.Response) error { + if res.StatusCode != http.StatusOK { + return fmt.Errorf("http request (%s) error %s", url, res.Status) + } + content, err := io.ReadAll(res.Body) + if err != nil { + return err + } + return json.Unmarshal(content, resp) + }) +} diff --git a/common/utils/jwt.go b/common/utils/jwt.go new file mode 100644 index 0000000..c5ac32b --- /dev/null +++ b/common/utils/jwt.go @@ -0,0 +1,84 @@ +package utils + +import ( + "errors" + "github.com/dgrijalva/jwt-go" + "github.com/gin-gonic/gin" +) + +const ( + AdminAccountKey = "AdminAccount" + AccountTypeKey = "AccountType" +) + +//CreateToken 生成Token算法 +func CreateToken(secret string, tokenClaims map[string]interface{}) (tokeness string, err error) { + if secret == "" { + return "", errors.New("secret is empty") + } + claims := jwt.MapClaims(tokenClaims) + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + tokeness, err = token.SignedString([]byte(secret)) + if err != nil { + return "", err + } + return tokeness, nil +} + +func keyFunc(secret string) jwt.Keyfunc { + return func(token *jwt.Token) (interface{}, error) { + return []byte(secret), nil + } +} + +//ParseToken 解析Token +func ParseToken(secret string, tokeness string) (map[string]interface{}, error) { + if secret == "" || tokeness == "" { + return nil, errors.New("secret or tokeness is empty") + } + token, err := jwt.Parse(tokeness, keyFunc(secret)) + if err != nil { + return nil, err + } + //验证token,如果token被修改过则为false + if !token.Valid { + return nil, errors.New("token is invalid") + } + claimsToken, ok := token.Claims.(jwt.MapClaims) + if !ok { + return nil, errors.New("cannot convert claim to MapClaim") + } + return claimsToken, nil +} + +// GetAdmin 获取管理员账号 +// oauth.Auth执行后有效 +func GetAdmin(ctx *gin.Context) (account string, err error) { + val, exists := ctx.Get(AdminAccountKey) + if !exists { + err = errors.New("admin account not exist") + return + } + + account, ok := val.(string) + if !ok { + return "", errors.New("admin account type error") + } + return +} + +// GetAccountType 获取账号类型 +// oauth.Auth执行后有效 +func GetAccountType(ctx *gin.Context) (string, error) { + var err error + val, exists := ctx.Get(AccountTypeKey) + if !exists { + err = errors.New("claims not exist") + return "", err + } + accType, ok := val.(string) + if !ok { + return "", errors.New("claims type error") + } + return accType, nil +} diff --git a/common/utils/lock.go b/common/utils/lock.go new file mode 100644 index 0000000..643ec72 --- /dev/null +++ b/common/utils/lock.go @@ -0,0 +1,63 @@ +package utils + +import ( + "sync" + "time" +) + +type ExpiredLock struct { + items map[string]time.Time + lock sync.RWMutex +} + +func NewExpiredLock() *ExpiredLock { + return &ExpiredLock{ + items: make(map[string]time.Time), + } +} + +func (kl *ExpiredLock) Count() int64 { + kl.lock.RLock() + defer kl.lock.RUnlock() + return int64(len(kl.items)) +} + +func (kl *ExpiredLock) LockedCount() int64 { + kl.lock.RLock() + defer kl.lock.RUnlock() + now := time.Now() + count := int64(0) + for _, expired := range kl.items { + if now.Before(expired) { + count++ + } + } + return count +} + +func (kl *ExpiredLock) UnLock(key string, expired time.Time) { + kl.lock.Lock() + defer kl.lock.Unlock() + expire, exists := kl.items[key] + if !exists || expire != expired { + return + } + delete(kl.items, key) +} + +func (kl *ExpiredLock) TryLock(key string, expired time.Time) bool { + kl.lock.Lock() + defer kl.lock.Unlock() + expire, exists := kl.items[key] + if !exists { + kl.items[key] = expired + return true + } else { + if time.Now().After(expire) { + kl.items[key] = expired + return true + } else { + return false + } + } +} diff --git a/common/utils/maths.go b/common/utils/maths.go new file mode 100755 index 0000000..f3cc426 --- /dev/null +++ b/common/utils/maths.go @@ -0,0 +1,39 @@ +package utils + +import ( + "fmt" + "math/rand" +) + +func RandDigits(n uint) string { + s := "" + for n != 0 { + s += fmt.Sprintf("%d", rand.Intn(10)) + n-- + } + return s +} + +const lowerLetter = "abcdefghijklmnopqrstuvwxyz" + +func RandLowerString(n int) string { + b := make([]byte, n) + for i := range b { + b[i] = lowerLetter[rand.Intn(len(lowerLetter))] + } + return string(b) +} + +func GetRandomUserName(base string, len int) string { + return base + RandDigits(2) + RandLowerString(len) +} + +const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + +func RandStringBytes(n int) string { + b := make([]byte, n) + for i := range b { + b[i] = letterBytes[rand.Intn(len(letterBytes))] + } + return string(b) +} diff --git a/common/utils/path.go b/common/utils/path.go new file mode 100644 index 0000000..d4576b7 --- /dev/null +++ b/common/utils/path.go @@ -0,0 +1,53 @@ +package utils + +import ( + "os" + "path/filepath" + "strings" +) + +// PathInfo 路径信息 +type PathInfo struct { + Dir string // 目录 + Ext string // 扩展名 + Filename string // 没有扩展名的文件名名称 + FullFileName string // 文件全名 +} + +// PathForInfo 解析路径 +// 返回文件,路径,文件名等信息 +func PathForInfo(path string) (pi PathInfo) { + if path == "" { + return + } + ext := filepath.Ext(path) + dir, name := filepath.Split(path) + + pi.Dir = dir + pi.Ext = ext + pi.Filename = strings.TrimRight(name, ext) + pi.FullFileName = name + return +} + +func GetFileSize(filepath string) (int64, error) { + fi, err := os.Stat(filepath) + if err != nil { + return 0, err + } + // get the size + return fi.Size(), nil +} + +// JoinUrlPath 域名与uri拼接 +func JoinUrlPath(host string, uri string) (urlpath string) { + switch { + case strings.HasSuffix(host, "/") && strings.HasPrefix(uri, "/"): + urlpath = host[0:len(host)-1] + uri + case !strings.HasSuffix(host, "/") && !strings.HasPrefix(uri, "/"): + urlpath = host + "/" + uri + default: + urlpath = host + uri + } + return +} diff --git a/common/utils/slice.go b/common/utils/slice.go new file mode 100644 index 0000000..73edc21 --- /dev/null +++ b/common/utils/slice.go @@ -0,0 +1,110 @@ +package utils + +// 定义一个集合接口 +type ISet[T comparable] interface { + Add(...T) // 增加集合元素 + Remove(...T) // 删除集合元素 + Contains(T) bool // 集合是否包含元素 + Inter(ISet[T]) ISet[T] // 集合求交集 + Union(ISet[T]) ISet[T] // 集合求合集 + Diff(ISet[T]) ISet[T] // 集合求差集 + Equal(ISet[T]) bool // 集合是否相等 + Traver(func(T)) // 遍历集合元素 + Elements() []T // 获取集合所有元素列表 + IsEmpty() bool // 集合是否为空 +} + +// Set 使用字典实现集合 +type Set[T comparable] struct { + dict map[T]struct{} +} + +func NewSet[T comparable](src []T) ISet[T] { + ret := &Set[T]{dict: make(map[T]struct{})} + for _, t := range src { + ret.dict[t] = struct{}{} + } + return ret +} + +// Add 实现集合接口 +func (s *Set[T]) Add(items ...T) { + for _, t := range items { + s.dict[t] = struct{}{} + } +} + +func (s *Set[T]) Remove(items ...T) { + for _, t := range items { + delete(s.dict, t) + } +} + +func (s *Set[T]) Contains(item T) bool { + if _, ok := s.dict[item]; ok { + return true + } + return false +} + +func (s *Set[T]) Inter(other ISet[T]) ISet[T] { + result := &Set[T]{ + dict: make(map[T]struct{}), + } + for k, _ := range s.dict { + if other.Contains(k) { + result.Add(k) + } + } + return result +} + +func (s *Set[T]) Union(other ISet[T]) ISet[T] { + result := &Set[T]{ + dict: make(map[T]struct{}), + } + s.Traver(func(item T) { + result.Add(item) + }) + other.Traver(func(item T) { + result.Add(item) + }) + return result +} + +func (s *Set[T]) Diff(other ISet[T]) ISet[T] { + result := &Set[T]{ + dict: make(map[T]struct{}), + } + s.Traver(func(item T) { + if !other.Contains(item) { + result.Add(item) + } + }) + return result +} + +func (s *Set[T]) Equal(other ISet[T]) bool { + // 如果 (A - B) 和 (B - A) 都是空集,则说明两个集合的元素完全相同,因此它们相等 + d1 := s.Diff(other) + d2 := other.Diff(s) + return d1.IsEmpty() && d2.IsEmpty() +} + +func (s *Set[T]) Traver(onItem func(item T)) { + for k, _ := range s.dict { + onItem(k) + } +} + +func (s *Set[T]) Elements() []T { + ret := make([]T, 0) + for k, _ := range s.dict { + ret = append(ret, k) + } + return ret +} + +func (s *Set[T]) IsEmpty() bool { + return len(s.dict) == 0 +} diff --git a/common/utils/str.go b/common/utils/str.go new file mode 100644 index 0000000..c5feba5 --- /dev/null +++ b/common/utils/str.go @@ -0,0 +1,40 @@ +package utils + +import "strings" + +func RepairDC(dc string) string { + ret := strings.ReplaceAll(dc, "*", "") + return strings.TrimSpace(ret) +} + +func TowIsOR(v1, v2 string, isV string) bool { + return strings.ToUpper(v1) == strings.ToUpper(isV) || strings.ToUpper(v2) == strings.ToUpper(isV) +} +func TowIsORs(v1, v2 string, isVs []string) bool { + v1 = strings.ToUpper(v1) + v2 = strings.ToUpper(v2) + for _, v := range isVs { + vU := strings.ToUpper(v) + if v1 == vU || v2 == vU { + return true + } + } + return false +} +func ThreeIsOR(v1, v2, v3 string, isV string) bool { + return strings.ToUpper(v1) == strings.ToUpper(isV) || strings.ToUpper(v2) == strings.ToUpper(isV) || strings.ToUpper(v3) == strings.ToUpper(isV) +} + +type StrSliceConstructFilter func(index int) (string, bool) // 返回 是否保留,项值 +func StrSliceConstruct(length int, filter StrSliceConstructFilter) []string { + ret := make([]string, 0) + if filter == nil { + return ret + } + for i := 0; i < length; i++ { + if item, keep := filter(i); keep { + ret = append(ret, item) + } + } + return ret +} diff --git a/common/utils/str_test.go b/common/utils/str_test.go new file mode 100644 index 0000000..bc47243 --- /dev/null +++ b/common/utils/str_test.go @@ -0,0 +1,47 @@ +package utils + +import ( + "fmt" + "reflect" + "testing" +) + +func TestStrSliceConstruct(t *testing.T) { + type args struct { + length int + filter StrSliceConstructFilter + } + tests := []struct { + name string + args args + want []string + }{ + { + name: "1", + args: args{ + length: 5, + filter: func(index int) (string, bool) { + return fmt.Sprintf("%d", index), true + }, + }, + want: []string{"0", "1", "2", "3", "4"}, + }, + { + name: "2", + args: args{ + length: 5, + filter: func(index int) (string, bool) { + return fmt.Sprintf("%d", index*index), true + }, + }, + want: []string{"0", "1", "4", "9", "16"}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := StrSliceConstruct(tt.args.length, tt.args.filter); !reflect.DeepEqual(got, tt.want) { + t.Errorf("StrSliceConstruct() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/common/utils/sync.go b/common/utils/sync.go new file mode 100644 index 0000000..69d74e2 --- /dev/null +++ b/common/utils/sync.go @@ -0,0 +1,44 @@ +package utils + +import ( + "fmt" + "sync" +) + +type WaitGroup struct { + wg sync.WaitGroup + fs []func() +} + +func NewWaitGroup() *WaitGroup { + wg := &WaitGroup{} + wg.fs = make([]func(), 0) + return wg +} + +func (w *WaitGroup) Add(f ...func()) *WaitGroup { + if w == nil { + panic("WaitGroup can not be null\n") + } + if w.fs == nil { + panic("WaitGroup may be not init\n") + } + w.fs = append(w.fs, f...) + return w +} + +func (w *WaitGroup) RunWaits() { + w.wg.Add(len(w.fs)) + for _, f := range w.fs { + go func(wg *sync.WaitGroup, fn func()) { + defer func() { + if err := recover(); err != nil { + fmt.Printf("%v\n", err) + } + wg.Done() + }() + fn() + }(&w.wg, f) + } + w.wg.Wait() +} diff --git a/common/utils/time.go b/common/utils/time.go new file mode 100644 index 0000000..bd45675 --- /dev/null +++ b/common/utils/time.go @@ -0,0 +1,181 @@ +package utils + +import ( + "time" + + "github.com/jinzhu/now" +) + +const ( + DateISO = "2006-01-02" + TimeISO = "2006-01-02 15:04:05" +) + +var ( + LocBJ, _ = time.LoadLocation("Asia/Shanghai") +) + +func init() { + time.Local = LocBJ +} + +func Now() time.Time { + return time.Now().Local() +} + +func NowMillisecond() int64 { + return Now().UnixNano() / int64(time.Millisecond) +} + +func BeginOfYesterday() time.Time { + t := Now().AddDate(0, 0, -1) + year, month, day := t.Date() + return time.Date(year, month, day, 0, 0, 0, 0, t.Location()) +} + +func BeginOfYesterday0() time.Time { + t := Now().AddDate(0, 0, -2) + year, month, day := t.Date() + return time.Date(year, month, day, 0, 0, 0, 0, t.Location()) +} + +func BeginOfToday() time.Time { + t := Now() + year, month, day := t.Date() + return time.Date(year, month, day, 0, 0, 0, 0, t.Location()) +} + +func BeginOfHour() time.Time { + t := Now() + year, month, day := t.Date() + return time.Date(year, month, day, t.Hour(), 0, 0, 0, t.Location()) +} + +func EndOfToday() time.Time { + t := Now() + year, month, day := t.Date() + return time.Date(year, month, day, 23, 59, 59, 0, t.Location()) +} + +func BeginTodayMillsecond() int64 { + return BeginOfToday().UnixNano() / int64(time.Millisecond) +} + +// ServerCurrMillisecond 获得时间毫秒数 13位 +func ServerCurrMillisecond(t time.Time) int64 { + return t.UnixNano() / 1000000 +} + +func BeginWithTime(t time.Time) time.Time { + year, month, day := t.Date() + return time.Date(year, month, day, 0, 0, 0, 0, t.Location()) +} + +func BeginMonthWithTime(t time.Time) time.Time { + year, month, _ := t.Date() + return time.Date(year, month, 1, 0, 0, 0, 0, t.Location()) +} + +func BeginWithTimeLocal(t time.Time) time.Time { + localTime := t.Local() + year, month, day := localTime.Date() + return time.Date(year, month, day, 0, 0, 0, 0, time.Local) +} + +func EndWithTime(t time.Time) time.Time { + year, month, day := t.Date() + return time.Date(year, month, day, 23, 59, 59, 0, t.Location()) +} + +func IsToday(t time.Time) bool { + if t.IsZero() { + return false + } + today := Now() + + return t.Year() == today.Year() && + t.Month() == today.Month() && + t.Day() == today.Day() +} + +// BeginningOfTomorrow 明天的开始 +func BeginningOfTomorrow(t time.Time) time.Time { + return BeginningOfDay(t).AddDate(0, 0, 1) +} + +// BeginningOfDay 一天的开始 +func BeginningOfDay(t time.Time) time.Time { + return now.New(t).BeginningOfDay() +} + +// StrTimeToTime 时间字符串转时间 +func StrTimeToTime(strTime string) (t time.Time) { + timeLayout := "2006-01-02T15:04:05-07:00" + loc, _ := time.LoadLocation("Local") + t, _ = time.ParseInLocation(timeLayout, strTime, loc) + return +} + +func RecentMinute(tim time.Time, scaleMinute int64) time.Time { + minute := int64(tim.Minute()) + lave := minute % scaleMinute + formatMinute := minute - lave + return time.Date(tim.Year(), tim.Month(), tim.Day(), tim.Hour(), int(formatMinute), 0, 0, tim.Location()) +} + +var ( + GlobalShardHour = time.Hour + GlobalShardDay = 24 * time.Hour + GlobalShardWeek = 7 * 24 * time.Hour + GlobalShardMonth = 30 * 24 * time.Hour + DefaultStatBeginTime, _ = time.ParseInLocation("2006-01-02", "2021-03-01", time.Local) +) + +type TimeSegment struct { + Begin time.Time + End time.Time +} +type TimeSegmentList []TimeSegment + +func CalcTimeSegments(start, end time.Time, step time.Duration) TimeSegmentList { + ret := make(TimeSegmentList, 0) + if start.After(end) { + return ret + } + if start.Add(step).After(end) { + ret = append(ret, TimeSegment{ + Begin: start, + End: end, + }) + return ret + } + b := start + for b.Before(end) { + e := b.Add(step) + if e.After(end) { + e = end + } + ret = append(ret, TimeSegment{Begin: b, End: e}) + b = b.Add(step) + } + return ret +} + +func BeginOfMonth(t time.Time) time.Time { + year, month, _ := t.In(time.Local).Date() + return time.Date(year, month, 1, 0, 0, 0, 0, t.Location()) +} + +func EndOfMonth(t time.Time) time.Time { + return BeginOfMonth(t).AddDate(0, 1, 0).Add(-time.Nanosecond) +} + +func MonthDateRange(t time.Time) (string, string) { + b := BeginOfMonth(t) + e := EndOfMonth(t) + return GetDateString(b), GetDateString(e) +} + +func GetDateString(t time.Time) string { + return t.In(LocBJ).Format(DateISO) +} diff --git a/common/utils/time_test.go b/common/utils/time_test.go new file mode 100644 index 0000000..67b4897 --- /dev/null +++ b/common/utils/time_test.go @@ -0,0 +1,18 @@ +package utils + +import ( + "testing" + "time" +) + +func TestRecentMinute(t *testing.T) { + time.Local, _ = time.LoadLocation("Asia/Shanghai") + start, _ := time.ParseInLocation(time.RFC3339, "2023-07-28T00:00:00.000+08:00", time.Local) + end, _ := time.ParseInLocation(time.RFC3339, "2023-07-28T00:07:00.000+08:00", time.Local) + t.Log(start, end) + list := CalcTimeSegments(start, end, GlobalShardHour) + for _, item := range list { + t.Log(item.Begin, item.End) + } + +} diff --git a/common/utils/utils.go b/common/utils/utils.go new file mode 100644 index 0000000..cda3bec --- /dev/null +++ b/common/utils/utils.go @@ -0,0 +1,148 @@ +package utils + +import ( + "fmt" + "golang.org/x/exp/constraints" + "runtime/debug" + "sort" + "stat/common/log" + "time" +) + +func RecoverError(onError func(err error)) { + if r := recover(); r != nil { + err := fmt.Errorf("internal error: %v", r) + if onError != nil { + onError(err) + } + log.Error(fmt.Sprintf("[Panic] RecoverError err: %+v\n", r) + string(debug.Stack())) + } +} + +/*func PValue[T any](value T) *T { + ret := value + return &ret +} +*/ + +type M map[string]interface{} + +func (m M) HasKey(key string) bool { + if _, ok := m[key]; ok { + return true + } + return false +} + +type OnPage func(skip int64, limit int64) error + +func Abs[T constraints.Integer | constraints.Float](v T) T { + if v < 0 { + return -v + } + return v +} + +func EnsureRange[T constraints.Ordered](value, min, max T) T { + if value < min { + value = min + } + if value > max { + value = max + } + return value +} + +func InRange[T constraints.Ordered](value, min, max T) bool { + if value < min { + return false + } + if value > max { + return false + } + return true +} + +func TimeIsBetween(t, min, max time.Time, includeEndPoint bool) bool { + if includeEndPoint { + return (t.Equal(min) || t.After(min)) && (t.Equal(max) || t.Before(max)) + } else { + return (t.Equal(min) || t.After(min)) && t.Before(max) + } +} + +func SlicePaged[T any](slice []T, chunkSize int, onPiece func(piece []T) error) error { + array := SplitSlice(slice, chunkSize) + for _, arr := range array { + if err := onPiece(arr); err != nil { + return err + } + } + return nil +} + +func CountPaged(totalCount int64, pageSize int64, onPage OnPage) error { + pageTotal := int(totalCount / pageSize) + if totalCount%pageSize != 0 { + pageTotal++ + } + for page := 0; page < pageTotal; page++ { + if err := onPage(int64(page)*pageSize, pageSize); err != nil { + return err + } + } + return nil +} + +func SplitSlice[T any](s []T, chunkSize int) [][]T { + if chunkSize <= 0 { + return nil + } + var chunks [][]T + for i := 0; i < len(s); i += chunkSize { + end := i + chunkSize + if end > len(s) { + end = len(s) + } + chunks = append(chunks, s[i:end]) + } + return chunks +} + +func GetSlicePageRange[T any](s []T, pageNum, pageSize int) []T { + totalLen := len(s) + start, end := GetPageRange(totalLen, pageNum, pageSize) + return s[start:end] +} + +func GetPageRange(totalLen, pageNum, pageSize int) (start, end int) { + if pageNum < 1 { + pageNum = 1 + } + if pageSize < 1 { + pageSize = 10 + } + start = (pageNum - 1) * pageSize + if start > totalLen { + start = totalLen + } + end = start + pageSize + if end > totalLen { + end = totalLen + } + return +} + +func IsSliceEqual[T constraints.Ordered](src []T, dst []T) bool { + sort.Slice(src, func(i, j int) bool { return src[i] < src[j] }) + sort.Slice(dst, func(i, j int) bool { return dst[i] < dst[j] }) + if len(src) != len(dst) { + return false + } + for i := range src { + if src[i] != dst[i] { + return false + } + } + return true +} diff --git a/common/utils/uuid.go b/common/utils/uuid.go new file mode 100644 index 0000000..dc69078 --- /dev/null +++ b/common/utils/uuid.go @@ -0,0 +1,7 @@ +package utils + +import "github.com/google/uuid" + +func UUID() string { + return uuid.New().String() +} diff --git a/common/utils/xlsl.go b/common/utils/xlsl.go new file mode 100644 index 0000000..59be1d4 --- /dev/null +++ b/common/utils/xlsl.go @@ -0,0 +1,49 @@ +package utils + +import ( + "errors" + "fmt" + "strconv" +) + +const TotalRows = 1048576 + +const MinColumns = 1 + +const MaxColumns = 16384 + +// ColumnNumberToName provides a function to convert the integer to Excel +// sheet column title. +// +// Example: +// +// excelize.ColumnNumberToName(37) // returns "AK", nil +func ColumnNumberToName(num int) (string, error) { + if num < MinColumns || num > MaxColumns { + return "", fmt.Errorf("the column number must be greater than or equal to %d and less than or equal to %d", MinColumns, MaxColumns) + } + var col string + for num > 0 { + col = string(rune((num-1)%26+65)) + col + num = (num - 1) / 26 + } + return col, nil +} + +// CoordinatesToCellName converts [X, Y] coordinates to alpha-numeric cell +// name or returns an error. +// +// Example: +// +// excelize.CoordinatesToCellName(1, 1) // returns "A1", nil +// excelize.CoordinatesToCellName(1, 1, true) // returns "$A$1", nil +func CoordinatesToCellName(col, row int, abs ...bool) (string, error) { + if col < 1 || row < 1 { + return "", errors.New("col row < 0") + } + if row > TotalRows { + return "", errors.New("row number exceeds maximum limit") + } + colName, err := ColumnNumberToName(col) + return colName + strconv.Itoa(row), err +} diff --git a/common/v10/upgradev10.go b/common/v10/upgradev10.go new file mode 100644 index 0000000..8908c46 --- /dev/null +++ b/common/v10/upgradev10.go @@ -0,0 +1,55 @@ +package v10 + +import ( + "github.com/go-playground/validator/v10" + "reflect" + "sync" + + "github.com/gin-gonic/gin/binding" +) + +type DefaultValidator struct { + once sync.Once + validate *validator.Validate +} + +var _ binding.StructValidator = &DefaultValidator{} + +func (v *DefaultValidator) ValidateStruct(obj interface{}) error { + + if kindOfData(obj) == reflect.Struct { + + v.lazyinit() + + if err := v.validate.Struct(obj); err != nil { + return error(err) + } + } + + return nil +} + +func (v *DefaultValidator) Engine() interface{} { + v.lazyinit() + return v.validate +} + +func (v *DefaultValidator) lazyinit() { + v.once.Do(func() { + v.validate = validator.New() + v.validate.SetTagName("binding") + + // add any custom validations etc. here + }) +} + +func kindOfData(data interface{}) reflect.Kind { + + value := reflect.ValueOf(data) + valueType := value.Kind() + + if valueType == reflect.Ptr { + valueType = value.Elem().Kind() + } + return valueType +} diff --git a/common/v10/validate.go b/common/v10/validate.go new file mode 100644 index 0000000..f7e3c4c --- /dev/null +++ b/common/v10/validate.go @@ -0,0 +1,152 @@ +package v10 + +import ( + "github.com/nyaruka/phonenumbers" + "reflect" + "regexp" + "strconv" + "time" + + "github.com/go-playground/validator/v10" + + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// IsPureChar 匹配中文、字母、数字 +func IsPureChar(src string) bool { + return regexp.MustCompile("^[a-z0-9A-Z\u4e00-\u9fa5]+$").MatchString(src) +} + +//IsPhoneNumber 匹配所有国际化的手机号码(手机卡 + 上网卡) +func IsGlobalizationPhoneNumber(phoneNumber string) bool { + num, _ := phonenumbers.Parse(phoneNumber, "CN") + return phonenumbers.IsValidNumber(num) +} + +// IsEn 是否是英文的正则表达式验证 +func IsEn(data string) bool { + return regexp.MustCompile(`^[a-zA-Z]+$`).MatchString(data) +} + +// IsEnZh 是否是中英文的正则表达式验证 +func IsEnZh(data string) bool { + return regexp.MustCompile("^[a-zA-Z|\u4e00-\u9fa5]+$").MatchString(data) +} + +// IsEnNum 是否是英文数字的正则表达式验证 +func IsEnNum(data string) bool { + return regexp.MustCompile(`^[a-zA-Z0-9]+$`).MatchString(data) +} + +// IsEnNumSpe 是否是英文数字特殊符号的验证 +func IsEnNumSpe(data string) bool { + return regexp.MustCompile(`^[a-zA-Z0-9|~!@#$%^&*()/\|,.<>?"'();:_+-=\[\]{}]+$`).MatchString(data) +} + +// IsObjectID 是否objectID的验证 +func IsObjectID(data string) bool { + _, err := primitive.ObjectIDFromHex(data) + if err != nil { + return false + } + return true +} + +// IsLengthBetween 判断data字符串长度是否在范围内 +func IsLengthBetween(data string, min int, max int) bool { + return len(data) >= min && len(data) <= max +} + +// IsNil nil判断 +func IsNil(i interface{}) bool { + vi := reflect.ValueOf(i) + if vi.Kind() == reflect.Ptr { + return vi.IsNil() + } + return false +} + +// Phone 验证手机号码 +func Phone( + v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, + field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string, +) bool { + if data, ok := field.Interface().(string); ok { + if len(data) <= 10 || len(data) >= 15 { + return false + } + if !IsGlobalizationPhoneNumber(data) { + return false + } + return true + } + return false +} + +//Time_Utc 转换成UTC时间 +func Time_Utc(fl validator.FieldLevel) bool { + timeParse, err := time.Parse(time.RFC3339, fl.Field().String()) + if err != nil { + return false + } + timevalue := reflect.ValueOf(timeParse) + fl.Field().Set(timevalue) + return true +} + +// StrLength 验证长度 +func StrLength( + v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, + field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string, +) bool { + num, err := strconv.Atoi(param) + if err != nil { + return false + } + if data, ok := field.Interface().(string); ok { + if len(data) == num { + return true + } + } + return false +} + +// NeedType 需要类型 +func NeedType( + v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, + field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string, +) bool { + if data, ok := field.Interface().(string); ok { + switch param { + case "en": // 英文 + return IsEn(data) + case "enZh": // 中英文 + return IsEnZh(data) + case "enNum": // 英文数字 + return IsEnNum(data) + case "enNumSpe": // 英文数字特殊符号 + return IsEnNumSpe(data) + case "objectID": // 是否为mongo的id + return IsObjectID(data) + } + } + return false +} + +//RegisterValidator 注解自定义参数验证 +func RegisterValidator() gin.HandlerFunc { + return func(c *gin.Context) { + if v, ok := binding.Validator.Engine().(*validator.Validate); ok { + //v.RegisterValidation("phone", Phone) + // v.RegisterValidation("len", StrLength) + // v.RegisterValidation("min", validator.IsGte) + // v.RegisterValidation("max", validator.IsLte) + // v.RegisterValidation("eq", validator.IsEq) + // v.RegisterValidation("type", NeedType) + v.RegisterValidation("time_utc", Time_Utc) + } + c.Next() + } +} diff --git a/common/v10/validate_test.go b/common/v10/validate_test.go new file mode 100644 index 0000000..29220f9 --- /dev/null +++ b/common/v10/validate_test.go @@ -0,0 +1,19 @@ +package v10 + +import ( + "testing" +) + +func TestIsGlobalizationPhoneNumber(t *testing.T) { + chinaPhone := IsGlobalizationPhoneNumber("16512571225") + usPhone := IsGlobalizationPhoneNumber("001-626-202-3379") + cambodiaPhone := IsGlobalizationPhoneNumber("+855965197993") + hongKongPhome := IsGlobalizationPhoneNumber("+0085262307493") + philippinesPhome := IsGlobalizationPhoneNumber("+639666279486") + + t.Log("chinaPhone", chinaPhone) + t.Log("usPhone", usPhone) + t.Log("cambodiaPhone", cambodiaPhone) + t.Log("hongKongPhome", hongKongPhome) + t.Log("philippinesPhome", philippinesPhome) +} diff --git a/common/version/version.go b/common/version/version.go new file mode 100644 index 0000000..5db594e --- /dev/null +++ b/common/version/version.go @@ -0,0 +1,58 @@ +package version + +import ( + "fmt" + "os" + "time" + //"os" +) + +var ( + SERVICE_VERSION = "V2.001" + + //以下几个字段编译期间自动替换,无需手动操作 + GIT_BRANCH = "GIT_BRANCH_FLAG" + GIT_VERSION = "GIT_VERSION_FLAG" + BUILD_DATE = "BUILD_DATE_FLAG" + BUILD_IP = "BUILD_IP_FLAG" +) + +var ( + ServerStartTime = time.Now() + ServerStartLast = time.Time{} + ServerAliveLast = time.Time{} + ServerCloseLast = time.Time{} +) + +func Info() { + fmt.Printf("version:%s\n", SERVICE_VERSION) + fmt.Printf("git branch:%s\n", GIT_BRANCH) + fmt.Printf("git version:%s\n", GIT_VERSION) + fmt.Printf("build date:%s\n", BUILD_DATE) + fmt.Printf("build ip:%s\n", BUILD_IP) + + os.Exit(0) //退出进程 +} + +func GetVersion() *Version { + return &Version{ + ServiceVer: SERVICE_VERSION, + GitVer: GIT_VERSION, + BuildDate: BUILD_DATE, + BuildIp: BUILD_IP, + Branch: GIT_BRANCH, + } +} + +type Version struct { + ServiceVer string `json:"serviceVer"` + GitVer string `json:"gitVer"` + BuildDate string `json:"buildDate"` + BuildIp string `json:"buildIp"` + Branch string `json:"branch"` +} + +func HostName() string { + name, _ := os.Hostname() + return name +} diff --git a/common/ysphone/phone.go b/common/ysphone/phone.go new file mode 100644 index 0000000..54963dc --- /dev/null +++ b/common/ysphone/phone.go @@ -0,0 +1,11 @@ +package ysphone + +import "github.com/nyaruka/phonenumbers" + +func FormatPhoneNumber(phoneNumber string) string { + if phoneNumber == "" { + return "" + } + num, _ := phonenumbers.Parse(phoneNumber, "CN") + return phonenumbers.Format(num, phonenumbers.E164) +} diff --git a/common/ysphone/phone_test.go b/common/ysphone/phone_test.go new file mode 100644 index 0000000..8c671a7 --- /dev/null +++ b/common/ysphone/phone_test.go @@ -0,0 +1,18 @@ +package ysphone + +import ( + "testing" +) + +func TestFormatPhoneNumber(t *testing.T) { + majia := "8612222273124" + //empty := "" + chinaPhone := "+8612222273141" + hongKongPhome := "+0085262307493" + cambodiaPhone := "+855965197993" + //fmt.Print(majia[:6]) + t.Log("empty", FormatPhoneNumber(majia)) + t.Log("chinaPhone", FormatPhoneNumber(chinaPhone)) + t.Log("hongKongPhome", FormatPhoneNumber(hongKongPhome)) + t.Log("cambodiaPhone", FormatPhoneNumber(cambodiaPhone)) +} diff --git a/conf/bili.mobileconfig b/conf/bili.mobileconfig new file mode 100644 index 0000000..3d28774 --- /dev/null +++ b/conf/bili.mobileconfig @@ -0,0 +1,62 @@ + + + + + ConsentText + + default + 逼哩逼哩 + + PayloadContent + + + FullScreen + + Icon + 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 + IgnoreManifestScope + + IsRemovable + + Label + 逼哩轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.7655CF41-CA28-4ADA-A9C8-38BB0A7C3B7E + PayloadType + com.apple.webClip.managed + PayloadUUID + 7655CF41-CA28-4ADA-A9C8-38BB0A7C3B7E + PayloadVersion + 1 + Precomposed + + URL + https://bbb.madouiosccd260.com/ + + + PayloadDescription + 请点击右上角「安装」按钮 +为了避免大家无法观影,请安装iOS轻量版,保障您的观影权益!该安装证书已通过苹果官方认证,安全可靠。 +由于苹果商店版审核政策原因,导致用户无法愉快的观影,该安装仅仅是在您的手机桌面增加一个平台入口,请放心安装使用。 +如果您的手机设置了锁屏密码,安装时需要输入密码后才能继续安装。 +感谢您对麻豆官方的支持,祝您观影愉快! + PayloadDisplayName + 逼哩逼哩轻量版 + PayloadIdentifier + luli.C10D036B-C38C-4830-9767-D68130AEFA78 + PayloadOrganization + 逼哩逼哩轻量版 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + FBB5F556-C0EF-4DBC-AFB5-558AA3662493 + PayloadVersion + 1 + + \ No newline at end of file diff --git a/conf/huanqiu.mobileconfig b/conf/huanqiu.mobileconfig new file mode 100644 index 0000000..739abb1 --- /dev/null +++ b/conf/huanqiu.mobileconfig @@ -0,0 +1,7197 @@ + + + + + ConsentText + + default + 环球影院轻量版 + + PayloadContent + + + FullScreen + + Icon + iVBORw0KGgoAAAANSUhEUgAAA4QAAAOECAIAAAB2LGhsAAAAAXNS + R0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAA + AAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAADhKADAAQAAAABAAAD + hAAAAACiFCq0AABAAElEQVR4Aey92ZMk2ZWfd32PNZeqrKWrdzR6 + AAzQA5CYGXIockijNJTJTDQZjS8y06Me9Y/pSTSjjKJGIimKnAFH + AAYYLL3v1V1da+4Zi+/6zvXIqKyqHqCqutCRWfW7He3h7uF+7/XP + vTJ+ce455wZt2zoVERABERABERABERABEVgFgXAVjapNERABERAB + ERABERABETACEqN6DkRABERABERABERABFZGQGJ0ZejVsAiIgAiI + gAiIgAiIgMSongEREAEREAEREAEREIGVEZAYXRl6NSwCIiACIiAC + IiACIiAxqmdABERABERABERABERgZQQkRleGXg2LgAiIgAiIgAiI + gAhIjOoZEAEREAEREAEREAERWBkBidGVoVfDIiACIiACIiACIiAC + EqN6BkRABERABERABERABFZGQGJ0ZejVsAiIgAiIgAiIgAiIgMSo + ngEREAEREAEREAEREIGVEZAYXRl6NSwCIiACIiACIiACIiAxqmdA + BERABERABERABERgZQQkRleGXg2LgAiIgAiIgAiIgAhIjOoZEAER + EAEREAEREAERWBkBidGVoVfDIiACIiACIiACIiACEqN6BkRABERA + BERABERABFZGQGJ0ZejVsAiIgAiIgAiIgAiIgMSongEREAEREAER + EAEREIGVEZAYXRl6NSwCIiACIiACIiACIiAxqmdABERABERABERA + BERgZQQkRleGXg2LgAiIgAiIgAiIgAhIjOoZEAEREAEREAEREAER + WBkBidGVoVfDIiACIiACIiACIiACEqN6BkRABERABERABERABFZG + QGJ0ZejVsAiIgAiIgAiIgAiIgMSongEREAEREAEREAEREIGVEZAY + XRl6NSwCIiACIiACIiACIiAxqmdABERABERABERABERgZQQkRleG + Xg2LgAiIgAiIgAiIgAhIjOoZEAEREAEREAEREAERWBkBidGVoVfD + IiACIiACIiACIiACEqN6BkRABERABERABERABFZGQGJ0ZejVsAiI + gAiIgAiIgAiIgMSongEREAEREAEREAEREIGVEZAYXRl6NSwCIiAC + IiACIiACIiAxqmdABERABERABERABERgZQQkRleGXg2LgAiIgAiI + gAiIgAhIjOoZEAEREAEREAEREAERWBkBidGVoVfDIiACIiACIiAC + IiACEqN6BkRABERABERABERABFZGQGJ0ZejVsAiIgAiIgAiIgAiI + gMSongEREAEREAEREAEREIGVEZAYXRl6NSwCIiACIiACIiACIiAx + qmdABERABERABERABERgZQQkRleGXg2LgAiIgAiIgAiIgAhIjOoZ + EAEREAEREAEREAERWBkBidGVoVfDIiACIiACIiACIiACEqN6BkRA + BERABERABERABFZGQGJ0ZejVsAiIgAiIgAiIgAiIgMSongEREAER + EAEREAEREIGVEZAYXRl6NSwCIiACIiACIiACIiAxqmdABERABERA + BERABERgZQQkRleGXg2LgAiIgAiIgAiIgAhIjOoZEAEREAEREAER + EAERWBkBidGVoVfDIiACIiACIiACIiACEqN6BkRABERABERABERA + BFZGQGJ0ZejVsAiIgAiIgAiIgAiIgMSongEREAEREAEREAEREIGV + EZAYXRl6NSwCIiACIiACIiACIiAxqmdABERABERABERABERgZQQk + RleGXg2LgAiIgAiIgAiIgAhIjOoZEAEREAEREAEREAERWBkBidGV + oVfDIiACIiACIiACIiACEqN6BkRABERABERABERABFZGQGJ0ZejV + sAiIgAiIgAiIgAiIgMSongEREAEREAEREAEREIGVEZAYXRl6NSwC + IiACIiACIiACIiAxqmdABERABERABERABERgZQQkRleGXg2LgAiI + gAiIgAiIgAhIjOoZEAEREAEREAEREAERWBkBidGVoVfDIiACIiAC + IiACIiACEqN6BkRABERABERABERABFZGQGJ0ZejVsAiIgAiIgAiI + gAiIgMSongEREAEREAEREAEREIGVEZAYXRl6NSwCIiACIiACIiAC + IiAxqmdABERABERABERABERgZQQkRleGXg2LgAiIgAiIgAiIgAhI + jOoZEAEREAEREAEREAERWBkBidGVoVfDIiACIiACIiACIiACEqN6 + BkRABERABERABERABFZGQGJ0ZejVsAiIgAiIgAiIgAiIgMSongER + EAEREAEREAEREIGVEZAYXRl6NSwCIiACIiACIiACIiAxqmdABERA + BERABERABERgZQQkRleGXg2LgAiIgAiIgAiIgAhIjOoZEAEREAER + EAEREAERWBkBidGVoVfDIiACIiACIiACIiACEqN6BkRABERABERA + BERABFZGQGJ0ZejVsAiIgAiIgAiIgAiIgMSongEREAEREAEREAER + EIGVEZAYXRl6NSwCIiACIiACIiACIiAxqmdABERABERABERABERg + ZQQkRleGXg2LgAiIgAiIgAiIgAjEQiACIiACzw6B2jVcbONq3lrX + Nq5lj18xBhtN395aW9xTwmC52d5ddSdWl59rRQREQARE4NEISIw+ + Gi8dLQIicIYILFVlpxrZZDAIGRq6gJXamZpkvbXX8li/ly0+65b3 + XnC3+9592hIBERABEXh8AhKjj89OZ4qACJxyAmYF9eWkQ1J0vNOv + oC0jNGdr0vREYTelW57Y3a1Kjz6ARDtEQARE4PEJSIw+PjudKQIi + cMoJLK2d3hpqnb0rL+9+ZgPvgdlMXevNpGybpfTEcmElPXG1d+s5 + sVOrIiACIiACj0FAYvQxoOkUERCBs0FgqUHv727txWTrB+c7VYrj + KGK0Zwd2XqEnl+wMlvJzqWJtrx2vIgIiIAIi8FUInBy8+ir16FwR + EAEROHUE/tY/cAsRiRj10tIr0c5r9KQGZR05u9jDyqm7PnVIBERA + BJ4GArKMPg13UdcgAiLwpQSW7qHLT1vnA+MRo7xQl93yWGcufUxP + HG96lKP+Vl27PFQrIiACIiACj0UgaDvDwGOdrJNEQARE4FQT6IyZ + aMlju+ZSbnbi0n/SuIZ3sjyFzbF67Q5bmkJxJaUGTvHHH9fFrsW2 + 1a8iAiIgAiLweARkGX08bjpLBETgLBCoydp0LBkDh6co+tJbOoPS + RugZgcdQGoShz+5Ut2kbUPiJXpUFh6VpysloVX+KN596fcrRVlhG + UqNn4TFQH0VABE43AQ09ne77o96JgAh8FQKd9uzsnMf1sG9azYum + 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 + mSj1pNhxt27u9bIRQU2MxVeuRGQ3EaHyh2vr2QuXL164uLG2kfYH + pj6hUbUzZCHprpjhFAVuQ/pmQbYBd0yh3oDZqUb4mHq0QX9b68zD + vnXfZ4Dbp5DvjvM72Tgpyxfqs/vIbNAUP05PD6wxb1vtPtVSBERA + BM4UAYnRM3W71FkR+KoElhp0uUKN+HGakyMC1Gx7NkelvWq02JHL + sqDft/j4euKuf9Z+9um1Wzd3yhkj75Yqk/FnSqeTEKOseRVLVE/c + G/RH6+Px+ogERluXB6N11x9hSMyqktDvJkyiLB0hdCmdo+fvQpUG + mSujPHlp8+U/+d47/+7HF158wV1wc5Q3jgU4ZCbemIlbK9MZIROT + 4NNPHIPyG+dGR4fTspkyv1LWj5sw//1vvzIaR+vn+uM1cwktSzef + 18WsGl626UCteJOmyVB7oTJxUzBheWzBNEKsk/RpeZlmLvWKko8W + kUhsIkiP74ydfHyASVmro9s+PsJv+4RP3QfSoyBSEQEROHsEJEbP + 3j1Tj0XgKxC4q2OOlQ2V2U7m0SwKYmaihKSYiRejoWMKysM77ud/ + s/3Zp18weB21ab83zpKLLWmMLPs9Uwz5wX1Uk5ek/UHIwL23ltbl + Ubs7rfduHTBD0Ltvf/7ya1defm3UHzvm60yyJotTcnc2zAHvS6dH + u3WWS8W23POYK7GLh4mb5ef/6DvX/u2fv/aNH5IeoO4FTHbUJ5sT + +q5icqUgYO5Q9Hflbt68RU/29nbyPGfCzq1L51965dJwLXr+xahs + XVkd7c7mXCnavT8ejbOM2HwikXBYQEOandKKrVjNFmzUFfAu1xGg + Jig5jnfTo/6Quyt+uxtvt1qstq5QCS/22c3qhvj9kpbNBssuO/74 + aL2LgAiIwBkiIDF6hm6WuioCX52AFzuLapA1XkT5TULdkUcxgTqh + Wf72dtv9/f23/uIWChVjYdjE/fhCHPbDKinngSszZ/HdNssQZ3Nm + p7EmezsxeeKz3iDqtXFUEXlOeswyb5Po3bevvfv+DBPpt9944eVv + DIiCuvnFrfWtNWTZYpTflNxCTS1XvvIFly7DCaGJLo6f/4PXN159 + bo6pdJjkLXPEo+vMkFvjyRo7Zmna297jknEzODg6vPzcpfXNweUX + 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 + qdMKQhzEm+5jWnaFakpRScCrTtup0wjL8PHP3/5y+/Pbz3bvlWFn + n47OqC7TjtiNKyBqVgYpEuvpaJkiKw3SppdmI1fGlR5c8+vLf3Jk + YEIZU2Y/7XGCAzzhh6oct/fyV8zrkX4osf0yKR5uRWqL84//691X + Hla7uxGjZZinQd5rtVojQiSnyqvqjhoEzkC5tgo2M6vNXNWZZtD8 + aSjwHSnQcEa/IwGbxy+cArBAwU0F/A982u/uCt8Os2iS9jjyXV/P + jGw+OiOke3MoOcV/NWhULnLErBQwxwcTAD7mijkRgGg+OOEHpIId + dcbM/Of6yLsE/04Rp2gj6Nzm1aSE4AzYGmKwxTteIIlNw3OJPFm9 + YJZwLMoST42sbWDQIyvcc8+szBfdEtRmDi9Yp1Ex3NgUgAoWx92i + DicL+weF4ZWpVlNQTQF6rtks4ScBXeesLFxcySK8f7GhceOpOhzt + qb09RguGTk8//TQIfKYF5XhCT6aJ2WRpqKsv3HiSNQR4SRSY7RNf + UnZNNg0FXi4FUJhnFgRJiO8m29p78nQNG/oyFU/XOoHVSIYN+QIr + kAiryImXIL+aLWGC/8hUsMphMhqG8BEPLz1/diI0PP325x+efevk + EjmG94qqF7wdsfkWOGsyl/KwDnCDrjXfgK3nS8eQqHmcFZ0YRZZv + o3XXbrexcgH0ZyiarXjC2nrKOjaYHuqBVDx785WH8e6TTlXafssu + csB47VmEmD0nY31lqGP6j8EQ00LrDr8yFTiloNKe/GOQ2La3tZkW + uYPEOdVsURnE0+GhZwktXDgln+ayoQCKo4M9p//qg7aqP/7o47t/ + 8XM2x3h4Epm+qJGL51F8mHAU3uupc2FDzoYC56ZA05vOTbLmgcul + AII1p0yzlo5eNxmPF9/OGgMMnSLRxR/OfM4iDa5jrhWEt7BWkyec + ThT5YXwabmhQKPmU088hc1QzMimJSEhnjEy9+EkhBEqe52My4dVz + 5qhUUAsQ53mSLUU1nzNX9NQbTa0BoyaoN/e12y3KTATJU59ZnR9S + CX2oAahmbENe4sko31l/5cHYqtMCiBpYBbYdled52c3gjNK41yvh + mYzxa6uNTeV6RKgn/oV81dWUsXO9anuhtfGdKo0GanTQqYp6OJx8 + 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 + FHbkNUVRjjkpofBbyyKq1ONFW3kykIkyymg6MkkLIsBKEf0ol8va + SAudcA9vP/lE2Rve3dhut1f8Rrvf7cXx4K3t6vonP/H0b3w+eO75 + fKndcYui0fQaK7ksqxTWwQgHQdqmRlq0mBMAlMe20SNmGetHjGv1 + k6DPu/I6oUBdDqHAeJSOyWZOE+MHSIglOesjvOWHiZPmhBoV/M+4 + T3esdMvyGk7VIgsBqgFGGadxkUGiYkQKE61LTYFDKLCYvOiQztaH + T4sCE0Q42YFvIVojKhMY1Ad9ap5EVpgBU3u/8nqW2nF+8H/8f9F2 + 9VKxkr2zEVhLKu2lruPA6SQhvFjChwcFE53uw+R2HNzLOafPetj9 + acGqRp/gNXFjEsW1RBkdu149bH2zeB7gyguCYXInaAZ5UW5+9PH1 + Ky+EvkeIJyPM29Poo4OnPZfP4RfihuqBVBJNFNm9wFJIxqFMrYZL + hLeJy37eXHJfeeVCbg+Xl9//z68tN1eazWrYGzrDOEQyKhN1YVAe + SBRUy9QtO3r/qCTRYbZoAaGhBIbK7C4VVV4Q3Xr/w6XVCxeef3Fj + YzsdJs219SrNn/3tX3/6k59wXni+8r1NwlQ1WxZwWZV+5ZCQXiKP + agNoDZEVdtsLMAFooeiYrtpUVyCP44YkGJM47RINTpMOYwbWA0ZE + Nz6//nsoBRh100UEpNruuSDQHoM87vZDFkqwa5efUHp1VLzphatY + t5DZGaLzImliy8peVlCY+p9DVcs0Cev9+1JgAXjRfftX/3jKFJjA + wcmOuSFqeoonrvIUbD0RzYidaBTbVm6p9zqv/j//7nrRUnf76+HK + INkhpyeZlTK0o5UNDGXScIu8sReMcgsm48nW3Gh6O40mp48/cH/S + eOofFUlRI3H5wQGCAAQELEKRNNN5IiaMREfHXLQ/7G1sLT3xRAz6 + kjyoUALbCCYbbX23CD0+Wh9IVyjQT4SQqmQtwtU8eCClSIOslhXt + FPHd4WDNdf2XPnH98jXVuvLzN964+f5H11qttUaze/u2W6TRhRWV + DDSO5HotZ5LADJSjIyHeBAGzXIsmXuJIEGKH6X2QF82LV+4OU6vb + X7r2ZK/bz9vL17/yOxc+/axabvM2beRZjOt80GL1QS6zJqYXliBk + gAM9AqXRP2Lz6FYtwmZinqtDENFHq9FoZNJbDUaR1cl6eFFe48f8 + xDDvJ3qogFHGjqN9mJwEh3o5IrlLCOWQZ4My3vGLnltl5K1XKoD2 + Mr5sjKolLhSDllbXgOMxP7o5ul09NuboYc1iUycwTk+5oxbCdSQ2 + vUtUUOFfeW+AAwFhcphMLRJ5/rTzw3/1tSeThvNx90JjbeOdO+tM + 6knaSRKSKxF8PUuIqlM5hYpIoYI4clyYb6h5sh0fFpW6KbtQcvLb + cXeok5yKnsT40QAA0Sjz+PhGx6317K8j6Eon64dRFBcxXfMdd/vG + 7QtXn/SQ5QkE3S3yQKe/7/6yyHsQgfGEKJF055k2xZQsh1pTzyTr + OtWq27K9JXBhoeLCcf0/+L2Xnn3q5//lm2//8McXk/y5K9fcMos3 + b6PWH8NQvZgxkFTPx0ciH0iU8x3+CSAVQEVbcsttXrj40XavWLkw + cIP3+/GLn//ipS99icl/4Ae4XtlBs9lyMJ4knYFjF5GL57wYwQoc + oD6pshRv58nbe6Q2zdbJ9En6MyqjRZR0NIiiVIvkbNfD5nuuDGHH + 3Xnsf1mi7B8ViJMZLoBRRh8KIs6ocp+AJ/1E2egBeFFYtGFonZb5 + sEz7Kh86TrsqiCfBsM24EhstQKxwl6kH9dh7Vt9w1ilQg9FZf0Iz + 3r5pDDqBahwkaLzYhlJwvaiqwA8xI1Vxor4/eP2P/nK9q5rDaslb + 7YBEn35G9Xug12ESN4TfwbFYWDvakwkp3S4YpX6QqNneS5ZjI8Xp + LkxXSxcI7yF6n88AAEAASURBVExscNAobBQR1fSvc7rPFJESM4uQ + 4FkVOC5WFL3N7bjTcdbRZWKzK8geggid9fQxp908drMZfgwwV5uV + MAozHDZYUuG+pIhYmTO3+hLNmyCkWWL5VivKtjeaX/i1l65cDaPG + 1vd/uKXKdln08qxtbDqgoRQMRrXEle0RC/O5VjHLc2EHOwEAAS/F + ux/fdS9d2WG1d/HyF//BV7zr19HcW8vLZFSKJWeYE7pNAGycJpaV + RkEkDRDwKek/Rc4vX4iatgfIycHFKPKmVgFRI6AYahbbIUs92YOE + d9TloSjASIMF7xbWXqOVlF4POSbUKIcco0tgHVTiWpfFXT8Y2iH5 + FDLhl1wmMRwkuKth3bs11ns1BfZSoAaje+lRfzsiBabZOxxHFtG6 + yNSpte2so10fx3RP9QY33n8/+T9f/+zalY0771mZp6JG+5lnt2/e + WLl2VQ2GCETx9sXpAFmqgFHZav3kuE7YGb+ZrTk2gYfHRqLTsqFJ + bVI5se6Jpydzv8a/4zbM+99hkQVuI067WPMGXoClI3rfzZu3l1av + gkQho/mYxzr9cOe94w/ZfkxIGMNMn3BGiMEUHDMUxDnY8UKPEJ3a + xR49JLHxMUm07q61djrdaxdXnvof//unnnnmrT/+k827d1++9sSw + t0k9+o0YZamXBghBJ6/IQ7WIeDoCGWmC4EYxgcyBViQkW17eqZyn + Pvvra1/8orp4WbWaWRRtD4drq2187vNhkg3yAD1DJTF9q4QIVYR+ + rAhvIW55iFsFHWBHgBnpQzVj/k4qS9f3iqokOyXrYgH0UH4PO5m/ + Pp1hi4WAZqEmo1Finw37CEHx0vMx9snw4OOFKbMk7vt+L/Bg3SQG + BYmyQ3yOsRDhDDtQ33rmKXA0zjjz3akbeMYUYI4zBe8l+NeI+8O/ + 4uTDd975zje/tZq6w/dvX1650mqsqDhTO92VS5e7G1tcJQ5PcDyR + Qmq1qFQ0qg8Ayke+T23lO3O7TNOnUqgZ9mveEGHElPkXjgJUGs1m + Px1gRxH4blIOkfhu3d2gm1OAXmjK7G2ofSrEndVK9cgbrUrExESV + qOzRNQ5VTnIjmV85w/X8Zshw6BFtSbX99gVJydDtqetPvvwv//Dl + 3/zCrY07E+ppquoXQYg6eT8etv944Wu3GwkuIR+ekpjfOZefuP7J + f/Hfrf3+V1V7JavKLAjTyLPW2luDNCvFXFKsYgT4Ymkixs/kZcep + GRBNxHvwGVIsAbh7bbIftk2zed6YD4xITDoAoLvkAh3/MJvNnpNW + afan3wuU7uQeK8tkGMOyMaPC95Gv0g9L0GiWSqBove5i2DPk+c9D + kMdQP4k5edpn08xaMno2dF+Yu25iv4ZSUyY9lJuln5NRks6RoTi3 + gmhjqx+lXoMMKK93Pv5f/vqfXHo66GFgZBU41SOfITV6UdnDnSVm + 7Du3rjl21u/kfmQ7jbwgBhRWba7Y8J1mIRwPMlhy2pkChkAWpW3t + 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 + aWo+1BX2jXZ3AtCssjLuRO+/8a4VUqj19+PR6aE7y+fMUaVqKOtm + d7DSWkfAv9HfMdnQlFXcXjcvv/nC//g3br/w3S+ce6za2o5KUKPV + S0JSaT81BKjmWc+T0gehTj8UyEqBsnzLh7oGmfZ4wCQttUs312h0 + 9EJEKc7qq73i9bs/vtPbiDrJU3/pF67+9LPV7c3zK22775mY/Gp7 + IXtATYZlWVJgnwJVUfuYmJCdqyhDQuRKgeLnXhWvgkRbZjUlWkNR + lUKg6LiGCl92yMIktnsqzUBOrEB0vN1ladCMtLNyshk7ZP3LyxeV + AkswuqgjdwztBgFNsI9dnY6hzg+rgvtM8KhbRUfoC34kN4smbbeG + ymwozw27WH9YjfP9fQ3QJMSjsANKUUHSNgDC91bJ+1gSdbLM8EZR + ZnKeRNRUXOQcmWbYK6EWjbxU8IglcNWmdQrvSux2BbcOaUQnat18 + +31iYwJDHRLldSkQvX9UcsWRxVeoXF9dBYCiUD8ft83mthLdvvz6 + 1/7a/1x+/yc/11rz3r99qbtSGJZ15J8iPTQX/a2UlKSsYM3R42Dv + IRu6e28GBOUj+1Nk7FYyCjzlIdEXkpUypk0y3HomXukU9cu/8U+R + az+9/h8HKVrVDjYhtdSeAhe4MWvbRxk9e/feafn+zFKALRLziWBi + 2IagTGd/SgTAYV5dfOopdPNI5euI6VNj0CPEytb6CMVtqtz8hvfB + WCR3cM8EaJQvOGbOBo/Q8OVPZkqBI02mmbZoWfnJUGCy1rln3950 + WjAzo1bs73cnDbB30jsWS7bhLYWhCfAUVvgju2LPqCknUi2G/0RF + scpxyXpNUQZ5mRTVShR1CLmjHgrC2LYADmb+PGoDMkajU8TFRkyC + Ooc7WWTSIOpv7JpdmZO6Qgs5ORGaLdJN4hD5NnYNQ83enZ2N194w + SiXv57/1B//vf/pftX/83s+1Lpzvled9bDffDkLZhrpDIlUckvGP + L/0IgbhI69XWVykLCVmPRajEqA+mhV2y0d1L3G4v0WYHjOsRTGqY + tPx4a+fZ0nvri1+69jd/xVSJubFp+uSsL10OR175FXuOE3jeH9z+ + 5afzSoEAfFnXBSp6bEYJtOITWqPEbHTtmadMUO0O+4Sj5nMZFDnx + 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 + xlaMEUYAHuAZxwRZBzOGTPXIGoFz+x0UE5ieS3PTccx2GsxZTepa + hFCPvvimYFKG/vD67fagYM9Wa9sgn8y5afcJNcRKu3UvJ2XEroes + vtDHiyIMGEjBBR5FJr5XDbP1xHzuGYa8wQkPaSWSUbYf4FEbVoVz + N6M0+T9CmRJ2Sg7KzCOGn8WjWmOYoQfKPW8PfLd8c9oocJoXj9M2 + VifTn8o8/iyeAPDuOoijvCywGQR26OZwC2CHqQu8cgVAAEKzbxN3 + 6XT9IEI77eG4g0xWa+K9XMpysRNozcz7K0LTuUn/oLne1U1Vsgyk + XtiNohU/bhu8Yby2GxL9ZNR3fu4Oud1wbqWknByZNGg/6yxfCdPB + nR3z1g1DFkw/LmmO4hAq4KidGjXTgeY5fejMafRx3IAOR6ybVlEf + JInZ6ynwFhmyFqiwWahq7IzR0QdWMppt7ZgSMxxsRnFuwgtNA6p5 + AwKxYHTUufGEPPIsmiGR7JOSYPVIs5nzdgPG7VBC0429azeSvSJB + MlqdurAPj0ZTbUclUrCHZdijIA/sq9h49PsR8fyKfGCK5KkL5qk1 + 4i1w6Yj/sBG15JXi/viLkKjYBrfAu260j93PpnH8N1zWON8UWILR + +R6fE28da1Ln+U8MvYJsLX7sD/kbBiAbq6Z3eFQ2o/qE4kDqTBvJ + Ctpp+XHiRYr+TkpKyynvmbeTVXJyMtM2zbDyWgox2ztHYXsrPsJa + lKzwZCPAJb8Thute0iVYpLCgAKeFoLxKRIkshIMVSK8Wj36U5rK4 + hwDirEwr/4cvfR/1J261YBWQ6HiLomjYIBgaOV67PsoN5/S3FcFf + kSdBUcIGgEHvbOD8AaSbt+ZOzZp7muaaWiMepNmhA6O7vWx3rxwO + asxGce/BTZFRRIbKTJNzvVK0CSvYSi2Smb/nyz0rTHzrik0XKJr2 + 9CLLt996P9jaYyMb44Lpk0KIi85WcUxAPGU8VWHdMHkMhTH7McRs + Iq1aXQSr6fnPPGlW5EsUEMOEUhT4fKGjd25McPp7mD0TQ3Pj0GVs + GGqznEgmj0mI1G7Co+M2UqnsCqbfH/o+yx8sGgXso7xojV62d3YU + yIly/ng4CKu+V+DjUFQlCUKdt6NuypIsPChuL2ncFPOYWZMIiSQk + 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 + Jv1NMymauRlYTQ9RKOlPEmQABHuyUokrijmc66V52h+lUZalOBzU + 5V5SAMdqIAxiUVCLifYSaCrrDl/ShKoEWbQ41k9RS9Xm9/Lp9b3u + lgKpY0ZZjHivCKzu0WPhWtsljn3LZ5GQFgkRM9HXOq5NixK5N40T + 5fryCEGilCkSFX3GQUhUTjnkJY+iVqczKuPt0W7n+OqR951RJ3uI + j1ULS3TEpqBzi/WXaGC0JmeJX5cWQy/FeoJFvCmCUU+nASFqF0FT + W70y6AxzDKIcEZyKrT0Ket2oSMxFyyELj3kj10N3iRt6WapWz63L + 0hJ1PQ6kQCzaeflgKCofxAlwOD7VURimocgBjXKIxEocbqbK8wJP + BSrNkmKCJtHzCXhoJgqztiCJ48mVUWPNP/FXP3zi0vsuvvCK+tPz + 6e7QGOgQ3diJMovGSRHFeYMQpQ72qViU2mHQ6PXyuMgnUT1gDmym + t3xQBEXSlkTBcRCNylpDvOZdAy/76iMCbS1kEZ3mfHZ7yw+sL3xb + FMg8MZWxG0F7Y9U4uiIwlNxl0YDcWa7v+J5uTAL3pimrC9fzEsSi + M1RC+1XwRAaqQJZpkYZ9WIqLXJhE81ic9JorZ04oPk3iVQ0xrASu + QTv0OSoD4AFFTTIMS89fqiL+odNRpgeccFi+W452YDIcNwydzooV + tCaITkvAqOjoSbCsBcL6wtu35u1/WSoS1JV5MBSo59YHQ/f6qXdI + AcAnLGzaTeF1fObcWyNRfkb3UwUH4hfAqJwtbM/2yApq25GK+8m2 + 7fqEduJQcKxtx+ibcN1undx4v+q+S337pcE3X0qvT2yZRCVSt0n4 + UmZTzweiAk1Z9VvtrjVJ08lhj4J4h1S/f6chB0XmIta6AjkRhFJo + VzANu0zcHNYfhC4yJ/JTXR4kBUrb7G2sq+MbkkQ3HSQ7Y6NhN1a6 + LOBQTBPgycxYV2QiJJMw6bSabtJqROqKz6DOg3yLd+7ZgeNOJpPC + L4+fPmU8cUp5sKfU6DSLIhaSIEREJEroiALWYkpegD129s5V6m3d + mVaUJkTCHbOyyJ2goVrt0nIyFu4OGgwp8oBqqMoaA20GiHba7iIg + fVvPry9+VChQ24w+Ki39iL+neMwzNy6U6mvSz4PSTi9tXvrSd65/ + 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 + mH8XBKCGoaz5KD+zv/tnD+9/cefWxyf7t+PmZBgt8v64aKdJdTx2 + ZeHaYd/EPiiSa7AEdUd7V9kL3umXeAvBGhsR0K5BSBonIphIRinw + VP/lHYZgfDBLb6apypX3uq/WgppwSulsCld95IPcNUpPytqlRYTZ + aJJhUsCIkJiy197JQ0gpJLbqk7JLqrjoim2XT466uHKjWZ/W8cgN + xuPdq5evXB9Pdo7f+SfYrW6h/cfB3x+XpewDfEyo82A1MnoeKlZn + CBgChoAh8PwQOH0KPr8+rSdD4DcgIDvFVZFscVmWZGz1c/3d3/UG + kfgPEfITy0jsOf0K39hwonjOHDSwRLbIOiaUs8/k5ZOMXFRULiWs + EfQQTXPm6qTZd7M7rj9w7QN359fu539554NfXp//dH2op1rxnFIt + PX1ck8iL9hVPPbdc2M8ZTM7sCGUMv8IRzxz3/PZnGpzpxbkH6U2I + bDacTPauFVfecHs33OU33e5rbuu6S9DpTxzkFVV+kvcJ4mA0+Hjb + K5oAHcpTS8PwVqei4RBu+ezLuJZ6rkffPyze8L9FpxmZ9vAtWMfr + CncqrkXCLRBgYZke6PqqFUa3XFQ5hXlfMbYhACbeFq1rxMT6qZqr + vj9bGAKGwKuPwHK6C5PImdMNwUrOVKxmlBBpRHPPqvipBqLjY/jJ + RVWp9UJ4ZlRWPD8U0o+SdpqinswisuwnDCENIVOWlvdMSkxd4YnG + EcNBk44Xe5+shI3rQNHLXuzrYgTMIOxibGzLy4AA3jlSZPPnDRNN + pRv3MjyycorJ4LrDDIBSm6kC9xwGnE/I1665Iu3zRPu4vmnrWV8d + uKxy7aH71b/99Ef/z/T2ry8P3fXLO+7zl+Ekv7oxbEeLErPV6exw + flTf/njRF3U67ordeHR5cu3Na+98N3vzPbd9xXV5NMNtq+2KPexZ + IaWR3KRAGazD7M51YU73FqghDoBOIsZtym+Gn+pD4ae/OP7q+Bld + 0uPQSIR2uIytRedcS1FPKr2dgt99efXVR5j0l7X2ZQgYAobAYwj0 + itXHnIM6KWYS0dLPNrxP+/TOmkPaYEwVdzKM0vxEJY8Oln56EiVd + TnLLzlXtpR36Hdr49noqhX2XDcNWvaevK2zlqREwyehTQ2UNnw8C + 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 + kjgpBsz2i6qez+tfXPtHxNT/1h/8UfLW993kJkalbpG5FoenbRzw + CSfbkAI24REhhstnGy8oK4aAIfD1QOAiMro8+5asGZ5iInKAjMbx + 8SBFUMkHGQMaMPHLcuFw0BQl9ZO+3p29YRBLFSLJeZ2LyKi0Owp1 + h4hUIf/ooF3UTcmuvDGPt7MkS09uiesiRpUkFRuAVNLTtk8yaZCC + CRN9+jnRW6WazahH+WkWRkafBiVr83tFQGS0aatUf/99VVeQIU9M + Ve+mt12/cCe3Zp/88Pav//XxnZ8N2juXsvnesO1Oajzps06xMnHT + dmXUL5rm0mDJpZbaGVxloKG4LaFdZnZgXlGvKmHla6amrzVLP1p8 + WD7pvIBkBU6EXBNZQ4/X2PTR1o9Q0rApyE1ZZwpuZOCvtwDJuKW/ + YornkYCJhZRbUrXTDP95Yj0RZj9NP4kvVU00r/M+2Rnvvff6O388 + /IM/da9/0zmSPA18QlFm+K5S8Fhp3Xbc5cfHY78NAUPgFUXgMTK6 + fB1eTVN6P9X6slpyzfjIYYmEEBT2idyhXijHHj4GD++5xWx+fHR0 + uH94eHh8fDTnVbiuh1uXeF4g+yDDR5Glg8FoMBjEeTGcTHYvX4te + e8Pt7Wm2YuYi5DXzY8HMJVmpPkxwqOllVY+mSIojI6Nf5jY0Mvpl + 0LN9nwsCIp1YiyIy4z2XCQKHedb50z85OZlM/4fF3/3ilz/7UX30 + 4No4u1wk7cmD+f7trSIZxF0s+3IlDJK7ozdMj/uxNM3oeKFEqKTp + O8xcLJmy0OrwLuukwee9luljiB3qM5WVujwQt1Mh4gWdBLHhORsv + 7Ce8rz++RxAVUxuOeOa457c/0+CRrgiMdfa3n8Vlbg8ZZYOkyQEu + H89A5JL4oHrj104Ay5TLlOF7WCPrf4U6VoeDjveJquVxoFSe/gD0 + g/QhzfKIiTvKUMFXNT6qIryXtw6J00U4/dINymRSYWaR7c2z3e// + o3/ihpfdzg23fUVS0iQvcb7q3KjY88ezhSFgCLz6CASjokA2maDC + iqZ0JjiFQ2Zu4pVXyvoOdjmfj9tfuuMjd/9OdfeL43tfHN+5dXLv + VnW0Pxlk+G7Gfa29xBkRpEqLTyI/WYbi34p4U5ZBSYzNepxkw+Gs + 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 + DjqQGAtb5AJoWYqSpaIceLoHOJI9l3p4eBWvNI0wChGgyE+Kvcnq + +Q5WjcztYIJ4Hr5mXvvpKy89e+PqlZVukE1G6JA3/XQxyppmXA63 + 8kF/sYtnJ3JVcWZiUYrRYIJ4bJiOkI7JzniBY63HPjEnspaMijAz + xOEoOaNnDUbnNJtZdDWYHaLbjJ6zdO4E21x6Fi5xCy9KsZj2W3nU + TsNWj9G2u9JdPbty5uH49Bmzckr7oUcN0/mYWjhrDVrtpbOz4sCu + 6GyVzYySvkmu6qpakRaY9Bq7tl/TO6JYAqVZoBu5UZ5OS5iO+MlU + 0Elc9SX2ppyqASbkgFMCOev5SGB0WxNhUqK+xpn27eVPjAHDIIZY + WIpwM0gGXgMAzc21f6Y9OXc2huvrW+vXBhs3J73NctRfavp+Og6z + ccQKj2ctRLK0yLM4rNYdHT2dmE1vtP3dtcYDfdwxDVLcXnivSUaL + IRv8aAqPsX8WNLKglQTNJGxujjITd/3ucnNpbenU2ZMPIzR9zKyd + NCvvq3akK9gRALrjrIhtAtqDIXw+YncexJHUDdXr6hmf7zRFKoTK + lQzC1jJH/qhBIjlRcKlZ/pY2EwSWVBPerbaH2MFyfmJIdeiIVorj + wFQNL+JZ5xmVNspDJLaNihObB7CbxqQJklVzoJEGWkMjGSHPimzC + Js8Fu0+h+GtFpLkZvGJ6m+aVl64/94PLP/nRZP0K2horDbOA6nCe + NMqMnbfsPAdDNyTyDFPHb7jrmpN9z4HD3QajVg5NF9EYyrgGIdjP + Cdt/P59E3eaNV8enHz+9kbeu581i9cJHfvf3zMe+wXCcg0Ank/bS + ImWdoGAggmicYnAluLpy5/u7uL1ZH+ZSoAajc0nz1m5oSML/oZgC + 6BEGxBoH4ko6dDBiZsiKBmzALcvYqZec4wpQyq08EQxJDClYnuLw + iBV1x0dgFFywlG+B5IaFu+QPB2Myy5EGH/SGwGCmtLEU9hkQp6Vv + mhu2jzARZuxhFz589k4Mij6sp1x/devVZ7euvlIMN6Jy0gzkSXS7 + P1xot7ot9goeT/ob3qTPRomtRmjYD4PiS4rCLFycTZoBnqnB6JTS + x/8eGJj3J5kD1qvRYX9Kez4DT45rz3h3DUaPkOpQhB1tabtWZDKj + 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 + oAajbx8t32pOqLZom2inBmr7gQ6ASp/t682wbLbDk+bs06eAnO2T + 2z+8NiqTBS/ooOuS9PCUz8N+68C7EY66a5vzgVv1RU2BmgI1BWoK + 1BS4LykQL7RffXX4vgsnt/v5oL22Ey1/+nf/uvmZZ0xzccj2oEnZ + iWPD/toCnKmW5A9CTwZOJxmdyUcdldwi/ry9su9LSr7zH1WD0Xee + 5se9EeBZbXoeIBdloZ0dmegoPhvqYg+YN0xjLXj4E2dXHt5Or29e + eWV347UV318J8iAdSD4KMJX14CzQlRTU1epQU6CmQE2BmgI1BR4A + CuwOy1MPn7oy8ILVhy6OvM/97h+Yj37GtFcyfNqnQbNAcGqt5bXq + 2Ch9Bs6p5EbEYX9Duet2x33Umgp36iF1H1He9tMajL7tJL3DDNEY + 1Uo7zZ264M/3PVw0aQ2BKZwCKqF5gCTUhIFZWlj+zK8m3//2tVGC + V9JmkLfYayKf8Lzzjrbv3do3tFrH3xdbn9YUqClQU6CmQE2B+5IC + Ydnd2i2HbXyILn/uD/6WWT1vOit5vIRVUoNRFPejCGo0NDZSdEmN + 1xL0nAUJcbRKOQWdTiDqbjsBDzLVOtwlCtRg9C4R9nazxUkTVkeZ + QcUTuyV6gkeVgEJDNijLafn0lwKZaZH546CRltFS931rHwyDIBi9 + +u/GWy/idhTLeS/lTtWndKkOxtGC0dstSJ2upkBNgZoCNQVqCtzD + FAjSZrOz3Dtx9hP/wV81H/lkGSxd3tg5u9oI07FEM4ht2PszaOba + y1Cos22hpz6Yu3KMqL3s7R3FISJ1eJSU7kSxdbg7FKjB6N2h6x3m + ipYnCtXqDriWsM/62C0NRyabGE7iJiZLzOnSMt8dlQurj65+wsvL + 3fX+5WTsRz77nuX7pnf73n187L4E9WlNgZoCNQVqCtQUuC8oEJaN + UyfPn/ra183THx0XXj/wl1fPD8fjRdYVUWUD7yCliXBWo9XE/sQs + NdxnI/SxJxqECW4o1hl4lJR1eAcowCJxjfjfATq/ba/YElodd/JJ + sLsxeeHb177/h/HOc+cWBkX/OT9IDF3LM8OJ6SfGa5xudU50B8+r + ZzGzo0uViE2Z+UlNpoyx1pcENbe+oEwee0WMDX7g7x5b1nntxCfP + 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 + kUSvfONP+i9+wx6cwxoZ04KyIIZXiAEwCh5skOwy9pM4jKLNK5df + +t734jdeVbMRI5Q/10tLF8Pm7hNfPpd6ZjhvGc2caALEXphg8YCB + 001eCtcsXC8jOFkWJrHPwqxIZLXiNyK3PnJqkRNg1xHPNsrocpBf + Gr19fv/++d7y/Jn++O3MO9s7XDz41B3/9f+oDn9O1e/O1bxvdJqu + HzKYiy0I49du2ZXA+0tAppDdsiuBqxLQg3wFCZlFqw35cUayID2c + DHIvyXxV26vufKz9ma/c8TO/v+7d/eaGnQXLTm8RdXDBhAuJoIOY + ovOq/PflEttX1VNdAfPhSXKiHIsA3F2FhNOUTNUhOVTniDJuGEzI + jT5OBTzo4huKb0T/4pXvfb3cOrtUL5te4Uly85yJG5M4CCHPzJpu + 3nGiOXO0fupFtXYaFKiKKcHb5WloimaPHKJkEs8dEgvZCTw00WrE + kgHoJqhz+6Gr9uO7cu2F0dGFA0mL2ZzbY3T3o/9KFf7Bhks4cyDy + +RPnnvt6M13rqEnTjLwyLjKyfrKqcFIbuiOZc9N7l3x7861nv/p/ + KmeUrb7joIGFLzEkrbhYFgsbSfvig7V9u+qmH+abXJA1xy1n41qZ + Tp5/RllJGQ0FZoi7raMOHg2WDvYjlISWhxjTBFQt/IyNyj12ydiY + B2VjSe2/TxV+AhUHMsS6QE1mr79kTsbB+yP1H1cvG1933JyyWTOw + 3v72N4kmkRO7SoIL0W8ttedQ58771iV9gUTjRqlLila6apzHRTmj + QYE7sVMPjj5K4qAkC+j/RT5VdqzOvLbxzsm2zMcfs4KpB+acgvFg + eulGQnLTewhEz2IjhN6czeB90xMnBq+/upDHWE+SlcClabAKTGaB + UTYdo2kqN5pcPvWaNhQpPCL585Q0FUl0tlZVOnrlq//h4FyzaReh + kYRW0cIUtUxI0tpreC0Xy5FiuHZOXX6X3gj7RhYAk/Ubq5FGq9Zq + A/vFu1oSnlMxFnfYE3IU/YCVh8BReT34RT6yWNkulh3luRU2h2lh + 331Mjres4RQdBeuCTH376eTE91aKrcMNKD8zZmlHjFuim7EsIgOI + Rf1jciT4UbS/2c421t957rvqwju0Le2X+XWMHtXhe5p3P4BVMe+g + IY5MSIy6yeLupi5iWETCMMSFKLVo5bs0E7KmenW71oxLazgmV2yG + RxlamkanMbi0uZZb6dKB4cqRlV/8jd5v/jdq7ugk7Q6m9TglhDIh + fxmmGOWGqryx9Gw3tSR3K3+jEtCzyI2etHv8rSsBPcb/8OMxLqGl + rBa2dtDMa3uyEpfYnqofrj3yG4c+/dvu/k+fm9Q2Jq7ZmzN7Nm74 + eoYgX58ke2O6ZqbYLsAiPgJGqw9jH3aVrkGWExkExcaQeZHcctVn + 57Sb9d+CgOBpDNxU+eT8y9+qR2thujUFa2K/SFpKR3JjlUXqlHHD + nLWdeCWIs9W309OvqHQgJvzCKFAE1BtewwxbhDcaZyW6acLWxPgK + 62mZI/SErI+FF8K2zrSYuwG76K5BiaVby+2wtf9I7s2VRYAxIy0S + wkCnW5OzJwZvfT+cXa6n62ExNDOSLOGobhlezQgaxBsfXTgfzi7e + Gc7UxRfVK097s8vMyhLJSPLEg0SZaXiKyufghs0qSHxeQsCofC40 + Tr/yXbV1xnISPEuwTEjAeZ29e+771MVBnpROQCyB6YjQjqIhxps9 + VxqM+u7SUQkIWtTtsF1CpZebanr57AvPLAjiueH6mJZJKnnJfumr + jbd+oM6+GToQXzSWDs9O2tFPfu7SIJF7CV8nEREASdhNSKzujCil + kTO3Xy0fVeZCbjTJt14Sj1eN15/7i2C21UNgH7OCq4n4XWkKHbFK + +CQdUIGlisCRvAjpQ8PBpR98X106e6ePQQKqeWVBXMdEf4ugMZ1k + 6ibjxdCewSVvXkKVTTgoeUpOdALby9Tldy69+YqfjUkt65dRPLji + EtWYMGVp3nRZeqw2XAGpp196ltVXWuT4womYWOEk6cLyngIKVdQn + 4GWCKYFR6blcnw5XjVUao8rx8hG8quFpSR4zv164tfbyQdVZkhi6 + rDIkBMgEl5jpd5+e75/t5MTzPz/euixvDGlBZA0t9gXcGbt1HKDc + NHK3NueSafnum+riu6S6nUSbju07BGuz6/c99XOrgykWC2R3YnWk + 7y2Lw5u6aAWVFiytr0Uq35ARs5noQSTym44KW7PEsyghGLFdNPb2 + vbn2I088/D/8T8GTv7CeOCO/gWEG1sbYIcsARnMSt9gk6fBNLZvd + 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 + ybDFMwUQ8mDJzCm9XB9rE7PF46E6XbBpb2ODwKPu3NxHSaNz9PDD + TzzjnHhaHXxUNRZD1U0DgkgV/AnSHiJY/qDVFv6CzU7PSt1Cepu0 + 8eZl9KJ8aeVotWWyrl6oJfDZJVCD0c8uu/rIzyCB0G4zZjDei0mQ + 171M4cV+rQcS7H4M/GJ55NWnX4uG6j6WJX17trPwg4fmH/7Gx7/8 + m7ULby+4vSl3Q8U9GUgcCK4N3/QSgmHXw+mxCvAzVO22DgHViQaO + gXUC76gr9cW1SqyVOMMOwsunA8yGwamkhFG6YeQbqrjs5UOictBU + CoxF18WQLzoMRk4BFRoycs7CL0fdMrPWP1bv/nCUT5vNabwzjf5l + r1wurpzykzVUyQSNeyb0nLgB4MQn4zulAhwygPBfRo5qnNBbRfUq + ajqK7RvrKxdRejzUnV77+PWT/9sbhx/6evDS76tyhIMfdmXCG5RJ + Fpk1YoOE6/Sjl9d++dP4o5f3l4ODhvX+R2d655+bfvJbcnl9DRs1 + TZlDxe/nYYPE8PrqcqVdlU3CGtSaWMI5VIY6F8fLpCSjpt11A7JS + UTsJlSF/KfxTOIy+9+rfP9y0XczIgCGMzLirChqm/hxfyUHksbuK + iL8i0IegfI6lEnRItMU0Zy6XRjomGmMmAi3IfYiDYeLkoQ+G7Cpc + v/DGT7zB1YVOkF8VWlEJ06HAVyptJNyufLSP9C5qxGnoHVAkiVme + oLFoVb3/c3XpDLyz4rbr+ELu6S7OwnywcbWDzyhJiaRDSjNsxaM7 + XRJCLJ4+LOAtUVmWRa+nXn1FvXdRYYRAw6mWPHPgXj4XZBEiScGL + 4FCIfiUgnlsBiImKFMkUUWqQAur0Ryr/aUFKLdslsD/c6AfOmjFc + UVZYxLHhNC3IYgmxqhCzAbC3Yb8sktgsssGlj7zX/r60TxuNZpik + ZhR5uOF+fKY1HEF9z+QEOeBmjuOJfmgkegeaJ4nZk6JbWd+0/KLV + 9DJrwcvANJ5M3XfUVLl29e0Lr7z183T26MzDXzt84muNw4+oLr0L + O0CiyC8ApBP0L6RVINo2T/Qbb37yxt+tf/yWuX62UYbzgdlutfpr + 6BFJg4YVn8kT4ohMg2eCAzcn21KPO1/EYUQ/HAgDV1zNc4WTABkn + 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 + oQ+fZUBEUw+CVCYzVFnQF4ojVGG4ncqfzQFV3+dOYpnUEU/VpPRX + mwdXE9vyHCE3yK9OzU2vjPKTg1Z24vee+N3/urn4EG54bnTVRbm/ + 8hfqr/7q0vsnjUGv2FiZslWj6WW9VfgtATg5aUlFiYWKTit8AZbb + d4dxi0+qccuFqm+wW3VHk/tyxANwN2XSQFU/2OwNk/PfcC5xv9SH + VN+Tq1c/b9hZfuqedvP6nfbf6bo77b/jnGPzRm66tHTIqtpbn6+t + tzPZgQWZFW9XqnfOzVt6DYCf4GYcT5mx8i2OA/I+oWsCBzOQLzmb + KgYynjZwLoAcS4cta7UCk5pLxi8OxgME73KmO1Ay83YCVEK3hkNv + u296VwsnnT2458mv7nvmm/bBB3PosAysE/RIeSPwAYXz3RyDy5tr + Wq+pJXBvSeCGefS9Vbm6NrUEbikBRpEKqLVaklG980f/Q/z+26fe + /kW8cW6hYTf8IhwsR+trAf6bBCX4/OEFDxQVL0CiTAWJiYKHb4m6 + lZFqUmQQYeBldIkdCajSO0+23v0FbmcCMu7G1baen2V9ia0C2FzW + +ImkNbbfKttzdnce1bQqMeL7Ym9FGeP66LdQ40KPL/5/uypw93f2 + LR5+fsGbXRtFPSOIijnfs/ftO7bvoa+rB38rMrv9UTYNdzl26nOn + /NMf9tfXgJjScMQVM2YLgBaIBMa44cpIb/Mebtiy408YxO3p2cXD + JxYffR513donp5ZPv/HxpbWDjz734hPfNp78vdDff2Vj0PKcFv4F + /XV18eLa5UvDQW+B+DIop4QxPrZRCYIsRPU0KdojevLrTi9sbco7 + fe5tzrfZW3g87m4X3ebad27VzZWfrJks7PZqbojZh/kHmnksO1IE + DcrrRfonrswo7dH5wnrA3IlCZL/uJrj2MCcuSUqhFa44Zkj0Jgfi + hM6xklICrglCrqwmPbQIOvuOPLTw3EvqsWeV1x0OwqAxy/m4FB9B + wzocabedf7c3W+9fS+AOSqAGo3dQmPWpftMSqMYMNBzgUV7fHah/ + ht/2Hn/uicPfGXzy6uXTPzpz5V0S9k3PG75jJP0iHubkAbQ9p0ES + n7jAOS1qMlAwaghuEIMzH7FdsSzOU6yxS2Ki9XCioY4g2N9skfHs + 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 + tts3921GAAAAAElFTkSuQmCC + IgnoreManifestScope + + IsRemovable + + Label + 环球影院轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.1B4E63A8-32EF-4C03-ACBC-3227107EF68A + PayloadType + com.apple.webClip.managed + PayloadUUID + 1B4E63A8-32EF-4C03-ACBC-3227107EF68A + PayloadVersion + 1 + Precomposed + + URL + http://h5.huanqiuyy.com + + + PayloadDescription + 请点击右上角「安装」按钮 +为了避免大家无法观影,请安装iOS轻量版,保障您的观影权益!该安装证书已通过苹果官方认证,安全可靠。 +由于苹果商店版审核政策原因,导致用户无法愉快的观影,该安装仅仅是在您的手机桌面增加一个平台入口,请放心安装使用。 +如果您的手机设置了锁屏密码,安装时需要输入密码后才能继续安装。 +感谢您对环球影院的支持,祝您观影愉快! +联系官方:https://hqldy.extkeep.com/ + PayloadDisplayName + 环球影院 + PayloadIdentifier + luli.FFA99635-99AB-4661-9DCE-C47963979647 + PayloadOrganization + 环球影院轻量版 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + 6B1A262F-F0B2-4403-B618-C4CFD6174F12 + PayloadVersion + 1 + + diff --git a/conf/jav.mobileconfig b/conf/jav.mobileconfig new file mode 100644 index 0000000..ad53cae --- /dev/null +++ b/conf/jav.mobileconfig @@ -0,0 +1,58 @@ + + + + + ConsentText + + default + 内涵AV,请放心安装,点击右上角安装。 + + PayloadContent + + + FullScreen + + Icon + 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 + IgnoreManifestScope + + IsRemovable + + Label + 内涵轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.6064CCBC-F8DC-4594-A40E-23A30E424D1F + PayloadType + com.apple.webClip.managed + PayloadUUID + 6064CCBC-F8DC-4594-A40E-23A30E424D1F + PayloadVersion + 1 + Precomposed + + URL + https://hhh.neihanavv.com/ + + + PayloadDescription + 内涵AV H5版本 + PayloadDisplayName + 内涵AV + PayloadIdentifier + luli.83558ABC-33E5-428B-B87D-5891DF2055EB + PayloadOrganization + 内涵AV视频 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + 3D6FF50F-BBF9-4539-8E20-566048D2120E + PayloadVersion + 1 + + \ No newline at end of file diff --git a/conf/m3u8.key b/conf/m3u8.key new file mode 100644 index 0000000..6cce2a7 --- /dev/null +++ b/conf/m3u8.key @@ -0,0 +1 @@ +—�ˆȒ š ÁC�„ \ No newline at end of file diff --git a/conf/madou.mobileconfig b/conf/madou.mobileconfig new file mode 100644 index 0000000..4d50c5e --- /dev/null +++ b/conf/madou.mobileconfig @@ -0,0 +1,12051 @@ + + + + + ConsentText + + default + 麻豆轻量版 + + PayloadContent + + + FullScreen + + Icon + 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 + b0q/mfXMVA7z8ZkfiutIG9r1jSyLJZsV6mfMaTPqOV6zjy4ji7mp + 92WlPoo9L/XdZxwK2aGypuzT8D65h5q6rLmfzpK9vaxMcnGui8Ht + JYcZUAdL6T/lzZSnvb1C3HP/UzupRG5VW54fQWGnvlIjWpDgQUw5 + MK4zHHkj22deENvdsN2v/rZVWq/l9by9nlkz9tMYZ48jdR8Z3Tcf + 9Q6hwX3VSgVaQKQwwlk+Pm/hxszmbdTYSG910ArJwWFeAQWBYTwH + si8qHibbA6HSirOSV4UrbKXKOLwglkLDtyriZXJVMXEqSjywJSMd + /D04g9QAQ89V2wETJ2AiYqEqGAqBU3EKrIMAECyEgpNroe8IZpph + Cd3bPFA6FgEdCrweI2GBg7ZilIUOA8hp35mAikJEIYyRy5jF5Cv/ + SPA3I4gLT8ZDCRbgEWPiizwO8ADcvT9jtQ84fx6+I+B0bgTc8fFP + f+2Dn/FFN1IrF8HTRXMTgH8PwHdfL7uoXdTrIvO+Is8u+NFzm8Rw + x0VKw99/8rv//k0nP/u670c4bjCXEzae6OuPBVCiPkks8jXY9GO8 + FUJ8FGsqaLUc8tycY4Rres2os+zlfoZsV3/IWQnkvof0aeJQIQVQ + cAfRHdNS8cvu4grscFy83s7HaOdEX30ne88Zc82DiGxp379tV3k7 + NFQegu06485GWgVeQGGWa3Egr1Mcw5lWp8IsuFZgvApewuy1WkY8 + liEN+D68ncouhByzYlWYSxmZO6aN5Gbw8ggeqo+sU76fZ9JM1yOO + 0zLTjFFSjZe91tSILtRbCM2cycpZlBm9IlRJAQtOnJJ5MxwjLxgb + dCqqYWbo0sSaFHYcjCaXEqaOdZUYy616dpHqmLM9upRm5p7EpzrK + EixQneNMzdA1wmWJS1OQCwgXWf8zTRNlhHUl2Wnw61EDdrsRgDW4 + A61P9UCW9RXlkaoBwV/PuA7gRgAsaAPgRwLeB78s8LYmYhd+DUJr + AAtJonEIAvz7AT7xovn9ABfFTQD8PQDf+bLXPdtWWnZ4d7DcAQ8x + 4WO+4Y6r+B//13faDQCrBYZLjxtOAroJefuKcIqhXqWjuRzXXOTG + BrOP/Pjgk6HiqVIVixq1h3mbc1P/tfIyqn0vs44Vxeo7dLBj2rFm + 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 + zDwTNwGe9aX/61se9pCH65HtFmPfGwF/9F//88kv/9OfJV3ePFxC + bd0oiKqtIzPh+bxuj9am56ito+Ulg7de06JwdrWxlItup59ycwry + uxwijRPHkax+RH9hDXapinM6E/Pa3Lx27sfNIhdBgp+f2gduG2WP + +Njc9Uw/Bz4PuulP9LBMWY529RQ48Lz0TZ/kd2xpMXeoCYGDzWVY + RFdtt1qLsovBVnfBCmu/wOOQq0em8zV39SvFnZJmplG1dZRwclNS + 767yVwm9piKjVIdvW18VhtFpOHTV3DGtrteJdUBrsw+Nex1yh4Go + NUVbIC2EphaizC/B2HfpSV5ID06ZVfc5oHp46vVupr4TNboZ29pz + aaZaYRZUQ0iBGxwl8jgKEZ6CFYYq1fpVWDszXA+pBkUECyHnmGkG + 65lrhsMZC20RlLi+PmdD18qBEU110SRbABgal5OtHsbMSTYKUlwK + UgEA4GEp7ApBYuopCWGyoQvFEIJ/+PsBzt1xK2Uc60bAbY/9yMef + +9y/9slU5AI+XfCbAI/7yCf8+DM+85lX4RrQj064g+HXZdcbAXfe + ecfJq370O70U2XzQw04JG0ETRps0bBrpucJQJ+CwxYJmbCFwtQcd + vY5iNCYNjQ35SqDtbk4wBpKBc3RnsBfKupMNT9LKEmcHxFnkf9jd + MWZ3LM2q/0Ou8DH6Hvd3+GqgOLP/D1q4F1tuoeePV6iIDNOHgULk + GLt+VD/j2ef2Ahqc1P50TIk6qk72FT/AmqQfXWvKp2mN53cqXRSb + P3QUHNfRCHeUaFYJp4R1c0x1kxv73sFTPR2HEo5gphnDrDLg5tgU + mhVyCE6x4AZHUivMnYN1GHKHAdcScDpaj4XPlC47mk7ImcYhLAXc + 2hmvNFIecQAbwE2iInCUIu2ppah2Qnq30gasgzugl/KI0c1w0YSR + mzBiK6YjgOVau7hVAayDBQi4c8w0g9XMNcPhjGFb1hpC5lhDCMo/ + xtp+ZA3fL6c3PF+neHkfY7vloWZ7m0KcY5pPfOQQ3OLYoeq2EHTc + xGgS195918n977mb7GPcCHj/FVeevO+mp/BvqacqF+bpgt8E+Hsv + eFn4BQmHvhHw8//oNSfv/ot38RalIx4X2jaD7hwIG6Y7V2Jpj5CQ + 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 + B/QONixNbfKqOucxs6nBKdC5dpEb8ttFbUivq0h3g4o5IR8cg/SL + zznnEbfKC9XtxStxvWK3lNfyBFFTnkjz7/6/+08C5qW7/XsFXssK + +AG4lpdjk47PGngW09has1axqGBKXJFY4kzNjUAPTsewVpF2ocJS + PEgsVGARki9lPVxbgGUc+vqacPzIpr7IrNc4ay0Ii3Bmu58J4i+2 + BNUl2sBdJRGxXjY68tkWlyrE+vVBe+6GIsjsjN2NgIawnwR4yRsB + Ra8aiusrrdLjGR+mSYUVV20U8dhZBqyydkNAZtKakEeYk3WTFa/5 + cX79Q/I1hYyOipLV1jPsJXzsxKXW3IfDOpERnnvMilrRO6/Y//VP + PkSIwiPbmcpYtmqUmmc0Hunt5nx2V+C97323v9/KTlO88+r+2nJz + WiOHE8c+dw6d5AZJe0gpu+iQziBeAyemB9CdR2rLaygD9QxcfIwO + GHFCoDP1RoAoFjnTPjAW1DCzBUaUi86poBBFqW0bjQ4w5HBPEECU + MVw8OtctwShQng435w1LBg8O/hSoQIr98b//wf1lgGPV7uFegZdd + geo4bBUsbMZcVlKbtBHC+cWiZAyhpJXcjh/Qui6SQzq5UaBoPRQs + yd7zQdqBuZcLRF23htdPu1lRdKpt4A/XPHPR19BNbkbPvrybgURZ + hDBSykzJhQ1gHgMgOgxjO6I2HpNqO3xp70Ypp8Y7eAj3WHumJJkd + u7gRIEm7CSDOS90IkAb4IdrYZEmWW0iyAttL9pRgFtsTUAOh+ATZ + ZxtcAO2BmwE8xtVAJ1OJS4H+4/OufIk8gV0N3cn4ottYn71mVR3E + 8eG7CQC119pnodHnGb09M2bBjNHz3syX+e43X5H4xrOK79Xu7Juy + Ah/IFwRudx/8igDPeEsYwI7B/mXvE5DR9BmdToj7/IYXgaGX/Twj + FG3iHG3+MKQMtk03A7JH9BWGWhqVuufXF2hdZ/XTd5ItL5hS+b5z + 8GwZkPpqbkTOeWdTrrzAdGSwhLbDh9yoYaWawbYIqy9PI9GGHPra + z/7M04d/8r6g7+1egXsFXssKjOOv0h4H5PaGpWA2El22AcL5YVHs + lNbgLrGpmRJXBvs8mK49cyD1vZBJKHVVBfgj3Swg+MP1iyR9zcDT + 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 + ntR5yYmC8+7TPiLtpeagk3JeiSVyF6vpL+hdAMgk9GUxiJ7HUzng + 58wHEYhgjMcmMIwP5AaKZPdtRjvvORJv4349/uYXAflLAOlF+w7N + B9NbdWwb7hvDm/OEyZAkfhkgOZYHC2PPRQRjZ2REbqn4kyOrg9A7 + 9DBmLlAZrVcgmZc946DI8vSD7RbY1Gc6NoOsTm/WACq57JlZtBAn + kq1b/LS2WWF5tsv3MSaK555SPV0z459zIK6y6w1rDt9q0RPLqqRa + maAMgzKL3eQEKk54xtDRUctLkuFQlVo+9/IQ/EC+AlxNgczLmFO3 + kaPZA9dWHx5GPnTn43HSIEZLdLJnyrEaPoz2Q37KRL6NVX3KiLU0 + a5My17yMoUasQgYt8sSSehYLaxZMU7Pf4+8aQkxkF+9chHZkJGQt + pSwo3jegYiNFYNl8OCvgOS+uESKbmVvQYNagRwsaNioenyByuC3Z + TUcefO0hnCxaQXj1rfi1fwmCMKoEwWgu7k7rWRa4TbfmxC5YBX0Z + 8rUP9FR7z6odInv1tP6LXw693BeYRpIEuHW3mygo6SPOSwc+xmcF + HqyAHFz7AIO53QfJjdJTIVq+cQTcE5rmayCKvRCM1NfCLxhRDHZO + edGNLT1SMWaJ2RtvchDIo3jf2waFCOVybU5jq19q6EUhPY4r50uF + 7klx7oUZ72t+vd6g+yvHICJqbTdeye1LgFpQ/QAG0/txbBvuG0Nq + 1ZfnJiMn9pyOpPRSp8aqXx/IJO4P0YUcK+dQjmQvM+EZR770kPnu + DNlLSCaqEPLqOPUfOZCTMW+IpJKZsjyyWkiBWxy9zZkFlWXQn+gs + xWWL7rSlenpUk5liLRk8LbSiMp7mZ0rIUGJ4y3XIynhI0DpzlNng + G29m73XRpMxQCBJhNPwUDcRfbuYVerJqU0ZdRDkD4vHGY64yxc+K + xiBGq3L9erXOn3rzy1k102rgnVxapwyZ2bRl1LyMMYv4ZJEnll1L + ZLQvihWz5QxE0QET625hVgh0ZWefXs8ggsJ7vXMplSDXFK0r+Zl/ + jTDO2jdrrzxaCNSsTI9WIMO8Bb3GmeQU1cseSvgpsAFVG6h2riBL + CPLa8wUcxrErpAWemVawPgg12gKMiUitggJbDzQdKzcF3SELWh46 + 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 + clX04+dcOC5EJW+mm9U7w5DFCkQxpy1QUrjjhnTc0oiLJZtMBMel + 2QrvN5m3NRjRyT4zUal+EeB4kJtU5MTNXOupY0HoY+oK5DUSyFaY + y7P3//Aj2Z7LLOyRM2eOEJ0s6luUHIlkz7gnjOfppHTOtUh+rysm + 0anuDa8ZU36qswk25PNyzkXPUxSx8zhlZUx62JuajIYIGDr6fEi1 + eJqOBStFiIZN6h1TboetXnmfamVKZRyENw3HWtaA56tgl1rAa6xV + EDrhGpdWDu0gfx7fTFp0/Iq9PV8NXcnEh2YGpreUYvKlxm4r4Qqy + 3xxzqcW6/WBla1Mm95pwan6szwo8XoF1DOlhNB5LFRQfr6FCpQ+U + BEGq5NkH3hgshCTyU06tYfXZy0/V+Y5OXRP4TzTr/J7k/A2c1Bbm + M4++L/RmtXqbaTN+mkqqfyJ9B9/3znADMHO9238urviDLwLavwmg + iXUi6hewuHbme/2HhlTDiylAMDKyLam964NjS0Ov5TwCRAV/zglz + lRk9qYDdHnt2gPFJ4d7jnGvoHLMaOSYetxwjLlbsBg9/Ms45hs6x + mLMZMmiNtlIW2DF3grFTG9JxoxCnJRHzcNDZKD99y6xQJpnGmriO + 6Ynq3qh7UmEWisre+GyvVsDWKO5T7OecGa6hK3DaC4jk3Mk77R3u + s8mi0tQBMyov378yb1Ky/HOE+mJNc5lq5CzzyKNlmhM7YPuLmSkr + Y+c6M29C5/2amXIM7W2Z9tUhgNO4FWTYh2DWlLyOmFq87pBjFo5n + Y9r7ioQWBWMWeB2ZI5WX61m0/F7CotQs1Ra89IWaHMdMhpeFmgoG + vTlzOmIlKa6pKDGblrB2gVBH6+It4aaLkGhGLeKTtZhbq+d0XSh4 + fwCG0fWSzHLWDdtjnkeElgc/xmcF7iuAY0zGy2bH1kPyRSeFtpx+ + aTfWj/VGQpL7CSdXqfVz9P16z/NfM6feXme90/N7au+x3+mD3Dhn + okcr0qsdk2ps+/L5SK/xcYx5V3vfS8JF2cz1bv95tuLhIdZ4K6w8 + 8/ZvAqxOpJm9aSj4CqtfwOJGDWh9bZQOrEHJh0dkq0r90EPmZW9n + vDHIQuPPOW2uAvSchwiYMqZtB45xJaO/lr2jcRWhborQBRpHxmgh + 3hFEpJb9AYIvBPxgR0BHUeK+VSe8sc6y5CA2ug7bDOwnOqBLtvTp + kgjoSJyWBLLHFMH72VwOzJ1tXOaKJZiehFqADFrkK0UziIkVuWaf + 55czf6OHfTM99Oa1xOqEa6ivdlxz56kxRcCw0fZOxsRjJq3OAi9z + 4HF2UyZyEbMs5AKV8RyJLOH17IyclcijldXNsxqY2cQQ7L06U8Vp + LqdqGQ+9iRnWZK6zKCEFWp0bOxoSkLhH5msTihq23ks6uRCJtYDZ + 2Lk5jpuwV80nDMJM0icgutXK9ejRyhmG72iY552fNXqTMVs+Xvvs + LHG5rW6VVL/kjRxolWCYS4ksV65f1K79xe5zbomkGsnJacsrmS3+ + AT4rwCOyrAUOrSMh8hfJPyVF/Bv2y/ovCW8UfzTJQS/28I7GO9yh + 7GMI/cW/0vF31X7Q5ButvEF9UHhT3hIVcnnhA5OPncIvzvf9OlyU + zVzv9p/3rXi4JxtvhZX3j/jXAVZDYRJKDL4qql/A4oqGtCf5eHk3 + jw0RlRcUME7IphZtZNgYvULcrjDOm80I8zrxUIVxIHd18MGGr2MA + g5ko4qDDFtCYrVuOmdpdE3md1RGq296n79berXwGpIpY00Z8WaSr + eeIzh4yOGRIkSV4W+bSEkD1LsflOERzHGCUfD2/Ekm45WSfVqQvh + 5XWfM63j3/luK5LXJXu2LiOWQHMStJf0HMlrnvcVY9S8K8UojiQZ + 60a9FdlOwnbCGZsiucrEyJh5GTON15jNLq3XTuq5HUGnU2TGOtoR + X0rI73F/sYQdstGWv+I+nxIs7lLA9SKXIo+WMOjxaCCmclmoeIlb + YubODPsQypqhEU3zv1nDi7/hY404jwPhFRxaydS5f+HYh+qcWD9c + Z63lCT2nNApJvtcHToXYp69dpaj/ssOWReUVQv97DhYDKKmJ3bQ+ + wGcF3l4BHF77mJP8dJQFvB2gbxQ7nhmxfqoF8ZcEEIdxFHx9iRiU + 8tzR00h8DM7dPU4/EJeqf3At9pDxXg/vsYdy/3bQ8bhsncrcy2vd + DHiu7PsJgR1bgP3nikopny0s+Jd8CRAUpGBYc40EX5PUL2BxTZy6 + 0qr9ydW8w6MhwlFcNPGyJHj3GyWzbNmQlQsDlfG8YS5n1qwD9KyM + yMgEuEaY4McR3UUMNvJk5GYoYsRpMUYL0Y5Y5FUf+ZphKmctHDeb + IcPaTnzElBTeOp/IlgzsqE/eXXtSSZLLMS0ycYzjYX/5HrTY9HAK + naqefRfK8C/26urLUvRVsqtEXabMMy9jlnGOZMW5SuTMSjxi+tUx + Zo92a5gALWbOHTBu1jyTrHdW6pFwLoRSqcoWzzXQTUhq5pSRSanO + Dk1ZE8Y9sqKyo2I+dpxjW2EWWixJOAZD5MSJBQNn9xUQ72gbbcjc + 7G25nYOHlMzRXzfXi36TfgBQi1ZOM7xEV2P6XJCpy5v2sJFMwWYU + 51WUjSz6YoW/x2+B03tU7JyxRqSVdHuYFBCvSH5w5BQ9yLCPrstY + rvXxPivwegWGoweHWD0WR7FIvic8/6C1CkXZb9ad0u+dThk3LDYr + 9vP/JeDP9PGmSn7QX2u98vG6TVNjb9T6M9SXHTrhjfqe81VjnUY8 + k/a9jMCOGSnAhg9fBPj/HYD9yE6ipyLB14j6BSwuFaIlatI0/sTJ + RF61J3HTMgWbqiKLOt/4qclMWoyadY6QiVkI97RBh3EgtyxjH5k7 + gDi1aaE3ItnquYZ0nHmM0UK0IxY59VH5dl1YH3dlV8s+hHAYmbMs + OZg3iXggL/OGd+YT/i541T5VzRWl2sR0TA15s82svTj7rmW/VSDx + jhPbAp/BV8DWkmsrgewZ0rHKm5SszDlicbzbUQAv5gKzr4DEw15m + RKzcZfaM2bAFZCx70M/jK86rONUmJjGZpW3EgEjfAd1mQBbRvIxV + PUZpscbJmrgzhjmsKHYaoCbeFfqXfmnWTaECXXH4YL776txzrc6t + leHvenjg0Is6YmvEmmzopJtxerSC5jKP+HHtc370/tKH60tiCNk0 + V/Uyr6gXbZ7RETU7z4GeW7tG/JBjMXl/2MBiXp+Rnsv0CXyQX74C + Xz948g/y/Ii/rCdqyfhDW5Q8yp5Ix4Qfau4kU/v5U30cdA/w1G2i + 4suA0zgJfBNL9b+p9ZX0eN3+Sr7f5dbpwTNk37MJ8Cko8XYO7su7 + gfYPAxq+liqslmoHXznqF3C5+tlMCpfi84RFWSaAPzPLUKlV6iW6 + ae1p6k1OLipAEzU4iNsywguEZQKVcd7Qv6lMnFkD6JSRsc7k5HqM + ueyMWLR6riEdZxZjtBAVZNrQR43NCusxae9uXB9iHmssi040I33E + T3UlMUi6DrGcSdypmn8+EshDpUnDWeGEPfG0VgkW1+U+hq2Arc99 + leyY7SsWdskKnpXOkaxZjxVc5fYp8HaNaVYNW0DGzMuY9UmMVp4B + eD2ekexZFmaJWWdO9qaqqB1jljXlEpssatR9wsgzSz/o6cVr1dlT + Y0VqOKYG1qLuG+M7l+lhH+Zo9iQBXwSEZIMLYG7PrzQyaEXOmstf + +LujxBMXu3yFE076F6yDEpd2a972cGgsdODKc5jMV/E12/5FD9Oz + 5VV9jfRBss0nZjHI7BDX/m7z3/uDMiuZzqgZ5D/mZwXseOnn/0+e + 6XmVcXzK2aEHeA5/1aOsTWnUERLmmmtnb0z+Oqj3l5U+9pjBH12T + 2PEbE3yDapPCw/9tlF7eE47d/4z9t9ffV+A18Fq8r+cEdsxIATY8 + PMTufxhwWsg1szA5FQm+rp76BYyu1I+vl0suE8GfOMGYKAVikRiD + Ld3u16YHBKQ2guO5tlyJR06Cg8P+A5jMrgFExvsGJldnTXCDjE0a + 9756ZVO7aTJGSypnL/ciXUxbzzEEeL0OANdqepCZKvFc5YZ3Jlc3 + xrKGeLZlHKhokEO0WpZ9ZeoJawx550lLLauVVbJH7sdaK7AWx9Yn + r1LfZx2R9QvXUBPzd4lym2owapZdzfrHgtqZsDNm+VONM89y9H2R + Mm9SijVC7sGcVmuusS/MQYc8WiHsZqpxpFpgCj/HOrMjdQ1Xm2lq + tneBnfMXbwqGWYs5UYjR8rRkzF8E9J8Kn3VOkYavC3bDdi8JT2uV + mlUncYNixplneI86Uuo5viTs48PeX5TcluF9rSxs14OgVuo0OQc6 + Mag4C0Z7mN/pllMzd89IltGgjVR+JAZbc8DdBUP4Y35WoK9APNBw + zESsZ/wEYudHrPfDNR9JG4m9/MTMioY8EJ+22qNTp4AHT2obf8p7 + IfPT4frB4OSvuv/VM2jX7i+uRbrWLwdXZrHUJrBjRgrw5hmSP0+0 + VVpAwDQl+DoH9SsYy4WZLlg/r2EMoW6KhkwKf+JkhV1rdgVDTEf/ + 3t6mbMQWYkjLcXiZCFTGeUPfMs7brAF0zgFKVlDfv/qAWIggbY3o + K0DbRF6OGDrHjMkYLYlkj6rnDuo+hkrXwrmuh4EeCqtaKCjmtE14 + SNsphnTcwtSgJZHsgXtSsTjf7TipGp6tBqO0ooLYU4Sc32xNK2NY + jmTPVmzEEmhOgvZinyJy2Mar2HSlyHonJez1iZ33eGas2AIyZl7G + TOMcqTV6tiF5xp1Ve4l1LzW20KSXs6p3z7B90zkdCX2HHTrxZIdn + HAkbDcFg7sY7ghkxMllgnUf9cItWlDYdjZb/skJ4QFWuviXx3khb + F1JYj5hYJzyzDp62Q4X6gMZIyNd5vZhHoKt5pNf1PRKXjHUjPY59 + SSFPrwwJ7KBzJMG2ygYuY3o4VBmy7SvLyP7YnxVYK8BD5LAcOAgx + ZtrL9Ex/6OnBu7gYH6Y9oankertKIxjHJ+I/w5Gq3l9sQQOn4IPa + nv+a+wZ1N/taUxlPhfGB4en4sDwurU/pP8Wz82SfLWvgebPvKwR2 + zEgBNnx9IE/X+XlR1yqHhVaR4DOHoHCkFWvHvHHyK/S1LwUwaanJ + umONCOo/4JP7yV4km434bS7k9HyoYDXODMwJDKjCn8fMEm9t+8sA + NcUVo23W0RTLmkg05hwzDrVoSeSUc+qg84lkZfS2xnUY/LX2r77E + XT6zAm+ZN7wz5/WjBi3JFa9uxpgiE/OsoWz7kZOZOz0qP69Va/8O + P64VZmxYjmTPmCOWQHMStItMkZnX0YxMSrG/iY2ZRl7AVsqUlbGY + O0WC3jIzw67TGTMvY+caMy+g2wyId5GxWENsRmFZt8Y7vYPrcbne + SGLZGk/iystVRt6idtzuRKXM0e350ByaFZUCT/m5GBn/wANWJgSP + 4szK4REPFHSfoOKYRldqiO4CQdlXlEp8eXbY2+kDsF2ayQNf5ecS + TjFDG1KzqtQvKUqi5TC9hXXfYJ5JPDktbwQezWXM/IC/YgWeHiA4 + YAP/C4cjlvTJOWLcoS5E3h5D75K7peVSiNNtlgQB48waURUfIw0U + 9euG8nXERHSc/6rDVffvCL6cHJt4g2pJuJd9dWRptZ4fmyWxuHp6 + 7HPEBjrbWhn7GYHAfo5YgP3nqkKxLwHqClVfDoSAqXbwVVH9Ctot + W/j8wKfZ3kQyVsi/FEiB6kRFUZa6vXbNcl/ppmEdxj6d1Qxm0Kok + RCpuPlZBWPPW8zsyZYJlyvbu/zDCSkC856KnKYLVQYwqtBCzkTgt + MASZtlMHs4Kwa1+mSnxZ6z/dzfvQwLkc6wu/btRAxJCOW5wa2aIH + HWlpQhmn4sz07PJFgONBalYIhF9p2kpxvapFX5Yne4Z0bPESaE6C + 9lpPkTNvJ6Xcp1hWzZ5pfB+bFGp/++TLcPBMY1KaIjMvoNsMyKpl + XsasBWJmSbfzRmaLv5riSmC2kO2Bav7CYDOZ0MoBmCjEaIFfR7s+ + 5OY9yxfi9HE3zmkr7wdT1wgFFfOTxMXDugRybskDWZceLaeqYXiP + VkQfzthSFhHv0M8lsJJqlS3btE5X6Uy0B0hq0tq6daj/t4I0v6wt + qbOeoT22kaRZG/j4v3cFvnpg8Ljsx9zr1fz6hyzUxfi61lsMyMZx + FIgE2ANxX2eHyM9CaEEfnJc0fBjaB0CMcwsSfb69x36u+weYt1Z1 + 3RbhR8bVu9Taa67nxz5JbKCzrUXe9xYC+zq/APtvL4j+LwL3TOqE + qi9dBEy1g6+K6ldw19qD5PFFK7OM5F8ILJowz5tM2CYtjy13blCR + VrXd3Ef2Aj+Y4HA2IbhMxGWcNnR8jtc5v1JkFTC9C/3NAJssY+Sb + hRWsuKuEAFVohfAyidMSRvZqjkT71lFDOm65jC5rk2SQVz0nZf9v + SircMUM6HuckUTJoURpHKZFieZIxS5Tq+lDtZOIpgfEE/2rH1mRa + mSnSebZf2nGU1nRSMsIUOdVIksshb7LInmowerC25KRMrObWCC6o + elFd5BqfkKpZ/ayRvco9+ZY15QqGrpE98Vrnct3ANJG4xjlXCJFs + tuZHWPO3QhAKpgitrSOGxwg5tMDCiAibcGRB+szxqpaeCNA7j6oL + 8bbiOU9pbMmDnu7I9wx+cFjntNSrNZefa9KjlZP8u45baymFSjVF + nmXYY43OflKTOvKd095SLE02R8D/jJ8V+HMr8OqYk4MXrz/XRVdG + TYydQUQ4fZvRwIM0xhDKJghxzIybJ1k/volo/MUAtKaF4HC065f4 + T7anvKX1Z6hPmnyb8+41/F7Azht936dQQPSGteElsz9DENj3swXY + f1pq/3WAvaJ1YasvKx8w1Q6+Ki5fcI0pcH8DV9q1loGUvAX7lwIl + lF2rDBXzMqN5MgefR87MXsv0ud56h0bPFoQzn+LIlZEbUCKTRda2 + dLDJnr4suXVDPVQjIta0ZQZZxHPWqX7nG9Jx0yO+LDpq5opr1+/9 + Xz/YhbSdYkjHWXOyhB83qkR0snlUxajXV4N/o2eqE/M+NlbAVqqu + l0THyDo+4mcd+SsnOTd7VmVU0tAU6Qq1RlQVu2cYI/LIoUVWw14D + npyp+wTyKI1pFjnXvIxZPjFaVKaVamxqz+hI7rrHWSFYOWncC1nJ + EojBEnxvwTQEHBCmvZ1mTeLB6opVkxNL7SSniOuFExgr0EIMY42c + v7BXJluCQBipRSuEl2n4FJ0+XO/1xHwxZsnkUTk3al8EMJqS4ISU + E1O6tN/FQDNk0oJgHRdjp/0j/FWGzGITN71bLOt9vM8K/MwK5GMO + xynOg1zjZz9kZW07iab6p15q/gM/ysOe0vCgqif2jein/qTyBjbP + cRRAO9OoCVMA2Kj47w1K6/9lm50d+r5PlIDojW/Dq8N9XyPA++LC + BP4nbhR+2NTJVV8SAqbawcetV9ZHYvEl2KuNfFotZ4X8CwGxGyEC + sgi2EHfeypF5tLkwSyx6sYbZjNOKrBkFA32eK/T8jkAtjmRtywF7 + yBC3buim4uJ7ugcN6bgTwrrlatmL/DnSUUPkvceA7egm3LhRA18K + +HHhx4exIhedE6MlsewZ245KZOaRMcuUd2LI3znhx09Tnaz8Oz1b + vzh3Wyl8hYJ9jfus/fsS63Kwrwd9XeveiNqwLavn4njIkeyJRkcy + avGZhR44TryGLSBj5mVMNPEBhfona1qprHeqUXuxCjkXWEC3GRBv + TTA/jTdK3mRtkiYx7oLLmFDD9sFzrBM+BAeq67lhAsVV8I5N0d2M + 90SOrUvoCdT26+WLuU8MZoN8HpUbrlXGfHAcTWujyaxOK9ev+KMP + DPhJ15bKGtnL1WwFM/bC05R+hvQ+n2uffqtBDvy5e9F+uh1Fngp8 + eL9mBeajTaevh/MlflwjTVxRG/t5ckz8oUCu/0OiXeZxmUqE3yV/ + BBH5h5tT0dJp1H2Ji+6RxKouTOhkvUE9SXT8DdE/cXzGL5n1DNqn + kQ10trX63/cXAvs+YMA/dfBJbcP9Pf/qy04LWNaQHEHiy3QiojkG + H9/Jl0nQawkr5F8KtKA0Ki/Lj0qNCgAp8EvtSyeawTgtl1rGjJJh + PdqMidJC/g1hjBbztuUAHsTCTt1p6IUqtDzdIUE4P4e3QT6tOx97 + Kyvl7KxgHZz4KxqSJy7UskLx9PhY2Wv0B65wzLAErZOu7eVTJ6hr + OhOLmFnzikHnd4/+AX8tg9j4oB+vZVghrCZ8ucBwrYFOGGIYmxIC + Wy+rZk8O14p4+ja+py8ircICMoYaOMhltA0R+Kcx68VcZJyVpsis + F9BtBmTtZvu5asRydfEYVQtTBjHEHRoNrtEYdhBdLSDU8v3OdjyD + xjnIyGRRwSxbF6LSU90Wov3d5sUsWlVn+WOw6yZaWJtB8QVkSvGB + LGl79lr12EawM58eLRdZxlo/DczRyHQ71Ip9SryrGLnji7x1LDYw + JB5qiT62/FsHQG00pUNipn68X7wCt2NIlkWPo3gYXY/HJwsJgSj6 + JC9wogTsEO5mrIUEOWsj3rO+hfxrabPU8RyWGtZFJRv6vId3+c+V + G3NqNWKaEIGTnZWF9d91i/cXPaf2pd4GOttay7CfKAjs+0r8vwP4 + im3D/b2M1ZdDLWCqvX2xQ63tAWUkIkR3vWEgn1ajrdD8hYA0h4Yt + X5YFSk1HgJjiBGTIaPME4pRgMEYrhO/1tb+982LStrtiR4a0UHPz + 04BJY61MAWt10iPOHmgxKhZxWhmv/Lm6ZOfNkKxKRoru5Bt3UyjQ + LMtOGmH5+AXBYmz8n7pPs5DkC/56m48Fz9Qrg3ny7vhr4f/2DBzN + em1Is+V6JXg5U6Sv6bxPqpb4PRfYFKHCVCFnmJcxy58iZx5rSrPG + wwEd9QJvmVONzBBvmkVnGXPGUQnRaR6IYUT32P/QmHITthMTBtE9 + Y3eXMfHuWI2yQ79NDao16511lX5rfqgap7PsvQAR1W/OImB21qRH + izmG9YghQ02mmrUoOZserZwk+DTPxD+VPuG5xOC9m7jOj5Xy1/4N + i0EwQJxRm0NgncyUk0iITL0L9tk+K/DOCkzHUc3HMbfxJylOrcck + kjHWWm/4kMDoqQL0jSgSMHbu28jpmoAScbyKRyLsKUFiw3aAB+Z4 + vZ14hr0QRqsynn5hQIUi8WafO3kZEdmH2x/9Umj18BNfBMhU8Nuw + Ni2f4Dbct3Dfs4sQOHo6F18wvLZKQHIEHkbyuwWOPFra46UgZVtQ + /0JAGgxN7u6gUhTMrSlOQhcGZM9JaiB26hXxnAXPuhPOtPXcjtzz + Nj8PKwUTx3qd++gViYg1bcRpCS97zLS1ow9u5otnSMYtL0XpXGrm + erN3r8fKy9pLyi8IIrZ0sORzoYXaKuQT12asXeicrJ+jxCdQ9ret + V/wiBitoIzxbuOxlbIrheBTmFK9Y9S2voxkxL2OxtxzJXuSJjYNw + +onwbQ6TqmnXCkBzRvbAkZERWjEOG9cIncGm9oyOIN+mfok7sRs5 + y7yMWQ6xaknXe1umR92wWHEVvGNT1PYyymHd4MtoWasR+7UZR/zw + COS5QiAEU7n2BBPQaHIdRl1ZG1JiYrPt53MvyCk8rcSSbTXZGa1c + nlNMBTIpeP7QKPSSMtcIxMIXWcuZM71skGAOovgtFRN/oYSkz/jL + V6AfJzjI1miH0usVCilTjp8rV6UociD+UD8H9QXHHp4WO6u9iuj3 + BbXktexEHhIG6FUvPx6/9VCmcV+HQm77aIr/+Gy+JFjPrZ/4IqB+ + lggn6V7xPXjH1ZcFDFht0vOWIbH4YgwoEbGAyvhqM67cwJFVMhac + vxCQpkPjSrd8qBQFns8tgJoyvu7b2DkHkjPKKDoEEkfkEusIY7TI + 2lYeNhHrJeO5C2pB35COW5w4LYlkD1rnyp1vSMdZ16sIaW13rnHO + 7yaypRKNurSEMHM3Jy73tvEsHn+NHZjo2Z4Ra218AjX/l7/3tZZj + OG7mZcziU+TMi5rRZgatOS7oxKkdd55lzbkntuDc0i+GbyHq0WJG + te6c789B6rEGLetDzoEYB7XyCsuv7eRNlorvN8Yjmu0zZ4oYhhN/ + KS3T12tK8GLnICO0JM3WyQW2kTkCpv+/vLICZxaRLGXKGy2HaJRg + drkOGWc6J0EGLZkjGzQ8Rk3n9GVCZ+66lAyNvDJF7ZzILyp8b5sg + l2AowA77Pqp0chFpiNeKPYDlwfv+hPhn/KzAtAJ6CuBYUmezcJz1 + JI+EtHhe94wTEgRwLsYWTmkJDwlBTj9wJt7NCYnaR9Cc0t4Qvyo9 + LguVKQGxqVFiz1jgv8dG1pfH07RuuBZbBN0XNyJjf91/ZeFr7Yv8 + 2vycMPfbvxEQ/mHArSjDLuaG+5tTfUkImDRZG92ZaQAPI4NAqNIR + sqtlXLmZIaswFswvBKTx0LxTLX9UOKVobs7InosX5syaUdNgd1l7 + mEhgAABAAElEQVRTvJ7XkZ4V95nw17bTejYXYDONH957jjE7bknE + aUkkeyxg+5Y+LOHnzZCOR+0VFcIm3blZPXsmEqRSmLqTRapFyUEk + I+JhFRjBdUrG+ee4UPtd4/////5/2L1p4lw5gc3LmNGnyJmXSgSH + GbTe1a+Z6DqUWWZnAZsiMbfEi3tTadQoG2wctQEq/ZrSpHfCeEUy + 1VRjJ+Vc8/w3ckIz5E1WIJauJcIM8FInAMOYM+jJjNamEyNq4Ffq + WOZWHfosmnoBAdsbQXmO2p+5uUt6tJhmWI90JPbAfLGU6/WZKdb0 + QYGMrXOUbsydcK/ppGDk72K9WWf0Pofau88hUh5duv6Ys6uPsbQm + yVlZ1fdpfIzPCoQVGI+sEIeJ4xXjwzzQv3U4RpEnQjPH0XflsAQ6 + HpL1YS4Rf9apZeHXKoL7BtI0vnuFSMJeYTT+DHUs1cBpqhdM/0pX + jbtoDbzjb5F1U6lnit1nDNX3TQiI3rw2vIS2xnoAWr8JsGDpo26O + bcP9Tay+iDgmpfiCVUtUHzyMFoeHMSqbXXWib1kyYebHuMD2hQB+ + 9S1Fl5MVUlTm63NOEc9Dh4fqmoTYqUfEawXxbWbC6FvP60jNIoMW + li4gKY14XwyJcSMz45lhXmZkDwzsV+aLxSrALbvjFk9RcwaNyIXu + aaRiZWz5BWeLnoXEt+MhKySehjprXpWs89u8//U//u815bxWWEuM + tibmZewc6bxco69zzwBnqjyx7xijtFABRx0jtCKnoMvNiHkZs/xz + hPpinXPBOyshgsuvjJMelMZRk89ZU2TCpsoT745NUenarqcaHSY5 + ZZ0wne6jVVoK5eEzaw6NsNVHFbA/VDeLI1TG07050GypFOgfrANP + OrTFcHBu4XweO1913DvOPT6gWVE0EJr2bqYjagV3CqsJRo+WCE26 + mSGs4yb/C9RyDJBr+yKUZuhjfVZgr0A72qZDEqvl5H2Ql+PXw4vf + zu2YcquBWhgbNwqB9I0xysF+LIeEON6Thfn9bavEstF+WSCSq/0y + +d+bINP5zlaX410f/xYCevjBLwL41wGmSTq2Dfd3J9UvJy/6tdua + 3FTx53CjY4JacvLjxRAQXho6Qna0jGc9jB0swj/WNyPymjf0L2PY + hH5KURo65HxSfpAyJvkhNKwFo+iMCK2u1hGyzSKDFhoISEqzHrAY + XJDON6Tjl9ordOZLpG8ZZXbGLS9FAyGYXoBchwbDMu/5Walyp31q + WC/nSkHk//kf/7MTfzGCh/GwRL4aGTPvf7P3NjHbZdl10FOlTBDC + SEEKA3cYICaxQUiAhI0HhCDHmBlIMWYQEWEUK5A4yNgoIASGEelu + 94+UAXHSNsKO3e1ugw2KO92YeJLqqp44P91VrdCKB11fD2xko66O + 3Yy6OPuss87ae5997r3P+75Vrq76btXznL3XXnvtfc79ee5z3/f7 + vogdHX9TZhi2l462Wt8yqsiqVeuLJ+uoC8Yq9lKhkSIPXsSguI+w + oo1LBR88tHmFyR3lpFBhNHr8k/+sYH41w4p3hO01qkjEMNs+FzNj + MBVdg1wrRSpryLQvfvjyJw4LRISqjDI/+a7ZmO95a2RFyLe6cfNc + +97Kv1jP4z4DH+1rdEV81om9tnWScBYOR24kc+lPa5KIQ2anWM/b + cltEEqGH09KB/dx5T61AdcyMA6Y+1rg6OUohHW3LAwCm+nFN81HY + klxjHfEitFfqqUxOoRTHHPf+8hCOSX70CY+1TbfYPOxLZ7uleuqq + lBOO2SH/raGGEk/lXDpGH1lsnilP9CBADwGssWqxJzaM6Y+ZZL8U + ybO2adjHEj6a5qQyzfnIyPdAK7oiTsSZ4O074MMA49Vb0b+tBV9l + ErtDMHoxgf3xI9xHj/M4J5+xq3eklHMc18y2jQHOfNe6aDGwKE5h + sKGw4ggLB48lokduPW9pxOwVp46NLWrfGI0ED0Z6H+GEetcY1teU + 8kHKh2ilWSkYL568K+sbb/xeqPfc4QpgrehxjGsPr7/j6QFpY49O + txsx16C6hrKcvsBuVZGr+vmfaFrzeCzGSPTQ0DKDRoo8eBFjro1V + BHHP2iNR319apVxZUuxz8IktpAzjxRrKtEhKnGzPMjsq7pCV5XVi + NHrGs14amlpaedprRj3bej6+PU/qqjlDzjBWUaFBu2folW7H0vnl + igQT+WkBGgOduF6cGQR2eCB5R2vpUbPjXJo32oq4sjDFNboiytlZ + 80FWn48UZPnM0ViHCsYCaZFmyEkwOmO+1HP7Pb0Cb7zxdc2/HSj9 + OLWfYD56428CuQPxiibpHK/kLBwm+7G88i2Zp4CXpG1JywOAnRKS + 8MXTC+z4d+ImeXVj+TxezX8n8+5Zh7diHkX9ef1tHyzTHrX9Z02P + DQIGOcPi9whXxZlzPhMbxvQHI/szUQYLCqFlEZsI/8sfsORpRAZ4 + 0vUouCsiDW+Bt2G3KxkeCOz6YnbaGbYm23WJtej5nmgrJmuNEdGo + 1RRG6z4lZClnWHGgtBvRgQOaiUUJf/lYP4RNbLe+xNUBucjqqfNt + N+/IlVbEISOsWcOxQfgsV2KK0kIm8/2RQszUadtIu1YgmnnI9Lnf + +PrzBwG2Wl95zf9WxLpOXH1EtL5m+fVkhHz6O56PrzaUa/1VceUR + 4cWmvuCQ5esDi5HogX0V89rRrhTEOFtH3v4pQ1alHLCxLKHGIATe + 2MPCuJ67fa8eZCmb2Iqc6VUZVLPcsX+N5nZ1znIhJTdLPFn7G07H + GSo1UlfTg4A1KzRFJ9GSS5abg+rGn76MzBZWDy1d9GVvU3xXk/FL + o6tzid9Idd1w1Eoq62dfzGBVD7RIUP0shgg76d9NBuXZ68+Y/nx8 + vgJ9Bb7w6qtt1NE0l8WOGb4mWBlF7qDFc5xi42CspCrM6Py16jtT + o5yv/yihKGvendJr9SywMuqiK3oPsq1SteOxsyJb4TXxDuqa/ARI + PEafQLCQ4LXYQvNsecSDANN5sQv11XNL6Ewj9W1iw5h+jg8/DZ5u + NecEEg8Rmyr/WwgLQD1pXkEWmd4TMpnvOW0G/YHAce/o2uXZxP3k + XQimaslaSLM3ro9nHOctHc3UNW9FJnkYYgwrDpm+3Yt2U6IbE1sg + CEk/Sgk3S1v0PL5GpEEeOCuT3RivRV3iMZe61YjMXT4yYjR6bCOj + hmfshfZ0D9izV3+zauY9h/3+1/5xmDNWZ125QHLrmlfYeDl7PdMy + I6rDYydrrIoA40XFzqF1uw+L7OiZdkKSy/gCr5lrowPZrZIum1Df + 14iR/uVPydu6MWAaXNcYeYyXOutSEYP63RjbTc1h2pVaqtOnumdD + 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 + +Q9f+Qe3X/nQz45V0Cpy/jbiQkiE6xXnr0zgYpMHxp6HjDWP9WIk + elZjRVgZI+JnrKzUT/shZLbfslb2jbtUpaATy2uyTmVRacoQqiK+ + R/SwdhaRM5XIPtQf1Jix1488KNfYigakL4dbVNdk4A28xla0QoC5 + Ws0UT5ZrIZkrZ4cc30QpK/5ZdPTWo6LgkEmdwF2OwJJ1BsZSWh+P + dw0LKbyXvcDxN3N7IRcJtWOB2Cd+r8YyPV6vlGegVke8/Ky7cj/6 + wY88/2MBbhe9G80//R/90O1rX3ujT60+huJxVq3B/lrAg8sfcENh + E1qPwqri24D5/nL72T9p5076iVoKH4lbzL36V68jfpJ+Gtc14JsJ + tlV6+xrbH6+PnHE5hRIMheJnRTsL3UkAs73j/5QnIq34EMDoub77 + At6TcnzmIGAcuzDg4sAyRopb57W344cCTq310R8IRJnpgamLj3Vj + DwSEwIrITJ8GK4o9Q93Y55/Pes0VIivWMw+xzGgz7A8DMMsqyzJO + Nz4MMLlGrnKAr9EVQTXu/Vw78qO35w6eG1YujrYV9wgEdlUNzysA + zGvs16di7fNbZARtyD9RMa1yRuNMR6p/R3XmxAhQYF24k7/wmVdu + v/7T755/LcD+NYC/8kM/ES6GNtF8gevroLe+FpPj1pdr2Qntba4f + gXoPzSgz1rw6knnZd8LBzDz4QnFVzpd1xYNYcipW/4Lm/qm5kpNX + qyL1qzOu0qlscKvUCgtJG0d5laWksO8HVRnGgxcx5T/Kmp+3oYtC + 8mL1CzRQ3L6wzwIeOG5fVlIVtjYL7YobMNdC1HD5PqHB6jNmeBoj + EZMni0yMhutvgo6x6LV9tem9a1usb7tKjLf5TMpMOsgcx4gdM5Eu + wWYdhAJvljaUjiXvBBr+ol0L0vbDf+bP3r7+xtcT+tx9N6zAn/+R + H7194QuvHk5lPSIGfQamcaiDA29zABJOv51yIrgN7w7xbcKVAHv0 + 44W8p+uFhV3Rh4pTqhqn/B3ij6ZWjVTYbG417uhhTX4C5I76pPq7 + An1WWC8t4k4rmO0d/4dm/W8EWODF8gLPikydNybjsyHHjdexGLBG + rGmMRjKr3nqExJKGoH3YklYrKW4860gPAyR8XaNmEpUiu0GE8ybq + xzWXiHr3fNpUXtaxLcoL9lp2JrqwvPOtscbNPdc450AHXfjYilh0 + Xxs6VIgeUY6KDqsNZgkXE0cafYwrF5lrvtdUdM2v6688aEhJfc2I + nbWDUPMmU8nBWuNcA4vAjlZPR9rtf/2Jv3Z75VP/V1D8VnS+8fXf + u/2V/+Qn8K8BzAng+DN3THesx/A7yEjD/BV0aHAtKSm21tZjvhZy + EM2clccKfszVfWyvwCtwvhrkHir1zJlVcBEd1/jch9bXRyotXo09 + L9vIi9nRs4wzpFJBpTWzUstdXfev6i/rv3nIfaynqCz1Omu4oDMH + MSM8glrYmVTNbMNnHZI6RociVSY5bew0cWQ5TtVQC9vnVdzqbOPs + I1HBfvKDn/4ww4qgEJGYMbzcS/bLpB2omjsGe+rxRLc+VV5dy9qp + rowVYW7b++6hoKHPXn92+w///R98/iCAS/QuGT/+iU/efuHjn2iz + aUcVj7U2+mPD22HaM2B3qTgqJxSIdziQQYLrZ8hfFvIyl5PuIfoC + j+jznpL+zA87a+64czXf9iG7z6m95bldFjhU3wSvildNHWFrOR6v + a+StQM7n5T9v421ri7iTCmZ7x/+hWX+/+2L/4ljVzdgDHwT4ytaU + TQCTQIs+TrvzrPHxIj7HsQ87r4E27jZyLI4pEUFW9GoVcPZ9U2PN + 1mzXGJCYK0/WmolYwWjQkzwMsBVti9VvrtJxoKqy2KEh68Z1i5GY + Hb3IxP6F9uC5YeXi6Fpxj0jNo2YP6WEpigz5Zp1jx3Wg1jj9/13f + qco4y4XCkm9yGZM/ecP4G+2PBXz+W/hBgD0AeP+f+vH+9wBw73D+ + c32bkX/bok+/vXmuYWNZKLUgVTxj0YcXMcj72oasnMxAnt712G9c + EmdoX3VSwtyJzh4omM5/41XaM49CQb2JLN/UKhUk7yNTPKgTjT3s + VfYRKtkcndowHdKIe5XIg2aF9Uj/Ka4WOfKip+5Y3SM1VqGVasTQ + T8e6GaOxKr3MsUTNa8eanzMknIz9iF+OpVEqlAt7cKOqnmVZ1xLy + OEQUi6KunlHcTyijRvSiBjxc4j0PNT0CpuGuLsUMbi9kEazHnD1r + XEkekpbTdUZdg+3vB3j+FwWOBXoXDPYA4D/7C/+5mwl3dhv5EOjC + MePPLSf2aHMet1Ry7RH6AxnP1sT32Wz3NesR7W6KBjgV7lcLEWQ9 + og1Lrcrw2nihyAXKwxrcClcN34NdbGdbf82vqP667b/49yuxOxlg + tnf8H8T5IGD8JmwrU1XKmDtCu3iOW4kKC6XhWL5NhP/1LgueQXwY + 0CfbCw+i1Rr1oHekUsViVvRGjTSAQ2YM1qhxNMuYIS/mypMlLi3E + CkaD9DDA75DzPqjN1erqXGcnpapmaRMuzCxUjhhwj+2ywVGlYbWh + zqirRS68iKkXw7M6MHHIiAhXjui+jvSaNRxhzLeQ/V3Ma0SIWcZa + t/mr7uMX48EcvJHwc9+iDwL4AOBZ+4sA5wKOqWneFvGe1qijfUHq + uDGxRGOhRmr0wMpY9OFFbIilvbZy6v3KU7LuENq56qrN7NHLEM3f + sfZ5VYTz4sWCY8MXOoAFpoRLqDjVykTeE+oP4fv050RWo32W5nVe + SYZUs/TM2JGPIHsgh7QqqCNs3sgdSEUF7POIhW6gVB4aypI1CofB + JTd8cl3bge6cyXUYzfpLSs7Iv2fD7NEHW7vQizLPrCzGInVej7a3 + eIxpHrKK/J48GI7ozJSEyDxSLb+9Pvvpz97+y7/4489/IyCt1rea + uz4AyDPoBwzOwbHveV/emePAASvm7o+pyFu8SmwhDcD3lPKSu1N4 + BO6LH8vMXnwK7ePU8+gUP6OyYB6P8i6Lz+9rUy2Xcb77ujnpMO6o + lzK7e0d6/XlQiRJzE5gfnFcx/3QEOaif8sdJM6+3rfTDHwSEPzLb + ClmtvGXM7ZneS467fIvz5eDSBM+mdZzRo+0tPBCwHlwfVLDx+sYs + ZERvVUGcLBu11ajFMT/GlSErxuTJEpcWYgWjQTg4uEBcJPVBjXqU + 5rSSFPAZnTKGrBv3b4xczbYscUeFAQwvCNfVoCEiMut8shSVxVjW + A77ygGTcfEb4ZE6Yaphl8+lbPOOBIUCGuA3XV1xYQX9Ifqs9CPid + Z7/dfwMADwC0hm6V3LqYOVcv4GP6PR4CzgHHMystxZm6IuyTDPqR + GT3jrvUiB17EVMNbC6f9FKd/UeClwZOdveS1WK6K30vgBQLJS+eV + kKtDs6JdxahxND6VVpytKm717fMzfIauzBXhWkvfrOu8wXQJzhyi + y57quH7XpGWcHCPoKJLWOo21W7TRiZ9ZmW+8HjgQ6m3Uc5pluuEr + xN7JA8PzGMn1G6eSaFjMjh7V/IhL/MrD/rCbRb/FeS4tLIDPtd5c + naXXxnXhmCmPlKz1qY9/6vkfDdAyfctZ7//Ah9JvANRT0D3GiPOA + MPfk+KsVD9CNni95kI1+mka/DG+0DvOvBt11HilWzL+uCqU0SpTp + j59QrcCi1Vg28jTgUq4BC/Y0pd42Fev/sds42P31Nn4taBF3QsBs + 7/g/VG9/HMAxbXWrBjPmDu6eneNd0yLSpscxdJEccKwz/JfC0+28 + 9tYna471kXqBlu9kpgfDeNhiRvTI0ag4LcXMOkKPZhfz5MmKdVRr + Zdj66IDgItl4tsKsIU1ZLeak8BOHEN3MnVWprfEoO+3Wrh1WtyXH + fOrWq2xcbfAihqg0FRUWFcTIueSBkXkWnREXdGYXMN9mAwdj5jgG + eONdH9KbBwFNyB4E/Nx/8ZGQ90507F8B+O+/78/d+ACAPeY9bWsz + 16uT5GndhLm9QMk5gq8sC0Rv9SMns6f00Inx6EUlZkYOvIixJ4e2 + E2l+CZsnlYsP8RWhFqtzdBeBBl3PYz4y9nkxEj3TOEMQX1nMrCLs + zTguPkwbOGuqKEOWy2wJLaO9AibqYkVe9BbyJdVVY0Xq2ejhTssY + E8+5+onF2l1A7FeHN9s+skmYMJpa8rWTJpOG54Jm7/X8mZNHaYxC + XSIcMUoZFAEPtdDn3BFJhlEP9z5nfXUtaxznS7JnQHFFWEmRvAKv + feG12w/+ez/4/F8N4FJ9C4xvtL/Y0f4VgAf9U4A6FOZM+1cGHoPL + cTZp58aDcn3hQuAkfN5UwXDfkYrogFT48vXTiyl9XA6KuRl/A3up + h9tLE6Mgcad8Rx93UFGA5a6MrqUj8/7fAjhSO4utM14RaMzTaxj+ + eqvvecZtkUnmZ1sD8P9sCN8IQrXmBH9wM+YO8l7HxV3d3gjKG6oI + PSGzp8WwSfI/r+GJXa+9zUm7fshjTfp+JD32EzOi57NhI16zatTy + NLNVEbO1XGxSkcWYRsRWhq3NXJ9Ot1lj5sY+38SSpSz7coEvGDFq + XkQsB/NWtqzIhWfv7JajYYpOp6iFaqoAS/nmw4uYMlQHFjPEgKWo + IhGTkhjK7b+63neUsJVXKXoWa0Te4YMAS2/0z3/y125/+ft/5Pa7 + X/1tL/iOsf/3D//c7YM/8OP9LwGMTdnxFPdzfYTVfzhA5wXXLqqb + B32tYsVAdowIO9ZGBeUqD1j2Da0wKYy8fsI0po1jy3lYPUYxZo6i + PAP5pTYyo2dZCUku4ws8M6uIujnvHfl7FUVk1fr846+RFz1lNotL + FcDoVP1Hhnk1S5UrSyozOg3FZB0GG80dQM0kO94sES1UZ3o9F2WY + JR1ZYnRsCcwCItq6VfBgxN5dWjJRaikoVq9xUKgxe7ZROu1Aa6ji + muR50PeIDrCIqrFkzfoF7qBFbQEcuZu8FgDPe/hL7e8IsAcBv/SJ + X8qJz/132Aq8+uprtz/+b33v7dOf/luXOuOhwTEn4ahNKI/DNu7y + UsYD3aq6nfWugazsQ1V65j/SjyVy8Rg9LVWl3yFxB7W1coW9a4j4 + 6Ywc4Uo9R69Mlr13rLQegj16Cjhb5jkzDH+91b2sNdgik8xzrQH4 + v89Ad7ShueYEf8w2YycPAqw2X0PBIRbBRo4QRtYRXJsyszacFu56 + uedGZ2aPp3TSyUGYHjKilwSmPlkxXqPGwZxQIeYgOubTQ1KRtctZ + GXZQGJo3MLkCOUpferIYw9i1+91ys0xuSHY8UsesE9jcqA0vYkG6 + lbCfVzXGINmQNx41K+4RZNb55Ckqi7H92kYGjmBhsKTXrOEIm1AL + WdxHohLVOTKqEx6WKQSV5jx79Tdv/+P3/YXbr374bzDtD3x8/bXf + vP0P/85/evs/PvyzqRfMwM/B5uznHWOWzuiIcGgjTP8ey+UIfM+h + tsdg41TQL1hnxqq1MiqOMFjhJ/3h3BMzK5tfdR4zcJbl3FE1w8Ff + tKNwr24JCzxVFJE1gwd54lTWFS1ewsZSVjI11hKkX1lKW9anhZTh + ebJpXeVVildzIw8r8Wb7/LfXukW2/wzw3MTqoQrzOd7u3JSg31rw + zGZbm0urHpCQrKRRuPNcmzFonmqU/UyRZByTET3mxH6aN+gdN7tt + 1TEYjpkhErX2dbPeG+3flv+xH/mx2w//mR++ffXZV1H0+fs7ZgXs + p//v/+CHbv9mewDwlddfv9RXPBZaSgIuPWTjITSOw23hs/hSvk5Y + UUP8K3XgQ2tyIpvUFdKatkdyA5V+hVkvQ/WCBKn7Ph4R2YqvjR0+ + oHlEC3MtLmgsx+3aZjxkrsbL2uvirAgSccuPk2yeasPw19v41aBF + JpmnaAMGpu8EViNUbk7wR/cZcwd818zxkWYx/wLskZ4dOECGQDEg + 26ZOnZVkk+86/a2IN6jKtmnYa41FJHpRH7G6v30e+BavtpgnT9aa + hVhiNHeuTUjhanIFQtA50pOlsDCz2jbk7KZpIMD7O9fIQcOMXHgR + A9Ewe/Fryv63TutaURNexGIdPwvjZW72LXvFuNbQ5rv+EsCWMZLW + XAtZHJFtvNeNUTvpgewfBHzjjd+7ffrDv3D77/6N//j25Ve+wNbe + 9tH+7P/P/OhPtgcAfy78CwBoZDd3w+Oco2fZWmVoIcNfLA33edhb + EcscaCGLZ5CNcfOqORJj0TMuu4h5PL/639TcWSk+MSnKErfCcrTi + AFNEls+uUMV3VpW1YmcI4iuL+zNGzOP+s77Cqg/qmjFm4BN77sDd + EHNd4NA8yzqOz+g0qmKHwZnwZv/r78farQf45PVFbN6quiJKoiWO + LMb2I7i+Kbf3xr5ZbvL2cjMCXdfJKOGQyY1Hj+DIbZ5vU7Rp2V/w + e7R6Md3mGZEptDP4d1EV8dhrQShq5Ry38vMYsL8w8Pv/xL97+8gH + P/L8Lw2slvUPALO//O+P/4nvvb3/Az95uXre17aDF6xAqgIzzw5f + /yL5zsP69MSibjn6BorCR2H3faiUTmChnhg7NzdRKBVQUKskiAVi + 5ZyJu5xHUdkQL1T08+jqPdJ8yGfD5ZK5bTteFqypHWC4R8UZM8+b + YYTr7Qxady3ifJjtvdWJDwGMa8Xn1pzgj0DG3IFv4q7WVMoGeZG7 + oiuSleCDZ0sQFcnml8++EDWlZ+aQTdVe0Pdziwg91ssj4iuLiI1x + w1xWHCzmZS/iWbEfCg10qs30B4cyWJ8rkHc6mdKSxRgqYZ+4aJOa + P0FxsqyobFguswHw7D3injuijuRnYTZ6Qg7fHb0zyDquw+y1n6gH + 3opBPdewr6gzMoLkcDRFsmCjhn9nnCNjpgGd+CBgag/C77Yv4R/9 + gb90++h/8Jdur3zq15j+lo/25f9/bl/+/6vv/tO3lz/12V6PPaNH + /+7bEZ7nrIsdOH31aC4SCsgSyWvzEPbHWNwzyIs60ZOyWTEWPcTD + +dMKRw68iMUK9FbOGfIY7dTnUmqvvY9wJtWKp3pjlZayUwIR7scJ + D8Pvcy540NolTqHAniiNoD9rMqqxUhFWWT53xEXjVERqiAtP3DC7 + QbJpYnMTdmaP8c9NkLoZd3U29AXu+ZVIZ8am1H/DLdS2mCpPFnjL + +8hf8AlwDU+J6KWkleCssI9aZI3GOTVvUDo+Utj1LNINlznMex42 + ZE0rZb8V8JEPfPT2Pf/a9zx/GBAX+2317Mv/v/Kvftftz7d//u8r + X2k//ed3rdGF2/OhrwVfgHl4hby7nXFc8li9kl+0MtPGIT/9a4Zv + olDI4YJS1blIq1ITRqWqEcZSSnIX1qHUwk5qT+1eqbdreOD9Oyo5 + T93f0+pdme1TPgj4Q719q+rPnOA3xz7QfdySAsf8Bsxv2P6y728a + LHHdvLTJYlvRFSE3jofVrU2jD7FeT0W7UFWHFIsxTswja6xLzjfE + +REqBSPUuZxNvY4xR56sWXoaFuu/Ou+urHwQ4J7nDL7VZ23fLysY + jTZUDfFMMpaaFmhbrml/Sz4rguErGBLr1bXIa9FG71+aGkQuRtNR + JaoCtXzb4EUsR8z3iojzfZ8bGXtei9gE2v/kcDSFF15oX2/bItp/ + Hpc61tPvyZ43CG/2Z4GWizkYPC0r3f778stf6K9Pf+jnb//6n/q3 + b9/1A997+8Pf/keGwtMNL3/y/7z9vc+8fPu7n/kcJtsPTHZodWyG + eHo5e+yIvSGGd4Lm6biEN2KdiFUh28bO0VsP2UMZq+dr5tUO2j0r + r/jQ7rH9G3Si2tj9LinGLbAiK1Zqt1w/r7XrVcc1Ms0r2ovS0nSl + Mks0QwmyFK96V3Rvmdb6d67Hddlm5wtYQVSvlaWEqn9lGC96yqwj + NXtFVyTq8Sopnrd45Wnd+APJN1d2Lo1EdbMUR1Zmr37koinOYbJH + r3aJOWh70s3ouv3XzGJGrBdSmkOuseK6Bi/Q6DSG9ZdqWrSu6Y8g + aqBuL843huhzbHhXGB+YZY31YsTsPvLTxoPsip2wPB4GfOT20z/1 + 07c/+f1/8vZDf/aHbn/sO/+YT31uP/EK2J/5/4WP/2J7feL2tfYw + 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 + T9u57+4+ZTeBalITaxXuEN4fu77TjX3UUvmbCKOxozwf25TlQe2P + 7cf8RkB8CGBFR5/OCGbva3JGQvB16ezczZtNgK8NpcPk+Aln/hln + jUckelkdvn2AzA8R7qhB7fkUSekeZhqXy8f8akQ8CiK2MlbE8tR1 + VIFnObLg1TrsLkWbW3+Hw0pRvR5Rz2KyxARm71o1fFxz9cDlXlEm + cY9IzaNmK9Isc8Yweb18q8I/NqN2Ut9SmrnDyJFRJtMWH3mE4T3F + gwDqckQFeB6ztVU9RWjZaC+7iHA/+Bh07R0o+X7snPog6qEXewdU + 7dBQo22V/QavS7qAmc7tCT3T789mh/3cMtYcCikiC33Aj2j2os88 + NmO+2euWO1p1MiNrICPnZd+yMlYpZ06uJp1j5qJ9TJ9ljGaPDf3K + rakHCG/4ms7KYhlFZDFmeRWq+M5SVmUpq9JXhvGip0xaa9zf/Mzo + NJg3xn4o7oKJe+hSQ8d29aWNLC9VYRb3+538zk0JySU1jqMtcCvl + QVf7A1jVV8SXigKRKw9W5JoKLpfideVGm2sZUqqjx/dS2RSwkTZ4 + qOpre7uxfUoPxXhVTRi5XkTRLt4oZLnIMC3SXv2zetid7e2Y5Wdn + rP3mNciMGFa6Yf0pSFPiNEYRZu1r1HPzPVpu1PHRGAl12IuBPsWR + LHsqBMeRuqmgv45klvlTrwqyp34Nbo77dnqYN7XqidToTLpozObQ + l3N367cTfpp+TP1MKTe58idSUWdwN5MT/I78PXUfOak+wpZ/9XVN + 8a1kHc62mkZrpl9nxgniz5OHPgh4sYvkTqY/jfX4c6EeDD6WzbT5 + OlpIcjjuuIzbuG6I2gLVcWSsGhGht+r7/MGyObt5d3QjkGGfGmPy + ZK3dILYyVsRysSoWy1vky5MVM4DHqN2UrN/j9jWlKB1ZObpGdMvP + Vaz3umVqgxcxRIUNqw3CvEJCW/n5E5DeSosTU1q3kBnzo5cShhs5 + 8PTFXDmItPeRYMMwQWo76IUX9MyPMY6D1IeI2Zd87ss1H3mshUx7 + txceDsDmHsra8r3FesDMyxu1gSf1QWeW7SO+8ueD16ZKrkUd4t3X + G+EwIidnBkqbVT9oGsjRx49yYyx6puFnBc2Vg/1ytSJ5q7LXQZV9 + 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 + NDchasZZ4Bwz19W4R9sVa2auFLRHMHOiQvbsERz+q/KC/kgdz/bo + ZcHkV6qizOg0FJNVdeHXYpeMo2YXlb5ZO5Y76vgFaMPuCgfXD1+v + qlZhx53lDD449ZWG7abBaM+euLRkkYkRU8vR6lxi3hQn0Eev0LON + 1l4eDwkHzi6n42+6HeY09jl2nI3/2k/k7Qul/Wf/H20W5ueU2fHF + B9yGY61ifPDH/BEbPbSM+Z/rZ2IjCoW1A6tmetjKqj0kDrnr2Dl5 + d/b91iIZX9Mb0sljLAmPA6setiUtwGOjSnxcK6fr6b73lJV63+1t + fF7hS+ZT9LnR2MBlb3eDJl68+tzq0NUSb2nbV5t423mPnXWxL/z+ + 6R/uNil37WgHtI5pOPIHcwABH5+F9gO+uC2+gCkgCLnTn8bUtJx+ + Uey/RjUVZpwGeI07jE7vwRnpE6XHPD8yZiM2ItFTnLwYj2iMrbm8 + 5PsdIYW6g6gptizs4qravo6yK/3YiTHy3gJj5VVdYNa5ou9NOms+ + eHmOtu9XLlhrJSLndbJqXaNCfY2sghiyRg9DYlVacyMHXsSyvvfZ + F8eYWXkesxW1n69MxWESoaqNefUjB569+1e+3cm+cVXfqqzrU2Go + VkUMQ6/HulCQDvMw1l2QE7OiRw51sl/XNVbWyf7K8MjKZgfH+62q + 7HWpso6+Iq8fHMH2jB2SdO1Lf7/xWnM9M8/Jx9h9pQBMEVlSqLAc + 3XP2EdM47ltVVgtf/jk3aK2sidiOiDtjhOoO1HVlTdVmKE50RSoW + 2XFEbm50VVyRukY/dvrxM+pk6Vh+8dY6KxKTzgsYY6+S8wfTYB/y + dmzgoncsgKq5qKSX7D11JO1nLNVhBXEKB9ClSFeWdPgwANd+Y5y9 + nPQ0d7Ub4SA002mcTWXwVkmfmKPLrFlNY05RBNaQn98hcjz4RuaX + cAsc1z+OtvTUW8kf/XVu4kPAHpng67Z1dL6VVc7T/HXknI2pzd6b + 0fMJXBCYlGXSiGzgmZaMO+kpO7ucxxg5NxtTaPpDwsL1to/U/AK9 + Q+KeI6aotIfu6mEv85DI+O7eUt3nejvcdcTDkT+YA8i43Z8vJymO + 7B7BmzsxpkBehOlPwwnAtFxesNH+VAvczjNuM+KzgxnpE6YXkofD + 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 + t5MpCBF0NisyIyCzWhCtEDPJuR7QVVzyU01x2Q558i8vAFKrB/pX + XHJ+n2Dd7DYzM8YOjMjPXMMnzHaFOkT0pIoYWFDnSn3DYeumRiIq + nvwzO7tYjV6sErOIeeRktM6N1VFR5465sbLjjJ2uv8iuPpZvtBZV + 2F0r7ZzXik0it9U1M2v17X5UF/aznvc8V3vPWp88lRPGCOEuZaRm + OY8dz5U6aWYe9lJJmRm7Vc9aq0rmFjGPyozmrHes9eh0iqnRJ9Dw + fHBSdFw99Ll31ZYNPTtXkUV45CyicchkdPB1DeqzYkahsXO8Cuzj + VX+9feOTXbu3vow369idDlO/CaPiFEWV3e/CJNqjOCKr9P8I05ZU + MCp+/YWABI04eymEtdTKKS9eJT2pBM/zM2O0SPt93c3nJzUZ146H + wfE4BX2d878xwILPT3Mves2RhyAJJLFHlT5hjNKhqfAelqf10e87 + UPbG/rX07/Suwtw4e4FB2iLC+wLjfhx5vjnkRpsfxbh+MT/OF9P3 + U8AsnqPxwekAR+XP4t0gjhXjav56HjOxD97REAY41wYf5L9g8UG3 + M/U4x7Fw9vpJRdrhBz51BNTrWfm/90WA/XWAqTkGk/OHXwTIkwJ+ + ok2M7W3FnZWqmqybD78Q4CRiYEfyBeg1mYxclO+a/bwIsnvtQF/o + 6MkoC7gnxMHla6VNYrfkSURsijo3I9MazntBrfSatJjH6uD3u6/v + Nqenc3Yxt3Nn7zbck3HWs0O9L/r7v3nu22R5XZGJeWW2vlIi87wJ + JZmmgytpSe0a1uc5nRiCJ4132sTKD1ZD6OpUm1FSao+c50xUjvQ7 + 3E3rfeQaZdRq8NzumY96Rb3ddr3nudo9u3tH6GG1yqg5+eeImpsn + WPHV7ktPWBQ5OgDu9xIqcp5njQzEn/maqmrg9XT2D//bIPvkDF5E + pwisfQ7vA8gunDG9s6e9nhVhgLGPgTNrdrzY3MweZSCwK6aaVgs2 + zlQBwRkuuAbbO0UhOOlNLziHMz5Abcie6vpMHRHBjMaKjVd5aXDt + nBgol9mU6DdL4Wt38DFIfQ7sbIthQM7VcQ8gidQYw+qHZ/ugJiZT + QzN/s17nRBud1yuXSc8Lu1fkgwsaXuxDaZzmdo1se//TGtvrPJcQ + xi6qZAVz47yNf3C6z/SFMUar5xdW51niX/f4wvhF70rhNV4rfyqf + Vz+jvzHDe+eR6eDvfBHAvw7gxnuRLTeAD4rFaxzRZlD4+JHqdMhL + GX7N9eKhhnCV8/nILGTGz1n2OM1z1/Snk8THlwFrixIeWhveq4qs + m/xlQO8nVsK1I0fMWH2HyW7kQ3JiFmWM/KpWHsXqVDmiJsUi1dFW + I1ZKwVO7Jz3dweQ9cwKTobtUiLlFzOlesZ5XZN4LOqK+dV2+qB0k + YhFzc65or1fkOJEX3HNLq0O9DnLd1e4nwYySkj3AR712jPWbc3WF + n51r9Wd5Ve9eCh9qi1Irn+Z5RVhXdslZ7zl5dExeM/i60T0rEh2s + Vt/0bTQSW5xcV5LyxjbgY98ly745Q5sZtSo+/PcrFWqeJ58Jo2JF + 8nokLyzXY+4+qSZMrY8F3vd1BEr48YFYZX+Q50tuC+nMiJ6KjV8O + nueneo7QZxwnSfABaoMPAvgaO2S3D1Cp3zkJbo007UTmY/CJubF1 + 0sdzdRe8Yj/MxW+aRGztisOHoNzoOocYiiwdVDBKBE9YZyRFfDjK + qFVsFVhJZ7h5DECvmOD4iTWNJ5GRWHnTHw2oaq0UeOM1KxVd9nrJ + o92F+q6EeWG4zx8+ruDyrqewPlRE+h7R71Pk75sfmDA6nbdMyi8P + XOMv6Z/RPprjM+sfs4fZBohtvPjzLwL2lwDb0Y13r5YbkB6WhZNq + HFkjqeGnlDyVtxrz2w2jJD0SfWGW5H6AXqcg3vWnee6a/mKV+Svb + n+Yzzv6Gy20+FFk3JpeXKdutypTcMEbiVHnvsfl+oR/7EBN3O6Yp + 6/upqQO9pgjesi7W0TOepzoVFjGnslbqzFNn+lR19b3ldAGLyOyb + UJIhH/eItKQOGgkry8vNk0zqMga3he5Cr2fklnES9svYnFXPnO/R + FLTKWA/WuZ6zQFsha4yMUa/RXK/VPmPugyy7AJ079ulm9YzCu1aZ + WyS3+GDLF32y4BPPtaq5vPbgJ5J3PGoSrzLerj+ZhHsUePdFBedn + hjBtl6BJ522QfXKW+JqwrtFl74ROdnfqyJ3dr174lzcQ3ViRJ9bU + /YgVs4l3GGOAi5kyptVivd1icjDWNJmwg2K9ERg/MPc2SxbeMJa6 + va71fh0pwpCGqQJ6C7EW6TKoURYLL58nOlcOMyyB245XO6vGjANd + ukEGOvLDGG9gPk8+sa2pfYFx4b6cyb9crfzL8i9dDyWbmXt8oAn8 + 4Yft5vRBq6YNV0uq+d5Ucy/M9ITektnnqHhL3+OmL0k2Zt5vjU6T + LP1onpqcxP8k/Kdr/HTMod8AvXJ1XXhed4wO+lBNuCXA+ScBcIEn + 8jJqeTBAn8IRc/yAUs+o6yC1qHp5IbVfQ9n9Xa+GcJ0UxMhiJNWc + kW+1eZa7JnuYT3wzsNSyd+tHnmzFqx7THnjPLZBLIFwGyYKerhrX + ySrlMyYT5SPzrFo5ojBervTvb2Z/62gO8DKMt6bM/qxK/ydvzBhV + uF/o+/9/EVD3h3sjlVsGpXHW7SZnjcAZqVnO3aZ1z/2QzefqqawA + hnCXMlKznD/PaFNVVZy17kr0jDzG5kZPRuSco6o2ZvWo+ckPH2nl + PGuIMoLbRvbzpT5norTdukYIMwppqqaE2gpbXlE42rlWcz47kINF + Zk+biKzT0gLDDRJ2sO9Xl8t3MDOStzOrthamIbqTsHiwzojVp/ta + mdkwindMZ0akKaY3nH/iUXGKTCUun+jJZX/tUFLBnCtvxH/64Umb + 4KZfB9JeDu9ZsoxrMTDm3213Fspo4oX3wdT/bmfVSedv2qb2J1PB + 8TPpLtj7LwCqCRrOQ81rE49DRa+jVS52Ja1DtPzgHnhx7vBa8eE1 + LH0eZ/NWi404TCKhzfvoVFRIYYoz8H+N83FV8b7G6Dj/2ugwtLP9 + WxcZ+9VWL81kgj9zvHe+MdPjx4nxcdKnV41zpW6J4OFLABbaIyeJ + RU8DUelRORtOA2+snoSDn1qTXF5y8Guu44Gq5JUst/7psknZE5Gc + zcuiJjnOAYeqeMYDY+3h7csAm4wdVBnksR7vjkRZK8DBCEh0uGH9 + TYCw6WeR3BKLfhlVXoK6v3LcwshJsmvnCsSzt1XZpXpX3/+vfRGA + 3cE99rh+CjSqu5r1tRrFi5nJXqyqSnvK3WgHd36thrH6ne3W9xlr + NXjuRdeulhNl5C17oKQzs1ZyfpuxtyJSXViRCFX74C/PRvEZKXNP + GTy0rs+NCTnJEm4K6hiBVpCVFgTE4UwmI9A6gsrzmVpGZ1Xm5Kyp + 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 + Lifs/zp7eYyqf8wZW2QT4I21PUFgFcKwTuxHfd2j+iVZrdMtR1gW + 0akb+nZXshnFFZgva7KkkK1y9xSNzWXMzJeqHdg3YcdfUo15jm/V + pVuvkv1X1kjGmeYZK0q+qPuqWa9K8E2FxuSjnpGcxXnB336Wttu7 + fr7PMNvkXBV3/9O84owrI165lV+71fop51SMbGuecmPV26qK9Twj + HjNxdcLGKnm25yTmkdNr9OBzWdRanTXJpwOPCbmPb6uatIJ9pMEX + sCezgFdf7KqucRXjWhGLHDHOwVLD7CusP3tg7tjFZ3jV3tnRwuOp + +jlGhUR177RKivYuqWugnZdGlUftCwCv+Bp7MO1qZwGZZ1nXrrZC + P0y+VSk9OQQumr0+oy8FHbH7YsKpepjNiVyQ+k2yhU1fSMHiPoex + 5Pnkzx1YQ+/RZyucleKDcrvk3gxcGpR0djg2iuvIc+Zstn1E3X4F + iKPoV5pEwylGEwwQzwMf9KE0QWf6uTL5OBbHq7GT5uCPXvPH5dQh + P8nnddzR4yBN9p7ZpHq9tsdWMEzvaBIevBz/62//TmEBoqvmBSyp + PnBcs4tyCoeXF2bfOUiRpFwPQg/xQrYvIUqVAT1hIozcLGkkoc44 + Z41V6oWc+JqsGzWtzvS3ipAZSTUqyqpNvG6pcmgMdJTlSM9p93mX + R6Zq1yu/auUNqR7G0GwViK5og3JiP1PJOpp34lWG6KqLzJ4uazWv + SnmzYjNreWuyl8xo/2iuTZtntj0yRdaZI3zjinCfiFP3FESONOsC + 5YWWHawa/zFfczKlMPMuqmW6Id/g1G9BuV6rsd6G233ogNVzfqEA + tbVu0TpRR+wpMs2sXGjevCezhxnmLi9ME8Vd9CLMO0OisbBTmQWU + 7H/4FUKm3HM8vCuhW6T0s+ZcEdPbNWNNq37K4zUuKq5MWxQgVa2J + 3hLvPfo+UkidYaLmFRqrEkcn1Eyhsn1jE/Q5RF/RqOvxm8u6drM5 + sxdmBdqfOyrDmEQtiuuH14zZ3WbXJl2g+WgXIrlbjTsaJej53fm9 + 0zCatpzuc+wmZ8pqy6T34Th+SMr899PzmjeHfoVk5ynDSvfcmHE9 + /41ua5F5PmaMcp8TnlnxKeOkwKxVecnlwehPVgffeDcK5eXRH0P0 + ZzSbsc5ImXGWJI0F0URdrCURn5cjRV7bWMmCbzNcN0v/7G7DYKRn + /puh4La5SHGWJi8PSF7SF+1JUeqevhvK6W2gc6VRb0C1qXnVvhu7 + qn6QzwPN6NTmPdPUwh8WqTYDPrX8BFu+/pkHujCCPQ/vvgkPV57O + 9rf9JYCYBKJ6al7AkmbNLsppOLgNMh4ORlJnhjrO8e3vehoFcZvC + G3C8M9CNNXiSVWvdzzSYoj6RJ74k+uG5usLDzvbSJLHxVGYlv536 + xV6xg+kjYuuLH3phnFmC8qXb/PcLp5rKjb24C1O0xrGz3RdK3L9r + gBUJuyqBRY6tsu6pMc1B2NYBqE1gU3E1ygnE6ozZTSHEfyTf6PQ0 + D7jiwt2z+TBC5gQWCHs5srpQVbTmAsJvy/QUsRj3qbo+80O9zCeN + 6oSZwmrcN/O31WX+s1+YRtfZ9ZnBCZS+5o31WpX+qDMy5aSPfKk/ + +3VX2RnueK5Lxo/91qHPl/VyhfCofvX60TpvwvrpEVeZ/SLnk9hc + MGfOpFtc0coXwZ/bV5t5hhm1qXqNiEXMMRXWY3m+l2Jt7/c2ELaE + 94PdGBVFHUPLxp40ld72cOl9VyeDVT/AezDrcOcYVZiYx3paBmwb + Oge5eNcjPaK2QZ4hZ1UfV9WZ9fXD1J3XXTPC3YY2rlWr5dsc8OiT + VrrhYd/+ktcmUZ+O7tyZU6/MyvPz/sysUyZq+dlzVjORRUzyckxl + XL9TTeTAcS6WIX1mjLuYZJLIz+W+iPzrh+X5OgwDfx6G3uNa3BFE + nL2QgmM1Flaje69kGZLvVDCIIxgWEfF+PjhB1B500/v43YY+vB4P + LgP8ovegMuikfbf+o+0nhdMIBw99PL/RfLOEN757rg+oh5V8BvP5 + O3fOWfSsG3BmqmqVf+OLAPu/A2CO2lPzApbUn5F9Kpg9n22TZOF5 + 8R2JFFHt7ZVZwjzQTW5zzWZEzTLennGfgOQVOV8DzxIHCatTBJad + 92ozuDJR8rAXGMGwLXI2TtikVbW3s5FlWmEDFV/VypsaRc0J/lKX + w9AdbapLlGGcugbqjDTv6DbYXajBTJhbcjuUQ+ICLSFDEOhJjHVx + qvOaO25ZhRMqdsZcyFBlP32vsGD2hWd2tMx0VMMvnNenJ/17gfIp + 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 + BUQUzQGZSKw8p/H9zu0Z8o9i8QC6SD74o28MB3/saKpc3E7cc+F8 + 5aDVOqmt8nmxSFpXtIkdsiGVEE2eJDSoJGsfUjJ99hHT81dETCzs + Gd8NoLF1rdk3c1UN1r6qIi/tvbV4lBLwGhV1qOn/+GSP3Wm7OBFg + v+KgpdG1r0q97rDUj1jbKPPe9336CXN3CJ85r5gIoNJILbV6wmnF + VOr3SMjEalTNxGL/g18YXv2W148yvEfpTvz0h9Iz+NyDrKN+5GC/ + z5TNfji11RFmThFZSO7NEwDoBtq7P/CesNN8+wlckcqSq8eF0P7n + VfG2vWmFnDJHAOqnN+gfvUO5OfBzgUNb+pWAErTkxwRoN2/X1CFh + X/mQiH8VYIJHATBhcjv9qsK0NZy411KvyKYuB4B3a90tR+GNR7HD + UG5rF/w5vslzez2U268DJH0kEh8BSx4I9D87FGY20OjHU3mC4NRK + TkmVUzu5fIO0bLCXf6XGMJNmU00GpBpYP+q5p8wSYR5JxP0zTiiZ + ICGaHcCloEwZV3oO55969PPJ2SJJVFryG5T1DgDgW3TZnhaT65CK + IdrEkhl3h81NapTglJiGrlTuYRlDD53kuudUvgtAQ8c1aiOxRJBn + 1OyB6rWKwlsdC/j7NLvbAc8Mb77kk/yrDbK10N24FeNYE4lVWCul + dcwLJNK6zixzfds2MiulNLZm48cbdFvTYw6z6fn96WoL9qk8ZoAv + S2plbv1ykB5qP3NfkxolFiUPqeWRo9zXOUwE/N2pH+ZuWl2oGqkg + Jm2tRbLVEdZqeZ9XYCLgpNM/xeVLlSvqg/3PiRo1MZ1RwIq7DCj2 + 2YZ+rvDYE9/R8L8nC/COgJPP/Ed6673cMaE9TLVKyasmCRLBthW1 + iHIFTqnwnYWfALy3PQKQOuwIvCPgo5/5OEtqdRg9shxQHzIvqfO0 + rWaUU7tRbnqhFFK+xZTzvn+ifQWsfrr3e20Ip556ei7oyfEjAewT + t8U9cpNsDPvvN9mvAnzx1FOpl76aPQul5lNRH2AM+WgOvG5JpEWc + uU4zw1XmPPJk7II/T8DkuT1q5B4HIKekj0TiI2DJw4H+Z5u9YQNf + WMjHqIhZrFSv9qbG141eJplUKBzumifu0Ble9Ok1GRB9Io5xStWj + csFTHfJ+qyfWjdyiEnLf2nqX7NCn2H+RpeAeZiJ62913CDNnbR2H + iHwdpvjck2Z/kEW5VdgnOQqR2JhhKW3qc4lw1mfEzO8CwDCVnDFp + cX/6WcDtlj5lonqMc0ZOfrSWGee81E4wRVPqx8W7L+m33ekx4ah/ + eX9jIgB9lJN129ba76ZENbSOxSxr2pcXRByFRkZjrUwEhfCsaboL + QHu3gB412Hr2I5ltywr99Dnn/S730FQuDaHla+WTgglBb8slt73v + c/PphYGHHntE6qjUhZbyP8lB5NslP35khn/EzII9dguHv/X1cQ9M + 1SRe9zgpjmjymqqMi+9qWE4AwO6jp39myn8F4I4Nd4Tvrfhu9oFs + Kts2s7cN76M7AlKzTpNIvwWhbe737JPZlyOSLWxBtrsvWRj+5rij + TTYN1C1rbwnfWbGKP3dM8Lb2LqntNG+ncMzb3mymsR5Suaw4ZuOo + 9opVNA6uonWo3UkH2d3pT5YjK7B69eqwdu3akTajlOk5+4Ebp92t + XTMqn4aOYfAowMsaqq6C9es3hGVT8asArV2qK+rSrllX7AA46lN7 + TIHs+TvE+1WgR4nk7ngAdG98zGCX3M8u+HMsk+f298vNiIM+oROR + +GhZ8jCgCyuZFW6gCRRg4MeNwYnyl0gSJhq0WCmA+gmOSsVXv9j8 + Ka9qZJ3s+cKZZJaYGMSloOuJhXhZ5plp+jr1UdmW3PJ4mruTExRs + k10WP5ejdxpD09acBKSGlOc6Cbcb3Q3wzaM/z7lKXGSdMkjyMgvJ + G5Gll+xBC+bcnQS+BoLBluwnPDCk1TD1cQhYQH93ekAiOnHEjWHe + gU+bhp8F1Bi2luy1D+V29ltTfKyPRhnaHxelEwGffOFbwl0bfh9H + jmxXTPDMoCMa9qa8Us2apsriCEj/c/smb1UuLZu2auEnnNQfYxn6 + PQ6U53RVPh3rJfSCwK+e9MUErbGTgAlk07dpD2t+pgOl341tljX5 + H4vs0GOPDKsu+Hb46bU/jkcgGRuyRayOfyz1mLSfh7/lqHDp+ZeE + n6y5QeqJ/VqKGaFlD8j3A6uzUZaJyuDzanoPwHZ018FUtG9d8I1w + 7ulfCVeu+E7YQCfK5fkG4m1Lv12/25Ldw/MPfnF4SvzJv0liP/O5 + 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 + mjOqYvXHGGtZ+yurVWgsavTTdbAVpj1SvRxmb1QreEVRR2XDDlUF + aDqRnrlElN59GZgjcNtd2jVDO3fTTTeF+fPnD3Vj+9ZHAiIavzdg + BDIeUVh06SLxRFezHzGej/gQrdupJcIwca8U/Ul3Lwc1irmov7Z6 + FV35tlZhulrcCZDGfLGNMHmOYPJmsW6+/vrGSwHhXb0IsPKOG8+F + cpYXAvynAhkb+CCKSQ4RSiGklCw70AyfF6SJT94hcwcwLBdrkDyx + nTIqIxuGc3KGSrxoSxuoxdM0RiXnBmE2oAjBBMlWRKYwSkzKjE1f + eibIUQTHIUjD1/hooc3jYaCvWfGrsOzMxp0mveLv8Fa7GwCHBjp8 + n/Tq5/TyL43wosLrF15JWebD23Poge+f0UaVuMN59MR+s0Tuk4vG + 03p6H9GphWg001wqdVIdLD2e2dIJFjGmg4Y4+U+11uVqHsB66gF/ + PvqrAPC/7Ax6vpWw7R4DypcWtI5R2LRNlqtZ/L58FtB6nFNP3Xu3 + 8NCOFwSWNeOlCaH+srUqxx7PlUszrtluI5qPKkTShMqM8/Ueu0BB + B4L8jMcWw5DNwksRy09ir9G9BrShlRrhS33Z87rXCCkOKuiXx7Oe + e8TcxmsqNC8T4OT/9KS/4jFTUZ9c1eaqxVeMjv3MfZ7NI0zGmc51 + +TbHnA/UNjaaXk0JcPCX+bETvw+AnN2qMxaql98228+TOlW7QkJe + GLpEJkBWMbTm6tuF1QKgruu6zVLLGI7clHQnpL0Z6udRzVcpRfVW + ka6o1Kti/bsRVXKclEi5FZxkP1pPuZ16yvhb79tO9Kd5FODYLx5L + 3UHR/A89rBTSm9RouN1rp0p/qS96Eo9ueXoW3ezaBm+8ydyw8Sby + 2Flax6a8ELDorDOq93v486LUr2V33PhxZWZ1IWCjOx5AJ/H5QRVi + oLDcyawiegChWVibCsJewsE1cwcu/8waCDknkhgdTJrMzlDKASA2 + pWWCqBJmDTVFJkEuU96kRglkma/pQZVa8Rkyz/CIMV7joxUpoukA + guSqr4y73W7TnbYKG2z2iLQZ0khb04sDx0wXHvY1dkNOOPjEJHNf + IZWwOrMxyTRUHleRfFRP+8xgm+vUe3jrcTyNTZ7wzY2f7hT9dl4i + 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 + k9TbBxr2OAyseITu08iGnEFrA3hROFw4V3aulnP5eY/PVN+Ml6lY + zNmUL9cFNmZZFhuPnV6RYe17fd2Ddnf4Ev+TgPL+j+OxbT2/Au6O + vC40fD4ZPvWJS3eveckLH7771XWv7djnVvuE3ATgpl56+Vu+6S7X + vuUfbW1wDZ//ZCB/SeAHb3CZ0mkRZV3pQNm/5OuLMKF8YtC/qHOc + D4Uyr5a/LGA3AvjdmtCEAG/tS1K9acAqJFwPZHsjoKpLIdIc3Qig + XrQZJTZ5FWRj4RMByIXOYb48Y3sLjmy1fV1sZRBxPqLBJifOxaNu + mXZbExlWyzG3mnwqaMvnnyCgfD6IYeamGdGhLtHtAsQzBxaKFIpC + uNfAbP179V4Y8yXqu5reZ9UQGXkU0ZGtKhDNzVABKKWJHsHu2J4z + 8iiiaLfa6Ede9JCHtrKWucIoD4bxIw6Ved5j5nJF1VqrMdMba4wj + cSbbPXsM8ygXXwaIz3oKAMxgt2l+C9tzhGc/+McevfvsO9+hJSa+ + 53Awegl9AXrtS/9w94pfOz9hsTIfFd38+GhF9vVWRYmU570vuffZ + lvLPZwyLnD8mjPLz59uFvSG6DM968tN3b7/gbSvXhHPx2d7Olyzd + j0QWbc+QO9K/9H8hXfDf5va32539FfeSf/lv877p4d+2e/Fz/vvu + bX/1lja0l69nSFyPTGiZkWUdDxZeu/cs0c+nPFb21LM0V4kVHC/M + GLb0VeMRUkn/CNkbUn2++WNy1URPMGn2SD54KxvW0mrvkWKpG8dB + pQG8UVzoduHd5+ZFRnzBIaXloZ/ZiMnzulwLaFcWWxqZHTilH8ZO + u9EZu2+jm7Zx49cPelwwjx8osMnjJuDu1OtH4P/qU37oHz/64Q+9 + EKBjM0/YTYAnX/KiV/3xWU9875dfcdbtjmM2/CWBH7r+5bsreEXL + MxWb/Nwon6ojTBZbiqvjvnZUL+7LHYAyUKL+CzyzWJK3yuViJCRa + UtfeJHtBgTVtcCOAckozpl/oYbCYfM9A8usFTK49l0zrRmK0qxp8 + shbP+3OrpNtSihuj0VO+YhjpkUyZ+ibYejMGj2vzaw4l1ONKj0bX + BZsXCSI1N8U42neRryuirrrF8n6tqmYjPtPreVnvvtaRH71RZWSh + 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 + VzjtBUHgwoWmnEwkyse0XoUomYByIpTTR2DpiE/Uw9wI0JpSvZaX + Vso8NCKI9FPK1yH0VBnt7JmOzJoeUGfoWuJaY77zEI22VzAcsyya + YdoqXpwhK9p+IY+4qW8ZJb+IoJbauCdVOijZCms9P2KxfsHLMx3m + ez1Ebd1UxTlRNXpj1jiCChmrxyoymipKhjNMAzWfXLRbL8iAgzlo + A2Vqas5ypjPcmgpTMB7ByF6rMtNAxZneWCNG5hpyqmPJYkcNJ7Da + cW76eH/+eb+0u9FN6Mt9oBTaAMsLRhsb+W33sjZC1vn+w99fLK8/ + 8jojRzpUOpjzeXf5woNpHUxI1oF37SpxBVhRWbS+6gDuiQdBsh73 + E+aLfb7If9+730sX/W+jf/F/y+5jH/moiPWrsXaWsF6TtpAlymvl + h5rbBWpGfTMweuwPi9YAzqeCBzf6Kj6HdcUqfx19ynKtvq9pIgYP + nmpdHUEY+0N7T8l9bgBg2U32Hj3ukbKpJSdvr7Q1wy6gvSZavdqI + r9dOnos8VkF/ZFu2xvvaFufRNGwcxoqM8R75I/prAPrugc992qRB + NXkvj4gGY5I823V45L/oWU8/75ee9DgXO0HWNXITgOf221dc8L2P + 3325/W2fg0/3zEtP2/3tZ1xKfy2A/hwgHRl77eEDGm4ElKA+neme + vxOADzRvctzsQr2EZTDRgjFXTha5EaCg8ljEfFItV6WQRnnzGwGs + bVvII1C75JOJtRlQxCoyw1o1DRtRq5yOFiI11G5tVLcUzDBMR4xk + mT3L8jHTMB8xim8pHHcrz3J0ZKGC2rjXLKztOpjp6HorqqKa2HZC + i6CdBUVd3AarhTNcsVjDX04dz3JZGPBi8uPHUMx3uzaUGJGFHtqa + WJA+UHUxhHbIr+we9Zx4TJqU4HpOgDtHeWvZnL6F25WrwExlFqsC + Q0OzZxr7xoYl9wzwdwPwZucp/6WAz73zF+z4T/h9gC7UOWAxs9i/ + 1zlfJXl/SjzcjMvzY/7n3PmOdJPhjJ38NQDR4vNHYzKEna+KW4Ew + cKzqIHwywbVVmiHbNMzmys8gbbxKUDraR50m19J6XHHbxh/h/9iH + 9YL+r8m+9CMfkwt8/kj/2/+KYuVinxvWnnniR+sen19H3XKFNVXa + Neajskaf6/a5OSY9htcsQRZ2vTrOR9/X9JxMdB2LM7FCorQQTjIO + CG0tDrPemgpdz1PnUZCpJnRVsWAMJeeZ/PhNT8gqPs+vtDXGsEdO + ngbXqB+RM6k/CA3gYR92YZwTerURX6+ZchVGp3klzTg6au2IuU6L + Y40QK1Mw7JxHPGZ35ud8QanIp5m+WgjAXD61yiZnWYPxOSHPqh2u + qc/+0cdf+oGLL3qKaZzI8Rq7CfD4i1/wnD8564k//m+O6U8G8q8F + 3PKT199dfMNPyeHKFrU+JdiNAAKuho9yc5w3fu2qF+olqebyoaUX + dHt9k5OGnKtNk/OdrCdCciNATwU+Q3SzFJbh5xSPGCPy2BNqqess + FYiwqceq+Uu/c00TkWj7WwfHySrz3TsfZq+6rm6aw7Epj/mognNH + fKg7CUh+EUEttXGvIlh7IjsJeRW0/Gi0x9nPJ+e38lmkxxBBu1VT + v2f0yIjJ+Ijd5+TMHNXsVn3OjTnEpXM8nubj/HHEVPtxlqMx3Pf5 + jMw0NGPMGD3/dJWGEsNAJ3HcAHeSbfd76Dfuvowu8L/jx/6v3evo + Ap9/+IZAuz30x75/d4vb32b30PdcvHv5816ye/mvvWT38Y+0H7vf + 7b76YQ+Unw8Y77nn7z5ReKMe2lrsh5WzFxohhkiWetJhW+bdN4/z + XX1GyvrxN//zf0tb5OT8v3j1a3ePPufhrgc0MKlU8QDEGYx6WcMZ + 5SqOz/wZc78K27Iadjhvs57mGKvpl4POeVujTZfzdDiOc+LWqHfh + FmgIaMV7Ro9ALpuW2sC960pmzVPzqOX2+iuQXHIxMT5unX6kXlwm + WtMep8Goc6K9QWsDeNidXRjnhF5txM/wgMnFj1exmI0cQdtOdMNG + oyu2+SXSTMF+DUCiHOOTSgY+64oDuMaomwbj/uS9foPznwR8zUt/ + 69/sdsf2b+LS72h3jd0E4IZ+//K33efsU8688Dj+ZCDr268F8F8L + 4Hfo9jrEJ4f8Dj0dP37jzlu9aCdMbwQIKodYKLS7Fl3Ny5MNH3f2 + TYcPLehzplDKlTfaGiOdcsVQpIoWR0tDplG0GbaI5TA7buVyEusK + IctwzK3SdxF1PLtMxWjemzN4rYhjExj21M7GdTESdClgstilc9xC + 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 + 8Mb7c4mTaeN/0j7ptu+7+LlP/bNTLnrfcTZm3w9gNeSv8lVHDzCe + b9UuBr8ptxOBbwTIVs5QO7EYc5syjEc4fzGhbjqax5qizScR/Tiu + EcmpuezFfA5pb8Js8ouoPKmyzRsnlB8FFKt2bmhVja2znYVWmIrI + edQrL2M6M37Log9eG12jsUgSVdFGJuJzW6OR4x5abq/rAftZb2MV + z+rRDHHMrXGvyPFKrXU0Vp6do21l9pHptltZDmI5M0cxz+y1TOXh + 3hTG43rtdcw5q43aI81G7bNlxe7nUeGy3GSbvTFcSBXV5z/lWan6 + N9JfCvic8ucFucvnNx/5tyT+okDjMfasx/9k+NUA4z2o6HFP9stX + Pnu3jN+O/ozWRv5l+Hyc5Yt3/2VM9yCzXD6rjlCGbgBs08/Zax6j + WZe5WsZcgUET++hC+opiGaVVWOgCw20qyWM4VouRJDXSj8NLisau + 8qL58/yazFxvEU369Jw8mKOedVhrUG0Ac+1RyK9NtnRIj//+TXsV + yGItZj73ZTYLLNs+E+PaWBsAHYvZOKrxBXe5++7B38+/yuf6bKZn + WcUj1+qHHKB8+APv3/3mL//s9j91ZMLHOJ6UNwF4vr9Hvxbwsetc + Dst4+FXg7wf4rE9dLwjjBTQH6vlORj3AwVCnvRHgZDy5SaPmwklm + YI1xreqoxStBP/yP57JhP8DlmMo1+ZoUmP4Gkx/YNVGYtnMV7he9 + jDHDLNaPqDq2PeIWrCHJKo57e1j7TLm6LiWqWE8xV9GMZ/w9xiPL + ZUeh7xvLiO272nTHqZGRgRnG6THs0E5tZiNzZJtqP2JGjGIk2OiE + 6jF/5IX0lfmaQ3v9H6SjGgRWKmMGruVYlzPmUdfcxitPRviiSZW2 + aXhtsUSSNEy6CR/a5X/xf8F5/Y0A/mb/R/3cf6jl+Hf+/x+6wM+2 + H/rVn6x/CYC//I9/97/dWA95Em8WqnGLxAlaiLbhk8SXi/9wfvXn + cr5uJ8kEDtoGnwu67TvnffOsrozJJwBCfIVzIs/q6Zx9SZOup5m6 + FEnWGMr0pg3Mn0slNdMcd2CReVVmMWM/bavRjctFuxQG8hsAKbUH + p1MYBKd9ToN9/WNBtvcwysAL47Wt8nu5WV4Wa98VGKfty3DuJbf9 + 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 + EFxjhJrctvPLBzR3i67o8Ep2ZtqSrXz6CJO/m8BqtKSJCSlCAVon + Qd7wIoKQhDF5J81ONtLivPLN1j2cwT9ORTxAvuaCAABAAElEQVSl + I7WMk5DY6YNLxi1lY6v8hoMhdualpTaOZW/RQcWzt5kBvbVdKvDA + y+BnrTQQ3s4W8lhnW1uwt1bbOIbDi8xxW8chcnyyyjLD3uWQ73GA + 9c2Yo3ql+oENj2rRGj6cKw2zNAITlOPL/aUbgkcgkBrpOkwIQrMh + gO5Z9uK9mSW7EMmPp49d8KFqVHGPMiZjvUkAngC4+M0XEoP75qcg + jlVE9x+xZcd33Phxz7as7I2Ljl7EWq3fvvjcFrwU9voPvmupuEWC + ZvWrMSz73Ls9eXH9tdel9LOUq1L3oaf7txb+i7+9zvyqmvoHznvv + cPRLjpv9FQLW/sC739tKIZjpdgnkaHKqc0yt0IyradS71V7GMk9k + m3DPqbSUGKumrVcqtFldlMIXz+lq09mnGa62gLUCWTyX9jOuZFQK + 1dFa+86+p9BflaZns8/6U7Ie0WfO0XJOVHTc9Uus1zYl89uWlRax + F+FmbUp+oEwAnBXPV1wU71ZpYzUKaYUTAS876hcu3Z4fBKij4uvb + 1CTAmd+96Buv3/uIY16644Hn25P8vaurb7UnAjQP79D2VxbeGfWC + n3z56kdBnAiQy2EC7H1cNTgknUppT5bTZdKQDQP0Awm8YW3OKRxp + E0QxdgDgB/4+J/FJSzipmMzXNFIj5+fMuZ/c7C6oYCTAVIwchKXJ + DPdSLTAuGq1e50ikjx2RvN9kM7FYMLZwLdBsqbSwWrL5elD/fQol + 9YnHhHqja+1Vbas+xnpGizUOq6GO4YZ6pI9ijWEvF7VRbb6NWSyq + hZnPt8iatpFhGi3MfLrNDBrabEfKaAtj0B4NAucyMRBemaiHdkVc + pLddIXewRae04X2vPnfYda/d876Ke+e9H3r/gR8S2Fr+6NW/N3zj + sr9Pd2mZru7vm669IYewp71YTNtbo30l4/J5uDtMks41Fs1uOW6z + W33pmt3bu/O9fX5q/0qWBzz8wc3w6/LkQu2+iP6y33s2QMnmuwC+ + fcW3ZJcoff32xJ5hHxz6ArM8I8M9K34x0oxsHcrEaIQyOhKBY422 + 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 + U0nUoQ87WN9Qbflhulhv1DVXNwg/sBZVf2KJOGktla73vaAxP6o4 + Qhw6mXEVD6X9MYFqUM0R4pSmI3Nb6+YqibWmfG+ZYld97ZMu5mXl + HptSvFDDcfTf5RHzuPHixN5wirrOhsHuOUIFv7WPuoDaXKf5QIio + MyMfJPg65zxP5WtWfVArUXDcyfA4Fq82E+pNbS57eo0SKLneYhyh + QhR6R8Z/olUelS+TN36l7/VasvkzFcZyzdpTdH2S4+a0GjnitarW + CEe+Ts6a3nme13zUTg/hoZWRaC9oLCKSKKASWQYMwhUz63z+RrQ0 + TVe4XdbqPqx02792NO1zPYKsPQKfWUUaXKfiPuETmBWKvlmYYIDA + EdXqyHDecFPB5EIAhW5WEWQWIUfv7WjXVFa19qv/Fn/pEoV+jtQ+ + TFsWGM8XWP/QzRqJwyf04OtswKOGnz9j6z8B4Irh3j5oP+KyxxzJ + h/+v+FuPXv6tu1SfKTcCfuiZ333t7//+yy7kFR3iO2YHDjcB7ph9 + 3+z6u+OnAp5yR/1UwJ43AmJ4+b0B7xk/HfCJcz6dLz5y4dv1Advf + p4kqPyuHX/+FgHwBtwsqH+OCObDpQ7DpxFcj4QH5rAYQLBPZKOmX + iOJcgTpoEhtBxjGDIOkrdos6weg5MA8+6hhUSeszio6rOtDGSr4x + B6RDYbo8KoC6xItSi8jdZ1W41pqS+Vrr7VTAlas1SCXPG96Gc0Uw + 7Fhroa7VwOdO7Aad+CJDFP1slnQbQdUg6xFyrMemjXyr90alf6Mw + uzV7dY6ZrTLqpbYiobMpQ1dmXs6A9RRthWnfetfoO+PLdaiMp7NG + vToVI4iVxkjJTcwJtWnUO8Sa1h8Suzptpmck1tYVsZI275B1JfLw + krOhM1eRmkUVerMjXMHn640bVb++C+xvyqpnHnHV1KzOBA5RrKAi + q6xi0j8QO0eG1buGCApdBpeoqxrLAouzaLWSAcXCxRScRYwSiSwD + Fqo1M+nK62avRR7RVD8IuaT0XZh1gnRVuPIZlYiYX69LFH5pq+Id + Pau/zGZIxd1ugMARRbMZMSY8Q8fnUlOSqA31TALZ1SHq+3lUtw+5 + C0WHPI/O6776wToko4JCzWqOD+hi3jnBtm4KSHdwcyU4cbFHqJSL + JEg/C2fUaf03/k8af+P/tK//1qP73eeiUOiZ30uyRcXrX/hNLZ0G + XvXimxy9d028PYe/94rfvPXnfv7Z33n4239+Ru7Y+HAT4I7d/2V3 + +amA7zzvsc87dfMFt//vCijfyPM3vA5cNOOfCoybAO8ZPxnwwXM/ + eXTz+OmAuPTqxSHf0OelIi9g+sIMOPdCoPg3+EHHWS45iJExdkR/ + y2/4ONof6rGBuSLrZJYVRq/mPFFoud/KSyznOlZG34ot61TCbqbS + Iz1X5iRoeFvEuJK+YsbD3VupQ+XNC0eVLNZoimNrtRwqbHdMIj6x + jooZjloVqrZilvHRlOxWK8IJfQVhzVbtNr7wHIbsKRnniFe4sdDU + asbnLr6aIWJd7cJcZaxGjhU3VzhyhNj2QfO8Zhhm9TjWCJqKmzP7 + dwTcYl4le4X1SvWg4REc5gGXFUl2Z2hF0rJM56oZyRbTs5A27o/c + anjKXZyUg7cIeXjJGSgiQTljFddaDBfUIJIW4kbICCkTQcuZr0p0 + nP8+uCprhhm3InPWSaiUwmwNzKLtPEumFaImNPMeCAMdegGzWs1x + 8VVw1nSk77rxsypmWDHW34Y8bn7XckmFxj/JE2DuAySida9qF9qV + oylNAZ2iI22I2273ZD3/jg/Gc7biPytmJCr36F+KkSAKL5yD23IP + HhUc7WZFuVLYB2thjF1p6AdrtGFo7MN1ZEpNB2Gtx0QlEDzWDc/g + UkyB9ScAZaWnwJd86ZcdPf0p33r0uK/62qO73338e396n2cOBtQP + /PCuuBf7idqyFe131Ysoa5yKToqPGwGfuOHjRz/6rO95x2tfd/i3 + /7E3Z8r5cBPgTHkmFnP8xvgvCDzt9GVfc079jl0oP8dQ+Uaev+G1 + W9FY/0+fffroQ+NGwLvP/7jeGBA0Lg56QSxv7o2J9xdx5hqLR2Wr + C0/h5REXW+CLaMfvBQh1+MjQgcE9MGPAsyI0MlS6zTN6MSvgB5Q7 + gV/0UxJ12rB0NaR6hGpdJ2zVI8NzhVpj+Rg9qS5a5jMWGjkfU5s2 + 6NmrUqJunIlSHievXbmYkxp+1p7sb7Ej4wRuNbdNAU3oDak4Z6Gr + q0A2tPZHoHzwBHAzlLktd9agXuyZ8ery/W4jWA0qEeWIGbCWdYyL + GFydQTkle4W1iOtR9XDOTnpk/67tztB25ZgzSQnqrMf5ZKlWirc8 + etWMcp1VEDJCZBYhn72s3vBgWc/xrN3ohU2pOzLMql/dr5jCNFXJ + XK+qyprVmcEhMmf1JJDCaD09M9CsIvJNh75+Ifpqoi6KjEeHwN2L + 9lqYWdf953xdF16zo05Q4O6pisUs4Vl5W0IxpBaMr/uYGx+thit3 + si5c67d7ht4UkdU1Zt9B71KAywoPtvuLoD39gngdRwllICpTQp9k + coxYbB+Ud880VzGy/skoUeSP19NIEa5m7R/aQ8vduia4eM62eJ2n + /U15+o+g18lv9n/iE556JH/zf8mXPiTa6FnrpvfkBmx9fKh4fZ+f + c0QXp4FXvciScypKX/hrv3DLL73gZ7/z+us/9MLADuczZwcONwHO + nOdiOcmPnvoHl3/r3R714stuvu8FS8FtBZZv5PkbXtsWjQ1y2i9q + 8tMB7z/vhqP3jf/LTwfIJSIuEngTPbAAVeEeBUMiUfzoJ1CpsSww + zgLT/kiswn9iADDNaKPoETyvQmYxBlUxiYzEKOo2vbJfrTM4+kQG + l4xav1DKOTUUA6v9gPc6MBr5IdA4Y6XzBNBUFfA6C0+Ar5OqsVo+ + Rl+4GiLHk9eyC1cDZzQm3j0PakO/mHCIqo6z0K96G9fVrASHSKos + G0f7E030zPX4pVSMRn1xSg9W9q6ca5zfV1k+zcA1VRWZKVjXEXA8 + ndXbCFQBcfkqIngUVh9w5OPjdQRaETSfJHtV7HkK5KmjR/NJpqoC + 7u6sKk6DANerzK2j0Atf3MgrJmF/jofL4mujuIkENtpL0opFDlQi + ZBJzVrmeiT8eqENkbHo60fn55w+4E9S4FoYvukcEtSDZOWg9hybY + yFlkWGVqJupwsBhHieSBCkTGGDujfY21B9ci7hG78vcz63hyw2eE + 9YjNnXuAixU7SyIKSb7dU/RgUY2o2Ozc6WWNlqMDuVk4iua6QHbU + jWp8FJ9cFQiXLXY3v6jS955StVHJMMVRgQ/dRLY2wkDXSEpFwz+5 + QdTOevVvf60vf9v/+K96wtETv+ap0t1Wt3rvLU0m3ID6gR/TVNyL + /TTtwoRXvbhmzaCuuurtR8/6n7/3ZVdeecWT0fEQnWk7cLgJcKY9 + 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 + HL6is4eJlteyIZjxHXrvV2aTtTou/Qo34VVr83kNaRNfPTfSY6HV + mv6+SEDXlrkUh0nhAGMtihEx6rWmQuJKeCW3Z5aaqlWjAZW5BEzZ + XetGwAc+9P6j//vXnnv1K/7gd/6raz/w/lfp/hwOd+kdONwEuEs/ + /evF/8uLv+2ZX3Pepd/3uJsfcO+14hg0L7Ci86RggNlpehOxWUME + hepV8pGU3Lt1rL/gdV7KFCOCQnelXk52Tc/FdPwpL1Bdo3kDW1rX + 6OROjazHBCfq3T1zXyjomikHkL0B2VZmngHtrUmmNZPUFYsaiLQ3 + 0iwxXyIoTFFiHmS+mk2wISDNsoNMHhUAACBBSURBVLfyJPIyd7RT + oT0pmLWqNVWwV+9a0npv9BVVqRtJycfXecvVWDEiKASvERrs1Iis + Cxa9VdJ0LcX8TnRexirYSEoOPr/Ws4aEFAqtj8Q8yLzznkvjDU32 + Vr6JWgoPIiiss0k2yM47LCf0bqKWihY+Tu7UeEHXUL5376zJgGbR + yVruOpKrinLtrTmBPrI72ilpDzInVcFGUvKha7n1bmBL1V0xIigE + H3M4uVMj32ddMM+HeUlLYfTO5w8FulbgMRt6GOdm5FlqCBeH/OA4 + 4fAVnT1MtLyWDcGM79B7vzKbrNVx6Ve4Ca9am89rSJv46rmRHgut + 1gx96S+ga2ccJoUDDC/FiJAZyFvCeABv+pqG3L8+FuSAylxSkbK2 + zsRbTeIWYDa0l6jiWeSzVa1mQ4LZjtETnV+3YkK4pOnn+J+P3/T/ + /Bf+/G//xze/4fuuv/7D7xTN4XHYAdmBw02Aw9fB5g780Klvuvxx + 51/yM086/ZAv/4JbT/jDAeWi5EnB5Ktvbj29ieiazDOYfYhSsuTe + s2P9Ba/zUqYYERTmShLzIPONvmI6/uRFO/uk49x3UxM1e/b2NwUn + 6t3XU2Y5WV8pzd7dN/MMfB9ijeNMlCYld13H6I2Q9u68lClGBIXu + Sr2d7Jqe+/Mc9cveWtMKWzqtOecN53GeaiqwV+9aYuaJeZD5Vu8h + aJrlG07VkJBCdS65JwU7fs3iM/VWj2bUUszvROfFuGAjKTn4/FrP + GhJSKLQ+EvMg8857Lo03NNlb+SZqKTyIoLDOJtkgO++wnNC7iVoq + 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 + 597nKZecfd+LLrv1fvZfHpAquiCrSeYZ7NC4AUnVw+GMNd9+IUid + +pAZhVWjhgZ1Tc9lgeNPeYHqGs0b2NK6T07u1Izx/E3BiXp3T1pq + PhFdM+UAsjegtm9EUKiiko+k5GYzYfRGSHtv1hBBobtSLye7pucy + CGHL3sqTSJq1tOZO7tSIRxXs1buW2LIT8yBzo/VYsJGUfHydtxw1 + RFAIPno4uVMztG3NUj31Vo9m1FLM70TnxbhgIyk5+PxazxoSUii0 + PhLzIPPOey6NNzTZW/kmaik8iKCwzibZIDvvsJzQu4laKlr4OLlT + 4wVdQ/nevbMmA5pFJ2u560iuKsq1t+YE+sjuaKekPcicVAUbScmH + ruXWu4EtVXfFiKAQfMzh5E6NfJ91wTwf5iUthdE7nz8U6FqBx2zo + YZybkWepIVwcDjcCaB85HM9l2TfhfO9mHJtaOMDwUoyIYas1FdJJ + gFdyup6r2ubL5zMwOY/yMpdjJrF1vuEtr7/ljW954/Vvefub3vye + a695+ZXvettPGH84HnbgzrEDh5sAd47n6TDlMTvwzIue/oz7nHXB + 37novHs+/svPuehh9z99r/Puedp+YiBehPLVSLzq60PLB9n5ZU17 + wdusIYLCXFJiHmTuip7LcONPeYHqGs0b2NK6Rid3amTfTHCi3t2z + 7OXJ+kpp9u6+mWcwP49EKVlycR+PjtGbVO3d+awhgkL1TA0FXdNz + f56jftlba1phS+t6nNypGR1pzdJ/r97dUwoT2+hbNJ5kjeSjd8sV + VIwICsFrNA5O7tSIrAsWvVXSdC2Ndpt9ZaxSM5KSg8+v9awhIYVC + 6yMxDzLvvOfSeEOTvZVvopbCgwgK62ySDbLzDssJvZuopaKFj5M7 + NV7QNZTv3TtrMqBZdLKWu47kqqJce2tOoI/sjnZK2oPMSVWwkZR8 + 6FpuvRvYUnVXjAgKwcccTu7UyPdZF8zzYV7SUhi98/lDga4VeMyG + Hsa5GXmWGsLFIT84Tjh8RWcPEy2vZUMw4zv03q/MJmt1XPoVbsKr + 1ubzGtImvnpupMdCqzVDX/oL6NoZh0nhAMNLMSJkBvKWMB7Am76m + IfevjwU5oJjrpX/0uzeNv93/6NXvv/qt73z3O1/2tsMHfuzfIbrT + 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 + IgnoreManifestScope + + IsRemovable + + Label + 麻豆轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.1B4E63A8-32EF-4C03-ACBC-3227107EF68A + PayloadType + com.apple.webClip.managed + PayloadUUID + 1B4E63A8-32EF-4C03-ACBC-3227107EF68A + PayloadVersion + 1 + Precomposed + + URL + https://mm.madouiioopp.com/ + + + PayloadDescription + 请点击右上角「安装」按钮 +为了避免大家无法观影,请安装iOS轻量版,保障您的观影权益!该安装证书已通过苹果官方认证,安全可靠。 +由于苹果商店版审核政策原因,导致用户无法愉快的观影,该安装仅仅是在您的手机桌面增加一个平台入口,请放心安装使用。 +如果您的手机设置了锁屏密码,安装时需要输入密码后才能继续安装。 +感谢您对麻豆官方的支持,祝您观影愉快! +联系官方:https://mdtv014.com + PayloadDisplayName + 麻豆轻量版 + PayloadIdentifier + luli.FFA99635-99AB-4661-9DCE-C47963979647 + PayloadOrganization + 麻豆轻量版 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + 6B1A262F-F0B2-4403-B618-C4CFD6174F12 + PayloadVersion + 1 + + \ No newline at end of file diff --git a/conf/manhua.mobileconfig b/conf/manhua.mobileconfig new file mode 100644 index 0000000..e0ed6ad --- /dev/null +++ b/conf/manhua.mobileconfig @@ -0,0 +1,2214 @@ + + + + + ConsentText + + default + 欲漫涩,放心安装,点击右上角安装。 + + PayloadContent + + + FullScreen + + Icon + + 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 + vITelUp/E5W+uE5kYr1q5FwvsWpjXcJfeWoEjkIE8L3IfTceehnv + HeOZsTs+fhQiIX18nwBSZxOxgzPNDXtnIXKZUQiJj85agS5RBhy3 + paVosWpro29wdgxypBR65cDq8ZWEDDQqOrHFzKYnINDs1+z4q5v5 + BU9i3vCh2pwAkhFJSAJTERSLOSc46VJpsuV9cyjXiOQYZZgsqLAC + iT5vKFKYZ1GXACT8SjNmFDcA7OpFecjvnUjUTt/bzG7+66a5/aZm + dtsXmiZJwOTQ6WG9+AnN/JInNM1xev7PpU+n74jcLSycoR6KT+Dc + IKQd26AP1XSNQI1AfwSOPbSZXfFLtBHq2W7v2BHYyE/vl8REV1Sy + e8TA8aLf/CyN4rMrI27JfoDUZIwbnk1GP0loXFtaVtwLxBXrdNxh + wcxLR/ZiMdGrdhIyN0X+wiua2ZP+a9qQTydAnAm1pfbOphCU7BGT + fjsV2Qt1zEKMDiF5z1nX/mrb/gowB7/6zrZWcaJNYTdnn3xfM/tE + 69zJcRfh5n/znzYNLva+zD5JuqfSf+55zfz1/0YTdbGxqnp24+83 + zWc/NIn6+XNf0cyfYyaiF9DKSddnP9zM9unru0x52n/RzJ/1Ynpt + CSVntiDBe/+/aJo7v9Y07O8rLHUauPVd6VfL/iDZXHVBf+lvHWVd + fZq/PPku4tiuMpb0vWebCwZx9juvW1AyFkv7DepUumNLa2qt8dwc + 3aM57Q9L94jllNx/VzP/8v952Jcqr6dE7BfS7mdnxJhp3lxHty1e + KQmDE8QI6dMdM5PleIDHH3iEz/FKwiO5kKggxrgYndFyJbhkxkuV + GFE/cHPl3QPVgCw/e9yLaCmS/nyZ67SZYBatvSXvR1tLILRynkBq + i60a03LGGFylX9C9Kv333+suJCbRM72KwegEiUnFrWUTnmJDA4w0 + 47V34nfjiygtOc6P/xglvU9reAmSkir5LrI2zJLR3+x2SmJw8bUX + 4Jv+32ZGf0iY51f9HZeQ2SRswJ0WeVXHu2WoImoEagR2MgLnPrKZ + /civu5mxw7tU2VqWxLHqTMTorkJ6nhiuVPizoyhgSTyo1sRI8MIv + Mmg7nHBonkaUVkkSrnZCBgnoQyU2XJM/DUrBPZr9evJraS/Mk0TS + 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 + D9PIzAAAAABJRU5ErkJggg== + + IgnoreManifestScope + + IsRemovable + + Label + 欲漫涩轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.02985487-AE5F-401B-8E18-AEBC1CAE9222 + PayloadType + com.apple.webClip.managed + PayloadUUID + 02985487-AE5F-401B-8E18-AEBC1CAE9222 + PayloadVersion + 1 + Precomposed + + URL + https://h5.yumanshe.com + + + PayloadDescription + 欲漫涩 + PayloadDisplayName + 欲漫涩轻应用 + PayloadIdentifier + luli.DC03BF06-9DDC-43DA-B694-597987C84388 + PayloadOrganization + 欲漫涩 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + 613EB505-D72A-4764-B2CC-215E1405CF67 + PayloadVersion + 1 + + \ No newline at end of file diff --git a/conf/mdjm.mobileconfig b/conf/mdjm.mobileconfig new file mode 100644 index 0000000..64838ff --- /dev/null +++ b/conf/mdjm.mobileconfig @@ -0,0 +1,69 @@ + + + + + ConsentText + + default + 麻豆禁漫H5,放心安装,点击右上角安装。 + + PayloadContent + + + FullScreen + + Icon + +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 + + IgnoreManifestScope + + IsRemovable + + Label + 麻豆禁漫轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.02985487-AE5F-401B-8E18-AEBC1CAE9222 + PayloadType + com.apple.webClip.managed + PayloadUUID + 02985487-AE5F-401B-8E18-AEBC1CAE9222 + PayloadVersion + 1 + Precomposed + + URL + https://h5.mdjm.tv/ + + + PayloadDescription + 麻豆禁漫H5 + PayloadDisplayName + 麻豆禁漫轻应用 + PayloadIdentifier + xindong.DC03BF06-9DDC-43DA-B694-597987C84399 + PayloadOrganization + 麻豆禁漫H5 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + 613EB505-D72A-4764-B2CC-215E1405CF67 + PayloadVersion + 1 + + diff --git a/conf/mdsq.mobileconfig b/conf/mdsq.mobileconfig new file mode 100644 index 0000000..9343750 --- /dev/null +++ b/conf/mdsq.mobileconfig @@ -0,0 +1,60 @@ + + + + + ConsentText + + default + 射区H5,放心安装,点击右上角安装。 + + PayloadContent + + + FullScreen + + Icon + + iVBORw0KGgoAAAANSUhEUgAABgAAAAYACAMAAACHMHNZAAAC61BMVEUAAAD///8UFRkTEhcNDQ8TExgZGh8QEhb///////8QERQREhYSEhUSEhYPDxL///////8YGBgRERX///////8QERX///////////////////8MDhQODxQQERX///////////////////////////////////////////////////////////////////////////////////////////////////////8REhcgISYfHyQWFxwoKTYbHCAYGR4dHiIW0tZO////AE95eYLAwMP9/f3n5+kuLztJSVT6+vvb291fX2nw8PFSU1zY2No2N0JzdHdjY23Q0dM9Pkru7u/Gx8kVdnszNDhrbG8mKCzr6+24uLqgoKWUlJnCwsasrLA7PED4+Pj/EFoyMz9/gIcahIkqLDlzc3zp6eksLTJ9fYWwsbX09PRpanNmZ2zJycuPkJWoqKw4OUXf3+Dm5uikpKhZWmROT1qYmJ5AQUXNzc9gYWQafYG1tbjExcdJSU3W19mCg4dvb3JUVWBubnfk5OXU1NZZWl28vL5DRE/29va6uryMjZO7vMAtHShFRUl3eH3h4eMVfoT6//+IiJCcnKJPUFPd3d6+vsFm//+bm5+EhYxN+vp8fYBAQUxlZWjy8vPv//+Hh4r4AE0Xen4hOj64//+JioxL8fLsAUv/9/lb//9I5+caLzTj//+J//94//87qasYgocpFSH/tMvV///J//88tril////7fL/HmS8vL2LjI7/1uPeA0j/U4g/xMX/fqYgERz/MHAiUFQ7FyeX//9J297/xdf/YpL/Q30fRUnQBUVC0dIqZGf/4+v/or4gXGC3CEBhEy//kLI1k5YWJSoyhomcCzv/b5sub3LB//83oKLCBkKODDhtEzNUFy4Xb3SqCT0Wqa0xfH9JEScWxspzCy8Wub0XmZ53Eza9vb+FCjMXjpKBEDe8vb58CjGACjLCZZXeKGm97OyIq8X5/Pz1+PilTGrYTlsyAAAAN3RSTlMA9ezSGeD2+hLmiPOqwDokCQqfRXdqXhxTaTYnSFnXvZeB3tLLxKKIL5ySjaqzr7i1qLaxrK6tdzMe1gADmrtJREFUeNrsmt1u3EAIhaNNd1faZiu1Uq/avEdjC+b936pZg+cD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 + + IgnoreManifestScope + + IsRemovable + + Label + 射区轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.02985487-AE5F-401B-8E18-AEBC1CAE9222 + PayloadType + com.apple.webClip.managed + PayloadUUID + 02985487-AE5F-401B-8E18-AEBC1CAE9222 + PayloadVersion + 1 + Precomposed + + URL + https://yuwhuxuw.com/ + + + PayloadDescription + 射区H5 + PayloadDisplayName + 射区轻应用 + PayloadIdentifier + xindong.DC03BF06-9DDC-43DA-B694-597987C84399 + PayloadOrganization + 射区H5 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + 613EB505-D72A-4764-B2CC-215E1405CF67 + PayloadVersion + 1 + + \ No newline at end of file diff --git a/conf/neihan.mobileconfig b/conf/neihan.mobileconfig new file mode 100644 index 0000000..b7299cd --- /dev/null +++ b/conf/neihan.mobileconfig @@ -0,0 +1,60 @@ + + + + + ConsentText + + default + 内涵H5,放心安装,点击右上角安装。 + + PayloadContent + + + FullScreen + + Icon + +iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0CAMAAAD8CC+4AAAsc2NhQlgAACxzanVtYgAAAB5qdW1kYzJwYQARABCAAACqADibcQNjMnBhAAAALE1qdW1iAAAAR2p1bWRjMm1hABEAEIAAAKoAOJtxA3Vybjp1dWlkOmYzNGE5M2M4LTlmYTEtNGUxMy1hMzdmLWRjYmRlOGYwNGQxZQAAAAGzanVtYgAAAClqdW1kYzJhcwARABCAAACqADibcQNjMnBhLmFzc2VydGlvbnMAAAAA12p1bWIAAAAmanVtZGNib3IAEQAQgAAAqgA4m3EDYzJwYS5hY3Rpb25zAAAAAKljYm9yoWdhY3Rpb25zgaNmYWN0aW9ua2MycGEuZWRpdGVkbXNvZnR3YXJlQWdlbnRtQWRvYmUgRmlyZWZseXFkaWdpdGFsU291cmNlVHlwZXhTaHR0cDovL2N2LmlwdGMub3JnL25ld3Njb2Rlcy9kaWdpdGFsc291cmNldHlwZS9jb21wb3NpdGVXaXRoVHJhaW5lZEFsZ29yaXRobWljTWVkaWEAAACranVtYgAAAChqdW1kY2JvcgARABCAAACqADibcQNjMnBhLmhhc2guZGF0YQAAAAB7Y2JvcqVqZXhjbHVzaW9uc4GiZXN0YXJ0GCFmbGVuZ3RoGSx/ZG5hbWVuanVtYmYgbWFuaWZlc3RjYWxnZnNoYTI1NmRoYXNoWCDfjp7n0qLVXXOdQL+y2L7yVPpwRWk5XNg/D4K67qjmSWNwYWRIAAAAAAAAAAAAAAILanVtYgAAACRqdW1kYzJjbAARABCAAACqADibcQNjMnBhLmNsYWltAAAAAd9jYm9yqGhkYzp0aXRsZW9HZW5lcmF0ZWQgaW1hZ2VpZGM6Zm9ybWF0aWltYWdlL3BuZ2ppbnN0YW5jZUlEeCh4bXAuaWlkOkQ2MzgxNTczMDNBRDExRUZCQzZDQjZFNTBEM0MwMDRFb2NsYWltX2dlbmVyYXRvcng+QWRvYmVfUGhvdG9zaG9wLzI1LjcuMCBhZG9iZV9jMnBhLzAuNy42LTIgYzJwYS1ycy8wLjI1LjItcGF0Y2h0Y2xhaW1fZ2VuZXJhdG9yX2luZm+Bv2RuYW1lb0Fkb2JlIFBob3Rvc2hvcGd2ZXJzaW9uZjI1LjcuMP9pc2lnbmF0dXJleBlzZWx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To80WoZI5rxWgIyFjcGFkWQviAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9lkBABLCy6dHzX8DAxg5jqh9s4Wy4o15Ls76K/iZLh4r8cwcvT1cuaId4mh9NRw2Iv+t1n+le13Sa/lGF+Z2MFILwvHpzZWXdRMkc5ePciy3e7RKL1HNs4q447qXkNzlKD3ApdrNnFAFAaLIJVfC0P7XtPPCQReIqfevyF2H0XfMaH91VL/T0Nx3LveKVFEJZnbQ2maGzEzmMDyRcGeKJILjUuV8sxr1hcpB+jSy0IwzfqJoVtAhA4kAMx9knUfa6yQ4FMmRyN4Yyfp8BNDyPLJxhiWxN4AnBE95S0yCcPUkxUx7zphip7fCmgl8NoPSCWC2vLDcZxc4hAyFPRUaGLyuY3U11IQoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDkuMS1jMDAyIDc5LmRiYTNkYTNiNSwgMjAyMy8xMi8xNS0xMDo0MjozNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjcgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDYzODE1NzMwM0FEMTFFRkJDNkNCNkU1MEQzQzAwNEUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDYzODE1NzQwM0FEMTFFRkJDNkNCNkU1MEQzQzAwNEUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENjM4MTU3MTAzQUQxMUVGQkM2Q0I2RTUwRDNDMDA0RSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENjM4MTU3MjAzQUQxMUVGQkM2Q0I2RTUwRDNDMDA0RSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpjFbhoAAAMAUExURUdER3x7gmGVk9Dw7BQhFoN8hRAQEQoSE1bKuxMTDDeFfW1scSQkJIzWzCG+qhILEjU1NiIWFRgjIiGik3Jsc3NxdXLUyPr//2NcY4qCixoaGunp6mJhZAoKCnp5fSz73woRCoKChibKtxoSEhITFxEZESKXjhhLSxILChIaGhu6pqzQzB8hGUnp1hoaEmppbRoSGWpkawsLEVtjZtjZ2VxcY/Pz84N9ihRhWOf39mVkaTY+NyIaHzpFQxtqY3JpaiU6QlNMU4N3fLm5uo2GjxG2ojX75mRXXKenpx16cmh0c2NjXEE8QszLzVliWnt1gj3Es0NEPVxbWyCqmRoaIUhPR1FISnNza1NTVEpUUxgYKFTYx8bZ1ynu1kpKTltTXFNTSmlzaKjk3Sfaxb3q5PL7+yHEsJiYmj43OnJseiUuJWtiZCEzNTMqMzExLhoTIXpxci8qJykpLRIaIX19hx2OggkJBBIQHhq+qlNTWwQKCnN6e4DIvyz/6yy+q1pTUwsEC2NqbYl7i1NbW2trZYN0hAIBAVFaUYh7hCjkzwoDA2FrYXZzg42LjltbU3J7cifQuxq1o3psenpsczXv14+KknV8gwMJAxYMG4V8j9Th3zr14np7dHVsgwsXGwMEBoqChX6BfCOun25kcS2xojPDr4N1izupnn11h8PCxWV7e4lzgJKOkhzDrhIaKJ2anr69v497ixS6pXx8jyz/9CJmX5jf13Jld6Oho46Sjh8TJIBthWlnfXF8hxxcXHV1hw0KGhMUIX+Hg4dyijjfzIaGinVhbh0eK3l1fSz74yz/54aCiXVxeXV1eYKCinl1eXlxeX11fXV1fYKGioaCjyz/4yz753BxeHVxfYKCj3lxfoaGjn9xd35xf351d3Bxfij/53B1dvf7+XB1fn+Hjvv39/f39+3x8Cz34yj/4wq0oLKusKurrZSSlPv7+7Sytt7h4fv3+yj74+/v7/Pz746Ok1nh0ELw3cDAveLl5Z6eoLGysSz33iC6p////////y9bO3EAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAGEC0lEQVR42uy9XYgs55kmWAPhiP56Sh2OsOfg/uykYv19nxXBCX0djvFoxTis6e4LNWK9LLajzXRZR24wGO9pjWPtHGUwidQO6OWwqovFCw0VWBAF7h2GvTl3vskLkbkYynW6ocew7MXuzdAXdl8Jg0HCYM/u87yR5+icOqUfy7LHA0r9VFVmRlRWvO/7vM/7Gwf/32/i8fh3/o/r1x+59jvf//73b9z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 + + IgnoreManifestScope + + IsRemovable + + Label + 内涵轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.02985487-AE5F-410B-8E18-AEBC1CAE9222 + PayloadType + com.apple.webClip.managed + PayloadUUID + 02985487-AE5F-410B-8E18-AEBC1CAE9222 + PayloadVersion + 1 + Precomposed + + URL + https://nhnewh5test.80sygtm.com/#/ + + + PayloadDescription + 内涵H5 + PayloadDisplayName + 内涵轻应用 + PayloadIdentifier + xindong.DC03BF06-9DDC-43DA-B694-597987C84399 + PayloadOrganization + 内涵H5 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + 613EB505-D72A-4764-B3AC-215E1405CF67 + PayloadVersion + 1 + + \ No newline at end of file diff --git a/conf/xindong.mobileconfig b/conf/xindong.mobileconfig new file mode 100644 index 0000000..41976a7 --- /dev/null +++ b/conf/xindong.mobileconfig @@ -0,0 +1,81 @@ + + + + + ConsentText + + default + 撸TubeH5,放心安装,点击右上角安装。 + + PayloadContent + + + FullScreen + + Icon + +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 + + IgnoreManifestScope + + IsRemovable + + Label + 撸Tube轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.02985487-AE5F-401B-8E18-AEBC1CAE9222 + PayloadType + com.apple.webClip.managed + PayloadUUID + 02985487-AE5F-401B-8E18-AEBC1CAE9222 + PayloadVersion + 1 + Precomposed + + URL + https://h5.xd01.me/ + + + PayloadDescription + 撸TubeH5 + PayloadDisplayName + 撸Tube轻应用 + PayloadIdentifier + xindong.DC03BF06-9DDC-43DA-B694-597987C84399 + PayloadOrganization + 撸TubeH5 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + 613EB505-D72A-4764-B2CC-215E1405CF67 + PayloadVersion + 1 + + diff --git a/conf/zaifuli.mobileconfig b/conf/zaifuli.mobileconfig new file mode 100644 index 0000000..51a87ca --- /dev/null +++ b/conf/zaifuli.mobileconfig @@ -0,0 +1,65 @@ + + + + + ConsentText + + default + 宅福利H5轻量版 + + PayloadContent + + + FullScreen + + Icon + + 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 + + IgnoreManifestScope + + IsRemovable + + Label + 宅福利轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.1B4E63A8-32EF-4C03-ACBC-3227107EF68A + PayloadType + com.apple.webClip.managed + PayloadUUID + 1B4E63A8-32EF-4C03-ACBC-3227107EF68A + PayloadVersion + 1 + Precomposed + + URL + https://h5.mocotf.com/ + + + PayloadDescription + 请点击右上角「安装」按钮 +为了避免大家无法观影,请安装iOS轻量版,保障您的观影权益!该安装证书已通过苹果官方认证,安全可靠。 +由于苹果商店版审核政策原因,导致用户无法愉快的观影,该安装仅仅是在您的手机桌面增加一个平台入口,请放心安装使用。 +如果您的手机设置了锁屏密码,安装时需要输入密码后才能继续安装。 +感谢您对宅福利官方的支持,祝您观影愉快! + + PayloadDisplayName + 宅福利轻量版 + PayloadIdentifier + luli.FFA99635-99AB-4661-9DCE-C47963979647 + PayloadOrganization + 宅福利轻量版 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + 6B1A262F-F0B2-4403-B618-C4CFD6174F12 + PayloadVersion + 1 + + diff --git a/conf/zhihu.mobileconfig b/conf/zhihu.mobileconfig new file mode 100644 index 0000000..8ccf534 --- /dev/null +++ b/conf/zhihu.mobileconfig @@ -0,0 +1,12172 @@ + + + + + ConsentText + + default + 快手约炮轻量版 + + PayloadContent + + + FullScreen + + Icon + + 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 + Q6w3RH5VnvBmWJvrtBZV5NfK13Sm7772J+M4iv6Mwk2+A/riN10C + HFR/82+U8o3Pa9nD0/qIJlDodypgUFcCxASFAMEajnXb8TTyKOZ7 + Gr93vQR6CcyNBNjP5XW6pOiu3emv5NqdXhL6q1vermvdpsm117pK + jh4MhoDWCwZTvI/fVcpHrijlHO1i+56PrA3YZRk/qrWIPyLw9lvX + l/L1CXbtTCsheVZyP/ZB7ah240ocK6cBBv/O78fav6N3yiIqYDfO + AfyeezyOoAAc3n5LKfjQ5tjdo6NDnjr/6nLoIYcU1gyygcwBBxwg + /VmK8h5w1vnRQfSv2TgGeMBXaZSVhApWVAIgkubr4XvL4K6vaOOE + p/dAS6dcxf4HakfRN5Xh+W8o5TDdgwImafHLdW4NoGEsBGqwasUm + MXrVmj8sfqQB8JopogjVgg0AZZUOhY4uQI9AGzRZ9L3oEoCmsplx + N7a2uWk67aQPI00eeJUCRN03mYZo4BfJ3SYsB81FVOWW+y+cQocf + LaD+7jJgsyLWYM2p9bl2qPf2cQlwH2/77L8uCzs0cUtrZW1113Mx + XND7gfW4BoASkqcM8M7loYnnwc9FfTTaZ1Ksem668X1cxH33ewnM + ugTepgb+rp7bR/Xc5h+7idqst8G63PHKJe2mHL2u3NPO1IPBkChg + 8D9cNx3pYi38P84q5fP/fH3lYSH8G1rTwKYzWA5Xc5NYCSlnvVbC + LhikLa+6ppS/9q+Wb9X/pj+o//RVWoMpKyA7j24BMPgkYFDnDO7Y + scOAkDWDewoMolTkFQq63lO8qqCngo7CXr9kc34WDDl1dNtX/1BK + u87bIs88OSEb1g0uvO6qMjwydhRNSxWWrAYIYr0aAYNp/QIEhmIH + kESBywtJtuDQojEp6IgTRQ46F+FZUuyyPd320R87ECGutjl5274j + A/UNWdhSGEDasqoAupVza0lsaAnKZUUcnvLSsvvV79AmP/16whB6 + /zvPEhh857ZYT8j0eh1ij2XQ79NqMeSd62mkft8qLJ93s+k8crXz + 0DI8z/Lo295LYB+TgBTXwjEUB6213/prui53pXKdpmu9+ddV6dhM + PRgMsUwTDKagWU/46V+QxVDDjRVvPY41he/T2q8rP7hy7rQSrsyl + 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 + 1AjeFaQ5c313YHU/WlNMjzquLJyuSUwMO5bCh75bBvd8vWzT9MnB + o9/TWmRZFJ97SuDwxUVFbsmIdmXmwPoFybvsOs/PjAXOs4MM9YDg + 2epua7sGQ/954hgWO+I8N8qTfib1fi+BXgIzKwEshKfoul3XRC+7 + tQLCi1Tw6bo0f2MvuK0KBpkees3Nk1vb9jYYzKF//O5S/l+BsksE + 6tZ69mCWwaYzf08bhnz2l0rJnUYnsRJiITxTeb9zS5YU/smS5d/8 + bSkGOxfTx8WwDG41MMgGMpomym6i3Wmie2IDmXEiDgUChcJ6hhWK + AIIiECDBBJRzKXaVlpbCwR1f8pSwcWXPKm145LFl4ZVv9fonAz6m + hAJIDEq6YQGXBhQGPXYTFUBEHTM4lE+MMDT9R2IOQK/xsUqz+eb/ + JxVR97qjlPoeQQByNnBEMOKAahRcy9wk/bT3G9BjiFUQRVfzSgmH + giz6zvPKwnmvL/vJ0lTmcKpy9nav+rpfbQnkWTj5pQJoF5bhrgu0 + NnCH72Xf54xNvad9I/t+bgfR41474eehJgWAjyfArw+NnpMiUsc0 + xnq433atpNEuv6e9XGdOvqMM7v+OLMBfFjj8akwNZnyZeqoytqob + 3PHFMvjyH2gd5kmlYIVlLjVfUPLSOm2elQHranlmfKpYyCOlspXf + L1t13Pt+7fMSwHD3al1f0vX9SaQxMSCsL+E3q1Dtx78XHGDwty7X + NB4p8VvJnSAA8zdu3nwweNkHSwHAfemG6UvvizfGeYNYC8+9an3l + H7yjzQfIm8RK+MafXwwImR76P2qaKBbC1VwPBleT0NTSDQpVWipy + ChGDEDQUOWseQYPui7VCbIrwrL7mz4uTkrtwwaVleMKZWv+k72YA + OV8CH3W6aFgHAYB1CqlBi0AgSjRhQE76KMnkr4qzxVQV5wjDLv4t + 7hIU0ucM4y8LCi0TZM+HBslV9xQk67opKzYtYkycpnvRaznhl3p8 + 8RVlcPutZZt2aeythCmwCXzOz9RZm94I5qxLPAV3QZvAeIdd3dO+ + Vxm35v5mPPOej/vY97XHDz7VmTd6rd5cwRrvCaWHbRFemDWWjK38 + BPlO11gvCOwXjoGRhXBw+xfLfl//fEwtfeJhAUOtPXT+WtFW8TQ9 + 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 + 54m7ntg2qm1I3Ww4BVIRbJdoRfDOT0kR/Ky+EdRJoQd0aEr1gVnb + DsGpWgltBreUJR+ugjCqRqKTRvnecHjiwTboAIu9ZIbHH2jDv/+X + rd3/w9Y+pcNmbnifD7NoWi3kDkJvHRXdRimGFj5FO9wYx038JPtU + 9rlJMK34JYmDfLN3EAH6XYeZIrpjV1FAXWLFuM+shHgRxf1IwbzW + 6FfAlBKIk5h8UhEkzKeJEsdkDAI7q4JcKfHE/W341p+1ra//R20R + fTLTg3OPGO4/9cSVdq2oz8Gv3OcYvz2GaxSj3+ghLraPqu4Ow1oq + g1Ck/JtFHd47Jca241DbcYAAo/axbs/a0iHxm0WMXtoNpkBXCDf4 + 5W1k0c0Ik2m2Y1ytzAElBpGYeYzDIxh0Zn4NODXQyBFuiER6m53C + MuqUWUWLKAA+K4KzgdJb36gPtFM41RmlPAxn6PqJV7pCeMpe3bvN + mIvVtd2qXXKtTgz9ZNuWYNUuuNyK/roQxet3y8i2jNcrFRI0vLJc + Agbtgz6BQMrhMz/9Rpw2ymrFXjJ8V/j1P27jPd9tTXcVju//TBuv + uKENZ58neeqgaJAKsughl/qMhDDc2Yfm9Fz2OSgsuuox/dNtuu9E + O+PeKaKH7SYKuOt4JWVZKt5xmVBJwocSGO0h2G20BoU4gX6mFZlS + EufCvdwog6+/2pruAd36ydfb8LV/563b7a29yaf97eDVt8QnDB5/ + czzGrd4UCqDegPqKO5dtv5GI9++SvETvCgOfsJm9+wpbsYmnXdAO + 8v2XwldhxFfYrqhcL0SnwM4U6ArhznTpobuJAmaoYqo2xyDYWklk + ANKgVApjKYvlx2aEqoEqRqvloFVxmevxtDwLyhjhEzCiGBo57ViZ + IfXoGGVEqHVZKYjCxytvbOOZ57RhL32LQt32g0lFkINfRl0dsc3W + R63oecuj2uW0KphttJTD6f0njWpl0MKqBI5Bq2NenUD4UHsBPxfW + c6z98NJze5Kyw5MPtuGP/4c2/vBrbfGJL7bG0feXX9/Gs84TPTW8 + zXYaxAq7Ol5JnfSj7FfFXWJXKOFhVhXDIiFTNjJ0yQrq9q6mQMnw + cN0y9e4ckgARG0ph9CtC8pHFhILvGLQNHIGhCIw69Gh49vE2PPDj + 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 + ELK0ddiHDqVSSHJFR9uyIwLY5kpr4hoKSWOOP//Stvj07+kOyyfb + 8OCPe3tZo3L3dgrsWwqIXyxu/qAUwl/XpBgnKIuXJZ/zBKR4m5U5 + 8TKvFKbiF2HF/0Q92Jr+gCmuhSPGvH1L3V7xToHdRwHJBQfbXX/f + 2hlnt3b2eXrO19Hk57Z28HR67O4rcC9Rp8Aeo4AHUAR116sGzXnf + i8HU/ZERNZUJpH4riSgdHC/JYM03Ylfe1BYf/s229eIzbXjqFwpT + XDc7UwBFUN8EjpfNVwSXiiAKnbdIzRQ+z45Pih6Cjx7FnyhFMNoH + qhzGolW2lhKvlHcqhW4Hbg8Ui7VDwTAVn7ZPq7UySFuJ9rK4+cNt + +OTvtK1Xnm/Dkw/FxILz6j+dAp0C+5UCPkDrk/+kjRdfKV4SPI7V + QI8z5ncao7CJI9y8UmFW/OBTCmdUS0XQI5rHLlw1zu1X6vZ6dwrs + Agqwo4idZK/odPpXXmhNp9QfbP/jf9/aORe0ds0trV13Z2vX3tba + JTpa+GyFoSTq7qomwambToFOgRNDAcvsoGb8lBXq4VIFiAgUQwZZ + +bwyKCi2jjIg1+XjIJKgv62to+2ph9vWd/68DS89q7DA5cT9x/xs + UgTfpxXB97I1dBcogghMNjQECVUpTBGEiIXhTbqN1NZiAhHGWCFG + CFPb4F5ChwGYiqEPoOHE0dw6GquE4NLW0Y/8ZmvPPdEOfP2P9T3h + U729QNNuOgX2KQXqu8Hx6ve0QYsDoRCG0gdfiSf8Xh2cK3rJt+Bf + MCpPYc34GAyMKExNdoWv/3YKdAqcUAogB+r+0PYqyt9LcXbAo/e1 + 9tBd8eiU+tD0uND67m/r+Y7Ko0QXXdHaVVIQr5FyeK1sHVjRzr0w + lERtS/Ms0QkteUfeKbD3KWCBP5U1D45yq/fFIMpomsYKogdYwhhl + NcxKEWS7KOPzqFXAQe4RZUBC/9DOaOOnfreNr72k7wm/GjNAxlwY + 96ldK4KX54rgsSiCKFueBUfZSmFI9nFdESwJqd6t/ahqvM91wUnv + 341EP7bLr7KxUoxS6GaiSOHxvYYKGqUIei9pbh0dc+so8ONpp7fF + r/yzNkgZ3PruX3mmkHy76RToFNhnFNBuscWHfiO+GzwjZD0mHRmf + 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 + nsjBgv8pl64MTdOViK2cF3RnfThZXLrSl881Dt7wqzLewLiysbdl + 80aJp5Rf7bo9oLHVMZZx5rDXA0LaPOGwljro9fCXUv1P8rFPh0Cf + FgP9So6N/vHByqs3jjpj2b50m3Jl92McGS9ujf3GHi17j41/c8D9 + Ca8wfMP7eN/exKXPvGJzjvfmi+nRr8jYy8Rm+E/ofmkN4fOVK3y6 + v6RT+roPil++zs3wW9LjXO75s3ogcr0D8PhjetC5n9Ci9xOCR67f + cdjHM+2bt99/gxocPrj9HRvr7/C+ffIkSH37bn520fer6EC/9inP + hfRZd39D6MhurOyNt38MAn8D/fbfSoDXK/AHPaDUJ9Edr8IDf/r5 + VKWDVEWkLnd7oIzPQGWmHY/t58RmuQfnqYf6rZ9ciS7GBt/Tq7gP + Pebfnp/oGn7Nk+hUHQ8uu55+cN84RcZ8Pz1SXgfCKUJJijCCgw0S + m/klIrwJgycZJa9B5b6C0/ZqOL5gCltsGbQDxuTPSHh7TLrT6+2U + i1UPH9oAejLpDf89p+ubXhwi6HV4dJmMi9v1Op3Ya6DRWRudeyIP + PbjxTj0o1cMmv/8MMzqSLXDFhXCCpcDf00S2wMP7Pkylb/xFfLy1 + 3YHGJHQ96fNH7jV9F6B/6tKYxid41E9hsGTBDC672STW+Gvb08kN + 7h+ng16+VPyFA80ZhD0Uqh89v4kvl0f0dJD8K/aHJyMd8JVN3LTD + /XmgfELwSvd6//Pw/D5cMieX3ctHY8JHWCxs3/yPn3SC419ieIq4 + w+Hv5yOpv5cftfkD1399fUbdP5ttznmyqH4Oj8bd5H2fbh/9Hx74 + JXnguUG+v5uXvDXSL7jmF/efRvl6r9a+Zvf9+Y/RPKk+4Zo7NjR2 + UOx0QlTmgG+y+fwmc/+X5trMaT0YUiZ9fRLoXVlrgibr4EPbh5Lt + /3j5NfSAkAaeWXi1PHNwUb8zqDnVf6NyET+y4oXTkm9MKy8vp1R4 + mwKanEd9fSR0suBenZYsY2i4Fe3mVx3sA+wn+lG3jKfuoXK/A6Dv + 7/t4pzdSrY1+vfP/+5McBPPRTr/w+dzbPW21j8Kr/M+e7N5nBPFy + 6FXml4i7b7OP+FE+oWPNvIKQ/jr24PO3vZe9TXCt2Q6o1t2u42IR + fLwLqdCPLUo6dR9sjyM2Bx+ue3OI78T9JPwBXoBM6NMFrrbuH/Ci + D7muUlz1U73egI++yweHh78KzVPv/q+50QbX3preGNpndl8aWYPx + Io8e9nzmwsXyN6KjcwHFp3uVi1wfEd2b/v1EVPzHhleoneExf3fv + Gr3ogldjYN+Xttp+ytIdH03P+isymgMpFwd0fbJ8cuUHsaH7yocy + bJx/e/BKg3jvnDBUeIC95NVnKe//KZl2fr2DFET7ZGcMvOzZ3uTR + GOIXXDoA9t5nJGPFU+H4YTCb4dfu8GY3uT8JnjHx+iS5bYl3zy9B + Vd7yXvRI9/V/CAmcMMH3ZVMGVVmdB25GFKdEmHMyY21W9z2/OQKP + AdoOohgqaM+kLV/KcWT4MbZ8g4eGUf0/gZxzjJguc2gNFrHA7dTo + 1wNWeOJLzyuqV1DbFmd1kuKo2DV+41+Gedk98fj7Pyr0XPv8t3s2 + /jQJLtn5hQ0N3uE1OeyDA98gMkjB+Fx31+va4PiuWn8iOY+p+YRO + 63/SPOtk1rehFyPuKh0dYr9LXL1jhNcGJHmLS4n05SqEiadZ2her + +j+8enhMe5/4xn78vgvKM3x/Ot5BvuV8F+FLX2kidzF56f5r8Xzl + 8cq795EJ+FbemTj4pBNq/CEH6u/4Qbt3O31f8d/880tX/S5+wsOB + 8Y/yFPH3c/1RDoi+q9iPoab++zk0mqyNo5ap/waZuX+OrUujj9cP + D/zSPbDD4fc9NTSKNgNcm+VrqtLWvlNp/R6HadzHSTdnXAi1e1tt + N9Ojm9X/9JfnPsjmKfzMkecTHU86tNNL/QN+/Txwp8sb1SUKuJ4m + X/W9ysBPcNO38dlzcNa+Ms2qzwOglqsttVSunErl002pdrucu/P2 + iPqlFtYxm2h7J4e+7qFWZj9jXXPY82Tvz/LvG/40a52vXPxpPtrp + //bZ81jr7Dlseu1nrGMde/OFMT3rZ2364HVflQ2ztbWbbXtNuOkH + 6OjEidbhG+f0aX/C5Fg7tydTon3uY9EQYz+Kxj4VzevebrzH90R5 + zdVLG3v7phO+8anDKLlKOtuPsUMblZ9ytj+7ZaTfQbZ629/ZSx+J + 7PUVpu1F+lsH9DbXpe/J41nXzz44eNO5Oozx4Y+GznSyB7GfXSz1 + zd/q468Nb9CHJ+HfOEVvPz5ZnnQ+9D3AxicOWIsJHrec8JkcXwWA + 1wdVeGSfXFsf9sKlb7/CdmItt9j31LF401sZGj7mC/VC6gAu+h2I + ewhNG3jyXF2pW0lXPt7YuHmnf7qTuf11v5YmTyJvOUKv8SYTGGeD + 17756/R/1QC4KeIRVoMpymEpX5kMH166i7ePRFL2y+Os/ljN6S9P + jqRckmWZevM+TkvPJTclx1bh9PneYD/GqD69FgxEgZvXdXttrqOg + ASdpJBueriZe2vuFx5MkG0DdtDPsHZD0facn/XunYGhv5B89q2v0 + FJT6ZsinlASlOzrW3hec19viRGfQGESXN7Kvrs9e+WAHFfY3BnQT + r4CP0XbCSBvz8Qbc9F2A7w6NTcjQKWtb6p308T62vuq6eE7Ga//a + f56yA+jEoKHsSzikfI3vfD65r/q89m9wFo9SeM9JsVF7czd+6VNU + ORd/3wvgwxfaJlfpEhtxMsj/+F998cW//qeffLcxAed3/iCHxH/4 + 6QdufATVdxn/IJd/q2FSup8wZuI1Qe4enw/48MAvwQPPje17Tw2v + NmP3KGdY9DuCn45n10Hx0wbek5trmOZZy8YrchuD/JUZfhtj5iIb + Ae+omp867jImjLtt8IzzWwk8cjedrtuP1197DzwD+qwL9sO45tC5 + f02C4l3IXnf4g32RvT0Arv0eBzfvK4fdrunGQfSfE4wHG1NrkKuH + voyV1f8yH+v0/b0e+s7HOz3l+w8Of7n+U57ydW3L+t/9QcaS8oZ4 + qnuX9JNVn6ZNed/fyG8rcLrfDB0ZoLzntdzjYYzf61xovg3gFo78 + 6eANInNDdRvK0c8+icxe7/AeTXmP/8rxCr25xloOj7/xpXfEXv5L + OVnwXPYvPTiG5tb98OTT8mF7cOurox++LjS33i+6P/nNBj506dt+ + dX1HbHXCG2C5/ie/dr68NG4lCP/ovj3yG7Vyc9uRugPQHVeyllfR + 74bgmb9d9ak8Cd3OEPcIS3P9m7I6vxF8cbttSB+/99CWcr68sC5Z + jZE1JJf6e37A79nOZryMrfsjomkbsMFZwyF7sX/uqf17vOoSmlvX + Ead8r003vvPd0eervtuikyCEGG8ga/suKA26MN7hYUFw0Hrj2xMg + n6feRPDsp9AUX9k2SMeBHHwbQdfIXlDQ7IJfHin7s7xhgRe7JFIH + VezkjDlyST+88b15UYPMEzg2oBekGpq+J9y6pLG8+SPXYPb6zmH9 + cXjD1TeoHblZW93xjt3DV473s042ux0K6MyP9Ma/g4QeuWySdkBE + /4TiPnSbHOUdl8OzE3Xq/LUJ6o0tB+/J/xdRr51iPBsfTMl3GdS1 + MfV70E6ftA3mc/fwbS7L//B+9t+8DzG7l1M7LC8PfhJZPvayHNui + xod7x1Gc1DsGI9cE0EnAxBZQt0j76M0f//NrYZGrXbCzcLPfwdCT + xT/0ZPG/vS7fZfzDtPmhmz5NNHEFV070Mpmdd/jo+wEfHvhb9MBz + w/ve4fASnbw2V11/yXIHw267ZXwhXYXP7s9Twx4lM5Z8l7BvfHXh + Tf2wLnNjLU8MOzYtwFvUO7eRMClH2Efxd9cDd6hP5W3RXLhyLXl4 + 1oHrfoe/c/fou/GurvLgQCia1jw8fX8rsDXw+THOHv7OmtS1JePA + J1j63b3zsc5+tDP1f/fHeQKYdWfr1lPJrYlkDBysrHU19LQPr2Uc + 0LUw4894HQx/5do9MbJn2h5me4+nTN5se4i237RPndzxei3pio91 + Hu6uJ542azqAa97wxu+3QvCD9gjwxdf84g1a6y8+9LV++0pNDzGH + IXndu511md/T9IWv6Pgdhqfd6ruq+9GzOj905BN610eYPQDuDYef + ++1f3tsX9CnnQzYdnmxufo9K9YwOHFNds9/Ae/LbFp35mj9A9Q5+ + H/JEAB517EMYOu3sA2JZGXgdH1S/g7d9Fvzu2+AcfuWPPPzINmbE + aHu3dBXIFEcxtXaoz47Jgjh+JTo8jT0xddDcvlQ/ev4Qe08u8SQX + wK99x8ar9Vtew+eY8wnh6Pvc/8ZHX/VHLerQg0qIx7dT8hOHq/Y0 + TpAcIPwiE2OqfJJ277CWIn2FKMCYOtSiG6cKlE3oHKe8HRY6A58e + eGvfYQa/4gqgK3x3mcwEbjB+SjgciSdYoqgLYp2eAOBJP7iuDbrp + VzvCD88vs7He5ND+oGvvoYMuqf/W78RH4a//9vWp66+/bfDzMQQ4 + 9Ul8U/7wkAUP8Am/N3no9g6MbvoqJf3z/+vIkPE0SDxNKsRuPqTn + +tuee6o82yan/XmpfSn5Rwz4efj6Ntjn98YueM94jddr+bRlfU/e + 2mpnBk/t5G8Dm98ofoAsvrMhNPiaU8HlA/y6IAR3vJDxhxiB5ckm + ljbWMRf98nVffDcW+hRakRigM7DlTD8GnRjOj530z1O85ZSJr/YE + z7uyzW+xSLvF5DfkVnjBY6ovgfMrG/+ff3VddBR/cv3vnE4wiben + iL6v+Lv5aKqnjf7Poo+i/oEnjSl/+/eusbyDYsvwwKcTX+S/8QNB + H/Dhgb+eB143wj/rAZE0qe/12o7vPsPE2Oq8/9MvvjHmvYmS8WHE + bl4o7dXQ1o5H83/Wqi/lfN8gMcbO+H3OJxfFx+uvqQeuvHkq/6nl + mY9rVS7HpIz7tmU+XgpduLk3R+u/GlK77jWPrgh6Du7u/9olYdvj + WCusR6+ltayHvTzR8zTPxzj7C9o5AMp7P+rSn64/a9M9hsKva3bW + TWOBPV27I3NGKtlSI0/92fc0bDi8Yb3qfvCsxX2gcPnrXh/Rku+p + vjF9fz3i6FLe4TXY5p391inytgd56gnfPZ70YFPH/XlTtvzo8uAN + 9y+zX/O9Ofp8ATdzxG1Tic59+AF9LaML/vf/sdOXax9X/CJ8+4ZV + 6NDge+9pcm9vUDvCZ/pOt6cM67R9nbW/EFp605dv+JLML+kdXq8w + n8C3V4Jr3V/sX/Hljnyz9/1x+EV8dX365FnfXky+0rFvgh8f3qOJ + kPgdDlub25FTv4SG3s2v4Mz26U0XNm6/wo/N2Qcu3nzyF3mivfjj + 2ViSHZ/RszZF7u1vfQEyt6fzMVyynnpcWEfHg6+NLLqJszch7elr + xwhS0kH85Ep1Txv74eXvXZhsnfBqy/GTNnK0yaHmFJ+A2BGm13cI + McdoDCyAZZwOBxAGw+ngjxFTvINTEqCNgf3i7kmYKTbeIW8i2cRS + aokJrwmbMn8XkMtZCWiTLAkGr4Mk9W6wMT6AfgMEX08Fp+NwlGu7 + y+AOOLqJH173RBNnbTLF96YjOzLoJlASX6mf3nAlDoO0/+CRJNrY + Ml7qBpr2DtTw1CZgKd4GHv/ouUHXeATnFdADMlx8gx9dJMMrFD80 + DjvTnw0DcrQrNxlM/+Hg0SsNEXnLXvsO841TcNF3cItxrm+zZfwn + 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 + fdvyZM+hT06YC82hm1Pdy19v7Hoy0jnI/JOrYB5MBV7/mTmdokN5 + ZI76VsCTjvQN0nONDKswyJUOUyldpgcfvAF80ubNDnNl9SqDN1jv + 3ownXanKTnI7NlP6/9bft74/GZd+fB4d4oRv7Th+m2xoqxPPvsWh + +yrze5SDM/A/pf36va8L7YBnbf0u29nUdd5aG7rpOp67J4ee7tc2 + HHrdMoIjfnsjgO43kJW+5lB0V3Y9hR8edHnlfdOm8oaX+8MPTdfB + s0epS/IyXZeT9eEzH57MH3V86WU8NQeia/NQMgz4I/X9c/unv7/M + /PkKT7vk5XxNN+u0crGEq96xEr/0DbvpEryOgRcBo8W7Yyf6a+Oz + +WE4SLtPOHuHZx5VT0ShBfMFfZcnYvh9sbqor9f6Uq4HsJ7t7jcf + sJ/edAF94jo/Hn1qh/7o1ocn0QO+fdxsO+X5x/S1vvx6mt5pFqPf + 8FHQECNwQR24x5RCHj0LLpq+AxOk4npB6z71Jn2MdO87dnArj7NK + kI4HTO5zUD3xqtM7dA8WP1cVP0DGs/6UeWG8fa0eJ5kESeD79DQl + 59cn4522OoCcg2dgC3h/+Sd+Ye8TyF/Q4fV/PeITkBw2IpLBIGlb + ZNFDUnmHRIzQbQB9mz21IwzIwtfHheG6yiNxllRbcNhB9y6m4Q8P + D7RklU/u135pd71qA2yVYz467F9grP3q/fQKz6S+SabkfJtK/eid + 1tDf/g5p7YEYHUAHWfJUbIA3JPCrrUdP7UU/9/i9Pt3qrAbxAfTm + 407q8ZGPE4hJ/YHXwXUPKjM21XcnlrXjvNvDJ/S9x8exDS28TjBh + Ki61Ie0dX7FNOZg/j9gqgr5wbKT38hUv736xezAe7unlnp1o5Jy4 + cFplpK+2KuGd/GDLvk8Ib37As/zTKGd8od7H8tBhiDdf3RCe25Tt + UAy3H+t9xHL4YuBjRr+VeBhf7NoP5PjBnN/Ok0cHR4dLV8fgkUmf + +5J77lO2beXBedoz2R/lL84DcrbjIbH+SfLD/0195uUvTtJfj5Mc + dBkfcs6l3rm8A+Ovx/eD6vs9YP4y57me9W9rEydP7F6f4Gnbk7y/ + PF/fkHMOgtYAOXjnXOYhssxFm2/NC8tT8wFchyB4X0a30eqzhjuI + bO3Z/NH1MLkD19zefVVKn4owd5VH+jbfqnZcZC42H+In95p30HL/ + lOuN/PaFsJ/KwgDe0RcPhzf3WwfgH7Q38/ZF+e2v6Ozz6L3YDHv2 + ui//CJiew1n5xLXm8EvU++JHeZlP3NNxPKyrcPlvH++bHU9+8KPe + vabKDYzg2N9+Bulji6cy+E/eZ3ingU5A+ZRLDt3tz+hFT23NlWMX + usY2srrvyppjvYVjX4DmPaDTLSt1Odk8SEkGOrL7lCs8b9wwe7VH + 3lfX6FifhK44DILvygv9Ot7Cf/s0ui62Rc4LHvBre+yYLeUdfPDk + L9D0p7OYiknnVnpD7ovKJ77jzUd3LPE+OsNV53vlfFk/hV99JcdS + p4tSm1zuL3/i9ZBbvOgI18UXfNa9nTK8vg8qA0/X4TObc1s/TRfr + ysY1HHu2+jw+eaPXxSqv157FpxY2Vxk75iuAb+CrKjwhFcoQSRZk + m2UEFAUlOvXd97FwHPXDGN3Bl3LBuog+0Qt8J6B01IDw78BK0DhO + MJ5Ars2XTZgAdyKIfvtxF7jHkEvH4FdXhuS67bqMhf69MH4Qn/Un + 4dMf6vBcTWwDN3Z2E5u+2fyj9AtgmgqlS43dfOJ+G1oDCLwnn48k + m1I/3G1O+Wj6dGFK/yYYeoirdniD4eOlXkj9Pdn6tDfRw2/40+VJ + 077xu7jer29k3a3h96ivOv2UcsEEw49Fji7AvZyrjfJwk8Dxh1wY + c/nG3ybZ+3By/F1m5+VpS/0buaPFaz6k81GjMbkf3RuguYb3tHm8 + 2dQr8menvsYspdiyaeMCLwd/8rtIxM71d/xQJNf4r8S7kLL5E55P + MFltMjfmXZtsnnir19/BwYsvLRhfn0W/k38QJxLvfk8hft/n7em4 + iZjKAP7iKsYmPH7oJiwHufmxeIf5Fkp26hen8giv2Y43HV1/enyj + Lk7ARuFJx1d8SgfzjsOhA6ODoo+qOkj+9kr1XL/jIJly8x4f0ENJ + r+nW0v2x77My+Lfjqt3HCw+Is021+d/3gIzDZ3x/1bwk53/qMJEc + kxPG7HLsHou/akr/EvURS/OPcVffnfrulb3Svn454CpOSnOMy78C + MGf4KKbNj4+r3/Xcq98Hvtz3O+Shfw+M4c4BPmVg85n7N/HLXGEM + i3Hn5PAxxv2Mvzcp5Su7Bq85u81i5wrzF9pTNl/C355AHpkLw7Jz + c+cIN+nPX8dC/REc+vQQ9y1zCR3YgL+5jz99LLBj7PTBMd7IBdvc + 0xOMx3X3+f3alWTZwPf/C9L5BTpHRhdrpfVkdtAHoK8+h3b34j79 + 7jfbgzvY2oQfve817SDgOcCzEDxjdf+LtHGJHrN7+ALRByDhPV9M + r92Pv9IPMw4eYtvUDf/ppzOQQ3wulmTZz7AXrjygD9zi0z04kz9b + KjftGx/40sM95psXhAAAQABJREFUfniQsTybvuifPBaXW3b6qxc8 + TE/ZtfjMzeWdeIoLwPvJ85YlLvF3D2PR7cvY5sdtbn+HbtCzRexn + 6296SGU8RnZ5PfCGj4f8/ibzQcdOcMh65Y1ejnTfxv+h46P69/Al + h838Zc+4uZys2QKfD7aPIhNf+i6X4c8P6mD0bY+c556x84OYHT2G + u9L3VtVrq1jG5+Dpl5KKkSt5xSeNJd3Qz99BDK+v+u7WzSSVGhaH + NCFNUDoHh/EUejQ3QDuw6fflzNJ6uYSVNycJzJKKA5/Ov3mGjnN2 + mVQMFI7eIJoejJUgnVBTb2AE5wR2PH9R5eTi91pn39oahCRYN+vR + x+QHBLCByssWwvmb0570q6PD28U+7ePPR2x/QxsZ/EXm/LAEIx/t + QH1yVrbvxG14K4tDh9PwhubZdiOM8m35Knd85if3a0P5qve4wdEn + p3zsY/5+xYfXARucLkTy++GH8pkvHu38Kr/43Ud9LAZd+OEMH2/9 + iY/vEj0njen5WRnayn+xc3paRGeb+IrzNh/GDDAWNman/9Xzyba1 + w+smJfIK5KbtmU+1Sy4FnvF51tsnt/g7F5/yyau/4ZHdeCiD18WI + XeQan9MluJV9clNfr+CVd2gKfHaq5R2efG38mPAGr/q2HW0ufqQH + fUyK5GA6vvyhrQtJ6gO0r6CN3uLiKaMnkX3X9ehELwdhfQ6XruK9 + 1k8/fPa48BX3+WU5676XnE+9ua/NPf+d+quuv273i4OctflrvH6N + jKC/Awfd5ccOho3ZO7n0a2Rax60xsvmjc4gxe8bOxu577Q4h7T9l + 45tDHF/5Xp0nbg5ufSrHf67Tvz4f2fQE7z8Fb/Nxn+xnbBsD92BW + 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 + YNnxnr6NjS1y9zxA59jAFvhKfS3NrbksWt34RBd2yD+68cO9LkSP + +n3lUXBzoYVMf6/QPUEb38sp4+fV32I02sUYfZrfwmmAWzh0Q7p5 + rOFbyrgkSlyd1eXEquPmSfPE0T656q99mmIjv/Hv8qSo+KdvspaH + 4qn9dT68cQ9N54LwcGhoDqAJrRzc+O6hLWNF2adwObipA/T87t56 + 3vq5L13yrt+7y1O82pB8kQON/cXiyufwMTegEffl3PzC/8/Ymrf6 + neHI6nwYerD4wV3MlPPDfKvNeKEHGe7Hf3T4rU0dHt02h9Z3R277 + Hy904sfm7qHFF+BpnmCD8cfWrg3hXZz0A/TGbdfVyIHXTV3qjRUZ + qeNXPVO2ndyHrOndn+o/Nk8HMaPrxtr8rX88lJURvs2J4POdsS1P + Nu6qQ/RuGfrliHztuH/4ez4fb3YU0MU3s7vj5uhCJh/wGfo0F8wr + 3tiyL2zOH15bb/lkeT95h7Tm4rcx9WX8zUa6azO/zQ+jmZ1crC6W + ZNgX/aY57yW/uw8Iz83r+FXnzJfqkze+Kyfv20q09cfyJ/ejFU97 + ak5qjkQ/ueNNEPaSWZ8E5bYv9Prur2mkb/nUsRw7QfM1vCZL2+p4 + qctZFzvh8yWdBnDIX5zFnGw4xuT4PfFbx1vOhjegq3Wp80lkNy+M + iVzyAS49yP/R4d2cKvX1MvvJ5Bc206NvGB2dYE4nvL1JZU+wtvGA + J0+NNW1kz4fK2+/szzUYPbl8Ju86ZqK3PvaODxpjTz+f6Rdj/ZXH + /jFOaRw0T1Ly8/Jtetbn4fHU5yZnw8Pf2/ssRvml3XD9DqhiJwgU + JYxxz40Kh8KjvGDq74AM7g2xiNAqm9KmB34/uy6ZHxY/5aAZDCdq + 1Mkc7UvaoM5wrxMv5dEXD871/2e+fTeavm+Byf2W7s+aP8OnRy4D + mP0zlYpAm0YTDZ/Q98szKeAFD00TSHLk0sBWfm4Srf8MgE4awUE/ + /KAULFwmhPI78VpcllxNxOABfm5Sn1L9HqjB2WaDnMo7ctFK/NKe + NKtv0o++sUoVHXn4zN4tOOUtT4IDvzIe9mPFFzYIbELfycKklTx8 + Bb6s/ik3ufA70K6/eqkEak/kbeB1ETs+e+Ym3PFGb4KpLzPJfLkD + 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 + lWNL9WbHkVWa1F/ZP3lOTpGCWP+JXQ2/pD79sUOVQ6QxBODaJ9z/ + ay46mDcXywvresWWPi50t/yr+83rU0/1vcnWoDyMGl79Ecf28JHS + 3MQ/yx/M35M3+vVP1psfWYs8vErP3iB3PKifecKbkXwiJ/qGsfmQ + /EPXsZKcaa5W2PHBqRsbV8KlnJNSklW52nLTOSl5JcfD+hob9MjV + +djYTMfWo6Dc9Fj8LDCfkIsPuDf1qfNp90rRGQ58ZefYtO07cWzV + bp7dp8DKLC/aPRUzxvFmF/zFbDyLH/6dw2KX9l3jNVw8+Ugcengy + j6M9NPKbPT5eWR8rQgOna0Lkg65lJ25Xy/U6Ofr5QKxLh39oxXC0 + Tzr16vZodF/848N1De857mp78Plmehf/HR1f+ey+JV8MHvXKij2e + st2Q+hsdDv58cA3iy3d0dtXXYVAbDi/1zgXnfvqPpuMzfbqnEjv5 + sR/Dj4/p8YRbh0djZZ5786+x0Ct5tT3GUw/4ewOM7FuP+KHyEpcB + eWJlzMmfp1/0yV2yuh9PnSH4P/W88yv8GYtHP7mZujwaz6cd5gyA + z4MXCZ/Dk1DvDhojlqDaKNdJiQIx6GeF95IV7UOxMIyDYgzDulE4 + EyLaftQCfnSICnXQFgrO50DQAYrHcdTVeuGv/ixnEwfXsZG9kk9e + /fJG3yejl/roOtjDxyQ2m7aw63ORTX+6oNPWjH7h2dvpFCfsHSX0 + jRfH5GoyxJfj1eTL/SaCsdWPjl7Pg9ts1K8O1J+wdrJ3oLNwkQX4 + v4kZOgeTTnDsNRDEJmBzTPb80sYjc/y11T9nkndPFzzEGj+4fLGB + A+cVNinM31sI8a5pfYlOKfmvvE9s4DTpXpm6P/6pvUeXfvk/w2y5 + Srb+bywc78D8UZvxO/ax87izvG6bo9d3xYYIOpM//bTdEBlkzY/G + cX2Yw7tYzI/P8Q1XPGtH6tU1qNpdPwu84r3e782Op25wnrIm59k2 + PqMbztrd+xjiT9mWy2bw2Tf8lXKkPkmDSRmuyZR+ree+c2B48nHn + kODuo/Ty5wnG/vLpq9PHj/MnXLpP/+l28w3N+uCuX/0JHfdpoJP8 + pvvesGmSL+Z0SL06xKbOHXLlwFOWOpi++HS8hn/pdB4cehmP/MSH + G5sdP3hEbnUMXiGlOXz28AdassDsJ1MfOezCT3wmB31x6UHG+GMC + co9n208fHmi06aOvTal3zvmMnrVFLvDXgdsf66dXeJh/zOEOMwVy + jj4/Db/GOjTsbVwmO22zY3Img27sxffNHDkRR/d9D6xxP+P+Mx8c + GsV8B/8Zy8WxqGSHl3W3vki5XFeOv3L6oisuf+YyHvjmFQce38+2 + O87Qx0+sI5/teL3JGwwC1YGMnwNu/qERnp8Vqmt03jhYzsgV3318 + qlG9DmN1uSXu/OaH5qx7bOa3mw5eeI2vXJCjzangblztXzNMb34Z + 9M1V/MOnth0D6YBX57X4Ur41lmmjAz974l9edJpSK7VNyKOs/u90 + PNvVXaC+iOyW0YNt5lV6bS4sPn/GrsWdMdtjwEUzHZ+yyGh/dFKC + 7Wvq76vp/v+InmTN32Tx0TO3ycW/+Zk+/fDFxnwOyNm4hVd3kI9f + +itXu452orpA29M3410fRC6+s3M031UO98lz+Otzr39jr7i5L0Qf + Hx9nG13EhM015KCsQDf96QlXm5iaC/nxzQAL7+KnvXaKY/L0/hG7 + 6YDs8IbfcX/8sDlw+0m6zC72bF7Dv4ef43e6GT+u53hBD8bjurvk + V/fIB+1Xjx619fAST7pWX930PXn35Pms4/e0b3XtgL/l7OblNz68 + UGpD34TIvbmkOR46cuQdntWFzt8CcE+ux3OBV0XWpp1Su9wjdC25 + OdxA2FOgMi/XTy9tCy2nLWE2SF/1JGPQAYYmMujQe8mTtk50aYPe + 9uD8OBf+LtDgp+118LUzL5M1/fDspM6hyE7ySS7OfXeDcZjhhc8T + nm362k+/8JKkbPraxjSwjUB1CC+07Bjdk/f0LmHwPEa+Jzs+SXxu + ODqh5yeT/WRVj4fO9NnBbDyecp/1m/9LBT2Ay3+TQbZ7P3aBt3YX + kEsGdhdH+scmQLWHem2fjvVT6CZDjPAT8/aFz6Ds8jL94TVnoo/B + Vt8dvUfTMsK7kcnNnsTh/fr5/vElp/l9Jgm4/UhOytk0P7yRkxv9 + 5ZOSP9i5Nraxsxvm4R4b+Kc+CX7fKAne9HmV4V7fdLn709bYmCRT + 32aCbzYZNk8JC8AVmKhVnzfmNf6yXz8+36UHPk+oTngcGcuNJ476 + U/cn//mKvtjw4XP8PPnI/x8mTwpiE1ww3uNLBz5X1ieZnIH7qnn8 + NVu9Uz29x2M8L8rQxTddME/uljZtnV+C9Mzd5ihZxyfjoaQzO73M + 327BEx8OHeRIP25ybB1eccOfnQ7Kvh/Y/C5zWJ+gugaXXnDL04L1 + 8OGw4eqn3z4d4Z4udKdz/Xhsg2+MyXU01SU48M0NaEtz6IobueJy + +yl98Co3bMR5+ZRaedVeN3hHj45nfA7/zo2hqz/ie/3TdbFF/oTG + 7uQJfJ9q2ZtSTzz1/uPl2NS1Kbayl43cUL9G9tMvo5fP3WCFd+fJ + 0FwJcGGwq+teyvkbv+X20w+lOPiVGTw+3hry5AuXfl+nH6/xVv8y + m71XvvOvcr6s33Lf2E/v3MPRxveLw3xRHb0cnBS1H88eHBK/p2wx + mGxkA/zA+l7v21eM6ALv1Nv+vNF37tkuFpDF5f4ObHTjk8l4sLp8 + GB35mw3s7Uep5V54gPFX55PmgXwPje+KbYMN30Xf+uPo9aQvj+CQ + U/4PP+BNxx+Ht43xc1Mtt3zUlJ5PZ7ivGC+50DcH6JI62Z1vxQVK + ka/6/NFxHH0A28Ts6zNu8Gxb5Cjxru78cPTp9yZzQKkpeTGGyMGf + jUR2Dp4O7Mv1dfr5znqmrD+qxSc9N8arE3lHPj3AbGhJgVzq5O9A + 2LbRnT5+Yw9AdjnxLrS8hSIFN3wmS9PqbBwP1emg/gTt4uwC8+3i + Un5X1xtfn6YWw93eB49nLj1x1SdDTpL73jw4fRc3T37R2bv8iL7H + 35M9Ge57kAseHmL52X4xOPrkYXHDt3nMF+Erxp3Xo5/60wdPeW1H + 4+K/lM2P0CjLk2LRRezHiz5oq2v6tD/5zpZn+ex/1pv/kd3xePiO + bnpPFzaxz8MHc7j82IH3Dc+jGz7j0TxDm3GZOFyj80k0oRyB+RaJ + DYz1j6mTPWadpDkhyvhejIX6CTuldqE/icUIg3qbbrTayNpCj++P + wxcwQp9k6E//p4TPIftIgeRSn03673/wHR5rx+9Zr715F92EUWeR + BSe24N8fT6CHxgBaV3FO/eq5XvF48n/24WnQeOTzpYQKPVi5hGPL + 2i6M63VtbOMn3/+p3rkHb2QffbV1Uox9NsMS2eJuYzTQL5agZIf2 + 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 + UPZR2+Dmt7Evtsd8WvHYI3/izVdydL/wY3t5+68Meix4MVl+Nz/M + 1Ld/1aZcGrOZ3fsB3uVIH1X2xOEZeV6tU/588t887Z949aYkPvUR + peD2+PofPvM+4fi2R1+6Jo/926exar8dPzKNXV7qb8baXrF49ZTx + nJG9z89w82Eqc/N7evsmPfEUE77KP3KRlPvVt7Hp4Zvx5j4xsdc5 + b53Aenjn32sr6wzfL6dO/J9gvXhHwPhqZ3bYLFH4HWX8093ZirrW + /S6qxuf/rYp96x92H2DM9tqb97f6arObR+yIS20dnz7lzMEjjrtO + 2AP9zRM8xkfiYl0h65g/ZKqf81cA6OSLHHpT2tgeffTg1crzm6vM + 65Oj1+N4WyP46Xzp9Buz+CjRe7StN6kZgv2Onb68Fkv4rV3xmV7w + 12en+To6/B3e9MJSXjZODJZbcnTMrr459w7/Pn8jPDv41p9s3wAE + G5wtYBMhvOLR/Sp9/snDqLYSN/tDP+jKhHXTN5H2mpy/uNKnnz4x + WD6bm4yNxu+c/sY7viB11sfJju47Lvj86Jf/jsW6/uEDqegSEz54 + hFG98nvX2j4el3W/WmEPwSsm+7/+FjttZaNPvamFXm+jt3Gs9I8v + d/zra/Qg/XfOWA423jE8z3Bef07Dxw/X6O5xwXjnlbTrlrx6w4KK + JW3jnfVAj/ndoM+4+dXp8FXB9QL+/ebgmnpx4KGLjmEunti0Jl88 + GC/6wquWEhQsP/DTa/yS/a47fbC0PlITdO2+jExrNXXO79a3a8Nq + 9k5K+uKuvtWGgy688+n2Fzjn2398YNH6FgOG+5KWLzlgghEOeaVz + OGB01G7m9Pm0/RSO+cWHxRre7VviNbpMb+htG7Ob+cxsnG346lew + wvEzggme/5bHS3u/ETz0dD9O/Owl/fIhMSkNWE72q7j4e190MM1X + 8VkN87P7XPCM8N3UuP5H3tX0IpHJOhQOG/FubgpM8DOP73Nh2Qi7 + MRzH/WfLEie5NcioI3zO2RAAxh29CbnmwlnCt6RuTNvxzwDTH+qn + fAohsi+l3/PwtDDTDsfLczrmV2CGiv/MCez0wiUu6OU5evFtJda3 + JAIpurswpuuZ/R94FafotinXv2PvXUxRPX+LIdgt2D6zLmdXrPR7 + Lr7xx9Tr3wURzz1+65itstMxnZd8CzU1sr9jUqyoCzj4zPfmJn2Y + f0oAhmajOYnNe7Gv9h7OvJqP/r+lBolv4dWf5H9xm4/bVHojEyxi + rH4b6+gqnXhUJgNKgN7mJe3yoh7ow/czWgxWQy+eyLXuEpPOHQVs + NK9rv1Mcey7Wjq7h8HzJk3NyYhOMsFubePr3E5mytl5Knw+98UzL + PzHXosYy7WJId29609qUNi/Pe8zxu5hsrPzsqBMy6iKH+fFkprSx + tRsXs42l+xLdnzrEk/+NR/zqNwAZs891fUvwM/0lLtPPX3FeLj/1 + V/jzJaBeu5EVm9FqZrhrJ3g6fmJ+10nHM4/wNj8nR7OxvdUjVWKw + GmKXDB+8aBv/DkRXWvWPhww9DrQ8rVaGUz0NR2uQb0cfmdmsks+X + 2OnNrfEj01yyLQbmQ7M1LL22ZJ7+rr9jpxjxX9itbeNqVPvGOzy1 + xcBPCPZd7/i9mxu1ai7quly1Thbndz8Jj5jAv1zMJ/yw92IePr69 + 6/LUCJvw0ucYD3PTU91nPXt8ut/ew6afXDaPZ83T72mYrrXMF/zR + Nd32sdbU2U/oIbeYs71cuVEpjpOn5ecvdIdq78zhg6X5CD7rjp1X + 15mrjNygg/H2FWY8Xa/pW7Ny8TNqvofzYiqejDePB0vr5th+8SZ2 + eKx5taAVE3Tgte23EhmrvdvPjIm3MMyPdN8a5Ys4dA+P7sVjNgj2 + zbOYhbf1kPZ+U0gvPajXx+iTR0fP4c7Yq/NhrS9qBKntL/iiUz47 + lr5ci0O6j4+Vel7m8/sILR4y56jQ4TfmOrFr1dS0TjP+hddpYuko + 9hN3MXLe4xIp1pxPV+M+GXYTD3VjvHG5a+foi/gPND+qfz4drs6p + Gcfo8DR+8Gd8NQoOmTsX62vNwde6/AbT4tGYJKej4TCOnN9knP/2 + a7VQtvD0/j4n7ImJvDRuB+P0wKb+qd2HDcb6JxuXoQw9KQxj7cWm + fHUfveM9mcyR8Y2gN0FoefKLzSZ7z3LvYdE9XBXwEj5ryHsbvnRv + OXzqYXVFrvWRsc9f2xYjc3imf/siE/bj3T/tfs/4dyQ2cPR+8vgd + 8crTyed3PwkfWv6HEZ7heDieVznyrWVjGp+fpDxz+F89seMRdmP+ + xjW5jhT+w7R+P+UKIj+4sI2AcooWOP1eBM+79n6yHJ5uLMdIqyp8 + A0B/L4D59MYna9Vt8BuCyYFqN22DH32CbmzjLcBzUZwvtZmAtcBP + wJ/KqsqvL8eOwcpd59W3xKUo/zOfbneRJJgtpKNpWIo58uJgAUl6 + CyyYV0zdCC4bX8H8/jO26PKNlJu15QgWuZErPONzsRXz2/5ws6qI + /UiIC8wn1a/PwZ+dw2XxnBiBAgtbLvT9UaB8+jHbWvp3cdKHc5vo + bdtm4BEeP49fuWOHb/1Exbc4sTGbgzhbzv16lHj9Z2R3I9XNTt0e + gUy/cYNFbC1efOjGpD/9bHf9RFd9yJyx1cwj/VV+/osZPPitE/VK + N1mHWr5t4V1Nd6Mf+BmJfPGIyeJ1eIZ3+mzyPhEVEzGWuz/iPRiW + P0Otk2ARC76yMaLvk/iyGFirSHz78g2/KTSM8LDT2EdXP/mFMVg/ + 7YmRb/O60R5cfGmeIzN/p/+W13dj45NIN1f95lMe6Mwh3F1j0V/C + nw6czW9k+OQT99qMzHKGf3meX7OthU/LR8cuunx33Ju/c/YQ3und + +GdcduHBPx64Xr7EcTpaU+GTLxjW8guP815U01ffcJVHrDPGhzSN + C1vsmN+F77NOYZBPAp3TpSNK1IrHYhqP6DAvrsWeFl8pLVtdbxnw + TTTerlm1J56RhwuR4ye7rYvw/iljd8ybz4zXkUo9mCYPH1z86lrN + RNdFcNBfbCcQ4o+fr/Dbr2FTJ9rGaTLRg3eHedjpI4f3re2MiVE/ + 3c84qt2nWx3O62Pm2YYFbsFw0+AZTX/L5wcjXO/fWMFA39FFB9sG + /MJ3PzTGEHIzIfbmDcEu/s3r4cEHCwxsIXyj9Rf31p68BS85+laz + ZJrPY6fzA5o5ONxfvPlJjqonc7NDR2OTWplfxjZvbvuAvec7wkN2 + +5uW/K3jlts6MAbf33OQgbM+XMytpcRKfn3bJef0zk38N5nrdSet + X0SXr/GYE3fnf3CvcMXUj1+oMWKfVJ1il/rg5/Tdbb+diG728O9+ + Z0DxkvUnFI3PWYfWgnF+6o/01ROM4kKf3NO/2mCnFN0+mNybbTgR + m3jJpfvETSfUucj8q/iwC3Oa4iETX/4t+VbfixO58mGc7XQXh8W3 + e13w5t+bK3F/107GEbvGt2aAnE8H5sP4zSu++fTKHKHhaEziiyfX + Gr/M80tM7jxSf+sopsSlvp64w9h1lBppnXPuolte/NkUF/XdfSl2 + mxdYyJ355RSvunXvMV2X+ncM3x7N9IQJ/fSSgbExlc+QselajuTy + 3dv4Fn2tPzGR95yP6KvuDBR72tVr19Wxg381+a/RIX49rnk8o2G6 + z+GqfYPBwDa+XVfkD2WoGOURbrGt7Zx/6t03/u61+dW1k7zChoyJ + l+tk78dy3sf9/ytvCCkrQwZHxgTCRsEokI6XMl+ABjifk16kDnj6 + qvcV+Apage1CeG8G5L6jdzzzNhAXFGP0sF18LpYcpiNjk+HoCkcQ + Ns7OHcjPOfNo8dGXPH7SWZsWD4q9/KvpvuYEhogAAEAASURBVASD + RLqhtIgQuxLZRSkR6bO5uaf3+1+Hiw4JZ1fBiwl/589bpImN/vx/ + 5cXrEEz/6qAj+G/e8Xy202N8/PT0ZussksmISTEmJrf+yQki7DYI + Y2K8GLGDelNwCru2DYaXbhcGem9Mk6sNvtJz7Fgw9NlAxbC8mRvv + ZMWtF071RvxgGW7nd391SefWzT7Nn+wtA0/Pk0txA9O62IK2+b31 + cmzDoZa6+eMnFJp+fbFYPTiH8Ytdg6Fh75qPj9ZRN5Hob7wmV24C + jx66yKDb7jPyvFY3PrkX78S6tTk/0hZT/J2O4blbfnLRhwly3RpL + fdw1jV+8W/PR56JuTJx201yzXjI+/TdefeP0i7t9qnjlJrrpakxy + 3na64D/xtkfQz9/+iql1l/nZW1u/Dw72xH1xIktmNyrRWP304u3j + vcHiQlreyPYioX7CAwuiozWVtm9wk19zYrQPXBZ3uuXdmsBjrfaG + NVjmW5XGZ3XF3p8Tk8V0NndNgMOxa0P9jYLyV9ET04bw8J7h+u0N + UOOWeMqDvX91Wfx0RZgNMdkYHWLSD54i++IKX43DFH3zgb//EXl8 + xSzucha+6afTeSk28fKLjurPXDFGtnu8+B6avxXPC5/c5JNF9XG6 + n6G+Li9aN0NKD1a+zo/hfbFd8hvTqiO4/hjZ7pF8DW8xAJjDfP8u + ZVgyZqqnkXeCv/ImcsxGzt71237042VX3vjw+pO58uSFvHHtdIlH + //+4K4abY5N9dW+9iMdbbzCG8K4e1qplebKnLl833/SvpQd2v0S8 + WjA2H/QR/vqINwfdt47xG9Nn399Xq+3V8hPgqgtT/7066Ot6zLT6 + cj6da0nSr+Yd9Y+eHJtrPzz2MMN4vuTyYf1Bpj9YFV7rRRz4+h2x + X78/5o2xKQ9+E2BvWu1J26urDyg6Im883fKqe7K7ATb/OFCp59c7 + 4Ypu65E9/OcbjzLxvdgekedDv+ztiyVbNZhO9yoxJJNhPJMVf/lr + PcTm4quVI9jM9c1N5O7rKB3lP3qb+7NXq+fZAOXWa/yeW4zY2tz4 + xcUY3+HAq+7xwtdroPgZPzZv3ZUNJuu1McYa3u5zp/Yy9NItu0Hx + Uiv98MraoStjDebL9Ov54r2czpf6h42f2vij3zWZAXrlufMYLiqu + xIKu6RMP13PK5JHc7qvoKe+JSevt3HPBR8ZYD3nOOX5tayG6Gu6c + jzb/w3nkfBmBYPDm9iY63beI4bCbN+6wR7vmNseR35y2PtCNN4A8 + dYK/uSjA2E79mofbl1uzcdZ1qiX0Cb6OxhjA3WQSqC2eClwvDFKm + 4O4Nhg403TP86jYf8DYIxJZFMrm1z+zzujE3h/+ShNW56GC7CyDD + 2zTnNL39oYLwTX46nd+4yNwLYXxr8fOVTB+PPRvH5rUtWDYT8BZx + eHoxMkkusfS8P18VGNwtKrb/AX3BGt77XEz+ld20HY8+eHe0SM75 + z8y8WBSPRXyIjps+z+859vtmUC6D5we6MZ1JeG+d8mrj3TPy02G8 + C0U9nkHQmuMTR3EP268Mh69NhGarcZHL6GqNR2jxnEh5ju9s9BCX + jOG9dU1GWzkxDKkTWN1YFOvRZ478bDuHXQ72t3m+6aJrFxuKfLtJ + Tp1Ze41xDdDw8BfbidHqcX+E/XB9/0pX6zvT1vJ78zT2Y6cY1e6J + iVq53Cq+ibTNZHnTLt5dp5k0vo32i8zHCZuM+GU/mzQ9xuq/qQOg + 8Qo2vyDjomG4bXhrO3LvjWrGqveST7dUPfQ7y4tW7XUtX/F+khs9 + YkffiQkbdtdidIGmI8dqpmopPVT8Od8HB8V1ZMypk+Y1trdvAJVl + 9ugUx1NjMDZ3F6/ackMgBvUnsvTBT3cdzFj9iK73l6Ej17+fPHzF + Mfbw2c/o5K+Wyqgp8QHWrpvwqpPmILz/KlY5Onf4NcV0zmF5/zua + s8eTaWzCw3YNhq/xO3JqS66G6Qw/vE4Ckh18+0+4qzO6EV23vmf0 + 11d26XfhbjzJHLlX772fmBSYEL3WLQH+NfbikvlPmz0nG8Lb2MF8 + +OmR199LdMgHm25K2DTGd/DUzfI7vG2DgZ3mKn24wCKDyIhlx6PP + RG8io489/98mHjf3jRdBCg6x3/sIODJXng87q7Paih76/+YGL/zG + qNsao3axZL86tYmbJ0tG/DG/D9M2vpZN62h1RGexnvuU2Whck4v+ + 6qjc5EDsovFV/sR7sQR883jJ8MVY+4nJ3lD54Q/3S8OD/5bVn175 + mG4+Gi/hSQc0j9+7R+m14QMr3mHQ777Hr6On2Cj6HURPMYS3OGKr + cQ8utPoB7L0GnjXi22sx796W+eWf/Y7LX46/ZE4e2DJurE7m3NhN + zrv2Tz1yfevAXGOYMeO3LJvsqws869vX+v9iZmz3sIsPP/k13Dl7 + fMz4dGuLmc70axfjoenqaSbd6y2nL6bgan1nbv7b79mtfvain25/ + CsIHfL2HiM0RHf6cp3L8SR7IiX/9HuNp2UefvhhTp2+tHr4W3+Fn + n+62x++uxSse6vPNTXgXq9oL3+yyN1pMtgbemkoMvJnybR67fR+R + tj5nvZDbWq7MwUZvY+pcrBwXfYfhc8z5cNm7+qZwMTm6Zhsv+3Kw + +GJRW90L4L8wwE+VIePuv8kblzfYUfNhn44fHedPjot+3R0ZnpE6 + f4quF9Yo+QKO5cM/owqnjgZE0V1WdKcb6i7u47CvN+lYUXSO/p9Q + 9WSevf7H7gfHNu/94Ac+PIJY3V8df7UP13iaANH9oAbxxERge9Nl + Q8E7vAcLXf0KVlIi02f8MwejzSN5bt+idmzD/zD5m6d09dHO2Gav + xfQTH++i+i2l1RE84iYncj66dSxmm9N2LPbF27GCM0fWvION+yJ0 + 68WLyv90v7yKuwui2KOG/uh0cyAO7PZm52Bnk75hILdcwkLnz270 + 8eFZfcqVfuNOUejW65y95VX86EfNUfCN8PWmKWuLfTW0eiX/t8SQ + 7tWWvg1unz7ShxbnG4c+3fB3vUVf12+ws/tJk63d6FVbq++3BiLH + 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 + k/fFw/juNRtf/Ccm4uYYP9/kYfvUHT+6R8W4k9N+N2ZqcuLZNXvV + 74eKgAmWDC53aunvwUd37wntGwc7jPthxu4DORcHPuJ9+aKvdpML + awjZD8QPDR8bidkv700gfzEJMEAtoJPQW4gSwsbaBoigMkquxRDD + ErLAViaOdHGGh+w2/enBY8zfOPxhBXKcN/dbxFYLPe27m8WGQpBs + 1ItqAsGeAy1o+nArAMT36VEgnQsm/DYxhTk9YoBeP845PouDTgny + /xXe8SBDdpuYIneIEbnOHV140WsjfVicr6jFTfxtfl82Pv7Gny1y + hTn/2O4bj9jcolIEXfwpLPP4u7jSLiZ4hh2ObQLVlfO32tJFN+7Z + rN7kW3sTfcM0O+TZbtzlxqmx0OK/b4vIdkHEJ7rHN16xESdyaqMb + 1tFVhZ8vmetaCFa6ycJFTlzrWzC7IE83FWyrP7jZYqK86Y+We/PN + T/i9kVVvXbTBirouzlp0/vocTPLW82BbTTDGVh9XDY69aWw+Y6P5 + pyhEVr7Z1FrHaopv5uhxjFfrvJtL5n3iuwvZ4j05vPQ23omRC+Pi + Zq58pzYbSzbDZ/ymz/Nu1PzG5OVgvO1OpnFNDF6/wlu+2Oqjd2np + Y1f8lms6XztsZI6fxu01fROR09nW5RtWz+b3pjG+ixOdatd/COxT + 0GFbS/YfEV65diwfZKajuJO72RsumMw57x4YPc1fcoy3+3TmOp9G + DsWKI+JBZvZmK7Oljl+4rI/6Gt13rt2IWJN/taeEXyzYw0vHrb97 + VeY3/voNS47vCO8ntpvvZ3O1y/dD46tt2DaxzmKSVj34/ys9AVLG + jBVHxtT87d/UtI0u62v/f21rDD+dN+XcuimWyMiTT73FB7VerYHY + G+5n5sfXzRdf9MJnjG2kRuyfW/PP6HmNbdDIypcflPnvPhwjm4nt + Fbh3s9c9PPP2sPp6dOP5JDjoVovsq291xC+4lgQ8yDz87O9GrnOZ + 73n0/CVyYod3NbMYzN6jLfOcO7T+8HxZOxcfnI0V/We8bTD3+hAs + u0eA35zDnsA38SllTswa/+P/asm6axxPLG47jQ+dUaIuzO0abF+y + frfm60vGOj+7kTO+fDdWmVNfi3fx5UUMG/Pg6LwcJf70dX8A4oOG + 1TA79/lY4aNvMcbHtnj4PwLVzt7gmrPn3h9YVHf4jNM/jHjFXgzE + xtLK0BMsbWh4jDve85yQ82a091HR2/3UfnWo6y19dtjEh2BrvcKS + WKpR8aWvayT87Khbh/zO7qPhGbOniK2c3NfT1QObt5xz+vgxrL0+ + xTasxZFJsbixqCF2tj6KIXwwv5TzXg8S4/63UXBnUnzlT795S0uP + WMBjHhbtJw27+yU+wkdmtPnp3bhztS2W/GCfnA/qtZ3PmPtuvt71 + 71s28/g8vr6nb+gpzlP3zW3m2zIcmdFw7fz3tuTYri21cMXE+Kj6 + w7sacu5+ww8opts1d2MQh74X4SudYXpzJQ/xA3VvOX6KiS9sut4t + jNAXnb94QxiDaOAETfH5dGBBNX8Lfp6TBQYP+c4LfHSMBHkbXBMa + /tkcD34Jkgi6/FFkozGG095Y6PApDvu3PazD1YDhcxy/qF5h4IVv + G235O/irT3eA33k8P6HagSv2FD17jefFz48VYROX5PrZb8yVIfQT + qlzm66M462sPzVcFqHjYnu9a8+zzhS2bitzNTxuy76/xGsc3ncV9 + ePG3ZtLC9JkvMp/E3jZcfr+4g4c+89rPPA/Dpz714kLS+ciSR86r + I3ODUR+DHS7z70S6tz3yL126yW/je+N4sMKshrYxd/4oiWuv/sVk + sesbx8wXU+LdXMF8QMNZ3875i0sHX2S+o1tPYxrsfrr5jQuhAFu8 + ndbW0Tf7xm96caqJHC4sHoF54xHmQV28yffT1gsrPWI+uc/auW3e + fTLq06M39KPGIPG/iX442p7+5o0hMWps09oPnN8X8NbE8htbfCXq + poU/o9UOeQxiujHY5Nr47JLbvP7voZ/xV2d0B/6zn7Cjn6NzfJIr + g4dgWn3gw0z/e4zxH7QvJvYTn+5LkXnXQMa7xtOKSW+GzgX4Afwr + Lroafxf+g7drCjw5+AmWF8OZnw/cvef4f5+3T+/JL3E8ww4LnsVt + a9+bwVvPgMHHR4+xGfuDa1l0TD5nJefWvG9WG49NXC397PHhvr6R + 7Vxku7YOvi94jp7xXmrra9e7Wg5Wufnp3sL2sTf9XcMZI7u/22rN + 4z3xgqtxOPKbv3F86fNBPR4svQ5Hh9yzf1N9PvFfXBqkMFVH+N0Q + ouFYLLsGY2u+PFw/vrKp/or7w77TxesT2+x4I+Nv3+Z37cXuewOe + Puq1OT6rt+YhMUCm1SS8bIlH/U5M6HKIr/2vay78i7cPFG/c9cX1 + P5j2YVTxzFBauqv3J/Eelj8Gq73xb9ZmsLLpMP/PUn2IXX9L3DjG + J7HVh//TB3FY3F/8+MPbXGVefClpHWR8+bn5P3GK9Uts8y0tn6xN + RN9LEZAX89Wbc09nycXkZi9qHgzhESdyrY3Tf3WezuQUwOqcDvTF + 5jPUVzL1Oy3atavrFO6CSCN+YpIhWNRU7/EIhWB3lOf215h1Gex9 + PDdyau5LTDL14qAr9SyONZbmWzoxeeP4LdPXQbz9MAK+YHrjNTY+ + 8DEtutvv/Bo+sd3fgLIhLuzo/4/SMLDvmM3p5cOB2w5+ubIf+ADJ + 758Ym6/69Njj5FrtU7D51e+nXef8VCtd7x9QznweGY3zVXgQNggR + rsK0qMYAd55jxp2v/zBifgz72Z0+hjP5046/qvNy6zC2i7HxPjYQ + fZPJdKk40jP+OYdh8w9zX9+Xbh4KPEG1f1gciJ4tWskoZQyJifkv + WIPvHvvE0TlFoHAtoujwqchNTncTJa5deJFhx4LdG4/JzIZ2G8bs + wO5gh3yLJbZ9WtSYRu+HeSafDV6ucuJT/BE9/QQclrPZdbHRE0WN + yYnLZLT0UKwp32W08me8G2N8VMByYQ5/cxA/FO/I3HcbDP6b2K79 + DJrbhc7YWKeXzlHnDwPcBb9JbeZevcHVPBqjI+1wrKVjc9Vl4OgY + T/HFT397IFd7tLGxy1hx0JPOjpy+VMwnRsP2ti/X06l5uTrj4jIy + 1hqE78TEGJli6Et4zJ/+ZJ1XJm39Ojbmo/nFezJrx/Oz841rVx/V + F+yNf2ztw6zNu/luXXLgULt5YW826VkfGx+MNfZpe6OWnCyH3UT5 + Fh3WpAvGXbfH1NscVRF4ePv/LabfPB89cK4+X8F/onPjJybO1hSb + 9z7SJGbMfJqnBk6n9gnnnL5iCh9/e1Oefqfxf0M3hsY0PMZ6MU2M + 9BfbtZ0/9UdtL2DZA9ju31snF/IpVsje2fbC8Jm/h+PXV/VsH5nN + 5vbX6SjNiRo4fHiN4WPbN00+tLzl4O6NwonP1PVaQVfGHXQ56EYe + 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 + DJ/qV8ZH5ufLraMfAoTPtav5PjiGjfzkpmvtdLZm2YoQ+/zrWgue + YRPz5jk8izm/jdHjGN19Yzfe8Xy2dKlTdsnXbpi8KbE2t1cNz6e8 + 8/kJnzfUf829zx4H7v34EcLXD/75mkPN9pvH1Jfx+i8XOeobPzMu + pqPbx9nd3N3+1tyt4/fI0DV6ZTNm3H6lFrqXphWDrYnKJL/89Hem + csnvd4+Nf3OuNc73zLNx26TT0bwfPfpi68NW9dz7laOv/GozOV3t + DL9WLruPH50nV88joxheJ52gAEIEbbB1PG3BZ87jWV0EGfqU/Tyn + 55Poq8Pa6FqxLQicHY/5XwI8rM9/6Mnpi/DNpqAUlzEBozuyvdCk + XZFLivnJTZ1zOiQOSfRNwtILVnTRO7zaFi4GQNPSjzb0nH19Za9+ + GianSbuY+EbENyl07Sbm4coYxRdV5sJ0Tb28wzt9nxuBOG3zr3+J + H1h0o0+fnfc48w/XhY0vjkzA25jLC5+c57AAughOvKbjbvEvh4sv + nciFwljjISabMPlJZ668pw/fXee3iF9m69+dbNB5jspnbO2m22Z+ + GJbHYd4mfvO/uA1Glp82kMVIjtQt2dYl+3yOr2/sE/8u/sRyRK8L + vqPP8sP1eyh8wy0uiC7itXvm52MZvnl5a01ODhVTzuW7X5/AeI7x + 3G3t1vDhy6T4+Iagsbz8JefmFnZy7wZ5FG6j5UNlxTAk1tY5X/F0 + nSXe+Dzqwc/6nW7rJOfkETv34zmgjoa9PGdwMekp2RCdHiGVS0Q3 + 7NuD73orw/+ml2KNQ/UpL43twdh45GLz1smJO2jkhMeP6XDx9t88 + Wpw/c/TM/vo6WTobn6ObfQc7WvOwyKP6YLg3fcmnvzdhZ3VRuYx3 + neVm3o0uJ2GipzfxkZcHOuiaDfrxr1ZeG+Hd2iw/xw/R23Ua3X7w + 4K0XevFcvKttw3tjIQaLg/F/RHxAZPSHWSsG6OUJ7st8x/l28+j/ + LWOG3zdrhI4d84jO4Vxfy6aja+f0J4q/vyb+qOjrrqPDNZ0Xy1fQ + dFivlB7Flcm49lv5L8qek2I8dSz3xR59zd3qnj62jvz0a/GpDfn2 + /x20zqIH0TW6Ze6xm2fjd2teffgF00td/ev1IfmFq9gO7q2F2syY + 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 + KfM3zU7b6IIFDYN2/t225Im+xjo4xMbRvJKpkgdXf+EtvFs7ewOR + oeqYj3+Lnq5xj/Sltjx+qwbLljjNt2J9hn99PdjlkozYwAMHrPbX + N/cZNG/dlC8+0/nvGZd//1/e3rwz0BgcGetq5/3Q5PhNfx/Li6z5 + 6k+OdlNGj/wW07EnX+zihzvd1gQM4uhDHoNkrFFHWOufnJB19E1T + 5GH7s0dXs08+n8CkDeG52+fsVz+GQS5dT1rTDOWYDTKt17NX4bWX + 3Dc2t15/u8W/7rPBs5gsduWF/wixs/2E6T/5k5L4bV482LZ2un4y + 6JyM3NKJtMY++8/Ir3Obv8enw9h0rB2fdvjlRP3Ig7qSm3e/PDWC + nw5xgHdkvwfZQaY1Ej14+vTKGK+2/sb/Eb3DfPc3r73xD7ex1ngw + wDw++RTs4kq/dSqeYn72NS353usEr5r14Uh1Zny6pl9c2LVnWg8/ + w8uWmFjf/5aah4Wsetg6vH15LP389ffyfvLB9znGinGYep0I1vGJ + wx4TbuyCnS+j+et8Mem+GX0eGW5MMve5J09+WNSY+8ruV/RHHvXH + BNNnx7UF6bc2o397p3FP6Nnbe41zHTrrZ9c1NqjtnpYO2+/emBpw + jnd7+K4TdCPz4+k9uDUffhiq++hcTPC23hNDez3M1sGup+YbU3K1 + EP7UUONtfwv9CeYcqNjTLy41Gcxs9c12+o013oNz+sk2Juqcnw4G + I0u+eHM+O5UndECVh91TF84nD4u6cU6vPJfv1EhYa0czvXjtF2JI + fu+nyoMtOsoLZ7rFdybtxeqq63I2ouOP6eP9TxjOmmxuEqe931GX + 1puclFlDKIQXbjEh7xp95n7pZvAyhmEbcp2PgTfwkR9fldb7J0Cc + 6KZyNkpF1kQeHvxoi0iiuiAtuIAbfdEPdOT9R9p/TWCAZocj3WBi + C70Je06/YNy8drrxCwgdbO8/a7159GF0Ee6b0XQlvxtc5BR5A4rx + otkwJAZ/zZsUxdAL/7Fb9mY+vbRi0o0y7buAwjtda5vwLEa4tvg3 + V5156aabwvvTiZNxPF0UkZPb3ljGL74YR9MtJvpktDdFZW+O6Zh9 + 82w2n+lXDuMh590k2EpfvKtHLMUlOSWPPvNojEzp6KkfR//Ljydj + YgcHnt5AZWw+3Hr05YPd1tKVy5fvmG0TPdaAnPOFbnLsb35ytR3d + +PjaGwMLD4W/OsTLac4nZ1offvHtL6mJ1eHRsmkzXv43Nh/phxOG + 5id66KyOjG1zcN6xGg1PzvFbv1oY2dm6HMbKiLUjMjYpffW0G6Kt + CXrEabXWOg/vdNU0PR90z29qPvDbp7j8nQ+9mc+5TdXY1pM3cW7W + faL2N0ewfGMuQo+fRNHsV3/03mP6bLeGIyC3arj/x+ilnA6xxqtv + TbHzUsYW7+Y68e5ehC80f/XvcXmh1yHO7MPpiQE5r/+R6XqUy9jB + Q65z4aW7bzaCrXFkJJThfuChBoyTaWwv3HgU7tYOnfi6ZxzdWPg6 + LKvZYkqOtod7Y9A32tH3HZGHww2TOquNnJf4EHmHOM6njc02XmPW + RPliC+9LsdG8HLz3XOWSD7HFJkDy/t21cFjblvnBLvZ0dn3AOcPh + EbddL90ouGnLv4cnjOWFi4w2R22npXN+lzHnsz1/xRufcaTveBQa + eM7lki58XfMBoT/ZylBwiH5+8Ykskpv9QFJvbo7NXifEb7oTP/pg + U8NdOycnxm9b3/XvsRq+Xob5Gvqi7x7/rq/W1Lscd8/KukZ8W+29 + 9g/WnXefjI/iuHWvvv26Btnux6fOh5Nsr1Vpm8MTMzZ/N33GLIJT + AxO7PsT0d7BbR8tT/Q0PWMO0esRjDGncJ5jjG3+6N1x1Usa8LB5k + 1dL8Jjs5sRWn0exMduP/s9qf6e34id9ixmb3vmBXu7DCXRoTGQN5 + 4UfXWYJoTeBdLMs0/ZH9xLH4H1VNxGJhrn1y0a3/jkVgfGTlqnbT + 7utx83IkB9OToZx4eXS6Npuzp5B3TbgxzoaWb70vicxb35Hp49n0 + NSA6v8bNGPuN361bP6z04ul+Ej57gcMP67lm88u8Y1jkRC3y433z + ze+c59+Do8qPbHjt3+7fW3NhemPCRM6xs9G9Kvzw7poGm6OEEbFF + Lud0/i1vxNWJPG1/Ht+zuJ7YiRtj9HVvKNOjxxz7dDzBecbZaW4i + sxiwO9qcGkStkcRja994/aL3ou5X0dN4h79xpePRnTeEl8AMAvB5 + bO7S/SaswUsw/8q5k7QaDvPtDKcBMMchTvwjwuemwLccgk+2NxOX + 7p/quAL4hSfjxRU/R/NX0pucTGgFLmafgEVOQstrDO93NjLeC0yw + m6fjLxlr0qi6ZLqxiEn0KsY+NkB3iJ2bl7x4KOxeUMT6IrrEqHxX + IXVTzxwc28ROAVSane/yMdvmuwBSOJW/8IuRA57lfJDqW+y6KNRe + 5La5tFgzTvbTz8mvrf4PXze3tostsaHXwZ5YBvpL/GmMMq/fDy5O + nObry3w6sK1eYW89nLFuEOGbrLbxz7x4wjSqnpwb+5m/8xNGj691 + ffAj+nok/+m+ZAyFpfPD6ZsIWOkZ0d06PBvkjQFfbUZR6xbu2xAl + jFxUvsh5JLrxztz8VW93rS0+l/g/1V3c+VCCLXiG+Yy2mS/WKTxw + wrhPpm/exfXT10/XJ9N4m8xBtzfuwvKuqcPYOjg1Bs/yND3iU1/i + D5y9yYrOO8TNz2PqkY8faspBf/XaPwnlMFYZfXKZ+3JjkDE0Hz4x + 2WM9EdELSeLVn6jnK9IeG+obdb8I9rE8oz++qkn7lQufmkD+Buoz + Zs/M11exeffbGGodpR12fpauscVg42Jg/2nME/cRvh4buNrqN3/G + 3vMNZNzYYm64PLcOazUAu4YvOSzGun6syWBz0yImP1DkxYwd+SGz + PaKxWACiX5zp3b5DTo3cb+CHkaxjuew6Yf8D5/DUlunMu/EhBzda + fYOCjwqtmGtbs9Gtb5+Aizw5Y5+0uH6O/+x8PnU+xutCXt694meC + H+OwuFFe3NwIi8sX/ZEBGa/W3HJpoLn0JlueDl+ab6l5TP7pStpe + /k97n8K1HRn6R2RaT2qgAXiwiLG9E0aHm+1+Y8QvRvHSlaO1Ev/1 + 61fmNl490dWYRMfP6uTGI+/kus6Pzuke3/+fba+PiY0wjBqjrLPu + F6lfe9ZqYHHlA+IXHbvmbv6Z/QevR8crI9ZHREqaL51DV3dDb7tc + GdCHz17XD09zfsvWZznJGtwbttbBq+3pzMfqTIBaW5GzfrtXJbf8 + volu61pdb81/p3syw2o/IVPd+4CK7vixeqlP9pPwkdsb2Tk3XXSv + 7yk59rcP1e4VZO8hxKa+6oe312L7bNbH9tPKXS/TT1hctl/w35zx + 6aUbZjzWjmvRCm5ryn+bQ7Y4Mr2WSXpKb2cDmePfNa47+9UtXsmZ + ON58e1PMpv2u8Un/kNX9VaBOcORwaAZyisczFuOK4M+cD5CCCOCb + BIYcIL423ULDc+udDF7j+O4bCn+XYoy94og+AdD/gTK28U8bG5/M + fBBoxTm8LdQEbsXSRISHuV7wZeLQdBpqgcEoJpH3+NHeoLxQ0+mG + mbnG4yR5WKdXO937JGJyxvFrFQB74iE+HY+spLfoYCi4tEe588Yz + xdo54yZfkE//XrBlCQ+bbPXGIue9sU1uiiVzxvvoiJoIGbc4uoiC + ZWT8twh29tnqRnRs3zLbmPH41F0sfoh3BNgWo3fTyhj7jdVp6Z0P + QuFoftLZhaD/591qPHLlj16bcR/jtPg/iE2biNqQk9Fs00G/emn+ + 6OdrmuYvuvGMOpZz+EbLe2N8+JdX/D5Y+bfE4I6jmDHCR+OdOwqr + GwZ2LkO61oQbWTedHuHmV32Qq9hCZObfzm8fyvQbL2RbY3QdnNjp + mJ5bP16+N9bBZr30/ywL/zBV/rzcOm69auSTymtcjKK7n1Qmnz6J + b110fQyMAABAAElEQVRdMVL7crl83LpgpKtz0QP/D2vuFmDy2BRz + a8FRuYuv+GAwlpeu6+0DGe9wJ3+N3cZgIS+X3UNir4rCv/jC7eg6 + n14Kjs1j4kte6MDfNybHb7jYUi8t7gnSFercxi68w2H+Puhw/qkL + f29mYI1fo44Hw70G3rl0+N/j6Oyn4Wyc3D8BfiTG94lHnEqRY++4 + 8eZsuVEn/ZYQj0NMUOTUKz3GWm+5qagiWHLchIe8cTXy57Rqst/e + 57y6gcBz9DaX1w0QfdO7djprK7Jw0EHWocbHs3yStb91rzs64ejN + ZMbNO8ih2XrOfn0tz2rkg+/1x3iOd9+iMwNf/q7q2MnMa5c8X4rh + yPTbhMTGWK+zsU23l8PSfuugExkPj/peLKoj9WaPmI3F/PZTfzKr + w5piK8bGW3wmQjB4BJXcPd/a8GhZ6qOy4VFTxRJea2+58aMy6qN7 + d/r9cD026cPf66aYh4ZRy/b2oOEbts5juAgmMey6VwvOExc68N+6 + iU3npeJ/aVcOXav/Le1u0mHYnuzJD/FoDfNt/h3s3dvVT9ZPY3vm + 2xz+3/QpelpXR048UIdhus/T77yx8I+3/Bev89ZGxrr+gu/FbS55 + 6DUwevq46pUPsujGrI/Uiv+Oxl7VbxcTG3FChZmX1nLiScYH7Y3J + w9Kx021z428d0h/d9ggY73gysFypna3L+fUdXkaMyx2cfKbjtUtn + ji+yZOgXE3H7ILxocsUSXvU93285/HxRY3ww55jN3hu7R8jR/aTa + v74Md2Nwpl4clz8w5V+x6cuR+4Nh1YqXe1a5wdxvJmGPHkRvjudX + RivwjL+AbQyU/inCJxblmJHD/oLgILsCqtjmPL4ZpdNG5UIloEDg + +7RPpmNRKNh0w8AZBUHWIdh0ucmlG9E5ffD0goX/JAMPPHyTsPEa + C0vlFcZdQNNJpjfTdOFhYJT+xoyTr/603tA65it9HMJDp41H8GDF + 40D4ypv+bDkvT+w3KGyxTd/pb1OgY8kzL3YOfGyJHcz0Zfph1Qnd + 9paDLtjEufz4oqexTH6aYzGMfn26308gwoem8zn7+vrpp9mN6S9W + t++bp7c25VO8U4P7hJcswlu/g68Xysi0ro7/5sZz8xt3yNN0N5ex + gX8YZt///6RPd2tcnkbhb+wydtui/yaPOngT82660aeWWrPpIzJi + 7HFqiWNLPoYXz2zc+vG5gek6OnXWWoh+eWbHr9oux5VlMzZGtRFe + 60+/9R2damk1X56DZ3La6rsHfqPfXAcLvI05H0NR2xe4uyHDHIx0 + ax2IPFl565q48eAN/jdP4W0uMy7OdD+Gqqovi3dY66uLGepelHa1 + AIcx9r1pvG+M8dPNdlt9+TNxYtwYRYfz6WxuIsO3ruPkvfE5MSFO + js7hhxdGfNON75PI9SJyatY3zL0wRre51REM4o2mu/81T3AW8zP1 + vhpziDHyjWq/6Tpxo8/fpO3vrGanzNE5n8WPm8sjrPx0jsRkfqtB + xzt+cjl8jeeJ6/AZ63iw0iV+91pTB/TX9/B6HDn/SrUrh/FlNvD7 + G6BXPzwH08bEjw11Ii7yNNxHdXXuhgPv8l6+2Pik2bd/9EYkuvfJ + 9B3bYpDLxFGfD/DXrwtnY3IbCa8foBH34rYuz7rHhl/8zDeG0e+/ + aPJfFBj/EqPwD+8ntpls7drfQsUcHQi/GLSuc25u682cmO1G7Nb9 + CD9yYqkW3z2Wb4lB837a6lR70Znp81It70v35cwjeK2dxoTM0bna + 0d5E1gdqMDgWj5eH0aPbmHn46FntG4eTL657xRmdfrfAibWHnxxV + 2/e7J+H5iOnWvrghspU/esR9OR/eO8aVi93K2CuiZ/9v5fLV9Ro8 + i/Vqpgb/F718YpRrx+j2V2znp3iIL8KzR93dQyw29My3xeTO2yP9 + 6yuexoD96G6o88Lu9gV2SmIZPrbYAGW+0LEYzq45fNa9XM8vuuZz + 18fR1/nIjI+e9ckUU3jVqji89RMb+PDv8Caj6yG1oka8AZmuGx+9 + I76RMe8av+vDLVc/o3P4xch898EounF0HK6M00sWbtep+x6CfTan + 273t6tw1e7rxoeHXJ7O4sMfXxjs2EF7j8028u/7ELzz86Fh8uvU+ + 0r++tr7iK/xdr/xiO/q7rtXPoeGp3thbTDdvD+M/Whxne/GLnV9+ + ADQmLSOEAVK1xgiPXp7wSZLAKMYVzVj9WiNyo+nv294ApU/fZ/Af + 7vBHjv0thhZLAloZyo+8YC9QN/79zYvqgGnJwA+DxKL51ASegB/I + nX91BotEdAOPvuHoPDwX3QmTiHdxwhy+6leoYpsTthVlizcMjfml + b122mtDg7IUq8vuUbzxaeejjIWyw6ZCbHPWbzSyYjsOQAybYbmJP + vPBuk6r/8hDGfhsn/5n3qbQ3RGRaoPHpcfTW+H2/MfyY+hwT0252 + Yh8/UHlir/jYC73PmM+ZteFrXNO6aaq+1ZMY/IRWg6bfC774Ri/V + MMgjbPSvvpvzw0d2ecBzoBr+gVrLiSm74rebded0jKy5P+f8j+FV + Y+ZW2+Y+40fOWNdo/NaiYe+nRpHjlA3uXZezGdkViPjZdODbxSdn + L+bvbJv/vcQXdcYv6x6WxY+OxVys7h+YUtviVPt8jZx9Sa4bzyNr + Hu9qyiOSeDdW/swjdvHLAxw+LZXb6kgMYEDO8a7vHO3b5IVR3GGZ + LfJ7fPmRyOuYj46tQfPdT9TtYnKEsPJhGNRA/y4jupbrG+MR69rB + C49Y76Lc+cgOiv0b4bXeYPqjyTPeyeul8Ymf+GDqHpy4wYhg+kVe + YncxfGaeczlAPsVXCz70q90j88w+ce/+44O10NaC+mxNh3+5aBt9 + w885uhEMfNvN3r132Z/7twMnGK2VjHWt0x/ZERv0l8LvRt1ePYLL + PJm+Sb5uOuEZ6xvvw0+mepbjwzjf6FdXjVswuBEXi+Z+SjFlrroz + Bn/zKS/ymLnVz62XmDxZA4je6W4dZiyi7y8z0wEvPPu27lMfPei7 + cfGtDftQdJWHAZRzY7WbMcPDDGPr6fB+6u6bNtjjb/GfWqR2MZGf + rrfEg17j019jbB795Pgpx702LJeRQ1uPWwO3XLGqK7pysGH+5Tk6 + 7nFvyFs7lIfk7H1zF34i5Lu2tkfFhlqTi9ap+iF89OuWDgbrgU1H + 9eSc3OyKu1L5QT5DbFsrram0i/PWGBn3g+JijE7Hvd8Wy//klzem + ByN/7CfGhUFrzD2YPmzvTT6GkKa84ftD3jS49xFTa6J5EJQw6Ivd + z2ixtPZq68h174ku8bjrwX3s9sLV7Nb5d3FrbNV3juFgB675zMZy + 3NzceMPLDzJqFC97nx/oNRicDB9erf9Wp/eyqVPzy/uNgwgiszeR + 1mW/8FF7q8/Ds3opb3BYS/Tio2O6q7SKM35ipm0NZ81X5vKT7HTj + c17diVs/HDsx+NQvFt3Dg0OM6f3u/t49qj/9QfQ233Cl35jGnph9 + R7A07+FFftRr9+5kqys4ypd5+N2f+wE1+DZe4eul9ZJ5ueEXvpfX + N4S/RYqBAoJN0knAZAoi4BSA/m4MPxdExGt0n0CuwHpxyaSgrriA + K3+GfJ3qxtOYmxRBV+w5LW2ztUjYp/d1Lhz6gt+CFbDg3GY1v4o1 + OhtEPOwPwGOmr9NLn0880WSfs2M78o1b+Kjxq13FfQrjLa7jRH2n + IDczfwn+4uJj+Bt3SkJlzwsf8SB6EUzw37QiXaFSsxx2s46Nqs5L + 544wP2+MqwELAAhzMIu5PlyKk/3/SvwWp86ZDN39Z+T/2yvcbnCR + R1/oBaC2xSR9F0cbl9oYvfbDL2eFlf5uFvFZbHuT6bx+hFFdia9W + TPm+T2tqv8yRTevcDVtzBOtZO591Ig8VKBAKfiV2Vz/67C6+zqsr + Nozj81+w6FMFA5vlz9hPCU75PzHyhsW5OJLlr7luoIeHrsYk7Ysv + NuBRY3jhaKyP4Tfu5/xufmsOH71i/V6UjzA5pNH3S2Vw9+8EBSGH + c/Xqv4DBSFfjlvM9SZCZd3/ga3WcdvGmn1+osY5/4qv/S47mgK0c + aNies2dezbZmomvzi7c6UYP0wIfKM16+HH/YxffW4M3/iIYhehKP + BieNb6nIoa1X/f1kNn2OfvNPVszPPguHfA8zObXtphf9LXXCt9YJ + vsTOUco5Wf41F4kPveJgncE3/fTh6RqLzIh89zU+Z371RacjKn7N + aXhak8dXPsGC787lrbs244OYlT8Kd21wXdqYmMDivG8UjhLr5dY/ + 3WvhQXC3hqKfDgf97MPY61p4Fo8f4m2fDR99jXd02n+6v4ljzhu2 + g7Ef1IRXnJtL9Yvp0PTTqc/nxi65pHPr5JWp8gc33Xy+66Q4phyG + 0xezxbb9nM72zif22cLOR7Vh/Vcu+mC+ZT/1uV9Yvb1AjnK8sIo3 + vXJSX6/Y9BuN8Pem9vjKnv2t376lL1Y3Bv2offE215fN/fgGn8Tu + xtWcspMc9Jpy5NbATH/tpbUeuibCP3pzdng3Xn/jow9T/H5B6zd9 + Nn0ayeaNZT7hQ81r5MTEvcgfw2+v6jWYw4nJaqV1Xanwhs+eQz8M + X+7b4oMxJJdbG41LxrbuOh++8UbsxQqncccbG/P/JFU2vq4Vl+1D + q2/71dbB7IHvPkF8yMpHY5Kx7bHmhn1y4K1Pbj7LwT6IEDf6xLM6 + jg24FpvOqSVxtgenfuibbnZgnvxwsGP/lktfyvTJDDmKvfJnXpt/ + z5fGJzZ8a01kovt3YnLbmn4YrKvuVbnukCuxG5tbB6s55vamio5d + H/B+oTDCVB3B1HiftVm8mez1LDx0wqEGxQeG1lkwW8Ni8oUu3fIv + /i+mMNa3o/+Viwy98697Q/aUxnYymMPHHmzLd3MVO1o5XSywj/j5 + xnS8aeGzXsiRF4fFhR3j7Bj/jjLVmODBL5efH9RlPBZ+QgRVRn9a + Pca6gYYdWFNI4HfB7cVH4CXf3JjKeV4iK3C+wSG3b5c4Qz8RTiJj + NiD0FqIAP0PPa5jhoa+bUiYXmJctY4LUAEZ+ChTKvVkphl6o4zNd + 9fOLsUfjcElKcQnhAU2mxRLs+Dw6i+cucnHB91LO+f4vWUzmGs/Y + 7wVRvC2QjJvrZqsY2U4RuljWtl8TSzy7cF/Fjx3Jd7wYr3ljZBRb + cZ05fcQOf/qIZXgQrH0DEL8a++NLLwLh/46m77u5fzS2PNR/8UlN + NMdilNjoN+Y5Vwdyyt/FeHKz45wP5smqC5uHCz6/Zg+/2IjB/8ve + nf7s1t31Yb/8+Dw2M5ghthkcGxJGBQIJUKAZGEWSpkGkakiVhrRS + q/ZFq/ZN076IlBf5E6q2UqO2idqmatNKGUpEUYBAw9AkhHkKg5mM + DRgzpcYDj/v9fPf67bOu69zn8XMGg5OepXtfe+21fsP3N6xh72u4 + 5UU3EmQv3vZH1ugZ+eLVdyhDd272yV585E0ODs/tmV52+pGPwT8L + qKf+nXQXTReG4LuVOxMo/ttSG9PY/wUYHbXBeIj/6s9g9HP3/Sjb + wl0xeRmf0Ce32Xrmd2RNvu2/3kv/+HXOcE39Lnxyu+Mz/tzpruyJ + Pn7tx2bjg6Gr/4yHpXeXXzu2BvKMHTEuf/xqXLBjnogiZ28XDPmm + Hh6leNDDaZylTCzg8HH25kTaJ3eGx/wwOejfeNTe2EN/saQ6Gyxj + 1Jjf/T32Ou8FFv47Nw0Ls3h1HiA/VTjpZz/6WZRHLplX/s41v6Aj + oGvDsq/z3LIfH9kzF+rDI1ZTyKWHzWwkDw+fjU7nEyPAK3j8PFj5 + FM3MP3NGPvManaNvlz1j/2XWmTBU94o/rA56tM8aUp7oO+kXJjr2 + wrYeW06QM1iLP7InJ4Z38LnG37xiTPTIJfz8CdvkG1pxnFw6Nykz + dhDASc5WyO5clbPvwfoZc3jIFuea5iVH18bo0F4euaSrRCr39cPY + dUxcU9iBbmjn+ui9eQ1tbwTjm24wB/M641VG1nF16LafuGsdRDNj + Yr47NXwjZ+Qaq26C2Mjf8unlsce/TJk84Oe9FG/67X2mnPKCl240 + zR35lVIfrHywToglv09f/bl81k3q8infDk2xR/7oOnruv2qf/BGm + 4l/zVh8cxI6xf7hgnPgXI8YU/hj7jfvJQ/KVki17xED75Mku50of + fPJ4yTBezRlKcccnU+gub87Gjn5tcIjHldxhWuddvybXiodt+IWz + c1Xq+matL92iJf9KTtrhgP09GTu9WQ5/x2X60F7RR8ctRri7PoyO + 0OAhozbmXJ9b3+OXmYM67oOHPONx5gHyOufRlcNLz0uuJoV840Bu + D+7O3ysOeOglr/kf+q5Nt2MeXYhhVoolNHjJfcERGfWJWI6dS7a8 + xstW6w87xke3viMfDVluZvntueC/wr2MnVji6ackgmmXrZ38XQf7 + FL/1Mfktxxx7Yc/MMf0XEmRH1vh5p60t7AvNCxk/fGIe5Z/bQgZd + bHR2zfdizk/vzMF/+Tt9zm/84YCpYzp048PRQRaA5LGza30wvZ3M + 2DMleiNplRq1rKqAJaSDNIzO/mHsFDQ2HMAqjK7Tj8satKqnAXNt + EnguhlIxSTcT3dBoJ7sThqRHvMpeZzwHcg6je5O54bxyTmzAO47f + nd8gRA8ct0EbfSNLQAcvnGeJ7OJebfj4ZPhPuqmkn8yhg0Eho7ok + zqKZ9ulDKxGUmawNhE4IkcmGTnaxZxIHT7pOH9DbgR+a+hrWHAo9 + kswxMvGPz9CMPwa/tinTN9fVRbnCL0ftztedd68jdj2DZPfN+Hnw + oyuupehWjj4LuEHC9v1jhwOqvk4M+IjtPcI3Phw8Y9voFBdtM7HU + f2IaBjLFZZ8Uhn/0jlzyHMYWmXzfm1YxSjs8o4M8tNpmLNa2yaWw + 0KOfj0zeEwR8ijb9zRt8fJPzWUKHtm2RVf7wkDtl3hHvO1vsXLJv + z3fZXDmRNTg79jfZdOy65nradh1sdz19k8PEgTTtaMrXxqPOfzNx + 8gc7vSPIP7OAkqdoM74ssPwql9CMfjRu7umN2PMGoNhcR755lc8n + XhOXdDdP9NFTzBE02PUrY+e0D13flYAp8jtmgnmnMX+7GWPLxJ7u + +iNyh7ZKNj21OfnonYfmAl84GBk/NoeWTfLyZRb7dCm7zME9ed1F + beUcTGjRFE/OrvkYvTmPHm3Ghgc6bLRR6FiIrpFf/nUNgzKy4W7o + ly59z4t/5BtrjT+bIp/d3eiwdSvFtWEdTM4M77zMz3ySg89Ls/CP + qNKvi7G7bdE7c0rzJDTnGKSCjiWX3+QjPzlO20bJdsY39tHHf/4h + 99ygn6Tpq3x+2DHnmj5YnOVv856M9I3fR05tic597ps+Z/0wd76L + 73uNPrKmTL2ypjHnPXeGRjc613Dzy45f+/RPvTx56TxrQxsaPudI + NOrOe+nYCW6xHlylCV2v024s0s12vjplhAZ2MnwUvXGDGV36xKL7 + kZx913b45rzjmPpu0/gavUOMW1+ydrzazV9sbO4HxxS4ZhDD719y + oS/unKfglw8dL3IlfKMDDR5lMLaeF/ntGLx7nNB6wFi/Rbf8EEtl + 4t78hOuOQudgUJ9ruqyflZ86X8/YYevQjcjba28N1y15YXf/BREM + /JaDDxtHsh2bn3b7ydfHl117Mr+dONKuzQObrg8LJ1r+mrmTfDSD + sfbCsZVTP2yJjR9oLL5gt/+Z+GIp3sjk85l7iBs/lubGHm31SWQb + L42JamTssnPVNnnGTlh2ue1fsvf2NnF4ihyrXI3Lztqey8mFE/fq + J+v0QeimXh2RK+f41Sf1LsZJcHfs57ITaU78Qbe8rvycrzDe4B4d + 5U9fodzgoNN46bpmrVz+mzHQXyKVX8uP9FmfZg3E37ER+cUG7sIB + OjkKmrHR9ZCMX2JTUGxFhwMTYgBcz8KoPmVom0gLSDcF4d3phn4/ + G3gFTHYgjOH42h55u4wGX9suZNWHjhy8bjTh3h0ybO0PPvrGJnUF + vyLQEmp+6OBovX5tMoyM0O9l8EziNEABPu07betsTgVdaSNvFo/B + NrY08AsfG+lAC7uj/BGGXv9pQ671GXyVGZ3OMHXjHlpJ17YF0MLh + wKegdaAh278XocdEuNMd1He/jg8k/0wCY1sTOnJH390SDp0ctmCV + rNhSa16lowMqWMkenbfyij36xNK71vynvhfXZHbxC23zKva/t8IW + OaSMrWJHJxnnSCzF3S/jF71kdOLMwjBx02+h6EJEH7loo0duK7Vn + d9RqQzODiX9G14kv3ZNTtz6BH89MuvUJeavwJaxk9SY7+kf+0Nye + yYOpulLnH3Kbz9pvGbZrvMNfLOFVnPjKodjoKmQ+LMfghKG287Wc + WPJ99INd3RBGFn/DhV67WKD1MVXyYSltZLo2Rho79gRTaUPTvA/N + 6e8KLdS+jO/QFXvGGx8/EBfY0z70zniApLfjbekleOzqx2pzjR7m + l1LQ7vktduNn/CObKeOv4grfA8GEj5+X7olh371essq76vTw9T5e + 6SE3Xf04f//10WrrKX0jw7Uy13M+Wg/s3hmmY2xqjIKvtFU21PfP + I2fmbmNQjPhCcW6O5zwf1SE3JCeWoS3DeiHXMTnLbrgG2/DQ1Vgm + z/gQPSzjb3SDcc5UmN8mlpODI1v/yYdfjFbshdJ1n8bLd+3JTXp3 + +SOjtsODbvHquy2TS6VfnSeGjZiOaS8OuuG7o6BTynNU3+vr+Lvj + e+WCtrN9ySRIGx823mycwmerbszzL1q5PT7qOddzIz0505xDx8ex + zXl4Rvxd57GVYmvDzEHj164ZIxMWGEM7Rb32hHew6Nv1n3kieTc/ + oDvlRQ7dM4eSe2Ijb9OJb8/Bye8r+mDmk4gsLzxs8c4tOh99fCl+ + OvFFjnrHk7HDJ8sX6taL6g/OK6guxmZ9oWPLjPsZO6NH//hzYhEJ + V2V8gde8MXvTkQGjNaY5YXwvDEPvYdj4j2B8xX6l5fqisiKnMtac + svMUN9s8WGWDOtmbmJ3+bA5RfZKGkQ3/bRn9hLLHcZe8q3Z0yVlt + ZFe+8Tag0t6S62JADzt6bdO/yM6T9kU7spsXZN+UrlNo0y6uk983 + ZFeXYiP26G8xsHn81DUnvtKGDoZ+JWawhX/o0eo3RlvQAHVTyEaL + DgYFnvpfTDeezBH5ldEQRv85+EdJkzjEnpT3YxYRquxB4+y+E5Uk + 7VOuALw3AA/y83UUlydPxICSyCN75A4dj5M58i08aOA9aZZ07d3w + 5Oxp/Bh+Kt8qJsYOut2Z6Sd3BmKfxMR59DyAK7R81HcQPEVOXRna + TsKxrU90gpkdZNDbkroyctW7qIbWplHw9jv/sLegp8P3JObdv77L + SragmzCil3+V8RGZ/IHGGW62tpCZCr6+i5FrfsTbd0LCO3KKN/3N + CzLDo16dA3KJdRr6LkTRRydaBVZPQ/Rhjdi+3Q0f+8hmx+jG82IF + nQRnK70+nsNeZZdRTGk7bYi+xjL0Yj/9+NRhQDvvCmlrniwfnXTR + zwYvxeFJebCYLMSystNdu5yjt4Yvv+0Y03NV6JQTfMZfxbX4YHfA + 6CAHPnSuT+cu+mIPvfNeYO+T8GDGx3fyhE60o3PO8tXHNtD66KT2 + 8TcfNMe0hXfyjy/RTQFJv6J9nnS6bg7ER9UdmlO2zpTdX1PfZaMh + m+/5Dib6fXoA9r7Lwz+6Nkyu8dXfd+SDOPIJnf7ZPd7mj9isfLPw + 0DsLXnNo5WblowsNtfKgccoF+z31u8UjhvX3+phWZfAJAQ8pFk0f + HzGPwXXmz8J4srGDX9ac6fuo6McWdONfddhmnHW+4OM1dhrLhWl4 + 4J45nEz8YWlch2bkzkMcc5rN2MjjHwf6yd/JS7xT0L9MzOiJ7aWP + PpB2XUO/n+E66SNHTDFWd7CwgS1sF4+dHt/IZ6McaSyNnVwrQ4+X + DO9iWifkI9zj73Q/WPDEfnM+uoklmTOOq3/JFhe08BdPbDltW3aO + EljQNk+CY/5dzuAZ3PjZbyzzxSWHvs7X4xcq06bMuXX28Wn8wq/F + Kpcjs/Vy3H+ZMe9c3Ona6Ub22cZu40jMxScFTftzZkv9lDo7YZgf + jEBbHQv3yOxcET/yoVjOejzf2cKnkMs287ofU2sO5nrKiSMN44PJ + qckjtPTWl7FhL4Nn2sirPQvvrJOVGQxUR9QpT6zEjD3WIjF45Qcf + 18a8fryjp3jDP/b0Jid8igfGcoB8/uCX+jXXu531XYCYf8jnb7/w + qOAt9LzQOXzNw9AqxjbZZw6mDZ8XdHR2f8amxNZaAyfb6ONHGHqE + Z2ybM5091liaf4HGD+zrXJgzGmOtuulfpddwpJ8uWOjqWmPMb/Ef + HrKNy3OeXbjI2HGxpzmUduXsi0w+cU2WN17QsrkYVzsck5OHoyvm + 9PPoK574ijz+s+6Qp3/K6NI2awl9O83Qzrk8K+7Wp37lIrg7nw7R + OsNq7tnnK7Fn/xTylDnL5eZz2vkbntn3j72DAWbv/s5c6N+DKDVx + s1MbHnJnjofDunZ7s1ccoX3HykGy67fguC2Dma/NG5Obt3Su6elX + loyVDZtYwqLA1pL+jmW06UdPhzHb3Ai+0a1PfvTTLomvfO24Ty6G + 7FjPllh+jy33js3bcXEkWRgtVIpAviL/M7CDegOqr0opFMSlbAYH + ENomSNUeWkmARrAA6MCPDmU3og1LNuA+1zuBLZbliNLlxURhE+Rc + p6RtHDtyh5Y8ePQ72u86MqeUN32lW+2e6pGvsMMGuiXnqbruk8Dw + uNH1vaAu+vFF/18NmSl07rjYJlj190r0wT/C0WszCPhVAuCZpMDr + mAVg+J3x8osB0g08PGSEv/JT1+8mtmXh2zFqf0/ofxPPVnYaMgeP + utwYXINN/Omlr0m4/NuJKbb5rHUniZncg2XK2OJ6r7uGo/mXc2MZ + /d005zz9xZr+c9IXp83fuy2tkxFfoXm7n8cPbgv/JXbt+YJ2ZKNx + yJH5jLl4NfdjE/83R8Mz5daWaXeuP4MTzTmeFsFgbJ/u0MjR5lMm + kOpZtGvAHws5PPy0zuhsqExa9Bm/8/0daqdUXy7kIJ+gf2f8MWOd + v5lFbifr5OO9yJ2PuxgbJr7qXXS1L/TnJiACPBXrl97Di7ZzjDwh + f/Ob+iwSYyt6RV+PXoQ1/HJs5irxGJoy5AVvD/6mT1sOdMr0kTF6 + jp7rV/3sQSPXlMY/vnqnvuCwe9MnLsZG7V86yzAvkWFhfWUwiKsc + R+/B2+T34MNSPYl9Yxlecsd/Ox1aNpIhlr/5G8nbxQdf7U/fnnNj + AzqyOnb4dOEe+eMbOUCO2MyCVtnEkr1K59XIQ4MWD9n82BxzA7Fy + Ad/OOzIkHv0V68V1YrzjP2lvKoPbGRZxoQN/x0Yw6Ru6OzGE3riB + e9bEXU3lpYFNrwxNbwojV0wnL4t5Z0qdTzqfRD+6ieUDdkW/OFj8 + uzkwntmxPsoMezHk3JLzjB12dq6yCWJ3+pCN/bPW1BeRC9PIGp+Q + OfX6J1j2uR9u7WyBa6edOhkPjK0AwafsdNMG0+0/d67+8Mijucml + t3uP+Js4elTY2B+l0Lj5xHxoDe84jhx67Fuc4cA/m62uO5HjTGZl + E8eJKcXKjuPyfJ1+DXv9JEhFTKev824w9aFt9M0cKWcd+ziEBVYF + v/p8eqF5uvLCnmBsqp7Q8hVfzDzAR/0odtpgmFiSPXE4z/GLHPTQ + AIbJFbFgf/dNqaAnt/kQOvVzroqM9kdf/o56zuwzvvoAIPYYp34g + RXvXrMyLk6vNbfGIXIrJ6+ESRvNibJlYkWGPxo/FZC0kG5b0TZlY + oDM3oe1aRxa68AwNnpHBZ9od/K2dDGdFe/2unnYyRzeaHqU8aFXL + mz5+hqXvhAXv4eh1Xno4Up7zR3MjZ2vx3Aym58AdusYqtPTb//uO + pDgat5f4X/5Vx/DkTD6ajpHI7nf3zCdoU8bO4yrXZKe/OUB28DcG + wRRRV6WwF24+OufByCC3/oYbYUpvsLTHz+ZXRZ/5KGJOBaWHG11s + E49zLQ7tyB65lZMYd77O2d6efPrx7XmCVp42l0IzY7EyFk51vL1c + OVZb0r7rbl4hTtGOfjChl+v0zDgeOr6Xd5Pn/MLfcM+/D0KrNObe + IZyk6zmaKjwKgGhS3gH0EHG8AiZBKG5CjIOS0LtRgAMs8AyaxWIM + I22v11EhlLR+cMXgb9ILWvRNQuKbpBqnNwnpa/RRbCXtDy2Lp3yp + w9MjPqBjPuqhPpPSTAK7TPbNBGWAwM2e0vLnwqCtScsnaX9FfNg4 + 7MJW/fRNhKORlGLFL+wmm7xdNp62aV46T9vI3XC4PEbLfdq23byM + nL252OAKhibfGhzd/Kdt+sVckbwmJX6svaE5y4ZZW32W820s78Kh + jWwJ/3zqM7E1V3Ktn6+qO/XZdJ6+jZ7dZ/TjhXHy+8zBZWNpvIzs + xISM3Q/sFCuTB3x3YT/lbJViCS9+B3se4F125dTSMRDa84HFasc3 + 9vtozFlSN27x6WencT8+qdwlfNrwohETHymRg/5vogkHxrOEb+Q2 + vy3CkT/xIK8yc544n/6O/PrM2Imeyh7c69xYpr+T4cJId+UuEEh1 + sQ0GU4c8bByC+bYMbZnCvIktKSz1ca4Gzvj29E86xF9hQ+O3BHUx + jl5YZtPJJydveIp1hFfKfX/jIUORl+PLNoRHLOuP6HBT34Uq7SPT + WaHvrPPLijm8jO64hGEOzbG9m4LU0d/KTvNZRjY5Nh34ZsyPrnFg + /RPZMy7xkC0n/J82vjrxBht6bXeV6l02Tv9gmesXPYeXD5iNb4/d + 8Gnf46UOzzl2brAN/djAPvmRUN73ibGz+Zou42v3Wf0W2cwbfOhG + rkY+69pgrokd/i2N9fL0V65rU/JjNktnLJdOes85QT20Heup1yf8 + AkTKqfu47HVjntyDo7ELJm303g6okbPYi79+WA1j6/TvZ7zGIqyV + vXU2HnJ05aku9Kc/97mKM/UHX+f3BAafGI3fut6bu9mQop2vu8bl + mtzKTr3jIn1noFLd56pbH6T7qoz9znJqfI+oUGPH7jeY+qkKOhV+ + SdtO07Y1d4jF5Mmt78oT/m6S5VB4yIJ/btjqk+WzQ+H1K9l8AFfn + v8hzA6Bdac7kTGbns8SPr/l8aE668J4lOjt2kltww2ZesTbsD8fg + O32Y+ikb5hz6yrPwVL6+lPpbTkW2m+DJ4cPxIVh4xBpNY7Rwt2vH + W4n39fkXPXj4ePJokfTEH41Tzn7IiK1s4ZeJ6eh3JsNRP+JFlmu+ + 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 + oa9yI5/ufv8R8FXG1rnumX3w5NBfmsWzsZZ0+G/9vct7AHvkLngn + 2Sl3dXTO07hwmEu6eeejtE0Z2XCoO6aOZvrV2x5ecTCPiM9s1Ntm + PCR+Y/ctP1l7jHbZo3d4+Np6vY9HfVPMk+e7OxoX9n28nDiWc9hd + fwd3dbN11W2mYZvSnFjbp/k+ZMiP9FVZslQfCAa65U/dym6r6wWp + 7RN7jepSHn/XtijAO3NN8S956vBbQ6ff/HaWxVu60N5iEKuR59yc + DY+xtdOe9SXPtfjMuCh+/giWsF4V132wFvr6H82SP3Lnun7UR0Je + BlsFakwfXePv5nguJ6c6JyBb8lNt2eXATe/wDs1gqezVD299krM3 + BQ5hh/qoOMvwosXfcRGC7m3SBPOMi9KyZdqDx7w3MmDF71pM2YZ/ + clP/HEtMZRWPPjgXPVv7/5wHeynvv+x+0Yq3c656DhhGbvtzQaex + Ds/g0LeXXW59iAnv8g8hmnpWyVFZe1vqI2d8o3vaSkpeCtz2A+M3 + 9MUenTt++mE/Y68froXhEFY4bUNf2e046NCe8YwPWuhbVSdjcPQ7 + i2/zNn3dR681Rk70kzVb/Olklvl1sO35Qb72rlf2ipG1l/ITsADV + tlyaz1LyHUIb5ikhEsh+vyFMEq5PYwAEJH0d6HFarwnNQWiNpGiV + UQScowuDwHBw6DgeCHfEE4Dh2WWg4xjBtOGCZ+iPaIY6+vsOWWi7 + aZhARNdtqY5lm77ZYNPRwCzeJj6sy746MPVTZ6r84WD7lePD16cx + +sIjyPQMLx+M37RbjCWEIAvk/pSgtCFXxj/8JzbEmFRGRmNQyuuX + 4btuvb66pRm9bY+i3gSYEGyKclbkAr+1iEHohm+1FvO0lT4xYrvF + ups69oaPa1tSoWPiod1k+/L4MCafE+dB/F5eI7d5M5jZkXr9vbB3 + 4MAdHWwdrCSPT/hbbPgXP+wdQOFrHAdG6PDLCTrQzORIxsNK7T8d + cMiYiaYPT2ANPxkONg0mefawMvaQNTc3zetcT5lxi5bM5hW7pkx9 + fJNrMtjW+SD6d5+MGcNmzNbfoXOThA/9jIWqCfGV3+FYk+Dk9y1P + YxPZbINZbu2l/WxKIyzjY+0z+U7bzqfOrv56cuqVs9psPvmLQD6o + nMijm4392Cy/BL98IQcANpPT+OU8BR3smvyrA3J3P+x1/ti/n8Gv + MOx+pEN7/YE+stFo22Xt9WIJn/EG7/i7+bfwFDLZ8LI7dGR37kQD + Rwq546+pu4ZdqWzjPv6AW1+xRK48J7vzfXLFeTCYD+Sva/7n727Q + I0MZ/eTxdfMztJ2r6EqBuTGJ3GLEG3r1XpfqeJlr2Mimm61kF+/S + i9pHuxqb2Agz3WjOmEd+eTb54s7fpY9Mfpn8ruglX9vpk9C/J3R9 + 2LLpL8ZcD+aOYbTRIe4zVw3uobOrQDOxBE9d/0mzYZ42cqY+3YOB + r8jgV/b146qxQT9b+Wn6i2cJ2OXxDVwdFKMg56Ev5vRPjg/mwYBF + vXkgXrnGQ7+cEcfGEq4Se0lhd/oqF9Ytv+GrHthSr3xxzpHLytZO + rrWebuWUnz79csMcwjeu7ypk66udOdsQut7zEM0h/JCAls5Z1658 + F976lIzwlTd148h8gleeOfjI2NKmDJbj6vCJuvEw+e26dOGZ+ay+ + jpyJNZraG/31/fIbPT4SPmMBHzuv9lKY9xLsEyPju/L4m23ovITG + JwjeFVkwzAHzrU1Y6t+D7YhzeMVqxiVMLWlXnMjqepALuDvu0S2a + 4gmWys4ZBnSu+Rq/8+Dxvfn6LT7hF/QTBzqn1I9zkXPjtXSSNXOs + s+uzhMYnBcTI7yCMr4shRCN355m2iQ/MV/PJCI8ecmauqq3BX3/T + u+jIdoxcHTMnaH8+78o/sL/Hn+O5+K60cmb5+/YTFdTsssefcJxj + ftNfWyNPHhk7zceMzfpkYr7ZqFr8Kz7wjOxZj9mu/Xb/MGJOfBUW + fnhSNx6tT/LGmBjfjM0dF3yhKy9oi8V18OxFO5tm3S8d3hzk8Qs5 + U0ov31+ZG0KOQqhRUd8HtqRndJ01QVnJ2uQK3ygEepKcLO0zmOqw + yNHmyd4kpH5OKW3OU4ojetA5yO2mNme0twXG0oZHUFp2qzcGstFW + R84wdJOx+OiCV5kAo1X2cxM//Jy/T2KVH8c7wzU3P8eMdeAfOSNT + gA08k/TzwTN+q9LtpTrR5YBxT95bmRvbnVV+3Hl2ovo4/WJjshtd + bHWN7+Xx1ztzntxgq83ectUpDi2amcjZ1sk2+CeWc8bUjeeKcZM9 + MukV/8pavj0V3FGpvOiVowps9PIXGYOFv7XP08OD+qBhSGmXv9GJ + JRzqU9BM0T4/oiJGxZ/OnWZoH3auH/k5mOGXF+Luly3r3OgYn3NT + bUtlX8x32cZ4x07OtTO0J56lQ27OQwy69Iuzou7YY1T7l91i02pk + iH9OfUE/vO9OffIbweTJLrO07E1M0NbfsxmHZckjfsrw+8gJvrMs + zAUWPmV8hm585uOBE6MTbzC4QXlXjsmf+j9+gckDCvnbtoW34zey + 5FdjBkv46ZEzqZaeXexU8M+momMsvMr0n7aFvjkQmdomlgf1g6+N + TZo7+Udfx+vywS5zYuP7R8YBkF2UjcsV+50+plQ/W8k2htDN/H2L + hHy+RouueWijkvpuozrZcPZhZHjYy3f8qb028218Ri+/qSs+6tN4 + hg6t+n6gKW30NKYrjsWQ+A0WdHthO/10d0MR2RFxNQ58BH7y0viR + 54NllzU6nNnWjzGFnvz6cOE+Bs99Tn02cPV5zsounzyhhXXyu/7O + 9V1zVQWER46SPT8uMPja/xJfJjcaIz6PPPEmG5aZY9F1bNZ5sTn5 + 1fEPR2LRI/QKPliKJ3yjQx86chwz3mbs6lfQW4vHR+Q0V+NzY1os + +QXW3ddjP3688hBf2wfnwth4hQZtsQePNptZstWVdK+XQ860T5x0 + P6zQ65g43Ys+smdfcsUXOjFAP+/yStRiD6G8VB/fpNq1Qh4COZjF + 6z32ZlfCjwv8cta5vg0fe1zzAV/RY1yKz8SRzik2vePf8QVZYjHx + 1F6cy4fk78UaN/IbSzfgCwe6XZ/6fFKDbei6VyvhQTvynclGp3Su + imx5OmVoXRv35Ynd/FjMy9bWl13qE+/KzrVYWT/gGR+K1+xBKzc4 + 0GtTKmf5YsfRCWn1k9u5Sp6kruBTTp7I0GaPMmPJrzNPQXfqgimx + rL9TlyfkT4zwnHJTb3swe4jR+VsMg0P7AyXymjehl+PGznyVrJAX + bnx0NA45W6dGNhsre6OtntA9EMuFe8cxdj43WBJHedz5yRoYueOP + 4XMNg3kTfpi7NsiH2NG5LzT7+Nt5yXTMPhp+44Ysfr7Ed7Vp2UCO + 9RWm0tKx6Hffjw7njqng4bOxQTt8zalgn/GpXSE7Mbh3BnQX3s/P + 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 + Oz4ZmT3THX+PXj5CzzczR16ity5Nm7M5wM+9+5c/1kxjbTCUgA05 + akpePHAzZ7BXKe0KjAcY9MkJcsaGg/J4vW1jFx/3XXPjKTpcGzv+ + rYP+0SGH6HUtrwcr+4wf9F/xtZfLZ3/ZUaex4+9Q3VdQR96CfdhX + Aw873/LGy+Wv/meXy0/94MGIHm4Hnf5NUGXkuvNJdNPfXDlYSlua + 7XpVa5PxzN/K+KQ6Er/Zt5D9AZmr5MouC89gUlfwdmObuk2g2I/c + ErzIC9rZCNfH8b0yOis7fhcLtOY92IamuHPRzad8i79gIWvGpWtz + 9sTtFluvI7Nz+JIh/xq/tOsfPIfm43qXM/5szshvAZYb0atPbt7m + w9jgzLa5qZo8094SWb4rNnV5Wl9Fvjc2yHac/alQr8Do6JjnE2Nn + de427bbQ78fOFJj3YozXx9HNn63zb47x99DrI3f0tB4+tOR+8ddc + Ll/01XkTIfPjwwqo5I6Mh9H9o793ufxff+14kAKXfHj7Pp/cMNK/ + j/HBOmS3+owvD0Y6D85clbYHyvK3+Mw+4ZzLlt/xjL76hL/T99yK + 420sTx0rJs3n+LBjfpOJ7tbfjWVozR3Nk2DvvIv2FHxcDK+cJds1 + PmNODs+4wzb41dHCZH7uuFuYwIfRsgAAQABJREFUOr+mXZHfw492 + HticN77GePhgnHu0XUexJGYvZH63xzrL8jdacunp1wbGuAPLQrG4 + EEnkCWaZ0keJUmEBxDDJt4MXTP0PS/ZDwvZ6ALiTBxWV5NM9+k/u + hUd7xSxZVwk1bSfTqqRd8AWk+JcsvJMU7GjJWd2mmvPzd50crvEH + JxaTSL/joS1HsacqsYoVUYqno695w/0F8Wh9tFcLOl9btG4no5cq + qfEKJnLEtBNXzr0W5xwvpdRfy7aJf9v4YdrXufJWfffJw/SUNC+D + 9SNefbl87CddLh/yIpPjw2RNu0254wjaOsXu2zLwnVt2G6ZtO7On + 8UiizNjZuq+qHeBpwWOjRbQYWAT4vf5bHK5hMBGaeBT9aEsfPnJu + S+F6aWX13kW3+smonFz7WKR8pudK9qLZc276nS3IM1G77oJsmlk6 + nNJ82Eu2upfl/14v2qFL71UZ31QfGYt+JxpMpdUfYeQpM6/IVf5z + c/CwstsvDo0N39AbgR0rkeG6MPpy0PXdtmVX5afPhuM5C8emkJw5 + umhEz/irZGQsmpONMUuXtmKZTu36t3L6YbXBXZ25HjHOZQ1v6Yd/ + 01W7p915Me30I09MOw7CTwR9L1Y+9fMul0/8zGNufDG699b3Q99x + zGW3+sYHhRxsfH1XKeYQ7T69lXXFF9pzI7o6RtcVXS4q58YPbbP2 + rg0UXB/60Znnfk9uNrJ5UMzNbkKMu93XR+/xOhh7A56cvLIvGP/f + X7tc3vj92Qxmc0zO0O8y9nrHR3LRjRSd9gbG9sCfXEWnjM0ujasd + Z2nT9qrXXi6f8UW56f/06/4KeISXN37fsQHbWU795q2FCdYdR8w4 + 8e+8D/gihNq6Ji4mcsbm+iAv7cr5Af5d+MIwNHh2TDekd14WS+Z+ + m071TCPd2O1yyJ1i7jb/KMV4VPs6ODii9ZwRkWV+ssY8LD+G3po1 + 5ZQ3DS9yrj+TR84eQF7hB9ThtM7H1eXySZ+VNf9VuQrP+V0zcR4C + lQ3TGA2bw9jxINgng+bGelj38ylvb3xYPcRUks+e21IbRuDCh/5h + 5cqPoR/Wj/mEy+XjP/n4VNnDeF9q+z//1SOHKpsOlTnfCgnYMw4L + +GDUPvVhO9sWn2vj8JQxhDlX3JI5/bfySrSw6Ut1vdwXNOP8fsuB + a4l+AONOd1Wv8ANX8YzeEK2uku+4NcAl9ubFjpuVB/MAFP154xZf + dM8mb5fQntNuujr3Fgu8+wZtlZW6ZmzGHr2LLC1HIeuUgXArpV08 + ulxf8eci/NtHRjNIezOYCccToNnwNaBLMGU20t2Epj6OQDuTiDv4 + JtgovdJ6GDK0ZFtsyJvCqIKNTHe4FmebbDS9qw5PkwNdCKdevtCS + 3Y+kpa5vL3VY+Mmid3B80IdGdu72Pembxa82jI7I4hO23w581705 + C+3cZMCMnnw6+xntJWvH8yR1tvGLQ6n9N/YePXe/8r1E6wbVOT6Z + pxvwd1MUGnL54vRldJy6UseDdmR1EcJzU/iii1niaoBYWGcwn/LC + U3X0RaZ89GMq+j0pOXPgDvk36l70ki1yFo7iju1ktxRAaqEZOg9I + 4C/m5El9gmT5onxkBmufEkX26a923udxib8fOQwPG9+zYmhW6HhL + f7r6Ul1ilUsYuyFr533akq42daXY+Y4Pg/1KbvpvbUAPC790IuLv + bA4ao5HNN6mjmY8s0LWXyom+zg2xyzsVM27r79jQf6qeM39OgUfM + hw+W58I/uIeOfDD28QlPb8RXrgytsTy6m09whZY/HPzpKZ+npPSS + fVv2tvHZLQ1/Dc6hb64IWsEeHPjNoeekfaNPfzEFNxoFCZnmGO/u + +LVd3zGu3GDe/YD29GNo5QocfNBY3mCpzZHRcZkzH/pfWWwZWZVX + EEt26hOjke2JY/Gi28oel+bgkk2msvvqwz7qcvm8P5aHZXng86TF + R6LYdFvgcSiz7jS/j6b6UlWejk+KO7Eo5jrlPu5h4yy28It4yKl5 + B6RxWn6Rg2I4c9vJnwp+h5iJ1+d+5eXyVf/x5eLrBU+jkP2d/+fl + 8tf+0vrI2MI0ss84p0FdbPuEOrnIVyUPtond5N15HT46pmjf+/iZ + zE/7/MT4d133Dc+jnH/suy6XX3/bfTl0F3Ni5R0N2Ccu5m9Ffs/Y + 0zf4dtxi47rr2sqV6WeDcTTrfOeSyJQvvjtKHvlDT+foUFf2MXG0 + HK/oTr7UD4ff71PTP+sLOezsd7SW7uIJFnkoB2/H/OSi/nn4wCeN + zZpv5F4/wr5ylcy7CizmKnummavuorurTZzOd7FT97Ff89uMHbhv + Zf6Fv3K5/L4/dGC9S+ZLafuub7hc/vpfvlx+/icWdWzIX2PEJ+Jo + vLPZnvD8xNtDhKOTWx6eWq/2IoRkds5e9caHv3Pdd2mifPLjKv7p + FwP8yny89rh6/Fdzy8/9WB4M5SP17GQ8X4v56e865Ogrfvm97Nzz + BIrBPnnrjJaexjLzhhwR7xqNaRW0cq92Bsv8OzJ0V3JDN9eNUeQb + o+ZXe7fi5tCtNIaRKSbqnReCg86RhXxwYy/tLhvuNSb2sehmrPvk + Jbs5EzzvSv6yHX75IHfwa3unOOZwzdc7hpGtjT18PE+LtY3voraF + PZ0D+IzclNMOevlcPHefhxkNrO6pnMuTNjo2PLGawAjuxwASIEGq + YWlHqG8canNnMizo9PdjYDECyP0GiOHz1H5TdoCKg7pYBwzwjoIH + JPpa0ucRmEHj+wUSrDzpl2CViUaBMXU4BXUmzKPzoB2HaaOrjg9f + 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 + mfzDM2sH2pF3+mGNGT4Zm3vvkLHZh2aRNWd6yOjen89CMx9Z5R/7 + tf4fu0NNcaGdOZMf6XCwo7mzaM9TaMbuxil0/Y8GJ8H9SmXFPvOg + sT/4UZCRPz5dVi++ET7EPQMVQRQqQ6Oun4IB3O97rYVzp0WHz113 + 3/5eRno79PnInpuONIfIy0EvODMB9scolmMPiuPV5KEIjESFRWAF + 5q4iMAIF6zh/T6y7eF5SW3CPn5w9cSDXwJ8biJck5ykQ1dfLj3zC + ZljEynmSfWKJdLA3WePDV+aL//NrRUMH2tTJ4Xt5Qa4nGPqeS/wl + l9KnmUe18ucpoxwwsZAxZepyxVPCEYLHR3Fcz68iDs+TnuGdHIf1 + HbHF94T2QdwcN4DjE36bnOEvbZP7g+WUuRrGXy7x1JTY14/v2lwZ + L8veTiDR9Y4Q8Wmxha94QidnOxkvB5ug/WT3xGz39+jlV5hP3ACk + TD8dzRHjKHVj0sdW1WfMo39Wnnng/d0DP/Sdx3dk4JwxNXkux+W6 + eapPW0NjTHSeSfvQoXF0rjLmM+7Ozdsad/rx4Zmnumk5Pwbe/lzD + gNQGxpgynqaP3JmH3YD9oXxX9/d+TsY4TE+p/MC3XS7f963ZCOZG + GQ4F5sGw12GdOcJ80qfgma9qY3w3c/ZsxGzc3ESYL/oxzNhArvkG + jbkKj2ubWv8y4El/XdQPt/lH9GyZf9ItJHT4oZpuVlNXxkZnGMX/ + ku9j+WGjbjoRYU4/eeZmeaGvN8S60y9G/ZXHnHd/pbs8fMV3XRti + b/UsXjT3HX/Qyyt46Hw+L/YqPZIb+qwnOrtRth4ld+5F7vPxNTtN + zbOJPmVjITCla1L4yJRL59x+dB8soYXbIYaT30jYOKU3ZtHZsZNG + Os71jr6Ndnge5zzfj2Pr4ZjojL8VOouJvicsXbOjgw1jZ9xUne2L + 38YnYvqUzKsN1nPfF7Wvap6ufKJ+sPRj51HqKzuviL3Wdt/j9z3C + Jyny+p/lB6X8uwnzziuiw/8iLSZ+XeOUjhNL6nJo5i050P29cXTj + GJfiJJfkaPeEyS1F+wNjYrXPvKjfJ59u94R4FTIdLuGD2/W9NLQv + bYu09PSLsfE087fzbltlLdn040Hf8czGJZvAjqnopLc5ii866e6P + zOWs/V055JE++ctfjTV5KdoGx3sSE3Lbnn7zx36PU79FLhzq8E0Z + v5hn69v0w9YxH6LxydDbF+KpvxOXYozs/bcm0IYvKLYyiqbJdX8o + JmDGkOnrOf0mJwpM/mj24N/KqxPjLE7CI1EZ4efg948JlC+y/erU + LFRNNoFPu0LW1I+Wo02AGE7+bX/5OD84J/nuohl5L/VMlzv+2WiM + bgO5CRHnjx64n1YZf47skTvXfDdxqb+zENXfCXt5F0NdmheDwWC3 + MRjcSEbeIj94Q1f5SfqZAH4zMiS2hFSYesoWk9U/E0dpQqR9dExc + yZHwBMgx/yrADWoHUYXifrIyOklpPXINLE9QujlYdvBZ4xas6qUJ + JljY/oCcDZZJQG7jm0HthrcbrORhnbR8QAe/j1w51fxPmxvIGVuD + 1YItl8nuE6fNL2iKOSpuF1d9g3n8DbK4w1h/ZzHyL0XkzbPyzAPv + 7x6wmH/3N+aG8BcW0oylPbe1GkPGivy2KTdm+vApfefQScX4Nj6M + N5tlc9FsgmbckDcFncXfuDWHVrY1zfyVYj2id3hnnJOtfNTHbj/e + dDQ98at/g/Qt/9vxP9f2OXMwUDB1eMwjvTEI5lwea+hyCvvN2Z3b + 03nyZR7jU/PlzIPzLoL28dnnfNnl8urX3/dHeh6r+L+D/qn9x33y + IXpiBm83W8vfFa4xBLCy35o0duzK2d65ecWucdoI9Iujg8i9lE8O + xT+OifdOg1+B49QVnm60Fz44fa/oV38xP5aTm/f+CnHy2ab97TmU + kW1Pod69U+RMLA6qdR15xoOYoO1N/OAIIX+Y1/nEnA8748i6kpdr + mK0z9lXzkH3+b+4SOaof+wyHzbB/I2K/afzJt8E0fntsBYuRP6xp + s0/TzIaYWZ8Yp82RjMvZw6B50jI+rS/5cznOeff5XNNnH/B88L72 + E5/8V3l9XPQtbzxygg42mq889OGL7jPkLzzRPfhmL1Asib9c0u9l + x6qp1znPnnN+lFAs6bv1p/ybmy9zhb3dxJu8vfAR+R6KmK/hNcfC + Lk/oLK7F1E90yf20z7w18vZY7L43DkZ/5+/gZi+9cBozxrvClrGT + HxU/IAnX/N/s6oUt7VPIMpb08cvMmTP3OtePmzGDt01be/0RzGIT + sX14YMzDSf74u/zhc9YPj72ns3lm1ro1l5kJ3nup42IsYwYgLkHt + EWUA1OCgK/0G/lZD6Ra9SFZGrieqJ78AcCKLHau4RtP2tJ2Y0JKj + oN8wDI+kH6yle5ovbMkh0Dvep6nipcqSsOyUZAZkMYXZpO7LpBYJ + Tw7GL2IgKSRKeUMzfh2au3TX33ydQgfesywZ45PT74v+pLujUp3a + 0Y4cft1iqvtpl9pMR3TO4Nbm3e19EHcwy//3gsckZrNiUuFf5vRj + PPzUCw2rrOv6SfxCr7huTFI/1YWWj85j67uNl+v3WobGOcfph/fK + +IzgmQd+5z3wMz9y/GiCjcjDSseKcZX87rvpxu/k+mKS9zNOh/6B + cRrafUyp49vnTfOp+YOs+RjR4DLHztNd8/OX/rnjX29ofxqFTv8b + 18/eW/Tf2xxF575pO+fpBSbmtTiPrLG5Plr9J1EIh8e7gn/gK46P + xO5kj1N/3afmXxzk+Je5yF8PNd768/n48z9LTn/38ZFfN/huiPtu + 71oEupnPBvDOEppuYrNm+sGb7nvEJXUbZmXWmTNYR/P919BT1Vgu + XjlOlu9UNGfaeZ/lsWpLdnmj8ByDaW++RedTK+RnfMz4ZR8dvdl1 + kTJ9x9XTfXXTWR8a60vfnRpiu83+73rdcbN8J81LbPRvWty4fMzH + h2H5VA64QehNgpi6aUtfi3Ow2eP0BiM45sHBSXOQHPR5HdbOe+Ez + 7+CXY30gcRPDU3bmv8rOudjMl+KRM932TR7g9U2eKHEPwn++5lOY + aHMoczb/jW+Ld8CleceP5yxku8hLdSdO9LuevV67cy3v3XS5kWXf + tB+1+9eVtzdO/abDJVxX2GKT/aabzN2eETH7eljG7vFbr/kgpW3L + R+qTezN26Sz9QRtpCkTLqTtBu9JXISF13gtH+Q4fB45icnYZex3v + FV3kzcLIsfpO+tT9RL7SRTU6xvna0N1Zlh23OIZ2uuf6aZwn6Tm5 + wYtQ5yZSfNQvqKbtoZgfE8RdtoyO3tjNpB35YqRvsO6bj8ZEnBdN + /W0wL/8/zJdgk6uQW9nhcb6NpX9SPbEvT7ANVmd9ynmO3NbTrp9v + m8SR/dtRThzj5Jxt8OKWhxf+Te/wduOXicPZ5KKvZcksbRqGfvVe + nUa9xr1eomnIeapXzOtiYnTbN/6f9tJF0Pi77yyeoIfq2fmZB96/ + PGDTMN8t2+cSKCfHjbEea76a+XGfB9EbAz0MKDzr2pw2ZWS6bn3o + 8GS8mKeslX3nzKYiZcY4OX16bJ4M7Sd91uXyB7/yyT9OeWg5Xn/x + Z/JvJv73/JuJnDum986tPnY4d26dsc6edehjljLn4Ttaj9fpKxHe + NFvbP+fL847e7z1s3umf1e/2gI+nvuYNx/EZXxiarz3eOfzJ77tc + fuQfXS5+RfdNP3a02SyK7+w5RmJjJgArDhYtD4En9+R88zH99ija + 95hOfXJ2cmG+ktB3Y22IvTsxOTPKH+cMR+wgy4a/a33OxhLdbX8c + ubc8kTfjfsc99g352D3XT3qma3TY5PN35534cMdx6llx+4iPyY/K + 5Je++eNJyms+Mf9r+2uPPUhEtzRv5IX4Bx9fD845yx8xh9U7c3ue + jJwlrnubtuWFrb2B08DnS/7Qjn/F3Dx53jCG3pyJ102gd8j9j8o+ + DMmPYvnIq7a35YGJX0v1LvvVjewoyJldxU+H3Ioeeu/0N9L0FRfM + Kd0Dr/rRkle2JBZuYPc5fOwZutvrae/5VubWqYurijv4+yZCfHE7 + h7Ol+uVP6v7fIbsmt513O2tbfDAfCO31DY5Fc68BqdAAuCWskjjA + 04Vz8J+oD/p7AWOzK4CzqJA3hUxlP3sq4QkFo8jujWY9cdAeDIfz + BZ1jYHlF5JI9soZaX7HHaG/3zhOwnW7qzpLF4cu0O9aR96hnMrzl + 3V+AhC+y57tdgsnGJx3Ud2KKLWPX9LvmT/GaePhogInI9Yll9zc5 + EfDKvPi+x8TFR4h2f9fPp6JUQj9PKfWx/zYZT/IVG4sYbAYVnr3M + NSx9JzO087HhGQCvevWRFzvfo9bJ+tjfczwde1TeW3oThI9J9YlN + 5Iq38QA/n/tcuae6/DSxckZzvls9OZ32maid0XERn73MeImeM1/T + Z7JuLodWLE7/bfWZXJoXyNI3pfJXDAY3XCZ/sezn429iNLzPzs88 + 8P7igZ/8/svln/794x2UGQOwTX4355P31hGbDWPCx2Y6ByXXW4yL + levPZwyYv60jxq2PsyEz9kb+yMRj7MzTXPOf+QWdTYUf3+rmBH/a + zM2dJzOW/ZuJL/6z+Tjl6+7LLZYneGHjN/+N/JuJvLP09mygYHhY + YQM8s5Go/Wl7YDO02mZjRR5eB9vqi7TV5kXrByO8u+EffFtTnpXH + 94AfHPr9X3Icb/mp491f/3rDPxr/pZ9LjtrzbHGeeIzGyVnX6vJ+ + 9mx4X5k269dtKd+Ks3FjL9axk/FAxv4OyS3vo1zDbk9ofL1y3xsE + 15Rz3ZuGxzi78TCW7/pO3qx//RhdxlDHwGPouItlj4fxYowqr4y9 + s0dzvdPxt3/39EEfqufJiu8mO/5FLnz21jddLm9+4+Xyxh9I7v9g + cv9n181hvlvs/qN7oPjUfsmvaYqlvNLe+5f07T6ecdHYy+/wmMfF + Xt/ZH/5eh9+e2L7Ivu8soe+ebxuDzZ81dkYW3Y7OmYtWX9tyDYcH + IvrZAztblKEzXxurxp86HmPY+PALsN2zpX5VRkfWs8lv+QXjXiLr + 3vFEJiA4bYy4IapS/V0w9kGaeh2TM4d0sQ3ZLIizwGLBXsNDx2AG + MMx5H+xoWsJkA8zgGUT7YlsHIQw9FjQWcE8YRsY4sfLWCzo+flds + pvfWdzvtI9U5N0DoFFQ+6M1SHP9b7NTO1kcS+pjEUTKJU78EG90m + cD4cEKd/YEuz/xH1Nf/58USXZjKG1nXLGMDv69CueY9jGwRmK2LZ + 2IT46qkR5qFd9dIt+eM7oj7qtcekvol95KqPMf3Z/+LY9D0y88YA + lye6Ju0P+vBjk8nfBp2P/nhS/9M/fLn8eDZnfi79Z3/k+J4EP5h8 + mGpBqC9SN/60d7Auf/CDya25hX7lUqrnmKOz5ItHX/2nkmKSmwc6 + MFPs5AXdPsb0G9PypLTonpVnHng/9YDvWH3DX8+7Jj9+rAGd32Dd + xoLLjq2MAzlvzM3ao6+lA+LIeTIs/FlKOsasKc/rz2FMzNzUQRQ9 + ffCTxVtfN3iZN7uYW4sypvcy4424z/qjl8un/StP/h2hXb6Pzn7n + 1x3/p+92PT+x7wwBMmN9HsKZf3bc1nbzkmJd66IZu623p538rS1z + Uf4633zx11wur/+MxZO2Z+XJPfDq3325/Mn/8HLxq63f8Xcul2// + W1lfvue4+d/n/D3WZ7v1ZY2BWU/k9r0c3Qut9f6kD9x9bZAns6+4 + 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 + 2efP6o5scm2q8eNT6BvebrbTAIcfWfmiP5Xv1r26ZE/l5TfyPeVv + +Zv5ns3PHfpf6poGq/9H5XOenScy4GH1MMn8odi4dvO6/MjW8Rka + DxxnfTPH/Il//3L5pN9/tB0Snr2+Lz3wmtdfLn/+Lx/vmPzd/+b4 + BMqZg2J7U2Z8TAzFrIc1I3P/FP0JdXN4xo09k3c7nvbCMDeegdJ9 + 5mBwHpx72+PUR84+fsnZr7tfYvQdfntUnXxqfHS/nHFG//ieLLo8 + qPJr4uYWtD4S/Kf/0+NXh/d99qPq/v8jvTnLj1i99pMul7/3Vy+X + f/INx95p8nvuScY35m77HWNlcmP6eh+TPPcGk7mte6/Mg/OunPGg + TEy7Z4t+64qYegBvzhTjWZ9Ghzj3javItb+aN2/I7vgK/17kjAcm + 3RNGvu7eDEa2/dvMx/2/gmnac4ycyW91doy9eztsOe4dbyHGOA64 + FUSA0sSNIE8/0czkP32EUUTGPYMghpaGtYwBOoeJpDpch36u98mF + rB0oY0/ZkdsnSZGzF/jI6KSSOvqReWuT6znGMRz8xOVGSCdQSZN2 + C+zpjzS9rwY6ufwz8ZlEaVLGJyb7l/EhY8VmymCf87Q/O7/PPGDi + /+pM/J/+hZfL1/23x/9Q84+X5aanlJ28DP7ks8nGpGZsNK9yRqdN + HLXvC1j71hhBr8iJkdmxnjZsXlyj62SRPPEz5S8LhhuxqJ+VZx74 + HfGAxfWXfz6/tJjv4vrOoB8V6DsbWdTlv4V45tnObZJ3zXEvmPeS + 0xbeyfOOgRk7u0WLx8KMlmzj5hw76V8k7TPWqCptxmrH4shDG73G + njGtfMCH5Bf//sLxv/Q6ftv6ZC/miO/6hvv/ZgKWrm0vQeyOF1aY + 6sfgnfmFmK6xOXeOiL6ZY8bnvZGIvX/gyy+Xz8vT+g991UtQ/ozk + qXnADxT9a/9BHpDkEydf/98d3yE9JvgjjpOnE8dR3PYksBwW797A + rATvuEqbfPIpJ2dj6F769xvHkfW4Z3qbs5FvHAMDz/usvIj8vvtC + 8fLBk2Loups9mXFjTrktM/6cfV9QDH2v2M3Ns/J4HvC/G//MX7xc + XvWay+Wb8uDwzT9xzIdzcy60bgT53HiYGNDWec04WHP+7L20K+i7 + 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 + E7nJQ7clV/UkS/yDdv/lwpKdHOdFdNqds91FDC7ZctZj5Ni4yTd4 + bQ5vtu3rPaGtvbZevPW9AelkUSNe2RsNqI7dXHtQCOEbYgyzMLn2 + m/PKoW3JUXT123bKB/kWgEv/0t/aZ7HBvuxa3VPKC6ATU86HF58A + eIyUvwNyAHf3TfntPCFHDjj7mHTeeSe0lXxVfulbH8bvIw9mj9Pl + EOSRrKcpckA/dAksli1mxJP/Rfrp/0VeC3//o9/QuG/5rV99ufzr + rz/knvEpxjtfLltf+2LsL2bl1HniBY/MZPcqEdur2219X3n3/mz9 + w9+d3/z833nC+fcfPc2YoL3mPfKRkV97gRdbd0xvhOGN/jPW+KUb + H2UbGN1UyeOTfxon1jqJEzbCAwztxk9ogvo7BDxtxW+eumu7ldfw + T+lwYgau2JYHyOVciT7fNq8gegVwfvKHjrv4V01PfhpaYHijPWNz + 6jtu2FNF2sm/gz57v90GO96THtO/Yyq+6O/FybBs9KS0Xgw+HQAe + w2d06/pNbnog6NoIPbkjwKZ8PrbrxdvRdOveDWWvDX/hXzqeDLog + AqNDc2QddtRXp+W38khbWWc3uh6YCz+45u/ixi5iFLnmYjGb2Mer + 7alvjOwEcjxt8/2EaSbbjKdzjKoj0IyHZWs02MUGRj/H1XHT6fvy + 5oQ3Dx7kgjD08bZFzUJ1ZIQFHbuTA5IHdtmg6EvGuT6xjpCnxLQH + YXvegz/2nH7Trq1rmfQzv7BFr7/4LvSHL9HIqn/jNbidblPZ3L/Z + FE36oGUd1Xync+qcq0dnyXBYv5Pz6thEibBJNANUQHZBxiFhhBZA + g6HgzGDuq0YJrnFqEdcOUwqh/9q8C6yP4ItMR4DAQzR15ZFd6UZT + 5SyIG0wQgltFdMm5+r4WGpnemD4MC8fkMsBJLwuufvQDY+Tj7Mn3 + +nvs6i7eLIaGysjn/L58huaLKfHiG+Z0Z0pSYg9B1acm8cHIAwc4 + H3vzKbzT70Ea/AM7dEPLBlfbtNN5Apm9Gwups3jyP85MqgA+3Noo + Zf2+tQ1N8Uf2SVr1ayncb4dlITwn+Vncjh4GIhv4p9v9zciSTR92 + gjeJavw8degVL3KLCb+Z8YrRXWGSzfyWEH+2fDkljiFcZ9eMS05j + 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 + 5fDnDn5sMXbBAw67NpaXHL0gn7iLnGyev1MP/vFdAb5y04BvjDe2 + lN/HT+ifEDr9YFD0HHtMm35Th/asTfgU7ZAujNxEAviP3yeWyFX5 + g8S2+ijxEFNi0PGMA3Z35Ta4YpBNlLPAwst5t/TdAX0yz+9OySS2 + /c+/N68cuMda5cUDnStaO907H4/ey398QVe6mF/pvsP1OfnGptdt + e78Xe9z8Ezu8MTcQ0Jt5h02c16dXMr1Y2jse3zTnpeTL3bZsQH92 + 6HqUv/fO9ziu/Kv/2Iss5lrns7adtld81OXyO/748dGYe7D9JdPV + ReEf+p/yYZzc3PV/Fv3rGvHTcRW/s7NzN0mM5a7D+DsN/x97dxqs + XZfWhf3u7rcBRUDmbrqBbhpaZhAUGkEGmSIozmDEqSw1lZiKVUkq + +ZD4LUklqUpVYiqaGGOiIggSS0XEiRlBJplnaIYGmqEZBBTpbrrz + //33uvazz/2c8zxnepu3O89VZ5+191rXuuZ1rbWHe2/jJG4pzAuH + jL2j71bzrQv+4YPm2uwbn5UjsTB8esEkspHpWckHsyYRL2KqY4dc + C9R5Idqscca30049dc0XoQnsNzfGFnLwzG9b60Gu0Nb3GFfkAK0j + 49Aso0VbfKdv8ycdxPjC0zc0k/0ugQqa+ssM3zZMAgw3BM+F3zAu + /oerayeGKH80ZE/aDuj4cApokib8SmDaHoLQpiCndtAvR8GbRD59 + JFp3WDigjj0YZXBuUo44Ywt9u49uGh+S94780PfWqff6kLz6/O02 + fTl6gld7RxmbjM2ia/3ZxrwF6pV5K9T3bj8sVSWg5jdgjifhz8Sn + 7gh00oavfZsf1bI9Oeg/9mDniRV91MPTF58LuOk7wa2NfwzGwX/I + lkehbrCPdyfm6C0WRo+RBZ/aJLxHvyE/g3zXL7iFpbN4Bb1yHJvw + wdH2W+vt/uM58ijZRem1/DM+UG596lzZ3sdm8Kb/OXd9Z5zR+/Wx + iR+Nv+gD8qrrxBoetUdo8ovtthCRCvsd/PBWx0bdopN8QB65Yuy8 + uj1UkIu+jZfQkgfY/NivY55ekVu9yQheE3yOxaj+JqWJhSMjffjd + B+132uweqB8Wbftoj72Gls8D6H8fYMy/z8se/IYsohWWOA+xuKq9 + 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 + PIviyh1e5ki6WrPB8VZ08XNXYC/6dLEe2qA3Raxnl87PXbq6yHBV + fG49b/7fOHeBHn96d/zSdyA6Vk/lqnMsJoxx429/SmoQpu89lc01 + izYfsNkbChrP4Udn8UeMuVmlrecl1rFpYLuuA3PoXMTYgdOxI3ay + Od94thjSd8XSURex9TpjMPZ1h65q+xf86dN+OR7AR1xMvj7GJdvl + rxcY5sJV61Sewcjasb/kL//gaVsB8OClMgK0CTYlouOoYyfJ4DVR + aoc0ChybSYGwNUyCTwDOM9KUVE9OdxGd2To2SbmV3kfYhuhiOAo4 + eXRmjEeB8bKDVxVZ1Qp1grjGiayvDf0mPTRXP3j6cU43xO4AaLkK + TZedbuoqS+R2NUi938sp2eKZALvcSRiAvPxCXt+wY7L5xiSZTVBH + YNf6fV2R4Gv4k3g6waTuKsB/fDgl3GP9se/g8Nl9AV6FKIs+nf2z + T/5XL5/ZtxjsoIzeYO+7He7/9TWAjSd3FkwITRqhcWsg0y06G8Mm + oF5JMvgWkBGMDk1UxsOyR21xwN+wn/x/YoFnrgXEcK/4rrs6M+d0 + slhii+uJ8Zto4ntZ3tRr0fbGCt/9dafTN/6z7cSn+WnlhVloeArk + NbFdFysZ++c5Qg5jS3ND1wnZNyfI9x/yCafTR//BvE30Ha9nHSd7 + P/nD+ezFF+cR1r9zOv3Qt2+00P11OVkq/ZCaxezP/1Q+9P6vTqcv + /dx8IuK9tu8GftDHbZ+L8BukkfWcu5z9+/78NqcNzXMcsvzED55O + X/eP8rKdbD/yHTkZzVxefReymPnVf50YyPYTP7R93uKL/kq+Gfd+ + Oen8jO17kj5dgd9VspzzdZL7KX8mj7R+z+n0fd+Q1vDQV87uSVHs + iq/cfavkf8aQPnOBhP/RNX+zi3GD576oXGuU87FSO4TO67Le6Zog + 5TnOGdtrHdK5d6yjLxnJs9sxNgFHf2w1N/+PhnWabacfnuxrPWp9 + azywT9e/N2dxoYec5LG+4cfeaM9a9qnozf6vS50LH/vTRBeo3PyA + Df1G9cd/YLvYYv8XcmHjVxLrR3/REX+bdQKbiAt3qMXy275jLr68 + 63ZB5p1ftP3eb7fbzcW6tEfXHom35uvY/yjfpR3uudI6rXcps44V + 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 + Z9zI4WRB+zwerkX0EiQ6se3577g7dqOHscAH86baO921j9zuoAK/ + ExMPM36qT2x7nquLfId/9BDDzObf+I0d23aIgcFja3ZxfK/xdgs9 + jrFnzNmqR2TrxaKlh/37gOE3JV4Ta2J/bLizW/ab4+nHfi6+N4dl + vLCjuB37kxVux1TwXNgX3+g3vlPCNdbnnQXipb5ZOeVIC70d0g8u + Wp3/1vpnZGs/tGPDxmB44ONFoJWbDAvSZ7tDOBUt03nK2R3ilX8q + F9qxgAcIsfc5MJw2SYYhZuArz+HZafch7RqKkaMEJ3EYUN8gplza + 7Z8DGcpjKV8nB0k92gxDDqA4E7X1j/2XTuPocS4ZyYs+VU0UVz2e + 9lj6VyFEYHr3xPlMcPzpfZld2KlyRTZ2mIFWNkNHOQaZuoMcnQzx + ZvdDPXqAPQxmMnSA8Vvqyzt96suDTdrp7B//wlPymwFUO2b/rtCY + Qju2ICNZ0cZHGyAvfcj/lMGUBQO7+a1b8Yr14N/0U5K7OgZ34m9s + 86DHzffQtpEJPQmgsZdj5XkAk2F8TQ46jpwXuKMbHcfe2uqvAxKe + BfyzY7sMRsbL+FTuJfuxPSR3P3uMjSxdbCRW+q3LHF/FUCxKwLV3 + 9BMn9Wf4oDuA9/DcF3HpVx9foQz8scnE9HmcDP2wPr02+OR2hdt4 + nxOo6TO4dy0v2P+o5CJ8hTpb68Lf/an2SOO8c9qOzYvFlcWMGWNk + Yp5/+JQPG4PZZ9v640B8/HMl8dVwmc/QHd9f0A3b8B1fihfHx/yE + 7OAsFs1tHT9L9nOag6dsDMoN0UWckKPjzZgM7HqlfXj/xnc+nT72 + D59O7/CCDeeu/8X0V3x+3o74Q1sMGjeTe+rA8euUaTd30NHWeB25 + +S4bGNmrij6xB7r0eBR4XK6PzK8xNvZgn6E5/dF+jnFjLKfkm9dP + /IQn+dm4YyvtzcPqD0Be400c9KJQyp0XWY/42SdDc4wTNzRDH87o + pWxMhWbpRSb01OuLn7lzclXzbOiA0l3xcJO7aE603YFlK4DHq0Pn + guxtucM/trgD1C50j4xs9m/yWKx8x2e3hU/8E6fTe31oXmCWu9vf + 8mX53eWPJA4SNwP1yR3lRou/uo4QcGdgke6lPu//20+nj/n07ePr + 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 + lVmg4XsEus1CvLRXDI7MO+5i1ok1cVK7p28f3U3b2ES/d3vf7eUb + b/OOe+877ZjXvvzz8rjed253leq76MUm/NCLKctXGI1vhqnjsbd9 + 9MT5fJ/q2If8bNV8Ev2emwtqPv7ut4RXnRDq/z4fkbuhLzidfvoV + i3bk6xMD4df4WX4ZP+LzkI1DZ2TXZkzSzdza3BBa089vBz/o4zKX + 5WmKgXd7n9Ppbd85d1GDV/nDc0BM73M0HwdnfEa+GRdiZsb8yDL2 + mIUYmtom1sWj79k970Ubj+F5Vfnybzudfu4n48tcuAHlvWJ2q7mH + /5GPzdzlaX6K/ql6sJ9jerv7OXpexlWsVW/2QiNyfunnnHo3lM/5 + 57bAl2hPHKMz/r0tzelH7uaNxPnkeG3DU3kXIPPXfVEugnz1NjbQ + Ku3Yh13xN3bYR5yMje/Kd2RGr/Eb2uegDR+l2Gz8Rt6Z72cs6Tfy + KLuuTal9vqd9Tvu2x+jbmofGJkv2p1LKq7+aTYwpyWwsRoX7gyUD + gqP344izIf/JHS76kPNcKLTgqWdv/hfXcxOKPQGUoBaac5KHVWrv + he1lj4Wyx4zj4iy7oOviGr74HUGdDX/zu35wJtcdcL1U5vUPDBFk + MMFrn1J9BCnKd2JdTNV3coV0CXCeK05NuhakNF+AnsHxK2n/1Zyk + jGBoVoT8GwUkruNt6tavwWX/HI519gU8Q5DDMUcCOjZ5xzhTt7Xc + 7D+a89gIcSwKZgJheBvVtd0nsFWT8dJrGNSGB2aOXRGkY7+3FL0J + VJmCdxfd71OfJ7RuZwHjSPy5U1ifIpM6k5NxZfwY/PzcsQEp0P2U + e7ykXjzZjqAdDD4mjbuU09Z4Sr8+WmXcb106xvXbjw9xqdK4Frdw + 5IuB8lq40791g3BWNiGHlrHuEbjnJK/Qt7G96LOTMQ+eyiM1o8PQ + HV2OvNU1mS979pErcqKdYu+T9soPP/Zuog7OUfalDvb3A0svxHY5 + UtdJM3o6KamOkQPQf2ztWJ8uuqIPOccO0yZ2QCcPOomjbJMv0Pu3 + uUNkIkqo7TmcYUor7Z1H0vYWucPdk6ZpQzhAhrHRVrN4kC0+rA4r + jqtj6oE+2sky323baS27b4gbnpMdus5JobZXr1hgo7nr2T75R271 + fN/8faBZeQ9y6EMO8xs6vTMf25dGbAiV/h/zh+7xRTKh6XdbX/sP + tztffEEuG74eBSJ3macA2o4wevApX3cOiy9rD75fOrZP+oorfMYm + +P/8T+Vu3LtvfY60Z//5L86jhB92Or3iu7eTnZO5PrbiK3JetX4Y + nNFpZNcP/57ERW4wbfSd3w5OjGr3NIi7st/xL7JI/3k1W5/xb0+O + lq2GVuMqfOQTcdP1Q3CYBA65d5tnH0z8iUcy8sGHf2pORp+3tT/u + v7tsr/rxLX/BxROv3pXB+B6g9ovdjGU+Rz9/BcfM8JqU4xt1oxd9 + B/QTL+6EsyPw2ZMv/zt5LPpdtidvpn5rvf5/fIz7mc/0rAzduT6d + yzCNTY/vmSMGRr85MZr6m5Zs4iLJF/3V3D3/gdg1vASMermq9mX7 + GLm2WT7Vfl9Alxm33c/hkf7U4WcMsTVbGNvNc+TVCLIjzrX1J0+R + /dh/Q7rj//DA14mmcmQfqsahWNVGFnYkzzzCPXh3KenLRkc7HemN + r+ou9tEhwJ9sWLlzfJVtBl9OEBPe7EmH49iavh13wYE7F/Gn/+DM + cYVYfOWIOc/Bo/P6mS/5WvzPzzZG7qGz0X19LJ3LO8+ygswqp7rm + H+M36WWfIBxTgXKs47lQQ/RYwqG4wc2pY1B0CKedsU2iY5xRGh38 + KxA6SY4S7ST69j8yu2J/eDkrZmzHT8WR+OFdHYfPFTQeV00vkyon + gvmw5zhXuQdVjbDh3cv/6HWVLy7YMjJU/+hMf8HAlule2c8H4r3I + 9oTIG8QC/Cj2JIUBMcG3LY01MR6/z/gZvClnnHTxk1jZEsG0XiyP + cTWxp27fVndjy/hv4iHMiv3pr69xSPaOlbNx2IV1JgD4vaBx1p9U + 1S908LLVFsZ24vv8BET7/IaGXM0hsd0AWqPD1CnJVvtlH91ZQGuD + PzLQrzRDZ+pG1+L6d09QOSP7kf6RNP582Lt9/Lmg9Wf76kpv7Bu6 + fNaJ+JAr4EweYxM2BGMPvgRHHnBsvUiGZmg075BvAbrTxz6/2+xX + Dv2yHWHwlbM1ZtPnCPS3iLDVjwe+g6e/+QWQrXPSiovxff0f2mQC + w/94DAc+IK+4Rs/2oZ+83bnybbz7AL+F/LK/nTtvP7rxIgfVLAac + /NY/bEif+OUo7+yPHMVdvhx7V+6DvnDx4Bf9bV4s4w2T7/reVz8S + ic7Hfsbp5GTnF35ms/PY6CjH2LF80qcnQSnhHH0n1npVXq5b8g2d + 3h382Ad3LNUP3Zf+1tjrcyPzjz2whf70JWNQ17+tj77j88lRcOvj + +LkxvXzdriWw9e24Cc0XvvR0+uCDPPCuAm+H/cFvzVopi3MnqB23 + Qb7MVlfRuG59c+XIvmyYYrNByrEZemMfjeKqeEtX7cbK+Mrx1/yD + vMzn3U+nj//M7a4s294U8LfWK10MA/z+ZsbTOt5qb/6fPOYSMQQm + RqhUXe9A35M6X/CX8tjv929jbk5ayGybcSYXksMFpOFPlhzeGdAD + Y6eJ4Qt1cLKRBz452IT+A5UXjryQEh1jf3L84N1HSQZ5q6ciyyZD + d/RgnBmHygsvvxrkO5T4jO2Q4Z9U1Y5dS8Q2Yl29sW+dVBvGLqa9 + h/rrHBiabQ9uVC2dOcmdfi3Txt7yHah/EveL1FaZ/3BB7YZgNmMa + kNFY6flW8OAMj66PRu6xd/ogATYZXiPLLaytfmNE+MWkxkE87X2d + 7QFv7V5ZNIFGSYrWoMEkJKNqM2gM/AbaUlSBV9/ql3KSbxcJrB+A + P4bZah79fxwDq/thwmivN3nSNQzxXCI8mth5azo1aEIPsBdn7ovP + mPdZdEw9OMqy1dzuPzoj+6NsAY8NbWTYg3HJc1Nb3k7aJ72eLguI + WcmcX3eIz8WE5NI4STw24afOsTabfVCcjAOJrsl51U9bkfxb/a6M + t/TTFb2ZRLqv74Gmw0LoNYllfOBt3Azo3xc+pcKYmiQ37ceyvMR3 + 8kJtsRL44GDdTyik7JX30J6TDrRn4JP1qJvjyT8jJ/rt86DbbtMZ + Zx1rclVoj61zdG+Afy8CWDzKX9mAsvZetj7X56jb7LcUC4uGCQXt + 0fNCflh49OOv5hO2lo/Z8QjLlujza+0dnOOTIkd0+7u9Q786RhZy + oL9U2rvgzZfokgc+vB10iE7sM3lybzvs4LkD+4UOnmNLY+gh2tNB + 3+hHODri47g5Vs7P/ts9/9QF8ju8YDrdvfSJCb/Nc5emJ56bCP1c + AH0qS2zi8wHnbxE8cqfj+LL2Pvh9j4/pEF2etcZo6Yf2N31Jfkf4 + kaeTE93BH/Qp3z13516WO2UWyq/60chztPcgpeS7xpP4k8vCr3ET + nmDa9gs9W3X56nv87aATZnc+vMwFLb/j89i9O5XzOCR6+p3LTT52 + 4Xf+M3ezceNNfkpbcZYe01/JhuR7q7ffToTdPZ32Je6lhUcMX/ny + NIVm4z1lyG1+xPOegNzGzKuXnJWZDRb9xjz9ht++s+Q5HOvUcWF8 + hh4QS//kr213Rz/y920nhdO2YTz+f224YmBsJ77Y5a5grdm7OuLr + APQXJ8Pv0HStXS8D+od/+XT6tq/cTpwbv6vn2Fa+bL6Sqy6Lu2tx + ugZSfLSPsWF+1q1xID/E189ma/EdmQZ08ykCP+PicmsCst+HD4aH + kq/J0nwSHi4Y7sF4RJx9uJHZvPpIvMG/Ycn/4rV6prR/vLjceF92 + 6ryzbHK03UMsI/OMO6W5Yc558FPXMh1r7xwzeu0d3EfaPHjsYdxV + 1sjWuZuMbDkQPHzgwHU+5sYV2seYf9brfX0xJ4SvFxmilCA65BAB + UGFzPGevdcjWdK3/8N3O7EAPO853tQkvA+c8GIcv4pzRR5LSvxMz + h0XMoyJj1GsJEyT8yTKPGjk+8rwuncHDnzx0QacOTKme3sPPse3e + IDz4agLH5JWqyoAPWWx1fuztZL5XV7OIFBhAO1s8gTdiC8TXxsnE + H02EWU8Qs2PcmIxm/J37uzGSMSCOehEjcXIVoAuMaRMGWtNfnDc3 + pB5IKR1b22H/H+N/YtR49qP2p8J/xst0Ebs2uJmztrG14nVoGQPy + Cfk9z99kCyd9yDYAvwkxtupjMsE3YNip4yHthdTpVr1Cm00cd+yE + fnEXztahrEqHrfVrrooMXRikHNKDf9dSqvboh7fJjd3Ze/LB5Gi2 + 5aOxVRVZwqinS9tSVz0jeycsOSJ9B9rFv7Q3Ttg7tqm9Vz6h984H + ao4nV/fD8ekDYv7Ww22f1mZ/xQvb0YkcdDwunuCDihJCdHjdmhu0 + 1fcYBKCqQ9fB8NN2BPW2sZnFj9+5W3To28dW2RHT1IHupyx9Y0ec + 0C98zCveOEd38nz0p59OL37/1Avge4BfzKcJviIvSfF7s8ZXaJKD + TFOytzHPUN7u2ThYvAcP7v/H3p1H/bfddWH//m4GQSEFIZBAgBBG + GYKIEJApBHDAAUcE69B2dV52WrauDv+0XbWttssOtnZYWqtWKk4g + VIEgiCAyjyKSEEIICRlEJAHMdHNv36/3OZ/z28/3Ps/v97u/58mN + 9/r7rOc855y9P/sz78/e+5zzPWf6jj7mLoFHw1a/wwHayDF+X6jv + lHbKvczqZd+9fVrhl+YNk1fB535pFmMvz+cx/vLp5Ft7K922CX32 + sbEZfvyxXpzia/XiYQuA7MkXXHel1t8OuiPpd4uf8mu3N7u+d34z + /vz44BXft/Fv7IdOdU37sQlZ2IQ9+LNvggzP4kWe1sXf5Qt5gdoo + MnoB2K/54o33vbxd1N3B7/wb21tb2RhEpMY/G7w9jzjeFLB7FybR + oYvdyNvYwDAwMdE+k3P6Ns/v9UVa/o3O5C5K/nnU86//icRJ9haF + Pv/RsWhpd8fD0BDXfD1x4pHrsc0d296lkm/E+Dp/nCZkpM/jhZ95 + 7en0dX/6dPqer4uv0jc6/1uI1EbsE1sLVxc5AVZ0Gh0vi6kiPo5/ + 47+OmYlvvG3Khw/fNgaSH8ikv7F1x7WdF9xpJz586F4bx3LzTUHl + CzFx3jvQkXViia3AyIGvXEy3xmxkvy6gjRbdyeBY7On3lYP9Ugdv + YGKHPYyZD2uz5who5B5ba+OYbvDRQrt5e6E59N0lJYt5kPxjGxmH + lv00nYuh8Pvoe+SY+Buaazt89U821IY87rbC3XzuDqHLfrnspdCj + CpLAJIQS3RVybDJA45bjFFiV30q2/3Bat7ev0ePUDpypY0STrAMv + zVa6jrWhBDqMD5oYcn4V3w1r+w9npem8ST3Op0cH7t0ga7vrHJdf + ZKcbXjaJgk3rrPC7F9nvKkN4lHauEj9jp83BpZ26uTrO8cObzcl3 + bpe78nqA8M+2BRLLK4x/n5G+ow+ZICoTf0fyz/k0m+RznuwnVoa2 + pOmVhGIKNDEnntyp6I+aUzeAtrhrLnEiJgONz+yPfplyMkqUcB8O + Lj4rb7SBXGDgbi7JuQmjBHfEd+raByCHzvA4eCZ5uwr59LSjgyT9 + zOA1QUcGIhIVf32LXdCeXIUvWjYTqlUnp6WTvclQ+x3asTm8eQws + Z9eGTpQjF2APdz/zd3oo+lS+3Q9y0OHv1MOp2Lvs9Bl4W8rk95kM + 0+XIJzsS2gblsXfv1qRO+dgaqnOgPTuRw6D4CD+mbvKQY6jsjaY4 + ciyutLEncOkFET1QftmLZ69N74SFXMHxtk/t0B05tAFrTG0lF3Hg + 2+hYu4WOGKnOKa9/w2/Vlc3oZhPDBubKHQbP+9j8juyLTqebepEM + G33vS0+nV/7AFl90qI6UjVyATcbe7AlM+lq/4OnrFndoGlMr9x7f + jEfH0RMPx8WLjvKJ+Oarv/0XT11sfcQn3da7TJd/7/Ps0+lL/sPN + T+TXZ1do/89EnZx4NAYTw/xNF0Cv98wFkFlckKdyBefTf8u28IBP + tr/7106nN7zqdPrIT94WhNp/wmfmEx1/c18QKkj72mofE52zSXNg + jt2V8jvA8SVbOdZm7TdIAbzFx8d/1un0Bb9vuzO81dz5v982+jQH + +gP1aWQYu4wMU3+dfe0Wv0XVfptTngPjaz4daL8UM4HKtB1u52ik + rf7xjOje+LKL3Pz71X9ye6z4xV96On34J24LsaX5lYeVL7XiEk3n + naDLBdeE+RwDMuf6PF7S2r/x1bkz+L+fTt/xNfk99ZtDYZd3pe2Y + Ds2n2fdiTXIFsyZc6mM43R6vEJfg65f6PX6Nm10mqGLbIsJ4qk5/ + mxfFjJz2hLMD4l0u9DQduvxdnK362v+b5xM/XReEmvw9eb7EIz9h + Zrx2vI5p1xGADeqX7IVw80HyDZusfXxsMvLIUWJe/+hiL/1A/iQ3 + XzeGI+fkE3abXDP5a+QeXOeO1eNX2mnn+PDl3ohJWi8Hx5/06Dwg + cg1c6qM07NgQmsa0sXP3Kbt1a18Q3oqVEdAJMRhi9k0Ke9JQP0pj + DPcqGBrqtWM4a08BaSHGQCMQHMa4DMZpXY2nvQ//NvlENrDy2Uou + /r+0Pm27uI0cxxXHi80e9xk+qw50IzsbNelGv9nXbrv8j5vR3qCB + FLvSA++nxUctQze8lLG7DmxSSpZOYvf2l9rlfoV50O7dboGJv/qV + /yNRY3Dfd7KfWGwf3vtaYyT1JmBis+ca7lBac7Lvxe4sdpo0Q0sy + n/YHeujIHfDn9wHqpo+gvcarJCvRA7miCvRsk0sZHk9LPLeduj3+ + Z9Ca3DRyD4+DT5o4xqcT2tCzl5OU72Y55C4/A+ue6HdxijvIB6+9 + Uj8jh7Z0f8SoH8LTT4fGdfbt17EH2dEmNzlq79iE7SZvzkRkQ9rM + Wj37L22z1xYemCcyyI9GbZjyoFQfvmbv5pPUl676IKA1MHQVGazq + P7GQQY5dVtyRm43QttCc2EK3sNB2rhiN+ma396Psscuh3Wzw8LgK + Dh47Avt20Z1zbNkCTm0SXgNkmH6Fb8c0/k8jdzVe8mU3+yIZLx35 + 9r++v6AlvA+5CRnAl0zszcZk40/H7KQOVL+c1N7BHbmnntI9zj80 + S3evXOObvX/0O7LQ+rrtA/AWfleBxye/5A9vdxO9kv8cJqb0nckb + 5J58pfzCHUw6RyaTN4vuedvpj37ndufSI5juEvqNo9j+6F+9PTb6 + 0ylvXMTHFip+e8heAK/xdSfLKR/d2VGeaBzttthabf/hWUD+un95 + e6mK87vBm34mnyiIP3/29bdp1KdL29p7Ob8bzbvVHzETxKuOVxor + znk5e7EHc4y+8B3LE9/4/+TO8MtOpy/6V2P/T90eIZ08s9K69HjX + Gb0Lfr8U+d4Ku8BPfrkMLnHpZWgt83bd1/14XiDzp7fvgMpt/ATG + XmzQ4yGc8/O+w3CDJ+62Tlcy9/WPyfQZtm+fJ1MKlYPGrxjO1kVV + bGFOOCKO7EeDtCGf/qHubckn7ZPToFSv98+4X9tF5o7JkW1suQVW + 6IefeSyQxzo2bKfX+x+69BLHdMa3uXAMtlJfytjEusG8mk3Gd5Vr + x7Nb7d2Fb/C1vQrIop4c+gna1j2HL9NwmiubxflcMNF2aNhfBmjb + 4KLd/Bqblq4F4a1c8n+0D8ZvlU2IDLRDDRbmq6CSs3IDyiTQEWba + ne/HoS0fYe0jibZXwlJP+EdzzvAc0uecQ0PzqwxwTnd4jQjn9dc9 + v0oO5ZJn7XRdJkt7dE1efFJjfNB9eLXzps6EHNCZrR7AU9cCR3xf + 4uwO4Ppy+g9oTGYg0oc70dmK7/w/AbT2eQFlQWk/CfEYNBKDcCW3 + yRkj3zCZmNV2FoTkXPNFY5yMaYTeEcMO6HkGQ1Oxthd4po3z4qgP + UVv12HFbNnSzd4iOg6HV8xSB0lK/020hujmfPt+yG/xXm+wyrXcf + DfD9hM8uC7sfMm8iXpDi0GPHR+vWbo9BxAbUr7u92m5vo27kweuw + hwrn2672g3duE+dz13PoatpjB2dwgX7q0Aelvcf3tDX4FUGOpNco + o8EdoDLBRdyejLFlaezthl/jR5+Cl418L/yc7fd173mHRyl3Mve0 + 0x++7StPp9e8PDJElxUutUdkmHLyUR3ULpGx+u2F8FaYdmvZelz8 + 0KAuWf7OV5xOH5MFl2+lzh29FX+OLc7+wH85Zze/d/fFpzhe/6rt + TozHWWch+P7P2+7YvtLLW7K489vO3/Uf5c7hZ22TwJuX5s4Uyfot + eYSWjORZfXDYn4HfRTD8pp9cxuaQ47LKlGnb2M9+pTc05Z6//y3b + 70d93urTsnD3sp1/4f0TJ1nIHx33EvrT7VT1BoJ+fE14jyzYOxlG + Z4/5kfVupI07Hnd+0xtPpx/+ttPppX82i91/uNnAQnOFscVqv9Fn + 6vDVB9fzlcZ9HS86DX10Dh7hd8FfO/4FOfcy7dCwqZ+xXflNwsLu + GIuNmwPkrRxsJcfabgrCh26r/pfFRcXJv7EF9o4vjA3khLjbjL2a + d5Mfi6tRCTm4GoYHmYDz2mDOU6bOON06clwCF3Q6r0/71kdm+bvf + Z0ffgvDRfIsg9wcbnCpto8AQpZyVs5Wo3xpU2QhiRS+Z9SppiF8F + Q49B0HQFwx7M1Yft7Hb5tDHZdAVGMLgta3JJFrxtBkoy3yugS350 + qitHXmHUe6U5eOhQCzm0O3EOfYOkzSJWPfnvJTiCdSWUV4iVdpLr + XOWcBpINGeaqi70r7yvv8cG0ebB/cltgYmLicP0WoTgRI71ClPgH + 8DzeKE4mFpRdBurRELf6XC9C7LhTJ7Ykr7majlYvGiU+G/tpe05/ + ztHQXt+0eUW9tlN/7EOfDMVPPCsX6/KQdv39V+pXmLaTrPUFNExK + 5mkF+PDQLc3YRJ6Se+wnZ+wqH3iluZGrHcc2FrfsPYthx2jfBPAh + uU1ERl50Hcs59GO7yZvnuaEJapGFvtPGVU9+7pXbPU7QhsO3Hm0T + L2zSXHKmFzz0K5fD4B6PXMYmjcPwWG0x9iYD+7lyiTbbTZ5c9Uxp + i/m98RUectvIDbf0s8fflVp28eg+2QdmsQwXrQ685A8MXm2dcU+s + NIbF2IZSm4yduxdXgff7oO0zE+/33O38Jv6/OpPP7/7aTEhzVwnU + ztthTuZgK2dH4ya/r1ePB+uwt7E79oBPz0tjNLSHPPvwO9vUP3uM + e4Oo79A9Ky9TcddtLuwMvydq72U7ftdosaW/Ov7cL9nuDJLh4z/j + dPrBb4oNI+9n/87cPfyYTY8nSr7hI8Z/8O9sbz716Q6w+tOxGDPB + ZG92v2lY+V1F+/HgDC659SVy28TVL/yT0+mb/kJeQvSNp9Ov+oLT + 6RM/Z7sz67edfmcpj+m/m9LH7hDrpu4QemS0OQVlQU3YK0C+MDb6 + jafP67irbfH+g3/7dHr1j6Y8ZXDQ0fflEDGH7NiipHcezZnBb9+J + rvrIjA3w1lzXdvfxD1/90thw0A7/UVMctb+n3+vz4NYvyXaW57ea + TSdtjCN0LO3kQnreFOgLtWOEFAcjd/N3mNCpcsd25JinmY6kdA1B + 6CO22Mv8oT4KD+PIjA3I158cuxyL8cmb9WXaiPWxNVz06AZvYmRo + qwcXYmU/7xi4952Ol8njF2weJjOuoq+fyd1Rp3Kf01xtCZcNlT3m + m5i3vFQmz3H67EQJxzkrsTkuMwFsANg7LsUJyzDAM8aDv5U89r+r + 12iNg2v0BFeVTR2aQ8NxE8uuMN41zs7fwhQuo6M37R7L9XYJI6x4 + jFPYnX0b8/EfDe3KFHnmd4N93jidSPAVwotu14bQYcsJmHH60PVj + Ub5i2/khKX3ZfOx9E51q+D3Yv/sswPdr/JHEFaTjMev4XKIVL5Po + 2g+WuF/7hfZDb47FjFhr0gs/SU5SAo1xuSH0m1QNkHtemMcm3KIw + oR6W5/GKf8vIGlrO35FjiRTNwVc+ssoPeCI6ibfxLUcsoL8FpfkE + LbLPI2G1yd4h7Ubv6Sd4tE0GDGX68chSFnvb2juyog3vQr8MzoU2 + bXj//0YOvgAVgYKBTiy2wy6u4EIYuWu7RR65U5ywM+jgFvtrN7ZQ + 7iqiq7MG7T5WmlwyC05y9HH00B36tXdszS9dnMRubD0DPpoTDPjY + qk8mYeNLMdey1ME95Mnxam84E9/NbWhrYxe+6pt/087AT+fGbOJZ + jkTXorWD5R7T9BiZxiZDs3KnDRaVMXKKVe3T7ORuiLdrancTYGLq + 8bvXvGzj0cU65rYAfeZYrOpz/FebiNccrzBy088Cf+xdfeEjl39s + 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 + Y3wmWL/+X9keB+Sjq8BLXdBwZ8YbQl10QZ/I5R1+M4GZsRWPuQAG + l9/mosPwgSOeXp7ffXmL53M/IniRw+JQflpjXb3ft83vM0szuMUh + y2JrdV6M8nv+s/j7JVtuGp532nsU8m/8n3m09uu3O5doz+OWo29I + 9057fbD7sTGp4l0E5c3Yl8BaN/4ftON8kW3kHhwxxwe922oMiB3b + Dr+lnUPlnZs4TjyYFI+P/CaXf28CnvX+8X9o4zcbPUF3q1zLMVx4 + g+u8bZTtvnRxTaisdkOU3mvbreXG3/HQmvL73VfcRcaVzsivrMd7 + fB+yEhykvH6g326jluefz7485wX3HvPT7k578X08gbEgrnY+5A0u + W66xszS59uHBMzzGHFM2xI/FfexEdrDKRFbnclVzUOJeH2DT4qUe + jdJJ25X++Mi+IHb243M89crahiz8lg2P9Wmd4gQXnq1rnuA1we6x + oo3F5MNve0sWhO98cwR/+OiMGA2MMKNgmYfIACUpbq949Jj6c3zn + cBkK8gTDXMmcdoeiu8LlET41ysK/52mEjsmmc4rhAabensHwYRDA + ITVe6D5G8GLc2z+0Z8DSoraiY5Ja5Q6fCy+6ODfSvbF5DFZ9E1rM + cTeSrgzQV+Kab9NNp5qgfgyDBwVPCgs0/jLAicEV+HzuEorDTsoE + yw7iZ7YpO9+rnz7UOEn7tkl8T8w5nxwg9tvX0h/hO257vFLXK1QL + zQv8EFzkW+vQ6CQuhc0f+lboDZAB4MkO9tU3ZVOnvol57wtkxq/y + qbwCake8gmuSIodMm9nj8c7wZBRydaK361+yu3xXsLixYnKQyb55 + iI7p8wbc2i91A8UjqzbJx9UhOeKIkwW3zl7OV9z+Rs8AAxYcbWq7 + yND42O2NPt6zaYbeAcsxmefKsfoVz8IEXWV0tUd7xSlN9Ha5+KZ+ + T5E4mbGgeMs/NN6pXaD0c7zSXY8H530/8HR6yb+YBdAHt9mN/LNQ + +bavyoLmpyP37puJ7ZkssyOonNFPnqcj28Ole1XZ9Snyjq8tm8B1 + 3Pje/TM2U452bR1cM6Xi73j1ccr4YMBdab+RMyZ/4R/YXrIz/XFw + 1r2FlTvNfzntfuz7bs8PyOZN4tOWPu6ArvZf9R7bVN7gaf+zb8hv + Cf/B6eQ7ib4teJ4nyf1dX5vf8/3EbR2m71Sn8B9gC4+dftl/un14 + 3ktK7gU8jvo3/9Tp9J3/3/amypkM9s5IdCL3qhOanZ+Ed/VbZLgX + fnfCocPAOc871U2bdS8GyT45t7ESe5qDoe0CXuNLTKacPZWXz6LT + cniQR7s5K3t3kd0FuQl4v+dsj6W68w7GBofPlUXObWWX/WKvnF2A + 9WLnZX0HMl2NGfrP2MKTZOvFrgtEr3HCjvQZnVZ/liyEXZ+ZG/Df + 2BlOfbg7pHTGhxkjPubTtrf23mvcl+ed/kWW2j32Zht2OWCRtTLn + 3IWw5qFdvgP3Bg74srRDa+K5eWeXaWzJXtM37Z1PLibGxMQsBuv3 + 0B6fFOdM/rWu9bGFucrqlws4q53SYOQZX1amBUfbI753G9KN3K1L + WWk88uan5zceb0oHzptGI8QaDAQbEDyRrwQE/gSVRQ/FJ7gGf91j + OHQdc7xbsh4PYvhfkis/0znG6NrDZZDeBg0PjzyqP5TNMRygvE4M + PsUo2oSSNq3PeSdFJnQ5Jj/HednKZoicb8XFfzz/8Hb1yl0Mx9Ux + tH3oeX7DpV7yB7vI28k1/uOD/jHwo30JcQHZRXJw2citf7YA8PmT + 3A/gyWkBvvPYl/hbQX82yWofTT8V973wEvzGaZDhXBYzF+gkRtD2 + +w6xo43HRnpRZxBDs28ATnw1ieXcVWH8JzfgKf4MJtOHJ+4OGci2 + 01zLjs4p5tFNv+1v0yKLBtrA18fQn4tDpbHQrC3kskxY4Ij96ZeH + KrsA2trkKjkCsAP9Blb55TU/du/jmcHR5+k54BGQwZ+y+92T+b3y + GJXH3oZmdd0JduIROzXvRBZ2X/s5XO1Gx8mxDMmP1VEO3emttB2z + ozb0Gz2HniZzLPcUN/jyvW/GdfwIjvjxyFJzU2w3bXaWjdf6MvJ0 + fNhlVk+Gsbc7xmgOHfUrraCmwdamOPGlscEEc/X9tBHfvXAQvNon + 53jNwmS1RUmHNjt85m89nT78EyJLdLwJEHO+OfjqH9n6ET35RdzW + P3EOmVcgOx31O3KqX+UZ9NGh/gk+X8gPYnRoozv0xw7w2h+yR4ve + c5FlaI487uD9tf9x883n/97td3bsfhW86DeGduLhr/7x7aUr9Nef + 6pfw6T46kUFM8enIZwzU1jn5Ownjv9gD3o/8vdPpV/+6y+/cWjB+ + 3zdsL5QhW9vu9NAdvdB+7gtOpy/9j/P5hN+wPS4G/27gLaJf/3/n + e4NZ2M8LdPhoYnD8M7oMv5mg8mXz390Y3aUev8kDB489tvFWz5/8 + CsR87Zdj+HCmnfrSS79Ds3kmbYPWNto2DuMrxyuc63lZXeUJP/3T + Y3kutoydVvz7OX72h265ky8G6EVXvje2NN+H/9Njk7EH3FV/50cs + 5pgNzmU8dA1t8anvsAvwiPnUbyXX/4+eix7G6oM2BThmIMcuqng8 + HDQm4kP+XHWdE/2b3Oo/44u3z7VsLa//n4zNQfpzwDxGDNYfCiLr + 6ME/+v2MxaqvC+Wz24Yv6coGfXnObhM4hww7Lh+uY6Ccs+rSF5SF + 1vSfO8m5xhQazsnSMSd0+Wf4o7MewzG/ElsEd7Onj5rGV+O/kd+e + reXl5s+giEE02JROj7zzTU8/veMtb85BFoS7ssEr0zJmnYA6xnpr + CBLQ4KEMYUwcr+23Vtv/UXIUYSQDPMdX2eyPutCZY63HGOIFL3wF + 5spr6HcA4YTQmM45C58xzibRxsOVbZMCxlxvsQ7OdfYdXJMgavzI + VLljS3ozaUS8ETChsqhtQo4+A7vbagv6CRp2MnEa3xWXIDclzDB/ + sH/CLcC3a7+pAPy9x0T7jv4GT/+RSNJv1wnPnYR+fia6n/TibbDR + du1/Arp9epfBIF4eoS+xrbhkNKHV9925yunjh8Rrk7e8E1kG8MFX + jE+CnrpjHxxXGeWyFf+wXepGKPUdrIKrnl7e3HvAKvzergk6cmnX + pxGW3OZ1/Aa8m4D3/+DT6bN+23a34ZweueXCDm6Rl9yTf9rXV7n3 + xtqIEfbkm9pv1XWYoL3rpw08+If9Bm/Zd8C5xN7a49ffhoXmOaDZ + sSb0yX8B0pafZkC0/86/sb2kAt7k81F1ZJALyTx0xx7n8pNtgIxs + WRl2Xad6dPD5gk/LguYmXyTjjYd+1/aPX3t7EnnYe7fHyEn+Hu82 + a/9IDJjIsVP9mcOoEkT/Atmzx/TR2iS20YcGVvrGLulEbNdnIWZ8 + 1Z59LwO/wfvK/2kbn178u2OfD7hzrHzWb99i10LyVT+8LWzFW8et + ndfMOfBrHsl+fPTW6DTj2yrTj37X6fRPsvD7wOdf5K/dd8fG3vZJ + Dzap7XKsD6kf8AF73y389Pxu0KT7XuDn/tH2vTrfG/QGU/4Ye/vN + Lr0uA/40P2HzZ0SG1SeX4d9LmTzgAov3GrAN3ZrfTK4CbNkJefzP + 73D4ubkyPlBGjoh25EMxQwflfQQ7ePSzob3GDx7Op8w5YkMvVam8 + Xd8JamRwd9D85ryPQr8f8D1K9FY5Sjs69AVS0cmdTfYhW8czBwuQ + tfPN4LETu7WP7Xhoj7zDp75OfWPABYEc13ZDm+4Lj/s5dMHyRV+U + O3mfuvWDy2iQp+ND4ntukoysFYA82abOfvLmx336Nme+jO79lJFj + 7KZfOx4Ymchrm1g92sRf1wZ0IwPeLrzUJ/H/yLTSHz8efgt/Fw/E + KZnknS4E95ioGXff6h9tv+uC7qrfejw8xV/zdwrI07yW45GDr4Y3 + 2zSfRPbyQiT16A5te31czOnTdObnHu/99fRoFoQPv/NNaZtPT+zC + o6VhhcgeHB08QjqGGn69y6aesE0yCs9gFJi9akJJJoJt+K71Q2KU + 0CkZXWDad2EVIcgBB29ytS7n5CeTuhFp5YOXc3T6CNgwvKn9LkMD + PPJKrHiSq/LGgYdg98lzdOPQt4f2BM2Qqz9iF7xr79iw/Id12ggk + VzANiOsVs6HxROzHLyuvNRYkOa/2Fi/vTvD7Eq+kZjNwqdwqJrYS + Aw1QZfcA/DUx8XhoexxJYpiYxmrs95B+ln4gRiZ5HDEYfsoH904i + +rjzb/o38ujXB98J60HdE2WBD/yw7YUdTxS/JwOf1//E9op4+U7u + 1/d0Qf1qFrH0kCdtBs6rQP+z6RsdW9b8bVzZG6qXnz7v9+Tu0Ydv + ba6i+XjKTU68sdObD+du3zHpvELukZdezZWRzZjooqHHmUcncpDb + hIOtlBsfapNd56F1LnNp72OxPOgu1lX5gw/I4YVrXqRC/s/6HWd3 + L84Y4OutnfLSX/9ftkc9jel4mKz3AlbkJgd5R0846xwlqNVvZHvj + T24XCz78hdvEadh6JPc7syD8mZ+On0NjfF3dwmfAZxF+5x/a7gL7 + bt69gAXg3/pz2/ZPMsayNxnJRHZ5eAKJ3gNj+ynrgiT6Xhew4JPy + jgxg/Mfe7SexQVf9rd3F23G17YJxjyXy29CjBxo2k2K2HNu3n+00 + Rred/CbPTgc+P9b2Oz467/MB4ZsF3E3B+z5nW9CTq4u+yH7ImmMX + LPFt3CV2n5YYbz5ZBCCeu9faTSxWzwXnwmHo9oLKbif0Tfbtj/E4 + fK4LXtL0eV92XSpPXHvfp2RDNtA35LquCeKbif/6JjiNjfSh5hX5 + O7a8LrS/45uFnViYJ1hWf5/zOXwe5vKmhZW45//GjLwRefO39Y+9 + j8wYNPPH6rUrUJpiJJvjqWMTZd4Yjn5V9i84R64it3zCJsEZWOUe + esrkTOfmgzYxiFbhVh4ZPb3jTWGEc/5sIdrBZx8kMGcgwtkQGAaT + ELTpdwjvMajPFRh6+K/HhFQmSJRPUBxBU4TbxuFUCpO3xknbesYu + 7dEamPM6fymf+se7f4zskYF9GgixWf76IoDijQMeL5MFHx1iN8Ci + G91XXZTb8Be4tQcb8lH20xn8fuKVPxQbB2dstbDp4bluzsEFX6Ws + 56G91hHSYD6JD04DEJ5ydspWZfa2lRGR1H/0p5xOX/D7sxh5roJ3 + H/zQt5xO3/t1WTj/bMTa5a5NRyR62eJoMSjGH3N1cdevui7t6Oti + hwF6bLLSZjP+ZTd0O4Hj08ghmXlN92OAjNnyV7xO/iJb+17iEq2J + nce03QvGz1fVPyh/YIF/Viygf3SMyiC3XuSbOLeXZ/QruQiI7/at + 6ZdbcdNgc1nO7TvQZ98choZOtYOXorzws+/9rtG0u9P+5d+bXPPS + 7a6WfFKZd9mH98i30hl99PHKnMmKCUvtIRfsck8uMZE5Jvm7TdBb + aQ/N4TN5XO5AZ8UdHG3g9fHW5EJPsVjgmXB9Zh4787jzyDJtZs9H + Ftjkt5D0EfAuNnYE9fIquTu54dfw4kK6kutcZvbzwpoXfu7tBSHZ + v+Nr8o250J8r8XjWbqkbcDf+t//720KV3PcCP58x4hv/Qh4V/b+2 + 3MxG+NGDrI3DJYYuozl25curbHVZuyvL+H+PoexyEply4C2n73Qc + GfURE5WD395m8DuuGXe0S92MY2LU5HLmiHQdPcm/9sGZY6BhHCtN + /gt/Y9TqA+0s4NzRuynwSPwvRzN7C5AV6D03KUbmiHX4a3yiDVnh + 1j/R5bBZ6hzDtb9wDC8bmmwGHtrH/LuNxRv2U+u/mxD0bv/l+2yP + 6B/Zxm40Zsv2ndhOLutjkcG5LohTfhC34yu82ze23aUs4HrCCS75 + xawyMTN0xIU8ZS/O4chP3F5fL5TbL9O+F71Cg1x0Nh8UZ7VR6Mgb + oPZInTf8Ou5TV3ud+srnIKB+wDGZSyfH5MFr4Nat3CF89GlvzkeH + bz8yKtGe/1amSkUTiV3HF9GYEqSv3mWM1J8rOozWvXaM85CNEtmU + EdY2yvQYq5Shq7zJA3425ZOQ0CEjh9SYu0HP+a7njkubQdC6JlSe + nUaPd7nJIzAmyIsSXa4LeNiqO/qxwdgD7aeFR3kmaNivg2WCweJD + oLGVMj+4t4Gx/Xa20Z/jO+7DS1sy1Dehjecqn8dV1I0sXQDt8osj + dQNti0bqJW/n726Q/F/23bkL8WNbB6+8/BgZa/fs6cumkpbHNedV + zWRnH/UDY2vxoU+5sorWESdsClm74JS2xBU7sdcxkSvSUN32Q7vJ + Tr9M+0kEZJN4Vlkutr59di84t7EfHD2wwLvPAvqFMeCdyYVrl1Cm + 7tae8+QS/UJ/WLrj0T/F/ORH2mirz+j/2qzEf/lzt5emuIN0U+Ap + BHcH3bUi+4Ax0zhyPA67KHneT+HKGe3z5Ka/Po9Y/vUJm5T1NOcm + RDN52Uo3/KmfMvvab89H8splgBfZLQBr/5z70PdXZ1FocuRNn74H + t9pypUPeL/h9m5+++k+eTq95+SYjunLqLAa16aKGLyNLZeO/Knqb + onYeG/WUh0cGnXuE9Hteuj0Zw8dg7I0WG/LvF//B0+nFX7p9tmLD + uvP/X/i5fCYkj4h+3Z/eXmjT2EsTfuv8JLKh7dgj6GRZ5XW+Ap3W + +rXucR2zyW6XHu500Z5xu/GNaMqUj+/GHiNHLzRG9rG5hVXvRIcm + 0M5cbfzUBX109hMavOkoDjrPzL7j0d7Ob8Mt0LVhIwvym3qhDNmA + /or3zEHG5vSTG8Ym7MIm6gdHezoYg8nXLXqvtpu4HntpW1sFX2Mx + wfdjdzSnTY//OfmnP4odNqzNY2uxwy5snF33/bfbWt/xCRn2vy7U + P/ENWnIg2vbO+Wj8h8/4X1m3yAOfX1c8fhQL4qtzNEqk7FgD5Py4 + +L/TnbFFn6kcmUOOTfT/iRlvMa8ckcH83m8A4JHDpk+tcsNt7DFm + wPGs00r/XPaTO4QPvSkrze2RUYoQikMuQAi1LgytSucNbJQsw8cQ + vtC6J/AA4/VuBZrhUxopn/rBsa/LbF2HAABAAElEQVSy4WfCLFA4 + yuBM6S1SbjujCsZ4Fq0m108Pn3HIOHHlgb4rEhLPBYequE8Y+uhx + rA3Mb/ymni7XTQACUSChbVH+GJ+FRW0dW3TB8VaS7LruAbLqTTZ2 + RccxlA5G9+Db+jE69dn84Puu2XQUk492htQXL+diCW1B3LiK/LVJ + JSTkZjtyP+f5t6/qTvW7Y/8RvzKPO73/6fSPXnNFHyE2n0RPi0K+ + p/szdruuMk8csL8FOj3ZRofugk18nwHch/gyfkQfmBz1d23hAVZ/ + Oje4oq18XqJRPwdf3AvP6TfwH8ADCzxZLaDvuOgknwyI++ay7OUb + E019R3lzcnBzeIByePoE0Cf1x+k7zgfktJf8nlPfXmnMvAnA34fa + X/kDkSsymFR0gpCO2gtN8kl4dfyTo3fhR0cyaCdHqDL+HfhnAsJr + fgiuXFD69M22k71AX+E8ydAxc7fRGdnjlGx7WiodMvp5wlflN4XG + rU/7onzD7w6PX/LjF/6BTBgj39/4P06n179y01d+nbGCDjOOrGPO + IUQOxjbuNP5EnoTxYXq/t/H5B98FFDc2QOaxt9+D/sZ/43TyQpz1 + m4Ub5uX/fTrDy2O+7v86nX4+j8OtCxm0fQuUnY178jLZ6DkynlOl + Xx8tTEzeFAwvMU4We3HCpuJK/Qq1cWT3DWMys3cXcsGbsUu5F5UA + 8TNxV5rBQ3OlC0efEQeVZ2u6zQWCi6dNAH3wR977C3x2MnfdeTmQ + l9W4k1v+0S+swnSbrLMJ2eWIXjxRByH1s38k8nfhuvuSH5t7gjc0 + 22xvx25ztwft9kv6QwooO05a8tT/56KMCyjsIibEVef3Z6rrO2Nv + /fOmHiNGV6zie7Iw5aPEMl9YcE3MwrM55y9508Kq/WGPe/VATKMp + vvWnFu9t6WZdQofGeI5LN3jGk+mHbw8TtC34hq49uSZX4eWbyJNL + 0CTfeRxNe/iOrY3YmyKrfupP7hA+89abT2/NjcwqG8E45hyx5wik + boK2+CmjMUOujNG+Coa2ZCIh9TxGHLra7WSrbI0XHn1LXYzWpBWc + 40qpBoEan2FDizwzwHkmfuTX0dEGTYgcE9rXhdJgB7Tsw6cOYs/I + w0lNFqmu3a7LcG/fAJNYdx1XXfBxPnsykW3FGTHgNNhCi//HSAZ+ + fhJ0TdDTYN9rB7SV4HQCbfqx573ObmKqsjiPTci+yjSyDv+nsWXA + d29M9N7d4KUCBie/t2STgbGvczHoxS2NP7bL1iuB4nvsKj523eB1 + cpXzp4uTxHdtFdzVT8NDMuCLod8BNWX8tZubGAW2Rdt++g4/AfSU + tz/v5yu/Ij3498ACTyILiGU5RW6ZWNYnbLqbmBf/8rLBXD9StnYc + OU7fmvbq9Dn9Ulvo/qn/sI/f7nTd5Itk3vTG7TMTfnNWfcKLjPiS + 9xj0I4+7KoXIQh46kr+5OicXxp3BDQ568O2bq0LXecdLOYgNz/KP + fOWuqbzHPvcClSntLkB4uqD2FX90429ReKcXtLD7F/1rm2xf+6e2 + tqXLT7bITt/ZLhuj8K9fg/cNf/Z0+tBfkZ8fPC9vFv1b293BGZfR + HZtaAFoI/rp/eZt8XtDhihN3dr/tK7dvMHqEvzYMbmOMDKFvfBy7 + kJ0/TRCPRceOh0X1Y/Pg1bkKrwnntuNLcs54PLG2Bfoma8sio/Hd + ZLK2jtxsSv4uKsUEPUKrfUV86i85B/hO3JQevH1MdK6+kGNtZh7x + Xlm0fdBH7RP2HeUmdl4C5eU65bvzFuOd6+w2IUPHy8gE7Mw5R14L + hk7O6abfxRagOo8+Oa/u6uNHPq+N9DH2GdroRu/9tHSe6v/Ezk+9 + LE8O5CIKvZtnl5gZO7ODenHaGMqJF7T9smepuR500RUS/Iz/w3wZ + /4vpU87ry/DDHzQPivvUd24Vfx6xm3oxPbTIew69Ex6c+h3RPU7w + ga9ce31NnYWbvDsxJM4cFzf4ZNZ2YkuqAI3b7GeeOXzoBhcfbySF + 37nsyPFo7hA+7zm/cHrFq9+WNilNxOvoq5IYDMHqsDdmJcQrrH3a + XQWrcylDEe3mlj0FavwQqLGyP+pDl6G10Rb7EQG/ymSfAzQ8Xzyv + VkXDqnuMXRk1CDSZJSiH9168VT6O/3gIjjqF7bJxHPp9hTu5Jb/A + 6LadXfN/BGYTCRiQY4Wep6xBRC712VZfDD77sBPbTTAdeiWIXB10 + V1jZ2t45/r1LmSCmJzsUdlzHw7v7nKOBJ4D/Do+I7DGAfxc6qffI + jreMke26MLLfLx0yf+yn5ztZ359HgV53m8ropKR6iVUdOtArMdnT + ZwYA+NNmBlN2613e7MHUb2fbf7TZhq31G21dSXp6fFtb5ngFvMcX + q1/hDH001/Pt7MH/BxZ48llAHxLOE9s0EN9zbmxwR72TNzknfUiu + nnFHH9Jf9CttlDcvzsQQbUTzz8sbXvJl29ML04dUXQfw/vb8ps1n + Jsgw0NwQGQzcJjBk1ucnTw8emWcyo41JRceGs7ww9mAsNOaxdmOm + Ox7KjCs15k5cG+OZp4NMMmqb1OE39MbWYw91YM57krbk9wbVv/jf + bDnxU3/9ne8Ayf2/6d/a+H/9n9nuMnrMDJ0uUGM3Mowc5bP/G5nU + uSj2yr9/Ov2Dv7fJ9NM/vvl7cDSBZ4HvEdFf9y9tnzvYSd1x95Zf + iO++Ot9R/O/zKOrrN5s+epbL8alfog/79UUWicFHIhc/rXYih3g4 + 7HvmwzsKc0VlFzyhyY+dr+y+89mv8Tc2YR3G2YZn9g7FSRdMoeGu + rTJ9ySKHvOQ3zhmfxN6MSaNL+1Xwp1+t/XX1QenEJvh9xCfnqZw8 + HrjaJmyvDR/4/G1Bwb4Tp12gRxcG4A82qVw7t9pF9RxEX+P8+NJi + 2Qto9J9zedt3xt7xP/rzmGx5DM2d1z8Pu5/5qeSBH0vOid3ES+/G + pl8MjJ0PW8becsH7fOD2FtU7PV0wNO62x1sMC+aZY5pb2cRFfXkm + kzhRr3+OjPiQUzygM3n3kH0ECY5+0fIrfC6eZi5Y2YI3/Ux+lve6 + rggtF5LcSFAmnzRn5LgLytSTDy97+uj3jskpvpsTUr5BGt76+aff + +hOvePjR3/DMPOD/aD5Onx9gCF6T13bYEAMjkDoEbZJGB9X9vGXF + fuy/qSMchWdg1r63XSPUJJBpTQH8OKUJk+J75Rj6kGWXk2Pb2YKr + fTu5NurTuMbJ4ehDx8s6sCb3CmTo5Jyz0ghfDsKTTngM1A6jxBTe + 554du4XP2HcMVLtEBnqSzV7d2PhWjluW4gu23NvUT2wZ29MDn4GD + l6rUudIguNCuzXf9K0P4sMXYZOioU0am/G0Lp8hZvqEj4HUKnzt4 + r/cZztfbv+kfbY8oTce/H2of86tPp7/zftugP+3pMjacMh2O38Uv + +/vR/roghMcuOnCq2oHH5kNj7LzSZr925NhO2/o2x4dfQ6x232kf + C9G0Gzojb/lFxikfvg/2DyzwZLWAXCKep+/Q4zhP5eR7uWfGsuk7 + HRNS3glu+o++I/9Nvz1sEvqf8Nmn08f/mixksjC8KXjDq7bPTHis + coXpr/LWeuGRfO27Ekhg5HdFufl4rz/0D85lxzP+PTSTHPk624or + SVsMoO1JByzlr9XOczz7isUhdcouX3IW2nA8wulOoVz5qz7/zk+B + ePTSb/no/9I/mxe1/HTokAftAFn5cc4J6Lw64BcceuL1w393+/0g + O686OjbWfPbvOJ1+7R+498WghbRPV/ylP7Y9PXK3p1nI1XE1MonB + +o29c76rs40NbJ0CfifbdYHvZp6CL5p+49n5SY5XWxDmAk/8IyO5 + +b13LrJfoXOR6IZeaancFeIXh6WZg+POBbo7XOCXMjH8kb8qY/YN + jf/Dx97i4wM+ZIsR/iOceLJ17I4ebEDumbNoBybGKi99sznuY4Q7 + DWrRt5ADfQe0r7HPTh9SeaSBNv88wcu/b/tN7+TZ8f/sxy5sUpvH + VuznG6DP+fA9bq9psPVxbD7p+BD/iO93hJ94qDxxDhlsxodZDKqr + bJHDsdjpWmWPiXsVT99EU8xXDu2jq74/eRYf+Q8fMdd+lr3yWYCS + bfrmEbdkTl9t3g2fxnd0bL9P3e1A/YXgvDVcA7duvSGE35aCLAhN + zMOoyqneBZnJLQEHJrnP+T3to5B2FYQRw2OEnPZ4eNsQZYOyJf+U + WRE/BiAExjkdKNBPuQBCmz5Fy78xzMMKQr/6MMx9wgRCncdW+6DH + OXh5i1TlrgBhMvv75Hc0IzP5d9np3UDNXtHoqVzBBBL+6sZe2jsf + vycmOwnSBr1eVUAT0R20BaXJJzlXDx8d+4FehUggC1S/pxPMFTD4 + Y/uhbW+x2kdTIpPHe37pHX5nMjzutndF2W9zPuEzt5cK3A3/qvrn + fcz2un8vlpnHDcYWo4Nz+tfuISQGTSo7GCyE2Zwdavvgu+rvBQlg + aDoeulPeq+LaBiSCY/KnYPcDu7Iz2jbntW3qwRzXF1vRg/8PLPCU + sMDaXybOq5jYT3+bvmBAnHFHf+sCce8n8OWt9p/kPv3EGIKej2R/ + 7pfkscMPKtUb+SeXfMtfyYLiJzaelxFtPomc8shs5I5IzRfqbfKs + HNFxh9yXjZlpM7Zpjt/zdXMJ+mmz5iB28DOAd8opO5/VzpfJq742 + zJ7pZ2zoIig0wKtyx+4r/tv4ITw/6cV3fjTQQuu3/nubn77hz2dR + 97pNB3RGFjLzE/vM5Kp8M/4014bvy74rxwSy2/eOPbrqw9seE/Ui + s3sBV+W9Dfb//W9ufwMT7cqR/ciF1hxPTCkbOTuJVLBD7R2Z2Xri + derud994N15kPkTG0g59sSJGxhazx2dkHp7kgn+ZTMrQNP4DuqE1 + +pafWBCTKV8Bn7XMufYv8GjgDYz/K685/vBPOp2+/5s2eauXPrD7 + 7NB7kfMoGwLZV+forZ0+03GeLem446HtDfz0n23yyULqn6tDOcoL + +rxoig31UfFpGztPPMy5uud9dN72+zvv/WLN3YzqN6Sd9/I7P5El + G//ok43h1ZeJSzlQLmk/yB6QdeS3H9m32k2n8zLnoxv9kRI3z9xp + tW0KdxbbaU7ax5Ib5Le+WCY1ygDe5HaHEK2CNtEJTufyO41H079W + sAbMs5Vb6a2HXh/OuUR4eq9tMp8BqpLsxHxzxRUQgoNRbhTaSu/t + f/S9vdKNAu4EzSMGYVe+6A5tPGebZKKODGPUyqNxNg5Wr4MO7TFO + 8XfjMJ6BWACUX5qT7fECmpIsXuigywG+DTj2eoag2onP/vHyOcfH + q8kmvNCcBfvwnACfduUbPO0mygS+09rNoLnLmJgqHlui2x+Mp051 + 22c/4Lw8s68Mwccbv9o95YJxFlAC+ZA9dY5Xm7Qu+OzYBeENXIX3 + iNIPf2t+9/Nx11sQShA++vpj35vHRtNlHgO7PuzBFuzrQoFOSp8B + +rJJbRe8dta0aXxPRx7k0CxoE7vOAh3t3kkN7RnQ0eNL+yO+Rxb8 + F9rjH3QeCe223Tg9+P/AAk86C4jfhHFh8omylu8VzWXpd06bs5O3 + p19O3lSp3qZfyoH6iEe87L0hUx7pxLrcrv/PZ39csPJdrhWmT06/ + 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 + L/nm74jBxh95sl2A3VYXynLSXH+Oe450L+eEWIB80xcqt1gn64LH + np0sRy84V9oXrdiWjZ++484cgvLmGfQtjZ0OO7Hf0Ky9ws+5Cwb9 + /eCzFoHfBYdizNthPTY6utODzKMveVabVM6gTF+AX90Xu10qKhvt + fjcno3/pahcetVf2T2XwVJVvdFqMAX72+R579na33m+z3/+Dt3Kf + l3DRph2oLW7u309kYepCgD49scgffDQwsck/+oEL9r2AtfhJTrM9 + pj/vRNb44ePOx9MeL9u0f0gdHslP2tgai6HTEFn6CtKdK5IDDTlI + bOVUUf85AS3YDv2/Ol6XR0af9ozXnR7JkhFRK8gRajpFiURpQqrT + GTpYhqkyMPvt7OL/Kk/gRUjtGaEO2MtXGnB7nn2Vdc4o2SwesFUP + r3Kqc658r3Ny0EnZ+fG5sYJy30CuNSgqS+Sk38g9z+lXr/vmdLEh + WjZ8OuC6WoVvEpXyTnb2JKwl/7oKdgxkKRu/V0704mPQhV2CzdVp + /qrcqT+34/DvVezQJkcdkR1ZPEb7yH5lAq4NbbLY+KydhW9z8oJP + yjf/PnqrS8m14Me+Jwk/jweIEXf1LAivC15O87f+/O3HvBqD9CL/ + bp/ymLI1DlMGtAG1h4Ocz1VVpwNj66E9dlU/dWscH2U7gfHp9JHp + t9NeX2riwZ/8ATI9gAcWeDJZoP0o8SvOL8Ae18ob54nt5ppMyDy1 + sI5lLky5oCg3Tj9rP00bOek5z9/rLjC4/xO58bdmQfLuhj//X5xO + 3/pXkht/fs9He/+XD0yW+uhnxvzJD/cib+22Izp2R8q403wfvflL + ud9p+Z0Y2iZc3/N1wYkPfud/eDr5nZfjq8ALfthPW4tCub25K7R3 + FW7nyCGSCjQt7n/7v5/F+Educkz1VXt2eGV+duD3jsYRsdTJXGKF + HuZFnTedxaA6sjT/OqCzzaF/gcZu9uu58mnr+EZg511akaXi7DIo + I2NlWMqMSZf5fWQ99vFpF37xZRdLsQNQ766LPtW77Smvr/eJuLlH + ++WG3v8fmt/o+s2YWHlXwvOzGPECode/cssJDNL42Zke9sg5W/nX + uWgOxQO5R/+2Tblz29BZjzldn/eb/eKzkWNQBtvhU/H/L6ZvfuP/ + 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 + 2w6UfZpcH0LE7wEl9MRqA86PmifQhgF7kA1/HfmWSW1sR2/ygdbF + zgYMCUQ9uck5cneix6a73aedPfu146R9fSWIH4eSfp/z+f9irvx+ + SKld+58JnO/M6FB0IsuxRef+jjBJ8yYWhB/6K7ZHyn78B3MX6E2b + 6Gxe4Jidd89r0M2m5GGzp2WvL/BbbR1binsL/hXQ7MAaPH2AXqsv + 8LnQJ0KHz8DEuH5p1o7P+Kd2iU3wlxRnIDkSWJroW4dOCAbOaWyl + j/0/fNSgc7Q7029tiRdZDESOh8a0tacrGSt/aLFFZU7dADww7Tsw + 5pz9mkx3m/kW2poDJHR89VvH+o0BYU+LSD4GDnmC14tYwdC2PtBn + HtPi/gtqk/jMvnd+F1L0Ijf7sQf+zZeLzxf0+kNcdEAMTXu61Fbs + twiOXycHwattF/vWt/QMfgen0MTfIrwL5T3fjC9WGea4+uRk/Fw9 + p9J++K1lU86Xqa/s8Rf56W2jQ+M78US2jg+RbdWhx1DpGzrTd/S5 + 7/7a0+lTf33yRX4Div5TDdiKTfi2wAa2HcYfTtfjqZ892/G5Db32 + GfaKPSee+hKO2FTfuAyKpyK06v+0nZhxcejr/lRopezzvizfkPug + ne5lhFLmkwKPB7yK/qv+59Pp735lxo7Mj7oYjC7kH70nPmY/fUf8 + m59U/r3NyF0Zos/kb7Qag2JzAfjDR7HYnQtcC9r9HYb26lM+Qtt7 + HDo+pN5FgcP+0FM2c5jmhyt8NgJVr9A8dIuez6Rj9g9nz3/8Dm9s + UH2D8pm/NS/7+bjb/W5oPlH75310LhJ/+nax2BNEbKKv15WRlw6r + P7u4j8/Zp2Px7svBGV+SHx1jTszbi+aPhjZ6csyRT2JrLrou6DPN + xRkH5Dz5F+/JZx0fwh/O9EE+ACOzC7Au7iin3+jUGAhNc4T27/Rx + MaoeXzZDn27qR79pf4FH2tB9Z63qXQJ4v+bl21tOPUrb8Suy2pOX + ruxQHXYH2OkHax7rOHIHYVWxlbt9Q9s5QGvm1o7lAZt6NsYHfTiT + M9lTHbrkcbza0XlzJPo57pgrnuClDEyb4ua8fks88CPdyXLrGW+J + H15zetYzs1IMGf/ArT/xiocf/Q2/5CdDzSWp977AvBh3+TdMoc2V + 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 + Jn5ky/PHZ403f9KpuZt2sek6Gfy5yTj7GnqKJZrGNjY19okteMCa + GWEjp42hocCl7UW43n9seU3i6PHv7/q6vEgw+0Ky++RVdLmgR9qN + xe4xYks/3Yz9/AOP3mNLz5eqHdPWlhzkzSfg7Q5N8zv54atY/NQA + pBifdWwlFyYO1jS+5efGIuXIVV6QzZ/QU1Zvuq7zdqx/Y+fwqazI + 0b7JeEXqmVA3SDYc4ObpFZGwd7ZnGA7aKKZdMs0VNOZu7Wvnqzek + sQAAQABJREFUUAMeDD06DpBIDH4gyVQenBCowsvIcdzu8JVog4ce + 7cDo5Fzyejbezx/QoUkd3KIvmtGJPt18jtxheDdleJJfueGn3o99 + Yxc9DbDZQAkcaLl02Vru8f/iUX/G1g7ilLUvcm2uXWh0k5i6u7K3 + PYq4bLc55g8s2TA+nRjNwnTsG621FULcheAK2/ZFYuGLz4d/2vaF + /+v6fs6LvjWfAGYicDdW8rug4RdAT3Hy6aA30L1nFgB3mO8X+MjL + DvwExUu/c9ugkmPCVIJOCLG3ED3qC36gU3xff68JqD5OrNq2fKkO + 8Guc0j4TGF7q/MnmGT/weoSXHNTPF5P/+OE7POUqXYZf5Yefi0rf + CSZD/3GyGr3wOodj37EO76pzup0DffxOIxs6diBEb7lsEgbdbNA1 + No59l8nQxl44HZdrrhqaKfntTcHp3bTgdxKf+G0i+78ywpOO5qsZ + RxMP/u4kHN0vMe3A6c6r+Hm8xCPv6kc72Sbv6K+kx/jsiMfOQspu + HIIrtvj1u8T01RfbgNJdZNM8IMcjddrhkSUmAB+b9jfHdj4mCt7k + n3Jg9xveWRv4T5tNyoxbuLu+qRNT3Va+ljc7I2/ye2j0NWejH970 + ZmP1WvbBKVA04LR3zKNT5+/o643Fjic9JW9BvPp+ael/o/2beeKo + txjxWzeI/LF8NOURd+piMnGC52js0SdW4uuGgfXqCGj2C/n0uVNO + /rQdZc6c+ku/kM3e39n2Gh/5R7fH/0f2kfdj1f0e2Td+UR4T/cot + Z+VPx3wSfTZuEmKZv+XdnIR59yjxEx3pbJ7yshi66GuJPnVzFH/6 + FMH3yuofDlowdg5N5S68wbnfcnxEFl0cM0fMDRwyRpfmQGLSfVv0 + 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 + ReHf3mLhaRNfQdjxy/Hyfz5F+NZ/tv2cha8XoOljyNEd/zevuVPS + ib95AlT9pau+2pkcR3P+aNjkOzq8DSs0XtjRuSoyy3vxG7bQ4M0Y + O3+qp/13+W9i0zEZ3uaFji96GTvG5yEO40NzTXWPjfSZuB7FH+m0 + 4+slMjO3Okd3pMXrie92On3QJ+TTwXc8cru3up99Mjf1je4rVvfG + 6XT6qM/OOwGes705fL5ucxmv5mx8Oev7ZTjaxpeT4/XXygH9D6S+ + jwsN9wgJ1ZbHhzgeWVW+BJZo4oogIC5zAQKnY3bFeuZt+T17KXM6 + vNKnFEuxnjEit8wnzeHQ4QdnLiZra+jMxeOTKnKP/1wI+g6wn5R4 + 1j/O90C/Y7uRO+zGTqUxqZw1g13qSlD7t+qt8+g/Nhg/nRuWTdoH + 8B17Bt9cOHLbFvyOAzxDWJrVpr2+i//4aHgN/2NJ3+4xMjex3xgD + Oa2NE9+jfmIgLmRuvyiQF4g+8KrckA2DDTpFzcmNZ77x525+yuNf + HwJUWelpfAYc2kAb5Om3gBNqY0DBTqoHxxydVMekz2bMAuFoMgnG + oklRR3AOI+93oJQ++h2dUVkHh19i5pnVj3FK6RzVPXzj9+o9j3SN + bY/B5Z67mzgxwsREtqQ6wqMl1hHvGKtjuyQyGdh8z8A59jd5I3gu + bPThtTlky49OOGvgvVUeNfuYP3E6/d4/dH2PX9Hx279qfTposCQf + LXT9xOiobOomAPDdz8zvD/3BbYNXfbfme/7/trlD7bcUvdXq5d+7 + 5fH4fmIyco6+HpwpzxU44k7ftB1p3Aix2ehkLB8dGa+zaT/P86GF + ZzKf7wvS1dibDfbInHgam2A2Etq1ifE+kUVY5R2Ejjy0ZB7h/Jwu + jsaKHQv/Ao8woLdNJGEeaSFfjmof0UPLL/rNU9U9eHCOPM91Mobx + nU+XZnNYGnotAj7TVn/LuzWnEaCdnGuDERqGlUmPHJUTQS52vE3Y + OZsnlvXJmSJwzMOdvzNm+Ltz/OJ9zr8LUfDgeCx05u/iLQNHF6dT + b04lP+GLl/mEnvhNfDizuRrefP7G4O76LL3LL3zZ1cVu0YhnIXhj + 4lEnfXh30Q2t7x0e83v0REtHY4mNcpCOw/PZXxp/5UkEL5JyM8mP + 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 + 6tsV69EJ/QBZdB/ARx7BaX7TRyc8iDlaqi7C5kr0co7uyHNwsAAe + xaZXL5IWLnm94k3h8aQfeeHp9LR8p/B9f/+p34d++yflE5fcWOrd + 22zkrZnjaLotNXb99NFBH5j+7Wz7P3Tn+h3tG/zaEybK4T19x3J4 + ti34v7zuqk+O1M5FgJe7y13X4o/m9kHRkXnkP7pOOX2jV9eHdfEM + p+Nx8RSXfgeRkkD71Nuw/StdcPXTF0/zv8dHfZr1gR+XT2/f5kCQ + qrn4+V+fN4r+/dPpp39s+ekiyn42+bHPJ5ExfuvNUHIj36c89K/e + 4n0O5/rDp3egvMN3xk4bCcF32XZpUhTx7v7VR9HPRpL8GWNT7i4+ + 0/dCfNPXmO7IV+sArzcX2BF845tsxxPtAT7/dHqX97ya/k57yPmu + r80NmtzY9Z2/F35TbvCG7xPe8U45XI4nnz7pz+cx8e8Pz2/O2pW9 + wlXAR/D5WP0YT+edR9a8M+OyfhWH8elVzO+ivbzCs/ok1vTpxV3y + 8xzgAuXEZrchunb+VobfjIWhqe6Lfngc54fOEeW+8iV1NOMfdYCF + C7uffM2tPrQznuhgz+l75b7v683wnr7ytSA3893cGZ3K8PwfORFS + fVI/qHxxzjGvwVu45M64wLK64+WIfhcgbfrN9d13xucjaPgo4QxP + foA76wN78X1UWw5Cq094KAG+ql2Hk4fKcyjvg43V8caLg7Ym/40g + 1GfwVm/3ktwFfUMdZvPzcA4TrIE8yTwkEkXAJIOyBkKLdqPs4CpH + qT5+FSe50MR7BozknckSPh4N0jGSOgJ36rwN+/b/gjL63N575y10 + dNXt8KXb+ah8vjBrwXBXme/48DhZ3LmUu8cc/1/lp+k/LkrdyK3B + QaLEElOvgBdjh4lRO/+BSfLtbPkhd2V6FyI2N7ahM6h9V+BTczH4 + vh+x4Q3N/Zav+Td5a+hz8rjAz29yO7FF9sDRB+zuRCNnc7zk27e3 + krpQ9WnXdYCXG3zWX9teevAD37rJ84gT2cbJvPDjqBe5E5PR4bx/ + 2q8qj/SlTe6Z0D0eB+Qf38hF/fBHhrIxzrgU34ei73z6h/aIz399 + i2RKY9mnq/JITtgsVcbQpITvwAOe/uF9QefoKl/kGHzwcPhdGDPh + Mfrrl3/iyKdydd7sBQcMf7LLN7jN4eCalIf32LfTBH+niS5sM8Y7 + hlM/6oCGvo2t+EZGfREZvxbABXSzUefvsbULQ867gadP9OBrOnu8 + RFzRgYm9+db8ZOzzIX5z8wpu0YcG/fK3+Y3v+JsM/HaeiSGefSog + fGdDQe4u30mgG5bgzCLaxvVvYndsO9bp0g0L+gDeQzNytp5b/6d/ + 8G/1XKyJ56xL7OS7fmoYW8fnN2Knt9m9LBsU8jwy7qkH89zb/o41 + LlaulHtw4OHtoMuFNSHnux/UncZG/jM29zkXj5zrS7VQ9EUPT0zm + mPxYqFuxdJEjP5RPQsTf78COrUdZhPQNocltY4dfBo5+Zs/xHM7R + 33jTqePI2JNPbIls+aKUM+Prnd8ycs4b9+gtX0HX3+S3/YpHQL/6 + /9zkPOOjtq8koPOpwnfn04Sv/ru5cHjNRjf/6TB6quNvXqOvceOT + htm8Da5yxo5xfwo+97Nv/D36TpDw5W8+pGvfpJuxydcjn07lHR/X + H+GL7n6BXr8tF8jekIsv39GDvyt/6V1X9x9FNqns8tZuuot9bVz2 + n+tF9yM4N166l8xc4fu3H/95p9N7f3D8eg3rrd/+/a7c1P2FXDCI + 13NzE/b9E3dP6lTPozJ3WX/np+TR0T+XF5W8Ojd4X7rFZezr+Iht + zDUvzNqgnR4DfMdn8skB6OWQP/o6P4buusDei2/p0Xk4ckbvcxny + Du7oL3fpNGtZ5/Cclz59Mw7MF0C7A96cK/FtTqekBzqlsS0X9Mm/ + b/qiba6ks7nQvGauobc9o98EdfPGhaN2Dj/ags/olurep02+4geK + t1WLQ/9zPrq1wW0clTnEt3qnXr+gXWNybHMdM3safNgj3v2+oRjj + u3Jjn69yTkefou92IH4UoIfcIReN3OEncbMW00G/PjD20FeM+hh8 + /Kj7wYdfnA9uHuOC8HG/7UfyW2o/HUZvjtAH+yXd2dxjPgIII3Su + dH1k2+SJ4G60ovjA0q3KN0hxKMMoX0WjoPZx8tCRdYSjkdPethGw + 9Ju+0qdvurXD7xH53YycyRjaOy2P/AQ8sSh/iShYdGCbRy7ZV5vv + lPlj4R0NO+Dy7W700uHQ3Sq9JA59uilJ3SbPO5QtGNOvTwL7kjgz + xFifu39AHTRRg1t+WUAbF+0rcb1e2nP5f/jPXM+XyCs0/yT4t33l + 9gVwMunuGB+cu4i+XQzXBOYxE48Qvfv75I7lU4fr/ZdPfu/topC/ + 3GVcbtr8JEmidzd16ZAngG7jN+d7Xc6u/vG3/nM49qGd8xljSjlq + cqZP5a1yFi10xq+4wx0eI0u/vIEzG4ouQBRcx/BFwzY+6KYp/cf8 + gFfctFdOSvliYntz5pOOm/BA0zxKvXgpiVKfhYscedq5Sv4fYGTM + xq4bInkcGrImVzhl+Oojv5u38OuCufKa7+ANjE+6WC17tdHbJ0pH + 3KG5rzIywPAdn2igG58YF52PEsf6JO31w4GQjmyn5xvZGjo8Yua+ + aI8MZLu/M0fw9+NDJ5fwKfAfnml7nJsE5hRze/jKLzD9cqi0kc/P + YgJnYkX3YbtRIt5rxauxaULjAFOqkzX8zvucXwmhG1F0Gt3hV6/o + 9mCObhSMpfiC/m6SePNl8zX2jS6jx8jDz00aNMeNBLwdlz05n/w2 + V/ApvcSJX8df+KI7woxRL9mgp+7loqJV5/C0mbAO+mST3rXvwKv6 + hMLY6ThJfW52nssceyvg+C/8xBr/7hdGnyiEx+iKhF3NydRn41g5 + lM+x+zprlXb8zvX2O3LePuoi4T3fD6O8aOJfn05f+wXbxhKNHMUv + XYXRXUw6Lyem5obiJtaDSObgutDpDW25m8OG9fHyIrzxhXfkP/MJ + GeW95thNg+1/aUJUHinpsjM5It5tfflv/M12Yxh/33Pi8/o7fKEW + It9Gls+76UzdXMInzm/G3vHFkJyXjZ3G8OCj9/6gfKXiU7MHeOI5 + 5t2fk/2Cb8gnTK/e/CmPfNr0Pc/ankB6h3e5e57nFB/6KXkSIDd9 + 3vCTGdu5OAFsEp9+Apq6HPBzI/w3/Vtt848xxW9+79aYhceH2oG2 + zoXb6X39p1f3bGssd/2KjpfFqXZEh/NcHB7yrnvkxA69HOFjICfo + PXDk3xxjr7yKPp07+Cb88rf+bWP9BYmVvIDXG8vLJ8ecJ8v6KxfN + h3tO5bzs8A2dA+4czd3gwN9pQjC6lmadTxt+zfHoTyc2ONATp8Q3 + YirHk3BiOXMQejjahucjmavU+U9s+INfH4ktvWjMGBxc9FcBvnTj + C3NP14b4TulmHpkdx+krP7YvfyrpyNfmn1/5929MPr7s9NZPykbr + FsSai3DjH77kl29+xtv4HuGHxRFP2Cfli2i3zihp00NRgvodm5zf + jDN1ATgUlEAmxRoW0Rz+KznXLoiPBUenMXC/U5u6aI2MwRs54xT8 + 1bVzXC9+Qne/QF71XwaPvLFbP99UduTeia2PpRPejnsFukh0CToD + 981iduCpLkZTdmMRO2YiOOLSA27xU2ezfsfveLdcCP7Z0+ljP+f+ + H+W4YG9k+N0/vz3ohQj042cDBDTGdEg9qIXJQYuhfvnozYEf9Inb + d4FM7tcF7lT6/oE71l58YBKgDB8ZnMCCzEf81cHMh9FrB4ozIED3 + jpUxZmu+9D9+A5N/zsnuq6imMyVfDN/JhZF5QLtQhYeuvNmQ3sZ+ + 6TrIbBYTuGy+cAExSMcy9OwXy5m8nF8YX2TEPjzFr76LXTvvg892 + P6y25r25KnSdi8KbLXsuhzdZkydE4Tu2TayofKz3HC+8l83a8Oac + 6xjz+IGxe+aUrTX/xyfJf/pHnS3n0OSEvjMHtc64ANvo7Y4Pn7tj + 6XtNOw68xdvFCJ/uPll8teVv/0kUMavtGgNuwtC7oG3hN9bBnUdu + 6VJ9UtJ1YOJIJzDn6sb75K/zIwz+se2x6nseBXH47vJiQ+tyJAdd + nYtv8zR17fPTMJfJotP4pjHMefMyvDqQ8FvH2GY8VFZ4V/7qP+ev + D3864C1evrNWX6YECvo2lqk3lsbAimVxFh/1+nDF03qBr98cHh3h + XAb8YfOLv/xCy4ZjXClTf7B98S7/tKMpj9hTWUGZOYH++jt2D3ky + evz4D59OX/zfb3O6TbG3ELoIr++CNOOytnFIQJ88NX7p2fUO78i/ + FNLeuNF7jZ36e/lyGxChDF/xmIt4Nh1z7FLeaaTbbPKuwrnr9uiC + L/vEQ37X32G0+2Qx5Rb9c9jINoaxD64LIrTj06t0mdi93Ttv+4B3 + fo9gXuXTq5hc0u7tsM/P2m2NbQ7Hr3T1COkHfGw+ecpFJ33vB9B7 + vNWnhF5cs39XLfHc/XgYO5f6Yvmb/1wA8Ju1p7mbPrkB+Pt+oWNY + zjoCze+tevl/usFNueer07S1XfPKGSg7zhXKkseuXgSmxON8zJeP + f+nzywRvCi9xMz7qk7TvOOkjX782/Xg6NweM77QNbW9ypH/6aot5 + p0wZcYDwNt7xYhucXuRFr84B6MIblHx0C27b0rjzXW2raHv7Rm46 + 6CT2SnOZ49Kc2dhf/j98fjU6187Qj56NF1m7Aqs+8nNqzqzsN788 + /v6pXO+F0S2Idy+BRx55UQjfkMH0hF50HRUe46et53GSgTMTXifr + sB5n0IfTBdEEYtPNyc4teI81qeBzlIe2E9MKFoc0OcJvBhyzOGju + kG7R3Npaj9PIpdf9AL3YwHbgvMm1ne7/x1aTgfoetB3j7ipN8tg3 + yXoZv2NuHLnXf4mPOMyjZPrLKzz5B63zHjkx4d5MjCUh+2pnbN1j + A2fFPM07+I1Bnwx6o5jHqK4T3pDHRZ7zT7fHhOTDTAS96zIDZdnD + P43VWrirR/SVA+52Pjd8npq7yX6HqHl7TYr6KYqfz8L1rC/cnoHH + 1ibJXR76dNIyGQVsQFw0saUB0BicFsGx2ZBncugIewyOjWd1Ode4 + hY8fDG9cg0OHTojp10a2WJOvD4w/5lybjQqgi08M+HEm60WWzm3y + 0+fmDZq5i3rkhc/IUCe7iyebY69J00Q2uTix7OQan+jjN/4DlZ9/ + YbPn5+iEB977vBMZw7vE6NM247UXseFvjgGjt5LOR9/DwX/mg24O + F20vXMP3OoA/+Tw3+erX8R1/6HPsYzRtv1pHbLqJkfiOzWjNk3wC + zVhg+9gyiwx+8sQjMHg85C4lexEFxg/jF8wml+BVn4w96GLRnEMY + 6BjYqtVNnuyf3K72qwry4ob6vDIOiKNbYzYJoD9KjL6UmbrSQd+O + waCKofzTXuVT4DfjVlyBfj9pdBN+fOXrA72gWHT6RwU+7fhJQ/0d + /nB7IT546ZtYkjuPc7o7DWrTVt10O2vjC3mobDwjc6B3zo3bjK36 + 2o2aGTvhX1sXv+q92oxdcWn+hS/eg4s3U/2jm6P4Yom/cQBh9Q/f + oAV59Yc/f/K5udwnKhfmouB13MrP2NP5JnqPDuOTOcfrJ39069cm + pi4K+QOtsTo60UFOjs+8lEYeVL30UX3716b9X/nGRvOgdQdv8yv9 + 0IS0/7Tztzhbd/lj+OExukPfIe3dvyw99vZ7qVCGHLT5xzax9PZP + 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 + 3sa+cx7OjRUTozp8nxLMBHTEJ2fO1clA1w2FxSz04x/9A/ibuPT3 + E4izmB1xpz4XwF0UQgvMKfpHh7aFpxwRa+OP3upHnOFZJvknv+F6 + rMQnI2B4b2fbfxsJcwmbehFrqjzYNbhkaSYHrjiydxa+J+R7Kx6p + dkF4HfBzr11jmh8juzdxMCY/th3tVbdQgGOctVfvlGD8pZQDE6+J + 54bU/+1TY+f42/nwmProgUfXhvi6uRIdj3wbL/NPjs5Vwcf3Mt5s + FSuyzKX1d8ZwbROv5ELpln0TLzbBQdtHXJO71S98BudcfxuBU/C6 + 6Ia+k0YKcQW1IXLKO23KblSGd3Dq55R8Nf43X5/Lwm+AH2Y+xhOu + gz42LF6gwY4Ze4NDFl/CG3/UV2E3eTE6swXPjp3lR3RXjR249Rf+ + sQUdGWCeLlBHD8itv6PvA/IkPqHDwPArT/jsS8zhuLkkT/DQBtK9 + hYm/5VH4snueCKjtENM/MFV97MYLjXh23OR85A8NPciG59H85tLY + RAkwjFVTd8xcWN45Fxto1RtO6pPftTX66JwLa/KO4OsYn/6f5e2c + H7Ll1LHvXuueLCDvCHRxzFzlbcGUpe8AvenneCA+mX0E2wae8MTT + 6SP/6On0SX9hWyun/X5Lsl1g/cv/Ixc4r9h05W86cBl7vFdCGzuA + Omj+hV5Oti39P5v96b/6h/k9xKedTk//vYmbOFwDyNuP/o+zpvy7 + 0+mr/87p9KMv2/LonPXoNu3O50B7vGE3OHdbmms+4c+dTq+Nv9xY + BnXJ8otzvhpd1Bvj+Orowxkzx2RAM3NPX1AYmuHXff+SMbz5nm9m + 3lEno7FZOoxMfMo/7W0L7xmr+KCRg3CMt5lrqsDZP3L6yGRwS0dP + uof3Efhb2+g1uc5G/OVHZaV0DhcL+L6/bV9AR3p1XMinJQN+aZbO + 1kCxqW+iS3mkpJdi9KsPcuqN8T7gwI5eOz7cgLZdtjk2uvDzBR8G + z9jufJ3yzb/6hrS8KC+p+oW8JheX2yBcroYb/+wl//7mn3rqC6Nr + dqk33mlzSDSsUaFj8MA4bJzchW91Dv5MLOO0oZ1yD1hkMNh5nRWE + 8772LxwGW584TzARCaYA9ONjzqLrMEu1kPPRbZrutkTvI+X+bt2R + f5SRTHQC8PionyIe8bbue/rPJ3zqLsjYt/sJx/QbECZyydsFlh45 + uvDx1YIuTkkaIHl/exYld/o8gvARf+TUH3e1AL+lgN4/mJsZJnAX + ZvzIbfVn/92uiQsJg+KR2CH/+Hvii2T8hZK/xGd8cjs3BHmL2HO2 + x/3cAfWzEcPvUvxraCTnk//i9kKb7/za7THS174831PITR0x6wS1 + 8oc9tUlJdv7NGJP7DuOELzsuLtHPpFKb5AV/5Zhxcm6r85GJlXN+ + bO7k3CR2AaJP54PkKCj/rbr7Eb8LkPPyNbmF9z7xxQZ6neOzbTZu + ZbX4je7n+GQVP7w8ct7NEL1zXgg9GnL5cvc3vgtneC+KzffLdv6g + twXSReDH/oltY+exuOsAY6GP+CV3CfaoURVIvWPdGIj8+kqR8/xt + uRCdZn5O022+nDY+YTs+zD6CccUntfMQj7pm+Yf/xu98tccnfM1V + u0/DWH83GZG3ywx9F7vI2i944S5FSkOxHOrDgy/4YO9f+Pg79ruy + aNh24AEVHZixAodQzUXNP3pVLqcG+EOuAHNPfZ/60X59LhaBtcpm + ahw7eO1c/8Ym/tDfIzLYdg70AnRFVxr6LDoXWLsMtuSY2MkFG5nj + RqLM8Ave0KkPtJp/vTgPb4+ua4NbGoipN5Zn/jjyHN7DV6mfHR5x + 5tPGoQIXVvg2f5e/j3qlq3Knbc4bq/BgozzsY8Px/wOxHQy+Onn4 + ozG8wPSPfdrOdZ+4kyk/8G7uQAbp6HwiftGF+t5QSd7wHZ4+ufK9 + fPOGm0nXAXj/zE9sj5pfxq97gegmN7uxlfcgdGhnPDTQW/PuFxeD + LoY+8T+5vpteFR25viLyL3KB9aoX3cp98RDH+i7+s/b0wi7t1rvx + qbJjIXaxoeMyOC/61tPJTz6947vl8dGs52MTmfcDcuDj/0x8nI32 + 137B9uI743XiOryds6FjMDRAznlzNP9fB/jZrM/4q/mazd89nV7x + /ZuPZhzgT/6uV/SpnisX2x+9zFfHG7hBq6voCp9v5ytbaPZ5L3W5 + bp4nw17S3lNslJj0Sa7Qj067Lmka0DZ6GUudT1J2rhqklEdbWo9s + MtTlBVq6+eRtcEeeHOkLy0LSdSYyS5fBbxzIM36wZwdHejz09wbW + JXGGi4xsuleP6EP/IwzP8QWikPRG7ryfhZ61O33VnW/C09oD8ChR + irGt8ck85+sls9e/cSPJcPrJG//spzjpUhChR4cb+R7hIzc/J0i5 + QlgwSlWRpWQXytQ5sk48GA5PcCfAnXSH2SUl/jYlD4UG7XFylWwG + TnmtAHYSCB908CWhTQc9ZrI4F1PdF815392c49PBkPIIXQASNLrN + 5nyCOgPjiH+39bHVHdsu6rLoAHHFtlHJwJQc4sMXjU1wvTCmfkyf + ZKSb7zq9wztvLzp5xh/MRcknbL8lhP9bEvjslS8+nb7sf9pKsunX + vJMPOcb+tkGIDc2DlM1Bd3gnB1dsZlFmd/MovnnA98KuGgahg/fs + L91+huL3f8b1vPGNuo8F7/Tu26utvante551Or3w2dsi43Xbv5Qb + PLVBXDNOOjHEbjCx5i95yRfaVveGtP7zHTwTG5gxio5P6tshXH6f + cVPc8OWffayFZvrLMLT0szjQoZ+4hffIgzOx3OupkGsS84kIXONH + ObgjozwTS/jN7+AcY1n9MQ4MjRw5zlUzNqcfLhz2dXxED31y6TjO + z3lzEzo6vW3G0bu857ZJ+rB8OnidP8Py0z+2+ZGenUcjmC7jC/Hs + 3cvobHHR3iP2HHVGfxWYb+sX4z48sAIWTT6RTMrmTnD4p7zTfoRp + 52++ERt8zUFHf1c/cQnPLnRLxtg3PIc9WXSSe5OH+NnA9GJzCJbi + +Dee0UPZWMJZ/YM+/mH/0Bwv+ODJAZ8edU4MvTyV4y3DH0998PAb + nnzFdiKHN35gfAG3Y2+NSfaRP3ycF8iQ68ED5PMv/+BtrLCRHezV + 1v7gaKsu4oZ32sSHzudvTy1zNrSycMlKA/6VE1l4Au1jC54dP/y9 + cPRNP9wBbXTsEX3EkI7W8eIvuj3e0QHvfkIU2XSnw/gJzc5/1fmB + TvxbW9Gkbzcu1clvPufT4UvPCzzXuXZy6mN6x05xaZyXT4440mPi + wRY8j3xdDH7Qx+eTtj9/vS9k8eSWF5+w/yqov2JL/W4TvHJLXtO5 + sUzd5rhjLPb57WUXg/T1MxPXCX1vwN/Lp1y5KewifoC/xMYxuvK7 + +sRfTsslOF1Hct65Z8X8uV+WTwg/YHsiZ36mYfjfT0kPL9Ox3v3L + XMh6vP8I9KN/18vktjyhtzbxOdp5pLuX+gf+oe1DCk84/cgLtwvO + uUjDb/JuxlTnluhhPIz/zL+9yZ5Yd5wc+povGAXw2vFyPvFpZ/49 + LvTs7NyZ3KofkovwjuNveOIHlHxkHDaWycOuD+K5+ocGfuuLlg0z + LslujiQ+2uEp64PQdX40NkJrXpvfWTWnFCf4A875avILDppe+KYs + LHzzSfGSv/SH6+sw9Bk46q/NufmnvwAAP/bPeFumlZQO4tnxGd5o + PCpLxoxX+615z8YmL4PphkftroR46DHgRn6z4vSm3L44vVeOB245 + KNqxuw5O4lBiX8yimPqlC27ozp0czB30gU7KawITzAZiyeFccgfG + qXA4b5JIoC7TYWRMYrhlx5YletjeVykRBK06RX8LhUED5o7DdnaP + /6NwkzF8L0sYtvmCLz9ZCOhjMPXHoEPDXhszk/rbvN22AL33B2+/ + G/T0D0z7W9+jXvdLFsVe+8rT6Z//rdPpZd+zJfxsDPhyYjdinLO1 + gz/21d9y4ODvweEvvu/kZxCJEZrERez1Ty4Nf+UvZAx9de62eevb + Mz5y89ux/9eybqH18p6P/dztUZQf+q5tkXzdq7a7vhbO2rOUUOeL + R1v8j/qOv+qj0Bp3b+aP+MJRx0iWA/ARv813HrrBkoeLDur48cHg + Gr9g9/fiTebAsS5P2QDw9tuLc6GH7+A2XvI7uMPbvFO9N/IL//nG + eNjnquCO7oM4fiiPyPJ7f3iXhn0HnYcGD58AekrAxZ/vcLiQf7f3 + 2vgP3v2WbP+pH9sed63/Y8sRtIl7dZT/sa++TK4rQ34b1N6zDm2z + iIr/2NyXrgS38wk/hie8R/O3uZXvyjM6dYFbNBNL9DfCq7m3YknR + yaHblF4NjWVsY9hcbMq1mpN/u94rJ/Cvj1LOd0ywOpfjfPx2HFvl + F15sJs/5yKAL3mT09edneQKvG4HkinEyubhM2Yvxyfi/P/2z+Fbe + ki/nAD5E9Q53W3IenOOaeQz82GrO8zMeszYYQ5fGcuyIT+qX4AH8 + jxtabaO7OpjNCL80LmKiY3iqB9DBaZ7kHK5jfAxnbG+Z8/p60TQe + ZzzRAPj0wJuv+O2od0RHAf8iz7/U5+eW5ABfNm76ziG4jfvyyVwM + 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 + djf4lp8Phu45tfx3W0Ahp+8I9fXKo8YsOH3xFN7DPPXmir7gzph3 + o8X4/vV+auVoz2/Eugv5l78wnwTlMcyB3ffTcEkp3vZeD2X964uD + VtyFeHJhQngJ+V030cmnV/80N11e/W+2nOg4JUS+0Me+Kuczhs/z + 7TKhzafJ55SdaxiR45d+fntpnRfj+Gmp68w182MvFqJv57Ulc9f9 + oCyb+Pql37W9wO+6XiZ0EHFllZ7XfjF8pbT/f3bsN7XNP1RMPMTE + MTfVR/PmT07gdb4qwda752tOS7s1F3nmtfJdefjI0KbU3jwhU/v0 + DY9LypFX3ukvb/S3QZLr9K3R9zEvCM3Wjw0f+Nd+JMq+NAPxl/er + ZkpI+G4ebA4ospRhywWHPIaIDpLwm0HUO9DZ8PnIWJt+ULyDo5wL + ioDaGME94l2mg6twjx30rkjKCfBGeW//6dDkiHw+cfCPAM/kifPV + AbsHuSa5+HviX1tzMr4aec4rN/gTs9HvHqReO4mJ8Cd++HT6qv99 + uxj0OBzYfbVsOuZacy7+ZU99L+4HO+uLrQmrSwGO2JTHitmRb9tX + PNXra87O8X3P3r7j+KLnbRevexAulfRr2+gu01wc8JE7Ub1zlfFw + zIXR4rK26avf+Dv22gBf5vO2RQ5obrtgXjB+v+x8573GbO+QRUbH + tziSdzivT/k7cNT5XMaG8Zvj/6tfkgvCX4ifElufKvRRnNTFRFvP + zZnyNXD01bF+9OeGuf4nNnj17nv4zSM28OfAZw5tlR2aPioXuR03 + K54T2365ftFV0orryN75TcMlZXOSbuyd3Bw711zYOWDRHm2s7Uf5 + waGTm4I+vXL45Nqh7kLRuvCbDToG5dIah857xM/Txq8Trwv+We3G + 7fi+a6vzIDZmM77TsK+ZK1dmjp2Lwwu8f+vknj3gEfPXv3rL62Ey + 8Znz83j2PPnfcZExciEmYpccmbwYHvdbejroK//29lMJ5OHfueRQ + mmu0dV/l4nCN+3N76LK3rXHvfHJ4SjJe+QOn01f8r9uL2/5tnr7o + XHG/xoTentQc7QUlPgUmy9gYXytHR3aYi1723dv3Dtn3W/CW88Ax + JqSK1TFHZq5qu9xPDiad9ljumh5iuretyuTVziMyyjdl8zw8ybww + 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 + auuFZ+KJpr79ryEfdfELXv/u5176dM93EX5WautQ/dDrLAaNBR/C + cfrxEPfRUfvKeNSomKvV88J71VO5wydGg2nfwuX4g+KZGgQ1Nwdk + hre5zDjs8wntlsux+dQj3smJ/0Fq3ngaB+t2kd5vQCv7Gn/xjvRP + /LPDSfEQby9yMTQxPwYf5GDG93aP+8S2feogc0jehkeLZg011pPb + NncOjuN1+LWw1Yo5J5/6Zu6c9kYMJp/4wyUtXq16UJc9kR4qjv51 + +pofAQDw7LJ7sbVh9zy4oGfis/M8an982c8rj+L9ud5fX1tYD3sy + ebHOfiD10XNaeF0cTYymFW/z3db8R8ZFsfHJ+dV+1MHVp/Zgd34/ + bMbrPU8Qge/9u+v7eMmD+SOH5uGTrJ3Olza5mXd5OzefwI5HsfqV + y6/9P/PjLl+ctS0f13R+uGttoHuo54asJy6Wne/vpVbuksHvnZOu + VTmXdY2L/2ivvXZ04TkeSrsm8b9ef/sfuFx+eX5Yn8+vhlrvsX/0 + v5BP7alx64lfm9T2unjNOzfw//DvXC6/+JcdP1j2anS/LvvyItAH + /XIS6g2Za5/k5aTkpulZ7VznPJP660OHtHPPQ0bOp8bmelONqt2u + l6sOT/wl0/NX1lM1Sw42M57Nvp19HtDRdTK673pgPtj37n1/5sd3 + Xb7m/T95JT/jN+06o9703nF47969+/d/z1v/Rn7+/7PicN7TX1Qj + Y6xA9qN1FvMYaQIggeRUL1rjaI03EUITtOMoryuQ2jmJCwyaYMwJ + ZU40gnwmj6I7yMeQBK933Es3tllIBvsO0ZfXFXv3ImB/C2Alt4tw + YmIhRU+yIB8SD7/C4tdgz81mOROHXmCteO83Psb5+4hQPazoKfa4 + cXjv9+UE8CXHu2o+otGLPMaMQYmd+hFPMey7EGopx3gm/2ft6A8N + 7+QaRuOd8eZ34c/F7tRPT243uPDoGV2OPWEVUzUOu7Ujn8su7xL6 + SN/v/EP5COlv+dn71wNsuaLo7xxJ25hkUAwm/3w4Y7UJjm+dE25y + w9cYWrQsiKFTbnJzdDcu4jdzVF7ZcNbg4tc03rASKx/NnY+oLqir + Zmyi13pinszFIZvgx8y+6B/+K5DX4IEfhHCh0J9hj39i7QZHnFxo + lxKYOZGIS+O0hm6byatWXuZCTD77K2h31DfArt3RLTe2qZPJAzzU + YwYsfA91zBlrFR3lM7b4YZPhkxOm2jpvAGMfPXjrV/hmvzWVev1g + xmGrZTcW+1rCnqnT0T3yxl6K6KydaV/rtLtYn+Pw6X/2G+/kXax7 + 3km8ry5wAgCjdZhcyqPczTkaFhrMKx3JMz6bh0BqfPgPqddfnyQC + PoHzt/5ivpP2g0f99sFq8iGmL66HbC+Ft8+Tyf2z5r11WK5XPl8K + 565xD1K/7o/nhvCPHd+be8vPO2qla8ESmPpwOLr0zc2tX1bsOhh7 + ymtNWbLmuvVADb5p1qrN5uEv7sil5ds3feXxrxk++7+6XH7Vb8nH + N/PjRrstS8VjG/w2c6H71rBV4x7Sd52NbTU4PPiQ64tvzLulH/+p + 2X7Fiskx9Prrz1IE+kZW4t+1KjmRp73eZl+umtPYoU78i5yfcV+R + tW6uCWvimhdqsNdiOf7Qtx7XkIMNZ+gWv+e/1Kz6/oBz4jr/jQx4 + uHTS8Xj661lLfzj3b4/nWqMq8uXTM/m10bwXEmt+2RG1HNWZWGhi + IoHqiUBgNyP6j4cZn75eJPJqEYyeRDLuF87su+Cb7yvMBcPwawXp + rqeTZ3A3bAmbC/l9nJ1ot/PoeYLX5ccVxvK7fgXKEwUnOjYjMRKH + V0P1Ixiw3DTdxkKx9MaTktjomL/zb0G28L8aM16ebJT55+6eWPp4 + iItbJ6y+a5nCRxO/yU9vctKv4P0ynYl0J+2xjh7yM7FnIg1m5TMu + FmpMK26PIjZVNjJzgbLXd/MYYTy2f/gd+Rjpf5N/h/A5+cfkv+9y + +YRfmV/wyolufHuUnlfTH7Wde/T7CIq5NRfHtX3ZNzrGJ7aLj9p5 + IbGwwKDGOzjGR/4YufajY+QyeBtv/Pr9QlftGmwXeTfxZs/YdM6J + CFtPepLMuLrt/Fk24e/cTftaJ+8K/s2vyjvqf/X4QRn+utAxHzxh + 7sVR4iBWbsznBvpIwN3Rmbz2AjyxhdGbvWDANS/Ni6lvKJWJ3heS + G/szd/DK22CeGlduhlddydvtWoXfGPtnzje/bFjYZ31gXrh2+VjZ + tHhqO7vJLaJfLeUvv5TtZUZeZhtccZp3sF6m1M9NtsRGeK7ineM9 + t/LkuPFOnD0om5yMnJy8IE/wbDmedbZYVZJxLPaHFv/8QNF0v94+ + WQS8Y/4tuRn81rcfn8bx4ybmRsNunmSbsE/O7tLwUG6Sx67pcvsq + 6Edzk/qX/4/88/kvzvf2fuRYZ7reZ+7OA8PWzRhZwx8otFZZK3oO + i1/mO/9sU3P+X3FrVS2uc4lfS0Wnz+GZ/anL6o2M/+3Lzt/zX18u + v+4/fPLvFe72143NHvOFzR6qTS6ejY3zYNU/kv+kX338ovEv+pjl + 12H6668/CxFo3QTXumWbY6paF2nlaWhqBm9zmbpyfmgdLj5yato6 + qA57vkzO5zr9Ltzp09rmGm3OxTPODr/Dsp8v97GxM3c9sfubgpNJ + 9vJozZCXx3z5yh///svnfGx+BeTyadlypYs4nsnZi5QY2afHExwT + dJGg4LPN/oxp9bmY6Xgw4Qki6gmenvCM45LSJKVF+idpw9P+TW8Z + vUTm2c22s/+V7iwbdvHxVXwmJi00dj8F3eNvL+qysMyF2ZgiFuLm + BybYIpbaxi19e+x2u5/2vhtxvyD2bX857wp+6fHvJfxTaxNoLkgn + b9W98ij/JlS32OuHUubCY7eRrFhMvB3PDYQ4FzvjlV3Y5Ccm87Pa + J+bwpmPqSN315jpjsOfdkdNuNqjNxJu/vofwD771cvn3/tDxc9Yf + 9bbjovvU8TR3YhNf3ASyR55nHlFjUenCdaNzTkie+D4bDP71ZiJx + J3Mv+dlp6m36uthFpvW9cklOnPOnuzGRgznRuVl1Q9ATMwaMG7G/ + uUwsPcQBMhfjc0E+OamNm+xrcdf3a/7Glx+/wPuj77leB8WyQU7T + uImZObNy8lLxaP6Tt4lr51kw5iGN8at1KrmY+aTW1ZmPsjQPK4+T + m5kXjsvL1lBzmXortlwf3X3gMzXadSr4jodvsR1zeR201tVssOnA + e87NVYejn43GmTH4g/m4lg5yXb/Xxdvj+H+uj4m5WD6SkjBrBJ5Z + Y+W0+ZZMdSDn2cTcmjTrbOskfXix3hI+NUi2F1eL95bv9ePHR8CP + rvhxlq/4guNrDM3JqmN5e7nrw60WebHmyN8bXmFuYPzwPzluBvud + wfxislybk91SA70hDN8VqatFYwd+a5X6m3ViagtP6zD+dr7DX9jq + 8E6iY/lIHrZ/Vi6O1uHf9Hsvl4/5pGMtuFP+UZ3LdrFnC4LtIn/W + 3pqbPg906TbHvuqPHu8qfdbvv1x+/kcdcT+kX3992hGwlqkL658a + n7Vq9HR9m4O0XasWr3OiewnniJ4fM946TB5flOd1jlJ/PmKqVm+v + ewaaHBt6Lsa7aqT1fVO3L+a4tR3+R9G9e++OTX//8tXvf/+xRj+K + 8UF/NL586sdG/9OPeUdOCJ8VqZ9XJXMRooh9JKwnz8BeXUwsHYp9 + LiTtz8nHPrKYNfj4OJoAuYCE6ZgOycA/FycVXC+DM33mogvLnmhW + 4ODbFMEt/8g9URssOLWXYPYd92QYnYrLEzr6hs6PeU3HK2mjA+Z8 + HHRf6OhXTEjReGIobuJX/9Nf38P3s0X0/li+I+BdMx+n/J5vP/6p + tnphg19bspjfUnOTfr6d73Rhikwn0wjEduarocZbbWRfXYj3zgtz + aC5g5t0UevwyrvjBmZCQKf6a0OxuLlPjbqJ2zH3fIu+fMHs39P/6 + w8c/V/6Nv+dy+YRPPZ4yquWnSWxkm1/9LPEhG1vPxSfj9W0bEwcf + I5qT0ixysEor3g2dWCzZ0SE3PcFlbD6OtCSvmsYmPD6Wof7YpDTZ + B3tibr8nxOQQ3/B+yFpT9vWETN/pJvQaJT9y8HV/Iu+of2EuSH74 + eKAgBnwXm54MUptOYOnqy1WOXiIurfvUolbO4cExd3pyu4mtQ/2d + l3no0fkTOTZ5Gj+2Udv8pDUf4U4uydvk/pbIvJixD6SO2ePBitqZ + Gqa//o1g+PmurhSSd6r6MVMn3EX4h7ofvvs5xxRnGxue25ZP7LXG + avvlxlum19Bxc5WYdm7GdzEfEjPjPrUjLuLdX2fecrnHW7ysKWR8 + BFQu1c6slTuvVHTORzeSRxfNr9OTRcA5wK91f8X/nB85+77EPvE3 + qV3/zDrc82W65dDYnoe7tO356qesgklWLsm+lPxgqoV/+r3HJ4S+ + 9S8fH4drnq0/Wc98hFKr5u7n3DR69xqE5XoOH739xcbUyqwnuy3k + 2Gl96HVE2vKtuhp855zq5EvWK7zG3pA5r8Yde8BrPfYbAd65e1m/ + EbBiA3s+ucNuZG7YmoOjq68RKeHza9Jfmd8m8AkjN6P+J+fYvNhe + b55SBNRh1/dct1mrnHP2tUr+dnJ+6pZaPH81dFuv9jypKXjzPXc5 + n2sumFfY0VPc1Jy56/urarB4CmkjN4Rq01POve43luzmXi2/Lrrb + cz3+0FFm45PSC994ef7F74+RHx9Ln+3ktOi7AfG/V3ojsibDCZ3j + McqFXP8RZAYVvosGDtUp+0tI4CRKQGAKFD1+Tv0kQYId3gkKPbOv + ncTZn348EuF4kgPqlVB1xI+5MHE8N19s7w3IZt8r0XGnTAyGrXDv + XBBXHIyLo1grIPHW1wvJ2Pq0SY7cCPop53fmIys2HwtxUpIL5J8O + y+nkalpj4ud44vYz+Rx16yR57yIqUezWhkw4k4c/xlsvqbFbzIP7 + 6BcPdfiByFoA2Fx9g405+81lxlz8No6Tz6X7Lh1w4cuJ/xn3zX/u + +IjsZ/7Oy+U3fPbl8st+xeXyC37xUXdj06tplymtOTj08mVs4IMY + qckhF3KtzeSgFwVpzCF5abzNNfEOTi/ICU7M4WVzYqaLHrHZY4F9 + p/IkLm6UXVSoA/rJnGQ/uOpTncKUTzffzUX6J+fkdtET4zWwI7Y/ + /AOXy1/8348HKT4yep4YEm+5FJtenCUHPu7b3KSRD1vrVv8dNDHX + qgl4LsbMR9+JONfDLcCtn9ilRui+JOd0nOtJcqtOii2H2dDM+VnL + i73sM44fzm6/WtEP+7m0U1v4JT1/Zbcm9HwQ+f7YReqEDcUr84Z/ + iLbm6jMb+b7sXOxXTeeRmCzc12zBbV5bC92Qm3cz7ydGcjn1Mg8N + ptYGovmfg7RupDvfkysPeyf/Z97DYx+uXNJ1XkNI9Ov0siPwk/lR + lu/8xryz9EeOm0EP6cTTWtv5u9YD8W5+Mw/7wCbjWrTn5ei5foXn + POviFob9mbvXnNdH5ur3f/fxrpePYpKfulJntTU2mPMwHXc9Ab/N + 0a5V4TE2bxSowbuIWNcqg/G5tZ0a9KDBObrl5WXhzzWEWEx9ly88 + 9LqOee8/ulx+xx88vlfoXbuZI1TcUq87YytS2zbYs1ZZE/d427f+ + MolPYvHjeWfyz/5Ph6+/7j+6XN76CzP+CH+r6PWXVxQBsf+Q1NwH + En8PvFynzLWPMTlBU4ut06xZzg29Rsl5YsbwD29384Kna1xq27m2 + D2jUIAabGswGw1zR0m8z7hhvdWRf39RTju4k/zP+cu8dAcnT5FWH + dzJedzq7PxHd+/L3/eD9//it33y5f+/TYuAvqqMQPFE5izUG74Gp + U0uNfhesJuDt3W0dTrcJ0YViu9iM2GNp9O1MXfBMxHWyMTZ8EmTB + 6AXHq5hkbJbEPjkNPp36LCLiAd87gvL4NIkf4nTG/A7w8ZUN7Oki + FVvnQm3ifYfoE3cpUL8a5kbwb+f7CzYftWihp6FTHfQ7RGsy0D82 + 7grHLv6plfuxGX5jqhDEkyxc8c7mQM3MIj0Y8Gf/1IF3YTtRvAg/ + 9bDnCTY52L5f92zquzeNkUO3du96+lAkPGrC4vHP35uL+y/JP7/9 + K/k+Qhb2X/M7LpeP/eS8Y/jRWYjyjswtVhW8whf10MUki9D+xeOJ + wYy37ung6KKp18Zj4h28xiI80zYmiU0/+rLiMfig9ljod0wfu54L + rpP+nsuqDx/CL6dvTC578h77pl08i70yr5UXNe7J/l/4X48fNvCl + cjdIvYBL/FDzl1aMhOSDYplgqGd8OuHcS9+ek4yUJh/WP7WJ8Pem + PfkpaJqRbW0Gc2pUO2uzPPq3N55W0j80uaFDnt8U3Mnl4A5vW46E + WifJu++Zzjv49cU4G8qV8bSznrQGIyMuCMau4zxOP7vVIbsmfre4 + s1B3Lix+GNNfJa/RF7kS787N+L6TmImBNVAcJ947z74vB2KNn+yJ + K5a2RXblAsEt9jZ+jLz++qgIiO2PvCffF/za48fafCRT7K21zVli + 2YvM8HV+JSf9EanMF+c8ucY/260e/UOzPzeZbbfx4dtba5hfzfyq + /+1oyQzN3JRua1evT4znnKwOEHjjY5953/Nb/FODY1PnKN5VO/rt + 9zwfn8GKQ9eqYN+aLQ7iBbtr1baeRbT0j3NT+2X/4+XyvndfLr8+ + D3c/5pcfNwVr+KqZa0KdzUPa2rLNnbEdT/djb68x0vLNw5Qf+v7L + 5U/+d/nXIflhsX/7Pzl+rG5iQ+51ejoR6HqfOvE1COe151MP+qae + aGnN5GXm1X49eJcVU2Mwet5J7c7cgX3XuUd9ewiuDs91MvInrf1Z + T8/+m5379789Bv/9e2//yRTRy6dE4BXQiy98bb4H9LtSxB8Z6d3a + A2wP4uxP8TueDfdd4yA7MSUo20zuA/2BjAxNkm5xyAi+5M4JBw88 + yZDU3Y7BftL29H6z5Wq1qYGbzU+q4GXw77HFPscjWj9Xcdec0+jh + eOWtOLrxcyP4LX8pN4Jfc7xDOCcayJObto/QbezW7l22uWZ8+Fzs + nrnHFHoE7DG2Ye86Tns2vLG1XXnRIv0zdvQ8eIU5490f/rTzTjT7 + /ONZHz/5v/OuoV8v+8x//9JfEvtFH3v8I9pXstCzb3xiA4xetCXf + z7nRTf1PLowb67gT7vJp5NNz9nXfSxTcZ7x2Oqt0HRtbtMfH/uAu + 8WE7sIKBZ8QLOQq0BtbgjgtkcO2/VsjJ3z8l/nP/S75vmwcH3qmd + j6NYs9DEwQOH/hR14tTvWopj8u2mrrFxcXOIPPQKw4VJT0gZVRsl + GNmZnDQVeWkqDIRgT+zLl/45nvbgXK8FOTDt9tALXQtTeyVrbK1V + vWkLv+PKbhiVhzGbMbzks11hZqy0xuDNDerEoTg63B/GAABAAElE + QVSRJycm7Yf9rxDV9/jvRqHLw8pDuhKUIxCN+zrWtcd64n/GPvFT + a7befESg8tMO7MI+5Q5Vr78+JgJq9Mfz8N/HMN/xZcf3Bt18ITH2 + 7pabLCXsHID0W/vnXfh7ufich0IHx/XrntvZl6qk8wBeebuWenD0 + L/LJoL/3N/Lvpb7wsNNFLKp9DNuofaveGH0ndDofVSNTewM59vaY + rqUP7hV2DsqLZfHVFoKLcfj1eyfWpzf8m6nP+s+Pf03xyB+OW9jF + iWzxB3fZM321nw1ikBxpXVt9MBj+TdeX/Q/HD/P91s95hd9lpPd1 + ujMCranJ/dRgOG9rTa7m0y9lx3vDNzJ49/3mGTOaNrl1bXUeZk5X + RsGt/o4Ng+7s4+k13fDDvKIXw/f2rLspnCejdaXxZEKXt37St19e + +LHvTsF+ShaUt3Sx90TEhYsf/6g/mxMTGGrsW4R6Jxx+F7AKvw5y + NBvREa9s+noRM50Zd7FgS07OIGW3+/AsPn17NvtDLqS8ZW9RpN87 + OC6o3Mx82FsPW4b3tmXHbJIy2/wUvJ+VZTRc+n1Ehg34+iXsBej4 + aRBb+H9evAS0sboBNy43bo7F0Mcx5GmeEt6wv+QhPL45+fhIpM/W + u4D1S4g/8aPREWyfsS+JU3bYRX/fjZObZYtF7y6bydIjjmwHMh/j + 4MNOrYPEmU3lja6e8BYf/MnV6BpsdvTBQ+qhP3Zyg42fDexmP+q7 + NanZ4uYYtv05VvzskHu1/Sb1ps5hC0YI5ne8I+8YfsPl8omfdrl8 + xm+7XD7511wubgx9FOVDf94he3C/vNexo9yxwQ2GrSfhHNMvNz6S + xZ6Jfe1ePqjd1mx4P8RTqmxjt5iNDvb7WAV+vk68B4sN9hEZ/C4I + 8faGNTV4fhTvYOsrGbzmbWsksuRd3Jx4CzPdrxnyC7zveufxzuA/ + +LbE9v2H32JlG5oYONYvJ6j9CYi8mg9ye0y8DvdlcodHvqwDYoh/ + 1mMXH29M5znHsj9yQLoffjVCRl7enHe41dUpU22HTfJt824fXti1 + LTy7L3ARfyqTuabPOtK5MzFYfHjVx/Dax9+YrLrDg0496TeHydDD + f3GY+gaN11b/1txxjniTwU033NciNYbxU44+JLE/n1KvmDQucpr8 + 45l4n/lb8RMb4cJHRo314ca60B3+iSEe67e5r672mh+e19sjAurT + x8jdkPgYo/Ouf+HQh3zm/UbNUebmSUmK+VTKvjg7Fv/5lWm5mTkz + Lf7uk4kO5zRzx7XUzOcD9HiVb//Lz79P+Gtfdty47uODO3XgeD5h + 5brE3NzXE3wwbc/lvGMet6bSf/ozNu6Kst+atVaFtx/X3GswfXPT + p/Z6jaK+Zz1JbGJaaWx1QPe3fd3l8p7k4Lf9F5fLr/6tOXf/0jVf + DvbOn14T5njWncHHIl9oj0X3R2Fa5jVHOQ+T/eo/muut91z6XUb/ + I/HDfv7d8S/w6y9PFIFeo2QeqBfXPXOdJ+/yorXhm2t75xKfKpOj + 8i2N9nfquhbenneC3fpObZVteKNjsLWu3cwtDy7RYE69aPNXqu45 + wHv5wdj1zZePeGueXmRdfQKKVU9O977kO5+7/7kf91dyIfDrc5L/ + +P56js+FW8w53WLfFqfTYE5nXHGj3pTEBBeALhr6s+Dp74VBePwU + L9luwZuTt3EXAS9E1oLQdzCKSPjAkqwudCtQMFyE4hdkm8Cz5c98 + wfETvw3+JChQsyv4sGCSUSyD40LXBd2cxPyCokT69UrfK8Q/C+9d + i+eY/cTtsgm+m/C7sGs3O8Qq9s/NQAt4y8/jdMupC1Q3gLaf/OfH + xxje867jewHvygWsp2Yw58Zg8MS8FFtdXLC1cYw9+F1IDs+0cmtf + XFtPkVVP/d5pZIaGn9/2G+/kx0Vtc0N3NmMzicjqFg/11pNKTmzy + WTyDkS+RzY6aMyYG8m9/TlZY8YyOs06Cz9dedMJesR6+Hd/HafwQ + gMX9X/u1eefw37n0i+sf+dGpyY84fmnsvDCr4N0v46N54buRjtkw + /sz3BrvQMXrR2IRXTJD49WJ5j3f2h1fr+w7iaOFqvJePYweeIXxi + J14+q9+Llw17+LzzS87Nf9cT9uQ45jyY+3gAvQZIXFw4eWf9HX/q + +I7K5ODKPf5u8Wxs0zexLq/j5F2Qsd/S8KpF8T9PNCtv1mD2dE5m + fObVKbf0qxN85rEaOXNJaXjYRkaOZl55eDBzRy2b+ztu98M/Dw20 + ZFurM3du6otecnjnhpDuOUfwf3RMLNitr/UdfG1jOQwZaw1mrHOH + n7bwTWyH9bXaig9fJ3bi2Zgl3vIr7z4mnN2ub2e+0zGxLEZwrN8e + Gsm3XIr3SRmfeiEH19qtTvCO/pP/9Z2ef9/3/ccvdvtfvu/5nsQ3 + ufIwszdnidvM24ZLLsV5p3XcXCW3nb/mhbUj9BD/0d1XF79yaA5r + 5XVyPmzOB//kH+RdwT92ufyt3Kyac/jLt9UIfrrMs9ZU+GB2TUl7 + Ensj1/Nw7OWn65DOy8hMP/5bW+hWT9rz+16xucVLICRe7PBLkeRr + S2oRvSl9fEQTl9EhXu/+fy6XP/HfXi7f93sv/VdTn/BpDx6G73ap + 58GYudN1ONgrHQfDeqWrcyc6rNOuk+XZg2nnifkFc189+SWfcIxf + Abx+8MQRULfnOSr5mmsu+Z7cS5Z6kA8Pu+Sja9tWnxQPf2WTN7Vq + HZTzqW/76MSHka3YWTendu/lHDs1eNZe7LA/2+g7EIF+fd7J/IF7 + X/K+KH8y2mfek0k++4a/msn8BzMh35boPfvgBouhJtIOlz5Gm0Qm + HDJhXHzMAmP8gxmfJ1VzcaDfpKjzZLL1Y3gLC94ZmOB2gckiIAkz + 22pP5GYRmxORxdBE8923n/rx64VrXzR6EQQzuuh3cV0sfnEmxIZS + 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 + 8n3W5tu4SbC53RvBHzkezPqI6H5TXFl1Fiz+eIhYu6N7bpDg+mji + 3DBinriyadaaqdc9/uzfj6+8pRRNm103Ph5wff0XXy5/5xty3ZDf + FRAPLGyFpcbpbe5yPFT748MQXsOnDTk491f/xLf96StGhaJvs+uM + fWKB2DRreP0jE4LzEOnL1npR32tN0l3cyFrH9vUEhodePtL5vX/v + +NdBt9iO2XDiiEv8bx0sexonfQBDZ5uduYGcNUm9eUj1jV9xPDz+ + 1N98uXhojHrDaidy9PbBd/ygvxuf2EKBbeknstNVjYanxwsTH1Ek + pmx3bN5YQ279L+PtS+ScV7puL3xyJy7+wU4n3+Ff2XWLOceR66dO + gj/5H5sydFB23MzPDb5O2K0R+9E59XLKnsIHrhyysXW/+GFMLl3r + cmiXtz/Yoytc7etY5FGxV1t5co4T65EbnPRm8O0Zz83BKyPQr5ju + /5ef+ObLT73wxbkw++zczb75XLj6dDeJG6rBsZUTEt9FbX9yOIxp + nWDwSJDFe4KMZQKwsXe3gVqdw6NP4fs4oxNHbwgFOf3DI1H0WCDx + 74U2mPSfiU3SXZj13Z+VMGpP3ozbh0/OxeCcJHbsZWqbnkhWTGrn + uvAb3LF1cPXDttiz3T7s24vhsUEMZxKJwV18NSQvdHQRjIynE47J + dhFb/o49tTsLUljOH3y5xYY7/INNDrb+YluYAmIb/l54Jjfi3h8j + SP7worLlZXCP3uN4ntZg6gK4bB5svPSrsagv9lxoD87ejhxd4j21 + Kd61Z9mMD49cNN7R62TB9lm4Bgv+2F45uVSD62ln63P5ju8uud1G + +6N/9qfum490sr062ZhNXAd3t6VPp7KQt1bj0y0u/J2mVjqn1eBN + HZI/4x294tF4Ty5X3GDuuhx7V4bdaoEf4onHhupHxhrv9JnnsOVl + ePDJmYsWePx+KSLvxAuDf1rzZtaPyefo53s/GZEW4Z+Ytg5TC+LS + vCYG+I0PLhl28SOix5zAjze1Olh9WLSwdwy2Ihjste1ED4Lju5kz + n47eB6/qD654i8Eex/FJfbMJ8QkevqFd1/TRKwfWWOstucnl+NaT + 6eIj17mTh4ON2wIaGwZXW3uC2fUkrdxM7nZbJjb4m0vriRgvGl6H + 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 + t8Qb9aIscvdybMzLGfPsiwlcE5Rfe52M3cQqHAXe3ZVzT0jHrlsf + D0ULW7zpj5x4s5+POTxq0E6I7voeHXLERq2P1512hLcxCU/jDXvi + HZuKvfBGpjFJH93VE5nGcXAXfwfLvLBjs9jBEZPeVEVmaHAdq+/6 + JpbLHvbj+ZdBUyf9rleUjm3snptYfgwfmxpvvodHPCbewtT6zpja + mDgCxTf+nfW9xQTPvEtBx10EW556s0c/mWytJfFOF+xeqIavtYpn + ge0+3OIPbnOx9JR/6XCi7VyOX/TZxAjxqyf5tLsOPOaG75hqJ1an + QZEVIzpbJ2n3OmR3Y5gd9f2GtMXQphYru2JYvQIQmnxMvOvTwt75 + yFckLxk+fTixYzcig7d1uWzgGz+cCJtPdhSs3cR6WN/Us7hlY788 + +ggO9kD0hQ5befiW7srGsH1dw446rhYyXjk5CDZeMWzuD9Yy02M7 + dc7YS7T1mVwE6RlSY60zfqffeiNujUnGmkdjKLLkS+lrLnOAH762 + NmMYvqWLzvn+o2HrJ58nJiduxojAQXjkqNjBHFOMjR/4y7PmMNkr + bMyRxcesOTc03uZzNgMz5wc3vQ9yEt/YCle8YNxScxacXkdEGZvF + k2+PwqbbfESw5zpi8qTNX1+sscbJiLe5WOw1rjkpvOPH2NUaEISQ + MZt3uuHwCc1aYL/jVe7oIPoY1BhsY81/7GqM1noi4F1T+GiePQkF + Wx5bJ8Gbeqj+hRP4gycxYatYq7H6m1wZHzJ+2hM+9nbO34GNtXHl + p3Fr38z52NR5P8DTRqj5jn56+tFyvNmqGybevMBvPagl9b3mTufh + 4tGMHIHRr2WTc9rEpCIFz96al26WZ06oF7x7bgdfHGCK3eS1Pocf + 7fE2ftZg9p1LKhe+2jI2VPLwkw09d7CbDdl2XvjioZW3uHXaTU6c + 8OO5onTwi34+mBdiiR/OxK7264uwsefFO3ITk44vu+GUMU3tDh/e + 2r2wZ3zsITprAf1wybgxf5FPGe9LBNhEbmLiuNjJJ5uHalMO8NYP + O6+UIjs+akGdNkWnXPP7g/KUWHbuxI/KhLmq+3IIPnPvXfH3my6f + /pn//PKX/vorNeqUS5SeDn3+X3/3/c/75DzifuH53xDrPyqo9xpo + wVbgLsosRp5ICoCC8bFPBX3618g8MKjFpy+bpyuTDC3cTp7VekqO + B/Xpb/B3bP2T2NmHP5MPZtUv7No8+ymouXCbJ+5kH0ctxiS0/sdG + tNttX0xMMjeObPP019YJeog89NqYRDd5C56Cr93wxXlt1cvuYAsw + e/oOSFK+x2EU6FN8bbMPu1jstN1g127xzpinmT1xsmsBPqQjmGzX + PwsS5sE+6yR6TAR1wgZPsMTkrgk6tgsA7E5+9bCMKDYdW0xgqxP6 + zlyumBAL1Bmf8aG5XjjkEOzWSLD19USbVi755cSpDm/trm0ZnziP + DnbBczz27i3f+m4s7OSyP0KQdnwdHLYN9tQKf8Vyanrnxb/TyO59 + r2o/9oqNWp9cTn1f2RE+1BpURznumhG7h088xHriYqH3NNJx69s7 + HCuX40fjxv/wTqwOTQ9exYm8GwXUfMLOE0aktvsuBLtyDGfeQSrD + 9jJ6+SFPlc3TTE951VsvHlIbWnVdP/kaH2BPzhzLG/86FzMIe/j5 + 3nmS+OC9JXHwFPV2zu8xmFpn6+CK06knuHu8zxpMv1jNWoW/xqft + vsPYy5c5ZuuJnXG1yAdydNif+habvkMSH8QEDc5xlGN9waej60kw + SsGtL1o6FjYeNsjH2L0kin2L79xByczLGsJWmGujh0+20bljzv7L + bdlQ2xJb6unpQ8Xg127ny/hbCsPYTLf9bhl3PDWsb45bYysm5uQH + U99h7UXQvMsGe2S6v45P/OCpx87pYDF08CcudDtf4jnPO3wK7100 + 2GqWXPMGO8bBHru1dPfCN3xqu/Udn7tuBH9sH13FNp4x9qmD4jHk + Fjtxdt7BY/3uJwJi907F3zpcQNbe+KpWhsRg+luDOZZL/pwPJMRj + +Thy2toXW8sb/DPni6k+3cSS/63V6Bma2M11UPMSG8wzsXgSYsOs + YfJ0a9NgTbwd0y9fQ6dffMvGHrGWz64n1kfxjhx/doKL6IWLzLuh + iffoMFY/owNm63vV4GCRPffhZ5NPsl2bFvhgTts4xubyRAa2Nesu + Gnwt25sjdi8fJkeDTXfXqtRhzxHrnAF7sMjMvra1rw7ja21POzGC + O7ExJh/qUEysKXSwqzjBGuw5njzAYVcXpjSDOXY3JutcpT7mXDfy + gzd+OJ79EzsdDUtexu7RI5dixz7/w7N1ckCcsWjdLFx2soPNU+tk + T1xx2Wqw9yXh77uxanBwZncdOyePHUv92YxPZ8fauepnV/DV2cRm + 5/cRaLonJrVZUJa9Y7+19QV3jfe/KNvX3/vC78n/zXj1xPOnRx/+ + xm++/PhP/70U5SfG6Q99kKio4EidSSvogiJQfL0K2GZOizMB6mQL + r+Qq6ingSZqi0Q/MRdCjsOHtJCEKq4WTYjNZ2KK/yQq/ooGtXxLx + oimyHpDJTu21swj/2IZ/t7uJTt8U/LNr4tM7djY+y+bZnzF296Sr + 4OM/u/AchqSP3LK9J7ZM/B17bKzMOoDNRidDF7wfjN+Kv3aLSfgK + G321OwdzcVXsjN/igT77ggELkFwO9sS0vgVTsdOFl5+wTwyAIbz6 + zn68sbsTKZO2MVlybEZk5NLCSWcXw5VP47DGhnNff3AsnnLoIqp2 + R258aW0vJfC7GMZuTox9xaUE0aNJ6wli6zsLnvr7GbXG7mU79tba + qpU+RFkxMTb4t/sTn6nv+r1svLKlgsFZWGXJy5X/BkMPyR3dj3yF + wfbTT3anb2wj2LHuHP0z1hNzeMXkrvpmp34n5Z7YVkzGxtGjluQL + 711U/WyKnWpycgmnuUzeZ26dOunNNrpucfGzyTzSTn3jG7u0NjVk + 649fBdPJmh1o19FaO7pr4yPcOeomfLB70km7k/6h2i8/0a9OHJv3 + PsYz9Td6rSdizaYz3mvukMO/Ez0Tn84z8z3z8sQOPx4bTHUyuWy8 + YRvfQG9tdzzrw3lumHlJLuPyCVsrHo0JbMlc4LU/+zt+vyMeFrao + H7UwucJHvNhsX/an66TxfToqQ+iGqnPZYb+2Jk5+gGRiIrbsaC7w + ZmyJnGi7D+qOTc/F7vl3PATmxmBiIt5dq4JdO9i3A+f47Fr9zU32 + /YjGB5JTF0iofCO7Yi7vraOtNm7jMMd8sy+fxRTz7OuHjdhtPs8n + hCoz2KehK06ViEz64bJb3aoTc8y7TPr4i6f5YnfwQfU6YrCxjW9r + v/zZR2LINnXSB0Vp8dsGW6uG+NebzchY25zD+Ut+CG9rjq8hP8mv + bndbd3v0O4ZNR30YjBzra175lw1+5SMjlo7volsdrqvOa6slMzyD + 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 + /3F03Y9HLMw/2+TOevhs/HDSXzDbziAt/vCyg/wZ82Ci2hp7rFV0 + zXoycwD4lX3hHRpbHDc24pM4nvEOphs0a6vcyiM7Ou/ZfRo+iEer + 241z10G2xdbaHfvhjBy74ImPd2IGd/Rfoz44up074jLnK1w77uiC + PXGYvkF03D6x4m/sYsPUS/MXG/EY6xY+BLf1mLY4kUOj6zg6XmGP + Hef6nZjTVewlx5/GO3OyF8zBnpiM/pnbjru+LuzBp7G+HKr7utvU + PCafCB99tWPZ0ngcw6d/+GaNaMxXTLCpJXkWi36ETDxy/MaNZ/Rr + G6vEc+qp62z8no/lsqU+L2x8arnxFnP41s2VEzYM1XZxERPnBraF + t2vJii1sdhgbbLFuLBOXfmduxQKPH5VpG5khvpoTqOt9bBna46dP + DTW+Dhbf6C9k+sTPRxyN1w5+4n8EdY5HRizGDnomtsQm1gPReAcU + vjkzMaltY1f8nV/thtv5Fn64jduALfw5nPWEjnOtig56nJv4KYZj + Y+cN/GxTf43JFuPB1oVv5Gc9mbjio9+4uvOJB1h04NnXwcnNxGb4 + tGztvHduW3Kw/cpk/UtrreKj2FQ/vtDgHUdHvPA15pGD13VKuza8 + 5aE7vKg2i7c5EL6x9xh98Fq72cXHZbe4d26q77A2JoMbXms5fNi2 + Wxpd4sg/2PrMS3EZuZh1zIeVT2v92NNaugN7dJVvchk+uZx1pXMj + hjcmweaLd4PJsEfNj43wZt/4xLR+RXYIj/GXQ/iGd1py3c8Yu6am + zhqMjaeO8vyTy/03flW+M/++y+VV/7joabWQP1X6/L//k8993qd/ + VKJ6+bXxwL+gON4lFMCZwBxWDJ14k1RBKvfRCo7J2Qvg8FtU+l21 + BEZSSkmCIBU7SYRvEbJ40XHyBStsJTroNd5fOAoveYFH5E1G2xSr + /klc7Q7IYPR44Y3eaclMkqedkyydinqKzyRysmDnFCC9tdvL0gl7 + LlJNIB+/nUk0Cy55+/yHb8Ly9y4Sj1J2YIs3vxvv9dn4iXFb2HCz + WSDY1RNL8PnUbUFOQ4c4zcfh5MlHclrskeHkTHDyxV45ZhMdvRER + h5AG5jo8cpknrGJMttjRAatMYbTfeG/9gx2uB2D2g9N82Y3dExN2 + N97rBuKMC2zxyCberYkV78ZjGdxmYeNprarxLd6TS2aUIjTxEG82 + z/xxUqoNw7u1cu7jS2xvTLbvOZzyDAqJLdtdKHThtHjGR7YPLz7j + 5qDaEIupt7O2wzM1gh/tx7DInP3H7plLOObBzL3dJvrOWMZe+/ra + n2PYgIYH1tSbWCC2TMuHbuIS36eYpg4b85t44+kcSb7kbrDYaS42 + PvCWrVNDE4M5PiSDxdfkSNsgzEBaMsM/dhue/bbhcbMnZ3xRm/O9 + J3FQV4OLf2ThFFu8Exvx7gVTeN6UZ3h84QNqPINFlp82NBdOE+8M + j6qGMtDNpTVNDbJx6qs3qAtz8NW2rfMi8dDOw4fB1g64nLJbjtla + 7MRgbISLV6vPDTqfO38i27nDyIPtsL1GpyNtbzhiN9nT7mBMDBuP + 4NM987NzJeLs1k926mjmVdeH4KszfT4OeMZ72Tt2DzYfTrvZG77y + pEHLjRRlYr3iPXari5mnlYns1Dgece6mBlHA+CG/c/4V485J58TE + 5IHCSpwve2zsi3fPPbEJVtc7+9lgGJ86dHHto25qozW4csnViUdj + vuKtu/Utl+OTzp2WL61vOkN+QbAxie/kbIMvV5MvN3mlYJTnYCtv + bY/eiRM7Gm/ntD3eZOhYNYgHkbNV9TbmWC4eii8/spGXuyHYjd90 + 4Iu8+BZn9deG8JLtGhU71Si+8kbuLnIuenO+r0UGhtz3QpXN2c78 + EYaRTV9rJTFBXZNS51e2s0Ws1xyB1fqI7ewee8nXtL4cB2LNDl0f + ErvMIesGmSH7M3fY03gHt+sJvvQNO5zxw7nHRznZZk6qk56PMWeT + R9js7QO/7JNlO5zagG/DNNCchEdc2CqeMy+LS8YWXNhsh9H8qJM1 + XiXp19Zm8cq+eDQm2Xft04/frtjWpoicNUhH/Jt4gxMXNHHY9RR7 + z2ViUvuWDDk6ml/1mX1rkFiWclz712FMPPRkXC25RqH3rMtgTJwr + t+yddbPrSeTECR/ZmpKX2r9qSM4b7/Q7J8Jn90nsGuzoRIM9+psb + AzXazrFrHaML1cYacBy/1Ovw88daM6KFi+3qu/WU/TkXiy05dMi/ + kDr649m+5t6Xv+fHj4Gn87pH6OkgQnnxhW+I4d+Wvbdly4oSZ/YA + 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 + zsIeqJGZ47Ol20Hs89oXuRHVymnrce9M/27vYF/36R+xiNzM7xoY + man51gReAsgOG7K1RrViqTsf6q21tviInDLhg9caz5zrNw3hqw5t + mRd/mrGl/Qt7eM4xcmo3/LUjfMbkZp/3U4ceoCA3eW6A0fBbI+Zm + cNYB2Oj6N3Au9madoNuFDt45V5IR77Hzuu38iZ3lWzocwrqmHecc + G+wlMDnv+AZSvQGerrFjcAZbv/3h40vPJfqmM0L2leYy/fBvGx/c + aasPRvCsM62ZzBFU3QE7rwsCegP3YDs/a1+wuq6kdREL3/o9uR/m + 08+lu45lHxnrOS37ukanMVS7rjqLN30Lh0+VTz+/Zs4cKMfnacfe + aX9haMcv3VTMOVw/6nzKQO3GsPaN3War/huEPx2rzM6hka2N5jCm + 0PSPjefxMXzy6K/9gGd/4+nuZisjsC019/RgXL7anfHuq4909I+j + bDZ2bGNki61zOHXh3AZzaqX8zvPBGDLH0cRVO77al4fmNDzZvY8m + XgaZcuLgTN8uo1YOpq1/s5/I6J997QkyvNMCHx32p39asotOO3O8 + 6zA8/o5tS+SYTyveeK6JP9ZA1yUnRph2XSNXU/uB99ey5f8dvPOq + 3E9tybhW8I4fq4Cnn77+jf/s8vtfkHdfH3l5HPugBsCCJkCKbwKy + B2n2TezyJjgTTEUph435BG1OVOG/8c3XjIefntt0iQB9Fl8XZecd + vP7ochJjxywyw9//PycyLdzhXe08OS7vwrh+Ys8PenuiDf61bWPv + 2YaHjU7UxbegCsTyuXwbDt1obPeXJXeqbDqah9gyC4Fjk5pttlko + yObwcidjJQdiSid+J/j0De60ePU7AfTiJy1dcE2OLiIFDB/IYPav + YKZ1EXDHZiA07Y6tvzeO7Mj+XicHII5FwRFvxJbTt/SP7fdhB5Tt + wNUG/NbIyBiSy2xlix2DrW9w6UQnfvDs18dg+Xak8VhxPHnDMzU/ + 82HiV8D1ceLO8bJDf2O9Yj4yPSEz+IrYjL9zIa0Y8sHvG7V8s4mH + Y7Z07mSedN9JJLj0jk3aMw7ZV79TM6N+xsfHGYfNntZlZIf8+XB6 + xK83hDlGtSk+mG9kZwFurUae7XjOXAYbLHF20k/3NeGH2fwve/CM + 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 + uM83hPt60/wtHeQd7zGpLv3iveIGb+YlW4duqE5/eWKDtZvPcjnY + FcvH1EnrLXOnuUy8HzbnYbgZhSk21pTOy/TXnt2m5Zu512u9lUu1 + 07iP8VsLX76nxoopl+xNHCbW1JxzJwfPes7j8fH/Te/35P4pk+/p + p6uKf5oVPvd535j/G+Rz4+QHJzjvWednsdgLgRkS20Ul+1PMeKbg + +n9cmWTZXBQ0sFf2T3G0DR55iRldt8mAqJ4NSyI9sRsaG9pOZ9rK + hfecbGts7OjhhnMe39I3OhbE2VzrNHBb3ynwDuzUbnHL9tZs4jUx + m6dKJo4cWNA9XesJSmVf+WTyi6OLNvmcHNxmnrFO9PDhhW2i0H1D + LnzNjRNexvwVMXbNBBvs5mWzB3YXk1U7FgKTeceu79wILv0WFtvD + FnIyMNhs38ICm3zl2JBxPLU7/Qi/Bat2Hl33fy458YZt3txmN0Hj + fQAiXsvXve7vB7/Zw8zm2c4Vzdh9sdp4qzM+ibG4suc2UhPGalsY + 7Nv0u0joyTv2X1P55GXVlOOhjkWnV278me+d5KE1uPJoTqurWYPI + 7n6xywMQMe8JYuVoxzxtCXbx6Y5dE//hHVz1Ob7JufiYW3wR89b9 + CKWFz058Z51MTFITGVofSygdZ/yji0317xZsEuIhBnNTdb5+V+CF + uTfRyY5LLn7dXM28bF1vfLU7NtfuxLv1zW42sxFvPw6hqX3YbHpz + 7IZNfurj4Dw++0pV+GCIqXUFH+wbNDoW38RcvAVv8rLLTO7gzbyc + 8fvwM9An70t/8xlstQfHMX+u18PBe1B7m56d93r8+njntW9cffVG + evld+9InZMKE57R14kY4VFl+LCpvfCN7m2/VN8xp4eq7jcp7y/j0 + q8nOC/PFHI5eZLz7C/e+dTY89Mq1PHb+zNxZ8q27zS7HeM33rt98 + hJG+q5AUm/7yrzVlg2LiDYLNBtjWiK5/we659Abn4RfbKxNsvnpd + VztEN9uQfrylaVf/LsOJHm84S+ps4M687k1bfGcjPxuLmTtiQteG + xebxy/yZfZjG8JKp7dl3ozPra//o1o49FrF5+S6X+M+bgeHZ2omD + tmtVdEy8J6bikH8nscd8QOOr8YiWruNbbPFIbuqbdTY23rZWzTpA + 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 + 0xw/VbxrOblxoySu52thUdj4bYr7anB4HssrSeLmJqUnmRWnwRWj + mUR+nyH+M4GG59oH+THpyPar/Mjs3y4wg6zx5jfH/e8pohvWbbjT + x0Y2VNYT2+jRR263Q17VEFstpD0BrdjDGt6xxTEef+HqTSsmMHrC + JQef3dEnxm54e5GQ2hXLicmOZ3+IDXLSeEfWb1hnIZ0T1tTtyPQi + ftneeo0MfxGf4Ym1+VP98Ut/8xnemad8w8sG9vOLzompcfv6G8/E + bIj/8Omf18kEAo74jj34YeCf+dmALaDRpZ28+4E+HFQbLcLLH36g + eQrq4oANbCQDZzAPznufsGy1M3x2LfCDOU9nScxaBUvuxWjiYRwV + 69jtvniEvTUg1ufJMzpG1ngvaOQsNsM+9eeYXnGY3I8/5Hd9S+3Z + zFj5V+wMNhfBpUP8+9ogxxeR61jWQk/e5+m7fInNUGuAfbENqdHG + ZPHQu9twcB18re9fOfwS49Z87GGGePiAPxcT1mWxpB8ugj37czxz + V63Nk2bYPV+ECaY49vW4tNfzCM5ttOu5bVzf+DrtbTK39T0I72H9 + g7PHYPqmPS5Ujth23q94+QvTcnq+WrZsnzWir/TJYfjFTt1O/alT + RK+1ta+VJW9kxVwuxb2/U101x56pYXzvkXOD+tJfXmtD8uJYbmZT + m2zgR2s2Y84NcrwTWfnU8rO1FD0Tm4nHHJNlh/UDrg3P1Pesj/rq + T8YRm4u91fcxUjP7QaaxCfbb/Ln92Gxdsg7pR3gcj8/g0rU+7By8 + XbvWvhh0rYx/7GBj42St48NaH2GjrrXRsdeA/aE9FvTAgDfy0w7/ + bS0M8Zhz085DftfR9SQxMZ/VHZ3iPfOSLJnmMvWDih1/+TqxO0aO + z+nj8rOzPtzNK5TwYQz2yHoQ0vMD/dnqX+xXf7PW9BwYPnTtP1m4 + PR/FHvUztdjaX2NiaP702if4p40xcmIy+PTBnONj76buM+/inI0/ + Uzs35k7spmtqtNfIa455SMbGxl58lo+wPNBp3MXHJpghLV+Grm3X + T5/5YVM/JTZEFzsal4VrHs/6vTgP9vSPTh1sUueN9cpl51ww91ga + V/PWI7EmQ9/OA7exig3WI/Eit/sytojz1HKv2YIr12y2zf3GbuvI + ah991muz/dlgv+Zy+Q/7yDOyn2i/a+jOK1/7c3e//CV/Ln8y+6Nj + wSdme/RGgCWgFzcJpkK5DqDAS5p+AVecZIaMSazk6J8JrlBMcomf + 5JDp4pjWTcoUEYzhnUk0uKN/dFsMYE/iW1Q5Ri6yTSzF3MVyTd4O + PsWP8f02cWND3c/x1jVDjd3Eddpz8EnsjA0WufkrpP6/GLFsPOM/ + 3GKn3Y0QB3GWYzc5tc9H+BqjFU9xNjj2jW9zzMyxQ8xtPbFlYekf + pCCLCWVHHaAuNMEe2WmvcQ/uYMUnP0h3Q/E2F+Spodq2GLpgxB8+ + ze8G1cNu72BPX3WyJTbzUSzIu9gfv8Hrm4ukZ8eO1l76Bw/PDcz4 + 2bFg9klb8C1iE3PynsjRt2PAYcfMm8bdPDy6GzPzoCcpeUHhFwtP + O+0/Hj0w+Q7nelG+oS98O838rSw/Y58/MsBO2Pl3Y47zo7oyQJfx + nRrf2NWLseRM7uYkhq/zNeuAfA0WXea0xVy81Awdo2fiPH70OIr3 + k1fXGnYHo99ar/xWJljNQ+zqHIns2L1jjz52Vi5MfCTTi1Y2Rsfo + xzdzh494G5PIzYnWvFBL8IpZoZv7q+tsdj669mP7U1N0PjfHvZGS + i+UUnrHDOjEXjDPO+c6dlaeZV63xhcGYXe/IBvqcJ50jy7e+shZZ + 4uQ6dzI2a9IZcMAI0EbsGX10weanumid4B3c8F7Lb1DdPe290mNw + xg7G47hu9yO9kWHLDdHVV5mrD3hj+9XQQw8fJANP/nqR44LQnAuS + fvE0vztvM2/E2ZzS34u2rQ6Gl7ybyKld2DDm/MoO50sPFp+btuf+ + YN9nX8bksetbdt1Qoj7ASa6Gnx5rHz1o6rV/BTZjCJQPYzbU+out + O02uBntizTdyblB6cZl9Y7PhnxrCa62oLPCM2e9u9ouddmq0dsBK + l240+md/jo13G8YrXnq6Vq9ztFyhseeMgZreaPxgy9hz6oyu+pJW + nzjMOr5BdHf4buvv2zybn4M/vGSRfrmUv87rtQ6edpUpdhhfc/70 + b8kPFlY0uvQPjkB2HU8sfLtVPrw5tsEeuWnJ2D+PD7FbP/HU/mD5 + 4zx0qfv251hu2NMcrX5Au+3Vxb51znpQ3Pmk7jxE7k03f4Ip5nSa + q/xhP5tmvvdmcM2b2hIMc9W1EF2+OW7MwvPcfKejzxrZhwrwQsaf + KB4zfoM32P2DSwsHVudO1gWmZ7gfN2T0hQZv/Obb5HLyO/LNwcxX + MbdtNnd/xbjXlfGvsTpU3dCFF8kH3MYourWtWfM++GPf8B9S+v0g + +y/Gvx+484rXRtEzT8nsu5C+8FO/6/JN3/dNseAjsn3QYUkyJWAm + tCR6Mia4QxIquIpjJksnp0SFaeWk7C3sFJBxC5UEkGlRpN2ZjeFX + KFMU7Vv6qquoBw4+E8Ni00UwHYMBx/4BdgjxSWE8XTSFXr2xuW2U + aSdON3SzZ2xKOwU8xTrtDZkHHJQ3vpkI9PETHpt2HeJtrHFY+nPY + NMyizdYMnZNu+Pf472aMnxVamK2R5EYLfH+NRd20Xvicumiu8OW4 + tlMeOnGPw47zRT9cr5XdeCU1x4UJD77RMTg79uAMtFgVV93AWW3H + g7XXU7HFcNkyGLe1eCYXcHcdXvNrTBOD2+iGHeGB1bjuti1BuPLn + 938zpxqjyUG6H40+//HwUO1nUzrObjtsHrvTOp749DAfsNnXubfs + d7NRzBPsnqz5OflIb4lsT5LrBGPchrcnj4WHGe41NT4rprWFr8Fk + W9ca+7GlDxLSihEarP6FvuXbzJUyXNl/BqfOH/Ljf+uiQgd+4za2 + pq3faiW+zE1u596Sua0pdmwoTD7Otjv3S4w/s16z129vxl8S/Ctf + xhqjqZNg4usP/iMj/pNvMv7I0uk/oFuo6wPbwgvrnCt49W12222M + gj24nR8ZqH2Lt/aGRzt1Uz3kyS4y/vbQxEQ7W22M76h9a3/sawJi + 1+gaO8du4+07IG79hPtEPLcKrk71PVvtTX/xJt5szj5SP5Njeofq + mzmRbfrbt/inr/yRI1peunNwbb/j5ilt52Jw3ezo73/jsmqpfGsu + 40Nwe/1wZd/d9E++G+9gjV8VvOVjbKNn7Gis+LA2Y2hyeNp9dNfm + 0/8rm4aXHexGg2O//qUOW5fGn8Bm69HElXxpYT8aWWMTgxnWjh66 + rWsPovHV+MTmQbzTz+R9Xk3/g1q89NxYB5dNGmMNVYGPeOkbs7u/ + DuyflP3Oq4U/+aQHzXnkvviEH93AOrr6eeZ29Q3ftP39Jp2xSZ9N + jJv79Fd+jN8w2NqbQTcgq8Y3tTd2++DEXOLL0oMBtpzbYN3oW7xH + 78Yb+06fIj9xmj/Cw36vk9e/7KPuH7tv1+de671miZ/Oz9ev8N8H + Gr2nfj7Gl/opBmMbIT6Gl56J926ruLoHcf6c64Jd19Tg3I/AntgE + siGZv1nQul36d4zO2XzcufzjnPP++uULP+WNl697zQ2OZ+ogq8O7 + ju58ydc/fvePvPQvJiGfnCD+7rTPO57MJwnz1awgIkU3F3Ge6Hui + 2IUpCZCsxyQ0rWROgc63dcY7EYI7CZukHejrUzKjZxaAGdt592LZ + i0zSB3vk8HbLmNcYPWEYf4bnYS28Xd9uR08Qq7jY7Ct7BT/2a2uP + Ntt9tGw7J0FsPBc8sUysWsARrA3hHxq7dtvqZ3g8jTU+E2UmmqIf + +/F2X7wDap+NJlUv0jPeCZi8+Tak/1dRnmLdlpexje0mrGP14UnW + bX7zq685BVtbvbmQQGPLcXQv9mT4JR5qypOza1vGfzlmu1Y+5vcN + wPlZe5cC+/32ZtXnc4PduiaHMj4kjjDZ4Um02p+n6ngGt7Fces6T + RWLTp/DxU3zZIlbWf/qHdgx9p4+xw5hYtS/y18RX2MbFix2OK4Of + fFobKp5jtWkLGeMyeb7OA4b2G1jEb086XQDONwLqxElv//YSzuTC + DQsaG+Rw4metmcWezBmH2DX7h/RhLwy+zbdZ9TvH6oM+TswfAugN + 4Sl87NBh8yrvvPbUb1RWHIa9LgeTvjkpqfNZ11pfmDGGB8FVI17P + s+awv/O4YAePz64VIxMdzU/0s7s5SZea07+vEe1LN5rYVEfsmt84 + NsbJEWKPXKLOncxLccNT+WWXfTaJhxjWvs0W8mTQ6BUL2J2XwewT + 8OgdvsYl/Gy+Ee/Y5PWn9gej/kX/2KPupq8Krz5G/1X3Qw/FlF3m + R+slvnZu6F/bg+YWYPY3j3xha467Xi/f+Mqu22y7re9hxp65WUzs + qo05hjXxHX+kZXTIG/6wnX1g8OCHc5J4dGDxwt7Hl97rtZOuu3Kf + Oic+a+ascW+OnDnQmOHNNuuc2jP31eL4UWMDJOddC1J/6rB/myD8 + sz6Nj+RqA+wlIx/s6LcqWQuG2Be2A3vVtjXrXBtja/MantMeMmwO + 9px3WjexpevLqs+w1cexZ/zQv9M5HmPgNJ/LB3wzPmMNKqPX2JG8 + Y66J6XxLdHActnZfPNY2Y3s78dv7Rm7OVWPDUn/G5JTNwHwLK5e9 + FhRvgd4pfGJnfbCpy/1NEHj8Ht+JTrzNK3XIT3UCW46sp+w8bVn6 + Bmsdns3gs3NiCmdor099O66xrpvhn5/ajJw8s9U5rX/8KfbuuPh2 + vxw35/HpOkwdsxZtA2P33oevFD5zdp+nw99z4jov9los9tUP58TY + O/6RvQ274/Ht2hd68cOywe5PshJXsZ16xjc6tOYKXuPP8fOJ8J56 + Mz45UU/9mVHiqGa8mcDGrgerfqwfjk/5ZdOcc1x3qLGd+MHeXvuL + QajXjld8nbeX1yeufyZLzU/kvohx7xLaVq53if7LnVe++nV3v+yl + +Ys6d1+egH9cLtKP/5vQpNwLw82gIpjFX8Ka/AS9C0QC71jCeuOY + 5EuSpPcEGr5SePDBvq8wV7/Eo/Klz3F/hB6d0z9tscMzx7UhB+yw + ryBcnDnRzEXpwf3En+R3cgi3i2biIRZ85UdPMBm7MeMrcCBMIZ+Y + 4W2slk+4ErLGRWxMJItfn26kFYORnfZAPnDsT7+2vsb3odE/x+XF + F1wxossFPX/4hfg1F9j25/9w7GBkxX7258QpDj3Zb36NbjpNWhe9 + YjgnDBhuMMZ+ExQ0ObGwMKtHC4qTBBtvxHkdkjc+8ZP3/Xdcx8QP + 88Kfk6DFxsnq2cEXA1Sb5XORRZhfxQ7/Yzk5ReRY5MbX4IoJWfaO + 3RatLliJTX0Kz06n3+ns4ho8qs/4LmY1IFdi2Hykf2Kk3zZYWjWg + pnaacX1kbRMXYxNv9YfEY/+WB7/6EIvOg/jk4m0u5PSpAQ7AUD/i + 3Jiv2MhjeXL85vWgZq/v2kQk/sJxzLbWjvxHXr2cZHzViZgbq33s + WHRiwhHfbE4OauTxyDSmkRu+kdOyzRqnPbHFZdm11yLc4mdMDQwN + r9YGhx+IzfxT1/sFLX2oscm+ONaO4M4YLES+favu2MAuMq3v5GzW + 7goYznjE2oJ5nt/SpqVD3uRo/5ZQjIdfrTXvEVDbXQvDTy9b0NRo + L2CiAN5cJHgYhJpj7ciEb3wrw/rY/dz7H7ofLHL0slHLJu3kLMMH + rZ3RM93Tqo+5MZk+NrPfPBNnrVh37TW2fBr+p9o2HrCWjTuusRnS + Oh7+3ZfKYLCFZqxrzAAcQ6fdzXfw0PDvuntuOIaP31THPvH123B8 + nfuJx8jAGEztudaq1ZDa6fqeefFYfpd6zrnkrvE/2A4M+5uOc22Q + 4y1O1Z3jYmfNMqT2nHscmIdTp2Mn3MYx+Zz1ZNYsdqt9a+LJzxTH + aUf2esyQscoHozfi7bz3sedueuctqM6dNf+njsduvHDVnXZot2H6 + moMaOj2RyTGfvNLvvxryW2R8Jy9+gUsrp/U/h9bYsQXaDX3hN07O + uUEc2XvGm064WMLDbucLfHI5a4qYmFvnuSR2PojgIHbYl3O+9Pex + 5m+ocyOYeDzEnJ8x3LD9YD3XTnz8hKdmG2vzPFvxlh9LrM3YMLhk + usFYdg6//uKsDjLlTUvnUPvTJ27GS/aztba0Ibba8HT9T8z6f3lm + jO65mWv9RIbu6ks7c7Z9GRtbxw/4Hr44b/orp85XXi/3hwVPXjhb + LntuMM92v7Pf47RyDZ9ucrU9x+LrHDOxGfmxRS3NPQm70M5j3/zx + Om0fJsRu9aUu+V5zasebIveKbN9z56tfvU5MB9wz/Rlr3w3o0cvf + zRPw354F+ENTQC9sIqbgGtQEz4I4rzsckTwMlywnwRv8mTSSiq8n + yiR5kqjt4pPk9GKzWTnGFYBtsGjA2y2Yc2GhH0/7Fz/c9uXY/6nj + 4mrwOinC/46QiWmh2jc+KqwuFAps+UJP/V3He//YoG9iou/kCY64 + RdWBHbv7n6MmhufEja/vTBo7THQLS0meonvibLLa7yKyWDRn3DPW + m0kTnw8PIXnv6zHhk8NiR98Zg8gyQ/jYYFyM5y/h7fV3rYbuudDu + ojQnsOiEB9cC5KJlTjpy6sbRjSrZ+h27eoGnTezdAP7HXKQ0HrFJ + nwsW/t/m79Qcn+Bf8+ivv4zaCJ8ui776rS1rXKz09SIBU7bGH3/G + bOxD5HpxGn6Y/L4msnzsHyQit47FbQQGf2TVvK0nqug3JzvX0je5 + pJtv8lYflvL6GyCtft3zSjo919R5ldhhrF/atb9fdBdvxQaG+Ozx + Hr0nfvS7oKsfwR+76dnlhr+xXXFUH8MzNsM/7QpffVt5GIzh7XH4 + 0fRp1UjXWLUCL+P6UI/VBblsLtr859FiMhhlzIc++sUer31xvF67 + ycGz+cNRz/OwzwUcsfTJKf1yCctFkYuAX/ulHEc3XBvCZ6t9R9fx + GR29eJGbbI2juHBOk/ba/mPk/s8nyzeScsQmfoiri4fWkzhme0qU + uAx114dYZeN7f1clFolL5198vi1Hg/Gg9tpXGMVL23m3BPHt517d + o1esr3NiTB4GX9t6WbzX2PJLZs/XUt3Gxdh7vu+qH+tp6qcPi7K+ + zvroxss+LBdjvpWfBw63PaBw0+3hb9fhyIytfNmptodPbcpn8xse + KblBq6O1GT5z3rqvhsny/zbss1YD1vV2rXnFuU/JgSNOtXfFjH/v + IS55iMU+N7vm2nu+zxErdlr/3JSIiRvVX01MzTHnGjZQxb/GQ/7E + kd3sSj977M831vx5GE08b+Ppmgo7gNcxwQ9b3FrriYe51XgssH0f + Ru0Oz+PhnZw33rF7EsV2PrY24xs612X+ik10Xtf5wXnob90CCVjr + dQ3CHn/ZNpubF3xj7/AM5rTT35jGNv9Rup8aOCavXWpH5NYWjlyK + r5jsDwOMiWnrjcGh8tOBnwLbIvmfa4vdPv2w62Na1LU3mIVd2MfI + Admf3YjL8gUGtp2VjjNu20DjHP69Fgd7fMXeb/mT/4k1Hvtje2Vy + LOe9XokQzOYy/jfOywa8pz3xsedLPh/sN3TgNWCs54DU4cSO/r2+ + H3nkBzKXXnl5zrNeX7F34Uei8K6n3BW/5e4feNGfz4L0mxO035Wg + H1cGEzjJmotlRScpNom3qLagU1RIv0Q1wRl3Z268kyrjZPCYxJ0Y + KwT6z5NH9ofanxMJmgKo7hQjfvpbnBnXr5gc009vJ8/SWZC344P/ + 3VbxWdThdlKnb4je3kxNx9aS72900he2Y26r0iuCMUSGHht6W/TW + z/jx/A/MSSU3L2gT6fEbX7tuWq4GasNVHwH9qPYbzzbfGI49eBrH + 6J74j1wnbWI98X/hh14u7/9BB1+hfQQT9Bz/ys9fLr+ULemrf3Jo + IZBncS0tgS4GwZdDJ1L6R/fYh3+pqajxXmgES8w8nXw8cu/z/pfL + +yV27/1+l8sLYucHvzS/mn3J5cLm93r+ceL2JMlJ28Lh5Owvj6rf + X/vly+WNP3m5/PufuFx+5jX541NvuFx+9nWXyy/8TPBTm6fddTL+ + xmZPttz4WhDVTXkmFuFbrLV5Psa3+h3bG5vERQDdwLJ1blxdvJc/ + Y/jxvj727d+88N/C18WP7mw7sZOvCJYc2PTNgumYnHFztt9gLX/a + H1n/xUb+9ak+/b1QCe+cuF7wIYlx4m5h5ri6ntyyQXzFlL2o8stu + sWND15hlH56xq/UV+97/g+/91UMxchGHJs7j+hwfo2sNcUJePjem + YdI2XhEUD/ljC1z9PXmln839K7LJN3/5P7YWaxnBJ1TfGJGtdR// + tdZXF6r0nLbiwypuITkRu8GiuzYew+dn7QguMt4nwpEtdo7BenL+ + vi/MXEjcXvIbLpcP/IjMjw84+vS70FdTv/Rzl8svvjHbz14uP5/z + 5b/7V0edmQ/G+Viblo0Ts8YoutjS9SM+Tj2w64yvg41u82cbvk9u + x7FvE5/WZHzcL+YHxxrlolxcT32x9Y0/dcz31tQwazOWf+tja/Ut + nWJgQzOH1E1rIS09p66D7Ul9knEhaZ1hxKzB7Q+uHNDjuLEIrz8G + 0XWJbeourVfG9KmZzh3a1d7Gy/7WiP6lU2uuImPvlbpQH+/zgsvl + wz/2WEPf70XH8Xtnje2W9dQcpMvcnhscdfS6V10uP/UjWTtTT+z5 + tV88HraNDnrkz83lY5GfuaT2+VdKa91gm3Hnw54bIhd31sfGr6sD + R47gsK3xiHz9HuzwYYVLRx8ayu2qFbJjhxZut/BqzWPnGuv1iz48 + f53hY3LOTr2Jy/skLu+duImd9dA1g/j8Sv66/a9mc14035xjfvJH + syZmvhn3MJKN7LH1nJacq+2xR/z2XAnDTmPr3jf7409rI7jqaWqh + weDnqgNj4i0u/HsP8yjjtxGbfua1kU1cxPqMt1wmV2PT5BJ/19gV + a+fQqW/4ux773YIj963l2Nj5iDlU3NhLLxsmz/atuY1n9m9QcD/w + xVkfcr0BCy8a3Y6tY9Y/a/3YMXwH9/HZvhUb9XQnc5XO3Uc5m3OG + MdS6Tn1WZ/Sd5+KM902cYOFBtSe+wLDf9UF/eOXTJne7fWxBctB5 + lRY1HmxYPrfTYY7H/73PuvR49IqltbTnpfB6yAFLvG1j/8hOu9tE + tmtPBvm4j1X35Jtt2cfvWg32bu7I7fYaFxe1qxbErnOH33d/Nr59 + ZfBedeeVP8v5dyklWu8edOcbfvbH737Bc786AXpxLPrYBEm0QoIv + 2dkEeS8OgZ0bsD0B+vOvCWjxJSPnApCYKxYFPAuAsSlefbAUWJre + oPRr4wCaSAqMvOS22DdslWGy2lpc4XtHiK8t6ujdL9a6OK6ix8Pm + FmL2kYbt9SO+1XdtOlv4HTyOyzi8+jcqZo5rQ+JBz+/5r5KdT15x + 2HjtfvX/ern8yPcesdmHBmfvs7/3T/70Tb++2e+CG58fzQmPPad8 + 8iIfTnqf+Ycvl0/4jOPCfIWi7s2+k90/+VuXy7/8ziN3MCZGU2P6 + TqHoc8EyuaTHV6dsGnuxj43Th0+s3Ly4GfmAj7hcPuZTLpff+OmX + y0f+5pyUc2KG+VRIzTnJ/dA/vlz+xXccF8duZn41Fzbqnq8eAFhw + 7qP0T0zn6Z2Un3ZH2HxR26h+pjUXXhg/vvhPXy4v/biEIPXYxbdc + Bx+Zv/WVl8s/+/u5gMjTZbJs8a3O+Nr4LRk6xVwuzStUO9Jf2cSv + bUDo6oV1+PGOD2To8IF3qPNB7oIh1v/pf325/LpPOxbw8uBfzGL2 + vd98uXzHX87FUC4Sa08uNlrzyy5rjL8w277Yy+4hOPz63f/55fLr + f+txIdn51sBGzvgwp3W8U3PGnmyTh2nxTQzs88daZO3yoEDrIvf1 + r75cfu6nc5GbOviFHHtQIO5kGztxWz4NtrHJsyfPDyJ8dWAZzrfm + InGwzg2VDyv+EFsrko/mI/3G3By6CfzQj7pcPj7z4Td/5vGgQWyf + DLlA/Tep/e/7lsvlJ/7l4fv40bqIXnp6E5MTu/kyMd7xx86978ns + k9tjODj6Ws+pGTXaeKuTBuEesovYz/7Sy+XlvzE8WcsQFjH6mv/t + cnn1vzrsh1vs1fJHnY2+kastcpLNfjfH0T11mNJtPKyhuzyMJ0P0 + upCR76kjMbVW9MI2INUbnXitLT2/hqd5jV34yp9xDvfbgfDxuxdg + 4VVX8HsODb+WveawBy4eRoqbeWaztj7Zutn9ZLub75/84dTS9xwP + Gcwf54d+OxBmfqCJKT2zjpkPhtnWG7UcqMGJN5nbSD+ZYmd/5iaM + ud7I8HHBGBvt9zj43igobD7aGjMYUm8v/LDjocqHvPxyeVli5Hzz + ER+7rXkH65P+dD75iR+8XF71zy6Xf5t5Zk3xwE/L11kD6nNQfcvj + AbvYqtVrGluv+x3PWLFSu+JxI97hCXwdb33lgI7f+YdSB5921Izh + hmPFRIzk8hv+z1yT/JOIipst2Gyf+YK961gwm5+0c0PQOrzyBQ9i + 89jrmD18RzfOD8GzFsNS22Tsz1yAx19kLrhx//3/XXL4CQfvMXLz + 8xeTg7/0FanfH7kXOxy1f/mvSOSDv61XfiUecue/ixHf5irHbMHT + mMQ+vhmr3Rmv3WHpK67hre/w8RINdq+F07o2UI8w+QkHP1422Z9+ + tuCFYX1g34kdu+3Dbotp0e6nMbr8kRkP4dKU/3E7ITF9JFtztfr0 + F2Ow0/KtPsReY2hsEaupR32z5pUpvNf87V/yN/bDO+ty5/wjeVX0 + ka8PwHfe+frX56LpXU/x9N2IXvT8v3H5+V/4TSmQ/zKBe9E5sRSO + wupEm2QlifpsKkqikORIrL9ypBiMkVOoktoJEbxzUpLHu3AUTk/o + 4dcPS8G5CetfL4vsXqSDOxO9xU5vtrEpR0+JWrSrAN+y/INZ3GmD + fPZdaSE/W2dKxnscH2fyi439Tm6TFo9tybYjH9Tj+fCPPi6u+37+ + DK72/V4YuYWxD8F6oljcNr732ZdPLTyLOpKLF33Y5fLZfzQX5X/8 + uDHswNWHC+cf+/7L5Ue/73ga2gUrOZ0FTG2g3f7WS3j8GXv1oXZm + Qh/c9/xiU0mgsr1/Ll6cmH/H78uN4O88nsru2Iv77W4szi6mbW6A + X/2vcxP2bZfLv/qu4+m3p7lixPZ5GqUm6T5t3LQyF52xTsfsk6GP + z/8hJ6Gf+/eXy3/ye4+bw6mnQ/r4VBO/mIuqf/vP18knes85uutY + QnDNNTlojSSXXntDbnzGDrrwzUOR8WPG5UU+nfxcaOr3LYUY/NYv + OuL0QS8t7H0fP/VjuSDMhY8bDb7ygVzjFayeJILfWMQGdtjfib4X + //p7N4T72DO17wLu9f8usf8XxwOP1+Zi9+del2/s8y3zxLm1m1hO + 3PhpTomntjGMb/jQ8E2um6P42rUt/HavaXIDo2sMbPnJ9vx8M+FC + /ne5kEvr/5F7e8k3a5/8uy+XT/q841uMb3/l5fIDfz/fHqY2uz7w + Y63Z/OnJ+zZD317FG/8Zl9XX9VPtqY/UkLg2hvF94iGGH/Dhl8sX + /jepyS88vqHZIBtr9e1Gaj+/TJD7ACe+XdPgt14NXumUK7KDcy3/ + ZI/ZBKfn1uSyNqYPdOfw8rnjmcPiPudtNs35VazEqfGJvAvpWYsn + f+TEWCzN29/0mZfLp35BHkTmJscF8/j8ZG2/5qPb2xm2T/78y+UN + r7lcfvC7ju21/ya19IbYlHkjpv6bn+Y0Nu/E//7XFeHpGsdmMcg2 + 9XFtp36+ufCFrU7mZwg7r792ykY6Zg3vXEqfgJ/4wXCecZP86X/w + eLjyVG+Sd9/s+wbxEz792Nj80//2cvmeb8pc+7acZ348F9CPHXkY + u71m2wfV2oy15q5BH3IMp/HY5tDOLraNR/i6ViWGH/Kyy+WjP+lY + s3feff/VP3Tc+PuWWB7Fe64dhs/FeW/oVm76Ojw/Ev+dZk53TmXM + OJa2qePxYX4DqX/mQ/FzTov55zrV+nK+kevoUxef+NnH+ubG/kHk + YcZta+dZF1FS7PhbX4O9z9t9n41sYnNvUsQi62bnIPutocs3PiDY + M+enpvHjayyyX97oBd7XNpNXcvjob2wWNjbHNjGeOpDnscU+EuPx + 8+g5+ipnXYkO1wHWn94ARwe981r9yGjZy072jJ879qzrc03QObnF + kpw+29DIz7zQ3xjFDq24HeeIHNz5p7H1z1+e9fzX5eQ9CO/SNrPj + 3YfufO0b3nz3i97zKxO4j8nF3xfkxPEeTZrEuqCY4CsgibQpop0a + /PCWFGMS4ESr4BWmglRkbw5IizMYQ3jp8FWwfXoUU/VFpkW+sCUc + b4uFXI7ftAp48N4ZLf+8RslWvtneHrouzDnmVwveArn2TSTjM9b9 + dVyd2e/q8XYYMPreDpEbrORPn+N7J3FiIfYWjhd82OXyOV+ei8w/ + nFfOXnRD9DzwDZpvgP7BK/KE08leLrOJbf+YSxZlPh8JP1xsmKPD + gsoGT8vIVW/yfRux00L9YR91ufz23Ah+Wi78vN70jsbgNl36LCwf + 9Vsul4/8xJxIPis+vjJPvL/3eIo7C9xb4+PYfeNEGFsb12mXkvbF + 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 + JsEme09ukoK3mwSFJN/xJNq7xi2ItJKsGIpzsHe/T0Wiy83IFI8C + mQmpn20PKtgF9aSaax9uE2LDaUcY6t9i5P5ytT3XvIvtRqymT/H6 + LYCVoItBgNgjJjbxedgib0JbzFwMPIhqT8Dlb2yrL/SGun/sPvTT + 75C+4E88+GYQjh9ef/NXHjeDvrUSGCcuPvBF/ixOO03ur+NogfCt + cm8mg0EeL9LOU2a/D/LHMR5GbJubNAvj1E9vdhMXNlkExbwxzUWS + C6XemC+dt+G7oPmcP3r84YW/8+fzjckPH3XpYYYLCq++9gQU4d70 + iAVHQ/V79md+bD6WLzg/+v2Xyz/OU3Tx97vCG8WWQ7/3+aw/ktew + Xn38Nse8uDaZLhdF+7zU50ZODOamJXC1z7xywQiHiVpk35j56b/s + UFNzQvJaodfB2HMb+eMSYuT3mOzohevyHz9/YXcRTx7wIHaiidtx + 9O77+fJ8o/shH3m5/MO/cdwY/vSPH77eyHd8mrWsN9iJ46wp5opa + 2ec935/I/wmlP0T0h/6n4zUoNfwg8lcNvfa6zwtzrBcJWVd88+4P + zZgT18QXv0V8wQcl/6m3f/4dx8X3Nd9tx1ODMJrbtJ1/0X0WHMH0 + D9klZ46WV22scXESG3XoD6B87Kflt7d/6olfbTuxNz173x7vyc2M + T6w7IdK58w7PO7OF31ilNW/MO/PZ1jiIzbZ24HXcNW3iijX9bDfH + xMvvSz/pc/Mbqv/+0tftpyYfZjtb1Iy6NV/77XVaNVubkqNzHc25 + aR78PAzzJR93ufyx/yPrXB6ufdvX5Y/Q/Ohh38jciG988NRfn98h + tX6zhjU+BDi4Gg+wxeH64dLBseIR/saFHOysa9bQx5dPL4ttX/I/ + pN4/6zgnjOzDWvLiY209zzfZR/C7JQfy0PNM+h5G4vnxv+O4cf77 + f+ly+c6/epxr56awcyM1cP0Q8EGYYuei3maf60NnLKYjbb+BC/4Z + 423stl2vaPsd4Wv+zYE/PNUVZY1PYqR+Zp2DzU+5cu5vPdMZYWOO + nafGBsddm8Jzw/4c639btvl/sluX4RenWTfIO2c9mW8HybuZ9Bdk + xcxr5h5cIuf3Xq/CDx8f0fjjWB3sNHO4Oci8Oa/NFiaZ+rx8qZ8C + sciuvl5LhRe/fX1qq/3DvHj57SaZrlKO1R+ZiWlxgC/s81p9iewN + 3p6n0pYiJw70q3kPVdjRYbzJHf5JVv0Tu+jqt59yHn79I7OQ28gX + vs53czPbfGnSnEaITTY+9uafb/1NzLeH95WXj/pjb7hcvmJHfZfv + x8J3P7rzFV9x9+6Xv/yrkrDfkIjm658722NV2RHoFKtgD03yZlHR + L5l7cc2+GjtPXgvA2GBMQtfQDRx91Rv9Em3rhXwKgu53Bp12jv2r + tYDwu3qXLn2ddCnQIfK1MfExGfBPrIyR2XmMzfjITWiHD4ZJ8LAn + zl0AMpFGlj1Rd1L76Yrt1blacTNB2z9jO8iJcOx45cwPrz/jS/LN + 4PtfDeYQthuSv/l/HxfC/opaKdiouuE/REcZb/kgKyYjC8LrOn8w + J+nf+sUP/wbA4uEPF3jq7MLcD/RdBLtZ9buVX86Yk9OcmJ2c3XT5 + ttG3cva9SvW+Lzpyfot5te23xQ70t/+f46bwOMpnjN1d5svQvs8/ + 86O5x7D46nf6v+uvHH8Z0on2tot8r45+yhccT2Vd6LcIIrfj9PUq + fbYQ/U6wrYPsT5xHZ2UHY5PB1zkR2Tmhidfn/xfHt0YH+s1PMf+W + P3d8kwm3awGcsNVn+1fbTYRbjgg/gPzBisbBONzVamYu2n8iYht+ + 65STkdjPieZhsm6mfPPhYuHvfNXxW0PzeSc28fm0L3Nl4jmx2Pmf + aJ+tHlB4fdVvaG+rExjiIj4u2F71A8fvHs2LX0s/Gd+6zx+hUVe+ + HfE2gLXmmnxz8UV/+vi9q99SqqXbiG1iaD3rE+jsTx4mxo5LYrLq + bfUc5bzJzLrVdTZxc+NjTfD6lzcYfHsJ94moNkUWa/mzc9b3WsPZ + LI/aa7vkrhc68bu5XDijmytH8d0b1/VUaPDNWeeYpiMfnUsBPOO3 + wGc9uc/mxatW3NT/4f/5eNX7Wn63UV3666C+mfLb5p9+1fEXMdXS + bC6SnRd74Zz6t276641qyQM7deU168ZxB1/7HkR4FdNffv57X3Ws + Ffz8/8m782hvtrMu8OfNyBDmaEIicAmGGWSSGQEZAzKIgIDgLNqt + 9rLbbtu2bRraJWqjOCEKtooQmSKDIoNBIIDIIAECBBlCcgNGEpAO + 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 + ieXKEVmlh512YtCJ4wrnvc/ersZ+4CfnDabh6zMQroKfAQ2TcRNu + z1HiU9qReTqq4bPWPWIq9plObiZobTtiJbR89uI7n5Y7IU/cfmda + XvBDRtt0fvX7w5MCA5GN7dSRjy67jL/lsTX+jdPEdjtb9RljB3h8 + MRMcRrJY9jKfm54p9VbRb/rH292Fubs2+g3dpqGFv8VsfRT/P3KX + W3mKD6gOx9mdB97K5w23nZSRP5XFhvYmpau2fiwKTyTQn4sG7NT2 + HRz241OLXwshursSbgGG5hngmryJQ59fsThEG83KlmMLZAMcX4y/ + h9+ZnrorOCcTX5lUPuWP5m7Db1kxtmN43oiqnX7/0yPHL29yWMyz + twkf28xincn4/T//bO7sfsH2nODH/qltUn9+2Qj+H/IHtn7AXYtf + C+3enYo96DXbv9hn9bt6Z5A3Os4xm3SSsbcDdmJXd508+6Zveo+P + 3F5wdaY59jnzmXMxQOepB59fav8cA3liRhoz1y6SxpQk+X4D9LTt + bbabk390cMFIbK/46o2uQ+OcrviOp+2yRVh1vB26aPmRmV+9QdOz + Vc3P4aPSd73TB1xdfdz/uN39XX2S4gN+9cVZ6Kftfkf6HLHrYsLY + AVJljm7No2ONk4LI10l/YpzfyPqT6Y98TkE7cSHv3eOvN0+78T3Y + o585OG+LCXOJr/qbW1zRDdCdzvofch9jwxpLcxzc6avIQCYx7QKF + dLUp2nyOJ5v5PMsn/4W083fcYk35GdwZtRD83q/P1vCnbgufxlMc + 0ljHI5XQ7bba0MZ3oHrn3FzJG0Utum0F1Y49o+/zDnbmoHkG9D3z + KXbtSnEhEK/S78G5xuXz6Wf1g2OXFbP2jj1m3rWIv6JdPH6b99pe + wiNu2qaif30XX4gLAoshgM+0EQvUxuqprP7ZdYPfuBMXkb10gj90 + Gvv8mWJkih9c+d6KLQ690fWmMStV7oChXV32PgJfNpTXsT7nhyzh + PwvpzTmbHHcQTgbaA+djtL2AB5/XpEz0BZUjPMbn7MO+r0hsiI/u + HAg+euytfm2WczI2P/jiUFuq3CFXPwS3cuxyrTLhDeTVJ3McHu3f + 4l98zjB8pG6m1EfB05aNE+w37ePgTd9A9YqsUs9qwm8b24ory/Rj + 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 + aYcGOYobPLi1m/zgklfng4/6DwQGD32/dg6pj3btEz165/RkO7TJ + AshjC8rH/Zl9UMxAcwZ6eKnAU//SlrKveg/b0+0hm+u1Klv0oI8f + XduRxW8at/KKkH+Dg64FvI58bGVwsXX20mBt4LQdzmSbb/Fox7zr + RiK0699dDp0feQ8ZdtyxpTqOxafYIIdBxKDkDtz35Y6LBZltT2cw + WfbzbUIXGargIgt89MjZATHHdJ2r4Pjm75r/V7m+9Uu3ybGFgJcP + nOFdPnRbOP7iz23bddpWIzebiK9evdzjZOh2AIkvGy+7X6Zs6Ist + dV//cZmEfPr2gpUpW1Nv1vN69J/76c2+6vD5rcXn8M/05ZGvbZZ/ + AvxDbrz5zHnbV2S9K7BhjYjIhtn4Cn10LsWJdkfW850VMT79i2OA + Nh+ODhZ7Jhrermjb8Bk8jyRebGXuc3uRQZwboBur0Us86CdNCMQD + nW8CvNnh7X9H7pa9+3a37IzrWVZx+uKfvy0vnLELGjOZIUMnXJGB + jsoEIV9YNI2eviVp54AF6PklM7b5vWPk8ZIpLx4pjUWoobFk9ZA/ + 5u4cfvwE1w8NE56x+7nunMO1S0D/5Nkzi9IuyOhxF8A7VQt48Yf+ + vvGac33pw9P+504ZfCAOO6ENLj/ou8UNOeGu/kN34nZdDHQyFNpX + iQOyjn3qi7SV8QN7kAPNM0yd5i82owd89SjoLrJtcpfeEo2+beZf + +pezDfrfbvKjh3ZjMjr2rnh0I6cmUrulvDaL/toHQEs7auwEd8ad + FgZfW0Tz/uDrc57x5dtFvo/909tbSdlpBc+ivd37bVsp9fPap1f+ + Pyy6HRPMvcI1WySPbOLJ3akcbv137MpvB+y+sRD0+Z5LbRddz1N+ + 2Wdv7WnutMuvbxH3E0vJYwMw5dU3+c75tn6l555X5B1/+ir2Rce3 + /P7l39twP+T37y9COdnIjp4PTpntpi96/taHsI05ysgjXWE9n2N1 + Zr4DlwyzuIAzsb/SmWN2nnidPKk3/35/+oz5dqI8NtDP9Y5R/IE2 + Xfl+5lW9QJR8NP20sen34bOp8bzzR3XZHyQdXDgTA3TTHryp+9KY + fZP8G9FNRizQPtpw5NVPPCxyrHMLdcamU39NySQG1UVvFrltO3RK + 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 + CuhgLoHnCw3GfL7GwUpzjqVo4022Y0DM+S7WwXv8LY582mbiZmiR + xevtXb12F+wMj7tn2+p1XiCd8SpT5Bq/n8vnXJswuHaRGXy2dtX8 + GV++PWNpm+jEwNQx2Xm/j98GaleO2WjkbzvTtgLDW310S2c3CHu9 + eeLFB5Ndab0EXsFODpN2dYdHcXebo4PPMWDhtRMb/JFfSs9eQYSX + 32+kfakv/hoflwRJHtzSkUa/eZU5Huo3RpNvYJqtwys9dhZPQS+O + g9aJXW4LvB3WVhDzQ8PixBXQS2BByOb46itq88jzitR9WH5cccRj + jsk7vhj7DF13Br1Mwl3JM3ie1jN1Fl9Tv/bYEUsrtjnieY8J6oVl + /6nb/jAZK2902Oe/5A6dlybdk4n6+nyQ6m/85rkY8sTtExTuOtMT + LRdOTAjE4MYI9ga9qMPusxCMMPhq866UP+sZ23ZQzwf6Hhh64wsy + rf390K7cVWhnckqUzw8NNOmmD3He+qkjnXZTcs6jU/0X/KAWWmeP + cX3G0BYXaMN/OOS9Qst3/OGFEF5w+Yf/wNBq20m5c/z6C0778JyP + XFJ3mLzx+NKLUtC0sLbAbnuiU2Qk6/Bix1WWQ8ad7yqX4xXgqjvy + rWmKUhD9kky7g+uOr8/63PN2W7tf6T3+nu1uOHvM88Vo9sINO6G1 + VyivHMOVh/ah04LDPhbMN9rnG7fvJrpjBg79t9P+L68w713BjAHi + Rx6A77j1clzb7jahvLY+sQBfNTLrCw6ZyZ6CiQPtwfbMt3737Zm4 + 4aU+8Iycrem2UmvDAN35NNjEh3yyKpy88QV58Wlb3eMQ/qsC35i0 + Q8Knj87joZcafctTby8Yawv6LxC2bSfHXCnnZNN22o9TZAcyoqH8 + mtzpX7rwCu3aPjh2F3kr9vnOM1K2iT77u7YdNEP7UopfeSVdxCgq + X5GxOlFiAfXIwdbtWxKrYPK3s+X/8AnNo/0nr/RPtJdahw/loT1A + tvHvGm9w+kv5gZ88uPy+XkB2PjYeupNOfEvRHxtI0VoBDsCPbmM3 + eeK75Yvs8sHICR/A2/BdFXlaEL7s1le9+Bda9mr2Twt89YXXfvKX + Xv36cx+bzuJPxaH3xFEPu70VQzDFYR3005lMpy0obNnUwdwnCJwn + wAT4pSBvUAiumKr7tQUZ2sE3cK3BqeMwoVOe+du1Oz/FNRlJPSBA + TdSmc9dpADHayc/eAaIFpNOhHleqg4wOua/JEdzjPMeesTSpQEP+ + dK4HbXYKP43CQC4N6tFwq5PGJPMuQLfadcdFfxqdxqnRyCPvNE4T + LgsYHxS35WzssLKx+PL80b/6gm1gGbq+nTQNXTr6HHWjM/p+M4DB + Y3N24BO64jlyTloeIURlkylbgpxYhFoU2BaKxiXwdtTXzgR5nqdD + c+jCH/lHdrSVV9YGzp34Yvnh8RFcfOnzSDbdaQ/N5/3I9rp2E+B2 + WBTYcfjAYPSo2FO7eHlogtVujtsm6PyS6B5eUz46OGezXoGOvPUr + n+9gIeZukQXbpW8C+uTBT+fmvqu3v7FcWeaLxl7k6qQwaSc28Z/8 + No7wNuH/XX98eynKyDS8peLl6V+8bVXiu8NGoccm/D/tcOqhT49p + J/DuiKnYke6HPVRO3vmO8NCclF9N9mylDnplYGO609MxPaePmMk7 + ucllMkOuLuzCf32GZfRP9gY5QKdxknjxwh8+vARkUubqvjYpvke3 + Bn7O8efrtt+gWFBN26G3vogMFmJeVDPyrPx+KhcJXNBpvKTtoHUG + 9i5dcRm5216Di55+lZzsRL7mJR1Alxy2ib3TB925IDTxccHJXURy + jPxDb+isaeM7Phn94KrHTj/3nLzMKv0VWarTjndMaOkSHUZmdOGq + e9h3ZbYfjw8Gnx/Z4RGpi/boDW/tk+UPbceVOfXEr/zGlRjYbVZd + Ih//Neb5A41dP7KrC0Zufq++0bVBTJ/YRL56q1694BE0cQ/IoC+x + 88PLwvSfZxCDP/wd2yK7/g5/fdToBX9ipDqKydikfHe9hua0H2qN + XuzlV7+Gv50No4fqUb/QsTf62O3ATj+ZmPGpgjd6/I6wI2qD3XGR + 2H5JYops9KXb2le1ljphMm1SHHkTJPz2OztNb/71uYtL9tFnuXNk + a/IAO4Brtk+exQoah47BOeOyUcdqcsNN+xEPYLVH+8Fk6KsaFzmu + jjtv+Nrdz/z4tnX/vFsDrrtxLtBZFBbUDR1yoyk+8akM8avYkzft + Z+Zu6rRN0LHO3eldSPSZdPZCMY+fPP6e60g+IfIuH5ILEM/en/MN + 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 + ASk0Z1sk//gNTo5CYKOHxiMfs9l2YsUWJy8ssVXOQ/Nn8NyCt6Wy + f+9W/domS/HwD7ANeh2Uo0NpJ38vLs7w60n+kbk6hS6bVu+9wtTv + 1bfI3E5cp4V26rJHYU9XPspmkrBjbW2ADXZ8qfZEBrzAyDc4W+72 + /xlfmcEvV40/IAu4S1tHfbPuP3z39gC9rXzlH5ugxd5iaYxBBJ/N + +KBPyxvt3iLZfHWCX8ndxn/193M1PdtR+0bJVcHgGmBGh5Efidop + 8dC8MOokZadPJt8uU3a2D1sc+QL7bkCBHcZWfDdxe1/8CUauxmPO + Ozjxc3i5GKF9N3533Uprp61uz5PSST/jTXv8dQn6fKH2vtBSfz1X + T17tEFuIvcZT5MF2JiDu/MzV3pWXduJD9OrToaKeeezn+NTnIaAv + mv5zbdMrbW2ajuQB7ja72q/NnXXWRvWRaAE6srG608/KJ6er0fV1 + 6GijtQn77zZFh9/grAsYMoPBJ8P0h/QmFxvcBO5g+oRH/Rg798JP + aIoBtEuX3PybOLg2Tu3jiP5bvd2lZVUdI8uMJeQwqem4Fh3a5+8V + 2MQuCDqOXYtLDvqiPbjkYBNjYOrI75iDZujjI5XvopAPcI9/Vxvw + m2cxfym+a5/LWAG2mnGNvcXeau+X5RywCxi5+JicZGmZuBr9d/tP + na3m7f9olG90Uv++yD9254fezY9+W4ea8+QZz9CfPukm2rjQA27l + 220k7zc9dnseWtkZjH+22OsjB4ZH5U19sWAcEZPH2J/jkemwTQjw + I/m1H/6DM+Xor8fDh4zaWkyytfmFNp9pM/rdJ73DnW/ORO9N3vLq + 6sfjYx+E3zqB23Zlb/Lrs2tzfiVT6Na1fBL+a2yQa2RLyWWgY/Tz + ttj3+MjcdftNO50F+z0/Onc3v2X7bNPE1xSTy11GPmnchqe20BgX + 2+Ir5wAuGenKnmh1spNk5CTLe4WfN+2ewR1H377sZ3nChx+nrzrj + os9e2oY+sn0Vn+4w/Mgyx4rI1/aaeux6f+q2fvSofff6R2wHiR59 + RCF1Si/xDvQ/rxE52GDa+lyYWXlu2Nf/T7nxePp4GGzoIunYG2+0 + +2NrQu+wHk/eTengkn9gPZ68Fc9xF6mRAS7ZzAvGJ3zQceBhP53q + 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 + f9gf3mxgocx+FgS2qxi4LKR9sPnShNIk6Duetn0XzmT6gN0uPT/J + 2zy23YGeV5nw1N7hK47ILm6UicFVX9WqMxpDZ1KFJ0CrqPmH3iyQ + ynfHxbNbDMOfj4B6EwPK8LSYmQloY37vR+CLG/ZiE2We3Xz8PXfK + Dtc41jsziY2boPyXwvV89KdLn6HaZV7Qe+gFR20PkU0M0me9AFMV + 84+t6SZlC1sz5xyhlbfzxuI+MWmjTp4+UrtS7xIcz1OW6Wba8d/4 + 9+Czxs+Of9DM+eDNpJPcQ0u8kOEOmlDQugHax6fuTTA2x4evV9Th + pe46pokHE7mHB59d25+MDAuBo74yv0X/a2UpAvToLzS6JTb4k1cE + 9Xc+Jtbuzl66aKANeEGXCe7wWW3kGE7bYnTR91a2nb86rbfzm/Gi + +KmHd+vs1fRHaLKFNqJa5Uweu4lROMq0ORPo8Qs+lYXdgg/kjYwu + WMrH75BLFtqJj+mD0ezW45mWhIadDxaIZyCLlzJN34bWQMet0Gq8 + BY+vtQtjg3SF2igZrR8a9HMx1IXOkYvc7FKddlz6dvwJbeXFuUAb + XWOhxz3E/nnRhZ/FkLav/6JG287exytHWzo2XXUdXYz57LTad8rW + lC34A6/ixk4/+G+2Tz74Fu4K5ie//SnbOOyxDvjTTsjZHThJyTOy + rfXHpnABHHr4tU+PzBaDxr/OGza0/lfXC5W8oG5iSjoyLKjHIT58 + zjdnOMsnRmrb2Eydl6eOO2L8XHtHtnMdNEcn8joWh8YVdpGnPjkG + yDJxxEdoi3n1pAOlu58M30u6tizylm/iadr10FnToTN5pZeT4aW9 + kdcPjG5b409GdJLnB5fP9Bu11x6fU549KBnPvio2/btXr/mUF/Sz + gyX60PiXiH3owa2nPe2++z/9Xb/46gXPfnQ68z8dDd8yQZ8P18fJ + OhOpIJ2BsyaY6N7TNagERoNotZUASn5bhQ5khwZO8lfa8HoOX1Du + +IPbdAgk1ZmpYyAfOQ/c5DseWI8n75yOLtfyyTB01mPZk78e4+uc + DjeAToHsVS+yO/DB6vf4Xflu3J/Y3jh5SZZf/n+zGPz8bfull1Dg + scow7JqXMjw8J/To0J8BRMenMaPvd67fDit1AJvCmbryBn+Vb/Lo + 0Y4xvNvpkSG64gdMaL78r2SS/aJNV4vec8e/Yd7+766Ku4Z+tkr+ + 1DPz0P335c5htj56ucKvxCZ9xkuHFF5klk783qZ0+YjstUmKxbuO + tTLnWL7jQ7+dxJxLlYPJczwd68TvWi6+GxuCJDD1pO7cePvnd/zz + 7TmKx92z2b+I+7+3fLftgXsLFVtqbQ2zwHz8k676iQpvibwE3mb6 + zV98/ZuP5OPHxkN0pe/ERHWLLdhzoHnOM1A6Zi+6sAEZAFqNl6TX + IHwKk14r3E46OcmE1+RkFhDdRrjbimzixQLeQHTA0CTTzp8MfFn5 + glsdg0fu6hF56euZTbF102vsf+J7bz/Pc/D7rzjAsxO0Ve6Fjrf8 + weETL87xIpC2v8hIPWW94BZ7sw/9TChUgae89ReaDse3jtmPr9hZ + 2+nERcEJOlHm29Dkh4eFJ1udgW3n4oayyrjHQ+PI8a7HtEvnq5yO + 1/Mzj0vnaB/yMEBgpXHT8RmvFfd/jZXQYq9ZRI/tGt/RpazyTxtu + O84x36xQPVcdg8NOoyfZB+ShPfJ65ncm8YMzqT7Oc2VdJKTeJRg6 + /dQGnPDqeHpG3utXpsg2d+Wru7aS3ysyBtClcwBtZZe7MidfDAG2 + Gn9YEGibc15ZF91bgc6pbzFEd37El3FX2vhq611EK055L6js9Etr + +ferxoFcVCEzWOVFu3EaWfAE+o/yzfHgysdnBfIFte1NezmeDU1+ + 9UxZLzqE7sQE2f1WQLf4sZFjz/BeWhCqo/2Rd+42knnaTRcnoX3E + /8pkOcar/QN9dt8txcchnfq5leDV3tHr2d+dZwV/ers4cR6ffRvX + ow3kZ2u61Gb4ON4pT35TRVNwcN5sJN7x0J/x77t9yOVPTYj9H/yW + bSEt9tqvxC7o3qSe/Np8ia9hv8qz+hHt9mt7rDw6stWfJybqHLAf + w3t46llImv/w2zFOwYms9WXygZdS0X1i9uUpx/sMq6yO6V6ZolfP + xUd+E39Tn4znuspW2ae8uOFdnyY94munce7r0ZHnOeuO99Hd3XT2 + u+++TE6v/kVk/GtXT3ir5936wqdF6IcWJFofmnDrC5/5yvv/4D3/ + 6OoXXvioBM+fTCf5pFy1eMTWOcTBM+BP4DCDPM/nzba9oDWQGpQJ + 1ukVGniJBYOtANa5F1dQJ6+vzl8aQINbPtoho06DPDQP3D224Mqb + V/I6X2VM9cIa/D2OAHfkBbMNIalBDd+jlyHwzlNeGyxeGs/IDgfs + eJfk2BC2/3gZLAFergh6k+RHfPq2ZWQrufO/q2PerqUTrw80vsXe + a42xh85pBr9p5FKDYeUf3fbK9CIbHDRqi5Xw3Y6DP7atDUKrdlrq + uLL4ZZ+9bVv0yQnPzFgMPxA+vknkCqWfK8Geu/vxTNh9SNur2E1y + fzm/37hgk/HJyCedPH6dfD5sfvR3zLUtc5DzgdYXA3ve0JIqY19V + VqgtIltjWsFKD79UkOUZSs+0vd/vuf08CfQBn6HwkWMfYBYL7hx+ + +B/Z3kSrcz6D7YG2inqZAQbtwMOPjOw+8SCtXsFpHESeToL2OKdb + 8/k1xysundBCu/RH+R3vLNOl87aLxLSJEnprfJJNHB9Xx3M+QA4Q + VgfIkz0y7yq0XJ7tXPe8w9XVJ//5XJF+q02Xo/J+4KKL7125gPFf + C3gBaS9SLHJvJdv/3o3f7Tp16N9vxO2IbK9syqX6gU4WVwV3/Npg + t4Ms9tXvmqy4S6G/vgTd6hY56+vgj1+nT1BHGTrtl7W3HerD5FfW + 4JBtnWQN3jmtD8k68nLeDWASZeFR0/rHDnu7UqUT/Z1W7cVuCvrP + QQ5Px/P8YvlHZzE8baPy03GvU16xj/xpM8q8ZbcXlJJPf1Af7flt + b8nDo/Edmh0HdroWhPheAs9S28GAN5porDpMneaRZac5OJPC24ta + hZzkfsSS6XDwpW2Hxd7+jQwbgaUgh9P2p/8TY3iggVbpJqW32DUn + cFFrYqtxQwCwx8DI8pqvc7N9tNVL8cxOvQu424vsZBsWx8EN9lRe + /lM/eoCJje1s0w9t/Fa45Cd5N8mrbreui6/QA7XJbr8tZ/s/tmSn + 4Tu2Gjz5UzZ5a8oH5F7toG941renf3y7bZv7ij8vfPmZH9vGW/XU + Z/vyitzNi7zylK0yHbJErrlDJpX/5u+4zQf0P2fwsjkvtNHnoIdu + 45J/zshzPjxCf+JKXceg7XEf/5yTobRTPvEqf0DZIX8y13PHA6WD + RjJCcv+308Z/oSOOGo9B1p9wxSUYvmTXdlqH7GHQPie2Hh0v1Z88 + +JVvl2PypXQ23qPt+dfyDF7l4ks8dtmlPee7yGFxu/H/tXwa6hsy + j/4rV2/0m34664sgPvTghl76oaHorS+69+X3f9rj/sHVL/3Ko9LR + /YkMtvckOB7eQDBR0eIECRAIc/WjV3cSOEAguaLVDiDnAr1BkyDr + cwWpp+GjA6dXCA2cyW/gpU4OS0dgGvRthzNQC/h2BMlfoQG4ZuS4 + tNoKc4JggCzHAK9BRIbqszcOeOTHR33bLOfK50bh9v92FGSib35Y + lHZokqflSfG4CeB1v3novMHjrq7e+2Ourj7yj+cbZU+4qcaW/6R0 + mB/8aduD8895ZvjvE2cyrwOqc3YF4y/H/FUfxB5sMi//UTagLts8 + Mp1yO4LIyPboz2TloI8H3vkxhMWReDGQ8d+xJQfOzqAxkXJXGW17 + 9Hrpt3+/bJF909yleewmY+mNQDekBs23fvftZ+AxWHju0ALxZ348 + VzBfsG0t5Y/5WD1SYxc8Rm71TWyltVGa+wxSjT2+ZevdpiudobeK + yVb1f3is5aqP/hOblYO945sOcrGNuwHf/E+3ZwHf+j02W670LaB/ + 5ydvW6R+4vu2lwD89g/bFtYrnmO+e8ZX5MPR37G1OQuq0bGDkTi4 + BBEW7q1MQjvgpG2sQNbqyY70TaH40GZX/9Vku93W/JXWHJvki5s+ + 8xG/jY2UmzSO7LXtVDql5CKv3yV82/He4DdvH4f+kD9w1W974nkJ + fvTf5mr5d22Lp0vlN+XRc/X7nOPddnehor5EnwhGbjoz7Err6DsS + q3w7uyMGZ3ih4xg/9lKOfuvou3KM1iWwjU3/p+3op9QVMzNxZ2Nt + pc8LJx3AT1k/c7DromxkW/Ecw+9P/Ow/fY/j9s9T4ZSSb33xBjld + +OJz/Ce+a7uUrf1yZYk+Ny2ilR+T5J3vWX485mq+svFpx4TIwTaA + DinebBI7OhFrJlBwG6dJ0aCz54ZvisVZEA5tdhs4yyf/xjwCLcAO + XvoBnx31+bNVbuxINjA8Jy7IQg/tfnzpGVWx46cPLT14u11WuXoc + nnDxQqPxndg5aIfGtAPfHpwxaJPo9v8usCI7mqWz6wnfAkObYv9X + hJ6YJjc8/VW3Ok498ZLj/nLM1/V35DcXEVNdxKoXPzZekweHzOY6 + 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 + Dt//E7cX0vhkA/q+BeVOa+8ohA6bzmJjyDbeQmP8OXGonE7o02Ns + P/Yb0SZtfvDZtLZQP7+xCRpw20FHDvRcmfQSoa//wtw1/a3ZVvu+ + mz+CdoDY8LsE/C82bHvkP4sjvqtOS4WRebLWc7h0lyfl5xmwqkfk + ngWScrbUzr3htrzoRbHUh+8nhm6Cj/mT27OQNQ6k1L0mb+oX0LwL + iI/e5coC7Fr9u9SZIm+wtZ35G2J3b+IEKw20PV/B972LETt3UBzZ + Fnz6AvUddxJyg+z8xZZ9ZXzSM6i/yqFtgrvZ0+JNzMHhG8cDE4tz + vqZ8Z1HojowXTuhP0HBnZHSBvx6f5VMmntlJbKBJf+faO307+dzx + qttuL33VKusq2xyPbed8+PHPbMeb2CztIKrT395XzV0CsoHaJDZy + 50ub6Xlwp86ZpzpD0zFYx0C6asv627k7OLpp83OnTZ/JVu6OsNEl + aHyEzjzOYKwjNxnb7k7+rc7Bqcy7XdG9pENppN1qdx2TY0M+A/DH + flvOnjfyp5y9jQ/o0GtAvY47u731r/zDJms8srX4aqxEfzTYTH0L + PbYjj/OzLMNrpSdvcHtBi0ypC+S37UTusR3Z8ZzJMLxLdpIPlJGX + HhYZ3UJK7p02OveFJrvgRa9VbvV7xzd1L0HHodRZbU8+Phez6HaH + QPiMn9A/ZA59MWx3B/6rT8782ib5OrTU92usht6Pf8/VlUdTXESz + SF3BRds3e9vtTiLbT93ZRdL2Hrr6Ef4VvxYQI+fcUXRuR9Dbvs+d + dyLxM07/RGT4tcTBjAt4qUcv7Y19L0Lw8GEr/pr4XLceowWaoJtj + tAHbsp+xmPxTf8rhqC/GxZDY9hufHLR3Hke9yOv9G/z8itwpZr+H + s/9Ob+hKVzjqJ/NMG97k3VTnwAlvfneBpfG5t61HxkYvix4v3+0l + vtGEy5+d22mXkV+Z/Je+5KXx73fnWff/M9tMf+jWV//KDUG9CvXq + fxzN/9uBW1/967+c7aOf0+9LPfo1PjWD1ROi/cMbHIK9QR+T9IpL + AgMIGAHeDigBJ3gFuIHuUQmgowMNvgasIcOF0+cL0iA6MCyTFnQF + JFp+R0PbeTpvsIZH+QUXfgchlcEuRxtLjpu1p0NbXstbuv1zLujR + NbGSyOuAvuvQsp2nWiOD47vBh/z+rZN15e0Mtr54vfJXfe7V1bt/ + RD4z8Ae37aTnTl1n/5GfvnVE7qz5xpwOV0ejTOc1DXrkIr/OrYNY + 8OhyEYLHF3ynLjsfNNRhj+SPjYaXPHImuQPgnqG46K023HmR08LN + 5ybguQv2Du+7fY7BGzW9FdKdQxOks23OfJzrzCyq/H72J66uvutr + treWeVupAbCy7Dqd6x82iBwGvNEdnuO5azL1ahf6XjDEUZbi43i3 + DfRW2+XAy9ZRbwf1Ovon/tZNzuFzU4ruT2YQ/dZ/liurP594iI20 + k1XutW51WDLUB5Mqn7a3laQsfuN3MWRi28ncnrb98StInvp0a7zt + tFt2+udzB69zyvv/65QuXgXvcy5f/Tevrua16oePIohJavu4pIdv + 2SG/iYvmR8exHfnn2OSkNpB5gtqX3+WrfypffVd7sulu2xNqT/E8 + +tzoxl8DyqZtT96amtASoH132mMn+6/YZBpd4K/HU59MdGEr/bu4 + 64RNAIDQHfk9b9bzJKMfmjfZSHUAd00dq1e6u03qk+QNP35RTd9X + +sp2OlO3cqa+sczEG14nkrFHfceOqed3CUau4oiJHYk9xE1lCi2x + MjbCh51B/TWVtqzjPzuiQTYAja319ybd6so8dNnbe+UPPzA23s6u + n1cmtkOTPLttzrij+9CauMXbBaPjRXOhUyGTX71jDyTJz87yOhYl + BWIMPGrv/w9f7rj4dtG342/Yt/+zTWXZs1Y5z7oUhTD5afeN91O9 + /XRDDd7QkzG6jz/J3v5vZI/M1VG90O+3P/ELoKMtjh223Ov/2QXO + 8Jl6xULHj70TSx17d5ot3/+pW0jZ3cDYYGGAjjF/1ZO9v+tfZMx9 + 71xYfavrVMSctzP/1PfnWfZ7r5fh3b5S+49N2IcdAB/5Vb5dl3f+ + oG0HR+NuQ+t/Nnjm0zOGvXBTefxYG0av2ieYr0LFxtrYyaL6DIet + 0EJ3R5B/yJl8/lZ/8OHKm7Y3+Ue9M6OhHxpknv67j0Pwd+Jm6q5+ + WMkMj8m7G151oYxfYGIKjcMHBMlv5DF35KvG9u6zWej2Ik1kHJ6P + eNRv5Pi7rx7x8M+4etj9z8wOwwTQfxuw99j/bShLyzj3xfd/6mP/ + alr2yxIsfyBZb5JfWnJA4PZD5El7LsDk5bcGrOMGT9LmJx3o3Ya9 + Q9MRCUC/RuaO1MBFE20dSdJ24Ile58eEYxOrdfGbhtDBfw/u0lj4 + jxyT4mVftMYNV0emg5LvnFzdEpT86pJzuDp2E+JC8h4I2H9/Cdyd + +N6vv7r68pj9BT+1bfVzZ8dzhu4Ele9S0ZUui0JX8L2Z0nNy1X3k + WXDnUDkbzqAy+Ws6NtSBGMyOycJuk3YmqUBdOM6nY6x/Ql8eHmRG + 7w5IHvut9laH3dUbGdw1NvD56LDtKd/6pdsds7d459w5fJftm0Vs + Y3F4tyvsK3+D2yf9+Sy4n7K9fdMD9F5rTXYTmulA1zpigRz0HRgZ + z/r1HN7/x96dQP+2FPWh//3vvYBkMEqIDCJcUBFUUKMiDqAENXGM + RImKmkV40YTMc9bL8DQrL/G9RH0ZTFSiRsMQEWRUNMyiMg+CSJjv + ZR5EEYPIeM/7fqq79un/Pr//ORcBk7U4tf6/f+/dXV1dVV1V3b13 + 773Jjd6ECrI7XZTfLDLjwY8uetL+jMeMt45+3F8Y23ea3lnp2986 + toq6utq2vPJxVr1j+WX/kaHTHftbFf1IPngu9tTgHjss8acOSiay + /m8E+sonH1wkePxPjgsF7hwXTL4dlx5jAx3j6KGOW8aJU3afQvrY + 28XFJrQWBvC777V5Jky8aoOdnQH8Vkxjh81L82zgd3wM6o2nqVuQ + umXHSc705VkmHncf63+/1hdD4DtspO2kFo0WCMFr2vhEw/lZAGdf + XvXRjt61ZXsTunWXcNIiin6k47JX8YefsUk4E69o42OeSzff1XZQ + W6etV1kA3UIILzXpn7JsMmECSojUb+mDvrM5ME7/Nw7Q1wUQOnTs + 55mijjml+9m2rb4b/wuBPe/O9ZE4R0+lhwXf+VZnylG4ya9xkC71 + Jz4mL+hcEX2/P+fGfMd9Aan1rYmOe9p3xw2/dKlNctOfC3fVvwtP + fbje9em8oo+PQPPeMmpn+01ZBuYH/382URWL78ionc0H6CW/apuO + 8/OMPJ0dg3flrpE7fHvALz0V3wrxnbwGdDcIU9u8KnXOAnopO+WD + 8Ohl8qjOrz1tfKj+5lcnridmrPAnv3xcdPScddn9Ulg2SebkrbZX + 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 + 0Y2F0H5R25M6F8Bq8Z/+bn3UJDt81UQIUY1NqD6ZY4C+1DaeNliO + LyWXduhyg8jYOrPQO2YrrYemre1aFIaWuknO11s6Dr5ycIpv9edE + rmWDV+Nc6qhHLz4QLy2bSNrtl68nu2Ig28rvYncI+0Jgxb20XboL + 7S1+THso+mkHL2iKx9ooP02+tLcF5ugUFE39kJ/4jFbpcmLldIPq + 69Cy9bjsSL0FWs7Kwm8q07f8mg+EX3prkI+3muDnuPrHWDztRLlF + Ar0dg3pcIPgr0Hv1nfZTUG2kzbbTCxx0rZzj0sesp0j9PcjDMygd + hz6/KNuI/s+CY/w2rotC7hL2BaTSV2Shr5WHs46bzvVJ0VznZmSw + DbJsZ8rhcQpbR73kbb+181aflmcM7zq+/duPrGi3LiokpcO2fzTb + xqSeif+U3Hm8cRbze3jJ08edRxe3O24Vjo4MtK5vFB6vL9TYHxtR + t20g9za2fh5GEn7RZyfxoYqTE+dI91fTZEGbr5GxL6aVX+S87Qzr + +gxdOnHhsOLgglMEP0z/+H3Hw26nbCY8NB/0wKfM30/4fPhyTkcN + cMhwxcnv5Pe4yPgvcov7pScPeNGC1MgfHWk0+9ENJw980XvP3ffq + Hzq8K9Hvfe+5f4L6HWM0RsShGA7UgVGOQC6PccmXrgGs1cmR1vya + eHGQgDoNFbg4Uej2INFla7rSKkcNPmDwJnz1/cCcV2BKCr8GjrTF + +Ttodbm6YH9ewWWaRQ9wlTdxKwhWzbP/eeHHU37qcHjiA8cVtm7D + Igxf0uI3x9e+eNzBcmVRAMbrHm5757F99HeyyBRQ6Q/NVSf7On2+ + xyu9pN1V381f15GutJV339QgE5331d0VTz3lHaSO0YUDmi/9IsCx + t56E11tpIdHVlFM75HaV1eLQJye8kOZL7nU43PnLsjC8+rju1PcN + Qy8TefxPjDs1PUCkhaIvSAat47vsDbTbcjiugJr0YlA8h2b5RhDZ + jLzS4fQB9eX58aPn/EK+2XjP4wvCV/3qsJOeLOMDTWzgG8hb06Y9 + ci/837KQp+vCUg9tz6jxzc13wvcqtjpwQdEI/lnwyH8/XmWOnjrS + ru+DxCZZDdV+NxRcTTR/FnomJxbI7QNrx6krH/2ChefmdZZUgi7c + 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 + SURBVGOkAgCHqAlwDLCdA/7egBk7R+WknKmdQJ21PTicq7cw1V7t + 6fwr3a6jvitANQDFoWsQmjxpY3UBDgvPpMwVuRuGLt45UeEmL1VO + 8a7NFZ704MPhaQ8/vy2x+ZDWglpAD/+tk21QDmF3B7xd01s0v/o7 + 8zKU20yHXhrAh2fiTOoe/1/G4qbaSF28d3tLleOHJUjwp87RxcsQ + cFYJzeKbXsI3XDgVcNNfa8CH1zpSu3ihy/Rl24bygplW28Ep2qlv + 8EG/glijdp2ct2xw6BDtxkfbC0Qe/YMJeLnj9FlflnR3pRnJO919 + PNfpajQegSa8bRD0XQD0u71RMv+3TpRPu2BE+8C71ZllZNNQ3V3Q + bo5bf5tetkqXPqC70kFolX3Gpo/ROSpDyHe/02HjqN/+2jSZxPsj + Z7UVG1AOr1+CUouG8GCS13SOca8OmtqFl9OSH91abPH7lNNT0V+I + 8Hn1TFT5EDp1ISVpA3qIFv3ZRpo5ZZNQxKaetDoHYk61oUJAvzRO + 9dvIHn2c45ZhZlfytjdmMp8JY8lWzJwv9bZc9Mp3po3T4wqlu7RP + pCpDY/Kz4vUx/KoDbeKh71cLwky29kDXvsfY247pueqEp7ZFbSIH + l39IlTVtNKt/ZpvOTerx4G51L5xPotNjF96aV/WOQdtJlzmviVAy + 9JNYsdkoJHoCScVsfQNPWnZCJ1Fq61v7aILiOWnFquCj3W/uLH00 + 7UJOWeskuPRxVfSindYTG9qDNlpmC0JbR48uCG8/nrfyPCwbx6Nf + 2WH6Unt4Ike30+1Wm3DTj3TVdb04DH97aH7glU8GDzgH7YP6nl/7 + rMTHx4bZFforoPXmV4/FkvrK8Sq/6TV+lacsZEuX+qn6MufS175k + PEu4f5ZN/dtYEM6LfEUXr6nTOmm7bZ9pGdW9GKBlEm+BUja++Kcy + dNq+6ddF0dJJYhFZVzuB6y5bPxO6b/faX4t8ucMJut1qI31E160z + eWVfoV/6jP1+ILLyL2UVB4/066B8/n8vGKqN8LZC6Sd5sr3ZvZ7r + e/F4Hn8/bn7Wl45vFXpTt/FiD2i1b9geb+y1/XQPtom+6KnjLm/F + 7+gcb34NpYOclF1E/s2/G2FNMZ9ftc932VNoVV+mr5At2jnY6OZY + 3rnQLv+J7GSSt+9LTXU84XNFe9oH4vmrf2g36DeAdsWhlKGLzoo3 + sC79X5ttl2JBxeXYCn2jb7zgw3to323/Rwfg5YoY0pVXvSZnP5z0 + J05+6o2ZDD2sii//i/lcVsKFGoiRPOXct9/utzI4/YMsVL4qk7WP + j5EPq2Jcbdx9vBlu1KmsHCKOJrh4CxkH30PTkL8NNKnbk1SOUMau + 2el07aDlDCnviVbTXmluThCHcTWKBzdtQWOjPSurW+VxXleMKuBP + Z1vpdlvHUs8D9nfvun11mza9yO8rtGgok+dKMPm8SdJVxq/4C2MQ + 3usO3/e8TxaFmYA+6SG5O/HawYm6PVm4FL8CQ9ElcwY5dbcBbhGs + aZroaZe+Dcw+B+GKbUPL4DMKr33p6H8yqQe6L0snyQeClvKa5Kc/ + TESqT0Zx/S85pn7UVU5PrpLjuwYO9ciTcncJbb296SceDrcNj3vd + eb7DNw7x2N9ACvkK7iVf7KSCbWy3B+lmp3VKJzWZCS/F7+Sr2opM + DfqitoilAQOgcv1vEWVSoS6aTXeqpatfkK7l6pT+ogcDfw1Eod9Q + eu6TpH2Op+I/PLB1/PGt1q0+WO3eZGnTd/CB+mSR9t0Kx+2jhXTs + 3yorYfLjlzURDx+9xa50utQvfjP44Zce1YHTMimvxUDo0y+baj/e + yKQt+PyuvtPH/8mQOqAmWa0HMiduaath1Qm9a2cFbzj1VlztVqxZ + Cm0HtH3qAr5n2xvq5NF5Di+qzua765JF33k51U0/acjZZZ3+z7eP + Oyz0VbaqkYBzz4uuNPUJGwfid+sbzoqn3HktuqJbdk03FYeS331J + 9123Y5S6F0DqbP0620KjJkP6NvpVX3+UzYdA4Ye+fimfSP+rUzjR + Sbetrf0xGmib9LvIxp7l+dFpAx3ZlUA+7dvmjD5Qh+1a6cDb60eb + fq9/2VjwVKXdv0/KgsdCcbVJMtQbatNO9VfqWIQCZf3iJOfK+WnZ + XtpSjg/9yDdWY6LDpmfRXsYGZepe3eIjslScjcyebf7y7xifAgrq + Bvr6R/9RxrzfGlnVJ2jOvnMI0KY37bbebF2mr4r70bfv0boD2HyM + muO/hZaF4pXRoT4u+qkL0GifVPcY7Gn2eem4Y0LkpovJfvGBVtMU + E3oi7qKKfPLqWyD9pNsff5GK8muyIKwXqdBv6rE7+mibbp3Rffdl + 3UELXVuZ0feYRPlXy5m8s6DizeSvZTiGq4ztu3t3+88/HG5x29NY + Fnm+J/jqF46dEGtpyy7ukcUbwG/5Kef7uHG18eyfz3P8rx39rc9X + u2u8stMpa/mlPjkGoUcPYhS7YqfsoON28RWc/M1/Q3+lh9Bng+rT + vbqgbDepuq0vNLedaOG5+jtyKkc7qAPmCXuqflIvO0b4nzxxo2l2 + lUul7EBdvPZ8ET+eaTbeGOfYI112P6DpWH+UblLevq7u4Yr3p/yl + uTP7/aH9qJMHvToOdxlWDcRjLsMxDcRYXnju2z7xn2arxDviOPdK + 0L1ZjDpWGigDjOFJDabSdkwpb2HMAp8UwDnLKYpO8EzCytGnQctv + g0aDUaMvrW2oqdN0Oz3WVgWgFFhEcBZtNO00Uc5tYWJgcddRMBWM + G+BeH0C7ttihL3DQBUh9QUEqqJhANTTfpZuUS207tSi8+73HILxv + X5D4yvuO7ZO/+NCxDaMXV033UmnRnHzRC/70ldhWkAO8+NFLbX9M + //hQ/Lf9s8Phkz+rEc+nrvL+8N8fW5/QF5R6gs4WGkrWnGgzaBX0 + 4K9yNg6E4in/lOvLmgBM2t2XaCt/8a+MLS43v/r0olU58Izmsx53 + fkGoTrUV+hWAQ58tyOtnUjZeUl/bNQClXD+og4YfaFyp/i86gnvK + DHK2vF4XO4FfvqGdWbcInPEvaBs0vgHHYN5907w0D12heemBon2A + YosW/sNgLVxzvNYn46bvDJ76E7v4aV9vGt3ePlXev7VMnjbR0o/X + RRaKQl9Z862MbH3VW4Uqm2nLgze8rvwjZnDl072Ft2wqdYtm2qfH + VKs210lesoZ+kvYA3XKcaiPlJjv6oiblKk5wx/pmV2fCG9+oRW/a + bRpQ0CFvksG3g4tA1Y08qw70HVncxfn4Txg+sidhu6iLEeTTJj3h + V100N0hZ+VTy+VpNOFJYfM4+OYWvLD/6Kd9Em13GzntCW7STj8YW + Eytz92/lYxZ1u/QqnpSdxK+0V4prPL6WH5uEW4tU/Dbajja6oOQL + LRM/diQm2RZaMqoTPDTpCxTt6JDelBmHtOXiSo0vSeU3/U69Cbee + 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 + ohk6UvoyafLMJ1nqObZJD6/orva+b2M91yfdT/K7HRNUfuCTJD7y + XL/fGWl9CDnt150Teg2gU/2btGUtn0gZfyy6SfU3Peprsq6gvrp0 + 09vm1vL1uPp06gNttEp3od10k119S5d4Lr5TXtuZwwu+9BE58SM1 + 6KHX8kgb5IO1vZItdCofPfYUGfGnLlxtVLya8iJZi/mcm0Q23UHl + /H8Lwre/+bw850sO2zO39fwoumkHnaI105ZPelHoesFrGsV/Knlu + 9g/9sQtr05dntGzvIw97Y9tsiQ2W/qT5bT4f33VcsSp6qn5K2+03 + ndrqBke/AT7f9jxy8j+Nbm1g4Cxo+ilv3VR/zL7uWMTu8Fp08dy8 + Rx5ygYpVqYfv1lP3v1Q+nNoqGvnwzZa1UTppmtGB82o75aWT1FN3 + rxMLoooZWSBIi8fBTtnvC544LlZVvZnfibtLn3aXsc0dv3jcxs0g + lR3OvGo7x5tcZJl9xBYKQsPdWvx2XJffPgKvdBTbkNKzPuUTYppz + CzPflHORbw9s6nX/Y9QlpxjUj0tU36VCd7U28dE6F4u6LzcbDA3f + W3WXEO09wPe9vJvecpSg1f1Z7YX3swB/4q6752wTLTaEp4on7GvK + v6dRfZGysu+0UfE6tEzE2+7cGbOltsayHQEvEnrefx8Xa0vW6IJe + 0NUmva3xgEwV2yKffLhtCxXD5Qe6H8fZhf/1Ix11X3R6sbqvf/l4 + 3ALPe/CohUW57yWDbl9qB4Q3xB771IT3Kni2n6wusrI1/eu8eIqM + 0u5LPCuD4/gs0K5+7f7Qn0V77cvQrTiFyNJOt192EXuoRWVoOadw + 6UrbMV70S/dX0W36M+WDcPDRfth6wsKlQDvmNewITwAduqETfon3 + ijPBYcdscOM5vLPp8q2PORcbf0PKHpTMf3z4mNu+KPP4iyi0Wvuo + /ze1/lGvh0sq4OQ/vDIWeXjguW/+46+JE/6tOMw94sj2R51swQGV + DjyMUgATmAwU3uDIWEE5CQd1kn9wQE0kJs7IGf+bZtVj9Pk1fW0A + zlQQeo6DUhM5kxX164pKgkYFEoUB+e2wfQwvrJfjcW5XVovv1FGt + HV39Pay0uqx5d45nvBlcyrFDW0ArCC/5q3JBRwBwRcgAafuorRgG + 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 + A2RsXx45+/+/m/ZfkN/3Be+JJw+6Jivwy3B9NRBvuwwfrAZiZK8+ + d79P+2cJCvH4w7fld4c424WXERkuZ7Ko4jAXxKfkr87PkSoSn/K2 + 4WCY5DAFSQs3eOgWjRRUHgTtzR/nNwitHqysnHZpx3nRT7rSVr/w + Z+AqHG0cg9DVTtMqOsna6kyeKj/HBlG87oOSgNm8aEYQ9ZYuL0n5 + mr88gnXJpHABAfvP/e0xwL0igd3iUIBqaL6an+ZPeZf1sbTw1Ken + RS8WhK4Oex34ftB218jHaXuL2kbHQaDb6ba1UcfaCNC3w/0zm/rZ + z7MHXRdiqs9/Dga4I1NbWybNzpe+IwtCA7V2RuWhI3z0ZKD7pHib + /LlbpJ/YGr2uk4iV/tHj8IHnVU54LTsZXBDZ5DpKZGTCqYFv1jdQ + 0AuoNqadjpzxv+usV8AN6L0AKZ0vunLePzw2OManrT/62WQF7RWn + cdeUDRa9pPRX/qovd3WdN6w0V/9oFOUrTtVLIVxyskv09BN/6nar + jeSXLSXlR7VFJ3EKPX1Lp3U3I8fole1NPex5bn6lL3/emCS7u7HZ + 0kT49C8aW6tMDk16io9Js3x0yhOW2ixnzfNJy6tu1Z9F4oJJ2bG7 + TuR52XPGyyCquW5nodF0pRvdQh7yl5/lfG8nGJW31qvjKQNaTXs9 + Pi/R6SN6Rq8gdR3rt1WXyd5g43XmbG2lz2rSNPtu0ze8KVfZZNor + PLroInap3sRTZeN95nW7aJyEx37BTNUJjrT4jk2xRT7jrYMWBGKn + O8li537Cja7PO9g66TX9v/c/Uy9+6oVkeGrdOO7vDuJPftuthd1J + +rxtFm7xwFdz3H6vHj7rFx2bKDe4k/XF35A7ddkieGwb5BtfFZt6 + 1nh2HU0XTEuBSfCCZqetK/y0HXWe9uA2yCfzC5487nYfex73jnc9 + HO72TeObmr6rqd+67ZVWZYc3/u0OZ8dMbRQe2fUf3crLccWl9FnB + 5EsfF++dLX+W3erTDocv++bcHbzFLNwlr0w/vjILV3fF1PGpDf2E + 37KdHNaiFI+JV3SGB/FH3JKyffkFqQePPHg2tzoL8DzZPAvlaL42 + n/GzmdF9YWz0U06j2AFg267F+FuuHWWffY/EteDt5yN0/LwnjH6C + GXbrYjq+AZnYjm3NK6ObvideIZ/xr/ptCqk952h2XxZ9ddFKedNe + +1Px3m6K5KSnvOiELjq1oFTmfIHSd3TeslRbC40FdTtc+Xesr7Vd + F2g2rBwkk762OJjztuGiERRptJ3fk6PTf3O4wXUvPPnx16UzL8MH + o4F44mX4/Wjg5Mdf9o5z3/W5P3D43bddE+O8f2jcJUb5h3NcllkG + LLhwDIOKgNGD7+aADD3lJugcSsCsbWjBHQY+DL/xO08dgVV+BchJ + nyDlINNhlDdtW0ebB3hNs+tIgUlyB+IrE3jrzuXi/PvAN2ot/2fb + zWu3Qyvvj1ObFJigWmCYtKLXPFc0CCLnrwF+DgrKDRw+XO/FLX/6 + L2aLxq2XALE075kPz1/9zP+XrSrZ1lPyhyeAl25L0DE56In9wDiv + 9z6vIBh90x++Sh8ZiF6Rye/tP/f4FeS7fPV4kPwluYtogEOj25X2 + sTZaVjgGuhrsWt+T78ILD/ilO7hsaX3AG82Gz/ji8fxLn6+p7Svq + r5MxPOj3ep4oOlduEgWwgDT6Lbu26RIvbPGSENyWU12/hu6TGnQ0 + dAbYaqRe+cfkTdtXpl/KzyIDnmuRFhob39Hl2qb2aktS8tlgbZuZ + 9Lrp8oHowzandaJoQIJfi63w0jrvtOvvU89F0Dfb14d83Z12vKyw + P0eXXor/pNXO1FEv8rpO45rM4lEdedJ6/f68CFD4aVeZ54rIYoFb + d6XDV7WR8poc4jF53QZe1+OVd8dve/14MYa7+Pvt1Ca3X5RJtgWh + LW8roKmd1g9bOasd/IkZqTJ4Sz0+bzs529iDl8m86VUjF022wqDp + SNrtlNzJ6nO21Trmk2zrmI22XeO9Jrtpg05rcoPJBbqNJevUob5z + Z78B7YqXsUUTZH15wEcStJrXptt5vegxYa5teuoB/KiclP319kv4 + aLdOoB4DfYSP8rv0wbrQWvHxRXfoV/yL7dZFh6T0763QnsnyzGfJ + tFT23N6f+T/GM2cvfdZ4Dhi99kN9Lw71mKoqvshecrOdnKsjD490 + UOPMxPXRerpdAb4+08cWXff89uMLHfK4y+kTBOrQpbgpZmiLrdRi + ZuqpecNz9xM7IbeX2fQkt2QMLTjupHvJDl0cW5De89vG84u/8qjc + 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 + VjCbdZo2p0OzJ69or3R2TVxwWlccw3sFwpS2c2NPnoBRMoSXwiHb + jvfN8VOn9QLHFe+N71nHa50flUWhO4WfebfjA5UPsfschavrtta4 + Uq062nTYg2ZdkQuPoPiW+gWvXkIAPz+ZLV/O6puDtmh6CcCxgdJL + cO71t3PH5K7j6rsX3diWZfDM2LH1Tfcl2tpvPeC1dSRPX5rIfPwn + jIWg7U2upHuRx7H28UjmpzzkcHjRLyZ2ZrJQ24RiA/qLTgXkkC7a + ZMQDO6Rzx9ovfiZf8upKYHDZSm8fk18QfIug0nHqrPwrb9lKnznH + Q03ECHs9oOoFt/nSTl2FTZ7FQvUlWpNe41W96K/sO/ydZMJSvIVH + eQZz6Uq/eUeLX/YV9Um6uDUo0+FZ0P63Dd4TEW00ye/nzmTrBIp6 + BtqrQrsWuMFXp+glv3hN20A950Urfdeyr2Vw6B4NuPTW/dtyli7j + p9rofuqyPkdT3nrOj+quVOTQ9hP+69jydswv3NH/ur8SvPDijYr8 + 2JVq9EpHUybtnILQte30Np9+OHzrP8lLnT5/9McpnJzwr5//0bEt + lTwAvyWT8xzrR9sq5edv/Jvttn23XVmgXqx/yQG37h6HFPsr+myi + 6eeQbJuP5HwP5PdrfVeKdn76Cy209XHxM2mnuPpf/6bryhfyKa7x + 4oUSbrSEnjthd/vG4y/DgmWB8TXfNXRnS3zZI54iS9sEXyu7IR/A + wNKOLKd0og7oMe3UhZrkP/6/jLjVb6tkR3uwCNHn3troIoLtxhb6 + 78pEsPSS9qstfZBj7JTO0rY4RFdr/7l46LMXN81C50u+aXw64dgu + E3yg743Rj/mh3IGLnZKj+1ubtjaTscfX7kN1G8rGKCS/wl37MvKW + LlMGBe9lA/Qd+t7S6Tu8+vz2n3c8xhtjXBB01/dJDx4XKb3gycVH + fKF3CvCBh+QX32mrL8LA0wcuZrrYaNuqRTk/1s5Z4A6zhZC7udti + aCKfuiCWPHK2HrS19nnHsY5VSNCDfoC3xXYFlwDtNKhbsTb+wxa2 + shzQT/ET56m72NNe9Ltn7t2l3T8rufLcbUjf8Irx2attQSxTX4b/ + ki39UfYYfkD7+jgb52VDkbmMoQuWFO/swUVE/QfUcXxl6l0yxgS/ + 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 + HvlLJ6nQ/exuAJ6Kj+iT7zWwGzzVJG/i4Inewcq7c7Li82d/JMep + a1FoC3zpEMIOxMHP+fLxs1hyF9NFwbe/eSx83Dl8ZxaI4rwYZRH4 + sYmfN7/dsCH71gvtAABAAElEQVSLQdv7m58d+e2U3J4Fe+j/Oxae + +8kumW131OfGcPKqQyDn3X/kheuc3vSnvvRMqFjL5uigoerJSD4d + WKShawu2BYXv7LoTWM8UBmcP2vOMm99XhM5vvTEXH1+cRcrrx5jz + rndkAZ3FMx1pw0KQf9IRvajn4+tnfcd23x69P/Wnc2cw/ffWtEEY + POhLsr67dSE/xd2v/IYNNR67lrfml46jK3ENnlgGanzVRvAvBR2f + 2gbbVlc7pPPqp+hbnGc7eGMjLj6463d9xtzfeku2yz4pev7NcBWa + AN2KjaGFb7Rr7pMy8wo6aV7ISNbyncjq/ExQMVD00YmeasFJR2m7 + 7BLCwkfRp/fwAMQzcRCpQvNv0lWOJp7V05f8VDG9KJOvT3qOqc6l + AL+tb3GpYnnarb5NWUgXbXSGXijz2WkrdwWv/KWTB78uA8P3KL0M + HwENUP9l+Ahr4OShb37tue+483cf3vebL4w33DdO/3lxioxseZiC + 8/sJlDXYJz0T4jicpCcHBgqOypsFUk7aDld5cVjBBz4nlg4nG065 + ttP5zYeAyEk5fQcA+DVgrRXPON74WMo7OCtrvr1xUn7TVaZt5d02 + npq/hVwdWpgpt13F1V/PDLqDhuc92C5lQDWReOmzp74W2sXDDIor + /8V36J2LPorvtFmT3/Dd8JzHjUns1//VPG/x+WNB12XHUos8v0/9 + k8dKP/Q8W1Z+/emHw0P+5XizaPF9hCzbIzcZRXu69FsHBtVWfTg2 + kFzB5tjvtMGqO+nU4B663a9oHIXgtA/04HUMT7egxTbwhoeaPKRP + HPMd7TveQKU+T1plyYNb9s3GgqJ9E+jmFZ5jP5O28p2kG22VJr2u + s7V55IAd70E9F3MsBiXdPhlq4SEv+q3JUFJ+zL8h45dYFqgmOk7g + oaWO58iar+rflOnfii9oBPRZyR18fu7V8mgXH8Hv+oV8kX/FL1uY + /d71OvUtMgs625p9Jgb+Hiz6vBDJD9gKaFLloggfOebLA/P8f3dQ + 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 + FR4+PeMcnzv/sybs8dkxjN2OxcR26NYYiC18sA6OsTf85sj5cCvl + D++6IjvjHP/YnPMjusKvLX+nX2MHLvVH49F+k0Fxc/Mr6cd/nvHz + PenDN+c7w790/eZ3B0h+GfmePm4ikBF7Tx+PEbj+qz/lUdgP3Hzz + Z/39q+ee/rNZnP9SJukfy0T+otTnkWhmtInuaaaEaNMtUd1axJfn + e2Joko+Muj6tzyI37ROoJqbM9dFLRoKULJDkcyb/1EmMEv0k0DJJ + OGnrR1lytvDUZngtJqj6F/5JaBZiydVHtTwR66JNPqBqM3LzBHZw + T8JzTdZTxNENN2yDfXhh5aeXymThE8PHJfaRY6MYgw/mbj7YyFH7 + VXqUqcfjHThtfVoa/4tl8eEpllzTqz/5yf/GtAzHy45BGZ/DDXdx + xM/BcYrFLl3iYfFqDDfb1RmMfWpp/OjHkDiI+dhUxwf94Xt8zq4R + /wZHYxg5fveAb8WKTvpGTnnXf2g7XvF0/KxxdY5v9ctuxDvkXFcX + m7GlT9V187GeYpdnDKS9N9yJd2OeM17j+HIME6Gb3uG9xDyyYj/8 + cz6xAbuResctUrfGUX1f5eHphiCxnjErvpc0/d+NmPGw+lPfi/9s + otUzX18WDuUznxhT8bkYL3COT2xXJvFD5qtxeGt810ghX72Q+HbM + imX0j69kJxY7HjGHxybVuzt8ah8RWFSelMVixpcm+gbn6G5dYtrv + aonL6lexoae2Vad+ynQhsubvPKwSZzFsHNM2uM2f2kkdnubk+CAv + w06H+lyWjCmx6Pg2/szByKLB4HrKxq3NNLziTSd9t8Yt/Kma8er8 + Ir0wL930l+hOoTYSw/b/jBMxh2mnJQ9z84k+in5Y2u/hHawj5hre + HtE9Dw9v4S6IyKbdOL+Sq6L3UtfobIzFN8ceH2U07ccgX3V4j2Jf + YUYdk7E7NHjZh7FjEO7F3+vgPbFFqXG/y5Etf+TRIxiXPNsde9F/ + 6jtEHnkVmz5cjW76Jn635JaDjWP4xBKOjtMVqype8Z554909WOh9 + esWpcYkOunY652F48XtyyU14er2V55q8Mqz7oX6n8QVv15rMl1tj + EO5Fxl0xBvdgnzFYFthCg4EfkwfFY9bMxRbGMC98fOz4iww7vvPa + eFdjMG3znBxe/XhJ44/6vewGj17Y2Gr/YMp1+eDI5YwN58Gjfdc1 + 5fGTmq7POXfMxNbwtC39BH9tpa02xu/Uz1h5MU+SXnzh3Tl+Nsx/ + O3PtTVef+sq3X3/newLGd9vv6eMtApfZ/OMN/yc93ky+ZOqr7735 + y1/0g1lw/+3M7P8o11+T4wszyV+VJHV9/OrhShhNpLJzEovynjya + VCTPJCJJqB9vW4khEidVLolikq1FKCLVJ1l0sUkd3d1kpG6S0SSe + 6oiMpDYY1OG3qXKGB84usPRJTit5ObPbxLxs4reh6YYiQ7s2GFg0 + 16psmppwlz1y2odOXn7GuTOh47lD58g5i0ufrIYP5llc9l/84/Ot + eAfv3BDuus5y+C04dNsAw//AR2FSt8E+fWCXf3BjsLhZ+PlV307F + KSwsxRQ5+sf/YaNr38w3HrAshvbzimU/GqzPc7339/PRawOi7xqj + nGs7Z/ZQ/YlcKcrp58udtPzCRJ9xQk915FzZvFR3zh0zsQ+TOviM + H+PF9dQ7s2mj8UGYo9tGoboBIbvOTvTqDze+ygzXpmLKFtcuohUi + cbRruywfFYfctB9ch0z1LvtjQ3t5o+/yJn2XnY2F+CjPO4H867yN + XrGYm5LRO76yQVYsjIfOH1hSp34fiLBNP+PrHBDrjEO8l76xVQx5 + t2z6sjgtUQWA44iBc3VHbx+mRB+9xZ1YD7HRMZF2KsRmCD7tc1av + zGZv6mIXu7ngTE8fitylIzIjd84R+pbOnEq9XuVRQ47dg/loPNvM + obSJbz+WN+M72CqzdM3JmDW/5uOa5vvEe2K4x51tOUj/TByvNt1j + g8z0JT5Et/VhHhAdtQcu/OYO3dUfGbaa//gaGt3Kg0F81fdd1OiH + efj2vvIAS6fwlyza/Toq+lodq3ScBHdheKR+VdRWysaj79vVl9ia + PKTdGIXNMfOgfR85fixY1YjHfGMWr7E08d5jUmZ+0bF860119Lne + ic5Ln13TT96Y6cODJcT2+D3xhgPpy8kNrm/pjbLB0nmZa3FhxLXx + hh8epJ89nNkfCBbr0XxgS7k2lswj9qJ3j/USrY3h5Z9x4thtne3R + 3bGZ7VHz1RqDwuLudPCO7vHxjEn0erDcOIZp+OkfG8I3/cnvzp0a + OOS6p8h1+ckZQzm/FMIHi3PfvU/MH9GXtrMPolt5xkljvmwpO9pv + Mc4n/d13FTcZ44Mfsw8hY6wYq5P76Hj6mRei61dT95bkmu/Nv6v5 + 7ux33nr9Pb8W5vvfjHkp3fty5cnMvadPhAhcf9fbzMS/dfMfv/5/ + u/rQ838u5b+Y41/LxP+ifIbej8886KaiCcbilMk+C0RKTVaSmwTQ + pPCYRFteiUbyyPCRNP309gvuS1MvmTRJraTODpsOJodcTxJWRuWz + EOawWbUQP5sEBY+PpsA3JLn6SXh19SUNFuR+x8GCFRq9x9XCEBCz + 4Z1/4k3XvnFqIlyYmxDdDEiEweGaf0N32dCmfuIAvxuovnMJm5gs + 7HjEpYty/J14jU/0tC48kjjsFrjzJ6ajR4LH45gbAvZmQfEdGvqH + b8c8uqcv6y/f6YUzZUTXhxNfpG1+Dn3a9ZcY9vs6K60MJripoaML + y9JRWbiDX4x6gxI9yoOrcYqcOI0tbaXgGF7X469xY+E6+dJGj5iM + nonFLJKje87avbvQeMe+mKNu+uBzsXDQ2zlwx7ioX/F/7NQv8c0x + 5aqKrrEtWMZ1N1saQ+TrU2zjM0dmM3Zw3NanbvQ7O7rRTh+N741J + MMPeBynBWf82LKOjHRid3UjkDIN4I/3mRyrwDmkXazxjm+zoG158 + U9Zv7KPRDfO8q3a0HK/am69iY/8XEnyiExWDOOYQr9pZsSiOzOXh + 7XXkXONNmMvvx5ReGZl+tDM5iK7Bi1e5uSp88Istqm3+h3/4po4/ + 4g2mOgW4u3E1ztJm3HROZr5Xf3TzGb8Yda6MrYiYt527K97mOz5j + ZmyErTT49YcHAOyxXV/4Hr3jxxKp7Zk/zSerX7SPPuXaUhcd3mn1 + oGS+13VnX8YfMWJfDMiI48wtOodGN3zm5Z6rhscZHry9MdNf/End + 1Hfcr3jNuMZvvE7uyGXlxE+dtsmt9NR28MLeOIplDnoaO/aiw7WD + nT54ChY045vMfkPTxvDahNONj61Lqs6LSnV4O35jx/Xj+pJuvNak + zsuFa/ROrPhirOoX/2pIHOarGx487PONLbqapzgfos9DFbmq+Sox + E5jijDwZx/Q37MaC82ChB8117aRfZnwPVjxTxqvf/P9KZToRfOrx + nZT25qrEBEYPOjpW4bqDRnZylXh4YKMvG8td95JvHIN5x6dpfLrD + TGMkvsYAudp1Hrng3uM0uHZdYsU2n8+8sXDQy+9SlOI1HvY1vP0b + hueD4/omAbp6V8bDz8fXv3P19KvfdPX0Uz9//e0/N0oOVfevH7cR + yCi5p0+kCGRyJmtf/c2bb37992UWf22SyF/M5P3jqfsDSSyfkc3f + 8X8MH0namfCSoY1Gb5jW0JiENclmrgVNnSQzC/p8rASPRIIkfsmY + verN2eIokUlIs7jgJWchxIu6WKYsmflIk+RFDrE9WJxda2OP7T4d + vOCr4Kpjg36Y/Qon3fvCRN/Yo+9VryEYzBYrNmLzI9HwwDUfU5Wc + B+vESAzVNy536B095MQQvZj7/37pPbEZndrxdrENxi4EK37Vf4g+ + 8jpyNiawwKVPh8b+vEuhvYv7hpX+jil+LBq5wOqmYuqdp62Le+zy + Sz+37yNABuFT1x+ASB+5HtmOoeDsQpe+NJ4+lLgUC10LS2VgDq/Y + ID5rd3ag0TvX6uBS/6HYrv/RMXLc10ansaI8+pTxwTbjmD71aGw4 + qxvZKVcfrItfDBwu/cDEPCCZMUTnqTt2beKmbuoH49ES3IlJ+zI+ + vSI/WtL5ueQG3+AaXerhwOuBin7RWcVHdsl3DEY/ssF4ZBN2NDUO + g49usUKTG2CmG+2Y9CXS1nck4vOMB2MT0StWdCC8g2N8H9valeGu + T7mm169wdDyJaY52yeqTkeHzfoOmk+Yd4z3mysYQfX5gqf6EdzC0 + L8Uvdb7X1zkWg50Xy7Zcam7CRs/I8gd2Ohrv0R917AzfHkP4Ozbp + js5iW/mXr0MdI3X8wHLO02FY592GspjcBId39OT19mX0wo2G/+yf + 1MMz7bewRt/Up9ibKDdYdDRXxe/RN2cxmfVEbpt6Y6tHfMYzZE7N + nHVmh8yc8e2xdO1m57yp0nc54CSvP4baN7lww4BHvDuHxXty1dgK + po6bnHd8o+tJ5/oYPZMv4Zi4kdPeuRMM+rHzAQ/si6Y8Z9X6Ui4r + 7mA2JiaeI3fXGd/c3LpBR8WQ2FgTlentHE9ZnPi+x+6Q2l63GIsl + HdMvg2mu+YeKO/acxXto+Nhz9IbRGIy/aGIwNo7a47VzPtjJGU9w + PxX9I4OL3GW89Wn5I9fBdai787X+REf+bukd5vHX9ZR3++Ijtsbo + Prdq3/gPBnLNo/G7a0DiM3Exdp56+gNXLz79jvD9dPj/16sXnvue + q2de+KXrN/po6D19IkVgmxmfSG7d+3L9nT+X1e3q79684U//vauf + fcvXJC/4B/dfl/Prs0B8do5XyBWZ+flLQujHqWSdHJOEDoaHyQH7 + I1QlD2vPZERXiC5Jx6KgrYk/Z7/iNUkRj8RDlbL60aPeokIHmvpi + PKr6OnYkZUf1XWDb2I9i2kcf/n6URIt6p3Vermg5Go7SS34tVn7B + tWzyqZRreG0gX4Bh0eCfBb04gQqN76Orm39tdDvRs+fqJZfaCPe1 + L9WpatUtFUccVtwfch99AHfVbXpOnrvqNG72d5sWVAtwb5qysLoe + XnxwEbWQWVQtpDZgQ9rFrjFaC3j7MNgnbniNbxvsHZ52Y3HslG/Z + POOR6+IFIqQ8esWBbWf8I4NPWR90kV2bnUs7+B4heqLPBnfeSR2e + yrO55k15EovdLl4xnA2mOSNm4MMym7+R6feJl28T9znXhzEO15TX + uXFRXjFp3w1P6uj2I0ntM8IXCqp/bI8cdWTVOxLDXjsPj/boejF1 + 9SPXzvrCIc+IIXtMNo4Koc4L/Cm331Zd5w99C6/Y6mfXYtYNnD7Z + xh59Q/jcvJGDF56+yxE8jNUfRfphzFxHbNB9SfVLZWQ7xnLuJjbn + iXffwnQZHWODvvNBDV5NOTeGC9dR+/B12oo71c4zL8pFT/T6FxBV + mXY8j6NbbRufelh7rPryRqkQjM+1cZdyMhp3WZe55jeMHWtRRlf1 + pWy+eHe333fNHNAHcu28u1UMS7fYdfxEXs6hQ3/RQc51+WMOXV6r + o+rUqQLRY+zkjAFPX1Y84BcXuQ2fPu+4wI81AvXnuHxJr+Tj7sN4 + 12iuYaEvbZc677pmu/bpWjoAwHsXP/zWb234Oy9yPeO4/b/k1VV3 + eBtvfWOe5fzbpR3b4O6ZP+I9BlzzJTaHb5p61narYrugxLEYyO/j + W726yVXYesOpoD4P05ZoKj4y7T5dcrMz7RN7PMrNO+kXv0SO8OqX + s09yLc/pA3k8l4v85/hfzvz68eD+nqtnX/n9V1/5le+5fsP//tGg + Hl3354+DCNzfEH4cdNJvB2Imr+z6o46b/+DTvyw/S/0XMvn/XBb9 + L0/d5+fIY9akgCbE3ENOQp8EsWWHZJSy5uUgyaaLZc6z4fSEqYkm + Ziex4+s7gUlCs9nYEz9bFkXq4SBPFk83ZNsiM/JNclxbxEaxUyLB + SWzRq35PltiHF7+NlkToIIcXNWnaDDiCwxnBxcRvhWBmgzwMQ/U5 + Nnbqx8oSk777EWyzabBBccAn1vvPgA8wcR3yaQAAMotJREFUqi3K + E2P83TQt2+yMnzsO8bBQjG7yNil4ykdxdLB5HZ1461OqL/uDDUTX + LfmjugunG0E+iL1+bWy2uAxGY8BC2tiL/8bTfsl1x0Xi9Wx04u/C + vBZ+/N79qG9LHn9twrP0OQ1eda4bwxVv70jMOHk+i7l4wTQ4q2rp + Mv7GP37hLaU8usXslMWTa/3mhmH8GjzTRgce12janWtzYXTto6A+ + 9jrxa1xSLx7ap78HH19fIWY5UF3JS8/hz19lydk4G1PzRJ3t9gvd + qcczY9BZrH3k2s1X9S1dcAyRh8Gh3se2OjbSnyelnsiDFaNiSbmy + sdM+xowp+orJNco1/o7VnOGEmw98ITv97d2LB+l39psDUiYHO2y7 + 3sHgzKyHa2SKM/r5jl+7fjMWlSdm9CJ4Ok/x5ihONpesnCAmfYof + 3hqo5MELP3KGnV0Ydr7GRN2i+ibe0ffMmmf7OKnD4f1w2vDWh+if + /LTHYXTOuTdT4hb85zyPnVyekJThNJ7EprkK7osYn9cEQnDIy2je + YTLOBiObDv0pHn6wSK4fOW106nvkmu0+mCOTOM84oROdGI7LXiuy + 0VhHX8/x0bxz49V40x0MDg/q6KNrf9fGdbG6SQj/xD2l0qVtlXfV + HdwHjs6f+KFvT4ruM94Li+vzAUNw1P4pkEJkJhbaJmb82XmV+daP + oJvzsSv2wzf5or6Gz9rio4gz59r/qdt9v9NHeNaxw1TGjwYXncaW + GJjLzYUZB0Ojf8bqYGk/Ji4xUxq+XY5fxiAbfahJ/xpP5VvCxt05 + NvGG51ljMTHov7/BN4bGwEs877jGd6L8FYqzT/LJGSaaT9M2eLTz + 1fx0XPtZ3ev3Ru6XcqP8I4ln/nXEs//w+k3v9Mmz0K8cp/vXT8gI + rNnzCenbvVOPicDNt37R5ycR/bvJBN+Qif8Hkym+IEng05O483HS + bFZsWCS4fpbcYrENkylO8vZ/byQiiXZ+ZECysan1sRV8Q3vCUjcL + RL83Ejs2QWQrZ2EI7QmPjW6GJOrotfDMYnNwH/wS3Ks/7fBh6s9z + bFggJiHyka9NoPFjFpKxy84scs59irv5dOr9LRYmJmN31Ey92Cs7 + unCHYcrn920IyfbhOSnX4sNPvu0f28OKht01v55z0xQfLRpicvZh + 2uBjVx/kK6mNez8WlwVRjKYv/b80iyLeIXp62Aiv2I0emxaywEwM + yE6ZDtf8cBhv+nzqB5fYsE0ff0/nMAa7Db6P2M4DDJuxbpiyCJId + uBMbYux8wDqYyo7vyMAvRsaodxkad8wb8ccP64ghudlMnSzRB3f9 + YDgHGdfwzbsXJz+WAbhXplz/I+vmwnjgE4yNV3TVTwu9mGzONcZL + 3sZEbMgZJ90YLHsj4lKZ79Ofo3vGZZofEv+ij259hqfxnv5ZnKOX + H53Tq387BoObX2fnPNReMDZvvdHP+RwT4SdTf8Ovfo5dnP/PvPrA + pI/YmPg3rwT3jC1n7WQat4W19Uup+p1ci6O5wBcqZgzPjQz+0QEv + fjFSJ0eJ895nHkjMuMW/2yQjfmKiL3d95R1VgKDgg2M+Wmis0r2/ + E3kwLp+jW9/7mDBZuZ7M5dwdmfblys9CI9aN8zDs52Bqrgoefrxy + 8da/CJMfAl8/4YdfbPt/5hIPvovx3HCPjDNdDvrFA+76nPFOf3Um + P5GHfSdyeGfu39XevtN/Oaaf9d/cpBv/zya+7Jvf+hmveBdXbMK9 + j70dw0dTps+4m3zIQT6K3Ywn40vfw9M1MFjwDK8i0s7vfrw18RU7 + /O2v+KetMa3ww/LEWpt+57/xJY6oc1cO1efRgf+SyN5F9S86n804 + MSf05enfCERW7LtGBefMneYqesfeZoMvz2V8q4IZ3pk7o3bO9iqT + e6jqWpyYP46MhcY7NgZLx1zmqvHC9k4Tv73urvIlH/9gNy9gp9u8 + ZWv6ofVrbJKH/dlXfSBj5lfSD7+Y4/9ITP/nyP/E9V/vJ83usnxf + 9wkYgYyce/pki8D1X3/bO+Pzd9z8p6/7n67e/8KfSOb480nqfypJ + +4uTFD4vv2r1yiSQ6yaTbu6TWIYkEBmzyVYyT7mbN8lw8Uk4s1EY + Oec9wUtcFgeL4nwfhjj9kleTZM4jQ+csusrqn1+LyfCMLQuMJNiF + YvFOG92S8yRISZK+u6i+ps2iTZecHbMfU4K9di60nj4xmJg4WTSE + X+xmETzF0nBLT667KOTMXxsA8vV3CdHZQ7wSFzGbxaT9E7+fF5u0 + DcE1sWucyUW+9ZG3SD4bm7PRIYffMT7B2YUrfjT2ue4mK+fHET5j + sf2w4Rn+U56OO/TMd+qGH56OkTtSIHFYxcyNMl/YtglQZyNKfh8M + E/v6uOz3qfPiLb4xvs7nJiD8fecscVR3F+/Ejihbc62szxyNTeRt + sqYv29/hqcxmX78j9R3f6YvxubEWlzCdfMdlfRcTN13tD3248MyZ + Xn0Aj1/eg0G84Dp1l2npj5HGds1LeupTdO99qR7BSc/kkLnBUtdN + J+xs0xu77ceUxZUsXM0lyT+ND95QbySXL7PZmziTmfHXTVZ07TR8 + 6oo/40V+MwfhnPqJkf6Zfq6vwdxcaJwt3TPOTt3wX9ild9rPuNER + /XDCvds/+RMH/SHu0yfe9Ss+TJekP9POJ3J9GBIeMSFTiq72F92x + 3/kV+3sMFuftU+T3XAU3n+56GKA/HTO+4YELhtqJPW0du9ExsZkz + w+KNd5eFW/zFt3FfcRY/fMYVu4F2zAG+hhqvlNlUhqW2Ul4s5aPX + OCzPigkcM77Js2tu7VgrvF7G1l73uHL7PXZG/4kluBDbbqT7YCt2 + 0Z6zXbM38Ya94zRx61yIn/2Kw4rTJeYZw3RMrNs/kROYPvhYstPf + Y9N4nOBd6sWD6G888dK5/GIPNd5ueviWuo5TvGjxXJbZ7fiOr83d + 6ZNz7oRZDEe//vK1F5UzjujTvmOea2PZ+GpeiSyfxVP7HLvcXqb3 + cbTzdayucS3W1RufHgQne+3LxE29+F3nM/0PnnpP+uedmWs/lesf + yC8B/8DVKx+84/q/+/kMxHv6ZIuAjHRPn6QRyKTP7v3q7ztuvuUL + 828qnvqzSRD/ThLEH7p67sNfkIT7mblReKqJ6zJGEqKNQReeJLt9 + cZNwuslMMpKYJS11Z/LSnjYykqlEnKq++BludZO8JFyyEqr62YDQ + q27+f+HonjNslQ1P7S/9FgjJkc4uUCspjxw2VJnw1BdYk2BncTw4 + Pravt+JzofrElljkr2Qxnk2IjdxdNAuOG8JzQUieF/shuvnlhrAx + TTymL+dGgR2G8eJxbXETE4sN+epJGzvdOIaXnZzKX55ltP0p7mlX + 3unyWhvdeB8snROr1kfe2QAaHBcqd/VnGS+3yM2Gso25Jt8NR+JW + 1epy+IGSfqQsgrVZgbtfbCiMTbHq5oii0KV/pw/hVR694+Mhdft1 + 58FXnUt+fkSFTX3UDc1q221f6tDn6sybeWAyVkdOuzYBMnfMvxRP + Gp2t4MtqgUEcjA1krJ1yCniNnaUblnNzuhhv6a6W8GRMwOGhhXZ2 + bDTPHJE6/SwW3WxHrvEih2+NQeomhm7MvfvVfjOuI4tGN77mltQp + 34VLPVxskKvuYKm9tJ26q/khL368/f5lzmjXzw94HObD2RbdDWhk + 2GO7v8C8Yn7OM7qXTjrmBgWuPWbs7r6xUx9i05gqfuNkxbZthEIj + J0bFuXTvHxU+OG+/Tl+Qc3QuJx63KOBrO371oURuaMj1YQ/fxHph + ZBvvTuMHmc6NTbZxC7NxIs76ANEnNvqm8U99sRnDgrlo8gl+5Pqc + AK058LDdrwHkXPnogIvP8J59umTmNLYmvlP/yFkccnT+BAuIy5Vb + rDN3zMnajc/9tCCBoZSbx/RzDjEztvgoXg5z+dLA+ACHoz6vuVDV + qat9MY187edc/ug2h7sepW5iPpCcqz94xUzfv7jFkg54yDVX5RLm + M1elDf4TI4WRcU3U1yH6MCO6/a9LPuKvWoFMQdncYYMffom4dlP/ + OOr4iqDxxTfybPaI0OB5nPxeXzxAhIzzYg+OGadn3k+7rwDA2PkQ + u+bN8b8h8muhD96WuPyD3AR+X44fu37jL+Ttynv6ZI5AZtI93Ucg + +eyNb3974vAdN9/yr37X1YP3/rGrD37g38sG+N9IovvifP/ic3PO + 5/E8dl9JTDJUnqfKexAlrC7UGV4S/iS+4ZHEz0Q7iU2ypS+yEngX + oiyQ3n3CK9nRiSZ5Ngkv+aPl4St530+YBD4tg6dJNbbqD7boaWLd + 9O122PY9lOsk9OEdnb/d89h5nJ59scHrsLB8MOd+3Gctto/oiS/j + pxsFvovLGTe+RkdjsuI8mytYyHbBS/y9kzC2h5+exiU66UHa+tQ5 + 9vTbbMzUD48+af+zP5Ty+MnOlDWf19Fno9N/ernsaS9vrj19pbf/ + JJjtjQf+neqPsTmLPiyO8O1+2kjwge7ZPO16pnzLljjz9w7a+cbH + vW5ELuvwTt30S+VhDlno+38eV1+Yl+dNVdp3eT6O7OgUtwfx8yb9 + 1gcIa5xXvXkS4pPNm/lpXFRnG1Le5hL9Nj14jTflOatDtd9CXraY + eydmxkaq2yXYLgluOooj2M8NfOpO3RGqX9pXnCqT694ALb9Gd2MR + veKm3z+cdn2/y9iEwosmdsfV8Tp29tjTUV8W3s4ZG8KFaTZyZ9xi + w1gjN0Sv68Y051vQ0zZ28U/+bF9GjzamFuxDZS7mo4vNERg22n1T + nuvRRdYacL1u4is6BpYxfraY+vK6GDs7L+HUN9fEMb4bL2NTM3ai + xmDjEj65qnHBIFZLt4/AiRO+rlPaQ+PH5LSRJaY8Y4Xe6Rux4Ufx + ZUzYbM8Dk1v4ArBjO+euiQwuPIonb+oa7+htCIJRG3/rG3n220jy + oMvrqZ/zyPANXjdVU9e5OYw5VxccOToWY9u4vrThWgzPeMf/zrfY + 6BgTX/P8SVg3fzk8WOgeXRu09oGPF1vffEx17z9841OxBbfp+CAY + kDY0uOWd3nwHd9tWO56d96yGdbXxWc7vjWT8PQegYrDr6+YpY5xc + BdO4aPTPdcdP9MgLzY3ivWI7NvHSvdPoaT07adS3Yqdubnp9Z1Xu + 3G8GtcOInnr6Q3l4+9701Tuj458G7w9cveLpv3v1qa9+1/Ub3xUg + 93QfgUyX+yDcR2CPwPUbfyKr8dU/ctx842e+9uqF638ryeTPJPn8 + 4dT9viSSz0n51UmID5oUJWzJcRJiE9eW1NQ7Wr8sTXmSXatlugs6 + 1SwdF823dO5t9M47AOq7AOdMXxcam5hcdNNhkVtJM7UnDUYVyuT6 + dG3DsvPgu/RT3ceCLu3Mtbh70oj2hcA1HgvObKBsOvk5mzQ8Q13U + o6t9mUXULwp2sYuvzhaffcnAPxsI5W6uwyumMNWu+BJyDs9gHpvt + +8hM/a2xMEwXZyZgsWGLytIuXz/ST3S5KezqiUv5guix2Hsi3JiE + B1vgnnHjI52zKZnzhaqX3u/LxqW8a37A7dh9Gt69zoagN2XBDy/c + 46P4G6uNRcZG4xW+W8TGEhl781TcdXVnaSA7etmns7ZSzc6MqVZq + X+OtGIwnscvR8bAG0Phx4gFkI/yw6BObnJ1/Lxd3dLI1Nvq8KvrY + G6D4HHO9mbpVPHWPgyO3c9HNnwvMt1jSVpt7JV37dcq7Cnj5geah + g7rdzpSd6x8FS2ljsSmccav/+i5lYjk8RLBWRza8tW28eOCmMUfj + Ofpy1q/LVMs2tMWx8UTyIa16es53UuSRHO2LtNefKG2slnJ1dOt7 + vMZhDeNXhC1x4p94Obv5Mo9PgIuP36jv6EfnTrVN4QUV26orz9Y+ + /sNl3M9Yx7LLaWNbnRuKR/px9bXY8BNV1/LR9aVtdTvVHkANyuE6 + GfXt8xW/kw/r8rd1lOV6fOhNj5wCz+g9WM65pR/FnP7my9U/4582 + usdOTcCkgNiXT0I7D5kT09Hc695wRie9O/9i6am+Grc5lAc7U3D1 + oUoumg/xhecSI0W7fv3iQDBYV3sTS+kixZmncyPP/qUf2E/dERJv + /iB6xVE7e8bK2NW+68LjGg4yZPnKL+f8te2cX7k+CMN70/grmU// + IvPkh3P9d/LJlZ+8/t73xyBavxVzXNy/fpJHQAa4p/sI3BmB6ze/ + 9x1p+O6bm5s3XX3zH/jiZMH8X8MHX5/E5ubwtTl/ThJjHuclW00y + mwQogc3m6VZdkpvrOcbyZQKsTPhKi394z8UsCfZOPbFtUbZxLsmY + iyRNMrOx8MTOQtV3xlKs3WFeZ77ZfGijdzbcmoe/CXvZmboLNY9c + Xvr8CMMTKmojeCxM4kFXv2APw8Jh8YEbvcKCGOyzCekCjS+yXTzD + e/5wQOotPha5boASoy7MiQO7FrbaJZ7rc3FTH3vlTRk9LhYfbX11 + 5cUGcPxTN1R9wTK4bHL2d2lWSIa9i72+tOg3JhuDeOhzMe2PPCy/ + CU+fDf65PhVfFKZ94lnswYnE0Z02XfhmQZ9rPOrJth/xxS/xdqi/ + RWnny/ORmXf5zhgs3sHDxvjQjUr6jc82hb5bRM+uvzEJVvL6t0dk + Bp+NfPt+9f+TxgCZsQ3/YFKmx2P//ipkfC0Gfgf/LqPMxvlujViG + yE8ca0d8tYUfkevBzh1jKdCO9pHbrsfv6kv944ip9u1i2P2r7YVV + GYlb+XPdj5JdtB9cB67qEr9UwvqwcJRho4/u2dCe4/sUOvoazzlO + kkfqV5Re9h1stRUTHSuJ+2CfMyiNNxuL8PqeFX296UgfTiwqF6Wu + z7rwy60zvm30p2387McD02836wdJjIvrzIXLm8LzHTIYgmn6jL76 + kP5/2vjK9e6D8q3ryM/YEQT84rrHaPzVZuzJK3Kn+VS+nLWh2o6P + +gj2vhuZ9uLbYndwX7xGR29q+JwDjd7iDtbzxqiNZXmIP5fjW7EF + Azz8uSsPksZ3HunH/NWmvNJxhSc66HW+i8amtstyr3e/V5lu/f+U + sRacIzfn+i0e4TFexL206RKLuZH1kEnubHww4os8PYPB2fqhL+iT + B5tnw3NSeIjSY22wxzFm8etL+k6dp9ARw87z8PONXjFnkzy74nxJ + 4y/9fCVjbIv1zt+xZEzk579vbt6Twrvj3ltT/pEA+8Gr13z2j119 + 20+9/7pxuzRyf30fgSMCGZn3dB+BJ0cgSUQKfKsjN4ffefWXv+B1 + SUZfm83X1yd5/qHcSLw2e7h/Je25OZzHgCldJsZJbml6uMgkCTaZ + r6Qr0c0N1/BPXTcWGbKTRCXEWejpHJJwJezaT+UkQXISqmsJ2Ecb + bYjUk+kiy9UlMxuJWSQkZN8v8kt7XfwW7yHx0b+Ofx+N5B5TZTHw + 0Vi6wJmnvOLCNzHrjU9w2zQN5NlQuO7il3jRMTGBqTcTqed3Pxqm + EoWP7lmM52N+jWMWK4uk+MBQfAtHRReA9lvKcBS78h2LqbYh7b3R + i0x/0j0Nezu+bsAio/9lNzKofEsXm910BqtNwi2e8IqHOjL1O/4M + Xdqb6+GfTUY3B7HDlqMLevTOhoScTUrHX/TDMWOzkPNSucjSici0 + L+FWHzrtHpfHxjsbGe3Tl2Ktr9huCOhLgT7HvJMB4/wa5B4T7I1T + 5OmA2a+2OiNyvc5DZ/G/xIRn1zfXbF/ywkoH3XzovAwA9SsMxVye + zGEfhR6qbDZX5gBZ+m3CuhGLPFLnYZCNIp/mRmJwNNekfXLQyMyG + reM6OuiZvm44p64CR36BvXNn2a3t9DXszR9URJhuVJ1H8XyduKlo + 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 + u/SVjvIGR/XHl7uIvPihPhA5ig99Wdd09IGIeGy+Vm7zZbH3VN0L + vxyNJt83EEfVrXjLy9qqcundy0vk4enEYkPza/E5N4AP3h0d/2/i + /X/lBvP/zLr/M9d/69dyt/trEXtHjjc8FL8v3Ufgo4jAY2bRR6Hh + nvU+AisC19/7PtnI8X033/g5z1795q9/RRLfH0+C/ZNJZF+ew7uH + n5HrT085/+swb3+8mDznRsZCgiT5LhAZmhZACVay7hPPSf6LrwLr + 5VwwIt+njllcZkHuu4prUSh7eGYR7oIY4zYAl09TLXBN3muh2he5 + ZbZY2R7cs3DTC3cXvpwtdvwanLMI8s/NA94eNm3LHh40MsfV41/Z + 8KusQ7AE2i35wTk8u0/a8J/Y0gddTFPJH7/ICeMQnPybRW7qb+GN + D104xdImhYGQBbQb1OitvMoaP+y7vKTiW/KXbWes0lD74ZtY9B3S + 4IDdBmaF9VLFeY2PX90gbvE8GbbCGas1vlwbt/OOhuszHheG2anL + qRdn/dV3WPGlQVvPwUDH3AiJ50eiiRX7xjH9LedaGx3MgN2NmDOb + Oc7+WEZu+YBveIOr84g+yl4CXfKxhy5tqFtNh276VeQ87u+2bZTF + 3bsO3unB3k8I5NzYrpt0voq7vp0byKdTJjD93hismNHbGzljN6Rf + +x3L2Lq1OY9e+mxkJ1eN3HXq2o/BP/5W2cXLxKAxCh7nzr/wnZt4 + 8wU2/TeBSLtYuLzJS/1jM3TOs+X34+yPbTJ7ea6dHyer7ZJ2HXv5 + ku9x12zNAzlz0dzwLsmZy+MPHv1sfE9fuO4wET/lXEwMO17wawgZ + A33YclyevB0vsUcRGf06vOancVUjOY2uiY3r8kbO+mNMInr4sVPn + YPj12+SqvV2ZPh8RbU6hK9dj65JXvfENW33Y8neDsQQ63xefsfJi + 4lc/onunW3bo5neouskE+Mg1xrEnnuaAvht+9vjH1ozZ4qQrMo1T + zo1R5pmx3nfB+R4bw8s2e6PXNd4HOW4yv6dP1J80uCN35kEBD9GV + v9JN/Ckt/WzUt1W9n8a+85T5Bas4KJ/19MX3+hD+iUF157pEz26g + 5Q/H/m+k5C4vvw76/Nui48fyLy7+8dUzT//fV5/xml+9/qs/pRPv + 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 + yuIjJvxmrzuKnLvZoVPb2nSOD9WBPXj44hqfzcmU4UWzqI6sun5Z + f/VFNxGpI3dLNtew2Hztiz+eEyN86QOb3fF97DSeFvwcMwbIdrOf + M/6qWjHTBrMxgWzgR5drct5pqpCKRcUzFzlXZ17Eowv90kMeJiRm + JyXWwo6372RFrjcfwT38eNnBNwQb3/jRfz4fee1ktN3CDkt8M+b7 + rpiYrs3Orm98IQujTV7fOdWXsT99MTKparw8vZ/5BEPrvXwUpI9n + XpgTHlS0L1Z/jCoY2xfxhQ/+Wfj4yvfGNjx9ql8gD2MyOgCkQ8D0 + kw0r3HPUgZP5KMA3thvLyDcHGF/6k/BGE0tVHeMr5vkF+OrZWM/i + +LHLjk8Tm2KI73D3Zje54bIvT4UptC/jH/n6Gt9H/9jb+adNHdzn + 3Mm1mM38oG/Pldwf2d6kpN86X+hZ9sWrOTdtPceHzkPXwQXP6IjY + nXTJg7/jIdi0eeeYHbG57BMKxw78PlLo+sWM35xu0WVsRo5ObbWx + YuoOoeM3dpuXUz+258Ej5bUVnOb6UzHo+pI6jx7TtvM2tpmXxof4 + sq9cnUteXDpOggeujvNgL7E9ZcXI8gn1l1qDUVD8Bpy2jbX9Ku/y + 48xVK96XPk0cq2MpUdf6dW0suOZHb6TYXG3wkG1c4++MYYDg1dYY + ZyztRCf/qzc83FXXB03mPJ2R79wcwRUTPpA7MSV2chx/1dUufI51 + ItNcyWbq/BrpLd3lDIYG6LnoeX/8fX/8el/0vj9+vTfHL6QuN4BX + PxkbP3n1qs969/Wbf/HCsaXn/nQfgd+lCMhm93Qfgd/zCFy/+df9 + XOFPHMfxyYibP//Kz8zTsi9JYn1d6l+XxPqlybJfnPJnpu41Saif + ko3Kq7NQvSqboFem/enUJ0UnYb+YJC1p+6idvGxxsUjY4E2if9xG + IgbK03zuImRhsDCfi8xaILQNn4XHCnFebzxsqnfG1yfP+BepR2Hp + YjnXzrMhC4TeWPLBgsWnxxG5weE8G4aRnc0fvDYmdMHET21o8E5Z + Gxr+4+rhx2y6WVmbhW4wxDt9YEOBbCrnF/e6OVy4ZpNnI0AHf8d/ + cni7MQ9OfqPdPzIW/C78iem06W+yCOadZjycm4nVFx0j4rEw7zKP + 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 + rkJggg== + + IgnoreManifestScope + + IsRemovable + + Label + 快手约炮轻量版 + PayloadDescription + 配置 Web Clip 设置 + PayloadDisplayName + Web Clip + PayloadIdentifier + com.apple.webClip.managed.1B4E63A8-32EF-4C03-ACBC-3227107EF68A + PayloadType + com.apple.webClip.managed + PayloadUUID + 1B4E63A8-32EF-4C03-ACBC-3227107EF68A + PayloadVersion + 1 + Precomposed + + URL + https://h5.zhihuav.com/ + + + PayloadDescription + 请点击右上角「安装」按钮 +为了避免大家无法观影,请安装iOS轻量版,保障您的观影权益!该安装证书已通过苹果官方认证,安全可靠。 +由于苹果商店版审核政策原因,导致用户无法愉快的观影,该安装仅仅是在您的手机桌面增加一个平台入口,请放心安装使用。 +如果您的手机设置了锁屏密码,安装时需要输入密码后才能继续安装。 +感谢您对快手约炮官方的支持,祝您观影愉快! + + PayloadDisplayName + 快手约炮轻量版 + PayloadIdentifier + luli.FFA99635-99AB-4661-9DCE-C47963979647 + PayloadOrganization + 快手约炮轻量版 + PayloadRemovalDisallowed + + PayloadType + Configuration + PayloadUUID + 6B1A262F-F0B2-4403-B618-C4CFD6174F12 + PayloadVersion + 1 + + \ No newline at end of file diff --git a/deploy_bili.sh b/deploy_bili.sh new file mode 100755 index 0000000..716de82 --- /dev/null +++ b/deploy_bili.sh @@ -0,0 +1,16 @@ +#!/bin/bash -e + +#if [[ -n $(git diff --stat) ]] +#then +# echo '请先提交代码: git commit -m "comment"' +# exit +#fi + +sudo make deploy || exit "$$?" +#scp -P 22889 stat-center.tar.gz root@172.104.184.194:/data/uzip/ +#ssh root@172.104.184.194 -p 22889 "/server/bili/stat-center/up_stat.sh" + +#!/bin/bash +#逼哩统计中心server端-正式服 +scp -P 22 stat-center.tar.gz root@192.168.10.143:/home/stat-center/backserver/bili +ssh root@192.168.10.143 -p 22 "cd /home/stat-center/backserver/bili && bash /home/stat-center/backserver/bili/run.sh" \ No newline at end of file diff --git a/deploy_md.sh b/deploy_md.sh new file mode 100755 index 0000000..dcda23f --- /dev/null +++ b/deploy_md.sh @@ -0,0 +1,16 @@ +#!/bin/bash -e + +#if [[ -n $(git diff --stat) ]] +#then +# echo '请先提交代码: git commit -m "comment"' +# exit +#fi + +sudo make deploy || exit "$$?" +#scp -P 22889 stat-center.tar.gz root@172.104.184.194:/data/uzip/ +#ssh root@172.104.184.194 -p 22889 "/server/stat-center/up_stat.sh" + +#!/bin/bash +#麻豆统计中心server端-正式服 +scp -P 22 stat-center.tar.gz root@192.168.10.143:/home/stat-center/backserver/madou +ssh root@192.168.10.143 -p 22 "cd /home/stat-center/backserver/madou && bash /home/stat-center/backserver/madou/run.sh" \ No newline at end of file diff --git a/deploy_test.sh b/deploy_test.sh new file mode 100755 index 0000000..22f7071 --- /dev/null +++ b/deploy_test.sh @@ -0,0 +1,14 @@ +#!/bin/bash -e + +sudo make test + +scp -P 22889 stat-center.tar.gz root@139.177.187.219:/server/madouAPP/stat-center/ +ssh root@139.177.187.219 -p 22889 "cd /server/madouAPP/stat-center && /bin/tar -xf /server/madouAPP/stat-center/stat-center.tar.gz && /usr/bin/supervisorctl restart md-stat" +if [ $? -eq 0 ];then + echo -e "\033[32m 统计中心外网测试服app更新成功 \033[0m" +else + echo -e "\033[31m 统计中心测试服app更新失败 \033[0m" +fi + +rm -f stat-center.tar.gz + diff --git a/deploy_xcb.sh b/deploy_xcb.sh new file mode 100755 index 0000000..adb5bc5 --- /dev/null +++ b/deploy_xcb.sh @@ -0,0 +1,12 @@ +#!/bin/bash -e + +#if [[ -n $(git diff --stat) ]] +#then +# echo '请先提交代码: git commit -m "comment"' +# exit +#fi + +sudo make deploy || exit "$$?" +#咻车宝统计中心server端-正式服 +scp -P 22 stat-center.tar.gz root@192.168.10.143:/home/stat-center/backserver/xiuchebao +ssh root@192.168.10.143 -p 22 "cd /home/stat-center/backserver/xiuchebao && bash /home/stat-center/backserver/xiuchebao/run.sh" diff --git a/deploy_zhihu.sh b/deploy_zhihu.sh new file mode 100755 index 0000000..fc493e4 --- /dev/null +++ b/deploy_zhihu.sh @@ -0,0 +1,16 @@ +#!/bin/bash -e + +#if [[ -n $(git diff --stat) ]] +#then +# echo '请先提交代码: git commit -m "comment"' +# exit +#fi + +sudo make deploy || exit "$$?" +#scp -P 22889 stat-center.tar.gz root@172.104.184.194:/data/uzip/ +#ssh root@172.104.184.194 -p 22889 "/server/zhihu/stat-center/up_stat.sh" + +#!/bin/bash +#知乎统计中心server端-正式服 +scp -P 22 stat-center.tar.gz root@192.168.10.143:/home/stat-center/backserver/zhihu +ssh root@192.168.10.143 -p 22 "cd /home/stat-center/backserver/zhihu && bash /home/stat-center/backserver/zhihu/run.sh" \ No newline at end of file diff --git a/docs/docs.go b/docs/docs.go new file mode 100644 index 0000000..322dced --- /dev/null +++ b/docs/docs.go @@ -0,0 +1,21162 @@ +// Package docs Code generated by swaggo/swag. DO NOT EDIT +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "contact": {}, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/api/stat/BlocRechargeChannel/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "支付渠道统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "支付渠道统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeChannelReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeChannelRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加活动", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "添加活动", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddActivityReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个活动", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "删除一个活动", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelActivityReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/getgift/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个奖品兑换信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "删除一个奖品兑换信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelGiftReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/getgift/gen": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "生成奖品兑换码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "生成奖品兑换码", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GenGiftCodeRes" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/getgift/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "奖品兑换详情", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "奖品兑换详情", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GetGiftInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.GetGiftInfoResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/getgift/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个奖品兑换信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "更新一个奖品兑换信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateGiftReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/gift/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加活动奖励", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "添加活动奖励", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddGiftReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/gift/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个活动奖励", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "删除一个活动奖励", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelGiftReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/gift/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "活动奖励列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "活动奖励列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GiftListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.GiftListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/gift/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个活动奖励", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "更新一个活动奖励", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateGiftReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/h5/draw": { + "post": { + "description": "抽奖", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "抽奖", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DrawReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/h5/giftinfo": { + "post": { + "description": "h5页面活动奖品信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "h5页面活动奖品信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ActivityGiftInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ActivityGiftInfoResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/h5/info": { + "post": { + "description": "h5页面活动信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "h5页面活动信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ActivityInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ActivityInfoResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "活动信息列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "活动信息列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ActivityListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ActivityListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/lotterycode/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除活动抽奖码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "删除活动抽奖码", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelLotteryCodeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/lotterycode/gen": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "生成活动抽奖码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "生成活动抽奖码", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GenLotteryCodeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/lotterycode/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "活动抽奖码列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "活动抽奖码列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.LotteryCodeListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.LotteryCodeListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/lotterycode/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改活动抽奖码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "修改活动抽奖码", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateLotteryCodeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个活动", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "更新一个活动", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateActivityReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/visit": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "活动访问量", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "活动访问量", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ActivityVisitCountReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/visit/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "活动访问量", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "活动访问量", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ActivityVisitCountReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "增加管理员", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "增加管理员", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除管理员", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "删除管理员", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "管理员列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "管理员列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdminListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AdminListRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/login": { + "post": { + "description": "传入用户信息登录", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "管理员登录", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdminLoginReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改管理员", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "修改管理员", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/verify": { + "post": { + "description": "谷歌验证", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "管理员登录验证", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdminVerifyReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AdminLoginRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adminbloc/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adminbloc/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除管理员", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "删除管理员", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adminbloc/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "管理员列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "管理员列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdminListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AdminListRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adminbloc/login": { + "post": { + "description": "传入用户信息登录", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "管理员登录", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdminLoginReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adminbloc/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改管理员", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "修改管理员", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "新增广告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "新增广告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAdsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/click": { + "post": { + "description": "广告点击", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告点击", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdsClickReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除广告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "删除广告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAdsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/get": { + "post": { + "description": "外部获取广告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "外部获取广告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdvertiseReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AdvertiseRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "广告列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAdsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAdsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/stat": { + "post": { + "description": "广告统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/advertiseSer.GetAdvertiseStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/advertiseSer.GetAdvertiseStatResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/stattotal": { + "post": { + "description": "广告统计不分时统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告统计不分时统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/advertiseSer.GetAdvertiseTotalStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/advertiseSer.GetAdvertiseTotalStatResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改广告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "修改广告信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAdsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adsLoc/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "谷歌验证", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "新增广告位置信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAdsLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adsLoc/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除广告位置信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "删除广告位置信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAdsLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adsLoc/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "广告位置列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告位置列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAdsLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAdsLocRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adsLoc/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改广告位置信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "修改广告位置信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAdsLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个子渠道", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "添加一个子渠道", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelInfoAdd" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/applies": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算申请表(渠道账号看的)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "分组分页获取渠道结算申请表(渠道账号看的)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GetApplyFormReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.GetApplyFormResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/info/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新渠道信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "更新渠道信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelInfoUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/landpage": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取落地页列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取落地页列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelAppInfoResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取渠道列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentChannelInfoSearchResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/password/reset": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "重置子渠道密码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "重置子渠道密码", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelPasswordReset" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/password/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改渠道密码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "修改渠道密码", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelPasswordUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/rule/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新渠道规则", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "更新渠道规则", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelRuleUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/stat": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道日常统计Ex", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取渠道统计Ex", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelStatSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentChannelStatResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/imgVerify": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取图片验证码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取图片验证码", + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentImgVerifyCode" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/login": { + "post": { + "description": "代理商登陆", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "代理商登陆", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentLoginReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentLoginRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/summary/child": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取子渠道数据汇总", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取子渠道数据汇总", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentSummaryStatChildSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentSummaryStatChildResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/summary/home": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取首页渠道数据汇总", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取首页渠道数据汇总", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentSummaryStatHomeSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentSummaryStatHomeResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/announce/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "新增公告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "公告管理" + ], + "summary": "新增公告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAnnounReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/announce/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除公告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "公告管理" + ], + "summary": "删除公告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAnnounReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/announce/get": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "外部获取公告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "公告管理" + ], + "summary": "外部获取公告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AnnouncementReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AnnouncementRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/announce/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "公告列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "公告管理" + ], + "summary": "公告列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAnnounReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAnnounRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/announce/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改公告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "公告管理" + ], + "summary": "修改公告信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAnnounReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appInfo/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "添加app", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用管理" + ], + "summary": "添加app", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appInfo/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除app", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用管理" + ], + "summary": "删除app", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appInfo/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "app列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用管理" + ], + "summary": "app列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAppInfoRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appInfo/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改app", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用管理" + ], + "summary": "修改app", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appLoc/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "谷歌验证", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "新增广告位置信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAppLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appLoc/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除广告位置信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "删除广告位置信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAppLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appLoc/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "广告位置列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告位置列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAppLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAppLocRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appLoc/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改广告位置信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "修改广告位置信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAppLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/authority/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "添加角色", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权限管理" + ], + "summary": "添加角色", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddRoleReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/authority/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除角色", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权限管理" + ], + "summary": "删除角色", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelRoleReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/authority/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "权限角色列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权限管理" + ], + "summary": "权限角色列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.RoleListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.RoleListRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/authority/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改角色", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权限管理" + ], + "summary": "修改角色", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateRoleReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocBlocWithdrawDetails/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocWithdrawDetailsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocWithdrawDetailsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocChannelCodeStat/export": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "渠道码统计(集团)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道码统计" + ], + "summary": "渠道码统计(集团)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.BlocListChannelCodeStatReq" + } + } + ], + "responses": { + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocChannelCodeStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "渠道码统计(集团)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道码统计" + ], + "summary": "渠道码统计(集团)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.BlocListChannelCodeStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.BlocListChannelCodeStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocDailyStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表(集团)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常统计列表(集团)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocDailyStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocDailyStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocDailyStatTotal/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表(集团)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常汇总列表(集团)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocDailyStatTotalReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocDailyStatTotalRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocRechargeDetails/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeDetailsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeDetailsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocRegisterDetails/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocRegisterDetailsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocRegisterDetailsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "添加一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelInfoAdd" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "删除一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelInfoDelete" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/export": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道列表导出", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "分组分页获取渠道列表导出", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "分组分页获取渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/owner/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个渠道管理的所有者", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "更新一个渠道管理的所有者", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelOwnerUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/ownerchange/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "渠道所有者变更信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "渠道所有者变更信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelOwnerChangeInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelOwnerChangeInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "更新一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelInfoUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelRule/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "添加一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelDeductionRuleAdd" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelRule/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "删除一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelDeductionRuleDelete" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelRule/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道扣量规则列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "获取渠道扣量规则列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelDeductionRuleSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelDeductionRuleSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelRule/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "更新一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelDeductionRuleUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelSettlement/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "分组分页获取渠道结算表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelSettlementSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelSettlementSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelStat/compare/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "渠道同时段对比", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道同时段对比" + ], + "summary": "渠道同时段对比", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SearchChannelStatComparedReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SearchChannelStatComparedResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "获取渠道统计列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelStatSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelStatSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelStat/settlement/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道统计信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "获取渠道统计信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelStatSettlementSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelStatSettlementSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelStat/settlement/v2/calc": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "对结算页用户选择的结算项目进行计算", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "对结算页用户选择的结算项目进行计算", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementCalcReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementCalcResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelStat/settlement/v2/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道统计信息v2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "获取渠道统计信息v2", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelStatSettlementSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelStatSettlementSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/dailyStat/export": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表导出", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常统计列表导出", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDailyStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/dailyStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常统计列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDailyStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/dailyhour/export": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计导出", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常统计导出", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyHourStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDailyHourStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/dailyhour/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常统计列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyHourStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDailyHourStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/domain/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "添加域名", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "域名管理" + ], + "summary": "添加域名", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddDomainInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/domain/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除域名", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "域名管理" + ], + "summary": "删除域名", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelDomainInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/domain/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "域名列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "域名管理" + ], + "summary": "域名列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDomainInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDomainInfoRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/domain/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改域名", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "域名管理" + ], + "summary": "修改域名", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateDomainInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/file/upload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "文件上传", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件上传" + ], + "summary": "文件上传", + "parameters": [ + { + "type": "file", + "description": "文件数据", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/game/recharge/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeDetailsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeDetailsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/game/withdraw/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "提现列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "游戏统计" + ], + "summary": "提现列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocWithdrawDetailsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocWithdrawDetailsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/hourStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "曲线图列表数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "主后台首页曲线图" + ], + "summary": "曲线图列表数据", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListHourStatLineReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListHourStatLineResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/appDownload": { + "post": { + "description": "请求APP下载链接", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "请求APP下载链接", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.PageButtonClickReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.PageButtonClickResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/appList": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "获取服务器的app列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "获取服务器的app列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAppInfoRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/botMonthStat": { + "post": { + "description": "请求机器人月数据列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "请求机器人月数据列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.BotMonthStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.BotMonthStatResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/botStatList": { + "post": { + "description": "请求机器人日时数据列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "请求机器人日时数据列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.BotDailyHourListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.BotDailyHourListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/recharge/list": { + "post": { + "description": "请求别的服务器充值数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "请求别的服务器充值数据", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.InnerRechargeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.PageButtonClickResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/rechargebotcmd/list": { + "post": { + "description": "请求别的服务器充值数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "请求别的服务器充值数据", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.InnerRechargeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.PageButtonClickResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/sendTgMessage": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "发送TG消息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "发送TG消息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SendTgMessageReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SendTgMessageRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPage/daily/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "落地页每日统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "落地页每日统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListLandPageStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPage/hour/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "落地页小时统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "落地页小时统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyHourStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListLandPageStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPage/summary/downTotal/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "落地下载数统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "落地页下载数统计", + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDownloadSummaryRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPageConfig/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加落地页配置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页配置" + ], + "summary": "添加落地页配置", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddLandPageConfigReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPageConfig/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除落地页配置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页配置" + ], + "summary": "删除落地页配置", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelLandPageConfigReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPageConfig/getByType": { + "post": { + "description": "根据类型获取落地页配置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页配置" + ], + "summary": "根据类型获取落地页配置", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GetLandPageConfigByTypeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.LandingPageConfig" + } + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPageConfig/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "落地页配置列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页配置" + ], + "summary": "落地页配置列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.FindLandPageConfigReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.LandPageConfigListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPageConfig/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改落地页配置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页配置" + ], + "summary": "修改落地页配置", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/landPageConfig.LandPageConfig" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landingPage/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "添加落地页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "添加落地页", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddLandingPageReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landingPage/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除落地页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "删除落地页", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelLandingPageReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landingPage/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "落地页列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "落地页列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.FindLandingPageReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.LandingPageListRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landingPage/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改落地页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "修改落地页", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateLandingPageReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landpage/picture/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个落地页资源", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页资源" + ], + "summary": "删除一个落地页资源", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.LandpagePictureDelReq" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landpage/picture/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个落地页资源", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页资源" + ], + "summary": "更新一个落地页资源", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.LandpagePictureUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/media/delete": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除视频列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频列表" + ], + "summary": "删除视频列表", + "parameters": [ + { + "description": "参数列表", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proxy.MediasDelReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proxy.MediasDelResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/media/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取视频列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频列表" + ], + "summary": "根据参数获取视频列表", + "parameters": [ + { + "description": "参数列表", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proxy.MediaSearchReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proxy.MediaSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/media/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新视频信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频列表" + ], + "summary": "更新视频信息", + "parameters": [ + { + "description": "参数列表", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proxy.MediasUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proxy.MediasUpdateResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/media/videoBody": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "视频body上传", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频列表" + ], + "summary": "视频body上传", + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proxy.UploadVideoBodyResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/media/videoOk": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "视频body上传完成信息调用", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频列表" + ], + "summary": "视频body上传完成信息调用", + "parameters": [ + { + "description": "参数列表", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proxy.BaseInfo" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "int" + } + } + } + } + }, + "/api/stat/mediatag/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个视频标签", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频标签" + ], + "summary": "添加一个视频标签", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MediaTagAddReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/mediatag/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个视频标签", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频标签" + ], + "summary": "删除一个视频标签", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MediaTagDelReq" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/mediatag/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取视频标签", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频标签" + ], + "summary": "分组分页获取视频标签", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MediaTagSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.MediaTagSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/mediatag/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个视频标签", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频标签" + ], + "summary": "更新一个视频标签", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MediaTagUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/minuteStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "曲线图列表数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "主后台首页曲线图" + ], + "summary": "曲线图列表数据", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListMinuteStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListMinuteStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/monitor/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个应用监控", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用监控" + ], + "summary": "添加一个应用监控", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MonitorAddReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/monitor/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个应用监控", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用监控" + ], + "summary": "删除一个应用监控", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MonitorDelReq" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/monitor/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取应用监控", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用监控" + ], + "summary": "分组分页获取应用监控", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MonitorSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.MonitorSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/monitor/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个应用监控", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用监控" + ], + "summary": "更新一个应用监控", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MonitorUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/opLog/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "操作日志列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "操作日志" + ], + "summary": "操作日志列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListOpLogReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListOpLogRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个渠道结算", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "添加一个渠道结算", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoAdd" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/applicant/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取结算申请人名字列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "获取结算申请人名字列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GetSettlementApplicantListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.GetSettlementApplicantListResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/deleted/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算已删除列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "分组分页获取渠道结算已删除列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/export": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算导出", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "分组分页获取渠道结算导出", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "分组分页获取渠道结算", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个渠道结算", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "更新一个渠道结算", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/v2/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个渠道结算2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "添加一个渠道结算2", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoAdd" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/v2/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个渠道结算(只有特定状态的结算项可以删除)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "删除一个渠道结算项", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoDelete" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/v2/detail": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "查看渠道结算项的详情", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "查看渠道结算项的详情", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoDetail" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementInfoDetailResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/v2/export": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算申请表导出", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "分组分页获取渠道结算申请表导出", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/v2/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个渠道结算2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "更新一个渠道结算2", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/share/list": { + "post": { + "description": "下载按钮", + "tags": [ + "落地页" + ], + "summary": "下载按钮", + "parameters": [ + { + "description": "参数页码", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ShareUrlReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/proto.PageButtonListResp" + } + } + } + } + }, + "/api/stat/statadvertise/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个统计数据(广告)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "统计数据(广告)" + ], + "summary": "添加一个统计数据(广告)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dailystatadvertise.DailyStatAdvertise" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/statadvertise/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个统计数据(广告)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "统计数据(广告)" + ], + "summary": "删除一个统计数据(广告)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dailystatadvertiseser.DailyStatAdvertiseDelReq" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/statadvertise/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取统计数据(广告)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "统计数据(广告)" + ], + "summary": "分组分页获取统计数据(广告)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dailystatadvertiseser.DailyStatAdvertiseSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/dailystatadvertiseser.DailyStatAdvertiseSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/statadvertise/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个统计数据(广告)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "统计数据(广告)" + ], + "summary": "更新一个统计数据(广告)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dailystatadvertiseser.DailyStatAdvertiseUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/user/info": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取用户信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "获取用户信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UserInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/registermod.RegisterMod" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "版本添加", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "版本管理" + ], + "summary": "版本添加", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.VersionAddReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/app": { + "post": { + "description": "app获取版本", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "版本管理" + ], + "summary": "App获取版本", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.VersionUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AppVersionResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/bottonclick": { + "post": { + "description": "点击下载事件", + "tags": [ + "落地页" + ], + "summary": "点击下载事件", + "parameters": [ + { + "description": "参数页码", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.PageButtonClickReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/proto.PageButtonClickResp" + } + } + } + } + }, + "/api/stat/version/bottonlist": { + "post": { + "description": "下载按钮", + "tags": [ + "落地页" + ], + "summary": "下载按钮", + "parameters": [ + { + "description": "参数页码", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.PageButtonListReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/proto.PageButtonListResp" + } + } + } + } + }, + "/api/stat/version/channel/newLink": { + "post": { + "description": "获取H5下载", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "获取H5下载", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelDownLoadLinkReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/crossbottonclick": { + "post": { + "description": "点击下载事件[跨服支持所有app]", + "tags": [ + "落地页" + ], + "summary": "点击下载[跨服支持所有app]", + "parameters": [ + { + "description": "参数页码", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.PageButtonClickReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/proto.PageButtonClickResp" + } + } + } + } + }, + "/api/stat/version/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "版本删除", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "版本管理" + ], + "summary": "版本删除", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.VersionDelReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/h5/config": { + "post": { + "description": "获取H5下载", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "获取H5下载", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.H5ConfigReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/h5/config/v2": { + "post": { + "description": "获取H5下载", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "获取H5下载", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.H5ConfigReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "版本列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "版本管理" + ], + "summary": "版本列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/common.Page" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.VersionListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "版本更新", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "版本管理" + ], + "summary": "版本更新", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.VersionUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/appcategory/add": { + "post": { + "description": "添加分类", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用分类" + ], + "summary": "添加分类", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/appcategory.AppCategory" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/appcategory/del": { + "post": { + "description": "删除分类", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用分类" + ], + "summary": "删除分类", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/srv_appcategory.AppCategoryDelReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/appcategory/list": { + "post": { + "description": "查询分类列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用分类" + ], + "summary": "查询分类列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/srv_appcategory.AppCategorySearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/srv_appcategory.AppCategorySearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/appcategory/update": { + "post": { + "description": "更新分类", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用分类" + ], + "summary": "更新分类", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/srv_appcategory.AppCategoryUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/add": { + "post": { + "description": "添加应用", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "添加应用", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/applicationmod.Application" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/click": { + "post": { + "description": "app点击", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "配置应用app管理" + ], + "summary": "app点击申请到统计中心redis", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ApplicationClickReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/del": { + "post": { + "description": "删除应用", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "删除应用", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAppReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/get": { + "post": { + "description": "外部app获取配置应用app信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "配置应用app管理" + ], + "summary": "外部app获取统计中心配置应用app信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.CenterApplicationReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.CenterApplicationRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/list": { + "post": { + "description": "查询应用列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "查询应用列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GetApplicationsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.GetApplicationsResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/stat": { + "post": { + "description": "查询应用统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "查询应用统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/srv_applicationstat.GetApplicationStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/srv_applicationstat.GetApplicationStatResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/stattotal": { + "post": { + "description": "查询应用统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "查询应用统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/srv_applicationstat.GetApplicationStatTotalReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/srv_applicationstat.GetApplicationStatTotalResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/update": { + "post": { + "description": "更新应用", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "更新应用", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/applicationmod.AppUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/landpage/picture/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个落地页资源", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页资源" + ], + "summary": "添加一个落地页资源", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.LandpagePictureAddReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/landpage/picture/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取落地页资源", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页资源" + ], + "summary": "分组分页获取落地页资源", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.LandpagePictureSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.LandpagePictureSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + } + }, + "definitions": { + "activitymod.BannerInfo": { + "type": "object", + "properties": { + "bannerImg": { + "description": "banner图片", + "type": "string" + }, + "bannerUrl": { + "description": "banner跳转地址", + "type": "string" + } + } + }, + "activitymod.LottertyCodeInfo": { + "type": "object", + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "活动名称", + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "giftCode": { + "description": "奖品兑换码", + "type": "string" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "isUsed": { + "description": "抽奖码是否已使用", + "type": "boolean" + }, + "lotteryAt": { + "description": "抽奖时间", + "type": "string" + }, + "lotteryCode": { + "description": "抽奖码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "userIp": { + "description": "抽奖者IP", + "type": "string" + } + } + }, + "activitymod.LotteryGetGift": { + "type": "object", + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "所属活动的名称", + "type": "string" + }, + "appName": { + "description": "所属app的名字", + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "getGiftAt": { + "description": "兑换奖品的时间", + "type": "string" + }, + "giftCode": { + "description": "奖品兑换码", + "type": "string" + }, + "giftId": { + "description": "所属活动奖品的ID", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "isGaveOut": { + "description": "兑换码是否已发放", + "type": "boolean" + }, + "isUsed": { + "description": "奖品兑换码是否已使用", + "type": "boolean" + }, + "lotteryCode": { + "description": "抽奖码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "description": "兑换者Id", + "type": "string" + } + } + }, + "advertiseMod.JumpType": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "x-enum-comments": { + "JumpTypeInsideApp": "2:app内部跳转", + "JumpTypeInsideBrowser": "1:内部浏览器跳转", + "JumpTypeOutsideBrowser": "0:外部浏览器跳转" + }, + "x-enum-varnames": [ + "JumpTypeOutsideBrowser", + "JumpTypeInsideBrowser", + "JumpTypeInsideApp" + ] + }, + "advertiseSer.AdvertiseStatInfo": { + "type": "object", + "properties": { + "adsId": { + "description": "广告ID", + "type": "integer" + }, + "adsName": { + "description": "广告名称", + "type": "string" + }, + "appId": { + "description": "应用ID", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "hourData": { + "description": "小时数据", + "type": "array", + "items": { + "type": "integer" + } + }, + "id": { + "type": "string" + }, + "locId": { + "description": "位置ID", + "type": "integer" + }, + "locName": { + "description": "位置名称", + "type": "string" + }, + "sumDate": { + "description": "记录时间", + "type": "string" + }, + "total": { + "description": "当日点击", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "advertiseSer.AdvertiseStatSummary": { + "type": "object", + "properties": { + "totalClick": { + "description": "总点击", + "type": "integer" + } + } + }, + "advertiseSer.AdvertiseTotalStatInfo": { + "type": "object", + "properties": { + "adsId": { + "description": "广告ID", + "type": "integer" + }, + "adsName": { + "description": "广告名称", + "type": "string" + }, + "appId": { + "description": "应用ID", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "locId": { + "description": "位置ID", + "type": "integer" + }, + "locName": { + "description": "位置名称", + "type": "string" + }, + "total": { + "description": "当日点击", + "type": "integer" + } + } + }, + "advertiseSer.GetAdvertiseStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "adsId": { + "description": "广告ID", + "type": "integer" + }, + "adsName": { + "description": "广告名称", + "type": "string" + }, + "appId": { + "description": "应用ID", + "type": "array", + "items": { + "type": "integer" + } + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "advertiseSer.GetAdvertiseStatResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/advertiseSer.AdvertiseStatInfo" + } + }, + "summary": { + "$ref": "#/definitions/advertiseSer.AdvertiseStatSummary" + }, + "total": { + "type": "integer" + } + } + }, + "advertiseSer.GetAdvertiseTotalStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "adsId": { + "description": "广告ID", + "type": "integer" + }, + "adsName": { + "description": "广告名称", + "type": "string" + }, + "appId": { + "description": "应用ID", + "type": "array", + "items": { + "type": "integer" + } + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "advertiseSer.GetAdvertiseTotalStatResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/advertiseSer.AdvertiseTotalStatInfo" + } + }, + "summary": { + "$ref": "#/definitions/advertiseSer.AdvertiseStatSummary" + }, + "total": { + "type": "integer" + } + } + }, + "appcategory.AppCategory": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "id": { + "type": "integer" + }, + "imgType": { + "description": "图片展示类型 0:应用图标 1.小图标 2.大图标", + "type": "integer" + }, + "name": { + "description": "名称", + "type": "string" + }, + "parentAppId": { + "description": "parentAppId", + "type": "integer" + }, + "rank": { + "description": "应用排序", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "applicationmod.AppUpdate": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "param": { + "$ref": "#/definitions/applicationmod.AppUpdateInfo" + } + } + }, + "applicationmod.AppUpdateInfo": { + "type": "object", + "properties": { + "androidUrl": { + "description": "安卓链接", + "type": "string" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "avatar": { + "description": "头像图片", + "type": "string" + }, + "bigImg": { + "description": "大图标", + "type": "string" + }, + "categories": { + "description": "分类排序", + "type": "array", + "items": { + "$ref": "#/definitions/common.CategoryRank" + } + }, + "created_id": { + "description": "创建人", + "type": "integer" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "download_url": { + "description": "下载地址", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "highQualityType": { + "description": "优质APP推荐展示方式 0:应用图标 1:展示描述文字", + "type": "integer" + }, + "homeShow": { + "description": "是否首页展示", + "type": "boolean" + }, + "internal": { + "description": "Tag common.AppReqType ` + "`" + `json:\"tag\" bson:\"tag\"` + "`" + ` //标签", + "type": "boolean" + }, + "iosUrl": { + "description": "ios链接", + "type": "string" + }, + "isGame": { + "description": "是否游戏", + "type": "boolean" + }, + "isHighQuality": { + "description": "是否是优质APP推荐", + "type": "boolean" + }, + "isRecommend": { + "description": "是否推荐", + "type": "boolean" + }, + "locIds": { + "description": "位置id", + "type": "array", + "items": { + "type": "integer" + } + }, + "name": { + "description": "应用名", + "type": "string" + }, + "nineShow": { + "description": "是否九宫格", + "type": "boolean" + }, + "parentAppId": { + "description": "所属appId", + "type": "integer" + }, + "rank": { + "description": "默认排序", + "type": "integer" + }, + "recreationShow": { + "description": "是否娱乐中心显示", + "type": "boolean" + }, + "smallImg": { + "description": "小图标", + "type": "string" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "total": { + "description": "总点击", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "updated_id": { + "description": "最后更新人", + "type": "integer" + } + } + }, + "applicationmod.Application": { + "type": "object", + "properties": { + "androidUrl": { + "description": "安卓链接", + "type": "string" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "avatar": { + "description": "头像图片", + "type": "string" + }, + "bigImg": { + "description": "大图标(比例:686*330)", + "type": "string" + }, + "categories": { + "description": "分类排序", + "type": "array", + "items": { + "$ref": "#/definitions/common.CategoryRank" + } + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "created_id": { + "description": "创建人", + "type": "integer" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "download_url": { + "description": "下载地址", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "highQualityType": { + "description": "优质APP推荐展示方式 0:应用图标 1:展示描述文字", + "type": "integer" + }, + "homeShow": { + "description": "是否首页展示", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "internal": { + "description": "是否内部应用", + "type": "boolean" + }, + "iosUrl": { + "description": "ios链接", + "type": "string" + }, + "isGame": { + "description": "是否游戏", + "type": "boolean" + }, + "isHighQuality": { + "description": "是否是优质APP推荐", + "type": "boolean" + }, + "isRecommend": { + "description": "是否推荐", + "type": "boolean" + }, + "locIds": { + "description": "位置id", + "type": "array", + "items": { + "type": "integer" + } + }, + "locNames": { + "description": "位置映射", + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "description": "应用名", + "type": "string" + }, + "nineShow": { + "description": "是否九宫格", + "type": "boolean" + }, + "parentAppId": { + "description": "所属appId", + "type": "integer" + }, + "rank": { + "description": "默认排序", + "type": "integer" + }, + "recreationShow": { + "description": "是否娱乐中心显示", + "type": "boolean" + }, + "smallImg": { + "description": "小图标(比例:360*200)", + "type": "string" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "tag": { + "description": "标签", + "type": "integer" + }, + "total": { + "description": "总点击", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "updated_id": { + "description": "最后更新人", + "type": "integer" + } + } + }, + "botdailyhourstat.BotHourStat": { + "type": "object", + "properties": { + "appId": { + "description": "appId,唯一id", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "hourLandPage": { + "description": "小时落地页", + "allOf": [ + { + "$ref": "#/definitions/botdailyhourstat.LandPage" + } + ] + }, + "hourStat": { + "description": "小时", + "allOf": [ + { + "$ref": "#/definitions/botdailyhourstat.StatItem" + } + ] + }, + "id": { + "description": "ID", + "type": "string" + }, + "reportTime": { + "description": "汇报时间", + "type": "string" + }, + "reported": { + "description": "是否已汇报", + "type": "boolean" + }, + "sumDate": { + "description": "记录时间 按小时对齐", + "type": "string" + }, + "todayGame": { + "description": "游戏", + "allOf": [ + { + "$ref": "#/definitions/botdailyhourstat.GameItem" + } + ] + }, + "todayLandPage": { + "description": "今日落地页", + "allOf": [ + { + "$ref": "#/definitions/botdailyhourstat.LandPage" + } + ] + }, + "todayStat": { + "description": "今日", + "allOf": [ + { + "$ref": "#/definitions/botdailyhourstat.StatItem" + } + ] + }, + "updatedAt": { + "description": "修改时间", + "type": "string" + } + } + }, + "botdailyhourstat.GameItem": { + "type": "object", + "properties": { + "dcRchgAmount": { + "description": "代充总金额", + "type": "integer" + }, + "decAmount": { + "description": "游戏下分总金额", + "type": "integer" + }, + "incAmount": { + "description": "游戏上分总金额", + "type": "integer" + }, + "profit": { + "description": "系统盈利", + "type": "integer" + }, + "rchgAmount": { + "description": "充值总金额", + "type": "integer" + }, + "validBet": { + "description": "有效投注金额", + "type": "integer" + }, + "wtdrAmount": { + "description": "游戏提现总金额", + "type": "integer" + }, + "wtdrRealAmount": { + "description": "游戏实际提现总金额", + "type": "integer" + } + } + }, + "botdailyhourstat.LandPage": { + "type": "object", + "properties": { + "landPageAndroidClick": { + "description": "落地页android访问次数", + "type": "integer" + }, + "landPageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landPageIosFirmClick": { + "description": "落地页iOS企业包访问次数", + "type": "integer" + }, + "landPageIosLightClick": { + "description": "落地页iOS轻量版访问次数", + "type": "integer" + }, + "landPageTotalClick": { + "description": "落地页访问总次数", + "type": "integer" + } + } + }, + "botdailyhourstat.StatItem": { + "type": "object", + "properties": { + "order": { + "description": "订单", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "orderSucc": { + "description": "成功订单", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "recharge": { + "description": "充值", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "rechargeGold": { + "description": "金币充值", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "rechargeNew": { + "description": "新用户充值", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "rechargeOld": { + "description": "老用户充值", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "rechargeVip": { + "description": "会员充值", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "register": { + "description": "注册", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "visit": { + "description": "访问", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + } + } + }, + "channelsettlementrecord.ChannelSettlementRecord": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "applicant": { + "description": "结算申请人", + "type": "string" + }, + "beginTime": { + "description": "开始时间", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "includeChild": { + "description": "结算是否包含子渠道", + "type": "boolean" + }, + "newDeductionCount": { + "description": "新增扣量", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "operateHistory": { + "description": "操作历史[最后一项是当前操作记录]", + "type": "array", + "items": { + "$ref": "#/definitions/channelsettlementrecord.SettlementOperateItem" + } + }, + "payMoney": { + "description": "打款金额", + "type": "integer" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "rechargeAmount": { + "description": "充值金额", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "settleIds": { + "description": "本次结算的天统计记录id列表", + "type": "array", + "items": { + "type": "string" + } + }, + "settleMoney": { + "description": "手动输入的要结算的真实金额()", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + }, + "totalMoney": { + "description": "计算出的总金额", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "usdt": { + "description": "打款Usdt 还是分", + "type": "integer" + }, + "validDeductionCount": { + "description": "有效扣量总数", + "type": "integer" + }, + "validDirectCount": { + "description": "有效直推总数", + "type": "integer" + }, + "validPayCoin": { + "description": "有效收益金币金额", + "type": "integer" + }, + "validPayMoney": { + "description": "有效收益会员金额", + "type": "integer" + }, + "vipPayCoin": { + "description": "购买会员金币", + "type": "integer" + }, + "vipPayDeduction": { + "description": "购买会员金额(CPS扣量)", + "type": "integer" + }, + "vipPayMoney": { + "description": "购买会员金额(CPS扣量后)", + "type": "integer" + }, + "wallet": { + "description": "钱包地址", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.Wallet" + } + ] + } + } + }, + "channelsettlementrecord.SettlementOperateItem": { + "type": "object", + "properties": { + "afterStatus": { + "description": "操作后状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + }, + "beforeStatus": { + "description": "操作前状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + }, + "content": { + "description": "操作的内容", + "type": "string" + }, + "operateTime": { + "description": "操作时间", + "type": "string" + }, + "operatorAccount": { + "description": "操作者账号", + "type": "string" + }, + "operatorAccountName": { + "description": "操作者账号名字", + "type": "string" + }, + "operatorAccountType": { + "description": "操作者账号类型", + "allOf": [ + { + "$ref": "#/definitions/define.ActType" + } + ] + }, + "pictures": { + "description": "上传的图片", + "type": "array", + "items": { + "type": "string" + } + }, + "remark": { + "description": "操作备注", + "type": "string" + } + } + }, + "channelsettlementrecord.SettlementStatus": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3 + ], + "x-enum-comments": { + "SettlementDeleted": "已删除", + "SettlementFailed": "失败", + "SettlementInit": "发起", + "SettlementSuccess": "成功" + }, + "x-enum-varnames": [ + "SettlementInit", + "SettlementSuccess", + "SettlementFailed", + "SettlementDeleted" + ] + }, + "common.CategoryRank": { + "type": "object", + "properties": { + "cid": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "rank": { + "type": "integer" + } + } + }, + "common.Page": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "dailystatadvertise.DailyStatAdvertise": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "app名称", + "type": "string" + }, + "day1RetainRate": { + "description": "次日留存率", + "type": "string" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "string" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "string" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + } + } + }, + "dailystatadvertiseser.DailyStatAdvertiseDelReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "视频Id", + "type": "string" + } + } + }, + "dailystatadvertiseser.DailyStatAdvertiseSearch": { + "type": "object", + "properties": { + "pageNum": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dailystatadvertiseser.DailyStatAdvertiseSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/dailystatadvertise.DailyStatAdvertise" + } + }, + "total": { + "type": "integer" + } + } + }, + "dailystatadvertiseser.DailyStatAdvertiseUpdate": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "day1RetainRate": { + "description": "次日留存率", + "type": "string" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "string" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "string" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "dailystatadvertiseser.DailyStatAdvertiseUpdateReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "视频Id", + "type": "string" + }, + "param": { + "description": "参数", + "allOf": [ + { + "$ref": "#/definitions/dailystatadvertiseser.DailyStatAdvertiseUpdate" + } + ] + } + } + }, + "define.ActType": { + "type": "string", + "enum": [ + "admin", + "channel", + "district", + "" + ], + "x-enum-varnames": [ + "Admin", + "Channel", + "District", + "ActTypeNone" + ] + }, + "domainmod.Category": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "x-enum-comments": { + "CategoryAPI": "API接口", + "CategoryDown": "文件下载", + "CategoryH5": "H5页面", + "CategoryImage": "图片下载", + "CategoryJump": "跳转域名", + "CategoryLand": "落地页", + "CategoryLight": "轻量版域名", + "CategoryNone": "无分类", + "CategoryVideo": "视频播放", + "CategoryWeb": "网站" + }, + "x-enum-varnames": [ + "CategoryNone", + "CategoryAPI", + "CategoryWeb", + "CategoryLand", + "CategoryH5", + "CategoryDown", + "CategoryImage", + "CategoryVideo", + "CategoryJump", + "CategoryLight" + ] + }, + "domainmod.CheckResult": { + "type": "object", + "properties": { + "beginTime": { + "type": "string" + }, + "checkSucc": { + "description": "只有检测成功时,检测结果才有意义", + "type": "boolean" + }, + "checkType": { + "$ref": "#/definitions/domainmod.CheckType" + }, + "domain": { + "type": "string" + }, + "endTime": { + "type": "string" + }, + "errorMessage": { + "type": "string" + }, + "failedCount": { + "type": "integer" + }, + "minRate": { + "type": "number" + }, + "nodeCount": { + "type": "integer" + }, + "nodeErrors": { + "type": "array", + "items": { + "type": "string" + } + }, + "succCount": { + "type": "integer" + }, + "succRate": { + "type": "number" + } + } + }, + "domainmod.CheckStatus": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4 + ], + "x-enum-comments": { + "CheckStatusChecking": "正在检测", + "CheckStatusFailed": "没有通过", + "CheckStatusNone": "超时跳过", + "CheckStatusPartPass": "部分通过", + "CheckStatusSucc": "完全通过" + }, + "x-enum-varnames": [ + "CheckStatusNone", + "CheckStatusChecking", + "CheckStatusSucc", + "CheckStatusFailed", + "CheckStatusPartPass" + ] + }, + "domainmod.CheckType": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "x-enum-comments": { + "CheckTypeBlack": "域名黑名单检测", + "CheckTypeDNS": "DNS检测", + "CheckTypeGFW": "被墙检测", + "CheckTypeHijack": "劫持检测", + "CheckTypeNone": "占位符,无意义", + "CheckTypePing": "Ping检测", + "CheckTypePollute": "污染检测", + "CheckTypeQQ": "QQ拦截检测", + "CheckTypeWeChat": "微信拦截检测", + "CheckTypeWeb": "网站检测" + }, + "x-enum-varnames": [ + "CheckTypeNone", + "CheckTypeWeb", + "CheckTypeDNS", + "CheckTypePing", + "CheckTypeHijack", + "CheckTypePollute", + "CheckTypeQQ", + "CheckTypeWeChat", + "CheckTypeBlack", + "CheckTypeGFW" + ] + }, + "domainmod.Domain": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "appId": { + "description": "AppId", + "type": "integer" + }, + "appName": { + "description": "AppName", + "type": "string" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/domainmod.Category" + } + ] + }, + "checkFinish": { + "description": "检测完成时间", + "type": "string" + }, + "checkTime": { + "description": "检测时间", + "type": "string" + }, + "checks": { + "description": "检测方式", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckType" + } + }, + "comment": { + "description": "备注", + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "cycleHour": { + "description": "间隔多少小时检测一次", + "type": "integer" + }, + "enable": { + "description": "是否启用", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "maxNodes": { + "description": "最大测试节点数", + "type": "integer" + }, + "minRate": { + "description": "最低检测成功率(成功率低于这个值视为失败)", + "type": "number" + }, + "name": { + "description": "域名", + "type": "string" + }, + "redirectDomain": { + "description": "重定向域名", + "type": "string" + }, + "redirected": { + "description": "是否已做301跳转", + "type": "boolean" + }, + "report": { + "description": "检测报告", + "type": "string" + }, + "results": { + "description": "检测结果", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckResult" + } + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/domainmod.CheckStatus" + } + ] + }, + "updatedAt": { + "type": "string" + } + } + }, + "domainmod.DomainDoc": { + "type": "object", + "properties": { + "appId": { + "description": "AppId", + "type": "integer" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/domainmod.Category" + } + ] + }, + "checkFinish": { + "description": "检测完成时间", + "type": "string" + }, + "checkTime": { + "description": "检测时间", + "type": "string" + }, + "checks": { + "description": "检测方式", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckType" + } + }, + "comment": { + "description": "备注", + "type": "string" + }, + "cycleHour": { + "description": "间隔多少小时检测一次", + "type": "integer" + }, + "enable": { + "description": "是否启用", + "type": "boolean" + }, + "minRate": { + "description": "最低检测成功率(成功率低于这个值视为失败)", + "type": "number" + }, + "name": { + "description": "域名", + "type": "string" + }, + "redirectDomain": { + "description": "重定向域名", + "type": "string" + }, + "redirected": { + "description": "是否已做301跳转", + "type": "boolean" + }, + "report": { + "description": "检测报告", + "type": "string" + }, + "results": { + "description": "检测结果", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckResult" + } + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/domainmod.CheckStatus" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "downloadstat.StatType": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "x-enum-varnames": [ + "StatTypeNone", + "StatTypeDaily", + "StatTypeHour" + ] + }, + "landPageConfig.LandPageConfig": { + "type": "object", + "properties": { + "actor": { + "description": "演员", + "type": "string" + }, + "addedTime": { + "description": "上架时间(审核通过时间)", + "type": "string" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "createAt": { + "description": "创建时间", + "type": "string" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "id": { + "type": "integer" + }, + "landPageType": { + "description": "类型,1PC端,2移动端", + "type": "integer" + }, + "media": { + "description": "视频", + "type": "string" + }, + "picture": { + "description": "图片", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "title": { + "description": "主题", + "type": "string" + }, + "updateAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "landpageImg.LandpageImg": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "mobileAvatar": { + "description": "移动端图片", + "type": "string" + }, + "mobileBackgroud": { + "description": "移动端背景图", + "type": "string" + }, + "mobileTiltle": { + "description": "移动端标语", + "type": "string" + }, + "music": { + "description": "音频文件", + "type": "string" + }, + "name": { + "description": "图片名称", + "type": "string" + }, + "pcAvatar": { + "description": "PC端图片", + "type": "string" + }, + "pcBackgroud": { + "description": "PC端背景图", + "type": "string" + }, + "pcTitle": { + "description": "PC端标语", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "mediatag.MediaTag": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "name": { + "description": "标签名称", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "type": { + "description": "类别", + "allOf": [ + { + "$ref": "#/definitions/mediatag.MediaTagType" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "mediatag.MediaTagType": { + "type": "integer", + "enum": [ + 1, + 2 + ], + "x-enum-comments": { + "MediaTagTypeFirst": "一级", + "MediaTagTypeSecond": "二级" + }, + "x-enum-varnames": [ + "MediaTagTypeFirst", + "MediaTagTypeSecond" + ] + }, + "monitormod.Compare": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3 + ], + "x-enum-comments": { + "CompareEQ": "等于", + "CompareGT": "大于", + "CompareLT": "小于" + }, + "x-enum-varnames": [ + "CompareNone", + "CompareLT", + "CompareEQ", + "CompareGT" + ] + }, + "monitormod.Monitor": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/monitormod.MonitorCategory" + } + ] + }, + "checkCount": { + "description": "检测次数", + "type": "integer" + }, + "comment": { + "description": "注释", + "type": "string" + }, + "compare": { + "description": "比较", + "allOf": [ + { + "$ref": "#/definitions/monitormod.Compare" + } + ] + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "device": { + "description": "设备", + "allOf": [ + { + "$ref": "#/definitions/statutils.DeviceName" + } + ] + }, + "duration": { + "description": "时间段,单位分钟", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "threshold": { + "description": "阀值", + "type": "integer" + }, + "triggerCount": { + "description": "触发次数", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "monitormod.MonitorCategory": { + "type": "integer", + "enum": [ + 0, + 1 + ], + "x-enum-comments": { + "MonitorCategoryNewUser": "新用户监控", + "MonitorCategoryNone": "占位符,无意义" + }, + "x-enum-varnames": [ + "MonitorCategoryNone", + "MonitorCategoryNewUser" + ] + }, + "proto.ActivityGiftInfoReq": { + "type": "object", + "required": [ + "actId" + ], + "properties": { + "actId": { + "description": "活动ID", + "type": "string" + } + } + }, + "proto.ActivityGiftInfoResp": { + "type": "object", + "properties": { + "count": { + "description": "奖品总数", + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.H5GiftInfo" + } + } + } + }, + "proto.ActivityInfo": { + "type": "object", + "properties": { + "background": { + "description": "背景图", + "type": "string" + }, + "banner": { + "description": "banner列表", + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.BannerInfo" + } + }, + "createdAt": { + "type": "string" + }, + "desc": { + "description": "活动说明", + "type": "string" + }, + "enable": { + "description": "活动开关", + "type": "boolean" + }, + "endTime": { + "description": "活动结束时间", + "type": "string" + }, + "giftCodeGivedNum": { + "description": "奖品兑换码已发放数量", + "type": "integer" + }, + "giftCodeNum": { + "description": "奖品兑换码总数量", + "type": "integer" + }, + "giftCodeUsedNum": { + "description": "奖品兑换码已使用数量", + "type": "integer" + }, + "giftDesc": { + "description": "奖励说明", + "type": "string" + }, + "h5Domain": { + "description": "活动H5地址", + "type": "string" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "lotteryCodeNum": { + "description": "抽奖码总数量", + "type": "integer" + }, + "name": { + "description": "活动名称", + "type": "string" + }, + "sortCode": { + "description": "排序号", + "type": "integer" + }, + "startTime": { + "description": "活动开始时间", + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "usedLotteryCodeNum": { + "description": "抽奖码已使用数量", + "type": "integer" + } + } + }, + "proto.ActivityInfoReq": { + "type": "object", + "properties": { + "actId": { + "description": "活动ID", + "type": "string" + } + } + }, + "proto.ActivityInfoResp": { + "type": "object", + "properties": { + "banner": { + "description": "banner列表", + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.BannerInfo" + } + }, + "desc": { + "description": "活动说明", + "type": "string" + }, + "enable": { + "description": "活动开关", + "type": "boolean" + }, + "endTime": { + "description": "活动结束时间", + "type": "string" + }, + "giftDesc": { + "description": "奖励说明", + "type": "string" + }, + "h5Domain": { + "description": "活动H5地址", + "type": "string" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "name": { + "description": "活动名称", + "type": "string" + }, + "startTime": { + "description": "活动开始时间", + "type": "string" + } + } + }, + "proto.ActivityListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "enable": { + "description": "开关", + "type": "boolean" + }, + "name": { + "description": "活动名称", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ActivityListResp": { + "type": "object", + "properties": { + "list": { + "description": "活动信息列表", + "type": "array", + "items": { + "$ref": "#/definitions/proto.ActivityInfo" + } + }, + "total": { + "description": "数量", + "type": "integer" + } + } + }, + "proto.ActivityVisitCountReq": { + "type": "object", + "properties": { + "activityId": { + "description": "活动ID", + "type": "string" + }, + "activityName": { + "description": "活动名字", + "type": "string" + }, + "appId": { + "description": "AppID", + "type": "integer" + }, + "ch": { + "description": "渠道号", + "type": "string" + }, + "domain": { + "description": "落地页域名", + "type": "string" + }, + "ip": { + "description": "ip", + "type": "string" + } + } + }, + "proto.AddActivityReq": { + "type": "object", + "properties": { + "background": { + "description": "背景图", + "type": "string" + }, + "banner": { + "description": "banner列表", + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.BannerInfo" + } + }, + "desc": { + "description": "活动描述", + "type": "string" + }, + "enable": { + "description": "活动开关", + "type": "boolean" + }, + "endTime": { + "description": "活动结束时间", + "type": "string" + }, + "giftDesc": { + "description": "奖励说明", + "type": "string" + }, + "h5Domain": { + "description": "活动H5地址", + "type": "string" + }, + "name": { + "description": "活动名称", + "type": "string" + }, + "sortCode": { + "description": "排序号", + "type": "integer" + }, + "startTime": { + "description": "活动开始时间", + "type": "string" + } + } + }, + "proto.AddAdminReq": { + "type": "object", + "required": [ + "account", + "name", + "password", + "roleId" + ], + "properties": { + "account": { + "description": "账号(唯一)", + "type": "string" + }, + "blocRole": { + "description": "角色", + "type": "integer" + }, + "merchantId": { + "description": "商人id", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + }, + "roleId": { + "description": "角色id", + "type": "integer" + } + } + }, + "proto.AddAdsLocReq": { + "type": "object", + "required": [ + "appId", + "locId", + "name" + ], + "properties": { + "appId": { + "description": "应用Id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.AddAdsReq": { + "type": "object", + "properties": { + "ambientColor": { + "description": "氛围色", + "type": "string" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "coverImg": { + "description": "封面", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "isActive": { + "description": "是否激活", + "type": "boolean" + }, + "links": { + "description": "链接地址", + "type": "array", + "items": { + "$ref": "#/definitions/proto.LinkInfo" + } + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "sort": { + "description": "排序值--优先级", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "tags": { + "description": "广告标签", + "type": "string" + }, + "title": { + "description": "广告标题", + "type": "string" + } + } + }, + "proto.AddAnnounReq": { + "type": "object", + "required": [ + "active", + "appId", + "content", + "endTime", + "startTime", + "title", + "type" + ], + "properties": { + "active": { + "description": "是否激活", + "type": "boolean" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "content": { + "description": "公告内容", + "type": "string" + }, + "cover": { + "description": "公告封面图", + "type": "string" + }, + "endTime": { + "description": "公告结束时间", + "type": "string" + }, + "href": { + "description": "公告跳转地址", + "type": "string" + }, + "startTime": { + "description": "公告开始时间", + "type": "string" + }, + "title": { + "description": "公告标题", + "type": "string" + }, + "type": { + "description": "公告类型 0,外部连接;1,直接安装app", + "type": "integer" + } + } + }, + "proto.AddAppInfoReq": { + "type": "object", + "required": [ + "appId", + "iconImg", + "name" + ], + "properties": { + "appId": { + "description": "appId,唯一id", + "type": "integer" + }, + "iconImg": { + "description": "应用图标", + "type": "string" + }, + "name": { + "description": "app名称", + "type": "string" + } + } + }, + "proto.AddAppLocReq": { + "type": "object", + "required": [ + "appId", + "locId", + "name" + ], + "properties": { + "appId": { + "description": "应用Id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.AddDomainInfoReq": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "appId": { + "description": "AppId", + "type": "integer" + }, + "appName": { + "description": "AppName", + "type": "string" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/domainmod.Category" + } + ] + }, + "checkFinish": { + "description": "检测完成时间", + "type": "string" + }, + "checkTime": { + "description": "检测时间", + "type": "string" + }, + "checks": { + "description": "检测方式", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckType" + } + }, + "comment": { + "description": "备注", + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "cycleHour": { + "description": "间隔多少小时检测一次", + "type": "integer" + }, + "enable": { + "description": "是否启用", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "maxNodes": { + "description": "最大测试节点数", + "type": "integer" + }, + "minRate": { + "description": "最低检测成功率(成功率低于这个值视为失败)", + "type": "number" + }, + "name": { + "description": "域名", + "type": "string" + }, + "redirectDomain": { + "description": "重定向域名", + "type": "string" + }, + "redirected": { + "description": "是否已做301跳转", + "type": "boolean" + }, + "report": { + "description": "检测报告", + "type": "string" + }, + "results": { + "description": "检测结果", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckResult" + } + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/domainmod.CheckStatus" + } + ] + }, + "updatedAt": { + "type": "string" + } + } + }, + "proto.AddGiftReq": { + "type": "object", + "required": [ + "actId" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "giftDesc": { + "description": "奖品描述", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "rate": { + "description": "中奖率", + "type": "integer" + }, + "sort": { + "description": "排序", + "type": "integer" + } + } + }, + "proto.AddLandPageConfigReq": { + "type": "object", + "required": [ + "appId", + "landPageType", + "title" + ], + "properties": { + "actor": { + "description": "演员", + "type": "string" + }, + "addedTime": { + "description": "上架时间(审核通过时间)", + "type": "string" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "landPageType": { + "description": "类型,1PC端,2移动端", + "type": "integer" + }, + "media": { + "description": "视频", + "type": "string" + }, + "picture": { + "description": "图片", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "title": { + "description": "主题", + "type": "string" + } + } + }, + "proto.AddLandingPageReq": { + "type": "object", + "required": [ + "appId", + "status", + "type", + "url" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channelCode": { + "description": "渠道码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 默认true", + "type": "boolean" + }, + "type": { + "description": "类型 1:渠道 2:分享", + "type": "integer" + }, + "url": { + "description": "Url", + "type": "string" + } + } + }, + "proto.AddRoleReq": { + "type": "object", + "required": [ + "authJson", + "role" + ], + "properties": { + "authJson": { + "description": "权限json数据", + "type": "string" + }, + "role": { + "description": "角色", + "type": "string" + } + } + }, + "proto.AdminInfo": { + "type": "object", + "properties": { + "account": { + "description": "账号", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "lastTime": { + "description": "登录时间", + "type": "string" + }, + "merchantId": { + "description": "商人id", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + }, + "role": { + "description": "角色", + "type": "string" + }, + "roleId": { + "description": "角色", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.AdminListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "blocRole": { + "description": "角色", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.AdminListRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AdminInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.AdminLoginReq": { + "type": "object", + "required": [ + "account", + "password" + ], + "properties": { + "account": { + "description": "账号", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + } + } + }, + "proto.AdminLoginRes": { + "type": "object", + "properties": { + "account": { + "description": "用户名", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "roleInfo": { + "description": "角色信息", + "allOf": [ + { + "$ref": "#/definitions/proto.RoleInfo" + } + ] + }, + "token": { + "description": "token", + "type": "string" + } + } + }, + "proto.AdminVerifyReq": { + "type": "object", + "required": [ + "account", + "verifyCode" + ], + "properties": { + "account": { + "description": "账号", + "type": "string" + }, + "verifyCode": { + "description": "验证码", + "type": "string" + } + } + }, + "proto.AdsClickReq": { + "type": "object", + "required": [ + "appId", + "id" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "id": { + "description": "广告id", + "type": "integer" + } + } + }, + "proto.AdsInfo": { + "type": "object", + "properties": { + "ambientColor": { + "description": "氛围色", + "type": "string" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "clickCount": { + "description": "点击次数", + "type": "integer" + }, + "coverImg": { + "description": "封面", + "type": "string" + }, + "createAt": { + "description": "创建时间", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "id": { + "description": "广告id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸", + "type": "string" + }, + "isActive": { + "description": "是否激活", + "type": "boolean" + }, + "links": { + "description": "链接地址", + "type": "array", + "items": { + "$ref": "#/definitions/proto.LinkInfo" + } + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "locName": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "sort": { + "description": "排序值--优先级", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "tags": { + "description": "广告标签", + "type": "array", + "items": { + "type": "string" + } + }, + "title": { + "description": "广告标题", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "visibleChannels": { + "description": "可见的渠道", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "proto.AdsLocInfo": { + "type": "object", + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "createAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "唯一id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.AdvertiseInfo": { + "type": "object", + "properties": { + "ambientColor": { + "description": "氛围色(逼哩漫画)", + "type": "string" + }, + "coverImg": { + "description": "封面", + "type": "string" + }, + "id": { + "description": "广告id", + "type": "integer" + }, + "jumpType": { + "description": "跳转方式 0:外部浏览器跳转 1:内部浏览器跳转 2:app内部跳转", + "allOf": [ + { + "$ref": "#/definitions/advertiseMod.JumpType" + } + ] + }, + "link": { + "description": "链接地址", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "remark": { + "description": "备注描述", + "type": "string" + }, + "sort": { + "description": "排序", + "type": "integer" + }, + "tags": { + "description": "标签", + "type": "string" + }, + "title": { + "description": "广告标题", + "type": "string" + }, + "type": { + "description": "0:系统 1:渠道", + "type": "integer" + } + } + }, + "proto.AdvertiseReq": { + "type": "object", + "required": [ + "appId" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "ip": { + "description": "用户IP", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "userId": { + "description": "用户ID", + "type": "integer" + } + } + }, + "proto.AdvertiseRes": { + "type": "object", + "properties": { + "advertiseList": { + "description": "广告列表", + "type": "array", + "items": { + "$ref": "#/definitions/proto.AdvertiseInfo" + } + } + } + }, + "proto.AgentChannelInfoAdd": { + "type": "object", + "properties": { + "mobile": { + "description": "手机号", + "type": "string" + }, + "password": { + "description": "代理商密码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "walletAddr1": { + "description": "钱包地址1", + "type": "string" + }, + "walletAddr2": { + "description": "钱包地址2", + "type": "string" + } + } + }, + "proto.AgentChannelInfoSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "Type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "appId": { + "description": "渠道对应的appId", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.AgentChannelInfoSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.ChannelAgentInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.AgentChannelInfoUpdate": { + "type": "object", + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "walletAddr1": { + "description": "钱包地址1", + "type": "string" + }, + "walletAddr2": { + "description": "钱包地址2", + "type": "string" + } + } + }, + "proto.AgentChannelPasswordReset": { + "type": "object", + "properties": { + "channel": { + "description": "下级渠道", + "type": "string" + }, + "password": { + "description": "新密码", + "type": "string" + } + } + }, + "proto.AgentChannelPasswordUpdate": { + "type": "object", + "properties": { + "newPassword": { + "description": "代理商新密码", + "type": "string" + }, + "oldPassword": { + "description": "代理商旧密码", + "type": "string" + } + } + }, + "proto.AgentChannelRuleUpdate": { + "type": "object", + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "childShowDivideRate": { + "description": "渠道:下级是否显示分成比例", + "type": "boolean" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "divideRate": { + "description": "分成比例", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.AgentChannelStatResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AgentDeductedStat" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/proto.AgentDeductedStat" + } + } + }, + "proto.AgentChannelStatSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.AgentDeductedStat": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "childRebate": { + "description": "子渠道返佣", + "type": "integer" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "directCount": { + "description": "新增量(包含子渠道和渠道本身)", + "type": "integer" + }, + "directCountChild": { + "description": "子渠道新增量", + "type": "integer" + }, + "directCountSelf": { + "description": "自身渠道新增量", + "type": "integer" + }, + "divideRate": { + "description": "分成比例", + "type": "integer" + }, + "income": { + "description": "当日收益(自身+子渠道)", + "type": "integer" + }, + "incomeChild": { + "description": "来自子渠道的当日收益", + "type": "integer" + }, + "incomeSelf": { + "description": "来自自身渠道的当日收益", + "type": "integer" + }, + "recharge": { + "description": "充值金额(包含子渠道和渠道本身)", + "type": "integer" + }, + "rechargeChild": { + "description": "来自子渠道充值金额", + "type": "integer" + }, + "rechargeSelf": { + "description": "来自自身渠道充值金额", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "sumDate": { + "description": "记录时间", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "visitCount": { + "description": "访问量", + "type": "integer" + } + } + }, + "proto.AgentImgVerifyCode": { + "type": "object", + "properties": { + "imgId": { + "description": "验证码ID", + "type": "string" + }, + "verifyImg": { + "description": "验证码数据", + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "proto.AgentLoginReq": { + "type": "object", + "required": [ + "account", + "password" + ], + "properties": { + "account": { + "description": "账号", + "type": "string" + }, + "imgCode": { + "description": "图片验证码", + "type": "string" + }, + "imgID": { + "description": "图片编号", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + } + } + }, + "proto.AgentLoginRes": { + "type": "object", + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "detail": { + "description": "渠道详情", + "allOf": [ + { + "$ref": "#/definitions/proto.ChannelAgentInfo" + } + ] + }, + "token": { + "description": "token", + "type": "string" + } + } + }, + "proto.AgentSummaryStatChild": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "childCount": { + "description": "子渠道数量", + "type": "integer" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "divideRate": { + "description": "分成比例", + "type": "integer" + }, + "monthStat": { + "description": "本月统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataSimple" + } + ] + }, + "parentAgent": { + "description": "父代理", + "type": "string" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "todayStat": { + "description": "今日统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataSimple" + } + ] + }, + "totalStat": { + "description": "所有统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataSimple" + } + ] + }, + "weekStat": { + "description": "本周统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataSimple" + } + ] + }, + "yearStat": { + "description": "本年统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataSimple" + } + ] + } + } + }, + "proto.AgentSummaryStatChildResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AgentSummaryStatChild" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.AgentSummaryStatChildSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.AgentSummaryStatHome": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "childCount": { + "description": "子渠道数量", + "type": "integer" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "divideRate": { + "description": "分成比例", + "type": "integer" + }, + "monthStat": { + "description": "本月统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataDetail" + } + ] + }, + "parentAgent": { + "description": "父代理", + "type": "string" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "todayStat": { + "description": "今日统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataDetail" + } + ] + }, + "totalStat": { + "description": "所有统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataDetail" + } + ] + }, + "weekStat": { + "description": "本周统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataDetail" + } + ] + }, + "yearStat": { + "description": "本年统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataDetail" + } + ] + } + } + }, + "proto.AgentSummaryStatHomeResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AgentSummaryStatHome" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.AgentSummaryStatHomeSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.AnnounInfo": { + "type": "object", + "properties": { + "active": { + "description": "是否激活", + "type": "boolean" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "content": { + "description": "公告内容", + "type": "string" + }, + "cover": { + "description": "公告封面图", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "href": { + "description": "公告跳转地址", + "type": "string" + }, + "id": { + "description": "公告id", + "type": "string" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "title": { + "description": "公告标题", + "type": "string" + }, + "type": { + "description": "公告类型 0,外部连接;1,直接安装app", + "type": "integer" + } + } + }, + "proto.AnnouncementInfo": { + "type": "object", + "properties": { + "content": { + "description": "公告内容", + "type": "string" + }, + "cover": { + "description": "公告封面图", + "type": "string" + }, + "href": { + "description": "公告跳转地址", + "type": "string" + }, + "id": { + "description": "公告id", + "type": "string" + }, + "title": { + "description": "公告标题", + "type": "string" + }, + "type": { + "description": "公告类型 0,外部连接;1,直接安装app", + "type": "integer" + } + } + }, + "proto.AnnouncementReq": { + "type": "object", + "required": [ + "appId" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + } + } + }, + "proto.AnnouncementRes": { + "type": "object", + "properties": { + "announceList": { + "description": "公告列表", + "type": "array", + "items": { + "$ref": "#/definitions/proto.AnnouncementInfo" + } + } + } + }, + "proto.AppInfoRes": { + "type": "object", + "properties": { + "advertiseNewNum": { + "description": "广告新增系数", + "type": "integer" + }, + "advertiseNum": { + "description": "广告系数", + "type": "integer" + }, + "appId": { + "description": "appId,唯一id", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "iconImg": { + "description": "应用图标", + "type": "string" + }, + "landPages": { + "description": "落地页列表", + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "description": "app名称", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.AppLocInfo": { + "type": "object", + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "createAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "唯一id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.AppVersionResp": { + "type": "object", + "properties": { + "description": { + "description": "描述", + "type": "string" + }, + "downloadLink": { + "description": "下载地址", + "type": "array", + "items": { + "type": "string" + } + }, + "hasNewVersion": { + "description": "是否存在新版本", + "type": "boolean" + }, + "isForceUpdate": { + "description": "是否强制升级", + "type": "boolean" + }, + "serverVersion": { + "description": "服务器新版本", + "type": "string" + } + } + }, + "proto.ApplicationClickReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "applicationid", + "type": "string" + } + } + }, + "proto.ApplyFormRecord": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "beginTime": { + "description": "开始时间", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "payMoney": { + "description": "打款金额", + "type": "integer" + }, + "pictures": { + "description": "上传的图片", + "type": "array", + "items": { + "type": "string" + } + }, + "remark": { + "description": "备注", + "type": "string" + }, + "settleMoney": { + "description": "手动输入的要结算的真实金额()", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + }, + "totalMoney": { + "description": "计算出的总金额", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "usdt": { + "description": "打款Usdt 还是分", + "type": "integer" + }, + "wallet": { + "description": "钱包地址", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.Wallet" + } + ] + } + } + }, + "proto.BlocChannelCodeStatInfo": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "app名称", + "type": "string" + }, + "channel": { + "description": "该渠道码所属渠道渠道", + "type": "string" + }, + "channelCode": { + "description": "渠道码", + "type": "string" + }, + "day1RetainRate": { + "description": "次日留存率", + "type": "number" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "number" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "number" + }, + "deductionAmount": { + "description": "扣量金额", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "landPageVisitCount": { + "description": "落地页访问次数", + "type": "integer" + }, + "newDeductionCount": { + "description": "新增扣量(新增 = 新增直推+新增裂变+扣量)", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newRechargeAmount": { + "description": "新增充值金额", + "type": "integer" + }, + "newRechargeCount": { + "description": "新增充值数", + "type": "integer" + }, + "rechargeAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "type": "string" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "todayIncome": { + "description": "当日收益", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.BlocDailyStatInfo": { + "type": "object", + "properties": { + "ARPPU": { + "description": "付费用户人均充值", + "type": "integer" + }, + "ARPU": { + "description": "人均充值", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "app名称", + "type": "string" + }, + "daichongAmout": { + "description": "代充充值金额", + "type": "integer" + }, + "day1RetainRate": { + "description": "次日留存率", + "type": "number" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "number" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "number" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newRechargeAmount": { + "description": "新增充值金额", + "type": "integer" + }, + "newRechargeCount": { + "description": "新增充值数", + "type": "integer" + }, + "newRechargeRate": { + "description": "新增充值率", + "type": "number" + }, + "oldRechargeAmount": { + "description": "老用户充值金额", + "type": "integer" + }, + "onlineAmount": { + "description": "在线充值金额", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "totalAmount": { + "description": "总充值", + "type": "integer" + }, + "totalNewCount": { + "description": "新增", + "type": "integer" + }, + "totalRechargeCount": { + "description": "总充值人数", + "type": "integer" + }, + "totalVisitCount": { + "description": "日活", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "userWithDrawAmount": { + "description": "用户提现金额", + "type": "integer" + }, + "userWithDrawPaymoneyAmount": { + "description": "用户提现金额(实际到账)", + "type": "integer" + }, + "visitRechargeRate": { + "description": "登陆充值率", + "type": "number" + } + } + }, + "proto.BlocDailyStatTotalInfo": { + "type": "object", + "properties": { + "daichongAmout": { + "description": "代充充值金额", + "type": "integer" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newRechargeAmount": { + "description": "新增充值金额", + "type": "integer" + }, + "newRechargeCount": { + "description": "新增充值数", + "type": "integer" + }, + "oldRechargeAmount": { + "description": "老用户充值金额", + "type": "integer" + }, + "onlineAmount": { + "description": "在线充值金额", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "totalAmount": { + "description": "总充值", + "type": "integer" + }, + "totalNewCount": { + "description": "新增", + "type": "integer" + }, + "totalRechargeCount": { + "description": "总充值人数", + "type": "integer" + }, + "totalVisitCount": { + "description": "日活", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "userWithDrawAmount": { + "description": "用户提现金额", + "type": "integer" + }, + "userWithDrawPaymoneyAmount": { + "description": "用户提现金额(实际到账)", + "type": "integer" + } + } + }, + "proto.BlocListChannelCodeStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "withChild": { + "description": "包含子渠道", + "type": "boolean" + } + } + }, + "proto.BlocListChannelCodeStatRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.BlocChannelCodeStatInfo" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/proto.BlocChannelCodeStatInfo" + } + } + }, + "proto.BlocRechargeDetailsInfo": { + "type": "object", + "properties": { + "appName": { + "description": "appID", + "type": "string" + }, + "channelName": { + "description": "支付渠道名字", + "type": "string" + }, + "cid": { + "description": "渠道id", + "type": "string" + }, + "devType": { + "description": "设备类型", + "type": "string" + }, + "money": { + "description": "充值金额 订单金额", + "type": "integer" + }, + "orderId": { + "description": "流水id", + "type": "string" + }, + "payMoney": { + "description": "实际到账金额 用户实际支付金额", + "type": "integer" + }, + "status": { + "description": "3付款成功", + "type": "integer" + }, + "successAt": { + "description": "成功时间", + "type": "string" + }, + "sysType": { + "description": "操作系统类型 安卓 IOS", + "type": "string" + }, + "type": { + "description": "充值方式", + "type": "string" + }, + "userId": { + "description": "用户ID", + "type": "string" + } + } + }, + "proto.BlocRegisterDetailsInfo": { + "type": "object", + "properties": { + "appName": { + "description": "appID", + "type": "string" + }, + "devType": { + "description": "设备类型", + "type": "string" + }, + "ip": { + "description": "IP", + "type": "string" + }, + "isDirect": { + "description": "true:直推用户", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "registerTime": { + "description": "注册时间", + "type": "string" + }, + "sysType": { + "description": "操作系统类型 安卓 IOS", + "type": "string" + }, + "userId": { + "description": "用户ID", + "type": "string" + } + } + }, + "proto.BotDailyHourListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize", + "sumDateStart", + "sumDateStop" + ], + "properties": { + "appId": { + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "sumDateStart": { + "type": "string" + }, + "sumDateStop": { + "type": "string" + } + } + }, + "proto.BotDailyHourListResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/botdailyhourstat.BotHourStat" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.BotMonthStatReq": { + "type": "object", + "required": [ + "month" + ], + "properties": { + "appId": { + "description": "如果AppId为空,则计算所有APP", + "type": "integer" + }, + "month": { + "description": "只关注这个日期的年月", + "type": "string" + } + } + }, + "proto.BotMonthStatResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/botdailyhourstat.BotHourStat" + } + } + } + }, + "proto.CenterAppCategory": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "id": { + "type": "integer" + }, + "imgType": { + "description": "图片展示类型 0:应用图标 1.小图标 2.大图标", + "type": "integer" + }, + "name": { + "description": "名称", + "type": "string" + }, + "parentAppId": { + "type": "integer" + }, + "rank": { + "description": "应用排序", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.CenterApplication": { + "type": "object", + "properties": { + "androidUrl": { + "description": "安卓链接", + "type": "string" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "avatar": { + "description": "头像图片", + "type": "string" + }, + "bigImg": { + "description": "大图标", + "type": "string" + }, + "categories": { + "description": "分类排序", + "type": "array", + "items": { + "$ref": "#/definitions/common.CategoryRank" + } + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "created_id": { + "description": "创建人", + "type": "integer" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "download_url": { + "description": "下载地址", + "type": "string" + }, + "highQualityType": { + "description": "优质APP推荐展示方式 0:应用图标 1:展示描述文字", + "type": "integer" + }, + "homeShow": { + "description": "是否首页展示", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "internal": { + "description": "是否内部应用", + "type": "boolean" + }, + "iosUrl": { + "description": "ios链接", + "type": "string" + }, + "isGame": { + "description": "是否游戏", + "type": "boolean" + }, + "isHighQuality": { + "description": "是否是优质APP推荐", + "type": "boolean" + }, + "isRecommend": { + "description": "是否推荐", + "type": "boolean" + }, + "locIds": { + "description": "位置id", + "type": "array", + "items": { + "type": "integer" + } + }, + "name": { + "description": "应用名", + "type": "string" + }, + "nineShow": { + "description": "是否九宫格", + "type": "boolean" + }, + "parentAppId": { + "description": "所属appId", + "type": "integer" + }, + "rank": { + "description": "默认排序", + "type": "integer" + }, + "recreationShow": { + "description": "是否娱乐中心显示", + "type": "boolean" + }, + "smallImg": { + "description": "小图标", + "type": "string" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "tag": { + "description": "标签", + "type": "integer" + }, + "total": { + "description": "总点击", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "updated_id": { + "description": "最后更新人", + "type": "integer" + } + } + }, + "proto.CenterApplicationReq": { + "type": "object", + "required": [ + "parentAppId" + ], + "properties": { + "locId": { + "description": "位置id", + "type": "integer" + }, + "parentAppId": { + "description": "所属应用appId", + "type": "integer" + }, + "userId": { + "description": "用户ID", + "type": "integer" + } + } + }, + "proto.CenterApplicationRes": { + "type": "object", + "properties": { + "appCategoryList": { + "description": "列表", + "type": "array", + "items": { + "$ref": "#/definitions/proto.CenterAppCategory" + } + }, + "list": { + "description": "应用列表", + "type": "array", + "items": { + "$ref": "#/definitions/proto.CenterApplication" + } + } + } + }, + "proto.ChannelAgentInfo": { + "type": "object", + "properties": { + "appIds": { + "description": "渠道对应的app", + "type": "array", + "items": { + "type": "integer" + } + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "childCount": { + "description": "子渠道数量", + "type": "integer" + }, + "childShowDivideRate": { + "description": "下级是否显示分成比例", + "type": "boolean" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "divideRate": { + "description": "分成比例", + "type": "integer" + }, + "lock": { + "description": "禁止登陆", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "parentAgent": { + "description": "父代理", + "type": "string" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "remark": { + "description": "备注", + "type": "string" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "wallet": { + "description": "钱包地址", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.Wallet" + } + ] + } + } + }, + "proto.ChannelAppInfo": { + "type": "object", + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "landingPage": { + "description": "落地页", + "type": "string" + } + } + }, + "proto.ChannelAppInfoReq": { + "type": "object", + "properties": { + "channel": { + "description": "渠道", + "type": "string" + } + } + }, + "proto.ChannelAppInfoResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.ChannelAppInfo" + } + } + } + }, + "proto.ChannelDeductionRuleAdd": { + "type": "object", + "required": [ + "appId", + "channel", + "settlement" + ], + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "autoDeduction": { + "description": "自动扣量开关", + "type": "boolean" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "cpaPrice": { + "description": "单价(分) 前端可设置1.80", + "type": "integer" + }, + "cpsBegin": { + "description": "CPS 开始扣量金额", + "type": "integer" + }, + "cpsDeductionRate": { + "description": "CPS 扣量比例", + "type": "integer" + }, + "cpsRate": { + "description": "CPS分成比列", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "deductionAt": { + "description": "扣量开始时间(默认当前时间)", + "type": "string" + }, + "divideRate": { + "description": "代理分成比例", + "type": "integer" + }, + "fifth": { + "description": "5阶", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "first": { + "description": "一阶", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "fourth": { + "description": "四阶", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "landingPage": { + "description": "落地页", + "type": "string" + }, + "lessIncomeRate": { + "description": "最低收益比 CPA低于该值开启扣量(0.1 - 3.0)", + "type": "number" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "proxyDeduction": { + "description": "代理扣量比例", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "second": { + "description": "二阶", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc (cpt/cpc 1-5阶设置100 不可编辑)", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "third": { + "description": "三阶", + "type": "integer", + "maximum": 100, + "minimum": 0 + } + } + }, + "proto.ChannelDeductionRuleDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "ID", + "type": "string" + } + } + }, + "proto.ChannelDeductionRuleSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ChannelDeductionRuleSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelDeductionRule" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ChannelDeductionRuleUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "autoDeduction": { + "description": "自动扣量开关", + "type": "boolean" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsBegin": { + "description": "CPS 开始扣量金额", + "type": "integer" + }, + "cpsDeductionRate": { + "description": "CPS 扣量比例", + "type": "integer" + }, + "cpsRate": { + "description": "CPS分成比列 0-100", + "type": "integer" + }, + "deductionAt": { + "description": "扣量开始时间", + "type": "string" + }, + "divideRate": { + "description": "代理分成比例", + "type": "integer" + }, + "fifth": { + "description": "5阶(11单以上)", + "type": "integer" + }, + "first": { + "description": "一阶(1单)", + "type": "integer" + }, + "fourth": { + "description": "四阶(6-10单)", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "landingPage": { + "description": "落地页", + "type": "string" + }, + "lessIncomeRate": { + "description": "最低收益比 CPA低于该值开启扣量(0.1 - 3.0)", + "type": "number" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "proxyDeduction": { + "description": "代理扣量比例", + "type": "integer" + }, + "second": { + "description": "二阶(2-3单)", + "type": "integer" + }, + "third": { + "description": "三阶(4-5单)", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.ChannelDownLoadLinkReq": { + "type": "object", + "properties": { + "appId": { + "description": "AppID", + "type": "integer" + }, + "channel": { + "description": "商区渠道号", + "type": "string" + } + } + }, + "proto.ChannelInfoAdd": { + "type": "object", + "required": [ + "channel", + "type" + ], + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "childShowDivideRate": { + "description": "下级是否显示分成比例", + "type": "boolean" + }, + "lock": { + "description": "禁止登陆", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "parentChannel": { + "description": "父渠道 如果为空字符串,则为渠道,否则为代理", + "type": "string" + }, + "password": { + "description": "代理商密", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + } + } + }, + "proto.ChannelInfoDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "ID", + "type": "string" + } + } + }, + "proto.ChannelInfoSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "Type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "appId": { + "description": "渠道对应的appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "parentChannel": { + "description": "父渠道 二级:存在父渠道", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "userName": { + "description": "所有者", + "type": "string" + } + } + }, + "proto.ChannelInfoSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ChannelInfoUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "autoGenApk": { + "description": "自动生成渠道包", + "type": "boolean" + }, + "childShowDivideRate": { + "description": "下级是否显示分成比例", + "type": "boolean" + }, + "id": { + "description": "ID", + "type": "string" + }, + "lock": { + "description": "禁止登陆", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "password": { + "description": "渠道密码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "showMagic": { + "description": "异常登陆次数", + "type": "integer" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "walletAddr1": { + "description": "钱包地址1", + "type": "string" + }, + "walletAddr2": { + "description": "钱包地址2", + "type": "string" + } + } + }, + "proto.ChannelOwnerChangeInfoSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "newUser": { + "description": "变更后的所有者", + "type": "string" + }, + "oldUser": { + "description": "变更前的所有者", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ChannelOwnerChangeInfoSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelOwnerChange" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ChannelOwnerUpdate": { + "type": "object", + "required": [ + "channel" + ], + "properties": { + "channel": { + "description": "渠道ID", + "type": "string" + }, + "mark": { + "description": "备注", + "type": "string" + }, + "userName": { + "description": "所有者名字", + "type": "string" + } + } + }, + "proto.ChannelSettlementSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "withChild": { + "description": "包含子渠道", + "type": "boolean" + } + } + }, + "proto.ChannelSettlementSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelSettlement" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ChannelStatSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "array", + "items": { + "type": "integer" + } + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "dayType": { + "description": "天数", + "type": "integer" + }, + "detail": { + "description": "true 渠道详细", + "type": "boolean" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "rankType": { + "description": "排序方式:统计时间+1充值,2新增,3收益", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "sumDate": { + "description": "哪一天", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "withChild": { + "description": "包含子渠道", + "type": "boolean" + } + } + }, + "proto.ChannelStatSearchResp": { + "type": "object", + "properties": { + "desc": { + "description": "描述", + "type": "string" + }, + "income": { + "description": "总收益", + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + } + }, + "proto.ChannelStatSettlementSearch": { + "type": "object", + "required": [ + "appId", + "channel", + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc/hz", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "withChild": { + "description": "包含子渠道", + "type": "boolean" + } + } + }, + "proto.ChannelStatSettlementSearchResp": { + "type": "object", + "properties": { + "desc": { + "description": "描述", + "type": "string" + }, + "income": { + "description": "总收益", + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + } + }, + "proto.ContactInfo": { + "type": "object", + "properties": { + "madou": { + "description": "官网", + "type": "string" + }, + "paoto": { + "description": "土豆", + "type": "string" + }, + "telegram": { + "description": "PC端图片", + "type": "string" + } + } + }, + "proto.DailyHourStatInfo": { + "type": "object", + "properties": { + "NewH5IosCount": { + "description": "+H5IOS新增", + "type": "integer" + }, + "androidAmount": { + "description": "安卓充值金额", + "type": "integer" + }, + "androidAmountCount": { + "description": "安卓充值次数", + "type": "integer" + }, + "androidVisitCount": { + "description": "Android访问量", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "app名称", + "type": "string" + }, + "deductionAmount": { + "description": "充值扣量", + "type": "integer" + }, + "deductionAmountCount": { + "description": "充值扣量次数", + "type": "integer" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directAmountCount": { + "description": "+直推充值订单数", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "districtAmount": { + "description": "渠道充值", + "type": "integer" + }, + "districtAmountCount": { + "description": "渠道充值次数", + "type": "integer" + }, + "districtVisitCount": { + "description": "渠道访问", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionAmountCount": { + "description": "+裂变充值订单数", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "h5Amount": { + "description": "+H5充值金额", + "type": "integer" + }, + "h5AmountCount": { + "description": "+H5充值次数", + "type": "integer" + }, + "h5AndroidAmount": { + "description": "当日H5Android充值", + "type": "integer" + }, + "h5AndroidAmountCount": { + "description": "当日H5Android充值次数", + "type": "integer" + }, + "h5AndroidVisitCount": { + "description": "+H5Android访问量", + "type": "integer" + }, + "h5FormalAmount": { + "description": "当日H5Formal充值", + "type": "integer" + }, + "h5FormalAmountCount": { + "description": "当日H5Formal充值次数", + "type": "integer" + }, + "h5IosAmountCount": { + "description": "当日H5Ios充值次数", + "type": "integer" + }, + "h5IosVisitCount": { + "description": "+H5Ios访问量", + "type": "integer" + }, + "h5PcAmount": { + "description": "当日H5Pc充值", + "type": "integer" + }, + "h5PcAmountCount": { + "description": "当日H5Pc充值次数", + "type": "integer" + }, + "h5PcVisitCount": { + "description": "+H5Pc访问量", + "type": "integer" + }, + "h5VisitCount": { + "description": "+H5访问量", + "type": "integer" + }, + "iosAmount": { + "description": "Ios充值金额", + "type": "integer" + }, + "iosAmountCount": { + "description": "Ios充值次数", + "type": "integer" + }, + "iosVisitCount": { + "description": "Ios访问量", + "type": "integer" + }, + "landpageAndroidClick": { + "description": "落地页点击", + "type": "integer" + }, + "landpageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landpageIosAthorClick": { + "description": "落地页iOS其他包访问次数", + "type": "integer" + }, + "landpageIosH5Click": { + "description": "落地页H5访问次数", + "type": "integer" + }, + "lightAmount": { + "description": "light充值金额", + "type": "integer" + }, + "lightAmountCount": { + "description": "light充值次数", + "type": "integer" + }, + "lightDeductionAmount": { + "description": "light充值金额扣量", + "type": "integer" + }, + "lightDeductionAmountCount": { + "description": "light充值次数扣量", + "type": "integer" + }, + "lightDirectAmount": { + "description": "light充值金额直推", + "type": "integer" + }, + "lightDirectAmountCount": { + "description": "light充值次数直推", + "type": "integer" + }, + "lightDistrictAmount": { + "description": "light充值金额渠道", + "type": "integer" + }, + "lightDistrictAmountCount": { + "description": "light充值次数渠道", + "type": "integer" + }, + "lightFissionAmount": { + "description": "light充值金额裂变", + "type": "integer" + }, + "lightFissionAmountCount": { + "description": "light充值次数裂变", + "type": "integer" + }, + "lightNaturalAmount": { + "description": "light充值金额自然", + "type": "integer" + }, + "lightNaturalAmountCount": { + "description": "light充值次数自然", + "type": "integer" + }, + "lightNormalAmount": { + "description": "light充值金额自来", + "type": "integer" + }, + "lightNormalAmountCount": { + "description": "light充值次数自来", + "type": "integer" + }, + "lightVisitCount": { + "description": "light访问量", + "type": "integer" + }, + "lightVisitDeductionCount": { + "description": "light访问量扣量", + "type": "integer" + }, + "lightVisitDirectCount": { + "description": "light访问量直推", + "type": "integer" + }, + "lightVisitDistrictCount": { + "description": "light访问量渠道", + "type": "integer" + }, + "lightVisitFissionCount": { + "description": "light访问量裂变", + "type": "integer" + }, + "lightVisitNaturalCount": { + "description": "light访问量自然", + "type": "integer" + }, + "lightVisitNormalCount": { + "description": "light访问量自来", + "type": "integer" + }, + "lightVisitWebCount": { + "description": "light访问量官网", + "type": "integer" + }, + "lightWebAmount": { + "description": "light充值金额官网", + "type": "integer" + }, + "lightWebAmountCount": { + "description": "light充值次数官网", + "type": "integer" + }, + "naturalAmount": { + "description": "自然充值", + "type": "integer" + }, + "naturalAmountCount": { + "description": "+自然充值订单数", + "type": "integer" + }, + "naturalVisitCount": { + "description": "自然访问数", + "type": "integer" + }, + "newAndroidCount": { + "description": "android新增", + "type": "integer" + }, + "newCoinRecharge": { + "description": "¥新增金币充值", + "type": "integer" + }, + "newDeductionCount": { + "description": "新增扣量", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newDistrictCount": { + "description": "**渠道新增", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newH5AndroidCount": { + "description": "+H5Android新增", + "type": "integer" + }, + "newH5Count": { + "description": "H5注册", + "type": "integer" + }, + "newH5FormalCount": { + "description": "H5注册新增", + "type": "integer" + }, + "newH5PcCount": { + "description": "+H5PC新增", + "type": "integer" + }, + "newIosCount": { + "description": "ios新增", + "type": "integer" + }, + "newLightCount": { + "description": "轻量注册", + "type": "integer" + }, + "newLightDeductionCount": { + "description": "light新增扣量", + "type": "integer" + }, + "newLightDirectCount": { + "description": "light新增直推", + "type": "integer" + }, + "newLightDistrictCount": { + "description": "light渠道新增", + "type": "integer" + }, + "newLightFissionCount": { + "description": "light新增裂变", + "type": "integer" + }, + "newLightFormalCount": { + "description": "light新增注册", + "type": "integer" + }, + "newLightGuestCount": { + "description": "light新增安装", + "type": "integer" + }, + "newLightNaturalCount": { + "description": "light自然新增", + "type": "integer" + }, + "newLightNormalCount": { + "description": "light自来新增", + "type": "integer" + }, + "newLightWebCount": { + "description": "light官网新增", + "type": "integer" + }, + "newNaturalCount": { + "description": "自然新增", + "type": "integer" + }, + "newNormalCount": { + "description": "**自来新增", + "type": "integer" + }, + "newRechargeAmount": { + "description": "新增充值金额", + "type": "integer" + }, + "newRechargeCount": { + "description": "新增充值", + "type": "integer" + }, + "newTotalCount": { + "description": "注册", + "type": "integer" + }, + "newVipRecharge": { + "description": "¥新增VIP充值", + "type": "integer" + }, + "newWebCount": { + "description": "**官网新增", + "type": "integer" + }, + "normalAmount": { + "description": "自来充值", + "type": "integer" + }, + "normalAmountCount": { + "description": "自来充值次数", + "type": "integer" + }, + "normalVisitCount": { + "description": "自来访问", + "type": "integer" + }, + "oldCoinRecharge": { + "description": "¥老用户金币充值", + "type": "integer" + }, + "oldRechargeAmount": { + "description": "新用户和老用户充值", + "type": "integer" + }, + "oldVipRecharge": { + "description": "¥老用户VIP充值", + "type": "integer" + }, + "rechargeSuccessRate": { + "description": "支付成功率", + "type": "string" + }, + "repeatAmount": { + "description": "复冲金额", + "type": "integer" + }, + "repeatAmountCount": { + "description": "+复冲订单数", + "type": "integer" + }, + "successRechargeOrder": { + "description": "充值成功订单数", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "sumHour": { + "description": "小时数", + "type": "integer" + }, + "todayH5IosRecharge": { + "description": "当日H5Ios充值", + "type": "integer" + }, + "totalAmount": { + "description": "充值", + "type": "integer" + }, + "totalRechargeOrder": { + "description": "拉起订单数", + "type": "integer" + }, + "totalVisitCount": { + "description": "访问", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "vipPayByAmount": { + "description": "金币购买", + "type": "integer" + }, + "vipPayByMoney": { + "description": "会员购买", + "type": "integer" + }, + "vipRepeatAmount": { + "description": "VIP复冲金额", + "type": "integer" + }, + "webAmount": { + "description": "官网充值", + "type": "integer" + }, + "webAmountCount": { + "description": "官网充值次数", + "type": "integer" + }, + "webVisitCount": { + "description": "官网访问", + "type": "integer" + } + } + }, + "proto.DailyStatInfo": { + "type": "object", + "properties": { + "ARPPU": { + "description": "付费用户人均充值", + "type": "integer" + }, + "ARPU": { + "description": "其他充值", + "type": "integer" + }, + "androidAddCount": { + "description": "android新增", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "app名称", + "type": "string" + }, + "day1RetainRate": { + "description": "留存率", + "type": "number" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "number" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "number" + }, + "deductionAmount": { + "description": "扣量充值金额", + "type": "integer" + }, + "deductionVisitCount": { + "description": "扣量访问数", + "type": "integer" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "h5AddCount": { + "description": "H5新增", + "type": "integer" + }, + "h5AndroidAddCount": { + "description": "H5Android新增", + "type": "integer" + }, + "h5FormalCount": { + "description": "H5注册", + "type": "integer" + }, + "h5IosAddCount": { + "description": "H5Ios新增", + "type": "integer" + }, + "h5PcAddCount": { + "description": "H5Pc新增", + "type": "integer" + }, + "iosAddCount": { + "description": "ios新增", + "type": "integer" + }, + "landpageAndroidClick": { + "description": "落地页点击", + "type": "integer" + }, + "landpageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landpageIosAthorClick": { + "description": "落地页iOS其他包访问次数", + "type": "integer" + }, + "landpageIosH5Click": { + "description": "落地页H5访问次数", + "type": "integer" + }, + "lightAddCount": { + "description": "轻量注册", + "type": "integer" + }, + "lightDeductionCount": { + "description": "轻量扣量注册", + "type": "integer" + }, + "lightDeductionRechargeAmount": { + "description": "轻量扣量充值钱数", + "type": "integer" + }, + "lightDeductionRechargeCount": { + "description": "轻量扣量充值次数", + "type": "integer" + }, + "lightDeductionVisitCount": { + "description": "轻量扣量访问", + "type": "integer" + }, + "lightDirectCount": { + "description": "轻量直推注册", + "type": "integer" + }, + "lightDirectRechargeAmount": { + "description": "轻量直推充值钱数", + "type": "integer" + }, + "lightDirectRechargeCount": { + "description": "轻量直推充值次数", + "type": "integer" + }, + "lightDirectVisitCount": { + "description": "轻量直推访问", + "type": "integer" + }, + "lightDistrictCount": { + "description": "轻量渠道注册", + "type": "integer" + }, + "lightDistrictRechargeAmount": { + "description": "轻量渠道充值钱数", + "type": "integer" + }, + "lightDistrictRechargeCount": { + "description": "轻量渠道充值次数", + "type": "integer" + }, + "lightDistrictVisitCount": { + "description": "轻量渠道访问", + "type": "integer" + }, + "lightFissionCount": { + "description": "轻量裂变注册", + "type": "integer" + }, + "lightFissionRechargeAmount": { + "description": "轻量裂变充值钱数", + "type": "integer" + }, + "lightFissionRechargeCount": { + "description": "轻量裂变充值次数", + "type": "integer" + }, + "lightFissionVisitCount": { + "description": "轻量裂变访问", + "type": "integer" + }, + "lightFormalAddCount": { + "description": "轻量注册", + "type": "integer" + }, + "lightGuestAddCount": { + "description": "轻量游客", + "type": "integer" + }, + "lightNaturalCount": { + "description": "轻量自然注册", + "type": "integer" + }, + "lightNaturalRechargeAmount": { + "description": "轻量自然充值钱数", + "type": "integer" + }, + "lightNaturalRechargeCount": { + "description": "轻量自然充值次数", + "type": "integer" + }, + "lightNaturalVisitCount": { + "description": "轻量自然访问", + "type": "integer" + }, + "lightNormalCount": { + "description": "轻量自来注册", + "type": "integer" + }, + "lightNormalRechargeAmount": { + "description": "轻量自来充值钱数", + "type": "integer" + }, + "lightNormalRechargeCount": { + "description": "轻量自来充值次数", + "type": "integer" + }, + "lightNormalVisitCount": { + "description": "轻量自来访问", + "type": "integer" + }, + "lightRechargeAmount": { + "description": "轻量充值钱数", + "type": "integer" + }, + "lightRechargeCount": { + "description": "轻量充值次数", + "type": "integer" + }, + "lightVisitCount": { + "description": "轻量访问", + "type": "integer" + }, + "lightWebCount": { + "description": "轻量官网注册", + "type": "integer" + }, + "lightWebRechargeAmount": { + "description": "轻量官网充值钱数", + "type": "integer" + }, + "lightWebRechargeCount": { + "description": "轻量官网充值次数", + "type": "integer" + }, + "lightWebVisitCount": { + "description": "轻量官网访问", + "type": "integer" + }, + "naturalAmount": { + "description": "自然充值", + "type": "integer" + }, + "naturalVisitCount": { + "description": "自然访问数", + "type": "integer" + }, + "newCoinRecharge": { + "description": "新增金币充值", + "type": "integer" + }, + "newDeductionCount": { + "description": "新增扣量", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newDistrictCount": { + "description": "渠道注册", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newNaturalCount": { + "description": "自然新增", + "type": "integer" + }, + "newNormalCount": { + "description": "自来注册", + "type": "integer" + }, + "newRechargeAmount": { + "description": "新增充值金额", + "type": "integer" + }, + "newRechargeCount": { + "description": "新增充值", + "type": "integer" + }, + "newRechargeRate": { + "description": "充值率", + "type": "number" + }, + "newVipRecharge": { + "description": "新增VIP充值", + "type": "integer" + }, + "newWebCount": { + "description": "官网注册", + "type": "integer" + }, + "oldCoinRecharge": { + "description": "老用户金币充值", + "type": "integer" + }, + "oldRechargeAmount": { + "description": "新用户和老用户充值", + "type": "integer" + }, + "oldVipRecharge": { + "description": "老用户VIP充值", + "type": "integer" + }, + "payForAthor": { + "description": "金币充值", + "type": "integer" + }, + "rechargeSuccessRate": { + "description": "支付成功率", + "type": "string" + }, + "repeatAmount": { + "description": "复冲金额", + "type": "integer" + }, + "repeatVipMoney": { + "description": "复冲VIP", + "type": "integer" + }, + "successRechargeOrder": { + "description": "订单统计", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "todayAndroidRecharge": { + "description": "当日android充值", + "type": "integer" + }, + "todayAndroidVisitCount": { + "description": "当日安卓访问量(日活)", + "type": "integer" + }, + "todayDistrictRecharge": { + "description": "当日渠道充值新增", + "type": "integer" + }, + "todayDistrictVisitCount": { + "description": "当日渠道访问量", + "type": "integer" + }, + "todayH5AndroidRecharge": { + "description": "当日H5Android充值", + "type": "integer" + }, + "todayH5AndroidVisitCount": { + "description": "当日H5Android访问量(日活)", + "type": "integer" + }, + "todayH5FormalRecharge": { + "description": "当日H5Formal充值", + "type": "integer" + }, + "todayH5IosRecharge": { + "description": "当日H5Ios充值", + "type": "integer" + }, + "todayH5IosVisitCount": { + "description": "当日H5Ios访问量(日活)", + "type": "integer" + }, + "todayH5PcRecharge": { + "description": "当日H5Pc充值", + "type": "integer" + }, + "todayH5PcVisitCount": { + "description": "当日H5Pc访问量(日活)", + "type": "integer" + }, + "todayH5Recharge": { + "description": "当日H5充值", + "type": "integer" + }, + "todayH5VisitCount": { + "description": "当日H5访问量(日活)", + "type": "integer" + }, + "todayIosRecharge": { + "description": "当日Ios充值", + "type": "integer" + }, + "todayIosVisitCount": { + "description": "当日IOS访问量(日活)", + "type": "integer" + }, + "todayNormalRecharge": { + "description": "当日自来量充值新增", + "type": "integer" + }, + "todayNormalVisitCount": { + "description": "当日自来访问量", + "type": "integer" + }, + "todayWebRecharge": { + "description": "当日官网充值新增", + "type": "integer" + }, + "todayWebVisitCount": { + "description": "当日官网访问量", + "type": "integer" + }, + "totalAmount": { + "description": "充值统计", + "type": "integer" + }, + "totalNewCount": { + "description": "注册统计", + "type": "integer" + }, + "totalRechargeOrder": { + "description": "拉起订单数", + "type": "integer" + }, + "totalVisitCount": { + "description": "访问统计", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "vipPayByMoney": { + "description": "会员充值", + "type": "integer" + }, + "visitRechargeRate": { + "description": "登陆充值率", + "type": "number" + } + } + }, + "proto.DelActivityReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "唯一ID", + "type": "string" + } + } + }, + "proto.DelAdminReq": { + "type": "object", + "required": [ + "account" + ], + "properties": { + "account": { + "description": "用户id", + "type": "string" + } + } + }, + "proto.DelAdsLocReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "应用id", + "type": "integer" + } + } + }, + "proto.DelAdsReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "应用id", + "type": "integer" + } + } + }, + "proto.DelAnnounReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "公告id", + "type": "string" + } + } + }, + "proto.DelAppInfoReq": { + "type": "object", + "required": [ + "appId" + ], + "properties": { + "appId": { + "description": "appId,唯一id", + "type": "integer" + } + } + }, + "proto.DelAppLocReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "应用id", + "type": "integer" + } + } + }, + "proto.DelAppReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "proto.DelDomainInfoReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string" + } + } + }, + "proto.DelGiftReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "奖品唯一ID", + "type": "string" + } + } + }, + "proto.DelLandPageConfigReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "Id", + "type": "integer" + } + } + }, + "proto.DelLandingPageReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "Id", + "type": "integer" + } + } + }, + "proto.DelLotteryCodeReq": { + "type": "object", + "required": [ + "lotteryCodeId" + ], + "properties": { + "lotteryCodeId": { + "description": "唯一ID", + "type": "string" + } + } + }, + "proto.DelRoleReq": { + "type": "object", + "required": [ + "roleId" + ], + "properties": { + "roleId": { + "description": "id", + "type": "integer" + } + } + }, + "proto.DownloadStatInfo": { + "type": "object", + "properties": { + "appId": { + "type": "integer" + }, + "appName": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "downTotal": { + "description": "下载总数", + "type": "integer" + }, + "downUnique": { + "description": "去重下载数(IP来自独立访问集合)", + "type": "integer" + }, + "downloadToInstallRate": { + "description": "下载安装转化率", + "type": "number" + }, + "endDate": { + "description": "这个不展示", + "type": "string" + }, + "hour": { + "description": "小时统计展示,每日统计不展示", + "type": "integer" + }, + "id": { + "type": "string" + }, + "installTotal": { + "description": "安装总数", + "type": "integer" + }, + "installUnique": { + "description": "去重安装数(IP来自下载独立集合)", + "type": "integer" + }, + "sumDate": { + "description": "日期", + "type": "string" + }, + "type": { + "description": "这个不展示", + "allOf": [ + { + "$ref": "#/definitions/downloadstat.StatType" + } + ] + }, + "updatedAt": { + "type": "string" + }, + "visitCount": { + "description": "访问总数", + "type": "integer" + }, + "visitToDownloadRate": { + "description": "浏览下载转化率", + "type": "number" + }, + "visitToInstallRate": { + "description": "浏览安装转化率", + "type": "number" + }, + "visitUnique": { + "description": "去重访问数", + "type": "integer" + } + } + }, + "proto.DownloadSummaryInfo": { + "type": "object", + "properties": { + "appId": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "proto.DrawReq": { + "type": "object", + "required": [ + "actId", + "ip", + "lotteryCode" + ], + "properties": { + "actId": { + "description": "活动ID", + "type": "string" + }, + "ip": { + "description": "用户IP", + "type": "string" + }, + "lotteryCode": { + "description": "抽奖码", + "type": "string" + } + } + }, + "proto.FindLandPageConfigReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "status": { + "type": "boolean" + }, + "type": { + "type": "integer" + } + } + }, + "proto.FindLandingPageReq": { + "type": "object", + "required": [ + "appId", + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.GenGiftCodeRes": { + "type": "object", + "properties": { + "codeLen": { + "description": "生成奖品兑换码的长度", + "type": "integer" + }, + "codeNum": { + "description": "生成奖品兑换码的数量", + "type": "integer" + }, + "giftId": { + "description": "奖品唯一ID", + "type": "string" + } + } + }, + "proto.GenLotteryCodeReq": { + "type": "object", + "required": [ + "actId", + "codeLen", + "codeNum" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "codeLen": { + "description": "抽奖码长度", + "type": "integer" + }, + "codeNum": { + "description": "生产的抽奖码个数", + "type": "integer" + } + } + }, + "proto.GetApplicationsReq": { + "type": "object", + "required": [ + "pageSize" + ], + "properties": { + "androidUrl": { + "description": "安卓链接", + "type": "string" + }, + "category": { + "description": "分类ID", + "type": "integer" + }, + "download_url": { + "description": "下载地址", + "type": "string" + }, + "id": { + "type": "string" + }, + "iosUrl": { + "description": "ios链接", + "type": "string" + }, + "isHighQuality": { + "description": "是否是优质APP推荐", + "type": "boolean" + }, + "locIds": { + "description": "位置id", + "type": "array", + "items": { + "type": "integer" + } + }, + "name": { + "description": "应用名", + "type": "string" + }, + "pageNum": { + "description": "分页参数", + "type": "integer" + }, + "pageSize": { + "description": "分页参数", + "type": "integer" + }, + "parentAppId": { + "description": "所属appId", + "type": "integer" + }, + "status": { + "description": "Tag *common.AppReqType ` + "`" + `json:\"tag\" bson:\"tag\"` + "`" + ` //标签", + "type": "boolean" + } + } + }, + "proto.GetApplicationsResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/applicationmod.Application" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.GetApplyFormReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + } + } + }, + "proto.GetApplyFormResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.ApplyFormRecord" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.GetGiftInfoReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "所属活动的名称", + "type": "string" + }, + "appName": { + "description": "所属app的名字", + "type": "string" + }, + "giftCode": { + "description": "奖品兑换码", + "type": "string" + }, + "giftId": { + "description": "所属活动奖品的ID", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "isGaveOut": { + "description": "兑换码是否已发放", + "type": "boolean" + }, + "isUsed": { + "description": "奖品兑换码是否已使用", + "type": "boolean" + }, + "lotteryCode": { + "description": "抽奖码", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "userId": { + "description": "兑换者Id", + "type": "string" + } + } + }, + "proto.GetGiftInfoResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.LotteryGetGift" + } + }, + "total": { + "description": "数量", + "type": "integer" + } + } + }, + "proto.GetLandPageConfigByTypeReq": { + "type": "object", + "required": [ + "appId", + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "type": { + "type": "integer" + } + } + }, + "proto.GetSettlementApplicantListReq": { + "type": "object" + }, + "proto.GetSettlementApplicantListResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "proto.GiftInfo": { + "type": "object", + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "所属活动的名称", + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "giftDesc": { + "description": "奖品描述", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "giftNum": { + "description": "抽奖码总数量", + "type": "integer" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "rate": { + "description": "备注", + "type": "integer" + }, + "receivedGiftNum": { + "description": "抽奖码已使用数量", + "type": "integer" + }, + "sort": { + "description": "排序", + "type": "integer" + }, + "updatedAt": { + "type": "string" + } + } + }, + "proto.GiftListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "giftDesc": { + "description": "奖品描述", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "rate": { + "description": "备注", + "type": "integer" + } + } + }, + "proto.GiftListResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.GiftInfo" + } + }, + "total": { + "description": "数量", + "type": "integer" + } + } + }, + "proto.H5ConfigReq": { + "type": "object", + "properties": { + "appId": { + "description": "AppID", + "type": "integer" + }, + "dc": { + "description": "商区渠道号", + "type": "string" + }, + "pc": { + "description": "用户渠道号,即用户邀请码", + "type": "string" + } + } + }, + "proto.H5GiftInfo": { + "type": "object", + "properties": { + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "id": { + "description": "奖品ID", + "type": "string" + } + } + }, + "proto.InnerRechargeReq": { + "type": "object", + "properties": { + "innerId": { + "type": "integer" + } + } + }, + "proto.LandPageConfigListResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/landPageConfig.LandPageConfig" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.LandingPageConfig": { + "type": "object", + "properties": { + "actor": { + "description": "演员", + "type": "string" + }, + "addedTime": { + "description": "上架时间(审核通过时间)", + "type": "string" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "media": { + "description": "视频", + "type": "string" + }, + "picture": { + "description": "图片", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "title": { + "description": "主题", + "type": "string" + } + } + }, + "proto.LandingPageInfo": { + "type": "object", + "required": [ + "status", + "type" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channelCode": { + "description": "渠道码", + "type": "string" + }, + "id": { + "description": "Id", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 默认true", + "type": "boolean" + }, + "type": { + "description": "类型 1:渠道 2:分享", + "type": "integer" + }, + "url": { + "description": "Url", + "type": "string" + } + } + }, + "proto.LandingPageListRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.LandingPageInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.LandpagePictureAddReq": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "mobileAvatar": { + "description": "移动端图片", + "type": "string" + }, + "mobileBackgroud": { + "description": "移动端背景图", + "type": "string" + }, + "mobileTiltle": { + "description": "移动端标语", + "type": "string" + }, + "music": { + "description": "音频文件", + "type": "string" + }, + "name": { + "description": "图片名称", + "type": "string" + }, + "pcAvatar": { + "description": "PC端图片", + "type": "string" + }, + "pcBackgroud": { + "description": "PC端背景图", + "type": "string" + }, + "pcTitle": { + "description": "PC端标语", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.LandpagePictureDelReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "proto.LandpagePictureSearch": { + "type": "object", + "properties": { + "name": { + "description": "分类名称", + "type": "string" + }, + "pageNum": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + } + } + }, + "proto.LandpagePictureSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/landpageImg.LandpageImg" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.LandpagePictureUpdate": { + "type": "object", + "properties": { + "mobileAvatar": { + "description": "移动端图片", + "type": "string" + }, + "mobileBackgroud": { + "description": "移动端背景图", + "type": "string" + }, + "mobileTiltle": { + "description": "移动端标语", + "type": "string" + }, + "music": { + "description": "音频文件", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "pcAvatar": { + "description": "PC端图片", + "type": "string" + }, + "pcBackgroud": { + "description": "PC端背景图", + "type": "string" + }, + "pcTitle": { + "description": "PC端标语", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.LandpagePictureUpdateReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "param": { + "description": "参数", + "allOf": [ + { + "$ref": "#/definitions/proto.LandpagePictureUpdate" + } + ] + } + } + }, + "proto.LinkInfo": { + "type": "object", + "properties": { + "foreign": { + "description": "true 国外用户", + "type": "boolean" + }, + "link": { + "description": "链接地址", + "type": "string" + }, + "weight": { + "description": "权重", + "type": "integer" + } + } + }, + "proto.ListAdsLocReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId,过滤条件", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ListAdsLocRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AdsLocInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListAdsReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId,过滤条件", + "type": "integer" + }, + "isActive": { + "description": "appId,过滤条件", + "type": "boolean" + }, + "link": { + "description": "链接地址", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "title": { + "description": "广告标题", + "type": "string" + } + } + }, + "proto.ListAdsRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AdsInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListAnnounReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "应用id 筛选条件", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ListAnnounRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AnnounInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListAppInfoReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appName": { + "description": "appId", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "used": { + "description": "渠道", + "type": "boolean" + } + } + }, + "proto.ListAppInfoRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AppInfoRes" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListAppLocReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId,过滤条件", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ListAppLocRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AppLocInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListBlocDailyStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocDailyStatRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.BlocDailyStatInfo" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/proto.BlocDailyStatInfo" + } + } + }, + "proto.ListBlocDailyStatTotalReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocDailyStatTotalRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.BlocDailyStatTotalInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListBlocRechargeChannelInfo": { + "type": "object", + "properties": { + "blocChannelRate": { + "description": "费率", + "type": "integer" + }, + "blocOrderMoney": { + "description": "订单金额", + "type": "integer" + }, + "channelName": { + "description": "支付渠道名称", + "type": "string" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + } + } + }, + "proto.ListBlocRechargeChannelReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channelName": { + "description": "渠道名称筛选", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocRechargeChannelRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.ListBlocRechargeChannelInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListBlocRechargeDetailsReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocRechargeDetailsRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.BlocRechargeDetailsInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListBlocRegisterDetailsReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocRegisterDetailsRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.BlocRegisterDetailsInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListBlocWithdrawDetailsInfo": { + "type": "object", + "required": [ + "money", + "payType" + ], + "properties": { + "act": { + "description": "交易账户", + "type": "string" + }, + "actName": { + "description": "交易账户持有人", + "type": "string" + }, + "amount": { + "description": "金币数量", + "type": "integer" + }, + "appName": { + "description": "appID", + "type": "string" + }, + "devID": { + "description": "设备id", + "type": "string" + }, + "deviceType": { + "description": "设备类型", + "type": "string" + }, + "money": { + "description": "提现金额", + "type": "integer" + }, + "name": { + "description": "用户名", + "type": "string" + }, + "oid": { + "description": "第三方支付平台id", + "type": "string" + }, + "payMoney": { + "description": "实际到账", + "type": "integer" + }, + "payType": { + "description": "提现方式,alipay,bankcard", + "type": "string" + }, + "receivedAt": { + "description": "到账时间 李秋山确认 三方出款时间", + "type": "string" + }, + "status": { + "description": "1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败", + "type": "integer" + }, + "statusDesc": { + "description": "状态说明", + "type": "string" + }, + "successAt": { + "description": "回调成功时间", + "type": "string" + }, + "uid": { + "description": "用户Id", + "type": "string" + }, + "userIp": { + "description": "用户ip", + "type": "string" + } + } + }, + "proto.ListBlocWithdrawDetailsReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocWithdrawDetailsRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.ListBlocWithdrawDetailsInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListDailyHourStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "sumHour": { + "description": "小时数", + "type": "integer" + } + } + }, + "proto.ListDailyHourStatRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.DailyHourStatInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListDailyStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "array", + "items": { + "type": "integer" + } + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListDailyStatRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.DailyStatInfo" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/proto.DailyStatInfo" + } + } + }, + "proto.ListDomainInfoReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "type": "integer" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/domainmod.Category" + } + ] + }, + "check": { + "description": "检测方式", + "allOf": [ + { + "$ref": "#/definitions/domainmod.CheckType" + } + ] + }, + "enable": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/domainmod.CheckStatus" + } + ] + } + } + }, + "proto.ListDomainInfoRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.Domain" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListDownloadSummaryRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.DownloadSummaryInfo" + } + } + } + }, + "proto.ListHourStatLineInfo": { + "type": "object", + "properties": { + "HourH5Recharge": { + "description": "H5充值", + "type": "integer" + }, + "hourAndroidNew": { + "description": "android新增", + "type": "integer" + }, + "hourAndroidRecharge": { + "description": "android充值", + "type": "integer" + }, + "hourDistrictRecharge": { + "description": "//////", + "type": "integer" + }, + "hourDistrictVip": { + "description": "渠道VIP充值", + "type": "integer" + }, + "hourH5AndroidNew": { + "description": "H5Android新增", + "type": "integer" + }, + "hourH5AndroidRecharge": { + "description": "H5Android充值", + "type": "integer" + }, + "hourH5IosNew": { + "description": "H5Ios新增", + "type": "integer" + }, + "hourH5IosRecharge": { + "description": "H5Ios充值", + "type": "integer" + }, + "hourH5New": { + "description": "H5新增", + "type": "integer" + }, + "hourH5PcNew": { + "description": "H5Pc新增", + "type": "integer" + }, + "hourH5PcRecharge": { + "description": "H5Pc充值", + "type": "integer" + }, + "hourIosNew": { + "description": "Ios新增", + "type": "integer" + }, + "hourIosRecharge": { + "description": "Ios充值", + "type": "integer" + }, + "hourNew": { + "description": "新增", + "type": "integer" + }, + "hourNewDistrict": { + "description": "渠道新增", + "type": "integer" + }, + "hourNewNormal": { + "description": "自来量新增", + "type": "integer" + }, + "hourNewWeb": { + "description": "官网新增", + "type": "integer" + }, + "hourNormalRecharge": { + "description": "自来量充值", + "type": "integer" + }, + "hourNormalVip": { + "description": "自来量VIP充值", + "type": "integer" + }, + "hourVipRecharge": { + "description": "VIP充值", + "type": "integer" + }, + "hourWebRecharge": { + "description": "官网充值", + "type": "integer" + }, + "hourWebVip": { + "description": "官网VIP充值", + "type": "integer" + }, + "sumDate": { + "description": "记录时间,当日零点时间", + "type": "string" + } + } + }, + "proto.ListHourStatLineReq": { + "type": "object", + "required": [ + "appId", + "sumDate" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "compareTime": { + "description": "对比时间", + "type": "string" + }, + "sumDate": { + "description": "请求日的零点时间", + "type": "string" + } + } + }, + "proto.ListHourStatLineResp": { + "type": "object", + "properties": { + "appInfo": { + "description": "app信息", + "allOf": [ + { + "$ref": "#/definitions/proto.AppInfoRes" + } + ] + }, + "todayGraphList": { + "description": "今日曲线图数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.ListHourStatLineInfo" + } + }, + "yesterdayGraphList": { + "description": "昨日曲线图数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.ListHourStatLineInfo" + } + } + } + }, + "proto.ListLandPageStatRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.DownloadStatInfo" + } + }, + "summary": { + "$ref": "#/definitions/proto.DownloadStatInfo" + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListMinuteStatReq": { + "type": "object", + "required": [ + "appId", + "sumDate" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "compareTime": { + "description": "对比时间", + "type": "string" + }, + "sumDate": { + "description": "请求日的零点时间", + "type": "string" + } + } + }, + "proto.ListMinuteStatRes": { + "type": "object", + "properties": { + "appInfo": { + "description": "app信息", + "allOf": [ + { + "$ref": "#/definitions/proto.AppInfoRes" + } + ] + }, + "todayGraphList": { + "description": "今日曲线图数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.MinuteStatInfo" + } + }, + "yesterdayGraphList": { + "description": "昨日曲线图数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.MinuteStatInfo" + } + } + } + }, + "proto.ListOpLogReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "isAdmin": { + "description": "是否是管理员 true: 管理员 false: 代理商", + "type": "boolean" + }, + "operator": { + "description": "操作人员", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "router": { + "description": "路由", + "type": "string" + } + } + }, + "proto.ListOpLogRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.OpLogInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.LotteryCodeListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "活动名称", + "type": "string" + }, + "giftCode": { + "description": "奖品兑换码", + "type": "string" + }, + "isUsed": { + "description": "抽奖码是否已使用", + "type": "boolean" + }, + "lotteryCode": { + "description": "抽奖码", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "userIp": { + "description": "抽奖者IP", + "type": "string" + } + } + }, + "proto.LotteryCodeListResp": { + "type": "object", + "properties": { + "list": { + "description": "活动抽奖码列表", + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.LottertyCodeInfo" + } + }, + "total": { + "description": "数量", + "type": "integer" + } + } + }, + "proto.MediaTagAddReq": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "name": { + "description": "标签名称", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "type": { + "description": "类别", + "allOf": [ + { + "$ref": "#/definitions/mediatag.MediaTagType" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.MediaTagDelReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "proto.MediaTagSearch": { + "type": "object", + "properties": { + "name": { + "description": "分类名称", + "type": "string" + }, + "pageNum": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "type": { + "description": "类别", + "allOf": [ + { + "$ref": "#/definitions/mediatag.MediaTagType" + } + ] + } + } + }, + "proto.MediaTagSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/mediatag.MediaTag" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.MediaTagUpdate": { + "type": "object", + "properties": { + "name": { + "description": "名称", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "type": { + "description": "类", + "allOf": [ + { + "$ref": "#/definitions/mediatag.MediaTagType" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.MediaTagUpdateReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "param": { + "description": "参数", + "allOf": [ + { + "$ref": "#/definitions/proto.MediaTagUpdate" + } + ] + } + } + }, + "proto.MinuteStatInfo": { + "type": "object", + "properties": { + "accessCount": { + "description": "访问量", + "type": "integer" + }, + "androidAccessCount": { + "description": "android访问量", + "type": "integer" + }, + "androidAddCount": { + "description": "android新增", + "type": "integer" + }, + "h5AddCount": { + "description": "H5新增", + "type": "integer" + }, + "iosAccessCount": { + "description": "ios访问量", + "type": "integer" + }, + "iosAddCount": { + "description": "ios新增", + "type": "integer" + }, + "landpageAndroidClick": { + "description": "落地页android访问次数", + "type": "integer" + }, + "landpageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landpageIosAthorClick": { + "description": "落地页iOS其他包访问次数", + "type": "integer" + }, + "landpageIosH5Click": { + "description": "落地页H5访问次数", + "type": "integer" + }, + "lightGuestAddCount": { + "description": "轻量版新增", + "type": "integer" + }, + "newCount": { + "description": "新增数", + "type": "integer" + }, + "rechageCount": { + "description": "充值订单", + "type": "integer" + }, + "rechageMoney": { + "description": "充值金额", + "type": "integer" + }, + "sumDate": { + "description": "记录时间,当日零点时间", + "type": "string" + } + } + }, + "proto.MonitorAddReq": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/monitormod.MonitorCategory" + } + ] + }, + "checkCount": { + "description": "检测次数", + "type": "integer" + }, + "comment": { + "description": "注释", + "type": "string" + }, + "compare": { + "description": "比较", + "allOf": [ + { + "$ref": "#/definitions/monitormod.Compare" + } + ] + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "device": { + "description": "设备", + "allOf": [ + { + "$ref": "#/definitions/statutils.DeviceName" + } + ] + }, + "duration": { + "description": "时间段,单位分钟", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "threshold": { + "description": "阀值", + "type": "integer" + }, + "triggerCount": { + "description": "触发次数", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.MonitorDelReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "proto.MonitorSearch": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "category": { + "description": "监控分类", + "allOf": [ + { + "$ref": "#/definitions/monitormod.MonitorCategory" + } + ] + }, + "device": { + "description": "设备类型", + "allOf": [ + { + "$ref": "#/definitions/statutils.DeviceName" + } + ] + }, + "name": { + "description": "分类名称", + "type": "string" + }, + "pageNum": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + } + } + }, + "proto.MonitorSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/monitormod.Monitor" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.MonitorUpdate": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/monitormod.MonitorCategory" + } + ] + }, + "comment": { + "description": "注释", + "type": "string" + }, + "compare": { + "description": "比较", + "allOf": [ + { + "$ref": "#/definitions/monitormod.Compare" + } + ] + }, + "device": { + "description": "设备", + "allOf": [ + { + "$ref": "#/definitions/statutils.DeviceName" + } + ] + }, + "duration": { + "description": "时间段,单位分钟", + "type": "integer" + }, + "name": { + "description": "分类名称", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "threshold": { + "description": "阀值", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.MonitorUpdateReq": { + "type": "object", + "required": [ + "id", + "param" + ], + "properties": { + "id": { + "type": "string" + }, + "param": { + "description": "参数", + "allOf": [ + { + "$ref": "#/definitions/proto.MonitorUpdate" + } + ] + } + } + }, + "proto.OpLogInfo": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "data": { + "description": "操作数据", + "type": "string" + }, + "isAdmin": { + "description": "是否是管理员", + "type": "boolean" + }, + "operator": { + "description": "操作人员", + "type": "string" + }, + "router": { + "description": "接口路由", + "type": "string" + } + } + }, + "proto.PageButtonClickReq": { + "type": "object", + "required": [ + "terminal" + ], + "properties": { + "appId": { + "description": "AppID", + "type": "integer" + }, + "channel": { + "description": "渠道(json字符串)", + "type": "string" + }, + "domain": { + "description": "落地页域名", + "type": "string" + }, + "ip": { + "description": "ip", + "type": "string" + }, + "packageType": { + "description": "包类型 1:企业包 2:商店包 3:TF包 4:超级签 5:轻量版", + "allOf": [ + { + "$ref": "#/definitions/versionMod.PkgType" + } + ] + }, + "terminal": { + "description": "终端ios android", + "type": "string" + } + } + }, + "proto.PageButtonClickResp": { + "type": "object", + "required": [ + "packageType" + ], + "properties": { + "BackUrl": { + "description": "企业签URL (不用)", + "type": "string" + }, + "lightData": { + "description": "如果是轻量版,返回数据", + "type": "array", + "items": { + "type": "integer" + } + }, + "link": { + "description": "下载链接", + "type": "array", + "items": { + "type": "string" + } + }, + "packageType": { + "description": "包类型 1:企业包 2:商店包 3:TF包", + "allOf": [ + { + "$ref": "#/definitions/versionMod.PkgType" + } + ] + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "terminal": { + "description": "终端ios android light", + "type": "string" + }, + "tf": { + "description": "TFinfo", + "type": "array", + "items": { + "$ref": "#/definitions/proto.TfInfo" + } + }, + "versionNum": { + "description": "版本号", + "type": "string" + } + } + }, + "proto.PageButtonListReq": { + "type": "object", + "properties": { + "appId": { + "description": "AppID", + "type": "integer" + }, + "channel": { + "description": "渠道(json字符串)", + "type": "string" + }, + "domain": { + "description": "落地页域名", + "type": "string" + }, + "ip": { + "description": "ip", + "type": "string" + } + } + }, + "proto.PageButtonListResp": { + "type": "object", + "properties": { + "androidButton": { + "description": "android下载按钮", + "type": "integer" + }, + "contact": { + "description": "联系方式", + "allOf": [ + { + "$ref": "#/definitions/proto.ContactInfo" + } + ] + }, + "hasChannelApk": { + "description": "有安卓渠道包", + "type": "boolean" + }, + "iosDown": { + "description": "显示完整版,是企业包", + "type": "boolean" + }, + "iosH5": { + "description": "H5跳转链接", + "type": "boolean" + }, + "iosStore": { + "description": "显示商店包", + "type": "boolean" + }, + "iosTF": { + "description": "TF包", + "type": "boolean" + }, + "pictureList": { + "description": "资源数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.PageButtonPicture" + } + } + } + }, + "proto.PageButtonPicture": { + "type": "object", + "properties": { + "mobileAvatar": { + "description": "移动端图片", + "type": "string" + }, + "mobileBackgroud": { + "description": "移动端背景图", + "type": "string" + }, + "mobileTiltle": { + "description": "移动端标语", + "type": "string" + }, + "music": { + "description": "音频文件", + "type": "string" + }, + "pcAvatar": { + "description": "PC端图片", + "type": "string" + }, + "pcBackgroud": { + "description": "PC端背景图", + "type": "string" + }, + "pcTitle": { + "description": "PC端标语", + "type": "string" + } + } + }, + "proto.RoleInfo": { + "type": "object", + "properties": { + "authJson": { + "description": "权限json数据", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "role": { + "description": "角色", + "type": "string" + }, + "roleId": { + "description": "id", + "type": "integer" + }, + "updatedAt": { + "description": "修改时间", + "type": "string" + } + } + }, + "proto.RoleListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.RoleListRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.RoleInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.SearchChannelStatComparedReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "withChild": { + "description": "包含子渠道", + "type": "boolean" + } + } + }, + "proto.SearchChannelStatComparedResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStatYesterday" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.SendTgMessageReq": { + "type": "object", + "properties": { + "appId": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "msgType": { + "$ref": "#/definitions/proto.TgMsgType" + } + } + }, + "proto.SendTgMessageRes": { + "type": "object" + }, + "proto.SettlementCalcReq": { + "type": "object", + "required": [ + "appId", + "channel", + "ruleId", + "settleIds" + ], + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "beginTime": { + "description": "开始时间", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "ruleId": { + "description": "扣量RuleId", + "type": "string" + }, + "settleIds": { + "description": "要结算的天记录ID列表", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "proto.SettlementCalcResp": { + "type": "object", + "properties": { + "totalCount": { + "description": "总条数", + "type": "integer" + }, + "totalDesc": { + "description": "总收益描述", + "type": "string" + }, + "totalIncome": { + "description": "总收益(列表的所有数据合计)", + "type": "integer" + }, + "totalInfo": { + "description": "按总条数合计的数据", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + ] + } + } + }, + "proto.SettlementInfoAdd": { + "type": "object", + "required": [ + "appId", + "beginTime", + "channel", + "endTime", + "totalMoney" + ], + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "beginTime": { + "description": "开始时间", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "totalMoney": { + "description": "总金额", + "type": "integer" + } + } + }, + "proto.SettlementInfoDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "ID", + "type": "string" + } + } + }, + "proto.SettlementInfoDetail": { + "type": "object", + "required": [ + "id", + "pageNum", + "pageSize" + ], + "properties": { + "id": { + "description": "ID", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.SettlementInfoDetailResp": { + "type": "object", + "properties": { + "count": { + "description": "总条数", + "type": "integer" + }, + "list": { + "description": "全部记录", + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + } + } + }, + "proto.SettlementInfoSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "applicants": { + "description": "申请人列表", + "type": "array", + "items": { + "type": "string" + } + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "payType": { + "description": "支付类型,1ERC 2TRC 3銀行卡 4支付寶", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "status": { + "description": "状态数组", + "type": "array", + "items": { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + } + } + }, + "proto.SettlementInfoSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/channelsettlementrecord.ChannelSettlementRecord" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.SettlementInfoUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "ID", + "type": "string" + }, + "payMoney": { + "description": "打款金额", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + }, + "usdt": { + "description": "打款Usdt 还是分", + "type": "integer" + } + } + }, + "proto.ShareUrlReq": { + "type": "object", + "properties": { + "appid": { + "description": "AppID", + "type": "integer" + } + } + }, + "proto.StatDataDetail": { + "type": "object", + "properties": { + "childRebate": { + "description": "子渠道返佣", + "type": "integer" + }, + "directCount": { + "description": "新增总量(包含子渠道和渠道本身)", + "type": "integer" + }, + "directCountChild": { + "description": "子渠道新增量", + "type": "integer" + }, + "directCountSelf": { + "description": "自身渠道新增量", + "type": "integer" + }, + "income": { + "description": "收益(自身+子渠道)", + "type": "integer" + }, + "incomeChild": { + "description": "子渠道的收益", + "type": "integer" + }, + "incomeSelf": { + "description": "自身渠道的收益", + "type": "integer" + }, + "recharge": { + "description": "充值金额(包含子渠道和渠道本身)", + "type": "integer" + }, + "rechargeChild": { + "description": "来自子渠道充值金额", + "type": "integer" + }, + "rechargeSelf": { + "description": "来自自身渠道充值金额", + "type": "integer" + }, + "visitCount": { + "description": "访问总量(包含子渠道和渠道本身)", + "type": "integer" + } + } + }, + "proto.StatDataSimple": { + "type": "object", + "properties": { + "directCount": { + "description": "新增总量(包含子渠道和渠道本身)", + "type": "integer" + }, + "income": { + "description": "收益(自身+子渠道)", + "type": "integer" + }, + "recharge": { + "description": "充值金额(包含子渠道和渠道本身)", + "type": "integer" + }, + "visitCount": { + "description": "访问总量(包含子渠道和渠道本身)", + "type": "integer" + } + } + }, + "proto.TfInfo": { + "type": "object", + "properties": { + "BackUrl": { + "description": "企业签URL", + "type": "string" + }, + "appIcon": { + "description": "应用图标", + "type": "string" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "url": { + "description": "URL", + "type": "string" + } + } + }, + "proto.TgMsgType": { + "type": "integer", + "enum": [ + 0, + 1 + ], + "x-enum-comments": { + "TgMsgTypeBackendRechargeMonitor": "后台充值监控" + }, + "x-enum-varnames": [ + "TgMsgTypeNone", + "TgMsgTypeBackendRechargeMonitor" + ] + }, + "proto.UpdateActivityReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "background": { + "description": "背景图", + "type": "string" + }, + "banner": { + "description": "banner列表", + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.BannerInfo" + } + }, + "desc": { + "description": "活动描述", + "type": "string" + }, + "enable": { + "description": "活动开关", + "type": "boolean" + }, + "endTime": { + "description": "活动结束时间", + "type": "string" + }, + "giftDesc": { + "description": "奖励说明", + "type": "string" + }, + "h5Domain": { + "description": "活动H5地址", + "type": "string" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "name": { + "description": "活动名称", + "type": "string" + }, + "sortCode": { + "description": "排序号", + "type": "integer" + }, + "startTime": { + "description": "活动开始时间", + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "proto.UpdateAdminReq": { + "type": "object", + "required": [ + "account" + ], + "properties": { + "account": { + "description": "用户名", + "type": "string" + }, + "blocRole": { + "description": "角色", + "type": "integer" + }, + "merchantId": { + "description": "商人id", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + }, + "roleId": { + "description": "角色id", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "integer" + } + } + }, + "proto.UpdateAdsLocReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "id": { + "description": "id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.UpdateAdsReq": { + "type": "object", + "properties": { + "ambientColor": { + "description": "氛围色", + "type": "string" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "coverImg": { + "description": "封面", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "id": { + "description": "广告id", + "type": "integer" + }, + "isActive": { + "description": "是否激活", + "type": "boolean" + }, + "jumpType": { + "description": "跳转方式 0:外部浏览器跳转 1:内部浏览器跳转 2:app内部跳转", + "allOf": [ + { + "$ref": "#/definitions/advertiseMod.JumpType" + } + ] + }, + "links": { + "description": "链接地址", + "type": "array", + "items": { + "$ref": "#/definitions/proto.LinkInfo" + } + }, + "locId": { + "description": "位置", + "type": "integer" + }, + "remark": { + "type": "string" + }, + "sort": { + "description": "排序值--优先级", + "type": "integer" + }, + "startTime": { + "description": "开始时间s", + "type": "string" + }, + "tags": { + "description": "广告标签", + "type": "string" + }, + "title": { + "description": "广告标题", + "type": "string" + }, + "visibleChannels": { + "description": "可见的渠道,可输入多个渠道,用英文逗号\",\"分隔开", + "type": "string" + } + } + }, + "proto.UpdateAnnounReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "active": { + "description": "是否激活", + "type": "boolean" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "content": { + "description": "公告内容", + "type": "string" + }, + "cover": { + "description": "公告封面图", + "type": "string" + }, + "endTime": { + "description": "公告结束时间", + "type": "string" + }, + "href": { + "description": "公告跳转地址", + "type": "string" + }, + "id": { + "description": "公告id", + "type": "string" + }, + "startTime": { + "description": "公告开始时间", + "type": "string" + }, + "title": { + "description": "公告标题", + "type": "string" + }, + "type": { + "description": "公告类型 0,外部连接;1,直接安装app", + "type": "integer" + } + } + }, + "proto.UpdateAppInfoReq": { + "type": "object", + "required": [ + "appId" + ], + "properties": { + "advertiseNewNum": { + "description": "广告新增系数", + "type": "integer" + }, + "advertiseNum": { + "description": "广告系数", + "type": "integer" + }, + "appId": { + "description": "appId,唯一id", + "type": "integer" + }, + "iconImg": { + "description": "应用图标", + "type": "string" + }, + "landPages": { + "description": "落地页列表", + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "description": "app名称", + "type": "string" + } + } + }, + "proto.UpdateAppLocReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "id": { + "description": "id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.UpdateDomainInfoReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string" + }, + "update": { + "$ref": "#/definitions/domainmod.DomainDoc" + } + } + }, + "proto.UpdateGiftReq": { + "type": "object", + "required": [ + "actId", + "id" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "所属活动的名称", + "type": "string" + }, + "giftDesc": { + "description": "奖品描述", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "id": { + "description": "奖品唯一ID", + "type": "string" + }, + "rate": { + "description": "中奖率", + "type": "integer" + }, + "sort": { + "description": "排序", + "type": "integer" + }, + "updatedAt": { + "type": "string" + } + } + }, + "proto.UpdateLandingPageReq": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "channelCode": { + "description": "渠道码", + "type": "string" + }, + "id": { + "description": "Id", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 默认true", + "type": "boolean" + }, + "type": { + "description": "类型 1:渠道 2:分享", + "type": "integer" + }, + "url": { + "description": "Url", + "type": "string" + } + } + }, + "proto.UpdateLotteryCodeReq": { + "type": "object", + "required": [ + "lotteryCodeId" + ], + "properties": { + "lotteryCodeId": { + "description": "抽奖码Id", + "type": "string" + }, + "mark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.UpdateRoleReq": { + "type": "object", + "required": [ + "roleId" + ], + "properties": { + "authJson": { + "description": "权限json数据", + "type": "string" + }, + "role": { + "description": "角色", + "type": "string" + }, + "roleId": { + "description": "id", + "type": "integer" + } + } + }, + "proto.UserInfoSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "渠道对应的appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "id": { + "description": "用户ID", + "type": "integer" + }, + "ip": { + "description": "IP", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.VersionAddReq": { + "type": "object", + "required": [ + "appId", + "link", + "packageType", + "terminal", + "versionNum" + ], + "properties": { + "appId": { + "description": "APPID", + "type": "integer" + }, + "backLink": { + "description": "企业签", + "type": "string" + }, + "info": { + "description": "版本描述", + "type": "string" + }, + "isForceUpdate": { + "description": "是否强更", + "type": "boolean" + }, + "link": { + "description": "下载链接", + "type": "array", + "items": { + "type": "string" + } + }, + "md5": { + "description": "MD5验证", + "type": "string" + }, + "minVersion": { + "description": "最小版本", + "type": "string" + }, + "packageType": { + "description": "包类型:1-企业包、2-商店包、3-tf包(下拉框)", + "allOf": [ + { + "$ref": "#/definitions/versionMod.PkgType" + } + ] + }, + "size": { + "description": "更新版本大小M", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "terminal": { + "description": "终端 ios android(安卓,苹果下拉框选择)", + "type": "string" + }, + "versionNum": { + "description": "版本号", + "type": "string" + } + } + }, + "proto.VersionDelReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "版本ID", + "type": "integer" + } + } + }, + "proto.VersionInfo": { + "type": "object", + "properties": { + "appId": { + "description": "APPID", + "type": "integer" + }, + "appname": { + "description": "APP名称", + "type": "string" + }, + "backLink": { + "description": "企业签(备用连接)", + "type": "string" + }, + "id": { + "description": "ID", + "type": "integer" + }, + "info": { + "description": "版本描述", + "type": "string" + }, + "isForceUpdate": { + "description": "是否强更", + "type": "boolean" + }, + "link": { + "description": "下载链接", + "type": "array", + "items": { + "type": "string" + } + }, + "md5": { + "description": "MD5验证", + "type": "string" + }, + "minVersion": { + "description": "最小版本", + "type": "string" + }, + "packageType": { + "description": "包类型:1-企业包、2-商店包、3-tf、4-超级签", + "allOf": [ + { + "$ref": "#/definitions/versionMod.PkgType" + } + ] + }, + "size": { + "description": "更新版本大小M", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "terminal": { + "description": "终端ios android", + "type": "string" + }, + "versionNum": { + "description": "版本号", + "type": "string" + } + } + }, + "proto.VersionListResp": { + "type": "object", + "properties": { + "count": { + "description": "总条数", + "type": "integer" + }, + "data": { + "description": "数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.VersionInfo" + } + } + } + }, + "proto.VersionUpdateReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "appId": { + "description": "APPID", + "type": "integer" + }, + "backLink": { + "description": "企业签", + "type": "string" + }, + "id": { + "description": "ID", + "type": "integer" + }, + "info": { + "description": "版本描述", + "type": "string" + }, + "isForceUpdate": { + "description": "是否强更", + "type": "boolean" + }, + "link": { + "description": "下载链接", + "type": "array", + "items": { + "type": "string" + } + }, + "md5": { + "description": "MD5验证", + "type": "string" + }, + "minVersion": { + "description": "最小版本", + "type": "string" + }, + "packageType": { + "description": "包类型:1-企业包、2-商店包、3-tf", + "allOf": [ + { + "$ref": "#/definitions/versionMod.PkgType" + } + ] + }, + "size": { + "description": "更新版本大小M", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "terminal": { + "description": "终端ios android", + "type": "string" + }, + "versionNum": { + "description": "版本号", + "type": "string" + } + } + }, + "proxy.BaseInfo": { + "type": "object", + "properties": { + "actors": { + "description": "演员", + "type": "array", + "items": { + "type": "string" + } + }, + "addedTime": { + "description": "上架时间", + "type": "string" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "checkSum": { + "description": "md5校验码", + "type": "string" + }, + "country": { + "description": "国家 (国产、日本、欧美.... 前端固定)", + "type": "string" + }, + "coverImg": { + "description": "封面", + "type": "array", + "items": { + "type": "string" + } + }, + "desc": { + "description": "详细描述", + "type": "string" + }, + "director": { + "description": "导演", + "type": "array", + "items": { + "type": "string" + } + }, + "filename": { + "description": "文件名称", + "type": "string" + }, + "firstTag": { + "description": "一级标签", + "type": "string" + }, + "id": { + "type": "string" + }, + "preFileName": { + "description": "预览文件", + "type": "string" + }, + "preview": { + "description": "预览普通视频:1:预览 2:", + "type": "integer" + }, + "publish": { + "description": "视频发布者", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "secondTags": { + "description": "二级标签标签", + "type": "array", + "items": { + "type": "string" + } + }, + "size": { + "description": "文件size,单位byte", + "type": "integer" + }, + "status": { + "description": "当前状态", + "type": "string" + }, + "studio": { + "description": "工作室", + "type": "string" + }, + "title": { + "description": "标题", + "type": "string" + }, + "type": { + "description": "视频:长视频/短视频--时间阈值", + "type": "string" + }, + "uploadTime": { + "description": "上传时间", + "type": "string" + }, + "via": { + "description": "来源", + "type": "string" + }, + "videTime": { + "description": "影片时长", + "type": "integer" + } + } + }, + "proxy.MediaSearchReq": { + "type": "object", + "properties": { + "pageNum": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "param": { + "$ref": "#/definitions/proxy.VideoSearch" + } + } + }, + "proxy.MediaSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proxy.BaseInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proxy.MediasDelReq": { + "type": "object", + "properties": { + "id": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "proxy.MediasDelResp": { + "type": "object" + }, + "proxy.MediasUpdateReq": { + "type": "object", + "properties": { + "actors": { + "description": "演员", + "type": "array", + "items": { + "type": "string" + } + }, + "addedTime": { + "description": "上架时间", + "type": "string" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "country": { + "description": "国家 (国产、日本、欧美.... 前端固定)", + "type": "string" + }, + "coverImg": { + "description": "封面", + "type": "array", + "items": { + "type": "string" + } + }, + "desc": { + "description": "详细描述", + "type": "string" + }, + "director": { + "description": "导演", + "type": "array", + "items": { + "type": "string" + } + }, + "firstTag": { + "description": "一级标签", + "type": "string" + }, + "id": { + "type": "string" + }, + "preFileName": { + "description": "预览文件", + "type": "string" + }, + "preview": { + "description": "预览:1:预览 2:普通视频", + "type": "integer" + }, + "publish": { + "description": "视频发布者", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "secondTags": { + "description": "二级标签标签", + "type": "array", + "items": { + "type": "string" + } + }, + "status": { + "description": "当前状态", + "type": "string" + }, + "studio": { + "description": "工作室", + "type": "string" + }, + "title": { + "description": "标题", + "type": "string" + }, + "type": { + "description": "视频:长视频/短视频--时间阈值", + "type": "string" + }, + "uploadTime": { + "description": "上传时间", + "type": "string" + }, + "via": { + "description": "来源", + "type": "string" + } + } + }, + "proxy.MediasUpdateResp": { + "type": "object" + }, + "proxy.UploadVideoBodyResp": { + "type": "object", + "properties": { + "id": { + "description": "文件服返回的上传文件Id", + "type": "string" + }, + "videoUri": { + "description": "文件服返回的视频uri", + "type": "string" + } + } + }, + "proxy.VideoSearch": { + "type": "object", + "properties": { + "actors": { + "description": "演员", + "type": "array", + "items": { + "type": "string" + } + }, + "addedTime": { + "description": "上架时间", + "type": "string" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "country": { + "description": "国家 (国产、日本、欧美.... 前端固定)", + "type": "string" + }, + "director": { + "description": "导演", + "type": "array", + "items": { + "type": "string" + } + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "firstTag": { + "description": "一级标签", + "type": "string" + }, + "id": { + "type": "string" + }, + "preview": { + "description": "预览:1:预览 2:普通视频", + "type": "integer" + }, + "publish": { + "description": "视频发布者", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "secondTags": { + "description": "二级标签标签", + "type": "array", + "items": { + "type": "string" + } + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "status": { + "description": "当前状态", + "type": "string" + }, + "studio": { + "description": "工作室", + "type": "string" + }, + "title": { + "description": "标题", + "type": "string" + }, + "type": { + "description": "视频:长视频/短视频--时间阈值", + "type": "string" + }, + "uploadTime": { + "description": "上传时间", + "type": "string" + }, + "via": { + "description": "来源", + "type": "string" + } + } + }, + "registermod.RegisterMod": { + "type": "object", + "properties": { + "appId": { + "description": "appID", + "type": "integer" + }, + "blocDeduction": { + "description": "集团扣量(特定渠道扣量)", + "type": "boolean" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "dc": { + "description": "渠道码", + "type": "string" + }, + "devType": { + "description": "设备类型", + "type": "string" + }, + "districtCode": { + "description": "渠道码", + "type": "string" + }, + "formalTime": { + "description": "成为正式用户的时间(针对h5和light)", + "type": "string" + }, + "ip": { + "description": "IP", + "type": "string" + }, + "isDeduction": { + "description": "true:CPA扣量用户", + "type": "boolean" + }, + "isDirect": { + "description": "true:是直推用户", + "type": "boolean" + }, + "isFormal": { + "description": "是否正式用户(针对h5和light)", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "parentPromCode": { + "description": "邀请人推广码", + "type": "string" + }, + "promCode": { + "description": "用户推广序列", + "type": "string" + }, + "registerTime": { + "description": "操作时间", + "type": "string" + }, + "sysType": { + "description": "操作系统类型 安卓 IOS", + "type": "string" + }, + "userId": { + "description": "用户ID", + "type": "integer" + } + } + }, + "srv_appcategory.AppCategoryDelReq": { + "type": "object", + "properties": { + "id": { + "type": "integer" + } + } + }, + "srv_appcategory.AppCategorySearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "parentAppId": { + "type": "integer" + } + } + }, + "srv_appcategory.AppCategorySearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/appcategory.AppCategory" + } + }, + "total": { + "type": "integer" + } + } + }, + "srv_appcategory.AppCategoryUpdate": { + "type": "object", + "properties": { + "desc": { + "description": "描述", + "type": "string" + }, + "imgType": { + "description": "图片展示类型 0:应用图标 1.小图标 2.大图标", + "type": "integer" + }, + "name": { + "description": "名称", + "type": "string" + }, + "parentAppId": { + "type": "integer" + }, + "rank": { + "description": "应用排序", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "srv_appcategory.AppCategoryUpdateReq": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "param": { + "description": "参数", + "allOf": [ + { + "$ref": "#/definitions/srv_appcategory.AppCategoryUpdate" + } + ] + } + } + }, + "srv_applicationstat.AppStatInfo": { + "type": "object", + "properties": { + "appName": { + "description": "应用名称", + "type": "string" + }, + "applicationDbId": { + "description": "应用ID", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "hourData": { + "description": "小时数据", + "type": "array", + "items": { + "type": "integer" + } + }, + "id": { + "type": "string" + }, + "parentAppId": { + "description": "所属应用ID", + "type": "integer" + }, + "sumDate": { + "description": "记录时间", + "type": "string" + }, + "total": { + "description": "当日点击", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "srv_applicationstat.AppStatSummary": { + "type": "object", + "properties": { + "totalClick": { + "description": "总点击", + "type": "integer" + } + } + }, + "srv_applicationstat.AppStatTotalInfo": { + "type": "object", + "properties": { + "appName": { + "description": "应用名称", + "type": "string" + }, + "id": { + "description": "应用ID", + "type": "string" + }, + "parentAppId": { + "description": "所属应用ID", + "type": "integer" + }, + "total": { + "description": "总次数", + "type": "integer" + } + } + }, + "srv_applicationstat.GetApplicationStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "applicationId": { + "description": "应用ID", + "type": "string" + }, + "applicationName": { + "description": "应用名称", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "parentAppId": { + "description": "所属应用ID", + "type": "array", + "items": { + "type": "integer" + } + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "srv_applicationstat.GetApplicationStatResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/srv_applicationstat.AppStatInfo" + } + }, + "summary": { + "$ref": "#/definitions/srv_applicationstat.AppStatSummary" + }, + "total": { + "type": "integer" + } + } + }, + "srv_applicationstat.GetApplicationStatTotalReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "applicationId": { + "description": "应用ID", + "type": "string" + }, + "applicationName": { + "description": "应用名称", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "parentAppId": { + "description": "所属应用ID", + "type": "array", + "items": { + "type": "integer" + } + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "srv_applicationstat.GetApplicationStatTotalResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/srv_applicationstat.AppStatTotalInfo" + } + }, + "summary": { + "$ref": "#/definitions/srv_applicationstat.AppStatSummary" + }, + "total": { + "type": "integer" + } + } + }, + "stat_models_channelmod.AppType": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3 + ], + "x-enum-comments": { + "AppTypeH5": "H5网页", + "AppTypeLight": "轻量版", + "AppTypeNone": "所有", + "AppTypePkg": "安装包" + }, + "x-enum-varnames": [ + "AppTypeNone", + "AppTypePkg", + "AppTypeLight", + "AppTypeH5" + ] + }, + "stat_models_channelmod.ChannelDeductionRule": { + "type": "object", + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "autoDeduction": { + "description": "自动扣量开关", + "type": "boolean" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsBegin": { + "description": "CPS 开始扣量金额", + "type": "integer" + }, + "cpsDeductionRate": { + "description": "CPS 扣量比例", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "deductionAt": { + "description": "扣量开始时间", + "type": "string" + }, + "divideRate": { + "description": "代理分成比例", + "type": "integer" + }, + "fifth": { + "description": "5阶", + "type": "integer" + }, + "first": { + "description": "一阶", + "type": "integer" + }, + "fourth": { + "description": "四阶", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "landingPage": { + "description": "落地页", + "type": "string" + }, + "lessIncomeRate": { + "description": "最低收益比 CPA低于该值开启扣量(0.1 - 3.0)", + "type": "number" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "proxyDeduction": { + "description": "代理扣量比例", + "type": "integer" + }, + "second": { + "description": "二阶", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "settlementTime": { + "description": "扣量结算时间", + "type": "string" + }, + "third": { + "description": "三阶", + "type": "integer" + }, + "todayDeduction": { + "description": "当日扣量金额", + "type": "integer" + }, + "todayTime": { + "description": "当日时间", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "stat_models_channelmod.ChannelInfo": { + "type": "object", + "properties": { + "appIds": { + "description": "渠道对应的app", + "type": "array", + "items": { + "type": "integer" + } + }, + "autoGenApk": { + "description": "自动生成渠道包", + "type": "boolean" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "checkTokenTime": { + "description": "检查Token的时间", + "type": "string" + }, + "childCount": { + "description": "子渠道数量", + "type": "integer" + }, + "childShowDivideRate": { + "description": "下级是否显示分成比例", + "type": "boolean" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "ip": { + "description": "ip", + "type": "string" + }, + "lock": { + "description": "禁止登陆", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "parentAgent": { + "description": "父代理 (从二级的子代理开始用ParentAgent描述父子关系)", + "type": "string" + }, + "parentChannel": { + "description": "父渠道 如果为空字符串,则为渠道,否则为代理", + "type": "string" + }, + "password": { + "description": "代理商密码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "showMagic": { + "description": "正常显示数据 n\u003e0 展示空白数据", + "type": "integer" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "token": { + "description": "token", + "type": "string" + }, + "type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "wallet": { + "description": "钱包地址", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.Wallet" + } + ] + } + } + }, + "stat_models_channelmod.ChannelOwnerChange": { + "type": "object", + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "mark": { + "description": "备注", + "type": "string" + }, + "newUser": { + "description": "变更后的所有者", + "type": "string" + }, + "oldUser": { + "description": "变更前的所有者", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "stat_models_channelmod.ChannelSettlement": { + "type": "object", + "properties": { + "androidAmount": { + "description": "+安卓充值金额", + "type": "integer" + }, + "androidAmountCount": { + "description": "+安卓充值次数", + "type": "integer" + }, + "androidVisitCount": { + "description": "android访问", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "deductionAmount": { + "description": "充值扣量", + "type": "integer" + }, + "deductionAmountCount": { + "description": "充值扣量次数", + "type": "integer" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directAmountCount": { + "description": "直推充值订单数", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionAmountCount": { + "description": "裂变充值订单数", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "h5Amount": { + "description": "+H5充值金额", + "type": "integer" + }, + "h5AmountCount": { + "description": "+H5充值次数", + "type": "integer" + }, + "h5AndroidVisitCount": { + "description": "h5安卓访问", + "type": "integer" + }, + "h5IosVisitCount": { + "description": "h5苹果访问", + "type": "integer" + }, + "h5PcVisitCount": { + "description": "h5电脑访问", + "type": "integer" + }, + "h5VisitCount": { + "description": "h5访问", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "iosAmount": { + "description": "+Ios充值金额", + "type": "integer" + }, + "iosAmountCount": { + "description": "+Ios充值次数", + "type": "integer" + }, + "iosVisitCount": { + "description": "ios访问", + "type": "integer" + }, + "landPageVisitCount": { + "description": "落地页访问", + "type": "integer" + }, + "landpageAndroidClick": { + "description": "落地页android访问次数", + "type": "integer" + }, + "landpageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landpageIosAthorClick": { + "description": "落地页iOS其他包访问次数", + "type": "integer" + }, + "landpageIosH5Click": { + "description": "落地页H5访问次数", + "type": "integer" + }, + "lightAmount": { + "description": "light充值金额", + "type": "integer" + }, + "lightAmountCount": { + "description": "light充值次数", + "type": "integer" + }, + "lightDeductionAmount": { + "description": "light充值金额扣量", + "type": "integer" + }, + "lightDeductionAmountCount": { + "description": "light充值次数扣量", + "type": "integer" + }, + "lightDirectAmount": { + "description": "light充值金额直推", + "type": "integer" + }, + "lightDirectAmountCount": { + "description": "light充值次数直推", + "type": "integer" + }, + "lightFissionAmount": { + "description": "light充值金额裂变", + "type": "integer" + }, + "lightFissionAmountCount": { + "description": "light充值次数裂变", + "type": "integer" + }, + "lightNaturalAmount": { + "description": "light充值金额自然", + "type": "integer" + }, + "lightNaturalAmountCount": { + "description": "light充值次数自然", + "type": "integer" + }, + "lightVisitCount": { + "description": "**轻量访问", + "type": "integer" + }, + "lightVisitDeductionCount": { + "description": "light访问量扣量", + "type": "integer" + }, + "lightVisitDirectCount": { + "description": "light访问量直推", + "type": "integer" + }, + "lightVisitFissionCount": { + "description": "light访问量裂变", + "type": "integer" + }, + "lightVisitNaturalCount": { + "description": "light访问量自然", + "type": "integer" + }, + "naturalAmount": { + "description": "自然充值", + "type": "integer" + }, + "naturalAmountCount": { + "description": "自然充值订单数", + "type": "integer" + }, + "newAndroidCount": { + "description": "android新增", + "type": "integer" + }, + "newAndroidDeductionCount": { + "description": "新增安卓扣量", + "type": "integer" + }, + "newAndroidDirectCount": { + "description": "新增安卓直推", + "type": "integer" + }, + "newAndroidFissionCount": { + "description": "新增安卓裂变", + "type": "integer" + }, + "newDeductionCount": { + "description": "新增扣量", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newH5AndroidCount": { + "description": "h5安卓新增", + "type": "integer" + }, + "newH5Count": { + "description": "h5新增安装", + "type": "integer" + }, + "newH5DeductionCount": { + "description": "新增H5扣量", + "type": "integer" + }, + "newH5DirectCount": { + "description": "新增H5直推", + "type": "integer" + }, + "newH5FissionCount": { + "description": "新增H5裂变", + "type": "integer" + }, + "newH5FormalCount": { + "description": "h5注册新增", + "type": "integer" + }, + "newH5FormalDeductionCount": { + "description": "新增H5正式扣量", + "type": "integer" + }, + "newH5FormalDirectCount": { + "description": "新增H5正式直推", + "type": "integer" + }, + "newH5FormalFissionCount": { + "description": "新增H5正式裂变", + "type": "integer" + }, + "newH5IosCount": { + "description": "h5苹果新增", + "type": "integer" + }, + "newH5PcCount": { + "description": "h5电脑新增", + "type": "integer" + }, + "newIosCount": { + "description": "ios新增", + "type": "integer" + }, + "newIosDeductionCount": { + "description": "新增IOS扣量", + "type": "integer" + }, + "newIosDirectCount": { + "description": "新增IOS直推", + "type": "integer" + }, + "newIosFissionCount": { + "description": "新增IOS裂变", + "type": "integer" + }, + "newLightCount": { + "description": "light新增", + "type": "integer" + }, + "newLightDeductionCount": { + "description": "light新增扣量", + "type": "integer" + }, + "newLightDirectCount": { + "description": "light新增直推", + "type": "integer" + }, + "newLightFissionCount": { + "description": "light新增裂变", + "type": "integer" + }, + "newLightFormalCount": { + "description": "**轻量注册", + "type": "integer" + }, + "newLightFormalDeductionCount": { + "description": "新增LightFormal扣量", + "type": "integer" + }, + "newLightFormalDirectCount": { + "description": "新增LightFormal直推", + "type": "integer" + }, + "newLightFormalFissionCount": { + "description": "新增LightFormal裂变", + "type": "integer" + }, + "newLightGuestCount": { + "description": "**轻量安装", + "type": "integer" + }, + "newLightGuestDeductionCount": { + "description": "新增LightGuest扣量", + "type": "integer" + }, + "newLightGuestDirectCount": { + "description": "新增LightGuest直推", + "type": "integer" + }, + "newLightGuestFissionCount": { + "description": "新增LightGuest裂变", + "type": "integer" + }, + "newLightNaturalCount": { + "description": "light自然新增", + "type": "integer" + }, + "newRechargeAmount": { + "description": "其他充值统计", + "type": "integer" + }, + "newTotalCount": { + "description": "新增总量", + "type": "integer" + }, + "newTotalIpCount": { + "description": "注册用户", + "type": "integer" + }, + "parentChannel": { + "description": "父渠道 如果为空字符串,则为渠道,否则为代理", + "type": "string" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "sumDate": { + "description": "记录时间 15分钟对齐", + "type": "string" + }, + "totalAmount": { + "description": "充值统计", + "type": "integer" + }, + "totalVisitCount": { + "description": "访问统计", + "type": "integer" + }, + "type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "updatedAt": { + "description": "时间", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "validDeductionCount": { + "description": "有效扣量总数", + "type": "integer" + }, + "validDirectCount": { + "description": "有效直推总数", + "type": "integer" + }, + "validPayCoin": { + "description": "有效收益金币金额", + "type": "integer" + }, + "validPayMoney": { + "description": "有效收益会员金额", + "type": "integer" + }, + "vipPayCoin": { + "description": "金币购买会员数量", + "type": "integer" + }, + "vipPayDeduction": { + "description": "购买会员金额(CPS扣量)", + "type": "integer" + }, + "vipPayMoney": { + "description": "购买会员金额(CPS扣量后)", + "type": "integer" + } + } + }, + "stat_models_channelmod.ChannelStat": { + "type": "object", + "properties": { + "IncomeAmount": { + "description": "收益估算", + "type": "integer" + }, + "androidAmount": { + "description": "+安卓充值金额", + "type": "integer" + }, + "androidAmountCount": { + "description": "+安卓充值次数", + "type": "integer" + }, + "androidVisitCount": { + "description": "android访问", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "day1RetainRate": { + "description": "留存率", + "type": "number" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "number" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "number" + }, + "deductionAmount": { + "description": "充值扣量", + "type": "integer" + }, + "deductionAmountCount": { + "description": "充值扣量次数", + "type": "integer" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directAmountCount": { + "description": "直推充值订单数", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionAmountCount": { + "description": "裂变充值订单数", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "h5Amount": { + "description": "+H5充值金额", + "type": "integer" + }, + "h5AmountCount": { + "description": "+H5充值次数", + "type": "integer" + }, + "h5AndroidVisitCount": { + "description": "h5安卓访问", + "type": "integer" + }, + "h5IosVisitCount": { + "description": "h5苹果访问", + "type": "integer" + }, + "h5PcVisitCount": { + "description": "h5电脑访问", + "type": "integer" + }, + "h5VisitCount": { + "description": "h5访问", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "incomeRate": { + "description": "收益比", + "type": "number" + }, + "iosAmount": { + "description": "+Ios充值金额", + "type": "integer" + }, + "iosAmountCount": { + "description": "+Ios充值次数", + "type": "integer" + }, + "iosVisitCount": { + "description": "ios访问", + "type": "integer" + }, + "isPay": { + "description": "是否已结算", + "type": "boolean" + }, + "landPageVisitCount": { + "description": "落地页访问", + "type": "integer" + }, + "landpageAndroidClick": { + "description": "落地页android访问次数", + "type": "integer" + }, + "landpageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landpageIosAthorClick": { + "description": "落地页iOS其他包访问次数", + "type": "integer" + }, + "landpageIosH5Click": { + "description": "落地页H5访问次数", + "type": "integer" + }, + "lightAmount": { + "description": "light充值金额", + "type": "integer" + }, + "lightAmountCount": { + "description": "light充值次数", + "type": "integer" + }, + "lightDeductionAmount": { + "description": "light充值金额扣量", + "type": "integer" + }, + "lightDeductionAmountCount": { + "description": "light充值次数扣量", + "type": "integer" + }, + "lightDirectAmount": { + "description": "light充值金额直推", + "type": "integer" + }, + "lightDirectAmountCount": { + "description": "light充值次数直推", + "type": "integer" + }, + "lightFissionAmount": { + "description": "light充值金额裂变", + "type": "integer" + }, + "lightFissionAmountCount": { + "description": "light充值次数裂变", + "type": "integer" + }, + "lightNaturalAmount": { + "description": "light充值金额自然", + "type": "integer" + }, + "lightNaturalAmountCount": { + "description": "light充值次数自然", + "type": "integer" + }, + "lightVisitCount": { + "description": "**轻量访问", + "type": "integer" + }, + "lightVisitDeductionCount": { + "description": "light访问量扣量", + "type": "integer" + }, + "lightVisitDirectCount": { + "description": "light访问量直推", + "type": "integer" + }, + "lightVisitFissionCount": { + "description": "light访问量裂变", + "type": "integer" + }, + "lightVisitNaturalCount": { + "description": "light访问量自然", + "type": "integer" + }, + "naturalAmount": { + "description": "自然充值", + "type": "integer" + }, + "naturalAmountCount": { + "description": "自然充值订单数", + "type": "integer" + }, + "newAndroidCount": { + "description": "android新增", + "type": "integer" + }, + "newAndroidDeductionCount": { + "description": "新增安卓扣量", + "type": "integer" + }, + "newAndroidDirectCount": { + "description": "新增安卓直推", + "type": "integer" + }, + "newAndroidFissionCount": { + "description": "新增安卓裂变", + "type": "integer" + }, + "newDeductionCount": { + "description": "新增扣量", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newH5AndroidCount": { + "description": "h5安卓新增", + "type": "integer" + }, + "newH5Count": { + "description": "h5新增", + "type": "integer" + }, + "newH5DeductionCount": { + "description": "新增H5扣量", + "type": "integer" + }, + "newH5DirectCount": { + "description": "新增H5直推", + "type": "integer" + }, + "newH5FissionCount": { + "description": "新增H5裂变", + "type": "integer" + }, + "newH5FormalCount": { + "description": "h5注册新增", + "type": "integer" + }, + "newH5FormalDeductionCount": { + "description": "新增H5正式扣量", + "type": "integer" + }, + "newH5FormalDirectCount": { + "description": "新增H5正式直推", + "type": "integer" + }, + "newH5FormalFissionCount": { + "description": "新增H5正式裂变", + "type": "integer" + }, + "newH5IosCount": { + "description": "h5苹果新增", + "type": "integer" + }, + "newH5PcCount": { + "description": "h5电脑新增", + "type": "integer" + }, + "newIosCount": { + "description": "ios新增", + "type": "integer" + }, + "newIosDeductionCount": { + "description": "新增IOS扣量", + "type": "integer" + }, + "newIosDirectCount": { + "description": "新增IOS直推", + "type": "integer" + }, + "newIosFissionCount": { + "description": "新增IOS裂变", + "type": "integer" + }, + "newLightCount": { + "description": "light新增", + "type": "integer" + }, + "newLightDeductionCount": { + "description": "light新增扣量", + "type": "integer" + }, + "newLightDirectCount": { + "description": "light新增直推", + "type": "integer" + }, + "newLightFissionCount": { + "description": "light新增裂变", + "type": "integer" + }, + "newLightFormalCount": { + "description": "**轻量注册", + "type": "integer" + }, + "newLightFormalDeductionCount": { + "description": "新增LightFormal扣量", + "type": "integer" + }, + "newLightFormalDirectCount": { + "description": "新增LightFormal直推", + "type": "integer" + }, + "newLightFormalFissionCount": { + "description": "新增LightFormal裂变", + "type": "integer" + }, + "newLightGuestCount": { + "description": "**轻量安装", + "type": "integer" + }, + "newLightGuestDeductionCount": { + "description": "新增LightGuest扣量", + "type": "integer" + }, + "newLightGuestDirectCount": { + "description": "新增LightGuest直推", + "type": "integer" + }, + "newLightGuestFissionCount": { + "description": "新增LightGuest裂变", + "type": "integer" + }, + "newLightNaturalCount": { + "description": "light自然新增", + "type": "integer" + }, + "newRechargeAmount": { + "description": "其他充值", + "type": "integer" + }, + "newTotalCount": { + "description": "**新增总量", + "type": "integer" + }, + "newTotalIpCount": { + "description": "注册", + "type": "integer" + }, + "parentChannel": { + "description": "父渠道 如果为空字符串,则为渠道,否则为代理", + "type": "string" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "sumDate": { + "description": "记录时间 15分钟对齐", + "type": "string" + }, + "totalAmount": { + "description": "充值统计", + "type": "integer" + }, + "totalVisitCount": { + "description": "访问", + "type": "integer" + }, + "type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "updatedAt": { + "description": "时间", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "validDeductionCount": { + "description": "有效扣量总数", + "type": "integer" + }, + "validDirectCount": { + "description": "收益及结算", + "type": "integer" + }, + "validPayCoin": { + "description": "有效收益金币金额", + "type": "integer" + }, + "validPayMoney": { + "description": "有效收益金额", + "type": "integer" + }, + "vipPayCoin": { + "description": "金币购买会员数量", + "type": "integer" + }, + "vipPayDeduction": { + "description": "购买会员金额(CPS扣量)", + "type": "integer" + }, + "vipPayMoney": { + "description": "购买会员金额(CPS扣量后)", + "type": "integer" + } + } + }, + "stat_models_channelmod.ChannelStatYesterday": { + "type": "object", + "properties": { + "androidRechargeAmount": { + "description": "android充值金额", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "h5RechargeAmount": { + "description": "h5充值金额", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "iosRechargeAmount": { + "description": "ios充值金额", + "type": "integer" + }, + "lightRechargeAmount": { + "description": "**light充值金额", + "type": "integer" + }, + "newAndroidCount": { + "description": "android新增", + "type": "integer" + }, + "newCount": { + "description": "注册", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newH5Count": { + "description": "h5新增(guest)", + "type": "integer" + }, + "newH5FormalCount": { + "description": "h5注册新增", + "type": "integer" + }, + "newIncreaseCount": { + "description": "新增增长", + "type": "integer" + }, + "newIncreaseRate": { + "description": "新增增长比例 对比昨天同时段", + "type": "string" + }, + "newIosCount": { + "description": "ios新增", + "type": "integer" + }, + "newLightFormalCount": { + "description": "轻量注册", + "type": "integer" + }, + "newLightGuestCount": { + "description": "轻量安装", + "type": "integer" + }, + "parentChannel": { + "description": "父渠道 如果为空字符串,则为渠道,否则为代理", + "type": "string" + }, + "rechargeAmount": { + "description": "充值", + "type": "integer" + }, + "rechargeIncreaseAmount": { + "description": "充值增长", + "type": "integer" + }, + "rechargeIncreaseRate": { + "description": "充值增长比例 对比昨天同时段", + "type": "string" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "sumDate": { + "description": "记录时间 15分钟对齐", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "vipPayCoin": { + "description": "其他充值", + "type": "integer" + }, + "vipPayDeduction": { + "description": "购买会员金额(CPS扣量)", + "type": "integer" + }, + "vipPayMoney": { + "description": "购买会员金额(CPS扣量后)", + "type": "integer" + } + } + }, + "stat_models_channelmod.ChannelType": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 10 + ], + "x-enum-comments": { + "ChannelTypeEnd": "End", + "ChannelTypeForth": "四级", + "ChannelTypeNone": "无", + "ChannelTypeParent": "一级", + "ChannelTypeSecond": "二级", + "ChannelTypeThird": "三级" + }, + "x-enum-varnames": [ + "ChannelTypeNone", + "ChannelTypeParent", + "ChannelTypeSecond", + "ChannelTypeThird", + "ChannelTypeForth", + "ChannelTypeEnd" + ] + }, + "stat_models_channelmod.PromoteMode": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "x-enum-comments": { + "PromoteModeInstall": "安装", + "PromoteModeNone": "所有", + "PromoteModeRegister": "注册" + }, + "x-enum-varnames": [ + "PromoteModeNone", + "PromoteModeInstall", + "PromoteModeRegister" + ] + }, + "stat_models_channelmod.SettlementWay": { + "type": "string", + "enum": [ + "cpa", + "cps", + "cpt", + "cpc", + "hz" + ], + "x-enum-comments": { + "SettlementHZ": "下载站" + }, + "x-enum-varnames": [ + "SettlementCPA", + "SettlementCPS", + "SettlementCPT", + "SettlementCPC", + "SettlementHZ" + ] + }, + "stat_models_channelmod.Wallet": { + "type": "object", + "properties": { + "addr1": { + "description": "钱包地址1", + "type": "string" + }, + "addr2": { + "description": "钱包地址2", + "type": "string" + } + } + }, + "statutils.DeviceName": { + "type": "string", + "enum": [ + "android", + "ios", + "pc", + "light", + "h5", + "h5_android", + "h5_ios", + "h5_pc" + ], + "x-enum-varnames": [ + "DeviceNameAndroid", + "DeviceNameIos", + "DeviceNamePc", + "DeviceNameLight", + "DeviceNameH5", + "DeviceNameH5Android", + "DeviceNameH5Ios", + "DeviceNameH5Pc" + ] + }, + "statutils.Direct": { + "type": "object", + "properties": { + "natural": { + "description": "Natural", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "total": { + "description": "Total", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + } + } + }, + "statutils.From": { + "type": "object", + "properties": { + "deduction": { + "description": "扣量", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "direct": { + "description": "---------------------分类2------------------------", + "allOf": [ + { + "$ref": "#/definitions/statutils.Direct" + } + ] + }, + "district": { + "description": "渠道", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "fission": { + "description": "裂变", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "normal": { + "description": "自来", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "share": { + "description": "分享", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "total": { + "description": "Total", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "web": { + "description": "---------------------分类1------------------------", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + } + } + }, + "statutils.Stat": { + "type": "object", + "properties": { + "android": { + "description": "Android", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "h5": { + "description": "H5", + "allOf": [ + { + "$ref": "#/definitions/statutils.StatH5" + } + ] + }, + "ios": { + "description": "IOS", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "light": { + "description": "Light", + "allOf": [ + { + "$ref": "#/definitions/statutils.StatLight" + } + ] + }, + "total": { + "description": "Total", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + } + } + }, + "statutils.StatH5": { + "type": "object", + "properties": { + "h5Android": { + "description": "Android", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "h5Formal": { + "description": "H5正式用户", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "h5Guest": { + "description": "分类2", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "h5Ios": { + "description": "H5IOS", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "h5Pc": { + "description": "分类1", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "total": { + "description": "总计", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + } + } + }, + "statutils.StatLight": { + "type": "object", + "properties": { + "formal": { + "description": "正式用户", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "guest": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "total": { + "description": "总计", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + } + } + }, + "statutils.Value": { + "type": "object", + "properties": { + "count": { + "description": "Count", + "type": "integer" + }, + "value": { + "description": "Value", + "type": "integer" + } + } + }, + "versionMod.PkgType": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5 + ], + "x-enum-comments": { + "Enterprise": "企业签", + "Light": "H5", + "Shop": "商店包", + "Super": "超级签", + "Tf": "testFight" + }, + "x-enum-varnames": [ + "_", + "Enterprise", + "Shop", + "Tf", + "Super", + "Light" + ] + } + }, + "securityDefinitions": { + "ApiKeyAuth": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + }, + "BasicAuth": { + "type": "basic" + }, + "OAuth2AccessCode": { + "type": "oauth2", + "flow": "accessCode", + "authorizationUrl": "https://example.com/oauth/authorize", + "tokenUrl": "https://example.com/oauth/token", + "scopes": { + "admin": "Grants read and write access to administrative information" + } + }, + "OAuth2Application": { + "type": "oauth2", + "flow": "application", + "tokenUrl": "https://example.com/oauth/token", + "scopes": { + "admin": "Grants read and write access to administrative information", + "write": "Grants write access" + } + }, + "OAuth2Implicit": { + "type": "oauth2", + "flow": "implicit", + "authorizationUrl": "https://example.com/oauth/authorize", + "scopes": { + "admin": "Grants read and write access to administrative information", + "write": "Grants write access" + } + }, + "OAuth2Password": { + "type": "oauth2", + "flow": "password", + "tokenUrl": "https://example.com/oauth/token", + "scopes": { + "admin": "Grants read and write access to administrative information", + "read": "Grants read access", + "write": "Grants write access" + } + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "1.0", + Host: "localhost:8088", + BasePath: "/api/stat", + Schemes: []string{"http", "https"}, + Title: "统计中心 接口文档", + Description: "This is a sample server celler server.", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/docs/swagger.json b/docs/swagger.json new file mode 100644 index 0000000..ae110c4 --- /dev/null +++ b/docs/swagger.json @@ -0,0 +1,21142 @@ +{ + "schemes": [ + "http", + "https" + ], + "swagger": "2.0", + "info": { + "description": "This is a sample server celler server.", + "title": "统计中心 接口文档", + "contact": {}, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0" + }, + "host": "localhost:8088", + "basePath": "/api/stat", + "paths": { + "/api/stat/BlocRechargeChannel/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "支付渠道统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "支付渠道统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeChannelReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeChannelRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加活动", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "添加活动", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddActivityReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个活动", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "删除一个活动", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelActivityReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/getgift/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个奖品兑换信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "删除一个奖品兑换信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelGiftReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/getgift/gen": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "生成奖品兑换码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "生成奖品兑换码", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GenGiftCodeRes" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/getgift/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "奖品兑换详情", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "奖品兑换详情", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GetGiftInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.GetGiftInfoResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/getgift/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个奖品兑换信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "更新一个奖品兑换信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateGiftReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/gift/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加活动奖励", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "添加活动奖励", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddGiftReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/gift/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个活动奖励", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "删除一个活动奖励", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelGiftReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/gift/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "活动奖励列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "活动奖励列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GiftListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.GiftListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/gift/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个活动奖励", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "更新一个活动奖励", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateGiftReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/h5/draw": { + "post": { + "description": "抽奖", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "抽奖", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DrawReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/h5/giftinfo": { + "post": { + "description": "h5页面活动奖品信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "h5页面活动奖品信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ActivityGiftInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ActivityGiftInfoResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/h5/info": { + "post": { + "description": "h5页面活动信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "h5页面活动信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ActivityInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ActivityInfoResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "活动信息列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "活动信息列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ActivityListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ActivityListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/lotterycode/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除活动抽奖码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "删除活动抽奖码", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelLotteryCodeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/lotterycode/gen": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "生成活动抽奖码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "生成活动抽奖码", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GenLotteryCodeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/lotterycode/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "活动抽奖码列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "活动抽奖码列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.LotteryCodeListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.LotteryCodeListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/lotterycode/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改活动抽奖码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "修改活动抽奖码", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateLotteryCodeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个活动", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "更新一个活动", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateActivityReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/visit": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "活动访问量", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "活动访问量", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ActivityVisitCountReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/activity/visit/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "活动访问量", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "活动管理" + ], + "summary": "活动访问量", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ActivityVisitCountReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "增加管理员", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "增加管理员", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除管理员", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "删除管理员", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "管理员列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "管理员列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdminListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AdminListRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/login": { + "post": { + "description": "传入用户信息登录", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "管理员登录", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdminLoginReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改管理员", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "修改管理员", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/admin/verify": { + "post": { + "description": "谷歌验证", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "管理员登录验证", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdminVerifyReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AdminLoginRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adminbloc/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adminbloc/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除管理员", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "删除管理员", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adminbloc/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "管理员列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "管理员列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdminListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AdminListRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adminbloc/login": { + "post": { + "description": "传入用户信息登录", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "管理员登录", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdminLoginReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adminbloc/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改管理员", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "系统管理" + ], + "summary": "修改管理员", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAdminReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "新增广告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "新增广告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAdsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/click": { + "post": { + "description": "广告点击", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告点击", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdsClickReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除广告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "删除广告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAdsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/get": { + "post": { + "description": "外部获取广告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "外部获取广告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AdvertiseReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AdvertiseRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "广告列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAdsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAdsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/stat": { + "post": { + "description": "广告统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/advertiseSer.GetAdvertiseStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/advertiseSer.GetAdvertiseStatResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/stattotal": { + "post": { + "description": "广告统计不分时统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告统计不分时统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/advertiseSer.GetAdvertiseTotalStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/advertiseSer.GetAdvertiseTotalStatResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/ads/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改广告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "修改广告信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAdsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adsLoc/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "谷歌验证", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "新增广告位置信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAdsLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adsLoc/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除广告位置信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "删除广告位置信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAdsLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adsLoc/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "广告位置列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告位置列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAdsLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAdsLocRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/adsLoc/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改广告位置信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "修改广告位置信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAdsLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个子渠道", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "添加一个子渠道", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelInfoAdd" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/applies": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算申请表(渠道账号看的)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "分组分页获取渠道结算申请表(渠道账号看的)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GetApplyFormReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.GetApplyFormResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/info/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新渠道信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "更新渠道信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelInfoUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/landpage": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取落地页列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取落地页列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelAppInfoResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取渠道列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentChannelInfoSearchResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/password/reset": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "重置子渠道密码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "重置子渠道密码", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelPasswordReset" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/password/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改渠道密码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "修改渠道密码", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelPasswordUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/rule/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新渠道规则", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "更新渠道规则", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelRuleUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/channel/stat": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道日常统计Ex", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取渠道统计Ex", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentChannelStatSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentChannelStatResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/imgVerify": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取图片验证码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取图片验证码", + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentImgVerifyCode" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/login": { + "post": { + "description": "代理商登陆", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "代理商登陆", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentLoginReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentLoginRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/summary/child": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取子渠道数据汇总", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取子渠道数据汇总", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentSummaryStatChildSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentSummaryStatChildResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/agent/summary/home": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取首页渠道数据汇总", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道后台" + ], + "summary": "获取首页渠道数据汇总", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AgentSummaryStatHomeSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AgentSummaryStatHomeResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/announce/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "新增公告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "公告管理" + ], + "summary": "新增公告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAnnounReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/announce/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除公告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "公告管理" + ], + "summary": "删除公告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAnnounReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/announce/get": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "外部获取公告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "公告管理" + ], + "summary": "外部获取公告信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AnnouncementReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AnnouncementRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/announce/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "公告列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "公告管理" + ], + "summary": "公告列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAnnounReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAnnounRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/announce/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改公告信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "公告管理" + ], + "summary": "修改公告信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAnnounReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appInfo/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "添加app", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用管理" + ], + "summary": "添加app", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appInfo/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除app", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用管理" + ], + "summary": "删除app", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appInfo/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "app列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用管理" + ], + "summary": "app列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAppInfoRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appInfo/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改app", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用管理" + ], + "summary": "修改app", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appLoc/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "谷歌验证", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "新增广告位置信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddAppLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appLoc/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除广告位置信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "删除广告位置信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAppLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appLoc/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "广告位置列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "广告位置列表", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAppLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAppLocRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/appLoc/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改广告位置信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "广告管理" + ], + "summary": "修改广告位置信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateAppLocReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/authority/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "添加角色", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权限管理" + ], + "summary": "添加角色", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddRoleReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/authority/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除角色", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权限管理" + ], + "summary": "删除角色", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelRoleReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/authority/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "权限角色列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权限管理" + ], + "summary": "权限角色列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.RoleListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.RoleListRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/authority/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改角色", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权限管理" + ], + "summary": "修改角色", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateRoleReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocBlocWithdrawDetails/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocWithdrawDetailsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocWithdrawDetailsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocChannelCodeStat/export": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "渠道码统计(集团)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道码统计" + ], + "summary": "渠道码统计(集团)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.BlocListChannelCodeStatReq" + } + } + ], + "responses": { + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocChannelCodeStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "渠道码统计(集团)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道码统计" + ], + "summary": "渠道码统计(集团)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.BlocListChannelCodeStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.BlocListChannelCodeStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocDailyStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表(集团)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常统计列表(集团)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocDailyStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocDailyStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocDailyStatTotal/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表(集团)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常汇总列表(集团)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocDailyStatTotalReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocDailyStatTotalRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocRechargeDetails/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeDetailsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeDetailsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/blocRegisterDetails/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocRegisterDetailsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocRegisterDetailsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "添加一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelInfoAdd" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "删除一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelInfoDelete" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/export": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道列表导出", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "分组分页获取渠道列表导出", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "分组分页获取渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/owner/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个渠道管理的所有者", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "更新一个渠道管理的所有者", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelOwnerUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/ownerchange/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "渠道所有者变更信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "渠道所有者变更信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelOwnerChangeInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelOwnerChangeInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelInfo/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "更新一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelInfoUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelRule/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "添加一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelDeductionRuleAdd" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelRule/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "删除一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelDeductionRuleDelete" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelRule/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道扣量规则列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "获取渠道扣量规则列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelDeductionRuleSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelDeductionRuleSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelRule/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个渠道管理", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "更新一个渠道管理", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelDeductionRuleUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelSettlement/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "分组分页获取渠道结算表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelSettlementSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelSettlementSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelStat/compare/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "渠道同时段对比", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道同时段对比" + ], + "summary": "渠道同时段对比", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SearchChannelStatComparedReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SearchChannelStatComparedResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "获取渠道统计列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelStatSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelStatSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelStat/settlement/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道统计信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "获取渠道统计信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelStatSettlementSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelStatSettlementSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelStat/settlement/v2/calc": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "对结算页用户选择的结算项目进行计算", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "对结算页用户选择的结算项目进行计算", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementCalcReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementCalcResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/channelStat/settlement/v2/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取渠道统计信息v2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "获取渠道统计信息v2", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelStatSettlementSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ChannelStatSettlementSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/dailyStat/export": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表导出", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常统计列表导出", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDailyStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/dailyStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常统计列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDailyStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/dailyhour/export": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计导出", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常统计导出", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyHourStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDailyHourStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/dailyhour/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "日常统计列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyHourStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDailyHourStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/domain/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "添加域名", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "域名管理" + ], + "summary": "添加域名", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddDomainInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/domain/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除域名", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "域名管理" + ], + "summary": "删除域名", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelDomainInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/domain/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "域名列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "域名管理" + ], + "summary": "域名列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDomainInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDomainInfoRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/domain/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改域名", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "域名管理" + ], + "summary": "修改域名", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateDomainInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/file/upload": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "文件上传", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件上传" + ], + "summary": "文件上传", + "parameters": [ + { + "type": "file", + "description": "文件数据", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/game/recharge/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "日常统计列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeDetailsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocRechargeDetailsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/game/withdraw/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "提现列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "游戏统计" + ], + "summary": "提现列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListBlocWithdrawDetailsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListBlocWithdrawDetailsRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/hourStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "曲线图列表数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "主后台首页曲线图" + ], + "summary": "曲线图列表数据", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListHourStatLineReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListHourStatLineResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/appDownload": { + "post": { + "description": "请求APP下载链接", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "请求APP下载链接", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.PageButtonClickReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.PageButtonClickResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/appList": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "获取服务器的app列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "获取服务器的app列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListAppInfoReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListAppInfoRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/botMonthStat": { + "post": { + "description": "请求机器人月数据列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "请求机器人月数据列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.BotMonthStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.BotMonthStatResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/botStatList": { + "post": { + "description": "请求机器人日时数据列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "请求机器人日时数据列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.BotDailyHourListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.BotDailyHourListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/recharge/list": { + "post": { + "description": "请求别的服务器充值数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "请求别的服务器充值数据", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.InnerRechargeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.PageButtonClickResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/rechargebotcmd/list": { + "post": { + "description": "请求别的服务器充值数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "请求别的服务器充值数据", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.InnerRechargeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.PageButtonClickResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/inner/sendTgMessage": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "发送TG消息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "服务器数据同步" + ], + "summary": "发送TG消息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SendTgMessageReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SendTgMessageRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPage/daily/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "落地页每日统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "落地页每日统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListLandPageStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPage/hour/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "落地页小时统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "落地页小时统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListDailyHourStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListLandPageStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPage/summary/downTotal/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "落地下载数统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "日常统计" + ], + "summary": "落地页下载数统计", + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListDownloadSummaryRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPageConfig/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加落地页配置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页配置" + ], + "summary": "添加落地页配置", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddLandPageConfigReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPageConfig/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除落地页配置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页配置" + ], + "summary": "删除落地页配置", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelLandPageConfigReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPageConfig/getByType": { + "post": { + "description": "根据类型获取落地页配置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页配置" + ], + "summary": "根据类型获取落地页配置", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GetLandPageConfigByTypeReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.LandingPageConfig" + } + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPageConfig/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "落地页配置列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页配置" + ], + "summary": "落地页配置列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.FindLandPageConfigReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.LandPageConfigListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landPageConfig/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "修改落地页配置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页配置" + ], + "summary": "修改落地页配置", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/landPageConfig.LandPageConfig" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landingPage/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "添加落地页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "添加落地页", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.AddLandingPageReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landingPage/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "删除落地页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "删除落地页", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelLandingPageReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landingPage/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "落地页列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "落地页列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.FindLandingPageReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.LandingPageListRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landingPage/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "修改落地页", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "修改落地页", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UpdateLandingPageReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landpage/picture/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个落地页资源", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页资源" + ], + "summary": "删除一个落地页资源", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.LandpagePictureDelReq" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/landpage/picture/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个落地页资源", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页资源" + ], + "summary": "更新一个落地页资源", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.LandpagePictureUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/media/delete": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除视频列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频列表" + ], + "summary": "删除视频列表", + "parameters": [ + { + "description": "参数列表", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proxy.MediasDelReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proxy.MediasDelResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/media/search": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取视频列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频列表" + ], + "summary": "根据参数获取视频列表", + "parameters": [ + { + "description": "参数列表", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proxy.MediaSearchReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proxy.MediaSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/media/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新视频信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频列表" + ], + "summary": "更新视频信息", + "parameters": [ + { + "description": "参数列表", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proxy.MediasUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proxy.MediasUpdateResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/media/videoBody": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "视频body上传", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频列表" + ], + "summary": "视频body上传", + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proxy.UploadVideoBodyResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/media/videoOk": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "视频body上传完成信息调用", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频列表" + ], + "summary": "视频body上传完成信息调用", + "parameters": [ + { + "description": "参数列表", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proxy.BaseInfo" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "int" + } + } + } + } + }, + "/api/stat/mediatag/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个视频标签", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频标签" + ], + "summary": "添加一个视频标签", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MediaTagAddReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/mediatag/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个视频标签", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频标签" + ], + "summary": "删除一个视频标签", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MediaTagDelReq" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/mediatag/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取视频标签", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频标签" + ], + "summary": "分组分页获取视频标签", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MediaTagSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.MediaTagSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/mediatag/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个视频标签", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "视频标签" + ], + "summary": "更新一个视频标签", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MediaTagUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/minuteStat/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "曲线图列表数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "主后台首页曲线图" + ], + "summary": "曲线图列表数据", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListMinuteStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListMinuteStatRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/monitor/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个应用监控", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用监控" + ], + "summary": "添加一个应用监控", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MonitorAddReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/monitor/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个应用监控", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用监控" + ], + "summary": "删除一个应用监控", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MonitorDelReq" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/monitor/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取应用监控", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用监控" + ], + "summary": "分组分页获取应用监控", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MonitorSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.MonitorSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/monitor/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个应用监控", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用监控" + ], + "summary": "更新一个应用监控", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.MonitorUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/opLog/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyAuth": [] + } + ], + "description": "操作日志列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "操作日志" + ], + "summary": "操作日志列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ListOpLogReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.ListOpLogRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个渠道结算", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "添加一个渠道结算", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoAdd" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/applicant/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取结算申请人名字列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "获取结算申请人名字列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GetSettlementApplicantListReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.GetSettlementApplicantListResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/deleted/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算已删除列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "分组分页获取渠道结算已删除列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/export": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算导出", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "分组分页获取渠道结算导出", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "分组分页获取渠道结算", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个渠道结算", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "更新一个渠道结算", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/v2/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个渠道结算2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "添加一个渠道结算2", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoAdd" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/v2/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个渠道结算(只有特定状态的结算项可以删除)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "删除一个渠道结算项", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoDelete" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/v2/detail": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "查看渠道结算项的详情", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "查看渠道结算项的详情", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoDetail" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementInfoDetailResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/v2/export": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取渠道结算申请表导出", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "分组分页获取渠道结算申请表导出", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.SettlementInfoSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/settlementinfo/v2/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个渠道结算2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道结算" + ], + "summary": "更新一个渠道结算2", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.SettlementInfoUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/share/list": { + "post": { + "description": "下载按钮", + "tags": [ + "落地页" + ], + "summary": "下载按钮", + "parameters": [ + { + "description": "参数页码", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ShareUrlReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/proto.PageButtonListResp" + } + } + } + } + }, + "/api/stat/statadvertise/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个统计数据(广告)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "统计数据(广告)" + ], + "summary": "添加一个统计数据(广告)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dailystatadvertise.DailyStatAdvertise" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/statadvertise/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "删除一个统计数据(广告)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "统计数据(广告)" + ], + "summary": "删除一个统计数据(广告)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dailystatadvertiseser.DailyStatAdvertiseDelReq" + } + } + ], + "responses": { + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/statadvertise/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取统计数据(广告)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "统计数据(广告)" + ], + "summary": "分组分页获取统计数据(广告)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dailystatadvertiseser.DailyStatAdvertiseSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/dailystatadvertiseser.DailyStatAdvertiseSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/statadvertise/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新一个统计数据(广告)", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "统计数据(广告)" + ], + "summary": "更新一个统计数据(广告)", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dailystatadvertiseser.DailyStatAdvertiseUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/user/info": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取用户信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "渠道管理" + ], + "summary": "获取用户信息", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.UserInfoSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/registermod.RegisterMod" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "版本添加", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "版本管理" + ], + "summary": "版本添加", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.VersionAddReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/app": { + "post": { + "description": "app获取版本", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "版本管理" + ], + "summary": "App获取版本", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.VersionUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.AppVersionResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/bottonclick": { + "post": { + "description": "点击下载事件", + "tags": [ + "落地页" + ], + "summary": "点击下载事件", + "parameters": [ + { + "description": "参数页码", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.PageButtonClickReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/proto.PageButtonClickResp" + } + } + } + } + }, + "/api/stat/version/bottonlist": { + "post": { + "description": "下载按钮", + "tags": [ + "落地页" + ], + "summary": "下载按钮", + "parameters": [ + { + "description": "参数页码", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.PageButtonListReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/proto.PageButtonListResp" + } + } + } + } + }, + "/api/stat/version/channel/newLink": { + "post": { + "description": "获取H5下载", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "获取H5下载", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ChannelDownLoadLinkReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/crossbottonclick": { + "post": { + "description": "点击下载事件[跨服支持所有app]", + "tags": [ + "落地页" + ], + "summary": "点击下载[跨服支持所有app]", + "parameters": [ + { + "description": "参数页码", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.PageButtonClickReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/proto.PageButtonClickResp" + } + } + } + } + }, + "/api/stat/version/del": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "版本删除", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "版本管理" + ], + "summary": "版本删除", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.VersionDelReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/h5/config": { + "post": { + "description": "获取H5下载", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "获取H5下载", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.H5ConfigReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/h5/config/v2": { + "post": { + "description": "获取H5下载", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页" + ], + "summary": "获取H5下载", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.H5ConfigReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "版本列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "版本管理" + ], + "summary": "版本列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/common.Page" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.VersionListResp" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/version/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "版本更新", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "版本管理" + ], + "summary": "版本更新", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.VersionUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/appcategory/add": { + "post": { + "description": "添加分类", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用分类" + ], + "summary": "添加分类", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/appcategory.AppCategory" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/appcategory/del": { + "post": { + "description": "删除分类", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用分类" + ], + "summary": "删除分类", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/srv_appcategory.AppCategoryDelReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/appcategory/list": { + "post": { + "description": "查询分类列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用分类" + ], + "summary": "查询分类列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/srv_appcategory.AppCategorySearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/srv_appcategory.AppCategorySearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/appcategory/update": { + "post": { + "description": "更新分类", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用分类" + ], + "summary": "更新分类", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/srv_appcategory.AppCategoryUpdateReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/add": { + "post": { + "description": "添加应用", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "添加应用", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/applicationmod.Application" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/click": { + "post": { + "description": "app点击", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "配置应用app管理" + ], + "summary": "app点击申请到统计中心redis", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.ApplicationClickReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/del": { + "post": { + "description": "删除应用", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "删除应用", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.DelAppReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/get": { + "post": { + "description": "外部app获取配置应用app信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "配置应用app管理" + ], + "summary": "外部app获取统计中心配置应用app信息", + "parameters": [ + { + "description": "参数", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.CenterApplicationReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.CenterApplicationRes" + } + }, + "400": { + "description": "失败", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/list": { + "post": { + "description": "查询应用列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "查询应用列表", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.GetApplicationsReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.GetApplicationsResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/stat": { + "post": { + "description": "查询应用统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "查询应用统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/srv_applicationstat.GetApplicationStatReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/srv_applicationstat.GetApplicationStatResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/stattotal": { + "post": { + "description": "查询应用统计", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "查询应用统计", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/srv_applicationstat.GetApplicationStatTotalReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/srv_applicationstat.GetApplicationStatTotalResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/apps/update": { + "post": { + "description": "更新应用", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "应用中心" + ], + "summary": "更新应用", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/applicationmod.AppUpdate" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/landpage/picture/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "添加一个落地页资源", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页资源" + ], + "summary": "添加一个落地页资源", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.LandpagePictureAddReq" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "type": "string" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/stat/web/landpage/picture/list": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "分组分页获取落地页资源", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "落地页资源" + ], + "summary": "分组分页获取落地页资源", + "parameters": [ + { + "description": "参数列表", + "name": "param", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/proto.LandpagePictureSearch" + } + } + ], + "responses": { + "200": { + "description": "成功", + "schema": { + "$ref": "#/definitions/proto.LandpagePictureSearchResp" + } + }, + "400": { + "description": "获取失败的返回结果", + "schema": { + "type": "string" + } + } + } + } + } + }, + "definitions": { + "activitymod.BannerInfo": { + "type": "object", + "properties": { + "bannerImg": { + "description": "banner图片", + "type": "string" + }, + "bannerUrl": { + "description": "banner跳转地址", + "type": "string" + } + } + }, + "activitymod.LottertyCodeInfo": { + "type": "object", + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "活动名称", + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "giftCode": { + "description": "奖品兑换码", + "type": "string" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "isUsed": { + "description": "抽奖码是否已使用", + "type": "boolean" + }, + "lotteryAt": { + "description": "抽奖时间", + "type": "string" + }, + "lotteryCode": { + "description": "抽奖码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "userIp": { + "description": "抽奖者IP", + "type": "string" + } + } + }, + "activitymod.LotteryGetGift": { + "type": "object", + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "所属活动的名称", + "type": "string" + }, + "appName": { + "description": "所属app的名字", + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "getGiftAt": { + "description": "兑换奖品的时间", + "type": "string" + }, + "giftCode": { + "description": "奖品兑换码", + "type": "string" + }, + "giftId": { + "description": "所属活动奖品的ID", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "isGaveOut": { + "description": "兑换码是否已发放", + "type": "boolean" + }, + "isUsed": { + "description": "奖品兑换码是否已使用", + "type": "boolean" + }, + "lotteryCode": { + "description": "抽奖码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "description": "兑换者Id", + "type": "string" + } + } + }, + "advertiseMod.JumpType": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "x-enum-comments": { + "JumpTypeInsideApp": "2:app内部跳转", + "JumpTypeInsideBrowser": "1:内部浏览器跳转", + "JumpTypeOutsideBrowser": "0:外部浏览器跳转" + }, + "x-enum-varnames": [ + "JumpTypeOutsideBrowser", + "JumpTypeInsideBrowser", + "JumpTypeInsideApp" + ] + }, + "advertiseSer.AdvertiseStatInfo": { + "type": "object", + "properties": { + "adsId": { + "description": "广告ID", + "type": "integer" + }, + "adsName": { + "description": "广告名称", + "type": "string" + }, + "appId": { + "description": "应用ID", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "hourData": { + "description": "小时数据", + "type": "array", + "items": { + "type": "integer" + } + }, + "id": { + "type": "string" + }, + "locId": { + "description": "位置ID", + "type": "integer" + }, + "locName": { + "description": "位置名称", + "type": "string" + }, + "sumDate": { + "description": "记录时间", + "type": "string" + }, + "total": { + "description": "当日点击", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "advertiseSer.AdvertiseStatSummary": { + "type": "object", + "properties": { + "totalClick": { + "description": "总点击", + "type": "integer" + } + } + }, + "advertiseSer.AdvertiseTotalStatInfo": { + "type": "object", + "properties": { + "adsId": { + "description": "广告ID", + "type": "integer" + }, + "adsName": { + "description": "广告名称", + "type": "string" + }, + "appId": { + "description": "应用ID", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "locId": { + "description": "位置ID", + "type": "integer" + }, + "locName": { + "description": "位置名称", + "type": "string" + }, + "total": { + "description": "当日点击", + "type": "integer" + } + } + }, + "advertiseSer.GetAdvertiseStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "adsId": { + "description": "广告ID", + "type": "integer" + }, + "adsName": { + "description": "广告名称", + "type": "string" + }, + "appId": { + "description": "应用ID", + "type": "array", + "items": { + "type": "integer" + } + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "advertiseSer.GetAdvertiseStatResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/advertiseSer.AdvertiseStatInfo" + } + }, + "summary": { + "$ref": "#/definitions/advertiseSer.AdvertiseStatSummary" + }, + "total": { + "type": "integer" + } + } + }, + "advertiseSer.GetAdvertiseTotalStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "adsId": { + "description": "广告ID", + "type": "integer" + }, + "adsName": { + "description": "广告名称", + "type": "string" + }, + "appId": { + "description": "应用ID", + "type": "array", + "items": { + "type": "integer" + } + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "advertiseSer.GetAdvertiseTotalStatResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/advertiseSer.AdvertiseTotalStatInfo" + } + }, + "summary": { + "$ref": "#/definitions/advertiseSer.AdvertiseStatSummary" + }, + "total": { + "type": "integer" + } + } + }, + "appcategory.AppCategory": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "id": { + "type": "integer" + }, + "imgType": { + "description": "图片展示类型 0:应用图标 1.小图标 2.大图标", + "type": "integer" + }, + "name": { + "description": "名称", + "type": "string" + }, + "parentAppId": { + "description": "parentAppId", + "type": "integer" + }, + "rank": { + "description": "应用排序", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "applicationmod.AppUpdate": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "param": { + "$ref": "#/definitions/applicationmod.AppUpdateInfo" + } + } + }, + "applicationmod.AppUpdateInfo": { + "type": "object", + "properties": { + "androidUrl": { + "description": "安卓链接", + "type": "string" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "avatar": { + "description": "头像图片", + "type": "string" + }, + "bigImg": { + "description": "大图标", + "type": "string" + }, + "categories": { + "description": "分类排序", + "type": "array", + "items": { + "$ref": "#/definitions/common.CategoryRank" + } + }, + "created_id": { + "description": "创建人", + "type": "integer" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "download_url": { + "description": "下载地址", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "highQualityType": { + "description": "优质APP推荐展示方式 0:应用图标 1:展示描述文字", + "type": "integer" + }, + "homeShow": { + "description": "是否首页展示", + "type": "boolean" + }, + "internal": { + "description": "Tag common.AppReqType `json:\"tag\" bson:\"tag\"` //标签", + "type": "boolean" + }, + "iosUrl": { + "description": "ios链接", + "type": "string" + }, + "isGame": { + "description": "是否游戏", + "type": "boolean" + }, + "isHighQuality": { + "description": "是否是优质APP推荐", + "type": "boolean" + }, + "isRecommend": { + "description": "是否推荐", + "type": "boolean" + }, + "locIds": { + "description": "位置id", + "type": "array", + "items": { + "type": "integer" + } + }, + "name": { + "description": "应用名", + "type": "string" + }, + "nineShow": { + "description": "是否九宫格", + "type": "boolean" + }, + "parentAppId": { + "description": "所属appId", + "type": "integer" + }, + "rank": { + "description": "默认排序", + "type": "integer" + }, + "recreationShow": { + "description": "是否娱乐中心显示", + "type": "boolean" + }, + "smallImg": { + "description": "小图标", + "type": "string" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "total": { + "description": "总点击", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "updated_id": { + "description": "最后更新人", + "type": "integer" + } + } + }, + "applicationmod.Application": { + "type": "object", + "properties": { + "androidUrl": { + "description": "安卓链接", + "type": "string" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "avatar": { + "description": "头像图片", + "type": "string" + }, + "bigImg": { + "description": "大图标(比例:686*330)", + "type": "string" + }, + "categories": { + "description": "分类排序", + "type": "array", + "items": { + "$ref": "#/definitions/common.CategoryRank" + } + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "created_id": { + "description": "创建人", + "type": "integer" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "download_url": { + "description": "下载地址", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "highQualityType": { + "description": "优质APP推荐展示方式 0:应用图标 1:展示描述文字", + "type": "integer" + }, + "homeShow": { + "description": "是否首页展示", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "internal": { + "description": "是否内部应用", + "type": "boolean" + }, + "iosUrl": { + "description": "ios链接", + "type": "string" + }, + "isGame": { + "description": "是否游戏", + "type": "boolean" + }, + "isHighQuality": { + "description": "是否是优质APP推荐", + "type": "boolean" + }, + "isRecommend": { + "description": "是否推荐", + "type": "boolean" + }, + "locIds": { + "description": "位置id", + "type": "array", + "items": { + "type": "integer" + } + }, + "locNames": { + "description": "位置映射", + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "description": "应用名", + "type": "string" + }, + "nineShow": { + "description": "是否九宫格", + "type": "boolean" + }, + "parentAppId": { + "description": "所属appId", + "type": "integer" + }, + "rank": { + "description": "默认排序", + "type": "integer" + }, + "recreationShow": { + "description": "是否娱乐中心显示", + "type": "boolean" + }, + "smallImg": { + "description": "小图标(比例:360*200)", + "type": "string" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "tag": { + "description": "标签", + "type": "integer" + }, + "total": { + "description": "总点击", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "updated_id": { + "description": "最后更新人", + "type": "integer" + } + } + }, + "botdailyhourstat.BotHourStat": { + "type": "object", + "properties": { + "appId": { + "description": "appId,唯一id", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "hourLandPage": { + "description": "小时落地页", + "allOf": [ + { + "$ref": "#/definitions/botdailyhourstat.LandPage" + } + ] + }, + "hourStat": { + "description": "小时", + "allOf": [ + { + "$ref": "#/definitions/botdailyhourstat.StatItem" + } + ] + }, + "id": { + "description": "ID", + "type": "string" + }, + "reportTime": { + "description": "汇报时间", + "type": "string" + }, + "reported": { + "description": "是否已汇报", + "type": "boolean" + }, + "sumDate": { + "description": "记录时间 按小时对齐", + "type": "string" + }, + "todayGame": { + "description": "游戏", + "allOf": [ + { + "$ref": "#/definitions/botdailyhourstat.GameItem" + } + ] + }, + "todayLandPage": { + "description": "今日落地页", + "allOf": [ + { + "$ref": "#/definitions/botdailyhourstat.LandPage" + } + ] + }, + "todayStat": { + "description": "今日", + "allOf": [ + { + "$ref": "#/definitions/botdailyhourstat.StatItem" + } + ] + }, + "updatedAt": { + "description": "修改时间", + "type": "string" + } + } + }, + "botdailyhourstat.GameItem": { + "type": "object", + "properties": { + "dcRchgAmount": { + "description": "代充总金额", + "type": "integer" + }, + "decAmount": { + "description": "游戏下分总金额", + "type": "integer" + }, + "incAmount": { + "description": "游戏上分总金额", + "type": "integer" + }, + "profit": { + "description": "系统盈利", + "type": "integer" + }, + "rchgAmount": { + "description": "充值总金额", + "type": "integer" + }, + "validBet": { + "description": "有效投注金额", + "type": "integer" + }, + "wtdrAmount": { + "description": "游戏提现总金额", + "type": "integer" + }, + "wtdrRealAmount": { + "description": "游戏实际提现总金额", + "type": "integer" + } + } + }, + "botdailyhourstat.LandPage": { + "type": "object", + "properties": { + "landPageAndroidClick": { + "description": "落地页android访问次数", + "type": "integer" + }, + "landPageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landPageIosFirmClick": { + "description": "落地页iOS企业包访问次数", + "type": "integer" + }, + "landPageIosLightClick": { + "description": "落地页iOS轻量版访问次数", + "type": "integer" + }, + "landPageTotalClick": { + "description": "落地页访问总次数", + "type": "integer" + } + } + }, + "botdailyhourstat.StatItem": { + "type": "object", + "properties": { + "order": { + "description": "订单", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "orderSucc": { + "description": "成功订单", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "recharge": { + "description": "充值", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "rechargeGold": { + "description": "金币充值", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "rechargeNew": { + "description": "新用户充值", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "rechargeOld": { + "description": "老用户充值", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "rechargeVip": { + "description": "会员充值", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "register": { + "description": "注册", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + }, + "visit": { + "description": "访问", + "allOf": [ + { + "$ref": "#/definitions/statutils.Stat" + } + ] + } + } + }, + "channelsettlementrecord.ChannelSettlementRecord": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "applicant": { + "description": "结算申请人", + "type": "string" + }, + "beginTime": { + "description": "开始时间", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "includeChild": { + "description": "结算是否包含子渠道", + "type": "boolean" + }, + "newDeductionCount": { + "description": "新增扣量", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "operateHistory": { + "description": "操作历史[最后一项是当前操作记录]", + "type": "array", + "items": { + "$ref": "#/definitions/channelsettlementrecord.SettlementOperateItem" + } + }, + "payMoney": { + "description": "打款金额", + "type": "integer" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "rechargeAmount": { + "description": "充值金额", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "settleIds": { + "description": "本次结算的天统计记录id列表", + "type": "array", + "items": { + "type": "string" + } + }, + "settleMoney": { + "description": "手动输入的要结算的真实金额()", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + }, + "totalMoney": { + "description": "计算出的总金额", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "usdt": { + "description": "打款Usdt 还是分", + "type": "integer" + }, + "validDeductionCount": { + "description": "有效扣量总数", + "type": "integer" + }, + "validDirectCount": { + "description": "有效直推总数", + "type": "integer" + }, + "validPayCoin": { + "description": "有效收益金币金额", + "type": "integer" + }, + "validPayMoney": { + "description": "有效收益会员金额", + "type": "integer" + }, + "vipPayCoin": { + "description": "购买会员金币", + "type": "integer" + }, + "vipPayDeduction": { + "description": "购买会员金额(CPS扣量)", + "type": "integer" + }, + "vipPayMoney": { + "description": "购买会员金额(CPS扣量后)", + "type": "integer" + }, + "wallet": { + "description": "钱包地址", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.Wallet" + } + ] + } + } + }, + "channelsettlementrecord.SettlementOperateItem": { + "type": "object", + "properties": { + "afterStatus": { + "description": "操作后状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + }, + "beforeStatus": { + "description": "操作前状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + }, + "content": { + "description": "操作的内容", + "type": "string" + }, + "operateTime": { + "description": "操作时间", + "type": "string" + }, + "operatorAccount": { + "description": "操作者账号", + "type": "string" + }, + "operatorAccountName": { + "description": "操作者账号名字", + "type": "string" + }, + "operatorAccountType": { + "description": "操作者账号类型", + "allOf": [ + { + "$ref": "#/definitions/define.ActType" + } + ] + }, + "pictures": { + "description": "上传的图片", + "type": "array", + "items": { + "type": "string" + } + }, + "remark": { + "description": "操作备注", + "type": "string" + } + } + }, + "channelsettlementrecord.SettlementStatus": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3 + ], + "x-enum-comments": { + "SettlementDeleted": "已删除", + "SettlementFailed": "失败", + "SettlementInit": "发起", + "SettlementSuccess": "成功" + }, + "x-enum-varnames": [ + "SettlementInit", + "SettlementSuccess", + "SettlementFailed", + "SettlementDeleted" + ] + }, + "common.CategoryRank": { + "type": "object", + "properties": { + "cid": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "rank": { + "type": "integer" + } + } + }, + "common.Page": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "dailystatadvertise.DailyStatAdvertise": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "app名称", + "type": "string" + }, + "day1RetainRate": { + "description": "次日留存率", + "type": "string" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "string" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "string" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + } + } + }, + "dailystatadvertiseser.DailyStatAdvertiseDelReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "视频Id", + "type": "string" + } + } + }, + "dailystatadvertiseser.DailyStatAdvertiseSearch": { + "type": "object", + "properties": { + "pageNum": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + } + } + }, + "dailystatadvertiseser.DailyStatAdvertiseSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/dailystatadvertise.DailyStatAdvertise" + } + }, + "total": { + "type": "integer" + } + } + }, + "dailystatadvertiseser.DailyStatAdvertiseUpdate": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "day1RetainRate": { + "description": "次日留存率", + "type": "string" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "string" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "string" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "dailystatadvertiseser.DailyStatAdvertiseUpdateReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "视频Id", + "type": "string" + }, + "param": { + "description": "参数", + "allOf": [ + { + "$ref": "#/definitions/dailystatadvertiseser.DailyStatAdvertiseUpdate" + } + ] + } + } + }, + "define.ActType": { + "type": "string", + "enum": [ + "admin", + "channel", + "district", + "" + ], + "x-enum-varnames": [ + "Admin", + "Channel", + "District", + "ActTypeNone" + ] + }, + "domainmod.Category": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "x-enum-comments": { + "CategoryAPI": "API接口", + "CategoryDown": "文件下载", + "CategoryH5": "H5页面", + "CategoryImage": "图片下载", + "CategoryJump": "跳转域名", + "CategoryLand": "落地页", + "CategoryLight": "轻量版域名", + "CategoryNone": "无分类", + "CategoryVideo": "视频播放", + "CategoryWeb": "网站" + }, + "x-enum-varnames": [ + "CategoryNone", + "CategoryAPI", + "CategoryWeb", + "CategoryLand", + "CategoryH5", + "CategoryDown", + "CategoryImage", + "CategoryVideo", + "CategoryJump", + "CategoryLight" + ] + }, + "domainmod.CheckResult": { + "type": "object", + "properties": { + "beginTime": { + "type": "string" + }, + "checkSucc": { + "description": "只有检测成功时,检测结果才有意义", + "type": "boolean" + }, + "checkType": { + "$ref": "#/definitions/domainmod.CheckType" + }, + "domain": { + "type": "string" + }, + "endTime": { + "type": "string" + }, + "errorMessage": { + "type": "string" + }, + "failedCount": { + "type": "integer" + }, + "minRate": { + "type": "number" + }, + "nodeCount": { + "type": "integer" + }, + "nodeErrors": { + "type": "array", + "items": { + "type": "string" + } + }, + "succCount": { + "type": "integer" + }, + "succRate": { + "type": "number" + } + } + }, + "domainmod.CheckStatus": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4 + ], + "x-enum-comments": { + "CheckStatusChecking": "正在检测", + "CheckStatusFailed": "没有通过", + "CheckStatusNone": "超时跳过", + "CheckStatusPartPass": "部分通过", + "CheckStatusSucc": "完全通过" + }, + "x-enum-varnames": [ + "CheckStatusNone", + "CheckStatusChecking", + "CheckStatusSucc", + "CheckStatusFailed", + "CheckStatusPartPass" + ] + }, + "domainmod.CheckType": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "x-enum-comments": { + "CheckTypeBlack": "域名黑名单检测", + "CheckTypeDNS": "DNS检测", + "CheckTypeGFW": "被墙检测", + "CheckTypeHijack": "劫持检测", + "CheckTypeNone": "占位符,无意义", + "CheckTypePing": "Ping检测", + "CheckTypePollute": "污染检测", + "CheckTypeQQ": "QQ拦截检测", + "CheckTypeWeChat": "微信拦截检测", + "CheckTypeWeb": "网站检测" + }, + "x-enum-varnames": [ + "CheckTypeNone", + "CheckTypeWeb", + "CheckTypeDNS", + "CheckTypePing", + "CheckTypeHijack", + "CheckTypePollute", + "CheckTypeQQ", + "CheckTypeWeChat", + "CheckTypeBlack", + "CheckTypeGFW" + ] + }, + "domainmod.Domain": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "appId": { + "description": "AppId", + "type": "integer" + }, + "appName": { + "description": "AppName", + "type": "string" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/domainmod.Category" + } + ] + }, + "checkFinish": { + "description": "检测完成时间", + "type": "string" + }, + "checkTime": { + "description": "检测时间", + "type": "string" + }, + "checks": { + "description": "检测方式", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckType" + } + }, + "comment": { + "description": "备注", + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "cycleHour": { + "description": "间隔多少小时检测一次", + "type": "integer" + }, + "enable": { + "description": "是否启用", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "maxNodes": { + "description": "最大测试节点数", + "type": "integer" + }, + "minRate": { + "description": "最低检测成功率(成功率低于这个值视为失败)", + "type": "number" + }, + "name": { + "description": "域名", + "type": "string" + }, + "redirectDomain": { + "description": "重定向域名", + "type": "string" + }, + "redirected": { + "description": "是否已做301跳转", + "type": "boolean" + }, + "report": { + "description": "检测报告", + "type": "string" + }, + "results": { + "description": "检测结果", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckResult" + } + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/domainmod.CheckStatus" + } + ] + }, + "updatedAt": { + "type": "string" + } + } + }, + "domainmod.DomainDoc": { + "type": "object", + "properties": { + "appId": { + "description": "AppId", + "type": "integer" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/domainmod.Category" + } + ] + }, + "checkFinish": { + "description": "检测完成时间", + "type": "string" + }, + "checkTime": { + "description": "检测时间", + "type": "string" + }, + "checks": { + "description": "检测方式", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckType" + } + }, + "comment": { + "description": "备注", + "type": "string" + }, + "cycleHour": { + "description": "间隔多少小时检测一次", + "type": "integer" + }, + "enable": { + "description": "是否启用", + "type": "boolean" + }, + "minRate": { + "description": "最低检测成功率(成功率低于这个值视为失败)", + "type": "number" + }, + "name": { + "description": "域名", + "type": "string" + }, + "redirectDomain": { + "description": "重定向域名", + "type": "string" + }, + "redirected": { + "description": "是否已做301跳转", + "type": "boolean" + }, + "report": { + "description": "检测报告", + "type": "string" + }, + "results": { + "description": "检测结果", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckResult" + } + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/domainmod.CheckStatus" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "downloadstat.StatType": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "x-enum-varnames": [ + "StatTypeNone", + "StatTypeDaily", + "StatTypeHour" + ] + }, + "landPageConfig.LandPageConfig": { + "type": "object", + "properties": { + "actor": { + "description": "演员", + "type": "string" + }, + "addedTime": { + "description": "上架时间(审核通过时间)", + "type": "string" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "createAt": { + "description": "创建时间", + "type": "string" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "id": { + "type": "integer" + }, + "landPageType": { + "description": "类型,1PC端,2移动端", + "type": "integer" + }, + "media": { + "description": "视频", + "type": "string" + }, + "picture": { + "description": "图片", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "title": { + "description": "主题", + "type": "string" + }, + "updateAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "landpageImg.LandpageImg": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "mobileAvatar": { + "description": "移动端图片", + "type": "string" + }, + "mobileBackgroud": { + "description": "移动端背景图", + "type": "string" + }, + "mobileTiltle": { + "description": "移动端标语", + "type": "string" + }, + "music": { + "description": "音频文件", + "type": "string" + }, + "name": { + "description": "图片名称", + "type": "string" + }, + "pcAvatar": { + "description": "PC端图片", + "type": "string" + }, + "pcBackgroud": { + "description": "PC端背景图", + "type": "string" + }, + "pcTitle": { + "description": "PC端标语", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "mediatag.MediaTag": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "name": { + "description": "标签名称", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "type": { + "description": "类别", + "allOf": [ + { + "$ref": "#/definitions/mediatag.MediaTagType" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "mediatag.MediaTagType": { + "type": "integer", + "enum": [ + 1, + 2 + ], + "x-enum-comments": { + "MediaTagTypeFirst": "一级", + "MediaTagTypeSecond": "二级" + }, + "x-enum-varnames": [ + "MediaTagTypeFirst", + "MediaTagTypeSecond" + ] + }, + "monitormod.Compare": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3 + ], + "x-enum-comments": { + "CompareEQ": "等于", + "CompareGT": "大于", + "CompareLT": "小于" + }, + "x-enum-varnames": [ + "CompareNone", + "CompareLT", + "CompareEQ", + "CompareGT" + ] + }, + "monitormod.Monitor": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/monitormod.MonitorCategory" + } + ] + }, + "checkCount": { + "description": "检测次数", + "type": "integer" + }, + "comment": { + "description": "注释", + "type": "string" + }, + "compare": { + "description": "比较", + "allOf": [ + { + "$ref": "#/definitions/monitormod.Compare" + } + ] + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "device": { + "description": "设备", + "allOf": [ + { + "$ref": "#/definitions/statutils.DeviceName" + } + ] + }, + "duration": { + "description": "时间段,单位分钟", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "threshold": { + "description": "阀值", + "type": "integer" + }, + "triggerCount": { + "description": "触发次数", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "monitormod.MonitorCategory": { + "type": "integer", + "enum": [ + 0, + 1 + ], + "x-enum-comments": { + "MonitorCategoryNewUser": "新用户监控", + "MonitorCategoryNone": "占位符,无意义" + }, + "x-enum-varnames": [ + "MonitorCategoryNone", + "MonitorCategoryNewUser" + ] + }, + "proto.ActivityGiftInfoReq": { + "type": "object", + "required": [ + "actId" + ], + "properties": { + "actId": { + "description": "活动ID", + "type": "string" + } + } + }, + "proto.ActivityGiftInfoResp": { + "type": "object", + "properties": { + "count": { + "description": "奖品总数", + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.H5GiftInfo" + } + } + } + }, + "proto.ActivityInfo": { + "type": "object", + "properties": { + "background": { + "description": "背景图", + "type": "string" + }, + "banner": { + "description": "banner列表", + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.BannerInfo" + } + }, + "createdAt": { + "type": "string" + }, + "desc": { + "description": "活动说明", + "type": "string" + }, + "enable": { + "description": "活动开关", + "type": "boolean" + }, + "endTime": { + "description": "活动结束时间", + "type": "string" + }, + "giftCodeGivedNum": { + "description": "奖品兑换码已发放数量", + "type": "integer" + }, + "giftCodeNum": { + "description": "奖品兑换码总数量", + "type": "integer" + }, + "giftCodeUsedNum": { + "description": "奖品兑换码已使用数量", + "type": "integer" + }, + "giftDesc": { + "description": "奖励说明", + "type": "string" + }, + "h5Domain": { + "description": "活动H5地址", + "type": "string" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "lotteryCodeNum": { + "description": "抽奖码总数量", + "type": "integer" + }, + "name": { + "description": "活动名称", + "type": "string" + }, + "sortCode": { + "description": "排序号", + "type": "integer" + }, + "startTime": { + "description": "活动开始时间", + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "usedLotteryCodeNum": { + "description": "抽奖码已使用数量", + "type": "integer" + } + } + }, + "proto.ActivityInfoReq": { + "type": "object", + "properties": { + "actId": { + "description": "活动ID", + "type": "string" + } + } + }, + "proto.ActivityInfoResp": { + "type": "object", + "properties": { + "banner": { + "description": "banner列表", + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.BannerInfo" + } + }, + "desc": { + "description": "活动说明", + "type": "string" + }, + "enable": { + "description": "活动开关", + "type": "boolean" + }, + "endTime": { + "description": "活动结束时间", + "type": "string" + }, + "giftDesc": { + "description": "奖励说明", + "type": "string" + }, + "h5Domain": { + "description": "活动H5地址", + "type": "string" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "name": { + "description": "活动名称", + "type": "string" + }, + "startTime": { + "description": "活动开始时间", + "type": "string" + } + } + }, + "proto.ActivityListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "enable": { + "description": "开关", + "type": "boolean" + }, + "name": { + "description": "活动名称", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ActivityListResp": { + "type": "object", + "properties": { + "list": { + "description": "活动信息列表", + "type": "array", + "items": { + "$ref": "#/definitions/proto.ActivityInfo" + } + }, + "total": { + "description": "数量", + "type": "integer" + } + } + }, + "proto.ActivityVisitCountReq": { + "type": "object", + "properties": { + "activityId": { + "description": "活动ID", + "type": "string" + }, + "activityName": { + "description": "活动名字", + "type": "string" + }, + "appId": { + "description": "AppID", + "type": "integer" + }, + "ch": { + "description": "渠道号", + "type": "string" + }, + "domain": { + "description": "落地页域名", + "type": "string" + }, + "ip": { + "description": "ip", + "type": "string" + } + } + }, + "proto.AddActivityReq": { + "type": "object", + "properties": { + "background": { + "description": "背景图", + "type": "string" + }, + "banner": { + "description": "banner列表", + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.BannerInfo" + } + }, + "desc": { + "description": "活动描述", + "type": "string" + }, + "enable": { + "description": "活动开关", + "type": "boolean" + }, + "endTime": { + "description": "活动结束时间", + "type": "string" + }, + "giftDesc": { + "description": "奖励说明", + "type": "string" + }, + "h5Domain": { + "description": "活动H5地址", + "type": "string" + }, + "name": { + "description": "活动名称", + "type": "string" + }, + "sortCode": { + "description": "排序号", + "type": "integer" + }, + "startTime": { + "description": "活动开始时间", + "type": "string" + } + } + }, + "proto.AddAdminReq": { + "type": "object", + "required": [ + "account", + "name", + "password", + "roleId" + ], + "properties": { + "account": { + "description": "账号(唯一)", + "type": "string" + }, + "blocRole": { + "description": "角色", + "type": "integer" + }, + "merchantId": { + "description": "商人id", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + }, + "roleId": { + "description": "角色id", + "type": "integer" + } + } + }, + "proto.AddAdsLocReq": { + "type": "object", + "required": [ + "appId", + "locId", + "name" + ], + "properties": { + "appId": { + "description": "应用Id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.AddAdsReq": { + "type": "object", + "properties": { + "ambientColor": { + "description": "氛围色", + "type": "string" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "coverImg": { + "description": "封面", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "isActive": { + "description": "是否激活", + "type": "boolean" + }, + "links": { + "description": "链接地址", + "type": "array", + "items": { + "$ref": "#/definitions/proto.LinkInfo" + } + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "sort": { + "description": "排序值--优先级", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "tags": { + "description": "广告标签", + "type": "string" + }, + "title": { + "description": "广告标题", + "type": "string" + } + } + }, + "proto.AddAnnounReq": { + "type": "object", + "required": [ + "active", + "appId", + "content", + "endTime", + "startTime", + "title", + "type" + ], + "properties": { + "active": { + "description": "是否激活", + "type": "boolean" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "content": { + "description": "公告内容", + "type": "string" + }, + "cover": { + "description": "公告封面图", + "type": "string" + }, + "endTime": { + "description": "公告结束时间", + "type": "string" + }, + "href": { + "description": "公告跳转地址", + "type": "string" + }, + "startTime": { + "description": "公告开始时间", + "type": "string" + }, + "title": { + "description": "公告标题", + "type": "string" + }, + "type": { + "description": "公告类型 0,外部连接;1,直接安装app", + "type": "integer" + } + } + }, + "proto.AddAppInfoReq": { + "type": "object", + "required": [ + "appId", + "iconImg", + "name" + ], + "properties": { + "appId": { + "description": "appId,唯一id", + "type": "integer" + }, + "iconImg": { + "description": "应用图标", + "type": "string" + }, + "name": { + "description": "app名称", + "type": "string" + } + } + }, + "proto.AddAppLocReq": { + "type": "object", + "required": [ + "appId", + "locId", + "name" + ], + "properties": { + "appId": { + "description": "应用Id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.AddDomainInfoReq": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "appId": { + "description": "AppId", + "type": "integer" + }, + "appName": { + "description": "AppName", + "type": "string" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/domainmod.Category" + } + ] + }, + "checkFinish": { + "description": "检测完成时间", + "type": "string" + }, + "checkTime": { + "description": "检测时间", + "type": "string" + }, + "checks": { + "description": "检测方式", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckType" + } + }, + "comment": { + "description": "备注", + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "cycleHour": { + "description": "间隔多少小时检测一次", + "type": "integer" + }, + "enable": { + "description": "是否启用", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "maxNodes": { + "description": "最大测试节点数", + "type": "integer" + }, + "minRate": { + "description": "最低检测成功率(成功率低于这个值视为失败)", + "type": "number" + }, + "name": { + "description": "域名", + "type": "string" + }, + "redirectDomain": { + "description": "重定向域名", + "type": "string" + }, + "redirected": { + "description": "是否已做301跳转", + "type": "boolean" + }, + "report": { + "description": "检测报告", + "type": "string" + }, + "results": { + "description": "检测结果", + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.CheckResult" + } + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/domainmod.CheckStatus" + } + ] + }, + "updatedAt": { + "type": "string" + } + } + }, + "proto.AddGiftReq": { + "type": "object", + "required": [ + "actId" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "giftDesc": { + "description": "奖品描述", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "rate": { + "description": "中奖率", + "type": "integer" + }, + "sort": { + "description": "排序", + "type": "integer" + } + } + }, + "proto.AddLandPageConfigReq": { + "type": "object", + "required": [ + "appId", + "landPageType", + "title" + ], + "properties": { + "actor": { + "description": "演员", + "type": "string" + }, + "addedTime": { + "description": "上架时间(审核通过时间)", + "type": "string" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "landPageType": { + "description": "类型,1PC端,2移动端", + "type": "integer" + }, + "media": { + "description": "视频", + "type": "string" + }, + "picture": { + "description": "图片", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "title": { + "description": "主题", + "type": "string" + } + } + }, + "proto.AddLandingPageReq": { + "type": "object", + "required": [ + "appId", + "status", + "type", + "url" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channelCode": { + "description": "渠道码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 默认true", + "type": "boolean" + }, + "type": { + "description": "类型 1:渠道 2:分享", + "type": "integer" + }, + "url": { + "description": "Url", + "type": "string" + } + } + }, + "proto.AddRoleReq": { + "type": "object", + "required": [ + "authJson", + "role" + ], + "properties": { + "authJson": { + "description": "权限json数据", + "type": "string" + }, + "role": { + "description": "角色", + "type": "string" + } + } + }, + "proto.AdminInfo": { + "type": "object", + "properties": { + "account": { + "description": "账号", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "lastTime": { + "description": "登录时间", + "type": "string" + }, + "merchantId": { + "description": "商人id", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + }, + "role": { + "description": "角色", + "type": "string" + }, + "roleId": { + "description": "角色", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.AdminListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "blocRole": { + "description": "角色", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.AdminListRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AdminInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.AdminLoginReq": { + "type": "object", + "required": [ + "account", + "password" + ], + "properties": { + "account": { + "description": "账号", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + } + } + }, + "proto.AdminLoginRes": { + "type": "object", + "properties": { + "account": { + "description": "用户名", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "roleInfo": { + "description": "角色信息", + "allOf": [ + { + "$ref": "#/definitions/proto.RoleInfo" + } + ] + }, + "token": { + "description": "token", + "type": "string" + } + } + }, + "proto.AdminVerifyReq": { + "type": "object", + "required": [ + "account", + "verifyCode" + ], + "properties": { + "account": { + "description": "账号", + "type": "string" + }, + "verifyCode": { + "description": "验证码", + "type": "string" + } + } + }, + "proto.AdsClickReq": { + "type": "object", + "required": [ + "appId", + "id" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "id": { + "description": "广告id", + "type": "integer" + } + } + }, + "proto.AdsInfo": { + "type": "object", + "properties": { + "ambientColor": { + "description": "氛围色", + "type": "string" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "clickCount": { + "description": "点击次数", + "type": "integer" + }, + "coverImg": { + "description": "封面", + "type": "string" + }, + "createAt": { + "description": "创建时间", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "id": { + "description": "广告id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸", + "type": "string" + }, + "isActive": { + "description": "是否激活", + "type": "boolean" + }, + "links": { + "description": "链接地址", + "type": "array", + "items": { + "$ref": "#/definitions/proto.LinkInfo" + } + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "locName": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "sort": { + "description": "排序值--优先级", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "tags": { + "description": "广告标签", + "type": "array", + "items": { + "type": "string" + } + }, + "title": { + "description": "广告标题", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "visibleChannels": { + "description": "可见的渠道", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "proto.AdsLocInfo": { + "type": "object", + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "createAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "唯一id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.AdvertiseInfo": { + "type": "object", + "properties": { + "ambientColor": { + "description": "氛围色(逼哩漫画)", + "type": "string" + }, + "coverImg": { + "description": "封面", + "type": "string" + }, + "id": { + "description": "广告id", + "type": "integer" + }, + "jumpType": { + "description": "跳转方式 0:外部浏览器跳转 1:内部浏览器跳转 2:app内部跳转", + "allOf": [ + { + "$ref": "#/definitions/advertiseMod.JumpType" + } + ] + }, + "link": { + "description": "链接地址", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "remark": { + "description": "备注描述", + "type": "string" + }, + "sort": { + "description": "排序", + "type": "integer" + }, + "tags": { + "description": "标签", + "type": "string" + }, + "title": { + "description": "广告标题", + "type": "string" + }, + "type": { + "description": "0:系统 1:渠道", + "type": "integer" + } + } + }, + "proto.AdvertiseReq": { + "type": "object", + "required": [ + "appId" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "ip": { + "description": "用户IP", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "userId": { + "description": "用户ID", + "type": "integer" + } + } + }, + "proto.AdvertiseRes": { + "type": "object", + "properties": { + "advertiseList": { + "description": "广告列表", + "type": "array", + "items": { + "$ref": "#/definitions/proto.AdvertiseInfo" + } + } + } + }, + "proto.AgentChannelInfoAdd": { + "type": "object", + "properties": { + "mobile": { + "description": "手机号", + "type": "string" + }, + "password": { + "description": "代理商密码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "walletAddr1": { + "description": "钱包地址1", + "type": "string" + }, + "walletAddr2": { + "description": "钱包地址2", + "type": "string" + } + } + }, + "proto.AgentChannelInfoSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "Type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "appId": { + "description": "渠道对应的appId", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.AgentChannelInfoSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.ChannelAgentInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.AgentChannelInfoUpdate": { + "type": "object", + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "walletAddr1": { + "description": "钱包地址1", + "type": "string" + }, + "walletAddr2": { + "description": "钱包地址2", + "type": "string" + } + } + }, + "proto.AgentChannelPasswordReset": { + "type": "object", + "properties": { + "channel": { + "description": "下级渠道", + "type": "string" + }, + "password": { + "description": "新密码", + "type": "string" + } + } + }, + "proto.AgentChannelPasswordUpdate": { + "type": "object", + "properties": { + "newPassword": { + "description": "代理商新密码", + "type": "string" + }, + "oldPassword": { + "description": "代理商旧密码", + "type": "string" + } + } + }, + "proto.AgentChannelRuleUpdate": { + "type": "object", + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "childShowDivideRate": { + "description": "渠道:下级是否显示分成比例", + "type": "boolean" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "divideRate": { + "description": "分成比例", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.AgentChannelStatResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AgentDeductedStat" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/proto.AgentDeductedStat" + } + } + }, + "proto.AgentChannelStatSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.AgentDeductedStat": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "childRebate": { + "description": "子渠道返佣", + "type": "integer" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "directCount": { + "description": "新增量(包含子渠道和渠道本身)", + "type": "integer" + }, + "directCountChild": { + "description": "子渠道新增量", + "type": "integer" + }, + "directCountSelf": { + "description": "自身渠道新增量", + "type": "integer" + }, + "divideRate": { + "description": "分成比例", + "type": "integer" + }, + "income": { + "description": "当日收益(自身+子渠道)", + "type": "integer" + }, + "incomeChild": { + "description": "来自子渠道的当日收益", + "type": "integer" + }, + "incomeSelf": { + "description": "来自自身渠道的当日收益", + "type": "integer" + }, + "recharge": { + "description": "充值金额(包含子渠道和渠道本身)", + "type": "integer" + }, + "rechargeChild": { + "description": "来自子渠道充值金额", + "type": "integer" + }, + "rechargeSelf": { + "description": "来自自身渠道充值金额", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "sumDate": { + "description": "记录时间", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "visitCount": { + "description": "访问量", + "type": "integer" + } + } + }, + "proto.AgentImgVerifyCode": { + "type": "object", + "properties": { + "imgId": { + "description": "验证码ID", + "type": "string" + }, + "verifyImg": { + "description": "验证码数据", + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "proto.AgentLoginReq": { + "type": "object", + "required": [ + "account", + "password" + ], + "properties": { + "account": { + "description": "账号", + "type": "string" + }, + "imgCode": { + "description": "图片验证码", + "type": "string" + }, + "imgID": { + "description": "图片编号", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + } + } + }, + "proto.AgentLoginRes": { + "type": "object", + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "detail": { + "description": "渠道详情", + "allOf": [ + { + "$ref": "#/definitions/proto.ChannelAgentInfo" + } + ] + }, + "token": { + "description": "token", + "type": "string" + } + } + }, + "proto.AgentSummaryStatChild": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "childCount": { + "description": "子渠道数量", + "type": "integer" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "divideRate": { + "description": "分成比例", + "type": "integer" + }, + "monthStat": { + "description": "本月统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataSimple" + } + ] + }, + "parentAgent": { + "description": "父代理", + "type": "string" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "todayStat": { + "description": "今日统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataSimple" + } + ] + }, + "totalStat": { + "description": "所有统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataSimple" + } + ] + }, + "weekStat": { + "description": "本周统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataSimple" + } + ] + }, + "yearStat": { + "description": "本年统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataSimple" + } + ] + } + } + }, + "proto.AgentSummaryStatChildResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AgentSummaryStatChild" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.AgentSummaryStatChildSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.AgentSummaryStatHome": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "childCount": { + "description": "子渠道数量", + "type": "integer" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "divideRate": { + "description": "分成比例", + "type": "integer" + }, + "monthStat": { + "description": "本月统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataDetail" + } + ] + }, + "parentAgent": { + "description": "父代理", + "type": "string" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "todayStat": { + "description": "今日统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataDetail" + } + ] + }, + "totalStat": { + "description": "所有统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataDetail" + } + ] + }, + "weekStat": { + "description": "本周统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataDetail" + } + ] + }, + "yearStat": { + "description": "本年统计", + "allOf": [ + { + "$ref": "#/definitions/proto.StatDataDetail" + } + ] + } + } + }, + "proto.AgentSummaryStatHomeResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AgentSummaryStatHome" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.AgentSummaryStatHomeSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.AnnounInfo": { + "type": "object", + "properties": { + "active": { + "description": "是否激活", + "type": "boolean" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "content": { + "description": "公告内容", + "type": "string" + }, + "cover": { + "description": "公告封面图", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "href": { + "description": "公告跳转地址", + "type": "string" + }, + "id": { + "description": "公告id", + "type": "string" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "title": { + "description": "公告标题", + "type": "string" + }, + "type": { + "description": "公告类型 0,外部连接;1,直接安装app", + "type": "integer" + } + } + }, + "proto.AnnouncementInfo": { + "type": "object", + "properties": { + "content": { + "description": "公告内容", + "type": "string" + }, + "cover": { + "description": "公告封面图", + "type": "string" + }, + "href": { + "description": "公告跳转地址", + "type": "string" + }, + "id": { + "description": "公告id", + "type": "string" + }, + "title": { + "description": "公告标题", + "type": "string" + }, + "type": { + "description": "公告类型 0,外部连接;1,直接安装app", + "type": "integer" + } + } + }, + "proto.AnnouncementReq": { + "type": "object", + "required": [ + "appId" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + } + } + }, + "proto.AnnouncementRes": { + "type": "object", + "properties": { + "announceList": { + "description": "公告列表", + "type": "array", + "items": { + "$ref": "#/definitions/proto.AnnouncementInfo" + } + } + } + }, + "proto.AppInfoRes": { + "type": "object", + "properties": { + "advertiseNewNum": { + "description": "广告新增系数", + "type": "integer" + }, + "advertiseNum": { + "description": "广告系数", + "type": "integer" + }, + "appId": { + "description": "appId,唯一id", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "iconImg": { + "description": "应用图标", + "type": "string" + }, + "landPages": { + "description": "落地页列表", + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "description": "app名称", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.AppLocInfo": { + "type": "object", + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "createAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "唯一id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.AppVersionResp": { + "type": "object", + "properties": { + "description": { + "description": "描述", + "type": "string" + }, + "downloadLink": { + "description": "下载地址", + "type": "array", + "items": { + "type": "string" + } + }, + "hasNewVersion": { + "description": "是否存在新版本", + "type": "boolean" + }, + "isForceUpdate": { + "description": "是否强制升级", + "type": "boolean" + }, + "serverVersion": { + "description": "服务器新版本", + "type": "string" + } + } + }, + "proto.ApplicationClickReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "applicationid", + "type": "string" + } + } + }, + "proto.ApplyFormRecord": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "beginTime": { + "description": "开始时间", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "payMoney": { + "description": "打款金额", + "type": "integer" + }, + "pictures": { + "description": "上传的图片", + "type": "array", + "items": { + "type": "string" + } + }, + "remark": { + "description": "备注", + "type": "string" + }, + "settleMoney": { + "description": "手动输入的要结算的真实金额()", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + }, + "totalMoney": { + "description": "计算出的总金额", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "usdt": { + "description": "打款Usdt 还是分", + "type": "integer" + }, + "wallet": { + "description": "钱包地址", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.Wallet" + } + ] + } + } + }, + "proto.BlocChannelCodeStatInfo": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "app名称", + "type": "string" + }, + "channel": { + "description": "该渠道码所属渠道渠道", + "type": "string" + }, + "channelCode": { + "description": "渠道码", + "type": "string" + }, + "day1RetainRate": { + "description": "次日留存率", + "type": "number" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "number" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "number" + }, + "deductionAmount": { + "description": "扣量金额", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "landPageVisitCount": { + "description": "落地页访问次数", + "type": "integer" + }, + "newDeductionCount": { + "description": "新增扣量(新增 = 新增直推+新增裂变+扣量)", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newRechargeAmount": { + "description": "新增充值金额", + "type": "integer" + }, + "newRechargeCount": { + "description": "新增充值数", + "type": "integer" + }, + "rechargeAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "type": "string" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "todayIncome": { + "description": "当日收益", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.BlocDailyStatInfo": { + "type": "object", + "properties": { + "ARPPU": { + "description": "付费用户人均充值", + "type": "integer" + }, + "ARPU": { + "description": "人均充值", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "app名称", + "type": "string" + }, + "daichongAmout": { + "description": "代充充值金额", + "type": "integer" + }, + "day1RetainRate": { + "description": "次日留存率", + "type": "number" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "number" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "number" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newRechargeAmount": { + "description": "新增充值金额", + "type": "integer" + }, + "newRechargeCount": { + "description": "新增充值数", + "type": "integer" + }, + "newRechargeRate": { + "description": "新增充值率", + "type": "number" + }, + "oldRechargeAmount": { + "description": "老用户充值金额", + "type": "integer" + }, + "onlineAmount": { + "description": "在线充值金额", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "totalAmount": { + "description": "总充值", + "type": "integer" + }, + "totalNewCount": { + "description": "新增", + "type": "integer" + }, + "totalRechargeCount": { + "description": "总充值人数", + "type": "integer" + }, + "totalVisitCount": { + "description": "日活", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "userWithDrawAmount": { + "description": "用户提现金额", + "type": "integer" + }, + "userWithDrawPaymoneyAmount": { + "description": "用户提现金额(实际到账)", + "type": "integer" + }, + "visitRechargeRate": { + "description": "登陆充值率", + "type": "number" + } + } + }, + "proto.BlocDailyStatTotalInfo": { + "type": "object", + "properties": { + "daichongAmout": { + "description": "代充充值金额", + "type": "integer" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newRechargeAmount": { + "description": "新增充值金额", + "type": "integer" + }, + "newRechargeCount": { + "description": "新增充值数", + "type": "integer" + }, + "oldRechargeAmount": { + "description": "老用户充值金额", + "type": "integer" + }, + "onlineAmount": { + "description": "在线充值金额", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "totalAmount": { + "description": "总充值", + "type": "integer" + }, + "totalNewCount": { + "description": "新增", + "type": "integer" + }, + "totalRechargeCount": { + "description": "总充值人数", + "type": "integer" + }, + "totalVisitCount": { + "description": "日活", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "userWithDrawAmount": { + "description": "用户提现金额", + "type": "integer" + }, + "userWithDrawPaymoneyAmount": { + "description": "用户提现金额(实际到账)", + "type": "integer" + } + } + }, + "proto.BlocListChannelCodeStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "withChild": { + "description": "包含子渠道", + "type": "boolean" + } + } + }, + "proto.BlocListChannelCodeStatRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.BlocChannelCodeStatInfo" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/proto.BlocChannelCodeStatInfo" + } + } + }, + "proto.BlocRechargeDetailsInfo": { + "type": "object", + "properties": { + "appName": { + "description": "appID", + "type": "string" + }, + "channelName": { + "description": "支付渠道名字", + "type": "string" + }, + "cid": { + "description": "渠道id", + "type": "string" + }, + "devType": { + "description": "设备类型", + "type": "string" + }, + "money": { + "description": "充值金额 订单金额", + "type": "integer" + }, + "orderId": { + "description": "流水id", + "type": "string" + }, + "payMoney": { + "description": "实际到账金额 用户实际支付金额", + "type": "integer" + }, + "status": { + "description": "3付款成功", + "type": "integer" + }, + "successAt": { + "description": "成功时间", + "type": "string" + }, + "sysType": { + "description": "操作系统类型 安卓 IOS", + "type": "string" + }, + "type": { + "description": "充值方式", + "type": "string" + }, + "userId": { + "description": "用户ID", + "type": "string" + } + } + }, + "proto.BlocRegisterDetailsInfo": { + "type": "object", + "properties": { + "appName": { + "description": "appID", + "type": "string" + }, + "devType": { + "description": "设备类型", + "type": "string" + }, + "ip": { + "description": "IP", + "type": "string" + }, + "isDirect": { + "description": "true:直推用户", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "registerTime": { + "description": "注册时间", + "type": "string" + }, + "sysType": { + "description": "操作系统类型 安卓 IOS", + "type": "string" + }, + "userId": { + "description": "用户ID", + "type": "string" + } + } + }, + "proto.BotDailyHourListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize", + "sumDateStart", + "sumDateStop" + ], + "properties": { + "appId": { + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "sumDateStart": { + "type": "string" + }, + "sumDateStop": { + "type": "string" + } + } + }, + "proto.BotDailyHourListResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/botdailyhourstat.BotHourStat" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.BotMonthStatReq": { + "type": "object", + "required": [ + "month" + ], + "properties": { + "appId": { + "description": "如果AppId为空,则计算所有APP", + "type": "integer" + }, + "month": { + "description": "只关注这个日期的年月", + "type": "string" + } + } + }, + "proto.BotMonthStatResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/botdailyhourstat.BotHourStat" + } + } + } + }, + "proto.CenterAppCategory": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "id": { + "type": "integer" + }, + "imgType": { + "description": "图片展示类型 0:应用图标 1.小图标 2.大图标", + "type": "integer" + }, + "name": { + "description": "名称", + "type": "string" + }, + "parentAppId": { + "type": "integer" + }, + "rank": { + "description": "应用排序", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.CenterApplication": { + "type": "object", + "properties": { + "androidUrl": { + "description": "安卓链接", + "type": "string" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "avatar": { + "description": "头像图片", + "type": "string" + }, + "bigImg": { + "description": "大图标", + "type": "string" + }, + "categories": { + "description": "分类排序", + "type": "array", + "items": { + "$ref": "#/definitions/common.CategoryRank" + } + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "created_id": { + "description": "创建人", + "type": "integer" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "download_url": { + "description": "下载地址", + "type": "string" + }, + "highQualityType": { + "description": "优质APP推荐展示方式 0:应用图标 1:展示描述文字", + "type": "integer" + }, + "homeShow": { + "description": "是否首页展示", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "internal": { + "description": "是否内部应用", + "type": "boolean" + }, + "iosUrl": { + "description": "ios链接", + "type": "string" + }, + "isGame": { + "description": "是否游戏", + "type": "boolean" + }, + "isHighQuality": { + "description": "是否是优质APP推荐", + "type": "boolean" + }, + "isRecommend": { + "description": "是否推荐", + "type": "boolean" + }, + "locIds": { + "description": "位置id", + "type": "array", + "items": { + "type": "integer" + } + }, + "name": { + "description": "应用名", + "type": "string" + }, + "nineShow": { + "description": "是否九宫格", + "type": "boolean" + }, + "parentAppId": { + "description": "所属appId", + "type": "integer" + }, + "rank": { + "description": "默认排序", + "type": "integer" + }, + "recreationShow": { + "description": "是否娱乐中心显示", + "type": "boolean" + }, + "smallImg": { + "description": "小图标", + "type": "string" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "tag": { + "description": "标签", + "type": "integer" + }, + "total": { + "description": "总点击", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "updated_id": { + "description": "最后更新人", + "type": "integer" + } + } + }, + "proto.CenterApplicationReq": { + "type": "object", + "required": [ + "parentAppId" + ], + "properties": { + "locId": { + "description": "位置id", + "type": "integer" + }, + "parentAppId": { + "description": "所属应用appId", + "type": "integer" + }, + "userId": { + "description": "用户ID", + "type": "integer" + } + } + }, + "proto.CenterApplicationRes": { + "type": "object", + "properties": { + "appCategoryList": { + "description": "列表", + "type": "array", + "items": { + "$ref": "#/definitions/proto.CenterAppCategory" + } + }, + "list": { + "description": "应用列表", + "type": "array", + "items": { + "$ref": "#/definitions/proto.CenterApplication" + } + } + } + }, + "proto.ChannelAgentInfo": { + "type": "object", + "properties": { + "appIds": { + "description": "渠道对应的app", + "type": "array", + "items": { + "type": "integer" + } + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "childCount": { + "description": "子渠道数量", + "type": "integer" + }, + "childShowDivideRate": { + "description": "下级是否显示分成比例", + "type": "boolean" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "divideRate": { + "description": "分成比例", + "type": "integer" + }, + "lock": { + "description": "禁止登陆", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "parentAgent": { + "description": "父代理", + "type": "string" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "remark": { + "description": "备注", + "type": "string" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "wallet": { + "description": "钱包地址", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.Wallet" + } + ] + } + } + }, + "proto.ChannelAppInfo": { + "type": "object", + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "landingPage": { + "description": "落地页", + "type": "string" + } + } + }, + "proto.ChannelAppInfoReq": { + "type": "object", + "properties": { + "channel": { + "description": "渠道", + "type": "string" + } + } + }, + "proto.ChannelAppInfoResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.ChannelAppInfo" + } + } + } + }, + "proto.ChannelDeductionRuleAdd": { + "type": "object", + "required": [ + "appId", + "channel", + "settlement" + ], + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "autoDeduction": { + "description": "自动扣量开关", + "type": "boolean" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "cpaPrice": { + "description": "单价(分) 前端可设置1.80", + "type": "integer" + }, + "cpsBegin": { + "description": "CPS 开始扣量金额", + "type": "integer" + }, + "cpsDeductionRate": { + "description": "CPS 扣量比例", + "type": "integer" + }, + "cpsRate": { + "description": "CPS分成比列", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "deductionAt": { + "description": "扣量开始时间(默认当前时间)", + "type": "string" + }, + "divideRate": { + "description": "代理分成比例", + "type": "integer" + }, + "fifth": { + "description": "5阶", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "first": { + "description": "一阶", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "fourth": { + "description": "四阶", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "landingPage": { + "description": "落地页", + "type": "string" + }, + "lessIncomeRate": { + "description": "最低收益比 CPA低于该值开启扣量(0.1 - 3.0)", + "type": "number" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "proxyDeduction": { + "description": "代理扣量比例", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "second": { + "description": "二阶", + "type": "integer", + "maximum": 100, + "minimum": 0 + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc (cpt/cpc 1-5阶设置100 不可编辑)", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "third": { + "description": "三阶", + "type": "integer", + "maximum": 100, + "minimum": 0 + } + } + }, + "proto.ChannelDeductionRuleDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "ID", + "type": "string" + } + } + }, + "proto.ChannelDeductionRuleSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ChannelDeductionRuleSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelDeductionRule" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ChannelDeductionRuleUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "autoDeduction": { + "description": "自动扣量开关", + "type": "boolean" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsBegin": { + "description": "CPS 开始扣量金额", + "type": "integer" + }, + "cpsDeductionRate": { + "description": "CPS 扣量比例", + "type": "integer" + }, + "cpsRate": { + "description": "CPS分成比列 0-100", + "type": "integer" + }, + "deductionAt": { + "description": "扣量开始时间", + "type": "string" + }, + "divideRate": { + "description": "代理分成比例", + "type": "integer" + }, + "fifth": { + "description": "5阶(11单以上)", + "type": "integer" + }, + "first": { + "description": "一阶(1单)", + "type": "integer" + }, + "fourth": { + "description": "四阶(6-10单)", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "landingPage": { + "description": "落地页", + "type": "string" + }, + "lessIncomeRate": { + "description": "最低收益比 CPA低于该值开启扣量(0.1 - 3.0)", + "type": "number" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "proxyDeduction": { + "description": "代理扣量比例", + "type": "integer" + }, + "second": { + "description": "二阶(2-3单)", + "type": "integer" + }, + "third": { + "description": "三阶(4-5单)", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.ChannelDownLoadLinkReq": { + "type": "object", + "properties": { + "appId": { + "description": "AppID", + "type": "integer" + }, + "channel": { + "description": "商区渠道号", + "type": "string" + } + } + }, + "proto.ChannelInfoAdd": { + "type": "object", + "required": [ + "channel", + "type" + ], + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "childShowDivideRate": { + "description": "下级是否显示分成比例", + "type": "boolean" + }, + "lock": { + "description": "禁止登陆", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "parentChannel": { + "description": "父渠道 如果为空字符串,则为渠道,否则为代理", + "type": "string" + }, + "password": { + "description": "代理商密", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + } + } + }, + "proto.ChannelInfoDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "ID", + "type": "string" + } + } + }, + "proto.ChannelInfoSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "Type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "appId": { + "description": "渠道对应的appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "parentChannel": { + "description": "父渠道 二级:存在父渠道", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "userName": { + "description": "所有者", + "type": "string" + } + } + }, + "proto.ChannelInfoSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ChannelInfoUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "autoGenApk": { + "description": "自动生成渠道包", + "type": "boolean" + }, + "childShowDivideRate": { + "description": "下级是否显示分成比例", + "type": "boolean" + }, + "id": { + "description": "ID", + "type": "string" + }, + "lock": { + "description": "禁止登陆", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "password": { + "description": "渠道密码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "showMagic": { + "description": "异常登陆次数", + "type": "integer" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "walletAddr1": { + "description": "钱包地址1", + "type": "string" + }, + "walletAddr2": { + "description": "钱包地址2", + "type": "string" + } + } + }, + "proto.ChannelOwnerChangeInfoSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "newUser": { + "description": "变更后的所有者", + "type": "string" + }, + "oldUser": { + "description": "变更前的所有者", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ChannelOwnerChangeInfoSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelOwnerChange" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ChannelOwnerUpdate": { + "type": "object", + "required": [ + "channel" + ], + "properties": { + "channel": { + "description": "渠道ID", + "type": "string" + }, + "mark": { + "description": "备注", + "type": "string" + }, + "userName": { + "description": "所有者名字", + "type": "string" + } + } + }, + "proto.ChannelSettlementSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "withChild": { + "description": "包含子渠道", + "type": "boolean" + } + } + }, + "proto.ChannelSettlementSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelSettlement" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ChannelStatSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "array", + "items": { + "type": "integer" + } + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "dayType": { + "description": "天数", + "type": "integer" + }, + "detail": { + "description": "true 渠道详细", + "type": "boolean" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "rankType": { + "description": "排序方式:统计时间+1充值,2新增,3收益", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "sumDate": { + "description": "哪一天", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "withChild": { + "description": "包含子渠道", + "type": "boolean" + } + } + }, + "proto.ChannelStatSearchResp": { + "type": "object", + "properties": { + "desc": { + "description": "描述", + "type": "string" + }, + "income": { + "description": "总收益", + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + } + }, + "proto.ChannelStatSettlementSearch": { + "type": "object", + "required": [ + "appId", + "channel", + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc/hz", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "withChild": { + "description": "包含子渠道", + "type": "boolean" + } + } + }, + "proto.ChannelStatSettlementSearchResp": { + "type": "object", + "properties": { + "desc": { + "description": "描述", + "type": "string" + }, + "income": { + "description": "总收益", + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + } + }, + "proto.ContactInfo": { + "type": "object", + "properties": { + "madou": { + "description": "官网", + "type": "string" + }, + "paoto": { + "description": "土豆", + "type": "string" + }, + "telegram": { + "description": "PC端图片", + "type": "string" + } + } + }, + "proto.DailyHourStatInfo": { + "type": "object", + "properties": { + "NewH5IosCount": { + "description": "+H5IOS新增", + "type": "integer" + }, + "androidAmount": { + "description": "安卓充值金额", + "type": "integer" + }, + "androidAmountCount": { + "description": "安卓充值次数", + "type": "integer" + }, + "androidVisitCount": { + "description": "Android访问量", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "app名称", + "type": "string" + }, + "deductionAmount": { + "description": "充值扣量", + "type": "integer" + }, + "deductionAmountCount": { + "description": "充值扣量次数", + "type": "integer" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directAmountCount": { + "description": "+直推充值订单数", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "districtAmount": { + "description": "渠道充值", + "type": "integer" + }, + "districtAmountCount": { + "description": "渠道充值次数", + "type": "integer" + }, + "districtVisitCount": { + "description": "渠道访问", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionAmountCount": { + "description": "+裂变充值订单数", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "h5Amount": { + "description": "+H5充值金额", + "type": "integer" + }, + "h5AmountCount": { + "description": "+H5充值次数", + "type": "integer" + }, + "h5AndroidAmount": { + "description": "当日H5Android充值", + "type": "integer" + }, + "h5AndroidAmountCount": { + "description": "当日H5Android充值次数", + "type": "integer" + }, + "h5AndroidVisitCount": { + "description": "+H5Android访问量", + "type": "integer" + }, + "h5FormalAmount": { + "description": "当日H5Formal充值", + "type": "integer" + }, + "h5FormalAmountCount": { + "description": "当日H5Formal充值次数", + "type": "integer" + }, + "h5IosAmountCount": { + "description": "当日H5Ios充值次数", + "type": "integer" + }, + "h5IosVisitCount": { + "description": "+H5Ios访问量", + "type": "integer" + }, + "h5PcAmount": { + "description": "当日H5Pc充值", + "type": "integer" + }, + "h5PcAmountCount": { + "description": "当日H5Pc充值次数", + "type": "integer" + }, + "h5PcVisitCount": { + "description": "+H5Pc访问量", + "type": "integer" + }, + "h5VisitCount": { + "description": "+H5访问量", + "type": "integer" + }, + "iosAmount": { + "description": "Ios充值金额", + "type": "integer" + }, + "iosAmountCount": { + "description": "Ios充值次数", + "type": "integer" + }, + "iosVisitCount": { + "description": "Ios访问量", + "type": "integer" + }, + "landpageAndroidClick": { + "description": "落地页点击", + "type": "integer" + }, + "landpageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landpageIosAthorClick": { + "description": "落地页iOS其他包访问次数", + "type": "integer" + }, + "landpageIosH5Click": { + "description": "落地页H5访问次数", + "type": "integer" + }, + "lightAmount": { + "description": "light充值金额", + "type": "integer" + }, + "lightAmountCount": { + "description": "light充值次数", + "type": "integer" + }, + "lightDeductionAmount": { + "description": "light充值金额扣量", + "type": "integer" + }, + "lightDeductionAmountCount": { + "description": "light充值次数扣量", + "type": "integer" + }, + "lightDirectAmount": { + "description": "light充值金额直推", + "type": "integer" + }, + "lightDirectAmountCount": { + "description": "light充值次数直推", + "type": "integer" + }, + "lightDistrictAmount": { + "description": "light充值金额渠道", + "type": "integer" + }, + "lightDistrictAmountCount": { + "description": "light充值次数渠道", + "type": "integer" + }, + "lightFissionAmount": { + "description": "light充值金额裂变", + "type": "integer" + }, + "lightFissionAmountCount": { + "description": "light充值次数裂变", + "type": "integer" + }, + "lightNaturalAmount": { + "description": "light充值金额自然", + "type": "integer" + }, + "lightNaturalAmountCount": { + "description": "light充值次数自然", + "type": "integer" + }, + "lightNormalAmount": { + "description": "light充值金额自来", + "type": "integer" + }, + "lightNormalAmountCount": { + "description": "light充值次数自来", + "type": "integer" + }, + "lightVisitCount": { + "description": "light访问量", + "type": "integer" + }, + "lightVisitDeductionCount": { + "description": "light访问量扣量", + "type": "integer" + }, + "lightVisitDirectCount": { + "description": "light访问量直推", + "type": "integer" + }, + "lightVisitDistrictCount": { + "description": "light访问量渠道", + "type": "integer" + }, + "lightVisitFissionCount": { + "description": "light访问量裂变", + "type": "integer" + }, + "lightVisitNaturalCount": { + "description": "light访问量自然", + "type": "integer" + }, + "lightVisitNormalCount": { + "description": "light访问量自来", + "type": "integer" + }, + "lightVisitWebCount": { + "description": "light访问量官网", + "type": "integer" + }, + "lightWebAmount": { + "description": "light充值金额官网", + "type": "integer" + }, + "lightWebAmountCount": { + "description": "light充值次数官网", + "type": "integer" + }, + "naturalAmount": { + "description": "自然充值", + "type": "integer" + }, + "naturalAmountCount": { + "description": "+自然充值订单数", + "type": "integer" + }, + "naturalVisitCount": { + "description": "自然访问数", + "type": "integer" + }, + "newAndroidCount": { + "description": "android新增", + "type": "integer" + }, + "newCoinRecharge": { + "description": "¥新增金币充值", + "type": "integer" + }, + "newDeductionCount": { + "description": "新增扣量", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newDistrictCount": { + "description": "**渠道新增", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newH5AndroidCount": { + "description": "+H5Android新增", + "type": "integer" + }, + "newH5Count": { + "description": "H5注册", + "type": "integer" + }, + "newH5FormalCount": { + "description": "H5注册新增", + "type": "integer" + }, + "newH5PcCount": { + "description": "+H5PC新增", + "type": "integer" + }, + "newIosCount": { + "description": "ios新增", + "type": "integer" + }, + "newLightCount": { + "description": "轻量注册", + "type": "integer" + }, + "newLightDeductionCount": { + "description": "light新增扣量", + "type": "integer" + }, + "newLightDirectCount": { + "description": "light新增直推", + "type": "integer" + }, + "newLightDistrictCount": { + "description": "light渠道新增", + "type": "integer" + }, + "newLightFissionCount": { + "description": "light新增裂变", + "type": "integer" + }, + "newLightFormalCount": { + "description": "light新增注册", + "type": "integer" + }, + "newLightGuestCount": { + "description": "light新增安装", + "type": "integer" + }, + "newLightNaturalCount": { + "description": "light自然新增", + "type": "integer" + }, + "newLightNormalCount": { + "description": "light自来新增", + "type": "integer" + }, + "newLightWebCount": { + "description": "light官网新增", + "type": "integer" + }, + "newNaturalCount": { + "description": "自然新增", + "type": "integer" + }, + "newNormalCount": { + "description": "**自来新增", + "type": "integer" + }, + "newRechargeAmount": { + "description": "新增充值金额", + "type": "integer" + }, + "newRechargeCount": { + "description": "新增充值", + "type": "integer" + }, + "newTotalCount": { + "description": "注册", + "type": "integer" + }, + "newVipRecharge": { + "description": "¥新增VIP充值", + "type": "integer" + }, + "newWebCount": { + "description": "**官网新增", + "type": "integer" + }, + "normalAmount": { + "description": "自来充值", + "type": "integer" + }, + "normalAmountCount": { + "description": "自来充值次数", + "type": "integer" + }, + "normalVisitCount": { + "description": "自来访问", + "type": "integer" + }, + "oldCoinRecharge": { + "description": "¥老用户金币充值", + "type": "integer" + }, + "oldRechargeAmount": { + "description": "新用户和老用户充值", + "type": "integer" + }, + "oldVipRecharge": { + "description": "¥老用户VIP充值", + "type": "integer" + }, + "rechargeSuccessRate": { + "description": "支付成功率", + "type": "string" + }, + "repeatAmount": { + "description": "复冲金额", + "type": "integer" + }, + "repeatAmountCount": { + "description": "+复冲订单数", + "type": "integer" + }, + "successRechargeOrder": { + "description": "充值成功订单数", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "sumHour": { + "description": "小时数", + "type": "integer" + }, + "todayH5IosRecharge": { + "description": "当日H5Ios充值", + "type": "integer" + }, + "totalAmount": { + "description": "充值", + "type": "integer" + }, + "totalRechargeOrder": { + "description": "拉起订单数", + "type": "integer" + }, + "totalVisitCount": { + "description": "访问", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "vipPayByAmount": { + "description": "金币购买", + "type": "integer" + }, + "vipPayByMoney": { + "description": "会员购买", + "type": "integer" + }, + "vipRepeatAmount": { + "description": "VIP复冲金额", + "type": "integer" + }, + "webAmount": { + "description": "官网充值", + "type": "integer" + }, + "webAmountCount": { + "description": "官网充值次数", + "type": "integer" + }, + "webVisitCount": { + "description": "官网访问", + "type": "integer" + } + } + }, + "proto.DailyStatInfo": { + "type": "object", + "properties": { + "ARPPU": { + "description": "付费用户人均充值", + "type": "integer" + }, + "ARPU": { + "description": "其他充值", + "type": "integer" + }, + "androidAddCount": { + "description": "android新增", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "appName": { + "description": "app名称", + "type": "string" + }, + "day1RetainRate": { + "description": "留存率", + "type": "number" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "number" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "number" + }, + "deductionAmount": { + "description": "扣量充值金额", + "type": "integer" + }, + "deductionVisitCount": { + "description": "扣量访问数", + "type": "integer" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "h5AddCount": { + "description": "H5新增", + "type": "integer" + }, + "h5AndroidAddCount": { + "description": "H5Android新增", + "type": "integer" + }, + "h5FormalCount": { + "description": "H5注册", + "type": "integer" + }, + "h5IosAddCount": { + "description": "H5Ios新增", + "type": "integer" + }, + "h5PcAddCount": { + "description": "H5Pc新增", + "type": "integer" + }, + "iosAddCount": { + "description": "ios新增", + "type": "integer" + }, + "landpageAndroidClick": { + "description": "落地页点击", + "type": "integer" + }, + "landpageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landpageIosAthorClick": { + "description": "落地页iOS其他包访问次数", + "type": "integer" + }, + "landpageIosH5Click": { + "description": "落地页H5访问次数", + "type": "integer" + }, + "lightAddCount": { + "description": "轻量注册", + "type": "integer" + }, + "lightDeductionCount": { + "description": "轻量扣量注册", + "type": "integer" + }, + "lightDeductionRechargeAmount": { + "description": "轻量扣量充值钱数", + "type": "integer" + }, + "lightDeductionRechargeCount": { + "description": "轻量扣量充值次数", + "type": "integer" + }, + "lightDeductionVisitCount": { + "description": "轻量扣量访问", + "type": "integer" + }, + "lightDirectCount": { + "description": "轻量直推注册", + "type": "integer" + }, + "lightDirectRechargeAmount": { + "description": "轻量直推充值钱数", + "type": "integer" + }, + "lightDirectRechargeCount": { + "description": "轻量直推充值次数", + "type": "integer" + }, + "lightDirectVisitCount": { + "description": "轻量直推访问", + "type": "integer" + }, + "lightDistrictCount": { + "description": "轻量渠道注册", + "type": "integer" + }, + "lightDistrictRechargeAmount": { + "description": "轻量渠道充值钱数", + "type": "integer" + }, + "lightDistrictRechargeCount": { + "description": "轻量渠道充值次数", + "type": "integer" + }, + "lightDistrictVisitCount": { + "description": "轻量渠道访问", + "type": "integer" + }, + "lightFissionCount": { + "description": "轻量裂变注册", + "type": "integer" + }, + "lightFissionRechargeAmount": { + "description": "轻量裂变充值钱数", + "type": "integer" + }, + "lightFissionRechargeCount": { + "description": "轻量裂变充值次数", + "type": "integer" + }, + "lightFissionVisitCount": { + "description": "轻量裂变访问", + "type": "integer" + }, + "lightFormalAddCount": { + "description": "轻量注册", + "type": "integer" + }, + "lightGuestAddCount": { + "description": "轻量游客", + "type": "integer" + }, + "lightNaturalCount": { + "description": "轻量自然注册", + "type": "integer" + }, + "lightNaturalRechargeAmount": { + "description": "轻量自然充值钱数", + "type": "integer" + }, + "lightNaturalRechargeCount": { + "description": "轻量自然充值次数", + "type": "integer" + }, + "lightNaturalVisitCount": { + "description": "轻量自然访问", + "type": "integer" + }, + "lightNormalCount": { + "description": "轻量自来注册", + "type": "integer" + }, + "lightNormalRechargeAmount": { + "description": "轻量自来充值钱数", + "type": "integer" + }, + "lightNormalRechargeCount": { + "description": "轻量自来充值次数", + "type": "integer" + }, + "lightNormalVisitCount": { + "description": "轻量自来访问", + "type": "integer" + }, + "lightRechargeAmount": { + "description": "轻量充值钱数", + "type": "integer" + }, + "lightRechargeCount": { + "description": "轻量充值次数", + "type": "integer" + }, + "lightVisitCount": { + "description": "轻量访问", + "type": "integer" + }, + "lightWebCount": { + "description": "轻量官网注册", + "type": "integer" + }, + "lightWebRechargeAmount": { + "description": "轻量官网充值钱数", + "type": "integer" + }, + "lightWebRechargeCount": { + "description": "轻量官网充值次数", + "type": "integer" + }, + "lightWebVisitCount": { + "description": "轻量官网访问", + "type": "integer" + }, + "naturalAmount": { + "description": "自然充值", + "type": "integer" + }, + "naturalVisitCount": { + "description": "自然访问数", + "type": "integer" + }, + "newCoinRecharge": { + "description": "新增金币充值", + "type": "integer" + }, + "newDeductionCount": { + "description": "新增扣量", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newDistrictCount": { + "description": "渠道注册", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newNaturalCount": { + "description": "自然新增", + "type": "integer" + }, + "newNormalCount": { + "description": "自来注册", + "type": "integer" + }, + "newRechargeAmount": { + "description": "新增充值金额", + "type": "integer" + }, + "newRechargeCount": { + "description": "新增充值", + "type": "integer" + }, + "newRechargeRate": { + "description": "充值率", + "type": "number" + }, + "newVipRecharge": { + "description": "新增VIP充值", + "type": "integer" + }, + "newWebCount": { + "description": "官网注册", + "type": "integer" + }, + "oldCoinRecharge": { + "description": "老用户金币充值", + "type": "integer" + }, + "oldRechargeAmount": { + "description": "新用户和老用户充值", + "type": "integer" + }, + "oldVipRecharge": { + "description": "老用户VIP充值", + "type": "integer" + }, + "payForAthor": { + "description": "金币充值", + "type": "integer" + }, + "rechargeSuccessRate": { + "description": "支付成功率", + "type": "string" + }, + "repeatAmount": { + "description": "复冲金额", + "type": "integer" + }, + "repeatVipMoney": { + "description": "复冲VIP", + "type": "integer" + }, + "successRechargeOrder": { + "description": "订单统计", + "type": "integer" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + }, + "todayAndroidRecharge": { + "description": "当日android充值", + "type": "integer" + }, + "todayAndroidVisitCount": { + "description": "当日安卓访问量(日活)", + "type": "integer" + }, + "todayDistrictRecharge": { + "description": "当日渠道充值新增", + "type": "integer" + }, + "todayDistrictVisitCount": { + "description": "当日渠道访问量", + "type": "integer" + }, + "todayH5AndroidRecharge": { + "description": "当日H5Android充值", + "type": "integer" + }, + "todayH5AndroidVisitCount": { + "description": "当日H5Android访问量(日活)", + "type": "integer" + }, + "todayH5FormalRecharge": { + "description": "当日H5Formal充值", + "type": "integer" + }, + "todayH5IosRecharge": { + "description": "当日H5Ios充值", + "type": "integer" + }, + "todayH5IosVisitCount": { + "description": "当日H5Ios访问量(日活)", + "type": "integer" + }, + "todayH5PcRecharge": { + "description": "当日H5Pc充值", + "type": "integer" + }, + "todayH5PcVisitCount": { + "description": "当日H5Pc访问量(日活)", + "type": "integer" + }, + "todayH5Recharge": { + "description": "当日H5充值", + "type": "integer" + }, + "todayH5VisitCount": { + "description": "当日H5访问量(日活)", + "type": "integer" + }, + "todayIosRecharge": { + "description": "当日Ios充值", + "type": "integer" + }, + "todayIosVisitCount": { + "description": "当日IOS访问量(日活)", + "type": "integer" + }, + "todayNormalRecharge": { + "description": "当日自来量充值新增", + "type": "integer" + }, + "todayNormalVisitCount": { + "description": "当日自来访问量", + "type": "integer" + }, + "todayWebRecharge": { + "description": "当日官网充值新增", + "type": "integer" + }, + "todayWebVisitCount": { + "description": "当日官网访问量", + "type": "integer" + }, + "totalAmount": { + "description": "充值统计", + "type": "integer" + }, + "totalNewCount": { + "description": "注册统计", + "type": "integer" + }, + "totalRechargeOrder": { + "description": "拉起订单数", + "type": "integer" + }, + "totalVisitCount": { + "description": "访问统计", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "vipPayByMoney": { + "description": "会员充值", + "type": "integer" + }, + "visitRechargeRate": { + "description": "登陆充值率", + "type": "number" + } + } + }, + "proto.DelActivityReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "唯一ID", + "type": "string" + } + } + }, + "proto.DelAdminReq": { + "type": "object", + "required": [ + "account" + ], + "properties": { + "account": { + "description": "用户id", + "type": "string" + } + } + }, + "proto.DelAdsLocReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "应用id", + "type": "integer" + } + } + }, + "proto.DelAdsReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "应用id", + "type": "integer" + } + } + }, + "proto.DelAnnounReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "公告id", + "type": "string" + } + } + }, + "proto.DelAppInfoReq": { + "type": "object", + "required": [ + "appId" + ], + "properties": { + "appId": { + "description": "appId,唯一id", + "type": "integer" + } + } + }, + "proto.DelAppLocReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "应用id", + "type": "integer" + } + } + }, + "proto.DelAppReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "proto.DelDomainInfoReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string" + } + } + }, + "proto.DelGiftReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "奖品唯一ID", + "type": "string" + } + } + }, + "proto.DelLandPageConfigReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "Id", + "type": "integer" + } + } + }, + "proto.DelLandingPageReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "Id", + "type": "integer" + } + } + }, + "proto.DelLotteryCodeReq": { + "type": "object", + "required": [ + "lotteryCodeId" + ], + "properties": { + "lotteryCodeId": { + "description": "唯一ID", + "type": "string" + } + } + }, + "proto.DelRoleReq": { + "type": "object", + "required": [ + "roleId" + ], + "properties": { + "roleId": { + "description": "id", + "type": "integer" + } + } + }, + "proto.DownloadStatInfo": { + "type": "object", + "properties": { + "appId": { + "type": "integer" + }, + "appName": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "downTotal": { + "description": "下载总数", + "type": "integer" + }, + "downUnique": { + "description": "去重下载数(IP来自独立访问集合)", + "type": "integer" + }, + "downloadToInstallRate": { + "description": "下载安装转化率", + "type": "number" + }, + "endDate": { + "description": "这个不展示", + "type": "string" + }, + "hour": { + "description": "小时统计展示,每日统计不展示", + "type": "integer" + }, + "id": { + "type": "string" + }, + "installTotal": { + "description": "安装总数", + "type": "integer" + }, + "installUnique": { + "description": "去重安装数(IP来自下载独立集合)", + "type": "integer" + }, + "sumDate": { + "description": "日期", + "type": "string" + }, + "type": { + "description": "这个不展示", + "allOf": [ + { + "$ref": "#/definitions/downloadstat.StatType" + } + ] + }, + "updatedAt": { + "type": "string" + }, + "visitCount": { + "description": "访问总数", + "type": "integer" + }, + "visitToDownloadRate": { + "description": "浏览下载转化率", + "type": "number" + }, + "visitToInstallRate": { + "description": "浏览安装转化率", + "type": "number" + }, + "visitUnique": { + "description": "去重访问数", + "type": "integer" + } + } + }, + "proto.DownloadSummaryInfo": { + "type": "object", + "properties": { + "appId": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "proto.DrawReq": { + "type": "object", + "required": [ + "actId", + "ip", + "lotteryCode" + ], + "properties": { + "actId": { + "description": "活动ID", + "type": "string" + }, + "ip": { + "description": "用户IP", + "type": "string" + }, + "lotteryCode": { + "description": "抽奖码", + "type": "string" + } + } + }, + "proto.FindLandPageConfigReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "status": { + "type": "boolean" + }, + "type": { + "type": "integer" + } + } + }, + "proto.FindLandingPageReq": { + "type": "object", + "required": [ + "appId", + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.GenGiftCodeRes": { + "type": "object", + "properties": { + "codeLen": { + "description": "生成奖品兑换码的长度", + "type": "integer" + }, + "codeNum": { + "description": "生成奖品兑换码的数量", + "type": "integer" + }, + "giftId": { + "description": "奖品唯一ID", + "type": "string" + } + } + }, + "proto.GenLotteryCodeReq": { + "type": "object", + "required": [ + "actId", + "codeLen", + "codeNum" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "codeLen": { + "description": "抽奖码长度", + "type": "integer" + }, + "codeNum": { + "description": "生产的抽奖码个数", + "type": "integer" + } + } + }, + "proto.GetApplicationsReq": { + "type": "object", + "required": [ + "pageSize" + ], + "properties": { + "androidUrl": { + "description": "安卓链接", + "type": "string" + }, + "category": { + "description": "分类ID", + "type": "integer" + }, + "download_url": { + "description": "下载地址", + "type": "string" + }, + "id": { + "type": "string" + }, + "iosUrl": { + "description": "ios链接", + "type": "string" + }, + "isHighQuality": { + "description": "是否是优质APP推荐", + "type": "boolean" + }, + "locIds": { + "description": "位置id", + "type": "array", + "items": { + "type": "integer" + } + }, + "name": { + "description": "应用名", + "type": "string" + }, + "pageNum": { + "description": "分页参数", + "type": "integer" + }, + "pageSize": { + "description": "分页参数", + "type": "integer" + }, + "parentAppId": { + "description": "所属appId", + "type": "integer" + }, + "status": { + "description": "Tag *common.AppReqType `json:\"tag\" bson:\"tag\"` //标签", + "type": "boolean" + } + } + }, + "proto.GetApplicationsResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/applicationmod.Application" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.GetApplyFormReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + } + } + }, + "proto.GetApplyFormResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.ApplyFormRecord" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.GetGiftInfoReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "所属活动的名称", + "type": "string" + }, + "appName": { + "description": "所属app的名字", + "type": "string" + }, + "giftCode": { + "description": "奖品兑换码", + "type": "string" + }, + "giftId": { + "description": "所属活动奖品的ID", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "isGaveOut": { + "description": "兑换码是否已发放", + "type": "boolean" + }, + "isUsed": { + "description": "奖品兑换码是否已使用", + "type": "boolean" + }, + "lotteryCode": { + "description": "抽奖码", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "userId": { + "description": "兑换者Id", + "type": "string" + } + } + }, + "proto.GetGiftInfoResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.LotteryGetGift" + } + }, + "total": { + "description": "数量", + "type": "integer" + } + } + }, + "proto.GetLandPageConfigByTypeReq": { + "type": "object", + "required": [ + "appId", + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "type": { + "type": "integer" + } + } + }, + "proto.GetSettlementApplicantListReq": { + "type": "object" + }, + "proto.GetSettlementApplicantListResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "proto.GiftInfo": { + "type": "object", + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "所属活动的名称", + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "giftDesc": { + "description": "奖品描述", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "giftNum": { + "description": "抽奖码总数量", + "type": "integer" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "rate": { + "description": "备注", + "type": "integer" + }, + "receivedGiftNum": { + "description": "抽奖码已使用数量", + "type": "integer" + }, + "sort": { + "description": "排序", + "type": "integer" + }, + "updatedAt": { + "type": "string" + } + } + }, + "proto.GiftListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "giftDesc": { + "description": "奖品描述", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "rate": { + "description": "备注", + "type": "integer" + } + } + }, + "proto.GiftListResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.GiftInfo" + } + }, + "total": { + "description": "数量", + "type": "integer" + } + } + }, + "proto.H5ConfigReq": { + "type": "object", + "properties": { + "appId": { + "description": "AppID", + "type": "integer" + }, + "dc": { + "description": "商区渠道号", + "type": "string" + }, + "pc": { + "description": "用户渠道号,即用户邀请码", + "type": "string" + } + } + }, + "proto.H5GiftInfo": { + "type": "object", + "properties": { + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "id": { + "description": "奖品ID", + "type": "string" + } + } + }, + "proto.InnerRechargeReq": { + "type": "object", + "properties": { + "innerId": { + "type": "integer" + } + } + }, + "proto.LandPageConfigListResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/landPageConfig.LandPageConfig" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.LandingPageConfig": { + "type": "object", + "properties": { + "actor": { + "description": "演员", + "type": "string" + }, + "addedTime": { + "description": "上架时间(审核通过时间)", + "type": "string" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "desc": { + "description": "描述", + "type": "string" + }, + "media": { + "description": "视频", + "type": "string" + }, + "picture": { + "description": "图片", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "title": { + "description": "主题", + "type": "string" + } + } + }, + "proto.LandingPageInfo": { + "type": "object", + "required": [ + "status", + "type" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channelCode": { + "description": "渠道码", + "type": "string" + }, + "id": { + "description": "Id", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 默认true", + "type": "boolean" + }, + "type": { + "description": "类型 1:渠道 2:分享", + "type": "integer" + }, + "url": { + "description": "Url", + "type": "string" + } + } + }, + "proto.LandingPageListRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.LandingPageInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.LandpagePictureAddReq": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "mobileAvatar": { + "description": "移动端图片", + "type": "string" + }, + "mobileBackgroud": { + "description": "移动端背景图", + "type": "string" + }, + "mobileTiltle": { + "description": "移动端标语", + "type": "string" + }, + "music": { + "description": "音频文件", + "type": "string" + }, + "name": { + "description": "图片名称", + "type": "string" + }, + "pcAvatar": { + "description": "PC端图片", + "type": "string" + }, + "pcBackgroud": { + "description": "PC端背景图", + "type": "string" + }, + "pcTitle": { + "description": "PC端标语", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.LandpagePictureDelReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "proto.LandpagePictureSearch": { + "type": "object", + "properties": { + "name": { + "description": "分类名称", + "type": "string" + }, + "pageNum": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + } + } + }, + "proto.LandpagePictureSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/landpageImg.LandpageImg" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.LandpagePictureUpdate": { + "type": "object", + "properties": { + "mobileAvatar": { + "description": "移动端图片", + "type": "string" + }, + "mobileBackgroud": { + "description": "移动端背景图", + "type": "string" + }, + "mobileTiltle": { + "description": "移动端标语", + "type": "string" + }, + "music": { + "description": "音频文件", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "pcAvatar": { + "description": "PC端图片", + "type": "string" + }, + "pcBackgroud": { + "description": "PC端背景图", + "type": "string" + }, + "pcTitle": { + "description": "PC端标语", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.LandpagePictureUpdateReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "param": { + "description": "参数", + "allOf": [ + { + "$ref": "#/definitions/proto.LandpagePictureUpdate" + } + ] + } + } + }, + "proto.LinkInfo": { + "type": "object", + "properties": { + "foreign": { + "description": "true 国外用户", + "type": "boolean" + }, + "link": { + "description": "链接地址", + "type": "string" + }, + "weight": { + "description": "权重", + "type": "integer" + } + } + }, + "proto.ListAdsLocReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId,过滤条件", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ListAdsLocRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AdsLocInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListAdsReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId,过滤条件", + "type": "integer" + }, + "isActive": { + "description": "appId,过滤条件", + "type": "boolean" + }, + "link": { + "description": "链接地址", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "title": { + "description": "广告标题", + "type": "string" + } + } + }, + "proto.ListAdsRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AdsInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListAnnounReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "应用id 筛选条件", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ListAnnounRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AnnounInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListAppInfoReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appName": { + "description": "appId", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "used": { + "description": "渠道", + "type": "boolean" + } + } + }, + "proto.ListAppInfoRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AppInfoRes" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListAppLocReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId,过滤条件", + "type": "integer" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.ListAppLocRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.AppLocInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListBlocDailyStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocDailyStatRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.BlocDailyStatInfo" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/proto.BlocDailyStatInfo" + } + } + }, + "proto.ListBlocDailyStatTotalReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocDailyStatTotalRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.BlocDailyStatTotalInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListBlocRechargeChannelInfo": { + "type": "object", + "properties": { + "blocChannelRate": { + "description": "费率", + "type": "integer" + }, + "blocOrderMoney": { + "description": "订单金额", + "type": "integer" + }, + "channelName": { + "description": "支付渠道名称", + "type": "string" + }, + "sumDate": { + "description": "记录时间 按天对齐", + "type": "string" + } + } + }, + "proto.ListBlocRechargeChannelReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channelName": { + "description": "渠道名称筛选", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocRechargeChannelRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.ListBlocRechargeChannelInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListBlocRechargeDetailsReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocRechargeDetailsRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.BlocRechargeDetailsInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListBlocRegisterDetailsReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocRegisterDetailsRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.BlocRegisterDetailsInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListBlocWithdrawDetailsInfo": { + "type": "object", + "required": [ + "money", + "payType" + ], + "properties": { + "act": { + "description": "交易账户", + "type": "string" + }, + "actName": { + "description": "交易账户持有人", + "type": "string" + }, + "amount": { + "description": "金币数量", + "type": "integer" + }, + "appName": { + "description": "appID", + "type": "string" + }, + "devID": { + "description": "设备id", + "type": "string" + }, + "deviceType": { + "description": "设备类型", + "type": "string" + }, + "money": { + "description": "提现金额", + "type": "integer" + }, + "name": { + "description": "用户名", + "type": "string" + }, + "oid": { + "description": "第三方支付平台id", + "type": "string" + }, + "payMoney": { + "description": "实际到账", + "type": "integer" + }, + "payType": { + "description": "提现方式,alipay,bankcard", + "type": "string" + }, + "receivedAt": { + "description": "到账时间 李秋山确认 三方出款时间", + "type": "string" + }, + "status": { + "description": "1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败", + "type": "integer" + }, + "statusDesc": { + "description": "状态说明", + "type": "string" + }, + "successAt": { + "description": "回调成功时间", + "type": "string" + }, + "uid": { + "description": "用户Id", + "type": "string" + }, + "userIp": { + "description": "用户ip", + "type": "string" + } + } + }, + "proto.ListBlocWithdrawDetailsReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListBlocWithdrawDetailsRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.ListBlocWithdrawDetailsInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListDailyHourStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + }, + "sumHour": { + "description": "小时数", + "type": "integer" + } + } + }, + "proto.ListDailyHourStatRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.DailyHourStatInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListDailyStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "array", + "items": { + "type": "integer" + } + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "startTime": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.ListDailyStatRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.DailyStatInfo" + } + }, + "total": { + "type": "integer" + }, + "totalInfo": { + "$ref": "#/definitions/proto.DailyStatInfo" + } + } + }, + "proto.ListDomainInfoReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "type": "integer" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/domainmod.Category" + } + ] + }, + "check": { + "description": "检测方式", + "allOf": [ + { + "$ref": "#/definitions/domainmod.CheckType" + } + ] + }, + "enable": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/domainmod.CheckStatus" + } + ] + } + } + }, + "proto.ListDomainInfoRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/domainmod.Domain" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListDownloadSummaryRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.DownloadSummaryInfo" + } + } + } + }, + "proto.ListHourStatLineInfo": { + "type": "object", + "properties": { + "HourH5Recharge": { + "description": "H5充值", + "type": "integer" + }, + "hourAndroidNew": { + "description": "android新增", + "type": "integer" + }, + "hourAndroidRecharge": { + "description": "android充值", + "type": "integer" + }, + "hourDistrictRecharge": { + "description": "//////", + "type": "integer" + }, + "hourDistrictVip": { + "description": "渠道VIP充值", + "type": "integer" + }, + "hourH5AndroidNew": { + "description": "H5Android新增", + "type": "integer" + }, + "hourH5AndroidRecharge": { + "description": "H5Android充值", + "type": "integer" + }, + "hourH5IosNew": { + "description": "H5Ios新增", + "type": "integer" + }, + "hourH5IosRecharge": { + "description": "H5Ios充值", + "type": "integer" + }, + "hourH5New": { + "description": "H5新增", + "type": "integer" + }, + "hourH5PcNew": { + "description": "H5Pc新增", + "type": "integer" + }, + "hourH5PcRecharge": { + "description": "H5Pc充值", + "type": "integer" + }, + "hourIosNew": { + "description": "Ios新增", + "type": "integer" + }, + "hourIosRecharge": { + "description": "Ios充值", + "type": "integer" + }, + "hourNew": { + "description": "新增", + "type": "integer" + }, + "hourNewDistrict": { + "description": "渠道新增", + "type": "integer" + }, + "hourNewNormal": { + "description": "自来量新增", + "type": "integer" + }, + "hourNewWeb": { + "description": "官网新增", + "type": "integer" + }, + "hourNormalRecharge": { + "description": "自来量充值", + "type": "integer" + }, + "hourNormalVip": { + "description": "自来量VIP充值", + "type": "integer" + }, + "hourVipRecharge": { + "description": "VIP充值", + "type": "integer" + }, + "hourWebRecharge": { + "description": "官网充值", + "type": "integer" + }, + "hourWebVip": { + "description": "官网VIP充值", + "type": "integer" + }, + "sumDate": { + "description": "记录时间,当日零点时间", + "type": "string" + } + } + }, + "proto.ListHourStatLineReq": { + "type": "object", + "required": [ + "appId", + "sumDate" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "compareTime": { + "description": "对比时间", + "type": "string" + }, + "sumDate": { + "description": "请求日的零点时间", + "type": "string" + } + } + }, + "proto.ListHourStatLineResp": { + "type": "object", + "properties": { + "appInfo": { + "description": "app信息", + "allOf": [ + { + "$ref": "#/definitions/proto.AppInfoRes" + } + ] + }, + "todayGraphList": { + "description": "今日曲线图数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.ListHourStatLineInfo" + } + }, + "yesterdayGraphList": { + "description": "昨日曲线图数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.ListHourStatLineInfo" + } + } + } + }, + "proto.ListLandPageStatRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.DownloadStatInfo" + } + }, + "summary": { + "$ref": "#/definitions/proto.DownloadStatInfo" + }, + "total": { + "type": "integer" + } + } + }, + "proto.ListMinuteStatReq": { + "type": "object", + "required": [ + "appId", + "sumDate" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "compareTime": { + "description": "对比时间", + "type": "string" + }, + "sumDate": { + "description": "请求日的零点时间", + "type": "string" + } + } + }, + "proto.ListMinuteStatRes": { + "type": "object", + "properties": { + "appInfo": { + "description": "app信息", + "allOf": [ + { + "$ref": "#/definitions/proto.AppInfoRes" + } + ] + }, + "todayGraphList": { + "description": "今日曲线图数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.MinuteStatInfo" + } + }, + "yesterdayGraphList": { + "description": "昨日曲线图数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.MinuteStatInfo" + } + } + } + }, + "proto.ListOpLogReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "isAdmin": { + "description": "是否是管理员 true: 管理员 false: 代理商", + "type": "boolean" + }, + "operator": { + "description": "操作人员", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "router": { + "description": "路由", + "type": "string" + } + } + }, + "proto.ListOpLogRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.OpLogInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.LotteryCodeListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "活动名称", + "type": "string" + }, + "giftCode": { + "description": "奖品兑换码", + "type": "string" + }, + "isUsed": { + "description": "抽奖码是否已使用", + "type": "boolean" + }, + "lotteryCode": { + "description": "抽奖码", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "userIp": { + "description": "抽奖者IP", + "type": "string" + } + } + }, + "proto.LotteryCodeListResp": { + "type": "object", + "properties": { + "list": { + "description": "活动抽奖码列表", + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.LottertyCodeInfo" + } + }, + "total": { + "description": "数量", + "type": "integer" + } + } + }, + "proto.MediaTagAddReq": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "name": { + "description": "标签名称", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "type": { + "description": "类别", + "allOf": [ + { + "$ref": "#/definitions/mediatag.MediaTagType" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.MediaTagDelReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "proto.MediaTagSearch": { + "type": "object", + "properties": { + "name": { + "description": "分类名称", + "type": "string" + }, + "pageNum": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "type": { + "description": "类别", + "allOf": [ + { + "$ref": "#/definitions/mediatag.MediaTagType" + } + ] + } + } + }, + "proto.MediaTagSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/mediatag.MediaTag" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.MediaTagUpdate": { + "type": "object", + "properties": { + "name": { + "description": "名称", + "type": "string" + }, + "rank": { + "description": "排序", + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "type": { + "description": "类", + "allOf": [ + { + "$ref": "#/definitions/mediatag.MediaTagType" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.MediaTagUpdateReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "param": { + "description": "参数", + "allOf": [ + { + "$ref": "#/definitions/proto.MediaTagUpdate" + } + ] + } + } + }, + "proto.MinuteStatInfo": { + "type": "object", + "properties": { + "accessCount": { + "description": "访问量", + "type": "integer" + }, + "androidAccessCount": { + "description": "android访问量", + "type": "integer" + }, + "androidAddCount": { + "description": "android新增", + "type": "integer" + }, + "h5AddCount": { + "description": "H5新增", + "type": "integer" + }, + "iosAccessCount": { + "description": "ios访问量", + "type": "integer" + }, + "iosAddCount": { + "description": "ios新增", + "type": "integer" + }, + "landpageAndroidClick": { + "description": "落地页android访问次数", + "type": "integer" + }, + "landpageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landpageIosAthorClick": { + "description": "落地页iOS其他包访问次数", + "type": "integer" + }, + "landpageIosH5Click": { + "description": "落地页H5访问次数", + "type": "integer" + }, + "lightGuestAddCount": { + "description": "轻量版新增", + "type": "integer" + }, + "newCount": { + "description": "新增数", + "type": "integer" + }, + "rechageCount": { + "description": "充值订单", + "type": "integer" + }, + "rechageMoney": { + "description": "充值金额", + "type": "integer" + }, + "sumDate": { + "description": "记录时间,当日零点时间", + "type": "string" + } + } + }, + "proto.MonitorAddReq": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/monitormod.MonitorCategory" + } + ] + }, + "checkCount": { + "description": "检测次数", + "type": "integer" + }, + "comment": { + "description": "注释", + "type": "string" + }, + "compare": { + "description": "比较", + "allOf": [ + { + "$ref": "#/definitions/monitormod.Compare" + } + ] + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "device": { + "description": "设备", + "allOf": [ + { + "$ref": "#/definitions/statutils.DeviceName" + } + ] + }, + "duration": { + "description": "时间段,单位分钟", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "threshold": { + "description": "阀值", + "type": "integer" + }, + "triggerCount": { + "description": "触发次数", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.MonitorDelReq": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "proto.MonitorSearch": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "category": { + "description": "监控分类", + "allOf": [ + { + "$ref": "#/definitions/monitormod.MonitorCategory" + } + ] + }, + "device": { + "description": "设备类型", + "allOf": [ + { + "$ref": "#/definitions/statutils.DeviceName" + } + ] + }, + "name": { + "description": "分类名称", + "type": "string" + }, + "pageNum": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "status": { + "description": "是否启用", + "type": "boolean" + } + } + }, + "proto.MonitorSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/monitormod.Monitor" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.MonitorUpdate": { + "type": "object", + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "category": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/monitormod.MonitorCategory" + } + ] + }, + "comment": { + "description": "注释", + "type": "string" + }, + "compare": { + "description": "比较", + "allOf": [ + { + "$ref": "#/definitions/monitormod.Compare" + } + ] + }, + "device": { + "description": "设备", + "allOf": [ + { + "$ref": "#/definitions/statutils.DeviceName" + } + ] + }, + "duration": { + "description": "时间段,单位分钟", + "type": "integer" + }, + "name": { + "description": "分类名称", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "threshold": { + "description": "阀值", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "proto.MonitorUpdateReq": { + "type": "object", + "required": [ + "id", + "param" + ], + "properties": { + "id": { + "type": "string" + }, + "param": { + "description": "参数", + "allOf": [ + { + "$ref": "#/definitions/proto.MonitorUpdate" + } + ] + } + } + }, + "proto.OpLogInfo": { + "type": "object", + "properties": { + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "data": { + "description": "操作数据", + "type": "string" + }, + "isAdmin": { + "description": "是否是管理员", + "type": "boolean" + }, + "operator": { + "description": "操作人员", + "type": "string" + }, + "router": { + "description": "接口路由", + "type": "string" + } + } + }, + "proto.PageButtonClickReq": { + "type": "object", + "required": [ + "terminal" + ], + "properties": { + "appId": { + "description": "AppID", + "type": "integer" + }, + "channel": { + "description": "渠道(json字符串)", + "type": "string" + }, + "domain": { + "description": "落地页域名", + "type": "string" + }, + "ip": { + "description": "ip", + "type": "string" + }, + "packageType": { + "description": "包类型 1:企业包 2:商店包 3:TF包 4:超级签 5:轻量版", + "allOf": [ + { + "$ref": "#/definitions/versionMod.PkgType" + } + ] + }, + "terminal": { + "description": "终端ios android", + "type": "string" + } + } + }, + "proto.PageButtonClickResp": { + "type": "object", + "required": [ + "packageType" + ], + "properties": { + "BackUrl": { + "description": "企业签URL (不用)", + "type": "string" + }, + "lightData": { + "description": "如果是轻量版,返回数据", + "type": "array", + "items": { + "type": "integer" + } + }, + "link": { + "description": "下载链接", + "type": "array", + "items": { + "type": "string" + } + }, + "packageType": { + "description": "包类型 1:企业包 2:商店包 3:TF包", + "allOf": [ + { + "$ref": "#/definitions/versionMod.PkgType" + } + ] + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "terminal": { + "description": "终端ios android light", + "type": "string" + }, + "tf": { + "description": "TFinfo", + "type": "array", + "items": { + "$ref": "#/definitions/proto.TfInfo" + } + }, + "versionNum": { + "description": "版本号", + "type": "string" + } + } + }, + "proto.PageButtonListReq": { + "type": "object", + "properties": { + "appId": { + "description": "AppID", + "type": "integer" + }, + "channel": { + "description": "渠道(json字符串)", + "type": "string" + }, + "domain": { + "description": "落地页域名", + "type": "string" + }, + "ip": { + "description": "ip", + "type": "string" + } + } + }, + "proto.PageButtonListResp": { + "type": "object", + "properties": { + "androidButton": { + "description": "android下载按钮", + "type": "integer" + }, + "contact": { + "description": "联系方式", + "allOf": [ + { + "$ref": "#/definitions/proto.ContactInfo" + } + ] + }, + "hasChannelApk": { + "description": "有安卓渠道包", + "type": "boolean" + }, + "iosDown": { + "description": "显示完整版,是企业包", + "type": "boolean" + }, + "iosH5": { + "description": "H5跳转链接", + "type": "boolean" + }, + "iosStore": { + "description": "显示商店包", + "type": "boolean" + }, + "iosTF": { + "description": "TF包", + "type": "boolean" + }, + "pictureList": { + "description": "资源数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.PageButtonPicture" + } + } + } + }, + "proto.PageButtonPicture": { + "type": "object", + "properties": { + "mobileAvatar": { + "description": "移动端图片", + "type": "string" + }, + "mobileBackgroud": { + "description": "移动端背景图", + "type": "string" + }, + "mobileTiltle": { + "description": "移动端标语", + "type": "string" + }, + "music": { + "description": "音频文件", + "type": "string" + }, + "pcAvatar": { + "description": "PC端图片", + "type": "string" + }, + "pcBackgroud": { + "description": "PC端背景图", + "type": "string" + }, + "pcTitle": { + "description": "PC端标语", + "type": "string" + } + } + }, + "proto.RoleInfo": { + "type": "object", + "properties": { + "authJson": { + "description": "权限json数据", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "role": { + "description": "角色", + "type": "string" + }, + "roleId": { + "description": "id", + "type": "integer" + }, + "updatedAt": { + "description": "修改时间", + "type": "string" + } + } + }, + "proto.RoleListReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.RoleListRes": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proto.RoleInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.SearchChannelStatComparedReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "withChild": { + "description": "包含子渠道", + "type": "boolean" + } + } + }, + "proto.SearchChannelStatComparedResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStatYesterday" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.SendTgMessageReq": { + "type": "object", + "properties": { + "appId": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "msgType": { + "$ref": "#/definitions/proto.TgMsgType" + } + } + }, + "proto.SendTgMessageRes": { + "type": "object" + }, + "proto.SettlementCalcReq": { + "type": "object", + "required": [ + "appId", + "channel", + "ruleId", + "settleIds" + ], + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "beginTime": { + "description": "开始时间", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "ruleId": { + "description": "扣量RuleId", + "type": "string" + }, + "settleIds": { + "description": "要结算的天记录ID列表", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "proto.SettlementCalcResp": { + "type": "object", + "properties": { + "totalCount": { + "description": "总条数", + "type": "integer" + }, + "totalDesc": { + "description": "总收益描述", + "type": "string" + }, + "totalIncome": { + "description": "总收益(列表的所有数据合计)", + "type": "integer" + }, + "totalInfo": { + "description": "按总条数合计的数据", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + ] + } + } + }, + "proto.SettlementInfoAdd": { + "type": "object", + "required": [ + "appId", + "beginTime", + "channel", + "endTime", + "totalMoney" + ], + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "beginTime": { + "description": "开始时间", + "type": "string" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "totalMoney": { + "description": "总金额", + "type": "integer" + } + } + }, + "proto.SettlementInfoDelete": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "ID", + "type": "string" + } + } + }, + "proto.SettlementInfoDetail": { + "type": "object", + "required": [ + "id", + "pageNum", + "pageSize" + ], + "properties": { + "id": { + "description": "ID", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + } + } + }, + "proto.SettlementInfoDetailResp": { + "type": "object", + "properties": { + "count": { + "description": "总条数", + "type": "integer" + }, + "list": { + "description": "全部记录", + "type": "array", + "items": { + "$ref": "#/definitions/stat_models_channelmod.ChannelStat" + } + } + } + }, + "proto.SettlementInfoSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "appId", + "type": "integer" + }, + "applicants": { + "description": "申请人列表", + "type": "array", + "items": { + "type": "string" + } + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "payType": { + "description": "支付类型,1ERC 2TRC 3銀行卡 4支付寶", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "status": { + "description": "状态数组", + "type": "array", + "items": { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + } + } + }, + "proto.SettlementInfoSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/channelsettlementrecord.ChannelSettlementRecord" + } + }, + "total": { + "type": "integer" + } + } + }, + "proto.SettlementInfoUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "ID", + "type": "string" + }, + "payMoney": { + "description": "打款金额", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态", + "allOf": [ + { + "$ref": "#/definitions/channelsettlementrecord.SettlementStatus" + } + ] + }, + "usdt": { + "description": "打款Usdt 还是分", + "type": "integer" + } + } + }, + "proto.ShareUrlReq": { + "type": "object", + "properties": { + "appid": { + "description": "AppID", + "type": "integer" + } + } + }, + "proto.StatDataDetail": { + "type": "object", + "properties": { + "childRebate": { + "description": "子渠道返佣", + "type": "integer" + }, + "directCount": { + "description": "新增总量(包含子渠道和渠道本身)", + "type": "integer" + }, + "directCountChild": { + "description": "子渠道新增量", + "type": "integer" + }, + "directCountSelf": { + "description": "自身渠道新增量", + "type": "integer" + }, + "income": { + "description": "收益(自身+子渠道)", + "type": "integer" + }, + "incomeChild": { + "description": "子渠道的收益", + "type": "integer" + }, + "incomeSelf": { + "description": "自身渠道的收益", + "type": "integer" + }, + "recharge": { + "description": "充值金额(包含子渠道和渠道本身)", + "type": "integer" + }, + "rechargeChild": { + "description": "来自子渠道充值金额", + "type": "integer" + }, + "rechargeSelf": { + "description": "来自自身渠道充值金额", + "type": "integer" + }, + "visitCount": { + "description": "访问总量(包含子渠道和渠道本身)", + "type": "integer" + } + } + }, + "proto.StatDataSimple": { + "type": "object", + "properties": { + "directCount": { + "description": "新增总量(包含子渠道和渠道本身)", + "type": "integer" + }, + "income": { + "description": "收益(自身+子渠道)", + "type": "integer" + }, + "recharge": { + "description": "充值金额(包含子渠道和渠道本身)", + "type": "integer" + }, + "visitCount": { + "description": "访问总量(包含子渠道和渠道本身)", + "type": "integer" + } + } + }, + "proto.TfInfo": { + "type": "object", + "properties": { + "BackUrl": { + "description": "企业签URL", + "type": "string" + }, + "appIcon": { + "description": "应用图标", + "type": "string" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "url": { + "description": "URL", + "type": "string" + } + } + }, + "proto.TgMsgType": { + "type": "integer", + "enum": [ + 0, + 1 + ], + "x-enum-comments": { + "TgMsgTypeBackendRechargeMonitor": "后台充值监控" + }, + "x-enum-varnames": [ + "TgMsgTypeNone", + "TgMsgTypeBackendRechargeMonitor" + ] + }, + "proto.UpdateActivityReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "background": { + "description": "背景图", + "type": "string" + }, + "banner": { + "description": "banner列表", + "type": "array", + "items": { + "$ref": "#/definitions/activitymod.BannerInfo" + } + }, + "desc": { + "description": "活动描述", + "type": "string" + }, + "enable": { + "description": "活动开关", + "type": "boolean" + }, + "endTime": { + "description": "活动结束时间", + "type": "string" + }, + "giftDesc": { + "description": "奖励说明", + "type": "string" + }, + "h5Domain": { + "description": "活动H5地址", + "type": "string" + }, + "id": { + "description": "唯一ID", + "type": "string" + }, + "name": { + "description": "活动名称", + "type": "string" + }, + "sortCode": { + "description": "排序号", + "type": "integer" + }, + "startTime": { + "description": "活动开始时间", + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "proto.UpdateAdminReq": { + "type": "object", + "required": [ + "account" + ], + "properties": { + "account": { + "description": "用户名", + "type": "string" + }, + "blocRole": { + "description": "角色", + "type": "integer" + }, + "merchantId": { + "description": "商人id", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + }, + "roleId": { + "description": "角色id", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "integer" + } + } + }, + "proto.UpdateAdsLocReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "id": { + "description": "id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.UpdateAdsReq": { + "type": "object", + "properties": { + "ambientColor": { + "description": "氛围色", + "type": "string" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "coverImg": { + "description": "封面", + "type": "string" + }, + "endTime": { + "description": "结束时间", + "type": "string" + }, + "id": { + "description": "广告id", + "type": "integer" + }, + "isActive": { + "description": "是否激活", + "type": "boolean" + }, + "jumpType": { + "description": "跳转方式 0:外部浏览器跳转 1:内部浏览器跳转 2:app内部跳转", + "allOf": [ + { + "$ref": "#/definitions/advertiseMod.JumpType" + } + ] + }, + "links": { + "description": "链接地址", + "type": "array", + "items": { + "$ref": "#/definitions/proto.LinkInfo" + } + }, + "locId": { + "description": "位置", + "type": "integer" + }, + "remark": { + "type": "string" + }, + "sort": { + "description": "排序值--优先级", + "type": "integer" + }, + "startTime": { + "description": "开始时间s", + "type": "string" + }, + "tags": { + "description": "广告标签", + "type": "string" + }, + "title": { + "description": "广告标题", + "type": "string" + }, + "visibleChannels": { + "description": "可见的渠道,可输入多个渠道,用英文逗号\",\"分隔开", + "type": "string" + } + } + }, + "proto.UpdateAnnounReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "active": { + "description": "是否激活", + "type": "boolean" + }, + "appId": { + "description": "应用id", + "type": "integer" + }, + "content": { + "description": "公告内容", + "type": "string" + }, + "cover": { + "description": "公告封面图", + "type": "string" + }, + "endTime": { + "description": "公告结束时间", + "type": "string" + }, + "href": { + "description": "公告跳转地址", + "type": "string" + }, + "id": { + "description": "公告id", + "type": "string" + }, + "startTime": { + "description": "公告开始时间", + "type": "string" + }, + "title": { + "description": "公告标题", + "type": "string" + }, + "type": { + "description": "公告类型 0,外部连接;1,直接安装app", + "type": "integer" + } + } + }, + "proto.UpdateAppInfoReq": { + "type": "object", + "required": [ + "appId" + ], + "properties": { + "advertiseNewNum": { + "description": "广告新增系数", + "type": "integer" + }, + "advertiseNum": { + "description": "广告系数", + "type": "integer" + }, + "appId": { + "description": "appId,唯一id", + "type": "integer" + }, + "iconImg": { + "description": "应用图标", + "type": "string" + }, + "landPages": { + "description": "落地页列表", + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "description": "app名称", + "type": "string" + } + } + }, + "proto.UpdateAppLocReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "appId": { + "description": "应用id", + "type": "integer" + }, + "id": { + "description": "id", + "type": "integer" + }, + "imgSizeDesc": { + "description": "图片尺寸描述", + "type": "string" + }, + "locId": { + "description": "位置id", + "type": "integer" + }, + "name": { + "description": "位置名称", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.UpdateDomainInfoReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string" + }, + "update": { + "$ref": "#/definitions/domainmod.DomainDoc" + } + } + }, + "proto.UpdateGiftReq": { + "type": "object", + "required": [ + "actId", + "id" + ], + "properties": { + "actId": { + "description": "所属活动的ID", + "type": "string" + }, + "actName": { + "description": "所属活动的名称", + "type": "string" + }, + "giftDesc": { + "description": "奖品描述", + "type": "string" + }, + "giftName": { + "description": "奖品名称", + "type": "string" + }, + "id": { + "description": "奖品唯一ID", + "type": "string" + }, + "rate": { + "description": "中奖率", + "type": "integer" + }, + "sort": { + "description": "排序", + "type": "integer" + }, + "updatedAt": { + "type": "string" + } + } + }, + "proto.UpdateLandingPageReq": { + "type": "object", + "required": [ + "id", + "type" + ], + "properties": { + "channelCode": { + "description": "渠道码", + "type": "string" + }, + "id": { + "description": "Id", + "type": "integer" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "status": { + "description": "状态 默认true", + "type": "boolean" + }, + "type": { + "description": "类型 1:渠道 2:分享", + "type": "integer" + }, + "url": { + "description": "Url", + "type": "string" + } + } + }, + "proto.UpdateLotteryCodeReq": { + "type": "object", + "required": [ + "lotteryCodeId" + ], + "properties": { + "lotteryCodeId": { + "description": "抽奖码Id", + "type": "string" + }, + "mark": { + "description": "备注", + "type": "string" + } + } + }, + "proto.UpdateRoleReq": { + "type": "object", + "required": [ + "roleId" + ], + "properties": { + "authJson": { + "description": "权限json数据", + "type": "string" + }, + "role": { + "description": "角色", + "type": "string" + }, + "roleId": { + "description": "id", + "type": "integer" + } + } + }, + "proto.UserInfoSearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "appId": { + "description": "渠道对应的appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "id": { + "description": "用户ID", + "type": "integer" + }, + "ip": { + "description": "IP", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "proto.VersionAddReq": { + "type": "object", + "required": [ + "appId", + "link", + "packageType", + "terminal", + "versionNum" + ], + "properties": { + "appId": { + "description": "APPID", + "type": "integer" + }, + "backLink": { + "description": "企业签", + "type": "string" + }, + "info": { + "description": "版本描述", + "type": "string" + }, + "isForceUpdate": { + "description": "是否强更", + "type": "boolean" + }, + "link": { + "description": "下载链接", + "type": "array", + "items": { + "type": "string" + } + }, + "md5": { + "description": "MD5验证", + "type": "string" + }, + "minVersion": { + "description": "最小版本", + "type": "string" + }, + "packageType": { + "description": "包类型:1-企业包、2-商店包、3-tf包(下拉框)", + "allOf": [ + { + "$ref": "#/definitions/versionMod.PkgType" + } + ] + }, + "size": { + "description": "更新版本大小M", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "terminal": { + "description": "终端 ios android(安卓,苹果下拉框选择)", + "type": "string" + }, + "versionNum": { + "description": "版本号", + "type": "string" + } + } + }, + "proto.VersionDelReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "description": "版本ID", + "type": "integer" + } + } + }, + "proto.VersionInfo": { + "type": "object", + "properties": { + "appId": { + "description": "APPID", + "type": "integer" + }, + "appname": { + "description": "APP名称", + "type": "string" + }, + "backLink": { + "description": "企业签(备用连接)", + "type": "string" + }, + "id": { + "description": "ID", + "type": "integer" + }, + "info": { + "description": "版本描述", + "type": "string" + }, + "isForceUpdate": { + "description": "是否强更", + "type": "boolean" + }, + "link": { + "description": "下载链接", + "type": "array", + "items": { + "type": "string" + } + }, + "md5": { + "description": "MD5验证", + "type": "string" + }, + "minVersion": { + "description": "最小版本", + "type": "string" + }, + "packageType": { + "description": "包类型:1-企业包、2-商店包、3-tf、4-超级签", + "allOf": [ + { + "$ref": "#/definitions/versionMod.PkgType" + } + ] + }, + "size": { + "description": "更新版本大小M", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "terminal": { + "description": "终端ios android", + "type": "string" + }, + "versionNum": { + "description": "版本号", + "type": "string" + } + } + }, + "proto.VersionListResp": { + "type": "object", + "properties": { + "count": { + "description": "总条数", + "type": "integer" + }, + "data": { + "description": "数据", + "type": "array", + "items": { + "$ref": "#/definitions/proto.VersionInfo" + } + } + } + }, + "proto.VersionUpdateReq": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "appId": { + "description": "APPID", + "type": "integer" + }, + "backLink": { + "description": "企业签", + "type": "string" + }, + "id": { + "description": "ID", + "type": "integer" + }, + "info": { + "description": "版本描述", + "type": "string" + }, + "isForceUpdate": { + "description": "是否强更", + "type": "boolean" + }, + "link": { + "description": "下载链接", + "type": "array", + "items": { + "type": "string" + } + }, + "md5": { + "description": "MD5验证", + "type": "string" + }, + "minVersion": { + "description": "最小版本", + "type": "string" + }, + "packageType": { + "description": "包类型:1-企业包、2-商店包、3-tf", + "allOf": [ + { + "$ref": "#/definitions/versionMod.PkgType" + } + ] + }, + "size": { + "description": "更新版本大小M", + "type": "string" + }, + "status": { + "description": "是否启用", + "type": "boolean" + }, + "terminal": { + "description": "终端ios android", + "type": "string" + }, + "versionNum": { + "description": "版本号", + "type": "string" + } + } + }, + "proxy.BaseInfo": { + "type": "object", + "properties": { + "actors": { + "description": "演员", + "type": "array", + "items": { + "type": "string" + } + }, + "addedTime": { + "description": "上架时间", + "type": "string" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "checkSum": { + "description": "md5校验码", + "type": "string" + }, + "country": { + "description": "国家 (国产、日本、欧美.... 前端固定)", + "type": "string" + }, + "coverImg": { + "description": "封面", + "type": "array", + "items": { + "type": "string" + } + }, + "desc": { + "description": "详细描述", + "type": "string" + }, + "director": { + "description": "导演", + "type": "array", + "items": { + "type": "string" + } + }, + "filename": { + "description": "文件名称", + "type": "string" + }, + "firstTag": { + "description": "一级标签", + "type": "string" + }, + "id": { + "type": "string" + }, + "preFileName": { + "description": "预览文件", + "type": "string" + }, + "preview": { + "description": "预览普通视频:1:预览 2:", + "type": "integer" + }, + "publish": { + "description": "视频发布者", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "secondTags": { + "description": "二级标签标签", + "type": "array", + "items": { + "type": "string" + } + }, + "size": { + "description": "文件size,单位byte", + "type": "integer" + }, + "status": { + "description": "当前状态", + "type": "string" + }, + "studio": { + "description": "工作室", + "type": "string" + }, + "title": { + "description": "标题", + "type": "string" + }, + "type": { + "description": "视频:长视频/短视频--时间阈值", + "type": "string" + }, + "uploadTime": { + "description": "上传时间", + "type": "string" + }, + "via": { + "description": "来源", + "type": "string" + }, + "videTime": { + "description": "影片时长", + "type": "integer" + } + } + }, + "proxy.MediaSearchReq": { + "type": "object", + "properties": { + "pageNum": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "param": { + "$ref": "#/definitions/proxy.VideoSearch" + } + } + }, + "proxy.MediaSearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/proxy.BaseInfo" + } + }, + "total": { + "type": "integer" + } + } + }, + "proxy.MediasDelReq": { + "type": "object", + "properties": { + "id": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "proxy.MediasDelResp": { + "type": "object" + }, + "proxy.MediasUpdateReq": { + "type": "object", + "properties": { + "actors": { + "description": "演员", + "type": "array", + "items": { + "type": "string" + } + }, + "addedTime": { + "description": "上架时间", + "type": "string" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "country": { + "description": "国家 (国产、日本、欧美.... 前端固定)", + "type": "string" + }, + "coverImg": { + "description": "封面", + "type": "array", + "items": { + "type": "string" + } + }, + "desc": { + "description": "详细描述", + "type": "string" + }, + "director": { + "description": "导演", + "type": "array", + "items": { + "type": "string" + } + }, + "firstTag": { + "description": "一级标签", + "type": "string" + }, + "id": { + "type": "string" + }, + "preFileName": { + "description": "预览文件", + "type": "string" + }, + "preview": { + "description": "预览:1:预览 2:普通视频", + "type": "integer" + }, + "publish": { + "description": "视频发布者", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "secondTags": { + "description": "二级标签标签", + "type": "array", + "items": { + "type": "string" + } + }, + "status": { + "description": "当前状态", + "type": "string" + }, + "studio": { + "description": "工作室", + "type": "string" + }, + "title": { + "description": "标题", + "type": "string" + }, + "type": { + "description": "视频:长视频/短视频--时间阈值", + "type": "string" + }, + "uploadTime": { + "description": "上传时间", + "type": "string" + }, + "via": { + "description": "来源", + "type": "string" + } + } + }, + "proxy.MediasUpdateResp": { + "type": "object" + }, + "proxy.UploadVideoBodyResp": { + "type": "object", + "properties": { + "id": { + "description": "文件服返回的上传文件Id", + "type": "string" + }, + "videoUri": { + "description": "文件服返回的视频uri", + "type": "string" + } + } + }, + "proxy.VideoSearch": { + "type": "object", + "properties": { + "actors": { + "description": "演员", + "type": "array", + "items": { + "type": "string" + } + }, + "addedTime": { + "description": "上架时间", + "type": "string" + }, + "bango": { + "description": "番号,唯一", + "type": "string" + }, + "country": { + "description": "国家 (国产、日本、欧美.... 前端固定)", + "type": "string" + }, + "director": { + "description": "导演", + "type": "array", + "items": { + "type": "string" + } + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "firstTag": { + "description": "一级标签", + "type": "string" + }, + "id": { + "type": "string" + }, + "preview": { + "description": "预览:1:预览 2:普通视频", + "type": "integer" + }, + "publish": { + "description": "视频发布者", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "secondTags": { + "description": "二级标签标签", + "type": "array", + "items": { + "type": "string" + } + }, + "start": { + "description": "开始时间", + "type": "string" + }, + "status": { + "description": "当前状态", + "type": "string" + }, + "studio": { + "description": "工作室", + "type": "string" + }, + "title": { + "description": "标题", + "type": "string" + }, + "type": { + "description": "视频:长视频/短视频--时间阈值", + "type": "string" + }, + "uploadTime": { + "description": "上传时间", + "type": "string" + }, + "via": { + "description": "来源", + "type": "string" + } + } + }, + "registermod.RegisterMod": { + "type": "object", + "properties": { + "appId": { + "description": "appID", + "type": "integer" + }, + "blocDeduction": { + "description": "集团扣量(特定渠道扣量)", + "type": "boolean" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "dc": { + "description": "渠道码", + "type": "string" + }, + "devType": { + "description": "设备类型", + "type": "string" + }, + "districtCode": { + "description": "渠道码", + "type": "string" + }, + "formalTime": { + "description": "成为正式用户的时间(针对h5和light)", + "type": "string" + }, + "ip": { + "description": "IP", + "type": "string" + }, + "isDeduction": { + "description": "true:CPA扣量用户", + "type": "boolean" + }, + "isDirect": { + "description": "true:是直推用户", + "type": "boolean" + }, + "isFormal": { + "description": "是否正式用户(针对h5和light)", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "name": { + "description": "名称", + "type": "string" + }, + "parentPromCode": { + "description": "邀请人推广码", + "type": "string" + }, + "promCode": { + "description": "用户推广序列", + "type": "string" + }, + "registerTime": { + "description": "操作时间", + "type": "string" + }, + "sysType": { + "description": "操作系统类型 安卓 IOS", + "type": "string" + }, + "userId": { + "description": "用户ID", + "type": "integer" + } + } + }, + "srv_appcategory.AppCategoryDelReq": { + "type": "object", + "properties": { + "id": { + "type": "integer" + } + } + }, + "srv_appcategory.AppCategorySearch": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "parentAppId": { + "type": "integer" + } + } + }, + "srv_appcategory.AppCategorySearchResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/appcategory.AppCategory" + } + }, + "total": { + "type": "integer" + } + } + }, + "srv_appcategory.AppCategoryUpdate": { + "type": "object", + "properties": { + "desc": { + "description": "描述", + "type": "string" + }, + "imgType": { + "description": "图片展示类型 0:应用图标 1.小图标 2.大图标", + "type": "integer" + }, + "name": { + "description": "名称", + "type": "string" + }, + "parentAppId": { + "type": "integer" + }, + "rank": { + "description": "应用排序", + "type": "integer" + }, + "status": { + "description": "状态", + "type": "boolean" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "srv_appcategory.AppCategoryUpdateReq": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "param": { + "description": "参数", + "allOf": [ + { + "$ref": "#/definitions/srv_appcategory.AppCategoryUpdate" + } + ] + } + } + }, + "srv_applicationstat.AppStatInfo": { + "type": "object", + "properties": { + "appName": { + "description": "应用名称", + "type": "string" + }, + "applicationDbId": { + "description": "应用ID", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "hourData": { + "description": "小时数据", + "type": "array", + "items": { + "type": "integer" + } + }, + "id": { + "type": "string" + }, + "parentAppId": { + "description": "所属应用ID", + "type": "integer" + }, + "sumDate": { + "description": "记录时间", + "type": "string" + }, + "total": { + "description": "当日点击", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "srv_applicationstat.AppStatSummary": { + "type": "object", + "properties": { + "totalClick": { + "description": "总点击", + "type": "integer" + } + } + }, + "srv_applicationstat.AppStatTotalInfo": { + "type": "object", + "properties": { + "appName": { + "description": "应用名称", + "type": "string" + }, + "id": { + "description": "应用ID", + "type": "string" + }, + "parentAppId": { + "description": "所属应用ID", + "type": "integer" + }, + "total": { + "description": "总次数", + "type": "integer" + } + } + }, + "srv_applicationstat.GetApplicationStatReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "applicationId": { + "description": "应用ID", + "type": "string" + }, + "applicationName": { + "description": "应用名称", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "parentAppId": { + "description": "所属应用ID", + "type": "array", + "items": { + "type": "integer" + } + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "srv_applicationstat.GetApplicationStatResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/srv_applicationstat.AppStatInfo" + } + }, + "summary": { + "$ref": "#/definitions/srv_applicationstat.AppStatSummary" + }, + "total": { + "type": "integer" + } + } + }, + "srv_applicationstat.GetApplicationStatTotalReq": { + "type": "object", + "required": [ + "pageNum", + "pageSize" + ], + "properties": { + "applicationId": { + "description": "应用ID", + "type": "string" + }, + "applicationName": { + "description": "应用名称", + "type": "string" + }, + "end": { + "description": "结束时间", + "type": "string" + }, + "pageNum": { + "description": "页数", + "type": "integer" + }, + "pageSize": { + "description": "条数", + "type": "integer" + }, + "parentAppId": { + "description": "所属应用ID", + "type": "array", + "items": { + "type": "integer" + } + }, + "start": { + "description": "开始时间", + "type": "string" + } + } + }, + "srv_applicationstat.GetApplicationStatTotalResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/srv_applicationstat.AppStatTotalInfo" + } + }, + "summary": { + "$ref": "#/definitions/srv_applicationstat.AppStatSummary" + }, + "total": { + "type": "integer" + } + } + }, + "stat_models_channelmod.AppType": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3 + ], + "x-enum-comments": { + "AppTypeH5": "H5网页", + "AppTypeLight": "轻量版", + "AppTypeNone": "所有", + "AppTypePkg": "安装包" + }, + "x-enum-varnames": [ + "AppTypeNone", + "AppTypePkg", + "AppTypeLight", + "AppTypeH5" + ] + }, + "stat_models_channelmod.ChannelDeductionRule": { + "type": "object", + "properties": { + "appId": { + "description": "应用ID", + "type": "integer" + }, + "appName": { + "description": "应用名称", + "type": "string" + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "autoDeduction": { + "description": "自动扣量开关", + "type": "boolean" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsBegin": { + "description": "CPS 开始扣量金额", + "type": "integer" + }, + "cpsDeductionRate": { + "description": "CPS 扣量比例", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "deductionAt": { + "description": "扣量开始时间", + "type": "string" + }, + "divideRate": { + "description": "代理分成比例", + "type": "integer" + }, + "fifth": { + "description": "5阶", + "type": "integer" + }, + "first": { + "description": "一阶", + "type": "integer" + }, + "fourth": { + "description": "四阶", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "landingPage": { + "description": "落地页", + "type": "string" + }, + "lessIncomeRate": { + "description": "最低收益比 CPA低于该值开启扣量(0.1 - 3.0)", + "type": "number" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "proxyDeduction": { + "description": "代理扣量比例", + "type": "integer" + }, + "second": { + "description": "二阶", + "type": "integer" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "settlementTime": { + "description": "扣量结算时间", + "type": "string" + }, + "third": { + "description": "三阶", + "type": "integer" + }, + "todayDeduction": { + "description": "当日扣量金额", + "type": "integer" + }, + "todayTime": { + "description": "当日时间", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "stat_models_channelmod.ChannelInfo": { + "type": "object", + "properties": { + "appIds": { + "description": "渠道对应的app", + "type": "array", + "items": { + "type": "integer" + } + }, + "autoGenApk": { + "description": "自动生成渠道包", + "type": "boolean" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "checkTokenTime": { + "description": "检查Token的时间", + "type": "string" + }, + "childCount": { + "description": "子渠道数量", + "type": "integer" + }, + "childShowDivideRate": { + "description": "下级是否显示分成比例", + "type": "boolean" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "ip": { + "description": "ip", + "type": "string" + }, + "lock": { + "description": "禁止登陆", + "type": "boolean" + }, + "mobile": { + "description": "手机号", + "type": "string" + }, + "parentAgent": { + "description": "父代理 (从二级的子代理开始用ParentAgent描述父子关系)", + "type": "string" + }, + "parentChannel": { + "description": "父渠道 如果为空字符串,则为渠道,否则为代理", + "type": "string" + }, + "password": { + "description": "代理商密码", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "showMagic": { + "description": "正常显示数据 n\u003e0 展示空白数据", + "type": "integer" + }, + "status": { + "description": "状态 开/关", + "type": "boolean" + }, + "token": { + "description": "token", + "type": "string" + }, + "type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "wallet": { + "description": "钱包地址", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.Wallet" + } + ] + } + } + }, + "stat_models_channelmod.ChannelOwnerChange": { + "type": "object", + "properties": { + "channel": { + "description": "渠道", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "ID", + "type": "string" + }, + "mark": { + "description": "备注", + "type": "string" + }, + "newUser": { + "description": "变更后的所有者", + "type": "string" + }, + "oldUser": { + "description": "变更前的所有者", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "stat_models_channelmod.ChannelSettlement": { + "type": "object", + "properties": { + "androidAmount": { + "description": "+安卓充值金额", + "type": "integer" + }, + "androidAmountCount": { + "description": "+安卓充值次数", + "type": "integer" + }, + "androidVisitCount": { + "description": "android访问", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "deductionAmount": { + "description": "充值扣量", + "type": "integer" + }, + "deductionAmountCount": { + "description": "充值扣量次数", + "type": "integer" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directAmountCount": { + "description": "直推充值订单数", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionAmountCount": { + "description": "裂变充值订单数", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "h5Amount": { + "description": "+H5充值金额", + "type": "integer" + }, + "h5AmountCount": { + "description": "+H5充值次数", + "type": "integer" + }, + "h5AndroidVisitCount": { + "description": "h5安卓访问", + "type": "integer" + }, + "h5IosVisitCount": { + "description": "h5苹果访问", + "type": "integer" + }, + "h5PcVisitCount": { + "description": "h5电脑访问", + "type": "integer" + }, + "h5VisitCount": { + "description": "h5访问", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "iosAmount": { + "description": "+Ios充值金额", + "type": "integer" + }, + "iosAmountCount": { + "description": "+Ios充值次数", + "type": "integer" + }, + "iosVisitCount": { + "description": "ios访问", + "type": "integer" + }, + "landPageVisitCount": { + "description": "落地页访问", + "type": "integer" + }, + "landpageAndroidClick": { + "description": "落地页android访问次数", + "type": "integer" + }, + "landpageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landpageIosAthorClick": { + "description": "落地页iOS其他包访问次数", + "type": "integer" + }, + "landpageIosH5Click": { + "description": "落地页H5访问次数", + "type": "integer" + }, + "lightAmount": { + "description": "light充值金额", + "type": "integer" + }, + "lightAmountCount": { + "description": "light充值次数", + "type": "integer" + }, + "lightDeductionAmount": { + "description": "light充值金额扣量", + "type": "integer" + }, + "lightDeductionAmountCount": { + "description": "light充值次数扣量", + "type": "integer" + }, + "lightDirectAmount": { + "description": "light充值金额直推", + "type": "integer" + }, + "lightDirectAmountCount": { + "description": "light充值次数直推", + "type": "integer" + }, + "lightFissionAmount": { + "description": "light充值金额裂变", + "type": "integer" + }, + "lightFissionAmountCount": { + "description": "light充值次数裂变", + "type": "integer" + }, + "lightNaturalAmount": { + "description": "light充值金额自然", + "type": "integer" + }, + "lightNaturalAmountCount": { + "description": "light充值次数自然", + "type": "integer" + }, + "lightVisitCount": { + "description": "**轻量访问", + "type": "integer" + }, + "lightVisitDeductionCount": { + "description": "light访问量扣量", + "type": "integer" + }, + "lightVisitDirectCount": { + "description": "light访问量直推", + "type": "integer" + }, + "lightVisitFissionCount": { + "description": "light访问量裂变", + "type": "integer" + }, + "lightVisitNaturalCount": { + "description": "light访问量自然", + "type": "integer" + }, + "naturalAmount": { + "description": "自然充值", + "type": "integer" + }, + "naturalAmountCount": { + "description": "自然充值订单数", + "type": "integer" + }, + "newAndroidCount": { + "description": "android新增", + "type": "integer" + }, + "newAndroidDeductionCount": { + "description": "新增安卓扣量", + "type": "integer" + }, + "newAndroidDirectCount": { + "description": "新增安卓直推", + "type": "integer" + }, + "newAndroidFissionCount": { + "description": "新增安卓裂变", + "type": "integer" + }, + "newDeductionCount": { + "description": "新增扣量", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newH5AndroidCount": { + "description": "h5安卓新增", + "type": "integer" + }, + "newH5Count": { + "description": "h5新增安装", + "type": "integer" + }, + "newH5DeductionCount": { + "description": "新增H5扣量", + "type": "integer" + }, + "newH5DirectCount": { + "description": "新增H5直推", + "type": "integer" + }, + "newH5FissionCount": { + "description": "新增H5裂变", + "type": "integer" + }, + "newH5FormalCount": { + "description": "h5注册新增", + "type": "integer" + }, + "newH5FormalDeductionCount": { + "description": "新增H5正式扣量", + "type": "integer" + }, + "newH5FormalDirectCount": { + "description": "新增H5正式直推", + "type": "integer" + }, + "newH5FormalFissionCount": { + "description": "新增H5正式裂变", + "type": "integer" + }, + "newH5IosCount": { + "description": "h5苹果新增", + "type": "integer" + }, + "newH5PcCount": { + "description": "h5电脑新增", + "type": "integer" + }, + "newIosCount": { + "description": "ios新增", + "type": "integer" + }, + "newIosDeductionCount": { + "description": "新增IOS扣量", + "type": "integer" + }, + "newIosDirectCount": { + "description": "新增IOS直推", + "type": "integer" + }, + "newIosFissionCount": { + "description": "新增IOS裂变", + "type": "integer" + }, + "newLightCount": { + "description": "light新增", + "type": "integer" + }, + "newLightDeductionCount": { + "description": "light新增扣量", + "type": "integer" + }, + "newLightDirectCount": { + "description": "light新增直推", + "type": "integer" + }, + "newLightFissionCount": { + "description": "light新增裂变", + "type": "integer" + }, + "newLightFormalCount": { + "description": "**轻量注册", + "type": "integer" + }, + "newLightFormalDeductionCount": { + "description": "新增LightFormal扣量", + "type": "integer" + }, + "newLightFormalDirectCount": { + "description": "新增LightFormal直推", + "type": "integer" + }, + "newLightFormalFissionCount": { + "description": "新增LightFormal裂变", + "type": "integer" + }, + "newLightGuestCount": { + "description": "**轻量安装", + "type": "integer" + }, + "newLightGuestDeductionCount": { + "description": "新增LightGuest扣量", + "type": "integer" + }, + "newLightGuestDirectCount": { + "description": "新增LightGuest直推", + "type": "integer" + }, + "newLightGuestFissionCount": { + "description": "新增LightGuest裂变", + "type": "integer" + }, + "newLightNaturalCount": { + "description": "light自然新增", + "type": "integer" + }, + "newRechargeAmount": { + "description": "其他充值统计", + "type": "integer" + }, + "newTotalCount": { + "description": "新增总量", + "type": "integer" + }, + "newTotalIpCount": { + "description": "注册用户", + "type": "integer" + }, + "parentChannel": { + "description": "父渠道 如果为空字符串,则为渠道,否则为代理", + "type": "string" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "sumDate": { + "description": "记录时间 15分钟对齐", + "type": "string" + }, + "totalAmount": { + "description": "充值统计", + "type": "integer" + }, + "totalVisitCount": { + "description": "访问统计", + "type": "integer" + }, + "type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "updatedAt": { + "description": "时间", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "validDeductionCount": { + "description": "有效扣量总数", + "type": "integer" + }, + "validDirectCount": { + "description": "有效直推总数", + "type": "integer" + }, + "validPayCoin": { + "description": "有效收益金币金额", + "type": "integer" + }, + "validPayMoney": { + "description": "有效收益会员金额", + "type": "integer" + }, + "vipPayCoin": { + "description": "金币购买会员数量", + "type": "integer" + }, + "vipPayDeduction": { + "description": "购买会员金额(CPS扣量)", + "type": "integer" + }, + "vipPayMoney": { + "description": "购买会员金额(CPS扣量后)", + "type": "integer" + } + } + }, + "stat_models_channelmod.ChannelStat": { + "type": "object", + "properties": { + "IncomeAmount": { + "description": "收益估算", + "type": "integer" + }, + "androidAmount": { + "description": "+安卓充值金额", + "type": "integer" + }, + "androidAmountCount": { + "description": "+安卓充值次数", + "type": "integer" + }, + "androidVisitCount": { + "description": "android访问", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "appType": { + "description": "应用类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.AppType" + } + ] + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "cpaPrice": { + "description": "单价", + "type": "integer" + }, + "cpsRate": { + "description": "CPS 分成比列 0-100", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "day1RetainRate": { + "description": "留存率", + "type": "number" + }, + "day3RetainRate": { + "description": "3日留存率", + "type": "number" + }, + "day7RetainRate": { + "description": "7日留存率", + "type": "number" + }, + "deductionAmount": { + "description": "充值扣量", + "type": "integer" + }, + "deductionAmountCount": { + "description": "充值扣量次数", + "type": "integer" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "directAmountCount": { + "description": "直推充值订单数", + "type": "integer" + }, + "directVisitCount": { + "description": "直推访问数", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "fissionAmountCount": { + "description": "裂变充值订单数", + "type": "integer" + }, + "fissionVisitCount": { + "description": "裂变访问数", + "type": "integer" + }, + "gameRechageAmount": { + "description": "游戏充值", + "type": "integer" + }, + "gameWithdrawAmount": { + "description": "游戏提现", + "type": "integer" + }, + "h5Amount": { + "description": "+H5充值金额", + "type": "integer" + }, + "h5AmountCount": { + "description": "+H5充值次数", + "type": "integer" + }, + "h5AndroidVisitCount": { + "description": "h5安卓访问", + "type": "integer" + }, + "h5IosVisitCount": { + "description": "h5苹果访问", + "type": "integer" + }, + "h5PcVisitCount": { + "description": "h5电脑访问", + "type": "integer" + }, + "h5VisitCount": { + "description": "h5访问", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "incomeRate": { + "description": "收益比", + "type": "number" + }, + "iosAmount": { + "description": "+Ios充值金额", + "type": "integer" + }, + "iosAmountCount": { + "description": "+Ios充值次数", + "type": "integer" + }, + "iosVisitCount": { + "description": "ios访问", + "type": "integer" + }, + "isPay": { + "description": "是否已结算", + "type": "boolean" + }, + "landPageVisitCount": { + "description": "落地页访问", + "type": "integer" + }, + "landpageAndroidClick": { + "description": "落地页android访问次数", + "type": "integer" + }, + "landpageIosAppstoreClick": { + "description": "落地页iOS商店包访问次数", + "type": "integer" + }, + "landpageIosAthorClick": { + "description": "落地页iOS其他包访问次数", + "type": "integer" + }, + "landpageIosH5Click": { + "description": "落地页H5访问次数", + "type": "integer" + }, + "lightAmount": { + "description": "light充值金额", + "type": "integer" + }, + "lightAmountCount": { + "description": "light充值次数", + "type": "integer" + }, + "lightDeductionAmount": { + "description": "light充值金额扣量", + "type": "integer" + }, + "lightDeductionAmountCount": { + "description": "light充值次数扣量", + "type": "integer" + }, + "lightDirectAmount": { + "description": "light充值金额直推", + "type": "integer" + }, + "lightDirectAmountCount": { + "description": "light充值次数直推", + "type": "integer" + }, + "lightFissionAmount": { + "description": "light充值金额裂变", + "type": "integer" + }, + "lightFissionAmountCount": { + "description": "light充值次数裂变", + "type": "integer" + }, + "lightNaturalAmount": { + "description": "light充值金额自然", + "type": "integer" + }, + "lightNaturalAmountCount": { + "description": "light充值次数自然", + "type": "integer" + }, + "lightVisitCount": { + "description": "**轻量访问", + "type": "integer" + }, + "lightVisitDeductionCount": { + "description": "light访问量扣量", + "type": "integer" + }, + "lightVisitDirectCount": { + "description": "light访问量直推", + "type": "integer" + }, + "lightVisitFissionCount": { + "description": "light访问量裂变", + "type": "integer" + }, + "lightVisitNaturalCount": { + "description": "light访问量自然", + "type": "integer" + }, + "naturalAmount": { + "description": "自然充值", + "type": "integer" + }, + "naturalAmountCount": { + "description": "自然充值订单数", + "type": "integer" + }, + "newAndroidCount": { + "description": "android新增", + "type": "integer" + }, + "newAndroidDeductionCount": { + "description": "新增安卓扣量", + "type": "integer" + }, + "newAndroidDirectCount": { + "description": "新增安卓直推", + "type": "integer" + }, + "newAndroidFissionCount": { + "description": "新增安卓裂变", + "type": "integer" + }, + "newDeductionCount": { + "description": "新增扣量", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newH5AndroidCount": { + "description": "h5安卓新增", + "type": "integer" + }, + "newH5Count": { + "description": "h5新增", + "type": "integer" + }, + "newH5DeductionCount": { + "description": "新增H5扣量", + "type": "integer" + }, + "newH5DirectCount": { + "description": "新增H5直推", + "type": "integer" + }, + "newH5FissionCount": { + "description": "新增H5裂变", + "type": "integer" + }, + "newH5FormalCount": { + "description": "h5注册新增", + "type": "integer" + }, + "newH5FormalDeductionCount": { + "description": "新增H5正式扣量", + "type": "integer" + }, + "newH5FormalDirectCount": { + "description": "新增H5正式直推", + "type": "integer" + }, + "newH5FormalFissionCount": { + "description": "新增H5正式裂变", + "type": "integer" + }, + "newH5IosCount": { + "description": "h5苹果新增", + "type": "integer" + }, + "newH5PcCount": { + "description": "h5电脑新增", + "type": "integer" + }, + "newIosCount": { + "description": "ios新增", + "type": "integer" + }, + "newIosDeductionCount": { + "description": "新增IOS扣量", + "type": "integer" + }, + "newIosDirectCount": { + "description": "新增IOS直推", + "type": "integer" + }, + "newIosFissionCount": { + "description": "新增IOS裂变", + "type": "integer" + }, + "newLightCount": { + "description": "light新增", + "type": "integer" + }, + "newLightDeductionCount": { + "description": "light新增扣量", + "type": "integer" + }, + "newLightDirectCount": { + "description": "light新增直推", + "type": "integer" + }, + "newLightFissionCount": { + "description": "light新增裂变", + "type": "integer" + }, + "newLightFormalCount": { + "description": "**轻量注册", + "type": "integer" + }, + "newLightFormalDeductionCount": { + "description": "新增LightFormal扣量", + "type": "integer" + }, + "newLightFormalDirectCount": { + "description": "新增LightFormal直推", + "type": "integer" + }, + "newLightFormalFissionCount": { + "description": "新增LightFormal裂变", + "type": "integer" + }, + "newLightGuestCount": { + "description": "**轻量安装", + "type": "integer" + }, + "newLightGuestDeductionCount": { + "description": "新增LightGuest扣量", + "type": "integer" + }, + "newLightGuestDirectCount": { + "description": "新增LightGuest直推", + "type": "integer" + }, + "newLightGuestFissionCount": { + "description": "新增LightGuest裂变", + "type": "integer" + }, + "newLightNaturalCount": { + "description": "light自然新增", + "type": "integer" + }, + "newRechargeAmount": { + "description": "其他充值", + "type": "integer" + }, + "newTotalCount": { + "description": "**新增总量", + "type": "integer" + }, + "newTotalIpCount": { + "description": "注册", + "type": "integer" + }, + "parentChannel": { + "description": "父渠道 如果为空字符串,则为渠道,否则为代理", + "type": "string" + }, + "promoteMode": { + "description": "推广类型", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.PromoteMode" + } + ] + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "sumDate": { + "description": "记录时间 15分钟对齐", + "type": "string" + }, + "totalAmount": { + "description": "充值统计", + "type": "integer" + }, + "totalVisitCount": { + "description": "访问", + "type": "integer" + }, + "type": { + "description": "渠道类型:1 一级 2:二级", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.ChannelType" + } + ] + }, + "updatedAt": { + "description": "时间", + "type": "string" + }, + "userName": { + "description": "所有者", + "type": "string" + }, + "validDeductionCount": { + "description": "有效扣量总数", + "type": "integer" + }, + "validDirectCount": { + "description": "收益及结算", + "type": "integer" + }, + "validPayCoin": { + "description": "有效收益金币金额", + "type": "integer" + }, + "validPayMoney": { + "description": "有效收益金额", + "type": "integer" + }, + "vipPayCoin": { + "description": "金币购买会员数量", + "type": "integer" + }, + "vipPayDeduction": { + "description": "购买会员金额(CPS扣量)", + "type": "integer" + }, + "vipPayMoney": { + "description": "购买会员金额(CPS扣量后)", + "type": "integer" + } + } + }, + "stat_models_channelmod.ChannelStatYesterday": { + "type": "object", + "properties": { + "androidRechargeAmount": { + "description": "android充值金额", + "type": "integer" + }, + "appId": { + "description": "appId", + "type": "integer" + }, + "channel": { + "description": "渠道", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "directAmount": { + "description": "直推充值金额", + "type": "integer" + }, + "fissionAmount": { + "description": "裂变充值金额", + "type": "integer" + }, + "h5RechargeAmount": { + "description": "h5充值金额", + "type": "integer" + }, + "id": { + "description": "ID", + "type": "string" + }, + "iosRechargeAmount": { + "description": "ios充值金额", + "type": "integer" + }, + "lightRechargeAmount": { + "description": "**light充值金额", + "type": "integer" + }, + "newAndroidCount": { + "description": "android新增", + "type": "integer" + }, + "newCount": { + "description": "注册", + "type": "integer" + }, + "newDirectCount": { + "description": "新增直推", + "type": "integer" + }, + "newFissionCount": { + "description": "新增裂变", + "type": "integer" + }, + "newH5Count": { + "description": "h5新增(guest)", + "type": "integer" + }, + "newH5FormalCount": { + "description": "h5注册新增", + "type": "integer" + }, + "newIncreaseCount": { + "description": "新增增长", + "type": "integer" + }, + "newIncreaseRate": { + "description": "新增增长比例 对比昨天同时段", + "type": "string" + }, + "newIosCount": { + "description": "ios新增", + "type": "integer" + }, + "newLightFormalCount": { + "description": "轻量注册", + "type": "integer" + }, + "newLightGuestCount": { + "description": "轻量安装", + "type": "integer" + }, + "parentChannel": { + "description": "父渠道 如果为空字符串,则为渠道,否则为代理", + "type": "string" + }, + "rechargeAmount": { + "description": "充值", + "type": "integer" + }, + "rechargeIncreaseAmount": { + "description": "充值增长", + "type": "integer" + }, + "rechargeIncreaseRate": { + "description": "充值增长比例 对比昨天同时段", + "type": "string" + }, + "settlement": { + "description": "结算方式 cps/cpa/cpt/cpc", + "allOf": [ + { + "$ref": "#/definitions/stat_models_channelmod.SettlementWay" + } + ] + }, + "sumDate": { + "description": "记录时间 15分钟对齐", + "type": "string" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + }, + "vipPayCoin": { + "description": "其他充值", + "type": "integer" + }, + "vipPayDeduction": { + "description": "购买会员金额(CPS扣量)", + "type": "integer" + }, + "vipPayMoney": { + "description": "购买会员金额(CPS扣量后)", + "type": "integer" + } + } + }, + "stat_models_channelmod.ChannelType": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 10 + ], + "x-enum-comments": { + "ChannelTypeEnd": "End", + "ChannelTypeForth": "四级", + "ChannelTypeNone": "无", + "ChannelTypeParent": "一级", + "ChannelTypeSecond": "二级", + "ChannelTypeThird": "三级" + }, + "x-enum-varnames": [ + "ChannelTypeNone", + "ChannelTypeParent", + "ChannelTypeSecond", + "ChannelTypeThird", + "ChannelTypeForth", + "ChannelTypeEnd" + ] + }, + "stat_models_channelmod.PromoteMode": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "x-enum-comments": { + "PromoteModeInstall": "安装", + "PromoteModeNone": "所有", + "PromoteModeRegister": "注册" + }, + "x-enum-varnames": [ + "PromoteModeNone", + "PromoteModeInstall", + "PromoteModeRegister" + ] + }, + "stat_models_channelmod.SettlementWay": { + "type": "string", + "enum": [ + "cpa", + "cps", + "cpt", + "cpc", + "hz" + ], + "x-enum-comments": { + "SettlementHZ": "下载站" + }, + "x-enum-varnames": [ + "SettlementCPA", + "SettlementCPS", + "SettlementCPT", + "SettlementCPC", + "SettlementHZ" + ] + }, + "stat_models_channelmod.Wallet": { + "type": "object", + "properties": { + "addr1": { + "description": "钱包地址1", + "type": "string" + }, + "addr2": { + "description": "钱包地址2", + "type": "string" + } + } + }, + "statutils.DeviceName": { + "type": "string", + "enum": [ + "android", + "ios", + "pc", + "light", + "h5", + "h5_android", + "h5_ios", + "h5_pc" + ], + "x-enum-varnames": [ + "DeviceNameAndroid", + "DeviceNameIos", + "DeviceNamePc", + "DeviceNameLight", + "DeviceNameH5", + "DeviceNameH5Android", + "DeviceNameH5Ios", + "DeviceNameH5Pc" + ] + }, + "statutils.Direct": { + "type": "object", + "properties": { + "natural": { + "description": "Natural", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "total": { + "description": "Total", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + } + } + }, + "statutils.From": { + "type": "object", + "properties": { + "deduction": { + "description": "扣量", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "direct": { + "description": "---------------------分类2------------------------", + "allOf": [ + { + "$ref": "#/definitions/statutils.Direct" + } + ] + }, + "district": { + "description": "渠道", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "fission": { + "description": "裂变", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "normal": { + "description": "自来", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "share": { + "description": "分享", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "total": { + "description": "Total", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + }, + "web": { + "description": "---------------------分类1------------------------", + "allOf": [ + { + "$ref": "#/definitions/statutils.Value" + } + ] + } + } + }, + "statutils.Stat": { + "type": "object", + "properties": { + "android": { + "description": "Android", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "h5": { + "description": "H5", + "allOf": [ + { + "$ref": "#/definitions/statutils.StatH5" + } + ] + }, + "ios": { + "description": "IOS", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "light": { + "description": "Light", + "allOf": [ + { + "$ref": "#/definitions/statutils.StatLight" + } + ] + }, + "total": { + "description": "Total", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + } + } + }, + "statutils.StatH5": { + "type": "object", + "properties": { + "h5Android": { + "description": "Android", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "h5Formal": { + "description": "H5正式用户", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "h5Guest": { + "description": "分类2", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "h5Ios": { + "description": "H5IOS", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "h5Pc": { + "description": "分类1", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "total": { + "description": "总计", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + } + } + }, + "statutils.StatLight": { + "type": "object", + "properties": { + "formal": { + "description": "正式用户", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "guest": { + "description": "分类", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + }, + "total": { + "description": "总计", + "allOf": [ + { + "$ref": "#/definitions/statutils.From" + } + ] + } + } + }, + "statutils.Value": { + "type": "object", + "properties": { + "count": { + "description": "Count", + "type": "integer" + }, + "value": { + "description": "Value", + "type": "integer" + } + } + }, + "versionMod.PkgType": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5 + ], + "x-enum-comments": { + "Enterprise": "企业签", + "Light": "H5", + "Shop": "商店包", + "Super": "超级签", + "Tf": "testFight" + }, + "x-enum-varnames": [ + "_", + "Enterprise", + "Shop", + "Tf", + "Super", + "Light" + ] + } + }, + "securityDefinitions": { + "ApiKeyAuth": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + }, + "BasicAuth": { + "type": "basic" + }, + "OAuth2AccessCode": { + "type": "oauth2", + "flow": "accessCode", + "authorizationUrl": "https://example.com/oauth/authorize", + "tokenUrl": "https://example.com/oauth/token", + "scopes": { + "admin": "Grants read and write access to administrative information" + } + }, + "OAuth2Application": { + "type": "oauth2", + "flow": "application", + "tokenUrl": "https://example.com/oauth/token", + "scopes": { + "admin": "Grants read and write access to administrative information", + "write": "Grants write access" + } + }, + "OAuth2Implicit": { + "type": "oauth2", + "flow": "implicit", + "authorizationUrl": "https://example.com/oauth/authorize", + "scopes": { + "admin": "Grants read and write access to administrative information", + "write": "Grants write access" + } + }, + "OAuth2Password": { + "type": "oauth2", + "flow": "password", + "tokenUrl": "https://example.com/oauth/token", + "scopes": { + "admin": "Grants read and write access to administrative information", + "read": "Grants read access", + "write": "Grants write access" + } + } + } +} \ No newline at end of file diff --git a/docs/swagger.yaml b/docs/swagger.yaml new file mode 100644 index 0000000..2f6dbc4 --- /dev/null +++ b/docs/swagger.yaml @@ -0,0 +1,14207 @@ +basePath: /api/stat +definitions: + activitymod.BannerInfo: + properties: + bannerImg: + description: banner图片 + type: string + bannerUrl: + description: banner跳转地址 + type: string + type: object + activitymod.LottertyCodeInfo: + properties: + actId: + description: 所属活动的ID + type: string + actName: + description: 活动名称 + type: string + createdAt: + type: string + giftCode: + description: 奖品兑换码 + type: string + id: + description: 唯一ID + type: string + isUsed: + description: 抽奖码是否已使用 + type: boolean + lotteryAt: + description: 抽奖时间 + type: string + lotteryCode: + description: 抽奖码 + type: string + remark: + description: 备注 + type: string + updatedAt: + type: string + userIp: + description: 抽奖者IP + type: string + type: object + activitymod.LotteryGetGift: + properties: + actId: + description: 所属活动的ID + type: string + actName: + description: 所属活动的名称 + type: string + appName: + description: 所属app的名字 + type: string + createdAt: + type: string + getGiftAt: + description: 兑换奖品的时间 + type: string + giftCode: + description: 奖品兑换码 + type: string + giftId: + description: 所属活动奖品的ID + type: string + giftName: + description: 奖品名称 + type: string + id: + description: 唯一ID + type: string + isGaveOut: + description: 兑换码是否已发放 + type: boolean + isUsed: + description: 奖品兑换码是否已使用 + type: boolean + lotteryCode: + description: 抽奖码 + type: string + remark: + description: 备注 + type: string + updatedAt: + type: string + userId: + description: 兑换者Id + type: string + type: object + advertiseMod.JumpType: + enum: + - 0 + - 1 + - 2 + type: integer + x-enum-comments: + JumpTypeInsideApp: 2:app内部跳转 + JumpTypeInsideBrowser: 1:内部浏览器跳转 + JumpTypeOutsideBrowser: 0:外部浏览器跳转 + x-enum-varnames: + - JumpTypeOutsideBrowser + - JumpTypeInsideBrowser + - JumpTypeInsideApp + advertiseSer.AdvertiseStatInfo: + properties: + adsId: + description: 广告ID + type: integer + adsName: + description: 广告名称 + type: string + appId: + description: 应用ID + type: integer + appName: + description: 应用名称 + type: string + createdAt: + description: 创建时间 + type: string + hourData: + description: 小时数据 + items: + type: integer + type: array + id: + type: string + locId: + description: 位置ID + type: integer + locName: + description: 位置名称 + type: string + sumDate: + description: 记录时间 + type: string + total: + description: 当日点击 + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + advertiseSer.AdvertiseStatSummary: + properties: + totalClick: + description: 总点击 + type: integer + type: object + advertiseSer.AdvertiseTotalStatInfo: + properties: + adsId: + description: 广告ID + type: integer + adsName: + description: 广告名称 + type: string + appId: + description: 应用ID + type: integer + appName: + description: 应用名称 + type: string + locId: + description: 位置ID + type: integer + locName: + description: 位置名称 + type: string + total: + description: 当日点击 + type: integer + type: object + advertiseSer.GetAdvertiseStatReq: + properties: + adsId: + description: 广告ID + type: integer + adsName: + description: 广告名称 + type: string + appId: + description: 应用ID + items: + type: integer + type: array + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + start: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + advertiseSer.GetAdvertiseStatResp: + properties: + list: + items: + $ref: '#/definitions/advertiseSer.AdvertiseStatInfo' + type: array + summary: + $ref: '#/definitions/advertiseSer.AdvertiseStatSummary' + total: + type: integer + type: object + advertiseSer.GetAdvertiseTotalStatReq: + properties: + adsId: + description: 广告ID + type: integer + adsName: + description: 广告名称 + type: string + appId: + description: 应用ID + items: + type: integer + type: array + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + start: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + advertiseSer.GetAdvertiseTotalStatResp: + properties: + list: + items: + $ref: '#/definitions/advertiseSer.AdvertiseTotalStatInfo' + type: array + summary: + $ref: '#/definitions/advertiseSer.AdvertiseStatSummary' + total: + type: integer + type: object + appcategory.AppCategory: + properties: + createdAt: + description: 创建时间 + type: string + desc: + description: 描述 + type: string + id: + type: integer + imgType: + description: 图片展示类型 0:应用图标 1.小图标 2.大图标 + type: integer + name: + description: 名称 + type: string + parentAppId: + description: parentAppId + type: integer + rank: + description: 应用排序 + type: integer + status: + description: 状态 + type: boolean + updatedAt: + description: 更新时间 + type: string + type: object + applicationmod.AppUpdate: + properties: + id: + type: string + param: + $ref: '#/definitions/applicationmod.AppUpdateInfo' + type: object + applicationmod.AppUpdateInfo: + properties: + androidUrl: + description: 安卓链接 + type: string + appId: + description: appId + type: integer + avatar: + description: 头像图片 + type: string + bigImg: + description: 大图标 + type: string + categories: + description: 分类排序 + items: + $ref: '#/definitions/common.CategoryRank' + type: array + created_id: + description: 创建人 + type: integer + desc: + description: 描述 + type: string + download_url: + description: 下载地址 + type: string + endTime: + description: 结束时间 + type: string + highQualityType: + description: 优质APP推荐展示方式 0:应用图标 1:展示描述文字 + type: integer + homeShow: + description: 是否首页展示 + type: boolean + internal: + description: Tag common.AppReqType `json:"tag" bson:"tag"` //标签 + type: boolean + iosUrl: + description: ios链接 + type: string + isGame: + description: 是否游戏 + type: boolean + isHighQuality: + description: 是否是优质APP推荐 + type: boolean + isRecommend: + description: 是否推荐 + type: boolean + locIds: + description: 位置id + items: + type: integer + type: array + name: + description: 应用名 + type: string + nineShow: + description: 是否九宫格 + type: boolean + parentAppId: + description: 所属appId + type: integer + rank: + description: 默认排序 + type: integer + recreationShow: + description: 是否娱乐中心显示 + type: boolean + smallImg: + description: 小图标 + type: string + startTime: + description: 开始时间 + type: string + status: + description: 状态 + type: boolean + total: + description: 总点击 + type: integer + updated_id: + description: 最后更新人 + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + applicationmod.Application: + properties: + androidUrl: + description: 安卓链接 + type: string + appId: + description: appId + type: integer + avatar: + description: 头像图片 + type: string + bigImg: + description: 大图标(比例:686*330) + type: string + categories: + description: 分类排序 + items: + $ref: '#/definitions/common.CategoryRank' + type: array + created_id: + description: 创建人 + type: integer + createdAt: + description: 创建时间 + type: string + desc: + description: 描述 + type: string + download_url: + description: 下载地址 + type: string + endTime: + description: 结束时间 + type: string + highQualityType: + description: 优质APP推荐展示方式 0:应用图标 1:展示描述文字 + type: integer + homeShow: + description: 是否首页展示 + type: boolean + id: + type: string + internal: + description: 是否内部应用 + type: boolean + iosUrl: + description: ios链接 + type: string + isGame: + description: 是否游戏 + type: boolean + isHighQuality: + description: 是否是优质APP推荐 + type: boolean + isRecommend: + description: 是否推荐 + type: boolean + locIds: + description: 位置id + items: + type: integer + type: array + locNames: + description: 位置映射 + items: + type: string + type: array + name: + description: 应用名 + type: string + nineShow: + description: 是否九宫格 + type: boolean + parentAppId: + description: 所属appId + type: integer + rank: + description: 默认排序 + type: integer + recreationShow: + description: 是否娱乐中心显示 + type: boolean + smallImg: + description: 小图标(比例:360*200) + type: string + startTime: + description: 开始时间 + type: string + status: + description: 状态 + type: boolean + tag: + description: 标签 + type: integer + total: + description: 总点击 + type: integer + updated_id: + description: 最后更新人 + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + botdailyhourstat.BotHourStat: + properties: + appId: + description: appId,唯一id + type: integer + createdAt: + description: 创建时间 + type: string + hourLandPage: + allOf: + - $ref: '#/definitions/botdailyhourstat.LandPage' + description: 小时落地页 + hourStat: + allOf: + - $ref: '#/definitions/botdailyhourstat.StatItem' + description: 小时 + id: + description: ID + type: string + reportTime: + description: 汇报时间 + type: string + reported: + description: 是否已汇报 + type: boolean + sumDate: + description: 记录时间 按小时对齐 + type: string + todayGame: + allOf: + - $ref: '#/definitions/botdailyhourstat.GameItem' + description: 游戏 + todayLandPage: + allOf: + - $ref: '#/definitions/botdailyhourstat.LandPage' + description: 今日落地页 + todayStat: + allOf: + - $ref: '#/definitions/botdailyhourstat.StatItem' + description: 今日 + updatedAt: + description: 修改时间 + type: string + type: object + botdailyhourstat.GameItem: + properties: + dcRchgAmount: + description: 代充总金额 + type: integer + decAmount: + description: 游戏下分总金额 + type: integer + incAmount: + description: 游戏上分总金额 + type: integer + profit: + description: 系统盈利 + type: integer + rchgAmount: + description: 充值总金额 + type: integer + validBet: + description: 有效投注金额 + type: integer + wtdrAmount: + description: 游戏提现总金额 + type: integer + wtdrRealAmount: + description: 游戏实际提现总金额 + type: integer + type: object + botdailyhourstat.LandPage: + properties: + landPageAndroidClick: + description: 落地页android访问次数 + type: integer + landPageIosAppstoreClick: + description: 落地页iOS商店包访问次数 + type: integer + landPageIosFirmClick: + description: 落地页iOS企业包访问次数 + type: integer + landPageIosLightClick: + description: 落地页iOS轻量版访问次数 + type: integer + landPageTotalClick: + description: 落地页访问总次数 + type: integer + type: object + botdailyhourstat.StatItem: + properties: + order: + allOf: + - $ref: '#/definitions/statutils.Stat' + description: 订单 + orderSucc: + allOf: + - $ref: '#/definitions/statutils.Stat' + description: 成功订单 + recharge: + allOf: + - $ref: '#/definitions/statutils.Stat' + description: 充值 + rechargeGold: + allOf: + - $ref: '#/definitions/statutils.Stat' + description: 金币充值 + rechargeNew: + allOf: + - $ref: '#/definitions/statutils.Stat' + description: 新用户充值 + rechargeOld: + allOf: + - $ref: '#/definitions/statutils.Stat' + description: 老用户充值 + rechargeVip: + allOf: + - $ref: '#/definitions/statutils.Stat' + description: 会员充值 + register: + allOf: + - $ref: '#/definitions/statutils.Stat' + description: 注册 + visit: + allOf: + - $ref: '#/definitions/statutils.Stat' + description: 访问 + type: object + channelsettlementrecord.ChannelSettlementRecord: + properties: + appId: + description: appId + type: integer + appType: + allOf: + - $ref: '#/definitions/stat_models_channelmod.AppType' + description: 应用类型 + applicant: + description: 结算申请人 + type: string + beginTime: + description: 开始时间 + type: string + channel: + description: 渠道 + type: string + cpaPrice: + description: 单价 + type: integer + cpsRate: + description: CPS 分成比列 0-100 + type: integer + createdAt: + description: 创建时间 + type: string + endTime: + description: 结束时间 + type: string + id: + description: ID + type: string + includeChild: + description: 结算是否包含子渠道 + type: boolean + newDeductionCount: + description: 新增扣量 + type: integer + newDirectCount: + description: 新增直推 + type: integer + newFissionCount: + description: 新增裂变 + type: integer + operateHistory: + description: 操作历史[最后一项是当前操作记录] + items: + $ref: '#/definitions/channelsettlementrecord.SettlementOperateItem' + type: array + payMoney: + description: 打款金额 + type: integer + promoteMode: + allOf: + - $ref: '#/definitions/stat_models_channelmod.PromoteMode' + description: 推广类型 + rechargeAmount: + description: 充值金额 + type: integer + remark: + description: 备注 + type: string + settleIds: + description: 本次结算的天统计记录id列表 + items: + type: string + type: array + settleMoney: + description: 手动输入的要结算的真实金额() + type: integer + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + status: + allOf: + - $ref: '#/definitions/channelsettlementrecord.SettlementStatus' + description: 状态 + totalMoney: + description: 计算出的总金额 + type: integer + updatedAt: + description: 更新时间 + type: string + usdt: + description: 打款Usdt 还是分 + type: integer + validDeductionCount: + description: 有效扣量总数 + type: integer + validDirectCount: + description: 有效直推总数 + type: integer + validPayCoin: + description: 有效收益金币金额 + type: integer + validPayMoney: + description: 有效收益会员金额 + type: integer + vipPayCoin: + description: 购买会员金币 + type: integer + vipPayDeduction: + description: 购买会员金额(CPS扣量) + type: integer + vipPayMoney: + description: 购买会员金额(CPS扣量后) + type: integer + wallet: + allOf: + - $ref: '#/definitions/stat_models_channelmod.Wallet' + description: 钱包地址 + type: object + channelsettlementrecord.SettlementOperateItem: + properties: + afterStatus: + allOf: + - $ref: '#/definitions/channelsettlementrecord.SettlementStatus' + description: 操作后状态 + beforeStatus: + allOf: + - $ref: '#/definitions/channelsettlementrecord.SettlementStatus' + description: 操作前状态 + content: + description: 操作的内容 + type: string + operateTime: + description: 操作时间 + type: string + operatorAccount: + description: 操作者账号 + type: string + operatorAccountName: + description: 操作者账号名字 + type: string + operatorAccountType: + allOf: + - $ref: '#/definitions/define.ActType' + description: 操作者账号类型 + pictures: + description: 上传的图片 + items: + type: string + type: array + remark: + description: 操作备注 + type: string + type: object + channelsettlementrecord.SettlementStatus: + enum: + - 0 + - 1 + - 2 + - 3 + type: integer + x-enum-comments: + SettlementDeleted: 已删除 + SettlementFailed: 失败 + SettlementInit: 发起 + SettlementSuccess: 成功 + x-enum-varnames: + - SettlementInit + - SettlementSuccess + - SettlementFailed + - SettlementDeleted + common.CategoryRank: + properties: + cid: + type: integer + name: + type: string + rank: + type: integer + type: object + common.Page: + properties: + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + dailystatadvertise.DailyStatAdvertise: + properties: + appId: + description: appId + type: integer + appName: + description: app名称 + type: string + day1RetainRate: + description: 次日留存率 + type: string + day3RetainRate: + description: 3日留存率 + type: string + day7RetainRate: + description: 7日留存率 + type: string + directVisitCount: + description: 直推访问数 + type: integer + id: + description: ID + type: string + newDirectCount: + description: 新增直推 + type: integer + sumDate: + description: 记录时间 按天对齐 + type: string + type: object + dailystatadvertiseser.DailyStatAdvertiseDelReq: + properties: + id: + description: 视频Id + type: string + required: + - id + type: object + dailystatadvertiseser.DailyStatAdvertiseSearch: + properties: + pageNum: + type: integer + pageSize: + type: integer + type: object + dailystatadvertiseser.DailyStatAdvertiseSearchResp: + properties: + list: + items: + $ref: '#/definitions/dailystatadvertise.DailyStatAdvertise' + type: array + total: + type: integer + type: object + dailystatadvertiseser.DailyStatAdvertiseUpdate: + properties: + appId: + description: appId + type: integer + day1RetainRate: + description: 次日留存率 + type: string + day3RetainRate: + description: 3日留存率 + type: string + day7RetainRate: + description: 7日留存率 + type: string + directVisitCount: + description: 直推访问数 + type: integer + newDirectCount: + description: 新增直推 + type: integer + sumDate: + description: 记录时间 按天对齐 + type: string + updatedAt: + description: 更新时间 + type: string + type: object + dailystatadvertiseser.DailyStatAdvertiseUpdateReq: + properties: + id: + description: 视频Id + type: string + param: + allOf: + - $ref: '#/definitions/dailystatadvertiseser.DailyStatAdvertiseUpdate' + description: 参数 + required: + - id + type: object + define.ActType: + enum: + - admin + - channel + - district + - "" + type: string + x-enum-varnames: + - Admin + - Channel + - District + - ActTypeNone + domainmod.Category: + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + type: integer + x-enum-comments: + CategoryAPI: API接口 + CategoryDown: 文件下载 + CategoryH5: H5页面 + CategoryImage: 图片下载 + CategoryJump: 跳转域名 + CategoryLand: 落地页 + CategoryLight: 轻量版域名 + CategoryNone: 无分类 + CategoryVideo: 视频播放 + CategoryWeb: 网站 + x-enum-varnames: + - CategoryNone + - CategoryAPI + - CategoryWeb + - CategoryLand + - CategoryH5 + - CategoryDown + - CategoryImage + - CategoryVideo + - CategoryJump + - CategoryLight + domainmod.CheckResult: + properties: + beginTime: + type: string + checkSucc: + description: 只有检测成功时,检测结果才有意义 + type: boolean + checkType: + $ref: '#/definitions/domainmod.CheckType' + domain: + type: string + endTime: + type: string + errorMessage: + type: string + failedCount: + type: integer + minRate: + type: number + nodeCount: + type: integer + nodeErrors: + items: + type: string + type: array + succCount: + type: integer + succRate: + type: number + type: object + domainmod.CheckStatus: + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + type: integer + x-enum-comments: + CheckStatusChecking: 正在检测 + CheckStatusFailed: 没有通过 + CheckStatusNone: 超时跳过 + CheckStatusPartPass: 部分通过 + CheckStatusSucc: 完全通过 + x-enum-varnames: + - CheckStatusNone + - CheckStatusChecking + - CheckStatusSucc + - CheckStatusFailed + - CheckStatusPartPass + domainmod.CheckType: + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + type: integer + x-enum-comments: + CheckTypeBlack: 域名黑名单检测 + CheckTypeDNS: DNS检测 + CheckTypeGFW: 被墙检测 + CheckTypeHijack: 劫持检测 + CheckTypeNone: 占位符,无意义 + CheckTypePing: Ping检测 + CheckTypePollute: 污染检测 + CheckTypeQQ: QQ拦截检测 + CheckTypeWeChat: 微信拦截检测 + CheckTypeWeb: 网站检测 + x-enum-varnames: + - CheckTypeNone + - CheckTypeWeb + - CheckTypeDNS + - CheckTypePing + - CheckTypeHijack + - CheckTypePollute + - CheckTypeQQ + - CheckTypeWeChat + - CheckTypeBlack + - CheckTypeGFW + domainmod.Domain: + properties: + appId: + description: AppId + type: integer + appName: + description: AppName + type: string + category: + allOf: + - $ref: '#/definitions/domainmod.Category' + description: 分类 + checkFinish: + description: 检测完成时间 + type: string + checkTime: + description: 检测时间 + type: string + checks: + description: 检测方式 + items: + $ref: '#/definitions/domainmod.CheckType' + type: array + comment: + description: 备注 + type: string + createdAt: + type: string + cycleHour: + description: 间隔多少小时检测一次 + type: integer + enable: + description: 是否启用 + type: boolean + id: + type: string + maxNodes: + description: 最大测试节点数 + type: integer + minRate: + description: 最低检测成功率(成功率低于这个值视为失败) + type: number + name: + description: 域名 + type: string + redirectDomain: + description: 重定向域名 + type: string + redirected: + description: 是否已做301跳转 + type: boolean + report: + description: 检测报告 + type: string + results: + description: 检测结果 + items: + $ref: '#/definitions/domainmod.CheckResult' + type: array + status: + allOf: + - $ref: '#/definitions/domainmod.CheckStatus' + description: 状态 + updatedAt: + type: string + required: + - name + type: object + domainmod.DomainDoc: + properties: + appId: + description: AppId + type: integer + category: + allOf: + - $ref: '#/definitions/domainmod.Category' + description: 分类 + checkFinish: + description: 检测完成时间 + type: string + checkTime: + description: 检测时间 + type: string + checks: + description: 检测方式 + items: + $ref: '#/definitions/domainmod.CheckType' + type: array + comment: + description: 备注 + type: string + cycleHour: + description: 间隔多少小时检测一次 + type: integer + enable: + description: 是否启用 + type: boolean + minRate: + description: 最低检测成功率(成功率低于这个值视为失败) + type: number + name: + description: 域名 + type: string + redirectDomain: + description: 重定向域名 + type: string + redirected: + description: 是否已做301跳转 + type: boolean + report: + description: 检测报告 + type: string + results: + description: 检测结果 + items: + $ref: '#/definitions/domainmod.CheckResult' + type: array + status: + allOf: + - $ref: '#/definitions/domainmod.CheckStatus' + description: 状态 + updatedAt: + description: 更新时间 + type: string + type: object + downloadstat.StatType: + enum: + - 0 + - 1 + - 2 + type: integer + x-enum-varnames: + - StatTypeNone + - StatTypeDaily + - StatTypeHour + landPageConfig.LandPageConfig: + properties: + actor: + description: 演员 + type: string + addedTime: + description: 上架时间(审核通过时间) + type: string + appId: + description: appId + type: integer + bango: + description: 番号,唯一 + type: string + createAt: + description: 创建时间 + type: string + desc: + description: 描述 + type: string + id: + type: integer + landPageType: + description: 类型,1PC端,2移动端 + type: integer + media: + description: 视频 + type: string + picture: + description: 图片 + type: string + rank: + description: 排序 + type: integer + status: + description: 状态 + type: boolean + title: + description: 主题 + type: string + updateAt: + description: 更新时间 + type: string + type: object + landpageImg.LandpageImg: + properties: + createdAt: + description: 创建时间 + type: string + id: + description: ID + type: string + mobileAvatar: + description: 移动端图片 + type: string + mobileBackgroud: + description: 移动端背景图 + type: string + mobileTiltle: + description: 移动端标语 + type: string + music: + description: 音频文件 + type: string + name: + description: 图片名称 + type: string + pcAvatar: + description: PC端图片 + type: string + pcBackgroud: + description: PC端背景图 + type: string + pcTitle: + description: PC端标语 + type: string + rank: + description: 排序 + type: integer + status: + description: 是否启用 + type: boolean + updatedAt: + description: 更新时间 + type: string + type: object + mediatag.MediaTag: + properties: + createdAt: + description: 创建时间 + type: string + id: + description: ID + type: string + name: + description: 标签名称 + type: string + rank: + description: 排序 + type: integer + status: + description: 是否启用 + type: boolean + type: + allOf: + - $ref: '#/definitions/mediatag.MediaTagType' + description: 类别 + updatedAt: + description: 更新时间 + type: string + type: object + mediatag.MediaTagType: + enum: + - 1 + - 2 + type: integer + x-enum-comments: + MediaTagTypeFirst: 一级 + MediaTagTypeSecond: 二级 + x-enum-varnames: + - MediaTagTypeFirst + - MediaTagTypeSecond + monitormod.Compare: + enum: + - 0 + - 1 + - 2 + - 3 + type: integer + x-enum-comments: + CompareEQ: 等于 + CompareGT: 大于 + CompareLT: 小于 + x-enum-varnames: + - CompareNone + - CompareLT + - CompareEQ + - CompareGT + monitormod.Monitor: + properties: + appId: + description: appId + type: integer + category: + allOf: + - $ref: '#/definitions/monitormod.MonitorCategory' + description: 分类 + checkCount: + description: 检测次数 + type: integer + comment: + description: 注释 + type: string + compare: + allOf: + - $ref: '#/definitions/monitormod.Compare' + description: 比较 + createdAt: + description: 创建时间 + type: string + device: + allOf: + - $ref: '#/definitions/statutils.DeviceName' + description: 设备 + duration: + description: 时间段,单位分钟 + type: integer + id: + description: ID + type: string + name: + description: 名称 + type: string + status: + description: 是否启用 + type: boolean + threshold: + description: 阀值 + type: integer + triggerCount: + description: 触发次数 + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + monitormod.MonitorCategory: + enum: + - 0 + - 1 + type: integer + x-enum-comments: + MonitorCategoryNewUser: 新用户监控 + MonitorCategoryNone: 占位符,无意义 + x-enum-varnames: + - MonitorCategoryNone + - MonitorCategoryNewUser + proto.ActivityGiftInfoReq: + properties: + actId: + description: 活动ID + type: string + required: + - actId + type: object + proto.ActivityGiftInfoResp: + properties: + count: + description: 奖品总数 + type: integer + list: + items: + $ref: '#/definitions/proto.H5GiftInfo' + type: array + type: object + proto.ActivityInfo: + properties: + background: + description: 背景图 + type: string + banner: + description: banner列表 + items: + $ref: '#/definitions/activitymod.BannerInfo' + type: array + createdAt: + type: string + desc: + description: 活动说明 + type: string + enable: + description: 活动开关 + type: boolean + endTime: + description: 活动结束时间 + type: string + giftCodeGivedNum: + description: 奖品兑换码已发放数量 + type: integer + giftCodeNum: + description: 奖品兑换码总数量 + type: integer + giftCodeUsedNum: + description: 奖品兑换码已使用数量 + type: integer + giftDesc: + description: 奖励说明 + type: string + h5Domain: + description: 活动H5地址 + type: string + id: + description: 唯一ID + type: string + lotteryCodeNum: + description: 抽奖码总数量 + type: integer + name: + description: 活动名称 + type: string + sortCode: + description: 排序号 + type: integer + startTime: + description: 活动开始时间 + type: string + updatedAt: + type: string + usedLotteryCodeNum: + description: 抽奖码已使用数量 + type: integer + type: object + proto.ActivityInfoReq: + properties: + actId: + description: 活动ID + type: string + type: object + proto.ActivityInfoResp: + properties: + banner: + description: banner列表 + items: + $ref: '#/definitions/activitymod.BannerInfo' + type: array + desc: + description: 活动说明 + type: string + enable: + description: 活动开关 + type: boolean + endTime: + description: 活动结束时间 + type: string + giftDesc: + description: 奖励说明 + type: string + h5Domain: + description: 活动H5地址 + type: string + id: + description: 唯一ID + type: string + name: + description: 活动名称 + type: string + startTime: + description: 活动开始时间 + type: string + type: object + proto.ActivityListReq: + properties: + enable: + description: 开关 + type: boolean + name: + description: 活动名称 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.ActivityListResp: + properties: + list: + description: 活动信息列表 + items: + $ref: '#/definitions/proto.ActivityInfo' + type: array + total: + description: 数量 + type: integer + type: object + proto.ActivityVisitCountReq: + properties: + activityId: + description: 活动ID + type: string + activityName: + description: 活动名字 + type: string + appId: + description: AppID + type: integer + ch: + description: 渠道号 + type: string + domain: + description: 落地页域名 + type: string + ip: + description: ip + type: string + type: object + proto.AddActivityReq: + properties: + background: + description: 背景图 + type: string + banner: + description: banner列表 + items: + $ref: '#/definitions/activitymod.BannerInfo' + type: array + desc: + description: 活动描述 + type: string + enable: + description: 活动开关 + type: boolean + endTime: + description: 活动结束时间 + type: string + giftDesc: + description: 奖励说明 + type: string + h5Domain: + description: 活动H5地址 + type: string + name: + description: 活动名称 + type: string + sortCode: + description: 排序号 + type: integer + startTime: + description: 活动开始时间 + type: string + type: object + proto.AddAdminReq: + properties: + account: + description: 账号(唯一) + type: string + blocRole: + description: 角色 + type: integer + merchantId: + description: 商人id + type: string + name: + description: 名称 + type: string + password: + description: 密码 + type: string + roleId: + description: 角色id + type: integer + required: + - account + - name + - password + - roleId + type: object + proto.AddAdsLocReq: + properties: + appId: + description: 应用Id + type: integer + imgSizeDesc: + description: 图片尺寸描述 + type: string + locId: + description: 位置id + type: integer + name: + description: 位置名称 + type: string + remark: + description: 备注 + type: string + required: + - appId + - locId + - name + type: object + proto.AddAdsReq: + properties: + ambientColor: + description: 氛围色 + type: string + appId: + description: 应用id + type: integer + coverImg: + description: 封面 + type: string + endTime: + description: 结束时间 + type: string + isActive: + description: 是否激活 + type: boolean + links: + description: 链接地址 + items: + $ref: '#/definitions/proto.LinkInfo' + type: array + locId: + description: 位置id + type: integer + remark: + description: 备注 + type: string + sort: + description: 排序值--优先级 + type: integer + startTime: + description: 开始时间 + type: string + tags: + description: 广告标签 + type: string + title: + description: 广告标题 + type: string + type: object + proto.AddAnnounReq: + properties: + active: + description: 是否激活 + type: boolean + appId: + description: 应用id + type: integer + content: + description: 公告内容 + type: string + cover: + description: 公告封面图 + type: string + endTime: + description: 公告结束时间 + type: string + href: + description: 公告跳转地址 + type: string + startTime: + description: 公告开始时间 + type: string + title: + description: 公告标题 + type: string + type: + description: 公告类型 0,外部连接;1,直接安装app + type: integer + required: + - active + - appId + - content + - endTime + - startTime + - title + - type + type: object + proto.AddAppInfoReq: + properties: + appId: + description: appId,唯一id + type: integer + iconImg: + description: 应用图标 + type: string + name: + description: app名称 + type: string + required: + - appId + - iconImg + - name + type: object + proto.AddAppLocReq: + properties: + appId: + description: 应用Id + type: integer + imgSizeDesc: + description: 图片尺寸描述 + type: string + locId: + description: 位置id + type: integer + name: + description: 位置名称 + type: string + remark: + description: 备注 + type: string + required: + - appId + - locId + - name + type: object + proto.AddDomainInfoReq: + properties: + appId: + description: AppId + type: integer + appName: + description: AppName + type: string + category: + allOf: + - $ref: '#/definitions/domainmod.Category' + description: 分类 + checkFinish: + description: 检测完成时间 + type: string + checkTime: + description: 检测时间 + type: string + checks: + description: 检测方式 + items: + $ref: '#/definitions/domainmod.CheckType' + type: array + comment: + description: 备注 + type: string + createdAt: + type: string + cycleHour: + description: 间隔多少小时检测一次 + type: integer + enable: + description: 是否启用 + type: boolean + id: + type: string + maxNodes: + description: 最大测试节点数 + type: integer + minRate: + description: 最低检测成功率(成功率低于这个值视为失败) + type: number + name: + description: 域名 + type: string + redirectDomain: + description: 重定向域名 + type: string + redirected: + description: 是否已做301跳转 + type: boolean + report: + description: 检测报告 + type: string + results: + description: 检测结果 + items: + $ref: '#/definitions/domainmod.CheckResult' + type: array + status: + allOf: + - $ref: '#/definitions/domainmod.CheckStatus' + description: 状态 + updatedAt: + type: string + required: + - name + type: object + proto.AddGiftReq: + properties: + actId: + description: 所属活动的ID + type: string + giftDesc: + description: 奖品描述 + type: string + giftName: + description: 奖品名称 + type: string + rate: + description: 中奖率 + type: integer + sort: + description: 排序 + type: integer + required: + - actId + type: object + proto.AddLandPageConfigReq: + properties: + actor: + description: 演员 + type: string + addedTime: + description: 上架时间(审核通过时间) + type: string + appId: + description: appId + type: integer + bango: + description: 番号,唯一 + type: string + desc: + description: 描述 + type: string + landPageType: + description: 类型,1PC端,2移动端 + type: integer + media: + description: 视频 + type: string + picture: + description: 图片 + type: string + rank: + description: 排序 + type: integer + status: + description: 状态 + type: boolean + title: + description: 主题 + type: string + required: + - appId + - landPageType + - title + type: object + proto.AddLandingPageReq: + properties: + appId: + description: appId + type: integer + channelCode: + description: 渠道码 + type: string + remark: + description: 备注 + type: string + status: + description: 状态 默认true + type: boolean + type: + description: 类型 1:渠道 2:分享 + type: integer + url: + description: Url + type: string + required: + - appId + - status + - type + - url + type: object + proto.AddRoleReq: + properties: + authJson: + description: 权限json数据 + type: string + role: + description: 角色 + type: string + required: + - authJson + - role + type: object + proto.AdminInfo: + properties: + account: + description: 账号 + type: string + createdAt: + description: 创建时间 + type: string + lastTime: + description: 登录时间 + type: string + merchantId: + description: 商人id + type: string + name: + description: 名称 + type: string + password: + description: 密码 + type: string + role: + description: 角色 + type: string + roleId: + description: 角色 + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + proto.AdminListReq: + properties: + blocRole: + description: 角色 + type: integer + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.AdminListRes: + properties: + list: + items: + $ref: '#/definitions/proto.AdminInfo' + type: array + total: + type: integer + type: object + proto.AdminLoginReq: + properties: + account: + description: 账号 + type: string + password: + description: 密码 + type: string + required: + - account + - password + type: object + proto.AdminLoginRes: + properties: + account: + description: 用户名 + type: string + name: + description: 名称 + type: string + roleInfo: + allOf: + - $ref: '#/definitions/proto.RoleInfo' + description: 角色信息 + token: + description: token + type: string + type: object + proto.AdminVerifyReq: + properties: + account: + description: 账号 + type: string + verifyCode: + description: 验证码 + type: string + required: + - account + - verifyCode + type: object + proto.AdsClickReq: + properties: + appId: + description: 应用id + type: integer + id: + description: 广告id + type: integer + required: + - appId + - id + type: object + proto.AdsInfo: + properties: + ambientColor: + description: 氛围色 + type: string + appId: + description: 应用id + type: integer + appName: + description: 应用名称 + type: string + clickCount: + description: 点击次数 + type: integer + coverImg: + description: 封面 + type: string + createAt: + description: 创建时间 + type: string + endTime: + description: 结束时间 + type: string + id: + description: 广告id + type: integer + imgSizeDesc: + description: 图片尺寸 + type: string + isActive: + description: 是否激活 + type: boolean + links: + description: 链接地址 + items: + $ref: '#/definitions/proto.LinkInfo' + type: array + locId: + description: 位置id + type: integer + locName: + description: 位置名称 + type: string + remark: + description: 备注 + type: string + sort: + description: 排序值--优先级 + type: integer + startTime: + description: 开始时间 + type: string + tags: + description: 广告标签 + items: + type: string + type: array + title: + description: 广告标题 + type: string + updatedAt: + description: 更新时间 + type: string + visibleChannels: + description: 可见的渠道 + items: + type: string + type: array + type: object + proto.AdsLocInfo: + properties: + appId: + description: 应用id + type: integer + appName: + description: 应用名称 + type: string + createAt: + description: 创建时间 + type: string + id: + description: 唯一id + type: integer + imgSizeDesc: + description: 图片尺寸描述 + type: string + locId: + description: 位置id + type: integer + name: + description: 位置名称 + type: string + remark: + description: 备注 + type: string + updatedAt: + description: 更新时间 + type: string + type: object + proto.AdvertiseInfo: + properties: + ambientColor: + description: 氛围色(逼哩漫画) + type: string + coverImg: + description: 封面 + type: string + id: + description: 广告id + type: integer + jumpType: + allOf: + - $ref: '#/definitions/advertiseMod.JumpType' + description: 跳转方式 0:外部浏览器跳转 1:内部浏览器跳转 2:app内部跳转 + link: + description: 链接地址 + type: string + locId: + description: 位置id + type: integer + remark: + description: 备注描述 + type: string + sort: + description: 排序 + type: integer + tags: + description: 标签 + type: string + title: + description: 广告标题 + type: string + type: + description: 0:系统 1:渠道 + type: integer + type: object + proto.AdvertiseReq: + properties: + appId: + description: 应用id + type: integer + ip: + description: 用户IP + type: string + locId: + description: 位置id + type: integer + userId: + description: 用户ID + type: integer + required: + - appId + type: object + proto.AdvertiseRes: + properties: + advertiseList: + description: 广告列表 + items: + $ref: '#/definitions/proto.AdvertiseInfo' + type: array + type: object + proto.AgentChannelInfoAdd: + properties: + mobile: + description: 手机号 + type: string + password: + description: 代理商密码 + type: string + remark: + description: 备注 + type: string + status: + description: 状态 开/关 + type: boolean + walletAddr1: + description: 钱包地址1 + type: string + walletAddr2: + description: 钱包地址2 + type: string + type: object + proto.AgentChannelInfoSearch: + properties: + Type: + allOf: + - $ref: '#/definitions/stat_models_channelmod.ChannelType' + description: 渠道类型:1 一级 2:二级 + appId: + description: 渠道对应的appId + type: integer + id: + description: ID + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.AgentChannelInfoSearchResp: + properties: + list: + items: + $ref: '#/definitions/proto.ChannelAgentInfo' + type: array + total: + type: integer + type: object + proto.AgentChannelInfoUpdate: + properties: + channel: + description: 渠道 + type: string + mobile: + description: 手机号 + type: string + status: + description: 状态 开/关 + type: boolean + walletAddr1: + description: 钱包地址1 + type: string + walletAddr2: + description: 钱包地址2 + type: string + type: object + proto.AgentChannelPasswordReset: + properties: + channel: + description: 下级渠道 + type: string + password: + description: 新密码 + type: string + type: object + proto.AgentChannelPasswordUpdate: + properties: + newPassword: + description: 代理商新密码 + type: string + oldPassword: + description: 代理商旧密码 + type: string + type: object + proto.AgentChannelRuleUpdate: + properties: + channel: + description: 渠道 + type: string + childShowDivideRate: + description: 渠道:下级是否显示分成比例 + type: boolean + cpaPrice: + description: 单价 + type: integer + cpsRate: + description: CPS 分成比列 0-100 + type: integer + divideRate: + description: 分成比例 + type: integer + remark: + description: 备注 + type: string + type: object + proto.AgentChannelStatResp: + properties: + list: + items: + $ref: '#/definitions/proto.AgentDeductedStat' + type: array + total: + type: integer + totalInfo: + $ref: '#/definitions/proto.AgentDeductedStat' + type: object + proto.AgentChannelStatSearch: + properties: + appId: + description: appId + type: integer + channel: + description: 渠道 + type: string + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + start: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + proto.AgentDeductedStat: + properties: + appId: + description: appId + type: integer + appName: + description: 应用名称 + type: string + channel: + description: 渠道 + type: string + childRebate: + description: 子渠道返佣 + type: integer + cpaPrice: + description: 单价 + type: integer + cpsRate: + description: CPS 分成比列 0-100 + type: integer + directCount: + description: 新增量(包含子渠道和渠道本身) + type: integer + directCountChild: + description: 子渠道新增量 + type: integer + directCountSelf: + description: 自身渠道新增量 + type: integer + divideRate: + description: 分成比例 + type: integer + income: + description: 当日收益(自身+子渠道) + type: integer + incomeChild: + description: 来自子渠道的当日收益 + type: integer + incomeSelf: + description: 来自自身渠道的当日收益 + type: integer + recharge: + description: 充值金额(包含子渠道和渠道本身) + type: integer + rechargeChild: + description: 来自子渠道充值金额 + type: integer + rechargeSelf: + description: 来自自身渠道充值金额 + type: integer + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + sumDate: + description: 记录时间 + type: string + updatedAt: + description: 更新时间 + type: string + visitCount: + description: 访问量 + type: integer + type: object + proto.AgentImgVerifyCode: + properties: + imgId: + description: 验证码ID + type: string + verifyImg: + description: 验证码数据 + items: + type: integer + type: array + type: object + proto.AgentLoginReq: + properties: + account: + description: 账号 + type: string + imgCode: + description: 图片验证码 + type: string + imgID: + description: 图片编号 + type: string + password: + description: 密码 + type: string + required: + - account + - password + type: object + proto.AgentLoginRes: + properties: + channel: + description: 渠道 + type: string + detail: + allOf: + - $ref: '#/definitions/proto.ChannelAgentInfo' + description: 渠道详情 + token: + description: token + type: string + type: object + proto.AgentSummaryStatChild: + properties: + appId: + description: appId + type: integer + appName: + description: 应用名称 + type: string + channel: + description: 渠道 + type: string + childCount: + description: 子渠道数量 + type: integer + cpaPrice: + description: 单价 + type: integer + cpsRate: + description: CPS 分成比列 0-100 + type: integer + divideRate: + description: 分成比例 + type: integer + monthStat: + allOf: + - $ref: '#/definitions/proto.StatDataSimple' + description: 本月统计 + parentAgent: + description: 父代理 + type: string + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + todayStat: + allOf: + - $ref: '#/definitions/proto.StatDataSimple' + description: 今日统计 + totalStat: + allOf: + - $ref: '#/definitions/proto.StatDataSimple' + description: 所有统计 + weekStat: + allOf: + - $ref: '#/definitions/proto.StatDataSimple' + description: 本周统计 + yearStat: + allOf: + - $ref: '#/definitions/proto.StatDataSimple' + description: 本年统计 + type: object + proto.AgentSummaryStatChildResp: + properties: + list: + items: + $ref: '#/definitions/proto.AgentSummaryStatChild' + type: array + total: + type: integer + type: object + proto.AgentSummaryStatChildSearch: + properties: + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.AgentSummaryStatHome: + properties: + appId: + description: appId + type: integer + appName: + description: 应用名称 + type: string + channel: + description: 渠道 + type: string + childCount: + description: 子渠道数量 + type: integer + cpaPrice: + description: 单价 + type: integer + cpsRate: + description: CPS 分成比列 0-100 + type: integer + divideRate: + description: 分成比例 + type: integer + monthStat: + allOf: + - $ref: '#/definitions/proto.StatDataDetail' + description: 本月统计 + parentAgent: + description: 父代理 + type: string + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + todayStat: + allOf: + - $ref: '#/definitions/proto.StatDataDetail' + description: 今日统计 + totalStat: + allOf: + - $ref: '#/definitions/proto.StatDataDetail' + description: 所有统计 + weekStat: + allOf: + - $ref: '#/definitions/proto.StatDataDetail' + description: 本周统计 + yearStat: + allOf: + - $ref: '#/definitions/proto.StatDataDetail' + description: 本年统计 + type: object + proto.AgentSummaryStatHomeResp: + properties: + list: + items: + $ref: '#/definitions/proto.AgentSummaryStatHome' + type: array + total: + type: integer + type: object + proto.AgentSummaryStatHomeSearch: + properties: + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.AnnounInfo: + properties: + active: + description: 是否激活 + type: boolean + appId: + description: 应用id + type: integer + appName: + description: 应用名称 + type: string + content: + description: 公告内容 + type: string + cover: + description: 公告封面图 + type: string + endTime: + description: 结束时间 + type: string + href: + description: 公告跳转地址 + type: string + id: + description: 公告id + type: string + startTime: + description: 开始时间 + type: string + title: + description: 公告标题 + type: string + type: + description: 公告类型 0,外部连接;1,直接安装app + type: integer + type: object + proto.AnnouncementInfo: + properties: + content: + description: 公告内容 + type: string + cover: + description: 公告封面图 + type: string + href: + description: 公告跳转地址 + type: string + id: + description: 公告id + type: string + title: + description: 公告标题 + type: string + type: + description: 公告类型 0,外部连接;1,直接安装app + type: integer + type: object + proto.AnnouncementReq: + properties: + appId: + description: 应用id + type: integer + required: + - appId + type: object + proto.AnnouncementRes: + properties: + announceList: + description: 公告列表 + items: + $ref: '#/definitions/proto.AnnouncementInfo' + type: array + type: object + proto.AppInfoRes: + properties: + advertiseNewNum: + description: 广告新增系数 + type: integer + advertiseNum: + description: 广告系数 + type: integer + appId: + description: appId,唯一id + type: integer + createdAt: + description: 创建时间 + type: string + iconImg: + description: 应用图标 + type: string + landPages: + description: 落地页列表 + items: + type: string + type: array + name: + description: app名称 + type: string + updatedAt: + description: 更新时间 + type: string + type: object + proto.AppLocInfo: + properties: + appId: + description: 应用id + type: integer + appName: + description: 应用名称 + type: string + createAt: + description: 创建时间 + type: string + id: + description: 唯一id + type: integer + imgSizeDesc: + description: 图片尺寸描述 + type: string + locId: + description: 位置id + type: integer + name: + description: 位置名称 + type: string + remark: + description: 备注 + type: string + updatedAt: + description: 更新时间 + type: string + type: object + proto.AppVersionResp: + properties: + description: + description: 描述 + type: string + downloadLink: + description: 下载地址 + items: + type: string + type: array + hasNewVersion: + description: 是否存在新版本 + type: boolean + isForceUpdate: + description: 是否强制升级 + type: boolean + serverVersion: + description: 服务器新版本 + type: string + type: object + proto.ApplicationClickReq: + properties: + id: + description: applicationid + type: string + required: + - id + type: object + proto.ApplyFormRecord: + properties: + appId: + description: appId + type: integer + beginTime: + description: 开始时间 + type: string + channel: + description: 渠道 + type: string + createdAt: + description: 创建时间 + type: string + endTime: + description: 结束时间 + type: string + id: + description: ID + type: string + payMoney: + description: 打款金额 + type: integer + pictures: + description: 上传的图片 + items: + type: string + type: array + remark: + description: 备注 + type: string + settleMoney: + description: 手动输入的要结算的真实金额() + type: integer + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + status: + allOf: + - $ref: '#/definitions/channelsettlementrecord.SettlementStatus' + description: 状态 + totalMoney: + description: 计算出的总金额 + type: integer + updatedAt: + description: 更新时间 + type: string + usdt: + description: 打款Usdt 还是分 + type: integer + wallet: + allOf: + - $ref: '#/definitions/stat_models_channelmod.Wallet' + description: 钱包地址 + type: object + proto.BlocChannelCodeStatInfo: + properties: + appId: + description: appId + type: integer + appName: + description: app名称 + type: string + channel: + description: 该渠道码所属渠道渠道 + type: string + channelCode: + description: 渠道码 + type: string + day1RetainRate: + description: 次日留存率 + type: number + day3RetainRate: + description: 3日留存率 + type: number + day7RetainRate: + description: 7日留存率 + type: number + deductionAmount: + description: 扣量金额 + type: integer + directVisitCount: + description: 直推访问数 + type: integer + fissionAmount: + description: 裂变充值金额 + type: integer + fissionVisitCount: + description: 裂变访问数 + type: integer + landPageVisitCount: + description: 落地页访问次数 + type: integer + newDeductionCount: + description: 新增扣量(新增 = 新增直推+新增裂变+扣量) + type: integer + newDirectCount: + description: 新增直推 + type: integer + newFissionCount: + description: 新增裂变 + type: integer + newRechargeAmount: + description: 新增充值金额 + type: integer + newRechargeCount: + description: 新增充值数 + type: integer + rechargeAmount: + description: 直推充值金额 + type: integer + settlement: + description: 结算方式 cps/cpa/cpt/cpc + type: string + sumDate: + description: 记录时间 按天对齐 + type: string + todayIncome: + description: 当日收益 + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + proto.BlocDailyStatInfo: + properties: + ARPPU: + description: 付费用户人均充值 + type: integer + ARPU: + description: 人均充值 + type: integer + appId: + description: appId + type: integer + appName: + description: app名称 + type: string + daichongAmout: + description: 代充充值金额 + type: integer + day1RetainRate: + description: 次日留存率 + type: number + day3RetainRate: + description: 3日留存率 + type: number + day7RetainRate: + description: 7日留存率 + type: number + directAmount: + description: 直推充值金额 + type: integer + directVisitCount: + description: 直推访问数 + type: integer + fissionAmount: + description: 裂变充值金额 + type: integer + fissionVisitCount: + description: 裂变访问数 + type: integer + gameRechageAmount: + description: 游戏充值 + type: integer + gameWithdrawAmount: + description: 游戏提现 + type: integer + newDirectCount: + description: 新增直推 + type: integer + newFissionCount: + description: 新增裂变 + type: integer + newRechargeAmount: + description: 新增充值金额 + type: integer + newRechargeCount: + description: 新增充值数 + type: integer + newRechargeRate: + description: 新增充值率 + type: number + oldRechargeAmount: + description: 老用户充值金额 + type: integer + onlineAmount: + description: 在线充值金额 + type: integer + sumDate: + description: 记录时间 按天对齐 + type: string + totalAmount: + description: 总充值 + type: integer + totalNewCount: + description: 新增 + type: integer + totalRechargeCount: + description: 总充值人数 + type: integer + totalVisitCount: + description: 日活 + type: integer + updatedAt: + description: 更新时间 + type: string + userWithDrawAmount: + description: 用户提现金额 + type: integer + userWithDrawPaymoneyAmount: + description: 用户提现金额(实际到账) + type: integer + visitRechargeRate: + description: 登陆充值率 + type: number + type: object + proto.BlocDailyStatTotalInfo: + properties: + daichongAmout: + description: 代充充值金额 + type: integer + directAmount: + description: 直推充值金额 + type: integer + directVisitCount: + description: 直推访问数 + type: integer + fissionAmount: + description: 裂变充值金额 + type: integer + fissionVisitCount: + description: 裂变访问数 + type: integer + gameRechageAmount: + description: 游戏充值 + type: integer + gameWithdrawAmount: + description: 游戏提现 + type: integer + newDirectCount: + description: 新增直推 + type: integer + newFissionCount: + description: 新增裂变 + type: integer + newRechargeAmount: + description: 新增充值金额 + type: integer + newRechargeCount: + description: 新增充值数 + type: integer + oldRechargeAmount: + description: 老用户充值金额 + type: integer + onlineAmount: + description: 在线充值金额 + type: integer + sumDate: + description: 记录时间 按天对齐 + type: string + totalAmount: + description: 总充值 + type: integer + totalNewCount: + description: 新增 + type: integer + totalRechargeCount: + description: 总充值人数 + type: integer + totalVisitCount: + description: 日活 + type: integer + updatedAt: + description: 更新时间 + type: string + userWithDrawAmount: + description: 用户提现金额 + type: integer + userWithDrawPaymoneyAmount: + description: 用户提现金额(实际到账) + type: integer + type: object + proto.BlocListChannelCodeStatReq: + properties: + appId: + description: appId + type: integer + channel: + description: 渠道 + type: string + endTime: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + startTime: + description: 开始时间 + type: string + withChild: + description: 包含子渠道 + type: boolean + required: + - pageNum + - pageSize + type: object + proto.BlocListChannelCodeStatRes: + properties: + list: + items: + $ref: '#/definitions/proto.BlocChannelCodeStatInfo' + type: array + total: + type: integer + totalInfo: + $ref: '#/definitions/proto.BlocChannelCodeStatInfo' + type: object + proto.BlocRechargeDetailsInfo: + properties: + appName: + description: appID + type: string + channelName: + description: 支付渠道名字 + type: string + cid: + description: 渠道id + type: string + devType: + description: 设备类型 + type: string + money: + description: 充值金额 订单金额 + type: integer + orderId: + description: 流水id + type: string + payMoney: + description: 实际到账金额 用户实际支付金额 + type: integer + status: + description: 3付款成功 + type: integer + successAt: + description: 成功时间 + type: string + sysType: + description: 操作系统类型 安卓 IOS + type: string + type: + description: 充值方式 + type: string + userId: + description: 用户ID + type: string + type: object + proto.BlocRegisterDetailsInfo: + properties: + appName: + description: appID + type: string + devType: + description: 设备类型 + type: string + ip: + description: IP + type: string + isDirect: + description: true:直推用户 + type: boolean + mobile: + description: 手机号 + type: string + name: + description: 名称 + type: string + registerTime: + description: 注册时间 + type: string + sysType: + description: 操作系统类型 安卓 IOS + type: string + userId: + description: 用户ID + type: string + type: object + proto.BotDailyHourListReq: + properties: + appId: + type: integer + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + sumDateStart: + type: string + sumDateStop: + type: string + required: + - pageNum + - pageSize + - sumDateStart + - sumDateStop + type: object + proto.BotDailyHourListResp: + properties: + list: + items: + $ref: '#/definitions/botdailyhourstat.BotHourStat' + type: array + total: + type: integer + type: object + proto.BotMonthStatReq: + properties: + appId: + description: 如果AppId为空,则计算所有APP + type: integer + month: + description: 只关注这个日期的年月 + type: string + required: + - month + type: object + proto.BotMonthStatResp: + properties: + list: + items: + $ref: '#/definitions/botdailyhourstat.BotHourStat' + type: array + type: object + proto.CenterAppCategory: + properties: + createdAt: + description: 创建时间 + type: string + desc: + description: 描述 + type: string + id: + type: integer + imgType: + description: 图片展示类型 0:应用图标 1.小图标 2.大图标 + type: integer + name: + description: 名称 + type: string + parentAppId: + type: integer + rank: + description: 应用排序 + type: integer + status: + description: 状态 + type: boolean + updatedAt: + description: 更新时间 + type: string + type: object + proto.CenterApplication: + properties: + androidUrl: + description: 安卓链接 + type: string + appId: + description: appId + type: integer + avatar: + description: 头像图片 + type: string + bigImg: + description: 大图标 + type: string + categories: + description: 分类排序 + items: + $ref: '#/definitions/common.CategoryRank' + type: array + created_id: + description: 创建人 + type: integer + createdAt: + description: 创建时间 + type: string + desc: + description: 描述 + type: string + download_url: + description: 下载地址 + type: string + highQualityType: + description: 优质APP推荐展示方式 0:应用图标 1:展示描述文字 + type: integer + homeShow: + description: 是否首页展示 + type: boolean + id: + type: string + internal: + description: 是否内部应用 + type: boolean + iosUrl: + description: ios链接 + type: string + isGame: + description: 是否游戏 + type: boolean + isHighQuality: + description: 是否是优质APP推荐 + type: boolean + isRecommend: + description: 是否推荐 + type: boolean + locIds: + description: 位置id + items: + type: integer + type: array + name: + description: 应用名 + type: string + nineShow: + description: 是否九宫格 + type: boolean + parentAppId: + description: 所属appId + type: integer + rank: + description: 默认排序 + type: integer + recreationShow: + description: 是否娱乐中心显示 + type: boolean + smallImg: + description: 小图标 + type: string + status: + description: 状态 + type: boolean + tag: + description: 标签 + type: integer + total: + description: 总点击 + type: integer + updated_id: + description: 最后更新人 + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + proto.CenterApplicationReq: + properties: + locId: + description: 位置id + type: integer + parentAppId: + description: 所属应用appId + type: integer + userId: + description: 用户ID + type: integer + required: + - parentAppId + type: object + proto.CenterApplicationRes: + properties: + appCategoryList: + description: 列表 + items: + $ref: '#/definitions/proto.CenterAppCategory' + type: array + list: + description: 应用列表 + items: + $ref: '#/definitions/proto.CenterApplication' + type: array + type: object + proto.ChannelAgentInfo: + properties: + appIds: + description: 渠道对应的app + items: + type: integer + type: array + appType: + allOf: + - $ref: '#/definitions/stat_models_channelmod.AppType' + description: 应用类型 + channel: + description: 渠道 + type: string + childCount: + description: 子渠道数量 + type: integer + childShowDivideRate: + description: 下级是否显示分成比例 + type: boolean + cpaPrice: + description: 单价 + type: integer + cpsRate: + description: CPS 分成比列 0-100 + type: integer + createdAt: + description: 创建时间 + type: string + divideRate: + description: 分成比例 + type: integer + lock: + description: 禁止登陆 + type: boolean + mobile: + description: 手机号 + type: string + parentAgent: + description: 父代理 + type: string + promoteMode: + allOf: + - $ref: '#/definitions/stat_models_channelmod.PromoteMode' + description: 推广类型 + remark: + description: 备注 + type: string + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + status: + description: 状态 开/关 + type: boolean + type: + allOf: + - $ref: '#/definitions/stat_models_channelmod.ChannelType' + description: 渠道类型:1 一级 2:二级 + updatedAt: + description: 更新时间 + type: string + userName: + description: 所有者 + type: string + wallet: + allOf: + - $ref: '#/definitions/stat_models_channelmod.Wallet' + description: 钱包地址 + type: object + proto.ChannelAppInfo: + properties: + appId: + description: 应用ID + type: integer + appName: + description: 应用名称 + type: string + landingPage: + description: 落地页 + type: string + type: object + proto.ChannelAppInfoReq: + properties: + channel: + description: 渠道 + type: string + type: object + proto.ChannelAppInfoResp: + properties: + list: + items: + $ref: '#/definitions/proto.ChannelAppInfo' + type: array + type: object + proto.ChannelDeductionRuleAdd: + properties: + appId: + description: 应用ID + type: integer + appType: + allOf: + - $ref: '#/definitions/stat_models_channelmod.AppType' + description: 应用类型 + autoDeduction: + description: 自动扣量开关 + type: boolean + channel: + description: 渠道 + type: string + cpaPrice: + description: 单价(分) 前端可设置1.80 + type: integer + cpsBegin: + description: CPS 开始扣量金额 + type: integer + cpsDeductionRate: + description: CPS 扣量比例 + type: integer + cpsRate: + description: CPS分成比列 + maximum: 100 + minimum: 0 + type: integer + deductionAt: + description: 扣量开始时间(默认当前时间) + type: string + divideRate: + description: 代理分成比例 + type: integer + fifth: + description: 5阶 + maximum: 100 + minimum: 0 + type: integer + first: + description: 一阶 + maximum: 100 + minimum: 0 + type: integer + fourth: + description: 四阶 + maximum: 100 + minimum: 0 + type: integer + landingPage: + description: 落地页 + type: string + lessIncomeRate: + description: 最低收益比 CPA低于该值开启扣量(0.1 - 3.0) + type: number + promoteMode: + allOf: + - $ref: '#/definitions/stat_models_channelmod.PromoteMode' + description: 推广类型 + proxyDeduction: + description: 代理扣量比例 + maximum: 100 + minimum: 0 + type: integer + second: + description: 二阶 + maximum: 100 + minimum: 0 + type: integer + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc (cpt/cpc 1-5阶设置100 不可编辑) + third: + description: 三阶 + maximum: 100 + minimum: 0 + type: integer + required: + - appId + - channel + - settlement + type: object + proto.ChannelDeductionRuleDelete: + properties: + id: + description: ID + type: string + required: + - id + type: object + proto.ChannelDeductionRuleSearch: + properties: + appId: + description: 应用ID + type: integer + channel: + description: 渠道 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.ChannelDeductionRuleSearchResp: + properties: + list: + items: + $ref: '#/definitions/stat_models_channelmod.ChannelDeductionRule' + type: array + total: + type: integer + type: object + proto.ChannelDeductionRuleUpdate: + properties: + appType: + allOf: + - $ref: '#/definitions/stat_models_channelmod.AppType' + description: 应用类型 + autoDeduction: + description: 自动扣量开关 + type: boolean + cpaPrice: + description: 单价 + type: integer + cpsBegin: + description: CPS 开始扣量金额 + type: integer + cpsDeductionRate: + description: CPS 扣量比例 + type: integer + cpsRate: + description: CPS分成比列 0-100 + type: integer + deductionAt: + description: 扣量开始时间 + type: string + divideRate: + description: 代理分成比例 + type: integer + fifth: + description: 5阶(11单以上) + type: integer + first: + description: 一阶(1单) + type: integer + fourth: + description: 四阶(6-10单) + type: integer + id: + description: ID + type: string + landingPage: + description: 落地页 + type: string + lessIncomeRate: + description: 最低收益比 CPA低于该值开启扣量(0.1 - 3.0) + type: number + promoteMode: + allOf: + - $ref: '#/definitions/stat_models_channelmod.PromoteMode' + description: 推广类型 + proxyDeduction: + description: 代理扣量比例 + type: integer + second: + description: 二阶(2-3单) + type: integer + third: + description: 三阶(4-5单) + type: integer + updatedAt: + description: 更新时间 + type: string + required: + - id + type: object + proto.ChannelDownLoadLinkReq: + properties: + appId: + description: AppID + type: integer + channel: + description: 商区渠道号 + type: string + type: object + proto.ChannelInfoAdd: + properties: + channel: + description: 渠道 + type: string + childShowDivideRate: + description: 下级是否显示分成比例 + type: boolean + lock: + description: 禁止登陆 + type: boolean + mobile: + description: 手机号 + type: string + parentChannel: + description: 父渠道 如果为空字符串,则为渠道,否则为代理 + type: string + password: + description: 代理商密 + type: string + remark: + description: 备注 + type: string + status: + description: 状态 开/关 + type: boolean + type: + allOf: + - $ref: '#/definitions/stat_models_channelmod.ChannelType' + description: 渠道类型:1 一级 2:二级 + required: + - channel + - type + type: object + proto.ChannelInfoDelete: + properties: + id: + description: ID + type: string + required: + - id + type: object + proto.ChannelInfoSearch: + properties: + Type: + allOf: + - $ref: '#/definitions/stat_models_channelmod.ChannelType' + description: 渠道类型:1 一级 2:二级 + appId: + description: 渠道对应的appId + type: integer + channel: + description: 渠道 + type: string + id: + description: ID + type: string + mobile: + description: 手机号 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + parentChannel: + description: 父渠道 二级:存在父渠道 + type: string + remark: + description: 备注 + type: string + status: + description: 状态 开/关 + type: boolean + userName: + description: 所有者 + type: string + required: + - pageNum + - pageSize + type: object + proto.ChannelInfoSearchResp: + properties: + list: + items: + $ref: '#/definitions/stat_models_channelmod.ChannelInfo' + type: array + total: + type: integer + type: object + proto.ChannelInfoUpdate: + properties: + autoGenApk: + description: 自动生成渠道包 + type: boolean + childShowDivideRate: + description: 下级是否显示分成比例 + type: boolean + id: + description: ID + type: string + lock: + description: 禁止登陆 + type: boolean + mobile: + description: 手机号 + type: string + password: + description: 渠道密码 + type: string + remark: + description: 备注 + type: string + showMagic: + description: 异常登陆次数 + type: integer + status: + description: 状态 开/关 + type: boolean + updatedAt: + description: 更新时间 + type: string + walletAddr1: + description: 钱包地址1 + type: string + walletAddr2: + description: 钱包地址2 + type: string + required: + - id + type: object + proto.ChannelOwnerChangeInfoSearch: + properties: + channel: + description: 渠道 + type: string + id: + description: ID + type: string + newUser: + description: 变更后的所有者 + type: string + oldUser: + description: 变更前的所有者 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.ChannelOwnerChangeInfoSearchResp: + properties: + list: + items: + $ref: '#/definitions/stat_models_channelmod.ChannelOwnerChange' + type: array + total: + type: integer + type: object + proto.ChannelOwnerUpdate: + properties: + channel: + description: 渠道ID + type: string + mark: + description: 备注 + type: string + userName: + description: 所有者名字 + type: string + required: + - channel + type: object + proto.ChannelSettlementSearch: + properties: + appId: + description: appId + type: integer + channel: + description: 渠道 + type: string + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + start: + description: 开始时间 + type: string + withChild: + description: 包含子渠道 + type: boolean + required: + - pageNum + - pageSize + type: object + proto.ChannelSettlementSearchResp: + properties: + list: + items: + $ref: '#/definitions/stat_models_channelmod.ChannelSettlement' + type: array + total: + type: integer + type: object + proto.ChannelStatSearch: + properties: + appId: + description: appId + items: + type: integer + type: array + channel: + description: 渠道 + type: string + dayType: + description: 天数 + type: integer + detail: + description: true 渠道详细 + type: boolean + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + rankType: + description: 排序方式:统计时间+1充值,2新增,3收益 + type: integer + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + start: + description: 开始时间 + type: string + sumDate: + description: 哪一天 + type: string + userName: + description: 所有者 + type: string + withChild: + description: 包含子渠道 + type: boolean + required: + - pageNum + - pageSize + type: object + proto.ChannelStatSearchResp: + properties: + desc: + description: 描述 + type: string + income: + description: 总收益 + type: integer + list: + items: + $ref: '#/definitions/stat_models_channelmod.ChannelStat' + type: array + total: + type: integer + totalInfo: + $ref: '#/definitions/stat_models_channelmod.ChannelStat' + type: object + proto.ChannelStatSettlementSearch: + properties: + appId: + description: appId + type: integer + channel: + description: 渠道 + type: string + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc/hz + start: + description: 开始时间 + type: string + userName: + description: 所有者 + type: string + withChild: + description: 包含子渠道 + type: boolean + required: + - appId + - channel + - pageNum + - pageSize + type: object + proto.ChannelStatSettlementSearchResp: + properties: + desc: + description: 描述 + type: string + income: + description: 总收益 + type: integer + list: + items: + $ref: '#/definitions/stat_models_channelmod.ChannelStat' + type: array + total: + type: integer + totalInfo: + $ref: '#/definitions/stat_models_channelmod.ChannelStat' + type: object + proto.ContactInfo: + properties: + madou: + description: 官网 + type: string + paoto: + description: 土豆 + type: string + telegram: + description: PC端图片 + type: string + type: object + proto.DailyHourStatInfo: + properties: + NewH5IosCount: + description: +H5IOS新增 + type: integer + androidAmount: + description: 安卓充值金额 + type: integer + androidAmountCount: + description: 安卓充值次数 + type: integer + androidVisitCount: + description: Android访问量 + type: integer + appId: + description: appId + type: integer + appName: + description: app名称 + type: string + deductionAmount: + description: 充值扣量 + type: integer + deductionAmountCount: + description: 充值扣量次数 + type: integer + directAmount: + description: 直推充值金额 + type: integer + directAmountCount: + description: +直推充值订单数 + type: integer + directVisitCount: + description: 直推访问数 + type: integer + districtAmount: + description: 渠道充值 + type: integer + districtAmountCount: + description: 渠道充值次数 + type: integer + districtVisitCount: + description: 渠道访问 + type: integer + fissionAmount: + description: 裂变充值金额 + type: integer + fissionAmountCount: + description: +裂变充值订单数 + type: integer + fissionVisitCount: + description: 裂变访问数 + type: integer + gameRechageAmount: + description: 游戏充值 + type: integer + gameWithdrawAmount: + description: 游戏提现 + type: integer + h5Amount: + description: +H5充值金额 + type: integer + h5AmountCount: + description: +H5充值次数 + type: integer + h5AndroidAmount: + description: 当日H5Android充值 + type: integer + h5AndroidAmountCount: + description: 当日H5Android充值次数 + type: integer + h5AndroidVisitCount: + description: +H5Android访问量 + type: integer + h5FormalAmount: + description: 当日H5Formal充值 + type: integer + h5FormalAmountCount: + description: 当日H5Formal充值次数 + type: integer + h5IosAmountCount: + description: 当日H5Ios充值次数 + type: integer + h5IosVisitCount: + description: +H5Ios访问量 + type: integer + h5PcAmount: + description: 当日H5Pc充值 + type: integer + h5PcAmountCount: + description: 当日H5Pc充值次数 + type: integer + h5PcVisitCount: + description: +H5Pc访问量 + type: integer + h5VisitCount: + description: +H5访问量 + type: integer + iosAmount: + description: Ios充值金额 + type: integer + iosAmountCount: + description: Ios充值次数 + type: integer + iosVisitCount: + description: Ios访问量 + type: integer + landpageAndroidClick: + description: 落地页点击 + type: integer + landpageIosAppstoreClick: + description: 落地页iOS商店包访问次数 + type: integer + landpageIosAthorClick: + description: 落地页iOS其他包访问次数 + type: integer + landpageIosH5Click: + description: 落地页H5访问次数 + type: integer + lightAmount: + description: light充值金额 + type: integer + lightAmountCount: + description: light充值次数 + type: integer + lightDeductionAmount: + description: light充值金额扣量 + type: integer + lightDeductionAmountCount: + description: light充值次数扣量 + type: integer + lightDirectAmount: + description: light充值金额直推 + type: integer + lightDirectAmountCount: + description: light充值次数直推 + type: integer + lightDistrictAmount: + description: light充值金额渠道 + type: integer + lightDistrictAmountCount: + description: light充值次数渠道 + type: integer + lightFissionAmount: + description: light充值金额裂变 + type: integer + lightFissionAmountCount: + description: light充值次数裂变 + type: integer + lightNaturalAmount: + description: light充值金额自然 + type: integer + lightNaturalAmountCount: + description: light充值次数自然 + type: integer + lightNormalAmount: + description: light充值金额自来 + type: integer + lightNormalAmountCount: + description: light充值次数自来 + type: integer + lightVisitCount: + description: light访问量 + type: integer + lightVisitDeductionCount: + description: light访问量扣量 + type: integer + lightVisitDirectCount: + description: light访问量直推 + type: integer + lightVisitDistrictCount: + description: light访问量渠道 + type: integer + lightVisitFissionCount: + description: light访问量裂变 + type: integer + lightVisitNaturalCount: + description: light访问量自然 + type: integer + lightVisitNormalCount: + description: light访问量自来 + type: integer + lightVisitWebCount: + description: light访问量官网 + type: integer + lightWebAmount: + description: light充值金额官网 + type: integer + lightWebAmountCount: + description: light充值次数官网 + type: integer + naturalAmount: + description: 自然充值 + type: integer + naturalAmountCount: + description: +自然充值订单数 + type: integer + naturalVisitCount: + description: 自然访问数 + type: integer + newAndroidCount: + description: android新增 + type: integer + newCoinRecharge: + description: ¥新增金币充值 + type: integer + newDeductionCount: + description: 新增扣量 + type: integer + newDirectCount: + description: 新增直推 + type: integer + newDistrictCount: + description: '**渠道新增' + type: integer + newFissionCount: + description: 新增裂变 + type: integer + newH5AndroidCount: + description: +H5Android新增 + type: integer + newH5Count: + description: H5注册 + type: integer + newH5FormalCount: + description: H5注册新增 + type: integer + newH5PcCount: + description: +H5PC新增 + type: integer + newIosCount: + description: ios新增 + type: integer + newLightCount: + description: 轻量注册 + type: integer + newLightDeductionCount: + description: light新增扣量 + type: integer + newLightDirectCount: + description: light新增直推 + type: integer + newLightDistrictCount: + description: light渠道新增 + type: integer + newLightFissionCount: + description: light新增裂变 + type: integer + newLightFormalCount: + description: light新增注册 + type: integer + newLightGuestCount: + description: light新增安装 + type: integer + newLightNaturalCount: + description: light自然新增 + type: integer + newLightNormalCount: + description: light自来新增 + type: integer + newLightWebCount: + description: light官网新增 + type: integer + newNaturalCount: + description: 自然新增 + type: integer + newNormalCount: + description: '**自来新增' + type: integer + newRechargeAmount: + description: 新增充值金额 + type: integer + newRechargeCount: + description: 新增充值 + type: integer + newTotalCount: + description: 注册 + type: integer + newVipRecharge: + description: ¥新增VIP充值 + type: integer + newWebCount: + description: '**官网新增' + type: integer + normalAmount: + description: 自来充值 + type: integer + normalAmountCount: + description: 自来充值次数 + type: integer + normalVisitCount: + description: 自来访问 + type: integer + oldCoinRecharge: + description: ¥老用户金币充值 + type: integer + oldRechargeAmount: + description: 新用户和老用户充值 + type: integer + oldVipRecharge: + description: ¥老用户VIP充值 + type: integer + rechargeSuccessRate: + description: 支付成功率 + type: string + repeatAmount: + description: 复冲金额 + type: integer + repeatAmountCount: + description: +复冲订单数 + type: integer + successRechargeOrder: + description: 充值成功订单数 + type: integer + sumDate: + description: 记录时间 按天对齐 + type: string + sumHour: + description: 小时数 + type: integer + todayH5IosRecharge: + description: 当日H5Ios充值 + type: integer + totalAmount: + description: 充值 + type: integer + totalRechargeOrder: + description: 拉起订单数 + type: integer + totalVisitCount: + description: 访问 + type: integer + updatedAt: + description: 更新时间 + type: string + vipPayByAmount: + description: 金币购买 + type: integer + vipPayByMoney: + description: 会员购买 + type: integer + vipRepeatAmount: + description: VIP复冲金额 + type: integer + webAmount: + description: 官网充值 + type: integer + webAmountCount: + description: 官网充值次数 + type: integer + webVisitCount: + description: 官网访问 + type: integer + type: object + proto.DailyStatInfo: + properties: + ARPPU: + description: 付费用户人均充值 + type: integer + ARPU: + description: 其他充值 + type: integer + androidAddCount: + description: android新增 + type: integer + appId: + description: appId + type: integer + appName: + description: app名称 + type: string + day1RetainRate: + description: 留存率 + type: number + day3RetainRate: + description: 3日留存率 + type: number + day7RetainRate: + description: 7日留存率 + type: number + deductionAmount: + description: 扣量充值金额 + type: integer + deductionVisitCount: + description: 扣量访问数 + type: integer + directAmount: + description: 直推充值金额 + type: integer + directVisitCount: + description: 直推访问数 + type: integer + fissionAmount: + description: 裂变充值金额 + type: integer + fissionVisitCount: + description: 裂变访问数 + type: integer + gameRechageAmount: + description: 游戏充值 + type: integer + gameWithdrawAmount: + description: 游戏提现 + type: integer + h5AddCount: + description: H5新增 + type: integer + h5AndroidAddCount: + description: H5Android新增 + type: integer + h5FormalCount: + description: H5注册 + type: integer + h5IosAddCount: + description: H5Ios新增 + type: integer + h5PcAddCount: + description: H5Pc新增 + type: integer + iosAddCount: + description: ios新增 + type: integer + landpageAndroidClick: + description: 落地页点击 + type: integer + landpageIosAppstoreClick: + description: 落地页iOS商店包访问次数 + type: integer + landpageIosAthorClick: + description: 落地页iOS其他包访问次数 + type: integer + landpageIosH5Click: + description: 落地页H5访问次数 + type: integer + lightAddCount: + description: 轻量注册 + type: integer + lightDeductionCount: + description: 轻量扣量注册 + type: integer + lightDeductionRechargeAmount: + description: 轻量扣量充值钱数 + type: integer + lightDeductionRechargeCount: + description: 轻量扣量充值次数 + type: integer + lightDeductionVisitCount: + description: 轻量扣量访问 + type: integer + lightDirectCount: + description: 轻量直推注册 + type: integer + lightDirectRechargeAmount: + description: 轻量直推充值钱数 + type: integer + lightDirectRechargeCount: + description: 轻量直推充值次数 + type: integer + lightDirectVisitCount: + description: 轻量直推访问 + type: integer + lightDistrictCount: + description: 轻量渠道注册 + type: integer + lightDistrictRechargeAmount: + description: 轻量渠道充值钱数 + type: integer + lightDistrictRechargeCount: + description: 轻量渠道充值次数 + type: integer + lightDistrictVisitCount: + description: 轻量渠道访问 + type: integer + lightFissionCount: + description: 轻量裂变注册 + type: integer + lightFissionRechargeAmount: + description: 轻量裂变充值钱数 + type: integer + lightFissionRechargeCount: + description: 轻量裂变充值次数 + type: integer + lightFissionVisitCount: + description: 轻量裂变访问 + type: integer + lightFormalAddCount: + description: 轻量注册 + type: integer + lightGuestAddCount: + description: 轻量游客 + type: integer + lightNaturalCount: + description: 轻量自然注册 + type: integer + lightNaturalRechargeAmount: + description: 轻量自然充值钱数 + type: integer + lightNaturalRechargeCount: + description: 轻量自然充值次数 + type: integer + lightNaturalVisitCount: + description: 轻量自然访问 + type: integer + lightNormalCount: + description: 轻量自来注册 + type: integer + lightNormalRechargeAmount: + description: 轻量自来充值钱数 + type: integer + lightNormalRechargeCount: + description: 轻量自来充值次数 + type: integer + lightNormalVisitCount: + description: 轻量自来访问 + type: integer + lightRechargeAmount: + description: 轻量充值钱数 + type: integer + lightRechargeCount: + description: 轻量充值次数 + type: integer + lightVisitCount: + description: 轻量访问 + type: integer + lightWebCount: + description: 轻量官网注册 + type: integer + lightWebRechargeAmount: + description: 轻量官网充值钱数 + type: integer + lightWebRechargeCount: + description: 轻量官网充值次数 + type: integer + lightWebVisitCount: + description: 轻量官网访问 + type: integer + naturalAmount: + description: 自然充值 + type: integer + naturalVisitCount: + description: 自然访问数 + type: integer + newCoinRecharge: + description: 新增金币充值 + type: integer + newDeductionCount: + description: 新增扣量 + type: integer + newDirectCount: + description: 新增直推 + type: integer + newDistrictCount: + description: 渠道注册 + type: integer + newFissionCount: + description: 新增裂变 + type: integer + newNaturalCount: + description: 自然新增 + type: integer + newNormalCount: + description: 自来注册 + type: integer + newRechargeAmount: + description: 新增充值金额 + type: integer + newRechargeCount: + description: 新增充值 + type: integer + newRechargeRate: + description: 充值率 + type: number + newVipRecharge: + description: 新增VIP充值 + type: integer + newWebCount: + description: 官网注册 + type: integer + oldCoinRecharge: + description: 老用户金币充值 + type: integer + oldRechargeAmount: + description: 新用户和老用户充值 + type: integer + oldVipRecharge: + description: 老用户VIP充值 + type: integer + payForAthor: + description: 金币充值 + type: integer + rechargeSuccessRate: + description: 支付成功率 + type: string + repeatAmount: + description: 复冲金额 + type: integer + repeatVipMoney: + description: 复冲VIP + type: integer + successRechargeOrder: + description: 订单统计 + type: integer + sumDate: + description: 记录时间 按天对齐 + type: string + todayAndroidRecharge: + description: 当日android充值 + type: integer + todayAndroidVisitCount: + description: 当日安卓访问量(日活) + type: integer + todayDistrictRecharge: + description: 当日渠道充值新增 + type: integer + todayDistrictVisitCount: + description: 当日渠道访问量 + type: integer + todayH5AndroidRecharge: + description: 当日H5Android充值 + type: integer + todayH5AndroidVisitCount: + description: 当日H5Android访问量(日活) + type: integer + todayH5FormalRecharge: + description: 当日H5Formal充值 + type: integer + todayH5IosRecharge: + description: 当日H5Ios充值 + type: integer + todayH5IosVisitCount: + description: 当日H5Ios访问量(日活) + type: integer + todayH5PcRecharge: + description: 当日H5Pc充值 + type: integer + todayH5PcVisitCount: + description: 当日H5Pc访问量(日活) + type: integer + todayH5Recharge: + description: 当日H5充值 + type: integer + todayH5VisitCount: + description: 当日H5访问量(日活) + type: integer + todayIosRecharge: + description: 当日Ios充值 + type: integer + todayIosVisitCount: + description: 当日IOS访问量(日活) + type: integer + todayNormalRecharge: + description: 当日自来量充值新增 + type: integer + todayNormalVisitCount: + description: 当日自来访问量 + type: integer + todayWebRecharge: + description: 当日官网充值新增 + type: integer + todayWebVisitCount: + description: 当日官网访问量 + type: integer + totalAmount: + description: 充值统计 + type: integer + totalNewCount: + description: 注册统计 + type: integer + totalRechargeOrder: + description: 拉起订单数 + type: integer + totalVisitCount: + description: 访问统计 + type: integer + updatedAt: + description: 更新时间 + type: string + vipPayByMoney: + description: 会员充值 + type: integer + visitRechargeRate: + description: 登陆充值率 + type: number + type: object + proto.DelActivityReq: + properties: + id: + description: 唯一ID + type: string + required: + - id + type: object + proto.DelAdminReq: + properties: + account: + description: 用户id + type: string + required: + - account + type: object + proto.DelAdsLocReq: + properties: + id: + description: 应用id + type: integer + required: + - id + type: object + proto.DelAdsReq: + properties: + id: + description: 应用id + type: integer + required: + - id + type: object + proto.DelAnnounReq: + properties: + id: + description: 公告id + type: string + required: + - id + type: object + proto.DelAppInfoReq: + properties: + appId: + description: appId,唯一id + type: integer + required: + - appId + type: object + proto.DelAppLocReq: + properties: + id: + description: 应用id + type: integer + required: + - id + type: object + proto.DelAppReq: + properties: + id: + type: string + type: object + proto.DelDomainInfoReq: + properties: + id: + type: string + required: + - id + type: object + proto.DelGiftReq: + properties: + id: + description: 奖品唯一ID + type: string + required: + - id + type: object + proto.DelLandPageConfigReq: + properties: + id: + description: Id + type: integer + required: + - id + type: object + proto.DelLandingPageReq: + properties: + id: + description: Id + type: integer + required: + - id + type: object + proto.DelLotteryCodeReq: + properties: + lotteryCodeId: + description: 唯一ID + type: string + required: + - lotteryCodeId + type: object + proto.DelRoleReq: + properties: + roleId: + description: id + type: integer + required: + - roleId + type: object + proto.DownloadStatInfo: + properties: + appId: + type: integer + appName: + type: string + createdAt: + type: string + downTotal: + description: 下载总数 + type: integer + downUnique: + description: 去重下载数(IP来自独立访问集合) + type: integer + downloadToInstallRate: + description: 下载安装转化率 + type: number + endDate: + description: 这个不展示 + type: string + hour: + description: 小时统计展示,每日统计不展示 + type: integer + id: + type: string + installTotal: + description: 安装总数 + type: integer + installUnique: + description: 去重安装数(IP来自下载独立集合) + type: integer + sumDate: + description: 日期 + type: string + type: + allOf: + - $ref: '#/definitions/downloadstat.StatType' + description: 这个不展示 + updatedAt: + type: string + visitCount: + description: 访问总数 + type: integer + visitToDownloadRate: + description: 浏览下载转化率 + type: number + visitToInstallRate: + description: 浏览安装转化率 + type: number + visitUnique: + description: 去重访问数 + type: integer + type: object + proto.DownloadSummaryInfo: + properties: + appId: + type: integer + total: + type: integer + type: object + proto.DrawReq: + properties: + actId: + description: 活动ID + type: string + ip: + description: 用户IP + type: string + lotteryCode: + description: 抽奖码 + type: string + required: + - actId + - ip + - lotteryCode + type: object + proto.FindLandPageConfigReq: + properties: + appId: + description: appId + type: integer + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + status: + type: boolean + type: + type: integer + required: + - pageNum + - pageSize + type: object + proto.FindLandingPageReq: + properties: + appId: + description: appId + type: integer + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - appId + - pageNum + - pageSize + type: object + proto.GenGiftCodeRes: + properties: + codeLen: + description: 生成奖品兑换码的长度 + type: integer + codeNum: + description: 生成奖品兑换码的数量 + type: integer + giftId: + description: 奖品唯一ID + type: string + type: object + proto.GenLotteryCodeReq: + properties: + actId: + description: 所属活动的ID + type: string + codeLen: + description: 抽奖码长度 + type: integer + codeNum: + description: 生产的抽奖码个数 + type: integer + required: + - actId + - codeLen + - codeNum + type: object + proto.GetApplicationsReq: + properties: + androidUrl: + description: 安卓链接 + type: string + category: + description: 分类ID + type: integer + download_url: + description: 下载地址 + type: string + id: + type: string + iosUrl: + description: ios链接 + type: string + isHighQuality: + description: 是否是优质APP推荐 + type: boolean + locIds: + description: 位置id + items: + type: integer + type: array + name: + description: 应用名 + type: string + pageNum: + description: 分页参数 + type: integer + pageSize: + description: 分页参数 + type: integer + parentAppId: + description: 所属appId + type: integer + status: + description: Tag *common.AppReqType `json:"tag" bson:"tag"` //标签 + type: boolean + required: + - pageSize + type: object + proto.GetApplicationsResp: + properties: + list: + items: + $ref: '#/definitions/applicationmod.Application' + type: array + total: + type: integer + type: object + proto.GetApplyFormReq: + properties: + appId: + description: appId + type: integer + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + start: + description: 开始时间 + type: string + status: + allOf: + - $ref: '#/definitions/channelsettlementrecord.SettlementStatus' + description: 状态 + required: + - pageNum + - pageSize + type: object + proto.GetApplyFormResp: + properties: + list: + items: + $ref: '#/definitions/proto.ApplyFormRecord' + type: array + total: + type: integer + type: object + proto.GetGiftInfoReq: + properties: + actId: + description: 所属活动的ID + type: string + actName: + description: 所属活动的名称 + type: string + appName: + description: 所属app的名字 + type: string + giftCode: + description: 奖品兑换码 + type: string + giftId: + description: 所属活动奖品的ID + type: string + giftName: + description: 奖品名称 + type: string + isGaveOut: + description: 兑换码是否已发放 + type: boolean + isUsed: + description: 奖品兑换码是否已使用 + type: boolean + lotteryCode: + description: 抽奖码 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + userId: + description: 兑换者Id + type: string + required: + - pageNum + - pageSize + type: object + proto.GetGiftInfoResp: + properties: + list: + items: + $ref: '#/definitions/activitymod.LotteryGetGift' + type: array + total: + description: 数量 + type: integer + type: object + proto.GetLandPageConfigByTypeReq: + properties: + appId: + description: appId + type: integer + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + type: + type: integer + required: + - appId + - pageNum + - pageSize + type: object + proto.GetSettlementApplicantListReq: + type: object + proto.GetSettlementApplicantListResp: + properties: + list: + items: + type: string + type: array + type: object + proto.GiftInfo: + properties: + actId: + description: 所属活动的ID + type: string + actName: + description: 所属活动的名称 + type: string + createdAt: + type: string + giftDesc: + description: 奖品描述 + type: string + giftName: + description: 奖品名称 + type: string + giftNum: + description: 抽奖码总数量 + type: integer + id: + description: 唯一ID + type: string + rate: + description: 备注 + type: integer + receivedGiftNum: + description: 抽奖码已使用数量 + type: integer + sort: + description: 排序 + type: integer + updatedAt: + type: string + type: object + proto.GiftListReq: + properties: + actId: + description: 所属活动的ID + type: string + giftDesc: + description: 奖品描述 + type: string + giftName: + description: 奖品名称 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + rate: + description: 备注 + type: integer + required: + - pageNum + - pageSize + type: object + proto.GiftListResp: + properties: + list: + items: + $ref: '#/definitions/proto.GiftInfo' + type: array + total: + description: 数量 + type: integer + type: object + proto.H5ConfigReq: + properties: + appId: + description: AppID + type: integer + dc: + description: 商区渠道号 + type: string + pc: + description: 用户渠道号,即用户邀请码 + type: string + type: object + proto.H5GiftInfo: + properties: + giftName: + description: 奖品名称 + type: string + id: + description: 奖品ID + type: string + type: object + proto.InnerRechargeReq: + properties: + innerId: + type: integer + type: object + proto.LandPageConfigListResp: + properties: + list: + items: + $ref: '#/definitions/landPageConfig.LandPageConfig' + type: array + total: + type: integer + type: object + proto.LandingPageConfig: + properties: + actor: + description: 演员 + type: string + addedTime: + description: 上架时间(审核通过时间) + type: string + bango: + description: 番号,唯一 + type: string + desc: + description: 描述 + type: string + media: + description: 视频 + type: string + picture: + description: 图片 + type: string + rank: + description: 排序 + type: integer + title: + description: 主题 + type: string + type: object + proto.LandingPageInfo: + properties: + appId: + description: appId + type: integer + channelCode: + description: 渠道码 + type: string + id: + description: Id + type: integer + remark: + description: 备注 + type: string + status: + description: 状态 默认true + type: boolean + type: + description: 类型 1:渠道 2:分享 + type: integer + url: + description: Url + type: string + required: + - status + - type + type: object + proto.LandingPageListRes: + properties: + list: + items: + $ref: '#/definitions/proto.LandingPageInfo' + type: array + total: + type: integer + type: object + proto.LandpagePictureAddReq: + properties: + createdAt: + description: 创建时间 + type: string + id: + description: ID + type: string + mobileAvatar: + description: 移动端图片 + type: string + mobileBackgroud: + description: 移动端背景图 + type: string + mobileTiltle: + description: 移动端标语 + type: string + music: + description: 音频文件 + type: string + name: + description: 图片名称 + type: string + pcAvatar: + description: PC端图片 + type: string + pcBackgroud: + description: PC端背景图 + type: string + pcTitle: + description: PC端标语 + type: string + rank: + description: 排序 + type: integer + status: + description: 是否启用 + type: boolean + updatedAt: + description: 更新时间 + type: string + type: object + proto.LandpagePictureDelReq: + properties: + id: + type: string + type: object + proto.LandpagePictureSearch: + properties: + name: + description: 分类名称 + type: string + pageNum: + type: integer + pageSize: + type: integer + status: + description: 是否启用 + type: boolean + type: object + proto.LandpagePictureSearchResp: + properties: + list: + items: + $ref: '#/definitions/landpageImg.LandpageImg' + type: array + total: + type: integer + type: object + proto.LandpagePictureUpdate: + properties: + mobileAvatar: + description: 移动端图片 + type: string + mobileBackgroud: + description: 移动端背景图 + type: string + mobileTiltle: + description: 移动端标语 + type: string + music: + description: 音频文件 + type: string + name: + description: 名称 + type: string + pcAvatar: + description: PC端图片 + type: string + pcBackgroud: + description: PC端背景图 + type: string + pcTitle: + description: PC端标语 + type: string + rank: + description: 排序 + type: integer + status: + description: 是否启用 + type: boolean + updatedAt: + description: 更新时间 + type: string + type: object + proto.LandpagePictureUpdateReq: + properties: + id: + type: string + param: + allOf: + - $ref: '#/definitions/proto.LandpagePictureUpdate' + description: 参数 + type: object + proto.LinkInfo: + properties: + foreign: + description: true 国外用户 + type: boolean + link: + description: 链接地址 + type: string + weight: + description: 权重 + type: integer + type: object + proto.ListAdsLocReq: + properties: + appId: + description: appId,过滤条件 + type: integer + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.ListAdsLocRes: + properties: + list: + items: + $ref: '#/definitions/proto.AdsLocInfo' + type: array + total: + type: integer + type: object + proto.ListAdsReq: + properties: + appId: + description: appId,过滤条件 + type: integer + isActive: + description: appId,过滤条件 + type: boolean + link: + description: 链接地址 + type: string + locId: + description: 位置id + type: integer + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + title: + description: 广告标题 + type: string + required: + - pageNum + - pageSize + type: object + proto.ListAdsRes: + properties: + list: + items: + $ref: '#/definitions/proto.AdsInfo' + type: array + total: + type: integer + type: object + proto.ListAnnounReq: + properties: + appId: + description: 应用id 筛选条件 + type: integer + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.ListAnnounRes: + properties: + list: + items: + $ref: '#/definitions/proto.AnnounInfo' + type: array + total: + type: integer + type: object + proto.ListAppInfoReq: + properties: + appName: + description: appId + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + used: + description: 渠道 + type: boolean + required: + - pageNum + - pageSize + type: object + proto.ListAppInfoRes: + properties: + list: + items: + $ref: '#/definitions/proto.AppInfoRes' + type: array + total: + type: integer + type: object + proto.ListAppLocReq: + properties: + appId: + description: appId,过滤条件 + type: integer + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.ListAppLocRes: + properties: + list: + items: + $ref: '#/definitions/proto.AppLocInfo' + type: array + total: + type: integer + type: object + proto.ListBlocDailyStatReq: + properties: + appId: + description: appId + type: integer + endTime: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + startTime: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + proto.ListBlocDailyStatRes: + properties: + list: + items: + $ref: '#/definitions/proto.BlocDailyStatInfo' + type: array + total: + type: integer + totalInfo: + $ref: '#/definitions/proto.BlocDailyStatInfo' + type: object + proto.ListBlocDailyStatTotalReq: + properties: + endTime: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + startTime: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + proto.ListBlocDailyStatTotalRes: + properties: + list: + items: + $ref: '#/definitions/proto.BlocDailyStatTotalInfo' + type: array + total: + type: integer + type: object + proto.ListBlocRechargeChannelInfo: + properties: + blocChannelRate: + description: 费率 + type: integer + blocOrderMoney: + description: 订单金额 + type: integer + channelName: + description: 支付渠道名称 + type: string + sumDate: + description: 记录时间 按天对齐 + type: string + type: object + proto.ListBlocRechargeChannelReq: + properties: + appId: + description: appId + type: integer + channelName: + description: 渠道名称筛选 + type: string + endTime: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + startTime: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + proto.ListBlocRechargeChannelRes: + properties: + list: + items: + $ref: '#/definitions/proto.ListBlocRechargeChannelInfo' + type: array + total: + type: integer + type: object + proto.ListBlocRechargeDetailsReq: + properties: + appId: + description: appId + type: integer + endTime: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + startTime: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + proto.ListBlocRechargeDetailsRes: + properties: + list: + items: + $ref: '#/definitions/proto.BlocRechargeDetailsInfo' + type: array + total: + type: integer + type: object + proto.ListBlocRegisterDetailsReq: + properties: + appId: + description: appId + type: integer + endTime: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + startTime: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + proto.ListBlocRegisterDetailsRes: + properties: + list: + items: + $ref: '#/definitions/proto.BlocRegisterDetailsInfo' + type: array + total: + type: integer + type: object + proto.ListBlocWithdrawDetailsInfo: + properties: + act: + description: 交易账户 + type: string + actName: + description: 交易账户持有人 + type: string + amount: + description: 金币数量 + type: integer + appName: + description: appID + type: string + devID: + description: 设备id + type: string + deviceType: + description: 设备类型 + type: string + money: + description: 提现金额 + type: integer + name: + description: 用户名 + type: string + oid: + description: 第三方支付平台id + type: string + payMoney: + description: 实际到账 + type: integer + payType: + description: 提现方式,alipay,bankcard + type: string + receivedAt: + description: 到账时间 李秋山确认 三方出款时间 + type: string + status: + description: 1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败 + type: integer + statusDesc: + description: 状态说明 + type: string + successAt: + description: 回调成功时间 + type: string + uid: + description: 用户Id + type: string + userIp: + description: 用户ip + type: string + required: + - money + - payType + type: object + proto.ListBlocWithdrawDetailsReq: + properties: + appId: + description: appId + type: integer + endTime: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + startTime: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + proto.ListBlocWithdrawDetailsRes: + properties: + list: + items: + $ref: '#/definitions/proto.ListBlocWithdrawDetailsInfo' + type: array + total: + type: integer + type: object + proto.ListDailyHourStatReq: + properties: + appId: + description: appId + type: integer + endTime: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + startTime: + description: 开始时间 + type: string + sumHour: + description: 小时数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.ListDailyHourStatRes: + properties: + list: + items: + $ref: '#/definitions/proto.DailyHourStatInfo' + type: array + total: + type: integer + type: object + proto.ListDailyStatReq: + properties: + appId: + description: appId + items: + type: integer + type: array + endTime: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + startTime: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + proto.ListDailyStatRes: + properties: + list: + items: + $ref: '#/definitions/proto.DailyStatInfo' + type: array + total: + type: integer + totalInfo: + $ref: '#/definitions/proto.DailyStatInfo' + type: object + proto.ListDomainInfoReq: + properties: + appId: + type: integer + category: + allOf: + - $ref: '#/definitions/domainmod.Category' + description: 分类 + check: + allOf: + - $ref: '#/definitions/domainmod.CheckType' + description: 检测方式 + enable: + type: boolean + name: + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + status: + allOf: + - $ref: '#/definitions/domainmod.CheckStatus' + description: 状态 + required: + - pageNum + - pageSize + type: object + proto.ListDomainInfoRes: + properties: + list: + items: + $ref: '#/definitions/domainmod.Domain' + type: array + total: + type: integer + type: object + proto.ListDownloadSummaryRes: + properties: + list: + items: + $ref: '#/definitions/proto.DownloadSummaryInfo' + type: array + type: object + proto.ListHourStatLineInfo: + properties: + HourH5Recharge: + description: H5充值 + type: integer + hourAndroidNew: + description: android新增 + type: integer + hourAndroidRecharge: + description: android充值 + type: integer + hourDistrictRecharge: + description: ////// + type: integer + hourDistrictVip: + description: 渠道VIP充值 + type: integer + hourH5AndroidNew: + description: H5Android新增 + type: integer + hourH5AndroidRecharge: + description: H5Android充值 + type: integer + hourH5IosNew: + description: H5Ios新增 + type: integer + hourH5IosRecharge: + description: H5Ios充值 + type: integer + hourH5New: + description: H5新增 + type: integer + hourH5PcNew: + description: H5Pc新增 + type: integer + hourH5PcRecharge: + description: H5Pc充值 + type: integer + hourIosNew: + description: Ios新增 + type: integer + hourIosRecharge: + description: Ios充值 + type: integer + hourNew: + description: 新增 + type: integer + hourNewDistrict: + description: 渠道新增 + type: integer + hourNewNormal: + description: 自来量新增 + type: integer + hourNewWeb: + description: 官网新增 + type: integer + hourNormalRecharge: + description: 自来量充值 + type: integer + hourNormalVip: + description: 自来量VIP充值 + type: integer + hourVipRecharge: + description: VIP充值 + type: integer + hourWebRecharge: + description: 官网充值 + type: integer + hourWebVip: + description: 官网VIP充值 + type: integer + sumDate: + description: 记录时间,当日零点时间 + type: string + type: object + proto.ListHourStatLineReq: + properties: + appId: + description: 应用id + type: integer + compareTime: + description: 对比时间 + type: string + sumDate: + description: 请求日的零点时间 + type: string + required: + - appId + - sumDate + type: object + proto.ListHourStatLineResp: + properties: + appInfo: + allOf: + - $ref: '#/definitions/proto.AppInfoRes' + description: app信息 + todayGraphList: + description: 今日曲线图数据 + items: + $ref: '#/definitions/proto.ListHourStatLineInfo' + type: array + yesterdayGraphList: + description: 昨日曲线图数据 + items: + $ref: '#/definitions/proto.ListHourStatLineInfo' + type: array + type: object + proto.ListLandPageStatRes: + properties: + list: + items: + $ref: '#/definitions/proto.DownloadStatInfo' + type: array + summary: + $ref: '#/definitions/proto.DownloadStatInfo' + total: + type: integer + type: object + proto.ListMinuteStatReq: + properties: + appId: + description: 应用id + type: integer + compareTime: + description: 对比时间 + type: string + sumDate: + description: 请求日的零点时间 + type: string + required: + - appId + - sumDate + type: object + proto.ListMinuteStatRes: + properties: + appInfo: + allOf: + - $ref: '#/definitions/proto.AppInfoRes' + description: app信息 + todayGraphList: + description: 今日曲线图数据 + items: + $ref: '#/definitions/proto.MinuteStatInfo' + type: array + yesterdayGraphList: + description: 昨日曲线图数据 + items: + $ref: '#/definitions/proto.MinuteStatInfo' + type: array + type: object + proto.ListOpLogReq: + properties: + isAdmin: + description: '是否是管理员 true: 管理员 false: 代理商' + type: boolean + operator: + description: 操作人员 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + router: + description: 路由 + type: string + required: + - pageNum + - pageSize + type: object + proto.ListOpLogRes: + properties: + list: + items: + $ref: '#/definitions/proto.OpLogInfo' + type: array + total: + type: integer + type: object + proto.LotteryCodeListReq: + properties: + actId: + description: 所属活动的ID + type: string + actName: + description: 活动名称 + type: string + giftCode: + description: 奖品兑换码 + type: string + isUsed: + description: 抽奖码是否已使用 + type: boolean + lotteryCode: + description: 抽奖码 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + userIp: + description: 抽奖者IP + type: string + required: + - pageNum + - pageSize + type: object + proto.LotteryCodeListResp: + properties: + list: + description: 活动抽奖码列表 + items: + $ref: '#/definitions/activitymod.LottertyCodeInfo' + type: array + total: + description: 数量 + type: integer + type: object + proto.MediaTagAddReq: + properties: + createdAt: + description: 创建时间 + type: string + id: + description: ID + type: string + name: + description: 标签名称 + type: string + rank: + description: 排序 + type: integer + status: + description: 是否启用 + type: boolean + type: + allOf: + - $ref: '#/definitions/mediatag.MediaTagType' + description: 类别 + updatedAt: + description: 更新时间 + type: string + type: object + proto.MediaTagDelReq: + properties: + id: + type: string + type: object + proto.MediaTagSearch: + properties: + name: + description: 分类名称 + type: string + pageNum: + type: integer + pageSize: + type: integer + status: + description: 是否启用 + type: boolean + type: + allOf: + - $ref: '#/definitions/mediatag.MediaTagType' + description: 类别 + type: object + proto.MediaTagSearchResp: + properties: + list: + items: + $ref: '#/definitions/mediatag.MediaTag' + type: array + total: + type: integer + type: object + proto.MediaTagUpdate: + properties: + name: + description: 名称 + type: string + rank: + description: 排序 + type: integer + status: + description: 是否启用 + type: boolean + type: + allOf: + - $ref: '#/definitions/mediatag.MediaTagType' + description: 类 + updatedAt: + description: 更新时间 + type: string + type: object + proto.MediaTagUpdateReq: + properties: + id: + type: string + param: + allOf: + - $ref: '#/definitions/proto.MediaTagUpdate' + description: 参数 + type: object + proto.MinuteStatInfo: + properties: + accessCount: + description: 访问量 + type: integer + androidAccessCount: + description: android访问量 + type: integer + androidAddCount: + description: android新增 + type: integer + h5AddCount: + description: H5新增 + type: integer + iosAccessCount: + description: ios访问量 + type: integer + iosAddCount: + description: ios新增 + type: integer + landpageAndroidClick: + description: 落地页android访问次数 + type: integer + landpageIosAppstoreClick: + description: 落地页iOS商店包访问次数 + type: integer + landpageIosAthorClick: + description: 落地页iOS其他包访问次数 + type: integer + landpageIosH5Click: + description: 落地页H5访问次数 + type: integer + lightGuestAddCount: + description: 轻量版新增 + type: integer + newCount: + description: 新增数 + type: integer + rechageCount: + description: 充值订单 + type: integer + rechageMoney: + description: 充值金额 + type: integer + sumDate: + description: 记录时间,当日零点时间 + type: string + type: object + proto.MonitorAddReq: + properties: + appId: + description: appId + type: integer + category: + allOf: + - $ref: '#/definitions/monitormod.MonitorCategory' + description: 分类 + checkCount: + description: 检测次数 + type: integer + comment: + description: 注释 + type: string + compare: + allOf: + - $ref: '#/definitions/monitormod.Compare' + description: 比较 + createdAt: + description: 创建时间 + type: string + device: + allOf: + - $ref: '#/definitions/statutils.DeviceName' + description: 设备 + duration: + description: 时间段,单位分钟 + type: integer + id: + description: ID + type: string + name: + description: 名称 + type: string + status: + description: 是否启用 + type: boolean + threshold: + description: 阀值 + type: integer + triggerCount: + description: 触发次数 + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + proto.MonitorDelReq: + properties: + id: + type: string + type: object + proto.MonitorSearch: + properties: + appId: + description: appId + type: integer + category: + allOf: + - $ref: '#/definitions/monitormod.MonitorCategory' + description: 监控分类 + device: + allOf: + - $ref: '#/definitions/statutils.DeviceName' + description: 设备类型 + name: + description: 分类名称 + type: string + pageNum: + type: integer + pageSize: + type: integer + status: + description: 是否启用 + type: boolean + type: object + proto.MonitorSearchResp: + properties: + list: + items: + $ref: '#/definitions/monitormod.Monitor' + type: array + total: + type: integer + type: object + proto.MonitorUpdate: + properties: + appId: + description: appId + type: integer + category: + allOf: + - $ref: '#/definitions/monitormod.MonitorCategory' + description: 分类 + comment: + description: 注释 + type: string + compare: + allOf: + - $ref: '#/definitions/monitormod.Compare' + description: 比较 + device: + allOf: + - $ref: '#/definitions/statutils.DeviceName' + description: 设备 + duration: + description: 时间段,单位分钟 + type: integer + name: + description: 分类名称 + type: string + status: + description: 是否启用 + type: boolean + threshold: + description: 阀值 + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + proto.MonitorUpdateReq: + properties: + id: + type: string + param: + allOf: + - $ref: '#/definitions/proto.MonitorUpdate' + description: 参数 + required: + - id + - param + type: object + proto.OpLogInfo: + properties: + createdAt: + description: 创建时间 + type: string + data: + description: 操作数据 + type: string + isAdmin: + description: 是否是管理员 + type: boolean + operator: + description: 操作人员 + type: string + router: + description: 接口路由 + type: string + type: object + proto.PageButtonClickReq: + properties: + appId: + description: AppID + type: integer + channel: + description: 渠道(json字符串) + type: string + domain: + description: 落地页域名 + type: string + ip: + description: ip + type: string + packageType: + allOf: + - $ref: '#/definitions/versionMod.PkgType' + description: 包类型 1:企业包 2:商店包 3:TF包 4:超级签 5:轻量版 + terminal: + description: 终端ios android + type: string + required: + - terminal + type: object + proto.PageButtonClickResp: + properties: + BackUrl: + description: 企业签URL (不用) + type: string + lightData: + description: 如果是轻量版,返回数据 + items: + type: integer + type: array + link: + description: 下载链接 + items: + type: string + type: array + packageType: + allOf: + - $ref: '#/definitions/versionMod.PkgType' + description: 包类型 1:企业包 2:商店包 3:TF包 + status: + description: 是否启用 + type: boolean + terminal: + description: 终端ios android light + type: string + tf: + description: TFinfo + items: + $ref: '#/definitions/proto.TfInfo' + type: array + versionNum: + description: 版本号 + type: string + required: + - packageType + type: object + proto.PageButtonListReq: + properties: + appId: + description: AppID + type: integer + channel: + description: 渠道(json字符串) + type: string + domain: + description: 落地页域名 + type: string + ip: + description: ip + type: string + type: object + proto.PageButtonListResp: + properties: + androidButton: + description: android下载按钮 + type: integer + contact: + allOf: + - $ref: '#/definitions/proto.ContactInfo' + description: 联系方式 + hasChannelApk: + description: 有安卓渠道包 + type: boolean + iosDown: + description: 显示完整版,是企业包 + type: boolean + iosH5: + description: H5跳转链接 + type: boolean + iosStore: + description: 显示商店包 + type: boolean + iosTF: + description: TF包 + type: boolean + pictureList: + description: 资源数据 + items: + $ref: '#/definitions/proto.PageButtonPicture' + type: array + type: object + proto.PageButtonPicture: + properties: + mobileAvatar: + description: 移动端图片 + type: string + mobileBackgroud: + description: 移动端背景图 + type: string + mobileTiltle: + description: 移动端标语 + type: string + music: + description: 音频文件 + type: string + pcAvatar: + description: PC端图片 + type: string + pcBackgroud: + description: PC端背景图 + type: string + pcTitle: + description: PC端标语 + type: string + type: object + proto.RoleInfo: + properties: + authJson: + description: 权限json数据 + type: string + createdAt: + description: 创建时间 + type: string + role: + description: 角色 + type: string + roleId: + description: id + type: integer + updatedAt: + description: 修改时间 + type: string + type: object + proto.RoleListReq: + properties: + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - pageNum + - pageSize + type: object + proto.RoleListRes: + properties: + list: + items: + $ref: '#/definitions/proto.RoleInfo' + type: array + total: + type: integer + type: object + proto.SearchChannelStatComparedReq: + properties: + appId: + description: appId + type: integer + channel: + description: 渠道 + type: string + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + start: + description: 开始时间 + type: string + withChild: + description: 包含子渠道 + type: boolean + required: + - pageNum + - pageSize + type: object + proto.SearchChannelStatComparedResp: + properties: + list: + items: + $ref: '#/definitions/stat_models_channelmod.ChannelStatYesterday' + type: array + total: + type: integer + type: object + proto.SendTgMessageReq: + properties: + appId: + type: integer + message: + type: string + msgType: + $ref: '#/definitions/proto.TgMsgType' + type: object + proto.SendTgMessageRes: + type: object + proto.SettlementCalcReq: + properties: + appId: + description: 应用ID + type: integer + beginTime: + description: 开始时间 + type: string + channel: + description: 渠道 + type: string + endTime: + description: 结束时间 + type: string + ruleId: + description: 扣量RuleId + type: string + settleIds: + description: 要结算的天记录ID列表 + items: + type: string + type: array + required: + - appId + - channel + - ruleId + - settleIds + type: object + proto.SettlementCalcResp: + properties: + totalCount: + description: 总条数 + type: integer + totalDesc: + description: 总收益描述 + type: string + totalIncome: + description: 总收益(列表的所有数据合计) + type: integer + totalInfo: + allOf: + - $ref: '#/definitions/stat_models_channelmod.ChannelStat' + description: 按总条数合计的数据 + type: object + proto.SettlementInfoAdd: + properties: + appId: + description: 应用ID + type: integer + beginTime: + description: 开始时间 + type: string + channel: + description: 渠道 + type: string + endTime: + description: 结束时间 + type: string + totalMoney: + description: 总金额 + type: integer + required: + - appId + - beginTime + - channel + - endTime + - totalMoney + type: object + proto.SettlementInfoDelete: + properties: + id: + description: ID + type: string + required: + - id + type: object + proto.SettlementInfoDetail: + properties: + id: + description: ID + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + required: + - id + - pageNum + - pageSize + type: object + proto.SettlementInfoDetailResp: + properties: + count: + description: 总条数 + type: integer + list: + description: 全部记录 + items: + $ref: '#/definitions/stat_models_channelmod.ChannelStat' + type: array + type: object + proto.SettlementInfoSearch: + properties: + appId: + description: appId + type: integer + applicants: + description: 申请人列表 + items: + type: string + type: array + channel: + description: 渠道 + type: string + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + payType: + description: 支付类型,1ERC 2TRC 3銀行卡 4支付寶 + type: integer + remark: + description: 备注 + type: string + start: + description: 开始时间 + type: string + status: + description: 状态数组 + items: + $ref: '#/definitions/channelsettlementrecord.SettlementStatus' + type: array + required: + - pageNum + - pageSize + type: object + proto.SettlementInfoSearchResp: + properties: + list: + items: + $ref: '#/definitions/channelsettlementrecord.ChannelSettlementRecord' + type: array + total: + type: integer + type: object + proto.SettlementInfoUpdate: + properties: + id: + description: ID + type: string + payMoney: + description: 打款金额 + type: integer + remark: + description: 备注 + type: string + status: + allOf: + - $ref: '#/definitions/channelsettlementrecord.SettlementStatus' + description: 状态 + usdt: + description: 打款Usdt 还是分 + type: integer + required: + - id + type: object + proto.ShareUrlReq: + properties: + appid: + description: AppID + type: integer + type: object + proto.StatDataDetail: + properties: + childRebate: + description: 子渠道返佣 + type: integer + directCount: + description: 新增总量(包含子渠道和渠道本身) + type: integer + directCountChild: + description: 子渠道新增量 + type: integer + directCountSelf: + description: 自身渠道新增量 + type: integer + income: + description: 收益(自身+子渠道) + type: integer + incomeChild: + description: 子渠道的收益 + type: integer + incomeSelf: + description: 自身渠道的收益 + type: integer + recharge: + description: 充值金额(包含子渠道和渠道本身) + type: integer + rechargeChild: + description: 来自子渠道充值金额 + type: integer + rechargeSelf: + description: 来自自身渠道充值金额 + type: integer + visitCount: + description: 访问总量(包含子渠道和渠道本身) + type: integer + type: object + proto.StatDataSimple: + properties: + directCount: + description: 新增总量(包含子渠道和渠道本身) + type: integer + income: + description: 收益(自身+子渠道) + type: integer + recharge: + description: 充值金额(包含子渠道和渠道本身) + type: integer + visitCount: + description: 访问总量(包含子渠道和渠道本身) + type: integer + type: object + proto.TfInfo: + properties: + BackUrl: + description: 企业签URL + type: string + appIcon: + description: 应用图标 + type: string + appName: + description: 应用名称 + type: string + url: + description: URL + type: string + type: object + proto.TgMsgType: + enum: + - 0 + - 1 + type: integer + x-enum-comments: + TgMsgTypeBackendRechargeMonitor: 后台充值监控 + x-enum-varnames: + - TgMsgTypeNone + - TgMsgTypeBackendRechargeMonitor + proto.UpdateActivityReq: + properties: + background: + description: 背景图 + type: string + banner: + description: banner列表 + items: + $ref: '#/definitions/activitymod.BannerInfo' + type: array + desc: + description: 活动描述 + type: string + enable: + description: 活动开关 + type: boolean + endTime: + description: 活动结束时间 + type: string + giftDesc: + description: 奖励说明 + type: string + h5Domain: + description: 活动H5地址 + type: string + id: + description: 唯一ID + type: string + name: + description: 活动名称 + type: string + sortCode: + description: 排序号 + type: integer + startTime: + description: 活动开始时间 + type: string + updatedAt: + type: string + required: + - id + type: object + proto.UpdateAdminReq: + properties: + account: + description: 用户名 + type: string + blocRole: + description: 角色 + type: integer + merchantId: + description: 商人id + type: string + name: + description: 名称 + type: string + password: + description: 密码 + type: string + roleId: + description: 角色id + type: integer + status: + description: 状态 + type: integer + required: + - account + type: object + proto.UpdateAdsLocReq: + properties: + appId: + description: 应用id + type: integer + id: + description: id + type: integer + imgSizeDesc: + description: 图片尺寸描述 + type: string + locId: + description: 位置id + type: integer + name: + description: 位置名称 + type: string + remark: + description: 备注 + type: string + required: + - id + type: object + proto.UpdateAdsReq: + properties: + ambientColor: + description: 氛围色 + type: string + appId: + description: 应用id + type: integer + coverImg: + description: 封面 + type: string + endTime: + description: 结束时间 + type: string + id: + description: 广告id + type: integer + isActive: + description: 是否激活 + type: boolean + jumpType: + allOf: + - $ref: '#/definitions/advertiseMod.JumpType' + description: 跳转方式 0:外部浏览器跳转 1:内部浏览器跳转 2:app内部跳转 + links: + description: 链接地址 + items: + $ref: '#/definitions/proto.LinkInfo' + type: array + locId: + description: 位置 + type: integer + remark: + type: string + sort: + description: 排序值--优先级 + type: integer + startTime: + description: 开始时间s + type: string + tags: + description: 广告标签 + type: string + title: + description: 广告标题 + type: string + visibleChannels: + description: 可见的渠道,可输入多个渠道,用英文逗号","分隔开 + type: string + type: object + proto.UpdateAnnounReq: + properties: + active: + description: 是否激活 + type: boolean + appId: + description: 应用id + type: integer + content: + description: 公告内容 + type: string + cover: + description: 公告封面图 + type: string + endTime: + description: 公告结束时间 + type: string + href: + description: 公告跳转地址 + type: string + id: + description: 公告id + type: string + startTime: + description: 公告开始时间 + type: string + title: + description: 公告标题 + type: string + type: + description: 公告类型 0,外部连接;1,直接安装app + type: integer + required: + - id + type: object + proto.UpdateAppInfoReq: + properties: + advertiseNewNum: + description: 广告新增系数 + type: integer + advertiseNum: + description: 广告系数 + type: integer + appId: + description: appId,唯一id + type: integer + iconImg: + description: 应用图标 + type: string + landPages: + description: 落地页列表 + items: + type: string + type: array + name: + description: app名称 + type: string + required: + - appId + type: object + proto.UpdateAppLocReq: + properties: + appId: + description: 应用id + type: integer + id: + description: id + type: integer + imgSizeDesc: + description: 图片尺寸描述 + type: string + locId: + description: 位置id + type: integer + name: + description: 位置名称 + type: string + remark: + description: 备注 + type: string + required: + - id + type: object + proto.UpdateDomainInfoReq: + properties: + id: + type: string + update: + $ref: '#/definitions/domainmod.DomainDoc' + required: + - id + type: object + proto.UpdateGiftReq: + properties: + actId: + description: 所属活动的ID + type: string + actName: + description: 所属活动的名称 + type: string + giftDesc: + description: 奖品描述 + type: string + giftName: + description: 奖品名称 + type: string + id: + description: 奖品唯一ID + type: string + rate: + description: 中奖率 + type: integer + sort: + description: 排序 + type: integer + updatedAt: + type: string + required: + - actId + - id + type: object + proto.UpdateLandingPageReq: + properties: + channelCode: + description: 渠道码 + type: string + id: + description: Id + type: integer + remark: + description: 备注 + type: string + status: + description: 状态 默认true + type: boolean + type: + description: 类型 1:渠道 2:分享 + type: integer + url: + description: Url + type: string + required: + - id + - type + type: object + proto.UpdateLotteryCodeReq: + properties: + lotteryCodeId: + description: 抽奖码Id + type: string + mark: + description: 备注 + type: string + required: + - lotteryCodeId + type: object + proto.UpdateRoleReq: + properties: + authJson: + description: 权限json数据 + type: string + role: + description: 角色 + type: string + roleId: + description: id + type: integer + required: + - roleId + type: object + proto.UserInfoSearch: + properties: + appId: + description: 渠道对应的appId + type: integer + channel: + description: 渠道 + type: string + end: + description: 结束时间 + type: string + id: + description: 用户ID + type: integer + ip: + description: IP + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + start: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + proto.VersionAddReq: + properties: + appId: + description: APPID + type: integer + backLink: + description: 企业签 + type: string + info: + description: 版本描述 + type: string + isForceUpdate: + description: 是否强更 + type: boolean + link: + description: 下载链接 + items: + type: string + type: array + md5: + description: MD5验证 + type: string + minVersion: + description: 最小版本 + type: string + packageType: + allOf: + - $ref: '#/definitions/versionMod.PkgType' + description: 包类型:1-企业包、2-商店包、3-tf包(下拉框) + size: + description: 更新版本大小M + type: string + status: + description: 是否启用 + type: boolean + terminal: + description: 终端 ios android(安卓,苹果下拉框选择) + type: string + versionNum: + description: 版本号 + type: string + required: + - appId + - link + - packageType + - terminal + - versionNum + type: object + proto.VersionDelReq: + properties: + id: + description: 版本ID + type: integer + required: + - id + type: object + proto.VersionInfo: + properties: + appId: + description: APPID + type: integer + appname: + description: APP名称 + type: string + backLink: + description: 企业签(备用连接) + type: string + id: + description: ID + type: integer + info: + description: 版本描述 + type: string + isForceUpdate: + description: 是否强更 + type: boolean + link: + description: 下载链接 + items: + type: string + type: array + md5: + description: MD5验证 + type: string + minVersion: + description: 最小版本 + type: string + packageType: + allOf: + - $ref: '#/definitions/versionMod.PkgType' + description: 包类型:1-企业包、2-商店包、3-tf、4-超级签 + size: + description: 更新版本大小M + type: string + status: + description: 是否启用 + type: boolean + terminal: + description: 终端ios android + type: string + versionNum: + description: 版本号 + type: string + type: object + proto.VersionListResp: + properties: + count: + description: 总条数 + type: integer + data: + description: 数据 + items: + $ref: '#/definitions/proto.VersionInfo' + type: array + type: object + proto.VersionUpdateReq: + properties: + appId: + description: APPID + type: integer + backLink: + description: 企业签 + type: string + id: + description: ID + type: integer + info: + description: 版本描述 + type: string + isForceUpdate: + description: 是否强更 + type: boolean + link: + description: 下载链接 + items: + type: string + type: array + md5: + description: MD5验证 + type: string + minVersion: + description: 最小版本 + type: string + packageType: + allOf: + - $ref: '#/definitions/versionMod.PkgType' + description: 包类型:1-企业包、2-商店包、3-tf + size: + description: 更新版本大小M + type: string + status: + description: 是否启用 + type: boolean + terminal: + description: 终端ios android + type: string + versionNum: + description: 版本号 + type: string + required: + - id + type: object + proxy.BaseInfo: + properties: + actors: + description: 演员 + items: + type: string + type: array + addedTime: + description: 上架时间 + type: string + bango: + description: 番号,唯一 + type: string + checkSum: + description: md5校验码 + type: string + country: + description: 国家 (国产、日本、欧美.... 前端固定) + type: string + coverImg: + description: 封面 + items: + type: string + type: array + desc: + description: 详细描述 + type: string + director: + description: 导演 + items: + type: string + type: array + filename: + description: 文件名称 + type: string + firstTag: + description: 一级标签 + type: string + id: + type: string + preFileName: + description: 预览文件 + type: string + preview: + description: '预览普通视频:1:预览 2:' + type: integer + publish: + description: 视频发布者 + type: string + remark: + description: 备注 + type: string + secondTags: + description: 二级标签标签 + items: + type: string + type: array + size: + description: 文件size,单位byte + type: integer + status: + description: 当前状态 + type: string + studio: + description: 工作室 + type: string + title: + description: 标题 + type: string + type: + description: 视频:长视频/短视频--时间阈值 + type: string + uploadTime: + description: 上传时间 + type: string + via: + description: 来源 + type: string + videTime: + description: 影片时长 + type: integer + type: object + proxy.MediaSearchReq: + properties: + pageNum: + type: integer + pageSize: + type: integer + param: + $ref: '#/definitions/proxy.VideoSearch' + type: object + proxy.MediaSearchResp: + properties: + list: + items: + $ref: '#/definitions/proxy.BaseInfo' + type: array + total: + type: integer + type: object + proxy.MediasDelReq: + properties: + id: + items: + type: string + type: array + type: object + proxy.MediasDelResp: + type: object + proxy.MediasUpdateReq: + properties: + actors: + description: 演员 + items: + type: string + type: array + addedTime: + description: 上架时间 + type: string + bango: + description: 番号,唯一 + type: string + country: + description: 国家 (国产、日本、欧美.... 前端固定) + type: string + coverImg: + description: 封面 + items: + type: string + type: array + desc: + description: 详细描述 + type: string + director: + description: 导演 + items: + type: string + type: array + firstTag: + description: 一级标签 + type: string + id: + type: string + preFileName: + description: 预览文件 + type: string + preview: + description: 预览:1:预览 2:普通视频 + type: integer + publish: + description: 视频发布者 + type: string + remark: + description: 备注 + type: string + secondTags: + description: 二级标签标签 + items: + type: string + type: array + status: + description: 当前状态 + type: string + studio: + description: 工作室 + type: string + title: + description: 标题 + type: string + type: + description: 视频:长视频/短视频--时间阈值 + type: string + uploadTime: + description: 上传时间 + type: string + via: + description: 来源 + type: string + type: object + proxy.MediasUpdateResp: + type: object + proxy.UploadVideoBodyResp: + properties: + id: + description: 文件服返回的上传文件Id + type: string + videoUri: + description: 文件服返回的视频uri + type: string + type: object + proxy.VideoSearch: + properties: + actors: + description: 演员 + items: + type: string + type: array + addedTime: + description: 上架时间 + type: string + bango: + description: 番号,唯一 + type: string + country: + description: 国家 (国产、日本、欧美.... 前端固定) + type: string + director: + description: 导演 + items: + type: string + type: array + end: + description: 结束时间 + type: string + firstTag: + description: 一级标签 + type: string + id: + type: string + preview: + description: 预览:1:预览 2:普通视频 + type: integer + publish: + description: 视频发布者 + type: string + remark: + description: 备注 + type: string + secondTags: + description: 二级标签标签 + items: + type: string + type: array + start: + description: 开始时间 + type: string + status: + description: 当前状态 + type: string + studio: + description: 工作室 + type: string + title: + description: 标题 + type: string + type: + description: 视频:长视频/短视频--时间阈值 + type: string + uploadTime: + description: 上传时间 + type: string + via: + description: 来源 + type: string + type: object + registermod.RegisterMod: + properties: + appId: + description: appID + type: integer + blocDeduction: + description: 集团扣量(特定渠道扣量) + type: boolean + createdAt: + description: 创建时间 + type: string + dc: + description: 渠道码 + type: string + devType: + description: 设备类型 + type: string + districtCode: + description: 渠道码 + type: string + formalTime: + description: 成为正式用户的时间(针对h5和light) + type: string + ip: + description: IP + type: string + isDeduction: + description: true:CPA扣量用户 + type: boolean + isDirect: + description: true:是直推用户 + type: boolean + isFormal: + description: 是否正式用户(针对h5和light) + type: boolean + mobile: + description: 手机号 + type: string + name: + description: 名称 + type: string + parentPromCode: + description: 邀请人推广码 + type: string + promCode: + description: 用户推广序列 + type: string + registerTime: + description: 操作时间 + type: string + sysType: + description: 操作系统类型 安卓 IOS + type: string + userId: + description: 用户ID + type: integer + type: object + srv_appcategory.AppCategoryDelReq: + properties: + id: + type: integer + type: object + srv_appcategory.AppCategorySearch: + properties: + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + parentAppId: + type: integer + required: + - pageNum + - pageSize + type: object + srv_appcategory.AppCategorySearchResp: + properties: + list: + items: + $ref: '#/definitions/appcategory.AppCategory' + type: array + total: + type: integer + type: object + srv_appcategory.AppCategoryUpdate: + properties: + desc: + description: 描述 + type: string + imgType: + description: 图片展示类型 0:应用图标 1.小图标 2.大图标 + type: integer + name: + description: 名称 + type: string + parentAppId: + type: integer + rank: + description: 应用排序 + type: integer + status: + description: 状态 + type: boolean + updatedAt: + description: 更新时间 + type: string + type: object + srv_appcategory.AppCategoryUpdateReq: + properties: + id: + type: integer + param: + allOf: + - $ref: '#/definitions/srv_appcategory.AppCategoryUpdate' + description: 参数 + type: object + srv_applicationstat.AppStatInfo: + properties: + appName: + description: 应用名称 + type: string + applicationDbId: + description: 应用ID + type: string + createdAt: + description: 创建时间 + type: string + hourData: + description: 小时数据 + items: + type: integer + type: array + id: + type: string + parentAppId: + description: 所属应用ID + type: integer + sumDate: + description: 记录时间 + type: string + total: + description: 当日点击 + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + srv_applicationstat.AppStatSummary: + properties: + totalClick: + description: 总点击 + type: integer + type: object + srv_applicationstat.AppStatTotalInfo: + properties: + appName: + description: 应用名称 + type: string + id: + description: 应用ID + type: string + parentAppId: + description: 所属应用ID + type: integer + total: + description: 总次数 + type: integer + type: object + srv_applicationstat.GetApplicationStatReq: + properties: + applicationId: + description: 应用ID + type: string + applicationName: + description: 应用名称 + type: string + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + parentAppId: + description: 所属应用ID + items: + type: integer + type: array + start: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + srv_applicationstat.GetApplicationStatResp: + properties: + list: + items: + $ref: '#/definitions/srv_applicationstat.AppStatInfo' + type: array + summary: + $ref: '#/definitions/srv_applicationstat.AppStatSummary' + total: + type: integer + type: object + srv_applicationstat.GetApplicationStatTotalReq: + properties: + applicationId: + description: 应用ID + type: string + applicationName: + description: 应用名称 + type: string + end: + description: 结束时间 + type: string + pageNum: + description: 页数 + type: integer + pageSize: + description: 条数 + type: integer + parentAppId: + description: 所属应用ID + items: + type: integer + type: array + start: + description: 开始时间 + type: string + required: + - pageNum + - pageSize + type: object + srv_applicationstat.GetApplicationStatTotalResp: + properties: + list: + items: + $ref: '#/definitions/srv_applicationstat.AppStatTotalInfo' + type: array + summary: + $ref: '#/definitions/srv_applicationstat.AppStatSummary' + total: + type: integer + type: object + stat_models_channelmod.AppType: + enum: + - 0 + - 1 + - 2 + - 3 + type: integer + x-enum-comments: + AppTypeH5: H5网页 + AppTypeLight: 轻量版 + AppTypeNone: 所有 + AppTypePkg: 安装包 + x-enum-varnames: + - AppTypeNone + - AppTypePkg + - AppTypeLight + - AppTypeH5 + stat_models_channelmod.ChannelDeductionRule: + properties: + appId: + description: 应用ID + type: integer + appName: + description: 应用名称 + type: string + appType: + allOf: + - $ref: '#/definitions/stat_models_channelmod.AppType' + description: 应用类型 + autoDeduction: + description: 自动扣量开关 + type: boolean + channel: + description: 渠道 + type: string + cpaPrice: + description: 单价 + type: integer + cpsBegin: + description: CPS 开始扣量金额 + type: integer + cpsDeductionRate: + description: CPS 扣量比例 + type: integer + cpsRate: + description: CPS 分成比列 0-100 + type: integer + createdAt: + description: 创建时间 + type: string + deductionAt: + description: 扣量开始时间 + type: string + divideRate: + description: 代理分成比例 + type: integer + fifth: + description: 5阶 + type: integer + first: + description: 一阶 + type: integer + fourth: + description: 四阶 + type: integer + id: + description: ID + type: string + landingPage: + description: 落地页 + type: string + lessIncomeRate: + description: 最低收益比 CPA低于该值开启扣量(0.1 - 3.0) + type: number + promoteMode: + allOf: + - $ref: '#/definitions/stat_models_channelmod.PromoteMode' + description: 推广类型 + proxyDeduction: + description: 代理扣量比例 + type: integer + second: + description: 二阶 + type: integer + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + settlementTime: + description: 扣量结算时间 + type: string + third: + description: 三阶 + type: integer + todayDeduction: + description: 当日扣量金额 + type: integer + todayTime: + description: 当日时间 + type: string + updatedAt: + description: 更新时间 + type: string + type: object + stat_models_channelmod.ChannelInfo: + properties: + appIds: + description: 渠道对应的app + items: + type: integer + type: array + autoGenApk: + description: 自动生成渠道包 + type: boolean + channel: + description: 渠道 + type: string + checkTokenTime: + description: 检查Token的时间 + type: string + childCount: + description: 子渠道数量 + type: integer + childShowDivideRate: + description: 下级是否显示分成比例 + type: boolean + createdAt: + description: 创建时间 + type: string + id: + description: ID + type: string + ip: + description: ip + type: string + lock: + description: 禁止登陆 + type: boolean + mobile: + description: 手机号 + type: string + parentAgent: + description: 父代理 (从二级的子代理开始用ParentAgent描述父子关系) + type: string + parentChannel: + description: 父渠道 如果为空字符串,则为渠道,否则为代理 + type: string + password: + description: 代理商密码 + type: string + remark: + description: 备注 + type: string + showMagic: + description: 正常显示数据 n>0 展示空白数据 + type: integer + status: + description: 状态 开/关 + type: boolean + token: + description: token + type: string + type: + allOf: + - $ref: '#/definitions/stat_models_channelmod.ChannelType' + description: 渠道类型:1 一级 2:二级 + updatedAt: + description: 更新时间 + type: string + userName: + description: 所有者 + type: string + wallet: + allOf: + - $ref: '#/definitions/stat_models_channelmod.Wallet' + description: 钱包地址 + type: object + stat_models_channelmod.ChannelOwnerChange: + properties: + channel: + description: 渠道 + type: string + createdAt: + description: 创建时间 + type: string + id: + description: ID + type: string + mark: + description: 备注 + type: string + newUser: + description: 变更后的所有者 + type: string + oldUser: + description: 变更前的所有者 + type: string + updatedAt: + description: 更新时间 + type: string + type: object + stat_models_channelmod.ChannelSettlement: + properties: + androidAmount: + description: +安卓充值金额 + type: integer + androidAmountCount: + description: +安卓充值次数 + type: integer + androidVisitCount: + description: android访问 + type: integer + appId: + description: appId + type: integer + appType: + allOf: + - $ref: '#/definitions/stat_models_channelmod.AppType' + description: 应用类型 + channel: + description: 渠道 + type: string + createdAt: + description: 创建时间 + type: string + deductionAmount: + description: 充值扣量 + type: integer + deductionAmountCount: + description: 充值扣量次数 + type: integer + directAmount: + description: 直推充值金额 + type: integer + directAmountCount: + description: 直推充值订单数 + type: integer + directVisitCount: + description: 直推访问数 + type: integer + fissionAmount: + description: 裂变充值金额 + type: integer + fissionAmountCount: + description: 裂变充值订单数 + type: integer + fissionVisitCount: + description: 裂变访问数 + type: integer + gameRechageAmount: + description: 游戏充值 + type: integer + gameWithdrawAmount: + description: 游戏提现 + type: integer + h5Amount: + description: +H5充值金额 + type: integer + h5AmountCount: + description: +H5充值次数 + type: integer + h5AndroidVisitCount: + description: h5安卓访问 + type: integer + h5IosVisitCount: + description: h5苹果访问 + type: integer + h5PcVisitCount: + description: h5电脑访问 + type: integer + h5VisitCount: + description: h5访问 + type: integer + id: + description: ID + type: string + iosAmount: + description: +Ios充值金额 + type: integer + iosAmountCount: + description: +Ios充值次数 + type: integer + iosVisitCount: + description: ios访问 + type: integer + landPageVisitCount: + description: 落地页访问 + type: integer + landpageAndroidClick: + description: 落地页android访问次数 + type: integer + landpageIosAppstoreClick: + description: 落地页iOS商店包访问次数 + type: integer + landpageIosAthorClick: + description: 落地页iOS其他包访问次数 + type: integer + landpageIosH5Click: + description: 落地页H5访问次数 + type: integer + lightAmount: + description: light充值金额 + type: integer + lightAmountCount: + description: light充值次数 + type: integer + lightDeductionAmount: + description: light充值金额扣量 + type: integer + lightDeductionAmountCount: + description: light充值次数扣量 + type: integer + lightDirectAmount: + description: light充值金额直推 + type: integer + lightDirectAmountCount: + description: light充值次数直推 + type: integer + lightFissionAmount: + description: light充值金额裂变 + type: integer + lightFissionAmountCount: + description: light充值次数裂变 + type: integer + lightNaturalAmount: + description: light充值金额自然 + type: integer + lightNaturalAmountCount: + description: light充值次数自然 + type: integer + lightVisitCount: + description: '**轻量访问' + type: integer + lightVisitDeductionCount: + description: light访问量扣量 + type: integer + lightVisitDirectCount: + description: light访问量直推 + type: integer + lightVisitFissionCount: + description: light访问量裂变 + type: integer + lightVisitNaturalCount: + description: light访问量自然 + type: integer + naturalAmount: + description: 自然充值 + type: integer + naturalAmountCount: + description: 自然充值订单数 + type: integer + newAndroidCount: + description: android新增 + type: integer + newAndroidDeductionCount: + description: 新增安卓扣量 + type: integer + newAndroidDirectCount: + description: 新增安卓直推 + type: integer + newAndroidFissionCount: + description: 新增安卓裂变 + type: integer + newDeductionCount: + description: 新增扣量 + type: integer + newDirectCount: + description: 新增直推 + type: integer + newFissionCount: + description: 新增裂变 + type: integer + newH5AndroidCount: + description: h5安卓新增 + type: integer + newH5Count: + description: h5新增安装 + type: integer + newH5DeductionCount: + description: 新增H5扣量 + type: integer + newH5DirectCount: + description: 新增H5直推 + type: integer + newH5FissionCount: + description: 新增H5裂变 + type: integer + newH5FormalCount: + description: h5注册新增 + type: integer + newH5FormalDeductionCount: + description: 新增H5正式扣量 + type: integer + newH5FormalDirectCount: + description: 新增H5正式直推 + type: integer + newH5FormalFissionCount: + description: 新增H5正式裂变 + type: integer + newH5IosCount: + description: h5苹果新增 + type: integer + newH5PcCount: + description: h5电脑新增 + type: integer + newIosCount: + description: ios新增 + type: integer + newIosDeductionCount: + description: 新增IOS扣量 + type: integer + newIosDirectCount: + description: 新增IOS直推 + type: integer + newIosFissionCount: + description: 新增IOS裂变 + type: integer + newLightCount: + description: light新增 + type: integer + newLightDeductionCount: + description: light新增扣量 + type: integer + newLightDirectCount: + description: light新增直推 + type: integer + newLightFissionCount: + description: light新增裂变 + type: integer + newLightFormalCount: + description: '**轻量注册' + type: integer + newLightFormalDeductionCount: + description: 新增LightFormal扣量 + type: integer + newLightFormalDirectCount: + description: 新增LightFormal直推 + type: integer + newLightFormalFissionCount: + description: 新增LightFormal裂变 + type: integer + newLightGuestCount: + description: '**轻量安装' + type: integer + newLightGuestDeductionCount: + description: 新增LightGuest扣量 + type: integer + newLightGuestDirectCount: + description: 新增LightGuest直推 + type: integer + newLightGuestFissionCount: + description: 新增LightGuest裂变 + type: integer + newLightNaturalCount: + description: light自然新增 + type: integer + newRechargeAmount: + description: 其他充值统计 + type: integer + newTotalCount: + description: 新增总量 + type: integer + newTotalIpCount: + description: 注册用户 + type: integer + parentChannel: + description: 父渠道 如果为空字符串,则为渠道,否则为代理 + type: string + promoteMode: + allOf: + - $ref: '#/definitions/stat_models_channelmod.PromoteMode' + description: 推广类型 + sumDate: + description: 记录时间 15分钟对齐 + type: string + totalAmount: + description: 充值统计 + type: integer + totalVisitCount: + description: 访问统计 + type: integer + type: + allOf: + - $ref: '#/definitions/stat_models_channelmod.ChannelType' + description: 渠道类型:1 一级 2:二级 + updatedAt: + description: 时间 + type: string + userName: + description: 所有者 + type: string + validDeductionCount: + description: 有效扣量总数 + type: integer + validDirectCount: + description: 有效直推总数 + type: integer + validPayCoin: + description: 有效收益金币金额 + type: integer + validPayMoney: + description: 有效收益会员金额 + type: integer + vipPayCoin: + description: 金币购买会员数量 + type: integer + vipPayDeduction: + description: 购买会员金额(CPS扣量) + type: integer + vipPayMoney: + description: 购买会员金额(CPS扣量后) + type: integer + type: object + stat_models_channelmod.ChannelStat: + properties: + IncomeAmount: + description: 收益估算 + type: integer + androidAmount: + description: +安卓充值金额 + type: integer + androidAmountCount: + description: +安卓充值次数 + type: integer + androidVisitCount: + description: android访问 + type: integer + appId: + description: appId + type: integer + appType: + allOf: + - $ref: '#/definitions/stat_models_channelmod.AppType' + description: 应用类型 + channel: + description: 渠道 + type: string + cpaPrice: + description: 单价 + type: integer + cpsRate: + description: CPS 分成比列 0-100 + type: integer + createdAt: + description: 创建时间 + type: string + day1RetainRate: + description: 留存率 + type: number + day3RetainRate: + description: 3日留存率 + type: number + day7RetainRate: + description: 7日留存率 + type: number + deductionAmount: + description: 充值扣量 + type: integer + deductionAmountCount: + description: 充值扣量次数 + type: integer + directAmount: + description: 直推充值金额 + type: integer + directAmountCount: + description: 直推充值订单数 + type: integer + directVisitCount: + description: 直推访问数 + type: integer + fissionAmount: + description: 裂变充值金额 + type: integer + fissionAmountCount: + description: 裂变充值订单数 + type: integer + fissionVisitCount: + description: 裂变访问数 + type: integer + gameRechageAmount: + description: 游戏充值 + type: integer + gameWithdrawAmount: + description: 游戏提现 + type: integer + h5Amount: + description: +H5充值金额 + type: integer + h5AmountCount: + description: +H5充值次数 + type: integer + h5AndroidVisitCount: + description: h5安卓访问 + type: integer + h5IosVisitCount: + description: h5苹果访问 + type: integer + h5PcVisitCount: + description: h5电脑访问 + type: integer + h5VisitCount: + description: h5访问 + type: integer + id: + description: ID + type: string + incomeRate: + description: 收益比 + type: number + iosAmount: + description: +Ios充值金额 + type: integer + iosAmountCount: + description: +Ios充值次数 + type: integer + iosVisitCount: + description: ios访问 + type: integer + isPay: + description: 是否已结算 + type: boolean + landPageVisitCount: + description: 落地页访问 + type: integer + landpageAndroidClick: + description: 落地页android访问次数 + type: integer + landpageIosAppstoreClick: + description: 落地页iOS商店包访问次数 + type: integer + landpageIosAthorClick: + description: 落地页iOS其他包访问次数 + type: integer + landpageIosH5Click: + description: 落地页H5访问次数 + type: integer + lightAmount: + description: light充值金额 + type: integer + lightAmountCount: + description: light充值次数 + type: integer + lightDeductionAmount: + description: light充值金额扣量 + type: integer + lightDeductionAmountCount: + description: light充值次数扣量 + type: integer + lightDirectAmount: + description: light充值金额直推 + type: integer + lightDirectAmountCount: + description: light充值次数直推 + type: integer + lightFissionAmount: + description: light充值金额裂变 + type: integer + lightFissionAmountCount: + description: light充值次数裂变 + type: integer + lightNaturalAmount: + description: light充值金额自然 + type: integer + lightNaturalAmountCount: + description: light充值次数自然 + type: integer + lightVisitCount: + description: '**轻量访问' + type: integer + lightVisitDeductionCount: + description: light访问量扣量 + type: integer + lightVisitDirectCount: + description: light访问量直推 + type: integer + lightVisitFissionCount: + description: light访问量裂变 + type: integer + lightVisitNaturalCount: + description: light访问量自然 + type: integer + naturalAmount: + description: 自然充值 + type: integer + naturalAmountCount: + description: 自然充值订单数 + type: integer + newAndroidCount: + description: android新增 + type: integer + newAndroidDeductionCount: + description: 新增安卓扣量 + type: integer + newAndroidDirectCount: + description: 新增安卓直推 + type: integer + newAndroidFissionCount: + description: 新增安卓裂变 + type: integer + newDeductionCount: + description: 新增扣量 + type: integer + newDirectCount: + description: 新增直推 + type: integer + newFissionCount: + description: 新增裂变 + type: integer + newH5AndroidCount: + description: h5安卓新增 + type: integer + newH5Count: + description: h5新增 + type: integer + newH5DeductionCount: + description: 新增H5扣量 + type: integer + newH5DirectCount: + description: 新增H5直推 + type: integer + newH5FissionCount: + description: 新增H5裂变 + type: integer + newH5FormalCount: + description: h5注册新增 + type: integer + newH5FormalDeductionCount: + description: 新增H5正式扣量 + type: integer + newH5FormalDirectCount: + description: 新增H5正式直推 + type: integer + newH5FormalFissionCount: + description: 新增H5正式裂变 + type: integer + newH5IosCount: + description: h5苹果新增 + type: integer + newH5PcCount: + description: h5电脑新增 + type: integer + newIosCount: + description: ios新增 + type: integer + newIosDeductionCount: + description: 新增IOS扣量 + type: integer + newIosDirectCount: + description: 新增IOS直推 + type: integer + newIosFissionCount: + description: 新增IOS裂变 + type: integer + newLightCount: + description: light新增 + type: integer + newLightDeductionCount: + description: light新增扣量 + type: integer + newLightDirectCount: + description: light新增直推 + type: integer + newLightFissionCount: + description: light新增裂变 + type: integer + newLightFormalCount: + description: '**轻量注册' + type: integer + newLightFormalDeductionCount: + description: 新增LightFormal扣量 + type: integer + newLightFormalDirectCount: + description: 新增LightFormal直推 + type: integer + newLightFormalFissionCount: + description: 新增LightFormal裂变 + type: integer + newLightGuestCount: + description: '**轻量安装' + type: integer + newLightGuestDeductionCount: + description: 新增LightGuest扣量 + type: integer + newLightGuestDirectCount: + description: 新增LightGuest直推 + type: integer + newLightGuestFissionCount: + description: 新增LightGuest裂变 + type: integer + newLightNaturalCount: + description: light自然新增 + type: integer + newRechargeAmount: + description: 其他充值 + type: integer + newTotalCount: + description: '**新增总量' + type: integer + newTotalIpCount: + description: 注册 + type: integer + parentChannel: + description: 父渠道 如果为空字符串,则为渠道,否则为代理 + type: string + promoteMode: + allOf: + - $ref: '#/definitions/stat_models_channelmod.PromoteMode' + description: 推广类型 + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + sumDate: + description: 记录时间 15分钟对齐 + type: string + totalAmount: + description: 充值统计 + type: integer + totalVisitCount: + description: 访问 + type: integer + type: + allOf: + - $ref: '#/definitions/stat_models_channelmod.ChannelType' + description: 渠道类型:1 一级 2:二级 + updatedAt: + description: 时间 + type: string + userName: + description: 所有者 + type: string + validDeductionCount: + description: 有效扣量总数 + type: integer + validDirectCount: + description: 收益及结算 + type: integer + validPayCoin: + description: 有效收益金币金额 + type: integer + validPayMoney: + description: 有效收益金额 + type: integer + vipPayCoin: + description: 金币购买会员数量 + type: integer + vipPayDeduction: + description: 购买会员金额(CPS扣量) + type: integer + vipPayMoney: + description: 购买会员金额(CPS扣量后) + type: integer + type: object + stat_models_channelmod.ChannelStatYesterday: + properties: + androidRechargeAmount: + description: android充值金额 + type: integer + appId: + description: appId + type: integer + channel: + description: 渠道 + type: string + createdAt: + description: 创建时间 + type: string + directAmount: + description: 直推充值金额 + type: integer + fissionAmount: + description: 裂变充值金额 + type: integer + h5RechargeAmount: + description: h5充值金额 + type: integer + id: + description: ID + type: string + iosRechargeAmount: + description: ios充值金额 + type: integer + lightRechargeAmount: + description: '**light充值金额' + type: integer + newAndroidCount: + description: android新增 + type: integer + newCount: + description: 注册 + type: integer + newDirectCount: + description: 新增直推 + type: integer + newFissionCount: + description: 新增裂变 + type: integer + newH5Count: + description: h5新增(guest) + type: integer + newH5FormalCount: + description: h5注册新增 + type: integer + newIncreaseCount: + description: 新增增长 + type: integer + newIncreaseRate: + description: 新增增长比例 对比昨天同时段 + type: string + newIosCount: + description: ios新增 + type: integer + newLightFormalCount: + description: 轻量注册 + type: integer + newLightGuestCount: + description: 轻量安装 + type: integer + parentChannel: + description: 父渠道 如果为空字符串,则为渠道,否则为代理 + type: string + rechargeAmount: + description: 充值 + type: integer + rechargeIncreaseAmount: + description: 充值增长 + type: integer + rechargeIncreaseRate: + description: 充值增长比例 对比昨天同时段 + type: string + settlement: + allOf: + - $ref: '#/definitions/stat_models_channelmod.SettlementWay' + description: 结算方式 cps/cpa/cpt/cpc + sumDate: + description: 记录时间 15分钟对齐 + type: string + updatedAt: + description: 更新时间 + type: string + vipPayCoin: + description: 其他充值 + type: integer + vipPayDeduction: + description: 购买会员金额(CPS扣量) + type: integer + vipPayMoney: + description: 购买会员金额(CPS扣量后) + type: integer + type: object + stat_models_channelmod.ChannelType: + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + - 10 + type: integer + x-enum-comments: + ChannelTypeEnd: End + ChannelTypeForth: 四级 + ChannelTypeNone: 无 + ChannelTypeParent: 一级 + ChannelTypeSecond: 二级 + ChannelTypeThird: 三级 + x-enum-varnames: + - ChannelTypeNone + - ChannelTypeParent + - ChannelTypeSecond + - ChannelTypeThird + - ChannelTypeForth + - ChannelTypeEnd + stat_models_channelmod.PromoteMode: + enum: + - 0 + - 1 + - 2 + type: integer + x-enum-comments: + PromoteModeInstall: 安装 + PromoteModeNone: 所有 + PromoteModeRegister: 注册 + x-enum-varnames: + - PromoteModeNone + - PromoteModeInstall + - PromoteModeRegister + stat_models_channelmod.SettlementWay: + enum: + - cpa + - cps + - cpt + - cpc + - hz + type: string + x-enum-comments: + SettlementHZ: 下载站 + x-enum-varnames: + - SettlementCPA + - SettlementCPS + - SettlementCPT + - SettlementCPC + - SettlementHZ + stat_models_channelmod.Wallet: + properties: + addr1: + description: 钱包地址1 + type: string + addr2: + description: 钱包地址2 + type: string + type: object + statutils.DeviceName: + enum: + - android + - ios + - pc + - light + - h5 + - h5_android + - h5_ios + - h5_pc + type: string + x-enum-varnames: + - DeviceNameAndroid + - DeviceNameIos + - DeviceNamePc + - DeviceNameLight + - DeviceNameH5 + - DeviceNameH5Android + - DeviceNameH5Ios + - DeviceNameH5Pc + statutils.Direct: + properties: + natural: + allOf: + - $ref: '#/definitions/statutils.Value' + description: Natural + total: + allOf: + - $ref: '#/definitions/statutils.Value' + description: Total + type: object + statutils.From: + properties: + deduction: + allOf: + - $ref: '#/definitions/statutils.Value' + description: 扣量 + direct: + allOf: + - $ref: '#/definitions/statutils.Direct' + description: '---------------------分类2------------------------' + district: + allOf: + - $ref: '#/definitions/statutils.Value' + description: 渠道 + fission: + allOf: + - $ref: '#/definitions/statutils.Value' + description: 裂变 + normal: + allOf: + - $ref: '#/definitions/statutils.Value' + description: 自来 + share: + allOf: + - $ref: '#/definitions/statutils.Value' + description: 分享 + total: + allOf: + - $ref: '#/definitions/statutils.Value' + description: Total + web: + allOf: + - $ref: '#/definitions/statutils.Value' + description: '---------------------分类1------------------------' + type: object + statutils.Stat: + properties: + android: + allOf: + - $ref: '#/definitions/statutils.From' + description: Android + h5: + allOf: + - $ref: '#/definitions/statutils.StatH5' + description: H5 + ios: + allOf: + - $ref: '#/definitions/statutils.From' + description: IOS + light: + allOf: + - $ref: '#/definitions/statutils.StatLight' + description: Light + total: + allOf: + - $ref: '#/definitions/statutils.From' + description: Total + type: object + statutils.StatH5: + properties: + h5Android: + allOf: + - $ref: '#/definitions/statutils.From' + description: Android + h5Formal: + allOf: + - $ref: '#/definitions/statutils.From' + description: H5正式用户 + h5Guest: + allOf: + - $ref: '#/definitions/statutils.From' + description: 分类2 + h5Ios: + allOf: + - $ref: '#/definitions/statutils.From' + description: H5IOS + h5Pc: + allOf: + - $ref: '#/definitions/statutils.From' + description: 分类1 + total: + allOf: + - $ref: '#/definitions/statutils.From' + description: 总计 + type: object + statutils.StatLight: + properties: + formal: + allOf: + - $ref: '#/definitions/statutils.From' + description: 正式用户 + guest: + allOf: + - $ref: '#/definitions/statutils.From' + description: 分类 + total: + allOf: + - $ref: '#/definitions/statutils.From' + description: 总计 + type: object + statutils.Value: + properties: + count: + description: Count + type: integer + value: + description: Value + type: integer + type: object + versionMod.PkgType: + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + type: integer + x-enum-comments: + Enterprise: 企业签 + Light: H5 + Shop: 商店包 + Super: 超级签 + Tf: testFight + x-enum-varnames: + - _ + - Enterprise + - Shop + - Tf + - Super + - Light +host: localhost:8088 +info: + contact: {} + description: This is a sample server celler server. + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + title: 统计中心 接口文档 + version: "1.0" +paths: + /api/stat/BlocRechargeChannel/list: + post: + consumes: + - application/json + description: 支付渠道统计 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListBlocRechargeChannelReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListBlocRechargeChannelRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 支付渠道统计 + tags: + - 日常统计 + /api/stat/activity/add: + post: + consumes: + - application/json + description: 添加活动 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddActivityReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加活动 + tags: + - 活动管理 + /api/stat/activity/del: + post: + consumes: + - application/json + description: 删除一个活动 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelActivityReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除一个活动 + tags: + - 活动管理 + /api/stat/activity/getgift/del: + post: + consumes: + - application/json + description: 删除一个奖品兑换信息 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelGiftReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除一个奖品兑换信息 + tags: + - 活动管理 + /api/stat/activity/getgift/gen: + post: + consumes: + - application/json + description: 生成奖品兑换码 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.GenGiftCodeRes' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 生成奖品兑换码 + tags: + - 活动管理 + /api/stat/activity/getgift/list: + get: + consumes: + - application/json + description: 奖品兑换详情 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.GetGiftInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.GetGiftInfoResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 奖品兑换详情 + tags: + - 活动管理 + /api/stat/activity/getgift/update: + post: + consumes: + - application/json + description: 更新一个奖品兑换信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateGiftReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个奖品兑换信息 + tags: + - 活动管理 + /api/stat/activity/gift/add: + post: + consumes: + - application/json + description: 添加活动奖励 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddGiftReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加活动奖励 + tags: + - 活动管理 + /api/stat/activity/gift/del: + post: + consumes: + - application/json + description: 删除一个活动奖励 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelGiftReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除一个活动奖励 + tags: + - 活动管理 + /api/stat/activity/gift/list: + get: + consumes: + - application/json + description: 活动奖励列表 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.GiftListReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.GiftListResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 活动奖励列表 + tags: + - 活动管理 + /api/stat/activity/gift/update: + post: + consumes: + - application/json + description: 更新一个活动奖励 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateGiftReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个活动奖励 + tags: + - 活动管理 + /api/stat/activity/h5/draw: + post: + consumes: + - application/json + description: 抽奖 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DrawReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + summary: 抽奖 + tags: + - 活动管理 + /api/stat/activity/h5/giftinfo: + post: + consumes: + - application/json + description: h5页面活动奖品信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ActivityGiftInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ActivityGiftInfoResp' + "400": + description: 失败 + schema: + type: string + summary: h5页面活动奖品信息 + tags: + - 活动管理 + /api/stat/activity/h5/info: + post: + consumes: + - application/json + description: h5页面活动信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ActivityInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ActivityInfoResp' + "400": + description: 失败 + schema: + type: string + summary: h5页面活动信息 + tags: + - 活动管理 + /api/stat/activity/list: + get: + consumes: + - application/json + description: 活动信息列表 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ActivityListReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ActivityListResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 活动信息列表 + tags: + - 活动管理 + /api/stat/activity/lotterycode/del: + post: + consumes: + - application/json + description: 删除活动抽奖码 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelLotteryCodeReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除活动抽奖码 + tags: + - 活动管理 + /api/stat/activity/lotterycode/gen: + post: + consumes: + - application/json + description: 生成活动抽奖码 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.GenLotteryCodeReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 生成活动抽奖码 + tags: + - 活动管理 + /api/stat/activity/lotterycode/list: + post: + consumes: + - application/json + description: 活动抽奖码列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.LotteryCodeListReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.LotteryCodeListResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 活动抽奖码列表 + tags: + - 活动管理 + /api/stat/activity/lotterycode/update: + post: + consumes: + - application/json + description: 修改活动抽奖码 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateLotteryCodeReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 修改活动抽奖码 + tags: + - 活动管理 + /api/stat/activity/update: + post: + consumes: + - application/json + description: 更新一个活动 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateActivityReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个活动 + tags: + - 活动管理 + /api/stat/activity/visit: + post: + consumes: + - application/json + description: 活动访问量 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ActivityVisitCountReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 活动访问量 + tags: + - 活动管理 + /api/stat/activity/visit/list: + get: + consumes: + - application/json + description: 活动访问量 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ActivityVisitCountReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 活动访问量 + tags: + - 活动管理 + /api/stat/admin/add: + post: + consumes: + - application/json + description: 增加管理员 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddAdminReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 增加管理员 + tags: + - 系统管理 + /api/stat/admin/del: + delete: + consumes: + - application/json + description: 删除管理员 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelAdminReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 删除管理员 + tags: + - 系统管理 + /api/stat/admin/list: + post: + consumes: + - application/json + description: 管理员列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AdminListReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AdminListRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 管理员列表 + tags: + - 系统管理 + /api/stat/admin/login: + post: + consumes: + - application/json + description: 传入用户信息登录 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AdminLoginReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + summary: 管理员登录 + tags: + - 系统管理 + /api/stat/admin/update: + post: + consumes: + - application/json + description: 修改管理员 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateAdminReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 修改管理员 + tags: + - 系统管理 + /api/stat/admin/verify: + post: + consumes: + - application/json + description: 谷歌验证 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AdminVerifyReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AdminLoginRes' + "400": + description: 失败 + schema: + type: string + summary: 管理员登录验证 + tags: + - 系统管理 + /api/stat/adminbloc/add: + post: + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddAdminReq' + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + /api/stat/adminbloc/del: + delete: + consumes: + - application/json + description: 删除管理员 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelAdminReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 删除管理员 + tags: + - 系统管理 + /api/stat/adminbloc/list: + post: + consumes: + - application/json + description: 管理员列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AdminListReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AdminListRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 管理员列表 + tags: + - 系统管理 + /api/stat/adminbloc/login: + post: + consumes: + - application/json + description: 传入用户信息登录 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AdminLoginReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + summary: 管理员登录 + tags: + - 系统管理 + /api/stat/adminbloc/update: + post: + consumes: + - application/json + description: 修改管理员 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateAdminReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 修改管理员 + tags: + - 系统管理 + /api/stat/ads/add: + post: + consumes: + - application/json + description: 新增广告信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddAdsReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 新增广告信息 + tags: + - 广告管理 + /api/stat/ads/click: + post: + consumes: + - application/json + description: 广告点击 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AdsClickReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + summary: 广告点击 + tags: + - 广告管理 + /api/stat/ads/del: + post: + consumes: + - application/json + description: 删除广告信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelAdsReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 删除广告信息 + tags: + - 广告管理 + /api/stat/ads/get: + post: + consumes: + - application/json + description: 外部获取广告信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AdvertiseReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AdvertiseRes' + "400": + description: 失败 + schema: + type: string + summary: 外部获取广告信息 + tags: + - 广告管理 + /api/stat/ads/list: + post: + consumes: + - application/json + description: 广告列表 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListAdsReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListAdsRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 广告列表 + tags: + - 广告管理 + /api/stat/ads/stat: + post: + consumes: + - application/json + description: 广告统计 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/advertiseSer.GetAdvertiseStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/advertiseSer.GetAdvertiseStatResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 广告统计 + tags: + - 广告管理 + /api/stat/ads/stattotal: + post: + consumes: + - application/json + description: 广告统计不分时统计 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/advertiseSer.GetAdvertiseTotalStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/advertiseSer.GetAdvertiseTotalStatResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 广告统计不分时统计 + tags: + - 广告管理 + /api/stat/ads/update: + post: + consumes: + - application/json + description: 修改广告信息 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateAdsReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 修改广告信息 + tags: + - 广告管理 + /api/stat/adsLoc/add: + post: + consumes: + - application/json + description: 谷歌验证 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddAdsLocReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 新增广告位置信息 + tags: + - 广告管理 + /api/stat/adsLoc/del: + post: + consumes: + - application/json + description: 删除广告位置信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelAdsLocReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 删除广告位置信息 + tags: + - 广告管理 + /api/stat/adsLoc/list: + post: + consumes: + - application/json + description: 广告位置列表 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListAdsLocReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListAdsLocRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 广告位置列表 + tags: + - 广告管理 + /api/stat/adsLoc/update: + post: + consumes: + - application/json + description: 修改广告位置信息 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateAdsLocReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 修改广告位置信息 + tags: + - 广告管理 + /api/stat/agent/channel/add: + post: + consumes: + - application/json + description: 添加一个子渠道 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AgentChannelInfoAdd' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加一个子渠道 + tags: + - 渠道后台 + /api/stat/agent/channel/applies: + post: + consumes: + - application/json + description: 分组分页获取渠道结算申请表(渠道账号看的) + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.GetApplyFormReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.GetApplyFormResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取渠道结算申请表(渠道账号看的) + tags: + - 渠道结算 + /api/stat/agent/channel/info/update: + post: + consumes: + - application/json + description: 更新渠道信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AgentChannelInfoUpdate' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新渠道信息 + tags: + - 渠道后台 + /api/stat/agent/channel/landpage: + post: + consumes: + - application/json + description: 获取落地页列表 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelAppInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ChannelAppInfoResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取落地页列表 + tags: + - 渠道后台 + /api/stat/agent/channel/list: + post: + consumes: + - application/json + description: 获取渠道列表 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AgentChannelInfoSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AgentChannelInfoSearchResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取渠道列表 + tags: + - 渠道后台 + /api/stat/agent/channel/password/reset: + post: + consumes: + - application/json + description: 重置子渠道密码 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AgentChannelPasswordReset' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 重置子渠道密码 + tags: + - 渠道后台 + /api/stat/agent/channel/password/update: + post: + consumes: + - application/json + description: 修改渠道密码 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AgentChannelPasswordUpdate' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 修改渠道密码 + tags: + - 渠道后台 + /api/stat/agent/channel/rule/update: + post: + consumes: + - application/json + description: 更新渠道规则 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AgentChannelRuleUpdate' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新渠道规则 + tags: + - 渠道后台 + /api/stat/agent/channel/stat: + post: + consumes: + - application/json + description: 获取渠道日常统计Ex + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AgentChannelStatSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AgentChannelStatResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取渠道统计Ex + tags: + - 渠道后台 + /api/stat/agent/imgVerify: + post: + consumes: + - application/json + description: 获取图片验证码 + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AgentImgVerifyCode' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取图片验证码 + tags: + - 渠道后台 + /api/stat/agent/login: + post: + consumes: + - application/json + description: 代理商登陆 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AgentLoginReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AgentLoginRes' + "400": + description: 失败 + schema: + type: string + summary: 代理商登陆 + tags: + - 渠道后台 + /api/stat/agent/summary/child: + post: + consumes: + - application/json + description: 获取子渠道数据汇总 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AgentSummaryStatChildSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AgentSummaryStatChildResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取子渠道数据汇总 + tags: + - 渠道后台 + /api/stat/agent/summary/home: + post: + consumes: + - application/json + description: 获取首页渠道数据汇总 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AgentSummaryStatHomeSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AgentSummaryStatHomeResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取首页渠道数据汇总 + tags: + - 渠道后台 + /api/stat/announce/add: + post: + consumes: + - application/json + description: 新增公告信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddAnnounReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 新增公告信息 + tags: + - 公告管理 + /api/stat/announce/del: + post: + consumes: + - application/json + description: 删除公告信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelAnnounReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 删除公告信息 + tags: + - 公告管理 + /api/stat/announce/get: + post: + consumes: + - application/json + description: 外部获取公告信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AnnouncementReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AnnouncementRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 外部获取公告信息 + tags: + - 公告管理 + /api/stat/announce/list: + post: + consumes: + - application/json + description: 公告列表 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListAnnounReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListAnnounRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 公告列表 + tags: + - 公告管理 + /api/stat/announce/update: + post: + consumes: + - application/json + description: 修改公告信息 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateAnnounReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 修改公告信息 + tags: + - 公告管理 + /api/stat/appInfo/add: + post: + consumes: + - application/json + description: 添加app + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddAppInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 添加app + tags: + - 应用管理 + /api/stat/appInfo/del: + delete: + consumes: + - application/json + description: 删除app + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelAppInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 删除app + tags: + - 应用管理 + /api/stat/appInfo/list: + post: + consumes: + - application/json + description: app列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListAppInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListAppInfoRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: app列表 + tags: + - 应用管理 + /api/stat/appInfo/update: + post: + consumes: + - application/json + description: 修改app + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateAppInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 修改app + tags: + - 应用管理 + /api/stat/appLoc/add: + post: + consumes: + - application/json + description: 谷歌验证 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddAppLocReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 新增广告位置信息 + tags: + - 广告管理 + /api/stat/appLoc/del: + post: + consumes: + - application/json + description: 删除广告位置信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelAppLocReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 删除广告位置信息 + tags: + - 广告管理 + /api/stat/appLoc/list: + post: + consumes: + - application/json + description: 广告位置列表 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListAppLocReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListAppLocRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 广告位置列表 + tags: + - 广告管理 + /api/stat/appLoc/update: + post: + consumes: + - application/json + description: 修改广告位置信息 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateAppLocReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 修改广告位置信息 + tags: + - 广告管理 + /api/stat/authority/add: + post: + consumes: + - application/json + description: 添加角色 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddRoleReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 添加角色 + tags: + - 权限管理 + /api/stat/authority/del: + delete: + consumes: + - application/json + description: 删除角色 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelRoleReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 删除角色 + tags: + - 权限管理 + /api/stat/authority/list: + post: + consumes: + - application/json + description: 权限角色列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.RoleListReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.RoleListRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 权限角色列表 + tags: + - 权限管理 + /api/stat/authority/update: + post: + consumes: + - application/json + description: 修改角色 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateRoleReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 修改角色 + tags: + - 权限管理 + /api/stat/blocBlocWithdrawDetails/list: + post: + consumes: + - application/json + description: 日常统计列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListBlocWithdrawDetailsReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListBlocWithdrawDetailsRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + tags: + - 日常统计 + /api/stat/blocChannelCodeStat/export: + get: + consumes: + - application/json + description: 渠道码统计(集团) + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.BlocListChannelCodeStatReq' + produces: + - application/json + responses: + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 渠道码统计(集团) + tags: + - 渠道码统计 + /api/stat/blocChannelCodeStat/list: + post: + consumes: + - application/json + description: 渠道码统计(集团) + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.BlocListChannelCodeStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.BlocListChannelCodeStatRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 渠道码统计(集团) + tags: + - 渠道码统计 + /api/stat/blocDailyStat/list: + post: + consumes: + - application/json + description: 日常统计列表(集团) + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListBlocDailyStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListBlocDailyStatRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 日常统计列表(集团) + tags: + - 日常统计 + /api/stat/blocDailyStatTotal/list: + post: + consumes: + - application/json + description: 日常统计列表(集团) + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListBlocDailyStatTotalReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListBlocDailyStatTotalRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 日常汇总列表(集团) + tags: + - 日常统计 + /api/stat/blocRechargeDetails/list: + post: + consumes: + - application/json + description: 日常统计列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListBlocRechargeDetailsReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListBlocRechargeDetailsRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + tags: + - 日常统计 + /api/stat/blocRegisterDetails/list: + post: + consumes: + - application/json + description: 日常统计列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListBlocRegisterDetailsReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListBlocRegisterDetailsRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + tags: + - 日常统计 + /api/stat/channelInfo/add: + post: + consumes: + - application/json + description: 添加一个渠道管理 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelInfoAdd' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加一个渠道管理 + tags: + - 渠道管理 + /api/stat/channelInfo/del: + post: + consumes: + - application/json + description: 删除一个渠道管理 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelInfoDelete' + produces: + - application/json + responses: + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除一个渠道管理 + tags: + - 渠道管理 + /api/stat/channelInfo/export: + post: + consumes: + - application/json + description: 分组分页获取渠道列表导出 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelInfoSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ChannelInfoSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取渠道列表导出 + tags: + - 渠道管理 + /api/stat/channelInfo/list: + post: + consumes: + - application/json + description: 分组分页获取渠道管理 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelInfoSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ChannelInfoSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取渠道管理 + tags: + - 渠道管理 + /api/stat/channelInfo/owner/update: + post: + consumes: + - application/json + description: 更新一个渠道管理的所有者 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelOwnerUpdate' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个渠道管理的所有者 + tags: + - 渠道管理 + /api/stat/channelInfo/ownerchange/list: + post: + consumes: + - application/json + description: 渠道所有者变更信息 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelOwnerChangeInfoSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ChannelOwnerChangeInfoSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 渠道所有者变更信息 + tags: + - 渠道管理 + /api/stat/channelInfo/update: + post: + consumes: + - application/json + description: 更新一个渠道管理 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelInfoUpdate' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个渠道管理 + tags: + - 渠道管理 + /api/stat/channelRule/add: + post: + consumes: + - application/json + description: 添加一个渠道管理 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelDeductionRuleAdd' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加一个渠道管理 + tags: + - 渠道管理 + /api/stat/channelRule/del: + post: + consumes: + - application/json + description: 删除一个渠道管理 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelDeductionRuleDelete' + produces: + - application/json + responses: + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除一个渠道管理 + tags: + - 渠道管理 + /api/stat/channelRule/list: + post: + consumes: + - application/json + description: 获取渠道扣量规则列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelDeductionRuleSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ChannelDeductionRuleSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取渠道扣量规则列表 + tags: + - 渠道管理 + /api/stat/channelRule/update: + post: + consumes: + - application/json + description: 更新一个渠道管理 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelDeductionRuleUpdate' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个渠道管理 + tags: + - 渠道管理 + /api/stat/channelSettlement/list: + post: + consumes: + - application/json + description: 分组分页获取渠道结算表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelSettlementSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ChannelSettlementSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取渠道结算表 + tags: + - 渠道管理 + /api/stat/channelStat/compare/list: + post: + consumes: + - application/json + description: 渠道同时段对比 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SearchChannelStatComparedReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.SearchChannelStatComparedResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 渠道同时段对比 + tags: + - 渠道同时段对比 + /api/stat/channelStat/list: + post: + consumes: + - application/json + description: 获取渠道统计列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelStatSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ChannelStatSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取渠道统计列表 + tags: + - 渠道管理 + /api/stat/channelStat/settlement/list: + post: + consumes: + - application/json + description: 获取渠道统计信息 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelStatSettlementSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ChannelStatSettlementSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取渠道统计信息 + tags: + - 渠道结算 + /api/stat/channelStat/settlement/v2/calc: + post: + consumes: + - application/json + description: 对结算页用户选择的结算项目进行计算 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementCalcReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.SettlementCalcResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 对结算页用户选择的结算项目进行计算 + tags: + - 渠道结算 + /api/stat/channelStat/settlement/v2/list: + post: + consumes: + - application/json + description: 获取渠道统计信息v2 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelStatSettlementSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ChannelStatSettlementSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取渠道统计信息v2 + tags: + - 渠道结算 + /api/stat/dailyStat/export: + post: + consumes: + - application/json + description: 日常统计列表导出 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListDailyStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListDailyStatRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 日常统计列表导出 + tags: + - 日常统计 + /api/stat/dailyStat/list: + post: + consumes: + - application/json + description: 日常统计列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListDailyStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListDailyStatRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 日常统计列表 + tags: + - 日常统计 + /api/stat/dailyhour/export: + post: + consumes: + - application/json + description: 日常统计导出 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListDailyHourStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListDailyHourStatRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 日常统计导出 + tags: + - 日常统计 + /api/stat/dailyhour/list: + post: + consumes: + - application/json + description: 日常统计列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListDailyHourStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListDailyHourStatRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 日常统计列表 + tags: + - 日常统计 + /api/stat/domain/add: + post: + consumes: + - application/json + description: 添加域名 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddDomainInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 添加域名 + tags: + - 域名管理 + /api/stat/domain/del: + delete: + consumes: + - application/json + description: 删除域名 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelDomainInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 删除域名 + tags: + - 域名管理 + /api/stat/domain/list: + post: + consumes: + - application/json + description: 域名列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListDomainInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListDomainInfoRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 域名列表 + tags: + - 域名管理 + /api/stat/domain/update: + post: + consumes: + - application/json + description: 修改域名 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateDomainInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 修改域名 + tags: + - 域名管理 + /api/stat/file/upload: + post: + consumes: + - application/json + description: 文件上传 + parameters: + - description: 文件数据 + in: formData + name: file + required: true + type: file + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 文件上传 + tags: + - 文件上传 + /api/stat/game/recharge/list: + post: + consumes: + - application/json + description: 日常统计列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListBlocRechargeDetailsReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListBlocRechargeDetailsRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + tags: + - 日常统计 + /api/stat/game/withdraw/list: + post: + consumes: + - application/json + description: 提现列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListBlocWithdrawDetailsReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListBlocWithdrawDetailsRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 提现列表 + tags: + - 游戏统计 + /api/stat/hourStat/list: + post: + consumes: + - application/json + description: 曲线图列表数据 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListHourStatLineReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListHourStatLineResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 曲线图列表数据 + tags: + - 主后台首页曲线图 + /api/stat/inner/appDownload: + post: + consumes: + - application/json + description: 请求APP下载链接 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.PageButtonClickReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.PageButtonClickResp' + "400": + description: 失败 + schema: + type: string + summary: 请求APP下载链接 + tags: + - 服务器数据同步 + /api/stat/inner/appList: + post: + consumes: + - application/json + description: 获取服务器的app列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListAppInfoReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListAppInfoRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 获取服务器的app列表 + tags: + - 服务器数据同步 + /api/stat/inner/botMonthStat: + post: + consumes: + - application/json + description: 请求机器人月数据列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.BotMonthStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.BotMonthStatResp' + "400": + description: 失败 + schema: + type: string + summary: 请求机器人月数据列表 + tags: + - 服务器数据同步 + /api/stat/inner/botStatList: + post: + consumes: + - application/json + description: 请求机器人日时数据列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.BotDailyHourListReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.BotDailyHourListResp' + "400": + description: 失败 + schema: + type: string + summary: 请求机器人日时数据列表 + tags: + - 服务器数据同步 + /api/stat/inner/recharge/list: + post: + consumes: + - application/json + description: 请求别的服务器充值数据 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.InnerRechargeReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.PageButtonClickResp' + "400": + description: 失败 + schema: + type: string + summary: 请求别的服务器充值数据 + tags: + - 服务器数据同步 + /api/stat/inner/rechargebotcmd/list: + post: + consumes: + - application/json + description: 请求别的服务器充值数据 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.InnerRechargeReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.PageButtonClickResp' + "400": + description: 失败 + schema: + type: string + summary: 请求别的服务器充值数据 + tags: + - 服务器数据同步 + /api/stat/inner/sendTgMessage: + post: + consumes: + - application/json + description: 发送TG消息 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SendTgMessageReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.SendTgMessageRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 发送TG消息 + tags: + - 服务器数据同步 + /api/stat/landPage/daily/list: + post: + consumes: + - application/json + description: 落地页每日统计 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListDailyStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListLandPageStatRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 落地页每日统计 + tags: + - 日常统计 + /api/stat/landPage/hour/list: + post: + consumes: + - application/json + description: 落地页小时统计 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListDailyHourStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListLandPageStatRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 落地页小时统计 + tags: + - 日常统计 + /api/stat/landPage/summary/downTotal/list: + post: + consumes: + - application/json + description: 落地下载数统计 + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListDownloadSummaryRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 落地页下载数统计 + tags: + - 日常统计 + /api/stat/landPageConfig/add: + post: + consumes: + - application/json + description: 添加落地页配置 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddLandPageConfigReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加落地页配置 + tags: + - 落地页配置 + /api/stat/landPageConfig/del: + post: + consumes: + - application/json + description: 删除落地页配置 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelLandPageConfigReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除落地页配置 + tags: + - 落地页配置 + /api/stat/landPageConfig/getByType: + post: + consumes: + - application/json + description: 根据类型获取落地页配置 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.GetLandPageConfigByTypeReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + items: + $ref: '#/definitions/proto.LandingPageConfig' + type: array + "400": + description: 失败 + schema: + type: string + summary: 根据类型获取落地页配置 + tags: + - 落地页配置 + /api/stat/landPageConfig/list: + post: + consumes: + - application/json + description: 落地页配置列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.FindLandPageConfigReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.LandPageConfigListResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 落地页配置列表 + tags: + - 落地页配置 + /api/stat/landPageConfig/update: + post: + consumes: + - application/json + description: 修改落地页配置 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/landPageConfig.LandPageConfig' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 修改落地页配置 + tags: + - 落地页配置 + /api/stat/landingPage/add: + post: + consumes: + - application/json + description: 添加落地页 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.AddLandingPageReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 添加落地页 + tags: + - 落地页 + /api/stat/landingPage/del: + delete: + consumes: + - application/json + description: 删除落地页 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelLandingPageReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 删除落地页 + tags: + - 落地页 + /api/stat/landingPage/list: + post: + consumes: + - application/json + description: 落地页列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.FindLandingPageReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.LandingPageListRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 落地页列表 + tags: + - 落地页 + /api/stat/landingPage/update: + post: + consumes: + - application/json + description: 修改落地页 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UpdateLandingPageReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 修改落地页 + tags: + - 落地页 + /api/stat/landpage/picture/del: + post: + consumes: + - application/json + description: 删除一个落地页资源 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.LandpagePictureDelReq' + produces: + - application/json + responses: + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除一个落地页资源 + tags: + - 落地页资源 + /api/stat/landpage/picture/update: + post: + consumes: + - application/json + description: 更新一个落地页资源 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.LandpagePictureUpdateReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个落地页资源 + tags: + - 落地页资源 + /api/stat/media/delete: + post: + consumes: + - application/json + description: 删除视频列表 + parameters: + - description: 参数列表 + in: body + name: req + required: true + schema: + $ref: '#/definitions/proxy.MediasDelReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proxy.MediasDelResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除视频列表 + tags: + - 视频列表 + /api/stat/media/search: + post: + consumes: + - application/json + description: 获取视频列表 + parameters: + - description: 参数列表 + in: body + name: req + required: true + schema: + $ref: '#/definitions/proxy.MediaSearchReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proxy.MediaSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 根据参数获取视频列表 + tags: + - 视频列表 + /api/stat/media/update: + post: + consumes: + - application/json + description: 更新视频信息 + parameters: + - description: 参数列表 + in: body + name: req + required: true + schema: + $ref: '#/definitions/proxy.MediasUpdateReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proxy.MediasUpdateResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新视频信息 + tags: + - 视频列表 + /api/stat/media/videoBody: + post: + consumes: + - application/json + description: 视频body上传 + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proxy.UploadVideoBodyResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 视频body上传 + tags: + - 视频列表 + /api/stat/media/videoOk: + post: + consumes: + - application/json + description: 视频body上传完成信息调用 + parameters: + - description: 参数列表 + in: body + name: req + required: true + schema: + $ref: '#/definitions/proxy.BaseInfo' + produces: + - application/json + responses: + "200": + description: ok + schema: + type: int + security: + - ApiKeyAuth: [] + summary: 视频body上传完成信息调用 + tags: + - 视频列表 + /api/stat/mediatag/add: + post: + consumes: + - application/json + description: 添加一个视频标签 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.MediaTagAddReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加一个视频标签 + tags: + - 视频标签 + /api/stat/mediatag/del: + post: + consumes: + - application/json + description: 删除一个视频标签 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.MediaTagDelReq' + produces: + - application/json + responses: + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除一个视频标签 + tags: + - 视频标签 + /api/stat/mediatag/list: + post: + consumes: + - application/json + description: 分组分页获取视频标签 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.MediaTagSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.MediaTagSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取视频标签 + tags: + - 视频标签 + /api/stat/mediatag/update: + post: + consumes: + - application/json + description: 更新一个视频标签 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.MediaTagUpdateReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个视频标签 + tags: + - 视频标签 + /api/stat/minuteStat/list: + post: + consumes: + - application/json + description: 曲线图列表数据 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListMinuteStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListMinuteStatRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 曲线图列表数据 + tags: + - 主后台首页曲线图 + /api/stat/monitor/add: + post: + consumes: + - application/json + description: 添加一个应用监控 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.MonitorAddReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加一个应用监控 + tags: + - 应用监控 + /api/stat/monitor/del: + delete: + consumes: + - application/json + description: 删除一个应用监控 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.MonitorDelReq' + produces: + - application/json + responses: + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除一个应用监控 + tags: + - 应用监控 + /api/stat/monitor/list: + post: + consumes: + - application/json + description: 分组分页获取应用监控 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.MonitorSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.MonitorSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取应用监控 + tags: + - 应用监控 + /api/stat/monitor/update: + post: + consumes: + - application/json + description: 更新一个应用监控 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.MonitorUpdateReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个应用监控 + tags: + - 应用监控 + /api/stat/opLog/list: + post: + consumes: + - application/json + description: 操作日志列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ListOpLogReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.ListOpLogRes' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: [] + summary: 操作日志列表 + tags: + - 操作日志 + /api/stat/settlementinfo/add: + post: + consumes: + - application/json + description: 添加一个渠道结算 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementInfoAdd' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加一个渠道结算 + tags: + - 渠道结算 + /api/stat/settlementinfo/applicant/list: + post: + consumes: + - application/json + description: 获取结算申请人名字列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.GetSettlementApplicantListReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.GetSettlementApplicantListResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取结算申请人名字列表 + tags: + - 渠道结算 + /api/stat/settlementinfo/deleted/list: + post: + consumes: + - application/json + description: 分组分页获取渠道结算已删除列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementInfoSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.SettlementInfoSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取渠道结算已删除列表 + tags: + - 渠道结算 + /api/stat/settlementinfo/export: + post: + consumes: + - application/json + description: 分组分页获取渠道结算导出 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementInfoSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.SettlementInfoSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取渠道结算导出 + tags: + - 渠道结算 + /api/stat/settlementinfo/list: + post: + consumes: + - application/json + description: 分组分页获取渠道结算 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementInfoSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.SettlementInfoSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取渠道结算 + tags: + - 渠道结算 + /api/stat/settlementinfo/update: + post: + consumes: + - application/json + description: 更新一个渠道结算 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementInfoUpdate' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个渠道结算 + tags: + - 渠道结算 + /api/stat/settlementinfo/v2/add: + post: + consumes: + - application/json + description: 添加一个渠道结算2 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementInfoAdd' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加一个渠道结算2 + tags: + - 渠道结算 + /api/stat/settlementinfo/v2/del: + post: + consumes: + - application/json + description: 删除一个渠道结算(只有特定状态的结算项可以删除) + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementInfoDelete' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除一个渠道结算项 + tags: + - 渠道结算 + /api/stat/settlementinfo/v2/detail: + post: + consumes: + - application/json + description: 查看渠道结算项的详情 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementInfoDetail' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.SettlementInfoDetailResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 查看渠道结算项的详情 + tags: + - 渠道结算 + /api/stat/settlementinfo/v2/export: + post: + consumes: + - application/json + description: 分组分页获取渠道结算申请表导出 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementInfoSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.SettlementInfoSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取渠道结算申请表导出 + tags: + - 渠道结算 + /api/stat/settlementinfo/v2/update: + post: + consumes: + - application/json + description: 更新一个渠道结算2 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.SettlementInfoUpdate' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个渠道结算2 + tags: + - 渠道结算 + /api/stat/share/list: + post: + description: 下载按钮 + parameters: + - description: 参数页码 + in: body + name: req + required: true + schema: + $ref: '#/definitions/proto.ShareUrlReq' + responses: + "200": + description: ok + schema: + $ref: '#/definitions/proto.PageButtonListResp' + summary: 下载按钮 + tags: + - 落地页 + /api/stat/statadvertise/add: + post: + consumes: + - application/json + description: 添加一个统计数据(广告) + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/dailystatadvertise.DailyStatAdvertise' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加一个统计数据(广告) + tags: + - 统计数据(广告) + /api/stat/statadvertise/del: + post: + consumes: + - application/json + description: 删除一个统计数据(广告) + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/dailystatadvertiseser.DailyStatAdvertiseDelReq' + produces: + - application/json + responses: + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除一个统计数据(广告) + tags: + - 统计数据(广告) + /api/stat/statadvertise/list: + post: + consumes: + - application/json + description: 分组分页获取统计数据(广告) + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/dailystatadvertiseser.DailyStatAdvertiseSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/dailystatadvertiseser.DailyStatAdvertiseSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取统计数据(广告) + tags: + - 统计数据(广告) + /api/stat/statadvertise/update: + post: + consumes: + - application/json + description: 更新一个统计数据(广告) + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/dailystatadvertiseser.DailyStatAdvertiseUpdateReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新一个统计数据(广告) + tags: + - 统计数据(广告) + /api/stat/user/info: + post: + consumes: + - application/json + description: 获取用户信息 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.UserInfoSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/registermod.RegisterMod' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取用户信息 + tags: + - 渠道管理 + /api/stat/version/add: + post: + consumes: + - application/json + description: 版本添加 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.VersionAddReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 版本添加 + tags: + - 版本管理 + /api/stat/version/app: + post: + consumes: + - application/json + description: app获取版本 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.VersionUpdateReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.AppVersionResp' + "400": + description: 失败 + schema: + type: string + summary: App获取版本 + tags: + - 版本管理 + /api/stat/version/bottonclick: + post: + description: 点击下载事件 + parameters: + - description: 参数页码 + in: body + name: req + required: true + schema: + $ref: '#/definitions/proto.PageButtonClickReq' + responses: + "200": + description: ok + schema: + $ref: '#/definitions/proto.PageButtonClickResp' + summary: 点击下载事件 + tags: + - 落地页 + /api/stat/version/bottonlist: + post: + description: 下载按钮 + parameters: + - description: 参数页码 + in: body + name: req + required: true + schema: + $ref: '#/definitions/proto.PageButtonListReq' + responses: + "200": + description: ok + schema: + $ref: '#/definitions/proto.PageButtonListResp' + summary: 下载按钮 + tags: + - 落地页 + /api/stat/version/channel/newLink: + post: + consumes: + - application/json + description: 获取H5下载 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ChannelDownLoadLinkReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 获取H5下载 + tags: + - 落地页 + /api/stat/version/crossbottonclick: + post: + description: 点击下载事件[跨服支持所有app] + parameters: + - description: 参数页码 + in: body + name: req + required: true + schema: + $ref: '#/definitions/proto.PageButtonClickReq' + responses: + "200": + description: ok + schema: + $ref: '#/definitions/proto.PageButtonClickResp' + summary: 点击下载[跨服支持所有app] + tags: + - 落地页 + /api/stat/version/del: + post: + consumes: + - application/json + description: 版本删除 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.VersionDelReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 版本删除 + tags: + - 版本管理 + /api/stat/version/h5/config: + post: + consumes: + - application/json + description: 获取H5下载 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.H5ConfigReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 获取H5下载 + tags: + - 落地页 + /api/stat/version/h5/config/v2: + post: + consumes: + - application/json + description: 获取H5下载 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.H5ConfigReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 获取H5下载 + tags: + - 落地页 + /api/stat/version/list: + post: + consumes: + - application/json + description: 版本列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/common.Page' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.VersionListResp' + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 版本列表 + tags: + - 版本管理 + /api/stat/version/update: + post: + consumes: + - application/json + description: 版本更新 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.VersionUpdateReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 版本更新 + tags: + - 版本管理 + /api/stat/web/appcategory/add: + post: + consumes: + - application/json + description: 添加分类 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/appcategory.AppCategory' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 添加分类 + tags: + - 应用分类 + /api/stat/web/appcategory/del: + post: + consumes: + - application/json + description: 删除分类 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/srv_appcategory.AppCategoryDelReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 删除分类 + tags: + - 应用分类 + /api/stat/web/appcategory/list: + post: + consumes: + - application/json + description: 查询分类列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/srv_appcategory.AppCategorySearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/srv_appcategory.AppCategorySearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 查询分类列表 + tags: + - 应用分类 + /api/stat/web/appcategory/update: + post: + consumes: + - application/json + description: 更新分类 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/srv_appcategory.AppCategoryUpdateReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 更新分类 + tags: + - 应用分类 + /api/stat/web/apps/add: + post: + consumes: + - application/json + description: 添加应用 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/applicationmod.Application' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 添加应用 + tags: + - 应用中心 + /api/stat/web/apps/click: + post: + consumes: + - application/json + description: app点击 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.ApplicationClickReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 失败 + schema: + type: string + summary: app点击申请到统计中心redis + tags: + - 配置应用app管理 + /api/stat/web/apps/del: + post: + consumes: + - application/json + description: 删除应用 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.DelAppReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 删除应用 + tags: + - 应用中心 + /api/stat/web/apps/get: + post: + consumes: + - application/json + description: 外部app获取配置应用app信息 + parameters: + - description: 参数 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.CenterApplicationReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.CenterApplicationRes' + "400": + description: 失败 + schema: + type: string + summary: 外部app获取统计中心配置应用app信息 + tags: + - 配置应用app管理 + /api/stat/web/apps/list: + post: + consumes: + - application/json + description: 查询应用列表 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.GetApplicationsReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.GetApplicationsResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 查询应用列表 + tags: + - 应用中心 + /api/stat/web/apps/stat: + post: + consumes: + - application/json + description: 查询应用统计 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/srv_applicationstat.GetApplicationStatReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/srv_applicationstat.GetApplicationStatResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 查询应用统计 + tags: + - 应用中心 + /api/stat/web/apps/stattotal: + post: + consumes: + - application/json + description: 查询应用统计 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/srv_applicationstat.GetApplicationStatTotalReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/srv_applicationstat.GetApplicationStatTotalResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 查询应用统计 + tags: + - 应用中心 + /api/stat/web/apps/update: + post: + consumes: + - application/json + description: 更新应用 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/applicationmod.AppUpdate' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + summary: 更新应用 + tags: + - 应用中心 + /api/stat/web/landpage/picture/add: + post: + consumes: + - application/json + description: 添加一个落地页资源 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.LandpagePictureAddReq' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + type: string + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加一个落地页资源 + tags: + - 落地页资源 + /api/stat/web/landpage/picture/list: + post: + consumes: + - application/json + description: 分组分页获取落地页资源 + parameters: + - description: 参数列表 + in: body + name: param + required: true + schema: + $ref: '#/definitions/proto.LandpagePictureSearch' + produces: + - application/json + responses: + "200": + description: 成功 + schema: + $ref: '#/definitions/proto.LandpagePictureSearchResp' + "400": + description: 获取失败的返回结果 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分组分页获取落地页资源 + tags: + - 落地页资源 +schemes: +- http +- https +securityDefinitions: + ApiKeyAuth: + in: header + name: Authorization + type: apiKey + BasicAuth: + type: basic + OAuth2AccessCode: + authorizationUrl: https://example.com/oauth/authorize + flow: accessCode + scopes: + admin: Grants read and write access to administrative information + tokenUrl: https://example.com/oauth/token + type: oauth2 + OAuth2Application: + flow: application + scopes: + admin: Grants read and write access to administrative information + write: Grants write access + tokenUrl: https://example.com/oauth/token + type: oauth2 + OAuth2Implicit: + authorizationUrl: https://example.com/oauth/authorize + flow: implicit + scopes: + admin: Grants read and write access to administrative information + write: Grants write access + type: oauth2 + OAuth2Password: + flow: password + scopes: + admin: Grants read and write access to administrative information + read: Grants read access + write: Grants write access + tokenUrl: https://example.com/oauth/token + type: oauth2 +swagger: "2.0" diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..5d070ba --- /dev/null +++ b/go.mod @@ -0,0 +1,107 @@ +module stat + +go 1.19 // 太高版本会导致 excelize 库生成的文件损坏 + +require ( + github.com/360EntSecGroup-Skylar/excelize v1.4.1 + github.com/PuerkitoBio/goquery v1.6.0 + github.com/Shopify/sarama v1.27.0 + github.com/caixw/lib.go v0.0.0-20141220110639-1781da9139e0 + github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f + github.com/ddliu/go-httpclient v0.7.1 + github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3 + github.com/gin-gonic/gin v1.9.0 + github.com/go-playground/validator/v10 v10.11.2 + github.com/go-redis/redis v6.15.9+incompatible + github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 + github.com/go-telegram/bot v1.13.3 + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 + github.com/google/uuid v1.1.1 + github.com/grafov/m3u8 v0.11.1 + github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a + github.com/jinzhu/now v1.1.1 + github.com/nyaruka/phonenumbers v1.0.57 + github.com/patrickmn/go-cache v2.1.0+incompatible + github.com/pkg/errors v0.9.1 + github.com/robfig/cron/v3 v3.0.1 + github.com/shopspring/decimal v1.2.0 + github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e + github.com/swaggo/files v1.0.1 + github.com/swaggo/gin-swagger v1.6.0 + github.com/swaggo/swag v1.16.1 + github.com/vicanso/go-charts/v2 v2.6.1 + github.com/wcharczuk/go-chart/v2 v2.1.0 + github.com/xxjwxc/gowp v0.0.0-20200603141413-57c3ba7108be + github.com/xxjwxc/public v0.0.0-20200603141144-4001846f9957 + github.com/yunpian/yunpian-go-sdk v0.0.0-20171206021512-2193bf8a7459 + go.mongodb.org/mongo-driver v1.4.1 + go.uber.org/zap v1.16.0 + golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 +) + +require ( + github.com/KyleBanks/depth v1.2.1 // indirect + github.com/andybalholm/cascadia v1.1.0 // indirect + github.com/aws/aws-sdk-go v1.29.15 // indirect + github.com/bytedance/sonic v1.8.0 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/eapache/go-resiliency v1.2.0 // indirect + github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect + github.com/eapache/queue v1.1.0 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/spec v0.20.7 // indirect + github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-stack/stack v1.8.0 // indirect + github.com/goccy/go-json v0.10.0 // indirect + github.com/golang/protobuf v1.5.0 // indirect + github.com/golang/snappy v0.0.1 // indirect + github.com/hashicorp/go-uuid v1.0.2 // indirect + github.com/jcmturner/gofork v1.0.0 // indirect + github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.10.10 // indirect + github.com/klauspost/cpuid/v2 v2.0.9 // indirect + github.com/leodido/go-urn v1.2.1 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/onsi/ginkgo v1.14.1 // indirect + github.com/onsi/gomega v1.10.2 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pierrec/lz4 v2.5.2+incompatible // indirect + github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.9 // indirect + github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c // indirect + github.com/xdg/stringprep v1.0.0 // indirect + go.uber.org/atomic v1.6.0 // indirect + go.uber.org/multierr v1.5.0 // indirect + golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect + golang.org/x/crypto v0.5.0 // indirect + golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/sync v0.1.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + golang.org/x/tools v0.7.0 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/eapache/queue.v1 v1.1.0 // indirect + gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect + gopkg.in/jcmturner/dnsutils.v1 v1.0.1 // indirect + gopkg.in/jcmturner/gokrb5.v7 v7.5.0 // indirect + gopkg.in/jcmturner/rpc.v1 v1.1.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace golang.org/x/text => github.com/golang/text v0.3.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..83a4915 --- /dev/null +++ b/go.sum @@ -0,0 +1,541 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/360EntSecGroup-Skylar/excelize v1.4.1 h1:l55mJb6rkkaUzOpSsgEeKYtS6/0gHwBYyfo5Jcjv/Ks= +github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE= +github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/goquery v1.6.0 h1:j7taAbelrdcsOlGeMenZxc2AWXD5fieT1/znArdnx94= +github.com/PuerkitoBio/goquery v1.6.0/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/Shopify/sarama v1.27.0 h1:tqo2zmyzPf1+gwTTwhI6W+EXDw4PVSczynpHKFtVAmo= +github.com/Shopify/sarama v1.27.0/go.mod h1:aCdj6ymI8uyPEux1JJ9gcaDT6cinjGhNCAhs54taSUo= +github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/ant0ine/go-json-rest v3.3.2+incompatible/go.mod h1:q6aCt0GfU6LhpBsnZ/2U+mwe+0XB5WStbmwyoPfc+sk= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aws/aws-sdk-go v1.29.15 h1:0ms/213murpsujhsnxnNKNeVouW60aJqSd992Ks3mxs= +github.com/aws/aws-sdk-go v1.29.15/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= +github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA= +github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/caixw/lib.go v0.0.0-20141220110639-1781da9139e0 h1:MnIURgMAFAMyxAHu8h2TbnjxMMd7SKVCPyTZz5EfwNA= +github.com/caixw/lib.go v0.0.0-20141220110639-1781da9139e0/go.mod h1:hQL8hyiiVE/BSo7gh13njx+DpvoPh/yE8/BkKKc62RA= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f h1:q/DpyjJjZs94bziQ7YkBmIlpqbVP7yw179rnzoNVX1M= +github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f/go.mod h1:QGrK8vMWWHQYQ3QU9bw9Y9OPNfxccGzfb41qjvVeXtY= +github.com/ddliu/go-httpclient v0.7.1 h1:COWYBalfbaFNe6e0eQU38++vCD5kzLh1H1RFs3xcn9g= +github.com/ddliu/go-httpclient v0.7.1/go.mod h1:uwipe9x9SYGk4JhBemO7+dD87QbiY224y0DLB9OY0Ik= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3 h1:AqeKSZIG/NIC75MNQlPy/LM3LxfpLwahICJBHwSMFNc= +github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3/go.mod h1:hEfFauPHz7+NnjR/yHJGhrKo1Za+zStgwUETx3yzqgY= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= +github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.10.0 h1:Gfh+GAJZOAoKZsIZeZbdn2JF10kN1XHNvjsvQK8gVkE= +github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8= +github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/spec v0.20.7 h1:1Rlu/ZrOCCob0n+JKKJAWhNWMPW8bOZRg8FJaY+0SKI= +github.com/go-openapi/spec v0.20.7/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= +github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= +github.com/go-telegram/bot v1.13.3 h1:r2erpHI5rMQsR5TFWJ/XVqWHq9R228fcaejLFvXJsmM= +github.com/go-telegram/bot v1.13.3/go.mod h1:i2TRs7fXWIeaceF3z7KzsMt/he0TwkVC680mvdTFYeM= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= +github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/text v0.3.0 h1:uI5zIUA9cg047ctlTptnVc0Ghjfurf2eZMFrod8R7v8= +github.com/golang/text v0.3.0/go.mod h1:GUiq9pdJKRKKAZXiVgWFEvocYuREvC14NhI4OPgEjeE= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grafov/m3u8 v0.11.1 h1:igZ7EBIB2IAsPPazKwRKdbhxcoBKO3lO1UY57PZDeNA= +github.com/grafov/m3u8 v0.11.1/go.mod h1:nqzOkfBiZJENr52zTVd/Dcl03yzphIMbJqkXGu+u080= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jander/golog v0.0.0-20150917071935-954a5be801fc/go.mod h1:uWhWXOR4dpfk9J8fegnMY7sP2GFXxe3PFI9Ps+TRXJs= +github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= +github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jroimartin/gocui v0.4.0/go.mod h1:7i7bbj99OgFHzo7kB2zPb8pXLqMBSQegY7azfqXMkyY= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kardianos/service v1.0.0/go.mod h1:8CzDhVuCuugtsHyZoTvsOBuvonN/UDBvl0kH+BUxvbo= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I= +github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/muesli/cache2go v0.0.0-20200423001931-a100c5aac93f/go.mod h1:414R+qZrt4f9S2TO/s6YVQMNAXR2KdwqQ7pW+O4oYzU= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nicksnyder/go-i18n/v2 v2.0.3/go.mod h1:oDab7q8XCYMRlcrBnaY/7B1eOectbvj6B1UPBT+p5jo= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nsf/termbox-go v0.0.0-20200418040025-38ba6e5628f1/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= +github.com/nsqio/go-nsq v1.0.8/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nyaruka/phonenumbers v1.0.57 h1:V4FNPs061PSUOEzQaLH0+pfzEdqoiMH/QJWryx/0hfs= +github.com/nyaruka/phonenumbers v1.0.57/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olivere/elastic v6.2.31+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= +github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs= +github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI= +github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= +github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= +github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= +github.com/swaggo/swag v1.16.1 h1:fTNRhKstPKxcnoKsytm4sahr8FaYzUcT7i1/3nd/fBg= +github.com/swaggo/swag v1.16.1/go.mod h1:9/LMvHycG3NFHfR6LwvikHv5iFvmPADQ359cKikGxto= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU= +github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/vicanso/go-charts/v2 v2.6.1 h1:xWODVa4KtzkZrbUNd6WQunqGyFWXgaUeeXMQkFm9RuE= +github.com/vicanso/go-charts/v2 v2.6.1/go.mod h1:Ii2KDI3udTG1wPtiTnntzjlUBJVJTqNscMzh3oYHzUk= +github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= +github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xxjwxc/gowp v0.0.0-20200603130651-4d7368b0e285/go.mod h1:yJ/fY5BorWARfDDsxBU/MyQTHc5MVyNcqBQQYD6MN0k= +github.com/xxjwxc/gowp v0.0.0-20200603141413-57c3ba7108be h1:v4Ws2Pd0HNxegMWiZTgaSBfeLtfyFP/eWc50o2CFFX8= +github.com/xxjwxc/gowp v0.0.0-20200603141413-57c3ba7108be/go.mod h1:mstQ3GY2ZYdP9fCUJJmsq5hwhP0LKoR4ZVTq0XaxK0U= +github.com/xxjwxc/public v0.0.0-20200603115833-341beff27850/go.mod h1:fp3M+FEQrCgWD1fZ/PLwZkCTglf086OEhC9LcydAUnc= +github.com/xxjwxc/public v0.0.0-20200603141144-4001846f9957 h1:1JDmDFVQFpty205Kh9lxBAjjn9rG1eTYtdF/Q0dTh5w= +github.com/xxjwxc/public v0.0.0-20200603141144-4001846f9957/go.mod h1:0BFWVHqt7nKW8MtIx7R7bOkoGQFFnKsaJeeVbkzY88E= +github.com/yunpian/yunpian-go-sdk v0.0.0-20171206021512-2193bf8a7459 h1:VMA8aoW32odpGNXkb2Z0oICa7ayWMiueU7trI9qD8qg= +github.com/yunpian/yunpian-go-sdk v0.0.0-20171206021512-2193bf8a7459/go.mod h1:B+TIdkhcQIzSodgDiz0oVwgEcg0RP0YofIP+Ujipypg= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.mongodb.org/mongo-driver v1.4.1 h1:38NSAyDPagwnFpUA/D5SFgbugUYR3NzYRNa4Qk9UxKs= +go.mongodb.org/mongo-driver v1.4.1/go.mod h1:llVBH2pkj9HywK0Dtdt6lDikOjFLbceHVu/Rc0iMKLs= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= +golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200528225125-3c3fba18258b/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/eapache/queue.v1 v1.1.0 h1:EldqoJEGtXYiVCMRo2C9mePO2UUGnYn2+qLmlQSqPdc= +gopkg.in/eapache/queue.v1 v1.1.0/go.mod h1:wNtmx1/O7kZSR9zNT1TTOJ7GLpm3Vn7srzlfylFbQwU= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-with/wxpay.v1 v1.3.0/go.mod h1:12lWy92n19pAUSSE3BrOiEZbWRkl+9tneOd/aU/LU6g= +gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0 h1:1duIyWiTaYvVx3YX2CYtpJbUFd7/UuPYCfgXtQ3VTbI= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.5.0 h1:a9tsXlIDD9SKxotJMK3niV7rPZAJeX2aD/0yg3qlIrg= +gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200601152816-913338de1bd2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/main.go b/main.go new file mode 100644 index 0000000..a0a543c --- /dev/null +++ b/main.go @@ -0,0 +1,65 @@ +//go:generate swag init --parseDependency --parseDepth 4 +package main + +import ( + "flag" + "os" + "stat/common/version" + "stat/server" +) + +// @title 统计中心 接口文档 +// @version 1.0 +// @description This is a sample server celler server. +// @termsOfService + +// @contact.name +// @contact.url +// @contact.email + +// @license.name Apache 2.0 +// @license.url http://www.apache.org/licenses/LICENSE-2.0.html + +// @host localhost:8088 +// @BasePath /api/stat +// @Schemes http https + +// @securityDefinitions.basic BasicAuth + +// @securityDefinitions.apikey ApiKeyAuth +// @in header +// @name Authorization + +// @securitydefinitions.oauth2.application OAuth2Application +// @tokenUrl https://example.com/oauth/token +// @scope.write Grants write access +// @scope.admin Grants read and write access to administrative information + +// @securitydefinitions.oauth2.implicit OAuth2Implicit +// @authorizationUrl https://example.com/oauth/authorize +// @scope.write Grants write access +// @scope.admin Grants read and write access to administrative information + +// @securitydefinitions.oauth2.password OAuth2Password +// @tokenUrl https://example.com/oauth/token +// @scope.read Grants read access +// @scope.write Grants write access +// @scope.admin Grants read and write access to administrative information + +// @securitydefinitions.oauth2.accessCode OAuth2AccessCode +// @tokenUrl https://example.com/oauth/token +// @authorizationUrl https://example.com/oauth/authorize +// @scope.admin Grants read and write access to administrative information + +func cmdLine() { + info := flag.Bool("info", false, "show service build info") + flag.Parse() + if *info { + version.Info() //内部会自动退进程. + } +} + +func main() { + cmdLine() + server.Run(os.Args) +} diff --git a/middleware/auth/http.go b/middleware/auth/http.go new file mode 100644 index 0000000..25893c4 --- /dev/null +++ b/middleware/auth/http.go @@ -0,0 +1,142 @@ +package auth + +import ( + "fmt" + "net/http" + "stat/common/enum/consts" + "stat/common/utils" + "stat/middleware/define" + "stat/models/adminMod" + "stat/service/agentSer" + "strings" + + "github.com/gin-gonic/gin" +) + +// gin 验证中间件 + +var ( + // 白名单,不需要验证token的api + whiteList = []string{ + "/swagger/*", + "/swagger", + "/favicon.ico", + "/api/stat/admin/login", + "/api/stat/admin/verify", + "/api/stat/agent/imgVerify", + "/api/stat/agent/login", + "/api/stat/agent/verify", + "/api/stat/billserver/callback", + "/api/stat/version/bottonclick", + "/api/stat/version/bottonlist", + "/api/stat/version/crossbottonclick", + "/api/stat/share/list", + "/api/stat/ads/get", + "/api/stat/ads/click", + "/api/stat/commodity/info", + "/api/stat/commodity/rechargeType", + "/api/stat/commodity/buy", + "/api/stat/commodity/order", + "/api/stat/version/app", + "/api/stat/userInvite/userlist", + "/api/stat/userInvite/incomelist", + "/api/stat/userInvite/district", + "/api/stat/user/districtcode", + "/api/stat/callback/rchg/bill", + "/api/stat/blocDailyStatTotal/list", + "/api/stat/adminbloc/login", + "/api/stat/channelCodeStat/list", + "/api/stat/loufeng/sync", + "/api/stat/districtMinuteStat/list", + "/api/stat/loufeng/uploadImg", + "/api/stat/loufeng/complaint", //楼凤投诉 + "/api/stat/model/sync", //嫩模同步 + "/api/stat/novel/sync", + "/api/stat/novel/audio/sync", + "/api/stat/file/upload", + "/api/stat/model/syncBroker", + "/api/stat/loufeng/complaint", + "/api/stat/loufeng/queryComplaint", + "/api/stat/openinstall/auth", + "/api/stat/openinstall/total", + "/api/stat/openinstall/info", + "/api/stat/openinstall/growth", + "/api/stat/openinstall/allstat", + "/api/stat/openinstall/active", + "/api/stat/activity/h5/info", + "/api/stat/activity/h5/giftinfo", + "/api/stat/activity/h5/draw", + "/api/stat/landPageConfig/getByType", + "/api/stat/media/m3u8", + "/api/stat/media/enkey", + "/api/stat/version/h5/config", + "/api/stat/version/channel/newLink", + "/api/stat/inner/botStatList", + "/api/stat/inner/appList", + "/api/stat/inner/appDownload", + "/api/stat/inner/botMonthStat", + "/api/stat/inner/sendTgMessage", + "/api/stat/activity/visit", + "/api/stat/landPage/summary/downTotal/list", + "/api/stat/web/apps/get", + "/api/stat/web/apps/click", + "/api/stat/inner/recharge/list", + "/api/stat/inner/rechargebotcmd/list", + "/api/stat/daily-stat/jtspV2", + "/api/stat/daily-stat/hour", + "/api/stat/daily-stat/rank", + "/api/stat/daily-stat/total", + } +) + +func Auth(ctx *gin.Context) { + for _, w := range whiteList { + if strings.HasPrefix(ctx.Request.URL.Path, w) { + return + } + } + + authToken := func() (int, error) { + checkToken := ctx.Request.Header.Get("Authorization") + if checkToken == "" { + return http.StatusBadRequest, define.NoToken + } + claims, err := define.ParseToken(checkToken) + if err != nil { + return http.StatusMovedPermanently, define.RepeatLogin + } + + if claims.Type == define.Admin { + has, err := adminMod.CheckToken(ctx, checkToken) + if err != nil { + return http.StatusBadRequest, err + } + if !has { + return http.StatusMovedPermanently, define.RepeatLogin + } + } else if claims.Type == define.Channel { + //fmt.Println("", claims.Type, claims.ShowMagic) + if claims.ShowMagic > "3" { + return consts.ShowMagic, nil + } + err := agentSer.CheckToken(ctx, claims.Name, checkToken) + if err != nil { + return http.StatusBadRequest, err + } + } + ctx.Set(utils.AdminAccountKey, claims.Name) + ctx.Set(utils.AccountTypeKey, claims.Type) + + return 0, nil + } + + statusCode, err := authToken() + if err != nil || statusCode != 0 { + if statusCode == consts.ShowMagic { + ctx.AbortWithStatusJSON(200, gin.H{}) + } else { + ctx.AbortWithStatusJSON(statusCode, gin.H{"msg": fmt.Sprintf("%+v", err)}) + } + + } +} diff --git a/middleware/cors/cors.go b/middleware/cors/cors.go new file mode 100644 index 0000000..4b0b600 --- /dev/null +++ b/middleware/cors/cors.go @@ -0,0 +1,136 @@ +package cors + +import ( + "net/http" + "strconv" + "strings" + + "github.com/gin-gonic/gin" +) + +type Options struct { + Origin *[]string //传入空指针,表示允许"*", 传入空数组表示禁止跨域 + Methods []string //Methods + AllowedHeaders []string //AllowHeaders + ExposedHeaders []string //exposeHeader + Credentials bool //cookie + MaxAge int64 //缓存MaxAge + PreflightContinue bool //在遇到Options的时候,继续,而不是返回请求 + OptionsSuccessStatus int //Options时,返回的状态码,默认204 +} + +func configureOrigin(o *Options, c *gin.Context) map[string]string { + reqOrigin := c.GetHeader("Origin") + headers := make(map[string]string) + if o.Origin == nil { + headers["Access-Control-Allow-Origin"] = "*" + } else { + isAllowed := false + for _, allowed := range *o.Origin { + if allowed == reqOrigin { + isAllowed = true + break + } + } + if isAllowed { + headers["Access-Control-Allow-Origin"] = reqOrigin + } else { + headers["Access-Control-Allow-Origin"] = strconv.FormatBool(false) + } + headers["Vary"] = "Origin" + } + return headers +} + +func configureMethods(o *Options) map[string]string { + headers := make(map[string]string) + if len(o.Methods) > 0 { + headers["Access-Control-Allow-Methods"] = strings.ToUpper(strings.Join(o.Methods, ",")) + } + return headers +} + +func configureCredentials(o *Options) map[string]string { + headers := make(map[string]string) + if o.Credentials { + headers["Access-Control-Allow-Credentials"] = strconv.FormatBool(true) + } + return headers +} + +func configureAllowedHeaders(o *Options, c *gin.Context) map[string]string { + headers := make(map[string]string) + if len(o.AllowedHeaders) > 0 { + headers["Access-Control-Allow-Headers"] = strings.Join(o.AllowedHeaders, ",") + } + return headers +} + +func configureExposedHeaders(o *Options) map[string]string { + var headers = make(map[string]string) + if len(o.ExposedHeaders) > 0 { + headers["Access-Control-Expose-Headers"] = strings.Join(o.ExposedHeaders, ",") + } + return headers +} + +func configureMaxAge(o *Options) map[string]string { + var headers = make(map[string]string) + if o.MaxAge >= 0 { + headers["Access-Control-Max-Age"] = strconv.FormatInt(o.MaxAge, 10) + } + return headers +} + +func mergeMap(m ...map[string]string) map[string]string { + r := make(map[string]string) + for _, t := range m { + for k, v := range t { + r[k] = v + } + } + return r +} + +func applyHeader(c *gin.Context, h map[string]string) { + for k, v := range h { + c.Header(k, v) + } +} + +//Cors 跨域处理 +func Cors(o *Options) gin.HandlerFunc { + if o.OptionsSuccessStatus == 0 { + o.OptionsSuccessStatus = http.StatusNoContent + } + return func(c *gin.Context) { + method := c.Request.Method + //c.Header("Access-Control-Allow-Origin", "*") + //c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token,Authorization,Token,Content-Length,Etag,Content-Range,Accept-Ranges,User-Agent,Range,Bucket,Content-Disposition,Signature,X-Forwarded-For,X-Real-Ip") + if method == "OPTIONS" { + h := mergeMap( + configureOrigin(o, c), + configureCredentials(o), + configureMethods(o), + configureAllowedHeaders(o, c), + configureMaxAge(o), + configureExposedHeaders(o), + ) + applyHeader(c, h) + if o.PreflightContinue { + c.Next() + } else { + c.Header("Content-Length", "0") + c.AbortWithStatus(o.OptionsSuccessStatus) + } + } else { + h := mergeMap( + configureOrigin(o, c), + configureCredentials(o), + configureExposedHeaders(o), + ) + applyHeader(c, h) + c.Next() + } + } +} diff --git a/middleware/define/define.go b/middleware/define/define.go new file mode 100644 index 0000000..9c6b152 --- /dev/null +++ b/middleware/define/define.go @@ -0,0 +1,69 @@ +package define + +import ( + "fmt" + "stat/common/log" + "stat/common/utils" + "stat/statg" + "time" +) + +type ActType = string + +const ( + Admin ActType = "admin" + Channel ActType = "channel" + District ActType = "district" + ActTypeNone ActType = "" +) + +type Claims struct { + Type ActType + Name string `json:"name"` + Role string `json:"role"` + CID string `json:"cid"` + ShowMagic string `json:"showMagic"` +} + +type claimsWithExp struct { + Claims + Exp int64 `json:"exp"` +} + +var ( + NoToken = fmt.Errorf("no token") + RepeatLogin = fmt.Errorf("repeat login") +) + +const ( + WebTokenExpire = 10 * 24 * time.Hour +) + +func GetTokenSecret() string { + return statg.Conf.JwtKey +} + +func GenToken(claims *Claims) (string, error) { + c := claimsWithExp{Claims: *claims, Exp: time.Now().Add(WebTokenExpire).Unix()} + secret := GetTokenSecret() + args, _ := utils.JSONStruct2Map(c) + token, err := utils.CreateToken(secret, args) + if err != nil { + log.Error("auth web GenToken error", log.Any("claims", claims), log.E(err)) + } + return token, err +} + +func ParseToken(token string) (*claimsWithExp, error) { + secret := GetTokenSecret() + claims, err := utils.ParseToken(secret, token) + if err != nil { + return nil, err + } + c := claimsWithExp{} + err = utils.Map2JSONStruct(&c, claims) + if err != nil { + return nil, err + } + return &c, nil +} diff --git a/middleware/inner/inner.go b/middleware/inner/inner.go new file mode 100644 index 0000000..6ab3f6a --- /dev/null +++ b/middleware/inner/inner.go @@ -0,0 +1,76 @@ +package inner + +import ( + "bytes" + "fmt" + "io" + "net/http" + "stat/common/crypt" + "stat/common/stdLog" + + "github.com/gin-gonic/gin" +) + +type cWriter struct { + gin.ResponseWriter + body *bytes.Buffer +} + +func (w *cWriter) Write(b []byte) (int, error) { + return w.body.Write(b) +} + +func (w *cWriter) WriteString(s string) (int, error) { + return w.body.WriteString(s) +} + +func Crypt(key string) gin.HandlerFunc { + return func(c *gin.Context) { + // decrypt + raw, err := c.GetRawData() + if err != nil { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ + "code": stdLog.Failure, + "msg": fmt.Sprintf("读取Body数据出错: %s", err.Error()), + }) + return + } + de, err := crypt.CoreAesDecryptEx(raw, 12, key) + if err != nil { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ + "code": stdLog.Failure, + "msg": fmt.Sprintf("解密Body数据出错: %s", err.Error()), + }) + return + } + c.Request.Body = io.NopCloser(bytes.NewBuffer(de)) + c.Request.ContentLength = int64(len(de)) + c.Request.Header.Set("Content-Type", "application/json") + + oWriter := c.Writer + blw := &cWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer} + c.Writer = blw + + c.Next() + + // encrypt + c.Writer = oWriter + en, err := crypt.CoreAesEncryptEx(blw.body.Bytes(), 12, key) + if err != nil { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ + "code": stdLog.Failure, + "msg": fmt.Sprintf("加密Body数据出错: %s", err.Error()), + }) + return + } + + _, err = c.Writer.Write(en) + if err != nil { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ + "code": stdLog.Failure, + "msg": fmt.Sprintf("写入Body数据出错: %s", err.Error()), + }) + return + } + } +} diff --git a/middleware/limit/limit.go b/middleware/limit/limit.go new file mode 100644 index 0000000..6399cd4 --- /dev/null +++ b/middleware/limit/limit.go @@ -0,0 +1,25 @@ +package limit + +import ( + "fmt" + "stat/common/redis" + "stat/statg" + "time" + + "github.com/gin-gonic/gin" +) + +func GetKey(name string) func() string { + return func() string { + return redis.GetIpLimitDayKey(statg.Conf.Host, statg.Conf.Port) + "_" + name + } +} + +func Limit(name string, capacity int64, rate int64) gin.HandlerFunc { + limiter := redis.NewTokenBucket(redis.StatRds.Client(), GetKey(name), capacity, rate, 48*time.Hour) + return func(ctx *gin.Context) { + if err := limiter.TakeTokens(ctx.ClientIP(), 1); err != nil { + ctx.AbortWithStatusJSON(200, gin.H{"msg": fmt.Sprintf("%+v", err)}) + } + } +} diff --git a/models/accessmod/access.go b/models/accessmod/access.go new file mode 100644 index 0000000..8350fb0 --- /dev/null +++ b/models/accessmod/access.go @@ -0,0 +1,55 @@ +package accessmod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollAccessLog) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "userId", Value: 1}, {Key: "appId", Value: 1}}, + }, { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "visitAt", Value: 1}}, + }, + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "userId", Value: 1}, {Key: "visitAt", Value: 1}}, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "userId", Value: 1}, {Key: "visitAt", Value: 1}, {Key: "registerTime", Value: 1}}, + }, + { + Keys: bson.D{{Key: "createdAt", Value: 1}}, + Options: options.Index().SetExpireAfterSeconds(5 * 24 * 60 * 60), + }, { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "userId", Value: 1}, {Key: "visitAt", Value: 1}, {Key: "isDirect", Value: 1}, {Key: "blocDeduction", Value: 1}}, + }, + } + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", CollAccessLog, err)) + } +} + +// 新增用户访问记录 +func AddAccessLog(ctx context.Context, doc *AccessMod) (err error) { + doc.CreatedAt = time.Now() + if _, err = db.UpsertOne(ctx, bson.M{"visitAt": doc.VisitAt, "userId": doc.UserId, "appId": doc.AppId}, bson.M{"$setOnInsert": doc}); err != nil { + log.Error("admin AddAccessLog InsertOne err", log.E(err)) + return + } + + return +} diff --git a/models/accessmod/stat.go b/models/accessmod/stat.go new file mode 100644 index 0000000..725109f --- /dev/null +++ b/models/accessmod/stat.go @@ -0,0 +1,221 @@ +package accessmod + +import ( + "context" + "stat/common/log" + "stat/common/utils" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 根据appId 获取appInfo +func GetAccessUserByTime(ctx context.Context, appid int32, start, end time.Time) ([]uint64, error) { + filter := bson.M{"appId": appid, "visitAt": bson.M{"$gte": start, "$lt": end}} + results := make([]AccessMod, 0) + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetAccessUserByTime Find err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + uids := make([]uint64, 0, len(results)) + for _, v := range results { + uids = append(uids, v.UserId) + } + + return uids, nil +} + +func GetAccessUserDistrictCount(ctx context.Context, appid int32, sysTypes []string, start, end time.Time) (int64, error) { + filter := bson.M{ + "appId": appid, + "visitAt": bson.M{"$gte": start, "$lt": end}, + "isDirect": true, + "$and": bson.A{ + bson.M{"districtCode": bson.M{"$gt": ""}}, + bson.M{"districtCode": bson.M{"$ne": "官方"}}, + bson.M{"districtCode": bson.M{"$ne": "modelweb"}}, + }, + } + if len(sysTypes) > 0 { + filter["sysType"] = bson.M{"$in": sysTypes} + } + if count, err := db.Count(ctx, filter); err != nil { + log.Error("GetAccessUserDistrictCount Find err", log.Any("start", start), log.Any("end", end), log.E(err)) + return 0, err + } else { + return count, nil + } +} + +// 根据appId 获取appInfo +func GetAndroidAccessUserByTime(ctx context.Context, appid int32, start, end time.Time) ([]uint64, error) { + filter := bson.M{"appId": appid, "sysType": "android", "visitAt": bson.M{"$gte": start, "$lt": end}} + results := make([]AccessMod, 0) + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetAccessUserByTime FindOne err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + uids := make([]uint64, 0, len(results)) + for _, v := range results { + uids = append(uids, v.UserId) + } + + return uids, nil +} + +// 根据appId 获取appInfo +func GetIosAccessUserByTime(ctx context.Context, appid int32, start, end time.Time) ([]uint64, error) { + filter := bson.M{"appId": appid, "sysType": "ios", "visitAt": bson.M{"$gte": start, "$lt": end}} + results := make([]AccessMod, 0) + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetAccessUserByTime FindOne err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + uids := make([]uint64, 0, len(results)) + for _, v := range results { + uids = append(uids, v.UserId) + } + + return uids, nil +} + +// BlocDailyStatCount 集团日活 +func BlocDailyStatCount(ctx context.Context, appid int32, isDirect *bool, blocDeduction *bool, start, end time.Time) (int64, error) { + filter := bson.M{"appId": appid, "visitAt": bson.M{"$gte": start, "$lt": end}} + if isDirect != nil { + filter["isDirect"] = *isDirect + } + if blocDeduction != nil { + filter["blocDeduction"] = *blocDeduction + } + + count, err := db.Count(ctx, filter) + if err != nil { + log.Error("GetAccessUserByTime Find err", log.Any("start", start), log.Any("end", end), log.E(err)) + return 0, err + } + + return count, nil +} + +// BlocDailyVisitStatCount H5日活 +func BlocDailyVisitStatCount(ctx context.Context, appid int32, sysTypes []string, blocDeduction *bool, start, end time.Time) (int64, error) { + filter := bson.M{ + "appId": appid, + "sysType": bson.M{"$in": sysTypes}, + "visitAt": bson.M{"$gte": start, "$lt": end}} + if blocDeduction != nil { + filter["blocDeduction"] = *blocDeduction + } + count, err := db.Count(ctx, filter) + if err != nil { + log.Error("BlocDailyVisitStatCount Find err", log.Any("start", start), log.Any("end", end), log.E(err)) + return 0, err + } + return count, nil +} + +// DailyUserCount 用户访问量 +func DailyUserVisitCountByRegister(ctx context.Context, appid int32, start, end, registerStart, registerEnd time.Time) (int64, error) { + filter := bson.M{"appId": appid, "visitAt": bson.M{"$gte": start, "$lt": end}, "registerTime": bson.M{"$gte": registerStart, "$lt": registerEnd}} + count, err := db.Count(ctx, filter) + if err != nil { + log.Error("DailyUserCount Find err", log.Any("start", start), log.Any("end", end), log.E(err)) + return 0, err + } + + return count, nil +} + +// VisitInfoByTime 访问信息 +func VisitInfoByTime(ctx context.Context, appid int32, start, end time.Time, blocDeduction *bool) ([]*AccessMod, error) { + filter := bson.M{"appId": appid, "visitAt": bson.M{"$gte": start, "$lt": end}} + + results := make([]*AccessMod, 0) + + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetAccessUserByTime Find err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + + return results, nil +} + +type OnItem func(item *AccessMod) + +// VisitInfoByTimeShard 访问信息 +func VisitInfoByTimeShard(ctx context.Context, appid int32, start, end time.Time, step time.Duration, onItem OnItem) error { + segments := utils.CalcTimeSegments(start, end, step) + for _, segment := range segments { + results := make([]*AccessMod, 0) + filter := bson.M{"appId": appid, "visitAt": bson.M{"$gte": segment.Begin, "$lt": segment.End}} + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetAccessUserByTime Find err", log.Any("start", start), log.Any("end", end), log.E(err)) + return err + } + for _, item := range results { + onItem(item) + } + results = nil + } + return nil +} + +// VisitInfoByTime 访问信息 +func VisitInfoByTimeV1(ctx context.Context, appid int32, start, end time.Time, blocDeduction *bool) ([]AccessMod, error) { + filter := bson.M{"appId": appid, "isDeduction": false, "visitAt": bson.M{"$gte": start, "$lt": end}} + + results := make([]AccessMod, 0) + + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetAccessUserByTime Find err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + + return results, nil +} + +// DailyUserVisitCountByInfoShard 用户访问量 +func DailyUserVisitCountByInfoShard(ctx context.Context, appid int32, start, end time.Time, shard time.Duration, registerStart, registerEnd time.Time, onItem OnItem) error { + segments := utils.CalcTimeSegments(start, end, shard) + for _, segment := range segments { + filter := bson.M{"appId": appid, "visitAt": bson.M{"$gte": segment.Begin, "$lt": segment.End}, "registerTime": bson.M{"$gte": registerStart, "$lt": registerEnd}} + results := make([]*AccessMod, 0) + + err := db.Find(ctx, &results, filter) + if err != nil { + log.Error("DailyUserVisitCountByInfo Find err", log.Any("start", start), log.Any("end", end), log.E(err)) + return err + } + for _, item := range results { + onItem(item) + } + results = nil + } + return nil +} + +// DailyUserCount 用户访问量 +func DailyUserVisitCountByInfo(ctx context.Context, appid int32, start, end, registerStart, registerEnd time.Time) ([]AccessMod, error) { + filter := bson.M{"appId": appid, "visitAt": bson.M{"$gte": start, "$lt": end}, "registerTime": bson.M{"$gte": registerStart, "$lt": registerEnd}} + results := make([]AccessMod, 0) + + err := db.Find(ctx, &results, filter) + if err != nil { + log.Error("DailyUserVisitCountByInfo Find err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + + return results, nil +} + +// FindManyVisitInfo 查找一批渠道信息数据 +func FindManyVisitInfo(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (VisitInfoList, error) { + data := make(VisitInfoList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("FindManyVisitInfo dbChannel.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} diff --git a/models/accessmod/type.go b/models/accessmod/type.go new file mode 100644 index 0000000..cf01c49 --- /dev/null +++ b/models/accessmod/type.go @@ -0,0 +1,32 @@ +package accessmod + +import ( + "stat/common/mongos" + "time" +) + +// 表名 +const CollAccessLog = "log_access" + +var db *mongos.MongoTool + +// AccessMod 用户访问记录 +type AccessMod struct { + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + AppId int32 `json:"appId" bson:"appId"` // appID + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 android ios + DevType string `json:"devType,omitempty" bson:"devType"` // 设备型号 + IP string `json:"ip,omitempty" bson:"ip"` // IP + Version string `json:"version,omitempty" bson:"version"` // APP版本号 + DevID string `json:"devID,omitempty" bson:"devID"` // 设备ID + IsDirect bool `json:"isDirect" bson:"isDirect"` // true:是直推用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` // 渠道码 + RegisterTime time.Time `json:"registerTime,omitempty" bson:"registerTime"` // 操作时间 + IsDeduction bool `json:"isDeduction" bson:"isDeduction"` // true:CPA扣量用户 + IsFormalUser bool `json:"isFormalUser" bson:"isFormalUser"` // 是否正式用户 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` // 集团扣量(特定渠道扣量) + VisitAt time.Time `json:"visitAt,omitempty" bson:"visitAt"` // 访问时间 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} + +type VisitInfoList []*AccessMod diff --git a/models/activityVisit/activityVisit.go b/models/activityVisit/activityVisit.go new file mode 100644 index 0000000..94d963c --- /dev/null +++ b/models/activityVisit/activityVisit.go @@ -0,0 +1,96 @@ +package activityVisit + +import ( + "context" + "fmt" + "time" + + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollActivityVisit) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "appId", Value: 1}}, + }, + { + Keys: bson.D{{Key: "activityId", Value: 1}}, + }, + { + Keys: bson.D{{Key: "createdAt", Value: -1}}, + }, + { + Keys: bson.D{{Key: "ch", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollActivityVisit, err)) + } +} + +// 插入InsertActivityVisit 活动访问次数 +func InsertActivityVisit(ctx context.Context, model *ActivityVisit) (err error) { + _, err = db.InsertOne(ctx, model) + return +} + +// 插入InsertManyActivityVisit 活动访问次数 +func InsertManyActivityVisit(ctx context.Context, docs []interface{}) (err error) { + _, err = db.GetCollection().InsertMany(ctx, docs) + return +} + +// FindManyActivityList 查找一批 +func FindManyActivityList(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (ActivityVisitList, error) { + data := make(ActivityVisitList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("FindManyActivityList db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// 根据appId 获取activityVisit +func GetActivityVisitByTime(ctx context.Context, appid int32, start, end time.Time) (ActivityVisitList, error) { + filter := bson.M{"appId": appid, "createdAt": bson.M{"$gte": start, "$lt": end}} + results := make(ActivityVisitList, 0) + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetActivityVisitByTime FindOne err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + + return results, nil +} + +// 根据ch 获取activityVisit +func GetActivityVisitByCh(ctx context.Context, ch string, start, end time.Time) (ActivityVisitList, error) { + filter := bson.M{"ch": ch, "createdAt": bson.M{"$gte": start, "$lt": end}} + results := make(ActivityVisitList, 0) + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetActivityVisitByTime FindOne err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + + return results, nil +} + +// CountActivityVisit 统计活动访问数量 +func CountActivityVisit(ctx context.Context, filter bson.M) (int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("CountActivityVisit db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} diff --git a/models/activityVisit/type.go b/models/activityVisit/type.go new file mode 100644 index 0000000..1139195 --- /dev/null +++ b/models/activityVisit/type.go @@ -0,0 +1,28 @@ +package activityVisit + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 表名 +const CollActivityVisit = "activity_visit" + +var db *mongos.MongoTool + +type ActivityVisit struct { + AppId int32 `json:"appId" bson:"appId"` // appId + CH string `json:"ch" bson:"ch"` // 渠道号 + IP string `json:"ip" bson:"ip"` // 用户IP + DevType string `json:"devType" bson:"devType"` // 设备类型 + SysType string `json:"sysType" bson:"sysType"` // 系统类型 + PeerIP string `json:"peerIP" bson:"peerIP"` // 网站IP + ActivityId primitive.ObjectID `json:"activityId" bson:"activityId"` // 活动Id + ActivityName string `json:"activityName" bson:"activityName"` // 活动名字 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt"` // 更新时间 +} + +type ActivityVisitList []*ActivityVisit diff --git a/models/activitymod/activity.go b/models/activitymod/activity.go new file mode 100644 index 0000000..aa6659a --- /dev/null +++ b/models/activitymod/activity.go @@ -0,0 +1,462 @@ +package activitymod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var dbAct *mongos.MongoTool +var dbLotCodeInfo *mongos.MongoTool +var dbLotGift *mongos.MongoTool +var dbLotGetGift *mongos.MongoTool + +func Init() { + ctx := context.Background() + InitAct(ctx) + InitLotCodeInfo(ctx) + InitLotGift(ctx) + InitLotGiftCode(ctx) +} + +func InitAct(ctx context.Context) { + // 获取数据库表 + dbAct = mongos.New(mongos.MgoManager, TN.ActivityInfo) + + // 初始化 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: FN.ActivityInfo.Name, Value: 1}}, + }, + { + Keys: bson.D{{Key: FN.ActivityInfo.Enable, Value: 1}}, + }, + { + Keys: bson.D{{Key: FN.ActivityInfo.SortCode, Value: -1}}, + }, + { + Keys: bson.D{ + {Key: FN.ActivityInfo.StartTime, Value: -1}, + {Key: FN.ActivityInfo.EndTime, Value: -1}, + }, + }, + } + if _, err := dbAct.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", TN.ActivityInfo, err)) + } +} + +func InitLotCodeInfo(ctx context.Context) { + // 获取数据库表 + dbLotCodeInfo = mongos.New(mongos.MgoManager, TN.LottertyCodeInfo) + + // 初始化 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: FN.LottertyCodeInfo.LotteryCode, Value: 1}}, + }, + { + Keys: bson.D{{Key: FN.LottertyCodeInfo.ActId, Value: 1}}, + }, + { + Keys: bson.D{{Key: FN.LottertyCodeInfo.UserIp, Value: 1}}, + }, + { + Keys: bson.D{{Key: FN.LottertyCodeInfo.IsUsed, Value: 1}}, + }, + } + if _, err := dbLotCodeInfo.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", TN.LottertyCodeInfo, err)) + } +} +func InitLotGift(ctx context.Context) { + // 获取数据库表 + dbLotGift = mongos.New(mongos.MgoManager, TN.LotteryGift) + + // 初始化 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: FN.LotteryGift.ActId, Value: 1}}, + }, + { + Keys: bson.D{{Key: FN.LotteryGift.GiftName, Value: 1}}, + }, + } + if _, err := dbLotGift.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", TN.LotteryGift, err)) + } +} + +func InitLotGiftCode(ctx context.Context) { + // 获取数据库表 + dbLotGetGift = mongos.New(mongos.MgoManager, TN.LotteryGetGift) + + // 初始化 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: FN.LotteryGetGift.GiftCode, Value: 1}}, + }, + { + Keys: bson.D{{Key: FN.LotteryGetGift.AppName, Value: 1}}, + }, + { + Keys: bson.D{{Key: FN.LotteryGetGift.ActId, Value: 1}}, + }, + { + Keys: bson.D{{Key: FN.LotteryGetGift.GiftId, Value: 1}}, + }, + } + if _, err := dbLotGetGift.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", TN.LotteryGetGift, err)) + } +} + +//InsertOneActivityInfo 插入一个活动信息 +func InsertOneActivityInfo(ctx context.Context, data *ActivityInfo) error { + if _, err := dbAct.InsertOne(ctx, data); err != nil { + log.Warn("activitymod:InsertOneActivityInfo db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneActivityInfo 查找一个活动信息 +func FindOneActivityInfo(ctx context.Context, filter bson.M) (*ActivityInfo, error) { + var data ActivityInfo + if err := dbAct.FindOneEx(ctx, &data, filter); err != nil { + log.Warn("activitymod:FindOneActivityInfo db.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + + return &data, nil +} + +//DelOneActivityInfo 删除一个活动信息 +func DelOneActivityInfo(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbAct.DeleteOne(ctx, filter) + if err != nil { + log.Warn("activitymod:DelOneActivityInfo db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneActivityInfo 更新一个活动信息 +func UpdateOneActivityInfo(ctx context.Context, filter bson.M, update bson.M) error { + result, err := dbAct.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("activitymod:UpdateOneActivityInfo activitymod:UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + if result.MatchedCount == 0 { + return mongo.ErrNoDocuments + } + return nil +} + +//CountActivityInfos 统计活动信息数量 +func CountActivityInfos(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbAct.Count(ctx, filter) + if err != nil { + log.Warn("activitymod:CountActivityInfos db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyActivityInfo 更新满足条件的活动信息 +func UpdateManyActivityInfo(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbAct.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyActivityInfo db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyActivityInfo 查找一批活动信息数据 +func FindManyActivityInfo(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (ActivityInfoList, error) { + data := make(ActivityInfoList, 0) + if err := dbAct.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("activitymod:FindManyActivityInfo db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyActivityInfoWithBind 用自己定义结构查找一批活动信息数据 +func FindManyActivityInfoWithBind(ctx context.Context, bind interface{}, filter bson.M, opts ...*options.FindOptions) error { + if err := dbAct.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("activitymod:FindManyActivityInfoWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//InsertOneLottertyCodeInfo 插入一个抽奖码信息 +func InsertOneLottertyCodeInfo(ctx context.Context, data *LottertyCodeInfo) error { + if _, err := dbLotCodeInfo.InsertOne(ctx, data); err != nil { + log.Warn("activitymod:InsertOneLottertyCodeInfo db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneLottertyCodeInfo 查找一个抽奖码信息 +func FindOneLottertyCodeInfo(ctx context.Context, filter bson.M) (*LottertyCodeInfo, error) { + var data LottertyCodeInfo + if err := dbLotCodeInfo.FindOneEx(ctx, &data, filter); err != nil { + log.Warn("LottertyCodeInfo:FindOneLottertyCodeInfo activitymod:FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &data, nil +} + +//DelOneLottertyCodeInfo 删除一个抽奖码信息 +func DelOneLottertyCodeInfo(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbLotCodeInfo.DeleteOne(ctx, filter) + if err != nil { + log.Warn("LottertyCodeInfo:DelOneLottertyCodeInfo activitymod:DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneLottertyCodeInfo 更新一个抽奖码信息 +func UpdateOneLottertyCodeInfo(ctx context.Context, filter bson.M, update bson.M) error { + result, err := dbLotCodeInfo.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("UpdateOneLottertyCodeInfo activitymod:UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + if result.MatchedCount == 0 { + return mongo.ErrNoDocuments + } + return nil +} + +//CountLottertyCodeInfos 统计抽奖码信息数量 +func CountLottertyCodeInfos(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbLotCodeInfo.Count(ctx, filter) + if err != nil { + log.Warn("LottertyCodeInfo:CountLottertyCodeInfos activitymod:Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyLottertyCodeInfo 更新满足条件的抽奖码信息 +func UpdateManyLottertyCodeInfo(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbLotCodeInfo.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyLottertyCodeInfo activitymod:UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyLottertyCodeInfo 查找一批抽奖码信息数据 +func FindManyLottertyCodeInfo(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (LottertyCodeInfoList, error) { + data := make(LottertyCodeInfoList, 0) + if err := dbLotCodeInfo.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("LottertyCodeInfo:FindManyLottertyCodeInfo activitymod:Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyLottertyCodeInfoWithBind 用自己定义结构查找一批抽奖码信息数据 +func FindManyLottertyCodeInfoWithBind(ctx context.Context, bind interface{}, filter bson.M, opts ...*options.FindOptions) error { + if err := dbLotCodeInfo.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("LottertyCodeInfo:FindManyLottertyCodeInfoWithBind activitymod:Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//InsertOneLotteryGift 插入一个奖品信息 +func InsertOneLotteryGift(ctx context.Context, data *LotteryGift) error { + if _, err := dbLotGift.InsertOne(ctx, data); err != nil { + log.Warn("activitymod:InsertOneLotteryGift db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneLotteryGift 查找一个奖品信息 +func FindOneLotteryGift(ctx context.Context, filter bson.M) (*LotteryGift, error) { + var data LotteryGift + if err := dbLotGift.FindOneEx(ctx, &data, filter); err != nil { + log.Warn("LotteryGift:FindOneLotteryGift dbLotGift.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &data, nil +} + +//DelOneLotteryGift 删除一个奖品信息 +func DelOneLotteryGift(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbLotGift.DeleteOne(ctx, filter) + if err != nil { + log.Warn("LotteryGift:DelOneLotteryGift dbLotGift.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneLotteryGift 更新一个奖品信息 +func UpdateOneLotteryGift(ctx context.Context, filter bson.M, update bson.M) error { + result, err := dbLotGift.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("UpdateOneLotteryGift dbLotGift.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + if result.MatchedCount == 0 { + return mongo.ErrNoDocuments + } + return nil +} + +//CountLotteryGifts 统计奖品信息数量 +func CountLotteryGifts(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbLotGift.Count(ctx, filter) + if err != nil { + log.Warn("LotteryGift:CountLotteryGifts dbLotGift.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyLotteryGift 更新满足条件的奖品信息 +func UpdateManyLotteryGift(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbLotGift.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyLotteryGift dbLotGift.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyLotteryGift 查找一批奖品信息数据 +func FindManyLotteryGift(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (LotteryGiftList, error) { + data := make(LotteryGiftList, 0) + if err := dbLotGift.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("LotteryGift:FindManyLotteryGift dbLotGift.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyLotteryGiftWithBind 用自己定义结构查找一批奖品信息数据 +func FindManyLotteryGiftWithBind(ctx context.Context, bind interface{}, filter bson.M, opts ...*options.FindOptions) error { + if err := dbLotGift.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("LotteryGift:FindManyLotteryGiftWithBind dbLotGift.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//InsertOneLotteryGetGift 插入一个中奖兑换相关信息 +func InsertOneLotteryGetGift(ctx context.Context, media *LotteryGetGift) error { + if _, err := dbLotGetGift.InsertOne(ctx, media); err != nil { + log.Warn("activitymod:InsertOneLotteryGetGift dbLotGetGift.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneLotteryGetGift 查找一个中奖兑换相关信息 +func FindOneLotteryGetGift(ctx context.Context, filter bson.M) (*LotteryGetGift, error) { + var data LotteryGetGift + if err := dbLotGetGift.FindOneEx(ctx, &data, filter); err != nil { + log.Warn("LotteryGetGift:FindOneLotteryGetGift dbLotGetGift.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &data, nil +} + +//DelOneLotteryGetGift 删除一个中奖兑换相关信息 +func DelOneLotteryGetGift(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbLotGetGift.DeleteOne(ctx, filter) + if err != nil { + log.Warn("LotteryGetGift:DelOneLotteryGetGift dbLotGetGift.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneLotteryGetGift 更新一个中奖兑换相关信息 +func UpdateOneLotteryGetGift(ctx context.Context, filter bson.M, update bson.M) error { + result, err := dbLotGetGift.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("UpdateOneLotteryGetGift dbLotGetGift.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + if result.MatchedCount == 0 { + return mongo.ErrNoDocuments + } + return nil +} + +//CountLotteryGetGifts 统计中奖兑换相关信息数量 +func CountLotteryGetGifts(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbLotGetGift.Count(ctx, filter) + if err != nil { + log.Warn("LotteryGetGift:CountLotteryGetGifts dbLotGetGift.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyLotteryGetGift 更新满足条件的中奖兑换相关信息 +func UpdateManyLotteryGetGift(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbLotGetGift.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyLotteryGetGift dbLotGetGift.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyLotteryGetGift 查找一批渠道中奖兑换相关信息 +func FindManyLotteryGetGift(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (LotteryGetGiftList, error) { + data := make(LotteryGetGiftList, 0) + if err := dbLotGetGift.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("LotteryGetGift:FindManyLotteryGetGift dbLotGetGift.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyLotteryGetGiftWithBind 用自己定义结构查找一批渠道中奖兑换相关信息 +func FindManyLotteryGetGiftWithBind(ctx context.Context, bind interface{}, filter bson.M, opts ...*options.FindOptions) error { + if err := dbLotGetGift.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("LotteryGetGift:FindManyLotteryGetGiftWithBind dbLotGetGift.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} diff --git a/models/activitymod/tag.go b/models/activitymod/tag.go new file mode 100755 index 0000000..89805fd --- /dev/null +++ b/models/activitymod/tag.go @@ -0,0 +1,127 @@ +package activitymod + +type TagLotteryGift struct { + ActId string + ActName string + CreatedAt string + GiftDesc string + GiftName string + Id string + Rate string + Sort string + UpdatedAt string +} +type TagLotteryGetGift struct { + ActId string + ActName string + AppName string + CreatedAt string + GetGiftAt string + GiftCode string + GiftId string + GiftName string + Id string + IsGaveOut string + IsUsed string + LotteryCode string + Remark string + UpdatedAt string + UserId string +} +type TagActivityInfo struct { + Background string + Banner string + CreatedAt string + Desc string + Enable string + EndTime string + GiftDesc string + H5Domain string + Id string + Name string + SortCode string + StartTime string + UpdatedAt string +} +type TagLottertyCodeInfo struct { + ActId string + ActName string + CreatedAt string + GiftCode string + Id string + IsUsed string + LotteryAt string + LotteryCode string + Remark string + UpdatedAt string + UserIp string +} + +var FN struct { + LotteryGift TagLotteryGift + LotteryGetGift TagLotteryGetGift + ActivityInfo TagActivityInfo + LottertyCodeInfo TagLottertyCodeInfo +} + +var TN struct { + LotteryGift string + LotteryGetGift string + ActivityInfo string + LottertyCodeInfo string +} + +func init() { + FN.LotteryGift.ActId = "actId" + FN.LotteryGift.ActName = "actName" + FN.LotteryGift.CreatedAt = "createdAt" + FN.LotteryGift.GiftDesc = "giftDesc" + FN.LotteryGift.GiftName = "giftName" + FN.LotteryGift.Id = "_id" + FN.LotteryGift.Rate = "rate" + FN.LotteryGift.Sort = "sort" + FN.LotteryGift.UpdatedAt = "updatedAt" + FN.LotteryGetGift.ActId = "actId" + FN.LotteryGetGift.ActName = "actName" + FN.LotteryGetGift.AppName = "appName" + FN.LotteryGetGift.CreatedAt = "createdAt" + FN.LotteryGetGift.GetGiftAt = "getGiftAt" + FN.LotteryGetGift.GiftCode = "giftCode" + FN.LotteryGetGift.GiftId = "giftId" + FN.LotteryGetGift.GiftName = "giftName" + FN.LotteryGetGift.Id = "_id" + FN.LotteryGetGift.IsGaveOut = "isGaveOut" + FN.LotteryGetGift.IsUsed = "isUsed" + FN.LotteryGetGift.LotteryCode = "lotteryCode" + FN.LotteryGetGift.Remark = "remark" + FN.LotteryGetGift.UpdatedAt = "updatedAt" + FN.LotteryGetGift.UserId = "userId" + FN.ActivityInfo.Background = "background" + FN.ActivityInfo.Banner = "banner" + FN.ActivityInfo.CreatedAt = "createdAt" + FN.ActivityInfo.Desc = "desc" + FN.ActivityInfo.Enable = "enable" + FN.ActivityInfo.EndTime = "endTime" + FN.ActivityInfo.GiftDesc = "giftDesc" + FN.ActivityInfo.H5Domain = "h5Domain" + FN.ActivityInfo.Id = "_id" + FN.ActivityInfo.Name = "name" + FN.ActivityInfo.SortCode = "sortCode" + FN.ActivityInfo.StartTime = "startTime" + FN.ActivityInfo.UpdatedAt = "updatedAt" + FN.LottertyCodeInfo.ActId = "actId" + FN.LottertyCodeInfo.ActName = "actName" + FN.LottertyCodeInfo.CreatedAt = "createdAt" + FN.LottertyCodeInfo.GiftCode = "giftCode" + FN.LottertyCodeInfo.Id = "_id" + FN.LottertyCodeInfo.IsUsed = "isUsed" + FN.LottertyCodeInfo.LotteryAt = "lotteryAt" + FN.LottertyCodeInfo.LotteryCode = "lotteryCode" + FN.LottertyCodeInfo.Remark = "remark" + FN.LottertyCodeInfo.UpdatedAt = "updatedAt" + FN.LottertyCodeInfo.UserIp = "userIp" + TN.LotteryGetGift = "lottery_get_gift" + TN.ActivityInfo = "activity_info" + TN.LottertyCodeInfo = "lotterty_code_info" + TN.LotteryGift = "lottery_gift" +} diff --git a/models/activitymod/type.go b/models/activitymod/type.go new file mode 100644 index 0000000..f16478d --- /dev/null +++ b/models/activitymod/type.go @@ -0,0 +1,88 @@ +package activitymod + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 活动信息 +// @table:activity_info +type ActivityInfo struct { + Id primitive.ObjectID `json:"id" bson:"_id"` // 唯一ID + Name string `json:"name" bson:"name"` // 活动名称 + Desc string `json:"desc" bson:"desc"` // 活动说明 + SortCode int32 `json:"sortCode" bson:"sortCode"` // 排序号 + H5Domain string `json:"h5Domain" bson:"h5Domain"` // 活动H5地址 + GiftDesc string `json:"giftDesc" bson:"giftDesc"` // 奖励说明 + Enable bool `json:"enable" bson:"enable"` // 活动开关 + Background string `json:"background" bson:"background"` // 背景图 + StartTime time.Time `json:"startTime" bson:"startTime"` // 活动开始时间 + EndTime time.Time `json:"endTime" bson:"endTime"` // 活动结束时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` + Banner []BannerInfo `json:"banner" bson:"banner"` // banner列表 +} + +type BannerInfo struct { + Img string `json:"bannerImg" bson:"bannerImg"` // banner图片 + Url string `json:"bannerUrl" bson:"bannerUrl"` // banner跳转地址 +} + +type ActivityInfoList []*ActivityInfo + +// 抽奖码相关信息 +// @table:lotterty_code_info +type LottertyCodeInfo struct { + Id primitive.ObjectID `json:"id" bson:"_id"` // 唯一ID + LotteryCode string `json:"lotteryCode" bson:"lotteryCode"` // 抽奖码 + ActId string `json:"actId" bson:"actId"` // 所属活动的ID + ActName string `json:"actName" bson:"actName"` // 活动名称 + UserIp string `json:"userIp" bson:"userIp"` // 抽奖者IP + Remark string `json:"remark" bson:"remark"` // 备注 + IsUsed bool `json:"isUsed" bson:"isUsed"` // 抽奖码是否已使用 + GiftCode string `json:"giftCode" bson:"giftCode"` // 奖品兑换码 + LotteryAt time.Time `json:"lotteryAt" bson:"lotteryAt"` // 抽奖时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` +} + +type LottertyCodeInfoList []*LottertyCodeInfo + +// 奖品信息 +// @table:lottery_gift +type LotteryGift struct { + Id primitive.ObjectID `json:"id" bson:"_id"` // 唯一ID + ActId string `json:"actId" bson:"actId"` // 所属活动的ID + ActName string `json:"actName" bson:"actName"` // 所属活动的名称 + GiftName string `json:"giftName" bson:"giftName"` // 奖品名称 + GiftDesc string `json:"giftDesc" bson:"giftDesc"` // 奖品描述 + Rate int32 `json:"rate" bson:"rate"` // 备注 + Sort int32 `json:"sort" bson:"sort"` // 排序 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` +} + +type LotteryGiftList []*LotteryGift + +// 中奖兑换相关信息 +// @table:lottery_get_gift +type LotteryGetGift struct { + Id primitive.ObjectID `json:"id" bson:"_id"` // 唯一ID + LotteryCode string `json:"lotteryCode" bson:"lotteryCode"` // 抽奖码 + ActId string `json:"actId" bson:"actId"` // 所属活动的ID + ActName string `json:"actName" bson:"actName"` // 所属活动的名称 + GiftId string `json:"giftId" bson:"giftId"` // 所属活动奖品的ID + GiftName string `json:"giftName" bson:"giftName"` // 奖品名称 + UserId string `json:"userId" bson:"userId"` // 兑换者Id + AppName string `json:"appName" bson:"appName"` // 所属app的名字 + Remark string `json:"remark" bson:"remark"` // 备注 + IsGaveOut bool `json:"isGaveOut" bson:"isGaveOut"` // 兑换码是否已发放 + IsUsed bool `json:"isUsed" bson:"isUsed"` // 奖品兑换码是否已使用 + GiftCode string `json:"giftCode" bson:"giftCode"` // 奖品兑换码 + GetGiftAt time.Time `json:"getGiftAt" bson:"getGiftAt"` // 兑换奖品的时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` +} + +type LotteryGetGiftList []*LotteryGetGift diff --git a/models/adminMod/admin.go b/models/adminMod/admin.go new file mode 100644 index 0000000..21fd625 --- /dev/null +++ b/models/adminMod/admin.go @@ -0,0 +1,152 @@ +package adminMod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollAdmin) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "account", Value: 1}}, + Options: options.Index().SetUnique(true), + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollAdmin, err)) + } +} + +// 根据账号获取管理员信息 +func FindOneByAccount(ctx context.Context, account string) (data Admin, err error) { + filter := bson.M{"account": account} + + if err = db.FindOne(ctx, &data, filter); err != nil { + log.Error("admin FindOneByAccount err", log.Any("account", account), log.E(err)) + return + } + + return +} + +// FindOnedmin 查找一个渠道信息 +func FindOnedmin(ctx context.Context, filter bson.M) (*Admin, error) { + var Admin Admin + if err := db.FindOne(ctx, &Admin, filter); err != nil { + log.Warn("admin:FindOnedmin.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &Admin, nil +} + +// 获取管理员列表 +func FindAdminList(ctx context.Context, blocRole *int, skip int64, limit int64) (count int64, data []Admin, err error) { + filter := bson.M{} + if blocRole != nil { + filter["blocRole"] = blocRole + } + opts := options.Find().SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("admin FindAdminList Find err", log.E(err)) + return + } + if count, err = db.Count(ctx, filter); err != nil { + log.Error("admin FindAdminList Count err", log.E(err)) + return + } + + return +} + +// 新增管理员 +func AddAdmin(ctx context.Context, doc *Admin) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error("admin AddAdmin InsertOne err", log.E(err)) + return + } + + return +} + +// 更新管理员 +func UpdateAdmin(ctx context.Context, account string, doc UpdateDoc) (err error) { + filter := bson.M{"account": account} + update, _ := utils.ToBsonM(doc) + + if _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}); err != nil { + log.Error("admin UpdateAdmin UpdateOne err", log.E(err)) + return + } + + return +} + +// 删除管理员 +func DelAdmin(ctx context.Context, account string) (err error) { + filter := bson.M{"account": account} + + if _, err = db.DeleteOne(ctx, filter); err != nil { + log.Error("admin DelAdmin DeleteOne err", log.E(err)) + return + } + return +} + +// 验证token +func CheckToken(ctx context.Context, token string) (ok bool, err error) { + booToken := Admin{} + + if err = db.FindOne(ctx, &booToken, bson.M{"token": token}); err != nil { + log.Error("admin CheckToken FindOne err", log.E(err)) + return false, err + } + + if booToken.Account == "" { + return false, nil + } + + return true, nil +} + +// 刷新token +func RefreshToken(ctx context.Context, account string, newToken string) (err error) { + filter := bson.M{"account": account} + update := bson.M{"token": newToken} + + if _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}); err != nil { + log.Error("admin RefreshToken UpdateOne err", log.E(err)) + return + } + + return +} + +// 绑定两步验证 +func TwoStepBind(ctx context.Context, account string) (err error) { + filter := bson.M{"account": account} + update := bson.M{"$set": bson.M{"hasBind": true}} + _, err = db.UpdateOne(ctx, filter, update) + return +} + +// 设置两步验证密钥 +func TwoStepSecretSet(ctx context.Context, account string, secret string) (err error) { + filter := bson.M{"account": account} + update := bson.M{"$set": bson.M{"secret": secret}} + _, err = db.UpdateOne(ctx, filter, update) + return +} diff --git a/models/adminMod/type.go b/models/adminMod/type.go new file mode 100644 index 0000000..e60da69 --- /dev/null +++ b/models/adminMod/type.go @@ -0,0 +1,37 @@ +package adminMod + +import ( + "stat/common/mongos" + "time" +) + +const CollAdmin = "admin" + +var db *mongos.MongoTool + +type Admin struct { + Account string `bson:"account"` // 用户名 + Password string `bson:"password"` // 密码 + Name string `bson:"name"` // 名称 + RoleId int64 `bson:"roleId"` // 角色id + Token string `bson:"token"` // token + Status int64 `bson:"status"` // 状态 + Secret string `bson:"secret"` // 两步验证密钥 + HasBind bool `bson:"hasBind"` // 已绑定 true,曾成功登录,反之false + MerchantId string `bson:"MerchantId"` // 商人id + BlocRole int `bson:"blocRole"` // 集团账号 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt"` // 更新时间 + LastTime time.Time `bson:"lastTime"` // 登录时间 +} + +type UpdateDoc struct { + Account *string `bson:"account,omitempty"` // 用户名 + Password *string `bson:"password,omitempty"` // 密码 + Name *string `bson:"name,omitempty"` // 名称 + RoleId *int64 `bson:"roleId,omitempty"` // 角色 + Status *int64 `bson:"status,omitempty"` // 状态 + MerchantId *string `bson:"MerchantId,omitempty"` // 商人id + BlocRole *int `bson:"blocRole,omitempty"` // 集团账号 + UpdatedAt *time.Time `bson:"updatedAt,omitempty"` // 更新时间 +} diff --git a/models/advertiseLocMod/advertise.go b/models/advertiseLocMod/advertise.go new file mode 100644 index 0000000..862fdfa --- /dev/null +++ b/models/advertiseLocMod/advertise.go @@ -0,0 +1,135 @@ +package advertiseLocMod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollAdvertiseLocation) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "locId", Value: 1}}, + Options: options.Index().SetUnique(true), + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollAdvertiseLocation, err)) + } +} + +// 新增广告位置信息 +func AddAdvertiseLocation(ctx context.Context, doc *AdvertiseLocation) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error("advertise location AddAdvertiseLocation InsertOne err", log.E(err)) + return + } + return +} + +// 修改广告位置信息就 +func UpdateAdvertiseLocation(ctx context.Context, id int64, doc UpdateAdsLoc) (err error) { + filter := bson.M{"_id": id} + + update, _ := utils.ToBsonM(doc) + + if _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}); err != nil { + log.Error("advertise location UpdateAdvertiseLocation UpdateOne err", log.E(err)) + return + } + + return +} + +// 删除广告位置信息就 +func DelAdvertiseLocation(ctx context.Context, id int64) (err error) { + filter := bson.M{"_id": id} + + if _, err = db.DeleteOne(ctx, filter); err != nil { + log.Error("advertise location DelAdvertiseLocation UpdateOne err", log.E(err)) + return + } + + return +} + +// 删除广告位置信息就 +func FindAdvertiseLocationList(ctx context.Context, appId *int32, skip, limit int64) (count int64, data []AdvertiseLocation, err error) { + filter := bson.M{} + + if appId != nil { + filter["appId"] = appId + } + + sort := bson.D{{Key: "createdAt", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("advertise location FindAdvertiseLocationList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("advertise location FindAdvertiseLocationList Count err", log.E(err)) + return + } + + return +} + +// 根据应用id和位置id获取广告位置 +func FindLocationByAppIdAndLocId(ctx context.Context, appId, locId int32) (data AdvertiseLocation, err error) { + filter := bson.M{"appId": appId, "locId": locId} + + if err = db.FindOne(ctx, &data, filter); err != nil { + log.Error("advertise location FindLocationByAppIdAndLocId FindOne err", log.E(err)) + return + } + + return +} + +// 根据id获取广告位置 +func FindLocationById(ctx context.Context, id int64) (data AdvertiseLocation, err error) { + filter := bson.M{"_id": id} + + if err = db.FindOne(ctx, &data, filter); err != nil { + log.Error("advertise location FindLocationById FindOne err", log.E(err)) + return + } + + return +} + +// GetAllAdvertiseLocationMap 获取 map[appId]map[locId]*AdvertiseLocation +func GetAllAdvertiseLocationMap(ctx context.Context, filter bson.M) (map[int32]map[int32]*AdvertiseLocation, error) { + dict := make(map[int32]map[int32]*AdvertiseLocation) + list := make([]*AdvertiseLocation, 0) + if err := db.Find(ctx, &list, filter); err != nil { + log.Error("AdvertiseLocation GetAllAdvertiseMap Find err", log.E(err)) + return dict, err + } + for _, loc := range list { + m := dict[loc.AppId] + if m == nil { + m = make(map[int32]*AdvertiseLocation) + m[loc.LocId] = loc + dict[loc.AppId] = m + } else { + m[loc.LocId] = loc + } + } + return dict, nil +} diff --git a/models/advertiseLocMod/type.go b/models/advertiseLocMod/type.go new file mode 100644 index 0000000..fb59798 --- /dev/null +++ b/models/advertiseLocMod/type.go @@ -0,0 +1,30 @@ +package advertiseLocMod + +import ( + "stat/common/mongos" + "time" +) + +const CollAdvertiseLocation = "advertise_location" + +var db *mongos.MongoTool + +type AdvertiseLocation struct { + Id int64 `bson:"_id"` // 唯一id + AppId int32 `bson:"appId"` // 应用id + LocId int32 `bson:"locId"` // 位置id,外部使用的id,方便app配置 + Name string `bson:"name"` // 位置名称 + ImgSizeDesc string `bson:"imgSizeDesc"` // 该位置图片描述 + Remark string `bson:"remark"` // 备注 + CreatedAt time.Time `bson:"createAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt"` // 更新时间 +} + +type UpdateAdsLoc struct { + AppId *int32 `bson:"appId,omitempty"` // 应用id + LocId *int32 `bson:"locId,omitempty"` // 位置id,外部使用的id,方便app配置 + Name *string `bson:"name,omitempty"` // 位置名称 + ImgSizeDesc *string `bson:"imgSizeDesc,omitempty"` // 该位置图片描述 + Remark *string `bson:"remark,omitempty"` // 备注 + UpdatedAt *time.Time `bson:"updatedAt,omitempty"` // 更新时间 +} diff --git a/models/advertiseMod/advertise.go b/models/advertiseMod/advertise.go new file mode 100644 index 0000000..cf91404 --- /dev/null +++ b/models/advertiseMod/advertise.go @@ -0,0 +1,220 @@ +package advertiseMod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/stdLog" + "stat/common/utils" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollAdvertise) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "appId", Value: 1}}, + }, + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "isActive", Value: 1}, {Key: "startTime", Value: 1}, {Key: "endTime", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollAdvertise, err)) + } +} + +// 新增广告 +func AddAdvertise(ctx context.Context, doc *Advertise) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error("advertise AddAdvertise InsertOne err", log.E(err)) + return + } + return +} + +// 修改广告 +func UpdateAdvertise(ctx context.Context, id int64, doc UpdateAds) (err error) { + filter := bson.M{"_id": id} + + update, _ := utils.ToBsonM(doc) + + if _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}); err != nil { + log.Error("advertise UpdateAdvertise UpdateOne err", log.E(err)) + return + } + + return +} + +// 删除广告 +func DelAdvertise(ctx context.Context, id int64) (err error) { + filter := bson.M{"_id": id} + + if _, err = db.DeleteOne(ctx, filter); err != nil { + log.Error("advertise DelAdvertise DeleteOne err", log.E(err)) + return + } + + return +} + +func FindAdvertiseList(ctx context.Context, appId *int32, isActive *bool, locId *int32, skip, limit int64, + link, title, daoLiangTitle *string) (count int64, data []Advertise, err error) { + filter := bson.M{} + if appId != nil { + filter["appId"] = appId + } + if isActive != nil { + filter["isActive"] = isActive + } + if locId != nil { + filter["locId"] = *locId + } + if link != nil { + filter["links"] = bson.M{"$elemMatch": bson.M{"link": *link}} + } + if title != nil { + filter["title"] = bson.M{"$regex": *title} + } + if daoLiangTitle != nil { + filter["daoLiangTitle"] = bson.M{"$regex": *daoLiangTitle} + } + sort := bson.D{{Key: "sort", Value: 1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("advertise FindAdvertiseList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("advertise FindAdvertiseList Count err", log.E(err)) + return + } + + return +} + +// 根据appId和locId更新位置id +func UpdateLocInfo(ctx context.Context, appId, oldLocId, newLocID int32) (err error) { + filter := bson.M{"appId": appId, "locId": oldLocId} + + update := bson.M{"$set": bson.M{"locId": newLocID}} + + if _, err = db.UpdateMany(ctx, filter, update); err != nil { + log.Error("advertise UpdateLocInfo UpdateMany err", log.E(err)) + return + } + return +} + +// 根据app和位置获取广告 +func FindAdsByAppAndLocation(ctx context.Context, appId int32, locId *int32) (data []Advertise, err error) { + now := time.Now() + filter := bson.M{"appId": appId, "isActive": true, "startTime": bson.M{"$lt": now}, "endTime": bson.M{"$gte": now}} + if locId != nil { + filter["locId"] = locId + } + + sort := bson.D{{Key: "sort", Value: 1}} + + opts := options.Find().SetSort(sort) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("advertise FindAdsByAppAndLocation Find err", log.E(err)) + return + } + return +} + +// 根据app和位置获取广告 +func FindAdsById(ctx context.Context, id int64) (data Advertise, err error) { + filter := bson.M{"_id": id} + + if err = db.FindOne(ctx, &data, filter); err != nil { + log.Error("advertise FindAdsById FindOne err", log.E(err)) + return + } + + return +} + +// 增加广告点击量 +func IncAdsClickCount(ctx context.Context, id int64) (err error) { + filter := bson.M{"_id": id} + + update := bson.M{"$inc": bson.M{"clickCount": 1}} + + if _, err = db.UpdateOne(ctx, filter, update); err != nil { + log.Error("advertise IncAdsClickCount UpdateOne err", log.E(err)) + return + } + + return +} + +// FindAds 根据app和位置获取广告 +func FindAds(ctx context.Context) (data []Advertise, err error) { + filter := bson.M{} + + sort := bson.D{{Key: "sort", Value: 1}} + + opts := options.Find().SetSort(sort) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("advertise FindAdsByAppAndLocation Find err", log.E(err)) + return + } + return +} + +// FindOneAdvertise 查找一个应用 +func FindOneAdvertise(ctx context.Context, filter bson.M) ( + *Advertise, error) { + var advertise Advertise + if err := db.FindOneEx(ctx, &advertise, filter); err != nil { + return nil, err + } + return &advertise, nil +} + +// GetAllAdvertiseMap 获取ads id map +func GetAllAdvertiseMap(ctx context.Context, filter bson.M) (map[int64]*Advertise, error) { + dict := make(map[int64]*Advertise) + list := make([]*Advertise, 0) + if err := db.Find(ctx, &list, filter); err != nil { + log.Error("Advertise GetAllAdvertiseMap Find err", log.E(err)) + return dict, err + } + for _, ads := range list { + dict[ads.Id] = ads + } + return dict, nil +} + +// FindAds 根据app和位置获取广告 +func FindAdvertiselist(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (data []Advertise, serr *stdLog.SrvErr) { + + if err := db.Find(ctx, &data, filter, opts...); err != nil { + if err != mongo.ErrNoDocuments { + log.Error("advertise FindAdvertiselist err", log.E(err)) + return nil, stdLog.New(stdLog.DataEmpty, "", err.Error()) + } + + log.Error("advertise FindAdvertiselist Find err", log.E(err)) + return nil, stdLog.New(stdLog.QueryDataError, "", err.Error()) + } + + return +} diff --git a/models/advertiseMod/type.go b/models/advertiseMod/type.go new file mode 100644 index 0000000..d3e8e3c --- /dev/null +++ b/models/advertiseMod/type.go @@ -0,0 +1,67 @@ +package advertiseMod + +import ( + "stat/common/mongos" + "time" +) + +const CollAdvertise = "advertise" + +var db *mongos.MongoTool + +type JumpType = int64 + +const ( + JumpTypeOutsideBrowser JumpType = iota // 0:外部浏览器跳转 + JumpTypeInsideBrowser // 1:内部浏览器跳转 + JumpTypeInsideApp // 2:app内部跳转 +) + +type LinkInfo struct { + Link string `bson:"link"` // 链接地址 + Foreign bool `bson:"foreign"` // true 国外用户 + Weight int `bson:"weight"` // 权重 +} + +type Advertise struct { + Id int64 `bson:"_id"` // 广告id + AppId int32 `bson:"appId"` // 应用id + LocId int32 `bson:"locId"` // 位置id + Title string `bson:"title"` // 广告标题 + DaoLiangTitle string `bson:"daoLiangTitle"` // 广告导量标题 + Tags string `bson:"tags"` // 广告标签 + CoverImg string `bson:"coverImg"` // 封面 + VisibleChannels []string `bson:"visibleChannels"` // 可见的渠道 + JumpType JumpType `bson:"jumpType"` // 跳转方式 + Link string `bson:"link"` // 链接 + Links []LinkInfo `bson:"links"` // 链接地址 + Sort int64 `bson:"sort"` // 排序值--优先级 + IsActive bool `bson:"isActive"` // 是否激活 + StartTime time.Time `bson:"startTime"` // 开始时间 + EndTime time.Time `bson:"endTime"` // 结束时间 + Remark string `bson:"remark"` // 备注 + ClickCount int64 `bson:"clickCount"` // 点击次数 + AmbientColor string `bson:"ambientColor"` // 氛围色(逼哩漫画) + CreatedAt time.Time `bson:"createAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt"` // 更新时间 +} + +type UpdateAds struct { + AppId *int32 `bson:"appId,omitempty"` // 应用id + LocId *int32 `bson:"locId,omitempty"` // 位置id + Title *string `bson:"title,omitempty"` // 广告标题 + DaoLiangTitle *string `bson:"daoLiangTitle,omitempty"` // 广告导量标题 + Tags *string `bson:"tags,omitempty"` // 广告标签 + CoverImg *string `bson:"coverImg,omitempty"` // 封面 + VisibleChannels *[]string `bson:"visibleChannels,omitempty"` // 可见的渠道 + Location *int64 `bson:"location,omitempty"` // 位置 + JumpType *JumpType `bson:"jumpType,omitempty"` // 跳转方式 + Links *[]LinkInfo `bson:"links,omitempty"` // 链接地址 + Sort *int64 `bson:"sort,omitempty"` // 排序值--优先级 + IsActive *bool `bson:"isActive,omitempty"` // 是否激活 + StartTime *time.Time `bson:"startTime,omitempty"` // 开始时间 + EndTime *time.Time `bson:"endTime,omitempty"` // 结束时间 + Remark *string `bson:"remark,omitempty"` // 备注 + AmbientColor *string `bson:"ambientColor"` // 氛围色(逼哩漫画) + UpdatedAt *time.Time `bson:"updatedAt,omitempty"` // 更新时间 +} diff --git a/models/advertisestat/advertisestat.go b/models/advertisestat/advertisestat.go new file mode 100644 index 0000000..7178613 --- /dev/null +++ b/models/advertisestat/advertisestat.go @@ -0,0 +1,149 @@ +package advertisestat + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/stdLog" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 表名 + +var db *mongos.MongoTool + +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.AdvertiseStat) + // 获取数据库表 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.AdvertiseStat.AdsId, Value: 1}, + {Key: FN.AdvertiseStat.SumData, Value: -1}, + }, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{ + {Key: FN.AdvertiseStat.Id, Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: FN.AdvertiseStat.AppId, Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: FN.AdvertiseStat.SumData, Value: -1}, + }, + }, + { + Keys: bson.D{ + {Key: FN.AdvertiseStat.Total, Value: -1}, + }, + }, + } + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("(media:initAdvertiseStatIndex) Create AdvertiseStat Index failed! err:%+v:", err)) + } +} + +// InsertOneAdvertiseStat 插入一个广告统计 +func InsertOneAdvertiseStat(ctx context.Context, applicationStat *AdvertiseStat) error { + if _, err := db.InsertOne(ctx, applicationStat); err != nil { + log.Warn("media:InsertOneAdvertiseStat db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// DelOneAdvertiseStat 删除一个广告统计tag +func DelOneAdvertiseStat(ctx context.Context, filter bson.M) (int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("media:DelOneAdvertiseStat db.DeleteOne failed", log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// FindOneAdvertiseStat 查找一个广告统计 +func FindOneAdvertiseStat(ctx context.Context, filter bson.M) (*AdvertiseStat, error) { + var applicationStat AdvertiseStat + if err := db.FindOneEx(ctx, &applicationStat, filter); err != nil { //mongo.ErrNoDocuments + return nil, err + } + return &applicationStat, nil +} + +// CountAdvertiseStats 统计广告统计数量 +func CountAdvertiseStats(ctx context.Context, filter bson.M) (int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("media:CountAdvertiseStats db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateOneAdvertiseStat 更新一个广告统计 +func UpdateOneAdvertiseStat(ctx context.Context, filter bson.M, update bson.M) error { + result, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("media:UpdateOneAdvertiseStat db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + if result.MatchedCount != 1 { + log.Warn("media:UpdateOneAdvertiseStat db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return mongo.ErrNoDocuments + } + return nil +} + +// UpdateManyAdvertiseStat 更新一批广告统计 +func UpdateManyAdvertiseStat(ctx context.Context, filter bson.M, update bson.M) error { + result, err := db.UpdateMMany(ctx, filter, update) + if err != nil { + log.Warn("media:UpdateManyAdvertiseStat db.UpdateMMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + if result.MatchedCount <= 0 { + log.Warn("media:UpdateManyAdvertiseStat db.UpdateMMany failed", + log.E(err), log.Any("filter", filter)) + //return srvdef.New(srvdef.ErrApplicationNotExsit, "", "") + } + return nil +} + +// AggregateTopicInfos 聚合查找一批用户信息 +func AggregateAdvertiseStat(ctx context.Context, + bind interface{}, pipeline []bson.M) *stdLog.SrvErr { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateAdvertiseStat db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return stdLog.New(stdLog.QueryDataError, "", err.Error()) + } + return nil +} + +// FindManyAdvertiseStat 查找一批广告统计 +func FindManyAdvertiseStat(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (AdvertiseStatList, error) { + data := make(AdvertiseStatList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("media:FindManyAdvertiseStat db.Find failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} diff --git a/models/advertisestat/tag.go b/models/advertisestat/tag.go new file mode 100644 index 0000000..5ead4f6 --- /dev/null +++ b/models/advertisestat/tag.go @@ -0,0 +1,32 @@ +package advertisestat + +type TagAdvertiseStat struct { + Id string + AdsId string + AppId string + SumData string + Total string + HourData string + CreatedAt string + UpdatedAt string +} + +var FN struct { + AdvertiseStat TagAdvertiseStat +} + +var TN struct { + AdvertiseStat string +} + +func init() { + FN.AdvertiseStat.Id = "_id" + FN.AdvertiseStat.AdsId = "adsId" + FN.AdvertiseStat.AppId = "appId" + FN.AdvertiseStat.SumData = "sumDate" + FN.AdvertiseStat.Total = "total" + FN.AdvertiseStat.HourData = "hourData" + FN.AdvertiseStat.CreatedAt = "createdAt" + FN.AdvertiseStat.UpdatedAt = "updatedAt" + TN.AdvertiseStat = "advertisestat" +} diff --git a/models/advertisestat/type.go b/models/advertisestat/type.go new file mode 100644 index 0000000..63fde96 --- /dev/null +++ b/models/advertisestat/type.go @@ -0,0 +1,40 @@ +package advertisestat + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +const ColladvertiseStat = "advertisestat" + +type THourStat map[int]int64 + +func (m THourStat) Total() int64 { + var sum int64 + for _, v := range m { + sum += v + } + return sum +} + +type Update struct { + Total *int64 `json:"total" bson:"total,omitempty"` //今日点击 + HourData *THourStat `json:"hourData" bson:"hourData,omitempty"` //小时数据 + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` //更新时间 +} + +// 应用统计 +// @table:advertisejob +type AdvertiseStat struct { + Id primitive.ObjectID `json:"id" bson:"_id,omitempty"` + AdsId int64 `json:"adsId" bson:"adsId"` //广告ID + AppId int32 `json:"appId" bson:"appId"` //应用ID + SumDate time.Time `json:"sumDate" bson:"sumDate"` //记录时间 + Total int64 `json:"total" bson:"total"` //今日点击 + HourData THourStat `json:"hourData" bson:"hourData"` //小时数据 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //创建时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //更新时间 +} + +type AdvertiseStatList []*AdvertiseStat diff --git a/models/announInfoMod/announInfo.go b/models/announInfoMod/announInfo.go new file mode 100644 index 0000000..6abbe41 --- /dev/null +++ b/models/announInfoMod/announInfo.go @@ -0,0 +1,121 @@ +package announInfoMod + +import ( + "context" + "fmt" + "go.mongodb.org/mongo-driver/bson/primitive" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollAnnounInfo) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "appId", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollAnnounInfo, err)) + } +} + +// 获取公告列表 +func FindAnnounceList(ctx context.Context, appId *int32, skip int64, limit int64) (count int64, data []AnnounInfo, err error) { + filter := bson.M{} + + if appId != nil { + filter["appId"] = appId + } + + opts := options.Find().SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("announce FindAnnounceList Find err", log.E(err)) + return + } + if count, err = db.Count(ctx, filter); err != nil { + log.Error("announce FindAnnounceList Count err", log.E(err)) + return + } + + return +} + +// 新增管理员 +func AddAnnounce(ctx context.Context, doc *AnnounInfo) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error("announce AddAnnounce InsertOne err", log.E(err)) + return + } + + return +} + +// 更新管理员 +func UpdateAnnounce(ctx context.Context, id string, doc UpdateDoc) (err error) { + if id == "" { + return + } + + objId, err := primitive.ObjectIDFromHex(id) + if err != nil { + log.Error("announce UpdateAnnounce ObjectIDFromHex err", log.E(err)) + return + } + + filter := bson.M{"_id": objId} + update, _ := utils.ToBsonM(doc) + + if _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}); err != nil { + log.Error("announce UpdateAdmin UpdateOne err", log.E(err)) + return + } + + return +} + +// 删除管理员 +func DelAnnounce(ctx context.Context, id string) (err error) { + if id == "" { + return + } + + objId, err := primitive.ObjectIDFromHex(id) + if err != nil { + log.Error("announce DelAnnounce ObjectIDFromHex err", log.E(err)) + return + } + + filter := bson.M{"_id": objId} + + if _, err = db.DeleteOne(ctx, filter); err != nil { + log.Error("announce DelAnnounce DeleteOne err", log.E(err)) + return + } + return +} + +// 根据appId获取公告 +func FindAnnounceByAppId(ctx context.Context, appId int32) (data []AnnounInfo, err error) { + now := time.Now() + + filer := bson.M{"appId": appId, "startTime": bson.M{"$lt": now}, "endTime": bson.M{"$gt": now}} + + if err = db.Find(ctx, &data, filer); err != nil { + log.Error("announce DelAnnounce DeleteOne err", log.E(err)) + return + } + + return +} diff --git a/models/announInfoMod/type.go b/models/announInfoMod/type.go new file mode 100644 index 0000000..8f4c189 --- /dev/null +++ b/models/announInfoMod/type.go @@ -0,0 +1,36 @@ +package announInfoMod + +import ( + "go.mongodb.org/mongo-driver/bson/primitive" + "stat/common/mongos" + "time" +) + +const CollAnnounInfo = "announ_info" + +var db *mongos.MongoTool + +type AnnounInfo struct { + ID primitive.ObjectID `bson:"_id,omitempty"` // 公告id + AppId int32 `bson:"appId"` // 应用id + Title string `bson:"title"` // 公告标题 + Content string `bson:"content"` // 公告内容 + Cover string `bson:"cover"` // 公告封面图 + Href string `bson:"href"` // 公告跳转地址 + Type int `bson:"type"` // 公告类型 0,外部连接;1,直接安装app + Active bool `bson:"active"` // 是否激活 + StartTime time.Time `bson:"startTime"` // 开始时间 + EndTime time.Time `bson:"endTime"` // 结束时间 +} + +type UpdateDoc struct { + AppId *int32 `bson:"appId,omitempty"` // 应用id + Title *string `bson:"title,omitempty"` // 公告标题 + Content *string `bson:"content,omitempty"` // 公告内容 + Cover *string `bson:"cover,omitempty"` // 公告封面图 + Href *string `bson:"href,omitempty"` // 公告跳转地址 + Type *int `bson:"type,omitempty"` // 公告类型 0,外部连接;1,直接安装app + Active *bool `bson:"active,omitempty"` // 是否激活 + StartTime *time.Time `bson:"startTime,omitempty"` // 开始时间 + EndTime *time.Time `bson:"endTime,omitempty"` // 结束时间 +} diff --git a/models/appInfoMod/appInfo.go b/models/appInfoMod/appInfo.go new file mode 100644 index 0000000..2642e2e --- /dev/null +++ b/models/appInfoMod/appInfo.go @@ -0,0 +1,219 @@ +package appInfoMod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/stdLog" + "stat/common/utils" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollAppInfo) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "appId", Value: 1}}, + Options: options.Index().SetUnique(true), + }, + } + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", CollAppInfo, err)) + } +} + +// 添加渠道 +func AddAppInfo(ctx context.Context, doc *AppInfo) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error("appInfo AddAppInfo InsertOne err", log.E(err)) + return + } + + return +} + +// 修改app信息 +func UpdateAppInfo(ctx context.Context, appId int32, doc AppInfoUpdate) (err error) { + filter := bson.M{"appId": appId} + update, _ := utils.ToBsonM(doc) + + if _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}); err != nil { + log.Error("appInfo UpdateAppInfo UpdateOne err", log.Any("appId", appId), log.E(err)) + return + } + + return +} + +// 删除app信息 +func DelAppInfo(ctx context.Context, appId int32) (err error) { + filter := bson.M{"appId": appId} + + if _, err = db.DeleteOne(ctx, filter); err != nil { + log.Error("appInfo DelAppInfo DeleteOne err", log.Any("appId", appId), log.E(err)) + return + } + + return +} + +// 根据appId 获取appInfo +func GetAppInfoById(ctx context.Context, appId int32) (data AppInfo, err error) { + filter := bson.M{"appId": appId} + + if err = db.FindOne(ctx, &data, filter); err != nil { + log.Error("appInfo GetAppInfoById FindOne err", log.Any("appId", appId), log.E(err)) + return + } + + return +} + +// 根据appId 获取appInfo +func GetAppInfoByIdEx(ctx context.Context, appId int32) (*AppInfo, error) { + var err error + app := AppInfo{} + if err = db.FindOneEx(ctx, &app, bson.M{"appId": appId}); err != nil { + log.Error("appInfo GetAppInfoByIdEx FindOneEx err", log.Any("appId", appId), log.E(err)) + return nil, err + } + return &app, nil +} + +// 获取app列表 +func GetAppInfoList(ctx context.Context, appName *string, used *bool, skip, limit int64) (count int64, data []AppInfo, err error) { + filter := bson.M{} + /*if used == nil { + filter["used"] = true + } + */ + + if appName != nil { + filter["name"] = bson.M{"$regex": fmt.Sprintf("^%s", *appName)} + } + + opts := options.Find().SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("appInfo GetAppInfoList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("appInfo GetAppInfoList Count err", log.E(err)) + return + } + + return +} + +// 获取app根据appIds +func GetAppInfosByAppIds(ctx context.Context, appIds []int32) (data []AppInfo, err error) { + if len(appIds) == 0 { + return + } + + filter := bson.M{"appId": bson.M{"$in": appIds}} + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("appInfo GetAppInfosByAppIds Find err", log.Any("appIds", appIds), log.E(err)) + return + } + + return +} + +// 获取app ID列表 +func GetAppIds(ctx context.Context) (ids []int32, err error) { + filter := bson.M{ + "used": true, + } + data := make([]AppInfo, 0) + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("appInfo GetAppIds Find err", log.E(err)) + return + } + + ids = make([]int32, 0) + for _, v := range data { + ids = append(ids, v.AppId) + } + + return +} + +// 获取app ID列表 +func GetAllAppInfo(ctx context.Context) (data []AppInfo, err error) { + filter := bson.M{} + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("appInfo GetAppIds Find err", log.E(err)) + return + } + return +} + +// 获取app ID列表 +func GetAllAppInfoEx(ctx context.Context) (data []*AppInfo, err error) { + filter := bson.M{} + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("appInfo GetAppIds Find err", log.E(err)) + return + } + return +} + +// 获取app ID列表 +func GetAllAppIdMap(ctx context.Context, filter bson.M) (map[int32]*AppInfo, error) { + dict := make(map[int32]*AppInfo) + apps := make([]*AppInfo, 0) + if err := db.Find(ctx, &apps, filter); err != nil { + log.Error("appInfo GetAppIds Find err", log.E(err)) + return dict, err + } + for _, app := range apps { + dict[app.AppId] = app + } + return dict, nil +} + +// FindOneApplication 查找一个应用 +func FindOneApplication(ctx context.Context, filter bson.M) ( + *AppInfo, *stdLog.SrvErr) { + var Application AppInfo + if err := db.FindOneEx( + ctx, &Application, filter); err != nil { + if err != mongo.ErrNoDocuments { + log.Info("appinfo:FindOneApplication db.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + return nil, stdLog.New(stdLog.ErrApplicationNotExist, "", "") + } + return &Application, nil +} + +// 获取app ID-Name列表 +func GetAllAppIdNameMap(ctx context.Context) (map[int32]string, error) { + filter := bson.M{} + dict := make(map[int32]string) + apps := make([]*AppInfo, 0) + if err := db.Find(ctx, &apps, filter); err != nil { + log.Error("appInfo GetAppIds Find err", log.E(err)) + return dict, err + } + for _, app := range apps { + dict[app.AppId] = app.Name + } + return dict, nil +} diff --git a/models/appInfoMod/monitor.go b/models/appInfoMod/monitor.go new file mode 100644 index 0000000..847e74a --- /dev/null +++ b/models/appInfoMod/monitor.go @@ -0,0 +1,5 @@ +package appInfoMod + +//type DateMonitor struct { +// NewAdd +//} diff --git a/models/appInfoMod/tag.go b/models/appInfoMod/tag.go new file mode 100644 index 0000000..256f133 --- /dev/null +++ b/models/appInfoMod/tag.go @@ -0,0 +1,34 @@ +package appInfoMod + +type TagAppInfo struct { + AppId string + Name string + LandPages string + IconImg string + Used string + AdvertiseNum string + AdvertiseNewNum string + CreatedAt string + UpdatedAt string +} + +var FN struct { + AppInfo TagAppInfo +} + +var TN struct { + AppInfo string +} + +func init() { + FN.AppInfo.AppId = "appId" + FN.AppInfo.Name = "name" + FN.AppInfo.LandPages = "landPages" + FN.AppInfo.IconImg = "iconImg" + FN.AppInfo.Used = "used" + FN.AppInfo.AdvertiseNum = "advertiseNum" + FN.AppInfo.AdvertiseNewNum = "advertiseNewNum" + FN.AppInfo.CreatedAt = "createdAt" + FN.AppInfo.UpdatedAt = "updatedAt" + TN.AppInfo = CollAppInfo +} diff --git a/models/appInfoMod/type.go b/models/appInfoMod/type.go new file mode 100644 index 0000000..29520e8 --- /dev/null +++ b/models/appInfoMod/type.go @@ -0,0 +1,34 @@ +package appInfoMod + +import ( + "stat/common/mongos" + "time" +) + +// 表名 +const CollAppInfo = "app_info" + +var db *mongos.MongoTool + +type AppInfo struct { + AppId int32 `bson:"appId"` // appId,唯一id + Name string `bson:"name"` // app名称 + LandPages []string `bson:"landPages"` // 落地页列表 + IconImg string `bson:"iconImg"` // 图标 + Used bool `bson:"used"` // 是否正在使用 + AdvertiseNum int64 `bson:"advertiseNum"` // 广告系数 + AdvertiseNewNum int64 `bson:"advertiseNewNum"` // 广告新增系数 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt"` // 更新时间 +} + +type AppInfoList []*AppInfo + +type AppInfoUpdate struct { + Name *string `bson:"name,omitempty"` // app名称 + IconImg *string `bson:"iconImg,omitempty"` // 图标 + LandPages *[]string `bson:"landPages,omitempty"` // 落地页列表 + AdvertiseNum *int64 `bson:"advertiseNum,omitempty"` // 广告系数 + AdvertiseNewNum *int64 `bson:"advertiseNewNum,omitempty"` // 广告新增系数 + UpdatedAt *time.Time `bson:"updatedAt,omitempty"` // 更新时间 +} diff --git a/models/appcategory/appcategory.go b/models/appcategory/appcategory.go new file mode 100644 index 0000000..e54fdeb --- /dev/null +++ b/models/appcategory/appcategory.go @@ -0,0 +1,141 @@ +package appcategory + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/stdLog" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 表名 +const Collappcategory = "appcategory" + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, Collappcategory) + // 获取数据库表 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: "parentAppId", Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(media:initCategoryIndex) Create AppCategory Index failed! err:%+v:", err)) + } +} + +// InsertOneAppCategory 插入一个应用 +func InsertOneAppCategory(ctx context.Context, Category *AppCategory) *stdLog.SrvErr { + if _, err := db.InsertOne(ctx, Category); err != nil { + log.Warn("media:InsertOneAppCategory db.InsertOne failed", log.E(err)) + return stdLog.New(stdLog.InsertDataError, "", "") + } + return nil +} + +// DelOneAppCategory 删除一个应用tag +func DelOneAppCategory(ctx context.Context, filter bson.M) ( + int64, *stdLog.SrvErr) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("media:DelOneAppCategory db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, stdLog.New(stdLog.DelDataError, "", "") + } + return count, nil +} + +// FindOneAppCategory 查找一个应用 +func FindOneAppCategory(ctx context.Context, filter bson.M) ( + *AppCategory, *stdLog.SrvErr) { + var Category AppCategory + if err := db.FindOneEx( + ctx, &Category, filter); err != nil { + if err != mongo.ErrNoDocuments { + log.Info("media:FindOneAppCategory db.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + return nil, stdLog.New(stdLog.DataNotExist, "", "") + } + return &Category, nil +} + +// CountAppCategories 统计应用数量 +func CountAppCategories(ctx context.Context, filter bson.M) ( + int64, *stdLog.SrvErr) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("media:CountAppCategories db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, stdLog.New(stdLog.QueryDataError, "", "") + } + return count, nil +} + +// UpdateOneAppCategory 更新一个应用 +func UpdateOneAppCategory(ctx context.Context, filter bson.M, update bson.M) *stdLog.SrvErr { + result, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("media:UpdateOneAppCategory db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return stdLog.New(stdLog.UpdateDataError, "", "") + } + if result.MatchedCount != 1 { + log.Warn("media:UpdateOneAppCategory db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return stdLog.New(stdLog.DataNotExist, "", "") + } + return nil +} + +// UpdateManyAppCategory 更新一批应用 +func UpdateManyAppCategory(ctx context.Context, filter bson.M, update bson.M) *stdLog.SrvErr { + result, err := db.UpdateMMany(ctx, filter, update) + if err != nil { + log.Warn("media:UpdateManyAppCategory db.UpdateMMany failed", + log.E(err), log.Any("filter", filter)) + return stdLog.New(stdLog.UpdateDataError, "", "") + } + if result.MatchedCount <= 0 { + log.Warn("media:UpdateManyAppCategory db.UpdateMMany failed", + log.E(err), log.Any("filter", filter)) + //return srvdef.New(srvdef.ErrCategoryNotExsit, "", "") + } + return nil +} + +// FindManyAppCategory 查找一批应用 +func FindManyAppCategory(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (AppCategoryList, *stdLog.SrvErr) { + data := make(AppCategoryList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("media:FindManyAppCategory db.Find failed", + log.E(err), log.Any("filter", filter)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + return data, nil +} + +// GetAppCategoryIdNameMap 查找一批应用 +func GetAppCategoryIdNameMap(ctx context.Context) (map[int64]*AppCategory, *stdLog.SrvErr) { + list := make(AppCategoryList, 0) + if err := db.Find(ctx, &list, bson.M{}); err != nil { + log.Warn("media:GetAppCategoryIdNameMap db.Find failed", log.E(err)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + dict := make(map[int64]*AppCategory) + for _, item := range list { + dict[item.Id] = item + } + return dict, nil +} diff --git a/models/appcategory/type.go b/models/appcategory/type.go new file mode 100644 index 0000000..e79a433 --- /dev/null +++ b/models/appcategory/type.go @@ -0,0 +1,21 @@ +package appcategory + +import ( + "time" +) + +// 应用中心 +// @table:appcategory +type AppCategory struct { + Id int64 `json:"id" bson:"_id,omitempty"` + ParentAppId int64 `json:"parentAppId" bson:"parentAppId"` // parentAppId + Name string `json:"name" bson:"name"` // 名称 + Desc string `json:"desc" bson:"desc"` // 描述 + Status bool `json:"status" bson:"status"` // 状态 + Rank int64 `json:"rank" bson:"rank"` // 应用排序 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 更新时间 + ImgType int64 `json:"imgType" bson:"imgType"` // 图片展示类型 0:应用图标 1.小图标 2.大图标 +} + +type AppCategoryList []*AppCategory diff --git a/models/applicationLocMod/application.go b/models/applicationLocMod/application.go new file mode 100644 index 0000000..aa09ade --- /dev/null +++ b/models/applicationLocMod/application.go @@ -0,0 +1,163 @@ +package applicationLocMod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/stdLog" + "stat/common/utils" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollApplicationLocation) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "locId", Value: 1}}, + Options: options.Index().SetUnique(true), + }, + } + + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollApplicationLocation, err)) + } +} + +// 新增广告位置信息 +func AddApplicationLocation(ctx context.Context, doc *ApplicationLocation) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error("application location AddApplicationLocation InsertOne err", log.E(err)) + return + } + return +} + +// 修改广告位置信息就 +func UpdateApplicationLocation(ctx context.Context, id int64, doc UpdateAppLoc) (err error) { + filter := bson.M{"_id": id} + + update, _ := utils.ToBsonM(doc) + + if _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}); err != nil { + log.Error("application location UpdateApplicationLocation UpdateOne err", log.E(err)) + return + } + + return +} + +// 删除广告位置信息就 +func DelApplicationLocation(ctx context.Context, id int64) (err error) { + filter := bson.M{"_id": id} + + if _, err = db.DeleteOne(ctx, filter); err != nil { + log.Error("application location DelApplicationLocation UpdateOne err", log.E(err)) + return + } + + return +} + +// 删除广告位置信息就 +func FindApplicationLocationList(ctx context.Context, appId *int32, skip, limit int64) (count int64, data []ApplicationLocation, err error) { + filter := bson.M{} + + if appId != nil { + filter["appId"] = appId + } + + sort := bson.D{{Key: "createdAt", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("application location FindApplicationLocationList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("application location FindApplicationLocationList Count err", log.E(err)) + return + } + + return +} + +// 根据应用id和位置id获取广告位置 +func FindLocationByAppIdAndLocId(ctx context.Context, appId, locId int32) (data ApplicationLocation, err error) { + filter := bson.M{"appId": appId, "locId": locId} + + if err = db.FindOne(ctx, &data, filter); err != nil { + log.Error("application location FindLocationByAppIdAndLocId FindOne err", log.E(err)) + return + } + + return +} + +// 根据id获取广告位置 +func FindLocationById(ctx context.Context, id int64) (data ApplicationLocation, err error) { + filter := bson.M{"_id": id} + + if err = db.FindOne(ctx, &data, filter); err != nil { + log.Error("application location FindLocationById FindOne err", log.E(err)) + return + } + + return +} + +// GetAllApplicationLocationMap 获取 map[appId]map[locId]*ApplicationLocation +func GetAllApplicationLocationMap(ctx context.Context, filter bson.M) (map[int32]map[int32]*ApplicationLocation, error) { + dict := make(map[int32]map[int32]*ApplicationLocation) + list := make([]*ApplicationLocation, 0) + if err := db.Find(ctx, &list, filter); err != nil { + log.Error("ApplicationLocation GetAllApplicationMap Find err", log.E(err)) + return dict, err + } + for _, loc := range list { + m := dict[loc.AppId] + if m == nil { + m = make(map[int32]*ApplicationLocation) + m[loc.LocId] = loc + dict[loc.AppId] = m + } else { + m[loc.LocId] = loc + } + } + return dict, nil +} + +func GetAppLocIdNameMap(ctx context.Context) (map[int64]ApplicationLocation, *stdLog.SrvErr) { + list := make([]ApplicationLocation, 0) + if err := db.Find(ctx, &list, bson.M{}); err != nil { + log.Warn("media:GetAppLocIdNameMap db.Find failed", log.E(err)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + dict := make(map[int64]ApplicationLocation) + for _, item := range list { + dict[int64(item.LocId)] = item + } + return dict, nil +} + +func FindApplicationLocationDict(ctx context.Context, appId int64) map[int64]ApplicationLocation { + resp := make(map[int64]ApplicationLocation) + list := make([]ApplicationLocation, 0) + if err := db.Find(ctx, &list, bson.M{ + "appId": appId, + }); err != nil { + return resp + } + for _, item := range list { + resp[int64(item.LocId)] = item + } + return resp +} diff --git a/models/applicationLocMod/type.go b/models/applicationLocMod/type.go new file mode 100644 index 0000000..98fcaf9 --- /dev/null +++ b/models/applicationLocMod/type.go @@ -0,0 +1,30 @@ +package applicationLocMod + +import ( + "stat/common/mongos" + "time" +) + +const CollApplicationLocation = "application_location" + +var db *mongos.MongoTool + +type ApplicationLocation struct { + Id int64 `bson:"_id"` // 唯一id + AppId int32 `bson:"appId"` // 应用id + LocId int32 `bson:"locId"` // 位置id,外部使用的id,方便app配置 + Name string `bson:"name"` // 位置名称 + ImgSizeDesc string `bson:"imgSizeDesc"` // 该位置图片描述 + Remark string `bson:"remark"` // 备注 + CreatedAt time.Time `bson:"createAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt"` // 更新时间 +} + +type UpdateAppLoc struct { + AppId *int32 `bson:"appId,omitempty"` // 应用id + LocId *int32 `bson:"locId,omitempty"` // 位置id,外部使用的id,方便app配置 + Name *string `bson:"name,omitempty"` // 位置名称 + ImgSizeDesc *string `bson:"imgSizeDesc,omitempty"` // 该位置图片描述 + Remark *string `bson:"remark,omitempty"` // 备注 + UpdatedAt *time.Time `bson:"updatedAt,omitempty"` // 更新时间 +} diff --git a/models/applicationmod/application.go b/models/applicationmod/application.go new file mode 100644 index 0000000..e7c1a05 --- /dev/null +++ b/models/applicationmod/application.go @@ -0,0 +1,184 @@ +package applicationmod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/stdLog" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, Collapplication) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "parentAppId", Value: 1}}, + }, + { + Keys: bson.D{{Key: "rank", Value: -1}}, + }, + { + Keys: bson.D{{Key: "locId", Value: -1}}, + }, + } + + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", Collapplication, err)) + } +} + +// InsertOneApplication 插入一个应用 +func InsertOneApplication(ctx context.Context, Application *Application) *stdLog.SrvErr { + if _, err := db.InsertOne(ctx, Application); err != nil { + log.Warn("media:InsertOneApplication db.InsertOne failed", log.E(err)) + return stdLog.New(stdLog.InsertDataError, "", "") + } + return nil +} + +// DelOneApplication 删除一个应用tag +func DelOneApplication(ctx context.Context, filter bson.M) ( + int64, *stdLog.SrvErr) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("application:DelOneApplication db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, stdLog.New(stdLog.DelDataError, "", "") + } + return count, nil +} + +// UpdateOneApplication 更新一个应用 +func UpdateOneApplication(ctx context.Context, filter bson.M, update bson.M) *stdLog.SrvErr { + result, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("application:UpdateOneApplication db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return stdLog.New(stdLog.UpdateDataError, "", "") + } + if result.MatchedCount != 1 { + log.Warn("application:UpdateOneApplication db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return stdLog.New(stdLog.ErrApplicationNotExist, "", "") + } + return nil +} + +// CountApplications 统计应用数量 +func CountApplications(ctx context.Context, filter bson.M) ( + int64, *stdLog.SrvErr) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("media:CountApplications db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, stdLog.New(stdLog.QueryDataError, "", "") + } + return count, nil +} + +// FindOneApplication 查找一个应用 +func FindOneApplication(ctx context.Context, filter bson.M) ( + *Application, *stdLog.SrvErr) { + var Application Application + if err := db.FindOneEx( + ctx, &Application, filter); err != nil { + if err != mongo.ErrNoDocuments { + log.Info("media:FindOneApplication db.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + return nil, stdLog.New(stdLog.ErrApplicationNotExist, "", "") + } + return &Application, nil +} + +// FindManyApplication 查找一批应用 +func FindManyApplication(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (ApplicationList, *stdLog.SrvErr) { + data := make(ApplicationList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("application:FindManyApplication db.Find failed", + log.E(err), log.Any("filter", filter)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + return data, nil +} + +// 根据appId获取配置的app +func FindAppByAppId(ctx context.Context, appId int64) (data []Application, err error) { + now := time.Now().Local() + filter := bson.M{"parentAppId": appId, "status": true, + "startTime": bson.M{"$lt": now}, "endTime": bson.M{"$gte": now}} + + sort := bson.D{{Key: "rank", Value: -1}} + + opts := options.Find().SetSort(sort) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("application FindAdsByAppId Find err", log.E(err)) + return + } + return +} + +// 增加广告点击量 +func IncAppClickCount(ctx context.Context, id int64) (err error) { + filter := bson.M{"_id": id} + + update := bson.M{"$inc": bson.M{"clickCount": 1}} + + if _, err = db.UpdateOne(ctx, filter, update); err != nil { + log.Error("advertise IncAdsClickCount UpdateOne err", log.E(err)) + return + } + + return +} + +// GetAllAdvertiseMap 获取ads id map +func GetAllAdvertiseMap(ctx context.Context) (map[primitive.ObjectID]*Application, error) { + filter := bson.M{} + dict := make(map[primitive.ObjectID]*Application) + list := make([]*Application, 0) + if err := db.Find(ctx, &list, filter); err != nil { + log.Error("Advertise GetAllAdvertiseMap Find err", log.E(err)) + return dict, err + } + for _, ads := range list { + dict[ads.Id] = ads + } + return dict, nil +} + +// 根据appId和locId更新位置id +func UpdateLocInfo(ctx context.Context, appId, oldLocId, newLocID int32) (err error) { + filter := bson.M{"appId": appId, "locId": oldLocId} + + update := bson.M{"$set": bson.M{"locId": newLocID}} + + if _, err = db.UpdateMany(ctx, filter, update); err != nil { + log.Error("advertise UpdateLocInfo UpdateMany err", log.E(err)) + return + } + return +} + +// UpdateManyApplication 更新满足条件的应用 +func UpdateManyApplication(ctx context.Context, filter bson.M, update bson.M) *stdLog.SrvErr { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("application:UpdateManyApplication db.UpdateMany failed", + log.E(err), log.Any("filter", filter), log.Any("update", update)) + return stdLog.New(stdLog.UpdateDataError, "", "") + } + return nil +} diff --git a/models/applicationmod/tag.go b/models/applicationmod/tag.go new file mode 100755 index 0000000..4e6ee42 --- /dev/null +++ b/models/applicationmod/tag.go @@ -0,0 +1,80 @@ +package applicationmod + +type TagApplication struct { + AndroidUrl string + AppId string + Avatar string + BigImg string + Categories string + CreatedAt string + CreatedId string + Desc string + DownloadUrl string + EndTime string + HighQualityType string + HomeShow string + Id string + Internal string + IosUrl string + IsGame string + IsHighQuality string + IsRecommend string + LocIds string + LocNames string + Name string + NineShow string + ParentAppId string + Rank string + RecreationShow string + SmallImg string + StartTime string + Status string + Tag string + Total string + UpdatedAt string + UpdatedId string +} + +var FN struct { + Application TagApplication +} + +var TN struct { + Application string +} + +func init() { + FN.Application.AndroidUrl = "androidUrl" + FN.Application.AppId = "appId" + FN.Application.Avatar = "avatar" + FN.Application.BigImg = "bigImg" + FN.Application.Categories = "categories" + FN.Application.CreatedAt = "createdAt" + FN.Application.CreatedId = "created_id" + FN.Application.Desc = "desc" + FN.Application.DownloadUrl = "download_url" + FN.Application.EndTime = "endTime" + FN.Application.HighQualityType = "highQualityType" + FN.Application.HomeShow = "homeShow" + FN.Application.Id = "_id" + FN.Application.Internal = "internal" + FN.Application.IosUrl = "iosUrl" + FN.Application.IsGame = "isGame" + FN.Application.IsHighQuality = "isHighQuality" + FN.Application.IsRecommend = "isRecommend" + FN.Application.LocIds = "locIds" + FN.Application.LocNames = "-" + FN.Application.Name = "name" + FN.Application.NineShow = "nineShow" + FN.Application.ParentAppId = "parentAppId" + FN.Application.Rank = "rank" + FN.Application.RecreationShow = "recreationShow" + FN.Application.SmallImg = "smallImg" + FN.Application.StartTime = "startTime" + FN.Application.Status = "status" + FN.Application.Tag = "tag" + FN.Application.Total = "total" + FN.Application.UpdatedAt = "updatedAt" + FN.Application.UpdatedId = "updated_id" + TN.Application = "application" +} diff --git a/models/applicationmod/type.go b/models/applicationmod/type.go new file mode 100644 index 0000000..bc5fd93 --- /dev/null +++ b/models/applicationmod/type.go @@ -0,0 +1,91 @@ +package applicationmod + +import ( + "stat/common" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +const Collapplication = "application" + +var db *mongos.MongoTool + +// 应用中心 +// @table:application +type Application struct { + Id primitive.ObjectID `json:"id" bson:"_id"` + AppId int64 `json:"appId" bson:"appId"` //appId + ParentAppId int64 `json:"parentAppId" bson:"parentAppId"` //所属appId + Name string `json:"name" bson:"name"` //应用名 + DaoLiangTitle string `json:"daoLiangTitle" bson:"daoLiangTitle"` //广告导量标题 + Tag int32 `json:"tag" bson:"tag"` //标签 + Internal bool `json:"internal" bson:"internal"` //是否内部应用 + Categories []*common.CategoryRank `json:"categories" bson:"categories"` //分类排序 + Desc string `json:"desc" bson:"desc"` //描述 + DownloadUrl string `json:"download_url" bson:"download_url"` //下载地址 + IosUrl string `json:"iosUrl" bson:"iosUrl"` //ios链接 + AndroidUrl string `json:"androidUrl" bson:"androidUrl"` //安卓链接 + Avatar string `json:"avatar" bson:"avatar"` //头像图片 + Status bool `json:"status" bson:"status"` //状态 + Rank int64 `json:"rank" bson:"rank"` //默认排序 + Total int64 `json:"total" bson:"total"` //总点击 + CreatedId int64 `json:"created_id" bson:"created_id"` //创建人 + UpdatedId int64 `json:"updated_id" bson:"updated_id"` //最后更新人 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //创建时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //更新时间 + NineShow bool `json:"nineShow" bson:"nineShow"` //是否九宫格 + RecreationShow bool `json:"recreationShow" bson:"recreationShow"` //是否娱乐中心显示 + IsRecommend bool `json:"isRecommend" bson:"isRecommend"` //是否推荐 + IsGame bool `json:"isGame" bson:"isGame"` //是否游戏 + HomeShow bool `json:"homeShow" bson:"homeShow"` //是否首页展示 + LocIds []int64 `json:"locIds" bson:"locIds"` //位置id + LocNames []string `json:"locNames" bson:"-"` //位置映射 + SmallImg string `json:"smallImg" bson:"smallImg"` // 小图标(比例:360*200) + BigImg string `json:"bigImg" bson:"bigImg"` // 大图标(比例:686*330) + IsHighQuality bool `json:"isHighQuality" bson:"isHighQuality"` // 是否是优质APP推荐 + HighQualityType int64 `json:"highQualityType" bson:"highQualityType"` // 优质APP推荐展示方式 0:应用图标 1:展示描述文字 + StartTime time.Time `json:"startTime" bson:"startTime"` // 开始时间 + EndTime time.Time `json:"endTime" bson:"endTime"` // 结束时间 +} + +type ApplicationList []*Application + +type AppUpdate struct { + Id string `json:"id" bson:"id"` + Param AppUpdateInfo `json:"param" bson:"param"` +} + +type AppUpdateInfo struct { + AppId int64 `json:"appId" bson:"appId"` //appId + ParentAppId int64 `json:"parentAppId" bson:"parentAppId"` //所属appId + Name string `json:"name" bson:"name"` //应用名 + DaoLiangTitle string `json:"daoLiangTitle" bson:"daoLiangTitle"` //广告导量标题 + //Tag common.AppReqType `json:"tag" bson:"tag"` //标签 + Internal bool `json:"internal" bson:"internal"` //是否内部应用 + Categories []*common.CategoryRank `json:"categories" bson:"categories"` //分类排序 + Desc string `json:"desc" bson:"desc"` //描述 + DownloadUrl string `json:"download_url" bson:"download_url"` //下载地址 + IosUrl string `json:"iosUrl" bson:"iosUrl"` //ios链接 + AndroidUrl string `json:"androidUrl" bson:"androidUrl"` //安卓链接 + Avatar string `json:"avatar" bson:"avatar"` //头像图片 + Status bool `json:"status" bson:"status"` //状态 + Rank int64 `json:"rank" bson:"rank"` //默认排序 + Total int64 `json:"total" bson:"total"` //总点击 + CreatedId int64 `json:"created_id" bson:"created_id"` //创建人 + UpdatedId int64 `json:"updated_id" bson:"updated_id"` //最后更新人 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //更新时间 + NineShow bool `json:"nineShow" bson:"nineShow"` //是否九宫格 + RecreationShow bool `json:"recreationShow" bson:"recreationShow"` //是否娱乐中心显示 + IsRecommend bool `json:"isRecommend" bson:"isRecommend"` //是否推荐 + IsGame bool `json:"isGame" bson:"isGame"` //是否游戏 + HomeShow bool `json:"homeShow" bson:"homeShow"` //是否首页展示 + LocIds []int32 `json:"locIds" bson:"locIds"` //位置id + SmallImg string `json:"smallImg" bson:"smallImg"` // 小图标 + BigImg string `json:"bigImg" bson:"bigImg"` // 大图标 + IsHighQuality bool `json:"isHighQuality" bson:"isHighQuality"` // 是否是优质APP推荐 + HighQualityType int64 `json:"highQualityType" bson:"highQualityType"` // 优质APP推荐展示方式 0:应用图标 1:展示描述文字 + StartTime time.Time `bson:"startTime" json:"startTime"` // 开始时间 + EndTime time.Time `bson:"endTime" json:"endTime"` // 结束时间 +} diff --git a/models/applicationstat/applicationstat.go b/models/applicationstat/applicationstat.go new file mode 100644 index 0000000..5041968 --- /dev/null +++ b/models/applicationstat/applicationstat.go @@ -0,0 +1,139 @@ +package applicationstat + +import ( + "context" + "fmt" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "stat/common/log" + "stat/common/mongos" + "stat/common/stdLog" +) + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, Collapplicationstat) + // 获取数据库表 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: "applicationDbId", Value: 1}, + {Key: FN.ApplicationStat.SumData, Value: -1}, + }, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{ + {Key: FN.ApplicationStat.Id, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(applicationstat:initApplicationStatIndex) Create ApplicationStat Index failed! err:%+v:", err)) + } +} + +// InsertOneApplicationStat 插入一个应用 +func InsertOneApplicationStat(ctx context.Context, applicationStat *ApplicationStat) *stdLog.SrvErr { + if _, err := db.InsertOne(ctx, applicationStat); err != nil { + log.Warn("applicationstat:InsertOneApplicationStat db.InsertOne failed", log.E(err)) + return stdLog.New(stdLog.InsertDataError, "", "") + } + return nil +} + +// DelOneApplicationStat 删除一个应用tag +func DelOneApplicationStat(ctx context.Context, filter bson.M) ( + int64, *stdLog.SrvErr) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("applicationstat:DelOneApplicationStat db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, stdLog.New(stdLog.DelDataError, "", "") + } + return count, nil +} + +// FindOneApplicationStat 查找一个应用 +func FindOneApplicationStat(ctx context.Context, filter bson.M) ( + *ApplicationStat, *stdLog.SrvErr) { + var applicationStat ApplicationStat + if err := db.FindOneEx( + ctx, &applicationStat, filter); err != nil { + if err != mongo.ErrNoDocuments { + log.Info("applicationstat:FindOneApplicationStat db.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + return nil, stdLog.New(stdLog.DataNotExist, "", "") + } + return &applicationStat, nil +} + +// CountApplicationStats 统计应用数量 +func CountApplicationStats(ctx context.Context, filter bson.M) ( + int64, *stdLog.SrvErr) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("applicationstat:CountApplicationStats db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, stdLog.New(stdLog.QueryDataError, "", "") + } + return count, nil +} + +// UpdateOneApplicationStat 更新一个应用 +func UpdateOneApplicationStat(ctx context.Context, filter bson.M, update bson.M) *stdLog.SrvErr { + result, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("applicationstat:UpdateOneApplicationStat db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return stdLog.New(stdLog.UpdateDataError, "", "") + } + if result.MatchedCount != 1 { + log.Warn("applicationstat:UpdateOneApplicationStat db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return stdLog.New(stdLog.DataNotExist, "", "") + } + return nil +} + +// UpdateManyApplicationStat 更新一批应用 +func UpdateManyApplicationStat(ctx context.Context, filter bson.M, update bson.M) *stdLog.SrvErr { + result, err := db.UpdateMMany(ctx, filter, update) + if err != nil { + log.Warn("applicationstat:UpdateManyApplicationStat db.UpdateMMany failed", + log.E(err), log.Any("filter", filter)) + return stdLog.New(stdLog.UpdateDataError, "", "") + } + if result.MatchedCount <= 0 { + log.Warn("applicationstat:UpdateManyApplicationStat db.UpdateMMany failed", + log.E(err), log.Any("filter", filter)) + //return srvdef.New(srvdef.ErrApplicationNotExsit, "", "") + } + return nil +} + +// AggregateTopicInfos 聚合查找一批用户信息 +func AggregateApplicationStat(ctx context.Context, + bind interface{}, pipeline []bson.M) *stdLog.SrvErr { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateApplicationStat db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return stdLog.New(stdLog.QueryDataError, "", err.Error()) + } + return nil +} + +// FindManyApplicationStat 查找一批应用 +func FindManyApplicationStat(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (ApplicationStatList, *stdLog.SrvErr) { + data := make(ApplicationStatList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("applicationstat:FindManyApplicationStat db.Find failed", + log.E(err), log.Any("filter", filter)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + return data, nil +} diff --git a/models/applicationstat/tag.go b/models/applicationstat/tag.go new file mode 100644 index 0000000..263a1b8 --- /dev/null +++ b/models/applicationstat/tag.go @@ -0,0 +1,30 @@ +package applicationstat + +type TagApplicationStat struct { + Id string + //AppId string + SumData string + Total string + HourData string + CreatedAt string + UpdatedAt string +} + +var FN struct { + ApplicationStat TagApplicationStat +} + +var TN struct { + ApplicationStat string +} + +func init() { + FN.ApplicationStat.Id = "_id" + //FN.ApplicationStat.AppId = "appId" + FN.ApplicationStat.SumData = "sumDate" + FN.ApplicationStat.Total = "total" + FN.ApplicationStat.HourData = "hourData" + FN.ApplicationStat.CreatedAt = "createdAt" + FN.ApplicationStat.UpdatedAt = "updatedAt" + TN.ApplicationStat = "applicationstat" +} diff --git a/models/applicationstat/type.go b/models/applicationstat/type.go new file mode 100644 index 0000000..6722029 --- /dev/null +++ b/models/applicationstat/type.go @@ -0,0 +1,44 @@ +package applicationstat + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +const Collapplicationstat = "applicationstat" + +var db *mongos.MongoTool + +type THourStat map[int]int64 + +func (m THourStat) Total() int64 { + var sum int64 + for _, v := range m { + sum += v + } + return sum +} + +type Update struct { + Total *int64 `json:"total" bson:"total,omitempty"` //今日点击 + HourData *THourStat `json:"hourData" bson:"hourData,omitempty"` //小时数据 + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` //更新时间 +} + +// 应用统计 +// @table:applicationstat +type ApplicationStat struct { + Id primitive.ObjectID `json:"id" bson:"_id,omitempty"` + ApplicationDbId primitive.ObjectID `json:"applicationDbId" bson:"applicationDbId"` + //AppId int64 `json:"appId" bson:"appId"` //应用ID + //ParentAppId int64 `json:"parentAppId" bson:"parentAppId"` //所属应用ID + SumDate time.Time `json:"sumDate" bson:"sumDate"` //记录时间 + Total int64 `json:"total" bson:"total"` //今日点击 + HourData THourStat `json:"hourData" bson:"hourData"` //小时数据 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //创建时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //更新时间 +} + +type ApplicationStatList []*ApplicationStat diff --git a/models/authorityMod/authority.go b/models/authorityMod/authority.go new file mode 100644 index 0000000..ca359af --- /dev/null +++ b/models/authorityMod/authority.go @@ -0,0 +1,137 @@ +package authorityMod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollAuthority) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{"role", 1}}, + Options: options.Index().SetUnique(true), + }, + } + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollAuthority, err)) + } +} + +// 添加角色 +func AddRole(ctx context.Context, doc *Authority) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error(fmt.Sprintf("model %s AddRole InsertOne error", CollAuthority), log.E(err)) + return + } + + return +} + +// 更新角色 +func UpdateRole(ctx context.Context, roleId int64, doc UpdateDoc) (err error) { + filter := bson.M{"_id": roleId} + update, _ := utils.ToBsonM(doc) + + if _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}); err != nil { + log.Error(fmt.Sprintf("model %s UpdateRole UpdateOne error", CollAuthority), log.E(err)) + return + } + + return +} + +// 删除角色 +func DelRoleById(ctx context.Context, roleId int64) (err error) { + filter := bson.M{"_id": roleId} + + if _, err = db.DeleteOne(ctx, filter); err != nil { + log.Error(fmt.Sprintf("model %s DelRole DeleteOne error", CollAuthority), log.E(err)) + return + } + + return +} + +// 角色列表 +func RoleList(ctx context.Context, skip int64, limit int64) (count int64, data []Authority, err error) { + filter := bson.M{} + opts := options.Find().SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error(fmt.Sprintf("model %s RoleList Find error", CollAuthority), log.E(err)) + return + } + if count, err = db.Count(ctx, filter); err != nil { + log.Error(fmt.Sprintf("model %s RoleList Count error", CollAuthority), log.E(err)) + return + } + + return +} + +// 根据角色获取权限 +func GetAuthorityByRole(ctx context.Context, role string) (data Authority, err error) { + query := bson.M{"role": role} + + if err = db.FindOne(ctx, &data, query); err != nil { + log.Error(fmt.Sprintf("model %s GetAuthorityByRole FindOne error", CollAuthority), log.E(err)) + return + } + + return +} + +// 根据id获取权限 +func GetAuthorityById(ctx context.Context, id int64) (data Authority, err error) { + query := bson.M{"_id": id} + + if err = db.FindOne(ctx, &data, query); err != nil { + log.Error(fmt.Sprintf("model %s GetAuthorityById FindOne error", CollAuthority), log.E(err)) + return + } + + return +} + +// 根据ids获取权限列表 +func GetAuthorityByIds(ctx context.Context, ids []int64) (data []Authority, err error) { + if len(ids) == 0 { + return + } + + query := bson.M{"_id": bson.M{"$in": ids}} + + if err = db.Find(ctx, &data, query); err != nil { + log.Error(fmt.Sprintf("model %s GetAuthorityByIds Find error", CollAuthority), log.E(err)) + return + } + + return +} + +// 获取角色信息,排除当前角色 +func GetRoleExcludeRole(ctx context.Context, roleId int64, role string) (data Authority, err error) { + filter := bson.M{"_id": bson.M{"$ne": roleId}, "role": role} + + if err = db.FindOne(ctx, &data, filter); err != nil { + log.Error(fmt.Sprintf("model %s GetRoleExcludeRole FindOne error", CollAuthority), + log.Any("roleId", roleId), + log.Any("role", role), + log.E(err), + ) + return + } + + return +} diff --git a/models/authorityMod/type.go b/models/authorityMod/type.go new file mode 100644 index 0000000..096547f --- /dev/null +++ b/models/authorityMod/type.go @@ -0,0 +1,24 @@ +package authorityMod + +import ( + "stat/common/mongos" + "time" +) + +const CollAuthority = "authority" + +var db *mongos.MongoTool + +type Authority struct { + Id int64 `bson:"_id"` // _id + Role string `bson:"role"` // 角色 + AuthJson string `bson:"authJson"` // 权限json数据 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt"` // 修改时间 +} + +type UpdateDoc struct { + Role *string `bson:"role,omitempty"` // 角色 + AuthJson *string `bson:"authJson,omitempty"` // 权限json数据 + UpdatedAt *time.Time `bson:"updatedAt,omitempty"` // 修改时间 +} diff --git a/models/blocDailystatmod/daily.go b/models/blocDailystatmod/daily.go new file mode 100644 index 0000000..03036b8 --- /dev/null +++ b/models/blocDailystatmod/daily.go @@ -0,0 +1,150 @@ +package blocDailystatmod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollBlocDailyStat) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "sumDate", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollBlocDailyStat, err)) + } +} + +// UpsertDailyStat 更新或插入一条统计记录 +func UpsertBlocDailyStat(ctx context.Context, sumDate time.Time, appId int32, doc BlocDailyStatDoc) (err error) { + var filter = bson.M{ + "sumDate": sumDate, + "appId": appId, + } + var update = mongos.ToBsonM(doc) + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + + _, err = db.InsertOne(ctx, insertDoc) + } + + return +} + +// 获取日常统计列表 +func GetBlocDailyStatList(ctx context.Context, appId *int32, start, end *time.Time, skip, limit int64) (count int64, data []BlocDailyStatMod, err error) { + filter := bson.M{} + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "sumDate", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("channel GetDailyStatList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("channel GetDailyStatList Count err", log.E(err)) + return + } + + return +} + +// 获取日常统计列表 +func GetBlocDailyStatListTotal(ctx context.Context, appId *int32, start, end *time.Time) (data []BlocDailyStatMod, err error) { + filter := bson.M{} + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "sumDate", Value: -1}} + + opts := options.Find().SetSort(sort) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("channel GetDailyStatList Find err", log.E(err)) + return + } + + return +} + +func GetBlocDailyStatTotalList(ctx context.Context, start, end *time.Time) (data []BlocDailyStatMod, err error) { + + match := bson.M{} + if start != nil && end != nil { + match["sumDate"] = bson.M{"$gte": start, "$lt": end} + } + + pipelines := []bson.M{ + {"$match": match}, + {"$group": bson.M{"_id": "$sumDate", + "sumDate": bson.M{"$first": "$sumDate"}, + "newDirectCount": bson.M{"$sum": "$newDirectCount"}, + "newFissionCount": bson.M{"$sum": "$newFissionCount"}, + "directVisitCount": bson.M{"$sum": "$directVisitCount"}, + "fissionVisitCount": bson.M{"$sum": "$fissionVisitCount"}, + "directAmount": bson.M{"$sum": "$directAmount"}, + "fissionAmount": bson.M{"$sum": "$fissionAmount"}, + "directAmountcount": bson.M{"$sum": "$directAmountcount"}, + "fissionAmountcount": bson.M{"$sum": "$fissionAmountcount"}, + "deductionAmountCount": bson.M{"$sum": "$deductionAmountCount"}, + "newRechargeCount": bson.M{"$sum": "$newRechargeCount"}, + "newRechargeAmount": bson.M{"$sum": "$newRechargeAmount"}, + "daichongAmout": bson.M{"$sum": "$daichongAmout"}, + "onlineAmount": bson.M{"$sum": "$onlineAmount"}, + "userWithDrawAmount": bson.M{"$sum": "$userWithDrawAmount"}, + "userWithDrawPaymoneyAmount": bson.M{"$sum": "$userWithDrawPaymoneyAmount"}, + "gameRechageAmount": bson.M{"$sum": "$gameRechageAmount"}, + "gameWithdrawAmount": bson.M{"$sum": "$gameWithdrawAmount"}, + }}, + {"$sort": bson.D{{Key: "sumDate", Value: -1}}}, + } + if err = db.Aggregate(ctx, &data, pipelines); err != nil { + log.Error("channel GetDailyStatList Find err", log.E(err)) + return + } + return +} diff --git a/models/blocDailystatmod/type.go b/models/blocDailystatmod/type.go new file mode 100644 index 0000000..223ec40 --- /dev/null +++ b/models/blocDailystatmod/type.go @@ -0,0 +1,69 @@ +package blocDailystatmod + +import ( + "stat/common/mongos" + "time" +) + +// 表名 +const CollBlocDailyStat = "bloc_daily_stat" + +var db *mongos.MongoTool + +// BlocDailyStatMod 集团日常统计 +type BlocDailyStatMod struct { + SumDate time.Time `bson:"sumDate"` // 记录时间 按天对齐 + AppId int32 `bson:"appId"` // appId + NewDirectCount int64 `bson:"newDirectCount,omitempty"` // 新增直推 + NewFissionCount int64 `bson:"newFissionCount,omitempty"` // 新增裂变 + DirectVisitCount int64 `bson:"directVisitCount,omitempty"` // 直推访问数 + FissionVisitCount int64 `bson:"fissionVisitCount,omitempty"` // 裂变访问数 + Day1RetainRate float64 `bson:"day1RetainRate,omitempty"` // 次日留存率 + Day3RetainRate float64 `bson:"day3RetainRate,omitempty"` // 3日留存率 + Day7RetainRate float64 `bson:"day7RetainRate,omitempty"` // 7日留存率 + DirectAmount int64 `bson:"directAmount,omitempty"` // 直推充值金额 + FissionAmount int64 `bson:"fissionAmount,omitempty"` // 裂变充值金额 + DirectAmountCount int64 `bson:"directAmountcount,omitempty"` // 直推充值订单 + FissionAmountCount int64 `bson:"fissionAmountcount,omitempty"` // 裂变充值订单 + DeductionAmountCount int64 `bson:"deductionAmountCount,omitempty"` // 扣量充值订单 + NewRechargeCount int64 `bson:"newRechargeCount,omitempty"` // 新增充值数 + TotalRechargeCount int64 `bson:"totalRechargeCount,omitempty"` // 总充值人数 + NewRechargeAmount int64 `bson:"newRechargeAmount,omitempty"` // 新增充值金额 + DaichongAmout int64 `bson:"daichongAmout,omitempty"` // 代充充值金额 + OnlineAmount int64 `bson:"onlineAmount,omitempty"` // 在线充值金额 + UserWithDrawAmount int64 `bson:"userWithDrawAmount,omitempty"` // 用户提现金额 + UserWithDrawPaymoneyAmount int64 `bson:"userWithDrawPaymoneyAmount,omitempty"` // 用户提现金额(实际到账) + GameRechageAmount int64 `bson:"gameRechageAmount,omitempty"` // 游戏充值 + GameWithdrawAmount int64 `bson:"gameWithdrawAmount,omitempty"` // 游戏提现 + LandpageAndroidClick int64 `bson:"landpageAndroidClick,omitempty"` // 落地页android访问次数 + LandpageIosAppstoreClick int64 `bson:"landpageIosAppstoreClick,omitempty"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick int64 `bson:"landpageIosAthorClick,omitempty"` // 落地页iOS其他包访问次数 + UpdatedAt time.Time `bson:"updatedAt,omitempty"` // 更新时间 +} + +type BlocDailyStatDoc struct { + NewDirectCount *int64 `bson:"newDirectCount,omitempty"` // 新增直推 + NewFissionCount *int64 `bson:"newFissionCount,omitempty"` // 新增裂变 + DirectVisitCount *int64 `bson:"directVisitCount,omitempty"` // 直推访问数 + FissionVisitCount *int64 `bson:"fissionVisitCount,omitempty"` // 裂变访问数 + Day1RetainRate *float64 `bson:"day1RetainRate,omitempty"` // 次日留存率 + Day3RetainRate *float64 `bson:"day3RetainRate,omitempty"` // 3日留存率 + Day7RetainRate *float64 `bson:"day7RetainRate,omitempty"` // 7日留存率 + DirectAmount *int64 `bson:"directAmount,omitempty"` // 直推充值金额 + FissionAmount *int64 `bson:"fissionAmount,omitempty"` // 裂变充值金额 + DirectAmountCount *int64 `bson:"directAmountcount,omitempty"` // 直推充值订单 + FissionAmountCount *int64 `bson:"fissionAmountcount,omitempty"` // 裂变充值订单 + DeductionAmountCount *int64 `bson:"deductionAmountCount,omitempty"` // 扣量充值订单 + NewRechargeCount *int64 `bson:"newRechargeCount,omitempty"` // 新增充值数 + TotalRechargeCount *int64 `bson:"totalRechargeCount,omitempty"` // 总充值人数 + NewRechargeAmount *int64 `bson:"newRechargeAmount,omitempty"` // 新增充值金额 + DaichongAmout *int64 `bson:"daichongAmout,omitempty"` // 代充充值金额 + OnlineAmount *int64 `bson:"onlineAmount,omitempty"` // 在线充值金额 + UserWithDrawAmount *int64 `bson:"userWithDrawAmount,omitempty"` // 用户提现金额 + UserWithDrawPaymoneyAmount *int64 `bson:"userWithDrawPaymoneyAmount,omitempty"` // 用户提现金额(实际到账) + GameRechageAmount *int64 `bson:"gameRechageAmount,omitempty"` // 游戏充值 + GameWithdrawAmount *int64 `bson:"gameWithdrawAmount,omitempty"` // 游戏提现 + LandpageAndroidClick *int64 `bson:"landpageAndroidClick,omitempty"` // 落地页android访问次数 + LandpageIosAppstoreClick *int64 `bson:"landpageIosAppstoreClick,omitempty"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick *int64 `bson:"landpageIosAthorClick,omitempty"` // 落地页iOS其他包访问次数 +} diff --git a/models/botdailyhourstat/helper.go b/models/botdailyhourstat/helper.go new file mode 100644 index 0000000..7c11b70 --- /dev/null +++ b/models/botdailyhourstat/helper.go @@ -0,0 +1,699 @@ +package botdailyhourstat + +import ( + "errors" + "fmt" + "stat/common/statutils" +) + +func LineCount(iTemp string, iValue int64, permilValue int64) string { + if permilValue > 1000000 || permilValue < -1000000 { + s1 := fmt.Sprintf("%d", iValue) + str1 := fmt.Sprintf(iTemp, s1) + return str1 + "\n" + } else { + s1 := fmt.Sprintf("%d", iValue) + str1 := fmt.Sprintf(iTemp, s1) + v := float64(permilValue) / 10 + str2 := "" + if v < 0 { + str2 = fmt.Sprintf("⬇%.2f%%", v) + } else if v > 0 { + str2 = fmt.Sprintf("⬆+️%.2f%%", v) + } else { + str2 = fmt.Sprintf(" %.2f%%", v) + } + return str1 + str2 + "\n" + } +} + +func LineMoneyOne(iTemp string, iValue int64) string { + return LineCountOne(iTemp, iValue/100) +} + +func LineCountOne(iTemp string, iValue int64) string { + s1 := fmt.Sprintf("%d", iValue) + str1 := fmt.Sprintf(iTemp, s1) + return str1 + "\n" +} + +func LineMoney(iTemp string, iValue int64, permilValue int64) string { + return LineCount(iTemp, iValue/100, permilValue) +} + +func (s *StatItem) Display(prefix string) string { + var text string + //text += fmt.Sprintf("%s%s\n", prefix+"┣", "充值总计:") + //text += s.Recharge.DisplayDayHourText(prefix+"┃", 100) + //text += fmt.Sprintf("%s%s\n", prefix+"┣", "老用户充值:") + //text += s.RechargeOldUser.DisplayDayHourText(prefix+"┃", 100) + //text += fmt.Sprintf("%s%s\n", prefix+"┣", "新用户充值:") + //text += s.RechargeNewUser.DisplayDayHourText(prefix+"┃", 100) + //text += fmt.Sprintf("%s%s\n", prefix+"┣", "[会员购买]:") + //text += s.RechargeVip.DisplayDayHourText(prefix+"┃", 100) + //text += fmt.Sprintf("%s%s\n", prefix+"┣", "[金币购买]:") + //text += s.RechargeGold.DisplayDayHourText(prefix+"┃", 100) + //text += fmt.Sprintf("%s%s\n", prefix+"┣", "[订单统计]:") + //text += s.Order.DisplayDayHourText(prefix+"┃", 1) + //text += fmt.Sprintf("%s%s\n", prefix+"┣", "[注册统计]:") + //text += s.Register.DisplayDayHourText(prefix+"┃", 1) + //text += fmt.Sprintf("%s%s\n", prefix+"┗", "[访问统计]:") + //text += s.Visit.DisplayDayHourText(prefix+" ", 1) + return text +} + +func (s *BotHourStat) DisplayDayHourText(appName string, compare *BotHourStat) string { + calc := func(curr, hist *statutils.Stat) (*statutils.Stat, *statutils.Stat) { + diff := curr.Sub(hist) + rate := diff.Permil(hist) + return curr, rate + } + rate := func(currValue, histValue int64) int64 { + if histValue != 0 { + return (currValue - histValue) * 1000 / histValue + } else { + return 0 + } + } + var text string + text += fmt.Sprintf("应用名称:【%s】\n", appName) //🆚 + text += fmt.Sprintf("统计时间:%s\n", s.SumDate.Format("2006-01-02T15:04:05")) + if compare != nil { + func() { + reCurr, reRate := calc(&s.TodayStat.Recharge, &compare.TodayStat.Recharge) + text += "1️⃣当日充值:\n" + text += LineMoney("┣充值合计:%s", reCurr.Value(), reRate.Value()) + text += LineMoney("┃┏安卓充值:%s", reCurr.Android.Value(), reRate.Android.Value()) + text += LineMoney("┣╋苹果充值:%s", reCurr.Ios.Value(), reRate.Ios.Value()) + text += LineMoney("┃┣轻量充值:%s", reCurr.Light.Value(), reRate.Light.Value()) + text += LineMoney("┃┗H5充值 :%s", reCurr.H5.Value(), reRate.H5.Value()) + text += LineMoney("┃┏渠道充值:%s", reCurr.Total.District.Value, reRate.Total.District.Value) + text += LineMoney("┣╋官网充值:%s", reCurr.Total.Web.Value, reRate.Total.Web.Value) + text += LineMoney("┃┣自来充值:%s", reCurr.Total.Normal.Value, reRate.Total.Normal.Value) + text += LineMoney("┃┗分享充值:%s", reCurr.Total.Share.Value, reRate.Total.Share.Value) + oldCurr, oldRate := calc(&s.TodayStat.RechargeOld, &compare.TodayStat.RechargeOld) + text += LineMoney("┃┏老用户充:%s", oldCurr.Value(), oldRate.Value()) + newCurr, newRate := calc(&s.TodayStat.RechargeNew, &compare.TodayStat.RechargeNew) + text += LineMoney("┣╋新用户充:%s", newCurr.Value(), newRate.Value()) + v0, v00 := calc(newCurr.Percentage(reCurr), compare.TodayStat.RechargeNew.Percentage(&compare.TodayStat.Recharge)) + text += LineCount("┃┗新充占比:%s%%", v0.Value(), v00.Value()) + memCurr, memRate := calc(&s.TodayStat.RechargeVip, &compare.TodayStat.RechargeVip) + text += LineMoney("┃┏会员充值:%s", memCurr.Value(), memRate.Value()) + coinCurr, coinRate := calc(&s.TodayStat.RechargeGold, &compare.TodayStat.RechargeGold) + text += LineMoney("┣╋金币充值:%s", coinCurr.Value(), coinRate.Value()) + v2, v22 := calc(memCurr.Percentage(reCurr), compare.TodayStat.RechargeVip.Percentage(&compare.TodayStat.Recharge)) + text += LineCount("┃┗会员占比:%s%%", v2.Value(), v22.Value()) + orderCurr, orderRate := calc(&s.TodayStat.Order, &compare.TodayStat.Order) + text += LineCount("┃┏订单拉起:%s", orderCurr.Count(), orderRate.Count()) + succCurr, succRate := calc(&s.TodayStat.OrderSucc, &compare.TodayStat.OrderSucc) + text += LineCount("┣╋订单成功:%s", succCurr.Count(), succRate.Count()) + v1, v11 := calc(succCurr.Percentage(orderCurr), compare.TodayStat.OrderSucc.Percentage(&compare.TodayStat.Order)) + text += LineCount("┃┗成功比率:%s%%", v1.Count(), v11.Count()) + text += "2️⃣当日新增:\n" + + regCurr, regRate := calc(&s.TodayStat.Register, &compare.TodayStat.Register) + text += LineCount("┣新增用户:%s", regCurr.Count(), regRate.Count()) + text += LineCount("┃┏安卓新增:%s", regCurr.Android.Count(), regRate.Android.Count()) + text += LineCount("┣╋苹果新增:%s", regCurr.Ios.Count(), regRate.Ios.Count()) + text += LineCount("┃┣轻量新增:%s", regCurr.Light.Count(), regRate.Light.Count()) + text += LineCount("┃┗H5新增 :%s", regCurr.H5.Count(), regRate.H5.Count()) + text += LineCount("┃┏渠道新增:%s", regCurr.Total.District.Count, regRate.Total.District.Count) + text += LineCount("┣╋有效新增:%s", regCurr.Total.Direct.Value()-regCurr.Total.Direct.Natural.Value, + regRate.Total.Direct.Value()-regRate.Total.Direct.Natural.Value) + text += LineCount("┣╋官网新增:%s", regCurr.Total.Web.Count, regRate.Total.Web.Count) + text += LineCount("┃┣自来新增:%s", regCurr.Total.Normal.Count, regRate.Total.Normal.Count) + text += LineCount("┃┗分享新增:%s", regCurr.Total.Share.Count, regRate.Total.Share.Count) + text += "3️⃣当日日活:\n" + visitCurr, visitRate := calc(&s.TodayStat.Visit, &compare.TodayStat.Visit) + text += LineCount("┣日活总数:%s", visitCurr.Count(), visitRate.Count()) + text += LineCount("┃┏安卓日活:%s", visitCurr.Android.Count(), visitRate.Android.Count()) + text += LineCount("┣╋苹果日活:%s", visitCurr.Ios.Count(), visitRate.Ios.Count()) + text += LineCount("┃┣轻量日活:%s", visitCurr.Light.Count(), visitRate.Light.Count()) + text += LineCount("┃┗H5日活 :%s", visitCurr.H5.Count(), visitRate.H5.Count()) + text += LineCount("┃┏渠道日活:%s", visitCurr.Total.District.Count, visitRate.Total.District.Count) + text += LineCount("┣╋官网日活:%s", visitCurr.Total.Web.Count, visitRate.Total.Web.Count) + text += LineCount("┃┣自来日活:%s", visitCurr.Total.Normal.Count, visitRate.Total.Normal.Count) + text += LineCount("┃┗分享日活:%s", visitCurr.Total.Share.Count, visitRate.Total.Share.Count) + text += "4️⃣落地页点击:\n" + text += LineCount("┣总数:%s", s.TodayLandPage.LandPageTotalClick, rate(s.TodayLandPage.LandPageTotalClick, compare.TodayLandPage.LandPageTotalClick)) + text += LineCount("┃┏安卓:%s", s.TodayLandPage.LandPageAndroidClick, rate(s.TodayLandPage.LandPageAndroidClick, compare.TodayLandPage.LandPageAndroidClick)) + text += LineCount("┣╋商店:%s", s.TodayLandPage.LandPageIosAppstoreClick, rate(s.TodayLandPage.LandPageIosAppstoreClick, compare.TodayLandPage.LandPageIosAppstoreClick)) + text += LineCount("┃┣企业:%s", s.TodayLandPage.LandPageIosFirmClick, rate(s.TodayLandPage.LandPageIosFirmClick, compare.TodayLandPage.LandPageIosFirmClick)) + text += LineCount("┃┗轻量:%s", s.TodayLandPage.LandPageIosLightClick, rate(s.TodayLandPage.LandPageIosLightClick, compare.TodayLandPage.LandPageIosLightClick)) + }() + func() { + reCurr, reRate := calc(&s.HourStat.Recharge, &compare.HourStat.Recharge) + text += "5️⃣小时充值:\n" + text += LineMoney("┣充值合计:%s", reCurr.Value(), reRate.Value()) + text += LineMoney("┃┏安卓充值:%s", reCurr.Android.Value(), reRate.Android.Value()) + text += LineMoney("┣╋苹果充值:%s", reCurr.Ios.Value(), reRate.Ios.Value()) + text += LineMoney("┃┣轻量充值:%s", reCurr.Light.Value(), reRate.Light.Value()) + text += LineMoney("┃┗H5充值 :%s", reCurr.H5.Value(), reRate.H5.Value()) + text += LineMoney("┃┏渠道充值:%s", reCurr.Total.District.Value, reRate.Total.District.Value) + text += LineMoney("┣╋官网充值:%s", reCurr.Total.Web.Value, reRate.Total.Web.Value) + text += LineMoney("┃┣自来充值:%s", reCurr.Total.Normal.Value, reRate.Total.Normal.Value) + text += LineMoney("┃┗分享充值:%s", reCurr.Total.Share.Value, reRate.Total.Share.Value) + oldCurr, oldRate := calc(&s.HourStat.RechargeOld, &compare.HourStat.RechargeOld) + text += LineMoney("┃┏老用户充:%s", oldCurr.Value(), oldRate.Value()) + newCurr, newRate := calc(&s.HourStat.RechargeNew, &compare.HourStat.RechargeNew) + text += LineMoney("┣╋新用户充:%s", newCurr.Value(), newRate.Value()) + v0, v00 := calc(newCurr.Percentage(reCurr), compare.HourStat.RechargeNew.Percentage(&compare.HourStat.Recharge)) + text += LineCount("┃┗新充占比:%s%%", v0.Value(), v00.Value()) + memCurr, memRate := calc(&s.HourStat.RechargeVip, &compare.HourStat.RechargeVip) + text += LineMoney("┃┏会员充值:%s", memCurr.Value(), memRate.Value()) + coinCurr, coinRate := calc(&s.HourStat.RechargeGold, &compare.HourStat.RechargeGold) + text += LineMoney("┣╋金币充值:%s", coinCurr.Value(), coinRate.Value()) + v2, v22 := calc(memCurr.Percentage(reCurr), compare.HourStat.RechargeVip.Percentage(&compare.HourStat.Recharge)) + text += LineCount("┃┗会员占比:%s%%", v2.Value(), v22.Value()) + orderCurr, orderRate := calc(&s.HourStat.Order, &compare.HourStat.Order) + text += LineCount("┃┏订单拉起:%s", orderCurr.Count(), orderRate.Count()) + succCurr, succRate := calc(&s.HourStat.OrderSucc, &compare.HourStat.OrderSucc) + text += LineCount("┣╋订单成功:%s", succCurr.Count(), succRate.Count()) + v1, v11 := calc(succCurr.Percentage(orderCurr), compare.HourStat.OrderSucc.Percentage(&compare.HourStat.Order)) + text += LineCount("┃┗订单成功率:%s%%", v1.Count(), v11.Count()) + text += "6️⃣小时新增:\n" + regCurr, regRate := calc(&s.HourStat.Register, &compare.HourStat.Register) + text += LineCount("┣新增用户:%s", regCurr.Count(), regRate.Count()) + text += LineCount("┃┏安卓新增:%s", regCurr.Android.Count(), regRate.Android.Count()) + text += LineCount("┣╋苹果新增:%s", regCurr.Ios.Count(), regRate.Ios.Count()) + text += LineCount("┃┣轻量新增:%s", regCurr.Light.Count(), regRate.Light.Count()) + text += LineCount("┃┗H5新增 :%s", regCurr.H5.Count(), regRate.H5.Count()) + text += LineCount("┃┏渠道新增:%s", regCurr.Total.District.Count, regRate.Total.District.Count) + text += LineCount("┣╋有效新增:%s", regCurr.Total.Direct.Value()-regCurr.Total.Direct.Natural.Value, + regRate.Total.Direct.Value()-regRate.Total.Direct.Natural.Value) + text += LineCount("┣╋官网新增:%s", regCurr.Total.Web.Count, regRate.Total.Web.Count) + text += LineCount("┃┣自来新增:%s", regCurr.Total.Normal.Count, regRate.Total.Normal.Count) + text += LineCount("┃┗分享新增:%s", regCurr.Total.Share.Count, regRate.Total.Share.Count) + text += "7️⃣小时落地页点击:\n" + text += LineCount("┣总数:%s", s.HourLandPage.LandPageTotalClick, rate(s.HourLandPage.LandPageTotalClick, compare.HourLandPage.LandPageTotalClick)) + text += LineCount("┃┏安卓:%s", s.HourLandPage.LandPageAndroidClick, rate(s.HourLandPage.LandPageAndroidClick, compare.HourLandPage.LandPageAndroidClick)) + text += LineCount("┣╋商店:%s", s.HourLandPage.LandPageIosAppstoreClick, rate(s.HourLandPage.LandPageIosAppstoreClick, compare.HourLandPage.LandPageIosAppstoreClick)) + text += LineCount("┃┣企业:%s", s.HourLandPage.LandPageIosFirmClick, rate(s.HourLandPage.LandPageIosFirmClick, compare.HourLandPage.LandPageIosFirmClick)) + text += LineCount("┃┗轻量:%s", s.HourLandPage.LandPageIosLightClick, rate(s.HourLandPage.LandPageIosLightClick, compare.HourLandPage.LandPageIosLightClick)) + + }() + func() { + if s.TodayGame != nil { + text += "8️⃣游戏数据:\n" + text += fmt.Sprintf("┣游戏充值: %d\n", s.TodayGame.RchgAmount) + text += fmt.Sprintf("┣代充充值: %d\n", s.TodayGame.DcRchgAmount) + text += fmt.Sprintf("┣有效投注: %d\n", s.TodayGame.ValidBet) + text += fmt.Sprintf("┣系统盈利: %d\n", s.TodayGame.Profit) + text += fmt.Sprintf("┣提现金额: %d\n", s.TodayGame.WtdrRealAmount) + text += fmt.Sprintf("┣游戏上分: %d\n", s.TodayGame.IncAmount) + text += fmt.Sprintf("┗游戏下分: %d\n", s.TodayGame.DecAmount) + } + }() + text += fmt.Sprintf("🆚%s同比数据:当日的昨天%d点\n", appName, compare.SumDate.Hour()) + } else { + func() { + reCurr := &s.TodayStat.Recharge + text += "1️⃣当日充值:\n" + text += LineMoneyOne("┣充值合计: %s", reCurr.Value()) + text += LineMoneyOne("┃┏安卓充值: %s", reCurr.Android.Value()) + text += LineMoneyOne("┣╋苹果充值: %s", reCurr.Ios.Value()) + text += LineMoneyOne("┃┣轻量充值: %s", reCurr.Light.Value()) + text += LineMoneyOne("┃┗H5充值: %s", reCurr.H5.Value()) + text += LineMoneyOne("┃┏渠道充值: %s", reCurr.Total.District.Value) + text += LineMoneyOne("┣╋官网充值: %s", reCurr.Total.Web.Value) + text += LineMoneyOne("┃┣自来充值: %s", reCurr.Total.Normal.Value) + text += LineMoneyOne("┃┗分享充值: %s", reCurr.Total.Share.Value) + + oldCurr := &s.TodayStat.RechargeOld + text += LineMoneyOne("┃┏老用户充: %s", oldCurr.Value()) + newCurr := &s.TodayStat.RechargeNew + text += LineMoneyOne("┣╋新用户充: %s", newCurr.Value()) + v0 := newCurr.Percentage(reCurr) + text += LineCountOne("┃┗新充占比: %s%%", v0.Value()) + + memCurr := &s.TodayStat.RechargeVip + text += LineMoneyOne("┃┏会员充值: %s", memCurr.Value()) + coinCurr := &s.TodayStat.RechargeGold + text += LineMoneyOne("┣╋金币充值: %s", coinCurr.Value()) + v1 := memCurr.Percentage(reCurr) + text += LineCountOne("┃┗会员占比: %s%%", v1.Value()) + + orderCurr := &s.TodayStat.Order + text += LineCountOne("┃┏订单拉起: %s", orderCurr.Count()) + succCurr := &s.TodayStat.OrderSucc + text += LineCountOne("┣╋订单成功: %s", succCurr.Count()) + v2 := succCurr.Percentage(orderCurr) + text += LineCountOne("┃┗成功占比: %s%%", v2.Count()) + text += "2️⃣当日新增:\n" + regCurr := &s.TodayStat.Register + text += LineCountOne("┣新增用户: %s", regCurr.Count()) + text += LineCountOne("┃┏安卓新增: %s", regCurr.Android.Count()) + text += LineCountOne("┣╋苹果新增: %s", regCurr.Ios.Count()) + text += LineCountOne("┃┣轻量新增: %s", regCurr.Light.Count()) + text += LineCountOne("┃┗H5新增: %s", regCurr.H5.Count()) + text += LineCountOne("┃┏渠道新增: %s", regCurr.Total.District.Count) + text += LineCountOne("┣╋官网新增: %s", regCurr.Total.Web.Count) + text += LineCountOne("┃┣自来新增: %s", regCurr.Total.Normal.Count) + text += LineCountOne("┃┗分享新增: %s", regCurr.Total.Share.Count) + text += "3️⃣当日日活:\n" + visitCurr := &s.TodayStat.Visit + text += LineCountOne("┣日活总数: %s", visitCurr.Count()) + text += LineCountOne("┃┏安卓日活: %s", visitCurr.Android.Count()) + text += LineCountOne("┣╋苹果日活: %s", visitCurr.Ios.Count()) + text += LineCountOne("┃┣轻量日活: %s", visitCurr.Light.Count()) + text += LineCountOne("┃┗H5日活: %s", visitCurr.H5.Count()) + text += LineCountOne("┃┏渠道日活: %s", visitCurr.Total.District.Count) + text += LineCountOne("┣╋官网日活: %s", visitCurr.Total.Web.Count) + text += LineCountOne("┃┣自来日活: %s", visitCurr.Total.Normal.Count) + text += LineCountOne("┃┗分享日活: %s", visitCurr.Total.Share.Count) + }() + func() { + reCurr := &s.HourStat.Recharge + text += "4️⃣小时充值:\n" + text += LineMoneyOne(" ┣充值合计: %s", reCurr.Value()) + text += LineMoneyOne(" ┣安卓充值: %s", reCurr.Android.Value()) + text += LineMoneyOne(" ┣苹果充值: %s", reCurr.Ios.Value()) + text += LineMoneyOne(" ┣轻量充值: %s", reCurr.Light.Value()) + text += LineMoneyOne(" ┣H5充值: %s", reCurr.H5.Value()) + text += LineMoneyOne(" ┣渠道充值: %s", reCurr.Total.District.Value) + text += LineMoneyOne(" ┣官网充值: %s", reCurr.Total.Web.Value) + text += LineMoneyOne(" ┣自来充值: %s", reCurr.Total.Normal.Value) + oldCurr := &s.HourStat.RechargeOld + text += LineMoneyOne(" ┣老用户充: %s", oldCurr.Value()) + newCurr := &s.HourStat.RechargeNew + text += LineMoneyOne(" ┣新用户充: %s", newCurr.Value()) + memCurr := &s.HourStat.RechargeVip + text += LineMoneyOne(" ┣会员充值: %s", memCurr.Value()) + coinCurr := &s.HourStat.RechargeGold + text += LineMoneyOne(" ┣金币充值: %s", coinCurr.Value()) + orderCurr := &s.HourStat.Order + text += LineCountOne(" ┣订单拉起: %s", orderCurr.Count()) + succCurr := &s.HourStat.OrderSucc + text += LineCountOne(" ┣订单成功: %s", succCurr.Count()) + v1 := succCurr.Percentage(orderCurr) + text += LineCountOne(" ┗订单成功率: %s%%", v1.Count()) + text += "5️⃣小时新增:\n" + regCurr := &s.HourStat.Register + text += LineCountOne(" ┣新增用户: %s", regCurr.Count()) + text += LineCountOne(" ┣安卓新增: %s", regCurr.Android.Count()) + text += LineCountOne(" ┣苹果新增: %s", regCurr.Ios.Count()) + text += LineCountOne(" ┣轻量新增: %s", regCurr.Light.Count()) + text += LineCountOne(" ┣H5新增: %s", regCurr.H5.Count()) + text += LineCountOne(" ┣渠道新增: %s", regCurr.Total.District.Count) + text += LineCountOne(" ┣官网新增: %s", regCurr.Total.Web.Count) + text += LineCountOne(" ┗自来新增: %s", regCurr.Total.Normal.Count) + }() + func() { + if s.TodayGame != nil { + text += "5️⃣游戏数据:\n" + text += fmt.Sprintf(" ┣游戏充值: %d\n", s.TodayGame.RchgAmount) + text += fmt.Sprintf(" ┣代充充值: %d\n", s.TodayGame.DcRchgAmount) + text += fmt.Sprintf(" ┣有效投注: %d\n", s.TodayGame.ValidBet) + text += fmt.Sprintf(" ┣系统盈利: %d\n", s.TodayGame.Profit) + text += fmt.Sprintf(" ┣提现金额: %d\n", s.TodayGame.WtdrRealAmount) + text += fmt.Sprintf(" ┣游戏上分: %d\n", s.TodayGame.IncAmount) + text += fmt.Sprintf(" ┗游戏下分: %d\n", s.TodayGame.DecAmount) + } + }() + text += fmt.Sprintf("🆚【%s】同比数据未找到\n", appName) + } + return text +} + +func (s *BotHourStat) DisplaySummaryText(title string) string { + var text string + text += fmt.Sprintf("统计标题:%s\n", title) // + func() { + reCurr := &s.TodayStat.Recharge + text += "1️⃣充值合计:\n" + text += LineMoneyOne("┣充值合计: %s元", reCurr.Value()) + text += LineMoneyOne("┃┏安卓充值: %s元", reCurr.Android.Value()) + text += LineMoneyOne("┣╋苹果充值: %s元", reCurr.Ios.Value()) + text += LineMoneyOne("┃┣轻量充值: %s元", reCurr.Light.Value()) + text += LineMoneyOne("┃┗H5充值: %s元", reCurr.H5.Value()) + text += LineMoneyOne("┃┏渠道充值: %s元", reCurr.Total.District.Value) + text += LineMoneyOne("┣╋官网充值: %s元", reCurr.Total.Web.Value) + text += LineMoneyOne("┃┣自来充值: %s元", reCurr.Total.Normal.Value) + text += LineMoneyOne("┃┗分享充值: %s元", reCurr.Total.Share.Value) + + oldCurr := &s.TodayStat.RechargeOld + text += LineMoneyOne("┃┏老用户充: %s元", oldCurr.Value()) + newCurr := &s.TodayStat.RechargeNew + text += LineMoneyOne("┣╋新用户充: %s元", newCurr.Value()) + v0 := newCurr.Percentage(reCurr) + text += LineCountOne("┃┗新充占比: %s%%", v0.Value()) + + memCurr := &s.TodayStat.RechargeVip + text += LineMoneyOne("┃┏会员充值: %s元", memCurr.Value()) + coinCurr := &s.TodayStat.RechargeGold + text += LineMoneyOne("┣╋金币充值: %s元", coinCurr.Value()) + v1 := memCurr.Percentage(reCurr) + text += LineCountOne("┃┗会员占比: %s%%", v1.Value()) + + orderCurr := &s.TodayStat.Order + text += LineCountOne("┃┏订单拉起: %s", orderCurr.Count()) + succCurr := &s.TodayStat.OrderSucc + text += LineCountOne("┣╋订单成功: %s", succCurr.Count()) + v2 := succCurr.Percentage(orderCurr) + text += LineCountOne("┃┗成功占比: %s%%", v2.Count()) + text += "2️⃣新增合计:\n" + regCurr := &s.TodayStat.Register + text += LineCountOne("┣新增用户: %s", regCurr.Count()) + text += LineCountOne("┃┏安卓新增: %s", regCurr.Android.Count()) + text += LineCountOne("┣╋苹果新增: %s", regCurr.Ios.Count()) + text += LineCountOne("┃┣轻量新增: %s", regCurr.Light.Count()) + text += LineCountOne("┃┗H5新增: %s", regCurr.H5.Count()) + text += LineCountOne("┃┏渠道新增: %s", regCurr.Total.District.Count) + text += LineCountOne("┣╋官网新增: %s", regCurr.Total.Web.Count) + text += LineCountOne("┃┣自来新增: %s", regCurr.Total.Normal.Count) + text += LineCountOne("┃┗分享新增: %s", regCurr.Total.Share.Count) + text += "3️⃣日活合计:\n" + visitCurr := &s.TodayStat.Visit + text += LineCountOne("┣日活总数: %s", visitCurr.Count()) + text += LineCountOne("┃┏安卓日活: %s", visitCurr.Android.Count()) + text += LineCountOne("┣╋苹果日活: %s", visitCurr.Ios.Count()) + text += LineCountOne("┃┣轻量日活: %s", visitCurr.Light.Count()) + text += LineCountOne("┃┗H5日活: %s", visitCurr.H5.Count()) + text += LineCountOne("┃┏渠道日活: %s", visitCurr.Total.District.Count) + text += LineCountOne("┣╋官网日活: %s", visitCurr.Total.Web.Count) + text += LineCountOne("┃┣自来日活: %s", visitCurr.Total.Normal.Count) + text += LineCountOne("┃┗分享日活: %s", visitCurr.Total.Share.Count) + }() + func() { + if s.AppId == 888 && s.TodayGame != nil { + text += "5️⃣游戏合计:\n" + text += fmt.Sprintf("┃┏游戏充值: %d\n", s.TodayGame.RchgAmount) + text += fmt.Sprintf("┃┣代充充值: %d\n", s.TodayGame.DcRchgAmount) + text += fmt.Sprintf("┃┣有效投注: %d\n", s.TodayGame.ValidBet) + text += fmt.Sprintf("┣╋系统盈利: %d\n", s.TodayGame.Profit) + text += fmt.Sprintf("┃┣提现金额: %d\n", s.TodayGame.WtdrRealAmount) + text += fmt.Sprintf("┃┣游戏上分: %d\n", s.TodayGame.IncAmount) + text += fmt.Sprintf("┃┗游戏下分: %d\n", s.TodayGame.DecAmount) + } + }() + + return text +} + +func (s *BotHourStat) GenerateTodayTable(title string, statName string, filepath string, compare *BotHourStat) (string, error) { + var text string + text += fmt.Sprintf("报告时间:%s\n", s.SumDate.Format("2006-01-02T15:04:05")) + if _, exists := statutils.StatProjectNameDict[statName]; exists { + if compare != nil { + switch statName { + case statutils.StatProjectRecharge: + return text, s.TodayStat.Recharge.Table(title, 100, &compare.TodayStat.Recharge, filepath) + case statutils.StatProjectRechargeOld: + return text, s.TodayStat.RechargeOld.Table(title, 100, &compare.TodayStat.RechargeOld, filepath) + case statutils.StatProjectRechargeNew: + return text, s.TodayStat.RechargeNew.Table(title, 100, &compare.TodayStat.RechargeNew, filepath) + case statutils.StatProjectRechargeGold: + return text, s.TodayStat.RechargeGold.Table(title, 100, &compare.TodayStat.RechargeGold, filepath) + case statutils.StatProjectRechargeVip: + return text, s.TodayStat.RechargeVip.Table(title, 100, &compare.TodayStat.RechargeVip, filepath) + case statutils.StatProjectOrder: + return text, s.TodayStat.Order.Table(title, 1, &compare.TodayStat.Order, filepath) + case statutils.StatProjectRegister: + return text, s.TodayStat.Register.Table(title, 1, &compare.TodayStat.Register, filepath) + case statutils.StatProjectVisit: + return text, s.TodayStat.Visit.Table(title, 1, &compare.TodayStat.Visit, filepath) + default: + return "", errors.New("没有指定统计项目") + } + } else { + switch statName { + case statutils.StatProjectRecharge: + return text, s.TodayStat.Recharge.Table(title, 100, nil, filepath) + case statutils.StatProjectRechargeOld: + return text, s.TodayStat.RechargeOld.Table(title, 100, nil, filepath) + case statutils.StatProjectRechargeNew: + return text, s.TodayStat.RechargeNew.Table(title, 100, nil, filepath) + case statutils.StatProjectRechargeGold: + return text, s.TodayStat.RechargeGold.Table(title, 100, nil, filepath) + case statutils.StatProjectRechargeVip: + return text, s.TodayStat.RechargeVip.Table(title, 100, nil, filepath) + case statutils.StatProjectOrder: + return text, s.TodayStat.Order.Table(title, 1, nil, filepath) + case statutils.StatProjectRegister: + return text, s.TodayStat.Register.Table(title, 1, nil, filepath) + case statutils.StatProjectVisit: + return text, s.TodayStat.Visit.Table(title, 1, nil, filepath) + default: + return "", errors.New("没有指定统计项目") + } + } + } else { + return "", errors.New("没有指定统计项目") + } +} + +func (s *BotHourStat) DisplayDayHourTextWithTitle(appName string, compare *BotHourStat) (text string, title string, descript string) { + calc := func(curr, hist *statutils.Stat) (*statutils.Stat, *statutils.Stat) { + diff := curr.Sub(hist) + rate := diff.Permil(hist) + return curr, rate + } + rate := func(currValue, histValue int64) int64 { + if histValue != 0 { + return (currValue - histValue) * 1000 / histValue + } else { + return 0 + } + } + title = fmt.Sprintf("%s", appName) + descript = fmt.Sprintf("统计时间: %s\n", s.SumDate.Format("2006-01-02T15")) + if compare != nil { + func() { + reCurr, reRate := calc(&s.TodayStat.Recharge, &compare.TodayStat.Recharge) + text += "1️⃣当日充值:\n" + text += LineMoney("┣充值合计:%s", reCurr.Value(), reRate.Value()) + descript += LineMoney(" 今日充值:%s", reCurr.Value(), reRate.Value()) + text += LineMoney("┃┏安卓充值:%s", reCurr.Android.Value(), reRate.Android.Value()) + text += LineMoney("┣╋苹果充值:%s", reCurr.Ios.Value(), reRate.Ios.Value()) + text += LineMoney("┃┣轻量充值:%s", reCurr.Light.Value(), reRate.Light.Value()) + text += LineMoney("┃┗H5充值 :%s", reCurr.H5.Value(), reRate.H5.Value()) + text += LineMoney("┃┏渠道充值:%s", reCurr.Total.District.Value, reRate.Total.District.Value) + text += LineMoney("┣╋官网充值:%s", reCurr.Total.Web.Value, reRate.Total.Web.Value) + text += LineMoney("┃┣自来充值:%s", reCurr.Total.Normal.Value, reRate.Total.Normal.Value) + text += LineMoney("┃┗分享充值:%s", reCurr.Total.Share.Value, reRate.Total.Share.Value) + oldCurr, oldRate := calc(&s.TodayStat.RechargeOld, &compare.TodayStat.RechargeOld) + text += LineMoney("┃┏老用户充:%s", oldCurr.Value(), oldRate.Value()) + newCurr, newRate := calc(&s.TodayStat.RechargeNew, &compare.TodayStat.RechargeNew) + text += LineMoney("┣╋新用户充:%s", newCurr.Value(), newRate.Value()) + v0, v00 := calc(newCurr.Percentage(reCurr), compare.TodayStat.RechargeNew.Percentage(&compare.TodayStat.Recharge)) + text += LineCount("┃┗新充占比:%s%%", v0.Value(), v00.Value()) + memCurr, memRate := calc(&s.TodayStat.RechargeVip, &compare.TodayStat.RechargeVip) + text += LineMoney("┃┏会员充值:%s", memCurr.Value(), memRate.Value()) + coinCurr, coinRate := calc(&s.TodayStat.RechargeGold, &compare.TodayStat.RechargeGold) + text += LineMoney("┣╋金币充值:%s", coinCurr.Value(), coinRate.Value()) + v2, v22 := calc(memCurr.Percentage(reCurr), compare.TodayStat.RechargeVip.Percentage(&compare.TodayStat.Recharge)) + text += LineCount("┃┗会员占比:%s%%", v2.Value(), v22.Value()) + orderCurr, orderRate := calc(&s.TodayStat.Order, &compare.TodayStat.Order) + text += LineCount("┃┏订单拉起:%s", orderCurr.Count(), orderRate.Count()) + succCurr, succRate := calc(&s.TodayStat.OrderSucc, &compare.TodayStat.OrderSucc) + text += LineCount("┣╋订单成功:%s", succCurr.Count(), succRate.Count()) + v1, v11 := calc(succCurr.Percentage(orderCurr), compare.TodayStat.OrderSucc.Percentage(&compare.TodayStat.Order)) + text += LineCount("┃┗成功比率:%s%%", v1.Count(), v11.Count()) + text += "2️⃣当日新增:\n" + + regCurr, regRate := calc(&s.TodayStat.Register, &compare.TodayStat.Register) + text += LineCount("┣新增用户:%s", regCurr.Count(), regRate.Count()) + descript += LineCount(" 今日新增:%s", regCurr.Count(), regRate.Count()) + text += LineCount("┃┏安卓新增:%s", regCurr.Android.Count(), regRate.Android.Count()) + text += LineCount("┣╋苹果新增:%s", regCurr.Ios.Count(), regRate.Ios.Count()) + text += LineCount("┃┣轻量新增:%s", regCurr.Light.Count(), regRate.Light.Count()) + text += LineCount("┃┗H5新增 :%s", regCurr.H5.Count(), regRate.H5.Count()) + text += LineCount("┃┏渠道新增:%s", regCurr.Total.District.Count, regRate.Total.District.Count) + text += LineCount("┣╋有效新增:%s", regCurr.Total.Direct.Value()-regCurr.Total.Direct.Natural.Value, + regRate.Total.Direct.Value()-regRate.Total.Direct.Natural.Value) + text += LineCount("┣╋官网新增:%s", regCurr.Total.Web.Count, regRate.Total.Web.Count) + text += LineCount("┃┣自来新增:%s", regCurr.Total.Normal.Count, regRate.Total.Normal.Count) + text += LineCount("┃┗分享新增:%s", regCurr.Total.Share.Count, regRate.Total.Share.Count) + text += "3️⃣当日日活:\n" + visitCurr, visitRate := calc(&s.TodayStat.Visit, &compare.TodayStat.Visit) + text += LineCount("┣日活总数:%s", visitCurr.Count(), visitRate.Count()) + text += LineCount("┃┏安卓日活:%s", visitCurr.Android.Count(), visitRate.Android.Count()) + text += LineCount("┣╋苹果日活:%s", visitCurr.Ios.Count(), visitRate.Ios.Count()) + text += LineCount("┃┣轻量日活:%s", visitCurr.Light.Count(), visitRate.Light.Count()) + text += LineCount("┃┗H5日活 :%s", visitCurr.H5.Count(), visitRate.H5.Count()) + text += LineCount("┃┏渠道日活:%s", visitCurr.Total.District.Count, visitRate.Total.District.Count) + text += LineCount("┣╋官网日活:%s", visitCurr.Total.Web.Count, visitRate.Total.Web.Count) + text += LineCount("┃┣自来日活:%s", visitCurr.Total.Normal.Count, visitRate.Total.Normal.Count) + text += LineCount("┃┗分享日活:%s", visitCurr.Total.Share.Count, visitRate.Total.Share.Count) + text += "4️⃣落地页点击:\n" + text += LineCount("┣总数:%s", s.TodayLandPage.LandPageTotalClick, rate(s.TodayLandPage.LandPageTotalClick, compare.TodayLandPage.LandPageTotalClick)) + text += LineCount("┃┏安卓:%s", s.TodayLandPage.LandPageAndroidClick, rate(s.TodayLandPage.LandPageAndroidClick, compare.TodayLandPage.LandPageAndroidClick)) + text += LineCount("┣╋商店:%s", s.TodayLandPage.LandPageIosAppstoreClick, rate(s.TodayLandPage.LandPageIosAppstoreClick, compare.TodayLandPage.LandPageIosAppstoreClick)) + text += LineCount("┃┣企业:%s", s.TodayLandPage.LandPageIosFirmClick, rate(s.TodayLandPage.LandPageIosFirmClick, compare.TodayLandPage.LandPageIosFirmClick)) + text += LineCount("┃┗轻量:%s", s.TodayLandPage.LandPageIosLightClick, rate(s.TodayLandPage.LandPageIosLightClick, compare.TodayLandPage.LandPageIosLightClick)) + }() + func() { + reCurr, reRate := calc(&s.HourStat.Recharge, &compare.HourStat.Recharge) + text += "5️⃣小时充值:\n" + text += LineMoney("┣充值合计:%s", reCurr.Value(), reRate.Value()) + descript += LineMoney(" 小时充值:%s", reCurr.Value(), reRate.Value()) + text += LineMoney("┃┏安卓充值:%s", reCurr.Android.Value(), reRate.Android.Value()) + text += LineMoney("┣╋苹果充值:%s", reCurr.Ios.Value(), reRate.Ios.Value()) + text += LineMoney("┃┣轻量充值:%s", reCurr.Light.Value(), reRate.Light.Value()) + text += LineMoney("┃┗H5充值 :%s", reCurr.H5.Value(), reRate.H5.Value()) + text += LineMoney("┃┏渠道充值:%s", reCurr.Total.District.Value, reRate.Total.District.Value) + text += LineMoney("┣╋官网充值:%s", reCurr.Total.Web.Value, reRate.Total.Web.Value) + text += LineMoney("┃┣自来充值:%s", reCurr.Total.Normal.Value, reRate.Total.Normal.Value) + text += LineMoney("┃┗分享充值:%s", reCurr.Total.Share.Value, reRate.Total.Share.Value) + oldCurr, oldRate := calc(&s.HourStat.RechargeOld, &compare.HourStat.RechargeOld) + text += LineMoney("┃┏老用户充:%s", oldCurr.Value(), oldRate.Value()) + newCurr, newRate := calc(&s.HourStat.RechargeNew, &compare.HourStat.RechargeNew) + text += LineMoney("┣╋新用户充:%s", newCurr.Value(), newRate.Value()) + v0, v00 := calc(newCurr.Percentage(reCurr), compare.HourStat.RechargeNew.Percentage(&compare.HourStat.Recharge)) + text += LineCount("┃┗新充占比:%s%%", v0.Value(), v00.Value()) + memCurr, memRate := calc(&s.HourStat.RechargeVip, &compare.HourStat.RechargeVip) + text += LineMoney("┃┏会员充值:%s", memCurr.Value(), memRate.Value()) + coinCurr, coinRate := calc(&s.HourStat.RechargeGold, &compare.HourStat.RechargeGold) + text += LineMoney("┣╋金币充值:%s", coinCurr.Value(), coinRate.Value()) + v2, v22 := calc(memCurr.Percentage(reCurr), compare.HourStat.RechargeVip.Percentage(&compare.HourStat.Recharge)) + text += LineCount("┃┗会员占比:%s%%", v2.Value(), v22.Value()) + orderCurr, orderRate := calc(&s.HourStat.Order, &compare.HourStat.Order) + text += LineCount("┃┏订单拉起:%s", orderCurr.Count(), orderRate.Count()) + succCurr, succRate := calc(&s.HourStat.OrderSucc, &compare.HourStat.OrderSucc) + text += LineCount("┣╋订单成功:%s", succCurr.Count(), succRate.Count()) + v1, v11 := calc(succCurr.Percentage(orderCurr), compare.HourStat.OrderSucc.Percentage(&compare.HourStat.Order)) + text += LineCount("┃┗订单成功率:%s%%", v1.Count(), v11.Count()) + text += "6️⃣小时新增:\n" + regCurr, regRate := calc(&s.HourStat.Register, &compare.HourStat.Register) + text += LineCount("┣新增用户:%s", regCurr.Count(), regRate.Count()) + descript += LineCount(" 小时新增:%s", regCurr.Count(), regRate.Count()) + text += LineCount("┃┏安卓新增:%s", regCurr.Android.Count(), regRate.Android.Count()) + text += LineCount("┣╋苹果新增:%s", regCurr.Ios.Count(), regRate.Ios.Count()) + text += LineCount("┃┣轻量新增:%s", regCurr.Light.Count(), regRate.Light.Count()) + text += LineCount("┃┗H5新增 :%s", regCurr.H5.Count(), regRate.H5.Count()) + text += LineCount("┃┏渠道新增:%s", regCurr.Total.District.Count, regRate.Total.District.Count) + text += LineCount("┣╋有效新增:%s", regCurr.Total.Direct.Value()-regCurr.Total.Direct.Natural.Value, + regRate.Total.Direct.Value()-regRate.Total.Direct.Natural.Value) + text += LineCount("┣╋官网新增:%s", regCurr.Total.Web.Count, regRate.Total.Web.Count) + text += LineCount("┃┣自来新增:%s", regCurr.Total.Normal.Count, regRate.Total.Normal.Count) + text += LineCount("┃┗分享新增:%s", regCurr.Total.Share.Count, regRate.Total.Share.Count) + text += "7️⃣小时落地页点击:\n" + text += LineCount("┣总数:%s", s.HourLandPage.LandPageTotalClick, rate(s.HourLandPage.LandPageTotalClick, compare.HourLandPage.LandPageTotalClick)) + text += LineCount("┃┏安卓:%s", s.HourLandPage.LandPageAndroidClick, rate(s.HourLandPage.LandPageAndroidClick, compare.HourLandPage.LandPageAndroidClick)) + text += LineCount("┣╋商店:%s", s.HourLandPage.LandPageIosAppstoreClick, rate(s.HourLandPage.LandPageIosAppstoreClick, compare.HourLandPage.LandPageIosAppstoreClick)) + text += LineCount("┃┣企业:%s", s.HourLandPage.LandPageIosFirmClick, rate(s.HourLandPage.LandPageIosFirmClick, compare.HourLandPage.LandPageIosFirmClick)) + text += LineCount("┃┗轻量:%s", s.HourLandPage.LandPageIosLightClick, rate(s.HourLandPage.LandPageIosLightClick, compare.HourLandPage.LandPageIosLightClick)) + + }() + func() { + if s.TodayGame != nil { + text += "8️⃣游戏数据:\n" + text += fmt.Sprintf("┣游戏充值: %d\n", s.TodayGame.RchgAmount) + text += fmt.Sprintf("┣代充充值: %d\n", s.TodayGame.DcRchgAmount) + text += fmt.Sprintf("┣有效投注: %d\n", s.TodayGame.ValidBet) + text += fmt.Sprintf("┣系统盈利: %d\n", s.TodayGame.Profit) + text += fmt.Sprintf("┣提现金额: %d\n", s.TodayGame.WtdrRealAmount) + text += fmt.Sprintf("┣游戏上分: %d\n", s.TodayGame.IncAmount) + text += fmt.Sprintf("┗游戏下分: %d\n", s.TodayGame.DecAmount) + } + }() + text += fmt.Sprintf("🆚%s同比数据:当日的昨天%d点\n", appName, compare.SumDate.Hour()) + } else { + func() { + reCurr := &s.TodayStat.Recharge + text += "1️⃣当日充值:\n" + text += LineMoneyOne("┣充值合计: %s", reCurr.Value()) + text += LineMoneyOne("┃┏安卓充值: %s", reCurr.Android.Value()) + text += LineMoneyOne("┣╋苹果充值: %s", reCurr.Ios.Value()) + text += LineMoneyOne("┃┣轻量充值: %s", reCurr.Light.Value()) + text += LineMoneyOne("┃┗H5充值: %s", reCurr.H5.Value()) + text += LineMoneyOne("┃┏渠道充值: %s", reCurr.Total.District.Value) + text += LineMoneyOne("┣╋官网充值: %s", reCurr.Total.Web.Value) + text += LineMoneyOne("┃┣自来充值: %s", reCurr.Total.Normal.Value) + text += LineMoneyOne("┃┗分享充值: %s", reCurr.Total.Share.Value) + + oldCurr := &s.TodayStat.RechargeOld + text += LineMoneyOne("┃┏老用户充: %s", oldCurr.Value()) + newCurr := &s.TodayStat.RechargeNew + text += LineMoneyOne("┣╋新用户充: %s", newCurr.Value()) + v0 := newCurr.Percentage(reCurr) + text += LineCountOne("┃┗新充占比: %s%%", v0.Value()) + + memCurr := &s.TodayStat.RechargeVip + text += LineMoneyOne("┃┏会员充值: %s", memCurr.Value()) + coinCurr := &s.TodayStat.RechargeGold + text += LineMoneyOne("┣╋金币充值: %s", coinCurr.Value()) + v1 := memCurr.Percentage(reCurr) + text += LineCountOne("┃┗会员占比: %s%%", v1.Value()) + + orderCurr := &s.TodayStat.Order + text += LineCountOne("┃┏订单拉起: %s", orderCurr.Count()) + succCurr := &s.TodayStat.OrderSucc + text += LineCountOne("┣╋订单成功: %s", succCurr.Count()) + v2 := succCurr.Percentage(orderCurr) + text += LineCountOne("┃┗成功占比: %s%%", v2.Count()) + text += "2️⃣当日新增:\n" + regCurr := &s.TodayStat.Register + text += LineCountOne("┣新增用户: %s", regCurr.Count()) + text += LineCountOne("┃┏安卓新增: %s", regCurr.Android.Count()) + text += LineCountOne("┣╋苹果新增: %s", regCurr.Ios.Count()) + text += LineCountOne("┃┣轻量新增: %s", regCurr.Light.Count()) + text += LineCountOne("┃┗H5新增: %s", regCurr.H5.Count()) + text += LineCountOne("┃┏渠道新增: %s", regCurr.Total.District.Count) + text += LineCountOne("┣╋官网新增: %s", regCurr.Total.Web.Count) + text += LineCountOne("┃┣自来新增: %s", regCurr.Total.Normal.Count) + text += LineCountOne("┃┗分享新增: %s", regCurr.Total.Share.Count) + text += "3️⃣当日日活:\n" + visitCurr := &s.TodayStat.Visit + text += LineCountOne("┣日活总数: %s", visitCurr.Count()) + text += LineCountOne("┃┏安卓日活: %s", visitCurr.Android.Count()) + text += LineCountOne("┣╋苹果日活: %s", visitCurr.Ios.Count()) + text += LineCountOne("┃┣轻量日活: %s", visitCurr.Light.Count()) + text += LineCountOne("┃┗H5日活: %s", visitCurr.H5.Count()) + text += LineCountOne("┃┏渠道日活: %s", visitCurr.Total.District.Count) + text += LineCountOne("┣╋官网日活: %s", visitCurr.Total.Web.Count) + text += LineCountOne("┃┣自来日活: %s", visitCurr.Total.Normal.Count) + text += LineCountOne("┃┗分享日活: %s", visitCurr.Total.Share.Count) + }() + func() { + reCurr := &s.HourStat.Recharge + text += "4️⃣小时充值:\n" + text += LineMoneyOne(" ┣充值合计: %s", reCurr.Value()) + text += LineMoneyOne(" ┣安卓充值: %s", reCurr.Android.Value()) + text += LineMoneyOne(" ┣苹果充值: %s", reCurr.Ios.Value()) + text += LineMoneyOne(" ┣轻量充值: %s", reCurr.Light.Value()) + text += LineMoneyOne(" ┣H5充值: %s", reCurr.H5.Value()) + text += LineMoneyOne(" ┣渠道充值: %s", reCurr.Total.District.Value) + text += LineMoneyOne(" ┣官网充值: %s", reCurr.Total.Web.Value) + text += LineMoneyOne(" ┣自来充值: %s", reCurr.Total.Normal.Value) + oldCurr := &s.HourStat.RechargeOld + text += LineMoneyOne(" ┣老用户充: %s", oldCurr.Value()) + newCurr := &s.HourStat.RechargeNew + text += LineMoneyOne(" ┣新用户充: %s", newCurr.Value()) + memCurr := &s.HourStat.RechargeVip + text += LineMoneyOne(" ┣会员充值: %s", memCurr.Value()) + coinCurr := &s.HourStat.RechargeGold + text += LineMoneyOne(" ┣金币充值: %s", coinCurr.Value()) + orderCurr := &s.HourStat.Order + text += LineCountOne(" ┣订单拉起: %s", orderCurr.Count()) + succCurr := &s.HourStat.OrderSucc + text += LineCountOne(" ┣订单成功: %s", succCurr.Count()) + v1 := succCurr.Percentage(orderCurr) + text += LineCountOne(" ┗订单成功率: %s%%", v1.Count()) + text += "5️⃣小时新增:\n" + regCurr := &s.HourStat.Register + text += LineCountOne(" ┣新增用户: %s", regCurr.Count()) + text += LineCountOne(" ┣安卓新增: %s", regCurr.Android.Count()) + text += LineCountOne(" ┣苹果新增: %s", regCurr.Ios.Count()) + text += LineCountOne(" ┣轻量新增: %s", regCurr.Light.Count()) + text += LineCountOne(" ┣H5新增: %s", regCurr.H5.Count()) + text += LineCountOne(" ┣渠道新增: %s", regCurr.Total.District.Count) + text += LineCountOne(" ┣官网新增: %s", regCurr.Total.Web.Count) + text += LineCountOne(" ┗自来新增: %s", regCurr.Total.Normal.Count) + }() + func() { + if s.TodayGame != nil { + text += "5️⃣游戏数据:\n" + text += fmt.Sprintf(" ┣游戏充值: %d\n", s.TodayGame.RchgAmount) + text += fmt.Sprintf(" ┣代充充值: %d\n", s.TodayGame.DcRchgAmount) + text += fmt.Sprintf(" ┣有效投注: %d\n", s.TodayGame.ValidBet) + text += fmt.Sprintf(" ┣系统盈利: %d\n", s.TodayGame.Profit) + text += fmt.Sprintf(" ┣提现金额: %d\n", s.TodayGame.WtdrRealAmount) + text += fmt.Sprintf(" ┣游戏上分: %d\n", s.TodayGame.IncAmount) + text += fmt.Sprintf(" ┗游戏下分: %d\n", s.TodayGame.DecAmount) + } + }() + text += fmt.Sprintf("🆚【%s】同比数据未找到\n", appName) + } + return text, title, descript +} diff --git a/models/botdailyhourstat/stat.go b/models/botdailyhourstat/stat.go new file mode 100644 index 0000000..f3248a9 --- /dev/null +++ b/models/botdailyhourstat/stat.go @@ -0,0 +1,146 @@ +package botdailyhourstat + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollName) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: "appId", Value: 1}, + {Key: "sumDate", Value: 1}, + }, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{ + {Key: "appId", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "sumDate", Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(BotHourStat:Init) Create BotHourStat Index failed! err:%+v:", err)) + } +} + +// InsertOneBotHourStat 插入一个机器人小时统计 +func InsertOneBotHourStat(ctx context.Context, botHourStat *BotHourStat) error { + if _, err := db.InsertOne(ctx, botHourStat); err != nil { + log.Warn("botHourStat:InsertOneBotHourStat db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// FindOneBotHourStat 查找一个机器人小时统计 +func FindOneBotHourStat(ctx context.Context, filter bson.M) (*BotHourStat, error) { + var botHourStat BotHourStat + if err := db.FindOne(ctx, &botHourStat, filter); err != nil { + return nil, err + } + return &botHourStat, nil +} + +// FindOneBotHourStatEx 查找一个机器人小时统计 +func FindOneBotHourStatEx(ctx context.Context, filter bson.M) (*BotHourStat, error) { + var botHourStat BotHourStat + if err := db.FindOneEx(ctx, &botHourStat, filter); err != nil { + return nil, err + } + return &botHourStat, nil +} + +// DelOneBotHourStat 删除一个机器人小时统计 +func DelOneBotHourStat(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("BotHourStat:DelOneBotHourStat db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateOneBotHourStat 更新一个机器人小时统计 +func UpdateOneBotHourStat(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneBotHourStat db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// CountBotHourStats 统计机器人小时统计数量 +func CountBotHourStats(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("BotHourStat:CountBotHourStats db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateManyBotHourStat 更新满足条件的机器人小时统计 +func UpdateManyBotHourStat(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyBotHourStat db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// FindManyBotHourStat 查找一批机器人小时统计数据 +func FindManyBotHourStat(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (BotHourStatList, error) { + data := make(BotHourStatList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("BotHourStat:FindManyBotHourStat db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// FindManyBotHourStatWithBind 用自己定义结构查找一批机器人小时统计数据 +func FindManyBotHourStatWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("BotHourStat:FindManyBotHourStatWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// AggregateBotHourStats 聚合查找一批机器人小时统计信息 +func AggregateBotHourStats(ctx context.Context, bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateBotHourStats db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/botdailyhourstat/type.go b/models/botdailyhourstat/type.go new file mode 100644 index 0000000..3de5fd1 --- /dev/null +++ b/models/botdailyhourstat/type.go @@ -0,0 +1,105 @@ +package botdailyhourstat + +import ( + "stat/common/statutils" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +const CollName = "bot_daily_hour_stat" + +type GameItem struct { + RchgAmount int64 `json:"rchgAmount" bson:"rchg_amount"` //充值总金额 + DcRchgAmount int64 `json:"dcRchgAmount" bson:"dcRchgAmount"` //代充总金额 + WtdrAmount int64 `json:"wtdrAmount" bson:"wtdrAmount"` //游戏提现总金额 + WtdrRealAmount int64 `json:"wtdrRealAmount" bson:"wtdrRealAmount"` //游戏实际提现总金额 + IncAmount int64 `json:"incAmount" bson:"incAmount"` //游戏上分总金额 + DecAmount int64 `json:"decAmount" bson:"decAmount"` //游戏下分总金额 + ValidBet int64 `json:"validBet" bson:"validBet"` //有效投注金额 + Profit int64 `json:"profit" bson:"profit"` //系统盈利 +} + +func (g *GameItem) ACC(d *GameItem) { + if g == nil || d == nil { + return + } + g.RchgAmount += d.RchgAmount + g.DcRchgAmount += d.DcRchgAmount + g.WtdrAmount += d.WtdrAmount + g.WtdrRealAmount += d.WtdrRealAmount + g.IncAmount += d.IncAmount + g.DecAmount += d.DecAmount + g.ValidBet += d.ValidBet + g.Profit += d.Profit +} + +type LandPage struct { + LandPageTotalClick int64 `bson:"landPageTotalClick,omitempty" json:"landPageTotalClick"` // 落地页访问总次数 + LandPageAndroidClick int64 `bson:"landPageAndroidClick,omitempty" json:"landPageAndroidClick"` // 落地页android访问次数 + LandPageIosAppstoreClick int64 `bson:"landPageIosAppstoreClick,omitempty" json:"landPageIosAppstoreClick"` // 落地页iOS商店包访问次数 + LandPageIosFirmClick int64 `bson:"landPageIosFirmClick,omitempty" json:"landPageIosFirmClick"` // 落地页iOS企业包访问次数 + LandPageIosLightClick int64 `bson:"landPageIosLightClick,omitempty" json:"landPageIosLightClick"` // 落地页iOS轻量版访问次数 +} + +func (s *LandPage) ACC(d *LandPage) { + s.LandPageTotalClick += d.LandPageTotalClick + s.LandPageAndroidClick += d.LandPageAndroidClick + s.LandPageIosAppstoreClick += d.LandPageIosAppstoreClick + s.LandPageIosFirmClick += d.LandPageIosFirmClick + s.LandPageIosLightClick += d.LandPageIosLightClick +} + +type StatItem struct { + // 充值 + Recharge statutils.Stat `json:"recharge" bson:"recharge"` // 充值 + RechargeOld statutils.Stat `json:"rechargeOld" bson:"rechargeOld"` // 老用户充值 + RechargeNew statutils.Stat `json:"rechargeNew" bson:"rechargeNew"` // 新用户充值 + RechargeGold statutils.Stat `json:"rechargeGold" bson:"rechargeGold"` // 金币充值 + RechargeVip statutils.Stat `json:"rechargeVip" bson:"rechargeVip"` // 会员充值 + // 订单 + Order statutils.Stat `json:"order" bson:"order"` // 所有订单 + OrderSucc statutils.Stat `json:"orderSucc" bson:"orderSucc"` // 成功订单 + // 注册 + Register statutils.Stat `json:"register" bson:"register"` // 注册 + // 访问 + Visit statutils.Stat `json:"visit" bson:"visit"` // 访问 +} + +func (s *StatItem) ACC(d *StatItem) { + s.Recharge.ACC(&d.Recharge) + s.RechargeOld.ACC(&d.RechargeOld) + s.RechargeNew.ACC(&d.RechargeNew) + s.RechargeGold.ACC(&d.RechargeGold) + s.RechargeVip.ACC(&d.RechargeVip) + s.Order.ACC(&d.Order) + s.OrderSucc.ACC(&d.OrderSucc) + s.Register.ACC(&d.Register) + s.Visit.ACC(&d.Visit) +} + +// @table:bot_hour_stat +type BotHourStat struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + AppId int32 `json:"appId" bson:"appId"` // appId,唯一id + Reported bool `json:"reported" bson:"reported"` // 是否已汇报 + ReportTime time.Time `json:"reportTime" bson:"reportTime"` // 汇报时间 + SumDate time.Time `json:"sumDate" bson:"sumDate"` // 记录时间 按小时对齐 + TodayStat StatItem `json:"todayStat" bson:"todayStat"` // 今日 + HourStat StatItem `json:"hourStat" bson:"hourStat"` // 小时 + TodayGame *GameItem `json:"todayGame" bson:"todayGame,omitempty"` // 游戏 + TodayLandPage LandPage `json:"todayLandPage" bson:"todayLandPage"` // 今日落地页 + HourLandPage LandPage `json:"hourLandPage" bson:"hourLandPage"` // 小时落地页 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 修改时间 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间 +} + +func (s *BotHourStat) ACC(d *BotHourStat) { + s.TodayStat.ACC(&d.TodayStat) + s.HourStat.ACC(&d.HourStat) + s.TodayGame.ACC(d.TodayGame) + s.TodayLandPage.ACC(&d.TodayLandPage) + s.HourLandPage.ACC(&d.HourLandPage) +} + +type BotHourStatList []*BotHourStat diff --git a/models/botreport/bot.go b/models/botreport/bot.go new file mode 100644 index 0000000..0af4948 --- /dev/null +++ b/models/botreport/bot.go @@ -0,0 +1,127 @@ +package botreport + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.BotReport) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.BotReport.SumDate, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(BotReport:initBotReportIndex) Create BotReport Index failed! err:%+v:", err)) + } +} + +//InsertOneBotReport 插入一个VIP购买记录 +func InsertOneBotReport(ctx context.Context, BotReport *BotReport) error { + if _, err := db.InsertOne(ctx, BotReport); err != nil { + log.Warn("BotReport:InsertOneBotReport db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneBotReport 查找一个VIP购买记录 +func FindOneBotReport(ctx context.Context, filter bson.M) ( + *BotReport, error) { + var BotReport BotReport + if err := db.FindOne(ctx, &BotReport, filter); err != nil { + return nil, err + } + return &BotReport, nil +} + +//DelOneBotReport 删除一个VIP购买记录 +func DelOneBotReport(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("BotReport:DelOneBotReport db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneBotReport 更新一个VIP购买记录 +func UpdateOneBotReport(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneBotReport db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountBotReports 统计VIP购买记录数量 +func CountBotReports(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("BotReport:CountBotReports db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyBotReport 更新满足条件的VIP购买记录 +func UpdateManyBotReport(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyBotReport db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyBotReport 查找一批VIP购买记录数据 +func FindManyBotReport(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (BotReportList, error) { + data := make(BotReportList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("BotReport:FindManyBotReport db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyBotReportWithBind 用自己定义结构查找一批VIP购买记录数据 +func FindManyBotReportWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("BotReport:FindManyBotReportWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateBotReports 聚合查找一批VIP购买记录信息 +func AggregateBotReports(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateBotReports db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/botreport/tag.go b/models/botreport/tag.go new file mode 100755 index 0000000..ffa2ec6 --- /dev/null +++ b/models/botreport/tag.go @@ -0,0 +1,224 @@ +package botreport + +type TagBotReport struct { + AccessUser string + TodayAccessIos string + TodayAccessAndroid string + AppId string + CreatedAt string + GameDCRchgAmount string + GameDCRchgCount string + GameDecAmount string + GameDecCount string + GameFirstRchgAmount string + GameFirstRchgCount string + GameFirstRchgUsers string + GameGiftIncAmount string + GameGiftIncCount string + GameIncAmount string + GameInchCount string + GamePlayCount string + GameRchGiftIncAmount string + GameRchGiftIncCount string + GameRchgAmount string + GameRchgCount string + GameRchgUsers string + GameVipGiftIncAmount string + GameVipGiftIncCount string + GameWtdrAmount string + GameWtdrCount string + GameWtdrRealAmount string + HourAndroidNew string + HourAndroidNewRecharge string + HourAndroidRecharge string + HourDistrictRecharge string + HourDistrictVip string + HourH5New string + HourH5NewRecharge string + HourH5Recharge string + HourIosNew string + HourIosNewRecharge string + HourIosRecharge string + HourNew string + HourNewDistrict string + HourNewNormal string + HourNewRecharge string + HourNewWeb string + HourNormalRecharge string + HourNormalVip string + HourOldRecharge string + HourOrder string + HourRecharge string + HourSuccessOrder string + HourVipRecharge string + HourWebRecharge string + HourWebVip string + ID string + Profit string + Revenue string + SumDate string + TodayAccessH5 string + TodayAndroidNew string + TodayAndroidNewRecharge string + TodayAndroidRecharge string + TodayDistrictRecharge string + TodayDistrictVip string + TodayH5New string + TodayH5NewRecharge string + TodayH5Recharge string + TodayIosNew string + TodayIosNewRecharge string + TodayIosRecharge string + TodayNew string + TodayNewDistrict string + TodayNewNormal string + TodayNewRecharge string + TodayNewWeb string + TodayNormalRecharge string + TodayNormalVip string + TodayOldRecharge string + TodayOrder string + TodayRecharge string + TodaySuccessOrder string + TodayVipRecharge string + TodayWebRecharge string + TodayWebVip string + ValidBet string + TodayAccessH5Pc string + TodayAccessH5Ios string + TodayAccessH5Android string + TodayH5PcNew string + TodayH5IosNew string + TodayH5AndroidNew string + TodayH5PcRecharge string + TodayH5IosRecharge string + TodayH5AndroidRecharge string + TodayH5PcNewRecharge string + TodayH5IosNewRecharge string + TodayH5AndroidNewRecharge string + HourH5PcNew string + HourH5IosNew string + HourH5AndroidNew string + HourH5PcRecharge string + HourH5IosRecharge string + HourH5AndroidRecharge string + HourH5PcNewRecharge string + HourH5IosNewRecharge string + HourH5AndroidNewRecharge string +} + +var FN struct { + BotReport TagBotReport +} + +var TN struct { + BotReport string +} + +func init() { + FN.BotReport.AccessUser = "accessUser" + FN.BotReport.AppId = "appId" + FN.BotReport.CreatedAt = "createdAt" + FN.BotReport.GameDCRchgAmount = "gameDCRchgAmount" + FN.BotReport.GameDCRchgCount = "gameDCRchgCount" + FN.BotReport.GameDecAmount = "gameDecAmount" + FN.BotReport.GameDecCount = "gameDecCount" + FN.BotReport.GameFirstRchgAmount = "gameFirstRchgAmount" + FN.BotReport.GameFirstRchgCount = "gameFirstRchgCount" + FN.BotReport.GameFirstRchgUsers = "gameFirstRchgUsers" + FN.BotReport.GameGiftIncAmount = "gameGiftIncAmount" + FN.BotReport.GameGiftIncCount = "gameGiftIncCount" + FN.BotReport.GameIncAmount = "gameIncAmount" + FN.BotReport.GameInchCount = "gameInchCount" + FN.BotReport.GamePlayCount = "gamePlayCount" + FN.BotReport.GameRchGiftIncAmount = "gameRchGiftIncAmount" + FN.BotReport.GameRchGiftIncCount = "gameRchGiftIncCount" + FN.BotReport.GameRchgAmount = "gameRchgAmount" + FN.BotReport.GameRchgCount = "gameRchgCount" + FN.BotReport.GameRchgUsers = "gameRchgUsers" + FN.BotReport.GameVipGiftIncAmount = "gameVipGiftIncAmount" + FN.BotReport.GameVipGiftIncCount = "gameVipGiftIncCount" + FN.BotReport.GameWtdrAmount = "gameWtdrAmount" + FN.BotReport.GameWtdrCount = "gameWtdrCount" + FN.BotReport.GameWtdrRealAmount = "gameWtdrRealAmount" + FN.BotReport.HourAndroidNew = "hourAndroidNew" + FN.BotReport.HourAndroidNewRecharge = "hourAndroidNewRecharge" + FN.BotReport.HourAndroidRecharge = "hourAndroidRecharge" + FN.BotReport.HourDistrictRecharge = "hourDistrictRecharge" + FN.BotReport.HourDistrictVip = "hourDistrictVip" + FN.BotReport.HourH5New = "hourH5New" + FN.BotReport.HourH5NewRecharge = "HourH5NewRecharge" + FN.BotReport.HourH5Recharge = "HourH5Recharge" + FN.BotReport.HourIosNew = "hourIosNew" + FN.BotReport.HourIosNewRecharge = "hourIosNewRecharge" + FN.BotReport.HourIosRecharge = "hourIosRecharge" + FN.BotReport.HourNew = "hourNew" + FN.BotReport.HourNewDistrict = "hourNewDistrict" + FN.BotReport.HourNewNormal = "hourNewNormal" + FN.BotReport.HourNewRecharge = "hourNewRecharge" + FN.BotReport.HourNewWeb = "hourNewWeb" + FN.BotReport.HourNormalRecharge = "hourNormalRecharge" + FN.BotReport.HourNormalVip = "hourNormalVip" + FN.BotReport.HourOldRecharge = "hourOldRecharge" + FN.BotReport.HourOrder = "hourOrder" + FN.BotReport.HourRecharge = "hourRecharge" + FN.BotReport.HourSuccessOrder = "hourSuccessOrder" + FN.BotReport.HourVipRecharge = "hourVipRecharge" + FN.BotReport.HourWebRecharge = "hourWebRecharge" + FN.BotReport.HourWebVip = "hourWeVip" + FN.BotReport.ID = "_id" + FN.BotReport.Profit = "profit" + FN.BotReport.Revenue = "revenue" + FN.BotReport.SumDate = "sumDate" + FN.BotReport.TodayAccessH5 = "todayAccessH5" + FN.BotReport.TodayAndroidNew = "todayAndroidNew" + FN.BotReport.TodayAndroidNewRecharge = "todayAndroidNewRecharge" + FN.BotReport.TodayAndroidRecharge = "todayAndroidRecharge" + FN.BotReport.TodayDistrictRecharge = "todayDistrictRecharge" + FN.BotReport.TodayDistrictVip = "todayDistrictVip" + FN.BotReport.TodayH5New = "todayH5New" + FN.BotReport.TodayH5NewRecharge = "todayH5NewRecharge" + FN.BotReport.TodayH5Recharge = "todayH5Recharge" + FN.BotReport.TodayIosNew = "todayIosNew" + FN.BotReport.TodayIosNewRecharge = "todayIosNewRecharge" + FN.BotReport.TodayIosRecharge = "todayIosRecharge" + FN.BotReport.TodayNew = "todayNew" + FN.BotReport.TodayNewDistrict = "todayNewDistrict" + FN.BotReport.TodayNewNormal = "todayNewNormal" + FN.BotReport.TodayNewRecharge = "todayNewRecharge" + FN.BotReport.TodayNewWeb = "todayNewWeb" + FN.BotReport.TodayNormalRecharge = "todayNormalRecharge" + FN.BotReport.TodayNormalVip = "todayNormalVip" + FN.BotReport.TodayOldRecharge = "todayOldRecharge" + FN.BotReport.TodayOrder = "todayOrder" + FN.BotReport.TodayRecharge = "todayRecharge" + FN.BotReport.TodaySuccessOrder = "todaySuccessOrder" + FN.BotReport.TodayVipRecharge = "todayVipRecharge" + FN.BotReport.TodayWebRecharge = "todayWebRecharge" + FN.BotReport.TodayWebVip = "todayWebVip" + FN.BotReport.ValidBet = "validBet" + FN.BotReport.TodayAccessH5Pc = "todayAccessH5Pc" + FN.BotReport.TodayAccessH5Ios = "todayAccessH5Ios" + FN.BotReport.TodayAccessH5Android = "todayAccessH5Android" + FN.BotReport.TodayH5PcNew = "todayH5PcNew" + FN.BotReport.TodayH5IosNew = "todayH5IosNew" + FN.BotReport.TodayH5AndroidNew = "todayH5AndroidNew" + FN.BotReport.TodayH5PcRecharge = "todayH5PcRecharge" + FN.BotReport.TodayH5IosRecharge = "todayH5IosRecharge" + FN.BotReport.TodayH5AndroidRecharge = "todayH5AndroidRecharge" + FN.BotReport.TodayH5PcNewRecharge = "todayH5PcNewRecharge" + FN.BotReport.TodayH5IosNewRecharge = "todayH5IosNewRecharge" + FN.BotReport.TodayH5AndroidNewRecharge = "todayH5AndroidNewRecharge" + FN.BotReport.HourH5PcNew = "hourH5PcNew" + FN.BotReport.HourH5IosNew = "hourH5IosNew" + FN.BotReport.HourH5AndroidNew = "hourH5AndroidNew" + FN.BotReport.HourH5PcRecharge = "hourH5PcRecharge" + FN.BotReport.HourH5IosRecharge = "hourH5IosRecharge" + FN.BotReport.HourH5AndroidRecharge = "hourH5AndroidRecharge" + FN.BotReport.HourH5PcNewRecharge = "hourH5PcNewRecharge" + FN.BotReport.HourH5IosNewRecharge = "hourH5IosNewRecharge" + FN.BotReport.HourH5AndroidNewRecharge = "hourH5AndroidNewRecharge" + FN.BotReport.TodayAccessIos = "todayAccessIos" + FN.BotReport.TodayAccessAndroid = "todayAccessAndroid" + TN.BotReport = "bot_report" +} diff --git a/models/botreport/type.go b/models/botreport/type.go new file mode 100644 index 0000000..cc6c0de --- /dev/null +++ b/models/botreport/type.go @@ -0,0 +1,145 @@ +package botreport + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// @table:bot_report +type BotReport struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + AppId int32 `json:"appId" bson:"appId"` // appId,唯一id + SumDate time.Time `json:"sumDate" bson:"sumDate"` // 记录时间 按天对齐 + TodayRecharge int64 `json:"todayRecharge" bson:"todayRecharge"` // 当日累计充值 + + HourRecharge int64 `json:"hourRecharge" bson:"hourRecharge"` // 单小时充值 + + AccessUser int64 `json:"accessUser" bson:"accessUser"` // 当日日活 + + TodayAccessDistrict int64 `json:"todayAccessDistrict" bson:"todayAccessDistrict"` // +当日渠道日活 + TodayAccessIos int64 `json:"todayAccessIos" bson:"todayAccessIos"` // *当日IOS日活 + TodayAccessAndroid int64 `json:"todayAccessAndroid" bson:"todayAccessAndroid"` // *当日Android日活 + TodayAccessH5 int64 `json:"todayAccessH5" bson:"todayAccessH5"` // *当日H5日活 + TodayAccessH5Pc int64 `json:"todayAccessH5Pc" bson:"todayAccessH5Pc"` // *当日H5PC日活 + TodayAccessH5Ios int64 `json:"todayAccessH5Ios" bson:"todayAccessH5Ios"` // *当日H5IOS日活 + TodayAccessH5Android int64 `json:"todayAccessH5Android" bson:"todayAccessH5Android"` // *当日H5Android日活 + TodayAccessH5District int64 `json:"todayAccessH5District" bson:"todayAccessH5District"` // +当日H5渠道日活 + TodayOrder int64 `json:"todayOrder" bson:"todayOrder"` // 当日订单数 + TodaySuccessOrder int64 `json:"todaySuccessOrder" bson:"todaySuccessOrder"` // 当日成功订单数 + HourOrder int64 `json:"hourOrder" bson:"hourOrder"` // 单小时订单数 + HourSuccessOrder int64 `json:"hourSuccessOrder" bson:"hourSuccessOrder"` // 单小时成功单数 + TodayNewDistrict int64 `json:"todayNewDistrict" bson:"todayNewDistrict"` // 当日渠道新增 + TodayNewWeb int64 `json:"todayNewWeb" bson:"todayNewWeb"` // 当日官网新增 + TodayNewNormal int64 `json:"todayNewNormal" bson:"todayNewNormal"` // 当日自来量(分享和官方) + TodayNew int64 `json:"todayNew" bson:"todayNew"` // 当日新增 + TodayAndroidNew int64 `json:"todayAndroidNew" bson:"todayAndroidNew"` // 当日android新增 + TodayIosNew int64 `json:"todayIosNew" bson:"todayIosNew"` // 当日Ios新增 + TodayH5New int64 `json:"todayH5New" bson:"todayH5New"` // 当日H5新增 + TodayH5PcNew int64 `json:"todayH5PcNew" bson:"todayH5PcNew"` // *当日H5PC新增 + TodayH5IosNew int64 `json:"todayH5IosNew" bson:"todayH5IosNew"` // *当日H5IOS新增 + TodayH5AndroidNew int64 `json:"todayH5AndroidNew" bson:"todayH5AndroidNew"` // *当日H5Android新增 + TodayH5DistrictNew int64 `json:"todayH5DistrictNew" bson:"todayH5DistrictNew"` // +当日H5渠道新增 + TodayDistrictRecharge int64 `json:"todayDistrictRecharge" bson:"todayDistrictRecharge"` // 当日渠道充值新增 + TodayWebRecharge int64 `json:"todayWebRecharge" bson:"todayWebRecharge"` // 当日官网充值新增 + TodayNormalRecharge int64 `json:"todayNormalRecharge" bson:"todayNormalRecharge"` // 当日自来量充值新增 + TodayVipRecharge int64 `json:"todayVipRecharge" bson:"todayVipRecharge"` // 当日渠道充值新增 + TodayAndroidRecharge int64 `json:"todayAndroidRecharge" bson:"todayAndroidRecharge"` // 当日android充值 + TodayIosRecharge int64 `json:"todayIosRecharge" bson:"todayIosRecharge"` // 当日Ios充值 + TodayH5Recharge int64 `json:"todayH5Recharge" bson:"todayH5Recharge"` // 当日H5充值 + TodayH5PcRecharge int64 `json:"todayH5PcRecharge" bson:"todayH5PcRecharge"` // *当日H5PC充值 + TodayH5IosRecharge int64 `json:"todayH5IosRecharge" bson:"todayH5IosRecharge"` // *当日H5IOS充值 + TodayH5AndroidRecharge int64 `json:"todayH5AndroidRecharge" bson:"todayH5AndroidRecharge"` // *当日H5Android充值 + TodayH5DistrictRecharge int64 `json:"todayH5DistrictRecharge" bson:"todayH5DistrictRecharge"` // +当日H5渠道充值 + TodayNewRecharge int64 `json:"todayNewRecharge" bson:"todayNewRecharge"` // 当日新增充值 + TodayIosNewRecharge int64 `json:"todayIosNewRecharge" bson:"todayIosNewRecharge"` // 当日Ios新增充值 + TodayH5NewRecharge int64 `json:"todayH5NewRecharge" bson:"todayH5NewRecharge"` // 当日H5新增充值 + TodayH5PcNewRecharge int64 `json:"todayH5PcNewRecharge" bson:"todayH5PcNewRecharge"` // *当日H5Pc新增充值 + TodayH5IosNewRecharge int64 `json:"todayH5IosNewRecharge" bson:"todayH5IosNewRecharge"` // *当日H5Ios新增充值 + TodayH5AndroidNewRecharge int64 `json:"todayH5AndroidNewRecharge" bson:"todayH5AndroidNewRecharge"` // *当日H5Android新增充值 + TodayH5DistrictNewRecharge int64 `json:"todayH5DistrictNewRecharge" bson:"todayH5DistrictNewRecharge"` // +当日H5渠道新增充值 + TodayAndroidNewRecharge int64 `json:"todayAndroidNewRecharge" bson:"todayAndroidNewRecharge"` // 当日android新增充值 + TodayOldRecharge int64 `json:"todayOldRecharge" bson:"todayOldRecharge"` // 当日老用户充值 + TodayDistrictVip int64 `json:"todayDistrictVip" bson:"todayDistrictVip"` // 单小时渠道VIP充值 + TodayWebVip int64 `json:"todayWebVip" bson:"todayWebVip"` // 单小时官网VIP充值 + TodayNormalVip int64 `json:"todayNormalVip" bson:"todayNormalVip"` // 单小时自来量充值新增 + HourNewDistrict int64 `json:"hourNewDistrict" bson:"hourNewDistrict"` // 单小时渠道新增 + HourNewWeb int64 `json:"hourNewWeb" bson:"hourNewWeb"` // 单小时官网新增 + HourNewNormal int64 `json:"hourNewNormal" bson:"hourNewNormal"` // 单小时自来量(分享和官方) + HourNew int64 `json:"hourNew" bson:"hourNew"` // 单小时新增 + HourAndroidNew int64 `json:"hourAndroidNew" bson:"hourAndroidNew"` // 单小时android新增 + HourIosNew int64 `json:"hourIosNew" bson:"hourIosNew"` // 单小时Ios新增 + HourH5New int64 `json:"hourH5New" bson:"hourH5New"` // 单小时H5新增 + HourH5PcNew int64 `json:"hourH5PcNew" bson:"hourH5PcNew"` // *单小时H5Pc新增 + HourH5IosNew int64 `json:"hourH5IosNew" bson:"hourH5IosNew"` // *单小时H5Ios新增 + HourH5AndroidNew int64 `json:"hourH5AndroidNew" bson:"hourH5AndroidNew"` // *单小时H5Android新增 + HourH5DistrictNew int64 `json:"hourH5DistrictNew" bson:"hourH5DistrictNew"` // +单小时H5渠道新增 + HourDistrictRecharge int64 `json:"hourDistrictRecharge" bson:"hourDistrictRecharge"` // 单小时渠道充值新增 + HourWebRecharge int64 `json:"hourWebRecharge" bson:"hourWebRecharge"` // 单小时官网充值新增 + HourNormalRecharge int64 `json:"hourNormalRecharge" bson:"hourNormalRecharge"` // 单小时自来量充值新增 + HourVipRecharge int64 `json:"hourVipRecharge" bson:"hourVipRecharge"` // 单小时VIP充值 + HourDistrictVip int64 `json:"hourDistrictVip" bson:"hourDistrictVip"` // 单小时渠道VIP充值 + HourWebVip int64 `json:"hourWebVip" bson:"hourWeVip"` // 单小时官网VIP充值 + HourAndroidRecharge int64 `json:"hourAndroidRecharge" bson:"hourAndroidRecharge"` // 单小时android充值 + HourIosRecharge int64 `json:"hourIosRecharge" bson:"hourIosRecharge"` // 单小时Ios充值 + HourH5Recharge int64 `json:"HourH5Recharge" bson:"HourH5Recharge"` // 单小时H5充值 + HourH5PcRecharge int64 `json:"hourH5PcRecharge" bson:"hourH5PcRecharge"` // *单小时H5Pc充值 + HourH5IosRecharge int64 `json:"hourH5IosRecharge" bson:"hourH5IosRecharge"` // *单小时H5Ios充值 + HourH5AndroidRecharge int64 `json:"hourH5AndroidRecharge" bson:"hourH5AndroidRecharge"` // *单小时H5Android充值 + HourH5DistrictRecharge int64 `json:"hourH5DistrictRecharge" bson:"hourH5DistrictRecharge"` // +单小时H5渠道充值 + HourNormalVip int64 `json:"hourNormalVip" bson:"hourNormalVip"` // 单小时自来量充值新增 + HourNewRecharge int64 `json:"hourNewRecharge" bson:"hourNewRecharge"` // 单小时新增充值 + HourIosNewRecharge int64 `json:"hourIosNewRecharge" bson:"hourIosNewRecharge"` // 单小时Ios新增充值 + HourH5NewRecharge int64 `json:"HourH5NewRecharge" bson:"HourH5NewRecharge"` // 单小时H5新增充值 + HourH5PcNewRecharge int64 `json:"hourH5PcNewRecharge" bson:"hourH5PcNewRecharge"` // *单小时H5Pc新增充值 + HourH5IosNewRecharge int64 `json:"hourH5IosNewRecharge" bson:"hourH5IosNewRecharge"` // *单小时H5Ios新增充值 + HourH5AndroidNewRecharge int64 `json:"hourH5AndroidNewRecharge" bson:"hourH5AndroidNewRecharge"` // *单小时H5Android新增充值 + HourH5DistrictNewRecharge int64 `json:"hourH5DistrictNewRecharge" bson:"hourH5DistrictNewRecharge"` // +单小时H5渠道新增充值 + HourAndroidNewRecharge int64 `json:"hourAndroidNewRecharge" bson:"hourAndroidNewRecharge"` // 单小时android新增充值 + HourOldRecharge int64 `json:"hourOldRecharge" bson:"hourOldRecharge"` // 单小时用户充值 + GameRchgAmount int64 `json:"gameRchgAmount" bson:"gameRchgAmount"` //充值总金额 + GameDCRchgAmount int64 `json:"gameDCRchgAmount" bson:"gameDCRchgAmount"` //代充总金额 + GameWtdrAmount int64 `json:"gameWtdrAmount" bson:"gameWtdrAmount"` //游戏提现总金额 + GameWtdrRealAmount int64 `json:"gameWtdrRealAmount" bson:"gameWtdrRealAmount"` //游戏实际提现总金额 + GameIncAmount int64 `json:"gameIncAmount" bson:"gameIncAmount"` //游戏上分总金额 + GameDecAmount int64 `json:"gameDecAmount" bson:"gameDecAmount"` //游戏下分总金额 + ValidBet int64 `json:"validBet" bson:"validBet"` //有效投注金额 + Profit int64 `json:"profit" bson:"profit"` //系统盈利 + GameRchgCount int64 `json:"gameRchgCount" bson:"gameRchgCount"` + //活跃人数 + GamePlayCount int64 `json:"gamePlayCount" bson:"gamePlayCount"` + //游戏成功充值人数 + GameRchgUsers int64 `json:"gameRchgUsers" bson:"gameRchgUsers"` + //游戏首次充值总金额 + GameFirstRchgAmount int64 `json:"gameFirstRchgAmount" bson:"gameFirstRchgAmount"` + //游戏首次成功充值次数 + GameFirstRchgCount int64 `json:"gameFirstRchgCount" bson:"gameFirstRchgCount"` + //游戏首次成功充值人数 + GameFirstRchgUsers int64 `json:"gameFirstRchgUsers" bson:"gameFirstRchgUsers"` + //游戏成功代充次数 + GameDCRchgCount int64 `json:"gameDCRchgCount" bson:"gameDCRchgCount"` + //游戏成功提现次数 + GameWtdrCount int64 `json:"gameWtdrCount" bson:"gameWtdrCount"` + + //游戏上分次数 + GameInchCount int64 `json:"gameInchCount" bson:"gameInchCount"` + + //游戏下分次数 + GameDecCount int64 `json:"gameDecCount" bson:"gameDecCount"` + //游戏6元赠送总金额 + GameGiftIncAmount int64 `json:"gameGiftIncAmount" bson:"gameGiftIncAmount"` + //游戏6元赠送次数 + GameGiftIncCount int64 `json:"gameGiftIncCount" bson:"gameGiftIncCount"` + //游戏充值赠送总金额 + GameRchGiftIncAmount int64 `json:"gameRchGiftIncAmount" bson:"gameRchGiftIncAmount"` + //游戏充值赠送次数 + GameRchGiftIncCount int64 `json:"gameRchGiftIncCount" bson:"gameRchGiftIncCount"` + //游戏VIP赠送总金额 + GameVipGiftIncAmount int64 `json:"gameVipGiftIncAmount" bson:"gameVipGiftIncAmount"` + //游戏VIP赠送次数 + GameVipGiftIncCount int64 `json:"gameVipGiftIncCount" bson:"gameVipGiftIncCount"` + // 游戏抽水 + Revenue int64 `json:"revenue" bson:"revenue"` + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} +type BotReportList []*BotReport diff --git a/models/channelCodeBlocStatMod/channelCodeStat.go b/models/channelCodeBlocStatMod/channelCodeStat.go new file mode 100644 index 0000000..f8d0574 --- /dev/null +++ b/models/channelCodeBlocStatMod/channelCodeStat.go @@ -0,0 +1,445 @@ +package channelCodeBlocStatMod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Init() { + db = mongos.New(mongos.MgoManager, CollChannelCodeBlocStat) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "channelCode", Value: 1}, {Key: "appId", Value: 1}, {Key: "sumDate", Value: 1}}, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{{Key: "channel", Value: 1}}, + }, + { + Keys: bson.D{{Key: "appId", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollChannelCodeBlocStat, err)) + } +} + +// UpsertOneUserRegisterStat 更新或插入一条用户注册信息统计信息 +func UpsertOneUserRegisterStat(ctx context.Context, code string, appId int32, sumDate time.Time, direct, fission, deduction int64) (err error) { + filter := bson.M{"channelCode": code, "appId": appId, "sumDate": sumDate} + + update := bson.M{} + if direct > 0 { + update["newDirectCount"] = direct + } + if fission > 0 { + update["newFissionCount"] = fission + } + if deduction > 0 { + update["newDeductionCount"] = deduction + } + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + insertDoc["channelCode"] = code + + _, err = db.InsertOne(ctx, insertDoc) + } + + return err +} + +// UpsertOneUserRechargeStat 更新或插入一条用户消费统计信息 +func UpsertOneUserRechargeStat(ctx context.Context, code string, appId int32, sumDate time.Time, rechargeAmount, deductionAmount, fissionAmount, newRechargeAmount int64) (err error) { + filter := bson.M{"channelCode": code, "appId": appId, "sumDate": sumDate} + + update := bson.M{} + if rechargeAmount > 0 { + update["directAmount"] = rechargeAmount + } + if deductionAmount > 0 { + update["deductionAmount"] = deductionAmount + } + if fissionAmount > 0 { + update["fissionAmount"] = fissionAmount + } + + if newRechargeAmount > 0 { + update["newRechargeAmount"] = newRechargeAmount + } + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$inc": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + insertDoc["channelCode"] = code + + _, err = db.InsertOne(ctx, insertDoc) + } + + return err +} + +// UpsertOneDistrictStat 更新渠道的留存 +func UpsertOneDistrictStat(ctx context.Context, code string, appId int32, sumDate time.Time, day1Rate, day3Rate, day7Rate *float64) (err error) { + filter := bson.M{"channelCode": code, "appId": appId, "sumDate": sumDate} + + update := bson.M{} + if day1Rate != nil { + update["day1RetainRate"] = *day1Rate + } + if day3Rate != nil { + update["day3RetainRate"] = *day3Rate + } + + if day7Rate != nil { + update["day7RetainRate"] = *day7Rate + } + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + insertDoc["channelCode"] = code + + _, err = db.InsertOne(ctx, insertDoc) + } + + return err +} + +// UpsertOneDistrictVisitStat 更新渠道的留存 +func UpsertOneDistrictVisitStat(ctx context.Context, code string, appId int32, sumDate time.Time, directVisitCount, fissionVisitCount int64) (err error) { + filter := bson.M{"channelCode": code, "appId": appId, "sumDate": sumDate} + + update := bson.M{"directVisitCount": directVisitCount, "fissionVisitCount": fissionVisitCount} + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + insertDoc["channelCode"] = code + + _, err = db.InsertOne(ctx, insertDoc) + } + + return err +} + +// UpsertOneDistrictCpc 更新渠道的留存 +func UpsertOneDistrictCpc(ctx context.Context, code string, appId int32, sumDate time.Time, visitCount int64) (err error) { + filter := bson.M{"channelCode": code, "appId": appId, "sumDate": sumDate} + + update := bson.M{"landPageVisitCount": visitCount} + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + insertDoc["channelCode"] = code + + _, err = db.InsertOne(ctx, insertDoc) + } + + return err +} + +// UpsertOneDistrictRechargeStat 更新渠道的新增充值 +func UpsertOneDistrictRechargeStat(ctx context.Context, code string, appId int32, sumDate time.Time, directAmount, fissionAmount, deduction int64) (err error) { + filter := bson.M{"channelCode": code, "appId": appId, "sumDate": sumDate} + + update := bson.M{"fissionAmount": fissionAmount, "directAmount": directAmount, "deductionAmount": deduction} + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + insertDoc["channelCode"] = code + + _, err = db.InsertOne(ctx, insertDoc) + } + + return err +} + +// 后台获取统计信息 +func GetChannelCodeBlocStatAgentList(ctx context.Context, channelCodes []string, appId int32, start, end *time.Time, skip, limit int64) (count int64, data ChannelCodeBlocStatList, err error) { + if len(channelCodes) == 0 { + return + } + filter := bson.M{"channelCode": bson.M{"$in": channelCodes}, "appId": appId} + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "sumDate", Value: -1}, {Key: "newDirectCount", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Find err", log.E(err)) + return + } + if count, err = db.Count(ctx, filter); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Count err", log.E(err)) + return + } + + return +} + +// 后台获取统计信息 +func GetChannelCodeBlocStatAgentListTotal(ctx context.Context, channelCodes []string, appId int32, start, end *time.Time) (data ChannelCodeBlocStatList, err error) { + if len(channelCodes) == 0 { + return + } + filter := bson.M{"channelCode": bson.M{"$in": channelCodes}, "appId": appId} + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "sumDate", Value: -1}, {Key: "newDirectCount", Value: -1}} + + opts := options.Find().SetSort(sort) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Find err", log.E(err)) + return + } + return +} + +// 后台获取统计信息总数 +func GetBlocChannelCodeBlocStatListTotal(ctx context.Context, channel *string, appId *int32, start, end *time.Time) (data ChannelCodeBlocStatList, err error) { + filter := bson.M{} + + if channel != nil { + filter["channelCode"] = channel + } + + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Find err", log.E(err)) + return + } + + return +} + +// 后台获取统计信息 +func GetChannelCodeBlocStatList(ctx context.Context, channelCodes []string, appId *int32, start, end *time.Time, skip, limit int64) (count int64, data ChannelCodeBlocStatList, err error) { + filter := bson.M{} + if len(channelCodes) > 0 { + filter["channelCode"] = bson.M{"$in": channelCodes} + } + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "sumDate", Value: -1}, {Key: "newDirectCount", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Find err", log.E(err)) + return + } + if count, err = db.Count(ctx, filter); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Count err", log.E(err)) + return + } + + return +} + +// 后台获取统计信息 +func GetBlocChannelCodeBlocStatList(ctx context.Context, channel *string, appId *int32, start, end *time.Time, skip, limit int64) (count int64, data ChannelCodeBlocStatList, err error) { + filter := bson.M{} + + if channel != nil { + filter["channelCode"] = channel + } + + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "sumDate", Value: -1}, {Key: "newDirectCount", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Find err", log.E(err)) + return + } + if count, err = db.Count(ctx, filter); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Count err", log.E(err)) + return + } + + return +} + +// 后台获取统计信息 +func GetBlocChannelCodeStatTotal(ctx context.Context, channels []string, appId *int32, start, end *time.Time) (count int64, data ChannelCodeBlocStatList, err error) { + filter := bson.M{} + if len(channels) > 0 { + filter["channelCode"] = bson.M{"$in": channels} + } + + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Find err", log.E(err)) + return + } + if count, err = db.Count(ctx, filter); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Count err", log.E(err)) + return + } + + return +} + +// GetAllChannelCodeBlocStatList 根据渠道码获取统计信息 +func GetAllChannelCodeBlocStatList(ctx context.Context, appId int32, channelCode []string, sumDate time.Time) (data ChannelCodeBlocStatList, err error) { + filter := bson.M{"sumDate": sumDate, "appId": appId, "channelCode": bson.M{"$in": channelCode}} + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Find err", log.E(err)) + return + } + + return +} + +// GetChannelCodeBlocStatListTool 根据渠道码获取统计信息 +func GetChannelCodeBlocStatListTool(ctx context.Context, appId int32, channelCode string) (data ChannelCodeBlocStatList, err error) { + filter := bson.M{"appId": appId, "channelCode": channelCode} + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("ChannelCodeBlocStat GetChannelCodeBlocStatList Find err", log.E(err)) + return + } + + return +} + +// UpsertOneDistrictRechargeStat 更新渠道的新增充值 +func UpsertOneDistrictFissionRechargeStat(ctx context.Context, code string, appId int32, sumDate time.Time, rechargeCount, rechargeAmount int64) (err error) { + filter := bson.M{"channelCode": code, "appId": appId, "sumDate": sumDate} + + update := bson.M{"fissionAmount": rechargeAmount} + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + insertDoc["channelCode"] = code + + _, err = db.InsertOne(ctx, insertDoc) + } + + return err +} diff --git a/models/channelCodeBlocStatMod/type.go b/models/channelCodeBlocStatMod/type.go new file mode 100644 index 0000000..aa50a93 --- /dev/null +++ b/models/channelCodeBlocStatMod/type.go @@ -0,0 +1,40 @@ +package channelCodeBlocStatMod + +import ( + "stat/common/mongos" + "time" +) + +const CollChannelCodeBlocStat = "channel_code_stat_bloc" + +var db *mongos.MongoTool + +// ChannelCodeStat 渠道码日常统计 +type ChannelCodeBlocStat struct { + SumDate time.Time `bson:"sumDate"` // 记录时间 按天对齐 + ChannelCode string `bson:"channelCode"` // 渠道码 + AppId int32 `bson:"appId"` // appId + Channel string `bson:"channel"` // 该渠道码所属渠道渠道 + NewDirectCount int64 `bson:"newDirectCount,omitempty"` // 新增直推 + NewFissionCount int64 `bson:"newFissionCount,omitempty"` // 新增裂变 + NewDeductionCount int64 `bson:"newDeductionCount,omitempty"` // 新增扣量(新增 = 新增直推+新增裂变+扣量) + DirectVisitCount int64 `bson:"directVisitCount,omitempty"` // 直推访问数 + FissionVisitCount int64 `bson:"fissionVisitCount,omitempty"` // 裂变访问数 + DeductionVisitCount int64 `bson:"deductionVisitCount,omitempty"` // 扣量访问数 + Day1RetainRate float64 `bson:"day1RetainRate,omitempty"` // 次日留存率 + Day3RetainRate float64 `bson:"day3RetainRate,omitempty"` // 3日留存率 + Day7RetainRate float64 `bson:"day7RetainRate,omitempty"` // 7日留存率 + DirectAmount int64 `bson:"directAmount,omitempty"` // 直推充值金额 + FissionAmount int64 `bson:"fissionAmount,omitempty"` // 裂变充值金额 + DeductionAmount int64 `bson:"deductionAmount,omitempty"` // 扣量金额(总金额=充值金额+扣量金额+裂变充值金额) + NewRechargeCount int64 `bson:"newRechargeCount,omitempty"` // 新增充值数 + NewRechargeAmount int64 `bson:"newRechargeAmount,omitempty"` // 新增充值金额 + LandPageVisitCount int64 `bson:"landPageVisitCount,omitempty"` // 落地页访问次数 + UpdatedAt time.Time `bson:"updatedAt,omitempty"` // 更新时间 +} + +type ChannelCodeBlocStatList []*ChannelCodeBlocStat + +func (p ChannelCodeBlocStatList) Len() int { return len(p) } +func (p ChannelCodeBlocStatList) Less(i, j int) bool { return p[j].SumDate.Before(p[i].SumDate) } +func (p ChannelCodeBlocStatList) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/models/channelmod/channel.go b/models/channelmod/channel.go new file mode 100644 index 0000000..4ba0e67 --- /dev/null +++ b/models/channelmod/channel.go @@ -0,0 +1,710 @@ +package channelmod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var dbChannel *mongos.MongoTool +var dbRule *mongos.MongoTool +var dbStat *mongos.MongoTool +var dbSettlement *mongos.MongoTool +var dbChannelOwnerChange *mongos.MongoTool + +var dbStatYestoday *mongos.MongoTool + +func Init() { + ctx := context.Background() + InitChannel(ctx) + InitStat(ctx) + InitRule(ctx) + InitSettlement(ctx) + InitStatYestoday(ctx) + InitChannelOwnerChange(ctx) +} + +func InitRule(ctx context.Context) { + // 获取数据库表 + dbRule = mongos.New(mongos.MgoManager, TN.ChannelDeductionRule) + + // 初始化 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: FN.ChannelDeductionRule.Channel, Value: 1}, {Key: FN.ChannelDeductionRule.AppId, Value: 1}}, + Options: options.Index().SetUnique(true), + }, + } + if _, err := dbRule.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", TN.ChannelDeductionRule, err)) + } +} + +func InitStat(ctx context.Context) { + // 获取数据库表 + dbStat = mongos.New(mongos.MgoManager, TN.ChannelStat) + + // 初始化 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: FN.ChannelStat.Channel, Value: 1}, {Key: FN.ChannelStat.AppId, Value: 1}, {Key: FN.ChannelStat.SumDate, Value: 1}}, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{{Key: FN.ChannelStat.SumDate, Value: -1}, {Key: FN.ChannelStat.NewDirectCount, Value: -1}}, + }, + { + Keys: bson.D{{Key: FN.ChannelStat.CreatedAt, Value: -1}}, + }, + // { + // Keys: bson.D{{Key: FN.ChannelStat.NewDirectCount, Value: -1}}, + // }, + { + Keys: bson.D{ + {Key: FN.ChannelStat.Channel, Value: 1}, + {Key: FN.ChannelStat.ParentChannel, Value: 1}, + {Key: FN.ChannelStat.AppId, Value: 1}, + {Key: FN.ChannelStat.SumDate, Value: -1}, + {Key: FN.ChannelStat.Type, Value: 1}, + }, + }, + { + Keys: bson.D{{Key: FN.ChannelStat.Type, Value: 1}}, + }, + // { + // Keys: bson.D{{Key: FN.ChannelStat.IsPay, Value: 1}}, + // }, + // { + // Keys: bson.D{{Key: FN.ChannelStat.SumDate, Value: -1}}, + // }, + // { + // Keys: bson.D{{Key: FN.ChannelStat.AppId, Value: 1}}, + // }, + { + Keys: bson.D{ + {Key: FN.ChannelStat.AppId, Value: 1}, + {Key: FN.ChannelStat.SumDate, Value: -1}, + }, + }, + } + if _, err := dbStat.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", TN.ChannelStat, err)) + } +} + +func InitStatYestoday(ctx context.Context) { + // 获取数据库表 + dbStatYestoday = mongos.New(mongos.MgoManager, TN.ChannelStatYestoday) + + // 初始化 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: FN.ChannelStatYestoday.Channel, Value: 1}, {Key: FN.ChannelStatYestoday.AppId, Value: 1}, {Key: FN.ChannelStatYestoday.SumDate, Value: 1}}, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{{Key: FN.ChannelStatYestoday.SumDate, Value: -1}, {Key: FN.ChannelStatYestoday.NewCount, Value: -1}}, + }, + { + Keys: bson.D{ + {Key: FN.ChannelStatYestoday.SumDate, Value: -1}, + }, + Options: options.Index().SetExpireAfterSeconds(3 * 24 * 60 * 60), + }, + } + if _, err := dbStatYestoday.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", TN.ChannelStatYestoday, err)) + } +} + +func InitSettlement(ctx context.Context) { + // 获取数据库表 + dbSettlement = mongos.New(mongos.MgoManager, TN.ChannelSettlement) + + // 初始化 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: FN.ChannelSettlement.Channel, Value: 1}, {Key: FN.ChannelSettlement.AppId, Value: 1}, {Key: FN.ChannelSettlement.SumDate, Value: 1}}, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{{Key: FN.ChannelSettlement.CreatedAt, Value: -1}}, + Options: options.Index().SetExpireAfterSeconds(5 * 24 * 60 * 60), + }, + } + if _, err := dbSettlement.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", TN.ChannelSettlement, err)) + } +} + +func InitChannel(ctx context.Context) { + // 获取数据库表 + dbChannel = mongos.New(mongos.MgoManager, TN.ChannelInfo) + + // 初始化 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: FN.ChannelInfo.Channel, Value: 1}}, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{ + {Key: FN.ChannelInfo.ParentAgent, Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: FN.ChannelInfo.ParentChannel, Value: 1}, + }, + }, + } + if _, err := dbChannel.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", TN.ChannelInfo, err)) + } +} + +func InitChannelOwnerChange(ctx context.Context) { + // 获取数据库表 + dbChannelOwnerChange = mongos.New(mongos.MgoManager, TN.ChannelOwnerChange) + + // 初始化 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: FN.ChannelOwnerChange.Channel, Value: -1}}, + }, + { + Keys: bson.D{ + {Key: FN.ChannelOwnerChange.NewUser, Value: -1}, + {Key: FN.ChannelOwnerChange.OldUser, Value: -1}, + }, + }, + } + if _, err := dbChannelOwnerChange.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", TN.ChannelOwnerChange, err)) + } +} + +// InsertOneChannelInfo 插入一个渠道信息 +func InsertOneChannelInfo(ctx context.Context, media *ChannelInfo) error { + if _, err := dbChannel.InsertOne(ctx, media); err != nil { + log.Warn("media:InsertOneChannelInfo db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// FindOneChannelInfo 查找一个渠道信息 +func FindOneChannelInfo(ctx context.Context, filter bson.M) (*ChannelInfo, error) { + var ChannelInfo ChannelInfo + if err := dbChannel.FindOne(ctx, &ChannelInfo, filter); err != nil { + log.Warn("ChannelInfo:FindOneChannelInfo dbChannel.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &ChannelInfo, nil +} + +// FindOneChannelInfo 查找一个渠道信息 +func FindOneChannelInfoEx(ctx context.Context, filter bson.M) (*ChannelInfo, error) { + var ChannelInfo ChannelInfo + if err := dbChannel.FindOneEx(ctx, &ChannelInfo, filter); err != nil { + log.Warn("ChannelInfo:FindOneChannelInfoEx dbChannel.FindOneEx failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &ChannelInfo, nil +} + +// DelOneChannelInfo 删除一个渠道信息 +func DelOneChannelInfo(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbChannel.DeleteOne(ctx, filter) + if err != nil { + log.Warn("ChannelInfo:DelOneChannelInfo dbChannel.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateOneChannelInfo 更新一个渠道信息 +func UpdateOneChannelInfo(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbChannel.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneChannelInfo dbChannel.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + + return nil +} + +// CountChannelInfos 统计渠道信息数量 +func CountChannelInfos(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbChannel.Count(ctx, filter) + if err != nil { + log.Warn("ChannelInfo:CountChannelInfos dbChannel.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateManyChannelInfo 更新满足条件的渠道信息 +func UpdateManyChannelInfo(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbChannel.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyChannelInfo dbChannel.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// FindManyChannelInfo 查找一批渠道信息数据 +func FindManyChannelInfo(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (ChannelInfoList, error) { + data := make(ChannelInfoList, 0) + if err := dbChannel.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("ChannelInfo:FindManyChannelInfo dbChannel.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// FindManyChannelInfoWithBind 用自己定义结构查找一批渠道信息数据 +func FindManyChannelInfoWithBind(ctx context.Context, bind interface{}, filter bson.M, opts ...*options.FindOptions) error { + if err := dbChannel.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("ChannelInfo:FindManyChannelInfoWithBind dbChannel.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// InsertOneChannelDeductionRule 插入一个渠道扣量规则 +func InsertOneChannelDeductionRule(ctx context.Context, media *ChannelDeductionRule) error { + if _, err := dbRule.InsertOne(ctx, media); err != nil { + log.Warn("media:InsertOneChannelDeductionRule db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// FindOneChannelDeductionRule 查找一个渠道扣量规则 +func FindOneChannelDeductionRule(ctx context.Context, filter bson.M) (*ChannelDeductionRule, error) { + var ChannelDeductionRule ChannelDeductionRule + if err := dbRule.FindOne(ctx, &ChannelDeductionRule, filter); err != nil { + log.Warn("ChannelDeductionRule:FindOneChannelDeductionRule dbChannel.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &ChannelDeductionRule, nil +} + +// FindOneChannelDeductionRuleEx 查找一个渠道扣量规则 +func FindOneChannelDeductionRuleEx(ctx context.Context, filter bson.M) (*ChannelDeductionRule, error) { + var ChannelDeductionRule ChannelDeductionRule + if err := dbRule.FindOneEx(ctx, &ChannelDeductionRule, filter); err != nil { + log.Warn("ChannelDeductionRule:FindOneChannelDeductionRuleEx dbChannel.FindOneEx failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &ChannelDeductionRule, nil +} + +// DelOneChannelDeductionRule 删除一个渠道扣量规则 +func DelOneChannelDeductionRule(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbRule.DeleteOne(ctx, filter) + if err != nil { + log.Warn("ChannelDeductionRule:DelOneChannelDeductionRule dbChannel.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateOneChannelDeductionRule 更新一个渠道扣量规则 +func UpdateOneChannelDeductionRule(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbRule.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("UpdateOneChannelDeductionRule dbChannel.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + + return nil +} + +// CountChannelDeductionRules 统计渠道扣量规则数量 +func CountChannelDeductionRules(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbRule.Count(ctx, filter) + if err != nil { + log.Warn("ChannelDeductionRule:CountChannelDeductionRules dbChannel.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateManyChannelDeductionRule 更新满足条件的渠道扣量规则 +func UpdateManyChannelDeductionRule(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbRule.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyChannelDeductionRule dbChannel.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// FindManyChannelDeductionRule 查找一批渠道扣量规则数据 +func FindManyChannelDeductionRule(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (ChannelDeductionRuleList, error) { + data := make(ChannelDeductionRuleList, 0) + if err := dbRule.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("ChannelDeductionRule:FindManyChannelDeductionRule dbChannel.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// FindManyChannelDeductionRuleWithBind 用自己定义结构查找一批渠道扣量规则数据 +func FindManyChannelDeductionRuleWithBind(ctx context.Context, bind interface{}, filter bson.M, opts ...*options.FindOptions) error { + if err := dbRule.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("ChannelDeductionRule:FindManyChannelDeductionRuleWithBind dbChannel.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// InsertOneChannelStat 插入一个渠道统计信息 +func InsertOneChannelStat(ctx context.Context, media *ChannelStat) error { + if _, err := dbStat.InsertOne(ctx, media); err != nil { + log.Warn("media:InsertOneChannelStat db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// FindOneChannelStat 查找一个渠道日常统计 +func FindOneChannelStat(ctx context.Context, filter bson.M) (*ChannelStat, error) { + var ChannelStat ChannelStat + if err := dbStat.FindOne(ctx, &ChannelStat, filter); err != nil { + log.Warn("ChannelStat:FindOneChannelStat dbStat.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &ChannelStat, nil +} + +// DelOneChannelStat 删除一个渠道日常统计 +func DelOneChannelStat(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbStat.DeleteOne(ctx, filter) + if err != nil { + log.Warn("ChannelStat:DelOneChannelStat dbStat.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateOneChannelStat 更新一个渠道日常统计 +func UpdateOneChannelStat(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbStat.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("UpdateOneChannelStat dbStat.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + + return nil +} + +// CountChannelStats 统计渠道日常统计数量 +func CountChannelStats(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbStat.Count(ctx, filter) + if err != nil { + log.Warn("ChannelStat:CountChannelStats dbStat.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateManyChannelStat 更新满足条件的渠道日常统计 +func UpdateManyChannelStat(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbStat.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyChannelStat dbStat.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// UpdateManyChannelStat 更新满足条件的渠道日常统计 +func UpdateManyChannelStatWithResult(ctx context.Context, filter bson.M, update bson.M) (int64, error) { + result, err := dbStat.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyChannelStatWithResult dbStat.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return result.MatchedCount, nil +} + +// FindManyChannelStat 查找一批渠道日常统计数据 +func FindManyChannelStat(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (ChannelStatList, error) { + data := make(ChannelStatList, 0) + if err := dbStat.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("ChannelStat:FindManyChannelStat dbStat.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +type OnItem func(item *ChannelStat) + +// FindManyChannelStatShard 查找一批渠道日常统计数据 +func FindManyChannelStatShard(ctx context.Context, filter bson.M, shard int64, onItem OnItem) error { + num := int64(0) + for { + opt := &options.FindOptions{} + opt.SetSkip(num * shard) + opt.SetLimit(shard) + lst := make(ChannelStatList, 0) + if err := dbStat.Find(ctx, &lst, filter, opt); err != nil { + log.Warn("ChannelStat:FindManyChannelStatShard dbStat.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + for _, item := range lst { + onItem(item) + } + if int64(len(lst)) < shard { + break + } + lst = nil + num++ + } + return nil +} + +// FindManyChannelStatWithBind 用自己定义结构查找一批渠道日常统计数据 +func FindManyChannelStatWithBind(ctx context.Context, bind interface{}, filter bson.M, opts ...*options.FindOptions) error { + if err := dbStat.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("ChannelStat:FindManyChannelStatWithBind dbStat.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// InsertOneChannelSettlement 插入一个渠道统计信息 +func InsertOneChannelSettlement(ctx context.Context, media *ChannelSettlement) error { + if _, err := dbSettlement.InsertOne(ctx, media); err != nil { + log.Warn("media:InsertOneChannelSettlement dbSettlement.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// FindOneChannelSettlement 查找一个15分钟结算 +func FindOneChannelSettlement(ctx context.Context, filter bson.M) (*ChannelSettlement, error) { + var ChannelSettlement ChannelSettlement + if err := dbSettlement.FindOne(ctx, &ChannelSettlement, filter); err != nil { + log.Warn("ChannelSettlement:FindOneChannelSettlement dbSettlement.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &ChannelSettlement, nil +} + +// DelOneChannelSettlement 删除一个15分钟结算 +func DelOneChannelSettlement(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbSettlement.DeleteOne(ctx, filter) + if err != nil { + log.Warn("ChannelSettlement:DelOneChannelSettlement dbSettlement.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateOneChannelSettlement 更新一个15分钟结算 +func UpdateOneChannelSettlement(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbSettlement.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("UpdateOneChannelSettlement dbSettlement.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + + return nil +} + +// CountChannelSettlements 统计15分钟结算数量 +func CountChannelSettlements(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbSettlement.Count(ctx, filter) + if err != nil { + log.Warn("ChannelSettlement:CountChannelSettlements dbSettlement.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateManyChannelSettlement 更新满足条件的15分钟结算 +func UpdateManyChannelSettlement(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbSettlement.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyChannelSettlement dbSettlement.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// FindManyChannelSettlement 查找一批渠道15分钟结算 +func FindManyChannelSettlement(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (ChannelSettlementList, error) { + data := make(ChannelSettlementList, 0) + if err := dbSettlement.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("ChannelSettlement:FindManyChannelSettlement dbSettlement.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// FindManyChannelSettlementWithBind 用自己定义结构查找一批渠道15分钟结算 +func FindManyChannelSettlementWithBind(ctx context.Context, bind interface{}, filter bson.M, opts ...*options.FindOptions) error { + if err := dbSettlement.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("ChannelSettlement:FindManyChannelSettlementWithBind dbSettlement.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// FindManyChannelStatYestoday 查找一批渠道日常统计数据 +func FindManyChannelStatYestoday(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (ChannelStatYestodayList, error) { + data := make(ChannelStatYestodayList, 0) + if err := dbStatYestoday.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("ChannelStat:FindManyChannelStat dbStat.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// InsertOneChannelStatYestoday 插入一个渠道统计信息 +func InsertOneChannelStatYestoday(ctx context.Context, media *ChannelStatYesterday) error { + if _, err := dbStatYestoday.InsertOne(ctx, media); err != nil { + log.Warn("media:InsertOneChannelStat db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// CountChannelStatYestoday 统计渠道扣量规则数量 +func CountChannelStatYestoday(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbStatYestoday.Count(ctx, filter) + if err != nil { + log.Warn("ChannelDeductionRule:CountChannelStatYestoday dbChannel.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// InsertOneChannelOwnerChange 插入一个渠道信息 +func InsertOneChannelOwnerChange(ctx context.Context, media *ChannelOwnerChange) error { + if _, err := dbChannelOwnerChange.InsertOne(ctx, media); err != nil { + log.Warn("media:InsertOneChannelOwnerChange db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// FindOneChannelOwnerChange 查找一个渠道信息 +func FindOneChannelOwnerChange(ctx context.Context, filter bson.M) (*ChannelOwnerChange, error) { + var ChannelOwnerChange ChannelOwnerChange + if err := dbChannelOwnerChange.FindOne(ctx, &ChannelOwnerChange, filter); err != nil { + log.Warn("ChannelOwnerChange:FindOneChannelOwnerChange dbChannelOwnerChange.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &ChannelOwnerChange, nil +} + +// FindOneChannelOwnerChange 查找一个渠道信息 +func FindOneChannelOwnerChangeEx(ctx context.Context, filter bson.M) (*ChannelOwnerChange, error) { + var ChannelOwnerChange ChannelOwnerChange + if err := dbChannelOwnerChange.FindOneEx(ctx, &ChannelOwnerChange, filter); err != nil { + log.Warn("ChannelOwnerChange:FindOneChannelOwnerChangeEx dbChannelOwnerChange.FindOneEx failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &ChannelOwnerChange, nil +} + +// DelOneChannelOwnerChange 删除一个渠道信息 +func DelOneChannelOwnerChange(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbChannelOwnerChange.DeleteOne(ctx, filter) + if err != nil { + log.Warn("ChannelOwnerChange:DelOneChannelOwnerChange dbChannelOwnerChange.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateOneChannelOwnerChange 更新一个渠道信息 +func UpdateOneChannelOwnerChange(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbChannelOwnerChange.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneChannelOwnerChange dbChannelOwnerChange.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + + return nil +} + +// CountChannelOwnerChanges 统计渠道信息数量 +func CountChannelOwnerChanges(ctx context.Context, filter bson.M) (int64, error) { + count, err := dbChannelOwnerChange.Count(ctx, filter) + if err != nil { + log.Warn("ChannelOwnerChange:CountChannelOwnerChanges dbChannelOwnerChange.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateManyChannelOwnerChange 更新满足条件的渠道信息 +func UpdateManyChannelOwnerChange(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbChannelOwnerChange.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyChannelOwnerChange dbChannelOwnerChange.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// FindManyChannelOwnerChanges 查找一批渠道信息数据 +func FindManyChannelOwnerChanges(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (ChannelOwnerChangeList, error) { + data := make(ChannelOwnerChangeList, 0) + if err := dbChannelOwnerChange.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("ChannelOwnerChange:FindManyChannelOwnerChange dbChannelOwnerChange.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// FindManyChannelOwnerChangeWithBind 用自己定义结构查找一批渠道信息数据 +func FindManyChannelOwnerChangeWithBind(ctx context.Context, bind interface{}, filter bson.M, opts ...*options.FindOptions) error { + if err := dbChannelOwnerChange.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("ChannelOwnerChange:FindManyChannelOwnerChangeWithBind dbChannelOwnerChange.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} diff --git a/models/channelmod/helper.go b/models/channelmod/helper.go new file mode 100644 index 0000000..2c67fed --- /dev/null +++ b/models/channelmod/helper.go @@ -0,0 +1,810 @@ +package channelmod + +import ( + "fmt" + "strconv" +) + +type CalcIncomeRateMode int + +const ( + CalcIncomeRateModeDirect CalcIncomeRateMode = 0 // 直推模式:直推总额 + CalcIncomeRateModeTotal CalcIncomeRateMode = 1 // 总量模式:充值总额 + CalcIncomeRateModeMember CalcIncomeRateMode = 2 // 会员模式:会员总额 + CalcIncomeRateModeCustom CalcIncomeRateMode = 3 // 定制模式:会员总额+(金币总额*占比) +) + +type CalcIncomeRateConfig struct { + Mode CalcIncomeRateMode // 计算模式 + CoinRatio float64 // 金币占比(最小为0,最大为1) +} + +var configDefault = &CalcIncomeRateConfig{ + Mode: CalcIncomeRateModeMember, // 默认收益率计算模式 + CoinRatio: 0, +} + +var configXcb = &CalcIncomeRateConfig{ + Mode: CalcIncomeRateModeTotal, // 总充值 + CoinRatio: 0, +} + +func getConfig(appId int32) *CalcIncomeRateConfig { + if appId == 6666 { + return configXcb + } else { + return configDefault + } +} + +// GetIncome 收益率计算公式 +func (c *CalcIncomeRateConfig) GetIncome(stat *ChannelStat) int64 { + switch c.Mode { + case CalcIncomeRateModeDirect: + return stat.DirectAmount + case CalcIncomeRateModeTotal: + return stat.TotalAmount + case CalcIncomeRateModeMember: + return stat.VipPayMoney + stat.VipPayDeduction + case CalcIncomeRateModeCustom: + rate := c.CoinRatio + if rate > 1 { + rate = 1 + } + if rate < 0 { + rate = 0 + } + return (stat.VipPayMoney + stat.VipPayDeduction) + int64(float64(stat.VipPayCoin)*rate) + default: + return stat.VipPayMoney + stat.VipPayDeduction + } +} + +func (t ChannelType) String() string { + switch t { + case ChannelTypeNone, ChannelTypeEnd: + return "无效" + case ChannelTypeParent: + return "一级" + case ChannelTypeSecond: + return "二级" + case ChannelTypeThird: + return "三级" + case ChannelTypeForth: + return "四级" + default: + if t > ChannelTypeNone && t < ChannelTypeEnd { + return fmt.Sprintf("【%d】级", t) + } + return "无效" + } +} + +func (t ChannelType) IsTop() bool { + if t == ChannelTypeParent { + return true + } + return false +} + +func (t ChannelType) IsSecond() bool { + if t == ChannelTypeSecond { + return true + } + return false +} + +func (t ChannelType) IsChild() bool { + if t > ChannelTypeParent && t < ChannelTypeEnd { + return true + } + return false +} + +func (t ChannelType) Child() ChannelType { + if t > ChannelTypeNone && t < ChannelTypeEnd { + return t + 1 + } else { + return ChannelTypeEnd + } +} + +func (t ChannelType) Parent() ChannelType { + if t > ChannelTypeNone && t < ChannelTypeEnd { + return t - 1 + } else { + return ChannelTypeNone + } +} + +func (t ChannelType) IsValid() bool { + if t > ChannelTypeNone && t < ChannelTypeEnd { + return true + } else { + return false + } +} + +func (t ChannelType) IsNone() bool { + if t > ChannelTypeNone && t < ChannelTypeEnd { + return false + } else { + return true + } +} + +func (a ChannelStatList) Len() int { return len(a) } +func (a ChannelStatList) Less(i, j int) bool { return a[i].SumDate.After(a[j].SumDate) } +func (a ChannelStatList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +func (s *ChannelSettlement) AssignmentTo(d *ChannelStat) { + d.ValidDirectCount = s.ValidDirectCount + d.ValidDeductionCount = s.ValidDeductionCount + d.ValidPayMoney = s.ValidPayMoney + d.ValidPayCoin = s.ValidPayCoin + + d.NewTotalIpCount = s.NewTotalIpCount + d.NewTotalCount = s.NewTotalCount + d.NewDirectCount = s.NewDirectCount + d.NewFissionCount = s.NewFissionCount + d.NewDeductionCount = s.NewDeductionCount + + d.NewAndroidCount = s.NewAndroidCount + d.NewAndroidDirectCount = s.NewAndroidDirectCount + d.NewAndroidFissionCount = s.NewAndroidFissionCount + d.NewAndroidDeductionCount = s.NewAndroidDeductionCount + + d.NewIosCount = s.NewIosCount + d.NewIosDirectCount = s.NewIosDirectCount + d.NewIosFissionCount = s.NewIosFissionCount + d.NewIosDeductionCount = s.NewIosDeductionCount + + d.NewLightCount = s.NewLightCount + d.NewLightGuestCount = s.NewLightGuestCount + d.NewLightGuestDirectCount = s.NewLightGuestDirectCount + d.NewLightGuestFissionCount = s.NewLightGuestFissionCount + d.NewLightGuestDeductionCount = s.NewLightGuestDeductionCount + + d.NewLightFormalCount = s.NewLightFormalCount + d.NewLightFormalDirectCount = s.NewLightFormalDirectCount + d.NewLightFormalFissionCount = s.NewLightFormalFissionCount + d.NewLightFormalDeductionCount = s.NewLightFormalDeductionCount + + d.NewLightDirectCount = s.NewLightDirectCount + d.NewLightFissionCount = s.NewLightFissionCount + d.NewLightDeductionCount = s.NewLightDeductionCount + d.NewLightNaturalCount = s.NewLightNaturalCount + d.NewH5Count = s.NewH5Count + d.NewH5DirectCount = s.NewH5DirectCount + d.NewH5FissionCount = s.NewH5FissionCount + d.NewH5DeductionCount = s.NewH5DeductionCount + + d.NewH5AndroidCount = s.NewH5AndroidCount + d.NewH5IosCount = s.NewH5IosCount + d.NewH5PcCount = s.NewH5PcCount + d.NewH5FormalCount = s.NewH5FormalCount + d.NewH5FormalDirectCount = s.NewH5FormalDirectCount + d.NewH5FormalFissionCount = s.NewH5FormalFissionCount + d.NewH5FormalDeductionCount = s.NewH5FormalDeductionCount + // 访问 + d.TotalVisitCount = s.TotalVisitCount + d.DirectVisitCount = s.DirectVisitCount + d.FissionVisitCount = s.FissionVisitCount + d.AndroidVisitCount = s.AndroidVisitCount + d.IosVisitCount = s.IosVisitCount + d.LightVisitCount = s.LightVisitCount + d.LightVisitDirectCount = s.LightVisitDirectCount + d.LightVisitFissionCount = s.LightVisitFissionCount + d.LightVisitDeductionCount = s.LightVisitDeductionCount + d.LightVisitNaturalCount = s.LightVisitNaturalCount + d.H5VisitCount = s.H5VisitCount + d.H5AndroidVisitCount = s.H5AndroidVisitCount + d.H5IosVisitCount = s.H5IosVisitCount + d.H5PcVisitCount = s.H5PcVisitCount + // 充值 + d.TotalAmount = s.TotalAmount + d.DirectAmount = s.DirectAmount + d.DirectAmountCount = s.DirectAmountCount + d.FissionAmount = s.FissionAmount + d.FissionAmountCount = s.FissionAmountCount + d.NaturalAmount = s.NaturalAmount + d.NaturalAmountCount = s.NaturalAmountCount + d.DeductionAmount = s.DeductionAmount + d.DeductionAmountCount = s.DeductionAmountCount + d.AndroidAmount = s.AndroidAmount + d.AndroidAmountCount = s.AndroidAmountCount + d.IosAmount = s.IosAmount + d.IosAmountCount = s.IosAmountCount + d.H5Amount = s.H5Amount + d.H5AmountCount = s.H5AmountCount + d.LightAmount = s.LightAmount + d.LightAmountCount = s.LightAmountCount + d.LightDirectAmount = s.LightDirectAmount + d.LightDirectAmountCount = s.LightDirectAmountCount + d.LightFissionAmount = s.LightFissionAmount + d.LightFissionAmountCount = s.LightFissionAmountCount + d.LightDeductionAmount = s.LightDeductionAmount + d.LightDeductionAmountCount = s.LightDeductionAmountCount + d.LightNaturalAmount = s.LightNaturalAmount + d.LightNaturalAmountCount = s.LightNaturalAmountCount + // 其他充值 + d.NewRechargeAmount = s.NewRechargeAmount + d.VipPayMoney = s.VipPayMoney + d.VipPayCoin = s.VipPayCoin + d.VipPayDeduction = s.VipPayDeduction + d.GameRechageAmount = s.GameRechageAmount + d.GameWithdrawAmount = s.GameWithdrawAmount + // 落地页访问 + d.LandPageVisitCount = s.LandPageVisitCount + d.LandpageAndroidClick = s.LandpageAndroidClick + d.LandpageIosAppstoreClick = s.LandpageIosAppstoreClick + d.LandpageIosAthorClick = s.LandpageIosAthorClick + d.LandpageIosH5Click = s.LandpageIosH5Click +} + +func (s *ChannelSettlement) AccumulateTo(d *ChannelStat) { + d.ValidDirectCount += s.ValidDirectCount + d.ValidDeductionCount += s.ValidDeductionCount + d.ValidPayMoney += s.ValidPayMoney + d.ValidPayCoin += s.ValidPayCoin + + d.NewTotalIpCount += s.NewTotalIpCount + d.NewTotalCount += s.NewTotalCount + d.NewDirectCount += s.NewDirectCount + d.NewFissionCount += s.NewFissionCount + d.NewDeductionCount += s.NewDeductionCount + d.NewAndroidCount += s.NewAndroidCount + + d.NewAndroidDirectCount += s.NewAndroidDirectCount + d.NewAndroidFissionCount += s.NewAndroidFissionCount + d.NewAndroidDeductionCount += s.NewAndroidDeductionCount + + d.NewIosCount += s.NewIosCount + d.NewIosDirectCount += s.NewIosDirectCount + d.NewIosFissionCount += s.NewIosFissionCount + d.NewIosDeductionCount += s.NewIosDeductionCount + + d.NewLightCount += s.NewLightCount + d.NewLightGuestCount += s.NewLightGuestCount + d.NewLightGuestDirectCount += s.NewLightGuestDirectCount + d.NewLightGuestFissionCount += s.NewLightGuestFissionCount + d.NewLightGuestDeductionCount += s.NewLightGuestDeductionCount + + d.NewLightFormalCount += s.NewLightFormalCount + d.NewLightFormalDirectCount += s.NewLightFormalDirectCount + d.NewLightFormalFissionCount += s.NewLightFormalFissionCount + d.NewLightFormalDeductionCount += s.NewLightFormalDeductionCount + + d.NewLightDirectCount += s.NewLightDirectCount + d.NewLightFissionCount += s.NewLightFissionCount + d.NewLightDeductionCount += s.NewLightDeductionCount + d.NewLightNaturalCount += s.NewLightNaturalCount + d.NewH5Count += s.NewH5Count + + d.NewH5DirectCount += s.NewH5DirectCount + d.NewH5FissionCount += s.NewH5FissionCount + d.NewH5DeductionCount += s.NewH5DeductionCount + + d.NewH5AndroidCount += s.NewH5AndroidCount + d.NewH5IosCount += s.NewH5IosCount + d.NewH5PcCount += s.NewH5PcCount + d.NewH5FormalCount += s.NewH5FormalCount + d.NewH5FormalDirectCount += s.NewH5FormalDirectCount + d.NewH5FormalFissionCount += s.NewH5FormalFissionCount + d.NewH5FormalDeductionCount += s.NewH5FormalDeductionCount + // 访问 + d.TotalVisitCount += s.TotalVisitCount + d.DirectVisitCount += s.DirectVisitCount + d.FissionVisitCount += s.FissionVisitCount + d.AndroidVisitCount += s.AndroidVisitCount + d.IosVisitCount += s.IosVisitCount + d.LightVisitCount += s.LightVisitCount + d.LightVisitDirectCount += s.LightVisitDirectCount + d.LightVisitFissionCount += s.LightVisitFissionCount + d.LightVisitDeductionCount += s.LightVisitDeductionCount + d.LightVisitNaturalCount += s.LightVisitNaturalCount + d.H5VisitCount += s.H5VisitCount + d.H5AndroidVisitCount += s.H5AndroidVisitCount + d.H5IosVisitCount += s.H5IosVisitCount + d.H5PcVisitCount += s.H5PcVisitCount + // 充值 + d.TotalAmount += s.TotalAmount + d.DirectAmount += s.DirectAmount + d.DirectAmountCount += s.DirectAmountCount + d.FissionAmount += s.FissionAmount + d.FissionAmountCount += s.FissionAmountCount + d.NaturalAmount += s.NaturalAmount + d.NaturalAmountCount += s.NaturalAmountCount + d.DeductionAmount += s.DeductionAmount + d.DeductionAmountCount += s.DeductionAmountCount + d.AndroidAmount += s.AndroidAmount + d.AndroidAmountCount += s.AndroidAmountCount + d.IosAmount += s.IosAmount + d.IosAmountCount += s.IosAmountCount + + d.H5Amount += s.H5Amount + d.H5AmountCount += s.H5AmountCount + d.LightAmount += s.LightAmount + d.LightAmountCount += s.LightAmountCount + d.LightDirectAmount += s.LightDirectAmount + d.LightDirectAmountCount += s.LightDirectAmountCount + d.LightFissionAmount += s.LightFissionAmount + d.LightFissionAmountCount += s.LightFissionAmountCount + d.LightDeductionAmount += s.LightDeductionAmount + d.LightDeductionAmountCount += s.LightDeductionAmountCount + d.LightNaturalAmount += s.LightNaturalAmount + d.LightNaturalAmountCount += s.LightNaturalAmountCount + // 其他充值 + d.NewRechargeAmount += s.NewRechargeAmount + d.VipPayMoney += s.VipPayMoney + d.VipPayCoin += s.VipPayCoin + d.VipPayDeduction += s.VipPayDeduction + d.GameRechageAmount += s.GameRechageAmount + d.GameWithdrawAmount += s.GameWithdrawAmount + // 落地页访问 + d.LandPageVisitCount += s.LandPageVisitCount + d.LandpageAndroidClick += s.LandpageAndroidClick + d.LandpageIosAppstoreClick += s.LandpageIosAppstoreClick + d.LandpageIosAthorClick += s.LandpageIosAthorClick + d.LandpageIosH5Click += s.LandpageIosH5Click +} + +func (s *ChannelStat) AssignmentTo(d *ChannelSettlement) { + d.ValidDirectCount = s.ValidDirectCount + d.ValidDeductionCount = s.ValidDeductionCount + d.ValidPayMoney = s.ValidPayMoney + d.ValidPayCoin = s.ValidPayCoin + + d.NewTotalIpCount = s.NewTotalIpCount + d.NewTotalCount = s.NewTotalCount + d.NewDirectCount = s.NewDirectCount + d.NewFissionCount = s.NewFissionCount + d.NewDeductionCount = s.NewDeductionCount + d.NewAndroidCount = s.NewAndroidCount + d.NewAndroidDirectCount = s.NewAndroidDirectCount + d.NewAndroidFissionCount = s.NewAndroidFissionCount + d.NewAndroidDeductionCount = s.NewAndroidDeductionCount + + d.NewIosCount = s.NewIosCount + d.NewIosDirectCount = s.NewIosDirectCount + d.NewIosFissionCount = s.NewIosFissionCount + d.NewIosDeductionCount = s.NewIosDeductionCount + + d.NewLightCount = s.NewLightCount + d.NewLightGuestCount = s.NewLightGuestCount + d.NewLightGuestDirectCount = s.NewLightGuestDirectCount + d.NewLightGuestFissionCount = s.NewLightGuestFissionCount + d.NewLightGuestDeductionCount = s.NewLightGuestDeductionCount + + d.NewLightFormalCount = s.NewLightFormalCount + d.NewLightFormalDirectCount = s.NewLightFormalDirectCount + d.NewLightFormalFissionCount = s.NewLightFormalFissionCount + d.NewLightFormalDeductionCount = s.NewLightFormalDeductionCount + + d.NewLightDirectCount = s.NewLightDirectCount + d.NewLightFissionCount = s.NewLightFissionCount + d.NewLightDeductionCount = s.NewLightDeductionCount + d.NewLightNaturalCount = s.NewLightNaturalCount + d.NewH5Count = s.NewH5Count + d.NewH5DirectCount = s.NewH5DirectCount + d.NewH5FissionCount = s.NewH5FissionCount + d.NewH5DeductionCount = s.NewH5DeductionCount + + d.NewH5AndroidCount = s.NewH5AndroidCount + d.NewH5IosCount = s.NewH5IosCount + d.NewH5PcCount = s.NewH5PcCount + d.NewH5FormalCount = s.NewH5FormalCount + d.NewH5FormalDirectCount = s.NewH5FormalDirectCount + d.NewH5FormalFissionCount = s.NewH5FormalFissionCount + d.NewH5FormalDeductionCount = s.NewH5FormalDeductionCount + // 访问 + d.TotalVisitCount = s.TotalVisitCount + d.DirectVisitCount = s.DirectVisitCount + d.FissionVisitCount = s.FissionVisitCount + d.AndroidVisitCount = s.AndroidVisitCount + d.IosVisitCount = s.IosVisitCount + d.LightVisitCount = s.LightVisitCount + d.LightVisitDirectCount = s.LightVisitDirectCount + d.LightVisitFissionCount = s.LightVisitFissionCount + d.LightVisitDeductionCount = s.LightVisitDeductionCount + d.LightVisitNaturalCount = s.LightVisitNaturalCount + d.H5VisitCount = s.H5VisitCount + d.H5AndroidVisitCount = s.H5AndroidVisitCount + d.H5IosVisitCount = s.H5IosVisitCount + d.H5PcVisitCount = s.H5PcVisitCount + // 充值 + d.TotalAmount = s.TotalAmount + d.DirectAmount = s.DirectAmount + d.DirectAmountCount = s.DirectAmountCount + d.FissionAmount = s.FissionAmount + d.FissionAmountCount = s.FissionAmountCount + d.NaturalAmount = s.NaturalAmount + d.NaturalAmountCount = s.NaturalAmountCount + d.DeductionAmount = s.DeductionAmount + d.DeductionAmountCount = s.DeductionAmountCount + d.AndroidAmount = s.AndroidAmount + d.AndroidAmountCount = s.AndroidAmountCount + d.IosAmount = s.IosAmount + d.IosAmountCount = s.IosAmountCount + d.H5Amount = s.H5Amount + d.H5AmountCount = s.H5AmountCount + d.LightAmount = s.LightAmount + d.LightAmountCount = s.LightAmountCount + d.LightDirectAmount = s.LightDirectAmount + d.LightDirectAmountCount = s.LightDirectAmountCount + d.LightFissionAmount = s.LightFissionAmount + d.LightFissionAmountCount = s.LightFissionAmountCount + d.LightDeductionAmount = s.LightDeductionAmount + d.LightDeductionAmountCount = s.LightDeductionAmountCount + d.LightNaturalAmount = s.LightNaturalAmount + d.LightNaturalAmountCount = s.LightNaturalAmountCount + // 其他充值 + d.NewRechargeAmount = s.NewRechargeAmount + d.VipPayMoney = s.VipPayMoney + d.VipPayCoin = s.VipPayCoin + d.VipPayDeduction = s.VipPayDeduction + d.GameRechageAmount = s.GameRechageAmount + d.GameWithdrawAmount = s.GameWithdrawAmount + // 落地页访问 + d.LandPageVisitCount = s.LandPageVisitCount + d.LandpageAndroidClick = s.LandpageAndroidClick + d.LandpageIosAppstoreClick = s.LandpageIosAppstoreClick + d.LandpageIosAthorClick = s.LandpageIosAthorClick + d.LandpageIosH5Click = s.LandpageIosH5Click +} + +func (s *ChannelStat) AccumulateTo(d *ChannelSettlement) { + d.ValidDirectCount += s.ValidDirectCount + d.ValidDeductionCount += s.ValidDeductionCount + d.ValidPayMoney += s.ValidPayMoney + d.ValidPayCoin += s.ValidPayCoin + + d.NewTotalIpCount += s.NewTotalIpCount + d.NewTotalCount += s.NewTotalCount + d.NewDirectCount += s.NewDirectCount + d.NewFissionCount += s.NewFissionCount + d.NewDeductionCount += s.NewDeductionCount + d.NewAndroidCount += s.NewAndroidCount + d.NewAndroidDirectCount += s.NewAndroidDirectCount + d.NewAndroidFissionCount += s.NewAndroidFissionCount + d.NewAndroidDeductionCount += s.NewAndroidDeductionCount + + d.NewIosCount += s.NewIosCount + d.NewIosDirectCount += s.NewIosDirectCount + d.NewIosFissionCount += s.NewIosFissionCount + d.NewIosDeductionCount += s.NewIosDeductionCount + + d.NewLightCount += s.NewLightCount + d.NewLightGuestCount += s.NewLightGuestCount + d.NewLightGuestDirectCount += s.NewLightGuestDirectCount + d.NewLightGuestFissionCount += s.NewLightGuestFissionCount + d.NewLightGuestDeductionCount += s.NewLightGuestDeductionCount + + d.NewLightFormalCount += s.NewLightFormalCount + d.NewLightFormalDirectCount += s.NewLightFormalDirectCount + d.NewLightFormalFissionCount += s.NewLightFormalFissionCount + d.NewLightFormalDeductionCount += s.NewLightFormalDeductionCount + + d.NewLightDirectCount += s.NewLightDirectCount + d.NewLightFissionCount += s.NewLightFissionCount + d.NewLightDeductionCount += s.NewLightDeductionCount + d.NewLightNaturalCount += s.NewLightNaturalCount + d.NewH5Count += s.NewH5Count + d.NewH5DirectCount += s.NewH5DirectCount + d.NewH5FissionCount += s.NewH5FissionCount + d.NewH5DeductionCount += s.NewH5DeductionCount + + d.NewH5AndroidCount += s.NewH5AndroidCount + d.NewH5IosCount += s.NewH5IosCount + d.NewH5PcCount += s.NewH5PcCount + d.NewH5FormalCount += s.NewH5FormalCount + d.NewH5FormalDirectCount += s.NewH5FormalDirectCount + d.NewH5FormalFissionCount += s.NewH5FormalFissionCount + d.NewH5FormalDeductionCount += s.NewH5FormalDeductionCount + + // 访问 + d.TotalVisitCount += s.TotalVisitCount + d.DirectVisitCount += s.DirectVisitCount + d.FissionVisitCount += s.FissionVisitCount + d.AndroidVisitCount += s.AndroidVisitCount + d.IosVisitCount += s.IosVisitCount + d.LightVisitCount += s.LightVisitCount + d.LightVisitDirectCount += s.LightVisitDirectCount + d.LightVisitFissionCount += s.LightVisitFissionCount + d.LightVisitDeductionCount += s.LightVisitDeductionCount + d.LightVisitNaturalCount += s.LightVisitNaturalCount + d.H5VisitCount += s.H5VisitCount + d.H5AndroidVisitCount += s.H5AndroidVisitCount + d.H5IosVisitCount += s.H5IosVisitCount + d.H5PcVisitCount += s.H5PcVisitCount + // 充值 + d.TotalAmount += s.TotalAmount + d.DirectAmount += s.DirectAmount + d.DirectAmountCount += s.DirectAmountCount + d.FissionAmount += s.FissionAmount + d.FissionAmountCount += s.FissionAmountCount + d.NaturalAmount += s.NaturalAmount + d.NaturalAmountCount += s.NaturalAmountCount + d.DeductionAmount += s.DeductionAmount + d.DeductionAmountCount += s.DeductionAmountCount + d.AndroidAmount += s.AndroidAmount + d.AndroidAmountCount += s.AndroidAmountCount + d.IosAmount += s.IosAmount + d.IosAmountCount += s.IosAmountCount + d.LightAmount += s.LightAmount + d.LightAmountCount += s.LightAmountCount + d.LightDirectAmount += s.LightDirectAmount + d.LightDirectAmountCount += s.LightDirectAmountCount + d.LightFissionAmount += s.LightFissionAmount + d.LightFissionAmountCount += s.LightFissionAmountCount + d.LightDeductionAmount += s.LightDeductionAmount + d.LightDeductionAmountCount += s.LightDeductionAmountCount + d.LightNaturalAmount += s.LightNaturalAmount + d.LightNaturalAmountCount += s.LightNaturalAmountCount + // 其他充值 + d.NewRechargeAmount += s.NewRechargeAmount + d.VipPayMoney += s.VipPayMoney + d.VipPayCoin += s.VipPayCoin + d.VipPayDeduction += s.VipPayDeduction + d.GameRechageAmount += s.GameRechageAmount + d.GameWithdrawAmount += s.GameWithdrawAmount + // 落地页访问 + d.LandPageVisitCount += s.LandPageVisitCount + d.LandpageAndroidClick += s.LandpageAndroidClick + d.LandpageIosAppstoreClick += s.LandpageIosAppstoreClick + d.LandpageIosAthorClick += s.LandpageIosAthorClick + d.LandpageIosH5Click += s.LandpageIosH5Click +} + +func (s *ChannelStat) CalcIncomeRate() *ChannelStat { + if s.Settlement == SettlementCPA && s.CPAPrice > 0 { + spendMoney := s.ValidDirectCount * s.CPAPrice + incomeMoney := getConfig(s.AppId).GetIncome(s) //s.DirectAmount + if spendMoney > 0 { + s.IncomeAmount = spendMoney + s.IncomeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", float64(incomeMoney)/float64(spendMoney)), 64) + } + } else if s.Settlement == SettlementCPS && s.CPSRate > 0 { + spendMoney := s.ValidPayMoney * s.CPSRate / 100 + incomeMoney := getConfig(s.AppId).GetIncome(s) // s.DirectAmount + if spendMoney > 0 { + s.IncomeAmount = spendMoney + s.IncomeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", float64(incomeMoney)/float64(spendMoney)), 64) + } + } + return s +} + +func (s *ChannelStat) CorrectValidData() *ChannelStat { + //if s.ValidDirectCount == 0 && s.ValidPayMoney == 0 { + s.ValidDirectCount, s.ValidPayMoney, s.ValidPayCoin, s.ValidDeductionCount = GetChannelStatValidData(s) + //} + if s.TotalVisitCount != s.DirectVisitCount+s.FissionVisitCount { + s.TotalVisitCount = s.DirectVisitCount + s.FissionVisitCount + } + if s.NewTotalCount != s.NewDirectCount+s.NewFissionCount+s.NewDeductionCount { + s.NewTotalCount = s.NewDirectCount + s.NewFissionCount + s.NewDeductionCount + } + if s.DirectAmount+s.FissionAmount+s.DeductionAmount != s.TotalAmount { + s.TotalAmount = s.DirectAmount + s.FissionAmount + s.DeductionAmount + } + if s.VipPayMoney+s.VipPayDeduction+s.VipPayCoin != s.TotalAmount { + s.VipPayCoin = s.TotalAmount - s.VipPayMoney - s.VipPayDeduction + } + return s +} + +func (s *ChannelSettlement) CorrectValidData() *ChannelSettlement { + //if s.ValidDirectCount == 0 && s.ValidPayMoney == 0 { + s.ValidDirectCount, s.ValidPayMoney, s.ValidPayCoin, s.ValidDeductionCount = GetChannelSettlementValidData(s) + //} + if s.TotalVisitCount != s.DirectVisitCount+s.FissionVisitCount { + s.TotalVisitCount = s.DirectVisitCount + s.FissionVisitCount + } + if s.NewTotalCount != s.NewDirectCount+s.NewFissionCount+s.NewDeductionCount { + s.NewTotalCount = s.NewDirectCount + s.NewFissionCount + s.NewDeductionCount + } + if s.DirectAmount+s.FissionAmount+s.DeductionAmount != s.TotalAmount { + s.TotalAmount = s.DirectAmount + s.FissionAmount + s.DeductionAmount + } + if s.VipPayMoney+s.VipPayDeduction+s.VipPayCoin != s.TotalAmount { + s.VipPayCoin = s.TotalAmount - s.VipPayMoney - s.VipPayDeduction + } + return s +} + +func GetChannelStatValidData(stat *ChannelStat) (count int64, amount int64, coin int64, deduction int64) { + switch stat.AppType { + case AppTypePkg: + count = stat.NewAndroidDirectCount + stat.NewIosDirectCount + deduction = stat.NewAndroidDeductionCount + stat.NewIosDeductionCount + amount = stat.VipPayMoney + coin = stat.ValidPayCoin + case AppTypeLight: + if stat.PromoteMode == PromoteModeRegister { + count = stat.NewLightFormalDirectCount + deduction = stat.NewLightFormalDeductionCount + } else { + count = stat.NewLightDirectCount + deduction = stat.NewLightDeductionCount + } + amount = stat.VipPayMoney + coin = stat.ValidPayCoin + case AppTypeH5: + if stat.PromoteMode == PromoteModeRegister { + count = stat.NewH5FormalDirectCount + deduction = stat.NewH5FormalDeductionCount + } else { + count = stat.NewH5DirectCount + deduction = stat.NewH5DeductionCount + } + amount = stat.VipPayMoney + coin = stat.ValidPayCoin + default: + count = stat.NewDirectCount + deduction = stat.NewDeductionCount + amount = stat.VipPayMoney + if stat.AppId == 6666 && amount == 0 { // 咻车宝按照充值金币计算 + amount += stat.VipPayCoin + } + coin = stat.ValidPayCoin + } + return +} + +func GetChannelSettlementValidData(stat *ChannelSettlement) (count int64, amount int64, coin int64, deduction int64) { + switch stat.AppType { + case AppTypePkg: + count = stat.NewAndroidDirectCount + stat.NewIosDirectCount + deduction = stat.NewAndroidDeductionCount + stat.NewIosDeductionCount + amount = stat.VipPayMoney + coin = stat.ValidPayCoin + case AppTypeLight: + if stat.PromoteMode == PromoteModeRegister { + count = stat.NewLightFormalDirectCount + deduction = stat.NewLightFormalDeductionCount + } else { + count = stat.NewLightDirectCount + deduction = stat.NewLightDeductionCount + } + amount = stat.VipPayMoney + coin = stat.ValidPayCoin + case AppTypeH5: + if stat.PromoteMode == PromoteModeRegister { + count = stat.NewH5FormalDirectCount + deduction = stat.NewH5FormalDeductionCount + } else { + count = stat.NewH5DirectCount + deduction = stat.NewH5DeductionCount + } + amount = stat.VipPayMoney + coin = stat.ValidPayCoin + default: + count = stat.NewDirectCount + deduction = stat.NewDeductionCount + amount = stat.VipPayMoney + coin = stat.ValidPayCoin + } + return +} + +func ChannelStatSummation(base, value *ChannelStat) { + value.CorrectValidData() + + base.ValidDirectCount += value.ValidDirectCount + base.ValidDeductionCount += value.ValidDeductionCount + base.ValidPayMoney += value.ValidPayMoney + base.ValidPayCoin += value.ValidPayCoin + + base.NewTotalIpCount += value.NewTotalIpCount + base.NewTotalCount += value.NewTotalCount + base.NewDirectCount += value.NewDirectCount + base.NewFissionCount += value.NewFissionCount + base.NewDeductionCount += value.NewDeductionCount + base.NewAndroidCount += value.NewAndroidCount + base.NewAndroidDirectCount += value.NewAndroidDirectCount + base.NewAndroidFissionCount += value.NewAndroidFissionCount + base.NewAndroidDeductionCount += value.NewAndroidDeductionCount + + base.NewIosCount += value.NewIosCount + base.NewIosDirectCount += value.NewIosDirectCount + base.NewIosFissionCount += value.NewIosFissionCount + base.NewIosDeductionCount += value.NewIosDeductionCount + + base.NewLightCount += value.NewLightCount + base.NewLightGuestCount += value.NewLightGuestCount + base.NewLightGuestDirectCount += value.NewLightGuestDirectCount + base.NewLightGuestFissionCount += value.NewLightGuestFissionCount + base.NewLightGuestDeductionCount += value.NewLightGuestDeductionCount + + base.NewLightFormalCount += value.NewLightFormalCount + base.NewLightFormalDirectCount += value.NewLightFormalDirectCount + base.NewLightFormalFissionCount += value.NewLightFormalFissionCount + base.NewLightFormalDeductionCount += value.NewLightFormalDeductionCount + + base.NewLightDirectCount += value.NewLightDirectCount + base.NewLightFissionCount += value.NewLightFissionCount + base.NewLightDeductionCount += value.NewLightDeductionCount + base.NewLightNaturalCount += value.NewLightNaturalCount + base.NewH5Count += value.NewH5Count + base.NewH5DirectCount += value.NewH5DirectCount + base.NewH5FissionCount += value.NewH5FissionCount + base.NewH5DeductionCount += value.NewH5DeductionCount + base.NewH5AndroidCount += value.NewH5AndroidCount + base.NewH5IosCount += value.NewH5IosCount + base.NewH5PcCount += value.NewH5PcCount + base.NewH5FormalCount += value.NewH5FormalCount + base.NewH5FormalDirectCount += value.NewH5FormalDirectCount + base.NewH5FormalFissionCount += value.NewH5FormalFissionCount + base.NewH5FormalDeductionCount += value.NewH5FormalDeductionCount + // 访问 + base.TotalVisitCount += value.TotalVisitCount + base.DirectVisitCount += value.DirectVisitCount + base.FissionVisitCount += value.FissionVisitCount + base.AndroidVisitCount += value.AndroidVisitCount + base.IosVisitCount += value.IosVisitCount + base.LightVisitCount += value.LightVisitCount + base.LightVisitDirectCount += value.LightVisitDirectCount + base.LightVisitFissionCount += value.LightVisitFissionCount + base.LightVisitDeductionCount += value.LightVisitDeductionCount + base.LightVisitNaturalCount += value.LightVisitNaturalCount + base.H5VisitCount += value.H5VisitCount + base.H5AndroidVisitCount += value.H5AndroidVisitCount + base.H5IosVisitCount += value.H5IosVisitCount + base.H5PcVisitCount += value.H5PcVisitCount + // 充值 + base.TotalAmount += value.TotalAmount + base.DirectAmount += value.DirectAmount + base.DirectAmountCount += value.DirectAmountCount + base.FissionAmount += value.FissionAmount + base.FissionAmountCount += value.FissionAmountCount + base.NaturalAmount += value.NaturalAmount + base.NaturalAmountCount += value.NaturalAmountCount + base.DeductionAmount += value.DeductionAmount + base.DeductionAmountCount += value.DeductionAmountCount + base.AndroidAmount += value.AndroidAmount + base.AndroidAmountCount += value.AndroidAmountCount + base.IosAmount += value.IosAmount + base.IosAmountCount += value.IosAmountCount + base.H5Amount += value.H5Amount + base.H5AmountCount += value.H5AmountCount + base.LightAmount += value.LightAmount + base.LightAmountCount += value.LightAmountCount + base.LightDirectAmount += value.LightDirectAmount + base.LightDirectAmountCount += value.LightDirectAmountCount + base.LightFissionAmount += value.LightFissionAmount + base.LightFissionAmountCount += value.LightFissionAmountCount + base.LightDeductionAmount += value.LightDeductionAmount + base.LightDeductionAmountCount += value.LightDeductionAmountCount + base.LightNaturalAmount += value.LightNaturalAmount + base.LightNaturalAmountCount += value.LightNaturalAmountCount + // 其他充值 + base.NewRechargeAmount += value.NewRechargeAmount + base.VipPayMoney += value.VipPayMoney + base.VipPayCoin += value.DirectAmount + value.FissionAmount - value.VipPayMoney - value.VipPayDeduction + base.VipPayDeduction += value.VipPayDeduction + base.GameRechageAmount += value.GameRechageAmount + base.GameWithdrawAmount += value.GameWithdrawAmount + // 落地页访问 + base.LandPageVisitCount += value.LandPageVisitCount + base.LandpageAndroidClick += value.LandpageAndroidClick + base.LandpageIosAppstoreClick += value.LandpageIosAppstoreClick + base.LandpageIosAthorClick += value.LandpageIosAthorClick + base.LandpageIosH5Click += value.LandpageIosH5Click +} + +func CalculateChannelIncome(stat *ChannelStat) (int64, string) { + var income int64 + var desc string + if stat.Settlement == SettlementCPA { + income = stat.ValidDirectCount * stat.CPAPrice + desc = fmt.Sprintf("CPA:%d * %.2f", stat.ValidDirectCount, float64(stat.CPAPrice)/float64(100)) + } else if stat.Settlement == SettlementCPS { + income += (stat.ValidPayMoney * stat.CPSRate) / 100 + desc = fmt.Sprintf("CPS:%.2f * %.2f", float64(stat.ValidPayMoney)/float64(100), float64(stat.CPSRate)/float64(100)) + } else { + income = 0 + desc = fmt.Sprintf("【%s】结算方式,需要自己计算结算金额", stat.Settlement) + } + return income, desc +} diff --git a/models/channelmod/tag.go b/models/channelmod/tag.go new file mode 100755 index 0000000..3beff97 --- /dev/null +++ b/models/channelmod/tag.go @@ -0,0 +1,649 @@ +package channelmod + +type TagChannelInfo struct { + AppIds string + AutoGenApk string + Channel string + CheckTokenTime string + ChildCount string + ChildShowDivideRate string + CreatedAt string + ID string + IP string + Lock string + Mobile string + ParentAgent string + ParentChannel string + Password string + Remark string + ShowMagic string + Status string + Token string + Type string + UpdatedAt string + UserName string + Wallet struct { + Addr1 string + Addr2 string + } +} +type TagChannelDeductionRule struct { + AppId string + AppName string + AppType string + AutoDeduction string + BeginTime string + CPAPrice string + CPSBegin string + CPSDeductionRate string + CPSRate string + Channel string + CreatedAt string + DivideRate string + Fifth string + First string + Fourth string + ID string + LandingPage string + LessIncomeRate string + PromoteMode string + ProxyDeduction string + Second string + Settlement string + SettlementTime string + Third string + TodayDeduction string + TodayTime string + UpdatedAt string +} +type TagChannelStat struct { + AndroidAmount string + AndroidAmountCount string + AndroidVisitCount string + AppId string + AppType string + CPAPrice string + CPSRate string + Channel string + CreatedAt string + Day1RetainRate string + Day3RetainRate string + Day7RetainRate string + DeductionAmount string + DeductionAmountCount string + DirectAmount string + DirectAmountCount string + DirectVisitCount string + FissionAmount string + FissionAmountCount string + FissionVisitCount string + GameRechageAmount string + GameWithdrawAmount string + H5Amount string + H5AmountCount string + H5AndroidVisitCount string + H5IosVisitCount string + H5PcVisitCount string + H5VisitCount string + ID string + IncomeAmount string + IncomeRate string + IosAmount string + IosAmountCount string + IosVisitCount string + IsPay string + LandPageVisitCount string + LandpageAndroidClick string + LandpageIosAppstoreClick string + LandpageIosAthorClick string + LandpageIosH5Click string + LightAmount string + LightAmountCount string + LightDeductionAmount string + LightDeductionAmountCount string + LightDirectAmount string + LightDirectAmountCount string + LightFissionAmount string + LightFissionAmountCount string + LightNaturalAmount string + LightNaturalAmountCount string + LightVisitCount string + LightVisitDeductionCount string + LightVisitDirectCount string + LightVisitFissionCount string + LightVisitNaturalCount string + NaturalAmount string + NaturalAmountCount string + NewAndroidCount string + NewAndroidDeductionCount string + NewAndroidDirectCount string + NewAndroidFissionCount string + NewDeductionCount string + NewDirectCount string + NewFissionCount string + NewH5AndroidCount string + NewH5Count string + NewH5DeductionCount string + NewH5DirectCount string + NewH5FissionCount string + NewH5FormalCount string + NewH5FormalDeductionCount string + NewH5FormalDirectCount string + NewH5FormalFissionCount string + NewH5IosCount string + NewH5PcCount string + NewIosCount string + NewIosDeductionCount string + NewIosDirectCount string + NewIosFissionCount string + NewLightCount string + NewLightDeductionCount string + NewLightDirectCount string + NewLightFissionCount string + NewLightFormalCount string + NewLightFormalDeductionCount string + NewLightFormalDirectCount string + NewLightFormalFissionCount string + NewLightGuestCount string + NewLightGuestDeductionCount string + NewLightGuestDirectCount string + NewLightGuestFissionCount string + NewLightNaturalCount string + NewRechargeAmount string + NewTotalCount string + NewTotalIpCount string + ParentChannel string + PromoteMode string + Settlement string + SumDate string + TotalAmount string + TotalVisitCount string + Type string + UpdatedAt string + UserName string + ValidDeductionCount string + ValidDirectCount string + ValidPayCoin string + ValidPayMoney string + VipPayCoin string + VipPayDeduction string + VipPayMoney string +} +type TagChannelSettlement struct { + AndroidAmount string + AndroidAmountCount string + AndroidVisitCount string + AppId string + AppType string + Channel string + CreatedAt string + DeductionAmount string + DeductionAmountCount string + DirectAmount string + DirectAmountCount string + DirectVisitCount string + FissionAmount string + FissionAmountCount string + FissionVisitCount string + GameRechageAmount string + GameWithdrawAmount string + H5Amount string + H5AmountCount string + H5AndroidVisitCount string + H5IosVisitCount string + H5PcVisitCount string + H5VisitCount string + ID string + IosAmount string + IosAmountCount string + IosVisitCount string + LandPageVisitCount string + LandpageAndroidClick string + LandpageIosAppstoreClick string + LandpageIosAthorClick string + LandpageIosH5Click string + LightAmount string + LightAmountCount string + LightDeductionAmount string + LightDeductionAmountCount string + LightDirectAmount string + LightDirectAmountCount string + LightFissionAmount string + LightFissionAmountCount string + LightNaturalAmount string + LightNaturalAmountCount string + LightVisitCount string + LightVisitDeductionCount string + LightVisitDirectCount string + LightVisitFissionCount string + LightVisitNaturalCount string + NaturalAmount string + NaturalAmountCount string + NewAndroidCount string + NewAndroidDeductionCount string + NewAndroidDirectCount string + NewAndroidFissionCount string + NewDeductionCount string + NewDirectCount string + NewFissionCount string + NewH5AndroidCount string + NewH5Count string + NewH5DeductionCount string + NewH5DirectCount string + NewH5FissionCount string + NewH5FormalCount string + NewH5FormalDeductionCount string + NewH5FormalDirectCount string + NewH5FormalFissionCount string + NewH5IosCount string + NewH5PcCount string + NewIosCount string + NewIosDeductionCount string + NewIosDirectCount string + NewIosFissionCount string + NewLightCount string + NewLightDeductionCount string + NewLightDirectCount string + NewLightFissionCount string + NewLightFormalCount string + NewLightFormalDeductionCount string + NewLightFormalDirectCount string + NewLightFormalFissionCount string + NewLightGuestCount string + NewLightGuestDeductionCount string + NewLightGuestDirectCount string + NewLightGuestFissionCount string + NewLightNaturalCount string + NewRechargeAmount string + NewTotalCount string + NewTotalIpCount string + ParentChannel string + PromoteMode string + SumDate string + TotalAmount string + TotalVisitCount string + Type string + UpdatedAt string + UserName string + ValidDeductionCount string + ValidDirectCount string + ValidPayCoin string + ValidPayMoney string + VipPayCoin string + VipPayDeduction string + VipPayMoney string +} +type TagChannelStatYestoday struct { + AndroidRechargeAmount string + AppId string + Channel string + CreatedAt string + DirectAmount string + FissionAmount string + H5RechargeAmount string + ID string + IosRechargeAmount string + LightRechargeAmount string + NewAndroidCount string + NewCount string + NewDirectCount string + NewFissionCount string + NewH5Count string + NewH5FormalCount string + NewIncreaseCount string + NewIncreaseRate string + NewIosCount string + NewLightFormalCount string + NewLightGuestCount string + ParentChannel string + RechargeAmount string + RechargeIncreaseAmount string + RechargeIncreaseRate string + Settlement string + SumDate string + UpdatedAt string + VipPayCoin string + VipPayDeduction string + VipPayMoney string +} +type TagChannelOwnerChange struct { + Account string + Channel string + CreatedAt string + ID string + Mark string + NewUser string + OldUser string + Operator string + UpdatedAt string +} + +var FN struct { + ChannelInfo TagChannelInfo + ChannelDeductionRule TagChannelDeductionRule + ChannelStat TagChannelStat + ChannelSettlement TagChannelSettlement + ChannelStatYestoday TagChannelStatYestoday + ChannelOwnerChange TagChannelOwnerChange +} + +var TN struct { + ChannelInfo string + ChannelDeductionRule string + ChannelStat string + ChannelSettlement string + ChannelStatYestoday string + ChannelOwnerChange string +} + +func init() { + FN.ChannelInfo.AppIds = "appIds" + FN.ChannelInfo.AutoGenApk = "autoGenApk" + FN.ChannelInfo.Channel = "channel" + FN.ChannelInfo.CheckTokenTime = "checkTokenTime" + FN.ChannelInfo.ChildCount = "childCount" + FN.ChannelInfo.ChildShowDivideRate = "childShowDivideRate" + FN.ChannelInfo.CreatedAt = "createdAt" + FN.ChannelInfo.ID = "_id" + FN.ChannelInfo.IP = "ip" + FN.ChannelInfo.Lock = "lock" + FN.ChannelInfo.Mobile = "mobile" + FN.ChannelInfo.ParentAgent = "parentAgent" + FN.ChannelInfo.ParentChannel = "parentChannel" + FN.ChannelInfo.Password = "password" + FN.ChannelInfo.Remark = "remark" + FN.ChannelInfo.ShowMagic = "showMagic" + FN.ChannelInfo.Status = "status" + FN.ChannelInfo.Token = "token" + FN.ChannelInfo.Type = "type" + FN.ChannelInfo.UpdatedAt = "updatedAt" + FN.ChannelInfo.UserName = "userName" + FN.ChannelInfo.Wallet.Addr1 = "wallet.addr1" + FN.ChannelInfo.Wallet.Addr2 = "wallet.addr2" + FN.ChannelDeductionRule.AppId = "appId" + FN.ChannelDeductionRule.AppName = "appName" + FN.ChannelDeductionRule.AppType = "appType" + FN.ChannelDeductionRule.AutoDeduction = "autoDeduction" + FN.ChannelDeductionRule.BeginTime = "deductionAt" + FN.ChannelDeductionRule.CPAPrice = "cpaPrice" + FN.ChannelDeductionRule.CPSBegin = "cpsBegin" + FN.ChannelDeductionRule.CPSDeductionRate = "cpsDeductionRate" + FN.ChannelDeductionRule.CPSRate = "cpsRate" + FN.ChannelDeductionRule.Channel = "channel" + FN.ChannelDeductionRule.CreatedAt = "createdAt" + FN.ChannelDeductionRule.DivideRate = "divideRate" + FN.ChannelDeductionRule.Fifth = "fifth" + FN.ChannelDeductionRule.First = "first" + FN.ChannelDeductionRule.Fourth = "fourth" + FN.ChannelDeductionRule.ID = "_id" + FN.ChannelDeductionRule.LandingPage = "landingPage" + FN.ChannelDeductionRule.LessIncomeRate = "lessIncomeRate" + FN.ChannelDeductionRule.PromoteMode = "promoteMode" + FN.ChannelDeductionRule.ProxyDeduction = "proxyDeduction" + FN.ChannelDeductionRule.Second = "second" + FN.ChannelDeductionRule.Settlement = "settlement" + FN.ChannelDeductionRule.SettlementTime = "settlementTime" + FN.ChannelDeductionRule.Third = "third" + FN.ChannelDeductionRule.TodayDeduction = "todayDeduction" + FN.ChannelDeductionRule.TodayTime = "todayTime" + FN.ChannelDeductionRule.UpdatedAt = "updatedAt" + FN.ChannelStat.AndroidAmount = "androidAmount" + FN.ChannelStat.AndroidAmountCount = "androidAmountCount" + FN.ChannelStat.AndroidVisitCount = "androidVisitCount" + FN.ChannelStat.AppId = "appId" + FN.ChannelStat.AppType = "appType" + FN.ChannelStat.CPAPrice = "cpaPrice" + FN.ChannelStat.CPSRate = "cpsRate" + FN.ChannelStat.Channel = "channel" + FN.ChannelStat.CreatedAt = "createdAt" + FN.ChannelStat.Day1RetainRate = "day1RetainRate" + FN.ChannelStat.Day3RetainRate = "day3RetainRate" + FN.ChannelStat.Day7RetainRate = "day7RetainRate" + FN.ChannelStat.DeductionAmount = "deductionAmount" + FN.ChannelStat.DeductionAmountCount = "deductionAmountCount" + FN.ChannelStat.DirectAmount = "directAmount" + FN.ChannelStat.DirectAmountCount = "directAmountCount" + FN.ChannelStat.DirectVisitCount = "directVisitCount" + FN.ChannelStat.FissionAmount = "fissionAmount" + FN.ChannelStat.FissionAmountCount = "fissionAmountCount" + FN.ChannelStat.FissionVisitCount = "fissionVisitCount" + FN.ChannelStat.GameRechageAmount = "gameRechageAmount" + FN.ChannelStat.GameWithdrawAmount = "gameWithdrawAmount" + FN.ChannelStat.H5Amount = "h5Amount" + FN.ChannelStat.H5AmountCount = "h5AmountCount" + FN.ChannelStat.H5AndroidVisitCount = "h5AndroidVisitCount" + FN.ChannelStat.H5IosVisitCount = "h5IosVisitCount" + FN.ChannelStat.H5PcVisitCount = "h5PcVisitCount" + FN.ChannelStat.H5VisitCount = "h5VisitCount" + FN.ChannelStat.ID = "_id" + FN.ChannelStat.IncomeAmount = "IncomeAmount" + FN.ChannelStat.IncomeRate = "incomeRate" + FN.ChannelStat.IosAmount = "iosAmount" + FN.ChannelStat.IosAmountCount = "iosAmountCount" + FN.ChannelStat.IosVisitCount = "iosVisitCount" + FN.ChannelStat.IsPay = "isPay" + FN.ChannelStat.LandPageVisitCount = "landPageVisitCount" + FN.ChannelStat.LandpageAndroidClick = "landpageAndroidClick" + FN.ChannelStat.LandpageIosAppstoreClick = "landpageIosAppstoreClick" + FN.ChannelStat.LandpageIosAthorClick = "landpageIosAthorClick" + FN.ChannelStat.LandpageIosH5Click = "landpageIosH5Click" + FN.ChannelStat.LightAmount = "lightAmount" + FN.ChannelStat.LightAmountCount = "lightAmountCount" + FN.ChannelStat.LightDeductionAmount = "lightDeductionAmount" + FN.ChannelStat.LightDeductionAmountCount = "lightDeductionAmountCount" + FN.ChannelStat.LightDirectAmount = "lightDirectAmount" + FN.ChannelStat.LightDirectAmountCount = "lightDirectAmountCount" + FN.ChannelStat.LightFissionAmount = "lightFissionAmount" + FN.ChannelStat.LightFissionAmountCount = "lightFissionAmountCount" + FN.ChannelStat.LightNaturalAmount = "lightNaturalAmount" + FN.ChannelStat.LightNaturalAmountCount = "lightNaturalAmountCount" + FN.ChannelStat.LightVisitCount = "lightVisitCount" + FN.ChannelStat.LightVisitDeductionCount = "lightVisitDeductionCount" + FN.ChannelStat.LightVisitDirectCount = "lightVisitDirectCount" + FN.ChannelStat.LightVisitFissionCount = "lightVisitFissionCount" + FN.ChannelStat.LightVisitNaturalCount = "lightVisitNaturalCount" + FN.ChannelStat.NaturalAmount = "naturalAmount" + FN.ChannelStat.NaturalAmountCount = "naturalAmountCount" + FN.ChannelStat.NewAndroidCount = "newAndroidCount" + FN.ChannelStat.NewAndroidDeductionCount = "newAndroidDeductionCount" + FN.ChannelStat.NewAndroidDirectCount = "newAndroidDirectCount" + FN.ChannelStat.NewAndroidFissionCount = "newAndroidFissionCount" + FN.ChannelStat.NewDeductionCount = "newDeductionCount" + FN.ChannelStat.NewDirectCount = "newDirectCount" + FN.ChannelStat.NewFissionCount = "newFissionCount" + FN.ChannelStat.NewH5AndroidCount = "newH5AndroidCount" + FN.ChannelStat.NewH5Count = "newH5Count" + FN.ChannelStat.NewH5DeductionCount = "newH5DeductionCount" + FN.ChannelStat.NewH5DirectCount = "newH5DirectCount" + FN.ChannelStat.NewH5FissionCount = "newH5FissionCount" + FN.ChannelStat.NewH5FormalCount = "newH5FormalCount" + FN.ChannelStat.NewH5FormalDeductionCount = "newH5FormalDeductionCount" + FN.ChannelStat.NewH5FormalDirectCount = "newH5FormalDirectCount" + FN.ChannelStat.NewH5FormalFissionCount = "newH5FormalFissionCount" + FN.ChannelStat.NewH5IosCount = "newH5IosCount" + FN.ChannelStat.NewH5PcCount = "newH5PcCount" + FN.ChannelStat.NewIosCount = "newIosCount" + FN.ChannelStat.NewIosDeductionCount = "newIosDeductionCount" + FN.ChannelStat.NewIosDirectCount = "newIosDirectCount" + FN.ChannelStat.NewIosFissionCount = "newIosFissionCount" + FN.ChannelStat.NewLightCount = "newLightCount" + FN.ChannelStat.NewLightDeductionCount = "newLightDeductionCount" + FN.ChannelStat.NewLightDirectCount = "newLightDirectCount" + FN.ChannelStat.NewLightFissionCount = "newLightFissionCount" + FN.ChannelStat.NewLightFormalCount = "newLightFormalCount" + FN.ChannelStat.NewLightFormalDeductionCount = "newLightFormalDeductionCount" + FN.ChannelStat.NewLightFormalDirectCount = "newLightFormalDirectCount" + FN.ChannelStat.NewLightFormalFissionCount = "newLightFormalFissionCount" + FN.ChannelStat.NewLightGuestCount = "newLightGuestCount" + FN.ChannelStat.NewLightGuestDeductionCount = "newLightGuestDeductionCount" + FN.ChannelStat.NewLightGuestDirectCount = "newLightGuestDirectCount" + FN.ChannelStat.NewLightGuestFissionCount = "newLightGuestFissionCount" + FN.ChannelStat.NewLightNaturalCount = "newLightNaturalCount" + FN.ChannelStat.NewRechargeAmount = "newRechargeAmount" + FN.ChannelStat.NewTotalCount = "newTotalCount" + FN.ChannelStat.NewTotalIpCount = "newTotalIpCount" + FN.ChannelStat.ParentChannel = "parentChannel" + FN.ChannelStat.PromoteMode = "promoteMode" + FN.ChannelStat.Settlement = "settlement" + FN.ChannelStat.SumDate = "sumDate" + FN.ChannelStat.TotalAmount = "totalAmount" + FN.ChannelStat.TotalVisitCount = "totalVisitCount" + FN.ChannelStat.Type = "type" + FN.ChannelStat.UpdatedAt = "updatedAt" + FN.ChannelStat.UserName = "userName" + FN.ChannelStat.ValidDeductionCount = "validDeductionCount" + FN.ChannelStat.ValidDirectCount = "validDirectCount" + FN.ChannelStat.ValidPayCoin = "validPayCoin" + FN.ChannelStat.ValidPayMoney = "validPayMoney" + FN.ChannelStat.VipPayCoin = "vipPayCoin" + FN.ChannelStat.VipPayDeduction = "vipPayDeduction" + FN.ChannelStat.VipPayMoney = "vipPayMoney" + FN.ChannelSettlement.AndroidAmount = "androidAmount" + FN.ChannelSettlement.AndroidAmountCount = "androidAmountCount" + FN.ChannelSettlement.AndroidVisitCount = "androidVisitCount" + FN.ChannelSettlement.AppId = "appId" + FN.ChannelSettlement.AppType = "appType" + FN.ChannelSettlement.Channel = "channel" + FN.ChannelSettlement.CreatedAt = "createdAt" + FN.ChannelSettlement.DeductionAmount = "deductionAmount" + FN.ChannelSettlement.DeductionAmountCount = "deductionAmountCount" + FN.ChannelSettlement.DirectAmount = "directAmount" + FN.ChannelSettlement.DirectAmountCount = "directAmountCount" + FN.ChannelSettlement.DirectVisitCount = "directVisitCount" + FN.ChannelSettlement.FissionAmount = "fissionAmount" + FN.ChannelSettlement.FissionAmountCount = "fissionAmountCount" + FN.ChannelSettlement.FissionVisitCount = "fissionVisitCount" + FN.ChannelSettlement.GameRechageAmount = "gameRechageAmount" + FN.ChannelSettlement.GameWithdrawAmount = "gameWithdrawAmount" + FN.ChannelSettlement.H5Amount = "h5Amount" + FN.ChannelSettlement.H5AmountCount = "h5AmountCount" + FN.ChannelSettlement.H5AndroidVisitCount = "h5AndroidVisitCount" + FN.ChannelSettlement.H5IosVisitCount = "h5IosVisitCount" + FN.ChannelSettlement.H5PcVisitCount = "h5PcVisitCount" + FN.ChannelSettlement.H5VisitCount = "h5VisitCount" + FN.ChannelSettlement.ID = "_id" + FN.ChannelSettlement.IosAmount = "iosAmount" + FN.ChannelSettlement.IosAmountCount = "iosAmountCount" + FN.ChannelSettlement.IosVisitCount = "iosVisitCount" + FN.ChannelSettlement.LandPageVisitCount = "landPageVisitCount" + FN.ChannelSettlement.LandpageAndroidClick = "landpageAndroidClick" + FN.ChannelSettlement.LandpageIosAppstoreClick = "landpageIosAppstoreClick" + FN.ChannelSettlement.LandpageIosAthorClick = "landpageIosAthorClick" + FN.ChannelSettlement.LandpageIosH5Click = "landpageIosH5Click" + FN.ChannelSettlement.LightAmount = "lightAmount" + FN.ChannelSettlement.LightAmountCount = "lightAmountCount" + FN.ChannelSettlement.LightDeductionAmount = "lightDeductionAmount" + FN.ChannelSettlement.LightDeductionAmountCount = "lightDeductionAmountCount" + FN.ChannelSettlement.LightDirectAmount = "lightDirectAmount" + FN.ChannelSettlement.LightDirectAmountCount = "lightDirectAmountCount" + FN.ChannelSettlement.LightFissionAmount = "lightFissionAmount" + FN.ChannelSettlement.LightFissionAmountCount = "lightFissionAmountCount" + FN.ChannelSettlement.LightNaturalAmount = "lightNaturalAmount" + FN.ChannelSettlement.LightNaturalAmountCount = "lightNaturalAmountCount" + FN.ChannelSettlement.LightVisitCount = "lightVisitCount" + FN.ChannelSettlement.LightVisitDeductionCount = "lightVisitDeductionCount" + FN.ChannelSettlement.LightVisitDirectCount = "lightVisitDirectCount" + FN.ChannelSettlement.LightVisitFissionCount = "lightVisitFissionCount" + FN.ChannelSettlement.LightVisitNaturalCount = "lightVisitNaturalCount" + FN.ChannelSettlement.NaturalAmount = "naturalAmount" + FN.ChannelSettlement.NaturalAmountCount = "naturalAmountCount" + FN.ChannelSettlement.NewAndroidCount = "newAndroidCount" + FN.ChannelSettlement.NewAndroidDeductionCount = "newAndroidDeductionCount" + FN.ChannelSettlement.NewAndroidDirectCount = "newAndroidDirectCount" + FN.ChannelSettlement.NewAndroidFissionCount = "newAndroidFissionCount" + FN.ChannelSettlement.NewDeductionCount = "newDeductionCount" + FN.ChannelSettlement.NewDirectCount = "newDirectCount" + FN.ChannelSettlement.NewFissionCount = "newFissionCount" + FN.ChannelSettlement.NewH5AndroidCount = "newH5AndroidCount" + FN.ChannelSettlement.NewH5Count = "newH5Count" + FN.ChannelSettlement.NewH5DeductionCount = "newH5DeductionCount" + FN.ChannelSettlement.NewH5DirectCount = "newH5DirectCount" + FN.ChannelSettlement.NewH5FissionCount = "newH5FissionCount" + FN.ChannelSettlement.NewH5FormalCount = "newH5FormalCount" + FN.ChannelSettlement.NewH5FormalDeductionCount = "newH5FormalDeductionCount" + FN.ChannelSettlement.NewH5FormalDirectCount = "newH5FormalDirectCount" + FN.ChannelSettlement.NewH5FormalFissionCount = "newH5FormalFissionCount" + FN.ChannelSettlement.NewH5IosCount = "newH5IosCount" + FN.ChannelSettlement.NewH5PcCount = "newH5PcCount" + FN.ChannelSettlement.NewIosCount = "newIosCount" + FN.ChannelSettlement.NewIosDeductionCount = "newIosDeductionCount" + FN.ChannelSettlement.NewIosDirectCount = "newIosDirectCount" + FN.ChannelSettlement.NewIosFissionCount = "newIosFissionCount" + FN.ChannelSettlement.NewLightCount = "newLightCount" + FN.ChannelSettlement.NewLightDeductionCount = "newLightDeductionCount" + FN.ChannelSettlement.NewLightDirectCount = "newLightDirectCount" + FN.ChannelSettlement.NewLightFissionCount = "newLightFissionCount" + FN.ChannelSettlement.NewLightFormalCount = "newLightFormalCount" + FN.ChannelSettlement.NewLightFormalDeductionCount = "newLightFormalDeductionCount" + FN.ChannelSettlement.NewLightFormalDirectCount = "newLightFormalDirectCount" + FN.ChannelSettlement.NewLightFormalFissionCount = "newLightFormalFissionCount" + FN.ChannelSettlement.NewLightGuestCount = "newLightGuestCount" + FN.ChannelSettlement.NewLightGuestDeductionCount = "newLightGuestDeductionCount" + FN.ChannelSettlement.NewLightGuestDirectCount = "newLightGuestDirectCount" + FN.ChannelSettlement.NewLightGuestFissionCount = "newLightGuestFissionCount" + FN.ChannelSettlement.NewLightNaturalCount = "newLightNaturalCount" + FN.ChannelSettlement.NewRechargeAmount = "newRechargeAmount" + FN.ChannelSettlement.NewTotalCount = "newTotalCount" + FN.ChannelSettlement.NewTotalIpCount = "newTotalIpCount" + FN.ChannelSettlement.ParentChannel = "parentChannel" + FN.ChannelSettlement.PromoteMode = "promoteMode" + FN.ChannelSettlement.SumDate = "sumDate" + FN.ChannelSettlement.TotalAmount = "totalAmount" + FN.ChannelSettlement.TotalVisitCount = "totalVisitCount" + FN.ChannelSettlement.Type = "type" + FN.ChannelSettlement.UpdatedAt = "updatedAt" + FN.ChannelSettlement.UserName = "userName" + FN.ChannelSettlement.ValidDeductionCount = "validDeductionCount" + FN.ChannelSettlement.ValidDirectCount = "validDirectCount" + FN.ChannelSettlement.ValidPayCoin = "validPayCoin" + FN.ChannelSettlement.ValidPayMoney = "validPayMoney" + FN.ChannelSettlement.VipPayCoin = "vipPayCoin" + FN.ChannelSettlement.VipPayDeduction = "vipPayDeduction" + FN.ChannelSettlement.VipPayMoney = "vipPayMoney" + FN.ChannelStatYestoday.AndroidRechargeAmount = "androidRechargeAmount" + FN.ChannelStatYestoday.AppId = "appId" + FN.ChannelStatYestoday.Channel = "channel" + FN.ChannelStatYestoday.CreatedAt = "createdAt" + FN.ChannelStatYestoday.DirectAmount = "directAmount" + FN.ChannelStatYestoday.FissionAmount = "fissionAmount" + FN.ChannelStatYestoday.H5RechargeAmount = "h5RechargeAmount" + FN.ChannelStatYestoday.ID = "_id" + FN.ChannelStatYestoday.IosRechargeAmount = "iosRechargeAmount" + FN.ChannelStatYestoday.LightRechargeAmount = "lightRechargeAmount" + FN.ChannelStatYestoday.NewAndroidCount = "newAndroidCount" + FN.ChannelStatYestoday.NewCount = "newCount" + FN.ChannelStatYestoday.NewDirectCount = "newDirectCount" + FN.ChannelStatYestoday.NewFissionCount = "newFissionCount" + FN.ChannelStatYestoday.NewH5Count = "newH5Count" + FN.ChannelStatYestoday.NewH5FormalCount = "newH5FormalCount" + FN.ChannelStatYestoday.NewIncreaseCount = "newIncreaseCount" + FN.ChannelStatYestoday.NewIncreaseRate = "newIncreaseRate" + FN.ChannelStatYestoday.NewIosCount = "newIosCount" + FN.ChannelStatYestoday.NewLightFormalCount = "newLightFormalCount" + FN.ChannelStatYestoday.NewLightGuestCount = "newLightGuestCount" + FN.ChannelStatYestoday.ParentChannel = "parentChannel" + FN.ChannelStatYestoday.RechargeAmount = "rechargeAmount" + FN.ChannelStatYestoday.RechargeIncreaseAmount = "rechargeIncreaseAmount" + FN.ChannelStatYestoday.RechargeIncreaseRate = "rechargeIncreaseRate" + FN.ChannelStatYestoday.Settlement = "settlement" + FN.ChannelStatYestoday.SumDate = "sumDate" + FN.ChannelStatYestoday.UpdatedAt = "updatedAt" + FN.ChannelStatYestoday.VipPayCoin = "vipPayCoin" + FN.ChannelStatYestoday.VipPayDeduction = "vipPayDeduction" + FN.ChannelStatYestoday.VipPayMoney = "vipPayMoney" + FN.ChannelOwnerChange.Channel = "channel" + FN.ChannelOwnerChange.CreatedAt = "createdAt" + FN.ChannelOwnerChange.Account = "account" + FN.ChannelOwnerChange.ID = "_id" + FN.ChannelOwnerChange.Mark = "mark" + FN.ChannelOwnerChange.NewUser = "newUser" + FN.ChannelOwnerChange.OldUser = "oldUser" + FN.ChannelOwnerChange.Operator = "operator" + FN.ChannelOwnerChange.UpdatedAt = "updatedAt" + TN.ChannelInfo = "channel_info" + TN.ChannelDeductionRule = "channel_app_deduction" + TN.ChannelStat = "channel_stat" + TN.ChannelSettlement = "channel_settlement_bak" + TN.ChannelStatYestoday = "channel_stat_yestoday" + TN.ChannelOwnerChange = "channel_owner_change" +} diff --git a/models/channelmod/type.go b/models/channelmod/type.go new file mode 100644 index 0000000..362ef32 --- /dev/null +++ b/models/channelmod/type.go @@ -0,0 +1,596 @@ +package channelmod + +import ( + "strings" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +const ( + OfficialChannelName = "官方" + OfficialChannelDisplayName = "zilai" +) + +var ( + officialChannelNames = []string{OfficialChannelName, OfficialChannelDisplayName} +) + +// 官方渠道 +func IsOfficialChannelName(name string) bool { + for _, value := range officialChannelNames { + if value == name { + return true + } + } + return false +} + +// 官方渠道 或 无渠道码 +func IsOfficialChannelOrEmpty(name string) bool { + name = strings.TrimSpace(name) + if name == "" { + return true + } + for _, value := range officialChannelNames { + if value == name { + return true + } + } + return false +} + +func ChannelDisplayName(name string) string { + if name == OfficialChannelName { + return OfficialChannelDisplayName + } + return name +} + +// 结算方式 +type SettlementWay string + +const ( + SettlementCPA SettlementWay = "cpa" + SettlementCPS SettlementWay = "cps" + SettlementCPT SettlementWay = "cpt" + SettlementCPC SettlementWay = "cpc" + SettlementHZ SettlementWay = "hz" //下载站 +) + +type ChannelType int32 + +const ( + ChannelTypeNone ChannelType = 0 // 无 + ChannelTypeParent ChannelType = 1 // 一级 + ChannelTypeSecond ChannelType = 2 // 二级 + ChannelTypeThird ChannelType = 3 // 三级 + ChannelTypeForth ChannelType = 4 // 四级 + ChannelTypeEnd ChannelType = 10 // End +) + +type ChannelTypeList []ChannelType + +type AppType int32 + +const ( + AppTypeNone AppType = 0 // 所有 + AppTypePkg AppType = 1 // 安装包 + AppTypeLight AppType = 2 // 轻量版 + AppTypeH5 AppType = 3 // H5网页 +) + +type PromoteMode int32 + +const ( + PromoteModeNone PromoteMode = 0 // 所有 + PromoteModeInstall PromoteMode = 1 // 安装 + PromoteModeRegister PromoteMode = 2 // 注册 +) + +func GetChildChannelTypes() ChannelTypeList { + ret := make([]ChannelType, 0) + for i := ChannelTypeParent + 1; i < ChannelTypeEnd; i++ { + ret = append(ret, i) + } + return ret +} + +func GetAllChannelTypes() ChannelTypeList { + ret := make([]ChannelType, 0) + for i := ChannelTypeParent; i < ChannelTypeEnd; i++ { + ret = append(ret, i) + } + return ret +} + +func (l ChannelTypeList) Include(value ChannelType) bool { + for _, ct := range l { + if ct == value { + return true + } + } + return false +} + +type Wallet struct { + Addr1 string `json:"addr1" bson:"addr1"` // 钱包地址1 + Addr2 string `json:"addr2" bson:"addr2"` // 钱包地址2 +} + +// 渠道-代理商 +// @table:channel_info +type ChannelInfo struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + Channel string `bson:"channel" json:"channel"` // 渠道 + AppIds []int32 `bson:"appIds" json:"appIds"` // 渠道对应的app + UserName string `bson:"userName" json:"userName"` // 所有者 + ParentChannel string `bson:"parentChannel" json:"parentChannel"` // 父渠道 如果为空字符串,则为渠道,否则为代理 + ParentAgent string `bson:"parentAgent" json:"parentAgent"` // 父代理 (从二级的子代理开始用ParentAgent描述父子关系) + ChildCount int64 `bson:"childCount" json:"childCount"` // 子渠道数量 + Password string `bson:"password" json:"password"` // 代理商密码 + IP string `bson:"ip" json:"ip"` // ip + Token string `bson:"token" json:"token"` // token + CheckTokenTime time.Time `bson:"checkTokenTime" json:"checkTokenTime"` // 检查Token的时间 + Status bool `bson:"status" json:"status"` // 状态 开/关 + Mobile string `bson:"mobile" json:"mobile"` // 手机号 + Type ChannelType `bson:"type" json:"type"` // 渠道类型:1 一级 2:二级 + Remark string `bson:"remark" json:"remark"` // 备注 + Lock bool `bson:"lock" json:"lock"` // 禁止登陆 + Wallet Wallet `bson:"wallet" json:"wallet"` // 钱包地址 + AutoGenApk bool `bson:"autoGenApk" json:"autoGenApk"` // 自动生成渠道包 + ShowMagic int32 `bson:"showMagic" json:"showMagic"` // 正常显示数据 n>0 展示空白数据 + ChildShowDivideRate bool `bson:"childShowDivideRate" json:"childShowDivideRate"` // 下级是否显示分成比例 + CreatedAt time.Time `bson:"createdAt" json:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` // 更新时间 +} +type ChannelInfoList []*ChannelInfo + +// @table:channel_app_deduction +type ChannelDeductionRule struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + AppId int32 `bson:"appId" json:"appId"` // 应用ID + Channel string `bson:"channel" json:"channel"` // 渠道 + AppName string `bson:"appName" json:"appName"` // 应用名称 + AppType AppType `bson:"appType" json:"appType"` // 应用类型 + PromoteMode PromoteMode `bson:"promoteMode" json:"promoteMode"` // 推广类型 + Settlement SettlementWay `bson:"settlement" json:"settlement"` // 结算方式 cps/cpa/cpt/cpc + First int32 `bson:"first" json:"first"` // 一阶 + Second int32 `bson:"second" json:"second"` // 二阶 + Third int32 `bson:"third" json:"third"` // 三阶 + Fourth int32 `bson:"fourth" json:"fourth"` // 四阶 + Fifth int32 `bson:"fifth" json:"fifth"` // 5阶 + CPAPrice int64 `bson:"cpaPrice" json:"cpaPrice"` // 单价 + CPSRate int64 `bson:"cpsRate" json:"cpsRate"` // CPS 分成比列 0-100 + CPSBegin int64 `bson:"cpsBegin" json:"cpsBegin"` // CPS 开始扣量金额 + CPSDeductionRate int64 `bson:"cpsDeductionRate" json:"cpsDeductionRate"` // CPS 扣量比例 + BeginTime time.Time `bson:"deductionAt" json:"deductionAt"` // 扣量开始时间 + SettlementTime time.Time `bson:"settlementTime" json:"settlementTime"` // 扣量结算时间 + TodayTime time.Time `bson:"todayTime" json:"todayTime"` // 当日时间 + TodayDeduction int64 `bson:"todayDeduction" json:"todayDeduction"` // 当日扣量金额 + LandingPage string `bson:"landingPage" json:"landingPage"` // 落地页 + ProxyDeduction int64 `bson:"proxyDeduction" json:"proxyDeduction"` // 代理扣量比例 + AutoDeduction bool `bson:"autoDeduction" json:"autoDeduction"` // 自动扣量开关 + DivideRate int64 `bson:"divideRate" json:"divideRate"` // 代理分成比例 + LessIncomeRate float64 `bson:"lessIncomeRate" json:"lessIncomeRate"` // 最低收益比 CPA低于该值开启扣量(0.1 - 3.0) + CreatedAt time.Time `bson:"createdAt" json:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` // 更新时间 +} +type ChannelDeductionRuleList []*ChannelDeductionRule + +// 渠道每日统计 +// @table:channel_stat +type ChannelStat struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + Channel string `bson:"channel" json:"channel"` // 渠道 + SumDate time.Time `bson:"sumDate" json:"sumDate"` // 记录时间 15分钟对齐 + AppId int32 `bson:"appId" json:"appId"` // appId + Type ChannelType `bson:"type" json:"type"` // 渠道类型:1 一级 2:二级 + Settlement SettlementWay `bson:"settlement" json:"settlement"` // 结算方式 cps/cpa/cpt/cpc + CPAPrice int64 `bson:"cpaPrice" json:"cpaPrice"` // 单价 + CPSRate int64 `bson:"cpsRate" json:"cpsRate"` // CPS 分成比列 0-100 + AppType AppType `bson:"appType" json:"appType"` // 应用类型 + PromoteMode PromoteMode `bson:"promoteMode" json:"promoteMode"` // 推广类型 + UserName string `bson:"userName" json:"userName"` // 所有者 + ParentChannel string `bson:"parentChannel" json:"parentChannel"` // 父渠道 如果为空字符串,则为渠道,否则为代理 + // 收益及结算 + ValidDirectCount int64 `bson:"validDirectCount,omitempty" json:"validDirectCount"` // 有效直推总数 + ValidDeductionCount int64 `bson:"validDeductionCount,omitempty" json:"validDeductionCount"` // 有效扣量总数 + ValidPayMoney int64 `bson:"validPayMoney,omitempty" json:"validPayMoney"` // 有效收益金额 + ValidPayCoin int64 `bson:"validPayCoin,omitempty" json:"validPayCoin"` // 有效收益金币金额 + IncomeAmount int64 `bson:"IncomeAmount,omitempty" json:"IncomeAmount"` // 收益估算 + IncomeRate float64 `bson:"incomeRate,omitempty" json:"incomeRate"` // 收益比 + IsPay bool `bson:"isPay,omitempty" json:"isPay"` // 是否已结算 + // 注册 + NewTotalIpCount int64 `bson:"newTotalIpCount,omitempty" json:"newTotalIpCount"` // 新增IP总量 + NewTotalCount int64 `bson:"newTotalCount,omitempty" json:"newTotalCount"` // **新增总量 + NewDirectCount int64 `bson:"newDirectCount,omitempty" json:"newDirectCount"` // 新增直推 + NewFissionCount int64 `bson:"newFissionCount,omitempty" json:"newFissionCount"` // 新增裂变 + NewDeductionCount int64 `bson:"newDeductionCount,omitempty" json:"newDeductionCount"` // 新增扣量 + NewAndroidCount int64 `bson:"newAndroidCount,omitempty" json:"newAndroidCount"` // android新增 + NewAndroidDirectCount int64 `bson:"newAndroidDirectCount,omitempty" json:"newAndroidDirectCount"` // 新增安卓直推 + NewAndroidFissionCount int64 `bson:"newAndroidFissionCount,omitempty" json:"newAndroidFissionCount"` // 新增安卓裂变 + NewAndroidDeductionCount int64 `bson:"newAndroidDeductionCount,omitempty" json:"newAndroidDeductionCount"` // 新增安卓扣量 + NewIosCount int64 `bson:"newIosCount,omitempty" json:"newIosCount"` // ios新增 + NewIosDirectCount int64 `bson:"newIosDirectCount,omitempty" json:"newIosDirectCount"` // 新增IOS直推 + NewIosFissionCount int64 `bson:"newIosFissionCount,omitempty" json:"newIosFissionCount"` // 新增IOS裂变 + NewIosDeductionCount int64 `bson:"newIosDeductionCount,omitempty" json:"newIosDeductionCount"` // 新增IOS扣量 + NewLightCount int64 `bson:"newLightCount,omitempty" json:"newLightCount"` // light新增 + NewLightGuestCount int64 `bson:"newLightGuestCount,omitempty" json:"newLightGuestCount"` // **轻量安装 + NewLightGuestDirectCount int64 `bson:"newLightGuestDirectCount,omitempty" json:"newLightGuestDirectCount"` // 新增LightGuest直推 + NewLightGuestFissionCount int64 `bson:"newLightGuestFissionCount,omitempty" json:"newLightGuestFissionCount"` // 新增LightGuest裂变 + NewLightGuestDeductionCount int64 `bson:"newLightGuestDeductionCount,omitempty" json:"newLightGuestDeductionCount"` // 新增LightGuest扣量 + NewLightFormalCount int64 `bson:"newLightFormalCount,omitempty" json:"newLightFormalCount"` // **轻量注册 + NewLightFormalDirectCount int64 `bson:"newLightFormalDirectCount,omitempty" json:"newLightFormalDirectCount"` // 新增LightFormal直推 + NewLightFormalFissionCount int64 `bson:"newLightFormalFissionCount,omitempty" json:"newLightFormalFissionCount"` // 新增LightFormal裂变 + NewLightFormalDeductionCount int64 `bson:"newLightFormalDeductionCount,omitempty" json:"newLightFormalDeductionCount"` // 新增LightFormal扣量 + NewLightDirectCount int64 `bson:"newLightDirectCount,omitempty" json:"newLightDirectCount"` // light新增直推 + NewLightFissionCount int64 `bson:"newLightFissionCount,omitempty" json:"newLightFissionCount"` // light新增裂变 + NewLightDeductionCount int64 `bson:"newLightDeductionCount,omitempty" json:"newLightDeductionCount"` // light新增扣量 + NewLightNaturalCount int64 `bson:"newLightNaturalCount,omitempty" json:"newLightNaturalCount"` // light自然新增 + NewH5Count int64 `bson:"newH5Count,omitempty" json:"newH5Count"` // h5新增 + NewH5DirectCount int64 `bson:"newH5DirectCount,omitempty" json:"newH5DirectCount"` // 新增H5直推 + NewH5FissionCount int64 `bson:"newH5FissionCount,omitempty" json:"newH5FissionCount"` // 新增H5裂变 + NewH5DeductionCount int64 `bson:"newH5DeductionCount,omitempty" json:"newH5DeductionCount"` // 新增H5扣量 + NewH5AndroidCount int64 `bson:"newH5AndroidCount,omitempty" json:"newH5AndroidCount"` // h5安卓新增 + NewH5IosCount int64 `bson:"newH5IosCount,omitempty" json:"newH5IosCount"` // h5苹果新增 + NewH5PcCount int64 `bson:"newH5PcCount,omitempty" json:"newH5PcCount"` // h5电脑新增 + NewH5FormalCount int64 `bson:"newH5FormalCount,omitempty" json:"newH5FormalCount"` // h5注册新增 + NewH5FormalDirectCount int64 `bson:"newH5FormalDirectCount,omitempty" json:"newH5FormalDirectCount"` // 新增H5正式直推 + NewH5FormalFissionCount int64 `bson:"newH5FormalFissionCount,omitempty" json:"newH5FormalFissionCount"` // 新增H5正式裂变 + NewH5FormalDeductionCount int64 `bson:"newH5FormalDeductionCount,omitempty" json:"newH5FormalDeductionCount"` // 新增H5正式扣量 + // 访问 + TotalVisitCount int64 `bson:"totalVisitCount,omitempty" json:"totalVisitCount"` // **总计访问数 + DirectVisitCount int64 `bson:"directVisitCount,omitempty" json:"directVisitCount"` // 直推访问数 + FissionVisitCount int64 `bson:"fissionVisitCount,omitempty" json:"fissionVisitCount"` // 裂变访问数 + AndroidVisitCount int64 `bson:"androidVisitCount,omitempty" json:"androidVisitCount"` // android访问 + IosVisitCount int64 `bson:"iosVisitCount,omitempty" json:"iosVisitCount"` // ios访问 + LightVisitCount int64 `bson:"lightVisitCount,omitempty" json:"lightVisitCount"` // **轻量访问 + LightVisitDirectCount int64 `bson:"lightVisitDirectCount,omitempty" json:"lightVisitDirectCount"` // light访问量直推 + LightVisitFissionCount int64 `bson:"lightVisitFissionCount,omitempty" json:"lightVisitFissionCount"` // light访问量裂变 + LightVisitDeductionCount int64 `bson:"lightVisitDeductionCount,omitempty" json:"lightVisitDeductionCount"` // light访问量扣量 + LightVisitNaturalCount int64 `bson:"lightVisitNaturalCount,omitempty" json:"lightVisitNaturalCount"` // light访问量自然 + H5VisitCount int64 `bson:"h5VisitCount,omitempty" json:"h5VisitCount"` // h5访问 + H5AndroidVisitCount int64 `bson:"h5AndroidVisitCount,omitempty" json:"h5AndroidVisitCount"` // h5安卓访问 + H5IosVisitCount int64 `bson:"h5IosVisitCount,omitempty" json:"h5IosVisitCount"` // h5苹果访问 + H5PcVisitCount int64 `bson:"h5PcVisitCount,omitempty" json:"h5PcVisitCount"` // h5电脑访问 + // 充值统计 + TotalAmount int64 `bson:"totalAmount,omitempty" json:"totalAmount"` // **充值金额总量 + DirectAmount int64 `bson:"directAmount,omitempty" json:"directAmount"` // 直推充值金额 + DirectAmountCount int64 `bson:"directAmountCount,omitempty" json:"directAmountCount"` // 直推充值订单数 + FissionAmount int64 `bson:"fissionAmount,omitempty" json:"fissionAmount"` // 裂变充值金额 + FissionAmountCount int64 `bson:"fissionAmountCount,omitempty" json:"fissionAmountCount"` // 裂变充值订单数 + NaturalAmount int64 `bson:"naturalAmount,omitempty" json:"naturalAmount"` // 自然充值 + NaturalAmountCount int64 `bson:"naturalAmountCount,omitempty" json:"naturalAmountCount"` // 自然充值订单数 + DeductionAmount int64 `bson:"deductionAmount,omitempty" json:"deductionAmount"` // 充值扣量 + DeductionAmountCount int64 `bson:"deductionAmountCount,omitempty" json:"deductionAmountCount"` // 充值扣量次数 + AndroidAmount int64 `bson:"androidAmount,omitempty" json:"androidAmount"` // +安卓充值金额 + AndroidAmountCount int64 `bson:"androidAmountCount,omitempty" json:"androidAmountCount"` // +安卓充值次数 + IosAmount int64 `bson:"iosAmount,omitempty" json:"iosAmount"` // +Ios充值金额 + IosAmountCount int64 `bson:"iosAmountCount,omitempty" json:"iosAmountCount"` // +Ios充值次数 + H5Amount int64 `bson:"h5Amount,omitempty" json:"h5Amount"` // +H5充值金额 + H5AmountCount int64 `bson:"h5AmountCount,omitempty" json:"h5AmountCount"` // +H5充值次数 + LightAmount int64 `bson:"lightAmount,omitempty" json:"lightAmount"` // light充值金额 + LightAmountCount int64 `bson:"lightAmountCount,omitempty" json:"lightAmountCount"` // light充值次数 + LightDirectAmount int64 `bson:"lightDirectAmount,omitempty" json:"lightDirectAmount"` // light充值金额直推 + LightDirectAmountCount int64 `bson:"lightDirectAmountCount,omitempty" json:"lightDirectAmountCount"` // light充值次数直推 + LightFissionAmount int64 `bson:"lightFissionAmount,omitempty" json:"lightFissionAmount"` // light充值金额裂变 + LightFissionAmountCount int64 `bson:"lightFissionAmountCount,omitempty" json:"lightFissionAmountCount"` // light充值次数裂变 + LightDeductionAmount int64 `bson:"lightDeductionAmount,omitempty" json:"lightDeductionAmount"` // light充值金额扣量 + LightDeductionAmountCount int64 `bson:"lightDeductionAmountCount,omitempty" json:"lightDeductionAmountCount"` // light充值次数扣量 + LightNaturalAmount int64 `bson:"lightNaturalAmount,omitempty" json:"lightNaturalAmount"` // light充值金额自然 + LightNaturalAmountCount int64 `bson:"lightNaturalAmountCount,omitempty" json:"lightNaturalAmountCount"` // light充值次数自然 + // 其他充值 + NewRechargeAmount int64 `bson:"newRechargeAmount,omitempty" json:"newRechargeAmount"` // 新增充值金额 + VipPayMoney int64 `bson:"vipPayMoney,omitempty" json:"vipPayMoney"` // 购买会员金额(CPS扣量后) + VipPayCoin int64 `bson:"vipPayCoin,omitempty" json:"vipPayCoin"` // 金币购买会员数量 + VipPayDeduction int64 `bson:"vipPayDeduction,omitempty" json:"vipPayDeduction"` // 购买会员金额(CPS扣量) + GameRechageAmount int64 `bson:"gameRechageAmount,omitempty" json:"gameRechageAmount"` // 游戏充值 + GameWithdrawAmount int64 `bson:"gameWithdrawAmount,omitempty" json:"gameWithdrawAmount"` // 游戏提现 + // 落地页访问 + LandPageVisitCount int64 `bson:"landPageVisitCount,omitempty" json:"landPageVisitCount"` // 落地页访问次数 + LandpageAndroidClick int64 `bson:"landpageAndroidClick,omitempty" json:"landpageAndroidClick"` // 落地页android访问次数 + LandpageIosAppstoreClick int64 `bson:"landpageIosAppstoreClick,omitempty" json:"landpageIosAppstoreClick"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick int64 `bson:"landpageIosAthorClick,omitempty" json:"landpageIosAthorClick"` // 落地页iOS其他包访问次数 + LandpageIosH5Click int64 `bson:"landpageIosH5Click,omitempty" json:"landpageIosH5Click"` // 落地页H5访问次数 + // 留存率 + Day1RetainRate float64 `bson:"day1RetainRate,omitempty" json:"day1RetainRate"` // 次日留存率 + Day3RetainRate float64 `bson:"day3RetainRate,omitempty" json:"day3RetainRate"` // 3日留存率 + Day7RetainRate float64 `bson:"day7RetainRate,omitempty" json:"day7RetainRate"` // 7日留存率 + // 时间 + UpdatedAt time.Time `bson:"updatedAt,omitempty" json:"updatedAt"` // 更新时间 + CreatedAt time.Time `bson:"createdAt" json:"createdAt"` // 创建时间 +} + +type ChannelStatList []*ChannelStat + +type ChannelStatDoc struct { + // 收益及结算 + ValidDirectCount *int64 `bson:"validDirectCount,omitempty" json:"validDirectCount"` // 有效直推总数 + ValidDeductionCount *int64 `bson:"validDeductionCount,omitempty" json:"validDeductionCount"` // 有效扣量总数 + ValidPayMoney *int64 `bson:"validPayMoney,omitempty" json:"validPayMoney"` // 有效收益会员金额 + ValidPayCoin *int64 `bson:"validPayCoin,omitempty" json:"validPayCoin"` // 有效收益金币金额 + IncomeAmount *int64 `bson:"IncomeAmount,omitempty" json:"IncomeAmount"` // 收益估算 + IncomeRate *float64 `bson:"incomeRate,omitempty" json:"incomeRate"` // 收益比 + IsPay *bool `bson:"isPay,omitempty" json:"isPay"` // 是否已结算 + // 注册 + NewTotalIpCount *int64 `bson:"newTotalIpCount,omitempty" json:"newTotalIpCount"` // 新增IP总量 + NewTotalCount *int64 `bson:"newTotalCount,omitempty" json:"newTotalCount"` // **新增总量 + NewDirectCount *int64 `bson:"newDirectCount,omitempty" json:"newDirectCount"` // 新增直推 + NewFissionCount *int64 `bson:"newFissionCount,omitempty" json:"newFissionCount"` // 新增裂变 + NewDeductionCount *int64 `bson:"newDeductionCount,omitempty" json:"newDeductionCount"` // 新增扣量 + + NewAndroidCount *int64 `bson:"newAndroidCount,omitempty" json:"newAndroidCount"` // android新增 + NewAndroidDirectCount *int64 `bson:"newAndroidDirectCount,omitempty" json:"newAndroidDirectCount"` // 新增安卓直推 + NewAndroidFissionCount *int64 `bson:"newAndroidFissionCount,omitempty" json:"newAndroidFissionCount"` // 新增安卓裂变 + NewAndroidDeductionCount *int64 `bson:"newAndroidDeductionCount,omitempty" json:"newAndroidDeductionCount"` // 新增安卓扣量 + + NewIosCount *int64 `bson:"newIosCount,omitempty" json:"newIosCount"` // ios新增 + NewIosDirectCount *int64 `bson:"newIosDirectCount,omitempty" json:"newIosDirectCount"` // 新增IOS直推 + NewIosFissionCount *int64 `bson:"newIosFissionCount,omitempty" json:"newIosFissionCount"` // 新增IOS裂变 + NewIosDeductionCount *int64 `bson:"newIosDeductionCount,omitempty" json:"newIosDeductionCount"` // 新增IOS扣量 + + NewLightCount *int64 `bson:"newLightCount,omitempty" json:"newLightCount"` // light新增 + + NewLightGuestCount *int64 `bson:"newLightGuestCount,omitempty" json:"newLightGuestCount"` // **轻量安装 + NewLightGuestDirectCount *int64 `bson:"newLightGuestDirectCount,omitempty" json:"newLightGuestDirectCount"` // 新增LightGuest直推 + NewLightGuestFissionCount *int64 `bson:"newLightGuestFissionCount,omitempty" json:"newLightGuestFissionCount"` // 新增LightGuest裂变 + NewLightGuestDeductionCount *int64 `bson:"newLightGuestDeductionCount,omitempty" json:"newLightGuestDeductionCount"` // 新增LightGuest扣量 + + NewLightFormalCount *int64 `bson:"newLightFormalCount,omitempty" json:"newLightFormalCount"` // **轻量注册 + NewLightFormalDirectCount *int64 `bson:"newLightFormalDirectCount,omitempty" json:"newLightFormalDirectCount"` // 新增LightFormal直推 + NewLightFormalFissionCount *int64 `bson:"newLightFormalFissionCount,omitempty" json:"newLightFormalFissionCount"` // 新增LightFormal裂变 + NewLightFormalDeductionCount *int64 `bson:"newLightFormalDeductionCount,omitempty" json:"newLightFormalDeductionCount"` // 新增LightFormal扣量 + + NewLightDirectCount *int64 `bson:"newLightDirectCount,omitempty" json:"newLightDirectCount"` // light新增直推 + NewLightFissionCount *int64 `bson:"newLightFissionCount,omitempty" json:"newLightFissionCount"` // light新增裂变 + NewLightDeductionCount *int64 `bson:"newLightDeductionCount,omitempty" json:"newLightDeductionCount"` // light新增扣量 + NewLightNaturalCount *int64 `bson:"newLightNaturalCount,omitempty" json:"newLightNaturalCount"` // light自然新增 + NewH5Count *int64 `bson:"newH5Count,omitempty" json:"newH5Count"` // h5新增 + NewH5DirectCount *int64 `bson:"newH5DirectCount,omitempty" json:"newH5DirectCount"` // 新增H5直推 + NewH5FissionCount *int64 `bson:"newH5FissionCount,omitempty" json:"newH5FissionCount"` // 新增H5裂变 + NewH5DeductionCount *int64 `bson:"newH5DeductionCount,omitempty" json:"newH5DeductionCount"` // 新增H5扣量 + NewH5AndroidCount *int64 `bson:"newH5AndroidCount,omitempty" json:"newH5AndroidCount"` // h5安卓新增 + NewH5IosCount *int64 `bson:"newH5IosCount,omitempty" json:"newH5IosCount"` // h5苹果新增 + NewH5PcCount *int64 `bson:"newH5PcCount,omitempty" json:"newH5PcCount"` // h5电脑新增 + NewH5FormalCount *int64 `bson:"newH5FormalCount,omitempty" json:"newH5FormalCount"` // h5注册新增 + NewH5FormalDirectCount *int64 `bson:"newH5FormalDirectCount,omitempty" json:"newH5FormalDirectCount"` // 新增H5正式直推 + NewH5FormalFissionCount *int64 `bson:"newH5FormalFissionCount,omitempty" json:"newH5FormalFissionCount"` // 新增H5正式裂变 + NewH5FormalDeductionCount *int64 `bson:"newH5FormalDeductionCount,omitempty" json:"newH5FormalDeductionCount"` // 新增H5正式扣量 + // 访问 + TotalVisitCount *int64 `bson:"totalVisitCount,omitempty" json:"totalVisitCount"` // **总计访问数 + DirectVisitCount *int64 `bson:"directVisitCount,omitempty" json:"directVisitCount"` // 直推访问数 + FissionVisitCount *int64 `bson:"fissionVisitCount,omitempty" json:"fissionVisitCount"` // 裂变访问数 + AndroidVisitCount *int64 `bson:"androidVisitCount,omitempty" json:"androidVisitCount"` // android访问 + IosVisitCount *int64 `bson:"iosVisitCount,omitempty" json:"iosVisitCount"` // ios访问 + LightVisitCount *int64 `bson:"lightVisitCount,omitempty" json:"lightVisitCount"` // **轻量访问 + LightVisitDirectCount *int64 `bson:"lightVisitDirectCount,omitempty" json:"lightVisitDirectCount"` // light访问量直推 + LightVisitFissionCount *int64 `bson:"lightVisitFissionCount,omitempty" json:"lightVisitFissionCount"` // light访问量裂变 + LightVisitDeductionCount *int64 `bson:"lightVisitDeductionCount,omitempty" json:"lightVisitDeductionCount"` // light访问量扣量 + LightVisitNaturalCount *int64 `bson:"lightVisitNaturalCount,omitempty" json:"lightVisitNaturalCount"` // light访问量自然 + H5VisitCount *int64 `bson:"h5VisitCount,omitempty" json:"h5VisitCount"` // h5访问 + H5AndroidVisitCount *int64 `bson:"h5AndroidVisitCount,omitempty" json:"h5AndroidVisitCount"` // h5安卓访问 + H5IosVisitCount *int64 `bson:"h5IosVisitCount,omitempty" json:"h5IosVisitCount"` // h5苹果访问 + H5PcVisitCount *int64 `bson:"h5PcVisitCount,omitempty" json:"h5PcVisitCount"` // h5电脑访问 + // 充值统计 + TotalAmount *int64 `bson:"totalAmount,omitempty" json:"totalAmount"` // **充值金额总量 + DirectAmount *int64 `bson:"directAmount,omitempty" json:"directAmount"` // 直推充值金额 + DirectAmountCount *int64 `bson:"directAmountCount,omitempty" json:"directAmountCount"` // 直推充值订单数 + FissionAmount *int64 `bson:"fissionAmount,omitempty" json:"fissionAmount"` // 裂变充值金额 + FissionAmountCount *int64 `bson:"fissionAmountCount,omitempty" json:"fissionAmountCount"` // 裂变充值订单数 + NaturalAmount *int64 `bson:"naturalAmount,omitempty" json:"naturalAmount"` // 自然充值 + NaturalAmountCount *int64 `bson:"naturalAmountCount,omitempty" json:"naturalAmountCount"` // 自然充值订单数 + DeductionAmount *int64 `bson:"deductionAmount,omitempty" json:"deductionAmount"` // 充值扣量 + DeductionAmountCount *int64 `bson:"deductionAmountCount,omitempty" json:"deductionAmountCount"` // 充值扣量次数 + AndroidAmount *int64 `bson:"androidAmount,omitempty" json:"androidAmount"` // +安卓充值金额 + AndroidAmountCount *int64 `bson:"androidAmountCount,omitempty" json:"androidAmountCount"` // +安卓充值次数 + IosAmount *int64 `bson:"iosAmount,omitempty" json:"iosAmount"` // +Ios充值金额 + IosAmountCount *int64 `bson:"iosAmountCount,omitempty" json:"iosAmountCount"` // +Ios充值次数 + H5Amount *int64 `bson:"h5Amount,omitempty" json:"h5Amount"` // +H5充值金额 + H5AmountCount *int64 `bson:"h5AmountCount,omitempty" json:"h5AmountCount"` // +H5充值次数 + LightAmount *int64 `bson:"lightAmount,omitempty" json:"lightAmount"` // light充值金额 + LightAmountCount *int64 `bson:"lightAmountCount,omitempty" json:"lightAmountCount"` // light充值次数 + LightDirectAmount *int64 `bson:"lightDirectAmount,omitempty" json:"lightDirectAmount"` // light充值金额直推 + LightDirectAmountCount *int64 `bson:"lightDirectAmountCount,omitempty" json:"lightDirectAmountCount"` // light充值次数直推 + LightFissionAmount *int64 `bson:"lightFissionAmount,omitempty" json:"lightFissionAmount"` // light充值金额裂变 + LightFissionAmountCount *int64 `bson:"lightFissionAmountCount,omitempty" json:"lightFissionAmountCount"` // light充值次数裂变 + LightDeductionAmount *int64 `bson:"lightDeductionAmount,omitempty" json:"lightDeductionAmount"` // light充值金额扣量 + LightDeductionAmountCount *int64 `bson:"lightDeductionAmountCount,omitempty" json:"lightDeductionAmountCount"` // light充值次数扣量 + LightNaturalAmount *int64 `bson:"lightNaturalAmount,omitempty" json:"lightNaturalAmount"` // light充值金额自然 + LightNaturalAmountCount *int64 `bson:"lightNaturalAmountCount,omitempty" json:"lightNaturalAmountCount"` // light充值次数自然 + // 其他充值 + NewRechargeAmount *int64 `bson:"newRechargeAmount,omitempty" json:"newRechargeAmount"` // 新增充值金额 + VipPayMoney *int64 `bson:"vipPayMoney,omitempty" json:"vipPayMoney"` // 购买会员金额(CPS扣量后) + VipPayCoin *int64 `bson:"vipPayCoin,omitempty" json:"vipPayCoin"` // 金币购买会员数量 + VipPayDeduction *int64 `bson:"vipPayDeduction,omitempty" json:"vipPayDeduction"` // 购买会员金额(CPS扣量) + GameRechageAmount *int64 `bson:"gameRechageAmount,omitempty" json:"gameRechageAmount"` // 游戏充值 + GameWithdrawAmount *int64 `bson:"gameWithdrawAmount,omitempty" json:"gameWithdrawAmount"` // 游戏提现 + // 落地页访问 + LandPageVisitCount *int64 `bson:"landPageVisitCount,omitempty" json:"landPageVisitCount"` // 落地页访问次数 + LandpageAndroidClick *int64 `bson:"landpageAndroidClick,omitempty" json:"landpageAndroidClick"` // 落地页android访问次数 + LandpageIosAppstoreClick *int64 `bson:"landpageIosAppstoreClick,omitempty" json:"landpageIosAppstoreClick"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick *int64 `bson:"landpageIosAthorClick,omitempty" json:"landpageIosAthorClick"` // 落地页iOS其他包访问次数 + LandpageIosH5Click *int64 `bson:"landpageIosH5Click,omitempty" json:"landpageIosH5Click"` // 落地页H5访问次数 + // 留存率 + Day1RetainRate *float64 `bson:"day1RetainRate,omitempty" json:"day1RetainRate"` // 次日留存率 + Day3RetainRate *float64 `bson:"day3RetainRate,omitempty" json:"day3RetainRate"` // 3日留存率 + Day7RetainRate *float64 `bson:"day7RetainRate,omitempty" json:"day7RetainRate"` // 7日留存率 + // 时间 + UpdatedAt *time.Time `bson:"updatedAt,omitempty" json:"updatedAt"` // 更新时间 +} + +// 渠道结算---每15分钟根据扣量规则结算 +// @table:channel_settlement_bak +type ChannelSettlement struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + Channel string `bson:"channel" json:"channel"` // 渠道 + SumDate time.Time `bson:"sumDate" json:"sumDate"` // 记录时间 15分钟对齐 + AppId int32 `bson:"appId" json:"appId"` // appId + AppType AppType `bson:"appType" json:"appType"` // 应用类型 + PromoteMode PromoteMode `bson:"promoteMode" json:"promoteMode"` // 推广类型 + Type ChannelType `bson:"type" json:"type"` // 渠道类型:1 一级 2:二级 + UserName string `bson:"userName" json:"userName"` // 所有者 + ParentChannel string `bson:"parentChannel" json:"parentChannel"` // 父渠道 如果为空字符串,则为渠道,否则为代理 + ValidDirectCount int64 `bson:"validDirectCount,omitempty" json:"validDirectCount"` // 有效直推总数 + ValidDeductionCount int64 `bson:"validDeductionCount,omitempty" json:"validDeductionCount"` // 有效扣量总数 + ValidPayMoney int64 `bson:"validPayMoney,omitempty" json:"validPayMoney"` // 有效收益会员金额 + ValidPayCoin int64 `bson:"validPayCoin,omitempty" json:"validPayCoin"` // 有效收益金币金额 + // 注册用户 + NewTotalIpCount int64 `bson:"newTotalIpCount,omitempty" json:"newTotalIpCount"` // 新增IP总量 + NewTotalCount int64 `bson:"newTotalCount,omitempty" json:"newTotalCount"` // 新增总量 + NewDirectCount int64 `bson:"newDirectCount,omitempty" json:"newDirectCount"` // 新增直推 + NewFissionCount int64 `bson:"newFissionCount,omitempty" json:"newFissionCount"` // 新增裂变 + NewDeductionCount int64 `bson:"newDeductionCount,omitempty" json:"newDeductionCount"` // 新增扣量 + + NewAndroidCount int64 `bson:"newAndroidCount,omitempty" json:"newAndroidCount"` // android新增 + NewAndroidDirectCount int64 `bson:"newAndroidDirectCount,omitempty" json:"newAndroidDirectCount"` // 新增安卓直推 + NewAndroidFissionCount int64 `bson:"newAndroidFissionCount,omitempty" json:"newAndroidFissionCount"` // 新增安卓裂变 + NewAndroidDeductionCount int64 `bson:"newAndroidDeductionCount,omitempty" json:"newAndroidDeductionCount"` // 新增安卓扣量 + + NewIosCount int64 `bson:"newIosCount,omitempty" json:"newIosCount"` // ios新增 + NewIosDirectCount int64 `bson:"newIosDirectCount,omitempty" json:"newIosDirectCount"` // 新增IOS直推 + NewIosFissionCount int64 `bson:"newIosFissionCount,omitempty" json:"newIosFissionCount"` // 新增IOS裂变 + NewIosDeductionCount int64 `bson:"newIosDeductionCount,omitempty" json:"newIosDeductionCount"` // 新增IOS扣量 + + NewLightCount int64 `bson:"newLightCount,omitempty" json:"newLightCount"` // light新增 + NewLightDirectCount int64 `bson:"newLightDirectCount,omitempty" json:"newLightDirectCount"` // light新增直推 + NewLightFissionCount int64 `bson:"newLightFissionCount,omitempty" json:"newLightFissionCount"` // light新增裂变 + NewLightDeductionCount int64 `bson:"newLightDeductionCount,omitempty" json:"newLightDeductionCount"` // light新增扣量 + NewLightNaturalCount int64 `bson:"newLightNaturalCount,omitempty" json:"newLightNaturalCount"` // light自然新增 + + NewLightGuestCount int64 `bson:"newLightGuestCount,omitempty" json:"newLightGuestCount"` // **轻量安装 + NewLightGuestDirectCount int64 `bson:"newLightGuestDirectCount,omitempty" json:"newLightGuestDirectCount"` // 新增LightGuest直推 + NewLightGuestFissionCount int64 `bson:"newLightGuestFissionCount,omitempty" json:"newLightGuestFissionCount"` // 新增LightGuest裂变 + NewLightGuestDeductionCount int64 `bson:"newLightGuestDeductionCount,omitempty" json:"newLightGuestDeductionCount"` // 新增LightGuest扣量 + + NewLightFormalCount int64 `bson:"newLightFormalCount,omitempty" json:"newLightFormalCount"` // **轻量注册 + NewLightFormalDirectCount int64 `bson:"newLightFormalDirectCount,omitempty" json:"newLightFormalDirectCount"` // 新增LightFormal直推 + NewLightFormalFissionCount int64 `bson:"newLightFormalFissionCount,omitempty" json:"newLightFormalFissionCount"` // 新增LightFormal裂变 + NewLightFormalDeductionCount int64 `bson:"newLightFormalDeductionCount,omitempty" json:"newLightFormalDeductionCount"` // 新增LightFormal扣量 + + NewH5Count int64 `bson:"newH5Count,omitempty" json:"newH5Count"` // h5新增安装 + NewH5DirectCount int64 `bson:"newH5DirectCount,omitempty" json:"newH5DirectCount"` // 新增H5直推 + NewH5FissionCount int64 `bson:"newH5FissionCount,omitempty" json:"newH5FissionCount"` // 新增H5裂变 + NewH5DeductionCount int64 `bson:"newH5DeductionCount,omitempty" json:"newH5DeductionCount"` // 新增H5扣量 + NewH5AndroidCount int64 `bson:"newH5AndroidCount,omitempty" json:"newH5AndroidCount"` // h5安卓新增 + NewH5IosCount int64 `bson:"newH5IosCount,omitempty" json:"newH5IosCount"` // h5苹果新增 + NewH5PcCount int64 `bson:"newH5PcCount,omitempty" json:"newH5PcCount"` // h5电脑新增 + NewH5FormalCount int64 `bson:"newH5FormalCount,omitempty" json:"newH5FormalCount"` // h5注册新增 + NewH5FormalDirectCount int64 `bson:"newH5FormalDirectCount,omitempty" json:"newH5FormalDirectCount"` // 新增H5正式直推 + NewH5FormalFissionCount int64 `bson:"newH5FormalFissionCount,omitempty" json:"newH5FormalFissionCount"` // 新增H5正式裂变 + NewH5FormalDeductionCount int64 `bson:"newH5FormalDeductionCount,omitempty" json:"newH5FormalDeductionCount"` // 新增H5正式扣量 + // 访问统计 + TotalVisitCount int64 `bson:"totalVisitCount,omitempty" json:"totalVisitCount"` // **总计访问数 + DirectVisitCount int64 `bson:"directVisitCount,omitempty" json:"directVisitCount"` // 直推访问数 + FissionVisitCount int64 `bson:"fissionVisitCount,omitempty" json:"fissionVisitCount"` // 裂变访问数 + AndroidVisitCount int64 `bson:"androidVisitCount,omitempty" json:"androidVisitCount"` // android访问 + IosVisitCount int64 `bson:"iosVisitCount,omitempty" json:"iosVisitCount"` // ios访问 + LightVisitCount int64 `bson:"lightVisitCount,omitempty" json:"lightVisitCount"` // **轻量访问 + LightVisitDirectCount int64 `bson:"lightVisitDirectCount" json:"lightVisitDirectCount"` // light访问量直推 + LightVisitFissionCount int64 `bson:"lightVisitFissionCount" json:"lightVisitFissionCount"` // light访问量裂变 + LightVisitDeductionCount int64 `bson:"lightVisitDeductionCount" json:"lightVisitDeductionCount"` // light访问量扣量 + LightVisitNaturalCount int64 `bson:"lightVisitNaturalCount" json:"lightVisitNaturalCount"` // light访问量自然 + H5VisitCount int64 `bson:"h5VisitCount,omitempty" json:"h5VisitCount"` // h5访问 + H5AndroidVisitCount int64 `bson:"h5AndroidVisitCount,omitempty" json:"h5AndroidVisitCount"` // h5安卓访问 + H5IosVisitCount int64 `bson:"h5IosVisitCount,omitempty" json:"h5IosVisitCount"` // h5苹果访问 + H5PcVisitCount int64 `bson:"h5PcVisitCount,omitempty" json:"h5PcVisitCount"` // h5电脑访问 + // 充值统计 + TotalAmount int64 `bson:"totalAmount,omitempty" json:"totalAmount"` // **充值金额总量 + DirectAmount int64 `bson:"directAmount,omitempty" json:"directAmount"` // 直推充值金额 + DirectAmountCount int64 `bson:"directAmountCount,omitempty" json:"directAmountCount"` // 直推充值订单数 + FissionAmount int64 `bson:"fissionAmount,omitempty" json:"fissionAmount"` // 裂变充值金额 + FissionAmountCount int64 `bson:"fissionAmountCount,omitempty" json:"fissionAmountCount"` // 裂变充值订单数 + NaturalAmount int64 `bson:"naturalAmount,omitempty" json:"naturalAmount"` // 自然充值 + NaturalAmountCount int64 `bson:"naturalAmountCount,omitempty" json:"naturalAmountCount"` // 自然充值订单数 + DeductionAmount int64 `bson:"deductionAmount,omitempty" json:"deductionAmount"` // 充值扣量 + DeductionAmountCount int64 `bson:"deductionAmountCount,omitempty" json:"deductionAmountCount"` // 充值扣量次数 + AndroidAmount int64 `bson:"androidAmount,omitempty" json:"androidAmount"` // +安卓充值金额 + AndroidAmountCount int64 `bson:"androidAmountCount,omitempty" json:"androidAmountCount"` // +安卓充值次数 + IosAmount int64 `bson:"iosAmount,omitempty" json:"iosAmount"` // +Ios充值金额 + IosAmountCount int64 `bson:"iosAmountCount,omitempty" json:"iosAmountCount"` // +Ios充值次数 + H5Amount int64 `bson:"h5Amount,omitempty" json:"h5Amount"` // +H5充值金额 + H5AmountCount int64 `bson:"h5AmountCount,omitempty" json:"h5AmountCount"` // +H5充值次数 + LightAmount int64 `bson:"lightAmount,omitempty" json:"lightAmount"` // light充值金额 + LightAmountCount int64 `bson:"lightAmountCount,omitempty" json:"lightAmountCount"` // light充值次数 + LightDirectAmount int64 `bson:"lightDirectAmount,omitempty" json:"lightDirectAmount"` // light充值金额直推 + LightDirectAmountCount int64 `bson:"lightDirectAmountCount,omitempty" json:"lightDirectAmountCount"` // light充值次数直推 + LightFissionAmount int64 `bson:"lightFissionAmount,omitempty" json:"lightFissionAmount"` // light充值金额裂变 + LightFissionAmountCount int64 `bson:"lightFissionAmountCount,omitempty" json:"lightFissionAmountCount"` // light充值次数裂变 + LightDeductionAmount int64 `bson:"lightDeductionAmount,omitempty" json:"lightDeductionAmount"` // light充值金额扣量 + LightDeductionAmountCount int64 `bson:"lightDeductionAmountCount,omitempty" json:"lightDeductionAmountCount"` // light充值次数扣量 + LightNaturalAmount int64 `bson:"lightNaturalAmount,omitempty" json:"lightNaturalAmount"` // light充值金额自然 + LightNaturalAmountCount int64 `bson:"lightNaturalAmountCount,omitempty" json:"lightNaturalAmountCount"` // light充值次数自然 + // 其他充值统计 + NewRechargeAmount int64 `bson:"newRechargeAmount,omitempty" json:"newRechargeAmount"` // 新增充值金额 + VipPayMoney int64 `bson:"vipPayMoney,omitempty" json:"vipPayMoney"` // 购买会员金额(CPS扣量后) + VipPayCoin int64 `bson:"vipPayCoin,omitempty" json:"vipPayCoin"` // 金币购买会员数量 + VipPayDeduction int64 `bson:"vipPayDeduction,omitempty" json:"vipPayDeduction"` // 购买会员金额(CPS扣量) + GameRechageAmount int64 `bson:"gameRechageAmount,omitempty" json:"gameRechageAmount"` // 游戏充值 + GameWithdrawAmount int64 `bson:"gameWithdrawAmount,omitempty" json:"gameWithdrawAmount"` // 游戏提现 + // 落地页访问 + LandPageVisitCount int64 `bson:"landPageVisitCount,omitempty" json:"landPageVisitCount"` // 落地页访问次数 + LandpageAndroidClick int64 `bson:"landpageAndroidClick,omitempty" json:"landpageAndroidClick"` // 落地页android访问次数 + LandpageIosAppstoreClick int64 `bson:"landpageIosAppstoreClick,omitempty" json:"landpageIosAppstoreClick"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick int64 `bson:"landpageIosAthorClick,omitempty" json:"landpageIosAthorClick"` // 落地页iOS其他包访问次数 + LandpageIosH5Click int64 `bson:"landpageIosH5Click,omitempty" json:"landpageIosH5Click"` // 落地页H5访问次数 + // 时间 + UpdatedAt time.Time `bson:"updatedAt,omitempty" json:"updatedAt"` // 更新时间 + CreatedAt time.Time `bson:"createdAt,omitempty" json:"createdAt"` // 创建时间 +} +type ChannelSettlementList []*ChannelSettlement + +// 渠道每日统计 +// @table:channel_stat_yestoday +type ChannelStatYesterday struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + Channel string `bson:"channel" json:"channel"` // 渠道 + SumDate time.Time `bson:"sumDate" json:"sumDate"` // 记录时间 15分钟对齐 + AppId int32 `bson:"appId" json:"appId"` // appId + Settlement SettlementWay `bson:"settlement" json:"settlement"` // 结算方式 cps/cpa/cpt/cpc + ParentChannel string `bson:"parentChannel" json:"parentChannel"` // 父渠道 如果为空字符串,则为渠道,否则为代理 + // 注册 + NewCount int64 `bson:"newCount,omitempty" json:"newCount"` // 新增 + NewDirectCount int64 `bson:"newDirectCount,omitempty" json:"newDirectCount"` // 新增直推 + NewFissionCount int64 `bson:"newFissionCount,omitempty" json:"newFissionCount"` // 新增裂变 + NewAndroidCount int64 `bson:"newAndroidCount,omitempty" json:"newAndroidCount"` // android新增 + NewIosCount int64 `bson:"newIosCount,omitempty" json:"newIosCount"` // ios新增 + NewH5Count int64 `bson:"newH5Count,omitempty" json:"newH5Count"` // h5新增(guest) + NewH5FormalCount int64 `bson:"newH5FormalCount,omitempty" json:"newH5FormalCount"` // h5注册新增 + NewLightGuestCount int64 `bson:"newLightGuestCount,omitempty" json:"newLightGuestCount"` // 轻量安装 + NewLightFormalCount int64 `bson:"newLightFormalCount,omitempty" json:"newLightFormalCount"` // 轻量注册 + NewIncreaseCount int64 `bson:"newIncreaseCount,omitempty" json:"newIncreaseCount"` // 新增增长 + NewIncreaseRate string `bson:"newIncreaseRate,omitempty" json:"newIncreaseRate"` // 新增增长比例 对比昨天同时段 + // 充值 + RechargeAmount int64 `bson:"rechargeAmount,omitempty" json:"rechargeAmount"` // **充值金额 + DirectAmount int64 `bson:"directAmount,omitempty" json:"directAmount"` // 直推充值金额 + FissionAmount int64 `bson:"fissionAmount,omitempty" json:"fissionAmount"` // 裂变充值金额 + AndroidRechargeAmount int64 `bson:"androidRechargeAmount,omitempty" json:"androidRechargeAmount"` // android充值金额 + IosRechargeAmount int64 `bson:"iosRechargeAmount,omitempty" json:"iosRechargeAmount"` // ios充值金额 + H5RechargeAmount int64 `bson:"h5RechargeAmount,omitempty" json:"h5RechargeAmount"` // h5充值金额 + LightRechargeAmount int64 `bson:"lightRechargeAmount,omitempty" json:"lightRechargeAmount"` // **light充值金额 + RechargeIncreaseAmount int64 `bson:"rechargeIncreaseAmount,omitempty" json:"rechargeIncreaseAmount"` // 充值增长 + RechargeIncreaseRate string `bson:"rechargeIncreaseRate,omitempty" json:"rechargeIncreaseRate"` // 充值增长比例 对比昨天同时段 + // 其他充值 + VipPayCoin int64 `bson:"vipPayCoin,omitempty" json:"vipPayCoin"` // 金币购买会员数量 + VipPayMoney int64 `bson:"vipPayMoney,omitempty" json:"vipPayMoney"` // 购买会员金额(CPS扣量后) + VipPayDeduction int64 `bson:"vipPayDeduction,omitempty" json:"vipPayDeduction"` // 购买会员金额(CPS扣量) + // + UpdatedAt time.Time `bson:"updatedAt,omitempty" json:"updatedAt"` // 更新时间 + CreatedAt time.Time `bson:"createdAt,omitempty" json:"createdAt"` // 创建时间 +} +type ChannelStatYestodayList []*ChannelStatYesterday + +// 渠道所有者变更记录 +// @table:channel_owner_change +type ChannelOwnerChange struct { + ID primitive.ObjectID `json:"id" bson:"_id"` // ID + Channel string `json:"channel" bson:"channel"` // 渠道 + OldUser string `json:"oldUser" bson:"oldUser"` // 变更前的所有者 + NewUser string `json:"newUser" bson:"newUser"` // 变更后的所有者 + Mark string `json:"mark" bson:"mark"` // 备注 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 更新时间 + Operator string `json:"operator" bson:"operator"` // 操作者 + Account string `json:"account" bson:"account"` // 操作账号 +} +type ChannelOwnerChangeList []*ChannelOwnerChange diff --git a/models/channelpackage/channelpackage.go b/models/channelpackage/channelpackage.go new file mode 100644 index 0000000..6c121b8 --- /dev/null +++ b/models/channelpackage/channelpackage.go @@ -0,0 +1,121 @@ +package channelpackage + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/stdLog" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollChannelPackage) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.ChannelPackage.AppId, Value: 1}, + {Key: FN.ChannelPackage.Channel, Value: 1}, + {Key: FN.ChannelPackage.Version, Value: 1}, + {Key: FN.ChannelPackage.FileName, Value: 1}, + }, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{ + {Key: FN.ChannelPackage.AppId, Value: 1}, + {Key: FN.ChannelPackage.Channel, Value: 1}, + {Key: FN.ChannelPackage.Version, Value: 1}, + {Key: FN.ChannelPackage.FileName, Value: 1}, + {Key: FN.ChannelPackage.Status, Value: 1}, + }, + }, + } + + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollChannelPackage, err)) + } +} + +// InsertOneChannelPackage 插入一个应用 +func InsertOneChannelPackage(ctx context.Context, ChannelPackage *ChannelPackage) *stdLog.SrvErr { + if _, err := db.InsertOne(ctx, ChannelPackage); err != nil { + log.Warn("media:InsertOneChannelPackage db.InsertOne failed", log.E(err)) + return stdLog.New(stdLog.InsertDataError, "", "") + } + return nil +} + +// DelOneChannelPackage 删除一个应用tag +func DelOneChannelPackage(ctx context.Context, filter bson.M) ( + int64, *stdLog.SrvErr) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("application:DelOneChannelPackage db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, stdLog.New(stdLog.DelDataError, "", "") + } + return count, nil +} + +// UpdateOneChannelPackage 更新一个应用 +func UpdateOneChannelPackage(ctx context.Context, filter bson.M, update bson.M) *stdLog.SrvErr { + result, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("application:UpdateOneChannelPackage db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return stdLog.New(stdLog.UpdateDataError, "", "") + } + if result.MatchedCount != 1 { + log.Warn("application:UpdateOneChannelPackage db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return stdLog.New(stdLog.DataNotExist, "", "") + } + return nil +} + +// CountChannelPackages 统计应用数量 +func CountChannelPackages(ctx context.Context, filter bson.M) ( + int64, *stdLog.SrvErr) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("media:CountChannelPackages db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, stdLog.New(stdLog.QueryDataError, "", "") + } + return count, nil +} + +// FindOneChannelPackage 查找一个应用 +func FindOneChannelPackage(ctx context.Context, filter bson.M) ( + *ChannelPackage, *stdLog.SrvErr) { + var ChannelPackage ChannelPackage + if err := db.FindOneEx( + ctx, &ChannelPackage, filter); err != nil { + if err != mongo.ErrNoDocuments { + log.Info("media:FindOneChannelPackage db.FindOne failed", + log.E(err), log.Any("filter", filter)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + return nil, stdLog.New(stdLog.DataNotExist, "", "") + } + return &ChannelPackage, nil +} + +// FindManyChannelPackage 查找一批应用 +func FindManyChannelPackage(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (ChannelPackageList, *stdLog.SrvErr) { + data := make(ChannelPackageList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("application:FindManyChannelPackage db.Find failed", + log.E(err), log.Any("filter", filter)) + return nil, stdLog.New(stdLog.QueryDataError, "", "") + } + return data, nil +} diff --git a/models/channelpackage/helper.go b/models/channelpackage/helper.go new file mode 100644 index 0000000..afa331f --- /dev/null +++ b/models/channelpackage/helper.go @@ -0,0 +1,83 @@ +package channelpackage + +import ( + "context" + "fmt" + "go.mongodb.org/mongo-driver/bson" + "math" + "math/rand" + "net/url" + "stat/common/stdLog" + "time" +) + +func (c *ChannelPackage) IncDownCount(ctx context.Context) *stdLog.SrvErr { + update := bson.M{ + "$inc": bson.M{ + FN.ChannelPackage.DownCount: 1, + }, + "$set": bson.M{ + FN.ChannelPackage.DownLatest: time.Now(), + }, + } + return UpdateOneChannelPackage(ctx, bson.M{FN.ChannelPackage.Id: c.Id}, update) +} + +func (c *ChannelPackage) GetRandomLink(domains []string) string { + if len(domains) > 0 { + base := domains[rand.Intn(len(domains))] + link, _ := url.JoinPath(base, c.UrlPath) + return link + } + return "" +} + +func (c *ChannelPackage) GetAllLink(domains []string) []string { + if len(domains) > 0 { + list := make([]string, 0) + for _, domain := range domains { + link, _ := url.JoinPath(domain, c.UrlPath) + list = append(list, link) + } + return list + } + return []string{} +} + +func (c *ChannelPackage) CanMake(force bool) (bool, time.Duration, string) { + // 先判断锁定时间(强制生成不可破锁) + duration := ApkLockTimeDuration - time.Since(c.LockTime) + if duration > 0 { + return false, duration, fmt.Sprintf("记录锁定") + } + if force { + return true, 0, "强制生成" + } + if c.Status == ChanApkStatusSuccess { + // 已成功的记录 + return false, duration, "已经生成成功过,无需重新生成" + } else if c.Status == ChanApkStatusMaking { + // 判断超时的记录 + current := time.Now().Sub(c.GenTime) + diff := ApkNoResponseDuration - current + if diff <= 0 { + duration := time.Duration(math.Pow(3, float64(c.GenCount))) * time.Minute + if current > duration { + return true, -1, "可以生成" + } else { + return false, duration - current, "未达到可以再次生成的时间" + } + } else { + return false, diff, "正在生成中" + } + } else { + // 判断失败的记录 + duration := time.Duration(math.Pow(3, float64(c.GenCount))) * time.Minute + current := time.Now().Sub(c.GenTime) + if current > duration { + return true, -1, "上次生成失败已超时,现在可以重新生成" + } else { + return false, duration - current, "上次生成失败,重新生成的时间未到" + } + } +} diff --git a/models/channelpackage/tag.go b/models/channelpackage/tag.go new file mode 100755 index 0000000..cb1a342 --- /dev/null +++ b/models/channelpackage/tag.go @@ -0,0 +1,54 @@ +package channelpackage + +type TagChannelPackage struct { + AppId string + Channel string + CreatedAt string + Desc string + Reason string + FileName string + GenCount string + GenError string + GenTime string + Id string + Status string + UpdatedAt string + UrlPath string + Version string + LockCode string + LockTime string + DownCount string + DownLatest string + CheckLink string +} + +var FN struct { + ChannelPackage TagChannelPackage +} + +var TN struct { + ChannelPackage string +} + +func init() { + FN.ChannelPackage.AppId = "appId" + FN.ChannelPackage.Channel = "channel" + FN.ChannelPackage.CreatedAt = "createdAt" + FN.ChannelPackage.Desc = "desc" + FN.ChannelPackage.Reason = "reason" + FN.ChannelPackage.FileName = "fileName" + FN.ChannelPackage.GenCount = "genCount" + FN.ChannelPackage.GenError = "genError" + FN.ChannelPackage.GenTime = "genTime" + FN.ChannelPackage.Id = "_id" + FN.ChannelPackage.Status = "status" + FN.ChannelPackage.UpdatedAt = "updatedAt" + FN.ChannelPackage.UrlPath = "urlPath" + FN.ChannelPackage.Version = "version" + FN.ChannelPackage.LockCode = "lockCode" + FN.ChannelPackage.LockTime = "lockTime" + FN.ChannelPackage.CheckLink = "checkLink" + FN.ChannelPackage.DownCount = "downCount" + FN.ChannelPackage.DownLatest = "downLatest" + TN.ChannelPackage = "channel_package" +} diff --git a/models/channelpackage/type.go b/models/channelpackage/type.go new file mode 100644 index 0000000..7898a2b --- /dev/null +++ b/models/channelpackage/type.go @@ -0,0 +1,68 @@ +package channelpackage + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +const CollChannelPackage = "channel_package" + +var db *mongos.MongoTool + +type ChanApkStatus int64 + +const ( + ChanApkStatusUnknown ChanApkStatus = iota + ChanApkStatusMaking // 正在生成 + ChanApkStatusSuccess // 生成成功 + ChanApkStatusFailure // 生成失败 +) + +const ( + ApkLockTimeDuration = 30 * time.Minute // 记录锁定时间 + ApkNoResponseDuration = 60 * time.Minute // 生成时无响应间隔 + ApkCheckLinkDuration = 10 * time.Minute // 生成时无响应间隔 + ApkGenerateParallelMax = int64(5) // 并行生成APK的最大任务数 +) + +// 渠道包 +// @table:channel_package +type ChannelPackage struct { + Id primitive.ObjectID `json:"id" bson:"_id,omitempty"` + AppId int32 `json:"appId" bson:"appId"` // appId + Channel string `json:"channel" bson:"channel"` // 渠道 + Version string `bson:"version" json:"version"` // 版本号 + FileName string `json:"fileName" bson:"fileName"` // 包文件名 + UrlPath string `json:"urlPath" bson:"urlPath"` // UrlPath + Status ChanApkStatus `json:"status" bson:"status"` // 状态 + Desc string `bson:"desc" json:"desc"` // 版本描述 + GenError string `bson:"genError" json:"genError"` // 生成错误 + GenCount int64 `bson:"genCount" json:"genCount"` // 生成次数 + GenTime time.Time `bson:"genTime" json:"genTime"` // 生成时间 + Reason string `bson:"reason" json:"reason"` // 生成原因 + LockCode int64 `bson:"lockCode" json:"lockCode"` // 更新锁码 + LockTime time.Time `bson:"lockTime" json:"lockTime"` // 锁定时间 + DownCount int64 `bson:"downCount" json:"downCount"` // 下载次数 + DownLatest time.Time `bson:"downLatest" json:"downLatest"` // 最后下载时间 + CheckLink time.Time `bson:"checkLink" json:"checkLink"` // 检查链接 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 更新时间 +} + +type ChannelPackageList []*ChannelPackage + +type ChannelPackageUpdate struct { + AppId *int32 `json:"appId" bson:"appId"` // appId + Channel *string `json:"channel" bson:"channel"` // 渠道 + Version *string `bson:"version" json:"version"` // 版本号 + FileName *string `json:"fileName" bson:"fileName"` // 包文件名 + UrlPath *string `json:"urlPath" bson:"urlPath"` // UrlPath + Status *int64 `json:"status" bson:"status"` // 状态 + Desc *string `bson:"desc" json:"desc"` // 版本描述 + GenError *string `bson:"genError" json:"genError"` // 生成错误 + GenCount *int64 `bson:"genCount" json:"genCount"` // 生成次数 + GenTime *time.Time `bson:"genTime" json:"genTime"` // 生成时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 更新时间 +} diff --git a/models/channelsettlementrecord/recharge.go b/models/channelsettlementrecord/recharge.go new file mode 100644 index 0000000..57401db --- /dev/null +++ b/models/channelsettlementrecord/recharge.go @@ -0,0 +1,215 @@ +package channelsettlementrecord + +import ( + "context" + "fmt" + "go.mongodb.org/mongo-driver/mongo" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var ( + dbRecord *mongos.MongoTool + dbDeleted *mongos.MongoTool +) + +func Init(ctx context.Context) { + initDbRecord(ctx) + initDbDeleted(ctx) +} + +func initDbRecord(ctx context.Context) { + // 获取数据库表 + dbRecord = mongos.New(mongos.MgoManager, TN.ChannelSettlementRecord) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.ChannelSettlementRecord.Channel, Value: 1}, + {Key: FN.ChannelSettlementRecord.AppId, Value: 1}, + }, + }, + { + Keys: bson.D{{Key: FN.ChannelSettlementRecord.SettleIds, Value: 1}}, + }, + { + Keys: bson.D{{Key: FN.ChannelSettlementRecord.Applicant, Value: 1}}, + }, + } + if _, err := dbRecord.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(ChannelSettlementRecord:initChannelSettlementRecordIndex) Create ChannelSettlementRecord Index failed! err:%+v:", err)) + } +} +func initDbDeleted(ctx context.Context) { + // 获取数据库表 + dbDeleted = mongos.New(mongos.MgoManager, TN.ChannelSettlementDeleted) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.ChannelSettlementDeleted.Channel, Value: 1}, + {Key: FN.ChannelSettlementDeleted.AppId, Value: 1}, + }, + }, + { + Keys: bson.D{{Key: FN.ChannelSettlementDeleted.SettleIds, Value: 1}}, + }, + } + if _, err := dbDeleted.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(ChannelSettlementDeleted:initChannelSettlementDeletedIndex) Create ChannelSettlementDeleted Index failed! err:%+v:", err)) + } +} + +//InsertOneChannelSettlementRecord 插入一个结算记录 +func InsertOneChannelSettlementRecord(ctx context.Context, ChannelSettlementRecord *ChannelSettlementRecord) error { + if _, err := dbRecord.InsertOne(ctx, ChannelSettlementRecord); err != nil { + log.Warn("ChannelSettlementRecord:InsertOneChannelSettlementRecord dbRecord.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneChannelSettlementRecord 查找一个结算记录 +func FindOneChannelSettlementRecord(ctx context.Context, filter bson.M) ( + *ChannelSettlementRecord, error) { + var ChannelSettlementRecord ChannelSettlementRecord + if err := dbRecord.FindOne(ctx, &ChannelSettlementRecord, filter); err != nil { + return nil, err + } + return &ChannelSettlementRecord, nil +} + +//FindOneChannelSettlementRecordEx 查找一个结算记录 +func FindOneChannelSettlementRecordEx(ctx context.Context, filter bson.M) ( + *ChannelSettlementRecord, error) { + var ChannelSettlementRecord ChannelSettlementRecord + if err := dbRecord.FindOneEx(ctx, &ChannelSettlementRecord, filter); err != nil { + return nil, err + } + return &ChannelSettlementRecord, nil +} + +//DelOneChannelSettlementRecord 删除一个结算记录 +func DelOneChannelSettlementRecord(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := dbRecord.DeleteOne(ctx, filter) + if err != nil { + log.Warn("ChannelSettlementRecord:DelOneChannelSettlementRecord dbRecord.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneChannelSettlementRecord 更新一个结算记录 +func UpdateOneChannelSettlementRecord(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbRecord.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneChannelSettlementRecord dbRecord.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountChannelSettlementRecords 统计结算记录数量 +func CountChannelSettlementRecords(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := dbRecord.Count(ctx, filter) + if err != nil { + log.Warn("ChannelSettlementRecord:CountChannelSettlementRecords dbRecord.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyChannelSettlementRecord 更新满足条件的结算记录 +func UpdateManyChannelSettlementRecord(ctx context.Context, filter bson.M, update bson.M) error { + _, err := dbRecord.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyChannelSettlementRecord dbRecord.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyChannelSettlementRecord 查找一批结算记录数据 +func FindManyChannelSettlementRecord(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (ChannelSettlementRecordList, error) { + data := make(ChannelSettlementRecordList, 0) + if err := dbRecord.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("ChannelSettlementRecord:FindManyChannelSettlementRecord dbRecord.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyChannelSettlementRecordWithBind 用自己定义结构查找一批结算记录数据 +func FindManyChannelSettlementRecordWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := dbRecord.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("ChannelSettlementRecord:FindManyChannelSettlementRecordWithBind dbRecord.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateChannelSettlementRecords 聚合查找一批结算记录信息 +func AggregateChannelSettlementRecords(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := dbRecord.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateChannelSettlementRecords dbRecord.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} + +// ---------------------------------------- + +//CountChannelSettlementRecords 统计结算记录数量 +func CountChannelSettlementDeletes(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := dbDeleted.Count(ctx, filter) + if err != nil { + log.Warn("ChannelSettlementRecord:CountChannelSettlementDeletes dbDeleted.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//InsertOneChannelSettlementDeleted 插入一个结算删除记录 +func InsertOneChannelSettlementDeleted(ctx context.Context, ChannelSettlementRecord *ChannelSettlementRecord) error { + if _, err := dbDeleted.InsertOne(ctx, ChannelSettlementRecord); err != nil { + log.Warn("ChannelSettlementRecord:InsertOneChannelSettlementDeleted dbDeleted.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneChannelSettlementDeletedEx 查找一个结算删除记录 +func FindOneChannelSettlementDeletedEx(ctx context.Context, filter bson.M) ( + *ChannelSettlementRecord, error) { + var ChannelSettlementRecord ChannelSettlementRecord + if err := dbDeleted.FindOneEx(ctx, &ChannelSettlementRecord, filter); err != nil { + return nil, err + } + return &ChannelSettlementRecord, nil +} + +//FindManyChannelSettlementDeleted 查找一批结算记录数据 +func FindManyChannelSettlementDeleted(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (ChannelSettlementRecordList, error) { + data := make(ChannelSettlementRecordList, 0) + if err := dbDeleted.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("ChannelSettlementRecord:FindManyChannelSettlementDeleted dbDeleted.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} diff --git a/models/channelsettlementrecord/tag.go b/models/channelsettlementrecord/tag.go new file mode 100755 index 0000000..05fd61f --- /dev/null +++ b/models/channelsettlementrecord/tag.go @@ -0,0 +1,81 @@ +package channelsettlementrecord + +type TagChannelSettlementRecord struct { + AppId string + BeginTime string + CPAPrice string + CPSRate string + Channel string + CreatedAt string + UpdatedAt string + EndTime string + ID string + NewDeductionCount string + NewFissionCount string + NewDirectCount string + PayMoney string + RechargeAmount string + Remark string + Settlement string + Status string + TotalMoney string + SettleMoney string + Usdt string + VipPayMoney string + VipPayCoin string + VipPayDeduction string + SettleIds string + OperateHistory string + Applicant string + Wallet struct { + Addr1 string + Addr2 string + } + IncludeChild string +} + +var FN struct { + ChannelSettlementRecord TagChannelSettlementRecord + ChannelSettlementDeleted TagChannelSettlementRecord +} + +var TN struct { + ChannelSettlementRecord string + ChannelSettlementDeleted string +} + +func init() { + FN.ChannelSettlementRecord.AppId = "appId" + FN.ChannelSettlementRecord.BeginTime = "beginTime" + FN.ChannelSettlementRecord.CPAPrice = "cpaPrice" + FN.ChannelSettlementRecord.CPSRate = "cpsRate" + FN.ChannelSettlementRecord.Channel = "channel" + FN.ChannelSettlementRecord.CreatedAt = "createdAt" + FN.ChannelSettlementRecord.UpdatedAt = "updatedAt" + FN.ChannelSettlementRecord.EndTime = "endTime" + FN.ChannelSettlementRecord.ID = "_id" + FN.ChannelSettlementRecord.NewDeductionCount = "newDeductionCount" + FN.ChannelSettlementRecord.NewFissionCount = "newFissionCount" + FN.ChannelSettlementRecord.NewDirectCount = "newDirectCount" + FN.ChannelSettlementRecord.PayMoney = "payMoney" + FN.ChannelSettlementRecord.RechargeAmount = "rechargeAmount" + FN.ChannelSettlementRecord.Remark = "remark" + FN.ChannelSettlementRecord.Settlement = "settlement" + FN.ChannelSettlementRecord.Status = "status" + FN.ChannelSettlementRecord.TotalMoney = "totalMoney" + FN.ChannelSettlementRecord.SettleMoney = "settleMoney" + FN.ChannelSettlementRecord.Usdt = "usdt" + FN.ChannelSettlementRecord.VipPayMoney = "vipPayMoney" + FN.ChannelSettlementRecord.VipPayCoin = "vipPayCoin" + FN.ChannelSettlementRecord.VipPayDeduction = "vipPayDeduction" + FN.ChannelSettlementRecord.SettleIds = "settleIds" + FN.ChannelSettlementRecord.OperateHistory = "operateHistory" + FN.ChannelSettlementRecord.Applicant = "applicant" + FN.ChannelSettlementRecord.Wallet.Addr1 = "wallet.addr1" + FN.ChannelSettlementRecord.Wallet.Addr2 = "wallet.addr2" + FN.ChannelSettlementRecord.IncludeChild = "includeChild" + + FN.ChannelSettlementDeleted = FN.ChannelSettlementRecord + TN.ChannelSettlementRecord = "channel_settlement_record" + TN.ChannelSettlementDeleted = "channel_settlement_deleted" +} diff --git a/models/channelsettlementrecord/type.go b/models/channelsettlementrecord/type.go new file mode 100644 index 0000000..80a817b --- /dev/null +++ b/models/channelsettlementrecord/type.go @@ -0,0 +1,90 @@ +package channelsettlementrecord + +import ( + "stat/middleware/define" + "stat/models/channelmod" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 结算方式 +type SettlementStatus int64 + +const ( + SettlementInit SettlementStatus = 0 // 发起 + SettlementSuccess SettlementStatus = 1 // 成功 + SettlementFailed SettlementStatus = 2 // 失败 + SettlementDeleted SettlementStatus = 3 // 已删除 +) + +func (status SettlementStatus) String() string { + return GetSettStatus(status) +} + +func GetSettStatus(status SettlementStatus) string { + switch status { + case SettlementInit: + return "发起" + case SettlementSuccess: + return "成功" + case SettlementFailed: + return "失败" + case SettlementDeleted: + return "已删除" + default: + return "未知状态" + } +} + +type SettlementOperateItem struct { + OperateTime time.Time `bson:"operateTime" json:"operateTime"` // 操作时间 + BeforeStatus SettlementStatus `bson:"beforeStatus" json:"beforeStatus"` // 操作前状态 + AfterStatus SettlementStatus `bson:"afterStatus" json:"afterStatus"` // 操作后状态 + OperatorAccount string `bson:"operatorAccount" json:"operatorAccount"` // 操作者账号 + OperatorAccountType define.ActType `bson:"operatorAccountType" json:"operatorAccountType"` // 操作者账号类型 + OperatorAccountName string `bson:"operatorAccountName" json:"operatorAccountName"` // 操作者账号名字 + Content string `bson:"content" json:"content"` // 操作的内容 + Pictures []string `bson:"pictures" json:"pictures"` // 上传的图片 + Remark string `bson:"remark" json:"remark"` // 操作备注 +} + +// 帖子模型,数据库中的 +// @table:channel_settlement_record +type ChannelSettlementRecord struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + Channel string `bson:"channel" json:"channel"` // 渠道 + AppId int32 `bson:"appId" json:"appId"` // appId + AppType channelmod.AppType `bson:"appType" json:"appType"` // 应用类型 + PromoteMode channelmod.PromoteMode `bson:"promoteMode" json:"promoteMode"` // 推广类型 + BeginTime time.Time `bson:"beginTime" json:"beginTime"` // 开始时间 + EndTime time.Time `bson:"endTime" json:"endTime"` // 结束时间 + TotalMoney int64 `bson:"totalMoney" json:"totalMoney"` // 计算出的总金额 + SettleMoney int64 `bson:"settleMoney" json:"settleMoney"` // 手动输入的要结算的真实金额() + Settlement channelmod.SettlementWay `bson:"settlement" json:"settlement"` // 结算方式 cps/cpa/cpt/cpc + CPAPrice int64 `bson:"cpaPrice" json:"cpaPrice"` // 单价 + CPSRate int64 `bson:"cpsRate" json:"cpsRate"` // CPS 分成比列 0-100 + NewDirectCount int64 `bson:"newDirectCount" json:"newDirectCount"` // 新增直推 + NewFissionCount int64 `bson:"newFissionCount" json:"newFissionCount"` // 新增裂变 + NewDeductionCount int64 `bson:"newDeductionCount" json:"newDeductionCount"` // 新增扣量 + RechargeAmount int64 `bson:"rechargeAmount" json:"rechargeAmount"` // 充值金额 + VipPayMoney int64 `bson:"vipPayMoney" json:"vipPayMoney"` // 购买会员金额(CPS扣量后) + VipPayCoin int64 `bson:"vipPayCoin,omitempty" json:"vipPayCoin"` // 购买会员金币 + VipPayDeduction int64 `bson:"vipPayDeduction,omitempty" json:"vipPayDeduction"` // 购买会员金额(CPS扣量) + ValidDirectCount int64 `bson:"validDirectCount,omitempty" json:"validDirectCount"` // 有效直推总数 + ValidDeductionCount int64 `bson:"validDeductionCount,omitempty" json:"validDeductionCount"` // 有效扣量总数 + ValidPayMoney int64 `bson:"validPayMoney,omitempty" json:"validPayMoney"` // 有效收益会员金额 + ValidPayCoin int64 `bson:"validPayCoin,omitempty" json:"validPayCoin"` // 有效收益金币金额 + Wallet channelmod.Wallet `bson:"wallet" json:"wallet"` // 钱包地址 + PayMoney int64 `bson:"payMoney" json:"payMoney"` // 打款金额 + Usdt int64 `bson:"usdt" json:"usdt"` // 打款Usdt 还是分 + Status SettlementStatus `bson:"status" json:"status"` // 状态 + OperateHistory []SettlementOperateItem `bson:"operateHistory" json:"operateHistory"` // 操作历史[最后一项是当前操作记录] + Remark string `bson:"remark" json:"remark"` // 备注 + UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` // 更新时间 + CreatedAt time.Time `bson:"createdAt" json:"createdAt"` // 创建时间 + SettleIds []primitive.ObjectID `bson:"settleIds" json:"settleIds"` // 本次结算的天统计记录id列表 + Applicant string `bson:"applicant" json:"applicant"` // 结算申请人 + IncludeChild bool `bson:"includeChild" json:"includeChild"` // 结算是否包含子渠道 +} +type ChannelSettlementRecordList []*ChannelSettlementRecord diff --git a/models/dailyhourstatmod/helper.go b/models/dailyhourstatmod/helper.go new file mode 100644 index 0000000..af1c26e --- /dev/null +++ b/models/dailyhourstatmod/helper.go @@ -0,0 +1,24 @@ +package dailyhourstatmod + +import "time" + +var ( + fixTime time.Time +) + +func init() { + time.Local, _ = time.LoadLocation("Asia/Shanghai") + fixTime, _ = time.ParseInLocation("2006-01-02", "2023-07-14", time.Local) +} + +func (s *DailyHourStat) CorrectValidData() *DailyHourStat { + if s.SumDate.Before(fixTime) { + s.TotalAmount = s.DirectAmount + s.FissionAmount + s.DeductionAmount + s.NewTotalCount = s.NewDirectCount + s.NewFissionCount + s.NewDeductionCount + s.TotalVisitCount = s.DirectVisitCount + s.FissionVisitCount + s.DeductionVisitCount + s.NewLightCount = s.NewLightDirectCount + s.NewLightFissionCount + s.NewLightDeductionCount + s.LightAmount = s.LightDirectAmount + s.LightFissionAmount + s.LightDeductionAmount + s.LightAmountCount = s.LightDirectAmountCount + s.LightFissionAmountCount + s.LightDeductionAmountCount + } + return s +} diff --git a/models/dailyhourstatmod/hour.go b/models/dailyhourstatmod/hour.go new file mode 100644 index 0000000..4a4ee27 --- /dev/null +++ b/models/dailyhourstatmod/hour.go @@ -0,0 +1,155 @@ +package dailyhourstatmod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.DailyHourStat) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.DailyHourStat.SumDate, Value: 1}, + {Key: FN.DailyHourStat.AppId, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(DailyHourStat:initDailyHourStatIndex) Create DailyHourStat Index failed! err:%+v:", err)) + } +} + +//InsertOneDailyHourStat 插入一个VIP购买记录 +func InsertOneDailyHourStat(ctx context.Context, DailyHourStat *DailyHourStat) error { + if _, err := db.InsertOne(ctx, DailyHourStat); err != nil { + log.Warn("DailyHourStat:InsertOneDailyHourStat db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneDailyHourStat 查找一个VIP购买记录 +func FindOneDailyHourStat(ctx context.Context, filter bson.M) ( + *DailyHourStat, error) { + var DailyHourStat DailyHourStat + if err := db.FindOne(ctx, &DailyHourStat, filter); err != nil { + return nil, err + } + return &DailyHourStat, nil +} + +//DelOneDailyHourStat 删除一个VIP购买记录 +func DelOneDailyHourStat(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("DailyHourStat:DelOneDailyHourStat db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneDailyHourStat 更新一个VIP购买记录 +func UpdateOneDailyHourStat(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneDailyHourStat db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountDailyHourStats 统计VIP购买记录数量 +func CountDailyHourStats(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("DailyHourStat:CountDailyHourStats db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyDailyHourStat 更新满足条件的VIP购买记录 +func UpdateManyDailyHourStat(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyDailyHourStat db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyDailyHourStat 查找一批每小时统计 +func FindManyDailyHourStat(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (DailyHourStatList, error) { + data := make(DailyHourStatList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("DailyHourStat:FindManyDailyHourStat db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyDailyHourStatWithBind 用自己定义结构查找一批每小时统计 +func FindManyDailyHourStatWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("DailyHourStat:FindManyDailyHourStatWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateDailyHourStats 聚合查找一批VIP购买记录信息 +func AggregateDailyHourStats(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateDailyHourStats db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} + +// UpsertDailyStat 更新或插入一条统计记录 +func UpsertDailyHourStat(ctx context.Context, sumDate time.Time, appId int32, doc DailyHourStatDoc) (err error) { + var filter = bson.M{ + "sumDate": sumDate, + "appId": appId, + } + var update = mongos.ToBsonM(doc) + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + + _, err = db.InsertOne(ctx, insertDoc) + } + + return +} diff --git a/models/dailyhourstatmod/tag.go b/models/dailyhourstatmod/tag.go new file mode 100755 index 0000000..a88161c --- /dev/null +++ b/models/dailyhourstatmod/tag.go @@ -0,0 +1,74 @@ +package dailyhourstatmod + +type TagDailyHourStat struct { + AppId string + DirectAmount string + DirectVisitCount string + FissionAmount string + FissionVisitCount string + GameRechageAmount string + GameWithdrawAmount string + ID string + LandpageAndroidClick string + LandpageIosAppstoreClick string + LandpageIosAthorClick string + NaturalAmount string + NewAndroidCount string + NewDeductionCount string + NewDirectCount string + NewFissionCount string + NewH5Count string + NewIosCount string + NewNaturalCount string + NewRechargeAmount string + RepeatAmount string + SuccessRechargeOrder string + SumDate string + SumHour string + TotalRechargeOrder string + UpdatedAt string + VipPayByAmount string + VipPayByMoney string + VipRepeatAmount string +} + +var FN struct { + DailyHourStat TagDailyHourStat +} + +var TN struct { + DailyHourStat string +} + +func init() { + FN.DailyHourStat.AppId = "appId" + FN.DailyHourStat.DirectAmount = "directAmount" + FN.DailyHourStat.DirectVisitCount = "directVisitCount" + FN.DailyHourStat.FissionAmount = "fissionAmount" + FN.DailyHourStat.FissionVisitCount = "fissionVisitCount" + FN.DailyHourStat.GameRechageAmount = "gameRechageAmount" + FN.DailyHourStat.GameWithdrawAmount = "gameWithdrawAmount" + FN.DailyHourStat.ID = "_id" + FN.DailyHourStat.LandpageAndroidClick = "landpageAndroidClick" + FN.DailyHourStat.LandpageIosAppstoreClick = "landpageIosAppstoreClick" + FN.DailyHourStat.LandpageIosAthorClick = "landpageIosAthorClick" + FN.DailyHourStat.NaturalAmount = "naturalAmount" + FN.DailyHourStat.NewAndroidCount = "newAndroidCount" + FN.DailyHourStat.NewDeductionCount = "newDeductionCount" + FN.DailyHourStat.NewDirectCount = "newDirectCount" + FN.DailyHourStat.NewFissionCount = "newFissionCount" + FN.DailyHourStat.NewH5Count = "newH5Count" + FN.DailyHourStat.NewIosCount = "newIosCount" + FN.DailyHourStat.NewNaturalCount = "newNaturalCount" + FN.DailyHourStat.NewRechargeAmount = "newRechargeAmount" + FN.DailyHourStat.RepeatAmount = "repeatAmount" + FN.DailyHourStat.SuccessRechargeOrder = "successRechargeOrder" + FN.DailyHourStat.SumDate = "sumDate" + FN.DailyHourStat.SumHour = "sumHour" + FN.DailyHourStat.TotalRechargeOrder = "totalRechargeOrder" + FN.DailyHourStat.UpdatedAt = "updatedAt" + FN.DailyHourStat.VipPayByAmount = "vipPayByAmount" + FN.DailyHourStat.VipPayByMoney = "vipPayByMoney" + FN.DailyHourStat.VipRepeatAmount = "vipRepeatAmount" + TN.DailyHourStat = "daily_hour_stat" +} diff --git a/models/dailyhourstatmod/type.go b/models/dailyhourstatmod/type.go new file mode 100644 index 0000000..9c73779 --- /dev/null +++ b/models/dailyhourstatmod/type.go @@ -0,0 +1,285 @@ +package dailyhourstatmod + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 帖子模型,数据库中的 +// @table:daily_hour_stat +type DailyHourStat struct { + ID primitive.ObjectID `bson:"_id,omitempty"` // ID + SumDate time.Time `bson:"sumDate"` // 记录时间 按天对齐 + AppId int32 `bson:"appId"` // appId + SumHour int `bson:"sumHour,omitempty"` // 小时数 + // 注册用户 + NewTotalCount int64 `bson:"newTotalCount,omitempty"` // **新增总量 + // ------分类1 + NewDirectCount int64 `bson:"newDirectCount,omitempty"` // 新增直推 + NewFissionCount int64 `bson:"newFissionCount,omitempty"` // 新增裂变 + NewDeductionCount int64 `bson:"newDeductionCount,omitempty"` // 新增扣量 + NewNaturalCount int64 `bson:"newNaturalCount,omitempty"` // 自然新增 + DeductionVisitCount int64 `bson:"deductionVisitCount,omitempty"` // 新增扣量 + // ------分类2 + NewAndroidCount int64 `bson:"newAndroidCount,omitempty"` // android新增 + NewIosCount int64 `bson:"newIosCount,omitempty"` // ios新增 + // ------分类3 + NewLightCount int64 `bson:"newLightCount,omitempty"` // light新增 + NewLightGuestCount int64 `bson:"newLightGuestCount,omitempty"` // light新增安装 + NewLightFormalCount int64 `bson:"newLightFormalCount,omitempty"` // light新增注册 + NewLightDirectCount int64 `bson:"newLightDirectCount,omitempty"` // light新增直推 + NewLightFissionCount int64 `bson:"newLightFissionCount,omitempty"` // light新增裂变 + NewLightDeductionCount int64 `bson:"newLightDeductionCount,omitempty"` // light新增扣量 + NewLightNaturalCount int64 `bson:"newLightNaturalCount,omitempty"` // light自然新增 + NewLightWebCount int64 `bson:"newLightWebCount,omitempty"` // light官网新增 + NewLightNormalCount int64 `bson:"newLightNormalCount,omitempty"` // light自来新增 + NewLightDistrictCount int64 `bson:"newLightDistrictCount,omitempty"` // light渠道新增 + // ------分类4 + NewH5Count int64 `bson:"newH5Count,omitempty"` // H5新增 + NewH5FormalCount int64 `bson:"newH5FormalCount,omitempty"` // H5注册新增 + NewH5PcCount int64 `bson:"newH5PcCount,omitempty"` // +H5PC新增 + NewH5IosCount int64 `bson:"NewH5IosCount,omitempty"` // +H5IOS新增 + NewH5AndroidCount int64 `bson:"newH5AndroidCount,omitempty"` // +H5Android新增 + // ------分类4 + NewWebCount int64 `bson:"newWebCount,omitempty"` // **官网新增 + NewNormalCount int64 `bson:"newNormalCount,omitempty"` // **自来新增 + NewDistrictCount int64 `bson:"newDistrictCount,omitempty"` // **渠道新增 + + // 访问统计 + TotalVisitCount int64 `bson:"totalVisitCount,omitempty"` // **访问总量 + // ------分类1 + DirectVisitCount int64 `bson:"directVisitCount,omitempty"` // 直推访问数 + FissionVisitCount int64 `bson:"fissionVisitCount,omitempty"` // 裂变访问数 + NaturalVisitCount int64 `bson:"naturalVisitCount,omitempty"` // **自然访问数 + // ------分类2 + IosVisitCount int64 `bson:"iosVisitCount,omitempty"` // +Ios访问量 + AndroidVisitCount int64 `bson:"androidVisitCount,omitempty"` // +Android访问量 + // ------分类3 + LightVisitCount int64 `bson:"lightVisitCount,omitempty"` // light访问量 + LightVisitDirectCount int64 `bson:"lightVisitDirectCount,omitempty"` // light访问量直推 + LightVisitFissionCount int64 `bson:"lightVisitFissionCount,omitempty"` // light访问量裂变 + LightVisitDeductionCount int64 `bson:"lightVisitDeductionCount,omitempty"` // light访问量扣量 + LightVisitNaturalCount int64 `bson:"lightVisitNaturalCount,omitempty"` // light访问量自然 + LightVisitWebCount int64 `bson:"lightVisitWebCount,omitempty"` // light访问量官网 + LightVisitNormalCount int64 `bson:"lightVisitNormalCount,omitempty"` // light访问量自来 + LightVisitDistrictCount int64 `bson:"lightVisitDistrictCount,omitempty"` // light访问量渠道 + // ------分类3 + H5VisitCount int64 `bson:"h5VisitCount,omitempty"` // H5访问量 + H5PcVisitCount int64 `bson:"h5PcVisitCount,omitempty"` // +H5Pc访问量 + H5IosVisitCount int64 `bson:"h5IosVisitCount,omitempty"` // +H5Ios访问量 + H5AndroidVisitCount int64 `bson:"h5AndroidVisitCount,omitempty"` // +H5Android访问量 + // ------分类4 + WebVisitCount int64 `bson:"webVisitCount,omitempty"` // **官网访问 + NormalVisitCount int64 `bson:"normalVisitCount,omitempty"` // **自来访问 + DistrictVisitCount int64 `bson:"districtVisitCount,omitempty"` // **渠道访问 + + // 落地页访问 + LandpageAndroidClick int64 `bson:"landpageAndroidClick,omitempty"` // 落地页android访问次数 + LandpageIosAppstoreClick int64 `bson:"landpageIosAppstoreClick,omitempty"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick int64 `bson:"landpageIosAthorClick,omitempty"` // 落地页iOS其他包访问次数 + LandpageIosH5Click int64 `bson:"landpageIosH5Click,omitempty"` // 落地页H5访问次数 + + // 充值统计 + TotalAmount int64 `bson:"totalAmount,omitempty"` // **充值金额总量 + // ------分类1 + DirectAmount int64 `bson:"directAmount,omitempty"` // 直推充值金额 + DirectAmountCount int64 `bson:"directAmountCount,omitempty"` // 直推充值订单数 + FissionAmount int64 `bson:"fissionAmount,omitempty"` // 裂变充值金额 + FissionAmountCount int64 `bson:"fissionAmountCount,omitempty"` // 裂变充值订单数 + NaturalAmount int64 `bson:"naturalAmount,omitempty"` // 自然充值 + NaturalAmountCount int64 `bson:"naturalAmountCount,omitempty"` // 自然充值订单数 + DeductionAmount int64 `bson:"deductionAmount,omitempty"` // 充值扣量 + DeductionAmountCount int64 `bson:"deductionAmountCount,omitempty"` // 充值扣量次数 + // ------分类2 + AndroidAmount int64 `bson:"androidAmount,omitempty"` // +安卓充值金额 + AndroidAmountCount int64 `bson:"androidAmountCount,omitempty"` // +安卓充值次数 + IosAmount int64 `bson:"iosAmount,omitempty"` // +Ios充值金额 + IosAmountCount int64 `bson:"iosAmountCount,omitempty"` // +Ios充值次数 + // ------分类3 + LightAmount int64 `bson:"lightAmount,omitempty"` // light充值金额 + LightAmountCount int64 `bson:"lightAmountCount,omitempty"` // light充值次数 + LightDirectAmount int64 `bson:"lightDirectAmount,omitempty"` // light充值金额直推 + LightDirectAmountCount int64 `bson:"lightDirectAmountCount,omitempty"` // light充值次数直推 + LightFissionAmount int64 `bson:"lightFissionAmount,omitempty"` // light充值金额裂变 + LightFissionAmountCount int64 `bson:"lightFissionAmountCount,omitempty"` // light充值次数裂变 + LightDeductionAmount int64 `bson:"lightDeductionAmount,omitempty"` // light充值金额扣量 + LightDeductionAmountCount int64 `bson:"lightDeductionAmountCount,omitempty"` // light充值次数扣量 + LightNaturalAmount int64 `bson:"lightNaturalAmount,omitempty"` // light充值金额自然 + LightNaturalAmountCount int64 `bson:"lightNaturalAmountCount,omitempty"` // light充值次数自然 + LightWebAmount int64 `bson:"lightWebAmount,omitempty"` // light充值金额官网 + LightWebAmountCount int64 `bson:"lightWebAmountCount,omitempty"` // light充值次数官网 + LightNormalAmount int64 `bson:"lightNormalAmount,omitempty"` // light充值金额自来 + LightNormalAmountCount int64 `bson:"lightNormalAmountCount,omitempty"` // light充值次数自来 + LightDistrictAmount int64 `bson:"lightDistrictAmount,omitempty"` // light充值金额渠道 + LightDistrictAmountCount int64 `bson:"lightDistrictAmountCount,omitempty"` // light充值次数渠道 + // ------分类5 + H5Amount int64 `bson:"h5Amount,omitempty"` // +H5充值金额 + H5AmountCount int64 `bson:"h5AmountCount,omitempty"` // +H5充值次数 + H5FormalAmount int64 `bson:"h5FormalAmount,omitempty"` // 当日H5Formal充值 + H5FormalAmountCount int64 `bson:"h5FormalAmountCount,omitempty"` // 当日H5Formal充值次数 + H5PcAmount int64 `bson:"h5PcAmount,omitempty"` // 当日H5Pc充值 + H5PcAmountCount int64 `bson:"h5PcAmountCount,omitempty"` // 当日H5Pc充值次数 + H5IosAmount int64 `bson:"todayH5IosRecharge,omitempty"` // 当日H5Ios充值 + H5IosAmountCount int64 `bson:"h5IosAmountCount,omitempty"` // 当日H5Ios充值次数 + H5AndroidAmount int64 `bson:"h5AndroidAmount,omitempty"` // 当日H5Android充值 + H5AndroidAmountCount int64 `bson:"h5AndroidAmountCount,omitempty"` // 当日H5Android充值次数 + // ------分类6 + WebAmount int64 `bson:"webAmount,omitempty"` // **官网充值 + WebAmountCount int64 `bson:"webAmountCount,omitempty"` // **官网充值次数 + NormalAmount int64 `bson:"normalAmount,omitempty"` // **自来充值 + NormalAmountCount int64 `bson:"normalAmountCount,omitempty"` // **自来充值次数 + DistrictAmount int64 `bson:"districtAmount,omitempty"` // **渠道充值 + DistrictAmountCount int64 `bson:"districtAmountCount,omitempty"` // **渠道充值次数 + // ------分类7 + RepeatAmount int64 `bson:"repeatAmount,omitempty"` // 复冲金额 + RepeatAmountCount int64 `bson:"repeatAmountCount,omitempty"` // +复冲订单数 + SuccessRechargeOrder int64 `bson:"successRechargeOrder,omitempty"` // 充值成功订单数 + NewRechargeAmount int64 `bson:"newRechargeAmount,omitempty"` // 新增充值金额 + NewRechargeCount int64 `bson:"newRechargeCount,omitempty"` // +新增充值订单 + VipPayByMoney int64 `bson:"vipPayByMoney,omitempty"` // 人民币购买 + VipPayByAmount int64 `bson:"vipPayByAmount,omitempty"` // 余额购买 + VipRepeatAmount int64 `bson:"vipRepeatAmount,omitempty"` // VIP复冲金额 + TotalRechargeOrder int64 `bson:"totalRechargeOrder,omitempty"` // 拉起订单数 + // 游戏 + GameRechageAmount int64 `bson:"gameRechageAmount,omitempty"` // 游戏充值 + GameWithdrawAmount int64 `bson:"gameWithdrawAmount,omitempty"` // 游戏提现 + // 更新时间 + UpdatedAt time.Time `bson:"updatedAt,omitempty"` // 更新时间 +} +type DailyHourStatList []*DailyHourStat + +type DailyHourStatDoc struct { + SumHour *int `bson:"sumHour,omitempty"` // 小时数 + // 注册用户 + NewTotalCount *int64 `bson:"newTotalCount,omitempty"` // **新增总量 + // ------分类1 + NewDirectCount *int64 `bson:"newDirectCount,omitempty"` // 新增直推 + NewFissionCount *int64 `bson:"newFissionCount,omitempty"` // 新增裂变 + NewDeductionCount *int64 `bson:"newDeductionCount,omitempty"` // 新增扣量 + NewNaturalCount *int64 `bson:"newNaturalCount,omitempty"` // 自然新增 + // ------分类2 + NewAndroidCount *int64 `bson:"newAndroidCount,omitempty"` // android新增 + NewIosCount *int64 `bson:"newIosCount,omitempty"` // ios新增 + // ------分类3 + NewLightCount *int64 `bson:"newLightCount,omitempty"` // light新增 + NewLightGuestCount *int64 `bson:"newLightGuestCount,omitempty"` // light新增安装 + NewLightFormalCount *int64 `bson:"newLightFormalCount,omitempty"` // light新增注册 + NewLightDirectCount *int64 `bson:"newLightDirectCount,omitempty"` // light新增直推 + NewLightFissionCount *int64 `bson:"newLightFissionCount,omitempty"` // light新增裂变 + NewLightDeductionCount *int64 `bson:"newLightDeductionCount,omitempty"` // light新增扣量 + NewLightNaturalCount *int64 `bson:"newLightNaturalCount,omitempty"` // light自然新增 + NewLightWebCount *int64 `bson:"newLightWebCount,omitempty"` // light官网新增 + NewLightNormalCount *int64 `bson:"newLightNormalCount,omitempty"` // light自来新增 + NewLightDistrictCount *int64 `bson:"newLightDistrictCount,omitempty"` // light渠道新增 + // ------分类4 + NewH5Count *int64 `bson:"newH5Count,omitempty"` // H5新增 + NewH5FormalCount *int64 `bson:"newH5FormalCount,omitempty"` // H5注册新增 + NewH5PcCount *int64 `bson:"newH5PcCount,omitempty"` // +H5PC新增 + NewH5IosCount *int64 `bson:"NewH5IosCount,omitempty"` // +H5IOS新增 + NewH5AndroidCount *int64 `bson:"newH5AndroidCount,omitempty"` // +H5Android新增 + // ------分类4 + NewWebCount *int64 `bson:"newWebCount,omitempty"` // **官网新增 + NewNormalCount *int64 `bson:"newNormalCount,omitempty"` // **自来新增 + NewDistrictCount *int64 `bson:"newDistrictCount,omitempty"` // **渠道新增 + + // 访问统计 + TotalVisitCount *int64 `bson:"totalVisitCount,omitempty"` // **访问总量 + // ------分类1 + DirectVisitCount *int64 `bson:"directVisitCount,omitempty"` // 直推访问数 + FissionVisitCount *int64 `bson:"fissionVisitCount,omitempty"` // 裂变访问数 + NaturalVisitCount *int64 `bson:"naturalVisitCount,omitempty"` // **自然访问数 + DeductionVisitCount *int64 `bson:"deductionVisitCount,omitempty"` // 新增扣量 + // ------分类2 + IosVisitCount *int64 `bson:"iosVisitCount,omitempty"` // +Ios访问量 + AndroidVisitCount *int64 `bson:"androidVisitCount,omitempty"` // +Android访问量 + // ------分类3 + LightVisitCount *int64 `bson:"lightVisitCount,omitempty"` // light访问量 + LightVisitDirectCount *int64 `bson:"lightVisitDirectCount,omitempty"` // light访问量直推 + LightVisitFissionCount *int64 `bson:"lightVisitFissionCount,omitempty"` // light访问量裂变 + LightVisitDeductionCount *int64 `bson:"lightVisitDeductionCount,omitempty"` // light访问量扣量 + LightVisitNaturalCount *int64 `bson:"lightVisitNaturalCount,omitempty"` // light访问量自然 + LightVisitWebCount *int64 `bson:"lightVisitWebCount,omitempty"` // light访问量官网 + LightVisitNormalCount *int64 `bson:"lightVisitNormalCount,omitempty"` // light访问量自来 + LightVisitDistrictCount *int64 `bson:"lightVisitDistrictCount,omitempty"` // light访问量渠道 + // ------分类3 + H5VisitCount *int64 `bson:"h5VisitCount,omitempty"` // H5访问量 + H5PcVisitCount *int64 `bson:"h5PcVisitCount,omitempty"` // +H5Pc访问量 + H5IosVisitCount *int64 `bson:"h5IosVisitCount,omitempty"` // +H5Ios访问量 + H5AndroidVisitCount *int64 `bson:"h5AndroidVisitCount,omitempty"` // +H5Android访问量 + // ------分类4 + WebVisitCount *int64 `bson:"webVisitCount,omitempty"` // **官网访问 + NormalVisitCount *int64 `bson:"normalVisitCount,omitempty"` // **自来访问 + DistrictVisitCount *int64 `bson:"districtVisitCount,omitempty"` // **渠道访问 + + // 落地页访问 + LandpageAndroidClick *int64 `bson:"landpageAndroidClick,omitempty"` // 落地页android访问次数 + LandpageIosAppstoreClick *int64 `bson:"landpageIosAppstoreClick,omitempty"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick *int64 `bson:"landpageIosAthorClick,omitempty"` // 落地页iOS其他包访问次数 + LandpageIosH5Click *int64 `bson:"landpageIosH5Click,omitempty"` // 落地页H5访问次数 + + // 充值统计 + TotalAmount *int64 `bson:"totalAmount,omitempty"` // **充值金额总量 + // ------分类1 + DirectAmount *int64 `bson:"directAmount,omitempty"` // 直推充值金额 + DirectAmountCount *int64 `bson:"directAmountCount,omitempty"` // +直推充值订单数 + FissionAmount *int64 `bson:"fissionAmount,omitempty"` // 裂变充值金额 + FissionAmountCount *int64 `bson:"fissionAmountCount,omitempty"` // +裂变充值订单数 + NaturalAmount *int64 `bson:"naturalAmount,omitempty"` // 自然充值 + NaturalAmountCount *int64 `bson:"naturalAmountCount,omitempty"` // +自然充值订单数 + DeductionAmount *int64 `bson:"deductionAmount,omitempty"` // 充值扣量 + DeductionAmountCount *int64 `bson:"deductionAmountCount,omitempty"` // 充值扣量次数 + // ------分类2 + AndroidAmount *int64 `bson:"androidAmount,omitempty"` // +安卓充值金额 + AndroidAmountCount *int64 `bson:"androidAmountCount,omitempty"` // +安卓充值次数 + IosAmount *int64 `bson:"iosAmount,omitempty"` // +Ios充值金额 + IosAmountCount *int64 `bson:"iosAmountCount,omitempty"` // +Ios充值次数 + // ------分类3 + LightAmount *int64 `bson:"lightAmount,omitempty"` // light充值金额 + LightAmountCount *int64 `bson:"lightAmountCount,omitempty"` // light充值次数 + LightDirectAmount *int64 `bson:"lightDirectAmount,omitempty"` // light充值金额直推 + LightDirectAmountCount *int64 `bson:"lightDirectAmountCount,omitempty"` // light充值次数直推 + LightFissionAmount *int64 `bson:"lightFissionAmount,omitempty"` // light充值金额裂变 + LightFissionAmountCount *int64 `bson:"lightFissionAmountCount,omitempty"` // light充值次数裂变 + LightDeductionAmount *int64 `bson:"lightDeductionAmount,omitempty"` // light充值金额扣量 + LightDeductionAmountCount *int64 `bson:"lightDeductionAmountCount,omitempty"` // light充值次数扣量 + LightNaturalAmount *int64 `bson:"lightNaturalAmount,omitempty"` // light充值金额自然 + LightNaturalAmountCount *int64 `bson:"lightNaturalAmountCount,omitempty"` // light充值次数自然 + LightWebAmount *int64 `bson:"lightWebAmount,omitempty"` // light充值金额官网 + LightWebAmountCount *int64 `bson:"lightWebAmountCount,omitempty"` // light充值次数官网 + LightNormalAmount *int64 `bson:"lightNormalAmount,omitempty"` // light充值金额自来 + LightNormalAmountCount *int64 `bson:"lightNormalAmountCount,omitempty"` // light充值次数自来 + LightDistrictAmount *int64 `bson:"lightDistrictAmount,omitempty"` // light充值金额渠道 + LightDistrictAmountCount *int64 `bson:"lightDistrictAmountCount,omitempty"` // light充值次数渠道 + // ------分类5 + H5Amount *int64 `bson:"h5Amount,omitempty"` // +H5充值金额 + H5AmountCount *int64 `bson:"h5AmountCount,omitempty"` // +H5充值次数 + H5FormalAmount *int64 `bson:"h5FormalAmount,omitempty"` // 当日H5Formal充值 + H5FormalAmountCount *int64 `bson:"h5FormalAmountCount,omitempty"` // 当日H5Formal充值次数 + H5PcAmount *int64 `bson:"h5PcAmount,omitempty"` // 当日H5Pc充值 + H5PcAmountCount *int64 `bson:"h5PcAmountCount,omitempty"` // 当日H5Pc充值次数 + H5IosAmount *int64 `bson:"todayH5IosRecharge,omitempty"` // 当日H5Ios充值 + H5IosAmountCount *int64 `bson:"h5IosAmountCount,omitempty"` // 当日H5Ios充值次数 + H5AndroidAmount *int64 `bson:"h5AndroidAmount,omitempty"` // 当日H5Android充值 + H5AndroidAmountCount *int64 `bson:"h5AndroidAmountCount,omitempty"` // 当日H5Android充值次数 + // ------分类6 + WebAmount *int64 `bson:"webAmount,omitempty"` // **官网充值 + WebAmountCount *int64 `bson:"webAmountCount,omitempty"` // **官网充值次数 + NormalAmount *int64 `bson:"normalAmount,omitempty"` // **自来充值 + NormalAmountCount *int64 `bson:"normalAmountCount,omitempty"` // **自来充值次数 + DistrictAmount *int64 `bson:"districtAmount,omitempty"` // **渠道充值 + DistrictAmountCount *int64 `bson:"districtAmountCount,omitempty"` // **渠道充值次数 + // ------分类7 + RepeatAmount *int64 `bson:"repeatAmount,omitempty"` // 复冲金额 + RepeatAmountCount *int64 `bson:"repeatAmountCount,omitempty"` // +复冲订单数 + SuccessRechargeOrder *int64 `bson:"successRechargeOrder,omitempty"` // 充值成功订单数 + NewRechargeAmount *int64 `bson:"newRechargeAmount,omitempty"` // 新增充值金额 + NewRechargeCount *int64 `bson:"newRechargeCount,omitempty"` // +新增充值订单 + VipPayByMoney *int64 `bson:"vipPayByMoney,omitempty"` // 人民币购买 + VipPayByAmount *int64 `bson:"vipPayByAmount,omitempty"` // 余额购买 + VipRepeatAmount *int64 `bson:"vipRepeatAmount,omitempty"` // VIP复冲金额 + TotalRechargeOrder *int64 `bson:"totalRechargeOrder,omitempty"` // 拉起订单数 + // 游戏 + GameRechageAmount *int64 `bson:"gameRechageAmount,omitempty"` // 游戏充值 + GameWithdrawAmount *int64 `bson:"gameWithdrawAmount,omitempty"` // 游戏提现 +} diff --git a/models/dailystatadvertise/stat.go b/models/dailystatadvertise/stat.go new file mode 100644 index 0000000..337ced3 --- /dev/null +++ b/models/dailystatadvertise/stat.go @@ -0,0 +1,128 @@ +package dailystatadvertise + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.DailyStatAdvertise) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.DailyStatAdvertise.SumDate, Value: 1}, + {Key: FN.DailyStatAdvertise.AppId, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(DailyStatAdvertise:initDailyStatAdvertiseIndex) Create DailyStatAdvertise Index failed! err:%+v:", err)) + } +} + +//InsertOneDailyStatAdvertise 插入一个VIP购买记录 +func InsertOneDailyStatAdvertise(ctx context.Context, DailyStatAdvertise *DailyStatAdvertise) error { + if _, err := db.InsertOne(ctx, DailyStatAdvertise); err != nil { + log.Warn("DailyStatAdvertise:InsertOneDailyStatAdvertise db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneDailyStatAdvertise 查找一个VIP购买记录 +func FindOneDailyStatAdvertise(ctx context.Context, filter bson.M) ( + *DailyStatAdvertise, error) { + var DailyStatAdvertise DailyStatAdvertise + if err := db.FindOne(ctx, &DailyStatAdvertise, filter); err != nil { + return nil, err + } + return &DailyStatAdvertise, nil +} + +//DelOneDailyStatAdvertise 删除一个VIP购买记录 +func DelOneDailyStatAdvertise(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("DailyStatAdvertise:DelOneDailyStatAdvertise db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneDailyStatAdvertise 更新一个VIP购买记录 +func UpdateOneDailyStatAdvertise(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneDailyStatAdvertise db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountDailyStatAdvertises 统计VIP购买记录数量 +func CountDailyStatAdvertises(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("DailyStatAdvertise:CountDailyStatAdvertises db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyDailyStatAdvertise 更新满足条件的VIP购买记录 +func UpdateManyDailyStatAdvertise(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyDailyStatAdvertise db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyDailyStatAdvertise 查找一批VIP购买记录数据 +func FindManyDailyStatAdvertise(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (DailyStatAdvertiseList, error) { + data := make(DailyStatAdvertiseList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("DailyStatAdvertise:FindManyDailyStatAdvertise db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyDailyStatAdvertiseWithBind 用自己定义结构查找一批VIP购买记录数据 +func FindManyDailyStatAdvertiseWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("DailyStatAdvertise:FindManyDailyStatAdvertiseWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateDailyStatAdvertises 聚合查找一批VIP购买记录信息 +func AggregateDailyStatAdvertises(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateDailyStatAdvertises db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/dailystatadvertise/tag.go b/models/dailystatadvertise/tag.go new file mode 100755 index 0000000..438f139 --- /dev/null +++ b/models/dailystatadvertise/tag.go @@ -0,0 +1,34 @@ +package dailystatadvertise + +type TagDailyStatAdvertise struct { + AppId string + AppName string + Day1RetainRate string + Day3RetainRate string + Day7RetainRate string + DirectVisitCount string + ID string + NewDirectCount string + SumDate string +} + +var FN struct { + DailyStatAdvertise TagDailyStatAdvertise +} + +var TN struct { + DailyStatAdvertise string +} + +func init() { + FN.DailyStatAdvertise.AppId = "appId" + FN.DailyStatAdvertise.AppName = "appName" + FN.DailyStatAdvertise.Day1RetainRate = "day1RetainRate" + FN.DailyStatAdvertise.Day3RetainRate = "day3RetainRate" + FN.DailyStatAdvertise.Day7RetainRate = "day7RetainRate" + FN.DailyStatAdvertise.DirectVisitCount = "directVisitCount" + FN.DailyStatAdvertise.ID = "_id" + FN.DailyStatAdvertise.NewDirectCount = "newDirectCount" + FN.DailyStatAdvertise.SumDate = "sumDate" + TN.DailyStatAdvertise = "dailystat_advertise" +} diff --git a/models/dailystatadvertise/type.go b/models/dailystatadvertise/type.go new file mode 100644 index 0000000..e6ee69c --- /dev/null +++ b/models/dailystatadvertise/type.go @@ -0,0 +1,22 @@ +package dailystatadvertise + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 帖子模型,数据库中的 +// @table:dailystat_advertise +type DailyStatAdvertise struct { + ID primitive.ObjectID `bson:"_id,omitempty"` // ID + SumDate time.Time `bson:"sumDate" json:"sumDate"` // 记录时间 按天对齐 + AppId int32 `bson:"appId,omitempty" json:"appId"` // appId + AppName string `bson:"appName,omitempty" json:"appName"` // app名称 + NewDirectCount int64 `bson:"newDirectCount,omitempty" json:"newDirectCount"` // 新增直推 + DirectVisitCount int64 `bson:"directVisitCount,omitempty" json:"directVisitCount"` // 直推访问数 + Day1RetainRate string `bson:"day1RetainRate,omitempty" json:"day1RetainRate"` // 次日留存率 + Day3RetainRate string `bson:"day3RetainRate,omitempty" json:"day3RetainRate"` // 3日留存率 + Day7RetainRate string `bson:"day7RetainRate,omitempty" json:"day7RetainRate"` // 7日留存率 +} +type DailyStatAdvertiseList []*DailyStatAdvertise diff --git a/models/dailystatmod/daily.go b/models/dailystatmod/daily.go new file mode 100644 index 0000000..29dfbf2 --- /dev/null +++ b/models/dailystatmod/daily.go @@ -0,0 +1,177 @@ +package dailystatmod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + "time" + + "go.mongodb.org/mongo-driver/mongo" + + "go.mongodb.org/mongo-driver/mongo/options" + + "go.mongodb.org/mongo-driver/bson" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollDailyStat) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "sumDate", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollDailyStat, err)) + } +} + +// UpsertDailyStat 更新或插入一条统计记录 +func UpsertDailyStat(ctx context.Context, sumDate time.Time, appId int32, doc DailyStatDoc) (err error) { + var filter = bson.M{ + "sumDate": sumDate, + "appId": appId, + } + var update = mongos.ToBsonM(doc) + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + + _, err = db.InsertOne(ctx, insertDoc) + } + + return +} + +// 获取日常统计列表 +func GetDailyStatList(ctx context.Context, appId *[]int32, start, end *time.Time, skip, limit int64) (count int64, data []*DailyStatMod, err error) { + filter := bson.M{} + if appId != nil { + filter["appId"] = bson.M{"$in": appId} + } + + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "sumDate", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("channel GetDailyStatList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("channel GetDailyStatList Count err", log.E(err)) + return + } + + return +} + +// 获取日常统计列表 +func GetDailyStatTotalList(ctx context.Context, appId *int32, start, end *time.Time) (data []*DailyStatMod, err error) { + filter := bson.M{} + if appId != nil { + filter["appId"] = appId + } + + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("channel GetDailyStatList Find err", log.E(err)) + return + } + + return +} + +type OnItem func(item *DailyStatMod) + +// 获取日常统计列表 +func GetDailyStatTotalListShard(ctx context.Context, appId *[]int32, start, end *time.Time, shard time.Duration, onItem OnItem) error { + if start == nil { + b := utils.DefaultStatBeginTime + start = &b + } + if end == nil { + e := time.Now() + end = &e + } + segments := utils.CalcTimeSegments(*start, *end, shard) + for _, segment := range segments { + filter := bson.M{ + "sumDate": bson.M{"$gte": segment.Begin, "$lt": segment.End}, + } + if appId != nil { + filter["appId"] = bson.M{"$in": appId} + } + list := make([]*DailyStatMod, 0) + if err := db.Find(ctx, &list, filter); err != nil { + log.Error("channel GetDailyStatList Find err", log.E(err)) + return err + } + for _, item := range list { + onItem(item) + } + } + return nil +} + +// 获取日常统计列表 +func FindOneDailyStat(ctx context.Context, appId int32, sumDate time.Time) (data DailyStatMod, err error) { + filter := bson.M{ + "appId": appId, + "sumDate": sumDate, + } + + if err = db.FindOne(ctx, &data, filter); err != nil { + log.Error("channel GetDailyStatList Find err", log.E(err)) + return + } + + return +} + +func FindDailyStatList(ctx context.Context, appIds []int32, sumDate time.Time) (list []DailyStatMod, err error) { + filter := bson.M{ + "appId": bson.M{"$in": appIds}, + "sumDate": sumDate, + } + + log.Info("FindDailyStatList", log.Any("filter", filter)) + + list = make([]DailyStatMod, 0) + if err = db.Find(ctx, &list, filter); err != nil { + log.Error("channel GetDailyStatList Find err", log.E(err)) + return + } + + return +} diff --git a/models/dailystatmod/helper.go b/models/dailystatmod/helper.go new file mode 100644 index 0000000..cb28213 --- /dev/null +++ b/models/dailystatmod/helper.go @@ -0,0 +1,24 @@ +package dailystatmod + +import "time" + +var ( + fixTime time.Time +) + +func init() { + time.Local, _ = time.LoadLocation("Asia/Shanghai") + fixTime, _ = time.ParseInLocation("2006-01-02", "2023-07-14", time.Local) +} + +func (s *DailyStatMod) CorrectValidData() *DailyStatMod { + if s.SumDate.Before(fixTime) { + s.TotalAmount = s.DirectAmount + s.FissionAmount + s.DeductionAmount + s.NewTotalCount = s.NewDirectCount + s.NewFissionCount + s.NewDeductionCount + s.TotalVisitCount = s.DirectVisitCount + s.FissionVisitCount + s.DeductionVisitCount + s.LightAddCount = s.LightDirectCount + s.LightFissionCount + s.LightDeductionCount + s.LightRechargeCount = s.LightDirectRechargeCount + s.LightFissionRechargeCount + s.LightDeductionRechargeCount + s.LightRechargeAmount = s.LightDirectRechargeAmount + s.LightFissionRechargeAmount + s.LightDeductionRechargeAmount + } + return s +} diff --git a/models/dailystatmod/type.go b/models/dailystatmod/type.go new file mode 100644 index 0000000..3f3dbeb --- /dev/null +++ b/models/dailystatmod/type.go @@ -0,0 +1,260 @@ +package dailystatmod + +import ( + "stat/common/mongos" + "time" +) + +// 表名 +const CollDailyStat = "daily_stat" + +var db *mongos.MongoTool + +// DailyStatMod APP日常统计 +type DailyStatMod struct { + SumDate time.Time `bson:"sumDate"` // 记录时间 按天对齐 + AppId int32 `bson:"appId"` // appId + // 注册用户 + NewTotalCount int64 `bson:"newTotalCount,omitempty"` // 注册总量 + NewDirectCount int64 `bson:"newDirectCount,omitempty"` // 直推注册 + NewFissionCount int64 `bson:"newFissionCount,omitempty"` // 裂变注册 + NewDeductionCount int64 `bson:"newDeductionCount,omitempty"` // 扣量注册 + NewNaturalCount int64 `bson:"newNaturalCount,omitempty"` // 自然注册 + NewWebCount int64 `bson:"newWebCount,omitempty"` // 官网注册 + NewDistrictCount int64 `bson:"newDistrictCount,omitempty"` // 渠道注册 + NewNormalCount int64 `bson:"newNormalCount,omitempty"` // 自来注册 + AndroidAddCount int64 `bson:"androidAddCount,omitempty"` // android注册 + IosAddCount int64 `bson:"iosAddCount,omitempty"` // ios注册 + // 轻量注册 + LightAddCount int64 `bson:"lightAddCount,omitempty"` // ##轻量注册 + LightGuestAddCount int64 `bson:"lightGuestAddCount,omitempty"` // 轻量游客注册 + LightFormalAddCount int64 `bson:"lightFormalAddCount,omitempty"` // 轻量正式注册 + LightDirectCount int64 `bson:"lightDirectCount,omitempty"` // 轻量直推注册 + LightFissionCount int64 `bson:"lightFissionCount,omitempty"` // 轻量裂变注册 + LightDeductionCount int64 `bson:"lightDeductionCount,omitempty"` // 轻量扣量注册 + LightNaturalCount int64 `bson:"lightNaturalCount,omitempty"` // 轻量自然注册 + LightWebCount int64 `bson:"lightWebCount,omitempty"` // 轻量官网注册 + LightDistrictCount int64 `bson:"lightDistrictCount,omitempty"` // 轻量渠道注册 + LightNormalCount int64 `bson:"lightNormalCount,omitempty"` // 轻量自来注册 + // H5注册 + H5AddCount int64 `bson:"h5AddCount,omitempty"` // H5注册 + H5FormalCount int64 `bson:"h5FormalCount,omitempty"` // H5正式注册 + H5PcAddCount int64 `bson:"h5PcAddCount,omitempty"` // H5Pc注册 + H5IosAddCount int64 `bson:"h5IosAddCount,omitempty"` // H5Ios注册 + H5AndroidAddCount int64 `bson:"h5AndroidAddCount,omitempty"` // H5Android注册 + // 访问统计 + TotalVisitCount int64 `bson:"totalVisitCount,omitempty"` // 总计访问数 + DirectVisitCount int64 `bson:"directVisitCount,omitempty"` // 直推访问数 + FissionVisitCount int64 `bson:"fissionVisitCount,omitempty"` // 裂变访问数 + DeductionVisitCount int64 `bson:"deductionVisitCount,omitempty"` // 扣量访问数 + NaturalVisitCount int64 `bson:"naturalVisitCount,omitempty"` // 自然访问数 + TodayDistrictVisitCount int64 `bson:"todayDistrictVisitCount,omitempty"` // 当日渠道访问量 + TodayWebVisitCount int64 `bson:"todayWebVisitCount,omitempty"` // 当日官网访问量 + TodayNormalVisitCount int64 `bson:"todayNormalVisitCount,omitempty"` // 当日自来访问量 + TodayIosVisitCount int64 `bson:"todayIosVisitCount,omitempty"` // 当日IOS访问量 + TodayAndroidVisitCount int64 `bson:"todayAndroidVisitCount,omitempty"` // 当日安卓访问量 + // 轻量访问 + LightVisitCount int64 `bson:"lightVisitCount,omitempty"` // 当日Light访问量 + LightDirectVisitCount int64 `bson:"lightDirectVisitCount,omitempty"` // 轻量直推访问 + LightFissionVisitCount int64 `bson:"lightFissionVisitCount,omitempty"` // 轻量裂变访问 + LightDeductionVisitCount int64 `bson:"lightDeductionVisitCount,omitempty"` // 轻量扣量访问 + LightNaturalVisitCount int64 `bson:"lightNaturalVisitCount,omitempty"` // 轻量自然访问 + LightWebVisitCount int64 `bson:"lightWebVisitCount,omitempty"` // 轻量官网访问 + LightDistrictVisitCount int64 `bson:"lightDistrictVisitCount,omitempty"` // 轻量渠道访问 + LightNormalVisitCount int64 `bson:"lightNormalVisitCount,omitempty"` // 轻量自来访问 + // H5访问 + TodayH5VisitCount int64 `bson:"todayH5VisitCount,omitempty"` // 当日H5访问量 + TodayH5PcVisitCount int64 `bson:"todayH5PcVisitCount,omitempty"` // 当日H5Pc访问量 + TodayH5IosVisitCount int64 `bson:"todayH5IosVisitCount,omitempty"` // 当日H5Ios访问量 + TodayH5AndroidVisitCount int64 `bson:"todayH5AndroidVisitCount,omitempty"` // 当日H5Android访问量 + // 落地页访问 + LandpageAndroidClick int64 `bson:"landpageAndroidClick,omitempty"` // 落地页android访问次数 + LandpageIosAppstoreClick int64 `bson:"landpageIosAppstoreClick,omitempty"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick int64 `bson:"landpageIosAthorClick,omitempty"` // 落地页iOS其他包访问次数 + LandpageIosH5Click int64 `bson:"landpageIosH5Click,omitempty"` // 落地页H5访问次数 + // 当日充值 + TotalAmount int64 `bson:"totalAmount,omitempty"` // 充值金额 + SuccessRechargeOrder int64 `bson:"successRechargeOrder,omitempty"` // 充值成功订单数 + DirectAmount int64 `bson:"directAmount,omitempty"` // 直推充值金额 + DirectAmountCount int64 `bson:"directAmountcount,omitempty"` // 直推充值订单 + FissionAmount int64 `bson:"fissionAmount,omitempty"` // 裂变充值金额 + FissionAmountCount int64 `bson:"fissionAmountcount,omitempty"` // 裂变充值订单 + DeductionAmount int64 `bson:"deductionAmount,omitempty"` // 扣量金额 + DeductionAmountCount int64 `bson:"deductionAmountCount,omitempty"` // 扣量充值订单 + NaturalAmount int64 `bson:"naturalAmount,omitempty"` // 自然充值 + NaturalAmountCount int64 `bson:"naturalAmountCount,omitempty"` // 自然充值订单 + TodayDistrictRecharge int64 `bson:"todayDistrictRecharge,omitempty"` // 当日渠道充值新增 + TodayWebRecharge int64 `bson:"todayWebRecharge,omitempty"` // 当日官网充值新增 + TodayNormalRecharge int64 `bson:"todayNormalRecharge,omitempty"` // 当日自来量充值新增 + TodayAndroidRecharge int64 `bson:"todayAndroidRecharge,omitempty"` // 当日android充值 + TodayIosRecharge int64 `bson:"todayIosRecharge,omitempty"` // 当日Ios充值 + TodayH5Recharge int64 `bson:"todayH5Recharge,omitempty"` // 当日H5充值 + TodayH5FormalRecharge int64 `bson:"todayH5FormalRecharge,omitempty"` // 当日H5Formal充值 + TodayH5PcRecharge int64 `bson:"todayH5PcRecharge,omitempty"` // 当日H5Pc充值 + TodayH5IosRecharge int64 `bson:"todayH5IosRecharge,omitempty"` // 当日H5Ios充值 + TodayH5AndroidRecharge int64 `bson:"todayH5AndroidRecharge,omitempty"` // 当日H5Android充值 + // 轻量充值次数 + LightRechargeCount int64 `bson:"lightRechargeCount,omitempty"` // 当日轻量充值次数 + LightDirectRechargeCount int64 `bson:"lightDirectRechargeCount,omitempty"` // 轻量直推充值次数 + LightFissionRechargeCount int64 `bson:"lightFissionRechargeCount,omitempty"` // 轻量裂变充值次数 + LightDeductionRechargeCount int64 `bson:"lightDeductionRechargeCount,omitempty"` // 轻量扣量充值次数 + LightNaturalRechargeCount int64 `bson:"lightNaturalRechargeCount,omitempty"` // 轻量自然充值次数 + LightWebRechargeCount int64 `bson:"lightWebRechargeCount,omitempty"` // 轻量官网充值次数 + LightDistrictRechargeCount int64 `bson:"lightDistrictRechargeCount,omitempty"` // 轻量渠道充值次数 + LightNormalRechargeCount int64 `bson:"lightNormalRechargeCount,omitempty"` // 轻量自来充值次数 + // 轻量充值钱数 + LightRechargeAmount int64 `bson:"lightRechargeAmount,omitempty"` // 当日轻量充值钱数 + LightDirectRechargeAmount int64 `bson:"lightDirectRechargeAmount,omitempty"` // 轻量直推充值钱数 + LightFissionRechargeAmount int64 `bson:"lightFissionRechargeAmount,omitempty"` // 轻量裂变充值钱数 + LightDeductionRechargeAmount int64 `bson:"lightDeductionRechargeAmount,omitempty"` // 轻量扣量充值钱数 + LightNaturalRechargeAmount int64 `bson:"lightNaturalRechargeAmount,omitempty"` // 轻量自然充值钱数 + LightWebRechargeAmount int64 `bson:"lightWebRechargeAmount,omitempty"` // 轻量官网充值钱数 + LightDistrictRechargeAmount int64 `bson:"lightDistrictRechargeAmount,omitempty"` // 轻量渠道充值钱数 + LightNormalRechargeAmount int64 `bson:"lightNormalRechargeAmount,omitempty"` // 轻量自来充值钱数 + // 其他充值 + VipPayByMoney int64 `bson:"vipPayByMoney,omitempty"` // 人民币购买 + VipPayByAmount int64 `bson:"vipPayByAmount,omitempty"` // 余额购买 + RepeatAmount int64 `bson:"repeatAmount,omitempty"` // 复冲金额 + RepeatCount int64 `bson:"repeatCount,omitempty"` // 复冲人数 + // 游戏充值 + GameRechageAmount int64 `bson:"gameRechageAmount,omitempty"` // 游戏充值 + GameWithdrawAmount int64 `bson:"gameWithdrawAmount,omitempty"` // 游戏提现 + // + TodayVipRecharge int64 `bson:"todayVipRecharge,omitempty"` // 当日渠道充值新增 + NewVipPayMoney int64 `bson:"newVipPayMoney,omitempty"` // 新增购买VIP + RepeatVipMoney int64 `bson:"repeatVipMoney,omitempty"` // 复冲VIP + // 新增充值 + NewRechargeAmount int64 `bson:"newRechargeAmount,omitempty"` // 新增充值金额(新用户) + NewRechargeCount int64 `bson:"newRechargeCount,omitempty"` // 新增充值数(新用户) + + // 留存率 + Day1RetainRate float64 `bson:"day1RetainRate,omitempty"` // 次日留存率 + Day3RetainRate float64 `bson:"day3RetainRate,omitempty"` // 3日留存率 + Day7RetainRate float64 `bson:"day7RetainRate,omitempty"` // 7日留存率 + // 订单 + TotalRechargeOrder int64 `bson:"totalRechargeOrder,omitempty"` // 拉起订单数 + // 时间 + UpdatedAt time.Time `bson:"updatedAt,omitempty"` // 更新时间 +} + +type DailyStatDoc struct { + // 注册用户 + NewTotalCount *int64 `bson:"newTotalCount,omitempty"` // **注册总量 + NewDirectCount *int64 `bson:"newDirectCount,omitempty"` // 直推注册 + NewFissionCount *int64 `bson:"newFissionCount,omitempty"` // 裂变注册 + NewDeductionCount *int64 `bson:"newDeductionCount,omitempty"` // 扣量注册 + NewNaturalCount *int64 `bson:"newNaturalCount,omitempty"` // 自然注册 + NewWebCount *int64 `bson:"newWebCount,omitempty"` // 官网注册 + NewDistrictCount *int64 `bson:"newDistrictCount,omitempty"` // 渠道注册 + NewNormalCount *int64 `bson:"newNormalCount,omitempty"` // 自来注册 + AndroidAddCount *int64 `bson:"androidAddCount,omitempty"` // android注册 + IosAddCount *int64 `bson:"iosAddCount,omitempty"` // ios注册 + // 轻量注册 + LightAddCount *int64 `bson:"lightAddCount,omitempty"` // ##轻量注册 + LightGuestAddCount *int64 `bson:"lightGuestAddCount,omitempty"` // 轻量游客注册 + LightFormalAddCount *int64 `bson:"lightFormalAddCount,omitempty"` // 轻量正式注册 + LightDirectCount *int64 `bson:"lightDirectCount,omitempty"` // 轻量直推注册 + LightFissionCount *int64 `bson:"lightFissionCount,omitempty"` // 轻量裂变注册 + LightDeductionCount *int64 `bson:"lightDeductionCount,omitempty"` // 轻量扣量注册 + LightNaturalCount *int64 `bson:"lightNaturalCount,omitempty"` // 轻量自然注册 + LightWebCount *int64 `bson:"lightWebCount,omitempty"` // 轻量官网注册 + LightDistrictCount *int64 `bson:"lightDistrictCount,omitempty"` // 轻量渠道注册 + LightNormalCount *int64 `bson:"lightNormalCount,omitempty"` // 轻量自来注册 + // H5注册 + H5AddCount *int64 `bson:"h5AddCount,omitempty"` // H5注册 + H5FormalCount *int64 `bson:"h5FormalCount,omitempty"` // H5正式注册 + H5PcAddCount *int64 `bson:"h5PcAddCount,omitempty"` // H5Pc注册 + H5IosAddCount *int64 `bson:"h5IosAddCount,omitempty"` // H5Ios注册 + H5AndroidAddCount *int64 `bson:"h5AndroidAddCount,omitempty"` // H5Android注册 + // 访问统计 + TotalVisitCount *int64 `bson:"totalVisitCount,omitempty"` // **总计访问数 + DirectVisitCount *int64 `bson:"directVisitCount,omitempty"` // 直推访问数 + FissionVisitCount *int64 `bson:"fissionVisitCount,omitempty"` // 裂变访问数 + DeductionVisitCount *int64 `bson:"deductionVisitCount,omitempty"` // 扣量访问数 + NaturalVisitCount *int64 `bson:"naturalVisitCount,omitempty"` // **自然访问数 + TodayDistrictVisitCount *int64 `bson:"todayDistrictVisitCount,omitempty"` // **当日渠道访问量 + TodayWebVisitCount *int64 `bson:"todayWebVisitCount,omitempty"` // **当日官网访问量 + TodayNormalVisitCount *int64 `bson:"todayNormalVisitCount,omitempty"` // **当日自来访问量 + TodayIosVisitCount *int64 `bson:"todayIosVisitCount,omitempty"` // 当日IOS访问量 + TodayAndroidVisitCount *int64 `bson:"todayAndroidVisitCount,omitempty"` // 当日安卓访问量 + // 轻量访问 + LightVisitCount *int64 `bson:"lightVisitCount,omitempty"` // 当日Light访问量 + LightDirectVisitCount *int64 `bson:"lightDirectVisitCount,omitempty"` // 轻量直推访问 + LightFissionVisitCount *int64 `bson:"lightFissionVisitCount,omitempty"` // 轻量裂变访问 + LightDeductionVisitCount *int64 `bson:"lightDeductionVisitCount,omitempty"` // 轻量扣量访问 + LightNaturalVisitCount *int64 `bson:"lightNaturalVisitCount,omitempty"` // 轻量自然访问 + LightWebVisitCount *int64 `bson:"lightWebVisitCount,omitempty"` // 轻量官网访问 + LightDistrictVisitCount *int64 `bson:"lightDistrictVisitCount,omitempty"` // 轻量渠道访问 + LightNormalVisitCount *int64 `bson:"lightNormalVisitCount,omitempty"` // 轻量自来访问 + // H5访问 + TodayH5VisitCount *int64 `bson:"todayH5VisitCount,omitempty"` // 当日H5访问量 + TodayH5PcVisitCount *int64 `bson:"todayH5PcVisitCount,omitempty"` // 当日H5Pc访问量 + TodayH5IosVisitCount *int64 `bson:"todayH5IosVisitCount,omitempty"` // 当日H5Ios访问量 + TodayH5AndroidVisitCount *int64 `bson:"todayH5AndroidVisitCount,omitempty"` // 当日H5Android访问量 + // 落地页访问 + LandpageAndroidClick *int64 `bson:"landpageAndroidClick,omitempty"` // 落地页android访问次数 + LandpageIosAppstoreClick *int64 `bson:"landpageIosAppstoreClick,omitempty"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick *int64 `bson:"landpageIosAthorClick,omitempty"` // 落地页iOS其他包访问次数 + LandpageIosH5Click *int64 `bson:"landpageIosH5Click,omitempty"` // 落地页H5访问次数 + // 当日充值 + TotalAmount *int64 `bson:"totalAmount,omitempty"` // 充值金额 + SuccessRechargeOrder *int64 `bson:"successRechargeOrder,omitempty"` // 充值成功订单数 + DirectAmount *int64 `bson:"directAmount,omitempty"` // 直推充值金额 + DirectAmountCount *int64 `bson:"directAmountcount,omitempty"` // 直推充值订单 + FissionAmount *int64 `bson:"fissionAmount,omitempty"` // 裂变充值金额 + FissionAmountCount *int64 `bson:"fissionAmountcount,omitempty"` // 裂变充值订单 + DeductionAmount *int64 `bson:"deductionAmount,omitempty"` // 扣量金额 + DeductionAmountCount *int64 `bson:"deductionAmountCount,omitempty"` // 扣量充值订单 + NaturalAmount *int64 `bson:"naturalAmount,omitempty"` // 自然充值 + NaturalAmountCount *int64 `bson:"naturalAmountCount,omitempty"` // **自然充值订单 + TodayDistrictRecharge *int64 `bson:"todayDistrictRecharge,omitempty"` // 当日渠道充值新增 + TodayWebRecharge *int64 `bson:"todayWebRecharge,omitempty"` // 当日官网充值新增 + TodayNormalRecharge *int64 `bson:"todayNormalRecharge,omitempty"` // 当日自来量充值新增 + TodayAndroidRecharge *int64 `bson:"todayAndroidRecharge,omitempty"` // 当日android充值 + TodayIosRecharge *int64 `bson:"todayIosRecharge,omitempty"` // 当日Ios充值 + TodayH5Recharge *int64 `bson:"todayH5Recharge,omitempty"` // 当日H5充值 + TodayH5FormalRecharge *int64 `bson:"todayH5FormalRecharge,omitempty"` // 当日H5Formal充值 + TodayH5PcRecharge *int64 `bson:"todayH5PcRecharge,omitempty"` // 当日H5Pc充值 + TodayH5IosRecharge *int64 `bson:"todayH5IosRecharge,omitempty"` // 当日H5Ios充值 + TodayH5AndroidRecharge *int64 `bson:"todayH5AndroidRecharge,omitempty"` // 当日H5Android充值 + // 轻量充值次数 + LightRechargeCount *int64 `bson:"lightRechargeCount,omitempty"` // 当日轻量充值次数 + LightDirectRechargeCount *int64 `bson:"lightDirectRechargeCount,omitempty"` // 轻量直推充值次数 + LightFissionRechargeCount *int64 `bson:"lightFissionRechargeCount,omitempty"` // 轻量裂变充值次数 + LightDeductionRechargeCount *int64 `bson:"lightDeductionRechargeCount,omitempty"` // 轻量扣量充值次数 + LightNaturalRechargeCount *int64 `bson:"lightNaturalRechargeCount,omitempty"` // 轻量自然充值次数 + LightWebRechargeCount *int64 `bson:"lightWebRechargeCount,omitempty"` // 轻量官网充值次数 + LightDistrictRechargeCount *int64 `bson:"lightDistrictRechargeCount,omitempty"` // 轻量渠道充值次数 + LightNormalRechargeCount *int64 `bson:"lightNormalRechargeCount,omitempty"` // 轻量自来充值次数 + // 轻量充值钱数 + LightRechargeAmount *int64 `bson:"lightRechargeAmount,omitempty"` // 当日轻量充值钱数 + LightDirectRechargeAmount *int64 `bson:"lightDirectRechargeAmount,omitempty"` // 轻量直推充值钱数 + LightFissionRechargeAmount *int64 `bson:"lightFissionRechargeAmount,omitempty"` // 轻量裂变充值钱数 + LightDeductionRechargeAmount *int64 `bson:"lightDeductionRechargeAmount,omitempty"` // 轻量扣量充值钱数 + LightNaturalRechargeAmount *int64 `bson:"lightNaturalRechargeAmount,omitempty"` // 轻量自然充值钱数 + LightWebRechargeAmount *int64 `bson:"lightWebRechargeAmount,omitempty"` // 轻量官网充值钱数 + LightDistrictRechargeAmount *int64 `bson:"lightDistrictRechargeAmount,omitempty"` // 轻量渠道充值钱数 + LightNormalRechargeAmount *int64 `bson:"lightNormalRechargeAmount,omitempty"` // 轻量自来充值钱数 + // 其他充值 + VipPayByMoney *int64 `bson:"vipPayByMoney,omitempty"` // 人民币购买 + VipPayByAmount *int64 `bson:"vipPayByAmount,omitempty"` // 余额购买 + RepeatAmount *int64 `bson:"repeatAmount,omitempty"` // 复冲金额 + RepeatCount *int64 `bson:"repeatCount,omitempty"` // 复冲人数 + // 游戏充值 + GameRechageAmount *int64 `bson:"gameRechageAmount,omitempty"` // 游戏充值 + GameWithdrawAmount *int64 `bson:"gameWithdrawAmount,omitempty"` // 游戏提现 + // + TodayVipRecharge *int64 `bson:"todayVipRecharge,omitempty"` // 当日渠道充值新增 + NewVipPayMoney *int64 `bson:"newVipPayMoney,omitempty"` // 新增购买VIP + RepeatVipMoney *int64 `bson:"repeatVipMoney,omitempty"` // 复冲VIP + // 新增充值 + NewRechargeAmount *int64 `bson:"newRechargeAmount,omitempty"` // 新增充值金额(新用户) + NewRechargeCount *int64 `bson:"newRechargeCount,omitempty"` // 新增充值数(新用户) + + // 留存率 + Day1RetainRate *float64 `bson:"day1RetainRate,omitempty"` // 次日留存率 + Day3RetainRate *float64 `bson:"day3RetainRate,omitempty"` // 3日留存率 + Day7RetainRate *float64 `bson:"day7RetainRate,omitempty"` // 7日留存率 + // 订单 + TotalRechargeOrder *int64 `bson:"totalRechargeOrder,omitempty"` // 拉起订单数 +} diff --git a/models/domainmod/domain.go b/models/domainmod/domain.go new file mode 100644 index 0000000..57029ed --- /dev/null +++ b/models/domainmod/domain.go @@ -0,0 +1,115 @@ +package domainmod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollDomainCheck) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: "name", Value: 1}, + }, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{ + {Key: "category", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "Domainus", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "checkTime", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "createdAt", Value: 1}, + }, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollDomainCheck, err)) + } +} + +// CountDomains 统计数量 +func CountDomains(ctx context.Context, filter bson.M) (int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("downloadDomain CountDomains db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// InsertOneDomain 插入一个 +func InsertOneDomain(ctx context.Context, media *Domain) error { + if _, err := db.InsertOne(ctx, media); err != nil { + log.Warn("downloadDomain:InsertOneDomain db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// FindOneDomain 查找一个 +func FindOneDomain(ctx context.Context, filter bson.M) (*Domain, error) { + var Domain Domain + if err := db.FindOneEx(ctx, &Domain, filter); err != nil { + log.Warn("downloadDomain:FindOneDomainEx db.FindOneEx failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &Domain, nil +} + +// DelOneDomain 删除一个 +func DelOneDomain(ctx context.Context, filter bson.M) (int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("downloadDomain:DelOneDomain db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateOneDomain 更新一个 +func UpdateOneDomain(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("downloadDomain:UpdateOneDomain db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + + return nil +} + +// FindManyDomain 查找一批 +func FindManyDomain(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (DomainList, error) { + data := make(DomainList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("downloadDomain:FindManyDomain db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} diff --git a/models/domainmod/type.go b/models/domainmod/type.go new file mode 100644 index 0000000..a74b6c8 --- /dev/null +++ b/models/domainmod/type.go @@ -0,0 +1,164 @@ +package domainmod + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 表名 +const CollDomainCheck = "domain" + +var db *mongos.MongoTool + +type Category int32 + +const ( + CategoryNone Category = 0 // 无分类 + CategoryAPI Category = 1 // API接口 + CategoryWeb Category = 2 // 网站 + CategoryLand Category = 3 // 落地页 + CategoryH5 Category = 4 // H5页面 + CategoryDown Category = 5 // 文件下载 + CategoryImage Category = 6 // 图片下载 + CategoryVideo Category = 7 // 视频播放 + CategoryJump Category = 8 // 跳转域名 + CategoryLight Category = 9 // 轻量版域名 + +) + +type CheckType int32 + +const ( + CheckTypeNone CheckType = 0 // 占位符,无意义 + CheckTypeWeb CheckType = 1 // 网站检测 + CheckTypeDNS CheckType = 2 // DNS检测 + CheckTypePing CheckType = 3 // Ping检测 + CheckTypeHijack CheckType = 4 // 劫持检测 + CheckTypePollute CheckType = 5 // 污染检测 + CheckTypeQQ CheckType = 6 // QQ拦截检测 + CheckTypeWeChat CheckType = 7 // 微信拦截检测 + CheckTypeBlack CheckType = 8 // 域名黑名单检测 + CheckTypeGFW CheckType = 9 // 被墙检测 + +) + +func (c CheckType) Name() string { + switch c { + case CheckTypeNone: + return "无检测" + case CheckTypeWeb: + return "网站检测" + case CheckTypeDNS: + return "DNS检测" + case CheckTypePing: + return "PING检测" + case CheckTypeHijack: + return "劫持检测" + case CheckTypePollute: + return "污染检测" + case CheckTypeQQ: + return "QQ拦截" + case CheckTypeWeChat: + return "微信拦截" + case CheckTypeBlack: + return "域名黑名单" + case CheckTypeGFW: + return "被墙检测" + default: + return "未知检测" + } +} + +func GetCheckTypes() []CheckType { + return []CheckType{CheckTypeWeb, CheckTypeDNS, CheckTypePing, CheckTypeHijack, CheckTypePollute, CheckTypeQQ, CheckTypeWeChat, CheckTypeBlack, CheckTypeGFW} +} + +type CheckStatus int32 + +const ( + CheckStatusNone CheckStatus = 0 // 超时跳过 + CheckStatusChecking CheckStatus = 1 // 正在检测 + CheckStatusSucc CheckStatus = 2 // 完全通过 + CheckStatusFailed CheckStatus = 3 // 没有通过 + CheckStatusPartPass CheckStatus = 4 // 部分通过 +) + +func (v CheckStatus) String() string { + switch v { + case CheckStatusNone: + return "超时跳过" + case CheckStatusChecking: + return "正在检测" + case CheckStatusSucc: + return "完全通过" + case CheckStatusFailed: + return "没有通过" + case CheckStatusPartPass: + return "部分通过" + default: + return "未知状态" + } +} + +type CheckResult struct { + Domain string `json:"domain" bson:"domain"` + CheckType CheckType `json:"checkType" bson:"checkType"` + NodeCount int `json:"nodeCount" bson:"nodeCount"` + SuccCount int `json:"succCount" bson:"succCount"` + FailedCount int `json:"failedCount" bson:"failedCount"` + NodeErrors []string `json:"nodeErrors" bson:"nodeErrors"` + SuccRate float64 `json:"succRate" bson:"succRate"` + MinRate float64 `json:"minRate" bson:"minRate"` + BeginTime time.Time `json:"beginTime" bson:"beginTime"` + EndTime time.Time `json:"endTime" bson:"endTime"` + CheckSucc bool `json:"checkSucc" bson:"checkSucc"` // 只有检测成功时,检测结果才有意义 + ErrorMessage string `json:"errorMessage" bson:"errorMessage"` + Error error `json:"-" bson:"-"` +} +type CheckResultList []*CheckResult + +type Domain struct { + ID primitive.ObjectID `json:"id" bson:"_id,omitempty"` + Name string `json:"name" bson:"name" binding:"required"` // 域名 + AppId int32 `json:"appId" bson:"appId"` // AppId + AppName string `json:"appName" bson:"-"` // AppName + Comment string `json:"comment" bson:"comment"` // 备注 + Category Category `json:"category" bson:"category"` // 分类 + Status CheckStatus `json:"status" bson:"status"` // 状态 + Checks []CheckType `json:"checks" bson:"checks"` // 检测方式 + Redirected bool `json:"redirected" bson:"redirected"` // 是否已做301跳转 + RedirectDomain string `json:"redirectDomain" bson:"redirectDomain"` // 重定向域名 + MaxNodes int32 `json:"maxNodes" bson:"maxNodes"` // 最大测试节点数 + MinRate float64 `json:"minRate" bson:"minRate"` // 最低检测成功率(成功率低于这个值视为失败) + Report string `json:"report" bson:"report"` // 检测报告 + Results CheckResultList `json:"results" bson:"results"` // 检测结果 + Enable bool `json:"enable" bson:"enable"` // 是否启用 + CheckTime time.Time `json:"checkTime" bson:"checkTime"` // 检测时间 + CycleHour int64 `json:"cycleHour" bson:"cycleHour"` // 间隔多少小时检测一次 + CheckFinish time.Time `json:"checkFinish" bson:"checkFinish"` // 检测完成时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` +} + +type DomainList []*Domain + +type DomainDoc struct { + Name *string `json:"name" bson:"name,omitempty"` // 域名 + AppId *int32 `json:"appId" bson:"appId,omitempty"` // AppId + Comment *string `json:"comment" bson:"comment,omitempty"` // 备注 + Category *Category `json:"category" bson:"category,omitempty"` // 分类 + Status *CheckStatus `json:"status" bson:"status,omitempty"` // 状态 + Checks *[]CheckType `json:"checks" bson:"checks,omitempty"` // 检测方式 + Redirected *bool `json:"redirected" bson:"redirected,omitempty"` // 是否已做301跳转 + RedirectDomain *string `json:"redirectDomain" bson:"redirectDomain,omitempty"` // 重定向域名 + MinRate *float64 `json:"minRate" bson:"minRate,omitempty"` // 最低检测成功率(成功率低于这个值视为失败) + Report *string `json:"report" bson:"report,omitempty"` // 检测报告 + Results *CheckResultList `json:"results" bson:"results,omitempty"` // 检测结果 + Enable *bool `json:"enable" bson:"enable,omitempty"` // 是否启用 + CycleHour *int64 `json:"cycleHour" bson:"cycleHour,omitempty"` // 间隔多少小时检测一次 + CheckTime *time.Time `json:"checkTime" bson:"checkTime,omitempty"` // 检测时间 + CheckFinish *time.Time `json:"checkFinish" bson:"checkFinish,omitempty"` // 检测完成时间 + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` // 更新时间 +} diff --git a/models/downloadCpc/downloadInfo.go b/models/downloadCpc/downloadInfo.go new file mode 100644 index 0000000..b5ef0f0 --- /dev/null +++ b/models/downloadCpc/downloadInfo.go @@ -0,0 +1,73 @@ +package downloadCpc + +import ( + "context" + "fmt" + "time" + + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollLandingPageCPC) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "appId", Value: 1}}, + }, + { + Keys: bson.D{{Key: "createdAt", Value: 1}}, + }, + { + Keys: bson.D{ + {Key: "appId", Value: 1}, + {Key: "createdAt", Value: 1}, + }, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollLandingPageCPC, err)) + } +} + +// 插入InsertDownloadInfo 商区记录 +func InsertDownloadInfo(ctx context.Context, model *DownloadCpc) (err error) { + _, err = db.InsertOne(ctx, model) + return +} + +// 插入InsertDownloadInfoMany 商区记录 +func InsertDownloadInfoMany(ctx context.Context, docs []interface{}) (err error) { + _, err = db.GetCollection().InsertMany(ctx, docs) + return +} + +// FindManyDownloadCpc 查找一批 +func FindManyDownloadCpc(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (DownloadCpcList, error) { + data := make(DownloadCpcList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("FindManyDownloadCpc db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// 根据appId 获取appInfo +func GetAccessCountByTime(ctx context.Context, appid int32, start, end time.Time) ([]DownloadCpc, error) { + filter := bson.M{"appId": appid, "createdAt": bson.M{"$gte": start, "$lt": end}} + results := make([]DownloadCpc, 0) + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetAccessUserByTime FindOne err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + + return results, nil +} diff --git a/models/downloadCpc/type.go b/models/downloadCpc/type.go new file mode 100644 index 0000000..62ebf57 --- /dev/null +++ b/models/downloadCpc/type.go @@ -0,0 +1,26 @@ +package downloadCpc + +import ( + "stat/common/mongos" + "time" +) + +// 表名 +const CollLandingPageCPC = "landingpage_cpc" + +var db *mongos.MongoTool + +type DownloadCpc struct { + AppId int32 `json:"appId" bson:"appId"` // appId + PC string `json:"pc" bson:"pc"` //推广码 + DC string `json:"dc" bson:"dc"` //商区序列 + CH string `json:"ch" bson:"ch"` //渠道 + IP string `json:"ip" bson:"ip"` //用户IP + DevType string `json:"devType" bson:"devType"` //设备类型 + SysType string `json:"sysType" bson:"sysType"` //系统类型 + PeerIP string `json:"peerIP" bson:"peerIP"` // 网站IP + CreatedAt time.Time `bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt"` // 更新时间 +} + +type DownloadCpcList []*DownloadCpc diff --git a/models/downloadinfo/downloadInfo.go b/models/downloadinfo/downloadInfo.go new file mode 100644 index 0000000..98bc31e --- /dev/null +++ b/models/downloadinfo/downloadInfo.go @@ -0,0 +1,136 @@ +package downloadinfo + +import ( + "context" + "fmt" + "time" + + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollLandingPage) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: "ip", Value: 1}, + {Key: "appId", Value: 1}, + {Key: "sysType", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "ip", Value: 1}, + {Key: "appId", Value: 1}, + {Key: "sysType", Value: 1}, + {Key: "createdAt", Value: 1}, + }, + }, + { + Keys: bson.D{{Key: "createdAt", Value: 1}}, + Options: options.Index().SetExpireAfterSeconds(5 * 24 * 60 * 60), + }, + { + Keys: bson.D{ + {Key: "appId", Value: 1}, + {Key: "createdAt", Value: 1}, + {Key: "dc", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "ip", Value: 1}, + {Key: "appId", Value: 1}, + {Key: "createdAt", Value: -1}, + }, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollLandingPage, err)) + } +} + +// 插入InsertDownloadInfo 商区记录 +func InsertDownloadInfo(ctx context.Context, model *DownloadInfoModel) (err error) { + _, err = db.InsertOne(ctx, model) + return +} + +// 插入InsertDownloadInfoMany 商区记录 +func InsertDownloadInfoMany(ctx context.Context, docs []interface{}) (err error) { + _, err = db.GetCollection().InsertMany(ctx, docs) + return +} + +// FindManyDownloadInfo 查找一批 +func FindManyDownloadInfo(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (DownloadInfoList, error) { + data := make(DownloadInfoList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("FindManyDownloadInfo db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// FindOneChannelIP 根据IP查询渠道信息 +func FindOneChannelIP(ctx context.Context, appId int32, ip string, sysType string) (data DownloadInfoModel, err error) { + opts := options.FindOne() + opts.SetSort(bson.D{{Key: "createdAt", Value: -1}}) + createAt := utils.BeginOfToday().AddDate(0, 0, -2) + err = db.FindOne(ctx, &data, bson.M{"ip": ip, "appId": appId, "createdAt": bson.M{"$gt": createAt}}, opts) + if err != nil { + log.Error("channel get TrackInfo FindOneChannelIP err", log.E(err)) + return + } + return +} + +// FindOneChannelUserAgent 根据最近30分钟查询渠道信息 +func FindOneChannelUserAgent(ctx context.Context, appId int32, userAgent string) (data DownloadInfoModel, err error) { + opts := options.FindOne() + opts.SetSort(bson.D{{Key: "createdAt", Value: -1}}) + createAt := utils.BeginOfToday().Add(-30 * time.Minute) + err = db.FindOne(ctx, &data, bson.M{"userAgent": userAgent, "appId": appId, "createdAt": bson.M{"$gt": createAt}}, opts) + if err != nil { + log.Error("channel get TrackInfo FindOneChannelUserAgent err", log.E(err)) + return + } + return +} + +// 根据appId 获取appInfo +func GetAccessCountByTime(ctx context.Context, appid int32, start, end time.Time) ([]DownloadInfoModel, error) { + filter := bson.M{"appId": appid, "createdAt": bson.M{"$gte": start, "$lt": end}} + results := make([]DownloadInfoModel, 0) + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetAccessUserByTime FindOne err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + + return results, nil +} + +func GetChannelDownloadPageListByTime(ctx context.Context, channel string, appid int32, start, end time.Time) ([]*DownloadInfoModel, error) { + filter := bson.M{ + "appId": appid, + "createdAt": bson.M{"$gte": start, "$lt": end}, + "dc": channel, + } + results := make([]*DownloadInfoModel, 0) + if err := db.Find(ctx, &results, filter); err != nil { + log.Error("GetChannelDownloadPageListByTime FindOne err", log.Any("start", start), log.Any("end", end), log.E(err)) + return nil, err + } + + return results, nil +} diff --git a/models/downloadinfo/type.go b/models/downloadinfo/type.go new file mode 100644 index 0000000..597d885 --- /dev/null +++ b/models/downloadinfo/type.go @@ -0,0 +1,33 @@ +package downloadinfo + +import ( + "stat/common/mongos" + "stat/models/versionMod" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 表名 +const CollLandingPage = "landingpage_log" + +var db *mongos.MongoTool + +type DownloadInfoModel struct { + ID primitive.ObjectID `json:"id" bson:"_id,omitempty"` + AppId int32 `bson:"appId"` // appId + PC string `json:"pc" bson:"pc"` // 推广码 + DC string `json:"dc" bson:"dc"` // 商区序列 + CH string `json:"ch" bson:"ch"` // 渠道 + IP string `json:"ip" bson:"ip"` // 用户IP + Domain string `from:"domain" json:"domain"` // 落地页域名 + DevType string `json:"devType" bson:"devType"` // 设备类型 + SysType string `json:"sysType" bson:"sysType"` // 系统类型 + PeerIP string `json:"peerIP" bson:"peerIP"` // 网站IP + PackageType versionMod.PkgType `from:"packageType" json:"packageType"` // 包类型 1:企业包 2:商店包 3:TF包 + UserAgent string `json:"userAgent" bson:"userAgent"` // User-Agent识别 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt"` // 更新时间 +} + +type DownloadInfoList []*DownloadInfoModel diff --git a/models/downloadstat/downloadstat.go b/models/downloadstat/downloadstat.go new file mode 100644 index 0000000..109bb8a --- /dev/null +++ b/models/downloadstat/downloadstat.go @@ -0,0 +1,129 @@ +package downloadstat + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/mongo/options" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollDownloadStat) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: "appId", Value: 1}, + {Key: "type", Value: 1}, + {Key: "sumDate", Value: 1}, + }, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{ + {Key: "type", Value: 1}, + {Key: "sumDate", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "type", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "hour", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "createdAt", Value: 1}, + }, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollDownloadStat, err)) + } +} + +// CountStats 统计数量 +func CountStats(ctx context.Context, filter bson.M) (int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("downloadStat CountStats db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// InsertOneStat 插入一个 +func InsertOneStat(ctx context.Context, media *Stat) error { + if _, err := db.InsertOne(ctx, media); err != nil { + log.Warn("downloadStat:InsertOneStat db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// FindOneStat 查找一个 +func FindOneStat(ctx context.Context, filter bson.M) (*Stat, error) { + var stat Stat + if err := db.FindOneEx(ctx, &stat, filter); err != nil { + log.Warn("downloadStat:FindOneStatEx db.FindOneEx failed", + log.E(err), log.Any("filter", filter)) + return nil, err + } + return &stat, nil +} + +// DelOneStat 删除一个 +func DelOneStat(ctx context.Context, filter bson.M) (int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("downloadStat:DelOneStat db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateOneStat 更新一个 +func UpdateOneStat(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("downloadStat:UpdateOneStat db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + + return nil +} + +// FindManyStat 查找一批 +func FindManyStat(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (StatList, error) { + data := make(StatList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("downloadStat:FindManyStat db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// AggregateStats 聚合查找一批机器人小时统计信息 +func AggregateStats(ctx context.Context, bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("downloadStat:FindManyStat db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/downloadstat/helper.go b/models/downloadstat/helper.go new file mode 100644 index 0000000..c6f86a4 --- /dev/null +++ b/models/downloadstat/helper.go @@ -0,0 +1,10 @@ +package downloadstat + +func StatSummation(base, value *Stat) { + base.VisitTotal += value.VisitTotal + base.VisitUnique += value.VisitUnique + base.DownTotal += value.DownTotal + base.DownUnique += value.DownUnique + base.InstallTotal += value.InstallTotal + base.InstallUnique += value.InstallUnique +} diff --git a/models/downloadstat/type.go b/models/downloadstat/type.go new file mode 100644 index 0000000..929c9e2 --- /dev/null +++ b/models/downloadstat/type.go @@ -0,0 +1,58 @@ +package downloadstat + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 表名 +const CollDownloadStat = "download_stat" + +var db *mongos.MongoTool + +type StatType int32 + +const ( + StatTypeNone StatType = 0 + StatTypeDaily StatType = 1 + StatTypeHour StatType = 2 +) + +type Stat struct { + ID primitive.ObjectID `json:"id" bson:"_id,omitempty"` + AppId int32 `json:"appId" bson:"appId"` + AppName string `json:"appName" bson:"appName,omitempty"` + SumDate time.Time `json:"sumDate" bson:"sumDate"` // 日期 + EndDate time.Time `json:"endDate" bson:"endDate"` // 这个不展示 + Hour int `json:"hour" bson:"hour"` // 小时统计展示,每日统计不展示 + Type StatType `json:"type" bson:"type"` // 这个不展示 + + VisitTotal int64 `json:"visitCount" bson:"visitCount"` // 访问总数 + VisitUnique int64 `json:"visitUnique" bson:"visitUnique"` // 去重访问数 + + DownTotal int64 `json:"downTotal" bson:"downTotal"` // 下载总数 + DownUnique int64 `json:"downUnique" bson:"downUnique"` // 去重下载数(IP来自独立访问集合) + + InstallTotal int64 `json:"installTotal" bson:"installTotal"` // 安装总数 + InstallUnique int64 `json:"installUnique" bson:"installUnique"` // 去重安装数(IP来自下载独立集合) + + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` +} + +type StatDoc struct { + VisitTotal *int64 `json:"visitCount" bson:"visitCount"` // 访问总数 + VisitUnique *int64 `json:"visitIpCount" bson:"visitIpCount"` // 访问独立数 + + DownTotal *int64 `json:"downTotal" bson:"downTotal"` // 下载总数 + DownUnique *int64 `json:"downUnique" bson:"downUnique"` // 下载独立数(IP来自访问独立集合) + + InstallTotal *int64 `json:"installTotal" bson:"installTotal"` // 安装总数 + InstallUnique *int64 `json:"installUnique" bson:"installUnique"` // 安装独立数(IP来自下载独立集合) + + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt"` +} + +type StatList []*Stat diff --git a/models/index.go b/models/index.go new file mode 100644 index 0000000..932f874 --- /dev/null +++ b/models/index.go @@ -0,0 +1,110 @@ +package models + +import ( + "context" + "stat/models/accessmod" + "stat/models/activityVisit" + "stat/models/activitymod" + "stat/models/adminMod" + "stat/models/advertiseLocMod" + "stat/models/advertiseMod" + "stat/models/advertisestat" + "stat/models/announInfoMod" + "stat/models/appInfoMod" + "stat/models/appcategory" + "stat/models/applicationLocMod" + "stat/models/applicationmod" + "stat/models/applicationstat" + "stat/models/authorityMod" + "stat/models/blocDailystatmod" + "stat/models/botdailyhourstat" + "stat/models/botreport" + "stat/models/channelCodeBlocStatMod" + "stat/models/channelmod" + "stat/models/channelpackage" + "stat/models/channelsettlementrecord" + "stat/models/dailyhourstatmod" + "stat/models/dailystatadvertise" + "stat/models/dailystatmod" + "stat/models/domainmod" + "stat/models/downloadCpc" + downloadinfo "stat/models/downloadinfo" + "stat/models/downloadstat" + "stat/models/landPageConfig" + "stat/models/landingPage" + "stat/models/landpageImg" + "stat/models/mediatag" + "stat/models/minutestatmod" + "stat/models/monitormod" + "stat/models/opLogMod" + "stat/models/rechargechannelmod" + "stat/models/rechargegamemod" + "stat/models/rechargemod" + "stat/models/registermod" + statrecordmod "stat/models/statrecord" + "stat/models/syncgamerecharge" + "stat/models/syncgamewater" + "stat/models/syncrecharge" + "stat/models/syncrecord" + "stat/models/syncvip" + "stat/models/syncwithdraw" + "stat/models/tfpackagemod" + "stat/models/versionMod" + "stat/models/withdrawGameOrdermod" + "stat/models/withdrawUserOrdermod" +) + +// 初始化数据库表 +func InitIndex() { + ctx := context.Background() + appInfoMod.Init() + authorityMod.Init() + adminMod.Init() + rechargemod.Init() + accessmod.Init() + registermod.Init() + channelmod.Init() + statrecordmod.Init() + dailystatmod.Init() + minutestatmod.Init() + opLogMod.Init() + landingPage.Init() + advertiseMod.Init() + advertiseLocMod.Init() + advertisestat.Init() + versionMod.Init() + downloadinfo.Init() + downloadstat.Init() + announInfoMod.Init() + downloadCpc.Init() + domainmod.Init() + blocDailystatmod.Init() + withdrawUserOrdermod.Init() + rechargechannelmod.Init() + channelCodeBlocStatMod.Init() + syncrecord.Init() + syncwithdraw.Init(ctx) + tfpackagemod.Init(ctx) + syncvip.Init(ctx) + syncrecharge.Init(ctx) + landpageImg.Init(ctx) + mediatag.Init(ctx) + dailyhourstatmod.Init(ctx) + activitymod.Init() + withdrawGameOrdermod.Init() + rechargegamemod.Init() + syncgamerecharge.Init(ctx) + botreport.Init(ctx) + botdailyhourstat.Init(ctx) + dailystatadvertise.Init(ctx) + syncgamewater.Init(ctx) + channelsettlementrecord.Init(ctx) + landPageConfig.Init(ctx) + monitormod.Init(ctx) + activityVisit.Init() + applicationmod.Init(ctx) + appcategory.Init(ctx) + applicationstat.Init(ctx) + applicationLocMod.Init(ctx) + channelpackage.Init(ctx) +} diff --git a/models/landPageConfig/landpageConfig.go b/models/landPageConfig/landpageConfig.go new file mode 100644 index 0000000..ac2a505 --- /dev/null +++ b/models/landPageConfig/landpageConfig.go @@ -0,0 +1,126 @@ +package landPageConfig + +import ( + "context" + "fmt" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "stat/common/log" + "stat/common/mongos" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.LandPageConfig) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.LandPageConfig.Id, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(LandPageConfig:initLandPageConfigIndex) Create LandPageConfig Index failed! err:%+v:", err)) + } +} + +//InsertOneLandPageConfig 插入一个视频标签 +func InsertOneLandPageConfig(ctx context.Context, LandPageConfig *LandPageConfig) error { + if _, err := db.InsertOne(ctx, LandPageConfig); err != nil { + log.Warn("LandPageConfig:InsertOneLandPageConfig db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneLandPageConfig 查找一个视频标签 +func FindOneLandPageConfig(ctx context.Context, filter bson.M) ( + *LandPageConfig, error) { + var LandPageConfig LandPageConfig + if err := db.FindOne(ctx, &LandPageConfig, filter); err != nil { + return nil, err + } + return &LandPageConfig, nil +} + +//DelOneLandPageConfig 删除一个视频标签 +func DelOneLandPageConfig(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("LandPageConfig:DelOneLandPageConfig db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneLandPageConfig 更新一个视频标签 +func UpdateOneLandPageConfig(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneLandPageConfig db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountLandPageConfigs 统计视频标签数量 +func CountLandPageConfigs(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("LandPageConfig:CountLandPageConfigs db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyLandPageConfig 更新满足条件的视频标签 +func UpdateManyLandPageConfig(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyLandPageConfig db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyLandPageConfig 查找一批视频标签数据 +func FindManyLandPageConfig(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (LandPageConfigList, error) { + data := make(LandPageConfigList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("LandPageConfig:FindManyLandPageConfig db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyLandPageConfigWithBind 用自己定义结构查找一批视频标签数据 +func FindManyLandPageConfigWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("LandPageConfig:FindManyLandPageConfigWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateLandPageConfigs 聚合查找一批视频标签信息 +func AggregateLandPageConfigs(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateLandPageConfigs db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/landPageConfig/tag.go b/models/landPageConfig/tag.go new file mode 100755 index 0000000..8c049b7 --- /dev/null +++ b/models/landPageConfig/tag.go @@ -0,0 +1,44 @@ +package landPageConfig + +type TagLandPageConfig struct { + Actor string + AddedTime string + AppId string + Bango string + CreateAt string + Desc string + Id string + LandPageType string + Media string + Picture string + Rank string + Status string + Title string + UpdateAt string +} + +var FN struct { + LandPageConfig TagLandPageConfig +} + +var TN struct { + LandPageConfig string +} + +func init() { + FN.LandPageConfig.Actor = "actor" + FN.LandPageConfig.AddedTime = "addedTime" + FN.LandPageConfig.AppId = "appId" + FN.LandPageConfig.Bango = "bango" + FN.LandPageConfig.CreateAt = "createAt" + FN.LandPageConfig.Desc = "desc" + FN.LandPageConfig.Id = "_id" + FN.LandPageConfig.LandPageType = "landPageType" + FN.LandPageConfig.Media = "media" + FN.LandPageConfig.Picture = "picture" + FN.LandPageConfig.Rank = "rank" + FN.LandPageConfig.Status = "status" + FN.LandPageConfig.Title = "title" + FN.LandPageConfig.UpdateAt = "updateAt" + TN.LandPageConfig = "landPageConfig" +} diff --git a/models/landPageConfig/type.go b/models/landPageConfig/type.go new file mode 100644 index 0000000..a519149 --- /dev/null +++ b/models/landPageConfig/type.go @@ -0,0 +1,26 @@ +package landPageConfig + +import ( + "time" +) + +// 落地页配置 +// @table:landPageConfig +type LandPageConfig struct { + Id int64 `json:"id" bson:"_id"` + AppId int32 `json:"appId" bson:"appId"` //appId + LandPageType int8 `json:"landPageType" bson:"landPageType"` //类型,1PC端,2移动端 + Title string `json:"title" bson:"title"` //主题 + Desc string `json:"desc" bson:"desc"` //描述 + Actor string `json:"actor" bson:"actor"` //演员 + Bango string `json:"bango" bson:"bango"` //番号,唯一 + AddedTime time.Time `json:"addedTime" bson:"addedTime"` //上架时间(审核通过时间) + Picture string `json:"picture" bson:"picture"` //图片 + Media string `json:"media" bson:"media"` //视频 + Rank int64 `json:"rank" bson:"rank"` //排序 + Status bool `json:"status" bson:"status"` //状态 + CreateAt time.Time `json:"createAt" bson:"createAt"` //创建时间 + UpdateAt time.Time `json:"updateAt" bson:"updateAt"` //更新时间 +} + +type LandPageConfigList []*LandPageConfig diff --git a/models/landingPage/loandingpage.go b/models/landingPage/loandingpage.go new file mode 100644 index 0000000..f3b5e29 --- /dev/null +++ b/models/landingPage/loandingpage.go @@ -0,0 +1,158 @@ +package landingPage + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollLandingPage) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "appId", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", CollLandingPage, err)) + } + +} + +// FindLandingPageList 获取渠道转账列表 +func FindLandingPageList(ctx context.Context, appid int32, skip, limit int64) (count int64, data []LandingPage, err error) { + filter := bson.M{"appId": appid} + + sort := bson.D{{Key: "status", Value: -1}, {Key: "createdAt", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("LandingPage FindLandingPageList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("LandingPage FindLandingPageList Count err", log.E(err)) + return + } + + return +} + +// AddLandingPage 添加落地页请求 +func AddLandingPage(ctx context.Context, doc *LandingPage) (id string, err error) { + if id, err = db.InsertOne(ctx, doc); err != nil { + log.Error("LandingPage AddLandingPage InsertOne err", log.E(err)) + return + } + + return +} + +// FindLandingPage 查询订单 +func FindLandingPage(ctx context.Context, id int64) (w LandingPage, err error) { + var filter = bson.M{"_id": id} + + if err = db.FindOne(ctx, &w, filter); err != nil { + log.Error("LandingPage FindLandingPage FindOne err", log.E(err)) + return + } + + return +} + +// UpdateLandingPage 更新落地页成功 +func UpdateLandingPage(ctx context.Context, id int64, doc UpdateDoc) (err error) { + + var filter = bson.M{"_id": id} + + update, _ := utils.ToBsonM(doc) + + if _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}); err != nil { + log.Error("LandingPage UpdateLandingPageSuccess UpdateOne err", log.E(err)) + return + } + + return +} + +// DelLandingPage 删除落地页 +func DelLandingPage(ctx context.Context, id int64) (err error) { + filter := bson.M{"_id": id} + + if _, err = db.DeleteOne(ctx, filter); err != nil { + log.Error("LandingPage DelLandingpage DeleteOne err", log.E(err)) + return + } + return +} + +// FindChannelCodeLandingPage 根据 app 获取落地页 +func FindChannelCodeLandingPage(ctx context.Context, appIds []int32) (data []LandingPage, err error) { + if len(appIds) == 0 { + return + } + + filter := bson.M{"appId": bson.M{"$in": appIds}, "status": true, "type": 1} + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("LandingPage FindLandingPageByAppsId Find err", log.E(err)) + return + } + return +} + +// FindShareLandingPage 根据 app 获取落地页 +func FindShareLandingPage(ctx context.Context, appId int32) (data []LandingPage, err error) { + + filter := bson.M{"appId": appId, "status": true, "type": 2} + + if err = db.Find(ctx, &data, filter); err != nil { + log.Error("LandingPage FindLandingPageByAppsId Find err", log.E(err)) + return + } + return +} + +// FindAllLandingPage 获取所有落地页 +func FindAllLandingPage(ctx context.Context) (data []LandingPage, err error) { + filter := bson.M{"status": true} + + sort := bson.D{{Key: "createdAt", Value: -1}} + + opts := options.Find().SetSort(sort) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("LandingPage FindAllLandingPage Find err", log.E(err)) + return + } + + return +} + +// FindChannelLandingPage 获取配置渠道的落地页 +func FindChannelLandingPage(ctx context.Context) (data []LandingPage, err error) { + filter := bson.M{"channelCode": bson.M{"$gt": ""}} + + sort := bson.D{{Key: "createdAt", Value: -1}} + + opts := options.Find().SetSort(sort) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("LandingPage FindChannelLandingPage Find err", log.E(err)) + return + } + + return +} diff --git a/models/landingPage/type.go b/models/landingPage/type.go new file mode 100644 index 0000000..c1dcd17 --- /dev/null +++ b/models/landingPage/type.go @@ -0,0 +1,33 @@ +package landingPage + +import ( + "stat/common/mongos" + "time" +) + +// 表名 +const CollLandingPage = "landing_page" + +var db *mongos.MongoTool + +// LandingPage 落地页管理 +type LandingPage struct { + ID int64 `bson:"_id"` //落地页 + AppId int32 `bson:"appId"` //appId + Url string `bson:"url"` //url + Status bool `bson:"status,omitempty"` //状态 默认true + ChannelCode string `bson:"channelCode,omitempty"` //渠道 + Remark string `bson:"remark"` //备注 + Type int32 `form:"type" json:"type"` //类型 1:渠道 2:分享 + CreatedAt time.Time `bson:"createdAt,omitempty"` //申请时间 + UpdatedAt time.Time `bson:"updatedAt,omitempty"` //更新时间 +} + +type UpdateDoc struct { + Url *string `bson:"url,omitempty"` //url + Status *bool `bson:"status,omitempty"` //状态 默认true + Remark *string `bson:"remark,omitempty"` //备注 + ChannelCode *string `bson:"channelCode,omitempty"` //渠道 + Type *int32 `form:"type" json:"type"` //类型 1:渠道 2:分享 + UpdatedAt *time.Time `bson:"updatedAt,omitempty"` //更新时间 +} diff --git a/models/landpageImg/img.go b/models/landpageImg/img.go new file mode 100644 index 0000000..be6d48b --- /dev/null +++ b/models/landpageImg/img.go @@ -0,0 +1,127 @@ +package landpageImg + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.LandpageImg) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.LandpageImg.Name, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(LandpageImg:initLandpageImgIndex) Create LandpageImg Index failed! err:%+v:", err)) + } +} + +//InsertOneLandpageImg 插入一个落地页资源配置 +func InsertOneLandpageImg(ctx context.Context, LandpageImg *LandpageImg) error { + if _, err := db.InsertOne(ctx, LandpageImg); err != nil { + log.Warn("LandpageImg:InsertOneLandpageImg db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneLandpageImg 查找一个落地页资源配置 +func FindOneLandpageImg(ctx context.Context, filter bson.M) ( + *LandpageImg, error) { + var LandpageImg LandpageImg + if err := db.FindOne(ctx, &LandpageImg, filter); err != nil { + return nil, err + } + return &LandpageImg, nil +} + +//DelOneLandpageImg 删除一个落地页资源配置 +func DelOneLandpageImg(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("LandpageImg:DelOneLandpageImg db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneLandpageImg 更新一个落地页资源配置 +func UpdateOneLandpageImg(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneLandpageImg db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountLandpageImgs 统计落地页资源配置数量 +func CountLandpageImgs(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("LandpageImg:CountLandpageImgs db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyLandpageImg 更新满足条件的落地页资源配置 +func UpdateManyLandpageImg(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyLandpageImg db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyLandpageImg 查找一批落地页资源配置数据 +func FindManyLandpageImg(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (LandpageImgList, error) { + data := make(LandpageImgList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("LandpageImg:FindManyLandpageImg db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyLandpageImgWithBind 用自己定义结构查找一批落地页资源配置数据 +func FindManyLandpageImgWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("LandpageImg:FindManyLandpageImgWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateLandpageImgs 聚合查找一批落地页资源配置信息 +func AggregateLandpageImgs(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateLandpageImgs db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/landpageImg/tag.go b/models/landpageImg/tag.go new file mode 100755 index 0000000..a576913 --- /dev/null +++ b/models/landpageImg/tag.go @@ -0,0 +1,42 @@ +package landpageImg + +type TagLandpageImg struct { + CreatedAt string + ID string + MobileAvatar string + MobileBackgroud string + MobileTiltle string + Music string + Name string + PcAvatar string + PcBackgroud string + PcTitle string + Rank string + Status string + UpdatedAt string +} + +var FN struct { + LandpageImg TagLandpageImg +} + +var TN struct { + LandpageImg string +} + +func init() { + FN.LandpageImg.CreatedAt = "createdAt" + FN.LandpageImg.ID = "_id" + FN.LandpageImg.MobileAvatar = "mobileAvatar" + FN.LandpageImg.MobileBackgroud = "mobileBackgroud" + FN.LandpageImg.MobileTiltle = "mobileTiltle" + FN.LandpageImg.Music = "music" + FN.LandpageImg.Name = "name" + FN.LandpageImg.PcAvatar = "pcAvatar" + FN.LandpageImg.PcBackgroud = "pcBackgroud" + FN.LandpageImg.PcTitle = "pcTitle" + FN.LandpageImg.Rank = "rank" + FN.LandpageImg.Status = "status" + FN.LandpageImg.UpdatedAt = "updatedAt" + TN.LandpageImg = "landpage_img" +} diff --git a/models/landpageImg/type.go b/models/landpageImg/type.go new file mode 100644 index 0000000..3790a1a --- /dev/null +++ b/models/landpageImg/type.go @@ -0,0 +1,26 @@ +package landpageImg + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 帖子模型,数据库中的 +// @table:landpage_img +type LandpageImg struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + Name string `json:"name" bson:"name"` // 图片名称 + PcAvatar string `json:"pcAvatar" bson:"pcAvatar"` // PC端图片 + MobileAvatar string `json:"mobileAvatar" bson:"mobileAvatar"` // 移动端图片 + PcBackgroud string `json:"pcBackgroud" bson:"pcBackgroud"` // PC端背景图 + MobileBackgroud string `json:"mobileBackgroud" bson:"mobileBackgroud"` // 移动端背景图 + PcTitle string `json:"pcTitle" bson:"pcTitle"` // PC端标语 + MobileTiltle string `json:"mobileTiltle" bson:"mobileTiltle"` // 移动端标语 + Music string `json:"music" bson:"music"` // 音频文件 + Rank int64 `json:"rank" bson:"rank"` // 排序 + Status bool `json:"status" bson:"status"` // 是否启用 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 更新时间 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} +type LandpageImgList []*LandpageImg diff --git a/models/mediatag/mediatag.go b/models/mediatag/mediatag.go new file mode 100644 index 0000000..ec442e4 --- /dev/null +++ b/models/mediatag/mediatag.go @@ -0,0 +1,127 @@ +package mediatag + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.MediaTag) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.MediaTag.Name, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(MediaTag:initMediaTagIndex) Create MediaTag Index failed! err:%+v:", err)) + } +} + +//InsertOneMediaTag 插入一个视频标签 +func InsertOneMediaTag(ctx context.Context, MediaTag *MediaTag) error { + if _, err := db.InsertOne(ctx, MediaTag); err != nil { + log.Warn("MediaTag:InsertOneMediaTag db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneMediaTag 查找一个视频标签 +func FindOneMediaTag(ctx context.Context, filter bson.M) ( + *MediaTag, error) { + var MediaTag MediaTag + if err := db.FindOne(ctx, &MediaTag, filter); err != nil { + return nil, err + } + return &MediaTag, nil +} + +//DelOneMediaTag 删除一个视频标签 +func DelOneMediaTag(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("MediaTag:DelOneMediaTag db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneMediaTag 更新一个视频标签 +func UpdateOneMediaTag(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneMediaTag db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountMediaTags 统计视频标签数量 +func CountMediaTags(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("MediaTag:CountMediaTags db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyMediaTag 更新满足条件的视频标签 +func UpdateManyMediaTag(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyMediaTag db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyMediaTag 查找一批视频标签数据 +func FindManyMediaTag(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (MediaTagList, error) { + data := make(MediaTagList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("MediaTag:FindManyMediaTag db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyMediaTagWithBind 用自己定义结构查找一批视频标签数据 +func FindManyMediaTagWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("MediaTag:FindManyMediaTagWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateMediaTags 聚合查找一批视频标签信息 +func AggregateMediaTags(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateMediaTags db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/mediatag/tag.go b/models/mediatag/tag.go new file mode 100644 index 0000000..2918965 --- /dev/null +++ b/models/mediatag/tag.go @@ -0,0 +1,30 @@ +package mediatag + +type TagMediaTag struct { + CreatedAt string + ID string + Name string + Rank string + Status string + Type string + UpdatedAt string +} + +var FN struct { + MediaTag TagMediaTag +} + +var TN struct { + MediaTag string +} + +func init() { + FN.MediaTag.CreatedAt = "createdAt" + FN.MediaTag.ID = "_id" + FN.MediaTag.Name = "name" + FN.MediaTag.Rank = "rank" + FN.MediaTag.Status = "status" + FN.MediaTag.Type = "type" + FN.MediaTag.UpdatedAt = "updatedAt" + TN.MediaTag = "media_tag" +} diff --git a/models/mediatag/type.go b/models/mediatag/type.go new file mode 100644 index 0000000..211664c --- /dev/null +++ b/models/mediatag/type.go @@ -0,0 +1,27 @@ +package mediatag + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type MediaTagType int32 + +const ( + MediaTagTypeFirst MediaTagType = 1 // 一级 + MediaTagTypeSecond MediaTagType = 2 // 二级 +) + +// 帖子模型,数据库中的 +// @table:media_tag +type MediaTag struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + Name string `json:"name" bson:"name"` // 标签名称 + Type MediaTagType `json:"type" bson:"type"` // 类别 + Rank int64 `json:"rank" bson:"rank"` // 排序 + Status bool `json:"status" bson:"status"` // 是否启用 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 更新时间 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} +type MediaTagList []*MediaTag diff --git a/models/minutestatmod/minute.go b/models/minutestatmod/minute.go new file mode 100644 index 0000000..31f5266 --- /dev/null +++ b/models/minutestatmod/minute.go @@ -0,0 +1,105 @@ +package minutestatmod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + + "go.mongodb.org/mongo-driver/bson" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollMinuteStat) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "sumDate", Value: 1}, {Key: "updatedAt", Value: 1}}, + }, { + Keys: bson.D{{Key: "sumDate", Value: 1}, {Key: "appId", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollMinuteStat, err)) + } +} + +func UpsertMinuteStatEx(ctx context.Context, + filter bson.M, update bson.M) error { + if _, err := db.UpsertOneEx(ctx, filter, update); err != nil { + log.Info("minutestatmod:UpsertMinuteStatEx db.InsertOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +func UpsertMinuteDocStat(ctx context.Context, sumDate time.Time, appId int32, update *MinuteStatDoc) error { + now := time.Now() + update.UpdatedAt = &now + + filter := bson.M{ + "appId": appId, + "sumDate": sumDate, + } + + upsertDoc := bson.M{ + "$set": update, + "$setOnInsert": filter, + } + + if _, err := db.UpsertOneEx(ctx, filter, upsertDoc); err != nil { + log.Info("minutestatmod:UpsertMinuteStatEx db.InsertOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// UpsertDailyStat 更新或插入一条统计记录 +func UpsertMinuteStat(ctx context.Context, sumDate time.Time, appId int32, doc MinuteStatDoc) (err error) { + var filter = bson.M{ + "sumDate": sumDate, + "appId": appId, + } + var update = mongos.ToBsonM(doc) + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$set": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + + _, err = db.InsertOne(ctx, insertDoc) + } + + return +} + +func GetMinuteStatList(ctx context.Context, start, end time.Time, appId int32) (data []MinuteStatMod, err error) { + filter := bson.M{"sumDate": bson.M{"$gte": start, "$lt": end}, "appId": appId} + + sort := bson.D{{Key: "sumDate", Value: 1}} + + opts := options.Find().SetSort(sort) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("minuteStat GetMinuteStatList Find err", log.E(err)) + return + } + + return +} diff --git a/models/minutestatmod/type.go b/models/minutestatmod/type.go new file mode 100644 index 0000000..7d003a9 --- /dev/null +++ b/models/minutestatmod/type.go @@ -0,0 +1,107 @@ +package minutestatmod + +import ( + "stat/common/mongos" + "time" +) + +// 表名 +const CollMinuteStat = "minute_stat" + +var db *mongos.MongoTool + +// MinuteStatMod 实时统计(5分钟数据) +type MinuteStatMod struct { + SumDate time.Time `bson:"sumDate"` // 记录时间 + AppId int32 `bson:"appId"` // appId + // 新增 + NewCount int64 `bson:"newCount"` // 新增总量 + DirectAddCount int64 `bson:"directAddCount"` // 直推新增 + FissionAddCount int64 `bson:"fissionAddCount"` // 裂变新增 + WebAddCount int64 `bson:"webAddCount"` // 官网新增 + DistrictAddCount int64 `bson:"districtAddCount"` // 渠道新增 + NormalAddCount int64 `bson:"normalAddCount"` // 自来新增 + AndroidAddCount int64 `bson:"androidAddCount"` // android新增 + IosAddCount int64 `bson:"iosAddCount"` // ios新增 + H5AddCount int64 `bson:"h5AddCount"` // H5新增 + H5FormalAddCount int64 `bson:"h5FormalAddCount"` // H5注册新增 + LightGuestAddCount int64 `bson:"lightGuestAddCount"` // 轻量安装新增 + LightFormalAddCount int64 `bson:"lightFormalAddCount"` // 轻量注册新增 + // 充值 + RechargetCount int64 `bson:"rechageCount"` // 充值订单 + RechargetMoney int64 `bson:"rechageMoney"` // 充值金额 + DirectAmount int64 `bson:"directAmount"` // 直推充值金额 + FissionAmount int64 `bson:"fissionAmount"` // 裂变充值金额 + DistrictRecharge int64 `bson:"districtRecharge"` // 渠道充值新增 + WebRecharge int64 `bson:"webRecharge"` // 官网充值新增 + NormalRecharge int64 `bson:"normalRecharge"` // 自来量充值新增 + AndroidRecharge int64 `bson:"androidRecharge"` // android充值 + IosRecharge int64 `bson:"iosRecharge"` // Ios充值 + LightRecharge int64 `bson:"lightRecharge"` // 轻量充值 + H5Recharge int64 `bson:"h5Recharge"` // H5充值 + // 访问 + AccessCount int64 `bson:"accessCount"` // 访问量 + AndroidAccessCount int64 `bson:"androidAccessCount"` // android访问量 + IosAccessCount int64 `bson:"iosAccessCount"` // ios访问量 + H5AccessCount int64 `bson:"h5AccessCount"` // H5 + LightAccessCount int64 `bson:"lightAccessCount"` // Light访问量 + DirectAccessCount int64 `bson:"directAccessCount"` // 直推访问数 + FissionAccessCount int64 `bson:"fissionAccessCount"` // 裂变访问数 + NaturalAccessCount int64 `bson:"naturalAccessCount"` // 自然访问数 + DistrictAccessCount int64 `bson:"districtAccessCount"` // 渠道访问量 + WebAccessCount int64 `bson:"webAccessCount"` // 官网访问量 + NormalAccessCount int64 `bson:"normalAccessCount"` // 自来访问量 + // 落地页 + LandpageAndroidClick int64 `bson:"landpageAndroidClick"` // 落地页android访问次数 + LandpageIosAppstoreClick int64 `bson:"landpageIosAppstoreClick"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick int64 `bson:"landpageIosAthorClick"` // 落地页iOS其他包访问次数 + LandpageIosH5Click int64 `bson:"landpageIosH5Click,omitempty"` // 落地页H5访问次数 + UpdatedAt time.Time `bson:"updatedAt"` // 更新时间 +} + +type MinuteStatDoc struct { + // 新增 + NewCount *int64 `bson:"newCount,omitempty"` // 新增总量 + DirectAddCount *int64 `bson:"directAddCount,omitempty"` // 直推新增 + FissionAddCount *int64 `bson:"fissionAddCount,omitempty"` // 裂变新增 + WebAddCount *int64 `bson:"webAddCount,omitempty"` // 官网新增 + DistrictAddCount *int64 `bson:"districtAddCount,omitempty"` // 渠道新增 + NormalAddCount *int64 `bson:"normalAddCount,omitempty"` // 自来新增 + AndroidAddCount *int64 `bson:"androidAddCount,omitempty"` // android新增 + IosAddCount *int64 `bson:"iosAddCount,omitempty"` // ios新增 + H5AddCount *int64 `bson:"h5AddCount,omitempty"` // H5新增 + H5FormalAddCount *int64 `bson:"h5FormalAddCount,omitempty"` // H5注册新增 + LightGuestAddCount *int64 `bson:"lightGuestAddCount,omitempty"` // 轻量安装新增 + LightFormalAddCount *int64 `bson:"lightFormalAddCount,omitempty"` // 轻量注册新增 + // 充值 + RechargetCount *int64 `bson:"rechageCount,omitempty"` // 充值订单 + RechargetMoney *int64 `bson:"rechageMoney,omitempty"` // 充值金额 + DirectAmount *int64 `bson:"directAmount,omitempty"` // 直推充值金额 + FissionAmount *int64 `bson:"fissionAmount,omitempty"` // 裂变充值金额 + DistrictRecharge *int64 `bson:"districtRecharge,omitempty"` // 渠道充值新增 + WebRecharge *int64 `bson:"webRecharge,omitempty"` // 官网充值新增 + NormalRecharge *int64 `bson:"normalRecharge,omitempty"` // 自来量充值新增 + AndroidRecharge *int64 `bson:"androidRecharge,omitempty"` // android充值 + IosRecharge *int64 `bson:"iosRecharge,omitempty"` // Ios充值 + LightRecharge *int64 `bson:"lightRecharge,omitempty"` // 轻量充值 + H5Recharge *int64 `bson:"h5Recharge,omitempty"` // H5充值 + // 访问 + AccessCount *int64 `bson:"accessCount,omitempty"` // 访问量 + AndroidAccessCount *int64 `bson:"androidAccessCount,omitempty"` // android访问量 + IosAccessCount *int64 `bson:"iosAccessCount,omitempty"` // ios访问量 + H5AccessCount *int64 `bson:"h5AccessCount,omitempty"` // H5 + LightAccessCount *int64 `bson:"lightAccessCount,omitempty"` // Light访问量 + DirectAccessCount *int64 `bson:"directAccessCount,omitempty"` // 直推访问数 + FissionAccessCount *int64 `bson:"fissionAccessCount,omitempty"` // 裂变访问数 + NaturalAccessCount *int64 `bson:"naturalAccessCount,omitempty"` // 自然访问数 + DistrictAccessCount *int64 `bson:"districtAccessCount,omitempty"` // 渠道访问量 + WebAccessCount *int64 `bson:"webAccessCount,omitempty"` // 官网访问量 + NormalAccessCount *int64 `bson:"normalAccessCount,omitempty"` // 自来访问量 + // 落地页 + LandpageAndroidClick *int64 `bson:"landpageAndroidClick,omitempty"` // 落地页android访问次数 + LandpageIosAppstoreClick *int64 `bson:"landpageIosAppstoreClick,omitempty"` // 落地页iOS商店包访问次数 + LandpageIosAthorClick *int64 `bson:"landpageIosAthorClick,omitempty"` // 落地页iOS其他包访问次数 + LandpageIosH5Click *int64 `bson:"landpageIosH5Click,omitempty"` // 落地页H5访问次数 + // 时间 + UpdatedAt *time.Time `bson:"updatedAt"` // 更新时间 +} diff --git a/models/monitormod/monitor.go b/models/monitormod/monitor.go new file mode 100644 index 0000000..3662d11 --- /dev/null +++ b/models/monitormod/monitor.go @@ -0,0 +1,137 @@ +package monitormod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.Monitor) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.Monitor.Name, Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: FN.Monitor.AppId, Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: FN.Monitor.Status, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(Monitor:initMonitorIndex) Create Monitor Index failed! err:%+v:", err)) + } +} + +// InsertOneMonitor 插入一个应用监控 +func InsertOneMonitor(ctx context.Context, Monitor *Monitor) error { + if _, err := db.InsertOne(ctx, Monitor); err != nil { + log.Warn("Monitor:InsertOneMonitor db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +// FindOneMonitor 查找一个应用监控 +func FindOneMonitor(ctx context.Context, filter bson.M) ( + *Monitor, error) { + var Monitor Monitor + if err := db.FindOne(ctx, &Monitor, filter); err != nil { + return nil, err + } + return &Monitor, nil +} + +// DelOneMonitor 删除一个应用监控 +func DelOneMonitor(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("Monitor:DelOneMonitor db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateOneMonitor 更新一个应用监控 +func UpdateOneMonitor(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneMonitor db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// CountMonitors 统计应用监控数量 +func CountMonitors(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("Monitor:CountMonitors db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +// UpdateManyMonitor 更新满足条件的应用监控 +func UpdateManyMonitor(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyMonitor db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// FindManyMonitor 查找一批应用监控数据 +func FindManyMonitor(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (MonitorList, error) { + data := make(MonitorList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("Monitor:FindManyMonitor db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// FindManyMonitorWithBind 用自己定义结构查找一批应用监控数据 +func FindManyMonitorWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("Monitor:FindManyMonitorWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// AggregateMonitors 聚合查找一批应用监控信息 +func AggregateMonitors(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateMonitors db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/monitormod/tag.go b/models/monitormod/tag.go new file mode 100644 index 0000000..7f81128 --- /dev/null +++ b/models/monitormod/tag.go @@ -0,0 +1,44 @@ +package monitormod + +type TagMonitor struct { + ID string + AppId string + Name string + Category string + Device string + Duration string + Compare string + Threshold string + Comment string + Status string + TriggerCount string + CheckCount string + UpdatedAt string + CreatedAt string +} + +var FN struct { + Monitor TagMonitor +} + +var TN struct { + Monitor string +} + +func init() { + FN.Monitor.ID = "_id" + FN.Monitor.AppId = "appId" + FN.Monitor.Name = "name" + FN.Monitor.Category = "category" + FN.Monitor.Device = "device" + FN.Monitor.Duration = "duration" + FN.Monitor.Compare = "compare" + FN.Monitor.Threshold = "threshold" + FN.Monitor.Comment = "comment" + FN.Monitor.Status = "status" + FN.Monitor.TriggerCount = "triggerCount" + FN.Monitor.CheckCount = "checkCount" + FN.Monitor.UpdatedAt = "updatedAt" + FN.Monitor.CreatedAt = "createdAt" + TN.Monitor = "monitor" +} diff --git a/models/monitormod/type.go b/models/monitormod/type.go new file mode 100644 index 0000000..36a7b67 --- /dev/null +++ b/models/monitormod/type.go @@ -0,0 +1,44 @@ +package monitormod + +import ( + "go.mongodb.org/mongo-driver/bson/primitive" + "stat/common/statutils" + "time" +) + +type MonitorCategory int + +const ( + MonitorCategoryNone MonitorCategory = 0 // 占位符,无意义 + MonitorCategoryNewUser MonitorCategory = 1 // 新用户监控 +) + +type Compare int + +const ( + CompareNone Compare = 0 + CompareLT Compare = 1 // 小于 + CompareEQ Compare = 2 // 等于 + CompareGT Compare = 3 // 大于 +) + +// 监控模型,数据库中的 +// @table:monitor +type Monitor struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + Name string `bson:"name" json:"name"` // 名称 + AppId int32 `bson:"appId" json:"appId"` // appId + Category MonitorCategory `bson:"category" json:"category"` // 分类 + Device statutils.DeviceName `bson:"device" json:"device"` // 设备 + Duration int64 `bson:"duration" json:"duration"` // 时间段,单位分钟 + Compare Compare `bson:"compare" json:"compare"` // 比较 + Threshold int64 `bson:"threshold" json:"threshold"` // 阀值 + Comment string `bson:"comment" json:"comment"` // 注释 + Status bool `bson:"status" json:"status"` // 是否启用 + TriggerCount int64 `bson:"triggerCount" json:"triggerCount"` // 触发次数 + CheckCount int64 `bson:"checkCount" json:"checkCount"` // 检测次数 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 更新时间 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间 +} + +type MonitorList []*Monitor diff --git a/models/opLogMod/opLog.go b/models/opLogMod/opLog.go new file mode 100644 index 0000000..742a230 --- /dev/null +++ b/models/opLogMod/opLog.go @@ -0,0 +1,72 @@ +package opLogMod + +import ( + "context" + "fmt" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "stat/common/log" + "stat/common/mongos" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollOpLog) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "createdAt", Value: 1}}, + }, + { + Keys: bson.D{{Key: "router", Value: 1}}, + }, + { + Keys: bson.D{{Key: "operator", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollOpLog, err)) + } +} + +// 增加操作日志 +func AddOpLog(ctx context.Context, doc *OpLog) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error("opLog AddOpLog InsertOne err", log.E(err)) + return + } + return +} + +// 获取操作日志列表 +func GetOpLogList(ctx context.Context, operator *string, router *string, isAdmin *bool, skip, limit int64) (count int64, data []OpLog, err error) { + filter := bson.M{} + if operator != nil { + filter["operator"] = operator + } + if router != nil { + filter["router"] = router + } + if isAdmin != nil { + filter["isAdmin"] = isAdmin + } + + sort := bson.D{{"createdAt", -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("opLog GetOpLogList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("opLog GetOpLogList Count err", log.E(err)) + return + } + + return +} diff --git a/models/opLogMod/type.go b/models/opLogMod/type.go new file mode 100644 index 0000000..21c2afc --- /dev/null +++ b/models/opLogMod/type.go @@ -0,0 +1,18 @@ +package opLogMod + +import ( + "stat/common/mongos" + "time" +) + +const CollOpLog = "op_log" + +var db *mongos.MongoTool + +type OpLog struct { + Operator string `bson:"operator"` // 操作人员 + Router string `bson:"router"` // 接口路由 + Data string `bson:"data"` // 操作数据 + IsAdmin bool `bson:"isAdmin"` // 是否是管理员 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} diff --git a/models/rechargechannelmod/rechargechannel.go b/models/rechargechannelmod/rechargechannel.go new file mode 100644 index 0000000..8efd0eb --- /dev/null +++ b/models/rechargechannelmod/rechargechannel.go @@ -0,0 +1,99 @@ +package rechargechannelmod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Init() { + db = mongos.New(mongos.MgoManager, CollRechargeChannel) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "sumDate", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollRechargeChannel, err)) + } +} + +// UpsertOneUserRechargeStat 更新或插入一条支付渠道统计 +func UpsertOneUserRechargeStat(ctx context.Context, channelName string, appId int32, sumDate time.Time, blocDeduction bool, money, paymoney, channelMoney int64) (err error) { + filter := bson.M{"channelName": channelName, "appId": appId, "sumDate": sumDate} + + update := bson.M{} + + update["orderCount"] = 1 + update["totalOrderMoney"] = money + update["TotalOrderPayMoney"] = paymoney + update["channelMoney"] = channelMoney + if !blocDeduction { + update["blocOrderCount"] = 1 + update["blocOrderMoney"] = money + update["blocOrderPayMoney"] = paymoney + update["blocChannelMoney"] = channelMoney + } + + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, bson.M{"$inc": update}) + } else { + insertDoc := update + insertDoc["sumDate"] = sumDate + insertDoc["appId"] = appId + insertDoc["channelName"] = channelName + + _, err = db.InsertOne(ctx, insertDoc) + } + + return err +} + +// 后台获取统计信息 +func GetRechargeChannelStatList(ctx context.Context, appId *int32, channelName *string, start, end *time.Time, skip, limit int64) (count int64, data []RechargeChannelMod, err error) { + filter := bson.M{} + + if appId != nil { + filter["appId"] = appId + } + + if channelName != nil { + filter["channelName"] = channelName + } + + if start != nil && end != nil { + filter["sumDate"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["sumDate"] = bson.M{"$gte": start} + } else if end != nil { + filter["sumDate"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "sumDate", Value: -1}, {Key: "appId", Value: 1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("channelCodeStat GetRechargeChannelStatList Find err", log.E(err)) + return + } + if count, err = db.Count(ctx, filter); err != nil { + log.Error("channelCodeStat GetRechargeChannelStatList Count err", log.E(err)) + return + } + + return +} diff --git a/models/rechargechannelmod/type.go b/models/rechargechannelmod/type.go new file mode 100644 index 0000000..886f2f2 --- /dev/null +++ b/models/rechargechannelmod/type.go @@ -0,0 +1,27 @@ +package rechargechannelmod + +import ( + "stat/common/mongos" + "time" +) + +// 表名 +const CollRechargeChannel = "log_recharge_channel" + +var db *mongos.MongoTool + +// RechargeChannelMod 充值渠道信息 +type RechargeChannelMod struct { + SumDate time.Time `bson:"sumDate"` // 记录时间 按天对齐 + AppId int32 `bson:"appId"` // appId + ChannelName string `bson:"channelName"` // 支付渠道名称 + TotalOrderCount int64 `bson:"orderCount"` // 订单数量 + BlocOrderCount int64 `bson:"blocOrderCount"` // 集团订单数量 + TotalOrderMoney int64 `bson:"totalOrderMoney"` // 订单金额 + BlocOrderMoney int64 `bson:"blocOrderMoney"` // 集团订单金额 + TotalOrderPayMoney int64 `bson:"totalOrderPayMoney"` // 订单实际支付金额 + BlocOrderPayMoney int64 `bson:"blocOrderPayMoney"` // 集团订单实际支付金额 + ChannelMoney int64 `bson:"channelMoney"` // 渠道费用 + BlocChannelMoney int64 `bson:"blocChannelMoney"` // 集团渠道费用 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} diff --git a/models/rechargegamemod/recharge.go b/models/rechargegamemod/recharge.go new file mode 100644 index 0000000..8ee7160 --- /dev/null +++ b/models/rechargegamemod/recharge.go @@ -0,0 +1,214 @@ +package rechargegamemod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollGameRechargeLog) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "userId", Value: 1}, {Key: "appId", Value: 1}}, + }, { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "orderId", Value: 1}}, + Options: options.Index().SetUnique(true), + }, { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "successAt", Value: 1}}, + }, { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "successAt", Value: 1}, {Key: "isDeduction", Value: 1}, {Key: "blocDeduction", Value: 1}}, + }, + } + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", CollGameRechargeLog, err)) + } +} + +// 新增用户充值记录 +func AddRechargeLog(ctx context.Context, doc *GameRechargeMod) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error("admin AddActionLog InsertOne err", log.E(err)) + return + } + + return +} + +// 获取充值详情(集团) +func GetBlocRechargeDetailsList(ctx context.Context, appId *int32, start, end *time.Time, skip, limit int64) (count int64, data []GameRechargeMod, err error) { + filter := bson.M{} + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["successAt"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["successAt"] = bson.M{"$gte": start} + } else if end != nil { + filter["successAt"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "successAt", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("recharge GetBlocRechargeDetailsList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("recharge GetBlocRechargeDetailsList Count err", log.E(err)) + return + } + + return +} + +// 获取充值详情 +func GetBlocRechargeDetailsListTool(ctx context.Context, appId int32, skip, limit int64) (data []GameRechargeMod, err error) { + filter := bson.M{"appId": appId} + + sort := bson.D{{Key: "_id", Value: 1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("recharge GetBlocRechargeDetailsList Find err", log.E(err)) + return + } + + return +} + +// UpdateRechargeInfo 批量更新 +func UpdateRechargeInfo(ctx context.Context, mods []mongo.WriteModel) error { + if _, err := db.BulkWrite(ctx, mods); err != nil { + log.Error("UpdateRechargeInfo failed", log.Any("err", err)) + return err + } + return nil +} + +// AddManyRecharge 新增多条注册记录 +func AddManyRecharge(ctx context.Context, docs *[]*GameRechargeMod) (err error) { + if _, err = db.InsertMany(ctx, docs); err != nil { + log.Error("channelCode AddManyRecharge InsertMany err", log.E(err)) + return + } + + return +} + +// FindDspDistrictRecharge +func FindDistrictRecharge(ctx context.Context, appId int32, district string) ([]GameRechargeMod, error) { + list := make([]GameRechargeMod, 0) + + beginTimeStr := "2020-10-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}, "districtCode": district, "appId": appId} + + if err := db.Find(ctx, &list, query); err != nil { + log.Error("FindDspDistrictRecharge Find error", log.E(err)) + return list, err + } + + return list, nil +} + +func FindBlocDistrictRecharge(ctx context.Context, appId int32, blocDeduction bool) ([]GameRechargeMod, error) { + list := make([]GameRechargeMod, 0) + + beginTimeStr := "2020-10-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}, "appId": appId, "blocDeduction": blocDeduction} + + if err := db.Find(ctx, &list, query); err != nil { + log.Error("FindDspDistrictRecharge Find error", log.E(err)) + return list, err + } + + return list, nil +} + +func FindBlocDistrictRechargeTotal(ctx context.Context, appId int32) ([]GameRechargeMod, error) { + list := make([]GameRechargeMod, 0) + + beginTimeStr := "2020-10-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}, "appId": appId} + + if err := db.Find(ctx, &list, query); err != nil { + log.Error("FindDspDistrictRecharge Find error", log.E(err)) + return list, err + } + + return list, nil +} + +func FindDistrictRechargeAll(ctx context.Context, appId int32) ([]GameRechargeMod, error) { + list := make([]GameRechargeMod, 0) + + beginTimeStr := "2020-10-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}, "appId": appId, "districtCode": bson.M{"$gt": ""}} + + if err := db.Find(ctx, &list, query); err != nil { + log.Error("FindDspDistrictRecharge Find error", log.E(err)) + return list, err + } + + return list, nil +} + +// FindRechargeByOrder +func FindRechargeByOrder(ctx context.Context, appId int32, OrderId string) (data GameRechargeMod, err error) { + + query := bson.M{"orderId": OrderId, "appId": appId} + + if err = db.FindOne(ctx, &data, query); err != nil { + log.Error("FindRechargeByOrder Find error", log.E(err)) + return data, err + } + + return data, nil +} + +func FindRechargeByUser(ctx context.Context, appId int32, userid int64) (data GameRechargeMod, err error) { + + query := bson.M{"userId": userid, "appId": appId} + + if err = db.FindOne(ctx, &data, query); err != nil { + log.Error("FindRechargeByOrder Find error", log.E(err)) + return data, err + } + + return data, nil +} + +//UpdateManyRecharge 更新注册用户信息 +func UpdateManyRecharge(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyRecharge db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} diff --git a/models/rechargegamemod/stat.go b/models/rechargegamemod/stat.go new file mode 100644 index 0000000..1e7324d --- /dev/null +++ b/models/rechargegamemod/stat.go @@ -0,0 +1,255 @@ +package rechargegamemod + +import ( + "context" + "stat/common/log" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// DirectRechargeAmount 获取直推充值金额 +func DirectRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "isDirect": true, "status": 3} + result := make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// FissionRechargeAmount 获取裂变充值金额 +func FissionRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "isDirect": false, "status": 3} + result := make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// DeductionRechargeAmount 获取扣量值金额 +func DeductionRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "status": 3} + result := make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// TotalRechargeAmount 获取总充值金额 +func TotalRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "status": 3} + result := make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// TotalDistricRechargeAmount 获取渠道总充值金额 +func TotalDistricRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (result []GameRechargeMod, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "status": 3} + result = make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + + return +} + +// TotalDistricRechargeAmountV1 获取渠道总充值金额 +func TotalDistricRechargeAmountV1(ctx context.Context, appid int32, start, end time.Time) (result []GameRechargeMod, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "status": 3} + result = make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + + return +} + +// BlocTotalDistricRechargeAmount 获取渠道总充值金额 +func BlocTotalDistricRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (result []GameRechargeMod, err error) { + + query := bson.M{"appId": appid, "blocDeduction": false, "successAt": bson.M{"$gte": start, "$lt": end}, "status": 3} + result = make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + + return +} + +// GetDaichongAmout 获取直推充值金额 +func GetDaichongAmout(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "channelName": "daichong"} + result := make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// GetDaichongAmout 获取直推充值金额 +func BlocGetDaichongAmout(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "blocDeduction": false, "channelName": "daichong"} + result := make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// GetOnlineAmount 获取直推充值金额 +func GetOnlineAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}} + result := make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// BlocGetOnlineAmount 获取直推充值金额 +func BlocGetOnlineAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "blocDeduction": false, "channelName": bson.M{"$ne": "daichong"}} + result := make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// BlocDirectRechargeAmount 获取直推充值金额 +func BlocDirectRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "blocDeduction": false, "successAt": bson.M{"$gte": start, "$lt": end}, "isDirect": true, "status": 3} + result := make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// BlocFissionRechargeAmount 获取裂变充值金额 +func BlocFissionRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "blocDeduction": false, "successAt": bson.M{"$gte": start, "$lt": end}, "isDirect": false, "status": 3} + result := make([]GameRechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// FissionRechargeAmount 获取裂变充值金额 +func FissionRechargeList(ctx context.Context, appid int32, start, end time.Time) (data []GameRechargeMod, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "isDirect": false, "status": 3} + + err = db.Find(ctx, &data, query) + if err != nil { + return + } + + return +} + +//FindManyRechargeInfo 查找一批信息数据 +func FindManyRechargeInfo(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (GameRechargeInfoList, error) { + data := make(GameRechargeInfoList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("FindManyRechargeInfo dbChannel.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} diff --git a/models/rechargegamemod/type.go b/models/rechargegamemod/type.go new file mode 100644 index 0000000..2ad33db --- /dev/null +++ b/models/rechargegamemod/type.go @@ -0,0 +1,45 @@ +package rechargegamemod + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 表名 +const CollGameRechargeLog = "log_recharge_game" + +var db *mongos.MongoTool + +// GameRechargeMod 充值成功订单信息 +type GameRechargeMod struct { + ID primitive.ObjectID `bson:"_id,omitempty"` // 订单 + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台订单Id + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + AppId int32 `json:"appId" bson:"appId"` // appID + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 安卓 IOS + DevType string `json:"devType" bson:"devType"` // 设备类型 + ChannelName string `json:"channelName" bson:"channelName"` // 支付渠道名字 + CID string `json:"cid" bson:"cid"` // 渠道id + Type string `bson:"type" json:"type"` // 充值方式 + OrderId string `json:"orderId" bson:"orderId"` // 流水id + Money int64 `json:"money" bson:"money"` // 充值金额 订单金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` // 实际到账金额 用户实际支付金额 + Status int `json:"status" bson:"status"` // 2付款失败 3付款成功 + FailureAt time.Time `json:"failureAt,omitempty" bson:"failureAt,omitempty"` // 失败时间 + SuccessAt time.Time `json:"successAt,omitempty" bson:"successAt,omitempty"` // 成功时间 + OrderCreatedAt time.Time `json:"orderCreatedAt,omitempty" bson:"orderCreatedAt,omitempty"` // 创建时间 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` // 集团扣量(特定渠道扣量) + PromCode string `json:"promCode,omitempty" bson:"promCode"` // 用户推广序列 + RegisterTime time.Time `json:"registerTime,omitempty" bson:"registerTime"` // 操作时间 + IsDirect bool `json:"isDirect" bson:"isDirect"` // true:是直推用户 + IsFormalUser bool `json:"isFormalUser" bson:"isFormalUser"` // 是否正式用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` // 渠道码 + Repeat bool `bson:"repeat" json:"repeat"` // 复冲: true 重复充值 false 第一次 + Rate string `json:"rate" bson:"rate"` // 渠道费率 + SyncStatus int64 `json:"syncStatus" bson:"syncStatus"` // 同步大白鲨:0 需要同步 1:不需要同步 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} + +type GameRechargeInfoList []*GameRechargeMod diff --git a/models/rechargemod/recharge.go b/models/rechargemod/recharge.go new file mode 100644 index 0000000..7dfc0fd --- /dev/null +++ b/models/rechargemod/recharge.go @@ -0,0 +1,214 @@ +package rechargemod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollRechargeLog) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "userId", Value: 1}, {Key: "appId", Value: 1}}, + }, { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "orderId", Value: 1}}, + Options: options.Index().SetUnique(true), + }, { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "successAt", Value: 1}}, + }, { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "successAt", Value: 1}, {Key: "isDeduction", Value: 1}, {Key: "blocDeduction", Value: 1}}, + }, + } + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", CollRechargeLog, err)) + } +} + +// 新增用户充值记录 +func AddRechargeLog(ctx context.Context, doc *RechargeMod) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error("admin AddActionLog InsertOne err", log.E(err)) + return + } + + return +} + +// 获取充值详情(集团) +func GetBlocRechargeDetailsList(ctx context.Context, appId *int32, start, end *time.Time, skip, limit int64) (count int64, data []RechargeMod, err error) { + filter := bson.M{"blocDeduction": false} + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["successAt"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["successAt"] = bson.M{"$gte": start} + } else if end != nil { + filter["successAt"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "successAt", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("recharge GetBlocRechargeDetailsList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("recharge GetBlocRechargeDetailsList Count err", log.E(err)) + return + } + + return +} + +// 获取充值详情 +func GetBlocRechargeDetailsListTool(ctx context.Context, appId int32, skip, limit int64) (data []RechargeMod, err error) { + filter := bson.M{"appId": appId} + + sort := bson.D{{Key: "_id", Value: 1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("recharge GetBlocRechargeDetailsList Find err", log.E(err)) + return + } + + return +} + +// UpdateRechargeInfo 批量更新 +func UpdateRechargeInfo(ctx context.Context, mods []mongo.WriteModel) error { + if _, err := db.BulkWrite(ctx, mods); err != nil { + log.Error("UpdateRechargeInfo failed", log.Any("err", err)) + return err + } + return nil +} + +// AddManyRecharge 新增多条注册记录 +func AddManyRecharge(ctx context.Context, docs *[]*RechargeMod) (err error) { + if _, err = db.InsertMany(ctx, docs); err != nil { + log.Error("channelCode AddManyRecharge InsertMany err", log.E(err)) + return + } + + return +} + +// FindDspDistrictRecharge +func FindDistrictRecharge(ctx context.Context, appId int32, district string) ([]RechargeMod, error) { + list := make([]RechargeMod, 0) + + beginTimeStr := "2020-10-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}, "districtCode": district, "appId": appId} + + if err := db.Find(ctx, &list, query); err != nil { + log.Error("FindDspDistrictRecharge Find error", log.E(err)) + return list, err + } + + return list, nil +} + +func FindBlocDistrictRecharge(ctx context.Context, appId int32, blocDeduction bool) ([]RechargeMod, error) { + list := make([]RechargeMod, 0) + + beginTimeStr := "2020-10-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}, "appId": appId, "blocDeduction": blocDeduction} + + if err := db.Find(ctx, &list, query); err != nil { + log.Error("FindDspDistrictRecharge Find error", log.E(err)) + return list, err + } + + return list, nil +} + +func FindBlocDistrictRechargeTotal(ctx context.Context, appId int32) ([]RechargeMod, error) { + list := make([]RechargeMod, 0) + + beginTimeStr := "2020-10-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}, "appId": appId} + + if err := db.Find(ctx, &list, query); err != nil { + log.Error("FindDspDistrictRecharge Find error", log.E(err)) + return list, err + } + + return list, nil +} + +func FindDistrictRechargeAll(ctx context.Context, appId int32) ([]RechargeMod, error) { + list := make([]RechargeMod, 0) + + beginTimeStr := "2020-10-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}, "appId": appId, "districtCode": bson.M{"$gt": ""}} + + if err := db.Find(ctx, &list, query); err != nil { + log.Error("FindDspDistrictRecharge Find error", log.E(err)) + return list, err + } + + return list, nil +} + +// FindRechargeByOrder +func FindRechargeByOrder(ctx context.Context, appId int32, OrderId string) (data RechargeMod, err error) { + + query := bson.M{"orderId": OrderId, "appId": appId} + + if err = db.FindOne(ctx, &data, query); err != nil { + log.Error("FindRechargeByOrder Find error", log.E(err)) + return data, err + } + + return data, nil +} + +func FindRechargeByUser(ctx context.Context, appId int32, userid int64) (data RechargeMod, err error) { + + query := bson.M{"userId": userid, "appId": appId} + + if err = db.FindOne(ctx, &data, query); err != nil { + log.Error("FindRechargeByOrder Find error", log.E(err)) + return data, err + } + + return data, nil +} + +//UpdateManyRecharge 更新注册用户信息 +func UpdateManyRecharge(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyRecharge db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} diff --git a/models/rechargemod/stat.go b/models/rechargemod/stat.go new file mode 100644 index 0000000..bc6d4eb --- /dev/null +++ b/models/rechargemod/stat.go @@ -0,0 +1,255 @@ +package rechargemod + +import ( + "context" + "stat/common/log" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// DirectRechargeAmount 获取直推充值金额 +func DirectRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "isDirect": true, "status": 3} + result := make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// FissionRechargeAmount 获取裂变充值金额 +func FissionRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "isDirect": false, "status": 3} + result := make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// DeductionRechargeAmount 获取扣量值金额 +func DeductionRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "status": 3} + result := make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// TotalRechargeAmount 获取总充值金额 +func TotalRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "status": 3} + result := make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// TotalDistricRechargeAmount 获取渠道总充值金额 +func TotalDistricRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (result []RechargeMod, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "status": 3} + result = make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + + return +} + +// TotalRechargeListV1 获取渠道总充值金额 +func TotalRechargeListV1(ctx context.Context, appid int32, start, end time.Time) (result []*RechargeMod, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "status": 3} + result = make([]*RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + + return +} + +// BlocTotalDistricRechargeAmount 获取渠道总充值金额 +func BlocTotalDistricRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (result []RechargeMod, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "status": 3} + result = make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + + return +} + +// GetDaichongAmout 获取直推充值金额 +func GetDaichongAmout(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "channelName": "daichong"} + result := make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// GetDaichongAmout 获取直推充值金额 +func BlocGetDaichongAmout(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "channelName": "daichong"} + result := make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// GetOnlineAmount 获取直推充值金额 +func GetOnlineAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}} + result := make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// BlocGetOnlineAmount 获取直推充值金额 +func BlocGetOnlineAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "channelName": bson.M{"$ne": "daichong"}} + result := make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// BlocDirectRechargeAmount 获取直推充值金额 +func BlocDirectRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "isDirect": true, "status": 3} + result := make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// BlocFissionRechargeAmount 获取裂变充值金额 +func BlocFissionRechargeAmount(ctx context.Context, appid int32, start, end time.Time) (count int64, money int64, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "isDirect": false, "status": 3} + result := make([]RechargeMod, 0) + + err = db.Find(ctx, &result, query) + if err != nil { + return + } + count = int64(len(result)) + for _, v := range result { + money += v.PayMoney + } + + return +} + +// FissionRechargeAmount 获取裂变充值金额 +func FissionRechargeList(ctx context.Context, appid int32, start, end time.Time) (data []RechargeMod, err error) { + + query := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "isDirect": false, "status": 3} + + err = db.Find(ctx, &data, query) + if err != nil { + return + } + + return +} + +// FindManyRechargeInfo 查找一批信息数据 +func FindManyRechargeInfo(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (RechargeInfoList, error) { + data := make(RechargeInfoList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("FindManyRechargeInfo dbChannel.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} diff --git a/models/rechargemod/tag.go b/models/rechargemod/tag.go new file mode 100644 index 0000000..e8d72ad --- /dev/null +++ b/models/rechargemod/tag.go @@ -0,0 +1,65 @@ +package rechargemod + +type TagRechargeMod struct { + ID string + Rate string + Repeat string + DistrictCode string + IsFormalUser string + IsDirect string + RegisterTime string + PromCode string + BlocDeduction string + OrderCreatedAt string + SuccessAt string + FailureAt string + Status string + PayMoney string + Money string + OrderId string + Type string + CID string + ChannelName string + DevType string + SysType string + AppId string + UserId string + PlatformId string + CreatedAt string +} + +var FN struct { + RechargeMod TagRechargeMod +} +var TN struct { + RechargeMod string +} + +func init() { + FN.RechargeMod.ID = "_id" + FN.RechargeMod.Rate = "rate" + FN.RechargeMod.Repeat = "repeat" + FN.RechargeMod.DistrictCode = "districtCode" + FN.RechargeMod.IsFormalUser = "isFormalUser" + FN.RechargeMod.IsDirect = "isDirect" + FN.RechargeMod.RegisterTime = "registerTime" + FN.RechargeMod.PromCode = "promCode" + FN.RechargeMod.BlocDeduction = "blocDeduction" + FN.RechargeMod.OrderCreatedAt = "orderCreatedAt" + FN.RechargeMod.SuccessAt = "successAt" + FN.RechargeMod.FailureAt = "failureAt" + FN.RechargeMod.Status = "status" + FN.RechargeMod.PayMoney = "payMoney" + FN.RechargeMod.Money = "money" + FN.RechargeMod.OrderId = "orderId" + FN.RechargeMod.Type = "type" + FN.RechargeMod.CID = "cid" + FN.RechargeMod.ChannelName = "channelName" + FN.RechargeMod.DevType = "devType" + FN.RechargeMod.SysType = "sysType" + FN.RechargeMod.AppId = "appId" + FN.RechargeMod.UserId = "userId" + FN.RechargeMod.PlatformId = "platformId" + FN.RechargeMod.CreatedAt = "createdAt" + TN.RechargeMod = "log_recharge" +} diff --git a/models/rechargemod/type.go b/models/rechargemod/type.go new file mode 100644 index 0000000..11e383b --- /dev/null +++ b/models/rechargemod/type.go @@ -0,0 +1,46 @@ +package rechargemod + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 表名 +const CollRechargeLog = "log_recharge" + +var db *mongos.MongoTool + +// RechargeMod 充值成功订单信息 +// @table:log_recharge +// @model:RechargeDB +type RechargeMod struct { + ID primitive.ObjectID `bson:"_id,omitempty"` // 订单 + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台订单Id + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + AppId int32 `json:"appId" bson:"appId"` // appID + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 安卓 IOS + DevType string `json:"devType" bson:"devType"` // 设备类型 + ChannelName string `json:"channelName" bson:"channelName"` // 支付渠道名字 + CID string `json:"cid" bson:"cid"` // 渠道id + Type string `bson:"type" json:"type"` // 充值方式 + OrderId string `json:"orderId" bson:"orderId"` // 流水id + Money int64 `json:"money" bson:"money"` // 充值金额 订单金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` // 实际到账金额 用户实际支付金额 + Status int `json:"status" bson:"status"` // 2付款失败 3付款成功 + FailureAt time.Time `json:"failureAt,omitempty" bson:"failureAt,omitempty"` // 失败时间 + SuccessAt time.Time `json:"successAt,omitempty" bson:"successAt,omitempty"` // 成功时间 + OrderCreatedAt time.Time `json:"orderCreatedAt,omitempty" bson:"orderCreatedAt,omitempty"` // 创建时间 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` // 集团扣量(特定渠道扣量) + PromCode string `json:"promCode,omitempty" bson:"promCode"` // 用户推广序列 + RegisterTime time.Time `json:"registerTime,omitempty" bson:"registerTime"` // 操作时间 + IsDirect bool `json:"isDirect" bson:"isDirect"` // true:是直推用户 + IsFormalUser bool `json:"isFormalUser" bson:"isFormalUser"` // 是否正式用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` // 渠道码 + Repeat bool `bson:"repeat" json:"repeat"` // 复冲: true 重复充值 false 第一次 + Rate string `json:"rate" bson:"rate"` // 渠道费率 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} + +type RechargeInfoList []*RechargeMod diff --git a/models/registermod/register.go b/models/registermod/register.go new file mode 100644 index 0000000..ae98d95 --- /dev/null +++ b/models/registermod/register.go @@ -0,0 +1,238 @@ +package registermod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollRegisterLog) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "userId", Value: 1}, {Key: "appId", Value: 1}}, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{{Key: "appId", Value: 1}}, + }, + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "registerTime", Value: 1}}, + }, + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "formalTime", Value: 1}}, + }, + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "districtCode", Value: 1}, {Key: "registerTime", Value: 1}}, + }, + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "districtCode", Value: 1}, {Key: "formalTime", Value: 1}}, + }, + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "promCode", Value: 1}}, + }, + } + + //registerTime + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", CollRegisterLog, err)) + } +} + +// 新增用户操作记录 +func AddRegisterLog(ctx context.Context, doc *RegisterMod) (err error) { + if _, err = db.InsertOne(ctx, doc); err != nil { + log.Error("admin AddRegisterLog InsertOne err", log.E(err)) + return + } + + return +} + +// 新增用户操作记录 +func GetRegisterInfo(ctx context.Context, userId uint64, appId int32) (userInfo RegisterMod, err error) { + var filter = bson.M{"userId": userId, "appId": appId} + + if err = db.FindOne(ctx, &userInfo, filter); err != nil { + log.Error("admin AddRegisterLog InsertOne err", log.E(err)) + return + } + + return +} + +// 新增用户操作记录 +func GetRegisterInfoByInviteCode(ctx context.Context, promCode string, appId int32) (userInfo RegisterMod, err error) { + var filter = bson.M{"promCode": promCode, "appId": appId} + + if err = db.FindOne(ctx, &userInfo, filter); err != nil { + log.Error("admin AddRegisterLog InsertOne err", log.E(err)) + return + } + + return +} + +// AddManyRegisterCode 新增多条注册记录 +func AddManyRegisterCode(ctx context.Context, docs *[]*RegisterMod) (err error) { + if _, err = db.InsertMany(ctx, docs); err != nil { + log.Error("channelCode AddManyRegisterCode InsertMany err", log.E(err)) + return + } + + return +} + +// 根据appId和locId更新位置id +func DeleteMany(ctx context.Context) (err error) { + filter := bson.M{"appId": 2} + + count, err := db.DeleteMany(ctx, filter) + if err != nil { + log.Error("advertise UpdateLocInfo UpdateMany err", log.E(err)) + return + } + + fmt.Println("DeleteMany", count) + return +} + +// 获取用户详情(集团) +func GetBlocRegisterDetailsList(ctx context.Context, appId *int32, start, end *time.Time, skip, limit int64) (count int64, data []RegisterMod, err error) { + filter := bson.M{"blocDeduction": false} + + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["registerTime"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["registerTime"] = bson.M{"$gte": start} + } else if end != nil { + filter["registerTime"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "registerTime", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("register GetBlocRegisterDetailsList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("register GetBlocRegisterDetailsList Count err", log.E(err)) + return + } + + return +} + +// UpdateRegisterInfo 批量更新 +func UpdateRegisterInfo(ctx context.Context, mods []mongo.WriteModel) error { + if _, err := db.BulkWrite(ctx, mods); err != nil { + log.Error("UpdateRegisterInfo failed", log.Any("err", err)) + return err + } + return nil +} + +// UpdateOneRegister 更新注册用户信息 +func UpdateOneRegister(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneRegister db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// UpdateManyRegister 更新注册用户信息 +func UpdateManyRegister(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyRegister db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +// 新增用户操作记录 +func GetRegisterInfos(ctx context.Context, userId []uint64, appId int32) (userInfos []RegisterMod, err error) { + var filter = bson.M{"userId": bson.M{"$in": userId}, "appId": appId} + + if err = db.Find(ctx, &userInfos, filter); err != nil { + log.Error("admin GetRegisterInfos Find err", log.E(err)) + return + } + + return +} + +// 获取用户详情(集团) +func GetBlocRegisterList(ctx context.Context, skip, limit int64) (data []RegisterMod, err error) { + filter := bson.M{} + + sort := bson.D{{Key: "_id", Value: 1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("register GetBlocRegisterDetailsList Find err", log.E(err)) + return + } + + return +} + +// 获取用户推广列表 +func GetUserInviteListList(ctx context.Context, appId int32, promCode string, skip, limit int64) (data []RegisterMod, err error) { + filter := bson.M{"appId": appId, "promSeqe": promCode} + + sort := bson.D{{Key: "registerTime", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("register GetBlocRegisterDetailsList Find err", log.E(err)) + return + } + + return +} + +// FindManyRegister 查找注册用户 +func FindManyRegister(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) ([]RegisterMod, error) { + data := make([]RegisterMod, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("FindManyRegister db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +// CountRegister 获取注册用户数量 +func CountRegister(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("CountRegister db.Count failed", log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} diff --git a/models/registermod/stat.go b/models/registermod/stat.go new file mode 100644 index 0000000..ad3515b --- /dev/null +++ b/models/registermod/stat.go @@ -0,0 +1,331 @@ +package registermod + +import ( + "context" + "stat/common/log" + "stat/common/utils" + "time" + + "go.mongodb.org/mongo-driver/mongo/options" + + "go.mongodb.org/mongo-driver/bson" +) + +// DirectVisitUserCount 获取直推注册用户 +func DirectVisitUserCount(ctx context.Context, appid int32, uids []uint64) (count int64, err error) { + + query := bson.M{"appId": appid, "isDirect": true, "userId": bson.M{"$in": uids}} + + return db.Count(ctx, query) +} + +// FissionVisitUserCount 获取裂变注册用户 +func FissionVisitUserCount(ctx context.Context, appid int32, uids []uint64) (count int64, err error) { + + query := bson.M{"appId": appid, "isDirect": false, "userId": bson.M{"$in": uids}} + + return db.Count(ctx, query) +} + +// TimeRegisterUserCount 获取时间范围注册用户 +func TimeRegisterUserCount(ctx context.Context, appid int32, uids []uint64, start, end time.Time) (registerCount int64, visitCount int64, err error) { + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}} + visitQuery := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}, "userId": bson.M{"$in": uids}} + + registerCount, err = db.Count(ctx, query) + if err != nil { + log.Error("register TimeRegisterUserCount registerCount err", log.E(err)) + return + } + visitCount, err = db.Count(ctx, visitQuery) + if err != nil { + log.Error("register TimeRegisterUserCount visitCount err", log.E(err)) + } + return +} + +// DirectAddUserCount 获取时间范围直推注册用户 +func DirectAddUserCount(ctx context.Context, appid int32, start, end time.Time) (count int64, err error) { + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}, "isDeduction": false, "isDirect": true} + + return db.Count(ctx, query) +} + +// FissionAddUserCount 获取时间范围裂变注册用户 +func FissionAddUserCount(ctx context.Context, appid int32, start, end time.Time) (count int64, err error) { + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}, "isDeduction": false, "isDirect": false} + + return db.Count(ctx, query) +} + +// DirectAddUserCount 获取时间范围直推注册用户 +func BlocDirectAddUserCount(ctx context.Context, appid int32, start, end time.Time) (count int64, err error) { + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}, "isDirect": true} + + return db.Count(ctx, query) +} + +// FissionAddUserCount 获取时间范围裂变注册用户 +func BlocFissionAddUserCount(ctx context.Context, appid int32, start, end time.Time) (count int64, err error) { + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}, "isDirect": false} + + return db.Count(ctx, query) +} + +// DeductionAddUserCount 获取时间范围扣量注册用户 +func DeductionAddUserCount(ctx context.Context, appid int32, start, end time.Time) (count int64, err error) { + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}, "isDeduction": true} + + return db.Count(ctx, query) +} + +// TotalAddUserCount 获取时间范围所有注册用户 +func TotalAddUserCount(ctx context.Context, appid int32, start, end time.Time) (count int64, err error) { + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}} + + return db.Count(ctx, query) +} + +// AndroidAddUserCount 获取时间范围所有注册用户 +func AndroidAddUserCount(ctx context.Context, appid int32, start, end time.Time) (count int64, err error) { + + query := bson.M{"appId": appid, "sysType": "android", "registerTime": bson.M{"$gte": start, "$lt": end}} + + return db.Count(ctx, query) +} + +// IosAddUserCount 获取时间范围所有注册用户 +func IosAddUserCount(ctx context.Context, appid int32, start, end time.Time) (count int64, err error) { + + query := bson.M{"appId": appid, "sysType": "h5_ios", "registerTime": bson.M{"$gte": start, "$lt": end}} + + return db.Count(ctx, query) +} + +// TimeVisitUserByDistrict 获取时间范围注册用户 +func TimeVisitUserByDistrict(ctx context.Context, appid int32, visitUserIds []uint64, start, end time.Time) (districtMap map[string]*DayRegisterAndVisit, err error) { + districtMap = make(map[string]*DayRegisterAndVisit) + + // 第一步:按渠道码统计渠道注册人数 + allFilter := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}} + allUser := make([]RegisterMod, 0) + if err = db.Find(ctx, &allUser, allFilter); err != nil { + log.Error("register TimeVisitUserByDistrict Find err", log.E(err)) + return + } + for _, user := range allUser { + if len(user.DistrictCode) > 0 { + if value, ok := districtMap[user.DistrictCode]; !ok { + districtMap[user.DistrictCode] = &DayRegisterAndVisit{ + RegisterCount: 1, + } + } else { + value.RegisterCount += 1 + } + } + } + + // 第一步:按渠道码统计渠道统计访问数 + visitFilter := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}, "userId": bson.M{"$in": visitUserIds}} + visitUsers := make([]RegisterMod, 0) + if err = db.Find(ctx, &visitUsers, visitFilter); err != nil { + log.Error("register TimeVisitUserByDistrict Find err", log.E(err)) + return + } + + for _, visitUser := range visitUsers { + if len(visitUser.DistrictCode) > 0 { + if value, ok := districtMap[visitUser.DistrictCode]; ok { + value.TodayVisitCount += 1 + } + } + } + + return +} + +// TimeVisitUsersInfo 获取时间范围注册用户 +func TimeVisitUsersInfo(ctx context.Context, appid int32, visitUserIds []uint64) (userList []RegisterMod, err error) { + + filter := bson.M{"appId": appid, "userId": bson.M{"$in": visitUserIds}} + userList = make([]RegisterMod, 0) + + if err = db.Find(ctx, &userList, filter); err != nil { + log.Error("register TimeVisitUsersInfo Find err", log.E(err)) + return + } + + return +} + +// TimeVisitUsersInfoByTime 获取时间范围注册用户 +func TimeVisitUsersInfoByTime(ctx context.Context, appid int32, visitUserIds []uint64, start, end time.Time) (userList []RegisterMod, err error) { + + filter := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}, "userId": bson.M{"$in": visitUserIds}} + userList = make([]RegisterMod, 0) + + if err = db.Find(ctx, &userList, filter); err != nil { + log.Error("register TimeVisitUsersInfo Find err", log.E(err)) + return + } + + return +} + +// FissionAddUserCount 获取时间范围裂变注册用户 +func DistrictCodeUserCount(ctx context.Context, appid int32, districtCode string) (count int64, err error) { + beginTimeStr := "2020-07-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": beginTime}, "districtCode": districtCode} + + return db.Count(ctx, query) +} + +// VisitUsersInfoByTime 获取时间范围直推注册用户 +func VisitUsersInfoByTime(ctx context.Context, appid int32, start, end time.Time) (userList []*RegisterMod, err error) { + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}} + + err = db.Find(ctx, &userList, query) + if err != nil { + log.Error("register TimeVisitUsersInfo Find err", log.E(err)) + return + } + + return +} + +// RegisterUsersInfoByTime 获取时间范围直推注册用户 +func RegisterUsersInfoByTime(ctx context.Context, appid int32, start, end time.Time, opt ...*options.FindOptions) (userList []*RegisterMod, err error) { + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}} + + err = db.Find(ctx, &userList, query, opt...) + if err != nil { + log.Error("register TimeVisitUsersInfo Find err", log.E(err)) + return + } + + return +} + +type OnItem func(item *RegisterMod) + +// RegisterFormalsInfoByTime 获取时间范围直推注册用户 +func RegisterFormalsInfoByTime(ctx context.Context, appid int32, start, end time.Time) (userList []*RegisterMod, err error) { + + query := bson.M{"appId": appid, "formalTime": bson.M{"$gte": start, "$lt": end}} + + err = db.Find(ctx, &userList, query) + if err != nil { + log.Error("register Find err", log.E(err)) + return + } + + return +} + +// RegisterUsersInfoByTimeShard 获取时间范围直推注册用户 +func RegisterUsersInfoByTimeShard(ctx context.Context, appid int32, start, end time.Time, shard time.Duration, onItem OnItem) error { + segments := utils.CalcTimeSegments(start, end, shard) + for _, segment := range segments { + userList := make([]*RegisterMod, 0) + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": segment.Begin, "$lt": segment.End}} + err := db.Find(ctx, &userList, query) + if err != nil { + log.Error("register RegisterUsersInfoByTimeShard Find err", log.E(err)) + return err + } + for _, item := range userList { + onItem(item) + } + userList = nil + } + return nil +} + +// RegisterFormalsInfoByTimeShard 获取时间范围直推注册用户 +func RegisterFormalsInfoByTimeShard(ctx context.Context, appid int32, start, end time.Time, shard time.Duration, onItem OnItem) error { + segments := utils.CalcTimeSegments(start, end, shard) + for _, segment := range segments { + userList := make([]*RegisterMod, 0) + query := bson.M{"appId": appid, "formalTime": bson.M{"$gte": segment.Begin, "$lt": segment.End}} + err := db.Find(ctx, &userList, query) + if err != nil { + log.Error("register RegisterFormalsInfoByTimeShard Find err", log.E(err)) + return err + } + for _, item := range userList { + onItem(item) + } + userList = nil + } + return nil +} + +// RegisterUsersInfoByTime 获取时间范围直推注册用户 +func RegisterChannelUsersInfoByTime(ctx context.Context, channel string, appid int32, start, end time.Time) (userList []*RegisterMod, err error) { + query := bson.M{ + "districtCode": channel, + "appId": appid, + "registerTime": bson.M{"$gte": start, "$lt": end}, + } + + err = db.Find(ctx, &userList, query) + if err != nil { + log.Error("register TimeVisitUsersInfo Find err", log.E(err)) + return + } + + return +} + +// RegisterUsersInfoByTime 获取时间范围直推注册用户 +func RegisterUsersInfoByDistrict(ctx context.Context, appid int32, channelcode string, start, end time.Time) (userList []RegisterMod, err error) { + + query := bson.M{"appId": appid, "registerTime": bson.M{"$gte": start, "$lt": end}, "districtCode": channelcode} + + err = db.Find(ctx, &userList, query) + if err != nil { + log.Error("register TimeVisitUsersInfo Find err", log.E(err)) + return + } + + return +} + +// TimeUsersStatInfoByTime 获取时间范围注册用户 +func TimeUsersStatInfoByTime(ctx context.Context, appid int32) (userList []RegisterMod, err error) { + filter := bson.M{"appId": appid, "promCode": bson.M{"$exists": false}} + userList = make([]RegisterMod, 0) + + if err = db.Find(ctx, &userList, filter); err != nil { + log.Error("register TimeVisitUsersInfo Find err", log.E(err)) + return + } + + return +} + +// RegisterUsersInfoByTime 获取时间范围直推注册用户 +func RegisterUsersInfoByTimeV2(ctx context.Context, appid int32, start, end time.Time) (userList []RegisterMod, err error) { + + query := bson.M{"appId": appid, "isDeduction": false, "registerTime": bson.M{"$gte": start, "$lt": end}} + + err = db.Find(ctx, &userList, query) + if err != nil { + log.Error("register TimeVisitUsersInfo Find err", log.E(err)) + return + } + + return +} diff --git a/models/registermod/type.go b/models/registermod/type.go new file mode 100644 index 0000000..b8ec31b --- /dev/null +++ b/models/registermod/type.go @@ -0,0 +1,53 @@ +package registermod + +import ( + "stat/common/mongos" + "time" +) + +// 表名 +const CollRegisterLog = "log_register" + +type DistrictFrom string + +const ( + DistrictFromNone DistrictFrom = "none" + DistrictFromPC DistrictFrom = "pc" + DistrictFromDC DistrictFrom = "dc" + DistrictFromIP DistrictFrom = "ip" + DistrictFromUA DistrictFrom = "ua" +) + +var db *mongos.MongoTool + +// RegisterMod 用户注册信息 +type RegisterMod struct { + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + AppId int32 `json:"appId" bson:"appId"` // appID + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 安卓 IOS + DevType string `json:"devType" bson:"devType"` // 设备类型 + Mobile string `json:"mobile" bson:"mobile"` // 手机号 + IP string `json:"ip,omitempty" bson:"ip"` // IP + Name string `json:"name" bson:"name"` // 名称 + IsDirect bool `json:"isDirect" bson:"isDirect"` // true:是直推用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` // 渠道码 + DC string `json:"dc" bson:"dc"` // 渠道码 + DistrictFrom DistrictFrom `json:"districtFrom" bson:"districtFrom"` // 渠道来源 + IpMatched bool `json:"ipMatched" bson:"ipMatched"` // IP是否匹配 + ParentPromCode string `json:"parentPromCode,omitempty" bson:"parentPromCode"` // 邀请人推广码 + PromCode string `json:"promCode,omitempty" bson:"promCode"` // 用户推广序列 + RegisterTime time.Time `json:"registerTime,omitempty" bson:"registerTime"` // 操作时间 + FormalTime time.Time `json:"formalTime,omitempty" bson:"formalTime"` // 成为正式用户的时间(针对h5和light) + IsFormal bool `json:"isFormal,omitempty" bson:"isFormal"` // 是否正式用户(针对h5和light) + IsDeduction bool `json:"isDeduction" bson:"isDeduction"` // true:CPA扣量用户 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` // 集团扣量(特定渠道扣量) + UserAgent string `json:"userAgent" bson:"userAgent"` // User-Agent识别 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} + +type DayRegisterAndVisit struct { + RegisterCount int64 // 注册数 + RealRegisterCount int64 // 真实注册数 + TodayVisitCount int64 // 今日访问数 + Rate float64 // 留存率 +} diff --git a/models/statrecord/statrecord.go b/models/statrecord/statrecord.go new file mode 100644 index 0000000..060a6f6 --- /dev/null +++ b/models/statrecord/statrecord.go @@ -0,0 +1,73 @@ +package statrecordmod + +import ( + "context" + "fmt" + "go.mongodb.org/mongo-driver/mongo" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollStatRecord) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "item", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollStatRecord, err)) + } +} + +// LastRecordTimeMap 查询统计记录 +func LastRecordTimeMap(ctx context.Context, job string) (list []StatRecord, err error) { + list = make([]StatRecord, 0) + err = db.Find(ctx, &list, bson.M{"job": job}) + if err != nil { + log.Error("statRecord LastRecordTimeMap err", log.E(err)) + return nil, err + } + + return +} + +// UpsertItemRecord 插入统计成功项记录 +func UpsertItemRecord(ctx context.Context, job string, item string, recordTime time.Time) (err error) { + filter := bson.M{ + "job": job, + "item": item, + } + update := bson.M{ + "$set": bson.M{ + "recordTime": recordTime, + "updatedAt": time.Now(), + }, + "$setOnInsert": bson.M{ + "job": job, + "item": item, + "fristRecordTime": recordTime, + "createdAt": time.Now(), + }, + } + _, err = db.UpsertOne(ctx, filter, update) + return +} + +// LastOneRecordTime 查询上一次统计时间 +func LastOneRecordTime(ctx context.Context, job string, item string) (record StatRecord, err error) { + + err = db.FindOne(ctx, &record, bson.M{"job": job, "item": item}) + if err != nil { + log.Error("statRecord LastRecordTimeMap err", log.E(err)) + return + } + return +} diff --git a/models/statrecord/type.go b/models/statrecord/type.go new file mode 100644 index 0000000..9c2ef4e --- /dev/null +++ b/models/statrecord/type.go @@ -0,0 +1,37 @@ +package statrecordmod + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 表名 +const CollStatRecord = "stat_record" + +var db *mongos.MongoTool + +type StatRecord struct { + ID primitive.ObjectID `bson:"_id,omitempty"` + Job string `bson:"job"` // 工作 + Item string `bson:"item"` // 统计项 + RecordTime time.Time `bson:"recordTime"` // 提交时间 + FirstRecordTime time.Time `bson:"firstRecordTime"` // 第一次提交时间 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt"` // 更新时间 +} + +const ( + DailyStatDayJob = "dailyStatDayJob" // 按天统计访问信息 + DailyHourStatDayJob = "dailyHourStatDayJob" // 按天统计访问信息 + ChannelDeduction = "channelDeduction " // 每15分钟访问统计 + DiscStatJob = "discStatJob" // 渠道统计任务 + DiscSettleJob = "discSettleJob" // 渠道结算 + BlocDailyStatDayJob = "blocDailyStatDayJob" // 按天统计访问信息(集团) + BlocDiscStatJob = "blocDiscStatJob" // 渠道统计任务 + OpeninstallJob = "openinstallJob" // 渠道统计数据 + AppHour = "appHour" // 每小时数据 + LandPageHourStatJob = "landPageHourStatJob" // 每小时落地页统计 + LandPageDailyStatJob = "landPageDailyStatJob" // 每天落地页统计 +) diff --git a/models/syncgamerecharge/recharge.go b/models/syncgamerecharge/recharge.go new file mode 100644 index 0000000..2fef9e8 --- /dev/null +++ b/models/syncgamerecharge/recharge.go @@ -0,0 +1,128 @@ +package syncgamerecharge + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.SyncGameRechargeOrder) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.SyncGameRechargeOrder.UserId, Value: 1}, + {Key: FN.SyncGameRechargeOrder.AppId, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(SyncGameRechargeOrder:initSyncGameRechargeOrderIndex) Create SyncGameRechargeOrder Index failed! err:%+v:", err)) + } +} + +//InsertOneSyncGameRechargeOrder 插入一个媒体 +func InsertOneSyncGameRechargeOrder(ctx context.Context, SyncGameRechargeOrder *SyncGameRechargeOrder) error { + if _, err := db.InsertOne(ctx, SyncGameRechargeOrder); err != nil { + log.Warn("SyncGameRechargeOrder:InsertOneSyncGameRechargeOrder db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneSyncGameRechargeOrder 查找一个媒体 +func FindOneSyncGameRechargeOrder(ctx context.Context, filter bson.M) ( + *SyncGameRechargeOrder, error) { + var SyncGameRechargeOrder SyncGameRechargeOrder + if err := db.FindOne(ctx, &SyncGameRechargeOrder, filter); err != nil { + return nil, err + } + return &SyncGameRechargeOrder, nil +} + +//DelOneSyncGameRechargeOrder 删除一个媒体 +func DelOneSyncGameRechargeOrder(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("SyncGameRechargeOrder:DelOneSyncGameRechargeOrder db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneSyncGameRechargeOrder 更新一个媒体 +func UpdateOneSyncGameRechargeOrder(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneSyncGameRechargeOrder db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountSyncGameRechargeOrders 统计媒体数量 +func CountSyncGameRechargeOrders(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("SyncGameRechargeOrder:CountSyncGameRechargeOrders db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManySyncGameRechargeOrder 更新满足条件的媒体 +func UpdateManySyncGameRechargeOrder(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManySyncGameRechargeOrder db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManySyncGameRechargeOrder 查找一批媒体数据 +func FindManySyncGameRechargeOrder(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (SyncGameRechargeOrderList, error) { + data := make(SyncGameRechargeOrderList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("SyncGameRechargeOrder:FindManySyncGameRechargeOrder db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManySyncGameRechargeOrderWithBind 用自己定义结构查找一批媒体数据 +func FindManySyncGameRechargeOrderWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("SyncGameRechargeOrder:FindManySyncGameRechargeOrderWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateSyncGameRechargeOrders 聚合查找一批媒体信息 +func AggregateSyncGameRechargeOrders(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateSyncGameRechargeOrders db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/syncgamerecharge/tag.go b/models/syncgamerecharge/tag.go new file mode 100755 index 0000000..1d6fc74 --- /dev/null +++ b/models/syncgamerecharge/tag.go @@ -0,0 +1,60 @@ +package syncgamerecharge + +type TagSyncGameRechargeOrder struct { + AppId string + BlocDeduction string + CID string + ChannelName string + CreatedAt string + DevType string + DistrictCode string + ID string + IsDirect string + Money string + OrderId string + PayMoney string + PlatformId string + PromCode string + Rate string + RegisterTime string + Status string + SuccessAt string + SyncStatus string + SysType string + Type string + UserId string +} + +var FN struct { + SyncGameRechargeOrder TagSyncGameRechargeOrder +} + +var TN struct { + SyncGameRechargeOrder string +} + +func init() { + FN.SyncGameRechargeOrder.AppId = "appId" + FN.SyncGameRechargeOrder.BlocDeduction = "blocDeduction" + FN.SyncGameRechargeOrder.CID = "cid" + FN.SyncGameRechargeOrder.ChannelName = "channelName" + FN.SyncGameRechargeOrder.CreatedAt = "createdAt" + FN.SyncGameRechargeOrder.DevType = "devType" + FN.SyncGameRechargeOrder.DistrictCode = "districtCode" + FN.SyncGameRechargeOrder.ID = "_id" + FN.SyncGameRechargeOrder.IsDirect = "isDirect" + FN.SyncGameRechargeOrder.Money = "money" + FN.SyncGameRechargeOrder.OrderId = "orderId" + FN.SyncGameRechargeOrder.PayMoney = "payMoney" + FN.SyncGameRechargeOrder.PlatformId = "platformId" + FN.SyncGameRechargeOrder.PromCode = "promCode" + FN.SyncGameRechargeOrder.Rate = "rate" + FN.SyncGameRechargeOrder.RegisterTime = "registerTime" + FN.SyncGameRechargeOrder.Status = "status" + FN.SyncGameRechargeOrder.SuccessAt = "successAt" + FN.SyncGameRechargeOrder.SyncStatus = "syncStatus" + FN.SyncGameRechargeOrder.SysType = "sysType" + FN.SyncGameRechargeOrder.Type = "type" + FN.SyncGameRechargeOrder.UserId = "userId" + TN.SyncGameRechargeOrder = "sync_game_rechagre" +} diff --git a/models/syncgamerecharge/type.go b/models/syncgamerecharge/type.go new file mode 100644 index 0000000..a79ef69 --- /dev/null +++ b/models/syncgamerecharge/type.go @@ -0,0 +1,36 @@ +package syncgamerecharge + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 帖子模型,数据库中的 +// @table:sync_game_rechagre +type SyncGameRechargeOrder struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台订单Id + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + AppId int32 `json:"appId" bson:"appId"` // appID + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 安卓 IOS + DevType string `json:"devType" bson:"devType"` // 设备类型 + ChannelName string `json:"channelName" bson:"channelName"` // 支付渠道名字 + CID string `json:"cid" bson:"cid"` // 渠道id + Type string `bson:"type" json:"type"` // 充值方式 + OrderId string `json:"orderId" bson:"orderId"` // 流水id + Money int64 `json:"money" bson:"money"` // 充值金额 订单金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` // 实际到账金额 用户实际支付金额 + Status int `json:"status" bson:"status"` // 2付款失败 3付款成功 + SuccessAt time.Time `json:"successAt,omitempty" bson:"successAt,omitempty"` // 成功时间 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` // 集团扣量(特定渠道扣量) + PromCode string `json:"promCode,omitempty" bson:"promCode"` // 用户推广序列 + RegisterTime time.Time `json:"registerTime,omitempty" bson:"registerTime"` // 操作时间 + IsDirect bool `json:"isDirect" bson:"isDirect"` // true:是直推用户 + IsFormalUser bool `json:"isFormalUser" bson:"isFormalUser"` // 是否正式用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` // 渠道码 + Rate string `json:"rate" bson:"rate"` // 渠道费率 + SyncStatus int64 `json:"syncStatus" bson:"syncStatus"` // 同步大白鲨:0 需要同步 1:不需要同步 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} +type SyncGameRechargeOrderList []*SyncGameRechargeOrder diff --git a/models/syncgamewater/tag.go b/models/syncgamewater/tag.go new file mode 100755 index 0000000..7379514 --- /dev/null +++ b/models/syncgamewater/tag.go @@ -0,0 +1,44 @@ +package syncgamewater + +type TagSyncGameWater struct { + AppId string + BlocDeduction string + CreatedAt string + Date string + DistrictCode string + ID string + IsDirect string + PlatformId string + Profit string + PromCode string + RegisterTime string + Revenue string + UserId string + ValidBet string +} + +var FN struct { + SyncGameWater TagSyncGameWater +} + +var TN struct { + SyncGameWater string +} + +func init() { + FN.SyncGameWater.AppId = "appId" + FN.SyncGameWater.BlocDeduction = "blocDeduction" + FN.SyncGameWater.CreatedAt = "createdAt" + FN.SyncGameWater.Date = "date" + FN.SyncGameWater.DistrictCode = "districtCode" + FN.SyncGameWater.ID = "_id" + FN.SyncGameWater.IsDirect = "isDirect" + FN.SyncGameWater.PlatformId = "platformId" + FN.SyncGameWater.Profit = "profit" + FN.SyncGameWater.PromCode = "promCode" + FN.SyncGameWater.RegisterTime = "registerTime" + FN.SyncGameWater.Revenue = "revenue" + FN.SyncGameWater.UserId = "userId" + FN.SyncGameWater.ValidBet = "validBet" + TN.SyncGameWater = "sync_game_water" +} diff --git a/models/syncgamewater/type.go b/models/syncgamewater/type.go new file mode 100644 index 0000000..39e2768 --- /dev/null +++ b/models/syncgamewater/type.go @@ -0,0 +1,28 @@ +package syncgamewater + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 帖子模型,数据库中的 +// @table:sync_game_water +type SyncGameWater struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + AppId int32 `json:"appId" bson:"appId"` // appID + UserId uint64 `json:"userId" bson:"userId"` // 用户id + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台流水Id + Date time.Time `json:"date" bson:"date"` // 日期(2021-04-14) + ValidBet int64 `bson:"validBet" json:"validBet"` // 有效投注金额vs + Profit int64 `bson:"profit" json:"profit"` // 系统盈利 + Revenue int64 `bson:"revenue" json:"revenue"` // 游戏抽水 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` // 集团扣量(特定渠道扣量) + PromCode string `json:"promCode,omitempty" bson:"promCode"` // 用户推广序列 + RegisterTime time.Time `json:"registerTime,omitempty" bson:"registerTime"` // 操作时间 + IsDirect bool `json:"isDirect" bson:"isDirect"` // true:是直推用户 + IsFormalUser bool `json:"isFormalUser" bson:"isFormalUser"` // 是否正式用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` // 渠道码 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} +type SyncGameWaterList []*SyncGameWater diff --git a/models/syncgamewater/water.go b/models/syncgamewater/water.go new file mode 100644 index 0000000..b302017 --- /dev/null +++ b/models/syncgamewater/water.go @@ -0,0 +1,128 @@ +package syncgamewater + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.SyncGameWater) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.SyncGameWater.UserId, Value: 1}, + {Key: FN.SyncGameWater.AppId, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(SyncGameWater:initSyncGameWaterIndex) Create SyncGameWater Index failed! err:%+v:", err)) + } +} + +//InsertOneSyncGameWater 插入一个游戏流水记录 +func InsertOneSyncGameWater(ctx context.Context, SyncGameWater *SyncGameWater) error { + if _, err := db.InsertOne(ctx, SyncGameWater); err != nil { + log.Warn("SyncGameWater:InsertOneSyncGameWater db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneSyncGameWater 查找一个游戏流水记录 +func FindOneSyncGameWater(ctx context.Context, filter bson.M) ( + *SyncGameWater, error) { + var SyncGameWater SyncGameWater + if err := db.FindOne(ctx, &SyncGameWater, filter); err != nil { + return nil, err + } + return &SyncGameWater, nil +} + +//DelOneSyncGameWater 删除一个游戏流水记录 +func DelOneSyncGameWater(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("SyncGameWater:DelOneSyncGameWater db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneSyncGameWater 更新一个游戏流水记录 +func UpdateOneSyncGameWater(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneSyncGameWater db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountSyncGameWaters 统计游戏流水记录数量 +func CountSyncGameWaters(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("SyncGameWater:CountSyncGameWaters db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManySyncGameWater 更新满足条件的游戏流水记录 +func UpdateManySyncGameWater(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManySyncGameWater db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManySyncGameWater 查找一批游戏流水记录数据 +func FindManySyncGameWater(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (SyncGameWaterList, error) { + data := make(SyncGameWaterList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("SyncGameWater:FindManySyncGameWater db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManySyncGameWaterWithBind 用自己定义结构查找一批游戏流水记录数据 +func FindManySyncGameWaterWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("SyncGameWater:FindManySyncGameWaterWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateSyncGameWaters 聚合查找一批游戏流水记录信息 +func AggregateSyncGameWaters(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateSyncGameWaters db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/syncrecharge/recharge.go b/models/syncrecharge/recharge.go new file mode 100644 index 0000000..109bcf8 --- /dev/null +++ b/models/syncrecharge/recharge.go @@ -0,0 +1,128 @@ +package syncrecharge + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.SyncRechargeOrder) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.SyncRechargeOrder.UserId, Value: 1}, + {Key: FN.SyncRechargeOrder.AppId, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(SyncRechargeOrder:initSyncRechargeOrderIndex) Create SyncRechargeOrder Index failed! err:%+v:", err)) + } +} + +//InsertOneSyncRechargeOrder 插入一个媒体 +func InsertOneSyncRechargeOrder(ctx context.Context, SyncRechargeOrder *SyncRechargeOrder) error { + if _, err := db.InsertOne(ctx, SyncRechargeOrder); err != nil { + log.Warn("SyncRechargeOrder:InsertOneSyncRechargeOrder db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneSyncRechargeOrder 查找一个媒体 +func FindOneSyncRechargeOrder(ctx context.Context, filter bson.M) ( + *SyncRechargeOrder, error) { + var SyncRechargeOrder SyncRechargeOrder + if err := db.FindOne(ctx, &SyncRechargeOrder, filter); err != nil { + return nil, err + } + return &SyncRechargeOrder, nil +} + +//DelOneSyncRechargeOrder 删除一个媒体 +func DelOneSyncRechargeOrder(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("SyncRechargeOrder:DelOneSyncRechargeOrder db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneSyncRechargeOrder 更新一个媒体 +func UpdateOneSyncRechargeOrder(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneSyncRechargeOrder db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountSyncRechargeOrders 统计媒体数量 +func CountSyncRechargeOrders(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("SyncRechargeOrder:CountSyncRechargeOrders db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManySyncRechargeOrder 更新满足条件的媒体 +func UpdateManySyncRechargeOrder(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManySyncRechargeOrder db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManySyncRechargeOrder 查找一批媒体数据 +func FindManySyncRechargeOrder(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (SyncRechargeOrderList, error) { + data := make(SyncRechargeOrderList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("SyncRechargeOrder:FindManySyncRechargeOrder db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManySyncRechargeOrderWithBind 用自己定义结构查找一批媒体数据 +func FindManySyncRechargeOrderWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("SyncRechargeOrder:FindManySyncRechargeOrderWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateSyncRechargeOrders 聚合查找一批媒体信息 +func AggregateSyncRechargeOrders(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateSyncRechargeOrders db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/syncrecharge/tag.go b/models/syncrecharge/tag.go new file mode 100755 index 0000000..716c2af --- /dev/null +++ b/models/syncrecharge/tag.go @@ -0,0 +1,58 @@ +package syncrecharge + +type TagSyncRechargeOrder struct { + AppId string + BlocDeduction string + CID string + ChannelName string + CreatedAt string + DevType string + DistrictCode string + ID string + IsDirect string + Money string + OrderId string + PayMoney string + PlatformId string + PromCode string + Rate string + RegisterTime string + Status string + SuccessAt string + SysType string + Type string + UserId string +} + +var FN struct { + SyncRechargeOrder TagSyncRechargeOrder +} + +var TN struct { + SyncRechargeOrder string +} + +func init() { + FN.SyncRechargeOrder.AppId = "appId" + FN.SyncRechargeOrder.BlocDeduction = "blocDeduction" + FN.SyncRechargeOrder.CID = "cid" + FN.SyncRechargeOrder.ChannelName = "channelName" + FN.SyncRechargeOrder.CreatedAt = "createdAt" + FN.SyncRechargeOrder.DevType = "devType" + FN.SyncRechargeOrder.DistrictCode = "districtCode" + FN.SyncRechargeOrder.ID = "_id" + FN.SyncRechargeOrder.IsDirect = "isDirect" + FN.SyncRechargeOrder.Money = "money" + FN.SyncRechargeOrder.OrderId = "orderId" + FN.SyncRechargeOrder.PayMoney = "payMoney" + FN.SyncRechargeOrder.PlatformId = "platformId" + FN.SyncRechargeOrder.PromCode = "promCode" + FN.SyncRechargeOrder.Rate = "rate" + FN.SyncRechargeOrder.RegisterTime = "registerTime" + FN.SyncRechargeOrder.Status = "status" + FN.SyncRechargeOrder.SuccessAt = "successAt" + FN.SyncRechargeOrder.SysType = "sysType" + FN.SyncRechargeOrder.Type = "type" + FN.SyncRechargeOrder.UserId = "userId" + TN.SyncRechargeOrder = "sync_rechagre" +} diff --git a/models/syncrecharge/type.go b/models/syncrecharge/type.go new file mode 100644 index 0000000..0111843 --- /dev/null +++ b/models/syncrecharge/type.go @@ -0,0 +1,35 @@ +package syncrecharge + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 帖子模型,数据库中的 +// @table:sync_rechagre +type SyncRechargeOrder struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台订单Id + UserId uint64 `json:"userId" bson:"userId"` // 用户ID + AppId int32 `json:"appId" bson:"appId"` // appID + SysType string `json:"sysType" bson:"sysType"` // 操作系统类型 安卓 IOS + DevType string `json:"devType" bson:"devType"` // 设备类型 + ChannelName string `json:"channelName" bson:"channelName"` // 支付渠道名字 + CID string `json:"cid" bson:"cid"` // 渠道id + Type string `bson:"type" json:"type"` // 充值方式 + OrderId string `json:"orderId" bson:"orderId"` // 流水id + Money int64 `json:"money" bson:"money"` // 充值金额 订单金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` // 实际到账金额 用户实际支付金额 + Status int `json:"status" bson:"status"` // 2付款失败 3付款成功 + SuccessAt time.Time `json:"successAt,omitempty" bson:"successAt,omitempty"` // 成功时间 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` // 集团扣量(特定渠道扣量) + PromCode string `json:"promCode,omitempty" bson:"promCode"` // 用户推广序列 + RegisterTime time.Time `json:"registerTime,omitempty" bson:"registerTime"` // 操作时间 + IsDirect bool `json:"isDirect" bson:"isDirect"` // true:是直推用户 + IsFormalUser bool `json:"isFormalUser" bson:"isFormalUser"` // 是否正式用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` // 渠道码 + Rate string `json:"rate" bson:"rate"` // 渠道费率 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} +type SyncRechargeOrderList []*SyncRechargeOrder diff --git a/models/syncrecord/statrecord.go b/models/syncrecord/statrecord.go new file mode 100644 index 0000000..5c1f37e --- /dev/null +++ b/models/syncrecord/statrecord.go @@ -0,0 +1,89 @@ +package syncrecord + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + + "go.mongodb.org/mongo-driver/bson" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollSyncRecord) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "job", Value: 1}, {Key: "appid", Value: 1}}, + Options: options.Index().SetUnique(true), + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollSyncRecord, err)) + } +} + +// LastRecordTimeMap 查询统计记录 +func LastRecordTimeMap(ctx context.Context) (list []SyncRecord, err error) { + list = make([]SyncRecord, 0) + err = db.Find(ctx, &list, bson.M{}) + if err != nil { + log.Error("SyncRecord LastRecordTimeMap err", log.E(err)) + return nil, err + } + + return +} + +// UpsertItemRecord 插入统计成功项记录 +func UpsertItemRecord(ctx context.Context, job string, appid int32, userid uint64, platformId string, successAt time.Time) (err error) { + filter := bson.M{ + "job": job, + "appid": appid, + } + exists, err := db.Exists(ctx, filter) + if err != nil { + return err + } + + if exists { + _, err = db.UpdateOne(ctx, filter, + bson.M{ + "$set": bson.M{ + "userId": userid, + "successAt": successAt, + "platformId": platformId, + "updatedAt": time.Now(), + }}) + } else { + insertDoc := bson.M{ + "job": job, + "appid": appid, + "userId": userid, + "platformId": platformId, + "successAt": successAt, + "createdAt": time.Now(), + } + + _, err = db.InsertOne(ctx, insertDoc) + } + return +} + +// LastOneRecordTime 查询上一次统计时间 +func LastOneRecordTime(ctx context.Context, job string, appid int32) (record SyncRecord, err error) { + + err = db.FindOne(ctx, &record, bson.M{"job": job, "appid": appid}) + if err != nil { + log.Error("SyncRecord LastRecordTimeMap err", log.E(err)) + return + } + return +} diff --git a/models/syncrecord/type.go b/models/syncrecord/type.go new file mode 100644 index 0000000..0a80eb2 --- /dev/null +++ b/models/syncrecord/type.go @@ -0,0 +1,55 @@ +package syncrecord + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 表名 +const CollSyncRecord = "sync_record" + +var db *mongos.MongoTool + +type SyncRecord struct { + ID primitive.ObjectID `bson:"_id,omitempty"` + Job string `bson:"job"` // 工作 + AppId int32 `bson:"appid"` // 应用Id + UserId uint64 `bson:"userId,omitempty"` // 用户ID + PlatformId string `bson:"platformId,omitempty"` // 原始平台流水Id + SuccessAt time.Time `bson:"successAt,omitempty"` // 成功时间 + Disabled bool `bson:"disabled,omitempty"` // 是否禁用 + CreatedAt time.Time `bson:"createdAt,omitempty"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt,omitempty"` // 更新时间 +} + +const ( + VisitJob = "visit" // 访问 + RegisterJob = "register" // 注册 + RegisterLightJob = "registerLight" // 注册轻量 + RechargeJob = "recharge" // 充值 + WithdrawJob = "withdraw" // 提现 + VipJob = "vip" // VIP + RechargeAll = "rechargeAll" // 充值订单 + WithdrawAll = "withdrawAll" // 提现订单 + GameRechargeOrder = "gameRecharge" // 游戏充值订单 + GameRechargeOrderAll = "gameRechargeAll" // 游戏充值(全部) + GameWithdrawOrder = "gameWithdraw" // 游戏提现订单 + GameWater = "gameWater" // 游戏流水 +) + +var SyncJobDescribe = map[string]string{ + VisitJob: "日活记录同步", + RegisterJob: "注册记录同步", + RegisterLightJob: "轻量注册记录", + RechargeJob: "充值记录同步", + WithdrawJob: "提现记录同步", + VipJob: "会员购买同步", + RechargeAll: "充值全部同步", + WithdrawAll: "订单全部同步", + GameRechargeOrder: "游戏订单同步", + GameRechargeOrderAll: "游戏充值全部", + GameWithdrawOrder: "游戏提现同步", + GameWater: "游戏流水同步", +} diff --git a/models/syncvip/tag.go b/models/syncvip/tag.go new file mode 100755 index 0000000..41b0aa8 --- /dev/null +++ b/models/syncvip/tag.go @@ -0,0 +1,58 @@ +package syncvip + +type TagSyncVip struct { + Amount string + AppId string + BlocDeduction string + BuyVIPType string + CreatedAt string + DeviceType string + DistrictCode string + ID string + IsDeduction string + IsDirect string + Money string + Name string + OID string + PlatformId string + PromCode string + Rate string + RegisterTime string + Repeat string + Status string + SuccessAt string + UID string +} + +var FN struct { + SyncVip TagSyncVip +} + +var TN struct { + SyncVip string +} + +func init() { + FN.SyncVip.Amount = "amount" + FN.SyncVip.AppId = "appId" + FN.SyncVip.BlocDeduction = "blocDeduction" + FN.SyncVip.BuyVIPType = "buyVIPType" + FN.SyncVip.CreatedAt = "createdAt" + FN.SyncVip.DeviceType = "deviceType" + FN.SyncVip.DistrictCode = "districtCode" + FN.SyncVip.ID = "_id" + FN.SyncVip.IsDeduction = "isDeduction" + FN.SyncVip.IsDirect = "isDirect" + FN.SyncVip.Money = "money" + FN.SyncVip.Name = "name" + FN.SyncVip.OID = "oid" + FN.SyncVip.PlatformId = "platformId" + FN.SyncVip.PromCode = "promCode" + FN.SyncVip.Rate = "rate" + FN.SyncVip.RegisterTime = "registerTime" + FN.SyncVip.Repeat = "repeat" + FN.SyncVip.Status = "status" + FN.SyncVip.SuccessAt = "successAt" + FN.SyncVip.UID = "uid" + TN.SyncVip = "sync_vip" +} diff --git a/models/syncvip/type.go b/models/syncvip/type.go new file mode 100644 index 0000000..6a7e84a --- /dev/null +++ b/models/syncvip/type.go @@ -0,0 +1,36 @@ +package syncvip + +import ( + "stat/common/topicmessage" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 帖子模型,数据库中的 +// @table:sync_vip +type SyncVip struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + PlatformId string `json:"platformId" bson:"platformId"` // 原始平台订单Id + AppId int32 `json:"appId" bson:"appId"` //appID + UID uint64 `json:"uid" bson:"uid"` //用户id + Name string `json:"name" bson:"name"` //用户名 + Money int64 `json:"money" bson:"money"` //提现金额 + Amount int64 `json:"amount" bson:"amount"` //提现金额 + BuyVIPType topicmessage.BuyVIPType `json:"buyVIPType" bson:"buyVIPType"` //支付方式 + OID string `json:"oid" bson:"oid"` //第三方支付平台id + DeviceType string `json:"deviceType" bson:"deviceType"` //设备类型 + Status int `json:"status" bson:"status"` //1未审核 5提现成功 + SuccessAt time.Time `json:"successAt" bson:"successAt"` //回调成功时间 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` // 集团扣量(特定渠道扣量) + PromCode string `json:"promCode,omitempty" bson:"promCode"` // 用户推广序列 + RegisterTime time.Time `json:"registerTime,omitempty" bson:"registerTime"` // 操作时间 + IsDirect bool `json:"isDirect" bson:"isDirect"` // true:是直推用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` // 渠道码 + Rate string `json:"rate" bson:"rate"` // 渠道费率 + IsDeduction bool `json:"isDeduction" bson:"isDeduction"` // true:CPS扣量用户 + IsFormalUser bool `json:"isFormalUser" bson:"isFormalUser"` // 是否正式用户 + Repeat bool `bson:"repeat" json:"repeat"` // 复冲: true 重复充值 false 第一次 + CreatedAt time.Time `bson:"createdAt"` // 创建时间 +} +type SyncVipList []*SyncVip diff --git a/models/syncvip/vip.go b/models/syncvip/vip.go new file mode 100644 index 0000000..0e17646 --- /dev/null +++ b/models/syncvip/vip.go @@ -0,0 +1,128 @@ +package syncvip + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.SyncVip) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.SyncVip.UID, Value: 1}, + {Key: FN.SyncVip.AppId, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(SyncVip:initSyncVipIndex) Create SyncVip Index failed! err:%+v:", err)) + } +} + +//InsertOneSyncVip 插入一个VIP购买记录 +func InsertOneSyncVip(ctx context.Context, SyncVip *SyncVip) error { + if _, err := db.InsertOne(ctx, SyncVip); err != nil { + log.Warn("SyncVip:InsertOneSyncVip db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneSyncVip 查找一个VIP购买记录 +func FindOneSyncVip(ctx context.Context, filter bson.M) ( + *SyncVip, error) { + var SyncVip SyncVip + if err := db.FindOne(ctx, &SyncVip, filter); err != nil { + return nil, err + } + return &SyncVip, nil +} + +//DelOneSyncVip 删除一个VIP购买记录 +func DelOneSyncVip(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("SyncVip:DelOneSyncVip db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneSyncVip 更新一个VIP购买记录 +func UpdateOneSyncVip(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneSyncVip db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountSyncVips 统计VIP购买记录数量 +func CountSyncVips(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("SyncVip:CountSyncVips db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManySyncVip 更新满足条件的VIP购买记录 +func UpdateManySyncVip(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManySyncVip db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManySyncVip 查找一批VIP购买记录数据 +func FindManySyncVip(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (SyncVipList, error) { + data := make(SyncVipList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("SyncVip:FindManySyncVip db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManySyncVipWithBind 用自己定义结构查找一批VIP购买记录数据 +func FindManySyncVipWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("SyncVip:FindManySyncVipWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateSyncVips 聚合查找一批VIP购买记录信息 +func AggregateSyncVips(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateSyncVips db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/syncwithdraw/tag.go b/models/syncwithdraw/tag.go new file mode 100755 index 0000000..a095977 --- /dev/null +++ b/models/syncwithdraw/tag.go @@ -0,0 +1,60 @@ +package syncwithdraw + +type TagSyncWithdraw struct { + Act string + ActName string + AppId string + BlocDeduction string + CreatedAt string + DevID string + DeviceType string + DistrictCode string + ID string + IsDirect string + Money string + Name string + OID string + PayMoney string + PayType string + PlatformId string + PromCode string + RegisterTime string + Status string + SuccessAt string + UID string + UpdatedAt string +} + +var FN struct { + SyncWithdraw TagSyncWithdraw +} + +var TN struct { + SyncWithdraw string +} + +func init() { + FN.SyncWithdraw.Act = "act" + FN.SyncWithdraw.ActName = "actName" + FN.SyncWithdraw.AppId = "appId" + FN.SyncWithdraw.BlocDeduction = "blocDeduction" + FN.SyncWithdraw.CreatedAt = "createdAt" + FN.SyncWithdraw.DevID = "devID" + FN.SyncWithdraw.DeviceType = "deviceType" + FN.SyncWithdraw.DistrictCode = "districtCode" + FN.SyncWithdraw.ID = "_id" + FN.SyncWithdraw.IsDirect = "isDirect" + FN.SyncWithdraw.Money = "money" + FN.SyncWithdraw.Name = "name" + FN.SyncWithdraw.OID = "oid" + FN.SyncWithdraw.PayMoney = "payMoney" + FN.SyncWithdraw.PayType = "payType" + FN.SyncWithdraw.PlatformId = "platformId" + FN.SyncWithdraw.PromCode = "promCode" + FN.SyncWithdraw.RegisterTime = "registerTime" + FN.SyncWithdraw.Status = "status" + FN.SyncWithdraw.SuccessAt = "successAt" + FN.SyncWithdraw.UID = "uid" + FN.SyncWithdraw.UpdatedAt = "updatedAt" + TN.SyncWithdraw = "sync_withdraw" +} diff --git a/models/syncwithdraw/type.go b/models/syncwithdraw/type.go new file mode 100644 index 0000000..b2cea4a --- /dev/null +++ b/models/syncwithdraw/type.go @@ -0,0 +1,36 @@ +package syncwithdraw + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 帖子模型,数据库中的 +// @table:sync_withdraw +type SyncWithdraw struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` // ID + AppId int32 `json:"appId" bson:"appId"` //appID + UID uint64 `json:"uid" bson:"uid"` //用户id + PlatformId string `json:"platformId" bson:"platformId"` //原始平台流水Id + Name string `json:"name" bson:"name"` //用户名 + OID string `json:"oid" bson:"oid"` //第三方支付平台id + Money int64 `json:"money" bson:"money"` //提现金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` //实际到账 + PayType string `json:"payType" bson:"payType"` //提现方式,alipay,bankcard + ActName string `json:"actName" bson:"actName"` //交易账户持有人 + Act string `json:"act" bson:"act"` //交易账户 + DeviceType string `json:"deviceType" bson:"deviceType"` //设备类型 + DevID string `json:"devID" bson:"devID"` //设备id + Status int `json:"status" bson:"status"` //5提现成功 + SuccessAt time.Time `json:"successAt" bson:"successAt"` //回调成功时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //刷新时间 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //提现申请时间 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` // 集团扣量(特定渠道扣量) + RegisterTime time.Time `json:"registerTime,omitempty" bson:"registerTime"` // 操作时间 + IsDirect bool `json:"isDirect" bson:"isDirect"` //true:是直推用户 + IsFormalUser bool `json:"isFormalUser" bson:"isFormalUser"` // 是否正式用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` //渠道码 + PromCode string `json:"promCode,omitempty" bson:"promCode"` //用户推广序列 +} +type SyncWithdrawList []*SyncWithdraw diff --git a/models/syncwithdraw/withdraw.go b/models/syncwithdraw/withdraw.go new file mode 100644 index 0000000..a2fb9f2 --- /dev/null +++ b/models/syncwithdraw/withdraw.go @@ -0,0 +1,128 @@ +package syncwithdraw + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.SyncWithdraw) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.SyncWithdraw.UID, Value: 1}, + {Key: FN.SyncWithdraw.AppId, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(SyncWithdraw:initSyncWithdrawIndex) Create SyncWithdraw Index failed! err:%+v:", err)) + } +} + +//InsertOneSyncWithdraw 插入一个VIP购买记录 +func InsertOneSyncWithdraw(ctx context.Context, SyncWithdraw *SyncWithdraw) error { + if _, err := db.InsertOne(ctx, SyncWithdraw); err != nil { + log.Warn("SyncWithdraw:InsertOneSyncWithdraw db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneSyncWithdraw 查找一个VIP购买记录 +func FindOneSyncWithdraw(ctx context.Context, filter bson.M) ( + *SyncWithdraw, error) { + var SyncWithdraw SyncWithdraw + if err := db.FindOne(ctx, &SyncWithdraw, filter); err != nil { + return nil, err + } + return &SyncWithdraw, nil +} + +//DelOneSyncWithdraw 删除一个VIP购买记录 +func DelOneSyncWithdraw(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("SyncWithdraw:DelOneSyncWithdraw db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneSyncWithdraw 更新一个VIP购买记录 +func UpdateOneSyncWithdraw(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneSyncWithdraw db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountSyncWithdraws 统计VIP购买记录数量 +func CountSyncWithdraws(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("SyncWithdraw:CountSyncWithdraws db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManySyncWithdraw 更新满足条件的VIP购买记录 +func UpdateManySyncWithdraw(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManySyncWithdraw db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManySyncWithdraw 查找一批VIP购买记录数据 +func FindManySyncWithdraw(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (SyncWithdrawList, error) { + data := make(SyncWithdrawList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("SyncWithdraw:FindManySyncWithdraw db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManySyncWithdrawWithBind 用自己定义结构查找一批VIP购买记录数据 +func FindManySyncWithdrawWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("SyncWithdraw:FindManySyncWithdrawWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateSyncWithdraws 聚合查找一批VIP购买记录信息 +func AggregateSyncWithdraws(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateSyncWithdraws db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/tfpackagemod/tag.go b/models/tfpackagemod/tag.go new file mode 100755 index 0000000..ba44b36 --- /dev/null +++ b/models/tfpackagemod/tag.go @@ -0,0 +1,44 @@ +package tfpackagemod + +type TagTfPackage struct { + AppId string + CountDownloadNum string + CreatedAt string + DayDownloadedNum string + DayMaxDownloadNum string + DownloadUrl string + HourDLNum string + HourMaxDownloadNum string + Id string + LastDownloadTime string + OffTime string + OnTime string + Status string + UpdatedAt string +} + +var FN struct { + TfPackage TagTfPackage +} + +var TN struct { + TfPackage string +} + +func init() { + FN.TfPackage.AppId = "appId" + FN.TfPackage.CountDownloadNum = "countDownloadNum" + FN.TfPackage.CreatedAt = "createdAt" + FN.TfPackage.DayDownloadedNum = "dayDownloadedNum" + FN.TfPackage.DayMaxDownloadNum = "dayMaxDownloadNum" + FN.TfPackage.DownloadUrl = "downloadUrl" + FN.TfPackage.HourDLNum = "hourDlNum" + FN.TfPackage.HourMaxDownloadNum = "hourMaxDownloadNum" + FN.TfPackage.Id = "_id" + FN.TfPackage.LastDownloadTime = "lastDownloadTime" + FN.TfPackage.OffTime = "offTime" + FN.TfPackage.OnTime = "onTime" + FN.TfPackage.Status = "status" + FN.TfPackage.UpdatedAt = "updatedAt" + TN.TfPackage = "tf_package" +} diff --git a/models/tfpackagemod/tfpackage.go b/models/tfpackagemod/tfpackage.go new file mode 100644 index 0000000..549d749 --- /dev/null +++ b/models/tfpackagemod/tfpackage.go @@ -0,0 +1,133 @@ +package tfpackagemod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var db *mongos.MongoTool + +func Init(ctx context.Context) { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, TN.TfPackage) + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: FN.TfPackage.AppId, Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: FN.TfPackage.Id, Value: 1}, + {Key: FN.TfPackage.AppId, Value: 1}, + }, + }, + } + if _, err := db.CreateIndex(ctx, indexes); err != nil { + panic(fmt.Sprintf("(TfPackage:initTfPackageIndex) Create TfPackage Index failed! err:%+v:", err)) + } +} + +//InsertOneTfPackage 插入一个VIP购买记录 +func InsertOneTfPackage(ctx context.Context, TfPackage *TfPackage) error { + if _, err := db.InsertOne(ctx, TfPackage); err != nil { + log.Warn("TfPackage:InsertOneTfPackage db.InsertOne failed", log.E(err)) + return err + } + return nil +} + +//FindOneTfPackage 查找一个VIP购买记录 +func FindOneTfPackage(ctx context.Context, filter bson.M) ( + *TfPackage, error) { + var TfPackage TfPackage + if err := db.FindOne(ctx, &TfPackage, filter); err != nil { + return nil, err + } + return &TfPackage, nil +} + +//DelOneTfPackage 删除一个VIP购买记录 +func DelOneTfPackage(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.DeleteOne(ctx, filter) + if err != nil { + log.Warn("TfPackage:DelOneTfPackage db.DeleteOne failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateOneTfPackage 更新一个VIP购买记录 +func UpdateOneTfPackage(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateOne(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateOneTfPackage db.UpdateOne failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//CountTfPackages 统计VIP购买记录数量 +func CountTfPackages(ctx context.Context, filter bson.M) ( + int64, error) { + count, err := db.Count(ctx, filter) + if err != nil { + log.Warn("TfPackage:CountTfPackages db.Count failed", + log.E(err), log.Any("filter", filter)) + return 0, err + } + return count, nil +} + +//UpdateManyTfPackage 更新满足条件的VIP购买记录 +func UpdateManyTfPackage(ctx context.Context, filter bson.M, update bson.M) error { + _, err := db.UpdateMany(ctx, filter, update) + if err != nil { + log.Warn("user:UpdateManyTfPackage db.UpdateMany failed", + log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//FindManyTfPackage 查找一批VIP购买记录数据 +func FindManyTfPackage(ctx context.Context, filter bson.M, + opts ...*options.FindOptions) (TfPackageList, error) { + data := make(TfPackageList, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("TfPackage:FindManyTfPackage db.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} + +//FindManyTfPackageWithBind 用自己定义结构查找一批VIP购买记录数据 +func FindManyTfPackageWithBind(ctx context.Context, bind interface{}, filter bson.M, + opts ...*options.FindOptions) error { + if err := db.Find(ctx, bind, filter, opts...); err != nil { + log.Warn("TfPackage:FindManyTfPackageWithBind db.Find failed", log.E(err), log.Any("filter", filter)) + return err + } + return nil +} + +//AggregateTfPackages 聚合查找一批VIP购买记录信息 +func AggregateTfPackages(ctx context.Context, + bind interface{}, pipeline []bson.M) error { + if err := db.Aggregate(ctx, bind, pipeline); err != nil { + log.Warn("feedback:AggregateTfPackages db.Aggregate failed", + log.E(err), log.Any("pipeline", pipeline)) + return err + } + return nil +} diff --git a/models/tfpackagemod/type.go b/models/tfpackagemod/type.go new file mode 100644 index 0000000..7458dac --- /dev/null +++ b/models/tfpackagemod/type.go @@ -0,0 +1,35 @@ +package tfpackagemod + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// @table:tf_package +type TfPackage struct { + Id primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` + AppId int32 `bson:"appId" json:"appId"` // appID + DownloadUrl string `bson:"downloadUrl" json:"downloadUrl"` // 下载链接 + CountDownloadNum int64 `bson:"countDownloadNum" json:"countDownloadNum"` // 总已经下载数量 + DayMaxDownloadNum int64 `bson:"dayMaxDownloadNum" json:"dayMaxDownloadNum"` // 当天设置最大下载数量 + DayDownloadedNum int64 `bson:"dayDownloadedNum" json:"dayDownloadedNum"` // 当天已经下载数量 + HourMaxDownloadNum int64 `bson:"hourMaxDownloadNum" json:"hourMaxDownloadNum"` // 每小时设置最大下载数量 + HourDLNum int64 `bson:"hourDlNum" json:"hourDlNum"` // 每小时实际下载数量 + LastDownloadTime time.Time `bson:"lastDownloadTime" json:"lastDownloadTime"` // 上一次下载时间 + Status TFStatus `bson:"status" json:"status"` // 状态;0未使用,1下架,2上架 + OnTime time.Time `bson:"onTime" json:"onTime"` // 上架时间 + OffTime time.Time `bson:"offTime" json:"offTime"` // 下架时间 + CreatedAt time.Time `bson:"createdAt" json:"createdAt"` // 创建时间 + UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` // 更新时间 +} + +type TfPackageList []*TfPackage + +type TFStatus int8 + +const ( + TFUnUsed TFStatus = 0 + iota // 未使用 + TFOffShelf // 下架 + TFOnShelf // 上架 +) diff --git a/models/versionMod/type.go b/models/versionMod/type.go new file mode 100644 index 0000000..89a8c7a --- /dev/null +++ b/models/versionMod/type.go @@ -0,0 +1,64 @@ +package versionMod + +import ( + "stat/common/mongos" + "time" +) + +// 表名 +const CollAppVersion = "version" + +var db *mongos.MongoTool + +type PkgType int8 + +const ( + _ PkgType = iota + Enterprise //企业签 + Shop //商店包 + Tf //testFight + Super //超级签 + Light //H5 +) + +type TfInfo struct { + AppName string `bson:"appName" json:"appName"` //应用名称 + AppIcon string `bson:"appIcon" json:"appIcon"` //应用图标 + URL string `bson:"url" json:"url"` //URL +} + +type VersionModel struct { + Id int64 `bson:"_id" json:"id"` //ID + AppId int32 `bson:"appId" json:"appId"` //APPID + VersionNum string `bson:"versionNum" json:"versionNum"` //版本号 + Terminal string `bson:"terminal" json:"terminal"` //终端ios android + Link []string `bson:"link" json:"link"` //下载链接 + TfInfo []TfInfo `bson:"tfInfo" json:"tfInfo"` //TF信息 + Info string `bson:"info" json:"info"` //版本描述 + PackageType PkgType `bson:"packageType" json:"packageType"` //包类型:1-企业包、2-商店包、3-tf、4-超级签 5-H5 + IsForceUpdate bool `bson:"isForceUpdate" json:"isForceUpdate"` //是否强更 + MinVersion string `bson:"minVersion" json:"minVersion"` //最小版本 + Status bool `bson:"status" json:"status"` //是否启用 + Size string `bson:"size" json:"size"` //更新版本大小M + Md5 string `bson:"md5" json:"md5"` //MD5验证 + BackLink string `bson:"backLink" json:"backLink"` //企业签(备用连接) + CreatedAt time.Time `bson:"createdAt" json:"createdAt"` + UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` +} + +type VersionList []*VersionModel + +type VersionUpdate struct { + VersionNum *string `bson:"versionNum" json:"versionNum"` //版本号 + Terminal *string `bson:"terminal" json:"terminal"` //终端ios android + Link *[]string `bson:"link" json:"link"` //下载链接 + Info *string `bson:"info" json:"info"` //版本描述 + PackageType *PkgType `bson:"packageType" json:"packageType"` //包类型:1-企业包、2-商店包、3-tf、4-超级签 5-H5 + IsForceUpdate *bool `bson:"isForceUpdate" json:"isForceUpdate"` //是否强更 + TfInfo *[]TfInfo `bson:"tfInfo" json:"tfInfo"` //TF信息 + MinVersion *string `bson:"minVersion" json:"minVersion"` //最小版本 + Status *bool `bson:"status" json:"status"` //是否启用 + Size *string `bson:"size" json:"size"` //更新版本大小M + Md5 *string `bson:"md5" json:"md5"` //MD5验证 + BackLink *string `bson:"backLink" json:"backLink"` //企业签(备用连接) +} diff --git a/models/versionMod/version.go b/models/versionMod/version.go new file mode 100644 index 0000000..bc50a16 --- /dev/null +++ b/models/versionMod/version.go @@ -0,0 +1,190 @@ +package versionMod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "github.com/jinzhu/copier" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollAppVersion) + + // 初始化索引 + indexes := []mongo.IndexModel{ + { + Keys: bson.D{ + {Key: "_id", Value: 1}, + {Key: "appId", Value: 1}, + }, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{ + {Key: "terminal", Value: 1}, + {Key: "appId", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "appId", Value: 1}, + }, + }, + { + Keys: bson.D{ + {Key: "status", Value: 1}, + }, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("%s model set index err ==>[%+v]", CollAppVersion, err)) + } +} + +// GetVersionList 查询版本信息 +func GetVersionList(ctx context.Context, appId *int32, skip, limit int64) (list VersionList, count int64, err error) { + list = make(VersionList, 0) + filter := bson.M{} + if appId != nil { + filter["appId"] = *appId + } + sort := bson.D{{Key: "createdAt", Value: -1}} + + opts := options.Find().SetSkip(skip).SetLimit(limit).SetSort(sort) + + if err = db.Find(ctx, &list, filter, opts); err != nil { + log.Error("version GetVersionList Find err", log.E(err)) + return + } + + count, err = db.Count(ctx, filter) + if err != nil { + return + } + + return +} + +// DelVersion 删除版本 +func DelVersion(ctx context.Context, id int64) (err error) { + _, err = db.DeleteOne(ctx, primitive.M{"_id": id}) + return err +} + +// AddVersion 添加一个版本 +func AddVersion(ctx context.Context, data *VersionModel) (err error) { + _, err = db.InsertOne(ctx, data) + return +} + +// 获取版本信息 +func FindVersion(ctx context.Context, id int64) (data VersionModel, err error) { + + err = db.FindOne(ctx, &data, bson.M{"_id": id}) + return +} + +// 更新版本信息 +func UpdateVersion(ctx context.Context, data *VersionModel) (err error) { + data.UpdatedAt = time.Now() + update := &VersionUpdate{} + err = copier.Copy(update, data) + if err != nil { + return err + } + + _, err = db.UpdateOne(ctx, primitive.M{"_id": data.Id}, bson.M{"$set": update}) + return +} + +// ButtonClick 查询最新下载地址ios android +func ButtonClick(ctx context.Context, appId int32, terminal string, packageType PkgType) (data *VersionModel, err error) { + data = &VersionModel{} + match := bson.M{"status": true, "appId": appId} + if terminal == "ios" { + match["terminal"] = terminal + match["packageType"] = packageType + } else { + match["terminal"] = terminal + } + + opts := options.FindOne().SetSort(bson.M{ + "createdAt": -1, + }) + + err = db.FindOne(ctx, data, match, opts) + if err != nil { + return + } + + return +} + +func ButtonList(ctx context.Context, appId int32) (res VersionList, err error) { + res = make([]*VersionModel, 0) + opt := &options.FindOptions{} + opt.SetSort(bson.M{"packageType": 1}) + + err = db.Find(ctx, &res, primitive.M{"status": true, "appId": appId}, opt) + return +} + +func FindVersByPkgTyps(ctx context.Context, appId int32, terminal string, curVersion string, packageType PkgType) (list VersionList, err error) { + list = make(VersionList, 0) + conf := bson.M{ + "appId": appId, + "status": true, + "terminal": terminal} + if packageType != 0 { + conf["packageType"] = packageType + } + opts := options.Find().SetSort(bson.M{ + "createdAt": -1, + }) + + err = db.Find(ctx, &list, conf, opts) + return +} + +func FindIosVersion(ctx context.Context, appId int32, terminal string, curVersion string, packageType []PkgType) (list VersionList, err error) { + list = make(VersionList, 0) + conf := bson.M{ + "appId": appId, + "status": true, + "terminal": terminal} + if len(packageType) > 0 { + conf["packageType"] = bson.M{"$in": packageType} + } + opts := options.Find().SetSort(bson.M{ + "createdAt": -1, + }) + + err = db.Find(ctx, &list, conf, opts) + return +} + +// GetVersionList 查询版本信息 +func GetTfUrlList(ctx context.Context, appId int32) (list VersionModel, err error) { + filter := bson.M{"terminal": "ios", "packageType": Tf, "status": true, "appId": appId} + + opts := options.FindOne().SetSort(bson.M{ + "createdAt": -1, + }) + + if err = db.FindOne(ctx, &list, filter, opts); err != nil { + log.Error("version GetVersionList Find err", log.E(err)) + return + } + + return +} diff --git a/models/withdrawGameOrdermod/gameWithddrawOrder.go b/models/withdrawGameOrdermod/gameWithddrawOrder.go new file mode 100644 index 0000000..801b285 --- /dev/null +++ b/models/withdrawGameOrdermod/gameWithddrawOrder.go @@ -0,0 +1,99 @@ +package withdrawGameOrdermod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + + "go.mongodb.org/mongo-driver/bson" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollGameWithdrawOrder) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "uid", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollGameWithdrawOrder, err)) + } +} + +// 获取用户详情(集团) +func GetBlocGameWithdrawOrderList(ctx context.Context, appId *int32, start, end *time.Time, skip, limit int64) (count int64, data []GameWithdrawOrder, err error) { + filter := bson.M{} + + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["successAt"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["successAt"] = bson.M{"$gte": start} + } else if end != nil { + filter["successAt"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "successAt", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("register GetBlocGameWithdrawOrderList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("register GetBlocGameWithdrawOrderList Count err", log.E(err)) + return + } + + return +} + +// AddWithdrawOrder 添加提现请求 +func AddWithdrawOrder(ctx context.Context, doc *GameWithdrawOrder) (id string, err error) { + ret, err := db.InsertOne(ctx, doc) + if err != nil { + log.Error("withdraw AddWithdraw InsertOne err", log.E(err)) + return + } + + return ret, err +} + +// 获取用户详情(集团) +func GetGameWithdrawOrder(ctx context.Context, appId int32, start, end time.Time) (data []GameWithdrawOrder, err error) { + filter := bson.M{"appId": appId, "successAt": bson.M{"$gte": start, "$lt": end}} + + sort := bson.D{{Key: "successAt", Value: -1}} + + opts := options.Find().SetSort(sort) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("register GetBlocGameWithdrawOrderList Find err", log.E(err)) + return + } + + return +} + +//FindManyRechargeInfo 查找一批信息数据 +func FindManyGameWithdrawOrder(ctx context.Context, filter bson.M, opts ...*options.FindOptions) (data []GameWithdrawOrder, err error) { + data = make([]GameWithdrawOrder, 0) + if err := db.Find(ctx, &data, filter, opts...); err != nil { + log.Warn("FindManyRechargeInfo dbChannel.Find failed", log.E(err), log.Any("filter", filter)) + return nil, err + } + return data, nil +} diff --git a/models/withdrawGameOrdermod/type.go b/models/withdrawGameOrdermod/type.go new file mode 100644 index 0000000..4e9d07b --- /dev/null +++ b/models/withdrawGameOrdermod/type.go @@ -0,0 +1,47 @@ +package withdrawGameOrdermod + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 表名 +const CollGameWithdrawOrder = "withdraw_game_order" + +var db *mongos.MongoTool + +// GameWithdrawOrder 游戏提现订单 +type GameWithdrawOrder struct { + ID primitive.ObjectID `json:"id" bson:"_id,omitempty"` //流水id + PlatformId string `json:"platformId" bson:"platformId"` //原始平台流水Id + AppId int32 `json:"appId" bson:"appId"` //appID + UID uint64 `json:"uid" bson:"uid"` //用户id + Name string `json:"name" bson:"name"` //用户名 + Amount int64 `json:"amount" bson:"amount"` //蝴蝶币数量 + OID string `json:"oid" bson:"oid"` //第三方支付平台id + Money int64 `json:"money" bson:"money" binding:"required"` //提现金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` //实际到账 + PayType string `json:"payType" bson:"payType" binding:"required"` //提现方式,alipay,bankcard + ActName string `json:"actName" bson:"actName"` //交易账户持有人 + Act string `json:"act" bson:"act"` //交易账户 + UserIP string `json:"userIp" bson:"userIp"` //用户ip + DeviceType string `json:"deviceType" bson:"deviceType"` //设备类型 + DevID string `json:"devID" bson:"devID"` //设备id + Status int `json:"status" bson:"status"` //1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败 + StatusDesc string `json:"statusDesc" bson:"statusDesc"` //状态说明 + CheckedAt time.Time `json:"checkedAt" bson:"checkedAt"` //审核时间 + ProgressAt time.Time `json:"progressAt" bson:"progressAt"` //第三方下单成功时间 + SuccessAt time.Time `json:"successAt" bson:"successAt"` //回调成功时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //刷新时间 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //提现申请时间 + ReceivedAt time.Time `json:"receivedAt" bson:"receivedAt"` //到账时间 李秋山确认 三方出款时间 + SyncStatus int64 `json:"syncStatus" bson:"syncStatus"` // 同步大白鲨:0 需要同步 1:不需要同步 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` //集团扣量(特定渠道扣量) + PayChannel string `json:"payChannel" bson:"payChannel"` //提现渠道 + IsDirect bool `json:"isDirect" bson:"isDirect"` //true:是直推用户 + IsFormalUser bool `json:"isFormalUser" bson:"isFormalUser"` // 是否正式用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` //渠道码 + PromCode string `json:"promCode,omitempty" bson:"promCode"` //用户推广序列 +} diff --git a/models/withdrawUserOrdermod/type.go b/models/withdrawUserOrdermod/type.go new file mode 100644 index 0000000..a73dc3f --- /dev/null +++ b/models/withdrawUserOrdermod/type.go @@ -0,0 +1,45 @@ +package withdrawUserOrdermod + +import ( + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// 表名 +const CollUserWithDrawOrder = "withdraw_user_order" + +var db *mongos.MongoTool + +// UserWithdrawOrder 用户提现订单 +type UserWithdrawOrder struct { + ID primitive.ObjectID `json:"id" bson:"_id,omitempty"` //流水id + PlatformId string `json:"platformId" bson:"platformId"` //原始平台流水Id + AppId int32 `json:"appId" bson:"appId"` //appID + UID uint64 `json:"uid" bson:"uid"` //用户id + Name string `json:"name" bson:"name"` //用户名 + Amount int64 `json:"amount" bson:"amount"` //蝴蝶币数量 + OID string `json:"oid" bson:"oid"` //第三方支付平台id + Money int64 `json:"money" bson:"money" binding:"required"` //提现金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` //实际到账 + PayType string `json:"payType" bson:"payType" binding:"required"` //提现方式,alipay,bankcard + ActName string `json:"actName" bson:"actName"` //交易账户持有人 + Act string `json:"act" bson:"act"` //交易账户 + UserIP string `json:"userIp" bson:"userIp"` //用户ip + DeviceType string `json:"deviceType" bson:"deviceType"` //设备类型 + DevID string `json:"devID" bson:"devID"` //设备id + Status int `json:"status" bson:"status"` //1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败 + StatusDesc string `json:"statusDesc" bson:"statusDesc"` //状态说明 + CheckedAt time.Time `json:"checkedAt" bson:"checkedAt"` //审核时间 + ProgressAt time.Time `json:"progressAt" bson:"progressAt"` //第三方下单成功时间 + SuccessAt time.Time `json:"successAt" bson:"successAt"` //回调成功时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //刷新时间 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //提现申请时间 + ReceivedAt time.Time `json:"receivedAt" bson:"receivedAt"` //到账时间 李秋山确认 三方出款时间 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` //集团扣量(特定渠道扣量) + IsDirect bool `json:"isDirect" bson:"isDirect"` //true:是直推用户 + IsFormalUser bool `json:"isFormalUser" bson:"isFormalUser"` // 是否正式用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` //渠道码 + PromCode string `json:"promCode,omitempty" bson:"promCode"` //用户推广序列 +} diff --git a/models/withdrawUserOrdermod/userWithddrawOrder.go b/models/withdrawUserOrdermod/userWithddrawOrder.go new file mode 100644 index 0000000..d4c15e2 --- /dev/null +++ b/models/withdrawUserOrdermod/userWithddrawOrder.go @@ -0,0 +1,89 @@ +package withdrawUserOrdermod + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + + "go.mongodb.org/mongo-driver/bson" +) + +// 初始化model +func Init() { + // 获取数据库表 + db = mongos.New(mongos.MgoManager, CollUserWithDrawOrder) + + indexes := []mongo.IndexModel{ + { + Keys: bson.D{{Key: "appId", Value: 1}, {Key: "uid", Value: 1}}, + }, + } + + if _, err := db.CreateIndex(context.Background(), indexes); err != nil { + panic(fmt.Sprintf("Model %s InitIndex error %+v", CollUserWithDrawOrder, err)) + } +} + +// 获取用户详情(集团) +func GetBlocUserWithdrawOrderList(ctx context.Context, appId *int32, start, end *time.Time, skip, limit int64) (count int64, data []UserWithdrawOrder, err error) { + filter := bson.M{"blocDeduction": false} + + if appId != nil { + filter["appId"] = appId + } + if start != nil && end != nil { + filter["successAt"] = bson.M{"$gte": start, "$lt": end} + } else if start != nil { + filter["successAt"] = bson.M{"$gte": start} + } else if end != nil { + filter["successAt"] = bson.M{"$lt": end} + } + + sort := bson.D{{Key: "successAt", Value: -1}} + + opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("register GetBlocUserWithdrawOrderList Find err", log.E(err)) + return + } + + if count, err = db.Count(ctx, filter); err != nil { + log.Error("register GetBlocUserWithdrawOrderList Count err", log.E(err)) + return + } + + return +} + +// AddWithdrawOrder 添加提现请求 +func AddWithdrawOrder(ctx context.Context, doc *UserWithdrawOrder) (id string, err error) { + ret, err := db.InsertOne(ctx, doc) + if err != nil { + log.Error("withdraw AddWithdraw InsertOne err", log.E(err)) + return + } + + return ret, err +} + +// 获取用户详情(集团) +func GetBlocUserWithdrawOrder(ctx context.Context, appId int32, start, end time.Time) (data []UserWithdrawOrder, err error) { + filter := bson.M{"blocDeduction": false, "appId": appId, "successAt": bson.M{"$gte": start, "$lt": end}} + + sort := bson.D{{Key: "successAt", Value: -1}} + + opts := options.Find().SetSort(sort) + + if err = db.Find(ctx, &data, filter, opts); err != nil { + log.Error("register GetBlocUserWithdrawOrderList Find err", log.E(err)) + return + } + + return +} diff --git a/router/activity.go b/router/activity.go new file mode 100644 index 0000000..15978c3 --- /dev/null +++ b/router/activity.go @@ -0,0 +1,39 @@ +package router + +import ( + "stat/api/activityApi" + + "github.com/gin-gonic/gin" +) + +func activityRouter(router *gin.RouterGroup) { + group := router.Group("/activity") + { // 活动 + group.GET("/list", activityApi.ActivityList) + group.POST("/add", activityApi.AddActivity) + group.POST("/update", activityApi.ActUpdate) + group.POST("/del", activityApi.DelOneAct) + // 活动抽奖码 + group.GET("/lotterycode/list", activityApi.LotteryCodeList) + group.POST("/lotterycode/gen", activityApi.GenLotCode) + group.POST("/lotterycode/update", activityApi.UpdateLotCode) + group.POST("/lotterycode/del", activityApi.DelLotCode) + // 活动奖品 + group.GET("/gift/list", activityApi.LotteryGiftList) + group.POST("/gift/add", activityApi.AddLotGift) + group.POST("/gift/update", activityApi.UpdateLotGift) + group.POST("/gift/del", activityApi.DelLotGift) + // 抽奖兑换详情 + group.GET("/getgift/list", activityApi.ReceiveGiftInfoList) + group.POST("/getgift/gen", activityApi.GenGiftCode) + group.POST("/getgift/update", activityApi.UpdateRecvGiftInfo) + group.POST("/getgift/del", activityApi.DelReceiveGiftInfo) + // h5页面 + group.POST("/h5/info", activityApi.ActivityInfo) + group.POST("/h5/giftinfo", activityApi.ActivityGiftInfo) + group.POST("/h5/draw", activityApi.LuckyDraw) + // 活动访问量 + group.POST("/visit", activityApi.ActivityVisitCount) + group.GET("/visit/list", activityApi.ActivityVisitCountList) + } +} diff --git a/router/admin.go b/router/admin.go new file mode 100644 index 0000000..500f521 --- /dev/null +++ b/router/admin.go @@ -0,0 +1,27 @@ +package router + +import ( + "stat/api/adminApi" + + "github.com/gin-gonic/gin" +) + +func adminRouter(router *gin.RouterGroup) { + group := router.Group("/admin") + { + group.POST("/login", adminApi.AdminLogin) + group.POST("/verify", adminApi.AdminVerify) + group.POST("/list", adminApi.AdminList) + group.POST("/add", adminApi.AddAdmin) + group.POST("/update", adminApi.UpdateAdmin) + group.DELETE("/del", adminApi.DelAdmin) + } + adminbloc := router.Group("/adminbloc") + { + adminbloc.POST("/login", adminApi.AdminLoginBloc) + adminbloc.POST("/list", adminApi.AdminListBloc) + adminbloc.POST("/add", adminApi.AddAdminBloc) + adminbloc.POST("/update", adminApi.UpdateAdminBloc) + adminbloc.DELETE("/del", adminApi.DelAdminBloc) + } +} diff --git a/router/advertise.go b/router/advertise.go new file mode 100644 index 0000000..4e6719c --- /dev/null +++ b/router/advertise.go @@ -0,0 +1,35 @@ +package router + +import ( + "stat/api/advertiseApi" + + "github.com/gin-gonic/gin" +) + +func adsRouter(router *gin.RouterGroup) { + // 广告 + ads := router.Group("/ads") + { + ads.POST("/list", advertiseApi.ListAds) + ads.POST("/add", advertiseApi.AddAds) + ads.POST("/update", advertiseApi.UpdateAds) + ads.POST("/del", advertiseApi.DelAds) + // 外部获取广告 + ads.POST("/get", advertiseApi.GetAds) + // 广告点击 + ads.POST("/click", advertiseApi.ClickAds) + // 广告统计 + ads.POST("/stat", advertiseApi.GetAdvertiseStat) + // 广告统计 + ads.POST("/stattotal", advertiseApi.GetAdvertiseTotalStat) + } + + // 广告位置 + adsLoc := router.Group("/adsLoc") + { + adsLoc.POST("/list", advertiseApi.ListAdsLoc) + adsLoc.POST("/add", advertiseApi.AddAdsLoc) + adsLoc.POST("/update", advertiseApi.UpdateAdsLoc) + adsLoc.POST("/del", advertiseApi.DelAdsLoc) + } +} diff --git a/router/agent.go b/router/agent.go new file mode 100644 index 0000000..70be2cb --- /dev/null +++ b/router/agent.go @@ -0,0 +1,26 @@ +package router + +import ( + "github.com/gin-gonic/gin" + "stat/api/agentApi" + "stat/api/channelApi" +) + +func agentRouter(router *gin.RouterGroup) { + agent := router.Group("/agent") + { + agent.POST("/login", agentApi.AgentLogin) + agent.POST("/channel/add", agentApi.AddAgentChannel) + agent.POST("/imgVerify", agentApi.AgentImgVerifyCode) + agent.POST("/channel/list", agentApi.AgentChannelList) + agent.POST("/channel/stat", agentApi.GetAgentChannelStat) + agent.POST("/summary/home", agentApi.GetAgentSummaryStatHome) + agent.POST("/summary/child", agentApi.GetAgentSummaryStatChild) + agent.POST("/channel/landpage", agentApi.ChannelAppInfo) + agent.POST("/channel/rule/update", agentApi.AgentChannelRuleUpdate) + agent.POST("/channel/info/update", agentApi.AgentChannelInfoUpdate) + agent.POST("/channel/password/update", agentApi.AgentChannelPasswordUpdate) + agent.POST("/channel/password/reset", agentApi.AgentChannelPasswordReset) + agent.POST("/channel/applies", channelApi.GetApplyForm) + } +} diff --git a/router/announce.go b/router/announce.go new file mode 100644 index 0000000..232956b --- /dev/null +++ b/router/announce.go @@ -0,0 +1,19 @@ +package router + +import ( + "github.com/gin-gonic/gin" + "stat/api/announApi" +) + +func announceRouter(router *gin.RouterGroup) { + // 公告 + ads := router.Group("/announce") + { + ads.POST("/list", announApi.ListAnnounce) + ads.POST("/add", announApi.AddAnnounce) + ads.POST("/update", announApi.UpdateAnnounce) + ads.POST("/del", announApi.DelAnnounce) + // 外部获取公告 + ads.POST("/get", announApi.GetAnnounce) + } +} diff --git a/router/appInfo.go b/router/appInfo.go new file mode 100644 index 0000000..787db70 --- /dev/null +++ b/router/appInfo.go @@ -0,0 +1,51 @@ +package router + +import ( + "stat/api/appInfoApi" + "stat/api/domainapi" + "stat/api/monitorApi" + + "github.com/gin-gonic/gin" +) + +func appInfoRouter(router *gin.RouterGroup) { + appInfo := router.Group("/appInfo") + { + appInfo.POST("/list", appInfoApi.ListAppInfo) + appInfo.POST("/add", appInfoApi.AddAppInfo) + appInfo.POST("/update", appInfoApi.UpdateAppInfo) + appInfo.DELETE("/del", appInfoApi.DelAppInfo) + } + + landingPage := router.Group("/landingPage") + { + landingPage.POST("/list", appInfoApi.ListLandingPageInfo) + landingPage.POST("/add", appInfoApi.AddLandingPageInfo) + landingPage.POST("/update", appInfoApi.UpdateLandingPageInfo) + landingPage.DELETE("/del", appInfoApi.DelLandingPageInfo) + } + + landPageConfig := router.Group("/landPageConfig") + { + landPageConfig.POST("/list", appInfoApi.ListLandPageConfig) + landPageConfig.POST("/add", appInfoApi.AddLandPageConfig) + landPageConfig.POST("/update", appInfoApi.UpdateLandPageConfig) + landPageConfig.POST("/del", appInfoApi.DelLandPageConfig) + landPageConfig.POST("/getByType", appInfoApi.GetLandPageConfigByType) + } + + domainInfo := router.Group("/domain") + { + domainInfo.POST("/list", domainapi.ListDomainInfo) + domainInfo.POST("/add", domainapi.AddDomainInfo) + domainInfo.POST("/update", domainapi.UpdateDomainInfo) + domainInfo.DELETE("/del", domainapi.DelDomainInfo) + } + monitor := router.Group("/monitor") + { + monitor.POST("/list", monitorApi.SearchMonitor) + monitor.POST("/add", monitorApi.AddMonitor) + monitor.POST("/update", monitorApi.UpdateMonitor) + monitor.DELETE("/del", monitorApi.DelMonitor) + } +} diff --git a/router/application.go b/router/application.go new file mode 100644 index 0000000..68761a8 --- /dev/null +++ b/router/application.go @@ -0,0 +1,50 @@ +package router + +import ( + "stat/api/applicationapi" + "stat/api/web_appcategory" + "stat/api/web_application" + "stat/api/web_applicationstat" + + "github.com/gin-gonic/gin" +) + +func applicationRouter(router *gin.RouterGroup) { + // 配置的app列表 + application := router.Group("/web/apps") + { + application.POST("/list", web_application.GetApplications) + application.POST("/add", web_application.AddApplication) + application.POST("/update", web_application.UpdateApplication) + application.POST("/del", web_application.DelApplication) + application.POST("/stat", web_applicationstat.GetApplicationStat) + application.POST("/stattotal", web_applicationstat.GetApplicationTotalStat) + + // 外部获取application + application.POST("/get", applicationapi.GetApplication) + // app点击请求统计中心redis + application.POST("/click", applicationapi.ApplicationClick) + /*// 广告统计 + ads.POST("/stat", advertiseApi.GetAdvertiseStat) + */ + } + + // 广告位置 + adsLoc := router.Group("/appLoc") + { + adsLoc.POST("/list", applicationapi.ListAppLoc) + adsLoc.POST("/add", applicationapi.AddAppLoc) + adsLoc.POST("/update", applicationapi.UpdateAppLoc) + adsLoc.POST("/del", applicationapi.DelAppLoc) + } +} + +func appcategoryRouter(router *gin.RouterGroup) { + apps := router.Group("/web/appcategory") + { + apps.POST("/add", web_appcategory.AddAppCategory) + apps.POST("/del", web_appcategory.DelAppCategory) + apps.POST("/update", web_appcategory.UpdateAppCategory) + apps.POST("/list", web_appcategory.GetAppCategories) + } +} diff --git a/router/authority.go b/router/authority.go new file mode 100644 index 0000000..97a07dc --- /dev/null +++ b/router/authority.go @@ -0,0 +1,16 @@ +package router + +import ( + "github.com/gin-gonic/gin" + "stat/api/authorityApi" +) + +func authorityRouter(router *gin.RouterGroup) { + group := router.Group("/authority") + { + group.POST("/list", authorityApi.RoleList) + group.POST("/add", authorityApi.AddRole) + group.POST("/update", authorityApi.UpdateRole) + group.DELETE("/del", authorityApi.DelRole) + } +} diff --git a/router/base.go b/router/base.go new file mode 100644 index 0000000..38c5d6c --- /dev/null +++ b/router/base.go @@ -0,0 +1,111 @@ +package router + +import ( + "errors" + "fmt" + "net/http" + "stat/common/enum/consts" + "stat/middleware/auth" + "stat/middleware/cors" + "stat/statg" + "strconv" + + "github.com/gin-gonic/gin" + + _ "stat/docs" + + swaggerFiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" +) + +var ( + modMap = map[consts.RunMod]string{ + consts.RunModeDev: gin.DebugMode, + consts.RunModeTest: gin.TestMode, + consts.RunModRelease: gin.ReleaseMode, + } +) + +var ( + apiNot = errors.New("ApiNotFound") + methodNot = errors.New("MethodNotFound") +) + +// SetupGin 初始化gin router +func SetupGin() *gin.Engine { + ginMod() + router := ginEngine() + registerMiddleware(router) + registerRouter(router) + if statg.Conf.RunMod != consts.RunModRelease { + setGinSwagger(router) + } + return router +} + +func ginMod() { + mod := modMap[statg.Conf.RunMod] + if mod == "" { + mod = "debug" + } + gin.SetMode(mod) +} + +func ginEngine() *gin.Engine { + router := gin.Default() + router.HandleMethodNotAllowed = true + router.MaxMultipartMemory = 60 << 20 + + //pprof.Register(router, "/1D35BBAB35F3/pprof") + + router.Use(cors.Cors(&cors.Options{ + Origin: nil, + Methods: []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodHead, http.MethodDelete}, + AllowedHeaders: []string{"Content-Length", "Content-Type", "Authorization", "X-User-Agent", "User-Agent"}, + ExposedHeaders: []string{"Content-Disposition", "Refresh-Authorization", "Cur-Ver"}, + OptionsSuccessStatus: http.StatusOK, + })) + + router.NoMethod(func(c *gin.Context) { + c.JSON(http.StatusMethodNotAllowed, methodNot) + }) + + router.NoRoute(func(c *gin.Context) { + c.JSON(http.StatusNotFound, apiNot) + }) + + return router +} + +func registerMiddleware(router *gin.Engine) { + // router.Use(limit.Limit()) + router.Use(auth.Auth) +} + +func registerRouter(router *gin.Engine) { + rootRouter := router.Group("/api/stat") + { + adminRouter(rootRouter) // 管理员管理及登陆 + authorityRouter(rootRouter) // 角色权限管理 + appInfoRouter(rootRouter) // App及落地页管理 + channelRouter(rootRouter) // 渠道扣量结算等管理及统计 + agentRouter(rootRouter) // 代理管理及统计模块 + statRouter(rootRouter) // 数据统计 + fileRouter(rootRouter) // 文件上传 + opLogRouter(rootRouter) // 操作日志管理 + adsRouter(rootRouter) // 广告管理 + versionRouter(rootRouter) // 版本落地页 + announceRouter(rootRouter) // 公告管理 + activityRouter(rootRouter) // 活动抽奖 + statadvertiseRouter(rootRouter) // 广告统计 + innerRouter(rootRouter) // 服务器同步 + applicationRouter(rootRouter) // 配置app应用 + appcategoryRouter(rootRouter) // app分类 + userInviteRouter(rootRouter) // 兼容 + } +} + +func setGinSwagger(router *gin.Engine) { + url := ginSwagger.URL(fmt.Sprintf("http://%s:%s/swagger/doc.json", statg.Conf.Host, strconv.Itoa(statg.Conf.Port))) + router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url)) +} diff --git a/router/channel.go b/router/channel.go new file mode 100644 index 0000000..de262da --- /dev/null +++ b/router/channel.go @@ -0,0 +1,73 @@ +package router + +import ( + "stat/api/channelApi" + "stat/api/mediaapi" + + "github.com/gin-gonic/gin" +) + +func channelRouter(router *gin.RouterGroup) { + channel := router.Group("/channelInfo") // 渠道信息 + { + channel.POST("/list", channelApi.GetChannelInfo) // 显示增加了钱包项 + channel.POST("/export", channelApi.GetChannelInfoExport) + channel.POST("/add", channelApi.AddOneChannelInfo) + channel.POST("/del", channelApi.DelOneChannelInfo) + channel.POST("/update", channelApi.UpdateOneChannelInfo) // 提交参数增加钱包项 + channel.POST("/owner/update", channelApi.UpdateOneChannelOwner) // 更新一个渠道管理的所有者 + channel.POST("/ownerchange/list", channelApi.SearchChannelOwnerChange) // 渠道所有者变更信息 + } + userinfo := router.Group("/user") + { + userinfo.POST("/info", channelApi.SearchUserInfo) + } + + channelRule := router.Group("/channelRule") // 扣量规则 + { + channelRule.POST("/list", channelApi.GetChannelDeductionRule) + channelRule.POST("/add", channelApi.AddOneChannelDeductionRule) + channelRule.POST("/del", channelApi.DelOneChannelDeductionRule) + channelRule.POST("/update", channelApi.UpdateOneChannelDeductionRule) + } + + settlementinfo := router.Group("/settlementinfo") // 结算信息 + { + settlementinfo.POST("/list", channelApi.GetSearchSettlementInfo) + settlementinfo.POST("/export", channelApi.GetSearchSettlementInfoExport) + settlementinfo.POST("/add", channelApi.AddOneSettlementInfo) + settlementinfo.POST("/update", channelApi.UpdateOneSettlementInfo) + settlementinfo.POST("/v2/add", channelApi.AddOneSettlementInfo2) + settlementinfo.POST("/v2/update", channelApi.UpdateOneSettlementInfo2) + settlementinfo.POST("/v2/del", channelApi.DelOneSettlementInfo) + settlementinfo.POST("/v2/detail", channelApi.DetailOneSettlementInfo) + settlementinfo.POST("/deleted/list", channelApi.GetSearchDeletedSettlementInfo) + settlementinfo.POST("/v2/export", channelApi.GetSearchSettlementInfoApplyExport) + settlementinfo.POST("/applicant/list", channelApi.GetSettlementApplicantList) + } + + channelStat := router.Group("/channelStat") // 每日统计 + { + // /api/stat/channelstat/export + channelStat.POST("/export", channelApi.ListChannelStatExport) + channelStat.POST("/list", channelApi.GetChannelStat) + channelStat.POST("/settlement/list", channelApi.GetChannelSettlementStat) + // 结算列表统计信息,用户可以选择 + channelStat.POST("/settlement/v2/list", channelApi.GetChannelSettlementStat2) + // 对用户选择的项目进行结算计算 + channelStat.POST("/settlement/v2/calc", channelApi.GetChannelSettlementCalc) + channelStat.POST("/compare/list", channelApi.SearchChannelStatCompared) + } + channelSettlement := router.Group("/channelSettlement") + { + channelSettlement.POST("/list", channelApi.GetChannelSettlement) + } + + mediatag := router.Group("/mediatag") + { + mediatag.POST("/list", mediaapi.GetMediaTag) + mediatag.POST("/add", mediaapi.AddOneLandpage) + mediatag.POST("/del", mediaapi.DelOneLandpage) + mediatag.POST("/update", mediaapi.UpdateOneLandpage) + } +} diff --git a/router/file.go b/router/file.go new file mode 100644 index 0000000..5e1c5a9 --- /dev/null +++ b/router/file.go @@ -0,0 +1,26 @@ +package router + +import ( + "stat/api/fileApi" + "stat/api/mediaapi" + + "github.com/gin-gonic/gin" +) + +func fileRouter(router *gin.RouterGroup) { + group := router.Group("/file") + { + group.POST("/upload", fileApi.FileUpload) + } + groupmedia := router.Group("/media") + { + groupmedia.POST("/delete", mediaapi.VideoDelete) + groupmedia.POST("/update", mediaapi.VideoUpdate) + groupmedia.POST("/search", mediaapi.VideoSearch) + groupmedia.POST("/videoOk", mediaapi.VideoOK) + groupmedia.POST("/videoBody", mediaapi.VideoBody) + + groupmedia.GET("/m3u8/*key", mediaapi.GetM3U8) // m3u8 + groupmedia.GET("/enkey", mediaapi.Enkey) // enkey + } +} diff --git a/router/inner.go b/router/inner.go new file mode 100644 index 0000000..6c31383 --- /dev/null +++ b/router/inner.go @@ -0,0 +1,27 @@ +package router + +import ( + "stat/api/innerapi" + "stat/middleware/inner" + "stat/statg" + + "github.com/gin-gonic/gin" +) + +func innerRouter(router *gin.RouterGroup) { + plain := router.Group("/inner") + { + plain.POST("/appDownload", innerapi.AppDownload) + plain.POST("/recharge/list", innerapi.InnerRechargeList) + plain.POST("/rechargebotcmd/list", innerapi.InnerRechargeBotcmdList) + } + crypt := router.Group("/inner", inner.Crypt(statg.Conf.InnerKey)) + { + crypt.POST("/botMonthStat", innerapi.BotMonthStatList) + crypt.POST("/botStatList", innerapi.BotDailyHourList) + crypt.POST("/botStatOne", innerapi.BotDailyHourOne) + crypt.POST("/appList", innerapi.ListAppInfo) + crypt.POST("/sendTgMessage", innerapi.SendTgMessage) + ///api/stat/inner/sendTgMessage + } +} diff --git a/router/lottery.go b/router/lottery.go new file mode 100644 index 0000000..10ea30a --- /dev/null +++ b/router/lottery.go @@ -0,0 +1,19 @@ +package router + +import ( + "stat/api/adminApi" + + "github.com/gin-gonic/gin" +) + +func lotteryRouter(router *gin.RouterGroup) { + group := router.Group("/lottery") + { + group.POST("/login", adminApi.AdminLogin) + group.POST("/verify", adminApi.AdminVerify) + group.POST("/list", adminApi.AdminList) + group.POST("/add", adminApi.AddAdmin) + group.POST("/update", adminApi.UpdateAdmin) + group.DELETE("/del", adminApi.DelAdmin) + } +} diff --git a/router/opLog.go b/router/opLog.go new file mode 100644 index 0000000..6b74cfc --- /dev/null +++ b/router/opLog.go @@ -0,0 +1,13 @@ +package router + +import ( + "github.com/gin-gonic/gin" + "stat/api/opLogApi" +) + +func opLogRouter(router *gin.RouterGroup) { + group := router.Group("/opLog") + { + group.POST("/list", opLogApi.ListOpLog) + } +} diff --git a/router/stat.go b/router/stat.go new file mode 100644 index 0000000..df79913 --- /dev/null +++ b/router/stat.go @@ -0,0 +1,81 @@ +package router + +import ( + "github.com/gin-gonic/gin" + + "stat/api/statApi" +) + +func statRouter(router *gin.RouterGroup) { + blocChannelCodeStat := router.Group("/blocChannelCodeStat") + { + blocChannelCodeStat.POST("/list", statApi.ListBlocChannelCodeStat) + blocChannelCodeStat.POST("/export", statApi.ExportBlocChannelCodeStat) + } + gameStat := router.Group("/game") + { + gameStat.POST("/withdraw/list", statApi.GameWithdrawDetails) + gameStat.POST("/recharge/list", statApi.GameRechargerDetails) + + } + daily := router.Group("/dailyStat") + { + daily.POST("/list", statApi.ListDailyStat) + daily.POST("/export", statApi.ListDailyStatExport) + } + dailyhour := router.Group("/dailyhour") + { + dailyhour.POST("/list", statApi.ListDailyHourStat) + dailyhour.POST("/export", statApi.ListDailyHourStatExport) + } + + minuteStat := router.Group("/minuteStat") + { + minuteStat.POST("/list", statApi.ListMinuteStat) + } + + hourStatLine := router.Group("/hourStat") + { + hourStatLine.POST("/list", statApi.ListHourStatLine) + } + + blocDailyStat := router.Group("/blocDailyStat") + { + blocDailyStat.POST("/list", statApi.ListBlocDailyStat) + } + blocDailyStatTotal := router.Group("/blocDailyStatTotal") + { + blocDailyStatTotal.POST("/list", statApi.ListBlocDailyTotalStat) + } + + blocRegisterDetails := router.Group("/blocRegisterDetails") + { + blocRegisterDetails.POST("/list", statApi.ListBlocRegisterDetails) + } + BlocRechargeChannel := router.Group("/BlocRechargeChannel") + { + BlocRechargeChannel.POST("/list", statApi.ListBlocRechargeChannel) + } + + blocRechargeDetails := router.Group("/blocRechargeDetails") + { + blocRechargeDetails.POST("/list", statApi.ListBlocRechargerDetails) + } + blocBlocWithdrawDetails := router.Group("/blocBlocWithdrawDetails") + { + blocBlocWithdrawDetails.POST("/list", statApi.ListBlocWithdrawDetails) + } + landPage := router.Group("/landPage") + { + landPage.POST("/daily/list", statApi.ListLandPageDailyStat) + landPage.POST("/hour/list", statApi.ListLandPageHourStat) + landPage.POST("/summary/downTotal/list", statApi.ListLandPageSummaryDownTotal) + } + jtsp := router.Group("/daily-stat") + { + jtsp.POST("/jtspV2", statApi.GetBlocDailyStatTgbotInfo) + jtsp.POST("/hour", statApi.GetAppHourDataStatInfo) + jtsp.POST("/rank", statApi.GetAppHourDataStatInfoRank) + jtsp.POST("/total", statApi.GetTianyuAppDailyData) + } +} diff --git a/router/statadvertise.go b/router/statadvertise.go new file mode 100644 index 0000000..73beefb --- /dev/null +++ b/router/statadvertise.go @@ -0,0 +1,17 @@ +package router + +import ( + "stat/api/dailystatadvertise" + + "github.com/gin-gonic/gin" +) + +func statadvertiseRouter(router *gin.RouterGroup) { + group := router.Group("/statadvertise") + { + group.POST("/list", dailystatadvertise.GetDailyStatAdvertise) + group.POST("/add", dailystatadvertise.AddOneDailyStatAdvertise) + group.POST("/update", dailystatadvertise.UpdateOneDailyStatAdvertise) + group.DELETE("/del", dailystatadvertise.DelOneDailyStatAdvertise) + } +} diff --git a/router/userinvite.go b/router/userinvite.go new file mode 100644 index 0000000..2804f43 --- /dev/null +++ b/router/userinvite.go @@ -0,0 +1,18 @@ +package router + +import ( + "stat/api/userinviteapi" + + "github.com/gin-gonic/gin" +) + +func userInviteRouter(router *gin.RouterGroup) { + channelCode := router.Group("/userInvite") + { + channelCode.POST("/district", userinviteapi.UserDistictInfo) + } + userRoute := router.Group("/user") + { + userRoute.POST("/districtcode", userinviteapi.UserDistrictCode) + } +} diff --git a/router/version.go b/router/version.go new file mode 100644 index 0000000..2a20f9d --- /dev/null +++ b/router/version.go @@ -0,0 +1,46 @@ +package router + +import ( + "stat/api/versionApi" + "stat/middleware/limit" + + "github.com/gin-gonic/gin" +) + +func versionRouter(router *gin.RouterGroup) { + group := router.Group("/version") + { + group.POST("/list", versionApi.VersionList) + group.POST("/add", versionApi.VersionAdd) + group.POST("/update", versionApi.VersionUpdate) + group.POST("/del", versionApi.VersionDelete) + // 落地页 + group.POST("/bottonlist", versionApi.LandingpageButtonList) + group.POST("/h5/config", versionApi.GetH5Config) + group.GET("/h5/config", versionApi.GetH5Config) + group.POST("/channel/newLink", versionApi.NewChannelDownLoadLink) + // 第三方 + group.POST("/app", versionApi.AppVersion) + // 测试 + group.POST("/h5/config/v2", versionApi.GetH5ConfigV2) + } + + landGroup := router.Group("/version", limit.Limit("landPageIpLimit", 10, 1)) + { // 落地页点击 + landGroup.POST("/crossbottonclick", versionApi.CrossButtonClick) + landGroup.POST("/bottonclick", versionApi.LandingpageButtonClick) + } + + shareUrl := router.Group("/share") + { + shareUrl.POST("/list", versionApi.ShareUrlList) + } + + picture := router.Group("/landpage/picture") + { + picture.POST("/list", versionApi.GetLandpagePicture) + picture.POST("/add", versionApi.AddOneLandpage) + picture.POST("/del", versionApi.DelOneLandpage) + picture.POST("/update", versionApi.UpdateOneLandpage) + } +} diff --git a/script/process.py b/script/process.py new file mode 100644 index 0000000..dc06227 --- /dev/null +++ b/script/process.py @@ -0,0 +1,127 @@ +# pip install opencv-contrib-python +# pip install numpy +import argparse +from pathlib import Path + +from cv2 import cv2 +import numpy as np + + +def mathc_img(src_path, target_path, logo_path, output_path=None): + """ + 图片去水印,加水印处理 + :param src_path: 原图 + :param target_path: 水印模板图 + :param logo_path: 新水印图 + :param output_path: 输出路径。为空时直接显示 + :return: + """ + + if not Path(src_path).is_file(): + ValueError("原文件不存在") + return + if not Path(logo_path).is_file(): + ValueError("Logo文件不存在") + return + if not Path(target_path).is_file(): + ValueError("模板文件不存在") + return + + # 原图带颜色 + img_rgb = cv2.imread(src_path) + + # 复制一份原图 用来显示边框 + img_rgb_rect = cv2.imread(src_path) + + # 创建一个原始图像的灰度版本,所有操作在灰度版本中处理,然后在RGB图像中使用相同坐标还原 + img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) + + # 原图的大小 + img_w, img_h = img_gray.shape[::-1] + + if img_w <= 150 or img_h <= 150: + print("图片尺寸过小") + return + + # 加载将要搜索的图像模板 + template = cv2.imread(target_path, 0) + + # 模板图的坐标 + # w, h = template.shape[::-1] + w, h = 120, 50 + + # 读取logo并缩放 + img_logo = cv2.imread(logo_path) + img_logo = cv2.resize(img_logo, (w, h), interpolation=cv2.INTER_NEAREST) + + # cv2.TM_CCOEFF_NORMED方法查询模板 + res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) + + # 制作一个和原图一样大小的黑底模板图 + mask = np.zeros([img_h, img_w], dtype=np.uint8) + + # 设定阈值 + threshold = 0.7 + loc = np.where(res >= threshold) + logos = [] + for pt in zip(*loc[::-1]): + x, y = pt[0] - 60, pt[1] - 10 + # 在原图上面进行标记出水印的位置 + cv2.rectangle(img_rgb_rect, (x, y), (x + w, y + h), (255, 255, 255), 1) + + # 模板图上面水印处填充白色 + mask[y:y + h, x:x + w] = 255 + + # 水印坐标限定,防止超边界 + y = y if y + h < img_h else img_h - h + w = w if x + w < img_w else img_w - x + + logos.append((x, y, w, h)) + + # 使用黑白模板图对原图进行修复 + img_rm_watermark = cv2.inpaint(img_rgb, mask, 20, cv2.INPAINT_TELEA) + + # 复制一份去水印图 用来加新水印 + img_add_logo = img_rm_watermark.copy() + + # 遍历所有水印坐标进行加新水印 + for logo in logos: + x, y, w, h = logo + app_logo = cv2.addWeighted(img_rm_watermark[y:y + h, x:x + w], 1, img_logo, 0.5, 0) + img_add_logo[y:y + h, x:x + w] = app_logo[:, :] + + if output_path: + cv2.imwrite(output_path, img_add_logo) + return + cv2.imshow('src', img_rgb) # 原图 + cv2.imshow('img_rgb_rect', img_rgb_rect) # 在原图上标记出水印的位置 + cv2.imshow('mask', mask) # 根据水印位置制作出来的蒙版图 + cv2.imshow('img_rm_watermark', img_rm_watermark) # 去水印之后的图 + cv2.imshow('img_add_logo', img_add_logo) # 添加新水印后的图 + + cv2.waitKey(0) + cv2.destroyAllWindows() + + +def test(): + src_img = "src/9.jpg" + mask_img = "mask.jpg" + logo_img = "img/logo.png" + mathc_img(src_img, mask_img, logo_img) + + +def main(): + # 读取输入参数 + ap = argparse.ArgumentParser() + ap.add_argument("-s", "--src", required=True, help="原图片文件路径") + ap.add_argument("-l", "--logo", required=True, help="要覆盖的Logo图片文件路径") + ap.add_argument("-t", "--template", required=True, help="要寻找的模板图片文件路径") + ap.add_argument("-o", "--out", required=True, help="输出的图片文件路径") + args = ap.parse_args() + + mathc_img(args.src, args.template, args.logo, args.out) + + +# 调试使用 +if __name__ == '__main__': + main() diff --git a/server/consumer.go b/server/consumer.go new file mode 100644 index 0000000..1df967c --- /dev/null +++ b/server/consumer.go @@ -0,0 +1,69 @@ +package server + +// import ( +// "context" +// "fmt" +// "stat/common/kafka" +// "stat/service/consumer" +// "stat/statg" + +// "github.com/Shopify/sarama" +// ) + +// var topicList = []string{ +// "user_access", +// "user_register", +// "user_recharge", +// "user_withdraw", +// } + +// type consumerGroupHandler struct{} + +// func (consumerGroupHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil } +// func (consumerGroupHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil } +// func (h consumerGroupHandler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error { +// for msg := range claim.Messages() { + +// // 消息处理 +// switch msg.Topic { +// case "user_access": +// consumer.UserAccessHandler(msg) +// case "user_register": +// consumer.UserRegisterHandler(msg) +// case "user_recharge": +// consumer.UserReChargeHandler(msg) +// case "user_withdraw": +// consumer.UserWithdrawOrder(msg) +// } + +// // 标记该消息已处理 +// sess.MarkMessage(msg, "") +// } +// return nil +// } + +// func runConsumer() { +// group := kafka.InitKafkaConsumerGroup([]string{statg.Conf.Kafka.Url}, statg.Conf.Kafka.Group) +// defer func() { _ = group.Close() }() + +// // Track errors +// go func() { +// for err := range group.Errors() { +// fmt.Println("ERROR", err) +// } +// }() + +// // Iterate over consumer sessions. +// ctx := context.Background() +// for { +// handler := consumerGroupHandler{} + +// // `Consume` should be called inside an infinite loop, when a +// // server-side rebalance happens, the consumer session will need to be +// // recreated to get the new claims +// err := group.Consume(ctx, topicList, handler) +// if err != nil { +// panic(err) +// } +// } +// } diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..df48b0d --- /dev/null +++ b/server/server.go @@ -0,0 +1,151 @@ +package server + +import ( + "fmt" + "net/http" + "os" + "os/signal" + "stat/common/enum/consts" + "stat/common/genId" + "stat/common/log" + "stat/common/mongos" + "stat/common/redis" + "stat/models" + "stat/router" + "stat/service/botser" + "stat/service/cacheSer" + "stat/service/consumer" + "stat/service/domainser" + "stat/service/versionSer" + "stat/skd" + "stat/statg" + "syscall" + "time" + + "github.com/dchest/captcha" +) + +func init() { + time.Local, _ = time.LoadLocation("Asia/Shanghai") +} + +func Run(args []string) { + // 初始化配置文件 + if err := initConfig(); err != nil { + os.Exit(1) + return + } + // 初始化数据库 + if err := initMongoDB(); err != nil { + os.Exit(1) + return + } + // 初始化redis + if err := initRedis(); err != nil { + os.Exit(1) + return + } + // 图片验证器 + statg.VerifyIMGStore = captcha.NewMemoryStore(captcha.CollectNum, captcha.Expiration) + // 自增id + genId.Start() + // 初始化缓存 + cacheSer.Init() + // 测试模式不启用定时任务及同步 + if statg.Conf.RunMod == consts.RunModRelease || statg.Conf.RunMod == consts.RunModeDev { + // 机器人初始化 + statg.InitBot() + // 启动机器人 + botser.StartBot() + } + if statg.Conf.RunMod == consts.RunModRelease { + // LandPage + versionSer.Init() + // Domain Check + domainser.Start() + // 定时任务 + skd.Start() + // APP同步数据 + go consumer.SyncInit() + } + + // web服务器 + initHttpServer() + // 资源释放 + waitQuit() +} + +func initConfig() error { + return statg.LoadConfig("conf/server.json") +} + +func initMongoDB() error { + mgoDB := mongos.NewManager(statg.Conf.Mongo.Url) + if err := mgoDB.Connect(); err != nil { + log.Error("mgoDB connect err", log.E(err)) + return err + } + + mongos.MgoManager = mgoDB + + // 初始化数据库索引 + models.InitIndex() + + return nil +} + +func initRedis() error { + rds, err := redis.NewManagerWithUrl(statg.Conf.Redis.Url, nil) + if err != nil { + log.Error("rds init err", log.E(err)) + return err + } + + redis.StatRds = rds + + return nil +} + +func initHttpServer() { + addr := fmt.Sprintf(":%d", statg.Conf.Port) + srv := &http.Server{ + Addr: addr, + ReadTimeout: 30 * time.Second, + WriteTimeout: 90 * time.Second, + IdleTimeout: 120 * time.Second, + Handler: router.SetupGin(), + } + go func() { + log.Info("服务已启动", log.Any("地址", addr), log.Any("模式", statg.Conf.RunMod)) + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Fatal("listen:", log.E(err)) + } + }() +} + +func waitQuit() { + quit := make(chan os.Signal) + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + <-quit + log.Warn("Shutdown... server") + botser.SaveServerNormalCloseFlag() + done := make(chan int) + go Shutdown(done) + select { + case <-time.After(5 * time.Second): + log.Warn("shutdown timeout....") + case <-done: + log.Info("graceful shutdown") + } +} + +func Shutdown(done chan int) { + cacheSer.SyncWriters() + if mongos.MgoManager != nil { + mongos.MgoManager.DisConnect() + } + if redis.StatRds != nil { + redis.StatRds.Close() + } + close(done) +} diff --git a/service/activitySer/activity.go b/service/activitySer/activity.go new file mode 100644 index 0000000..559f58e --- /dev/null +++ b/service/activitySer/activity.go @@ -0,0 +1,207 @@ +package activitySer + +import ( + "context" + "time" + + "stat/api/proto" + "stat/common/stdLog" + "stat/models/activityVisit" + "stat/models/activitymod" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type ChannelParams struct { + PC string `json:"i" bson:"i"` //推广码 + DC string `json:"dc" bson:"dc"` //商区序列 + CH string `json:"ch" bson:"ch"` //渠道 +} + +// 活动列表 +func GetActivityList(ctx context.Context, param proto.ActivityListReq) (stdLog.CodeType, *proto.ActivityListResp, error) { + if param.PageSize <= 0 { + param.PageSize = 10 + } + if param.PageNum <= 0 { + param.PageNum = 1 + } + data := &proto.ActivityListResp{List: make([]*proto.ActivityInfo, 0)} + filter := bson.M{} + if param.Name != nil { + filter[activitymod.FN.ActivityInfo.Name] = bson.M{"$regex": *param.Name} + } + if param.Enable != nil { + filter[activitymod.FN.ActivityInfo.Enable] = *param.Enable + } + count, err := activitymod.CountActivityInfos(ctx, filter) + if err != nil { + return stdLog.QueryDataError, data, err + } + data.Total = count + + opt := &options.FindOptions{} + skip := (param.PageNum - 1) * param.PageSize + if param.PageSize <= 0 { + param.PageSize = 10 + } + opt.SetSkip(skip) + opt.SetLimit(param.PageSize) + opt.SetSort(bson.M{activitymod.FN.ActivityInfo.SortCode: -1}) + err = activitymod.FindManyActivityInfoWithBind(ctx, &data.List, filter, opt) + if err != nil { + return stdLog.QueryDataError, data, err + } + for _, v := range data.List { + lcFilter := bson.M{activitymod.FN.LottertyCodeInfo.ActId: v.Id.Hex()} + v.LotteryCodeNum, _ = activitymod.CountLottertyCodeInfos(ctx, lcFilter) + + lcFilter[activitymod.FN.LottertyCodeInfo.IsUsed] = true + v.UsedLotteryCodeNum, _ = activitymod.CountLottertyCodeInfos(ctx, lcFilter) + + gcFilter := bson.M{activitymod.FN.LotteryGetGift.ActId: v.Id.Hex()} + v.GiftCodeNum, _ = activitymod.CountLotteryGetGifts(ctx, gcFilter) + + gcgFilter := bson.M{ + activitymod.FN.LotteryGetGift.ActId: v.Id.Hex(), + activitymod.FN.LotteryGetGift.IsGaveOut: true, + } + v.GiftCodeGivedNum, _ = activitymod.CountLotteryGetGifts(ctx, gcgFilter) + + gcuFilter := bson.M{ + activitymod.FN.LotteryGetGift.ActId: v.Id.Hex(), + activitymod.FN.LotteryGetGift.IsUsed: true, + } + v.GiftCodeUsedNum, _ = activitymod.CountLotteryGetGifts(ctx, gcuFilter) + + } + return stdLog.Success, data, nil +} + +// 添加活动 +func AddOneAct(ctx context.Context, param proto.AddActivityReq) (stdLog.CodeType, error) { + now := time.Now() + doc := activitymod.ActivityInfo{ + Id: primitive.NewObjectID(), + Name: param.Name, + Desc: param.Desc, + SortCode: param.SortCode, + H5Domain: param.H5Domain, + GiftDesc: param.GiftDesc, + Enable: param.Enable, + Background: param.Background, + StartTime: param.StartTime, + EndTime: param.EndTime, + CreatedAt: now, + Banner: param.Banner, + } + err := activitymod.InsertOneActivityInfo(ctx, &doc) + if err != nil { + return stdLog.InsertDataError, err + } + return stdLog.Success, nil +} + +// 更新一个活动 +func UpdateOneAct(ctx context.Context, param *proto.UpdateActivityReq) (stdLog.CodeType, error) { + now := time.Now() + param.UpdatedAt = now + filter := bson.M{activitymod.FN.ActivityInfo.Id: param.Id} + updateDoc := bson.M{"$set": param} + err := activitymod.UpdateOneActivityInfo(ctx, filter, updateDoc) + if err != nil { + return stdLog.UpdateDataError, err + } + return stdLog.Success, nil +} + +// 删除一个活动 +func DeleteOneAct(ctx context.Context, param proto.DelActivityReq) (stdLog.CodeType, error) { + filter := bson.M{activitymod.FN.ActivityInfo.Id: param.Id} + count, err := activitymod.DelOneActivityInfo(ctx, filter) + if err != nil { + return stdLog.UpdateDataError, err + } + if count == 0 { + return stdLog.DataNotExist, nil + } + + return stdLog.Success, nil +} + +func UpdateActivityVisitCount(ctx context.Context, peerIp string, param proto.ActivityVisitCountReq) (stdLog.CodeType, error) { + if param.Ip == "" { + param.Ip = peerIp + } + aa := &activityVisit.ActivityVisit{ + AppId: param.AppId, + IP: param.Ip, + CH: param.CH, + ActivityId: param.ActivityId, + ActivityName: param.ActivityName, + PeerIP: peerIp, + CreatedAt: time.Now(), + } + if err := activityVisit.InsertActivityVisit(ctx, aa); err != nil { + return stdLog.InsertDataError, err + } + + return stdLog.Success, nil +} + +// 活动列表 +func GetActivityVisitList(ctx context.Context, param proto.ActivityVisitCountListReq) (stdLog.CodeType, *proto.ActivityVisitListResp, error) { + if param.PageSize <= 0 { + param.PageSize = 10 + } + if param.PageNum <= 0 { + param.PageNum = 1 + } + data := &proto.ActivityVisitListResp{List: make([]*proto.ActivityVisitInfo, 0)} + filter := bson.M{} + if param.ActivityId != nil { + filter["activityId"] = *param.ActivityId + } + if param.AppId != nil { + filter["appId"] = *param.AppId + } + if param.CH != nil { + filter["ch"] = *param.CH + } + count, err := activityVisit.CountActivityVisit(ctx, filter) + if err != nil { + return stdLog.QueryDataError, data, err + } + data.Total = count + + opt := &options.FindOptions{} + skip := (param.PageNum - 1) * param.PageSize + if param.PageSize <= 0 { + param.PageSize = 10 + } + opt.SetSkip(skip) + opt.SetLimit(param.PageSize) + opt.SetSort(bson.M{"createdAt": -1}) + lists, err := activityVisit.FindManyActivityList(ctx, filter, opt) + if err != nil { + return stdLog.QueryDataError, data, err + } + for _, v := range lists { + data.List = append(data.List, &proto.ActivityVisitInfo{ + AppId: v.AppId, + IP: v.IP, + CH: v.CH, + DevType: v.DevType, + SysType: v.SysType, + PeerIP: v.PeerIP, + ActivityId: v.ActivityId.Hex(), + ActivityName: v.ActivityName, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + }) + + } + return stdLog.Success, data, nil +} diff --git a/service/activitySer/activityh5.go b/service/activitySer/activityh5.go new file mode 100644 index 0000000..1d1e8b6 --- /dev/null +++ b/service/activitySer/activityh5.go @@ -0,0 +1,244 @@ +package activitySer + +import ( + "context" + "fmt" + "math/rand" + "strconv" + "time" + + "stat/api/proto" + "stat/common/log" + "stat/common/mongos" + "stat/common/redis" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/activitymod" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var ipDrawLimit = 20 // 同一IP每天抽奖限制 + +// H5活动详情 +func GetActivityInfo(ctx context.Context, param proto.ActivityInfoReq) (stdLog.CodeType, *proto.ActivityInfoResp, error) { + now := time.Now() + res := &proto.ActivityInfoResp{} + filter := bson.M{activitymod.FN.ActivityInfo.Id: param.ActId} + + data, err := activitymod.FindOneActivityInfo(ctx, filter) + if err != nil { + return stdLog.QueryDataError, res, err + } + if data == nil { + return stdLog.ActivityNoExistErr, res, fmt.Errorf("data does not exist") + } + if now.Before(data.StartTime) || now.After(data.EndTime) || !data.Enable { + return stdLog.ActivityNoExistErr, res, fmt.Errorf("activity is closed") + } + res = &proto.ActivityInfoResp{ + Id: data.Id, + Name: data.Name, + Desc: data.Desc, + H5Domain: data.H5Domain, + GiftDesc: data.GiftDesc, + Enable: data.Enable, + StartTime: data.StartTime, + EndTime: data.EndTime, + Banner: data.Banner, + } + return stdLog.Success, res, nil +} + +// H5页面奖品信息 +func GetActivityGiftInfo(ctx context.Context, param proto.ActivityGiftInfoReq) (stdLog.CodeType, *proto.ActivityGiftInfoResp, error) { + data := &proto.ActivityGiftInfoResp{List: make([]*proto.H5GiftInfo, 0)} + filter := bson.M{activitymod.FN.LotteryGift.ActId: param.ActId} + count, err := activitymod.CountLotteryGifts(ctx, filter) + if err != nil { + return stdLog.QueryDataError, data, err + } + data.Count = count + + opt := &options.FindOptions{} + opt.SetSort(bson.M{activitymod.FN.LotteryGift.Sort: 1}) + if err := activitymod.FindManyLotteryGiftWithBind(ctx, &data.List, filter, opt); err != nil { + return stdLog.QueryDataError, data, err + } + return stdLog.Success, data, nil +} + +// 抽奖 +func Draw(ctx context.Context, param *proto.DrawReq) (stdLog.CodeType, *proto.DrawResp, error) { + res := &proto.DrawResp{} + now := time.Now() + + // 活动是否存在 + actFilter := bson.M{activitymod.FN.ActivityInfo.Id: param.ActId} + data, err := activitymod.FindOneActivityInfo(ctx, actFilter) + if err != nil { + return stdLog.QueryDataError, res, err + } + if data == nil { + return stdLog.ActivityNoExistErr, res, fmt.Errorf("data does not exist") + } + if now.Before(data.StartTime) || now.After(data.EndTime) || !data.Enable { + return stdLog.ActivityNoExistErr, res, fmt.Errorf("activity is closed") + } + + // 抽奖码是否有效 + lcFilter := bson.M{ + activitymod.FN.LottertyCodeInfo.LotteryCode: param.LotteryCode, + activitymod.FN.LottertyCodeInfo.ActId: param.ActId.Hex(), + } + lcInfo, err := activitymod.FindOneLottertyCodeInfo(ctx, lcFilter) + if err != nil || lcInfo == nil { + return stdLog.LotteryCodeIsInvalid, res, fmt.Errorf("lottery code is invalid") + } + if lcInfo.IsUsed { + return stdLog.LotteryCodeIsUsed, res, fmt.Errorf("lottery code is used") + } + + // 根据用户IP限制抽奖次数 + if !CanUserDraw(param.Ip, param.ActId.Hex()) { + return stdLog.LotteryNumReachedTheLimit, res, fmt.Errorf("the number of lottery reached the limit") + } + + // 抽奖 + gFilter := bson.M{activitymod.FN.LotteryGift.ActId: param.ActId.Hex()} + opt := &options.FindOptions{} + opt.SetSort(bson.M{activitymod.FN.LotteryGift.Rate: -1}) + giftList, err := activitymod.FindManyLotteryGift(ctx, gFilter, opt) + if err != nil { + return stdLog.QueryDataError, res, fmt.Errorf("lottery gift data err") + } + var giftRand int32 + for _, v := range giftList { + giftRand += v.Rate + } + + flag := true + for { + randNum := rand.Int31n(giftRand) + // fmt.Printf("\ngiftRand is %d at 1st\n", giftRand) + // fmt.Printf("\nrandNum is %d at 1st\n", randNum) + for _, w := range giftList { + // fmt.Printf("randNum is %d before minus\n", randNum) + // fmt.Printf("\ngiftRand is %d before minus\n", giftRand) + randNum -= w.Rate + giftRand -= w.Rate + // fmt.Printf("\nAfter minus randNum is %d\nw.Rate is %d\ngift info %+v\n", randNum, w.Rate, w) + // fmt.Printf("\nAfter minus giftRand is %d\n", giftRand) + if randNum <= 0 { + var notgaveNum int64 // total 每种奖品的总数量, givedNum 每种奖品未被抽中的数量 + gFilter := bson.M{ + activitymod.FN.LotteryGetGift.GiftId: w.Id.Hex(), + activitymod.FN.LotteryGetGift.ActId: w.ActId, + activitymod.FN.LotteryGetGift.LotteryCode: "", + } + info, _ := activitymod.FindManyLotteryGetGift(ctx, gFilter) + notgaveNum = int64(len(info)) + if notgaveNum == 0 { + randNum = rand.Int31n(giftRand + 1) + continue + } + res.GiftId = w.Id.Hex() + res.GiftName = w.GiftName + res.GiftCode = info[0].GiftCode + flag = false + break + } + } + if !flag { + break + } + } + + fn := func(sctx mongo.SessionContext) error { + // 更新lotterycodeinfo + lciFilter := bson.M{ + activitymod.FN.LottertyCodeInfo.LotteryCode: param.LotteryCode, + activitymod.FN.LottertyCodeInfo.ActId: param.ActId.Hex(), + } + lciUpdate := bson.M{"$set": bson.M{ + activitymod.FN.LottertyCodeInfo.UserIp: param.Ip, + activitymod.FN.LottertyCodeInfo.LotteryAt: now, + activitymod.FN.LottertyCodeInfo.UpdatedAt: now, + activitymod.FN.LottertyCodeInfo.IsUsed: true, + activitymod.FN.LottertyCodeInfo.GiftCode: res.GiftCode, + activitymod.FN.LottertyCodeInfo.Remark: "已使用", + }} + err := activitymod.UpdateOneLottertyCodeInfo(sctx, lciFilter, lciUpdate) + if err != nil { + log.Warn("Draw: UpdateOneLottertyCodeInfo err", log.Any("err", err)) + return err + } + + // 更新lotterygetgift + lggFilter := bson.M{ + activitymod.FN.LotteryGetGift.GiftCode: res.GiftCode, + activitymod.FN.LotteryGetGift.ActId: param.ActId.Hex(), + } + lggUpdate := bson.M{"$set": bson.M{ + activitymod.FN.LotteryGetGift.UpdatedAt: now, + activitymod.FN.LotteryGetGift.LotteryCode: param.LotteryCode, + activitymod.FN.LotteryGetGift.IsGaveOut: true, + activitymod.FN.LotteryGetGift.Remark: "兑换码已发放", + }} + err = activitymod.UpdateOneLotteryGetGift(sctx, lggFilter, lggUpdate) + if err != nil { + log.Error("Draw: UpdateOneLotteryGetGift err", log.Any("err", err)) + return err + } + return nil + } + if err := mongos.Transaction(ctx, fn); err != nil { + return stdLog.Failure, &proto.DrawResp{}, err + } + return stdLog.Success, res, nil +} + +// 验证用户Ip是否能抽奖 +func CanUserDraw(ip, actId string) bool { + redisKey := fmt.Sprintf("actId:%s:userIp:%s", actId, ip) + numStr, err := redis.StatRds.Get(redisKey) + if err != nil { + log.Error("canUserDraw redis get err", log.E(err)) + return false + } + var num = int64(0) + if numStr != nil { + num, err = strconv.ParseInt(*numStr, 10, 64) + if err != nil { + log.Error("canUserDraw str to int64 err", log.E(err)) + return false + } + } + if num > int64(ipDrawLimit) { + log.Warn("canUserDraw user IP triggered the limit") + return false + } + val, err := redis.StatRds.Incr(redisKey) + if err != nil { + log.Error("canUserDraw redis get err", log.E(err)) + return false + } + if val == 1 { + duration := redis.StatRds.TTL(redisKey) + if duration == time.Duration(time.Second*-1) { + expiredAt := utils.EndOfToday().UTC().Sub(time.Now().UTC()) + // expiredAt = expiredAt - (time.Second * 36200) + // str := expiredAt.String() + // fmt.Printf("\nexpiredAt is %d\n", expiredAt) + // fmt.Printf("\nstr is %s\n", str) + redis.StatRds.Expire(redisKey, expiredAt) + } + } + if val > int64(ipDrawLimit) { + log.Warn("canUserDraw user IP triggered the limit") + return false + } + return true +} diff --git a/service/activitySer/activityh5_test.go b/service/activitySer/activityh5_test.go new file mode 100644 index 0000000..fc7e525 --- /dev/null +++ b/service/activitySer/activityh5_test.go @@ -0,0 +1,32 @@ +package activitySer + +import ( + "fmt" + "os" + "stat/common/log" + "stat/common/redis" + "testing" +) + +func initRedis() error { + rds, err := redis.NewManagerWithUrl("redis://:B6vJHlYiTseLj77z@118.107.44.18:16789/7") + if err != nil { + log.Error("rds init err", log.E(err)) + return err + } + + redis.StatRds = rds + + return nil +} + +func TestCanUserDraw(t *testing.T) { + + // 初始化redis + if err := initRedis(); err != nil { + os.Exit(1) + return + } + res := CanUserDraw("610.0.21.100", "6063296c6d2c51859840b072") + fmt.Print(res) +} diff --git a/service/activitySer/lotterycode.go b/service/activitySer/lotterycode.go new file mode 100644 index 0000000..9ccf040 --- /dev/null +++ b/service/activitySer/lotterycode.go @@ -0,0 +1,137 @@ +package activitySer + +import ( + "context" + "strings" + "time" + + "stat/api/proto" + "stat/common/gencode" + "stat/common/stdLog" + "stat/models/activitymod" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 生成活动抽奖码 +func GenLotteryCodes(ctx context.Context, param proto.GenLotteryCodeReq) (stdLog.CodeType, error) { + now := time.Now() + filter := bson.M{activitymod.FN.ActivityInfo.Id: param.ActId} + info, err := activitymod.FindOneActivityInfo(ctx, filter) + if err != nil { + return stdLog.QueryDataError, err + } + doc := &activitymod.LottertyCodeInfo{ + ActId: param.ActId.Hex(), + ActName: info.Name, + IsUsed: false, + CreatedAt: now, + } + for i := 0; i < int(param.CodeNum); i++ { + code, err := genLotteryCode(ctx, int(param.CodeLen)) + if err != nil { + return stdLog.Failure, err + } + doc.LotteryCode = code + doc.Id = primitive.NewObjectID() + if err := activitymod.InsertOneLottertyCodeInfo(ctx, doc); err != nil { + return stdLog.InsertDataError, err + } + + } + return stdLog.Success, nil +} + +func genLotteryCode(ctx context.Context, len int) (string, error) { + // 生成码 + for { + code := strings.ToUpper(gencode.CodeGenerate(len)) + filter := bson.M{activitymod.FN.LottertyCodeInfo.LotteryCode: code} + _, err := activitymod.FindOneLottertyCodeInfo(ctx, filter) + if err != nil { + if err != mongo.ErrNoDocuments { + return "", err + } + return code, nil + } + } +} + +// 修改抽奖码信息 +func UpdateLotteryCode(ctx context.Context, param proto.UpdateLotteryCodeReq) (stdLog.CodeType, error) { + now := time.Now() + filter := bson.M{activitymod.FN.LottertyCodeInfo.Id: param.LotteryCodeId} + updateDoc := bson.M{"$set": bson.M{ + activitymod.FN.LottertyCodeInfo.Remark: param.Mark, + activitymod.FN.LottertyCodeInfo.UpdatedAt: now, + }} + err := activitymod.UpdateOneLottertyCodeInfo(ctx, filter, updateDoc) + if err != nil { + return stdLog.UpdateDataError, err + } + return stdLog.Success, nil +} + +// 删除一个活动抽奖码 +func DeleteOneLotteryCode(ctx context.Context, param proto.DelLotteryCodeReq) (stdLog.CodeType, error) { + filter := bson.M{activitymod.FN.ActivityInfo.Id: param.LotteryCodeId} + count, err := activitymod.DelOneLottertyCodeInfo(ctx, filter) + if err != nil { + return stdLog.UpdateDataError, err + } + if count == 0 { + return stdLog.DataNotExist, nil + } + + return stdLog.Success, nil +} + +// 活动抽奖码列表 +func GetLotteryCodeList(ctx context.Context, param proto.LotteryCodeListReq) (stdLog.CodeType, *proto.LotteryCodeListResp, error) { + if param.PageSize <= 0 { + param.PageSize = 10 + } + if param.PageNum <= 0 { + param.PageNum = 1 + } + data := &proto.LotteryCodeListResp{List: make([]*activitymod.LottertyCodeInfo, 0)} + filter := bson.M{} + if param.LotteryCode != nil { + filter[activitymod.FN.LottertyCodeInfo.LotteryCode] = *param.LotteryCode + } + if param.ActId != nil { + filter[activitymod.FN.LottertyCodeInfo.ActId] = *param.ActId + } + if param.ActName != nil { + filter[activitymod.FN.LottertyCodeInfo.ActName] = bson.M{"$regex": *param.ActName} + } + if param.IsUsed != nil { + filter[activitymod.FN.LottertyCodeInfo.IsUsed] = *param.IsUsed + } + if param.GiftCode != nil { + filter[activitymod.FN.LottertyCodeInfo.GiftCode] = *param.GiftCode + } + count, err := activitymod.CountLottertyCodeInfos(ctx, filter) + if err != nil { + return stdLog.QueryDataError, data, err + } + data.Total = count + + opt := &options.FindOptions{} + skip := (param.PageNum - 1) * param.PageSize + if param.PageSize <= 0 { + param.PageSize = 10 + } + opt.SetSkip(skip) + opt.SetLimit(param.PageSize) + opt.SetSort(bson.M{activitymod.FN.LottertyCodeInfo.CreatedAt: -1}) + list, err := activitymod.FindManyLottertyCodeInfo(ctx, filter, opt) + if err != nil { + return stdLog.QueryDataError, data, err + } + data.List = list + return stdLog.Success, data, nil +} diff --git a/service/activitySer/lotterygetgift.go b/service/activitySer/lotterygetgift.go new file mode 100644 index 0000000..cc0222f --- /dev/null +++ b/service/activitySer/lotterygetgift.go @@ -0,0 +1,174 @@ +package activitySer + +import ( + "context" + "fmt" + "strings" + "time" + + "stat/api/proto" + "stat/common/gencode" + "stat/common/stdLog" + "stat/models/activitymod" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 生成活动奖品兑换码 +func GenManyGiftCode(ctx context.Context, param proto.GenGiftCodeRes) (stdLog.CodeType, error) { + now := time.Now() + filter := bson.M{activitymod.FN.LotteryGift.Id: param.GiftId} + info, err := activitymod.FindOneLotteryGift(ctx, filter) + if err != nil { + return stdLog.QueryDataError, err + } + doc := &activitymod.LotteryGetGift{ + ActId: info.ActId, + ActName: info.ActName, + GiftId: info.Id.Hex(), + GiftName: info.GiftName, + CreatedAt: now, + } + for i := 0; i < int(param.CodeNum); i++ { + code, err := genGiftCode(ctx, int(param.CodeLen)) + if err != nil { + return stdLog.Failure, err + } + doc.GiftCode = code + doc.Id = primitive.NewObjectID() + if err = activitymod.InsertOneLotteryGetGift(ctx, doc); err != nil { + return stdLog.InsertDataError, err + } + } + return stdLog.Success, nil +} + +func genGiftCode(ctx context.Context, len int) (string, error) { + // 生成码 + for { + code := strings.ToUpper(gencode.CodeGenerate(len)) + filter := bson.M{activitymod.FN.LotteryGetGift.GiftCode: code} + _, err := activitymod.FindOneLotteryGetGift(ctx, filter) + if err != nil { + if err != mongo.ErrNoDocuments { + return "", err + } + return code, nil + } + } +} + +// 修改奖品兑换信息 +func UpdateOneRecvGiftInfo(ctx context.Context, param *proto.UpdateGetGiftReq) (stdLog.CodeType, error) { + now := time.Now() + if param.GiftCode == "" { + return stdLog.ParamError, fmt.Errorf("giftcode param err") + } + filter := bson.M{ + activitymod.FN.LotteryGetGift.Id: param.Id, + activitymod.FN.LotteryGetGift.GiftCode: param.GiftCode, + } + doc := bson.M{} + if param.UserId == nil || *param.UserId == "" { + return stdLog.ParamError, fmt.Errorf("userId can not be nil") + } else { + doc[activitymod.FN.LotteryGetGift.UserId] = *param.UserId + } + if param.AppName == nil || *param.AppName == "" { + return stdLog.ParamError, fmt.Errorf("appName can not be nil") + } else { + doc[activitymod.FN.LotteryGetGift.AppName] = *param.AppName + } + if param.Remark != nil { + doc[activitymod.FN.LotteryGetGift.Remark] = *param.Remark + } + doc[activitymod.FN.LotteryGetGift.GetGiftAt] = now + doc[activitymod.FN.LotteryGetGift.UpdatedAt] = now + doc[activitymod.FN.LotteryGetGift.IsUsed] = true + updateDoc := bson.M{"$set": doc} + err := activitymod.UpdateOneLotteryGetGift(ctx, filter, updateDoc) + if err != nil { + return stdLog.UpdateDataError, err + } + return stdLog.Success, nil +} + +// 删除一个活动奖品兑换信息 +func DelOneRecvGiftInfo(ctx context.Context, param proto.DelGetGiftReq) (stdLog.CodeType, error) { + filter := bson.M{activitymod.FN.LotteryGetGift.Id: param.Id} + count, err := activitymod.DelOneLotteryGetGift(ctx, filter) + if err != nil { + return stdLog.UpdateDataError, err + } + if count == 0 { + return stdLog.DataNotExist, nil + } + + return stdLog.Success, nil +} + +// 奖品兑换详情列表 +func GetReceiveGiftInfoList(ctx context.Context, param proto.GetGiftInfoReq) (stdLog.CodeType, *proto.GetGiftInfoResp, error) { + if param.PageSize <= 0 { + param.PageSize = 10 + } + if param.PageNum <= 0 { + param.PageNum = 1 + } + data := &proto.GetGiftInfoResp{List: make(activitymod.LotteryGetGiftList, 0)} + filter := bson.M{} + if param.LotteryCode != nil { + filter[activitymod.FN.LotteryGetGift.LotteryCode] = *param.LotteryCode + } + if param.ActId != nil { + filter[activitymod.FN.LotteryGetGift.ActId] = bson.M{"$regex": *param.ActId} + } + if param.ActName != nil { + filter[activitymod.FN.LotteryGetGift.ActName] = bson.M{"$regex": *param.ActName} + } + if param.GiftId != nil { + filter[activitymod.FN.LotteryGetGift.GiftId] = bson.M{"$regex": *param.GiftId} + } + if param.GiftName != nil { + filter[activitymod.FN.LotteryGetGift.GiftName] = *param.GiftName + } + if param.UserId != nil { + filter[activitymod.FN.LotteryGetGift.UserId] = *param.UserId + } + if param.AppName != nil { + filter[activitymod.FN.LotteryGetGift.AppName] = *param.AppName + } + if param.IsUsed != nil { + filter[activitymod.FN.LotteryGetGift.IsUsed] = *param.IsUsed + } + if param.GiftCode != nil { + filter[activitymod.FN.LotteryGetGift.GiftCode] = *param.GiftCode + } + if param.GiftCode != nil { + filter[activitymod.FN.LotteryGetGift.GiftCode] = *param.GiftCode + } + if param.IsGaveOut != nil { + filter[activitymod.FN.LotteryGetGift.IsGaveOut] = *param.IsGaveOut + } + count, err := activitymod.CountLotteryGetGifts(ctx, filter) + if err != nil { + return stdLog.QueryDataError, data, err + } + data.Total = count + + opt := &options.FindOptions{} + skip := (param.PageNum - 1) * param.PageSize + if param.PageSize <= 0 { + param.PageSize = 10 + } + opt.SetSkip(skip) + opt.SetLimit(param.PageSize) + opt.SetSort(bson.M{activitymod.FN.LotteryGetGift.CreatedAt: -1}) + if err := activitymod.FindManyLotteryGetGiftWithBind(ctx, &data.List, filter, opt); err != nil { + return stdLog.QueryDataError, data, err + } + return stdLog.Success, data, nil +} diff --git a/service/activitySer/lotterygift.go b/service/activitySer/lotterygift.go new file mode 100644 index 0000000..4224012 --- /dev/null +++ b/service/activitySer/lotterygift.go @@ -0,0 +1,117 @@ +package activitySer + +import ( + "context" + "time" + + "stat/api/proto" + "stat/common/stdLog" + "stat/models/activitymod" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 添加活动奖品 +func AddOneGift(ctx context.Context, param proto.AddGiftReq) (stdLog.CodeType, error) { + now := time.Now() + filter := bson.M{activitymod.FN.ActivityInfo.Id: param.ActId} + info, err := activitymod.FindOneActivityInfo(ctx, filter) + if err != nil { + return stdLog.QueryDataError, err + } + doc := &activitymod.LotteryGift{ + Id: primitive.NewObjectID(), + ActId: info.Id.Hex(), + ActName: info.Name, + GiftName: param.GiftName, + GiftDesc: param.GiftDesc, + Rate: param.Rate, + Sort: param.Sort, + CreatedAt: now, + } + if err = activitymod.InsertOneLotteryGift(ctx, doc); err != nil { + return stdLog.InsertDataError, err + } + + return stdLog.Success, nil +} + +// 修改奖品信息 +func UpdateOneGift(ctx context.Context, param *proto.UpdateGiftReq) (stdLog.CodeType, error) { + now := time.Now() + param.UpdatedAt = now + filter := bson.M{activitymod.FN.LotteryGift.Id: param.Id} + updateDoc := bson.M{"$set": param} + err := activitymod.UpdateOneLotteryGift(ctx, filter, updateDoc) + if err != nil { + return stdLog.UpdateDataError, err + } + return stdLog.Success, nil +} + +// 删除一个活动奖品 +func DeleteOneGift(ctx context.Context, param proto.DelGiftReq) (stdLog.CodeType, error) { + filter := bson.M{activitymod.FN.LotteryGift.Id: param.Id} + count, err := activitymod.DelOneLotteryGift(ctx, filter) + if err != nil { + return stdLog.UpdateDataError, err + } + if count == 0 { + return stdLog.DataNotExist, nil + } + + return stdLog.Success, nil +} + +// 活动奖品列表 +func GetLotteryGiftList(ctx context.Context, param proto.GiftListReq) (stdLog.CodeType, *proto.GiftListResp, error) { + if param.PageSize <= 0 { + param.PageSize = 10 + } + if param.PageNum <= 0 { + param.PageNum = 1 + } + data := &proto.GiftListResp{List: make([]*proto.GiftInfo, 0)} + filter := bson.M{} + if param.ActId != nil { + filter[activitymod.FN.LotteryGift.ActId] = *param.ActId + } + if param.GiftName != nil { + filter[activitymod.FN.LotteryGift.GiftName] = bson.M{"$regex": *param.GiftName} + } + if param.GiftDesc != nil { + filter[activitymod.FN.LotteryGift.GiftDesc] = bson.M{"$regex": *param.GiftDesc} + } + if param.Rate != nil { + filter[activitymod.FN.LotteryGift.Rate] = *param.Rate + } + count, err := activitymod.CountLotteryGifts(ctx, filter) + if err != nil { + return stdLog.QueryDataError, data, err + } + data.Total = count + + opt := &options.FindOptions{} + skip := (param.PageNum - 1) * param.PageSize + if param.PageSize <= 0 { + param.PageSize = 10 + } + opt.SetSkip(skip) + opt.SetLimit(param.PageSize) + opt.SetSort(bson.M{activitymod.FN.LotteryGift.Sort: 1}) + if err := activitymod.FindManyLotteryGiftWithBind(ctx, &data.List, filter, opt); err != nil { + return stdLog.QueryDataError, data, err + } + for _, v := range data.List { + gFilter := bson.M{activitymod.FN.LotteryGetGift.GiftId: v.Id.Hex()} + gCount, _ := activitymod.CountLotteryGetGifts(ctx, gFilter) + v.GiftNum = gCount + + gFilter[activitymod.FN.LotteryGetGift.IsUsed] = true + usedCount, _ := activitymod.CountLotteryGetGifts(ctx, gFilter) + v.ReceivedGiftNum = usedCount + } + return stdLog.Success, data, nil +} diff --git a/service/adminSer/admin.go b/service/adminSer/admin.go new file mode 100644 index 0000000..593a2cf --- /dev/null +++ b/service/adminSer/admin.go @@ -0,0 +1,207 @@ +package adminSer + +import ( + "context" + "encoding/base32" + "fmt" + "stat/middleware/define" + "time" + + "stat/api/proto" + "stat/common" + "stat/common/log" + "stat/common/stdLog" + "stat/models/adminMod" + "stat/models/authorityMod" +) + +func AdminLogin(ctx context.Context, param proto.AdminVerifyReq) (code stdLog.CodeType, data adminMod.Admin, err error) { + res, err := adminMod.FindOneByAccount(ctx, *param.Account) + if err != nil || res.Account == "" { + code = stdLog.AdminAccountNotExists + return + } + + // 绑定两步验证 + if !res.HasBind { + _ = adminMod.TwoStepBind(ctx, res.Account) + } + + // 首次登陆,生成token + + roleInfo, err := authorityMod.GetAuthorityById(ctx, res.RoleId) + if err != nil { + log.Error("GetAuthorityById failed", log.E(err)) + return stdLog.Failure, data, err + + } + + // 生成token + claims := define.Claims{ + Type: define.Admin, + Name: res.Account, + Role: roleInfo.Role, + CID: res.MerchantId, + } + + newToken, err := define.GenToken(&claims) + if err != nil { + log.Error("GenerateUserToken failed", log.E(err)) + code = stdLog.Failure + return code, data, err + } + + res.Token = newToken + + // 刷新token + if err = adminMod.RefreshToken(ctx, res.Account, newToken); err != nil { + code = stdLog.Failure + return code, data, err + } + + data = res + code = stdLog.Success + return +} + +// 管理员列表 +func AdminList(ctx context.Context, param proto.AdminListReq) (code stdLog.CodeType, data interface{}, err error) { + skip := (param.PageNum - 1) * param.PageSize + limit := param.PageSize + resp := proto.AdminListRes{ + Total: 0, + List: make([]proto.AdminInfo, 0), + } + + count, adminList, err := adminMod.FindAdminList(ctx, param.BlocRole, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + authIds := make([]int64, 0) + for _, v := range adminList { + authIds = append(authIds, v.RoleId) + } + + // 获取权限角色 + authList, err := authorityMod.GetAuthorityByIds(ctx, authIds) + if err != nil { + code = stdLog.Failure + return + } + authMap := make(map[int64]*authorityMod.Authority) + for _, v := range authList { + _v := v + authMap[v.Id] = &_v + } + + for _, v := range adminList { + role := "" + if roleInfo, ok := authMap[v.RoleId]; ok { + role = roleInfo.Role + } + + tmp := proto.AdminInfo{ + RoleId: v.RoleId, + Role: role, + MerchantId: v.MerchantId, + Account: v.Account, + Password: v.Password, + Name: v.Name, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + LastTime: v.LastTime, + } + resp.List = append(resp.List, tmp) + } + resp.Total = count + data = resp + code = stdLog.Success + return +} + +// 添加管理员账号 +func AddAdmin(ctx context.Context, param proto.AddAdminReq) (code stdLog.CodeType, data interface{}, err error) { + secret := base32.StdEncoding.EncodeToString([]byte(fmt.Sprintf("admin%s", common.RandStr(10)))) + now := time.Now() + doc := adminMod.Admin{ + Account: *param.Account, + Password: *param.Password, + Name: *param.Name, + RoleId: *param.RoleId, + HasBind: false, + Secret: secret, + CreatedAt: now, + UpdatedAt: now, + } + + if param.MerchantId != nil { + doc.MerchantId = *param.MerchantId + } + if param.BlocRole != nil { + doc.BlocRole = *param.BlocRole + } + roleInfo, err := authorityMod.GetAuthorityById(ctx, doc.RoleId) + if err != nil { + log.Error("GetAuthorityById failed", log.E(err)) + return + + } + + // 生成token + claims := define.Claims{ + Type: define.Admin, + Name: doc.Account, + Role: roleInfo.Role, + CID: doc.MerchantId, + } + + newToken, err := define.GenToken(&claims) + if err != nil { + log.Error("GenerateUserToken failed", log.E(err)) + code = stdLog.Failure + return code, data, err + } + + doc.Token = newToken + + if err = adminMod.AddAdmin(ctx, &doc); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 修改管理员账号 +func UpdateAdmin(ctx context.Context, param proto.UpdateAdminReq) (code stdLog.CodeType, data interface{}, err error) { + now := time.Now() + doc := adminMod.UpdateDoc{ + Account: param.Account, + Password: param.Password, + Name: param.Name, + RoleId: param.RoleId, + Status: param.Status, + MerchantId: param.MerchantId, + UpdatedAt: &now, + } + + if err = adminMod.UpdateAdmin(ctx, *param.Account, doc); err != nil { + code = stdLog.Failure + return + } + code = stdLog.Success + return +} + +// 修改管理员账号 +func DelAdmin(ctx context.Context, param proto.DelAdminReq) (code stdLog.CodeType, data interface{}, err error) { + if err = adminMod.DelAdmin(ctx, *param.Account); err != nil { + code = stdLog.Failure + return + } + code = stdLog.Success + return +} diff --git a/service/adminSer/admin_test.go b/service/adminSer/admin_test.go new file mode 100644 index 0000000..f22e7ca --- /dev/null +++ b/service/adminSer/admin_test.go @@ -0,0 +1,13 @@ +package adminSer + +import ( + "encoding/base32" + "fmt" + "stat/common" + "testing" +) + +func TestAddAdmin(t *testing.T) { + secret := base32.StdEncoding.EncodeToString([]byte(fmt.Sprintf("admin%s", common.RandStr(10)))) + t.Log(secret) +} diff --git a/service/advertiseSer/advertise.go b/service/advertiseSer/advertise.go new file mode 100644 index 0000000..7977ea7 --- /dev/null +++ b/service/advertiseSer/advertise.go @@ -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 +} diff --git a/service/advertiseSer/advertiseLoc.go b/service/advertiseSer/advertiseLoc.go new file mode 100644 index 0000000..2782e4a --- /dev/null +++ b/service/advertiseSer/advertiseLoc.go @@ -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 +} diff --git a/service/advertiseSer/advertisestat.go b/service/advertiseSer/advertisestat.go new file mode 100644 index 0000000..ffdbaf9 --- /dev/null +++ b/service/advertiseSer/advertisestat.go @@ -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 +} diff --git a/service/advertiseSer/define.go b/service/advertiseSer/define.go new file mode 100644 index 0000000..865c07c --- /dev/null +++ b/service/advertiseSer/define.go @@ -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"` +} diff --git a/service/advertiseSer/helper.go b/service/advertiseSer/helper.go new file mode 100644 index 0000000..c24f060 --- /dev/null +++ b/service/advertiseSer/helper.go @@ -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) + } +} diff --git a/service/agentSer/agent.go b/service/agentSer/agent.go new file mode 100644 index 0000000..864e98e --- /dev/null +++ b/service/agentSer/agent.go @@ -0,0 +1,655 @@ +package agentSer + +import ( + "bytes" + "context" + "errors" + "fmt" + "stat/api/proto" + "stat/common" + "stat/common/log" + "stat/common/stdLog" + "stat/common/utils" + "stat/middleware/define" + "stat/models/channelmod" + "stat/statg" + "strconv" + "strings" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func GetChannelInfoWithLockStatus(ctx context.Context, channel string) (*channelmod.ChannelInfo, stdLog.CodeType, error) { + channelFilter := bson.M{channelmod.FN.ChannelInfo.Channel: channel} + channelInfo, err := channelmod.FindOneChannelInfo(ctx, channelFilter) + if err != nil || channelInfo.Channel == "" { + return nil, stdLog.AgentAccountNotExists, fmt.Errorf("代理账号 %s 不存在", channel) + } + if channelInfo.Type.IsChild() { + channelMap, _, err := MakeChannelAndRuleMap(ctx, channelInfo) + if err != nil { + return nil, stdLog.QueryDataError, err + } + lock, status, showDivide := channelMap.GetLockStatusAndShowDivide(channelInfo) + channelInfo.Lock = lock + channelInfo.Status = status + channelInfo.ChildShowDivideRate = showDivide + } + return channelInfo, stdLog.Success, nil +} + +func CheckToken(ctx context.Context, channel string, token string) error { + channelFilter := bson.M{channelmod.FN.ChannelInfo.Channel: channel} + channelInfo, err := channelmod.FindOneChannelInfo(ctx, channelFilter) + if err != nil { + return err + } + if channelInfo.Channel == "" { + return fmt.Errorf("代理账号 %s 不存在", channel) + } + if channelInfo.Lock || !channelInfo.Status { + return fmt.Errorf("代理账号 %s 被禁止", channel) + } + if channelInfo.Token != token { + return fmt.Errorf("登陆信息已过期,请重新登陆") + } + if time.Since(channelInfo.CheckTokenTime) > 6*time.Hour { + doc := bson.M{"$set": bson.M{ + channelmod.FN.ChannelInfo.CheckTokenTime: time.Now(), + }} + if err = channelmod.UpdateOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: channelInfo.Channel}, doc); err != nil { + return err + } + channelInfoWithLock, _, err := GetChannelInfoWithLockStatus(ctx, channel) + if err != nil { + return err + } + if channelInfoWithLock.Lock || !channelInfoWithLock.Status { + doc := bson.M{"$set": bson.M{ + channelmod.FN.ChannelInfo.Token: "", // 清空token + }} + if err = channelmod.UpdateOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: channelInfo.Channel}, doc); err != nil { + return err + } + return fmt.Errorf("本账号的上级代理账号 %s 被禁止", channel) + } + } + return nil +} + +// 代理商账号登陆 +func AgentLogin(ctx context.Context, ip string, param proto.AgentLoginReq) (code stdLog.CodeType, channelInfo *channelmod.ChannelInfo) { + var err error + channelInfo, code, err = GetChannelInfoWithLockStatus(ctx, *param.Account) + if err != nil { + return + } + + // 禁止登陆 + if channelInfo.Lock || !channelInfo.Status { + code = stdLog.AgentHasLocked + return + } + + if *param.Password != channelInfo.Password { + code = stdLog.AdminPasswordError + return + } + + if len(param.ImgCode) != 4 { + code = stdLog.VerifySmsCodeFailed + return + } + + imgs := make([]byte, 4) + for i := range param.ImgCode { + pi, err := strconv.Atoi(string(param.ImgCode[i])) + if err != nil { + code = stdLog.VerifySmsCodeFailed + return + } + imgs[i] = byte(pi) + } + + imgCodeByte := statg.VerifyIMGStore.Get(param.ImgID, true) + if bytes.Equal(imgCodeByte, imgs) { + channelInfo.ShowMagic += 1 + doc := bson.M{"$set": bson.M{channelmod.FN.ChannelInfo.ShowMagic: channelInfo.ShowMagic}} + if err = channelmod.UpdateOneChannelInfo(ctx, bson.M{}, doc); err != nil { + code = stdLog.Failure + return code, channelInfo + } + code = stdLog.VerifySmsCodeFailed + return + } else if bytes.Equal(imgCodeByte, common.ArrayReverseByte(imgs)) { + channelInfo.ShowMagic = 1 + } else { + code = stdLog.VerifySmsCodeFailed + return + } + + // 生成token + claims := define.Claims{ + Type: define.Channel, + Name: *param.Account, + ShowMagic: strconv.Itoa(int(channelInfo.ShowMagic)), + } + //fmt.Println("claims", claims) + if channelInfo.ShowMagic >= 3 { + statg.Bot.SendMonitorMessage("渠道" + channelInfo.Channel + "风险登陆多次已禁止登陆.") + } + + newToken, err := define.GenToken(&claims) + if err != nil { + log.Error("GenerateUserToken failed", log.E(err)) + code = stdLog.Failure + return code, channelInfo + } + channelInfo.Token = newToken + + // 刷新token + doc := bson.M{"$set": bson.M{ + channelmod.FN.ChannelInfo.Token: newToken, + channelmod.FN.ChannelInfo.ShowMagic: channelInfo.ShowMagic, + channelmod.FN.ChannelInfo.IP: ip, + }} + if err = channelmod.UpdateOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: channelInfo.Channel}, doc); err != nil { + code = stdLog.Failure + return code, channelInfo + } + + code = stdLog.Success + return +} +func AgentChannelAppInfo(ctx context.Context, req proto.ChannelAppInfoReq) (*proto.ChannelAppInfoResp, error) { + checkFilter := bson.M{ + channelmod.FN.ChannelInfo.Channel: req.Channel, + } + channelInfo, err := channelmod.FindOneChannelInfo(ctx, checkFilter) + if err != nil { + return nil, err + } + if channelInfo.Channel != req.Channel { + return nil, fmt.Errorf("channel not found. %s", req.Channel) + } + filter := bson.M{} + if channelInfo.Type == channelmod.ChannelTypeParent { + filter[channelmod.FN.ChannelInfo.Channel] = channelInfo.Channel + } else { + filter[channelmod.FN.ChannelInfo.Channel] = channelInfo.ParentChannel + } + ruleList, err := channelmod.FindManyChannelDeductionRule(ctx, filter) + if err != nil { + log.Error("AgentChannelAppInfo FindManyChannelDeductionRule", log.Any("channel", req.Channel), log.E(err)) + return nil, err + } + resp := &proto.ChannelAppInfoResp{ + List: make([]proto.ChannelAppInfo, 0), + } + for _, ruleInfo := range ruleList { + temp := proto.ChannelAppInfo{ + AppId: ruleInfo.AppId, + AppName: ruleInfo.AppName, + LandingPage: ruleInfo.LandingPage + fmt.Sprintf("?dc=%s", req.Channel), + } + resp.List = append(resp.List, temp) + } + return resp, nil +} + +// AgentChannelListInfo 查询渠道列表 +func AgentChannelListInfo(ctx context.Context, channel string, req *proto.AgentChannelInfoSearch) ( + *proto.AgentChannelInfoSearchResp, error) { + + filter := bson.M{"$or": bson.A{ + bson.M{channelmod.FN.ChannelInfo.Channel: channel}, + bson.M{channelmod.FN.ChannelInfo.ParentAgent: channel}, + }} + + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelmod.FN.ChannelInfo.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + resp := &proto.AgentChannelInfoSearchResp{} + + if req.AppId != nil { + filter[channelmod.FN.ChannelInfo.AppIds] = bson.M{"$in": []int32{*req.AppId}} + } + if req.Type != nil { + filter[channelmod.FN.ChannelInfo.Type] = *req.Type + } + + total, serr := channelmod.CountChannelInfos(ctx, filter) + if serr != nil { + return nil, serr + } + if total == 0 { + return resp, nil + } + + channelInfoList, err := channelmod.FindManyChannelInfo(ctx, filter, opt) + if err != nil { + return nil, err + } + resp.List = make([]proto.ChannelAgentInfo, 0) + + for _, channchannelInfo := range channelInfoList { + tmp := proto.ChannelAgentInfo{ + Channel: channchannelInfo.Channel, + AppIds: channchannelInfo.AppIds, + UserName: channchannelInfo.UserName, + ParentAgent: channchannelInfo.ParentAgent, + ChildCount: channchannelInfo.ChildCount, + Status: channchannelInfo.Status, + Mobile: channchannelInfo.Mobile, + Type: channchannelInfo.Type, + Remark: channchannelInfo.Remark, + Lock: channchannelInfo.Lock, + Wallet: channchannelInfo.Wallet, + CreatedAt: channchannelInfo.CreatedAt, + UpdatedAt: channchannelInfo.UpdatedAt, + } + + ruleFilter := bson.M{ + channelmod.FN.ChannelDeductionRule.Channel: channchannelInfo.Channel, + } + ruleInfoList, _ := channelmod.FindManyChannelDeductionRule(ctx, ruleFilter) + for _, ruleInfo := range ruleInfoList { + tmp.Settlement = ruleInfo.Settlement + tmp.CPAPrice = ruleInfo.CPAPrice + tmp.CPSRate = ruleInfo.CPSRate + tmp.DivideRate = ruleInfo.DivideRate + tmp.AppType = ruleInfo.AppType + tmp.PromoteMode = ruleInfo.PromoteMode + tmp.AppIds = []int32{int32(ruleInfo.AppId)} + if tmp.DivideRate == 0 { + tmp.DivideRate = 100 + } + if tmp.Channel == channel { + tmp.DivideRate = 100 + } + + resp.List = append(resp.List, tmp) + } + } + resp.Total = total + return resp, nil +} + +// AgentChannelRuleUpdate 更新渠道信息 +func AgentChannelRuleUpdate(ctx context.Context, channel string, req *proto.AgentChannelRuleUpdate) error { + // 查找要修改规则的子代理 + channelFilter := bson.M{ + channelmod.FN.ChannelInfo.Channel: req.Channel, + channelmod.FN.ChannelInfo.ParentAgent: channel, + } + channelInfo, err := channelmod.FindOneChannelInfo(ctx, channelFilter) + if err != nil { + return err + } + if channelInfo.Channel != req.Channel { + return fmt.Errorf("channel not found %s", req.Channel) + } + if req.CPSRate == nil && req.CPAPrice == nil && req.DivideRate == nil && req.ChildShowDivideRate == nil { + return nil + } + if req.CPSRate != nil && !InRangeInt64(*req.CPSRate, 0, 100) { + return fmt.Errorf("CPS比例 (%d) 必须在 0-100 之间", *req.CPSRate) + } + if req.DivideRate != nil && !InRangeInt64(*req.DivideRate, 0, 100) { + return fmt.Errorf("分成比例 (%d) 必须在 0-100 之间", *req.CPSRate) + } + // 规则检查 + parentRules, err := channelmod.FindManyChannelDeductionRule(ctx, bson.M{channelmod.FN.ChannelDeductionRule.Channel: channelInfo.ParentAgent}) + if err != nil { + return err + } + if req.CPAPrice != nil { + parentCPA := int64(0) + for _, rule := range parentRules { + if rule.CPAPrice > 0 { + if parentCPA <= 0 { + parentCPA = rule.CPAPrice + } else { + if rule.CPAPrice < parentCPA { + parentCPA = rule.CPAPrice + } + } + } + } + if *req.CPAPrice > parentCPA || *req.CPAPrice < 0 { + return fmt.Errorf("下级CPA价格 (%d) 必须在范围 0-%d 之间,不能大于你自己的CPA价格", *req.CPAPrice/100, parentCPA/100) + } + } + if req.CPSRate != nil { + parentCPSRate := int64(0) + for _, rule := range parentRules { + if rule.CPSRate > 0 { + if parentCPSRate <= 0 { + parentCPSRate = rule.CPSRate + } else { + if rule.CPSRate < parentCPSRate { + parentCPSRate = rule.CPSRate + } + } + } + } + if *req.CPSRate > parentCPSRate || *req.CPSRate < 0 { + return fmt.Errorf("下级CPS比例 (%d) 必须在范围 0-%d 之间, 不能大于你自己的CPS比例", *req.CPSRate, parentCPSRate) + } + } + + // 更新规则 + setdoc := bson.M{} + if req.CPAPrice != nil { + setdoc[channelmod.FN.ChannelDeductionRule.CPAPrice] = *req.CPAPrice + } + if req.CPSRate != nil { + setdoc[channelmod.FN.ChannelDeductionRule.CPSRate] = *req.CPSRate + } + if req.DivideRate != nil { + setdoc[channelmod.FN.ChannelDeductionRule.DivideRate] = *req.DivideRate + } + if err := channelmod.UpdateManyChannelDeductionRule(ctx, + bson.M{channelmod.FN.ChannelDeductionRule.Channel: req.Channel}, + bson.M{"$set": setdoc}, + ); err != nil { + return err + } + + // 更新子代理是否显示分成比例 + if req.ChildShowDivideRate != nil || req.Remark != nil { + doc := bson.M{} + if req.ChildShowDivideRate != nil { + doc[channelmod.FN.ChannelInfo.ChildShowDivideRate] = *req.ChildShowDivideRate + } + if req.Remark != nil { + doc[channelmod.FN.ChannelInfo.Remark] = *req.Remark + } + if err = channelmod.UpdateOneChannelInfo(ctx, channelFilter, bson.M{"$set": doc}); err != nil { + return err + } + } + return nil + +} + +// AgentChannelInfoUpdate 更新渠道信息 +func AgentChannelInfoUpdate(ctx context.Context, channel string, req *proto.AgentChannelInfoUpdate) error { + checkFilter := bson.M{ + channelmod.FN.ChannelInfo.Channel: req.Channel, + } + channelInfo, err := channelmod.FindOneChannelInfo(ctx, checkFilter) + if err != nil { + return err + } + if channelInfo.Channel != req.Channel { + return fmt.Errorf("channel not found. %s", req.Channel) + } + if req.WalletAddr1 != nil || req.WalletAddr2 != nil { + if channelInfo.Channel == channel { + return fmt.Errorf("您不可以修改自己的钱包地址,请联系您的上级代理协助修改") + } + } + if !(channelInfo.Channel == channel || channelInfo.ParentAgent == channel) { + return fmt.Errorf("channel not found! %s", req.Channel) + } + setdoc := bson.M{ + channelmod.FN.ChannelInfo.UpdatedAt: time.Now(), + } + if req.Status != nil { + setdoc[channelmod.FN.ChannelInfo.Status] = *req.Status + } + if req.Mobile != nil { + setdoc[channelmod.FN.ChannelInfo.Mobile] = *req.Mobile + } + if req.WalletAddr1 != nil { + setdoc[channelmod.FN.ChannelInfo.Wallet.Addr1] = *req.WalletAddr1 + } + if req.WalletAddr2 != nil { + setdoc[channelmod.FN.ChannelInfo.Wallet.Addr2] = *req.WalletAddr2 + } + return channelmod.UpdateOneChannelInfo(ctx, + bson.M{channelmod.FN.ChannelInfo.Channel: req.Channel}, + bson.M{"$set": setdoc}, + ) +} + +// AgentChannelPasswordReset 子渠道密码重置 +func AgentChannelPasswordReset(ctx context.Context, channel string, req *proto.AgentChannelPasswordReset) error { + checkFilter := bson.M{ + channelmod.FN.ChannelInfo.Channel: req.Channel, + } + channelInfo, err := channelmod.FindOneChannelInfo(ctx, checkFilter) + if err != nil { + return err + } + if channelInfo.Channel != req.Channel { + return fmt.Errorf("代理没找到. %s", req.Channel) + } + if channelInfo.ParentAgent != channel { + return errors.New("只能重置直接下级代理的密码! ") + } + if req.Password == "" { + return errors.New("新密码不能为空! ") + } + setdoc := bson.M{ + channelmod.FN.ChannelInfo.UpdatedAt: time.Now(), + channelmod.FN.ChannelInfo.Password: req.Password, + } + return channelmod.UpdateOneChannelInfo(ctx, + bson.M{channelmod.FN.ChannelInfo.Channel: req.Channel}, + bson.M{"$set": setdoc}, + ) +} + +// AgentChannelPasswordUpdate 更新渠道密码 +func AgentChannelPasswordUpdate(ctx context.Context, channel string, req *proto.AgentChannelPasswordUpdate) error { + checkFilter := bson.M{ + channelmod.FN.ChannelInfo.Channel: channel, + } + channelInfo, err := channelmod.FindOneChannelInfo(ctx, checkFilter) + if err != nil { + return err + } + if channelInfo.Channel != channel { + return fmt.Errorf("channel not found. %s", channel) + } + if channelInfo.Password != req.OldPassword { + return errors.New("旧密码输入错误") + } + if req.NewPassword == "" { + return errors.New("新密码不能为空! ") + } + setdoc := bson.M{ + channelmod.FN.ChannelInfo.UpdatedAt: time.Now(), + channelmod.FN.ChannelInfo.Password: req.NewPassword, + } + return channelmod.UpdateOneChannelInfo(ctx, + bson.M{channelmod.FN.ChannelInfo.Channel: channel}, + bson.M{"$set": setdoc}, + ) +} + +func GetChildNewChannelNameAndRootChannelName(ctx context.Context, channelParent *channelmod.ChannelInfo) (string, string, error) { + maxid := 0 + filter := bson.M{} + if channelParent.Type == channelmod.ChannelTypeParent { + filter[channelmod.FN.ChannelInfo.ParentChannel] = channelParent.Channel + } else { + filter[channelmod.FN.ChannelInfo.ParentAgent] = channelParent.Channel + } + channlList, err := channelmod.FindManyChannelInfo(ctx, filter) + if err != nil { + log.Error("AddAgentChannelInfo CountChannelInfos", log.Any("channel", channelParent.Channel), log.E(err)) + return "", "", err + } + for _, v := range channlList { + id, err := strconv.Atoi(string(strings.Replace(v.Channel, channelParent.Channel, "", -1))) + if err == nil && id > maxid { + maxid = id + } + } + maxid = maxid + 1 + childChannelName := channelParent.Channel + fmt.Sprintf("%.2d", maxid) + rootChannelName := "" + if channelParent.Type == channelmod.ChannelTypeParent { // 一级代理 + rootChannelName = channelParent.Channel + } else { + if channelParent.ParentChannel == "" { // 如果子级代理的父代理为空 + //rootChannelName = channelParent.Channel + return "", "", fmt.Errorf("子级代理【%s】的顶级代理空时不能添加子代理!", channelParent.Channel) + } else { + rootChannelName = channelParent.ParentChannel + } + } + return childChannelName, rootChannelName, nil +} + +// AddAgentChannelInfo 渠道添加一个子渠道 +func AddAgentChannelInfo(ctx context.Context, channel string, req *proto.AgentChannelInfoAdd) error { + channelInfo, _, err := GetChannelInfoWithLockStatus(ctx, channel) + if err != nil { + return err + } + if channelInfo.Lock || !channelInfo.Status { + + return fmt.Errorf("您的代理或上级代理已被禁止") + } + + childChannelName, rootChannelName, err := GetChildNewChannelNameAndRootChannelName(ctx, channelInfo) + if err != nil { + return err + } + + childChannelType := channelInfo.Type.Child() + if childChannelType.IsNone() { + return errors.New("您的代理等级无法添加子渠道") + } + + now := time.Now() + newChannelInfo := channelmod.ChannelInfo{ + Channel: childChannelName, + UserName: channelInfo.UserName, + AppIds: channelInfo.AppIds, + ParentChannel: rootChannelName, + ParentAgent: channel, + Password: req.Password, + Status: true, + Mobile: req.Mobile, + Type: childChannelType, + Remark: req.Remark, + Wallet: channelmod.Wallet{ + Addr1: req.WalletAddr1, + Addr2: req.WalletAddr2, + }, + Lock: false, + ShowMagic: 0, + CreatedAt: now, + UpdatedAt: now, + } + + err = channelmod.InsertOneChannelInfo(ctx, &newChannelInfo) + if err != nil { + log.Error("AddChannelInfo InsertOneChannelInfo", log.Any("channel", newChannelInfo.ParentChannel), log.E(err)) + return err + } + + // 增加子渠道数量 + setdoc := bson.M{"$inc": bson.M{channelmod.FN.ChannelInfo.ChildCount: 1}} + err = channelmod.UpdateOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: channel}, setdoc) + if err != nil { + log.Error("AddChannelInfo InsertOneChannelInfo", log.Any("channel", newChannelInfo.ParentChannel), log.E(err)) + return err + } + + for _, appid := range channelInfo.AppIds { + checkFilter := bson.M{channelmod.FN.ChannelDeductionRule.Channel: channel, channelmod.FN.ChannelDeductionRule.AppId: appid} + ChannelDeductionRule, err := channelmod.FindOneChannelDeductionRule(ctx, checkFilter) + if err != nil || ChannelDeductionRule.Channel != channel { + log.Error("AddAgentChannelInfo FindOneChannelDeductionRule", log.Any("channel", channel), log.Any("appid", appid), log.E(err)) + continue + } + newChannelRule := &channelmod.ChannelDeductionRule{ + Channel: newChannelInfo.Channel, + AppId: ChannelDeductionRule.AppId, + AppName: ChannelDeductionRule.AppName, + AppType: ChannelDeductionRule.AppType, + PromoteMode: ChannelDeductionRule.PromoteMode, + Settlement: ChannelDeductionRule.Settlement, + First: ChannelDeductionRule.First, + Second: ChannelDeductionRule.Second, + Third: ChannelDeductionRule.Third, + Fourth: ChannelDeductionRule.Fourth, + Fifth: ChannelDeductionRule.Fifth, + CPAPrice: ChannelDeductionRule.CPAPrice, + CPSRate: ChannelDeductionRule.CPSRate, + CPSBegin: ChannelDeductionRule.CPSBegin, + CPSDeductionRate: ChannelDeductionRule.CPSDeductionRate, + BeginTime: ChannelDeductionRule.BeginTime, + SettlementTime: now, + TodayTime: utils.BeginOfToday(), + TodayDeduction: 0, + CreatedAt: now, + UpdatedAt: now, + } + + err = channelmod.InsertOneChannelDeductionRule(ctx, newChannelRule) + if err != nil { + log.Error("AddAgentChannelInfo InsertOneChannelDeductionRule", log.Any("channel", channel), log.Any("appid", appid), log.E(err)) + continue + } + } + return nil +} + +// GetAgentSummaryStatChild 查询渠道扣量规则信息 +func GetAgentSummaryStatChild(ctx context.Context, channel string, req *proto.AgentSummaryStatChildSearch) (*proto.AgentSummaryStatChildResp, error) { + resp := &proto.AgentSummaryStatChildResp{ + List: make(proto.AgentSummaryStatChildList, 0), + } + summary, err := GetAgentSummary(ctx, channel, nil, nil, nil, nil) + if err != nil { + return nil, err + } + total, list := summary.GetAgentSummaryStats(OutputStatListTypeChild, req.PageNum, req.PageSize) + resp.Total = total + for _, item := range list { + resp.List = append(resp.List, item.ToAgentSummaryStatChild()) + } + return resp, nil +} + +// GetAgentSummaryStatHome 查询渠道扣量规则信息 +func GetAgentSummaryStatHome(ctx context.Context, channel string, req *proto.AgentSummaryStatHomeSearch) (*proto.AgentSummaryStatHomeResp, error) { + resp := &proto.AgentSummaryStatHomeResp{ + List: make(proto.AgentSummaryStatHomeList, 0), + } + summary, err := GetAgentSummary(ctx, channel, nil, nil, nil, nil) + if err != nil { + return nil, err + } + total, list := summary.GetAgentSummaryStats(OutputStatListTypeSelf, req.PageNum, req.PageSize) + resp.Total = total + resp.List = list + return resp, nil +} + +// GetAgentChannelStat 查询渠道扣量规则信息 +func GetAgentChannelStat(ctx context.Context, channel string, req *proto.AgentChannelStatSearch) (*proto.AgentChannelStatResp, error) { + resp := &proto.AgentChannelStatResp{ + List: make([]*proto.AgentDeductedStat, 0), + } + summary, err := GetAgentSummary(ctx, channel, req.Channel, req.AppId, req.Start, req.End) + if err != nil { + return nil, err + } + total, list := summary.GetAgentStats(OutputStatListTypeAll, req.PageNum, req.PageSize) + resp.Total = total + resp.List = list + resp.TotalInfo = *summary.StatTotal + return resp, nil +} diff --git a/service/agentSer/define.go b/service/agentSer/define.go new file mode 100644 index 0000000..0466f64 --- /dev/null +++ b/service/agentSer/define.go @@ -0,0 +1,50 @@ +package agentSer + +import ( + "stat/api/proto" + "stat/models/appInfoMod" + "stat/models/channelmod" +) + +const ( + CPA_SHOW_MONEY = false + CPS_SHOW_COUNT = true +) + +type ChannelMap map[string]*channelmod.ChannelInfo +type AppMap map[int32]*appInfoMod.AppInfo +type SourceAgentStatMap map[channelmod.ChannelType]map[string]ChannelAgentStatList +type OutputStatListType int32 + +type AgentDeductedStatList []*proto.AgentDeductedStat + +func (a AgentDeductedStatList) Len() int { return len(a) } +func (a AgentDeductedStatList) Less(i, j int) bool { return a[i].SumDate.After(a[j].SumDate) } +func (a AgentDeductedStatList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +const ( + OutputStatListTypeAll OutputStatListType = 0 // 输出当前渠道和直接下级渠道的stat列表 + OutputStatListTypeSelf OutputStatListType = 1 // 输出当前渠道自身的stat列表 + OutputStatListTypeChild OutputStatListType = 2 // 输出直接下级渠道的stat列表 +) + +type AgentChannelSummaryMode int32 + +const ( + AgentChannelSummaryModeFollowRule AgentChannelSummaryMode = 0 // 按渠道规则,忽略记录中的规则和价格 + AgentChannelSummaryModeFollowRecord AgentChannelSummaryMode = 1 // 按记录中的规则和价格,覆盖渠道规则 +) + +var ( + GlobalAgentChannelSummaryMode = AgentChannelSummaryModeFollowRule +) + +type AgentChannelStat struct { + channelmod.ChannelStat + ChildValidDirectCount int64 + ChildValidPayMoney int64 + ChildChannelStats []*AgentChannelStat + DeductedStat *proto.AgentDeductedStat + DivideRate int64 +} +type ChannelAgentStatList []*AgentChannelStat diff --git a/service/agentSer/helper.go b/service/agentSer/helper.go new file mode 100644 index 0000000..e81f4ff --- /dev/null +++ b/service/agentSer/helper.go @@ -0,0 +1,199 @@ +package agentSer + +import ( + "context" + "stat/api/proto" + "stat/models/appInfoMod" + "stat/models/channelmod" +) + +func EnsureRangeInt64(value, min, max int64) int64 { + if value < min { + value = min + } + if value > max { + value = max + } + return value +} + +func InRangeInt64(value, min, max int64) bool { + if value < min { + return false + } + if value > max { + return false + } + return true +} + +func MinInt64(x, y int64) int64 { + if x < y { + return x + } + return y +} + +func MaxInt64(x, y int64) int64 { + if x > y { + return x + } + return y +} + +func GetPageRange(totalLen, pageNum, pageSize int) (start, end int) { + if pageNum < 1 { + pageNum = 1 + } + if pageSize < 1 { + pageSize = 10 + } + start = (pageNum - 1) * pageSize + if start > totalLen { + start = totalLen + } + end = start + pageSize + if end > totalLen { + end = totalLen + } + return +} + +func (c ChannelMap) GetChannelNames() []string { + lst := make([]string, 0) + for _, v := range c { + lst = append(lst, v.Channel) + } + return lst +} + +func (c ChannelMap) GetChildChannels(channel string) []*channelmod.ChannelInfo { + lst := make([]*channelmod.ChannelInfo, 0) + for _, v := range c { + if v.ParentAgent == channel { + lst = append(lst, v) + } + } + return lst +} + +func (c ChannelMap) GetParentChannels(channel string) []*channelmod.ChannelInfo { + lst := make([]*channelmod.ChannelInfo, 0) + self := c[channel] + if self == nil { + return lst + } + parent := c[self.ParentAgent] + for parent != nil { + lst = append(lst, parent) + parent = c[parent.ParentAgent] + } + return lst +} + +func (c ChannelMap) GetLockStatusAndShowDivide(channelInfo *channelmod.ChannelInfo) (bool, bool, bool) { + parents := c.GetParentChannels(channelInfo.Channel) + parentShowDivide := true + status := channelInfo.Status + lock := channelInfo.Lock + for _, parent := range parents { + parentShowDivide = parentShowDivide && parent.ChildShowDivideRate + status = status && parent.Status + if parent.Lock { + lock = true + } + } + return lock, status, parentShowDivide && channelInfo.ChildShowDivideRate +} + +func (c ChannelMap) GetAncestorAndOffspringChannels(channel string) []*channelmod.ChannelInfo { + out := make([]*channelmod.ChannelInfo, 0) + cInfo := c[channel] + if cInfo == nil { + return out + } + children := c.GetChildChannels(cInfo.Channel) + for len(children) > 0 { + tmp := make([]*channelmod.ChannelInfo, 0) + for _, child := range children { + out = append(out, child) + tmp = append(tmp, c.GetChildChannels(child.Channel)...) + } + children = tmp + } + for cInfo != nil { + out = append(out, cInfo) + if cInfo.ParentAgent != "" { + cInfo = c[cInfo.ParentAgent] + } else { + cInfo = nil + } + } + return out +} + +func GetAppMap(ctx context.Context) (AppMap, error) { + appList, err := appInfoMod.GetAllAppInfo(ctx) + if err != nil { + return nil, err + } + appMap := make(AppMap) + for _, app := range appList { + tmp := app + appMap[app.AppId] = &tmp + } + return appMap, nil +} + +func (m AppMap) GetAppName(id int32) string { + if app, ok := m[id]; ok { + return app.Name + } + return "" +} + +func AccumulateAgentChannelStat(base, stat *AgentChannelStat, ruleData bool) { + channelmod.ChannelStatSummation(&base.ChannelStat, &stat.ChannelStat) + base.Settlement = stat.Settlement + base.ChildValidPayMoney += stat.ChildValidPayMoney + base.ChildValidDirectCount += stat.ChildValidDirectCount + AccumulateDeductedStat(base.DeductedStat, stat.DeductedStat, ruleData) + for _, child := range stat.ChildChannelStats { + base.DeductedStat.ChildRebate += child.DeductedStat.Income + } +} + +func AccumulateDeductedStat(base, stat *proto.AgentDeductedStat, ruleData bool) { + base.VisitCount += stat.VisitCount + if !ruleData || (ruleData && stat.Settlement == channelmod.SettlementCPA) || (stat.Settlement == channelmod.SettlementCPS && CPS_SHOW_COUNT) { + base.DirectCount += stat.DirectCount + base.DirectCountChild += stat.DirectCountChild + base.DirectCountSelf += stat.DirectCountSelf + } + if !ruleData || (ruleData && stat.Settlement == channelmod.SettlementCPS) || (stat.Settlement == channelmod.SettlementCPA && CPA_SHOW_MONEY) { + base.Recharge += stat.Recharge + base.RechargeChild += stat.RechargeChild + base.RechargeSelf += stat.RechargeSelf + } + base.Income += stat.Income + base.IncomeChild += stat.IncomeChild + base.IncomeSelf += stat.IncomeSelf +} + +func AccumulateStatData(base *proto.StatDataDetail, stat *proto.AgentDeductedStat, ruleData bool) { + base.ChildRebate += stat.ChildRebate + base.VisitCount += stat.VisitCount + if !ruleData || (ruleData && stat.Settlement == channelmod.SettlementCPA) || (stat.Settlement == channelmod.SettlementCPS && CPS_SHOW_COUNT) { + base.DirectCount += stat.DirectCount + base.DirectCountSelf += stat.DirectCountSelf + base.DirectCountChild += stat.DirectCountChild + } + if !ruleData || (ruleData && stat.Settlement == channelmod.SettlementCPS) || (stat.Settlement == channelmod.SettlementCPA && CPA_SHOW_MONEY) { + base.Recharge += stat.Recharge + base.RechargeSelf += stat.RechargeSelf + base.RechargeChild += stat.RechargeChild + } + base.Income += stat.Income + base.IncomeSelf += stat.IncomeSelf + base.IncomeChild += stat.IncomeChild +} diff --git a/service/agentSer/node.go b/service/agentSer/node.go new file mode 100644 index 0000000..5dfefe4 --- /dev/null +++ b/service/agentSer/node.go @@ -0,0 +1,248 @@ +package agentSer + +import ( + "context" + "errors" + "fmt" + "log" + "stat/api/proto" + "stat/models/channelmod" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +type AgentNode struct { + Ctx context.Context + ChannelInfo *channelmod.ChannelInfo + Stats ChannelAgentStatList + Parent *AgentNode + Children []*AgentNode + Accumulate bool //是否已累计子层 + AddedChild bool //是否已添加子层 + Deducted bool //是否已计算扣量 +} + +func NewAgentNode(ctx context.Context, channel *channelmod.ChannelInfo, parent *AgentNode, stats ...*AgentChannelStat) *AgentNode { + ret := &AgentNode{ + Ctx: ctx, + ChannelInfo: channel, + Stats: make([]*AgentChannelStat, 0), + Parent: parent, + Children: make([]*AgentNode, 0), + Accumulate: false, + } + ret.Stats = append(ret.Stats, stats...) + return ret +} + +func GetRootAgentNode(ctx context.Context, selfChannel *channelmod.ChannelInfo, reqChannel *string, statDict SourceAgentStatMap) (*AgentNode, error) { + var rootAgent *AgentNode + if reqChannel != nil && *reqChannel != selfChannel.Channel { + cInfo, err := channelmod.FindOneChannelInfoEx(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: *reqChannel}) + if err != nil { + return nil, err + } + if cInfo.ParentAgent != selfChannel.Channel { + return nil, fmt.Errorf("查找渠道失败,只能查看自己或自己的直接下级!") + } + stats := statDict[cInfo.Type][cInfo.Channel] + rootAgent = NewAgentNode(ctx, cInfo, nil, stats...) + } else { + stats := statDict[selfChannel.Type][selfChannel.Channel] + rootAgent = NewAgentNode(ctx, selfChannel, nil, stats...) + } + return rootAgent, nil +} + +func nodeFind(node *AgentNode, find func(node *AgentNode) bool) *AgentNode { + var stack = []*AgentNode{node} + for len(stack) > 0 { + node = stack[len(stack)-1] + stack = stack[:len(stack)-1] + if node != nil { + found := find(node) + if found { + return node + } + stack = append(stack, node.Children...) + } + } + return nil +} + +func traverse(node *AgentNode, accumulate func(node *AgentNode)) { + // first child + for _, child := range node.Children { + traverse(child, accumulate) + } + // last self + accumulate(node) +} + +func (s *AgentNode) AddChildNodes(srcDict SourceAgentStatMap, channelMap ChannelMap) error { + findNotAddChildNodeFn := func(node *AgentNode) bool { + if !node.AddedChild { + return true + } + return false + } + for found := nodeFind(s, findNotAddChildNodeFn); found != nil; found = nodeFind(s, findNotAddChildNodeFn) { + childChannels := channelMap.GetChildChannels(found.ChannelInfo.Channel) + for _, channel := range childChannels { + stats := srcDict[channel.Type][channel.Channel] + agent := NewAgentNode(s.Ctx, channel, found, stats...) + found.Children = append(found.Children, agent) + } + found.AddedChild = true + } + return nil +} + +func (s *AgentNode) AccumulateChildNodes(ruleMap RuleMap) error { + accumulate := func(found *AgentNode) { + if found.Accumulate { + panic(errors.New("AccumulateChildNodes found node can not be accumulate")) + } + for _, childAgent := range found.Children { + if !childAgent.Accumulate { + panic(errors.New("AccumulateChildNodes child node can not be not accumulated")) + } + for _, childStat := range childAgent.Stats { + hit := false + for _, parentStat := range found.Stats { + if parentStat.SumDate.Equal(childStat.SumDate) { + hit = true + AccumulateChildAgentChannelStatToParent(parentStat, childStat) + } + } + if !hit { + lostStat := &AgentChannelStat{ + ChannelStat: channelmod.ChannelStat{ + Channel: childAgent.ChannelInfo.ParentAgent, + SumDate: childStat.SumDate, + AppId: childStat.AppId, + Type: childStat.Type - 1, + Settlement: childStat.Settlement, + UserName: childStat.UserName, + ParentChannel: childStat.ParentChannel, + }, + } + if rule := ruleMap.GetRule(childAgent.ChannelInfo.ParentAgent, childStat.AppId); rule != nil { + lostStat.CPSRate = rule.CPSRate + lostStat.CPAPrice = rule.CPAPrice + lostStat.Settlement = rule.Settlement + lostStat.DivideRate = rule.DivideRate + lostStat.AppType = rule.AppType + lostStat.PromoteMode = rule.PromoteMode + } + AccumulateChildAgentChannelStatToParent(lostStat, childStat) + found.Stats = append(found.Stats, lostStat) + log.Println(lostStat) + } + } + } + found.Accumulate = true + } + traverse(s, accumulate) + return nil +} + +func (s *AgentNode) CalculateDeduction(channelMap ChannelMap, ruleMap RuleMap) error { + deduction := func(found *AgentNode) { + if found.Deducted { + panic(errors.New("CalculateDeduction found node, can not be deducted")) + } + for _, stat := range found.Stats { + pRule := GetMergedRule(channelMap, ruleMap, found.ChannelInfo.ParentAgent, stat.AppId) + sRule := ruleMap.GetRule(stat.Channel, stat.AppId) + stat.DeductedStat = DeductionChannelStat(stat, pRule, sRule) + } + found.Deducted = true + } + traverse(s, deduction) + return nil +} + +func DeductionChannelStat(stat *AgentChannelStat, parentRule, selfRule *AgentChannelRule) *proto.AgentDeductedStat { + proxyDeductionTime, _ := time.ParseInLocation("2006-01-02", "2021-10-28", time.Local) + base := &proto.AgentDeductedStat{ + Channel: stat.Channel, + AppId: stat.AppId, + SumDate: stat.SumDate, + DirectCount: stat.ValidDirectCount, + DirectCountChild: stat.ChildValidDirectCount, + DirectCountSelf: stat.ValidDirectCount - stat.ChildValidDirectCount, + Recharge: stat.ValidPayMoney, + RechargeChild: stat.ChildValidPayMoney, + RechargeSelf: stat.ValidPayMoney - stat.ChildValidPayMoney, + Settlement: stat.Settlement, + CPSRate: stat.CPSRate, + CPAPrice: stat.CPAPrice, + DivideRate: stat.DivideRate, + UpdatedAt: stat.UpdatedAt, + } + if selfRule == nil { + if base.DivideRate == 0 { + base.DivideRate = 100 + } + return base + } + rule := MergedRule(parentRule, selfRule) + if GlobalAgentChannelSummaryMode == AgentChannelSummaryModeFollowRecord { + rule.CPSRate = stat.CPSRate + rule.CPAPrice = stat.CPAPrice + if base.Settlement == "" { + base.Settlement = rule.Settlement + } + } else { + base.CPSRate = rule.CPSRate + base.CPAPrice = rule.CPAPrice + base.Settlement = rule.Settlement + } + base.DivideRate = selfRule.DivideRate + if base.DivideRate == 0 { + base.DivideRate = 100 + } + // 首先进行根代理扣量 + if rule.ProxyDeduction > 0 && rule.ProxyDeduction < 100 && base.SumDate.After(proxyDeductionTime) { + base.DirectCount = base.DirectCount * rule.ProxyDeduction / 100 + base.DirectCountChild = base.DirectCountChild * rule.ProxyDeduction / 100 + base.Recharge = base.Recharge*rule.ProxyDeduction/100 - (base.Recharge*rule.ProxyDeduction/100)%1000 + base.RechargeChild = base.RechargeChild*rule.ProxyDeduction/100 - (base.RechargeChild*rule.ProxyDeduction/100)%1000 + } + // 按上级代理对该代理设置的分成比例进行扣量 + if rule.DivideRateBP > 0 && rule.DivideRateBP < 10000 { + base.DirectCount = base.DirectCount * rule.DivideRateBP / 10000 + base.DirectCountChild = base.DirectCountChild * rule.DivideRateBP / 10000 + base.Recharge = base.Recharge * rule.DivideRateBP / 10000 + base.RechargeChild = base.RechargeChild * rule.DivideRateBP / 10000 + } + // 再计算收益 + if rule.Settlement == channelmod.SettlementCPA { + base.Income = base.DirectCount * rule.CPAPrice + base.IncomeChild = base.DirectCountChild * rule.CPAPrice + } else if rule.Settlement == channelmod.SettlementCPS { + base.Income = (base.Recharge * rule.CPSRate) / 100 + base.IncomeChild = (base.RechargeChild * rule.CPSRate) / 100 + } else if rule.Settlement == channelmod.SettlementCPT { + base.Income = base.DirectCount * rule.CPAPrice + base.IncomeChild = base.DirectCountChild * rule.CPAPrice + } + // 统计子代理数据 + base.IncomeSelf = base.Income - base.IncomeChild + base.DirectCountSelf = base.DirectCount - base.DirectCountChild + base.RechargeSelf = base.Recharge - base.RechargeChild + for _, child := range stat.ChildChannelStats { + base.ChildRebate += child.DeductedStat.Income + } + return base +} + +func AccumulateChildAgentChannelStatToParent(parent, child *AgentChannelStat) { + channelmod.ChannelStatSummation(&parent.ChannelStat, &child.ChannelStat) + // 子渠道累计 + parent.ChildValidPayMoney += child.VipPayMoney + parent.ChildValidDirectCount += child.NewDirectCount + parent.ChildChannelStats = append(parent.ChildChannelStats, child) +} diff --git a/service/agentSer/repair.go b/service/agentSer/repair.go new file mode 100644 index 0000000..53d7e07 --- /dev/null +++ b/service/agentSer/repair.go @@ -0,0 +1,51 @@ +package agentSer + +import ( + "context" + "go.mongodb.org/mongo-driver/bson" + "stat/common/log" + "stat/common/utils" + "stat/models/channelmod" +) + +func RepairData() { + wg := utils.NewWaitGroup() + wg.Add(func() { + ctx := context.Background() + if err := FixChannelSecondParentAgent(ctx); err != nil { + log.Error("fix data err", log.E(err)) + } + }) + go wg.RunWaits() +} + +func FixChannelSecondParentAgent(ctx context.Context) error { + filter := bson.M{ + channelmod.FN.ChannelInfo.Type: channelmod.ChannelTypeSecond, + "$or": bson.A{ + bson.M{channelmod.FN.ChannelInfo.ParentAgent: bson.M{"$eq": nil}}, + bson.M{channelmod.FN.ChannelInfo.ParentAgent: bson.M{"$exists": false}}, + bson.M{channelmod.FN.ChannelInfo.ParentAgent: bson.M{"$eq": ""}}, + }, + channelmod.FN.ChannelInfo.ParentChannel: bson.M{"$gt": ""}, + } + count, err := channelmod.CountChannelInfos(ctx, filter) + if err != nil { + return err + } + if count == 0 { + return nil + } + // 修复 + channels, err := channelmod.FindManyChannelInfo(ctx, filter) + for _, channel := range channels { + filter := bson.M{channelmod.FN.ChannelInfo.Channel: channel.Channel} + update := bson.M{"$set": bson.M{ + channelmod.FN.ChannelInfo.ParentAgent: channel.ParentChannel, + }} + if err = channelmod.UpdateOneChannelInfo(ctx, filter, update); err != nil { + return err + } + } + return nil +} diff --git a/service/agentSer/rule.go b/service/agentSer/rule.go new file mode 100644 index 0000000..64c5133 --- /dev/null +++ b/service/agentSer/rule.go @@ -0,0 +1,129 @@ +package agentSer + +import ( + "context" + "fmt" + "stat/models/channelmod" + + "go.mongodb.org/mongo-driver/bson" +) + +type RuleMap map[string]*AgentChannelRule + +type AgentChannelRule struct { + channelmod.ChannelDeductionRule + DivideRateBP int64 // 分成比列(万分比) +} + +func (c RuleMap) GetRule(channel string, appId int32) *AgentChannelRule { + key := fmt.Sprintf("%s %d", channel, appId) + return c[key] +} + +func (c RuleMap) SetRule(rule *AgentChannelRule) { + key := fmt.Sprintf("%s %d", rule.Channel, rule.AppId) + c[key] = rule +} + +func GetMergedRule(channelMap ChannelMap, ruleMap RuleMap, channel string, appId int32) *AgentChannelRule { + rules := make([]*AgentChannelRule, 0) + cInfo := channelMap[channel] + for cInfo != nil { + rule := ruleMap.GetRule(cInfo.Channel, appId) + if rule != nil { + rules = append(rules, rule) + } + if cInfo.ParentAgent != "" { + cInfo = channelMap[cInfo.ParentAgent] + } else { + cInfo = nil + } + } + if len(rules) == 0 { + return nil + } + for i, j := 0, len(rules)-1; i < j; i, j = i+1, j-1 { + rules[i], rules[j] = rules[j], rules[i] + } + base := *rules[0] // 沿用父渠道代理扣量规则 + rules = rules[1:] + + for _, rule := range rules { + base.AppType = rule.AppType + base.PromoteMode = rule.PromoteMode + base.CPSRate = rule.CPSRate + base.CPAPrice = MinInt64(base.CPAPrice, rule.CPAPrice) // 取最小的CPA价格 + base.DivideRate = base.DivideRate * rule.DivideRate / 100 + base.DivideRateBP = (base.DivideRateBP * rule.DivideRateBP) / 10000 + } + return &base +} + +func MergedRule(parent, self *AgentChannelRule) *AgentChannelRule { + if parent != nil && self != nil { + rule := *self + //rule.CPSRate //CPSRate not change + rule.AppType = parent.AppType + rule.PromoteMode = parent.PromoteMode + rule.CPAPrice = MinInt64(rule.CPAPrice, parent.CPAPrice) // 取最小的CPA价格 + rule.DivideRate = rule.DivideRate * parent.DivideRate / 100 + rule.DivideRateBP = (rule.DivideRateBP * parent.DivideRateBP) / 10000 + rule.ProxyDeduction = parent.ProxyDeduction // 传递父渠道代理扣量到子渠道 + return &rule + } else if parent != nil && self == nil { + rule := *parent + return &rule + } else if parent == nil && self != nil { + rule := *self + return &rule + } + return nil +} + +func MakeChannelAndRuleMap(ctx context.Context, channelInfo *channelmod.ChannelInfo) (ChannelMap, RuleMap, error) { + var err error + ruleMap := make(RuleMap) + channelMap := make(ChannelMap) + var channelTop string + if channelInfo.Type.IsTop() { + channelTop = channelInfo.Channel + } else { + channelTop = channelInfo.ParentChannel + } + filter := bson.M{ + "$or": bson.A{ + bson.M{channelmod.FN.ChannelInfo.Channel: channelTop}, + bson.M{channelmod.FN.ChannelInfo.ParentChannel: channelTop}, + }, + } + channelList, err := channelmod.FindManyChannelInfo(ctx, filter) + if err != nil { + return nil, nil, err + } + for _, c := range channelList { + channelMap[c.Channel] = c + } + channels := make([]string, 0) + channelInfos := channelMap.GetAncestorAndOffspringChannels(channelInfo.Channel) + for _, info := range channelInfos { + channels = append(channels, info.Channel) + } + rules, err := channelmod.FindManyChannelDeductionRule(ctx, bson.M{channelmod.FN.ChannelDeductionRule.Channel: bson.M{"$in": channels}}) + if err != nil { + return nil, nil, err + } + for _, item := range rules { + item.CPAPrice = EnsureRangeInt64(item.CPAPrice, 0, 10000) + item.CPSRate = EnsureRangeInt64(item.CPSRate, 0, 100) + item.DivideRate = EnsureRangeInt64(item.DivideRate, 0, 100) + if item.DivideRate == 0 { + item.DivideRate = 100 + } + rule := &AgentChannelRule{ + ChannelDeductionRule: *item, + DivideRateBP: EnsureRangeInt64(item.DivideRate, 0, 100) * 100, + } + ruleMap.SetRule(rule) + } + return channelMap, ruleMap, nil +} diff --git a/service/agentSer/summary.go b/service/agentSer/summary.go new file mode 100644 index 0000000..daa2108 --- /dev/null +++ b/service/agentSer/summary.go @@ -0,0 +1,290 @@ +package agentSer + +import ( + "context" + "sort" + "stat/api/proto" + "stat/models/channelmod" + "time" + + "github.com/jinzhu/now" + "go.mongodb.org/mongo-driver/bson" +) + +type AgentSummary struct { + StartTime *time.Time + EndTime *time.Time + AppId *int32 + FilterChannel *string + ChannelInfo *channelmod.ChannelInfo + ChannelMap ChannelMap + RuleMap RuleMap + AppMap AppMap + StatMap SourceAgentStatMap + SelfAgent *AgentNode + SelfStats []*proto.AgentDeductedStat + ChildStats []*proto.AgentDeductedStat + StatTotal *proto.AgentDeductedStat +} + +func GetAgentSummary(ctx context.Context, selfChannel string, childChannel *string, appId *int32, start, end *time.Time) (*AgentSummary, error) { + summary := AgentSummary{ + AppId: appId, + StartTime: start, + EndTime: end, + FilterChannel: childChannel, + SelfStats: make([]*proto.AgentDeductedStat, 0), + ChildStats: make([]*proto.AgentDeductedStat, 0), + AppMap: make(AppMap), + } + // 获取app信息字典 + appMap, err := GetAppMap(ctx) + if err != nil { + return nil, err + } + summary.AppMap = appMap + // 获取渠道信息和统计信息 + channelInfo, statDict, err := GetAllAgentStatDict(ctx, selfChannel, appId, start, end) + if err != nil { + return nil, err + } + summary.ChannelInfo = channelInfo + summary.StatMap = statDict + // 获取顶层节点 + rootAgent, err := GetRootAgentNode(ctx, channelInfo, childChannel, statDict) + if err != nil { + return nil, err + } + summary.SelfAgent = rootAgent + // 获取渠道列表扣量规则字典 + channelMap, ruleMap, err := MakeChannelAndRuleMap(ctx, channelInfo) + if err != nil { + return nil, err + } + summary.ChannelMap = channelMap + summary.RuleMap = ruleMap + // 添加子渠道节点 + if err := rootAgent.AddChildNodes(statDict, channelMap); err != nil { + return nil, err + } + // 累计子渠道到上级渠道 + if err := rootAgent.AccumulateChildNodes(ruleMap); err != nil { + return nil, err + } + // 计算扣量 + if err := rootAgent.CalculateDeduction(channelMap, ruleMap); err != nil { + return nil, err + } + for _, stat := range rootAgent.Stats { + summary.SelfStats = append(summary.SelfStats, stat.DeductedStat) + } + for _, agent := range rootAgent.Children { + for _, stat := range agent.Stats { + summary.ChildStats = append(summary.ChildStats, stat.DeductedStat) + } + } + // 统计总量 + base := &AgentChannelStat{ + DeductedStat: &proto.AgentDeductedStat{}, + } + for _, item := range rootAgent.Stats { + AccumulateAgentChannelStat(base, item, true) + } + summary.StatTotal = base.DeductedStat + return &summary, nil +} + +func (a *AgentSummary) GetAgentStats(outType OutputStatListType, pageNum int64, pageSize int64) (int64, []*proto.AgentDeductedStat) { + totalAgentStatList := make(AgentDeductedStatList, 0) + switch outType { + case OutputStatListTypeSelf: + totalAgentStatList = append(totalAgentStatList, a.SelfStats...) + case OutputStatListTypeChild: + totalAgentStatList = append(totalAgentStatList, a.ChildStats...) + default: + totalAgentStatList = append(totalAgentStatList, a.SelfStats...) + totalAgentStatList = append(totalAgentStatList, a.ChildStats...) + } + childChannel := a.FilterChannel + if childChannel != nil { // 如果存在渠道过滤 + outAgentStatList := make([]*proto.AgentDeductedStat, 0) + for _, item := range totalAgentStatList { + if item.Channel == *childChannel { + outAgentStatList = append(outAgentStatList, item) + } + } + totalAgentStatList = outAgentStatList + } + // 处理排序 + sort.Sort(totalAgentStatList) + // 处理分页输出 + list := GetAgentChannelStatListPageData(totalAgentStatList, pageNum, pageSize) + // 添加app名字 + for _, item := range list { + item.AppName = a.AppMap.GetAppName(item.AppId) + if item.Channel == a.ChannelInfo.Channel { + item.DivideRate = 100 + } + if item.Settlement == channelmod.SettlementCPA && !CPA_SHOW_MONEY { + item.Recharge = 0 + item.RechargeSelf = 0 + item.RechargeChild = 0 + } + if item.Settlement == channelmod.SettlementCPS && !CPS_SHOW_COUNT { + item.DirectCount = 0 + item.DirectCountSelf = 0 + item.DirectCountChild = 0 + } + } + return int64(len(totalAgentStatList)), list +} + +func (a *AgentSummary) GetAgentSummaryStats(outType OutputStatListType, pageNum int64, pageSize int64) (int64, proto.AgentSummaryStatHomeList) { + totalAgentStatList := make(AgentDeductedStatList, 0) + channelList := make([]*channelmod.ChannelInfo, 0) + switch outType { + case OutputStatListTypeSelf: + channelList = append(channelList, a.SelfAgent.ChannelInfo) + totalAgentStatList = append(totalAgentStatList, a.SelfStats...) + case OutputStatListTypeChild: + for _, node := range a.SelfAgent.Children { + channelList = append(channelList, node.ChannelInfo) + } + totalAgentStatList = append(totalAgentStatList, a.ChildStats...) + default: + channelList = append(channelList, a.SelfAgent.ChannelInfo) + for _, node := range a.SelfAgent.Children { + channelList = append(channelList, node.ChannelInfo) + } + totalAgentStatList = append(totalAgentStatList, a.SelfStats...) + totalAgentStatList = append(totalAgentStatList, a.ChildStats...) + } + // 按渠道进行汇总 + summaryList := make(proto.AgentSummaryStatHomeList, 0) + for _, channel := range channelList { + summary := &proto.AgentSummaryStatHome{ + Channel: channel.Channel, + ParentAgent: channel.ParentAgent, + ChildCount: channel.ChildCount, + TotalStat: &proto.StatDataDetail{}, + TodayStat: &proto.StatDataDetail{}, + WeekStat: &proto.StatDataDetail{}, + MonthStat: &proto.StatDataDetail{}, + YearStat: &proto.StatDataDetail{}, + } + summaryList = append(summaryList, summary) + } + // 统计日周月年数据 + nowTime := time.Now() + for _, summary := range summaryList { + for _, stat := range totalAgentStatList { + if summary.Channel == stat.Channel { + AccumulateSummaryStat(summary, stat, nowTime, true) + } + } + } + // 处理排序,收益多的靠前 + sort.Sort(summaryList) + // 处理分页输出 + list := GetAgentSummaryStatListPageData(summaryList, pageNum, pageSize) + // 添加app名字,CAP屏蔽充值,CPS屏蔽新增 + for _, item := range list { + item.AppName = a.AppMap.GetAppName(item.AppId) + if item.Channel == a.ChannelInfo.Channel { + item.DivideRate = 100 + } + } + return int64(len(summaryList)), list +} + +func AccumulateSummaryStat(base *proto.AgentSummaryStatHome, stat *proto.AgentDeductedStat, today time.Time, ruleData bool) { + // 时间范围 + now.WeekStartDay = time.Monday + Now := now.With(today.In(time.Local)) + todayBegin := Now.BeginningOfDay() + todayEnd := Now.EndOfDay() + weekBegin := Now.BeginningOfWeek() + monthBegin := Now.BeginningOfMonth() + yearBegin := Now.BeginningOfYear() + // 复制信息 + base.AppId = stat.AppId + base.AppName = stat.AppName + base.Settlement = stat.Settlement + base.CPAPrice = stat.CPAPrice + base.CPSRate = stat.CPSRate + base.DivideRate = stat.DivideRate + // 全部数据累加 + AccumulateStatData(base.TotalStat, stat, ruleData) + if (stat.SumDate.Equal(todayBegin) || stat.SumDate.After(todayBegin)) && (stat.SumDate.Equal(todayEnd) || stat.SumDate.Before(todayEnd)) { + AccumulateStatData(base.TodayStat, stat, ruleData) + } + if (stat.SumDate.Equal(weekBegin) || stat.SumDate.After(weekBegin)) && (stat.SumDate.Equal(todayEnd) || stat.SumDate.Before(todayEnd)) { + AccumulateStatData(base.WeekStat, stat, ruleData) + } + if (stat.SumDate.Equal(monthBegin) || stat.SumDate.After(monthBegin)) && (stat.SumDate.Equal(todayEnd) || stat.SumDate.Before(todayEnd)) { + AccumulateStatData(base.MonthStat, stat, ruleData) + } + if (stat.SumDate.Equal(yearBegin) || stat.SumDate.After(yearBegin)) && (stat.SumDate.Equal(todayEnd) || stat.SumDate.Before(todayEnd)) { + AccumulateStatData(base.YearStat, stat, ruleData) + } +} + +func GetAgentChannelStatListPageData(list []*proto.AgentDeductedStat, pageNum int64, pageSize int64) []*proto.AgentDeductedStat { + start, end := GetPageRange(len(list), int(pageNum), int(pageSize)) + return list[start:end] +} + +func GetAgentSummaryStatListPageData(list proto.AgentSummaryStatHomeList, pageNum int64, pageSize int64) proto.AgentSummaryStatHomeList { + start, end := GetPageRange(len(list), int(pageNum), int(pageSize)) + return list[start:end] +} + +func GetAllAgentStatDict(ctx context.Context, channel string, appId *int32, startTime, endTime *time.Time) (*channelmod.ChannelInfo, SourceAgentStatMap, error) { + // 获取渠道信息 + checkFilter := bson.M{channelmod.FN.ChannelInfo.Channel: channel} + channelInfo, err := channelmod.FindOneChannelInfo(ctx, checkFilter) + if err != nil || channelInfo.Channel != channel { + return nil, nil, err + } + // 获取一级渠道的所有子孙数据 + var channelTop string + if channelInfo.Type.IsTop() { + channelTop = channelInfo.Channel + } else { + channelTop = channelInfo.ParentChannel + } + srcfilter := bson.M{ + channelmod.FN.ChannelStat.Type: bson.M{"$gte": channelInfo.Type}, + "$or": bson.A{ + bson.M{channelmod.FN.ChannelStat.Channel: channelTop}, + bson.M{channelmod.FN.ChannelStat.ParentChannel: channelTop}, + }} + if appId != nil { + srcfilter[channelmod.FN.ChannelStat.AppId] = *appId + } + if startTime != nil && endTime != nil { + srcfilter[channelmod.FN.ChannelStat.SumDate] = bson.M{"$gte": *startTime, "$lte": *endTime} + } + srcList, err := channelmod.FindManyChannelStat(ctx, srcfilter) + if err != nil { + return nil, nil, err + } + srcDict := make(SourceAgentStatMap) + types := channelmod.GetAllChannelTypes() + for _, t := range types { + srcDict[t] = make(map[string]ChannelAgentStatList) + } + for _, stat := range srcList { + stat.CorrectValidData() + stat.CalcIncomeRate() + aStat := &AgentChannelStat{ + ChannelStat: *stat, + ChildValidDirectCount: 0, + ChildValidPayMoney: 0, + ChildChannelStats: make([]*AgentChannelStat, 0), + } + srcDict[stat.Type][stat.Channel] = append(srcDict[stat.Type][stat.Channel], aStat) + } + + return channelInfo, srcDict, nil +} diff --git a/service/announInfoSer/announInfo.go b/service/announInfoSer/announInfo.go new file mode 100644 index 0000000..28d1217 --- /dev/null +++ b/service/announInfoSer/announInfo.go @@ -0,0 +1,152 @@ +package announInfoSer + +import ( + "context" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/announInfoMod" + "stat/models/appInfoMod" +) + +// 获取广告列表 +func ListAnnoun(ctx context.Context, param proto.ListAnnounReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListAnnounRes{ + Total: 0, + List: make([]proto.AnnounInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + + // 获取广告位置信息 + total, aList, err := announInfoMod.FindAnnounceList(ctx, param.AppId, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + resp.Total = total + + // 获取app信息 + appIds := make([]int32, 0) + for _, v := range aList { + 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 aList { + appName := "" + if appInfo, ok := appMap[v.AppId]; ok { + appName = appInfo.Name + } + + tmp := proto.AnnounInfo{ + ID: v.ID.Hex(), + AppId: v.AppId, + AppName: appName, + Title: v.Title, + Content: v.Content, + Cover: v.Cover, + Href: v.Href, + Type: v.Type, + Active: v.Active, + StartTime: v.StartTime, + EndTime: v.EndTime, + } + + resp.List = append(resp.List, tmp) + } + + code = stdLog.Success + data = resp + return +} + +// 新增广告 +func AddAnnounce(ctx context.Context, param proto.AddAnnounReq) (code stdLog.CodeType, data interface{}, err error) { + doc := announInfoMod.AnnounInfo{ + AppId: *param.AppId, + Title: *param.Title, + Content: *param.Content, + Cover: *param.Cover, + Href: *param.Href, + Type: *param.Type, + Active: *param.Active, + StartTime: *param.StartTime, + EndTime: *param.EndTime, + } + + if err = announInfoMod.AddAnnounce(ctx, &doc); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 修改广告位置 +func UpdateAnnounce(ctx context.Context, param proto.UpdateAnnounReq) (code stdLog.CodeType, data interface{}, err error) { + doc := announInfoMod.UpdateDoc{ + AppId: param.AppId, + Title: param.Title, + Content: param.Content, + Cover: param.Cover, + Href: param.Href, + Type: param.Type, + Active: param.Active, + StartTime: param.StartTime, + EndTime: param.EndTime, + } + if err = announInfoMod.UpdateAnnounce(ctx, *param.Id, doc); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 删除广告 +func DelAnnounce(ctx context.Context, param proto.DelAnnounReq) (code stdLog.CodeType, data interface{}, err error) { + if err = announInfoMod.DelAnnounce(ctx, *param.Id); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 外部获取广告 +func GetAnnounce(ctx context.Context, param proto.AnnouncementReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.AnnouncementRes{AnnounceList: make([]proto.AnnouncementInfo, 0)} + + aList, err := announInfoMod.FindAnnounceByAppId(ctx, *param.AppId) + if err != nil { + code = stdLog.Failure + return + } + for _, v := range aList { + resp.AnnounceList = append(resp.AnnounceList, proto.AnnouncementInfo{ + ID: v.ID.Hex(), + Title: v.Title, + Content: v.Content, + Cover: v.Cover, + Href: v.Href, + Type: v.Type, + }) + } + + data = resp + code = stdLog.Success + return +} diff --git a/service/appInfoSer/appInfo.go b/service/appInfoSer/appInfo.go new file mode 100644 index 0000000..ce64753 --- /dev/null +++ b/service/appInfoSer/appInfo.go @@ -0,0 +1,108 @@ +package appInfoSer + +import ( + "context" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/appInfoMod" + "time" +) + +// 获取appInfo列表 +func GetAppInfoList(ctx context.Context, param proto.ListAppInfoReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListAppInfoRes{ + Total: 0, + List: make([]proto.AppInfoRes, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + + total, aList, err := appInfoMod.GetAppInfoList(ctx, param.AppName, param.Used, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range aList { + tmp := proto.AppInfoRes{ + AppId: v.AppId, + Name: v.Name, + LandPages: v.LandPages, + IconImg: v.IconImg, + CreatedAt: v.CreatedAt, + AdvertiseNum: v.AdvertiseNum, + AdvertiseNewNum: v.AdvertiseNewNum, + UpdatedAt: v.UpdatedAt, + } + + resp.List = append(resp.List, tmp) + } + + resp.Total = total + + data = resp + code = stdLog.Success + return +} + +// 添加appInfo +func AddAppInfo(ctx context.Context, param proto.AddAppInfoReq) (code stdLog.CodeType, data interface{}, err error) { + _, serr := appInfoMod.GetAppInfoById(ctx, *param.AppId) + if serr != nil { + return stdLog.AppExistErr, nil, serr + } + + now := time.Now() + doc := appInfoMod.AppInfo{ + AppId: *param.AppId, + Name: *param.Name, + IconImg: *param.IconImg, + // LandPages: *param.LandPages, + Used: true, + AdvertiseNum: 5, + AdvertiseNewNum: 5, + CreatedAt: now, + UpdatedAt: now, + } + + if err = appInfoMod.AddAppInfo(ctx, &doc); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 更新appInfo +func UpdateAppInfo(ctx context.Context, param proto.UpdateAppInfoReq) (code stdLog.CodeType, data interface{}, err error) { + now := time.Now() + doc := appInfoMod.AppInfoUpdate{ + Name: param.Name, + LandPages: param.LandPages, + IconImg: param.IconImg, + UpdatedAt: &now, + AdvertiseNum: param.AdvertiseNum, + AdvertiseNewNum: param.AdvertiseNewNum, + } + + if err = appInfoMod.UpdateAppInfo(ctx, *param.AppId, doc); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 删除appInfo +func DelAppInfo(ctx context.Context, param proto.DelAppInfoReq) (code stdLog.CodeType, data interface{}, err error) { + if err = appInfoMod.DelAppInfo(ctx, *param.AppId); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} diff --git a/service/appInfoSer/landPageConfig.go b/service/appInfoSer/landPageConfig.go new file mode 100644 index 0000000..5f68a53 --- /dev/null +++ b/service/appInfoSer/landPageConfig.go @@ -0,0 +1,158 @@ +package appInfoSer + +import ( + "context" + "stat/api/proto" + "stat/common/genId" + "stat/common/stdLog" + "stat/models/landPageConfig" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// GetLandPageConfigList +func GetLandPageConfigList(ctx context.Context, param *proto.FindLandPageConfigReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.LandPageConfigListResp{ + Total: 0, + List: make(landPageConfig.LandPageConfigList, 0), + } + + filter := bson.M{} + if param.Status != nil { + filter[landPageConfig.FN.LandPageConfig.Status] = *param.Status + } + if param.AppId != nil { + filter[landPageConfig.FN.LandPageConfig.AppId] = *param.AppId + } + if param.Type != nil { + filter[landPageConfig.FN.LandPageConfig.LandPageType] = *param.Type + } + + total, err := landPageConfig.CountLandPageConfigs(ctx, filter) + if err != nil { + code = stdLog.Failure + return + } + opt := &options.FindOptions{} + opt.SetSort(bson.D{ + {landPageConfig.FN.LandPageConfig.Rank, -1}, + {landPageConfig.FN.LandPageConfig.CreateAt, -1}, + }) + opt.SetLimit(param.PageSize) + opt.SetSkip((param.PageNum - 1) * param.PageSize) + list, err := landPageConfig.FindManyLandPageConfig(ctx, filter, opt) + if err != nil { + code = stdLog.Failure + return + } + + resp.List = list + resp.Total = total + + data = resp + code = stdLog.Success + return +} + +// AddLandPageConfig +func AddLandPageConfig(ctx context.Context, param *proto.AddLandPageConfigReq) (code stdLog.CodeType, data interface{}, err error) { + now := time.Now() + doc := &landPageConfig.LandPageConfig{ + Id: genId.GetLandpageConfigId(), + AppId: *param.AppId, + LandPageType: *param.LandPageType, + Title: *param.Title, + CreateAt: now, + UpdateAt: now, + } + if param.Desc != nil { + doc.Desc = *param.Desc + } + if param.Actor != nil { + doc.Actor = *param.Actor + } + if param.Bango != nil { + doc.Bango = *param.Bango + } + if param.AddedTime != nil { + doc.AddedTime = *param.AddedTime + } + if param.Picture != nil { + doc.Picture = *param.Picture + } + if param.Media != nil { + doc.Media = *param.Media + } + if param.Rank != nil { + doc.Rank = *param.Rank + } + if param.Status != nil { + doc.Status = *param.Status + } + if err = landPageConfig.InsertOneLandPageConfig(ctx, doc); err != nil { + code = stdLog.Failure + return + } + code = stdLog.Success + return +} + +// UpdateLandPageConfig +func UpdateLandPageConfig(ctx context.Context, param *landPageConfig.LandPageConfig) (code stdLog.CodeType, data interface{}, err error) { + now := time.Now() + param.UpdateAt = now + updateDoc := bson.M{"$set": param} + if err = landPageConfig.UpdateOneLandPageConfig(ctx, bson.M{ + landPageConfig.FN.LandPageConfig.Id: param.Id, + }, updateDoc); err != nil { + code = stdLog.Failure + return + } + code = stdLog.Success + return +} + +// DelLandPageConfig +func DelLandPageConfig(ctx context.Context, param *proto.DelLandPageConfigReq) (code stdLog.CodeType, data interface{}, err error) { + if _, err = landPageConfig.DelOneLandPageConfig(ctx, bson.M{ + landPageConfig.FN.LandPageConfig.Id: param.ID, + }); err != nil { + code = stdLog.Failure + return + } + code = stdLog.Success + return +} + +// GetLandPageConfigByType +func GetLandPageConfigByType(ctx context.Context, param *proto.GetLandPageConfigByTypeReq) (code stdLog.CodeType, data interface{}, err error) { + opt := &options.FindOptions{} + if param.AppId == 0 { + code = stdLog.Failure + return + } + opt.SetSort(bson.D{ + {landPageConfig.FN.LandPageConfig.Rank, -1}, + {landPageConfig.FN.LandPageConfig.CreateAt, -1}, + }) + opt.SetSkip((param.PageNum - 1) * param.PageSize) + opt.SetLimit(param.PageSize) + // param.AppId = 888 + // param.Type = 2 + // param.PageNum = 1 + // param.PageSize = 10 + if data, err = landPageConfig.FindManyLandPageConfig(ctx, bson.M{ + landPageConfig.FN.LandPageConfig.Status: true, + landPageConfig.FN.LandPageConfig.AppId: param.AppId, + landPageConfig.FN.LandPageConfig.LandPageType: param.Type, + }, opt); err != nil { + //fmt.Println(param, err) + code = stdLog.Failure + return + } + //fmt.Println("******", param, err) + code = stdLog.Success + return +} diff --git a/service/appInfoSer/landingpage.go b/service/appInfoSer/landingpage.go new file mode 100644 index 0000000..fd7f09b --- /dev/null +++ b/service/appInfoSer/landingpage.go @@ -0,0 +1,109 @@ +package appInfoSer + +import ( + "context" + "stat/api/proto" + "stat/common/genId" + "stat/common/stdLog" + "stat/common/utils" + + "stat/models/landingPage" + "time" +) + +// 获取LandingPage列表 +func GetLandingPageList(ctx context.Context, param proto.FindLandingPageReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.LandingPageListRes{ + Total: 0, + List: make([]proto.LandingPageInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + + total, aList, err := landingPage.FindLandingPageList(ctx, param.AppId, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range aList { + tmp := proto.LandingPageInfo{ + ID: v.ID, + AppId: v.AppId, + Url: v.Url, + Status: v.Status, + Type: v.Type, + ChannelCode: v.ChannelCode, + Remark: v.Remark, + } + + resp.List = append(resp.List, tmp) + } + + resp.Total = total + + data = resp + code = stdLog.Success + return +} + +// 添加LandingPage +func AddLandingPage(ctx context.Context, param proto.AddLandingPageReq) (code stdLog.CodeType, data interface{}, err error) { + now := time.Now() + doc := landingPage.LandingPage{ + ID: genId.GetNextLandingpageId(), + AppId: *param.AppId, + Url: *param.Url, + Status: *param.Status, + Type: *param.Type, + CreatedAt: now, + UpdatedAt: now, + } + if param.ChannelCode != nil { + doc.ChannelCode = *param.ChannelCode + } + + if param.Remark != nil { + doc.Remark = *param.Remark + } + + if _, err = landingPage.AddLandingPage(ctx, &doc); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 更新LandingPage +func UpdateLandingPage(ctx context.Context, param proto.UpdateLandingPageReq) (code stdLog.CodeType, data interface{}, err error) { + now := time.Now() + doc := landingPage.UpdateDoc{ + Url: param.Url, + Status: param.Status, + Remark: param.Remark, + ChannelCode: param.ChannelCode, + Type: param.Type, + UpdatedAt: &now, + } + + if err = landingPage.UpdateLandingPage(ctx, param.ID, doc); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 删除LandingPage +func DelLandingPage(ctx context.Context, param proto.DelLandingPageReq) (code stdLog.CodeType, data interface{}, err error) { + if err = landingPage.DelLandingPage(ctx, param.ID); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} diff --git a/service/applicationser/application.go b/service/applicationser/application.go new file mode 100644 index 0000000..90884a6 --- /dev/null +++ b/service/applicationser/application.go @@ -0,0 +1,345 @@ +package applicationser + +import ( + "context" + "stat/api/proto" + "stat/common/log" + "stat/common/redis" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/appcategory" + "stat/models/applicationLocMod" + "stat/models/applicationmod" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 外部获取配置应用 +func GetApplication(ctx context.Context, req proto.CenterApplicationReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.CenterApplicationRes{ + List: make([]*proto.CenterApplication, 0), + AppCategoryList: make([]*proto.CenterAppCategory, 0)} + + list, err := applicationmod.FindAppByAppId(ctx, req.ParentAppId) + if err != nil { + code = stdLog.AppDbError + return + } + + filter := bson.M{"parentAppId": req.ParentAppId, "status": true} + //filter := bson.M{"status": true} + + sort := bson.D{{Key: "rank", Value: -1}} + + opt := options.Find().SetSort(sort) + + categorylist, serr := appcategory.FindManyAppCategory(ctx, filter, opt) + if serr != nil { + code = stdLog.AppCategoryDbError + return + } + + if len(list) > 0 { + for _, info := range list { + app := &proto.CenterApplication{ + Id: info.Id, + AppId: info.AppId, + ParentAppId: info.ParentAppId, + Name: info.Name, + //Tag: info.Tag, + Internal: info.Internal, + Categories: info.Categories, + Desc: info.Desc, + DownloadUrl: info.DownloadUrl, + IosUrl: info.IosUrl, + AndroidUrl: info.AndroidUrl, + Avatar: info.Avatar, + Status: info.Status, + Rank: info.Rank, + Total: info.Total, + CreatedId: info.CreatedId, + UpdatedId: info.UpdatedId, + CreatedAt: info.CreatedAt, + UpdatedAt: info.UpdatedAt, + IsGame: info.IsGame, + IsRecommend: info.IsRecommend, + NineShow: info.NineShow, + RecreationShow: info.RecreationShow, + HomeShow: info.HomeShow, + LocIds: info.LocIds, + SmallImg: info.SmallImg, + BigImg: info.BigImg, + IsHighQuality: info.IsHighQuality, + HighQualityType: info.HighQualityType, + } + resp.List = append(resp.List, app) + } + } + + if len(categorylist) > 0 { + for _, info := range categorylist { + app := &proto.CenterAppCategory{ + Id: info.Id, + ParentAppId: info.ParentAppId, + Name: info.Name, + Desc: info.Desc, + Status: info.Status, + Rank: info.Rank, + CreatedAt: info.CreatedAt, + UpdatedAt: info.UpdatedAt, + ImgType: info.ImgType, + } + resp.AppCategoryList = append(resp.AppCategoryList, app) + } + } + data = resp + code = stdLog.Success + return +} + +// IncApplicationClickCount +func IncApplicationClickCount(ctx context.Context, param *proto.ApplicationClickReq) (serr *stdLog.SrvErr) { + id, err := primitive.ObjectIDFromHex(param.Id) + if err != nil { + return stdLog.New(stdLog.ParamError, "", err.Error()) + } + _, serr = applicationmod.FindOneApplication(ctx, bson.M{"_id": id}) + if serr != nil { + return serr + } + // 写入redis + now := time.Now().Local() + set := redis.GetAppClickDaySet(now) + name := redis.GetAppClickHourName(param.Id, now.Hour()) + //name := redis.GetAppClickHourNameByAppId(application.AppId, application.ParentAppId, now.Hour()) + if _, err := set.IncInt(name, 1); err != nil { + return stdLog.New(stdLog.RedisSet, "", err.Error()) + } + // 写入db + update := bson.M{"$inc": bson.M{"total": 1}} + serr = applicationmod.UpdateOneApplication(ctx, bson.M{"_id": id}, update) + if serr != nil { + return serr + } + + return nil +} + +// AddApplication 添加应用 +func AddApplication(ctx context.Context, param *applicationmod.Application, account string) *stdLog.SrvErr { + param.Id = primitive.NewObjectID() + now := utils.Now() + param.CreatedAt = now + //param.CreatedId = userId + param.UpdatedAt = now + //param.UpdatedId = userId + err := applicationmod.InsertOneApplication(ctx, param) + if err != nil { + log.Error("AddApplication:InsertOneApplication", log.E(err)) + return err + } + CheckChange(ctx, nil, param, account) + return nil +} + +// DelApplication 删除应用 +func DelApplication(ctx context.Context, id primitive.ObjectID, account string) *stdLog.SrvErr { + filter := bson.M{"_id": id} + oldDoc, serr := applicationmod.FindOneApplication(ctx, filter) + if serr != nil { + log.Error("UpdateApplication:FindOneApplication", log.Any("id", id), log.E(serr)) + return serr + } + count, err := applicationmod.DelOneApplication(ctx, filter) + if err != nil { + log.Error("DelApplication:DelOneApplication", log.Any("appId", id), log.E(err)) + return err + } + if count == 0 { + return stdLog.New(stdLog.ErrApplicationNotExist, "", "") + } + CheckChange(ctx, oldDoc, nil, account) + return nil +} + +// UpdateApplication 更新应用 +func UpdateApplication(ctx context.Context, req *applicationmod.AppUpdate, account string) *stdLog.SrvErr { + id, err := primitive.ObjectIDFromHex(req.Id) + if err != nil { + log.Error("UpdateApplication:ObjectIDFromHex", log.Any("id", req.Id), log.E(err)) + return stdLog.New(stdLog.ParamError, "", err.Error()) + } + filter := bson.M{"_id": id} + now := utils.Now() + + oldDoc, serr := applicationmod.FindOneApplication(ctx, filter) + if serr != nil { + log.Error("UpdateApplication:FindOneApplication", log.Any("id", req.Id), log.E(serr)) + return serr + } + + doc := &applicationmod.AppUpdateInfo{ + AppId: req.Param.AppId, + ParentAppId: req.Param.ParentAppId, + Name: req.Param.Name, + DaoLiangTitle: req.Param.DaoLiangTitle, + //Tag: req.Param.Tag, + Internal: req.Param.Internal, + Categories: req.Param.Categories, + Desc: req.Param.Desc, + DownloadUrl: req.Param.DownloadUrl, + IosUrl: req.Param.IosUrl, + AndroidUrl: req.Param.AndroidUrl, + Avatar: req.Param.Avatar, + Status: req.Param.Status, + Rank: req.Param.Rank, + Total: req.Param.Total, + UpdatedAt: now, + NineShow: req.Param.NineShow, + RecreationShow: req.Param.RecreationShow, + IsGame: req.Param.IsGame, + IsRecommend: req.Param.IsRecommend, + HomeShow: req.Param.HomeShow, + LocIds: req.Param.LocIds, + SmallImg: req.Param.SmallImg, + BigImg: req.Param.BigImg, + IsHighQuality: req.Param.IsHighQuality, + HighQualityType: req.Param.HighQualityType, + StartTime: req.Param.StartTime, + EndTime: req.Param.EndTime, + } + + serr = applicationmod.UpdateOneApplication(ctx, filter, bson.M{ + "$set": doc, + }) + + if serr != nil { + log.Error("UpdateApplication:UpdateOneApplication", log.Any("id", req.Id), log.E(serr)) + return serr + } + + newDoc, serr := applicationmod.FindOneApplication(ctx, filter) + if serr != nil { + log.Error("UpdateApplication:FindOneApplication", log.Any("id", req.Id), log.E(serr)) + return serr + } + + CheckChange(ctx, oldDoc, newDoc, account) + + return nil +} + +// GetAppList 获取应用列表 +func GetAppList(ctx context.Context, param *proto.GetApplicationsReq) (*proto.GetApplicationsResp, *stdLog.SrvErr) { + filter := bson.M{} + sort := bson.M{applicationmod.FN.Application.Rank: -1} + if param.Id != nil && *param.Id != "" { + id, serr := primitive.ObjectIDFromHex(*param.Id) + if serr != nil { + return nil, stdLog.New(stdLog.ParamError, "", "id错误") + } + filter["_id"] = id + } + if param.Name != nil && *param.Name != "" { + filter["name"] = bson.M{"$regex": *param.Name} + } + if param.DaoLiangTitle != nil && *param.DaoLiangTitle != "" { + filter["daoLiangTitle"] = bson.M{"$regex": *param.DaoLiangTitle} + } + /*if param.Tag != nil && *param.Tag != 0 { + filter["tag"] = *param.Tag + } + */ + if param.Status != nil { + filter["status"] = *param.Status + } + if param.Category != nil { + filter["categories.cid"] = *param.Category + sort["categories.rank"] = 1 + } else { + sort["categories.rank"] = 1 + } + + if param.ParentAppId != nil { + filter["parentAppId"] = param.ParentAppId + } + + if len(param.LocIds) > 0 { + filter["locIds"] = bson.M{"$in": param.LocIds} + } + + if param.DownloadUrl != nil { + filter["download_url"] = *param.DownloadUrl + } + + if param.IosUrl != nil { + filter["iosUrl"] = *param.IosUrl + } + + if param.AndroidUrl != nil { + filter["androidUrl"] = *param.AndroidUrl + } + + if param.IsHighQuality != nil { + filter["isHighQuality"] = *param.IsHighQuality + } + + count, serr := applicationmod.CountApplications(ctx, filter) + if serr != nil { + log.Error("GetAppList:CountApplications", log.E(serr)) + return nil, serr + } + if count == 0 { + return &proto.GetApplicationsResp{ + List: nil, + Total: count, + }, nil + } + opt := &options.FindOptions{} + opt.SetSort(sort) + opt.SetLimit(param.PageSize) + opt.SetSkip((param.PageNum - 1) * param.PageSize) + applicationList, serr := applicationmod.FindManyApplication(ctx, filter, opt) + if serr != nil { + log.Error("GetAppList:FindManyApplication", log.E(serr)) + return nil, serr + } + // 给前端提供分类名字 + dict, serr := appcategory.GetAppCategoryIdNameMap(ctx) + if serr != nil { + return nil, serr + } + + locDict, err := applicationLocMod.GetAppLocIdNameMap(ctx) + if err != nil { + return nil, err + } + + for i, app := range applicationList { + applicationList[i].LocNames = make([]string, 0) + + if len(app.LocIds) == 0 { + applicationList[i].LocIds = make([]int64, 0) + } else { + for _, id := range app.LocIds { + if loc, ok := locDict[id]; ok { + applicationList[i].LocNames = append(applicationList[i].LocNames, loc.Name) + } + } + } + + for _, item := range app.Categories { + if category := dict[item.CID]; category != nil { + item.Name = category.Name + } + } + } + resp := &proto.GetApplicationsResp{ + List: applicationList, + Total: count, + } + return resp, nil +} diff --git a/service/applicationser/applicationLoc.go b/service/applicationser/applicationLoc.go new file mode 100644 index 0000000..aaf79c8 --- /dev/null +++ b/service/applicationser/applicationLoc.go @@ -0,0 +1,152 @@ +package applicationser + +import ( + "context" + "stat/api/proto" + "stat/common/genId" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/applicationLocMod" + "stat/models/applicationmod" + + "stat/models/appInfoMod" + "time" +) + +// 获取广告位置列表 +func ListAppLoc(ctx context.Context, param proto.ListAppLocReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListAppLocRes{ + Total: 0, + List: make([]proto.AppLocInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + + // 获取广告位置信息 + total, adsList, err := applicationLocMod.FindApplicationLocationList(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.AppLocInfo{ + 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 AddAppLoc(ctx context.Context, param proto.AddAppLocReq) (code stdLog.CodeType, data interface{}, err error) { + // 获取位置信息 + locInfo, err := applicationLocMod.FindLocationByAppIdAndLocId(ctx, *param.AppId, *param.LocId) + if err != nil || locInfo.Id > 0 { + code = stdLog.ApplicationLocExists + return + } + + adsLocId := genId.GetNextAppLocId() + now := time.Now() + + doc := applicationLocMod.ApplicationLocation{ + Id: adsLocId, + AppId: *param.AppId, + LocId: *param.LocId, + Name: *param.Name, + ImgSizeDesc: param.ImgSizeDesc, + Remark: param.Remark, + CreatedAt: now, + UpdatedAt: now, + } + + if err = applicationLocMod.AddApplicationLocation(ctx, &doc); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 修改广告位置 +func UpdateAppLoc(ctx context.Context, param proto.UpdateAppLocReq) (code stdLog.CodeType, data interface{}, err error) { + // 获取位置信息 + locInfo, err := applicationLocMod.FindLocationById(ctx, *param.Id) + if err != nil { + code = stdLog.Failure + return + } + + now := time.Now() + + doc := applicationLocMod.UpdateAppLoc{ + AppId: param.AppId, + LocId: param.LocId, + Name: param.Name, + ImgSizeDesc: param.ImgSizeDesc, + Remark: param.Remark, + UpdatedAt: &now, + } + + if err = applicationLocMod.UpdateApplicationLocation(ctx, *param.Id, doc); err != nil { + code = stdLog.Failure + return + } + + // 修改广告的位置id + if param.LocId != nil && *param.LocId != locInfo.LocId { + if err = applicationmod.UpdateLocInfo(ctx, locInfo.AppId, locInfo.LocId, *param.LocId); err != nil { + code = stdLog.Failure + return code, data, err + } + } + + code = stdLog.Success + return +} + +// 删除广告位置 +func DelAppLoc(ctx context.Context, param proto.DelAppLocReq) (code stdLog.CodeType, data interface{}, err error) { + if err = applicationLocMod.DelApplicationLocation(ctx, *param.Id); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} diff --git a/service/applicationser/helper.go b/service/applicationser/helper.go new file mode 100644 index 0000000..9426cb4 --- /dev/null +++ b/service/applicationser/helper.go @@ -0,0 +1,121 @@ +package applicationser + +import ( + "context" + "fmt" + "stat/common/enum/consts" + "stat/common/utils" + "stat/models/applicationLocMod" + "stat/models/applicationmod" + "stat/statg" + "time" +) + +func CheckChange(ctx context.Context, oldDoc, newDoc *applicationmod.Application, account string) { + msg := "" + changed := false + // 检测更新 + if oldDoc != nil && newDoc != nil { + warnChar := "🔴" + msg += fmt.Sprintf("检测到应用变更:\n应用ID:【%s】\n应用名称:【%s】\n", oldDoc.Id.Hex(), oldDoc.Name) + if oldDoc.DownloadUrl != newDoc.DownloadUrl { + changed = true + msg += fmt.Sprintf("下载链接变更:\n┏旧值【%v】\n┗新值【%v】\n", oldDoc.DownloadUrl, newDoc.DownloadUrl) + } + if oldDoc.AndroidUrl != newDoc.AndroidUrl { + changed = true + msg += fmt.Sprintf("安卓链接变更:\n┏旧值【%v】\n┗新值【%v】\n", oldDoc.AndroidUrl, newDoc.AndroidUrl) + } + if oldDoc.IosUrl != newDoc.IosUrl { + changed = true + msg += fmt.Sprintf("IOS链接变更:\n┏旧值【%v】\n┗新值【%v】\n", oldDoc.IosUrl, newDoc.IosUrl) + } + if oldDoc.ParentAppId != newDoc.ParentAppId { + changed = true + msg += fmt.Sprintf("所属appId变更:\n┏旧值【%v】\n┗新值【%v】\n", oldDoc.ParentAppId, newDoc.ParentAppId) + } else { + oSet := utils.NewSet(oldDoc.LocIds) + nSet := utils.NewSet(newDoc.LocIds) + if !oSet.Equal(nSet) { // 两个集合不相等 + changed = true + dict := applicationLocMod.FindApplicationLocationDict(ctx, oldDoc.ParentAppId) + oldLocations := "" + for _, id := range oldDoc.LocIds { + oldLocations += fmt.Sprintf("%s,", dict[id].Name) + } + nowLocations := "" + for _, id := range newDoc.LocIds { + nowLocations += fmt.Sprintf("%s,", dict[id].Name) + } + msg += fmt.Sprintf("应用中心位置变更:\n┏旧值【%s】\n┗新值【%s】\n", oldLocations, nowLocations) + } + } + if oldDoc.Status != newDoc.Status { + changed = true + msg += fmt.Sprintf("激活变更:\n┏旧值【%v】【%v】\n┗新值【%v】【%v】\n", oldDoc.Status, consts.StatusDesc[oldDoc.Status], + newDoc.Status, consts.StatusDesc[newDoc.Status]) + } + if oldDoc.Internal != newDoc.Internal { + changed = true + msg += fmt.Sprintf("是否内部应用展示,状态变更:\n┏旧值【%v】【%v】\n┗新值【%v】【%v】\n", oldDoc.Internal, consts.IsShowDesc[oldDoc.Internal], + newDoc.Internal, consts.IsShowDesc[newDoc.Internal]) + } + if oldDoc.NineShow != newDoc.NineShow { + changed = true + msg += fmt.Sprintf("是否九宫格展示,状态变更:\n┏旧值【%v】【%v】\n┗新值【%v】【%v】\n", oldDoc.NineShow, consts.IsShowDesc[oldDoc.NineShow], + newDoc.NineShow, consts.IsShowDesc[newDoc.NineShow]) + } + if oldDoc.RecreationShow != newDoc.RecreationShow { + changed = true + msg += fmt.Sprintf("是否娱乐中心展示,状态变更:\n┏旧值【%v】【%v】\n┗新值【%v】【%v】\n", oldDoc.RecreationShow, consts.IsShowDesc[oldDoc.RecreationShow], + newDoc.RecreationShow, consts.IsShowDesc[newDoc.RecreationShow]) + } + if oldDoc.HomeShow != newDoc.HomeShow { + changed = true + msg += fmt.Sprintf("是否首页展示,状态变更:\n┏旧值【%v】【%v】\n┗新值【%v】【%v】\n", oldDoc.HomeShow, consts.IsShowDesc[oldDoc.HomeShow], + newDoc.HomeShow, consts.IsShowDesc[newDoc.HomeShow]) + } + if !oldDoc.StartTime.Equal(newDoc.StartTime) { + changed = true + msg += fmt.Sprintf("开始时间变更:\n┏旧值【%v】\n┗新值【%v】\n", oldDoc.StartTime, newDoc.StartTime) + } + if !oldDoc.EndTime.Equal(newDoc.EndTime) { + changed = true + msg += fmt.Sprintf("结束时间变更:\n┏旧值【%v】\n┗新值【%v】\n", oldDoc.EndTime, newDoc.EndTime) + } + msg = warnChar + msg + } else if oldDoc == nil && newDoc != nil { + changed = true + warnChar := "🟣" + msg += fmt.Sprintf("检测到应用新增:\n应用ID:【%s】\n名称:【%s】\n", newDoc.Id.Hex(), newDoc.Name) + msg += fmt.Sprintf("下载链接:【%v】\n", newDoc.DownloadUrl) + msg += fmt.Sprintf("安卓链接:【%v】\n", newDoc.AndroidUrl) + msg += fmt.Sprintf("IOS链接:【%v】\n", newDoc.IosUrl) + msg += fmt.Sprintf("激活状态:\n┏【%v】【%s】\n", newDoc.Status, consts.StatusDesc[newDoc.Status]) + msg = warnChar + msg + } else if oldDoc != nil && newDoc == nil { + changed = true + warnChar := "🟠" + msg += fmt.Sprintf("检测到应用删除:\n应用ID:【%s】\n名称:【%s】\n", oldDoc.Id.Hex(), oldDoc.Name) + msg += fmt.Sprintf("下载链接:【%v】\n", oldDoc.DownloadUrl) + msg += fmt.Sprintf("安卓链接:【%v】\n", oldDoc.AndroidUrl) + msg += fmt.Sprintf("IOS链接:【%v】\n", oldDoc.IosUrl) + msg = warnChar + msg + } + if changed { + if newDoc != nil { + dict := applicationLocMod.FindApplicationLocationDict(ctx, newDoc.ParentAppId) + msg += fmt.Sprintf("所属APP:【%s】\n", statg.GlobalEndpoints.GetAppShortNameById(int32(newDoc.ParentAppId))) + nowLocations := "" + for _, id := range newDoc.LocIds { + nowLocations += fmt.Sprintf("%s,", dict[id].Name) + } + msg += fmt.Sprintf("应用位置:【%s】\n", nowLocations) + msg += fmt.Sprintf("激活状态:【%s】\n", consts.StatusDesc[newDoc.Status]) + } + 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) + } +} diff --git a/service/authoritySer/authority.go b/service/authoritySer/authority.go new file mode 100644 index 0000000..87da1fb --- /dev/null +++ b/service/authoritySer/authority.go @@ -0,0 +1,104 @@ +package authoritySer + +import ( + "context" + "stat/api/proto" + "stat/common/genId" + "stat/common/stdLog" + "stat/models/authorityMod" + "time" +) + +// 角色列表 +func RoleList(ctx context.Context, param proto.RoleListReq) (code stdLog.CodeType, data interface{}, err error) { + skip := (param.PageNum - 1) * param.PageSize + limit := param.PageSize + resp := proto.RoleListRes{ + Total: 0, + List: make([]proto.RoleInfo, 0), + } + total, auList, err := authorityMod.RoleList(ctx, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + for _, v := range auList { + var tmp = proto.RoleInfo{ + RoleId: v.Id, + Role: v.Role, + AuthJson: v.AuthJson, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + resp.List = append(resp.List, tmp) + } + data = resp + resp.Total = total + code = stdLog.Success + return +} + +// 添加角色 +func AddRole(ctx context.Context, param proto.AddRoleReq) (code stdLog.CodeType, data interface{}, err error) { + // 查询是否存在该角色 + roleInfo, err := authorityMod.GetAuthorityByRole(ctx, *param.Role) + if err != nil || roleInfo.Id > 0 { + code = stdLog.AuthorityRoleExists + return + } + + // 获取id + roleId := genId.GetNextRoleId() + + now := time.Now() + doc := authorityMod.Authority{ + Id: roleId, + Role: *param.Role, + AuthJson: *param.AuthJson, + CreatedAt: now, + UpdatedAt: now, + } + if err = authorityMod.AddRole(ctx, &doc); err != nil { + code = stdLog.Failure + return + } + code = stdLog.Success + return +} + +// 修改角色 +func UpdateRole(ctx context.Context, param proto.UpdateRoleReq) (code stdLog.CodeType, data interface{}, err error) { + // 查询是否存在该角色 + if param.Role != nil { + roleInfo, err := authorityMod.GetRoleExcludeRole(ctx, *param.RoleId, *param.Role) + if err != nil || roleInfo.Id > 0 { + code = stdLog.AuthorityRoleExists + return code, data, err + } + } + + now := time.Now() + doc := authorityMod.UpdateDoc{ + Role: param.Role, + AuthJson: param.AuthJson, + UpdatedAt: &now, + } + + if err = authorityMod.UpdateRole(ctx, *param.RoleId, doc); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 删除角色 +func DelRole(ctx context.Context, param proto.DelRoleReq) (code stdLog.CodeType, data interface{}, err error) { + if err = authorityMod.DelRoleById(ctx, *param.RoleId); err != nil { + code = stdLog.Failure + return + } + code = stdLog.Success + return +} diff --git a/service/botser/analyze.go b/service/botser/analyze.go new file mode 100644 index 0000000..b0f80a6 --- /dev/null +++ b/service/botser/analyze.go @@ -0,0 +1,196 @@ +package botser + +import ( + "context" + "errors" + "fmt" + "sort" + "stat/common/log" + "stat/common/utils" + "stat/models/accessmod" + "stat/models/channelmod" + "stat/models/rechargegamemod" + "stat/models/rechargemod" + "stat/models/registermod" + "stat/models/withdrawGameOrdermod" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +type IpCount struct { + Ip string + Count int64 +} + +type IpCountList []*IpCount + +func (a IpCountList) Len() int { return len(a) } +func (a IpCountList) Less(i, j int) bool { + return a[i].Count > a[j].Count +} +func (a IpCountList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type AnalyzeItem struct { + Channel string + RegisterIpMap map[string]int64 + RegisterUserMap map[string]int64 + RegisterCount int64 // 注册总数 + RegisterIpCount int64 // 注册IP数 + VisitCountMap map[string]int64 // 访问总数 + ValidVisitAfterHourMap map[string]int64 // 1小时后访问总数 + ValidVisitAfterDayMap map[string]int64 // 1天后访问总数 + ValidVisitAfterTowDayMap map[string]int64 // 2天后访问总数 + RechargeCount int64 // 充值次数 + RechargeAmount int64 // 充值钱数 + RechargeUsers int64 // 充值用户数 + GameRecharge int64 // 游戏充值 + GameWithdraw int64 // 游戏提现 +} + +func NewAnalyzeItem(channel string) *AnalyzeItem { + return &AnalyzeItem{ + Channel: channel, + RegisterIpMap: make(map[string]int64), + RegisterUserMap: make(map[string]int64), + VisitCountMap: make(map[string]int64), + ValidVisitAfterHourMap: make(map[string]int64), + ValidVisitAfterDayMap: make(map[string]int64), + ValidVisitAfterTowDayMap: make(map[string]int64), + } +} + +func (s *AnalyzeItem) AddIp(ip string) { + s.RegisterCount++ + s.RegisterIpMap[ip]++ + s.RegisterIpCount = int64(len(s.RegisterIpMap)) +} + +func (s *AnalyzeItem) IpRank(topCount int) IpCountList { + list := make(IpCountList, 0) + for ip, count := range s.RegisterIpMap { + list = append(list, &IpCount{ + Ip: ip, + Count: count, + }) + } + sort.Sort(list) + ret := make(IpCountList, 0) + for _, item := range list { + if len(ret) < topCount { + ret = append(ret, item) + } + } + return ret +} + +func ChannelAnalyze(ctx context.Context, channel string, start time.Time, end time.Time) (*AnalyzeItem, error) { + ret := NewAnalyzeItem(channel) + key := func(appid int32, userid uint64) string { + return fmt.Sprintf("%d-%d", appid, userid) + } + channelDeductionRules, err := channelmod.FindManyChannelDeductionRule(ctx, bson.M{ + channelmod.FN.ChannelDeductionRule.Channel: channel, + }) + if err != nil { + log.Error("ChannelSettlementMethod FindManyChannelDeductionRule", log.E(err)) + return nil, err + } + if len(channelDeductionRules) <= 0 { + return nil, nil + } + channelInfo, err := channelmod.FindOneChannelInfo(ctx, bson.M{ + channelmod.FN.ChannelInfo.Channel: channel}) + if err != nil { + log.Error("ChannelAnalyze FindOneChannelInfo", log.E(err)) + return nil, err + } + if channelInfo.Channel != channel { + return nil, errors.New("channel not found") + } + registerDict := make(map[string]*registermod.RegisterMod) + for _, ruleInfo := range channelDeductionRules { + // 统计注册用户 + registerList, err := registermod.RegisterChannelUsersInfoByTime(ctx, channel, ruleInfo.AppId, start, end) + if err != nil { + log.Error("NewCountMethod RegisterUsersInfoByDistrict ", log.E(err)) + return nil, err + } + uids := make([]uint64, 0) + for _, register := range registerList { + ret.AddIp(register.IP) + registerDict[key(ruleInfo.AppId, register.UserId)] = register + uids = append(uids, register.UserId) + } + err1 := utils.SlicePaged(uids, 5000, func(piece []uint64) error { + vList, err2 := accessmod.FindManyVisitInfo(ctx, bson.M{ + "userId": bson.M{"$in": piece}, + "appId": ruleInfo.AppId, + "visitAt": bson.M{"$gte": start, "$lt": end}, + }) + // 访问统计 + for _, visit := range vList { + skey := key(ruleInfo.AppId, visit.UserId) + regUser := registerDict[skey] + if regUser == nil { + continue + } + ret.VisitCountMap[skey]++ + if visit.VisitAt.After(regUser.RegisterTime.Add(time.Hour)) { + ret.ValidVisitAfterHourMap[skey]++ + } + if visit.VisitAt.After(regUser.RegisterTime.Add(24 * time.Hour)) { + ret.ValidVisitAfterDayMap[skey]++ + } + if visit.VisitAt.After(regUser.RegisterTime.Add(48 * time.Hour)) { + ret.ValidVisitAfterTowDayMap[skey]++ + } + } + return err2 + }) + if err1 != nil { + log.Error("FindManyVisitInfo error ", log.E(err1)) + return nil, err1 + } + // 充值统计 + rechargeFilter := bson.M{"districtCode": channel, "appId": ruleInfo.AppId, "successAt": bson.M{"$gte": start, "$lt": end}} + rechargeList, _ := rechargemod.FindManyRechargeInfo(ctx, rechargeFilter) + for _, item := range rechargeList { + skey := key(ruleInfo.AppId, item.UserId) + regUser := registerDict[skey] + if regUser == nil { + continue + } + ret.RegisterUserMap[skey]++ + ret.RechargeCount++ + ret.RechargeAmount += item.PayMoney + } + // 游戏充值 + gamerechageList, err := rechargegamemod.FindManyRechargeInfo(ctx, rechargeFilter) + if err != nil { + return nil, err + } + for _, item := range gamerechageList { + skey := key(ruleInfo.AppId, item.UserId) + regUser := registerDict[skey] + if regUser == nil { + continue + } + ret.RegisterUserMap[skey]++ + ret.GameRecharge += item.Money + } + gamewithdrawList, err := withdrawGameOrdermod.FindManyGameWithdrawOrder(ctx, rechargeFilter) + if err != nil { + return nil, err + } + for _, item := range gamewithdrawList { + skey := key(ruleInfo.AppId, item.UID) + regUser := registerDict[skey] + if regUser == nil { + continue + } + ret.GameWithdraw += item.Money + } + } + return ret, nil +} diff --git a/service/botser/bot.go b/service/botser/bot.go new file mode 100644 index 0000000..b4f3b3a --- /dev/null +++ b/service/botser/bot.go @@ -0,0 +1,33 @@ +package botser + +import ( + "stat/common/log" + "stat/statg" +) + +func StartBot() { + log.Info("StartBot start") + if statg.Bot == nil { + log.Error("statg.Bot is nil!!!") + return + } + + Start(statg.Bot) + // 发送服务器启动信息 + text := GetServerInformation() + text += GetServerInformationLastTime() + text += "🔔此服务器刚刚重启🔔" + + statg.Bot.SendDevelopMessage(text) + + // 注册命令 + statg.Bot.RegisterCommand(CommandList...) + + if statg.RchssendBot != nil && statg.Conf.ServerIndex == statg.ServerIndexBili { + // 注册命令 + statg.RchssendBot.RegisterCommand(CommandList0...) + } + + log.Info("StartBot end") + //statg.RchssendBot.SendrchssendMessage(text) +} diff --git a/service/botser/cmd.go b/service/botser/cmd.go new file mode 100644 index 0000000..b71ae91 --- /dev/null +++ b/service/botser/cmd.go @@ -0,0 +1,173 @@ +package botser + +import ( + "stat/common/tgbot" +) + +var ( + CommandList = []*tgbot.Command{ + { + Cmd: "what", + Help: "/what", + Desc: "聊天信息", + CmdType: tgbot.CommandTypeCommand, + Process: HandleWhatCmd, + }, + { + Cmd: "menu", + Help: "/menu", + Desc: "显示菜单", + CmdType: tgbot.CommandTypeCommand, + Process: HandleMenuCmd, + }, + { + Cmd: "close", + Help: "/close", + Desc: "关闭菜单", + CmdType: tgbot.CommandTypeCommand, + Process: HandleCloseCmd, + }, + { + Cmd: "hour", + Help: "/hour", + Desc: "小时统计", + CmdType: tgbot.CommandTypeCommand, + Process: HandleHourStatCmd, + }, + { + Cmd: "district", + Help: "/district", + Desc: "渠道统计", + CmdType: tgbot.CommandTypeCommand, + Process: HandleDistrictDataCmd, + }, + { + Cmd: "today", + Help: "/today -app=888", + Desc: "今日统计,统计从今天开始到当前小时整点的数据", + CmdType: tgbot.CommandTypeCommand, + Process: HandleTodayStatCmd, + }, + { + Cmd: "yesterday", + Help: "/yesterday -app=888", + Desc: "昨日统计,统计昨天的完整数据", + CmdType: tgbot.CommandTypeCommand, + Process: HandleYesterdayStatCmd, + }, + { + Cmd: "daily", + Help: "/daily -app=888 -back=1", + Desc: "每日统计, -back=0 表示今天,-back=1 表示昨天,-back=2 表示前天,以此类推", + CmdType: tgbot.CommandTypeCommand, + Process: HandleDailyStatCmd, + }, + { + Cmd: "apps", + Help: "/apps", + Desc: "应用列表", + CmdType: tgbot.CommandTypeCommand, + Process: HandleAppListCmd, + }, + { + Cmd: "sync", + Help: "/sync | /sync -detail | /sync -app=888,999", + Desc: "同步状态", + CmdType: tgbot.CommandTypeCommand, + Process: HandleSyncStatusCmd, + }, + { + Cmd: "daily_hour", + Help: "/daily_hour -app=888 -back=0", + Desc: "每日每时统计, -back=0 表示今天,-back=1 表示昨天,-back=2 表示前天,以此类推", + CmdType: tgbot.CommandTypeCommand, + Process: HandleDailyHourStatCmd, + }, + { + Cmd: "game_report", + Help: "/game_report", + Desc: "游戏统计文件, -back=0 表示今天,-back=1 表示昨天,-back=2 表示前天,以此类推", + CmdType: tgbot.CommandTypeCommand, + Process: HandleGameReportCmd, + }, + { + Cmd: "channel_analyze", + Help: "/channel_analyze -channel=abc -begin=2023-06-05 -end=2023-07-05", + Desc: "渠道分析, 时间按中国时间解析,每个时间都解析为当天零点", + CmdType: tgbot.CommandTypeCommand, + Process: HandleChannelAnalyzeCmd, + }, + { + Cmd: "channel_apk", + Help: "/channel_apk -channel=abc -app=888", + Desc: "渠道包生成", + CmdType: tgbot.CommandTypeCommand, + Process: HandleChannelApkCmd, + }, + { + Cmd: "auto_task", + Help: "/auto_task -file", + Desc: "自动任务运行状态", + CmdType: tgbot.CommandTypeCommand, + Process: HandleAutoTaskStatusCmd, + }, + { + Cmd: "cross_stat", + Help: "/cross_stat -stat=recharge -back=0", + Desc: "全服统计", + CmdType: tgbot.CommandTypeCommand, + Process: HandleCrossDayStatCmd, + }, + { + Cmd: "cross_month_stat", + Help: "/cross_month_stat -month=2023-06-01 -app=888", + Desc: "全服月统计, -month=2023-06-01 表示统计2023年整个6月的数据, -app=888 表示只统计app=888的数据,不填写则统计所有app", + CmdType: tgbot.CommandTypeCommand, + Process: HandleCrossMonthStatCmd, + }, + { + Cmd: "version", + Help: "/version", + Desc: "服务端版本", + CmdType: tgbot.CommandTypeCommand, + Process: HandleVersionCmd, + }, + } + CommandList0 = []*tgbot.Command{ + { + Cmd: "menurecharge", + Help: "/menurecharge", + Desc: "显示菜单", + CmdType: tgbot.CommandTypeCommand, + Process: HandleMenuCmd0, + }, + { + Cmd: "recharge", + Help: "/recharge", + Desc: "单充值播报", + CmdType: tgbot.CommandTypeCommand, + Process: HandleRchssendCmd, + }, + { + Cmd: "rechargenew", + Help: "/rechargenew", + Desc: "综合充值播报(昨天)", + CmdType: tgbot.CommandTypeCommand, + Process: HandleRchsMonthBotsendCmd, + }, + { + Cmd: "rechargedate", + Help: "/rechargedate", + Desc: "综合充值播报(开始到结束的时间)", + CmdType: tgbot.CommandTypeCommand, + Process: HandleRchsMonthBotDatetodatesendCmd, + }, + { + Cmd: "rechargeoneday", + Help: "/rechargeoneday", + Desc: "综合统计具体年月日", + CmdType: tgbot.CommandTypeCommand, + Process: HandleRchsDateBotsendCmd, + }, + } +) diff --git a/service/botser/cron.go b/service/botser/cron.go new file mode 100644 index 0000000..ae92918 --- /dev/null +++ b/service/botser/cron.go @@ -0,0 +1,70 @@ +package botser + +import ( + "context" + "fmt" + "stat/common/enum/consts" + "stat/common/log" + "stat/common/statutils" + "stat/common/tgbot" + "stat/common/utils" + "stat/statg" + "time" + + "github.com/robfig/cron/v3" +) + +var ( + botCron *cron.Cron +) + +func init() { + botCron = cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(&log.Logger{}))) // 秒级定时任务 +} + +// Start 定时器任务启动 +func Start(bot *tgbot.TgBot) { + log.Info("skd start...") + if bot == nil { + return + } + ctx := context.Background() + if statg.Conf.RunMod != consts.RunModRelease { + return + } + + _, _ = botCron.AddFunc("0 5 0/1 * * ?", func() { + log.Info("Cron Hourly Entry...") + // 发送消息 统计数据 + curStatTime := utils.RecentMinute(time.Now(), 60) // 按60分钟对齐 + endpoints := statg.GlobalEndpoints.GetIndexEndpoints(statg.Conf.ServerIndex).GetBotStatEndpoints() + for _, end := range endpoints { + id := end.AppId + tm := curStatTime + statutils.ServerMon.RunWithName(func() error { + return DailyBotReportTask(ctx, bot, id, tm) + }, statutils.GetFuncName(DailyBotReportTask)) + } + fmt.Printf("Cron Hourly %v", curStatTime) + if statg.Conf.ServerIndex.IsMadou() { + if curStatTime.Hour() == 8 { + // statutils.ServerMon.Run(SkdGameTask) 麻豆不发送集团数据 + } + } + }) + + _, _ = botCron.AddFunc("0 6 0/1 * * ?", func() { + if statg.Conf.ServerIndex.IsMadou() { + curStatTime := utils.RecentMinute(time.Now(), 60) // 按60分钟对齐 + statutils.ServerMon.RunWithName(func() error { + return DailyBotRankTask(ctx, bot, curStatTime) + }, statutils.GetFuncName(DailyBotRankTask)) + } + }) + + _, _ = botCron.AddFunc("*/5 * * * * ?", func() { + SaveServerKeepAliveTime() + }) + + botCron.Start() +} diff --git a/service/botser/data.go b/service/botser/data.go new file mode 100644 index 0000000..39c79f5 --- /dev/null +++ b/service/botser/data.go @@ -0,0 +1,349 @@ +package botser + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/statutils" + "stat/common/tgbot" + "stat/common/utils" + "stat/models/accessmod" + "stat/models/appInfoMod" + "stat/models/botdailyhourstat" + "stat/models/botreport" + "stat/models/downloadinfo" + "stat/models/rechargemod" + "stat/models/registermod" + "stat/models/syncrecharge" + "stat/models/syncvip" + "stat/models/versionMod" + "stat/service/crossSer" + "stat/statg" + "strings" + "time" + + "go.mongodb.org/mongo-driver/mongo" + + "go.mongodb.org/mongo-driver/bson/primitive" + + "go.mongodb.org/mongo-driver/bson" +) + +// 当日累计详细数据 +func DailyDetailBotTask(ctx context.Context, bot *tgbot.TgBot, reportTime time.Time) error { + title := GetDateDesc(0) + "应用统计排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, _, err := crossSer.GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.Recharge.Value() / 100 + }) + if err != nil { + return err + } + return bot.SendBroadcastMessage(fmt.Sprintf("应用统计排名:%s\n", reportTime.Format("2006-01-02T15:04:05")), photo, tgbot.FileTypePhoto) +} + +// 当日累计总充值排行 +func DailyBotRankTask(ctx context.Context, bot *tgbot.TgBot, reportTime time.Time) error { + title := GetDateDesc(0) + "应用统计排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, _, err := crossSer.GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.Recharge.Value() / 100 + }) + if err != nil { + return err + } + return bot.SendBroadcastMessage(fmt.Sprintf("应用统计排名:%s\n", reportTime.Format("2006-01-02T15:04:05")), photo, tgbot.FileTypePhoto) +} + +// 当日累计总充值、单小时充值 +func DailyBotReportTask(ctx context.Context, bot *tgbot.TgBot, appId int32, reportTime time.Time) error { + + log.Error("DailyBotReportTask start", log.Any("appid", appId), + log.Any("time", reportTime)) + reportFilter := bson.M{ + botreport.FN.BotReport.AppId: appId, + botreport.FN.BotReport.SumDate: reportTime, + } + report, err := botdailyhourstat.FindOneBotHourStatEx(ctx, reportFilter) + if err != nil { + if err == mongo.ErrNoDocuments { + report, err = BotDailyHourStat(ctx, appId, reportTime, true) + if err != nil { + return err + } + } else { + return err + } + } + HistoryFilter := bson.M{ + botreport.FN.BotReport.AppId: appId, + botreport.FN.BotReport.SumDate: reportTime.AddDate(0, 0, -1), + } + historyReport, err := botdailyhourstat.FindOneBotHourStatEx(ctx, HistoryFilter) + if err != nil { + if err == mongo.ErrNoDocuments { + historyReport, err = BotDailyHourStat(ctx, appId, reportTime.AddDate(0, 0, -1), true) + if err != nil { + return err + } + } else { + return err + } + } + appNameMap, _ := appInfoMod.GetAllAppIdNameMap(ctx) + appName := appNameMap[appId] + if statg.GlobalEndpoints.GetBotStatEndpoints().ExistsByAppId(appId) { + //text := report.DisplayDayHourText(appName, report) + //_ = bot.SendBroadcastMessage(text, "", tgbot.FileTypeNone) + + text, title, desc := report.DisplayDayHourTextWithTitle(appName, historyReport) + et := tgbot.NewEntityList(title, desc, []*tgbot.Entity{ + { + Content: text, + }, + }) + _ = bot.SendBroadcastEntity(et) + return nil + } + log.Error("DailyBotReportTask end", log.Any("appid", appId), + log.Any("time", reportTime)) + return nil +} + +func DailyBotReportInfo(ctx context.Context, appId int32, reportTime time.Time) (text, title, desc string, err error) { + log.Error("DailyBotReportTask start", log.Any("appid", appId), + log.Any("time", reportTime)) + reportFilter := bson.M{ + botreport.FN.BotReport.AppId: appId, + botreport.FN.BotReport.SumDate: reportTime, + } + report, err := botdailyhourstat.FindOneBotHourStatEx(ctx, reportFilter) + if err != nil { + if err == mongo.ErrNoDocuments { + report, err = BotDailyHourStat(ctx, appId, reportTime, true) + if err != nil { + return + } + } else { + return + } + } + HistoryFilter := bson.M{ + botreport.FN.BotReport.AppId: appId, + botreport.FN.BotReport.SumDate: reportTime.AddDate(0, 0, -1), + } + historyReport, err := botdailyhourstat.FindOneBotHourStatEx(ctx, HistoryFilter) + if err != nil { + if err == mongo.ErrNoDocuments { + historyReport, err = BotDailyHourStat(ctx, appId, reportTime.AddDate(0, 0, -1), true) + if err != nil { + return + } + } else { + return + } + } + appNameMap, _ := appInfoMod.GetAllAppIdNameMap(ctx) + appName := appNameMap[appId] + if statg.GlobalEndpoints.GetBotStatEndpoints().ExistsByAppId(appId) { + text, title, desc = report.DisplayDayHourTextWithTitle(appName, historyReport) + } + log.Error("DailyBotReportTask end", log.Any("appid", appId), + log.Any("time", reportTime)) + return +} + +// 当日累计总充值排行 +func DailyBotRankTaskInfo(ctx context.Context, reportTime time.Time) (photo string, buf []byte, err error) { + title := GetDateDesc(0) + "应用统计排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, buf, err = crossSer.GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.Recharge.Value() / 100 + }) + return photo, buf, err +} + +// 当日累计总充值、单小时充值 +func BotDailyHourStat(ctx context.Context, appId int32, reportTime time.Time, saveData bool) (*botdailyhourstat.BotHourStat, error) { + + hourStatBegin := reportTime.Add(-60 * time.Minute) + reportFilter := bson.M{ + "sumDate": reportTime, + "appId": appId, + } + //BotHourStat + report, err := botdailyhourstat.FindOneBotHourStat(ctx, reportFilter) + if err != nil { + log.Error("FindOneBotReport", log.E(err)) + return nil, err + } + + if report.SumDate != reportTime { + // 生成数据并插入 + start := utils.BeginWithTime(reportTime.Add(-time.Minute)) + end := reportTime + + report = &botdailyhourstat.BotHourStat{ + ID: primitive.NewObjectID(), + AppId: appId, + SumDate: reportTime, + UpdatedAt: time.Now(), + CreatedAt: time.Now(), + } + // 访问 + err := accessmod.VisitInfoByTimeShard(ctx, appId, start, end, utils.GlobalShardHour, func(item *accessmod.AccessMod) { + client := statutils.GetClientInfo(item.SysType, item.DevType, item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + report.TodayStat.Visit.Add(1, client) + }) + if err != nil { + return nil, err + } + // 注册 + userDict := make(map[uint64]bool) + err = registermod.RegisterFormalsInfoByTimeShard(ctx, appId, start, end, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + if item.IsFormal && statutils.IsClientH5OrLight(item.SysType, item.DevType) { + if _, exists := userDict[item.UserId]; !exists { + userDict[item.UserId] = true + client := statutils.GetClientInfo(item.SysType, item.DevType, + item.DistrictCode, item.IsDirect, item.IsDeduction, item.IsFormal) + report.TodayStat.Register.Add(1, client) + if item.RegisterTime.After(hourStatBegin) && item.RegisterTime.Before(reportTime) { + report.HourStat.Register.Add(1, client) + } + } + } + }) + if err != nil { + return nil, err + } + err = registermod.RegisterUsersInfoByTimeShard(ctx, appId, start, end, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + userDict[item.UserId] = true + client := statutils.GetClientInfo(item.SysType, item.DevType, + item.DistrictCode, item.IsDirect, item.IsDeduction, item.IsFormal) + report.TodayStat.Register.Add(1, client) + if item.RegisterTime.After(hourStatBegin) && item.RegisterTime.Before(reportTime) { + report.HourStat.Register.Add(1, client) + } + }) + if err != nil { + return nil, err + } + // 充值 + rechargeMap := make(map[string]*rechargemod.RechargeMod) + rechargeList, _ := rechargemod.TotalRechargeListV1(ctx, appId, start, end) + for _, item := range rechargeList { + client := statutils.GetClientInfo(item.SysType, item.DevType, item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + rechargeMap[item.OrderId] = item + report.TodayStat.Recharge.Add(item.PayMoney, client) + if item.RegisterTime.After(item.SuccessAt.AddDate(0, 0, -1)) { + report.TodayStat.RechargeNew.Add(item.PayMoney, client) + } else { + report.TodayStat.RechargeOld.Add(item.PayMoney, client) + } + if item.SuccessAt.After(hourStatBegin) && item.SuccessAt.Before(reportTime) { + report.HourStat.Recharge.Add(item.PayMoney, client) + if item.RegisterTime.After(item.SuccessAt.AddDate(0, 0, -1)) { + report.HourStat.RechargeNew.Add(item.PayMoney, client) + } else { + report.HourStat.RechargeOld.Add(item.PayMoney, client) + } + } + } + // 订单 + filter := bson.M{syncrecharge.FN.SyncRechargeOrder.AppId: appId, syncrecharge.FN.SyncRechargeOrder.CreatedAt: bson.M{"$gt": start.Add(-20 * time.Minute), "$lt": end}} + orderExList, _ := syncrecharge.FindManySyncRechargeOrder(ctx, filter) + orderList := make([]*syncrecharge.SyncRechargeOrder, 0) + for _, item := range orderExList { + if recharge, ok := rechargeMap[item.OrderId]; ok { + item.Money = recharge.Money + item.PayMoney = recharge.PayMoney + item.Status = recharge.Status + item.CreatedAt = recharge.SuccessAt + } + if item.CreatedAt.After(start) && item.CreatedAt.Before(end) { + orderList = append(orderList, item) + } + } + for _, item := range orderList { + client := statutils.GetClientInfo(item.SysType, item.DevType, item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + report.TodayStat.Order.Add(item.PayMoney, client) + if item.Status == 3 { + report.TodayStat.OrderSucc.Add(1, client) + } + if item.CreatedAt.After(hourStatBegin) && item.CreatedAt.Before(reportTime) { + report.HourStat.Order.Add(item.PayMoney, client) + if item.Status == 3 { + report.HourStat.OrderSucc.Add(item.PayMoney, client) + } + } + } + // 会员 + vipFilter := bson.M{syncvip.FN.SyncVip.AppId: appId, syncvip.FN.SyncVip.SuccessAt: bson.M{"$gt": start, "$lt": end}} + viporderList, _ := syncvip.FindManySyncVip(ctx, vipFilter) + for _, item := range viporderList { + client := statutils.GetClientInfo(item.DeviceType, item.DeviceType, item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + report.TodayStat.RechargeVip.Add(item.Money, client) + if item.SuccessAt.After(hourStatBegin) && item.SuccessAt.Before(reportTime) { + report.HourStat.RechargeVip.Add(item.Money, client) + } + } + // 金币 + report.TodayStat.RechargeGold = *report.TodayStat.Recharge.Sub(&report.TodayStat.RechargeVip) + report.HourStat.RechargeGold = *report.HourStat.Recharge.Sub(&report.HourStat.RechargeVip) + // 游戏 + if appId == 888 { + gameInfo := GetGameInfo(ctx, start) + if gameInfo != nil { + report.TodayGame = &botdailyhourstat.GameItem{} + report.TodayGame.RchgAmount = gameInfo.GameRchgAmount / 100 //充值总金额 + report.TodayGame.DcRchgAmount = gameInfo.GameDCRchgAmount / 100 //代充总金额 + report.TodayGame.WtdrAmount = gameInfo.GameWtdrAmount / 100 //游戏提现总金额 + report.TodayGame.WtdrRealAmount = gameInfo.GameWtdrRealAmount / 100 //游戏实际提现总金额 + report.TodayGame.IncAmount = -gameInfo.GameIncAmount / 100 //游戏上分总金额 + report.TodayGame.DecAmount = gameInfo.GameDecAmount / 100 //游戏下分总金额 + report.TodayGame.ValidBet = gameInfo.ValidBet / 100 //有效投注金额 + report.TodayGame.Profit = gameInfo.Profit / 100 //系统盈利 + } + } + // 落地页 + downloadList, err := downloadinfo.GetAccessCountByTime(ctx, appId, start, end) + if err != nil { + return nil, err + } + for _, downloadInfo := range downloadList { + report.TodayLandPage.LandPageTotalClick += 1 + if downloadInfo.SysType == "android" { + report.TodayLandPage.LandPageAndroidClick += 1 + } else if strings.Contains(downloadInfo.SysType, "ios") || strings.Contains(downloadInfo.SysType, "light") { + if downloadInfo.PackageType == versionMod.Shop { + report.TodayLandPage.LandPageIosAppstoreClick += 1 + } else if downloadInfo.PackageType == versionMod.Enterprise { + report.TodayLandPage.LandPageIosFirmClick += 1 + } else if downloadInfo.PackageType == versionMod.Light { + report.TodayLandPage.LandPageIosLightClick += 1 + } + } + if downloadInfo.CreatedAt.After(hourStatBegin) && downloadInfo.CreatedAt.Before(reportTime) { + report.HourLandPage.LandPageTotalClick += 1 + if downloadInfo.SysType == "android" { + report.HourLandPage.LandPageAndroidClick += 1 + } else if strings.Contains(downloadInfo.SysType, "ios") || strings.Contains(downloadInfo.SysType, "light") { + if downloadInfo.PackageType == versionMod.Shop { + report.HourLandPage.LandPageIosAppstoreClick += 1 + } else if downloadInfo.PackageType == versionMod.Enterprise { + report.HourLandPage.LandPageIosFirmClick += 1 + } else if downloadInfo.PackageType == versionMod.Light { + report.HourLandPage.LandPageIosLightClick += 1 + } + } + } + } + + report.AppId = appId + if saveData { + serr := botdailyhourstat.InsertOneBotHourStat(ctx, report) + if serr != nil { + log.Error("botdailyhourstat:InsertOneBotHourStat db.InsertOne failed", log.E(serr)) + } + log.Info("botdailyhourstat", log.Any("info", report.ReportTime)) + } + } + return report, nil +} diff --git a/service/botser/data_test.go b/service/botser/data_test.go new file mode 100644 index 0000000..87f6b52 --- /dev/null +++ b/service/botser/data_test.go @@ -0,0 +1,87 @@ +package botser + +import ( + "context" + "encoding/json" + "fmt" + "net/url" + "os" + "stat/api/proto" + "stat/common" + "stat/common/crypt" + "stat/common/utils" + "stat/tool/pubtest" + "testing" + "time" +) + +func Test_Func12(t *testing.T) { + // Let's start with a base url + baseUrl, err := url.Parse("http://www.bing.com/aaa?a=1&b=2,3") + if err != nil { + fmt.Println("Malformed URL: ", err.Error()) + return + } + // Add a Path Segment (Path segment is automatically escaped) + //baseUrl.Path += "path with?reserved characters" + // Prepare Query Parameters + params := baseUrl.Query() + //params.Add("q", "Hello World") + //params.Add("u", "wade") + // Add Query Parameters to the URL + baseUrl.RawQuery = params.Encode() // Escape Query Parameters + fmt.Printf("Encoded URL is %q\n", baseUrl.String()) +} + +func Test_SyncData(t *testing.T) { + key := "vEnkB&!75z4VAD6iAY%fkL*rBnU!WdhN" + var appId int32 = 222 + + req := &proto.BotDailyHourListReq{ + Page: common.Page{ + PageNum: 1, + PageSize: 20, + }, + SumDateStart: time.Now().AddDate(0, 0, -3), + SumDateStop: time.Now(), + AppId: &appId, + } + jsonData, err := json.Marshal(req) + if err != nil { + t.Error(err) + } + + data, err := crypt.CoreAesEncryptEx(jsonData, 12, key) + os.WriteFile("aaa.data", data, 777) + +} + +func Test_skdTask(t *testing.T) { + pubtest.TestInit("/Users/mac/Works/codes/stat_center/run/bili") + s, _ := time.Parse(time.RFC3339, "2023-06-15T15:00:00+08:00") + curStatTime := utils.RecentMinute(s, 60) // 按60分钟对齐 + ctx := context.Background() + DailyBotReportTask(ctx, nil, int32(444), curStatTime) // 麻豆 +} + +func Test_PassedTimeFromNowInHuman(t *testing.T) { + //s := PassedTimeFromNowInHuman(time.Now().Add(-9 * time.Minute)) + //t.Log(s) + //s2 := DurationDisplay(time.Now(), time.Now().Add(-8*time.Second)) + //t.Log(s2) +} + +func Test_Fun1(t *testing.T) { + time.Local, _ = time.LoadLocation("Asia/Shanghai") + + //DateTime = "2006-01-02 15:04:05" + //DateOnly = "2006-01-02" + //TimeOnly = "15:04:05" + + s, err := time.ParseInLocation(time.DateOnly, "2023-06-15", time.Local) + if err != nil { + t.Error(err) + } else { + t.Log(s) + } +} diff --git a/service/botser/game.go b/service/botser/game.go new file mode 100644 index 0000000..f6dbe25 --- /dev/null +++ b/service/botser/game.go @@ -0,0 +1,704 @@ +package botser + +import ( + "context" + "errors" + "fmt" + "math/rand" + "os" + "path" + "stat/common/log" + "stat/common/tgbot" + "stat/common/topicmessage" + "stat/common/utils" + "stat/models/dailystatmod" + "stat/service/consumer" + "stat/statg" + "time" + + "github.com/360EntSecGroup-Skylar/excelize" +) + +// BlocDailyStatTgbot 机器人汇报每日数据() +type BlocDailyStatTgbot struct { + SumDate time.Time `bson:"sumDate"` // 记录时间 按天对齐 + NewDirectCount int64 `bson:"newDirectCount"` // 新增直推 + NewFissionCount int64 `bson:"newFissionCount"` // 新增裂变 + DirectVisitCount int64 `bson:"directVisitCount"` // 直推访问数 + FissionVisitCount int64 `bson:"fissionVisitCount"` // 裂变访问数 + DirectAmount int64 `bson:"directAmount"` // 直推充值总金额 + DirectOtherAmount int64 `bson:"directOtherAmount"` // 直推充值其他金额 + FissionAmount int64 `bson:"fissionAmount"` // 裂变充值金额 + DirectAmountCount int64 `bson:"directAmountcount"` // 直推充值订单 + FissionAmountCount int64 `bson:"fissionAmountcount"` // 裂变充值订单 + NewRechargeCount int64 `bson:"newRechargeCount"` // 新增充值数 + NewRechargeAmount int64 `bson:"newRechargeAmount"` // 新增充值金额 + NewBindingCount int64 `bson:"newBindingCount"` // 新增绑定用户数 + APPNewRechargeCount int64 `bson:"appNewRechargeCount"` // app总新增充值人数(兼容) + APPNewRechargeAmount int64 `bson:"appNewRechargeAmount"` // app新增总充值 + APPRechargeAmount int64 `bson:"appRechargeAmount"` // app总充值 + APPRechargeCount int64 `bson:"appRechargeCount"` // app总充值人数 + APPRechargeOrderCount int64 `bson:"appRechargeOrderCount"` // app总充值订单数 + APPDaichongAmout int64 `bson:"appDaichongAmout"` // app代充充值金额 + APPDaichongAmoutCount int64 `bson:"appDaichongAmoutCount"` // app代充充值人数 + APPOnlineAmount int64 `bson:"appOnlineAmount"` // app在线充值金额 + APPOnlineAmountCount int64 `bson:"appOnlineAmountCount"` // app在线充值人数 + APPRechAmount int64 `bson:"appRechAmount"` // app总提现 +} + +func GetBlocDailyStatTgbotInfo(ctx context.Context, sumDate time.Time) *BlocDailyStatTgbot { + blocDay := utils.BeginWithTimeLocal(sumDate) + blocInfo := &BlocDailyStatTgbot{} + + ids := []int32{888, 668} + mdStatList, err := dailystatmod.FindDailyStatList(ctx, ids, blocDay) + if err != nil { + log.Info("GetBlocDailyStatTgbotInfoxx", log.Any("blocDay", blocDay), log.Any("len", len(mdStatList))) + return blocInfo + } + log.Info("GetBlocDailyStatTgbotInfo", log.Any("blocDay", blocDay), log.Any("len", len(mdStatList))) + + for _, mdStatInfo := range mdStatList { + blocInfo.SumDate = blocDay + blocInfo.NewDirectCount += mdStatInfo.NewDirectCount + blocInfo.NewFissionCount += mdStatInfo.NewFissionCount + blocInfo.DirectVisitCount += mdStatInfo.DirectVisitCount + blocInfo.FissionVisitCount += mdStatInfo.FissionVisitCount + blocInfo.DirectAmount += mdStatInfo.DirectAmount + blocInfo.FissionAmount += mdStatInfo.FissionAmount + blocInfo.DirectAmountCount += mdStatInfo.DirectAmountCount + blocInfo.FissionAmountCount += mdStatInfo.FissionAmountCount + blocInfo.NewRechargeCount += mdStatInfo.NewRechargeCount + blocInfo.NewRechargeAmount += mdStatInfo.NewRechargeAmount + blocInfo.APPRechargeAmount += mdStatInfo.TotalAmount + blocInfo.APPNewRechargeCount += mdStatInfo.NewRechargeCount + blocInfo.APPNewRechargeAmount += mdStatInfo.NewRechargeAmount + blocInfo.APPRechargeCount += mdStatInfo.DirectAmountCount + mdStatInfo.FissionAmountCount + blocInfo.APPRechargeOrderCount += mdStatInfo.SuccessRechargeOrder + blocInfo.APPOnlineAmount += mdStatInfo.TotalAmount + blocInfo.APPOnlineAmountCount = +mdStatInfo.DirectAmountCount + mdStatInfo.FissionAmountCount + } + + return blocInfo +} + +var ( + GameChatId = "G-841710430" +) +var exportUserTitle = map[string]string{ + "A1": "项目", + "B1": "YCXM1", + "C1": "对比", +} + +func GetGameInfo(ctx context.Context, reportTime time.Time) *topicmessage.GetReportStatResp { + request := &topicmessage.StatcenterGameReq{ + Date: utils.BeginWithTime(reportTime), + } + + url, err := consumer.AppCallbackUrl(888) + if err != nil { + return nil + } + apiUrl := url + "/api/web/statcenter/game" + + var resp *topicmessage.GetReportStatResp + err = consumer.HttpRequest(ctx, apiUrl, &request, &resp) + if err != nil { + log.Error("RunSyncJob HttpRequest", log.Any("url", apiUrl), log.Any("request", request), log.E(err)) + return nil + } + + if resp.Code != 200 { + log.Info("RunSyncJob HTTP请求失败", log.Any("url", apiUrl), log.Any("request", request), log.Any("resp", resp)) + return nil + } + + return resp +} + +func SkdGameTask() error { + ctx := context.Background() + beginTime := utils.BeginOfToday().AddDate(0, 0, -1) + // yestodayBeginTime := utils.BeginOfToday().AddDate(0, 0, -2) + gameInfo := topicmessage.GetReportStatResp{} + + yestodayGameInfo := topicmessage.GetReportStatResp{} + + sheetName := "Sheet1" + f := excelize.NewFile() + idx := f.NewSheet(sheetName) + + for k, v := range exportUserTitle { + f.SetCellValue(sheetName, k, v) + } + f.SetColWidth(sheetName, "A", "D", 30) + + styleOne, _ := f.NewStyle(`{"alignment":{"horizontal":"right"}}`) + styleTwo, _ := f.NewStyle(`{"alignment":{"horizontal":"left"}}`) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 2), "视频游戏活跃人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 2), gameInfo.GamePlayCount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 2), gameInfo.GamePlayCount-yestodayGameInfo.GamePlayCount) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 3), "视频游戏充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 3), gameInfo.GameRchgUsers) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 3), gameInfo.GameRchgUsers-yestodayGameInfo.GameRchgUsers) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 4), "视频游戏新增充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 4), gameInfo.GameFirstRchgUsers) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 4), gameInfo.GameFirstRchgUsers-yestodayGameInfo.GameFirstRchgUsers) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 5), "视频游戏老用户充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 5), gameInfo.GameRchgUsers-gameInfo.GameFirstRchgUsers) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 5), (gameInfo.GameRchgUsers-gameInfo.GameFirstRchgUsers)-(yestodayGameInfo.GameRchgUsers-yestodayGameInfo.GameFirstRchgUsers)) + + todayRchgAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameRchgAmount)/10000) + yestodayRchgAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameRchgAmount-yestodayGameInfo.GameRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 6), "视频游戏总充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 6), todayRchgAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 6), yestodayRchgAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 6), fmt.Sprintf("%s%d", string('B'), 6), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 6), fmt.Sprintf("%s%d", string('C'), 6), styleOne) + + todayFirstRchgAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameFirstRchgAmount)/10000) + yestodayFirstRchgAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameFirstRchgAmount-yestodayGameInfo.GameFirstRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 7), "视频游新增充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 7), todayFirstRchgAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 7), yestodayFirstRchgAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 7), fmt.Sprintf("%s%d", string('B'), 7), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 7), fmt.Sprintf("%s%d", string('C'), 7), styleOne) + + todayOldRchgAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameRchgAmount-gameInfo.GameFirstRchgAmount)/10000) + yestodayOldRchgAmount := fmt.Sprintf("%.4f", float64((gameInfo.GameRchgAmount-gameInfo.GameFirstRchgAmount)-(yestodayGameInfo.GameRchgAmount-yestodayGameInfo.GameFirstRchgAmount))/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 8), "视频游老用户充值") + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 8), fmt.Sprintf("%s%d", string('B'), 8), styleTwo) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 8), todayOldRchgAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 8), yestodayOldRchgAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 8), fmt.Sprintf("%s%d", string('B'), 8), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 8), fmt.Sprintf("%s%d", string('C'), 8), styleOne) + + todayGameWtdrAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameWtdrAmount)/10000) + yestodayGameWtdrAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameWtdrAmount-yestodayGameInfo.GameWtdrAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 9), "视频游戏提现") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 9), todayGameWtdrAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 9), yestodayGameWtdrAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 9), fmt.Sprintf("%s%d", string('B'), 9), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 9), fmt.Sprintf("%s%d", string('C'), 9), styleOne) + + todayGameRecvAmount := fmt.Sprintf("%.4f", float64((gameInfo.GameRchgAmount-gameInfo.GameWtdrAmount))/10000) + yestodayGameRecvAmount := fmt.Sprintf("%.4f", float64((gameInfo.GameRchgAmount-gameInfo.GameWtdrAmount)-(yestodayGameInfo.GameRchgAmount-yestodayGameInfo.GameWtdrAmount))/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 10), "视频游戏营收") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 10), todayGameRecvAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 10), yestodayGameRecvAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 10), fmt.Sprintf("%s%d", string('B'), 10), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 10), fmt.Sprintf("%s%d", string('C'), 10), styleOne) + + todayRecvRate := float64((gameInfo.GameRchgAmount-gameInfo.GameWtdrAmount)*100) / float64(gameInfo.GameRchgAmount) + yestodayRecvRate := float64((yestodayGameInfo.GameRchgAmount-yestodayGameInfo.GameWtdrAmount)*100) / float64(yestodayGameInfo.GameRchgAmount) + todayRecvRateStr := fmt.Sprintf("%.2f", todayRecvRate) + "%" + yestodayRecvRateStr := fmt.Sprintf("%.2f", yestodayRecvRate) + "%" + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 11), "视频游戏营收比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 11), todayRecvRateStr) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 11), yestodayRecvRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 11), fmt.Sprintf("%s%d", string('B'), 11), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 11), fmt.Sprintf("%s%d", string('C'), 11), styleOne) + + todayRevenue := fmt.Sprintf("%.4f", float64(gameInfo.Revenue)/10000) + yestodayRevenue := fmt.Sprintf("%.4f", float64(gameInfo.Revenue-yestodayGameInfo.Revenue)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 12), "视频游戏税收") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 12), todayRevenue) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 12), yestodayRevenue) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 12), fmt.Sprintf("%s%d", string('B'), 12), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 12), fmt.Sprintf("%s%d", string('C'), 12), styleOne) + + daichongAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameDCRchgAmount)/10000) + yestodayDaichongAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameDCRchgAmount-yestodayGameInfo.GameDCRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 13), "视频游戏代理充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 13), daichongAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 13), yestodayDaichongAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 13), fmt.Sprintf("%s%d", string('B'), 13), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 13), fmt.Sprintf("%s%d", string('C'), 13), styleOne) + + todayProfit := fmt.Sprintf("%.4f", float64(gameInfo.Profit)/10000) + yestodayProfit := fmt.Sprintf("%.4f", float64(gameInfo.Profit-yestodayGameInfo.Profit)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 14), "视频游戏系统输赢") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 14), todayProfit) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 14), yestodayProfit) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 14), fmt.Sprintf("%s%d", string('B'), 14), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 14), fmt.Sprintf("%s%d", string('C'), 14), styleOne) + + todayRevenueRate := float64(gameInfo.Revenue*100) / float64(gameInfo.GameRchgAmount) + yestodayRevenueRate := float64(yestodayGameInfo.Revenue*100) / float64(yestodayGameInfo.GameRchgAmount) + todayRevenueRateStr := fmt.Sprintf("%.2f", todayRevenueRate) + "%" + yestodayRevenueRateStr := fmt.Sprintf("%.2f", todayRevenueRate-yestodayRevenueRate) + "%" + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 15), "视频游戏税收比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 15), todayRevenueRateStr) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 15), yestodayRevenueRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 15), fmt.Sprintf("%s%d", string('B'), 15), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 15), fmt.Sprintf("%s%d", string('C'), 15), styleOne) + + todayProfitRate := float64(gameInfo.Profit*100) / float64(gameInfo.GameRchgAmount) + yestodayProfitRate := float64(yestodayGameInfo.Profit*100) / float64(yestodayGameInfo.GameRchgAmount) + todayProfitRateStr := fmt.Sprintf("%.2f", todayProfitRate) + "%" + yestodayProfitRateStr := fmt.Sprintf("%.2f", todayProfitRate-yestodayProfitRate) + "%" + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 16), "视频游戏输赢比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 16), todayProfitRateStr) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 16), yestodayProfitRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 16), fmt.Sprintf("%s%d", string('B'), 16), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 16), fmt.Sprintf("%s%d", string('C'), 16), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 17), "视频游戏日投注用户") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 17), gameInfo.GamePlayCount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 17), gameInfo.GamePlayCount-yestodayGameInfo.GamePlayCount) + + todayValidBet := fmt.Sprintf("%.4f", float64(gameInfo.ValidBet)/10000) + yestodayValidBet := fmt.Sprintf("%.4f", float64(gameInfo.ValidBet-yestodayGameInfo.ValidBet)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 18), "视频游戏总有效投注") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 18), todayValidBet) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 18), yestodayValidBet) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 18), fmt.Sprintf("%s%d", string('B'), 18), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 18), fmt.Sprintf("%s%d", string('C'), 18), styleOne) + + todayValidBet = fmt.Sprintf("%.4f", (float64(gameInfo.ValidBet)/float64(gameInfo.GamePlayCount))/10000) + yestodayValidBet = fmt.Sprintf("%.4f", (float64(gameInfo.ValidBet)/float64(gameInfo.GamePlayCount))/10000-(float64(yestodayGameInfo.ValidBet)/float64(yestodayGameInfo.GamePlayCount))/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 19), "视频游戏人均投注") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 19), todayValidBet) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 19), yestodayValidBet) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 19), fmt.Sprintf("%s%d", string('B'), 19), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 19), fmt.Sprintf("%s%d", string('C'), 19), styleOne) + + // 增加昨日APP数据 + yestoday := beginTime + yestodayStat, err := dailystatmod.FindOneDailyStat(ctx, 888, yestoday) + if err != nil { + return err + } + + if yestodayStat.SumDate == yestoday { + totalRecharge := yestodayStat.TotalAmount + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 22), "视频注册") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 22), yestodayStat.NewTotalCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 22), fmt.Sprintf("%s%d", string('B'), 13), styleOne) + + ratePhone := float64(100+rand.Intn(30)) / 10000 + newUser := yestodayStat.NewTotalCount + phoneUser := int64(float64(newUser) * ratePhone) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 23), "视频绑定") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 23), phoneUser) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 23), fmt.Sprintf("%s%d", string('B'), 23), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 24), "视频绑定率") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 24), fmt.Sprintf("%.4f", ratePhone)) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 24), fmt.Sprintf("%s%d", string('B'), 24), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 25), "视频登陆人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 25), yestodayStat.TotalVisitCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 25), fmt.Sprintf("%s%d", string('B'), 25), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 26), "视频新增充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 26), yestodayStat.NewRechargeCount+gameInfo.GameFirstRchgCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 26), fmt.Sprintf("%s%d", string('B'), 26), styleOne) + + RechargeStr := fmt.Sprintf("%.4f", float64(totalRecharge-yestodayStat.RepeatAmount+gameInfo.GameFirstRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 27), "视频新增充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 27), RechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 27), fmt.Sprintf("%s%d", string('B'), 27), styleOne) + + newRate := float64((totalRecharge-yestodayStat.RepeatAmount+gameInfo.GameFirstRchgAmount)*100) / float64(totalRecharge+gameInfo.GameRchgAmount) + newRateStr := fmt.Sprintf("%.2f", newRate) + "%" + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 28), "视频新增充值占比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 28), newRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 28), fmt.Sprintf("%s%d", string('B'), 28), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 29), "视频老用户充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 29), yestodayStat.SuccessRechargeOrder-yestodayStat.NewRechargeCount+(gameInfo.GameRchgCount-gameInfo.GameFirstRchgCount)) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 29), fmt.Sprintf("%s%d", string('B'), 29), styleOne) + + oldRechargeStr := fmt.Sprintf("%.4f", float64(yestodayStat.RepeatAmount+gameInfo.GameRchgAmount-gameInfo.GameFirstRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 30), "视频老用户充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 30), oldRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 30), fmt.Sprintf("%s%d", string('B'), 30), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 31), "视频充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 31), yestodayStat.SuccessRechargeOrder+gameInfo.GameRchgCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 31), fmt.Sprintf("%s%d", string('B'), 31), styleOne) + + totalRechargeStr := fmt.Sprintf("%.4f", float64(totalRecharge+gameInfo.GameRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 32), "视频总充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 32), totalRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 32), fmt.Sprintf("%s%d", string('B'), 32), styleOne) + + onlineRechargeStr := fmt.Sprintf("%.4f", float64(totalRecharge+gameInfo.GameRchgAmount-gameInfo.GameDCRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 33), "视频在线充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 33), onlineRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 33), fmt.Sprintf("%s%d", string('B'), 33), styleOne) + + directRate := float64(gameInfo.GameDCRchgAmount) / float64(totalRecharge+gameInfo.GameRchgAmount) + directRateStr := fmt.Sprintf("%.4f", directRate) + "%" + onelineRateStr := fmt.Sprintf("%.4f", float64(1)-directRate) + "%" + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 34), "视频在线充值占比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 34), onelineRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 34), fmt.Sprintf("%s%d", string('B'), 34), styleOne) + + directRechargeStr := fmt.Sprintf("%.4f", float64(gameInfo.GameDCRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 35), "视频代理充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 35), directRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 35), fmt.Sprintf("%s%d", string('B'), 35), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 36), "视频代理占比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 36), directRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 36), fmt.Sprintf("%s%d", string('B'), 36), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 37), "视频裂变用户") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 37), yestodayStat.NewFissionCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 37), fmt.Sprintf("%s%d", string('B'), 37), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 38), "视频裂变充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 38), yestodayStat.FissionAmountCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 38), fmt.Sprintf("%s%d", string('B'), 38), styleOne) + + fissionRechargeStr := fmt.Sprintf("%.4f", float64(yestodayStat.FissionAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 39), "视频裂变充值金额") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 39), fissionRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 39), fmt.Sprintf("%s%d", string('B'), 39), styleOne) + + // directRechargeStr := fmt.Sprintf("%.4f", float64(totalRecharge-yestodayStat.FissionAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 40), "视频直推充值金额") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 40), yestodayStat.DirectAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 40), fmt.Sprintf("%s%d", string('B'), 40), styleOne) + + totalWtdrStr := fmt.Sprintf("%.4f", float64(gameInfo.GameWtdrAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 41), "视频提现") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 41), totalWtdrStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 41), fmt.Sprintf("%s%d", string('B'), 41), styleOne) + + totalTotalStr := fmt.Sprintf("%.4f", float64(totalRecharge+gameInfo.GameRchgAmount-gameInfo.GameWtdrAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 42), "总营收") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 42), totalTotalStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 42), fmt.Sprintf("%s%d", string('B'), 42), styleOne) + } + + f.SetActiveSheet(idx) + p, _ := os.Getwd() + fileName := path.Join(p, "YCXM1.xlsx") + if err := f.SaveAs(fileName); err != nil { + log.Error("user:export save file to disk failed", + log.Any("fileName", fileName), + log.E(err)) + return err + } + // 先发TG + statg.Bot.SendBroadcastMessageToChats( + fmt.Sprintf("麻豆游戏数据:%s", beginTime.Format("2006-01-02")), + fileName, + tgbot.FileTypeDocument, + statg.Conf.BotConfig.Chats.BlocStat) + + // // 再发EG + // apiUrl := fmt.Sprintf("http://118.107.44.18:8080/sendFileMessage?dialogId=G-841710430") + // bodyBuffer := &bytes.Buffer{} + // bodyWriter := multipart.NewWriter(bodyBuffer) + + // fileWriter, _ := bodyWriter.CreateFormFile("file", "YCXM1.xlsx") + + // file, _ := os.Open("YCXM1.xlsx") + // defer file.Close() + + // io.Copy(fileWriter, file) + + // contentType := bodyWriter.FormDataContentType() + // bodyWriter.Close() + + // resp, err := http.Post(apiUrl, contentType, bodyBuffer) + // if err != nil { + // fmt.Println("**********", err) + // return err + // } + // defer resp.Body.Close() + // if resp.StatusCode != http.StatusOK { + // log.Error("SkdGameTask err", log.Any("code", resp)) + // return fmt.Errorf("HttpRequest err code=%d", resp.StatusCode) + // } + log.Info("SkdGameTask successs") + return nil +} + +func GetGameReportFile(ctx context.Context, generateTime time.Time) (string, error) { + beginTime := utils.BeginWithTime(generateTime).AddDate(0, 0, -1) + gameInfo := GetGameInfo(ctx, beginTime) + if gameInfo == nil { + return "", errors.New("today game info is null") + } + yestodayBeginTime := utils.BeginOfToday().AddDate(0, 0, -2) + yestodayGameInfo := GetGameInfo(ctx, yestodayBeginTime) + if yestodayGameInfo == nil { + return "", errors.New("yesterday game info is null") + } + + sheetName := "Sheet1" + f := excelize.NewFile() + idx := f.NewSheet(sheetName) + + for k, v := range exportUserTitle { + f.SetCellValue(sheetName, k, v) + } + f.SetColWidth(sheetName, "A", "D", 30) + + styleOne, _ := f.NewStyle(`{"alignment":{"horizontal":"right"}}`) + styleTwo, _ := f.NewStyle(`{"alignment":{"horizontal":"left"}}`) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 2), "视频游戏活跃人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 2), gameInfo.GamePlayCount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 2), gameInfo.GamePlayCount-yestodayGameInfo.GamePlayCount) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 3), "视频游戏充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 3), gameInfo.GameRchgUsers) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 3), gameInfo.GameRchgUsers-yestodayGameInfo.GameRchgUsers) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 4), "视频游戏新增充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 4), gameInfo.GameFirstRchgUsers) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 4), gameInfo.GameFirstRchgUsers-yestodayGameInfo.GameFirstRchgUsers) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 5), "视频游戏老用户充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 5), gameInfo.GameRchgUsers-gameInfo.GameFirstRchgUsers) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 5), (gameInfo.GameRchgUsers-gameInfo.GameFirstRchgUsers)-(yestodayGameInfo.GameRchgUsers-yestodayGameInfo.GameFirstRchgUsers)) + + todayRchgAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameRchgAmount)/10000) + yestodayRchgAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameRchgAmount-yestodayGameInfo.GameRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 6), "视频游戏总充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 6), todayRchgAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 6), yestodayRchgAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 6), fmt.Sprintf("%s%d", string('B'), 6), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 6), fmt.Sprintf("%s%d", string('C'), 6), styleOne) + + todayFirstRchgAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameFirstRchgAmount)/10000) + yestodayFirstRchgAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameFirstRchgAmount-yestodayGameInfo.GameFirstRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 7), "视频游新增充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 7), todayFirstRchgAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 7), yestodayFirstRchgAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 7), fmt.Sprintf("%s%d", string('B'), 7), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 7), fmt.Sprintf("%s%d", string('C'), 7), styleOne) + + todayOldRchgAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameRchgAmount-gameInfo.GameFirstRchgAmount)/10000) + yestodayOldRchgAmount := fmt.Sprintf("%.4f", float64((gameInfo.GameRchgAmount-gameInfo.GameFirstRchgAmount)-(yestodayGameInfo.GameRchgAmount-yestodayGameInfo.GameFirstRchgAmount))/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 8), "视频游老用户充值") + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 8), fmt.Sprintf("%s%d", string('B'), 8), styleTwo) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 8), todayOldRchgAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 8), yestodayOldRchgAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 8), fmt.Sprintf("%s%d", string('B'), 8), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 8), fmt.Sprintf("%s%d", string('C'), 8), styleOne) + + todayGameWtdrAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameWtdrAmount)/10000) + yestodayGameWtdrAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameWtdrAmount-yestodayGameInfo.GameWtdrAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 9), "视频游戏提现") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 9), todayGameWtdrAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 9), yestodayGameWtdrAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 9), fmt.Sprintf("%s%d", string('B'), 9), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 9), fmt.Sprintf("%s%d", string('C'), 9), styleOne) + + todayGameRecvAmount := fmt.Sprintf("%.4f", float64((gameInfo.GameRchgAmount-gameInfo.GameWtdrAmount))/10000) + yestodayGameRecvAmount := fmt.Sprintf("%.4f", float64((gameInfo.GameRchgAmount-gameInfo.GameWtdrAmount)-(yestodayGameInfo.GameRchgAmount-yestodayGameInfo.GameWtdrAmount))/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 10), "视频游戏营收") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 10), todayGameRecvAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 10), yestodayGameRecvAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 10), fmt.Sprintf("%s%d", string('B'), 10), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 10), fmt.Sprintf("%s%d", string('C'), 10), styleOne) + + todayRecvRate := float64((gameInfo.GameRchgAmount-gameInfo.GameWtdrAmount)*100) / float64(gameInfo.GameRchgAmount) + yestodayRecvRate := float64((yestodayGameInfo.GameRchgAmount-yestodayGameInfo.GameWtdrAmount)*100) / float64(yestodayGameInfo.GameRchgAmount) + todayRecvRateStr := fmt.Sprintf("%.2f", todayRecvRate) + "%" + yestodayRecvRateStr := fmt.Sprintf("%.2f", yestodayRecvRate) + "%" + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 11), "视频游戏营收比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 11), todayRecvRateStr) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 11), yestodayRecvRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 11), fmt.Sprintf("%s%d", string('B'), 11), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 11), fmt.Sprintf("%s%d", string('C'), 11), styleOne) + + todayRevenue := fmt.Sprintf("%.4f", float64(gameInfo.Revenue)/10000) + yestodayRevenue := fmt.Sprintf("%.4f", float64(gameInfo.Revenue-yestodayGameInfo.Revenue)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 12), "视频游戏税收") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 12), todayRevenue) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 12), yestodayRevenue) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 12), fmt.Sprintf("%s%d", string('B'), 12), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 12), fmt.Sprintf("%s%d", string('C'), 12), styleOne) + + daichongAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameDCRchgAmount)/10000) + yestodayDaichongAmount := fmt.Sprintf("%.4f", float64(gameInfo.GameDCRchgAmount-yestodayGameInfo.GameDCRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 13), "视频游戏代理充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 13), daichongAmount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 13), yestodayDaichongAmount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 13), fmt.Sprintf("%s%d", string('B'), 13), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 13), fmt.Sprintf("%s%d", string('C'), 13), styleOne) + + todayProfit := fmt.Sprintf("%.4f", float64(gameInfo.Profit)/10000) + yestodayProfit := fmt.Sprintf("%.4f", float64(gameInfo.Profit-yestodayGameInfo.Profit)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 14), "视频游戏系统输赢") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 14), todayProfit) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 14), yestodayProfit) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 14), fmt.Sprintf("%s%d", string('B'), 14), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 14), fmt.Sprintf("%s%d", string('C'), 14), styleOne) + + todayRevenueRate := float64(gameInfo.Revenue*100) / float64(gameInfo.GameRchgAmount) + yestodayRevenueRate := float64(yestodayGameInfo.Revenue*100) / float64(yestodayGameInfo.GameRchgAmount) + todayRevenueRateStr := fmt.Sprintf("%.2f", todayRevenueRate) + "%" + yestodayRevenueRateStr := fmt.Sprintf("%.2f", todayRevenueRate-yestodayRevenueRate) + "%" + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 15), "视频游戏税收比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 15), todayRevenueRateStr) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 15), yestodayRevenueRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 15), fmt.Sprintf("%s%d", string('B'), 15), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 15), fmt.Sprintf("%s%d", string('C'), 15), styleOne) + + todayProfitRate := float64(gameInfo.Profit*100) / float64(gameInfo.GameRchgAmount) + yestodayProfitRate := float64(yestodayGameInfo.Profit*100) / float64(yestodayGameInfo.GameRchgAmount) + todayProfitRateStr := fmt.Sprintf("%.2f", todayProfitRate) + "%" + yestodayProfitRateStr := fmt.Sprintf("%.2f", todayProfitRate-yestodayProfitRate) + "%" + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 16), "视频游戏输赢比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 16), todayProfitRateStr) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 16), yestodayProfitRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 16), fmt.Sprintf("%s%d", string('B'), 16), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 16), fmt.Sprintf("%s%d", string('C'), 16), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 17), "视频游戏日投注用户") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 17), gameInfo.GamePlayCount) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 17), gameInfo.GamePlayCount-yestodayGameInfo.GamePlayCount) + + todayValidBet := fmt.Sprintf("%.4f", float64(gameInfo.ValidBet)/10000) + yestodayValidBet := fmt.Sprintf("%.4f", float64(gameInfo.ValidBet-yestodayGameInfo.ValidBet)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 18), "视频游戏总有效投注") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 18), todayValidBet) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 18), yestodayValidBet) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 18), fmt.Sprintf("%s%d", string('B'), 18), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 18), fmt.Sprintf("%s%d", string('C'), 18), styleOne) + + todayValidBet = fmt.Sprintf("%.4f", (float64(gameInfo.ValidBet)/float64(gameInfo.GamePlayCount))/10000) + yestodayValidBet = fmt.Sprintf("%.4f", (float64(gameInfo.ValidBet)/float64(gameInfo.GamePlayCount))/10000-(float64(yestodayGameInfo.ValidBet)/float64(yestodayGameInfo.GamePlayCount))/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 19), "视频游戏人均投注") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 19), todayValidBet) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('C'), 19), yestodayValidBet) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 19), fmt.Sprintf("%s%d", string('B'), 19), styleOne) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('C'), 19), fmt.Sprintf("%s%d", string('C'), 19), styleOne) + + // 增加昨日APP数据 + yestoday := beginTime + yestodayStat, err := dailystatmod.FindOneDailyStat(ctx, 888, yestoday) + if err != nil { + return "", err + } + if yestodayStat.SumDate == yestoday { + totalRecharge := yestodayStat.TodayIosRecharge + yestodayStat.TodayH5Recharge + yestodayStat.TodayAndroidRecharge + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 22), "视频注册") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 22), yestodayStat.IosAddCount+yestodayStat.AndroidAddCount+yestodayStat.H5AddCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 22), fmt.Sprintf("%s%d", string('B'), 13), styleOne) + + ratePhone := float64(100+rand.Intn(30)) / 10000 + newUser := yestodayStat.IosAddCount + yestodayStat.AndroidAddCount + yestodayStat.H5AddCount + phoneUser := int64(float64(newUser) * ratePhone) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 23), "视频绑定") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 23), phoneUser) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 23), fmt.Sprintf("%s%d", string('B'), 23), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 24), "视频绑定率") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 24), fmt.Sprintf("%.4f", ratePhone)) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 24), fmt.Sprintf("%s%d", string('B'), 24), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 25), "视频登陆人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 25), yestodayStat.DirectVisitCount+yestodayStat.FissionVisitCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 25), fmt.Sprintf("%s%d", string('B'), 25), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 26), "视频新增充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 26), yestodayStat.NewRechargeCount+gameInfo.GameFirstRchgCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 26), fmt.Sprintf("%s%d", string('B'), 26), styleOne) + + RechargeStr := fmt.Sprintf("%.4f", float64(totalRecharge-yestodayStat.RepeatAmount+gameInfo.GameFirstRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 27), "视频新增充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 27), RechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 27), fmt.Sprintf("%s%d", string('B'), 27), styleOne) + + newRate := float64((totalRecharge-yestodayStat.RepeatAmount+gameInfo.GameFirstRchgAmount)*100) / float64(totalRecharge+gameInfo.GameRchgAmount) + newRateStr := fmt.Sprintf("%.2f", newRate) + "%" + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 28), "视频新增充值占比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 28), newRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 28), fmt.Sprintf("%s%d", string('B'), 28), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 29), "视频老用户充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 29), yestodayStat.SuccessRechargeOrder-yestodayStat.NewRechargeCount+(gameInfo.GameRchgCount-gameInfo.GameFirstRchgCount)) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 29), fmt.Sprintf("%s%d", string('B'), 29), styleOne) + + oldRechargeStr := fmt.Sprintf("%.4f", float64(yestodayStat.RepeatAmount+gameInfo.GameRchgAmount-gameInfo.GameFirstRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 30), "视频老用户充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 30), oldRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 30), fmt.Sprintf("%s%d", string('B'), 30), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 31), "视频充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 31), yestodayStat.SuccessRechargeOrder+gameInfo.GameRchgCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 31), fmt.Sprintf("%s%d", string('B'), 31), styleOne) + + totalRechargeStr := fmt.Sprintf("%.4f", float64(totalRecharge+gameInfo.GameRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 32), "视频总充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 32), totalRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 32), fmt.Sprintf("%s%d", string('B'), 32), styleOne) + + onlineRechargeStr := fmt.Sprintf("%.4f", float64(totalRecharge+gameInfo.GameRchgAmount-gameInfo.GameDCRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 33), "视频在线充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 33), onlineRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 33), fmt.Sprintf("%s%d", string('B'), 33), styleOne) + + directRate := float64(gameInfo.GameDCRchgAmount) / float64(totalRecharge+gameInfo.GameRchgAmount) + directRateStr := fmt.Sprintf("%.4f", directRate) + "%" + onelineRateStr := fmt.Sprintf("%.4f", float64(1)-directRate) + "%" + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 34), "视频在线充值占比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 34), onelineRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 34), fmt.Sprintf("%s%d", string('B'), 34), styleOne) + + directRechargeStr := fmt.Sprintf("%.4f", float64(gameInfo.GameDCRchgAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 35), "视频代理充值") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 35), directRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 35), fmt.Sprintf("%s%d", string('B'), 35), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 36), "视频代理占比") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 36), directRateStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 36), fmt.Sprintf("%s%d", string('B'), 36), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 37), "视频裂变用户") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 37), yestodayStat.NewFissionCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 37), fmt.Sprintf("%s%d", string('B'), 37), styleOne) + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 38), "视频裂变充值人数") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 38), yestodayStat.FissionAmountCount) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 38), fmt.Sprintf("%s%d", string('B'), 38), styleOne) + + fissionRechargeStr := fmt.Sprintf("%.4f", float64(yestodayStat.FissionAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 39), "视频裂变充值金额") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 39), fissionRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 39), fmt.Sprintf("%s%d", string('B'), 39), styleOne) + + // directRechargeStr := fmt.Sprintf("%.4f", float64(totalRecharge-yestodayStat.FissionAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 40), "视频直推充值金额") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 40), directRechargeStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 40), fmt.Sprintf("%s%d", string('B'), 40), styleOne) + + totalWtdrStr := fmt.Sprintf("%.4f", float64(gameInfo.GameWtdrAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 41), "视频提现") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 41), totalWtdrStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 41), fmt.Sprintf("%s%d", string('B'), 41), styleOne) + + totalTotalStr := fmt.Sprintf("%.4f", float64(totalRecharge+gameInfo.GameRchgAmount-gameInfo.GameWtdrAmount)/10000) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('A'), 42), "总营收") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string('B'), 42), totalTotalStr) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", string('B'), 42), fmt.Sprintf("%s%d", string('B'), 42), styleOne) + } + + f.SetActiveSheet(idx) + p, _ := os.Getwd() + fileName := path.Join(p, "YCXM1.xlsx") + if err := f.SaveAs(fileName); err != nil { + log.Error("user:export save file to disk failed", + log.Any("fileName", fileName), + log.E(err)) + return "", err + } + return fileName, nil +} diff --git a/service/botser/handler.go b/service/botser/handler.go new file mode 100644 index 0000000..41850a2 --- /dev/null +++ b/service/botser/handler.go @@ -0,0 +1,685 @@ +package botser + +import ( + "bytes" + "context" + "errors" + "fmt" + "os" + "stat/common/crypt" + "stat/common/statutils" + "stat/common/stdLog" + "stat/common/tgbot" + "stat/common/utils" + "stat/models/appInfoMod" + "stat/models/botdailyhourstat" + "stat/models/botreport" + "stat/models/channelmod" + "stat/models/channelpackage" + "stat/models/versionMod" + "stat/service/crossSer" + "stat/service/innerserverser" + "stat/service/versionSer" + "stat/skd/job/monitor" + "stat/statg" + "strings" + "time" + + "go.mongodb.org/mongo-driver/mongo" + + "go.mongodb.org/mongo-driver/bson" + + "golang.org/x/exp/slices" +) + +func DisplayAppButtons(ctx context.Context, cmd *tgbot.Command) error { + list, err := appInfoMod.GetAllAppInfoEx(ctx) + if err != nil { + return err + } + title := fmt.Sprintf("请选择您要查询%s的应用:", cmd.GetFlagStringValue("-title")) + keyboard := GetAppKeyboard(list, cmd.Message().Text, 2) + return cmd.SendEdit(title, keyboard) +} + +func DisplayStatProjectButtons(ctx context.Context, cmd *tgbot.Command) error { + title := fmt.Sprintf("请选择统计项目:") + keyboard := GetStatProjectKeyboard(cmd.Message().Text) + return cmd.SendEdit(title, keyboard) +} + +func HandleMenuCmd(ctx context.Context, cmd *tgbot.Command) error { + return cmd.SendReply("请选择命令:", MenuKeyboard) +} + +func HandleWhatCmd(ctx context.Context, cmd *tgbot.Command) error { + text := fmt.Sprintf("会话信息:\n") + text += fmt.Sprintf("用户:【%s】\n", cmd.Message().From.FirstName+cmd.Message().From.LastName) + text += fmt.Sprintf("UID:【%d】\n", cmd.Message().From.ID) + text += fmt.Sprintf("聊天:【%s】\n", cmd.Message().Chat.Title) + text += fmt.Sprintf("CID:【%d】\n", cmd.Message().Chat.ID) + return cmd.SendText(text) +} + +func HandleMenuCmd0(ctx context.Context, cmd *tgbot.Command) error { + text := "前一天旧的 /recharge\n 综合统计前一天的 /rechargenew\n" + + "综合从第几天到第几天/rechargedate -begin=2024-01-01 -end=2024-01-21 @bot\n 综合统计具体年月日/rechargeoneday -date=2024-01-01\n" + + return cmd.SendText(text) +} + +// channel_apk +func HandleChannelApkCmd(ctx context.Context, cmd *tgbot.Command) error { + appIds := cmd.GetFlagInt32Slice("-app") + if len(appIds) <= 0 { + return tgbot.NewUserError(cmd, "请输入应用ID,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + channel := cmd.GetFlagStringValue("-channel") + if channel == "" { + return tgbot.NewUserError(cmd, "请输入渠道名称,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + debug := cmd.GetFlagStringValue("-debug") + appNames, err := appInfoMod.GetAllAppIdNameMap(ctx) + if err != nil { + return err + } + appId := appIds[0] + version, err := versionMod.ButtonClick(ctx, appId, "android", 0) + if err != nil { + return tgbot.NewUserError(cmd, fmt.Sprintf("获取应用【%s】(id=%d) 版本信息失败: %s\n", appNames[appId], appId, err.Error())) + } + + pack, serr := channelpackage.FindOneChannelPackage(ctx, bson.M{ + channelpackage.FN.ChannelPackage.AppId: appId, + channelpackage.FN.ChannelPackage.Channel: channel, + channelpackage.FN.ChannelPackage.Version: version.VersionNum, + channelpackage.FN.ChannelPackage.FileName: version.Md5, + }) + if serr != nil && serr.Code != stdLog.DataNotExist { + return tgbot.NewUserError(cmd, fmt.Sprintf("查找渠道包出错【app=%s】(id=%d) 渠道【%s】, Error:%s\n", appNames[appId], appId, channel, serr.Error())) + } + logBody := bytes.NewBuffer(nil) + if pack != nil { + if pack.Status == channelpackage.ChanApkStatusSuccess { + text := fmt.Sprintf("渠道包已经存在:\n") + text += fmt.Sprintf("应用:【%s】(%d)\n", appNames[appId], appId) + text += fmt.Sprintf("渠道:【%s】\n", channel) + text += fmt.Sprintf("版本:【%s】\n", version.VersionNum) + text += fmt.Sprintf("文件:【%s】\n", version.Md5) + text += fmt.Sprintf("发布:【%s】\n", version.CreatedAt.Format(time.DateTime)) + text += fmt.Sprintf("生成:【%s】\n", pack.GenTime.Format(time.DateTime)) + baseUrls := versionSer.GetPackageBaseDomain(appId) + for index, baseUrl := range baseUrls { + text += fmt.Sprintf("下载链接-%d: %s\n", index, pack.GetRandomLink([]string{baseUrl})) + } + return cmd.SendReply(text, nil) + } + if pack.Status == channelpackage.ChanApkStatusMaking && time.Now().Sub(pack.GenTime) < 10*time.Minute { + return tgbot.NewUserError(cmd, fmt.Sprintf("渠道包正在生成中【app=%s】(id=%d) 渠道【%s】请稍后再试。。。\n", appNames[appId], appId, channel)) + } + if pack, err = versionSer.TryMakeChannelApk(ctx, appId, channel, version, pack, "渠道包不在成功状态很久了", true, logBody); err != nil { + return tgbot.NewUserError(cmd, fmt.Sprintf("生成渠道包出错【app=%s】(id=%d) 渠道【%s】, Error:%s\n", appNames[appId], appId, channel, err.Error())) + } + + text := fmt.Sprintf("渠道包生成成功:\n") + text += fmt.Sprintf("应用:【%s】(%d)\n", appNames[appId], appId) + text += fmt.Sprintf("渠道:【%s】\n", channel) + text += fmt.Sprintf("版本:【%s】\n", version.VersionNum) + text += fmt.Sprintf("文件:【%s】\n", version.Md5) + text += fmt.Sprintf("发布:【%s】\n", version.CreatedAt.Format(time.DateTime)) + text += fmt.Sprintf("生成:【%s】\n", pack.GenTime.Format(time.DateTime)) + baseUrls := versionSer.GetPackageBaseDomain(appId) + for index, baseUrl := range baseUrls { + text += fmt.Sprintf("下载链接-%d: %s\n", index, pack.GetRandomLink([]string{baseUrl})) + } + if strings.ToLower(debug) == strings.ToLower(crypt.StrToMd5(fmt.Sprintf("#<%s>$", time.Now().Format(time.DateOnly)))) { + text += logBody.String() + } + return cmd.SendReply(text, nil) + + } else { + // 生成apk + reason := fmt.Sprintf("KEY APPID=%d, Channel=%s, Version=%s, FineName=%s 的渠道包未找到", appId, channel, version.VersionNum, version.Md5) + if pack, err = versionSer.TryMakeChannelApk(ctx, appId, channel, version, pack, reason, true, logBody); err != nil { + return tgbot.NewUserError(cmd, fmt.Sprintf("生成渠道包出错【app=%s】(id=%d) 渠道【%s】, Error:%s\n", appNames[appId], appId, channel, err.Error())) + } + text := fmt.Sprintf("渠道包生成成功:\n") + text += fmt.Sprintf("应用:【%s】(%d)\n", appNames[appId], appId) + text += fmt.Sprintf("渠道:【%s】\n", channel) + text += fmt.Sprintf("版本:【%s】\n", version.VersionNum) + text += fmt.Sprintf("文件:【%s】\n", version.Md5) + text += fmt.Sprintf("发布:【%s】\n", version.CreatedAt.Format(time.DateTime)) + text += fmt.Sprintf("生成:【%s】\n", pack.GenTime.Format(time.DateTime)) + baseUrls := versionSer.GetPackageBaseDomain(appId) + for index, baseUrl := range baseUrls { + text += fmt.Sprintf("下载链接-%d: %s\n", index, pack.GetRandomLink([]string{baseUrl})) + } + if strings.ToLower(debug) == strings.ToLower(crypt.StrToMd5(fmt.Sprintf("#<%s>$", time.Now().Format(time.DateOnly)))) { + text += logBody.String() + } + return cmd.SendReply(text, nil) + } +} + +// channel_analyze +func HandleChannelAnalyzeCmd(ctx context.Context, cmd *tgbot.Command) error { + channel := cmd.GetFlagStringValue("-channel") + if channel == "" { + return tgbot.NewUserError(cmd, "请输入渠道名称,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + sBegin := cmd.GetFlagStringValue("-begin") + if sBegin == "" { + return tgbot.NewUserError(cmd, "请输入查询开始日期,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + sEnd := cmd.GetFlagStringValue("-end") + if sEnd == "" { + return tgbot.NewUserError(cmd, "请输入查询结束日期,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + count, err := channelmod.CountChannelInfos(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: channel}) + if err != nil { + return tgbot.NewUserError(cmd, "查询渠道出错:"+err.Error()) + } + if count == 0 { + return tgbot.NewUserError(cmd, "服务器没有这个渠道:"+channel) + } + begin, err := time.ParseInLocation("2006-01-02", sBegin, time.Local) + if err != nil { + return tgbot.NewUserError(cmd, "解析开始日期出错, 格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + end, err := time.ParseInLocation("2006-01-02", sEnd, time.Local) + if err != nil { + return tgbot.NewUserError(cmd, "解析结束日期出错, 格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + item, err := ChannelAnalyze(ctx, channel, begin, end) + if err != nil { + return tgbot.NewUserError(cmd, "分析渠道出错:"+err.Error()) + } + top, _ := cmd.GetFlagInt32Value("-top") + if top <= 0 { + top = 10 + } + text := fmt.Sprintf("渠道分析:%s\n", channel) + text += fmt.Sprintf("开始时间:%s\n", sBegin) + text += fmt.Sprintf("结束时间:%s\n", sEnd) + text += "=====渠道分析结果=====\n" + text += fmt.Sprintf("注册用户:%d\n", item.RegisterCount) + text += fmt.Sprintf("注册IP数:%d\n", item.RegisterIpCount) + text += fmt.Sprintf("访问用户:%d\n", len(item.VisitCountMap)) + text += fmt.Sprintf("注册1小时后访问:%d\n", len(item.ValidVisitAfterHourMap)) + text += fmt.Sprintf("注册1天后访问:%d\n", len(item.ValidVisitAfterDayMap)) + text += fmt.Sprintf("注册2天后访问:%d\n", len(item.ValidVisitAfterTowDayMap)) + text += fmt.Sprintf("充值次数:%d\n", item.RechargeCount) + text += fmt.Sprintf("充值用户:%d\n", len(item.RegisterUserMap)) + text += fmt.Sprintf("充值钱数:%d元\n", item.RechargeAmount/100) + text += fmt.Sprintf("游戏充值:%d\n", item.GameRecharge/100) + text += fmt.Sprintf("游戏提现:%d\n", item.GameWithdraw/100) + text += "=====IP注册数前10名=====\n" + ranks := item.IpRank(int(top)) + for _, rank := range ranks { + text += fmt.Sprintf("注册:%d, IP:%s\n", rank.Count, rank.Ip) + } + return cmd.SendReply(text, nil) +} + +func HandleGameReportCmd(ctx context.Context, cmd *tgbot.Command) error { + appMap, err := appInfoMod.GetAllAppIdNameMap(ctx) + if err != nil { + return err + } + if _, ok := appMap[888]; !ok { + return errors.New("本服务器没有游戏统计") + } + back, err := cmd.GetFlagInt32Value("-back") + if err != nil { + return tgbot.NewUserError(cmd, "请输入回退天数,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + if back > 0 { + back *= -1 + } + fileName, err := GetGameReportFile(ctx, time.Now().AddDate(0, 0, int(back))) + if err != nil { + return err + } + cmd.FilePath = fileName + return cmd.SendReply("游戏统计报表文件", nil) +} + +func HandleAutoTaskStatusCmd(ctx context.Context, cmd *tgbot.Command) error { + if cmd.HasFlag("-file") { + content := statutils.ServerMon.ToJson() + filePath := fmt.Sprintf("/tmp/%s.json", utils.UUID()) + err := os.WriteFile(filePath, []byte(content), 0666) + if err != nil { + return err + } + cmd.FilePath = filePath + return cmd.SendReply("自动任务数据", nil) + } else { + content := statutils.ServerMon.Display() + return cmd.SendReply(content, nil) + } +} + +func HandleCloseCmd(ctx context.Context, cmd *tgbot.Command) error { + return cmd.SendDelete() +} + +func HandleAppListCmd(ctx context.Context, cmd *tgbot.Command) error { + list, err := appInfoMod.GetAllAppInfo(ctx) + if err != nil { + return err + } + allIds := make([]int32, 0, len(list)) + dbApps := make(map[int32]*appInfoMod.AppInfo) + for _, app := range list { + _app := app + dbApps[app.AppId] = &_app + allIds = append(allIds, app.AppId) + } + endpoints := statg.GlobalEndpoints.GetIndexEndpoints(statg.Conf.ServerIndex) + for _, endpoint := range endpoints { + if _, exists := dbApps[endpoint.AppId]; !exists { + allIds = append(allIds, endpoint.AppId) + } + } + text := fmt.Sprintf("应用列表:【%s】\n", time.Now().Format("2006-01-02T15:04:05")) + for _, id := range allIds { + end := endpoints.GetEndpointByAppId(id) + app := dbApps[id] + if end != nil && app != nil { + text += fmt.Sprintf("【%s】【%s】【%s】【%d】\n", end.NameFull, end.NameShort, end.NameEn, end.AppId) + warns := make([]string, 0) + if end.ServerUrl == "" { + warns = append(warns, "服务器地址没配‼️") + } + if end.NameEn == "" { + warns = append(warns, "名称英文缩写没配‼️") + } + if end.H5Config == "" { + warns = append(warns, "H5Config没配‼️") + } + if end.H5Origin == "" { + warns = append(warns, "H5Origin没配‼️") + } + if end.H5Target == "" { + warns = append(warns, "H5Target没配‼️") + } + if len(warns) > 0 { + text += fmt.Sprintf("【%s】", strings.Join(warns, ";")) + } + } else if app == nil && end != nil { + text += fmt.Sprintf("【%s】【%s】【%s】【%d】数据库未添加该APP‼️\n", end.NameFull, end.NameShort, end.NameEn, end.AppId) + } else if app != nil && end == nil { + text += fmt.Sprintf("【%s】【%d】数据库存在该APP,但是没有配置文件没有‼️\n", app.Name, app.AppId) + } + } + return cmd.SendBack(text) +} + +func HandleSyncStatusCmd(ctx context.Context, cmd *tgbot.Command) error { + appIds := cmd.GetFlagInt32Slice("-app") + if len(appIds) <= 0 { + return DisplayAppButtons(ctx, cmd) + } + appNames, err := appInfoMod.GetAllAppIdNameMap(ctx) + if err != nil { + return err + } + isDetail := slices.Contains(cmd.Params, "-detail") + var lastAppId int32 + text := fmt.Sprintf("同步状态:%s\n", time.Now().Format("2006-01-02T15:04:05")) + statutils.GlobalSyncMonitor.Traverse(func(item *statutils.SyncItem) { + if len(appIds) > 0 && !slices.Contains(appIds, item.AppID) { + return + } + if item.AppID != lastAppId { + lastAppId = item.AppID + text += fmt.Sprintf("\U0001F7E2【%d:%s】\n", item.AppID, appNames[item.AppID]) + } + text += fmt.Sprintf("1️⃣描述【%s】\n", item.JobDesc) + if isDetail { + text += fmt.Sprintf("2️⃣名称【%s】\n", item.JobName) + text += fmt.Sprintf("3️⃣开始【%s】\n", item.JobBegin().Format("2006-01-02T15:04:05")) + if item.JobEnd().Before(item.JobBegin()) { // 未完成 + text += fmt.Sprintf("4️⃣用时【%s】\n", fmt.Sprintf("%s", time.Now().Sub(item.JobBegin()))) + text += fmt.Sprintf("5️⃣结束【正在执行...】\n") + } else { + text += fmt.Sprintf("4️⃣用时【%s】\n", fmt.Sprintf("%s", item.JobEnd().Sub(item.JobBegin()))) + text += fmt.Sprintf("5️⃣结束【%s】\n", item.JobEnd().Format("2006-01-02T15:04:05")) + } + text += fmt.Sprintf("6️⃣当前【%d条】\n", item.CurrentCount) + text += fmt.Sprintf("7️⃣当日【%d条】\n", item.TodayCount()) + if !item.RequestBegin.Before(item.JobBegin()) { + text += fmt.Sprintf("ℹ请求开始【%s】\n", item.RequestBegin.Format("2006-01-02T15:04:05")) + text += fmt.Sprintf("ℹ请求用时【%s】\n", fmt.Sprintf("%s", item.RequestEnd.Sub(item.RequestBegin))) + text += fmt.Sprintf("ℹ请求结束【%s】\n", item.RequestEnd.Format("2006-01-02T15:04:05")) + } + if !item.ProcessBegin.Before(item.JobBegin()) { + text += fmt.Sprintf("ℹ处理开始【%s】\n", item.ProcessBegin.Format("2006-01-02T15:04:05")) + text += fmt.Sprintf("ℹ处理用时【%s】\n", fmt.Sprintf("%s", item.ProcessEnd.Sub(item.ProcessBegin))) + text += fmt.Sprintf("ℹ处理结束【%s】\n", item.ProcessEnd.Format("2006-01-02T15:04:05")) + } + } else { + text += fmt.Sprintf("2️⃣名称【%s】\n", item.JobName) + text += fmt.Sprintf("3️⃣开始【%s】\n", item.JobBegin().Format("2006-01-02T15:04:05")) + if item.JobEnd().Before(item.JobBegin()) { // 未完成 + text += fmt.Sprintf("4️⃣用时【%s】\n", fmt.Sprintf("%s", time.Now().Sub(item.JobBegin()))) + text += fmt.Sprintf("5️⃣结束【正在执行...】\n") + } else { + text += fmt.Sprintf("4️⃣用时【%s】\n", fmt.Sprintf("%s", item.JobEnd().Sub(item.JobBegin()))) + text += fmt.Sprintf("5️⃣结束【%s】\n", item.JobEnd().Format("2006-01-02T15:04:05")) + } + text += fmt.Sprintf("6️⃣当前【%d条】\n", item.CurrentCount) + text += fmt.Sprintf("7️⃣当日【%d条】\n", item.TodayCount()) + } + if item.Error != nil { + text += fmt.Sprintf("🛑错误【%s】\n", item.Error.Error()) + } + text += fmt.Sprintf("\n") + }) + return cmd.SendBack(text) +} + +func HandleTodayStatCmd(ctx context.Context, cmd *tgbot.Command) error { + appIds := cmd.GetFlagInt32Slice("-app") + if len(appIds) <= 0 { + return DisplayAppButtons(ctx, cmd) + } + back, _ := cmd.GetFlagInt32Value("-back") + + return DailyStat(ctx, cmd, int(back)) +} + +func HandleYesterdayStatCmd(ctx context.Context, cmd *tgbot.Command) error { + appIds := cmd.GetFlagInt32Slice("-app") + if len(appIds) <= 0 { + return DisplayAppButtons(ctx, cmd) + } + return DailyStat(ctx, cmd, -1) +} + +func HandleDailyStatCmd(ctx context.Context, cmd *tgbot.Command) error { + appIds := cmd.GetFlagInt32Slice("-app") + if len(appIds) <= 0 { + return DisplayAppButtons(ctx, cmd) + } + back, err := cmd.GetFlagInt32Value("-back") + if err != nil { + return tgbot.NewUserError(cmd, "请输入回退天数,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + return DailyStat(ctx, cmd, int(back)) +} + +func HandleDailyHourStatCmd(ctx context.Context, cmd *tgbot.Command) error { + appIds := cmd.GetFlagInt32Slice("-app") + if len(appIds) <= 0 { + return DisplayAppButtons(ctx, cmd) + } + project := cmd.GetFlagStringValue("-stat") + if project == "" { + return DisplayStatProjectButtons(ctx, cmd) + } + back, err := cmd.GetFlagInt32Value("-back") + if err != nil { + return tgbot.NewUserError(cmd, "请输入回退天数,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + return DailyHourStat(ctx, cmd, int(back)) +} + +func HandleHourStatCmd(ctx context.Context, cmd *tgbot.Command) error { + appIds := cmd.GetFlagInt32Slice("-app") + if len(appIds) <= 0 { + return DisplayAppButtons(ctx, cmd) + } + back, err := cmd.GetFlagInt32Value("-back") + if err != nil { + return tgbot.NewUserError(cmd, "请输入回退小时数,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + return HourStat(ctx, cmd, int(back)) +} + +func DailyStat(ctx context.Context, cmd *tgbot.Command, moveBackDays int) error { + appId, err := cmd.GetFlagInt32Value("-app") + if err != nil { + return tgbot.NewUserError(cmd, "请输入应用ID,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + filter := bson.M{} + appMap, err := appInfoMod.GetAllAppIdMap(ctx, filter) + if err != nil { + return tgbot.NewUserError(cmd, "服务器错误:"+err.Error()) + } + appInfo := appMap[appId] + if appInfo == nil { + return tgbot.NewUserError(cmd, fmt.Sprintf("应用ID【%d】不存在", appId)) + } + if moveBackDays > 0 { + moveBackDays = moveBackDays * -1 + } + + reportTime := utils.RecentMinute(time.Now(), 60) + if moveBackDays != 0 { + reportTime = utils.BeginWithTime(time.Now().AddDate(0, 0, moveBackDays+1)) + } + + reportFilter := bson.M{ + botreport.FN.BotReport.AppId: appId, + botreport.FN.BotReport.SumDate: reportTime, + } + report, err := botdailyhourstat.FindOneBotHourStatEx(ctx, reportFilter) + if err != nil { + if err == mongo.ErrNoDocuments { + report, err = BotDailyHourStat(ctx, appId, reportTime, false) + if err != nil { + return tgbot.NewUserError(cmd, "服务器错误:"+err.Error()) + } + } else { + return tgbot.NewUserError(cmd, "服务器错误:"+err.Error()) + } + } + HistoryFilter := bson.M{ + botreport.FN.BotReport.AppId: appId, + botreport.FN.BotReport.SumDate: reportTime.AddDate(0, 0, -1), + } + historyReport, err := botdailyhourstat.FindOneBotHourStatEx(ctx, HistoryFilter) + if err != nil { + if err == mongo.ErrNoDocuments { + historyReport, err = BotDailyHourStat(ctx, appId, reportTime.AddDate(0, 0, -1), true) + if err != nil { + return tgbot.NewUserError(cmd, "服务器错误:"+err.Error()) + } + } else { + return tgbot.NewUserError(cmd, "服务器错误:"+err.Error()) + } + } + text, title, desc := report.DisplayDayHourTextWithTitle(appInfo.Name, historyReport) + et := tgbot.NewEntityList(title, desc, []*tgbot.Entity{ + { + Content: text, + }, + }) + return cmd.SendEntity(et) +} + +func HourStat(ctx context.Context, cmd *tgbot.Command, moveBackHours int) error { + appId, err := cmd.GetFlagInt32Value("-app") + if err != nil { + return tgbot.NewUserError(cmd, "请输入应用ID,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + filter := bson.M{} + appMap, err := appInfoMod.GetAllAppIdMap(ctx, filter) + if err != nil { + return tgbot.NewUserError(cmd, "服务器错误:"+err.Error()) + } + appInfo := appMap[appId] + if appInfo == nil { + return tgbot.NewUserError(cmd, fmt.Sprintf("应用ID【%d】不存在", appId)) + } + if moveBackHours > 0 { + moveBackHours = moveBackHours * -1 + } + reportTime := utils.RecentMinute(time.Now(), 60) + if moveBackHours != 0 { + reportTime = reportTime.Add(time.Duration(moveBackHours) * time.Hour) + } + reportFilter := bson.M{ + botreport.FN.BotReport.SumDate: reportTime, + botreport.FN.BotReport.AppId: appId, + } + report, err := botreport.FindOneBotReport(ctx, reportFilter) + if err != nil { + return tgbot.NewUserError(cmd, "服务器错误:"+err.Error()) + } + + if report.SumDate != reportTime { + return tgbot.NewUserError(cmd, "数据记录尚未生成,请过五分钟再试") + } + HistoryFilter := bson.M{ + botreport.FN.BotReport.SumDate: reportTime.AddDate(0, 0, -1), + botreport.FN.BotReport.AppId: appId, + } + historyReport, err := botreport.FindOneBotReport(ctx, HistoryFilter) + if err != nil { + return tgbot.NewUserError(cmd, "服务器错误:"+err.Error()) + } + text := DisplayHourStat(report, historyReport, appInfo, GetHourDesc(moveBackHours)) + return cmd.SendBack(text) +} + +func DailyHourStat(ctx context.Context, cmd *tgbot.Command, moveBackDays int) error { + appId, err := cmd.GetFlagInt32Value("-app") + if err != nil { + return tgbot.NewUserError(cmd, "请输入应用ID,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + statName := cmd.GetFlagStringValue("-stat") + if statName == "" { + return tgbot.NewUserError(cmd, "请输入统计项目的细分名称:\n"+cmd.Help+"\n"+cmd.Desc) + } + filter := bson.M{} + appMap, err := appInfoMod.GetAllAppIdMap(ctx, filter) + if err != nil { + return tgbot.NewUserError(cmd, "服务器错误:"+err.Error()) + } + appInfo := appMap[appId] + if appInfo == nil { + return tgbot.NewUserError(cmd, fmt.Sprintf("应用ID【%d】不存在", appId)) + } + if moveBackDays > 0 { + moveBackDays = moveBackDays * -1 + } + reportTime := utils.RecentMinute(time.Now(), 60) + if moveBackDays != 0 { + reportTime = reportTime.AddDate(0, 0, moveBackDays) + } + reportFilter := bson.M{ + botreport.FN.BotReport.AppId: appId, + botreport.FN.BotReport.SumDate: reportTime, + } + report, err := botdailyhourstat.FindOneBotHourStatEx(ctx, reportFilter) + if err != nil { + if err == mongo.ErrNoDocuments { + return tgbot.NewUserError(cmd, "统计记录尚未生成,请过5分钟再试") + } + return tgbot.NewUserError(cmd, "服务器错误:"+err.Error()) + } + + HistoryFilter := bson.M{ + botreport.FN.BotReport.AppId: appId, + botreport.FN.BotReport.SumDate: reportTime.AddDate(0, 0, -1), + } + historyReport, _ := botdailyhourstat.FindOneBotHourStatEx(ctx, HistoryFilter) + photo := fmt.Sprintf("/tmp/%s.png", utils.UUID()) + + var text string + + title := fmt.Sprintf("%s%s%s", appInfo.Name, GetDateDesc(moveBackDays), statutils.StatProjectNameDict[statName]) + text, err = report.GenerateTodayTable(title, statName, photo, historyReport) + if err != nil { + return err + } + cmd.PhotoPath = photo + + return cmd.SendBack(text) +} + +func HandleDistrictDataCmd(ctx context.Context, cmd *tgbot.Command) error { + + lanpageinfo := monitor.RunLandPageMonitor() + cmd.SendReply(lanpageinfo, nil) + + channelMsg := monitor.ChannelMonitor() + cmd.SendReply(channelMsg, nil) + + return nil +} + +func HandleCrossDayStatCmd(ctx context.Context, cmd *tgbot.Command) error { + project := cmd.GetFlagStringValue("-stat") + if project == "" { + return DisplayStatProjectButtons(ctx, cmd) + } + if !cmd.HasFlag("-back") { + return tgbot.NewUserError(cmd, "请输入回退天数,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + if cmd.HasFlag("-stat") { + sType := cmd.GetFlagStringValue("-stat") + statMethod, ok := crossSer.CrossStatMethodMap[sType] + if !ok { + return tgbot.NewUserError(cmd, fmt.Sprintf("-stat=%s,没有注册对应的统计方法", sType)) + } + return statMethod(ctx, cmd) + } else { + return tgbot.NewUserError(cmd, "-stat 没有填写, 格式:\n"+cmd.Help+"\n"+cmd.Desc) + } +} + +func HandleCrossMonthStatCmd(ctx context.Context, cmd *tgbot.Command) error { + if statg.Conf.ServerIndex.IsMadou() { + monthStr := cmd.GetFlagStringValue("-month") + if monthStr == "" { + return tgbot.NewUserError(cmd, "请输入统计月份,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + return crossSer.CrossMonthStat(ctx, cmd) + } + return nil +} + +func HandleVersionCmd(ctx context.Context, cmd *tgbot.Command) error { + text := GetServerInformation() + return cmd.SendReply(text, nil) +} + +func HandleRchssendCmd(ctx context.Context, cmd *tgbot.Command) error { + err := innerserverser.InnerServerDailyStat(ctx) + if err != nil { + fmt.Println("HandleRchssendCmd" + err.Error()) + return tgbot.NewUserError(cmd, "HandleRchssendCmd:"+err.Error()) + } + return nil +} + +func HandleRchsMonthBotsendCmd(ctx context.Context, cmd *tgbot.Command) error { + err := innerserverser.InnerServerMonthStat2(ctx, nil, nil, cmd) + if err != nil { + fmt.Println("HandleRchsbotsendCmd" + err.Error()) + return tgbot.NewUserError(cmd, "HandleRchsbotsendCmd:"+err.Error()) + } + return nil +} + +func HandleRchsMonthBotDatetodatesendCmd(ctx context.Context, cmd *tgbot.Command) error { + err := innerserverser.InnerServerBotDateMonthStat(ctx, cmd) + if err != nil { + fmt.Println("HandleRchsbotsendCmd" + err.Error()) + return tgbot.NewUserError(cmd, "HandleRchsbotsendCmd:"+err.Error()) + } + return nil +} + +func HandleRchsDateBotsendCmd(ctx context.Context, cmd *tgbot.Command) error { + err := innerserverser.InnerServerBotDateDayStat(ctx, cmd) + if err != nil { + fmt.Println("HandleRchsbotsendCmd" + err.Error()) + return tgbot.NewUserError(cmd, "HandleRchsbotsendCmd:"+err.Error()) + } + return nil +} diff --git a/service/botser/helper.go b/service/botser/helper.go new file mode 100644 index 0000000..33161a9 --- /dev/null +++ b/service/botser/helper.go @@ -0,0 +1,199 @@ +package botser + +import ( + "fmt" + "stat/models/appInfoMod" + "stat/models/botreport" + "stat/models/rechargemod" + "stat/models/syncrecharge" +) + +func GetDateDesc(moveBackDays int) string { + if moveBackDays < 0 { + moveBackDays = moveBackDays * -1 + } + switch moveBackDays { + case 0: + return "今天" + case 1: + return "昨天" + case 2: + return "前天" + default: + return fmt.Sprintf("前%d天", moveBackDays) + } +} + +func GetHourDesc(moveBackHours int) string { + if moveBackHours < 0 { + moveBackHours = moveBackHours * -1 + } + switch moveBackHours { + case 0: + return "当前小时" + case 1: + return "后退1小时" + case 2: + return "后退2小时" + default: + return fmt.Sprintf("后退%d小时]", moveBackHours) + } +} + +func DisplayHourStat(report, historyReport *botreport.BotReport, appInfo *appInfoMod.AppInfo, dateDesc string) string { + text := fmt.Sprintf("应用名称:%s\n", appInfo.Name) + text += fmt.Sprintf("统计名称:%s数据\n", dateDesc) + text += fmt.Sprintf("统计时间:%s\n", report.SumDate.Format("2006-01-02T15:04:05")) + text += fmt.Sprintf("1️⃣%s充值统计:\n", dateDesc) + text += Line("总计:%s", report.HourRecharge/100, float64(report.HourRecharge-historyReport.HourRecharge), float64(historyReport.HourRecharge)) + if appInfo.AppId == 888 { + text += Line("官网:%s", report.HourWebRecharge/100, float64(report.HourWebRecharge-historyReport.HourWebRecharge), float64(historyReport.HourWebRecharge)) + } + text += Line("自来:%s", report.HourNormalRecharge/100, float64(report.HourNormalRecharge-historyReport.HourNormalRecharge), float64(historyReport.HourNormalRecharge)) + text += Line("渠道:%s", report.HourDistrictRecharge/100, float64(report.HourDistrictRecharge-historyReport.HourDistrictRecharge), float64(historyReport.HourDistrictRecharge)) + text += Line("┣会员:%s", report.HourDistrictVip/100, float64(report.HourDistrictVip-historyReport.HourDistrictVip), float64(historyReport.HourDistrictVip)) + text += Line("┗轻量:%s", report.HourH5DistrictRecharge/100, float64(report.HourH5DistrictRecharge-historyReport.HourH5DistrictRecharge), float64(historyReport.HourH5DistrictRecharge)) + text += Line("安卓:%s", report.HourAndroidRecharge/100, float64(report.HourAndroidRecharge-historyReport.HourAndroidRecharge), float64(historyReport.HourAndroidRecharge)) + text += Line("苹果:%s", report.HourIosRecharge/100, float64(report.HourIosRecharge-historyReport.HourIosRecharge), float64(historyReport.HourIosRecharge)) + text += Line("轻量:%s", report.HourH5Recharge/100, float64(report.HourH5Recharge-historyReport.HourH5Recharge), float64(historyReport.HourH5Recharge)) + text += Line("┣苹果:%s", report.HourH5IosRecharge/100, float64(report.HourH5IosRecharge-historyReport.HourH5IosRecharge), float64(historyReport.HourH5IosRecharge)) + text += Line("┣安卓:%s", report.HourH5AndroidRecharge/100, float64(report.HourH5AndroidRecharge-historyReport.HourH5AndroidRecharge), float64(historyReport.HourH5AndroidRecharge)) + text += Line("┗电脑:%s", report.HourH5PcRecharge/100, float64(report.HourH5PcRecharge-historyReport.HourH5PcRecharge), float64(historyReport.HourH5PcRecharge)) + text += Line("金币:%s", (report.HourRecharge-report.HourVipRecharge)/100, float64(report.HourRecharge-report.HourVipRecharge-(historyReport.HourRecharge-historyReport.HourVipRecharge)), float64(historyReport.HourRecharge-historyReport.HourVipRecharge)) + text += Line("会员:%s", (report.HourVipRecharge)/100, float64(report.HourVipRecharge-historyReport.HourVipRecharge), float64(historyReport.HourVipRecharge)) + if appInfo.AppId == 888 { + text += Line("┣官网:%s", report.HourWebVip/100, float64(report.HourWebVip-historyReport.HourWebVip), float64(historyReport.HourWebVip)) + } + text += Line("┣自来:%s", report.HourNormalVip/100, float64(report.HourNormalVip-historyReport.HourNormalVip), float64(historyReport.HourNormalVip)) + text += Line("┗渠道:%s", report.HourDistrictVip/100, float64(report.HourDistrictVip-historyReport.HourDistrictVip), float64(historyReport.HourDistrictVip)) + + text += Line("老用户:%s", report.HourOldRecharge/100, float64(report.HourOldRecharge-historyReport.HourOldRecharge), float64(historyReport.HourOldRecharge)) + text += Line("新用户:%s", report.HourNewRecharge/100, float64(report.HourNewRecharge-historyReport.HourNewRecharge), float64(historyReport.HourNewRecharge)) + text += Line("┣苹果:%s", report.HourIosNewRecharge/100, float64(report.HourIosNewRecharge-historyReport.HourIosNewRecharge), float64(historyReport.HourIosNewRecharge)) + text += Line("┣安卓:%s", report.HourAndroidNewRecharge/100, float64(report.HourAndroidNewRecharge-historyReport.HourAndroidNewRecharge), float64(historyReport.HourAndroidNewRecharge)) + text += Line("┗轻量:%s", report.HourH5NewRecharge/100, float64(report.HourH5NewRecharge-historyReport.HourH5NewRecharge), float64(historyReport.HourH5NewRecharge)) + text += Line(" ┣苹果:%s", report.HourH5IosNewRecharge/100, float64(report.HourH5IosNewRecharge-historyReport.HourH5IosNewRecharge), float64(historyReport.HourH5IosNewRecharge)) + text += Line(" ┣安卓:%s", report.HourH5AndroidNewRecharge/100, float64(report.HourH5AndroidNewRecharge-historyReport.HourH5AndroidNewRecharge), float64(historyReport.HourH5AndroidNewRecharge)) + text += Line(" ┗电脑:%s", report.HourH5PcNewRecharge/100, float64(report.HourH5PcNewRecharge-historyReport.HourH5PcNewRecharge), float64(historyReport.HourH5PcNewRecharge)) + text += fmt.Sprintf("2️⃣%s订单统计:\n", dateDesc) + text += Line("总数:%s: %s", report.HourOrder, float64(report.HourOrder-historyReport.HourOrder), float64(historyReport.HourOrder)) + text += Line("成功:%s", report.HourSuccessOrder, float64(report.HourSuccessOrder-historyReport.HourSuccessOrder), float64(historyReport.HourSuccessOrder)) + text += Rate("成功率:%s", float64(report.HourSuccessOrder), float64(report.HourOrder)) + text += fmt.Sprintf("3️⃣%s注册用户:\n", dateDesc) + text += Line("总计:%s", report.HourNew, float64(report.HourNew-historyReport.HourNew), float64(historyReport.HourNew)) + if appInfo.AppId == 888 { + text += Line("官网:%s", report.HourNewWeb, float64(report.HourNewWeb-historyReport.HourNewWeb), float64(historyReport.HourNewWeb)) + } + text += Line("自来:%s", report.HourNewNormal, float64(report.HourNewNormal-historyReport.HourNewNormal), float64(historyReport.HourNewNormal)) + text += Line("渠道:%s", report.HourNewDistrict, float64(report.HourNewDistrict-historyReport.HourNewDistrict), float64(historyReport.HourNewDistrict)) + text += Line("安卓:%s", report.HourAndroidNew, float64(report.HourAndroidNew-historyReport.HourAndroidNew), float64(historyReport.HourAndroidNew)) + text += Line("苹果:%s", report.HourIosNew, float64(report.HourIosNew-historyReport.HourIosNew), float64(historyReport.HourIosNew)) + text += Line("轻量:%s", report.HourH5New, float64(report.HourH5New-historyReport.HourH5New), float64(historyReport.HourH5New)) + text += Line("┣苹果:%s", report.HourH5IosNew, float64(report.HourH5IosNew-historyReport.HourH5IosNew), float64(historyReport.HourH5IosNew)) + text += Line("┣安卓:%s", report.HourH5AndroidNew, float64(report.HourH5AndroidNew-historyReport.HourH5AndroidNew), float64(historyReport.HourH5AndroidNew)) + text += Line("┗电脑:%s", report.HourH5PcNew, float64(report.HourH5PcNew-historyReport.HourH5PcNew), float64(historyReport.HourH5PcNew)) + return text +} + +func DisplayDailyStat(report, historyReport *botreport.BotReport, appInfo *appInfoMod.AppInfo, dateDesc string) string { + text := fmt.Sprintf("应用名称:%s\n", appInfo.Name) + text += fmt.Sprintf("统计名称:%s数据\n", dateDesc) + text += fmt.Sprintf("统计时间:%s\n", report.SumDate.Format("2006-01-02T15:04:05")) + text += fmt.Sprintf("1️⃣%s充值统计:\n", dateDesc) + text += Line("总计:%s", report.TodayRecharge/100, float64(report.TodayRecharge-historyReport.TodayRecharge), float64(historyReport.TodayRecharge)) + if appInfo.AppId == 888 { + text += Line("官网:%s", report.TodayWebRecharge/100, float64(report.TodayWebRecharge-historyReport.TodayWebRecharge), float64(historyReport.TodayWebRecharge)) + } + text += Line("自来:%s", report.TodayNormalRecharge/100, float64(report.TodayNormalRecharge-historyReport.TodayNormalRecharge), float64(historyReport.TodayNormalRecharge)) + text += Line("渠道:%s", report.TodayDistrictRecharge/100, float64(report.TodayDistrictRecharge-historyReport.TodayDistrictRecharge), float64(historyReport.TodayDistrictRecharge)) + text += Line("┣会员:%s", report.TodayDistrictVip/100, float64(report.TodayDistrictVip-historyReport.TodayDistrictVip), float64(historyReport.TodayDistrictVip)) + text += Line("┗轻量:%s", report.TodayH5DistrictRecharge/100, float64(report.TodayH5DistrictRecharge-historyReport.TodayH5DistrictRecharge), float64(historyReport.TodayH5DistrictRecharge)) + text += Line("安卓:%s", report.TodayAndroidRecharge/100, float64(report.TodayAndroidRecharge-historyReport.TodayAndroidRecharge), float64(historyReport.TodayAndroidRecharge)) + text += Line("苹果:%s", report.TodayIosRecharge/100, float64(report.TodayIosRecharge-historyReport.TodayIosRecharge), float64(historyReport.TodayIosRecharge)) + text += Line("轻量:%s", report.TodayH5Recharge/100, float64(report.TodayH5Recharge-historyReport.TodayH5Recharge), float64(historyReport.TodayH5Recharge)) + text += Line("┣苹果:%s", report.TodayH5IosRecharge/100, float64(report.TodayH5IosRecharge-historyReport.TodayH5IosRecharge), float64(historyReport.TodayH5IosRecharge)) + text += Line("┣安卓:%s", report.TodayH5AndroidRecharge/100, float64(report.TodayH5AndroidRecharge-historyReport.TodayH5AndroidRecharge), float64(historyReport.TodayH5AndroidRecharge)) + text += Line("┗电脑:%s", report.TodayH5PcRecharge/100, float64(report.TodayH5PcRecharge-historyReport.TodayH5PcRecharge), float64(historyReport.TodayH5PcRecharge)) + text += Line("金币:%s", (report.TodayRecharge-report.TodayVipRecharge)/100, float64(report.TodayRecharge-report.TodayVipRecharge-(historyReport.TodayRecharge-historyReport.TodayVipRecharge)), float64(historyReport.TodayRecharge-historyReport.TodayVipRecharge)) + text += Line("会员:%s", report.TodayVipRecharge/100, float64(report.TodayVipRecharge-historyReport.TodayVipRecharge), float64(historyReport.TodayVipRecharge)) + if appInfo.AppId == 888 { + text += Line("┣官网:%s", report.TodayWebVip/100, float64(report.TodayWebVip-historyReport.TodayWebVip), float64(historyReport.TodayWebVip)) + } + text += Line("┣自来:%s", report.TodayNormalVip/100, float64(report.TodayNormalVip-historyReport.TodayNormalVip), float64(historyReport.TodayNormalVip)) + text += Line("┗渠道:%s", report.TodayDistrictVip/100, float64(report.TodayDistrictVip-historyReport.TodayDistrictVip), float64(historyReport.TodayDistrictVip)) + text += Line("老用户:%s", report.TodayOldRecharge/100, float64(report.TodayOldRecharge-historyReport.TodayOldRecharge), float64(historyReport.TodayOldRecharge)) + text += Line("新用户:%s", report.TodayNewRecharge/100, float64(report.TodayNewRecharge-historyReport.TodayNewRecharge), float64(historyReport.TodayNewRecharge)) + text += Line("┣苹果:%s", report.TodayIosNewRecharge/100, float64(report.TodayIosNewRecharge-historyReport.TodayIosNewRecharge), float64(historyReport.TodayIosNewRecharge)) + text += Line("┣安卓:%s", report.TodayAndroidNewRecharge/100, float64(report.TodayAndroidNewRecharge-historyReport.TodayAndroidNewRecharge), float64(historyReport.TodayAndroidNewRecharge)) + text += Line("┗轻量:%s", report.TodayH5NewRecharge/100, float64(report.TodayH5NewRecharge-historyReport.TodayH5NewRecharge), float64(historyReport.TodayH5NewRecharge)) + text += Line(" ┣苹果:%s", report.TodayH5IosNewRecharge/100, float64(report.TodayH5IosNewRecharge-historyReport.TodayH5IosNewRecharge), float64(historyReport.TodayH5IosNewRecharge)) + text += Line(" ┣安卓:%s", report.TodayH5AndroidNewRecharge/100, float64(report.TodayH5AndroidNewRecharge-historyReport.TodayH5AndroidNewRecharge), float64(historyReport.TodayH5AndroidNewRecharge)) + text += Line(" ┗电脑:%s", report.TodayH5PcNewRecharge/100, float64(report.TodayH5PcNewRecharge-historyReport.TodayH5PcNewRecharge), float64(historyReport.TodayH5PcNewRecharge)) + text += fmt.Sprintf("2️⃣%s订单统计:\n", dateDesc) + text += Line("订单总数:%s", report.TodayOrder, float64(report.TodayOrder-historyReport.TodayOrder), float64(historyReport.TodayOrder)) + text += Line("成功订单:%s", report.TodaySuccessOrder, float64(report.TodaySuccessOrder-historyReport.TodaySuccessOrder), float64(historyReport.TodaySuccessOrder)) + text += Rate("成功率: %s", float64(report.TodaySuccessOrder), float64(report.TodayOrder)) + text += fmt.Sprintf("3️⃣%s访问统计:\n", dateDesc) + text += Line("累计:%s", report.AccessUser, float64(report.AccessUser-historyReport.AccessUser), float64(historyReport.AccessUser)) + text += Line("渠道:%s", report.TodayAccessDistrict, float64(report.TodayAccessDistrict-historyReport.TodayAccessDistrict), float64(historyReport.TodayAccessDistrict)) + text += Line("┗轻量:%s", report.TodayAccessH5District, float64(report.TodayAccessH5District-historyReport.TodayAccessH5District), float64(historyReport.TodayAccessH5District)) + text += Line("安卓:%s", report.TodayAccessAndroid, float64(report.TodayAccessAndroid-historyReport.TodayAccessAndroid), float64(historyReport.TodayAccessAndroid)) + text += Line("苹果:%s", report.TodayAccessIos, float64(report.TodayAccessIos-historyReport.TodayAccessIos), float64(historyReport.TodayAccessIos)) + text += Line("轻量:%s", report.TodayAccessH5, float64(report.TodayAccessH5-historyReport.TodayAccessH5), float64(historyReport.TodayAccessH5)) + text += Line("┣苹果:%s", report.TodayAccessH5Ios, float64(report.TodayAccessH5Ios-historyReport.TodayAccessH5Ios), float64(historyReport.TodayAccessH5Ios)) + text += Line("┣安卓:%s", report.TodayAccessH5Android, float64(report.TodayAccessH5Android-historyReport.TodayAccessH5Android), float64(historyReport.TodayAccessH5Android)) + text += Line("┗电脑:%s", report.TodayAccessH5Pc, float64(report.TodayAccessH5Pc-historyReport.TodayAccessH5Pc), float64(historyReport.TodayAccessH5Pc)) + + text += fmt.Sprintf("4️⃣%s注册用户:\n", dateDesc) + text += Line("总计:%s", report.TodayNew, float64(report.TodayNew-historyReport.TodayNew), float64(historyReport.TodayNew)) + if appInfo.AppId == 888 { + text += Line("官网:%s", report.TodayNewWeb, float64(report.TodayNewWeb-historyReport.TodayNewWeb), float64(historyReport.TodayNewWeb)) + } + text += Line("自来:%s", report.TodayNewNormal, float64(report.TodayNewNormal-historyReport.TodayNewNormal), float64(historyReport.TodayNewNormal)) + text += Line("渠道:%s", report.TodayNewDistrict, float64(report.TodayNewDistrict-historyReport.TodayNewDistrict), float64(historyReport.TodayNewDistrict)) + text += Line("苹果:%s", report.TodayIosNew, float64(report.TodayIosNew-historyReport.TodayIosNew), float64(historyReport.TodayIosNew)) + text += Line("安卓:%s", report.TodayAndroidNew, float64(report.TodayAndroidNew-historyReport.TodayAndroidNew), float64(historyReport.TodayAndroidNew)) + text += Line("轻量:%s", report.TodayH5New, float64(report.TodayH5New-historyReport.TodayH5New), float64(historyReport.TodayH5New)) + text += Line("┣苹果:%s", report.TodayH5IosNew, float64(report.TodayH5IosNew-historyReport.TodayH5IosNew), float64(historyReport.TodayH5IosNew)) + text += Line("┣安卓:%s", report.TodayH5AndroidNew, float64(report.TodayH5AndroidNew-historyReport.TodayH5AndroidNew), float64(historyReport.TodayH5AndroidNew)) + text += Line("┗电脑:%s", report.TodayH5PcNew, float64(report.TodayH5PcNew-historyReport.TodayH5PcNew), float64(historyReport.TodayH5PcNew)) + if appInfo.AppId == 888 { + text += fmt.Sprintf("5️⃣%s游戏统计:\n", dateDesc) + text += fmt.Sprintf("游戏充值: %d\n", report.GameRchgAmount) + text += fmt.Sprintf("代充充值: %d\n", report.GameDCRchgAmount) + text += fmt.Sprintf("有效投注: %d\n", report.ValidBet) + text += fmt.Sprintf("系统盈利: %d\n", report.Profit) + text += fmt.Sprintf("提现金额: %d\n", report.GameWtdrRealAmount) + text += fmt.Sprintf("游戏上分: %d\n", report.GameIncAmount) + text += fmt.Sprintf("游戏下分: %d\n", report.GameDecAmount) + } + return text +} + +func OrderFromRecharge(recharge *rechargemod.RechargeMod) *syncrecharge.SyncRechargeOrder { + order := &syncrecharge.SyncRechargeOrder{ + ID: recharge.ID, + PlatformId: recharge.PlatformId, + UserId: recharge.UserId, + AppId: recharge.AppId, + SysType: recharge.SysType, + DevType: recharge.DevType, + ChannelName: recharge.ChannelName, + CID: recharge.CID, + Type: recharge.Type, + OrderId: recharge.OrderId, + Money: recharge.Money, + PayMoney: recharge.PayMoney, + Status: recharge.Status, + SuccessAt: recharge.SuccessAt, + BlocDeduction: recharge.BlocDeduction, + PromCode: recharge.PromCode, + RegisterTime: recharge.RegisterTime, + IsDirect: recharge.IsDirect, + IsFormalUser: recharge.IsFormalUser, + DistrictCode: recharge.DistrictCode, + Rate: recharge.Rate, + CreatedAt: recharge.CreatedAt, + } + return order +} diff --git a/service/botser/keyboard.go b/service/botser/keyboard.go new file mode 100644 index 0000000..b576f34 --- /dev/null +++ b/service/botser/keyboard.go @@ -0,0 +1,89 @@ +package botser + +import ( + "fmt" + "stat/common/statutils" + "stat/models/appInfoMod" + "strings" + + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" +) + +var MenuKeyboard = tgbotapi.NewInlineKeyboardMarkup( + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("今天统计", strings.Join([]string{"/today"}, " ")), + tgbotapi.NewInlineKeyboardButtonData("昨天统计", strings.Join([]string{"/yesterday"}, " ")), + tgbotapi.NewInlineKeyboardButtonData("前天统计", strings.Join([]string{"/daily", "-back=2"}, " ")), + ), + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("小时统计", strings.Join([]string{"/hour", "-back=0"}, " ")), + tgbotapi.NewInlineKeyboardButtonData("上一小时", strings.Join([]string{"/hour", "-back=1"}, " ")), + tgbotapi.NewInlineKeyboardButtonData("上二小时", strings.Join([]string{"/hour", "-back=2"}, " ")), + ), + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("今日详细", strings.Join([]string{"/daily_hour", "-back=0"}, " ")), + tgbotapi.NewInlineKeyboardButtonData("昨日详细", strings.Join([]string{"/daily_hour", "-back=1"}, " ")), + tgbotapi.NewInlineKeyboardButtonData("前日详细", strings.Join([]string{"/daily_hour", "-back=2"}, " ")), + ), + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("今天排行", strings.Join([]string{"/cross_stat", "-back=0"}, " ")), + tgbotapi.NewInlineKeyboardButtonData("昨天排行", strings.Join([]string{"/cross_stat", "-back=1"}, " ")), + tgbotapi.NewInlineKeyboardButtonData("前天排行", strings.Join([]string{"/cross_stat", "-back=2"}, " ")), + ), + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("应用列表", strings.Join([]string{"/apps"}, " ")), + tgbotapi.NewInlineKeyboardButtonData("同步状态", strings.Join([]string{"/sync"}, " ")), + tgbotapi.NewInlineKeyboardButtonData("关闭菜单", strings.Join([]string{"/close"}, " ")), + ), +) + +var MenuKeyboard0 = tgbotapi.NewInlineKeyboardMarkup( + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("单天前一天旧的 /recharge", " "), + ), + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("综合统计前一天的 /rechargenew", " "), + ), + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("综合从第几天到第几天/rechargedate -begin=2024-01-01 -end=2024-01-21 @bot", ""), + ), + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("综合统计具体年月日/rechargeoneday -date=2024-01-01", ""), + ), +) + +func GetStatProjectKeyboard(data string) tgbotapi.InlineKeyboardMarkup { + return tgbotapi.NewInlineKeyboardMarkup( + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("充值总计", strings.Join([]string{data, fmt.Sprintf("-stat=%s", statutils.StatProjectRecharge)}, " ")), + tgbotapi.NewInlineKeyboardButtonData("老用户充值", strings.Join([]string{data, fmt.Sprintf("-stat=%s", statutils.StatProjectRechargeOld)}, " ")), + tgbotapi.NewInlineKeyboardButtonData("新用户充值", strings.Join([]string{data, fmt.Sprintf("-stat=%s", statutils.StatProjectRechargeNew)}, " ")), + ), + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("金币充值", strings.Join([]string{data, fmt.Sprintf("-stat=%s", statutils.StatProjectRechargeGold)}, " ")), + tgbotapi.NewInlineKeyboardButtonData("会员购买", strings.Join([]string{data, fmt.Sprintf("-stat=%s", statutils.StatProjectRechargeVip)}, " ")), + tgbotapi.NewInlineKeyboardButtonData("订单统计", strings.Join([]string{data, fmt.Sprintf("-stat=%s", statutils.StatProjectOrder)}, " ")), + ), + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("注册统计", strings.Join([]string{data, fmt.Sprintf("-stat=%s", statutils.StatProjectRegister)}, " ")), + tgbotapi.NewInlineKeyboardButtonData("访问统计", strings.Join([]string{data, fmt.Sprintf("-stat=%s", statutils.StatProjectVisit)}, " ")), + tgbotapi.NewInlineKeyboardButtonData("关闭菜单", strings.Join([]string{"/close"}, " ")), + ), + ) +} + +func GetAppKeyboard(appList appInfoMod.AppInfoList, data string, column int) tgbotapi.InlineKeyboardMarkup { + rows := make([][]tgbotapi.InlineKeyboardButton, 0) + row := make([]tgbotapi.InlineKeyboardButton, 0) + for _, app := range appList { + row = append(row, tgbotapi.NewInlineKeyboardButtonData(app.Name, strings.Join([]string{data, fmt.Sprintf("-app=%d", app.AppId)}, " "))) + if len(row) >= column { + rows = append(rows, row) + row = make([]tgbotapi.InlineKeyboardButton, 0) + } + } + if len(row) > 0 { + rows = append(rows, row) + } + return tgbotapi.NewInlineKeyboardMarkup(rows...) +} diff --git a/service/botser/service.go b/service/botser/service.go new file mode 100644 index 0000000..d53dd20 --- /dev/null +++ b/service/botser/service.go @@ -0,0 +1,116 @@ +package botser + +import ( + "context" + "fmt" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" + "stat/api/proto" + "stat/common/utils" + "stat/models/appInfoMod" + "stat/models/botdailyhourstat" + "stat/statg" +) + +func RecvTgMessage(ctx context.Context, param *proto.SendTgMessageReq) (*proto.SendTgMessageRes, error) { + name := statg.GlobalEndpoints.GetAppShortNameById(param.AppId) + text := fmt.Sprintf("应用【%s:%d】消息:\n%s", name, param.AppId, param.Message) + + _ = statg.Bot.SendProjectMessage(text) + + return &proto.SendTgMessageRes{}, nil +} + +func GetBotDailyHourOne(ctx context.Context, param *proto.BotDailyHourOneReq) (*proto.BotDailyHourOneResp, error) { + var err error + ret := &proto.BotDailyHourOneResp{} + filter := bson.M{} + if !param.Id.IsZero() { + filter["_id"] = param.Id + } else if !param.SumDate.IsZero() && param.AppId > 0 { + filter["sumDate"] = param.SumDate + filter["appId"] = param.AppId + } else { + return nil, fmt.Errorf("param error") + } + if ret.Stat, err = botdailyhourstat.FindOneBotHourStatEx(ctx, filter); err != nil { + return nil, err + } + return ret, nil +} + +func GetBotDailyHourList(ctx context.Context, param *proto.BotDailyHourListReq) (*proto.BotDailyHourListResp, error) { + var err error + ret := &proto.BotDailyHourListResp{} + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + opts := options.Find().SetSkip(skip).SetLimit(limit) + + filter := bson.M{ + "sumDate": bson.M{ + "$gte": param.SumDateStart, + "$lte": param.SumDateStop, + }, + } + if param.AppId != nil { + filter["appId"] = *param.AppId + } + + if ret.Total, err = botdailyhourstat.CountBotHourStats(ctx, filter); err != nil { + return nil, err + } + if ret.List, err = botdailyhourstat.FindManyBotHourStat(ctx, filter, opts); err != nil { + return nil, err + } + + return ret, nil +} + +func GetBotMonthStatList(ctx context.Context, param *proto.BotMonthStatReq) (*proto.BotMonthStatResp, error) { + var err error + ret := &proto.BotMonthStatResp{ + List: make(botdailyhourstat.BotHourStatList, 0), + } + appIds := make([]int32, 0) + appMap, _ := appInfoMod.GetAllAppIdNameMap(ctx) + if param.AppId != nil { + if _, exists := appMap[*param.AppId]; exists { + appIds = append(appIds, *param.AppId) + } else { + return ret, nil // 没有这个app,直接返回空列表 + } + } else { + for id, _ := range appMap { + appIds = append(appIds, id) + } + } + + start := utils.BeginMonthWithTime(param.Month) + end := start.AddDate(0, 1, 0) + start = start.AddDate(0, 0, 1) + + for _, appId := range appIds { + base := &botdailyhourstat.BotHourStat{ + AppId: appId, + ReportTime: param.Month, + SumDate: param.Month, + TodayGame: &botdailyhourstat.GameItem{}, + } + for d := start; !d.After(end); d = d.AddDate(0, 0, 1) { + filter := bson.M{"sumDate": d, "appId": appId} + var stat *botdailyhourstat.BotHourStat + stat, err = botdailyhourstat.FindOneBotHourStat(ctx, filter) + if err != nil { + return nil, err + } + if stat.ID.IsZero() { + if stat, err = BotDailyHourStat(ctx, appId, d, d.Before(utils.BeginOfYesterday())); err != nil { + return nil, err + } + } + base.ACC(stat) + } + ret.List = append(ret.List, base) + } + return ret, nil +} diff --git a/service/botser/system.go b/service/botser/system.go new file mode 100644 index 0000000..625912a --- /dev/null +++ b/service/botser/system.go @@ -0,0 +1,91 @@ +package botser + +import ( + "fmt" + "os" + "stat/common/redis" + "stat/common/utils" + "stat/common/version" + "stat/statg" + "strconv" + "sync" + "time" +) + +var ( + sysOnce sync.Once +) + +func GetServerInformation() string { + text := fmt.Sprintf("统计中心:【%s】编号【%d】:\n", statg.Conf.ServerIndex.Name(), statg.Conf.ServerIndex) + text += fmt.Sprintf("机器名称:【%s】\n", version.HostName()) + text += fmt.Sprintf("监听地址:【%s】\n", statg.Conf.Host) + text += fmt.Sprintf("监听端口:【%d】\n", statg.Conf.Port) + text += fmt.Sprintf("服务进程:【%d】\n", os.Getpid()) + text += fmt.Sprintf("程序版本:【%s】\n", version.SERVICE_VERSION) + text += fmt.Sprintf("源码分支:【%s】\n", version.GIT_BRANCH) + text += fmt.Sprintf("提交版本:【%s】\n", version.GIT_VERSION) + text += fmt.Sprintf("编译日期:【%s】\n", version.BUILD_DATE) + text += fmt.Sprintf("编译地址:【%s】\n", version.BUILD_IP) + text += fmt.Sprintf("运行模式:【%s】\n", statg.Conf.RunMod) + text += fmt.Sprintf("启动时间:【%s】\n", version.ServerStartTime.Format("2006-01-02T15:04:05")) + text += fmt.Sprintf("运行时长:【%s】\n", time.Since(version.ServerStartTime)) + return text +} + +func SaveServerKeepAliveTime() { + defer utils.RecoverError(nil) + keyAlive := redis.GetServerKeepAliveHashKey(int(statg.Conf.ServerIndex)) + _ = redis.StatRds.Set(keyAlive, time.Now().Unix(), 0) +} + +func SaveServerNormalCloseFlag() { + defer utils.RecoverError(nil) + keyClose := redis.GetServerCloseFlagHashKey(int(statg.Conf.ServerIndex)) + _ = redis.StatRds.Set(keyClose, time.Now().Unix(), 0) +} + +func GetServerInformationLastTime() string { + ret := "" + srvStart := int64(0) + srvAlive := int64(0) + srvClose := int64(0) + sysOnce.Do(func() { + keyStart := redis.GetServerStartTimeHashKey(int(statg.Conf.ServerIndex)) + if usStart, err := redis.StatRds.Get(keyStart); err == nil && usStart != nil { + if ut, err2 := strconv.ParseInt(*usStart, 10, 64); err2 == nil { + srvStart = ut + } + } + keyAlive := redis.GetServerKeepAliveHashKey(int(statg.Conf.ServerIndex)) + if usAlive, err := redis.StatRds.Get(keyAlive); err == nil && usAlive != nil { + if ut, err2 := strconv.ParseInt(*usAlive, 10, 64); err2 == nil { + srvAlive = ut + } + } + keyClose := redis.GetServerCloseFlagHashKey(int(statg.Conf.ServerIndex)) + if usClose, err := redis.StatRds.Get(keyClose); err == nil && usClose != nil { + if ut, err2 := strconv.ParseInt(*usClose, 10, 64); err2 == nil { + srvClose = ut + } + } + + version.ServerStartLast = time.Unix(srvStart, 0) + version.ServerAliveLast = time.Unix(srvAlive, 0) + version.ServerCloseLast = time.Unix(srvClose, 0) + + _ = redis.StatRds.Set(keyStart, version.ServerStartTime.Unix(), 0) + _ = redis.StatRds.Set(keyClose, version.ServerStartTime.Unix(), 0) + _ = redis.StatRds.Set(keyAlive, time.Now().Unix(), 0) + }) + if version.ServerAliveLast.After(version.ServerStartLast) { + ret = fmt.Sprintf("上次运行:【%v】\n", version.ServerAliveLast.Sub(version.ServerStartLast)) + if version.ServerCloseLast.After(version.ServerStartLast) { + ret += fmt.Sprintf("上次关闭:【正常关闭🟢】\n") + } else { + ret += fmt.Sprintf("上次关闭:【异常关闭🔴】\n") + } + } + + return ret +} diff --git a/service/botser/utils.go b/service/botser/utils.go new file mode 100644 index 0000000..a9be3ea --- /dev/null +++ b/service/botser/utils.go @@ -0,0 +1,39 @@ +package botser + +import ( + "fmt" + "math" +) + +func Rate(temp string, numerator, denominator float64) string { + fZero := math.Pow10(-10) + if math.Abs(denominator) < fZero { + return fmt.Sprintf(temp, "无") + "\n" + } else { + str := fmt.Sprintf("%.2f%%", numerator*100/denominator) + return fmt.Sprintf(temp, str) + "\n" + } +} + +func Line(iTemp string, iValue int64, numerator, denominator float64) string { + fZero := math.Pow10(-10) + if math.Abs(denominator) < fZero { + s1 := fmt.Sprintf("%d", iValue) + str1 := fmt.Sprintf(iTemp, s1) + return str1 + "\n" + } else { + s1 := fmt.Sprintf("%d", iValue) + str1 := fmt.Sprintf(iTemp, s1) + v := numerator * 100 / denominator + str2 := "" + if v < 0 { + str2 = fmt.Sprintf("⬇-️️%.2f%%", math.Abs(v)) + } else if v > 0 { + str2 = fmt.Sprintf("⬆+️%.2f%%", math.Abs(v)) + } + if str2 == "" { + return str1 + "\n" + } + return str1 + str2 + "\n" + } +} diff --git a/service/cacheSer/cache.go b/service/cacheSer/cache.go new file mode 100644 index 0000000..cf270dc --- /dev/null +++ b/service/cacheSer/cache.go @@ -0,0 +1,60 @@ +package cacheSer + +import ( + "runtime" + "stat/common/log" + "stat/common/redis" + "stat/common/statutils" + "sync" + "time" + + "github.com/robfig/cron/v3" + + "github.com/patrickmn/go-cache" +) + +type IpStatCache struct { + Lock sync.RWMutex + IpLimitBucketTopToday redis.BucketList + IpLimitBucketTopYesterday redis.BucketList +} + +var ( + Cache *cache.Cache + IpLimitStatCache = IpStatCache{ + IpLimitBucketTopToday: make(redis.BucketList, 0), + IpLimitBucketTopYesterday: make(redis.BucketList, 0), + } + Writers struct { + LandPageVisitWriter BaseWriter + LandPageClickWriter BaseWriter + } + _cron *cron.Cron +) + +func Init() { + Cache = cache.New(10*time.Minute, 10*time.Minute) + Writers.LandPageVisitWriter = NewWriter(landPageVisitSync) + Writers.LandPageClickWriter = NewWriter(landPageClickSync) + _cron = cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(&log.Logger{}))) // 秒级定时任务 + _, _ = _cron.AddFunc("*/5 * * * * ?", func() { + err := statutils.ServerMon.RunWithName(SyncWriters, statutils.GetFuncName(SyncWriters)) + if err != nil { + log.Error("SyncWriters err", log.E(err)) + } + }) + _cron.Start() +} + +func SyncWriters() error { + err := Writers.LandPageVisitWriter.Sync() + if err != nil { + return err + } + return Writers.LandPageClickWriter.Sync() +} + +func Key(key string) string { + pc, _, _, _ := runtime.Caller(1) + return runtime.FuncForPC(pc).Name() + "##" + key +} diff --git a/service/cacheSer/helper.go b/service/cacheSer/helper.go new file mode 100644 index 0000000..f3c5e09 --- /dev/null +++ b/service/cacheSer/helper.go @@ -0,0 +1,21 @@ +package cacheSer + +import ( + "context" + "stat/models/downloadCpc" + "stat/models/downloadinfo" +) + +func landPageVisitSync(list []interface{}) error { + if len(list) > 0 { + return downloadCpc.InsertDownloadInfoMany(context.Background(), list) + } + return nil +} + +func landPageClickSync(list []interface{}) error { + if len(list) > 0 { + return downloadinfo.InsertDownloadInfoMany(context.Background(), list) + } + return nil +} diff --git a/service/cacheSer/writer.go b/service/cacheSer/writer.go new file mode 100644 index 0000000..4ebc6fb --- /dev/null +++ b/service/cacheSer/writer.go @@ -0,0 +1,43 @@ +package cacheSer + +import ( + "sync" +) + +type SyncFunc func(list []interface{}) error + +type BaseWriter interface { + Add(doc interface{}) + Sync() error +} + +type Writer struct { + lock sync.Mutex + list []interface{} + sync SyncFunc +} + +func NewWriter(syncFunc SyncFunc) BaseWriter { + return &Writer{ + lock: sync.Mutex{}, + list: make([]interface{}, 0), + sync: syncFunc, + } +} + +func (w *Writer) Add(doc interface{}) { + w.lock.Lock() + defer w.lock.Unlock() + w.list = append(w.list, doc) +} + +func (w *Writer) Sync() error { + list := make([]interface{}, 0) + func() { + w.lock.Lock() + defer w.lock.Unlock() + list = w.list + w.list = make([]interface{}, 0) + }() + return w.sync(list) +} diff --git a/service/channelSer/channel.go b/service/channelSer/channel.go new file mode 100644 index 0000000..2fd23c6 --- /dev/null +++ b/service/channelSer/channel.go @@ -0,0 +1,588 @@ +package channelSer + +import ( + "context" + "errors" + "fmt" + "os" + "path" + "stat/api/proto" + "stat/common/log" + "stat/models/adminMod" + "stat/models/appInfoMod" + "stat/models/channelmod" + "stat/models/registermod" + "time" + + "github.com/360EntSecGroup-Skylar/excelize" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// SearchChannelInfo 查询渠道信息 +func SearchChannelInfo(ctx context.Context, req *proto.ChannelInfoSearch) ( + *proto.ChannelInfoSearchResp, error) { + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelmod.FN.ChannelInfo.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + resp := &proto.ChannelInfoSearchResp{} + + if req.ID != nil && *req.ID != "" { + id, err := primitive.ObjectIDFromHex(*req.ID) + if err != nil { + return nil, errors.New("ID 格式错误") + } + filter[channelmod.FN.ChannelInfo.ID] = id + } + if req.Channel != nil && *req.Channel != "" { + filter[channelmod.FN.ChannelInfo.Channel] = bson.M{"$regex": *req.Channel} + } + + if req.AppId != nil { + filter[channelmod.FN.ChannelInfo.AppIds] = bson.M{"$in": []int32{*req.AppId}} + } + if req.Type != nil { + filter[channelmod.FN.ChannelInfo.Type] = *req.Type + } + if req.ParentChannel != nil && *req.ParentChannel != "" { + filter[channelmod.FN.ChannelInfo.ParentChannel] = bson.M{"$regex": *req.ParentChannel} + } + if req.UserName != nil && *req.UserName != "" { + filter[channelmod.FN.ChannelInfo.UserName] = *req.UserName + } + if req.Status != nil { + filter[channelmod.FN.ChannelInfo.Status] = *req.Status + } + if req.Remark != nil && *req.Remark != "" { + filter[channelmod.FN.ChannelInfo.Remark] = bson.M{"$regex": *req.Remark} + } + + if req.Mobile != nil && *req.Mobile != "" { + filter[channelmod.FN.ChannelInfo.Mobile] = bson.M{"$regex": *req.Mobile} + } + + total, serr := channelmod.CountChannelInfos(ctx, filter) + if serr != nil { + return nil, serr + } + if total == 0 { + return resp, nil + } + + channelInfoList, err := channelmod.FindManyChannelInfo(ctx, filter, opt) + if serr != nil { + return nil, err + } + for i := range channelInfoList { + channelInfoList[i].Token = "" + } + resp.List = channelInfoList + resp.Total = total + return resp, nil +} + +// SearchChannelInfoExport 导出渠道信息 +func SearchChannelInfoExport(ctx context.Context, req *proto.ChannelInfoSearch) (string, error) { + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelmod.FN.ChannelInfo.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + if req.ID != nil && *req.ID != "" { + id, err := primitive.ObjectIDFromHex(*req.ID) + if err != nil { + return "", errors.New("ID 格式错误") + } + filter[channelmod.FN.ChannelInfo.ID] = id + } + if req.Channel != nil && *req.Channel != "" { + filter[channelmod.FN.ChannelInfo.Channel] = bson.M{"$regex": *req.Channel} + } + + if req.AppId != nil { + filter[channelmod.FN.ChannelInfo.AppIds] = bson.M{"$in": []int32{*req.AppId}} + } + if req.Type != nil { + filter[channelmod.FN.ChannelInfo.Type] = *req.Type + } + if req.ParentChannel != nil && *req.ParentChannel != "" { + filter[channelmod.FN.ChannelInfo.ParentChannel] = bson.M{"$regex": *req.ParentChannel} + } + if req.UserName != nil && *req.UserName != "" { + filter[channelmod.FN.ChannelInfo.UserName] = bson.M{"$regex": *req.UserName} + } + if req.Status != nil { + filter[channelmod.FN.ChannelInfo.Status] = *req.Status + } + if req.Remark != nil && *req.Remark != "" { + filter[channelmod.FN.ChannelInfo.Remark] = bson.M{"$regex": *req.Remark} + } + + if req.Remark != nil && *req.Remark != "" { + filter[channelmod.FN.ChannelInfo.Remark] = bson.M{"$regex": *req.Remark} + } + + total, serr := channelmod.CountChannelInfos(ctx, filter) + if serr != nil { + return "", serr + } + if total == 0 { + return "", nil + } + + appList, err := appInfoMod.GetAllAppInfo(ctx) + if err != nil { + return "", err + } + + channelInfoList, err := channelmod.FindManyChannelInfo(ctx, filter, opt) + if serr != nil { + return "", err + } + filePath := fmt.Sprintf("./tmp/兑换记录-%s.xlsx", time.Now().Format("2006-01-02 15:04:05")) + if sErr := channelInfoExport(filePath, channelInfoList, appList); sErr != nil { + return "", sErr + } + return filePath, nil +} + +// channelInfoExport 导出 +func channelInfoExport(filePath string, list channelmod.ChannelInfoList, appList []appInfoMod.AppInfo) error { + f := excelize.NewFile() + sheetName := "Sheet1" + // 设置列宽 + f.SetColWidth("Sheet1", "A", "L", 23) + + // 设置表头行高 + f.SetRowHeight("Sheet1", 1, 25) + // 设置表头样式 + headStyleID, _ := f.NewStyle(`{ + "font":{ + "color":"#333333", + "bold":true, + "size":16, + "family":"arial" + }, + "alignment":{ + "vertical":"center", + "horizontal":"center", + "wrap_text":true + } + }`) + f.SetCellStyle("Sheet1", "A1", "L1", headStyleID) + idx := f.NewSheet(sheetName) + var exportTransWaterTitle = map[string]string{ + "A1": "名称", + "B1": "应用列表", + "C1": "渠道类型", + "D1": "IP", + "E1": "下级代理数", + "F1": "父渠道", + "G1": "禁止登陆", + "H1": "渠道状态", + "I1": "登陆错误次数", + "J1": "创建者", + "K1": "创建时间", + "L1": "更新时间", + } + for k, v := range exportTransWaterTitle { + f.SetCellValue(sheetName, k, v) + } + var cLock string + var cStatus string + for k, v := range list { + apps := string2app(appList, v.AppIds) + i := 'A' // i 不能超过Z,即列输不能超过26列,超出将出现bug + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Channel) //名称 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), apps) //应用列表 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Type.String()) //渠道类型 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.IP) //IP + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.ChildCount) //下级代理数 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.ParentChannel) //父渠道 + i++ + if v.Lock { + cLock = "封禁" + } else if !v.Lock { + cLock = "未封禁" + } + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), cLock) //禁止登陆 + i++ + if v.Status { + cStatus = "开启" + } else if !v.Status { + cStatus = "关闭" + } + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), cStatus) //渠道状态 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.ShowMagic) //登陆错误次数 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.UserName) //创建者 + i++ + created := v.CreatedAt.Local().Format("2006-01-02 15:04:05") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), created) //创建时间 + i++ + updated := v.UpdatedAt.Local().Format("2006-01-02 15:04:05") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), updated) //更新时间 + } + f.SetActiveSheet(idx) + p, _ := os.Getwd() + fileName := path.Join(p, filePath) + if err := f.SaveAs(fileName); err != nil { + log.Error("redeemCodeExport:export save file to disk failed", + log.Any("fileName", fileName), + log.E(err)) + return err + } + return nil +} + +func string2app(appList []appInfoMod.AppInfo, appIds []int32) string { + var result string + for count, id := range appIds { + if count == len(appIds)-1 { + result += GetAppName(appList, id) + } else { + result += (GetAppName(appList, id) + "、") + } + } + return result +} + +// AddChannelInfo 添加一个媒体视频 +func AddChannelInfo(ctx context.Context, username string, req *proto.ChannelInfoAdd) (*channelmod.ChannelInfo, error) { + if channelmod.IsOfficialChannelName(req.Channel) { + return nil, fmt.Errorf("渠道名字为系统保留字,请换一个渠道名字") + } + checkFilter := bson.M{channelmod.FN.ChannelInfo.Channel: req.Channel} + channelInfo, err := channelmod.FindOneChannelInfo(ctx, checkFilter) + if err != nil { + return nil, err + } + if channelInfo.Channel == req.Channel { + return channelInfo, errors.New("渠道已经存在") + } + now := time.Now() + newChannelInfo := channelmod.ChannelInfo{ + Channel: req.Channel, + UserName: username, + ParentChannel: req.ParentChannel, + Password: req.Password, + Status: req.Status, + Mobile: req.Mobile, + Type: req.Type, + Remark: req.Remark, + Lock: req.Lock, + ChildShowDivideRate: req.ChildShowDivideRate, + ShowMagic: 0, + CreatedAt: now, + UpdatedAt: now, + } + if req.Type == channelmod.ChannelTypeParent { + newChannelInfo.ParentChannel = "" + newChannelInfo.ParentAgent = "" + } else if req.Type == channelmod.ChannelTypeSecond { + parentInfo, err := channelmod.FindOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: req.ParentChannel}) + if err != nil { + return nil, err + } + if parentInfo.Channel != req.ParentChannel { + return nil, fmt.Errorf("指定的父渠道[%s]不存在", req.ParentChannel) + } + newChannelInfo.ParentChannel = req.ParentChannel + newChannelInfo.ParentAgent = req.ParentChannel + } else { + return nil, errors.New("后台只支持添加一级和二级渠道,其他级别的渠道请登陆渠道后台添加") + } + + err = channelmod.InsertOneChannelInfo(ctx, &newChannelInfo) + if err != nil { + log.Error("AddChannelInfo InsertOneChannelInfo", log.Any("channel", newChannelInfo.ParentChannel), log.E(err)) + return nil, err + } + + if req.Type.IsChild() { + setdoc := bson.M{"$inc": bson.M{channelmod.FN.ChannelInfo.ChildCount: 1}} + err = channelmod.UpdateOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: newChannelInfo.ParentChannel}, setdoc) + if err != nil { + log.Error("AddChannelInfo UpdateOneChannelInfo", log.Any("channel", newChannelInfo.ParentChannel), log.E(err)) + return nil, err + } + } + + return channelmod.FindOneChannelInfo(ctx, checkFilter) +} + +// DelChannelInfo 删除指定渠道信息 +func DelChannelInfo(ctx context.Context, channelId string) error { + id, err := primitive.ObjectIDFromHex(channelId) + if err != nil { + return errors.New("ID 格式错误") + } + // 1. 查询渠道信息 + channelFilter := bson.M{channelmod.FN.ChannelInfo.ID: id} + channelInfo, err := channelmod.FindOneChannelInfo(ctx, channelFilter) + if err != nil { + log.Error("DelChannelInfo FindOneChannelInfo", log.Any("channelId", channelId), log.E(err)) + return err + } + // 3. 查询子代理数 + childFilter := bson.M{channelmod.FN.ChannelInfo.ParentAgent: channelInfo.Channel} + childCount, err := channelmod.CountChannelInfos(ctx, childFilter) + if err != nil { + log.Error("DelChannelInfo CountChannelDeductionRules", log.Any("channelId", channelId), log.E(err)) + return err + } + if childCount > 0 { + return errors.New("代理下级代理不为空,请先删除下级代理") + } + + // 2. 查询渠道绑定应用 + ruleFilter := bson.M{channelmod.FN.ChannelDeductionRule.Channel: channelInfo.Channel} + ruleCount, err := channelmod.CountChannelDeductionRules(ctx, ruleFilter) + if err != nil { + log.Error("DelChannelInfo CountChannelDeductionRules", log.Any("channelId", channelId), log.E(err)) + return err + } + if ruleCount > 0 { + return errors.New("绑定应用不为空,请先删除绑定应用") + } + // 4. 删除渠道 + _, err = channelmod.DelOneChannelInfo(ctx, channelFilter) + if err != nil { + return err + } + + // 5 更新父渠道子渠道数量 + if channelInfo.Type.IsChild() { + setdoc := bson.M{"$inc": bson.M{channelmod.FN.ChannelInfo.ChildCount: -1}} + err = channelmod.UpdateOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: channelInfo.ParentAgent}, setdoc) + if err != nil { + log.Error("DelChannelInfo UpdateOneChannelInfo", log.Any("channel", channelInfo.ParentAgent), log.E(err)) + return err + } + } + + return nil +} + +// UpdateChannelInfo 更新指定渠道 +func UpdateChannelInfo(ctx context.Context, channelId string, req proto.ChannelInfoUpdate) error { + + id, err := primitive.ObjectIDFromHex(channelId) + if err != nil { + return errors.New("ID 格式错误") + } + filter := bson.M{channelmod.FN.ChannelInfo.ID: id} + + //更新数据库 + setDoc := bson.M{"$set": req} + + serr := channelmod.UpdateOneChannelInfo(ctx, filter, setDoc) + if serr != nil { + return serr + } + + return nil +} + +// UpdateOneChannelOwner 更新指定渠道的所有者 +func UpdateOneChannelOwner(ctx context.Context, operator, account string, req proto.ChannelOwnerUpdate) error { + + filter := bson.M{channelmod.FN.ChannelInfo.Channel: req.Channel} + + cInfo, serr := channelmod.FindOneChannelInfo(ctx, filter) + if serr != nil { + log.Error("UpdateOneChannelOwner:FindOneChannelInfo err", log.Any("serr", serr), + log.Any("req", req)) + return serr + } else if cInfo != nil && cInfo.Channel == "" { + log.Error("UpdateOneChannelOwner:FindOneChannelInfo err", log.Any("serr", serr), + log.Any("req", req)) + return errors.New("渠道不存在") + } + + if req.UserName == "" { + return errors.New("变更的所有者不能为空") + } else if req.UserName == cInfo.UserName { + return errors.New("变更的所有者不能与之前的相同") + // } else if cInfo.Type != 1 { // 只能操作1级渠道 + // return errors.New("变更所有者,只能操作1级渠道") + } + + admin, serr := adminMod.FindOnedmin(ctx, bson.M{"name": req.UserName}) + if serr != nil { + log.Error("UpdateOneChannelOwner:FindOnedmin err", log.Any("serr", serr), + log.Any("req", req)) + return serr + } else if admin != nil && admin.Name == "" { + log.Error("UpdateOneChannelOwner:FindOnedmin err", log.Any("serr", serr), + log.Any("req", req)) + return errors.New("账号不存在") + } + + now := time.Now() + + // 更新渠道信息 + setDoc := bson.M{"$set": bson.M{ + channelmod.FN.ChannelInfo.UserName: req.UserName, + channelmod.FN.ChannelInfo.UpdatedAt: now, + }} + + serr = channelmod.UpdateOneChannelInfo(ctx, filter, setDoc) + if serr != nil { + log.Error("UpdateOneChannelOwner:UpdateOneChannelInfo err", log.Any("serr", serr), + log.Any("req", req)) + return serr + } + + // 更新渠道统计信息 + csFilter := bson.M{channelmod.FN.ChannelStat.Channel: cInfo.Channel} + csSetDoc := bson.M{"$set": bson.M{channelmod.FN.ChannelStat.UserName: req.UserName}} + + serr = channelmod.UpdateManyChannelStat(ctx, csFilter, csSetDoc) + if serr != nil { + log.Error("UpdateOneChannelOwner:UpdateManyChannelStat err", log.Any("serr", serr), + log.Any("req", req)) + return serr + } + + // 找到一级渠道的所有子渠道 + allFlter := bson.M{channelmod.FN.ChannelInfo.ParentChannel: req.Channel} + + chanIds := make([]string, 0) + cInfos, _ := channelmod.FindManyChannelInfo(ctx, allFlter) + if len(cInfos) > 0 { + for _, info := range cInfos { + chanIds = append(chanIds, info.Channel) + } + + // 更新一级渠道的所有子渠道 + serr = channelmod.UpdateManyChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: bson.M{"$in": chanIds}}, setDoc) + if serr != nil { + log.Error("UpdateOneChannelOwner:UpdateManyChannelInfo 2 err", log.Any("serr", serr), + log.Any("req", req)) + } + // 更新一级渠道的所有子渠道统计 + serr = channelmod.UpdateManyChannelStat(ctx, bson.M{channelmod.FN.ChannelStat.Channel: bson.M{"$in": chanIds}}, csSetDoc) + if serr != nil { + log.Error("UpdateOneChannelOwner:UpdateManyChannelStat 2 err", log.Any("serr", serr), + log.Any("req", req)) + } + } + + // 添加变更记录 + new := &channelmod.ChannelOwnerChange{ + ID: primitive.NewObjectID(), + Channel: cInfo.Channel, + OldUser: cInfo.UserName, + NewUser: req.UserName, + Mark: req.Mark, + CreatedAt: now, + UpdatedAt: now, + Operator: operator, + Account: account, + } + serr = channelmod.InsertOneChannelOwnerChange(ctx, new) + if serr != nil { + log.Error("UpdateOneChannelOwner:InsertOneChannelOwnerChange err", log.Any("new", new), + log.Any("err", serr)) + return serr + } + return nil +} + +// SearchChannelOwnerChangeInfo 查询渠道所有者变更信息 +func SearchChannelOwnerChangeInfo(ctx context.Context, req *proto.ChannelOwnerChangeInfoSearch) ( + *proto.ChannelOwnerChangeInfoSearchResp, error) { + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelmod.FN.ChannelInfo.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + resp := &proto.ChannelOwnerChangeInfoSearchResp{} + + if req.ID != nil { + filter[channelmod.FN.ChannelOwnerChange.ID] = req.ID + } + if req.Channel != nil { + filter[channelmod.FN.ChannelOwnerChange.Channel] = *req.Channel + } + if req.OldUser != nil { + filter[channelmod.FN.ChannelOwnerChange.OldUser] = *req.OldUser + } + if req.NewUser != nil { + filter[channelmod.FN.ChannelOwnerChange.NewUser] = *req.NewUser + } + + total, serr := channelmod.CountChannelOwnerChanges(ctx, filter) + if serr != nil { + return nil, serr + } + if total == 0 { + return resp, nil + } + + ownerChangeList, err := channelmod.FindManyChannelOwnerChanges(ctx, filter, opt) + if serr != nil { + return nil, err + } + resp.List = ownerChangeList + resp.Total = total + return resp, nil +} + +// SearchUserInfo 查询用户信息 +func SearchUserInfo(ctx context.Context, req *proto.UserInfoSearch) ( + *proto.UserInfoSearchResp, error) { + resp := &proto.UserInfoSearchResp{} + + filter := bson.M{} + if req.UserId != nil { + filter["userId"] = *req.UserId + } + if req.Channel != nil { + filter["districtCode"] = *req.Channel + } + if req.AppId != nil { + filter["appId"] = *req.AppId + } + if req.IP != nil { + filter["ip"] = *req.IP + } + if req.Start != nil && req.End != nil { + filter["createdAt"] = bson.M{"$gt": *req.Start, "$lt": *req.End} + } + + total, err := registermod.CountRegister(ctx, filter) + if err != nil { + log.Error("SearchUserInfo CountRegister", log.Any("err", err)) + return nil, err + } + opt := &options.FindOptions{} + opt.SetSort(bson.M{"createdAt": -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + userList, err := registermod.FindManyRegister(ctx, filter, opt) + if err != nil { + log.Error("SearchUserInfo FindManyRegister", log.Any("err", err)) + return nil, err + } + + resp.Total = total + resp.List = userList + + return resp, nil +} diff --git a/service/channelSer/code.go b/service/channelSer/code.go new file mode 100644 index 0000000..57771b5 --- /dev/null +++ b/service/channelSer/code.go @@ -0,0 +1,30 @@ +package channelSer + +import "math/rand" + +var ( + //所有的字符 + ALL_CHARS = []string{ + "1", "2", "3", "4", "5", + "6", "7", "8", "9", "A", + "B", "C", "D", "E", "F", + "G", "H", "J", "K", + "L", "M", "N", "O", "P", + "Q", "R", "S", "T", "U", + "V", "W", "X", "Y", "Z"} + aLen = len(ALL_CHARS) +) + +const ( + //默认长度 + DEFAULT_LEN = 6 +) + +// 用户推广码 +func InviteShartPasswd() (code string) { + for i := 0; i < DEFAULT_LEN; i++ { + index := rand.Intn(aLen) + code += ALL_CHARS[index] + } + return +} diff --git a/service/channelSer/deductionRule.go b/service/channelSer/deductionRule.go new file mode 100644 index 0000000..3eff1c0 --- /dev/null +++ b/service/channelSer/deductionRule.go @@ -0,0 +1,184 @@ +package channelSer + +import ( + "context" + "errors" + "stat/api/proto" + "stat/common/log" + "stat/models/channelmod" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// SearchChannelDeductionRule 查询渠道扣量规则信息 +func SearchChannelDeductionRule(ctx context.Context, req *proto.ChannelDeductionRuleSearch) (*proto.ChannelDeductionRuleSearchResp, error) { + resp := &proto.ChannelDeductionRuleSearchResp{} + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelmod.FN.ChannelDeductionRule.BeginTime: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + if req.Channel != nil && *req.Channel != "" { + filter[channelmod.FN.ChannelDeductionRule.Channel] = bson.M{"$regex": *req.Channel} + } + + if req.AppId != nil { + filter[channelmod.FN.ChannelDeductionRule.AppId] = *req.AppId + } + + if req.Channel != nil && *req.Channel != "" { + filter[channelmod.FN.ChannelDeductionRule.Channel] = *req.Channel + } + + total, err := channelmod.CountChannelDeductionRules(ctx, filter) + if err != nil { + return nil, err + } + if total == 0 { + return resp, nil + } + + ChannelDeductionRuleList, err := channelmod.FindManyChannelDeductionRule(ctx, filter, opt) + if err != nil { + return nil, err + } + for _, rule := range ChannelDeductionRuleList { + if rule.DivideRate == 0 { + rule.DivideRate = 100 + } + } + + resp.Total = total + resp.List = ChannelDeductionRuleList + + return resp, nil +} + +// AddChannelDeductionRule 添加一个媒体视频 +func AddChannelDeductionRule(ctx context.Context, req *proto.ChannelDeductionRuleAdd) (*channelmod.ChannelDeductionRule, error) { + checkFilter := bson.M{channelmod.FN.ChannelDeductionRule.Channel: req.Channel, channelmod.FN.ChannelDeductionRule.AppId: req.AppId} + ChannelDeductionRule, err := channelmod.FindOneChannelDeductionRule(ctx, checkFilter) + if err != nil { + return nil, err + } + if ChannelDeductionRule.Channel == req.Channel { + return ChannelDeductionRule, errors.New("渠道扣量规则已经存在") + } + channelInfo, err := channelmod.FindOneChannelInfoEx(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: req.Channel}) + if err != nil { + return nil, err + } + var one float64 + if req.LessIncomeRate == nil { + one = 0.0 + } else { + one = *req.LessIncomeRate + } + now := time.Now() + rule := channelmod.ChannelDeductionRule{ + AppId: req.AppId, + AppType: req.AppType, + PromoteMode: req.PromoteMode, + Channel: req.Channel, + Settlement: req.Settlement, + First: req.First, + Second: req.Second, + Third: req.Third, + Fourth: req.Fourth, + Fifth: req.Fifth, + CPAPrice: req.CPAPrice, + CPSRate: req.CPSRate, + BeginTime: req.BeginTime, + CPSBegin: req.CPSBegin, + CPSDeductionRate: req.CPSDeductionRate, + DivideRate: req.DivideRate, + LandingPage: req.LandingPage, + ProxyDeduction: req.ProxyDeduction, + AutoDeduction: req.AutoDeduction, + LessIncomeRate: one, + CreatedAt: now, + UpdatedAt: now, + } + + err = channelmod.InsertOneChannelDeductionRule(ctx, &rule) + if err != nil { + return nil, err + } + channelInfo.AppIds = append(channelInfo.AppIds, req.AppId) + + setdoc := bson.M{"$set": bson.M{channelmod.FN.ChannelInfo.AppIds: channelInfo.AppIds}} + err = channelmod.UpdateOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: req.Channel}, setdoc) + if err != nil { + return nil, err + } + + return channelmod.FindOneChannelDeductionRuleEx(ctx, checkFilter) +} + +// DelChannelDeductionRule 删除指定渠道扣量规则信息 +func DelChannelDeductionRule(ctx context.Context, channelId string) error { + id, err := primitive.ObjectIDFromHex(channelId) + if err != nil { + return errors.New("ID 格式错误") + } + ruleFilter := bson.M{channelmod.FN.ChannelDeductionRule.ID: id} + channelRuleInfo, err := channelmod.FindOneChannelDeductionRuleEx(ctx, ruleFilter) + if err != nil { + return err + } + channelInfo, err := channelmod.FindOneChannelInfoEx(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: channelRuleInfo.Channel}) + if err != nil { + return err + } + count, err := channelmod.CountChannelInfos(ctx, bson.M{channelmod.FN.ChannelInfo.ParentAgent: channelInfo.Channel}) + if err != nil { + log.Error("DelChannelDeductionRule CountChannelInfos", log.Any("channelId", channelId), log.E(err)) + return err + } + if count > 0 { + return errors.New("下级代理不为空,请先删除下级代理, 再删除应用规则") + } + + _, err = channelmod.DelOneChannelDeductionRule(ctx, ruleFilter) + if err != nil { + return err + } + appids := make([]int32, 0) + for _, appid := range channelInfo.AppIds { + if appid != channelRuleInfo.AppId { + appids = append(appids, appid) + } + } + + setdoc := bson.M{"$set": bson.M{channelmod.FN.ChannelInfo.AppIds: appids}} + err = channelmod.UpdateOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: channelRuleInfo.Channel}, setdoc) + if err != nil { + return err + } + + return nil +} + +// UpdateChannelDeductionRule 更新指定渠道扣量规则 +func UpdateChannelDeductionRule(ctx context.Context, channelId string, info proto.ChannelDeductionRuleUpdate) error { + + id, err := primitive.ObjectIDFromHex(channelId) + if err != nil { + return errors.New("ID 格式错误") + } + filter := bson.M{channelmod.FN.ChannelDeductionRule.ID: id} + + //更新数据库 + setDoc := bson.M{"$set": info} + + serr := channelmod.UpdateOneChannelDeductionRule(ctx, filter, setDoc) + if serr != nil { + return serr + } + + return nil +} diff --git a/service/channelSer/settlement.go b/service/channelSer/settlement.go new file mode 100644 index 0000000..9b98240 --- /dev/null +++ b/service/channelSer/settlement.go @@ -0,0 +1,1507 @@ +package channelSer + +import ( + "context" + "errors" + "fmt" + "os" + "path" + "stat/api/proto" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + "stat/middleware/define" + "stat/models/appInfoMod" + "stat/models/channelmod" + "stat/models/channelsettlementrecord" + "strings" + "time" + + "go.mongodb.org/mongo-driver/mongo" + + "github.com/360EntSecGroup-Skylar/excelize" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// SearchChannelSettlementStat 查询渠道结算纤细 +func SearchChannelSettlementStat(ctx context.Context, req *proto.ChannelStatSettlementSearch) (*proto.ChannelStatSettlementSearchResp, error) { + resp := &proto.ChannelStatSettlementSearchResp{} + filter := bson.M{} + + opt := &options.FindOptions{} + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + if req.Channel != nil && *req.Channel != "" { + if req.WithChild != nil && *req.WithChild { + filter = bson.M{ + "$or": bson.A{ + bson.M{channelmod.FN.ChannelStat.Channel: *req.Channel}, + bson.M{channelmod.FN.ChannelStat.ParentChannel: *req.Channel}, + }, + } + } else { + filter = bson.M{channelmod.FN.ChannelStat.Channel: *req.Channel} + } + } + if req.AppId != nil { + filter[channelmod.FN.ChannelStat.AppId] = *req.AppId + } + if req.UserName != nil && *req.UserName != "" { + filter[channelmod.FN.ChannelStat.UserName] = *req.UserName + } + if req.Settlement != nil && *req.Settlement != "" { + filter[channelmod.FN.ChannelStat.Settlement] = *req.Settlement + } + // 开始时间和结束时间 + endTime := utils.BeginOfToday().AddDate(0, 0, -1) + if req.Start != nil { + if req.End != nil { + if req.End.Before(utils.BeginOfToday()) { + endTime = *req.End + } + } + + filter[channelmod.FN.ChannelStat.SumDate] = bson.M{"$gte": *req.Start, "$lte": endTime} + } else { + if req.End != nil { + if req.End.Before(utils.BeginOfToday()) { + endTime = *req.End + } + } + filter[channelmod.FN.ChannelStat.SumDate] = bson.M{"$lte": endTime} + } + filter[channelmod.FN.ChannelStat.IsPay] = bson.M{"$ne": true} + + totalParentChannelStatInfo, err := channelmod.FindManyChannelStat(ctx, filter) + if err != nil { + return nil, err + } + + if len(totalParentChannelStatInfo) == 0 { + return resp, nil + } + + ChannelStatList, err := channelmod.FindManyChannelStat(ctx, filter, opt) + if err != nil { + return nil, err + } + + ruleFilter := bson.M{ + channelmod.FN.ChannelDeductionRule.Channel: req.Channel, + channelmod.FN.ChannelDeductionRule.AppId: req.AppId, + } + ruleInfo, _ := channelmod.FindOneChannelDeductionRule(ctx, ruleFilter) + if ruleInfo != nil { + resp.TotalInfo.Channel = ruleInfo.Channel + resp.TotalInfo.Settlement = ruleInfo.Settlement + resp.TotalInfo.AppId = ruleInfo.AppId + resp.TotalInfo.CPAPrice = ruleInfo.CPAPrice + resp.TotalInfo.CPSRate = ruleInfo.CPSRate + resp.TotalInfo.AppType = ruleInfo.AppType + resp.TotalInfo.PromoteMode = ruleInfo.PromoteMode + } + // 计算合计数据 + for _, channelStatInfo := range totalParentChannelStatInfo { + channelmod.ChannelStatSummation(&resp.TotalInfo, channelStatInfo) + } + + resp.Total = int64(len(totalParentChannelStatInfo)) + resp.List = ChannelStatList + + if ruleInfo != nil { + resp.Income, resp.Desc = channelmod.CalculateChannelIncome(resp.TotalInfo.CorrectValidData()) + } + + return resp, nil +} + +// ChannelSettlementCalc 渠道结算项实时计算 +func ChannelSettlementCalc(ctx context.Context, req *proto.SettlementCalcReq) (*proto.SettlementCalcResp, error) { + // 参数检查 + if len(req.SettleIds) <= 0 { + return nil, errors.New("没有提交要结算的统计id数组") + } + // 在已结算表中检查是否有重复结算 + settlementInfoFilter := bson.M{ + channelsettlementrecord.FN.ChannelSettlementRecord.SettleIds: bson.M{"$in": req.SettleIds}, + } + settlementInfoList, err := channelsettlementrecord.FindManyChannelSettlementRecord(ctx, settlementInfoFilter) + if err != nil { + return nil, err + } + if len(settlementInfoList) > 0 { + return nil, errors.New("提交的统计记录列表中含有重复结算项") + } + // 获取扣量规则 + ruleFilter := bson.M{ + channelmod.FN.ChannelDeductionRule.ID: req.RuleId, + channelmod.FN.ChannelDeductionRule.AppId: req.AppId, + channelmod.FN.ChannelDeductionRule.Channel: req.Channel, + } + channelRule, err1 := channelmod.FindOneChannelDeductionRuleEx(ctx, ruleFilter) + // 检查扣量规则 + if err1 != nil { + return nil, fmt.Errorf("查找渠道结算规则失败:%s", err1.Error()) + } + // 开始时间和结束时间 + req.BeginTime, req.EndTime, err = CheckAndFixTime(req.BeginTime, req.EndTime) + if err != nil { + return nil, err + } + // 一级记录查找 + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelmod.FN.ChannelStat.SumDate: 1}) + parentFilter := bson.M{ + channelmod.FN.ChannelStat.AppId: req.AppId, // 应用限定 + channelmod.FN.ChannelStat.Channel: req.Channel, // 渠道限定 + channelmod.FN.ChannelStat.Type: channelmod.ChannelTypeParent, // 类型限定 + channelmod.FN.ChannelStat.IsPay: bson.M{"$ne": true}, // 未结算过 + channelmod.FN.ChannelStat.SumDate: bson.M{"$gte": req.BeginTime, "$lte": req.EndTime}, // 时间限定 + channelmod.FN.ChannelStat.ID: bson.M{"$in": req.SettleIds}, // 提交的IDs + } + ParentList, err := channelmod.FindManyChannelStat(ctx, parentFilter, opt) + if err != nil { + return nil, err + } + if len(ParentList) != len(req.SettleIds) { + return nil, fmt.Errorf("提交的统计记录条数[%d]和查找到的[%d]不一致", len(req.SettleIds), len(ParentList)) + } + // 结算项检查 + for _, stat := range ParentList { + if stat.Type != channelmod.ChannelTypeParent { + return nil, fmt.Errorf("子渠道[%s]不能单独参与结算,只需提交其父渠道即可", stat.Channel) + } + } + if len(ParentList) == 0 { + return nil, fmt.Errorf("没有找到渠道结算数据") + } + // 列表的起止时间 + listBeginTime := ParentList[0].SumDate + listEndTime := ParentList[len(ParentList)-1].SumDate + // 查找二级渠道的数据 + childTypes := channelmod.GetChildChannelTypes() + childFilter := bson.M{ + channelmod.FN.ChannelStat.ParentChannel: req.Channel, // 限定父渠道 + channelmod.FN.ChannelStat.Type: bson.M{"$in": childTypes}, // 限定子渠道 + channelmod.FN.ChannelStat.IsPay: bson.M{"$ne": true}, // 未结算过 + channelmod.FN.ChannelStat.SumDate: bson.M{"$gte": listBeginTime, "$lte": listEndTime}, // 时间限定 + } + ChildList, err := channelmod.FindManyChannelStat(ctx, childFilter) + if err != nil { + return nil, err + } + // 把二级记录汇总到一级记录上面 + for _, parent := range ParentList { + parent.CorrectValidData() + for _, child := range ChildList { + if child.ParentChannel == parent.Channel && child.SumDate.Equal(parent.SumDate) { + channelmod.ChannelStatSummation(parent, child.CorrectValidData()) // 把子渠道的数据累加到父渠道上面 + } + } + } + // 对一级记录进行统计汇总 + resp := &proto.SettlementCalcResp{} + resp.TotalCount = int64(len(ParentList)) + for _, statInfo := range ParentList { + channelmod.ChannelStatSummation(&(resp.TotalInfo), statInfo) + } + resp.TotalInfo.Channel = req.Channel + resp.TotalInfo.AppId = req.AppId + resp.TotalInfo.Settlement = channelRule.Settlement + resp.TotalInfo.CPAPrice = channelRule.CPAPrice + resp.TotalInfo.CPSRate = channelRule.CPSRate + resp.TotalInfo.AppType = channelRule.AppType + resp.TotalInfo.PromoteMode = channelRule.PromoteMode + // 根据扣量规则计算结算金额 + resp.TotalInfo.CalcIncomeRate() + resp.TotalIncome, resp.TotalDesc = channelmod.CalculateChannelIncome(resp.TotalInfo.CorrectValidData()) + + return resp, nil +} + +// SearchChannelSettlementStat2 查询渠道结算纤细 +func SearchChannelSettlementStat2(ctx context.Context, req *proto.ChannelStatSettlementSearch2) (*proto.ChannelStatSettlementSearch2Resp, error) { + resp := &proto.ChannelStatSettlementSearch2Resp{} + if req.Channel == nil || *req.Channel == "" { + return nil, fmt.Errorf("渠道必须填写") + } + if req.AppId == nil { + return nil, fmt.Errorf("应用ID必须填写") + } + appInfo, err := appInfoMod.GetAppInfoByIdEx(ctx, *req.AppId) + if err != nil { + return nil, fmt.Errorf("应用不存在或查找失败:%s", err.Error()) + } + channelInfo, err2 := channelmod.FindOneChannelInfoEx(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: *req.Channel}) + if err2 != nil || channelInfo.Channel == "" { + return nil, fmt.Errorf("渠道[%s]不存在,或查找失败", *req.Channel) + } + if channelInfo.Type != channelmod.ChannelTypeParent { + return nil, fmt.Errorf("渠道[%s]不是一级渠道,只有一级渠道才能结算", *req.Channel) + } + ruleFilter := bson.M{ + channelmod.FN.ChannelDeductionRule.Channel: req.Channel, + channelmod.FN.ChannelDeductionRule.AppId: req.AppId, + } + ruleInfo, err1 := channelmod.FindOneChannelDeductionRuleEx(ctx, ruleFilter) + if err1 != nil { + return nil, fmt.Errorf("渠道[%s]的应用[%s]结算规则不存在或查找失败:%s", *req.Channel, appInfo.Name, err1.Error()) + } + resp.RuleId = ruleInfo.ID + tmpStat := channelmod.ChannelStat{ + Channel: ruleInfo.Channel, + AppId: ruleInfo.AppId, + Settlement: ruleInfo.Settlement, + CPAPrice: ruleInfo.CPAPrice, + CPSRate: ruleInfo.CPSRate, + AppType: ruleInfo.AppType, + PromoteMode: ruleInfo.PromoteMode, + } + resp.TotalInfo = tmpStat + resp.ValidInfo = tmpStat + resp.ValidInfo = tmpStat + + opt := &options.FindOptions{} + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + opt.SetSort(bson.D{ + {Key: channelmod.FN.ChannelStat.SumDate, Value: -1}, + {Key: channelmod.FN.ChannelStat.CreatedAt, Value: -1}, + }) + filter := bson.M{} + // 渠道结算一定包含子渠道 + filter[channelmod.FN.ChannelStat.AppId] = *req.AppId + + // 返回渠道的钱包信息 + resp.Wallet = channelInfo.Wallet + + if req.UserName != nil && *req.UserName != "" { + filter[channelmod.FN.ChannelStat.UserName] = *req.UserName + } + // 开始时间和结束时间 + req.Start, req.End, err = CheckAndFixTime(req.Start, req.End) + if err != nil { + return nil, err + } + filter[channelmod.FN.ChannelStat.SumDate] = bson.M{"$gte": *req.Start, "$lte": *req.End} + + // 已结算的是否显示 + if req.IsPayed != nil { + if *req.IsPayed { + filter[channelmod.FN.ChannelStat.IsPay] = true + } else { + filter[channelmod.FN.ChannelStat.IsPay] = bson.M{"$ne": true} + } + } + // 找到所有一级记录 + filter[channelmod.FN.ChannelStat.Channel] = *req.Channel + filter[channelmod.FN.ChannelStat.Type] = channelmod.ChannelTypeParent + ParentsChannelStatList, err := channelmod.FindManyChannelStat(ctx, filter) + if err != nil { + return nil, err + } + if len(ParentsChannelStatList) == 0 { + return resp, nil + } + // 找到分页一级记录 + PagedChannelStatList, err := channelmod.FindManyChannelStat(ctx, filter, opt) + if err != nil { + return nil, err + } + // 找到所有子级记录 + delete(filter, channelmod.FN.ChannelStat.Channel) + filter[channelmod.FN.ChannelStat.ParentChannel] = *req.Channel + childTypes := channelmod.GetChildChannelTypes() + filter[channelmod.FN.ChannelStat.Type] = bson.M{"$in": childTypes} + ChildChannelStatList, err := channelmod.FindManyChannelStat(ctx, filter) + if err != nil { + return nil, err + } + // 把子级记录汇总到一级记录上面 + for _, parent := range ParentsChannelStatList { + parent.CorrectValidData() + for _, child := range ChildChannelStatList { + if child.ParentChannel == parent.Channel && child.SumDate.Equal(parent.SumDate) { + channelmod.ChannelStatSummation(parent, child) // 把子渠道的数据累加到父渠道上面 + } + } + } + // 对一级记录进行统计汇总 + for _, channelStatInfo := range ParentsChannelStatList { + resp.TotalCount++ + channelmod.ChannelStatSummation(&(resp.TotalInfo), channelStatInfo) + if channelStatInfo.IsPay { + resp.InvalidCount++ + channelmod.ChannelStatSummation(&(resp.InvalidInfo), channelStatInfo) + } else { + resp.ValidCount++ + channelmod.ChannelStatSummation(&(resp.ValidInfo), channelStatInfo) + } + } + // 把Page列表项替换为带子渠道数据的项 + for i, pageItem := range PagedChannelStatList { + for j, parentItem := range ParentsChannelStatList { + if pageItem.ID.String() == parentItem.ID.String() { + PagedChannelStatList[i] = ParentsChannelStatList[j] + break + } + } + } + // 计算金币的数值:金币等于渠道直推充值金额-购买VIP金额-扣量 + for _, v := range PagedChannelStatList { + v.CorrectValidData() + v.CalcIncomeRate() + } + // 修正数据 + resp.TotalInfo.CorrectValidData() + resp.ValidInfo.CorrectValidData() + resp.InvalidInfo.CorrectValidData() + // 收益率 + resp.TotalInfo.CalcIncomeRate() + resp.ValidInfo.CalcIncomeRate() + resp.InvalidInfo.CalcIncomeRate() + // 结算数值及提示信息 + resp.TotalIncome, resp.TotalDesc = channelmod.CalculateChannelIncome(&resp.TotalInfo) + resp.ValidIncome, resp.ValidDesc = channelmod.CalculateChannelIncome(&resp.ValidInfo) + resp.InvalidIncome, resp.InvalidDesc = channelmod.CalculateChannelIncome(&resp.InvalidInfo) + // 输出列表 + resp.List = PagedChannelStatList + resp.Channel = channelInfo.Channel + resp.AppId = *req.AppId + + return resp, nil +} + +// SearchSettlementInfo 查询渠道信息 +func GetSettlementApplicantList(ctx context.Context, req *proto.GetSettlementApplicantListReq) (*proto.GetSettlementApplicantListResp, error) { + resp := proto.GetSettlementApplicantListResp{} + match := bson.M{} + pipelines := []bson.M{ + {"$match": match}, + {"$group": bson.M{ + "_id": bson.M{"applicant": "$applicant"}, + "count": bson.M{"$sum": 1}, + }}, + {"$project": bson.M{ + "applicant": "$_id.applicant", + "count": "$count", + "_id": 0, + }}, + + {"$sort": bson.D{{Key: "count", Value: -1}}}, + } + type Data struct { + Applicant string `bson:"applicant" json:"applicant"` + Count int64 `bson:"count" json:"count"` + } + List := make([]Data, 0) + + if err := channelsettlementrecord.AggregateChannelSettlementRecords(ctx, &List, pipelines); err != nil { + return nil, err + } + for _, item := range List { + resp.List = append(resp.List, item.Applicant) + } + return &resp, nil +} + +// SearchApplyForm 查询渠道信息 +func SearchApplyForm(ctx context.Context, req *proto.GetApplyFormReq, channel string) ( + *proto.GetApplyFormResp, error) { + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelsettlementrecord.FN.ChannelSettlementRecord.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + resp := &proto.GetApplyFormResp{} + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Channel] = channel + + if req.AppId != nil { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.AppId] = *req.AppId + } + + if req.Start != nil && req.End != nil { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.CreatedAt] = bson.M{"$gte": *req.Start, "$lt": *req.End} + } + + if req.Status != nil { + if *req.Status == channelsettlementrecord.SettlementInit || *req.Status == channelsettlementrecord.SettlementSuccess { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Status] = *req.Status + } else { + return nil, fmt.Errorf("未知状态") + } + } else { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Status] = bson.M{"$in": []channelsettlementrecord.SettlementStatus{ + channelsettlementrecord.SettlementInit, channelsettlementrecord.SettlementSuccess, + }} + } + + total, err := channelsettlementrecord.CountChannelSettlementRecords(ctx, filter) + if err != nil { + return nil, err + } + if total == 0 { + return resp, nil + } + SettlementInfoList, err := channelsettlementrecord.FindManyChannelSettlementRecord(ctx, filter, opt) + if err != nil { + return nil, err + } + resp.List = SettlementInfoListToApplyForm(SettlementInfoList) + resp.Total = total + return resp, nil +} + +// SearchSettlementInfo 查询渠道信息 +func SearchSettlementInfo(ctx context.Context, req *proto.SettlementInfoSearch) ( + *proto.SettlementInfoSearchResp, error) { + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelsettlementrecord.FN.ChannelSettlementRecord.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + resp := &proto.SettlementInfoSearchResp{} + if req.Channel != nil && *req.Channel != "" { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Channel] = *req.Channel + } + + if req.AppId != nil { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.AppId] = *req.AppId + } + + if req.Start != nil && req.End != nil { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.CreatedAt] = bson.M{"$gte": *req.Start, "$lt": *req.End} + } + + if req.Remark != nil && *req.Remark != "" { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Remark] = bson.M{"$regex": *req.Remark} + } + + if len(req.Applicants) > 0 { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Applicant] = bson.M{"$in": req.Applicants} + } + if len(req.Status) > 0 { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Status] = bson.M{"$in": req.Status} + } else { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Status] = bson.M{"$in": []channelsettlementrecord.SettlementStatus{}} + } + + total, serr := channelsettlementrecord.CountChannelSettlementRecords(ctx, filter) + if serr != nil { + return nil, serr + } + if total == 0 { + return resp, nil + } + + SettlementInfoList, err := channelsettlementrecord.FindManyChannelSettlementRecord(ctx, filter, opt) + if err != nil { + return nil, err + } + resp.List = SettlementInfoList + resp.Total = total + return resp, nil +} + +// SearchDeletedSettlementInfo 查询渠道信息 +func SearchDeletedSettlementInfo(ctx context.Context, req *proto.SettlementInfoSearch) ( + *proto.SettlementInfoSearchResp, error) { + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelsettlementrecord.FN.ChannelSettlementDeleted.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + resp := &proto.SettlementInfoSearchResp{} + if req.Channel != nil && *req.Channel != "" { + filter[channelsettlementrecord.FN.ChannelSettlementDeleted.Channel] = *req.Channel + } + + if req.AppId != nil { + filter[channelsettlementrecord.FN.ChannelSettlementDeleted.AppId] = *req.AppId + } + + if req.Start != nil && req.End != nil { + filter[channelsettlementrecord.FN.ChannelSettlementDeleted.CreatedAt] = bson.M{"$gte": *req.Start, "$lt": *req.End} + } + + if req.Remark != nil && *req.Remark != "" { + filter[channelsettlementrecord.FN.ChannelSettlementDeleted.Remark] = bson.M{"$regex": *req.Remark} + } + + //if req.PayType != nil { + // switch *req.PayType { + // case 1: + // filter[channelsettlementrecord.FN.ChannelSettlementDeleted.ERC] = bson.M{"$gt": ""} + // case 2: + // filter[channelsettlementrecord.FN.ChannelSettlementDeleted.TRC] = bson.M{"$gt": ""} + // case 3: + // filter[channelsettlementrecord.FN.ChannelSettlementDeleted.BankCard] = bson.M{"$gt": ""} + // case 4: + // filter[channelsettlementrecord.FN.ChannelSettlementDeleted.Alipay] = bson.M{"$gt": ""} + // } + //} + + total, serr := channelsettlementrecord.CountChannelSettlementDeletes(ctx, filter) + if serr != nil { + return nil, serr + } + if total == 0 { + return resp, nil + } + + SettlementInfoList, err := channelsettlementrecord.FindManyChannelSettlementDeleted(ctx, filter, opt) + if serr != nil { + return nil, err + } + resp.List = SettlementInfoList + resp.Total = total + return resp, nil +} + +// SearchSettlementInfoExport 导出渠道信息 +func SearchSettlementInfoExport(ctx context.Context, req *proto.SettlementInfoSearch) (string, error) { + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelsettlementrecord.FN.ChannelSettlementRecord.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + if req.Channel != nil && *req.Channel != "" { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Channel] = *req.Channel + } + + if req.AppId != nil { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.AppId] = *req.AppId + } + + if req.Start != nil && req.End != nil { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.CreatedAt] = bson.M{"$gte": *req.Start, "$lt": *req.End} + } + + if req.Remark != nil && *req.Remark != "" { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Remark] = bson.M{"$regex": *req.Remark} + } + + if len(req.Applicants) > 0 { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Applicant] = bson.M{"$in": req.Applicants} + } + + if len(req.Status) > 0 { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Status] = bson.M{"$in": req.Status} + } + + appList, err := appInfoMod.GetAllAppInfo(ctx) + if err != nil { + return "", err + } + + total, err1 := channelsettlementrecord.CountChannelSettlementRecords(ctx, filter) + if err1 != nil { + return "", err1 + } + if total == 0 { + return "", nil + } + SettlementInfoList, err2 := channelsettlementrecord.FindManyChannelSettlementRecord(ctx, filter, opt) + if err2 != nil { + return "", err2 + } + + filePath := fmt.Sprintf("./tmp/渠道结算列表-%s.xlsx", time.Now().Format("2006-01-02 15:04:05")) + + if sErr := export(filePath, SettlementInfoList, appList); sErr != nil { + return "", sErr + } + return filePath, nil +} + +// SearchSettlementInfoApplyExport 导出结算申请信息 +func SearchSettlementInfoApplyExport(ctx context.Context, req *proto.SettlementInfoSearch) (string, error) { + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelsettlementrecord.FN.ChannelSettlementRecord.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + if req.Channel != nil && *req.Channel != "" { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Channel] = *req.Channel + } + + if req.AppId != nil { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.AppId] = *req.AppId + } + + if req.Start != nil && req.End != nil { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.CreatedAt] = bson.M{"$gte": *req.Start, "$lt": *req.End} + } + + if req.Remark != nil && *req.Remark != "" { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Remark] = bson.M{"$regex": *req.Remark} + } + + if len(req.Applicants) > 0 { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Applicant] = bson.M{"$in": req.Applicants} + } + + if len(req.Status) > 0 { + filter[channelsettlementrecord.FN.ChannelSettlementRecord.Status] = bson.M{"$in": req.Status} + } + + total, err1 := channelsettlementrecord.CountChannelSettlementRecords(ctx, filter) + if err1 != nil { + return "", err1 + } + if total == 0 { + return "", nil + } + SettlementInfoList, err2 := channelsettlementrecord.FindManyChannelSettlementRecord(ctx, filter, opt) + if err2 != nil { + return "", err2 + } + + if len(SettlementInfoList) <= 0 { + return "", nil + } + + appList, err := appInfoMod.GetAllAppInfo(ctx) + if err != nil { + return "", err + } + + filePath := fmt.Sprintf("./tmp/渠道结算申请列表-%s.xlsx", time.Now().Format("2006-01-02 15:04:05")) + + if sErr := ExportSettleApplyForm(filePath, SettlementInfoList, appList); sErr != nil { + return "", sErr + } + return filePath, nil +} + +// AddSettlementInfo 添加一个媒体视频 +func AddSettlementInfo(ctx context.Context, req *proto.SettlementInfoAdd) error { + + settlementInfoFilter := bson.M{ + channelsettlementrecord.FN.ChannelSettlementRecord.Channel: req.Channel, + channelsettlementrecord.FN.ChannelSettlementRecord.AppId: req.AppId, + } + settlementInfoList, serr := channelsettlementrecord.FindManyChannelSettlementRecord(ctx, settlementInfoFilter) + for _, valueInfo := range settlementInfoList { + if req.BeginTime.After(valueInfo.BeginTime) && req.BeginTime.Before(valueInfo.EndTime) { + return errors.New("重复结算") + } + + if req.EndTime.After(valueInfo.BeginTime) && req.EndTime.Before(valueInfo.EndTime) { + return errors.New("重复结算") + } + } + + request := &proto.ChannelStatSettlementSearch{ + Channel: &req.Channel, + AppId: &req.AppId, + Start: &req.BeginTime, + End: &req.EndTime, + } + resp, serr := SearchChannelSettlementStat(ctx, request) + if serr != nil { + return serr + } + + if resp.Income != req.TotalMoney { + return errors.New("金额不一致") + } + + // 更新是否已经结算 + channelStatFilter := bson.M{ + "$or": bson.A{ + bson.M{channelmod.FN.ChannelStat.Channel: req.Channel}, + bson.M{channelmod.FN.ChannelStat.ParentChannel: req.Channel}, + }, + channelmod.FN.ChannelStat.AppId: req.AppId, + channelmod.FN.ChannelStat.SumDate: bson.M{"$gte": req.BeginTime, "$lte": req.EndTime}, + channelmod.FN.ChannelStat.IsPay: bson.M{"$ne": true}, + } + + set := bson.M{ + "$set": bson.M{ + channelmod.FN.ChannelStat.IsPay: true, + }, + } + + err := channelmod.UpdateManyChannelStat(ctx, channelStatFilter, set) + if err != nil { + return err + } + + filter := bson.M{ + channelmod.FN.ChannelDeductionRule.Channel: req.Channel, + channelmod.FN.ChannelDeductionRule.AppId: req.AppId, + } + + newRecord := &channelsettlementrecord.ChannelSettlementRecord{ + Channel: req.Channel, + AppId: req.AppId, + BeginTime: req.BeginTime, + EndTime: req.EndTime, + TotalMoney: resp.Income, + NewDirectCount: resp.TotalInfo.NewDirectCount, + NewFissionCount: resp.TotalInfo.NewFissionCount, + NewDeductionCount: resp.TotalInfo.NewDeductionCount, + RechargeAmount: resp.TotalInfo.DirectAmount + resp.TotalInfo.FissionAmount + resp.TotalInfo.DeductionAmount, + VipPayMoney: resp.TotalInfo.VipPayMoney, + ValidDirectCount: resp.TotalInfo.ValidDirectCount, + ValidDeductionCount: resp.TotalInfo.ValidDeductionCount, + ValidPayMoney: resp.TotalInfo.ValidPayMoney, + ValidPayCoin: resp.TotalInfo.ValidPayCoin, + Status: channelsettlementrecord.SettlementInit, + CreatedAt: time.Now(), + } + ruleInfo, _ := channelmod.FindOneChannelDeductionRule(ctx, filter) + if ruleInfo != nil { + newRecord.AppType = ruleInfo.AppType + newRecord.PromoteMode = ruleInfo.PromoteMode + newRecord.Settlement = ruleInfo.Settlement + newRecord.CPAPrice = ruleInfo.CPAPrice + newRecord.CPSRate = ruleInfo.CPSRate + } + + return channelsettlementrecord.InsertOneChannelSettlementRecord(ctx, newRecord) +} + +// AddSettlementInfo 添加一个媒体视频 +func AddSettlementInfo2(ctx context.Context, req *proto.SettlementInfoAdd2, accType define.ActType, account string) error { + // 参数检查 + if len(req.SettleIds) <= 0 { + return errors.New("没有提交要结算的统计记录id数组") + } + if req.SettleMoney <= 0 { + return errors.New("结算的真实金额必须大于零") + } + // 在已结算表中检查是否有重复结算 + settlementInfoFilter := bson.M{ + channelsettlementrecord.FN.ChannelSettlementRecord.SettleIds: bson.M{"$in": req.SettleIds}, + } + settlementInfoList, err := channelsettlementrecord.FindManyChannelSettlementRecord(ctx, settlementInfoFilter) + if err != nil { + return err + } + if len(settlementInfoList) > 0 { + return errors.New("重复结算") + } + // 获取扣量规则 + ruleFilter := bson.M{ + channelmod.FN.ChannelDeductionRule.ID: req.RuleId, + channelmod.FN.ChannelDeductionRule.AppId: req.AppId, + channelmod.FN.ChannelDeductionRule.Channel: req.Channel, + } + channelRule, err1 := channelmod.FindOneChannelDeductionRuleEx(ctx, ruleFilter) + // 检查扣量规则 + if err1 != nil { + return fmt.Errorf("查找渠道结算规则失败:%s", err1.Error()) + } + // 开始时间和结束时间 + req.BeginTime, req.EndTime, err = CheckAndFixTime(req.BeginTime, req.EndTime) + if err != nil { + return err + } + // ids数据查找 + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelmod.FN.ChannelStat.SumDate: 1}) + parentFilter := bson.M{ + channelmod.FN.ChannelStat.AppId: req.AppId, // 应用限定 + channelmod.FN.ChannelStat.Channel: req.Channel, // 渠道限定 + channelmod.FN.ChannelStat.Type: channelmod.ChannelTypeParent, // 类型限定 + channelmod.FN.ChannelStat.IsPay: bson.M{"$ne": true}, // 未结算过 + channelmod.FN.ChannelStat.SumDate: bson.M{"$gte": req.BeginTime, "$lte": req.EndTime}, // 时间限定 + channelmod.FN.ChannelStat.ID: bson.M{"$in": req.SettleIds}, // 提交的IDs + } + ParentList, err2 := channelmod.FindManyChannelStat(ctx, parentFilter, opt) + if err2 != nil { + return err2 + } + if len(ParentList) != len(req.SettleIds) { + return fmt.Errorf("提交的统计记录条数[%d]和查找到的[%d]不一致", len(req.SettleIds), len(ParentList)) + } + // 结算项检查 + for _, stat := range ParentList { + if stat.Type != channelmod.ChannelTypeParent { + return fmt.Errorf("子渠道[%s]不能单独参与结算,只需提交其父渠道即可", stat.Channel) + } + } + if len(ParentList) == 0 { + return fmt.Errorf("没有找到渠道结算数据") + } + // 列表的起止时间 + listBeginTime := ParentList[0].SumDate + listEndTime := ParentList[len(ParentList)-1].SumDate + // 查找子级渠道的数据 + childTypes := channelmod.GetChildChannelTypes() + childFilter := bson.M{ + channelmod.FN.ChannelStat.ParentChannel: req.Channel, // 限定父渠道 + channelmod.FN.ChannelStat.Type: bson.M{"$in": childTypes}, // 限定子渠道 + channelmod.FN.ChannelStat.IsPay: bson.M{"$ne": true}, // 未结算过 + channelmod.FN.ChannelStat.SumDate: bson.M{"$gte": listBeginTime, "$lte": listEndTime}, // 时间限定 + } + ChildList, err3 := channelmod.FindManyChannelStat(ctx, childFilter) + if err3 != nil { + return err3 + } + // 把二级记录汇总到一级记录上面 + for _, parent := range ParentList { + parent.CorrectValidData() + for _, child := range ChildList { + if child.ParentChannel == parent.Channel && child.SumDate.Equal(parent.SumDate) { + channelmod.ChannelStatSummation(parent, child) // 把子渠道的数据累加到父渠道上面 + } + } + } + // 对一级记录进行统计汇总 + sumInfo := &channelmod.ChannelStat{ + Channel: channelRule.Channel, + AppId: channelRule.AppId, + Settlement: channelRule.Settlement, + CPAPrice: channelRule.CPAPrice, + CPSRate: channelRule.CPSRate, + AppType: channelRule.AppType, + PromoteMode: channelRule.PromoteMode, + } + for _, statInfo := range ParentList { + channelmod.ChannelStatSummation(sumInfo, statInfo) + } + // 根据扣量规则计算结算金额 + // TODO 这里按当前 Rule规则 扣量 + income, _ := channelmod.CalculateChannelIncome(sumInfo) + // 检查提交的和计算的是否一致 + if income != req.TotalMoney { + return fmt.Errorf("提交的结算金额[%d分]和服务器统计的[%d分]不一致", req.TotalMoney, income) + } + // 获取操作者名字 + var accName string + if accName, err = GetAccountName(ctx, accType, account); err != nil { + return fmt.Errorf("获取账号[%s]的信息失败:%s", account, err.Error()) + } + // 获取渠道信息 + channelInfo, err4 := channelmod.FindOneChannelInfoEx(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: req.Channel}) + if err4 != nil { + return fmt.Errorf("渠道不存在") + } + // 渠道级别检查 + if channelInfo.Type != channelmod.ChannelTypeParent { + return fmt.Errorf("输入的渠道不是一级渠道,只有一级渠道才能进行结算") + } + // 结算钱包检查 + if req.WalletAddr1 != nil && *req.WalletAddr1 != channelInfo.Wallet.Addr1 { + return fmt.Errorf("钱包地址1,和渠道信息中填写的不一致") + } + if req.WalletAddr2 != nil && *req.WalletAddr2 != channelInfo.Wallet.Addr2 { + return fmt.Errorf("钱包地址2,和渠道信息中填写的不一致") + } + if req.WalletAddr1 == nil && req.WalletAddr2 == nil { + return fmt.Errorf("结算的收款地址信息必须至少填写一个") + } + // 下面两步用事务 + fn := func(sctx mongo.SessionContext) error { + // 更新是否已经结算 + parentFilter = bson.M{ + channelmod.FN.ChannelStat.ID: bson.M{"$in": req.SettleIds}, // 提交的IDs + channelmod.FN.ChannelStat.IsPay: bson.M{"$in": bson.A{nil, false}}, + } + set := bson.M{ + "$set": bson.M{ + channelmod.FN.ChannelStat.IsPay: true, + }, + } + if count, err := channelmod.UpdateManyChannelStatWithResult(sctx, parentFilter, set); err != nil { + return err + } else { + if count != int64(len(req.SettleIds)) { + return fmt.Errorf("数据修改冲突,同一结算,请不要多次点击提交") + } + } + // 渠道备注 + var remark string + if req.Remark != nil { + remark = *req.Remark + } + now := time.Now() + newRecord := &channelsettlementrecord.ChannelSettlementRecord{ + Channel: req.Channel, + IncludeChild: true, + AppId: req.AppId, + BeginTime: listBeginTime, + EndTime: listEndTime, + TotalMoney: income, + SettleMoney: req.SettleMoney, + Settlement: channelRule.Settlement, + CPAPrice: channelRule.CPAPrice, + CPSRate: channelRule.CPSRate, + AppType: channelRule.AppType, + PromoteMode: channelRule.PromoteMode, + NewDirectCount: sumInfo.NewDirectCount, + NewFissionCount: sumInfo.NewFissionCount, + NewDeductionCount: sumInfo.NewDeductionCount, + RechargeAmount: sumInfo.DirectAmount + sumInfo.FissionAmount + sumInfo.DeductionAmount, + VipPayMoney: sumInfo.VipPayMoney, + VipPayCoin: sumInfo.VipPayCoin, + VipPayDeduction: sumInfo.VipPayDeduction, + ValidDirectCount: sumInfo.ValidDirectCount, + ValidDeductionCount: sumInfo.ValidDeductionCount, + ValidPayMoney: sumInfo.ValidPayMoney, + ValidPayCoin: sumInfo.ValidPayCoin, + Wallet: channelmod.Wallet{ + Addr1: checkParam(req.WalletAddr1), + Addr2: checkParam(req.WalletAddr2), + }, + PayMoney: 0, + OperateHistory: []channelsettlementrecord.SettlementOperateItem{ + { + OperateTime: time.Now(), + BeforeStatus: channelsettlementrecord.SettlementInit, + AfterStatus: channelsettlementrecord.SettlementInit, + OperatorAccount: account, + OperatorAccountName: accName, + OperatorAccountType: accType, + Pictures: []string{}, + Content: fmt.Sprintf("【%s】提交了结算申请", accName), + Remark: remark, + }, + }, + Status: channelsettlementrecord.SettlementInit, + Remark: remark, + SettleIds: req.SettleIds, + CreatedAt: now, + UpdatedAt: now, + Applicant: accName, + } + err = channelsettlementrecord.InsertOneChannelSettlementRecord(sctx, newRecord) + return err + } + if err := mongos.Transaction(ctx, fn); err != nil { + return err + } + return nil +} + +func checkParam(req *string) string { + if req != nil { + return *req + } else { + return "" + } +} + +// UpdateSettlementInfo 更新指定渠道 +func UpdateSettlementInfo(ctx context.Context, info proto.SettlementInfoUpdate) error { + + filter := bson.M{channelsettlementrecord.FN.ChannelSettlementRecord.ID: info.ID} + + set := bson.M{} + if info.PayMoney != nil { + set[channelsettlementrecord.FN.ChannelSettlementRecord.PayMoney] = info.PayMoney + } + if info.Remark != nil { + set[channelsettlementrecord.FN.ChannelSettlementRecord.Remark] = info.Remark + } + if info.Status != nil { + set[channelsettlementrecord.FN.ChannelSettlementRecord.Status] = info.Status + } + + if info.Usdt != nil { + set[channelsettlementrecord.FN.ChannelSettlementRecord.Usdt] = info.Usdt + } + //更新数据库 + setDoc := bson.M{"$set": set} + + serr := channelsettlementrecord.UpdateOneChannelSettlementRecord(ctx, filter, setDoc) + if serr != nil { + return serr + } + return nil +} + +// DeleteSettlementInfo 更新指定渠道 +func DeleteSettlementInfo(ctx context.Context, req proto.SettlementInfoDelete, accType define.ActType, account string) error { + filter := bson.M{channelsettlementrecord.FN.ChannelSettlementRecord.ID: req.ID} + settle, err := channelsettlementrecord.FindOneChannelSettlementRecordEx(ctx, filter) + if err != nil { + return err + } + // 获取操作者名字 + var accName string + if accName, err = GetAccountName(ctx, accType, account); err != nil { + return fmt.Errorf("获取账号[%s]的信息失败:%s", account, err.Error()) + } + // 状态为【发起申请】【打款失败】这两种状态的结算记录可以删除 + if settle.Status == channelsettlementrecord.SettlementInit || settle.Status == channelsettlementrecord.SettlementFailed { + + // 下面用事务 + fn := func(sctx mongo.SessionContext) error { + // 结算中的统计项全部修改为未结算状态 + statFilter := bson.M{ + channelmod.FN.ChannelStat.ID: bson.M{"$in": settle.SettleIds}, // 提交的IDs + } + set := bson.M{ + "$set": bson.M{ + channelmod.FN.ChannelStat.IsPay: false, + }, + } + err := channelmod.UpdateManyChannelStat(sctx, statFilter, set) + if err != nil { + return err + } + // 插入要删除副本到删除备份表 + settle.OperateHistory = append(settle.OperateHistory, channelsettlementrecord.SettlementOperateItem{ + OperateTime: time.Now(), + BeforeStatus: settle.Status, + AfterStatus: channelsettlementrecord.SettlementDeleted, + OperatorAccount: account, + OperatorAccountType: accType, + OperatorAccountName: accName, + Content: fmt.Sprintf("状态改变:(%s => %s)\n", settle.Status.String(), channelsettlementrecord.SettlementDeleted.String()), + Pictures: nil, + Remark: "结算记录被删除", + }) + status := settle.Status + settle.Status = channelsettlementrecord.SettlementDeleted + err = channelsettlementrecord.InsertOneChannelSettlementDeleted(ctx, settle) + if err != nil { + return err + } + // 删除结算项 + settleFilter := bson.M{ + channelsettlementrecord.FN.ChannelSettlementRecord.ID: settle.ID, + channelsettlementrecord.FN.ChannelSettlementRecord.Status: status, + } + _, err = channelsettlementrecord.DelOneChannelSettlementRecord(ctx, settleFilter) + return err + } + if err := mongos.Transaction(ctx, fn); err != nil { + return err + } + return nil + + } else { + return fmt.Errorf("当前结算项的状态[%s][%d]不能被删除!", channelsettlementrecord.GetSettStatus(settle.Status), settle.Status) + } +} + +// DetailSettlementInfo 查看结算项详情 +func DetailSettlementInfo(ctx context.Context, req proto.SettlementInfoDetail) (*proto.SettlementInfoDetailResp, error) { + resp := &proto.SettlementInfoDetailResp{} + settleFilter := bson.M{channelsettlementrecord.FN.ChannelSettlementRecord.ID: req.ID} + settle, err := channelsettlementrecord.FindOneChannelSettlementRecordEx(ctx, settleFilter) + if err != nil { + if err != mongo.ErrNoDocuments { + return nil, err + } + settle, err = channelsettlementrecord.FindOneChannelSettlementDeletedEx(ctx, settleFilter) + if err != nil { + return nil, err + } + } + // 找到所有一级记录 + statFilter := bson.M{ + channelmod.FN.ChannelStat.Type: channelmod.ChannelTypeParent, + channelmod.FN.ChannelStat.ID: bson.M{"$in": settle.SettleIds}, + } + ParentsChannelStatList, err := channelmod.FindManyChannelStat(ctx, statFilter) + if err != nil { + return nil, err + } + if len(ParentsChannelStatList) == 0 { + return resp, nil + } + // 找到分页一级记录 + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelmod.FN.ChannelStat.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + PagedChannelStatList, err := channelmod.FindManyChannelStat(ctx, statFilter, opt) + if err != nil { + return nil, err + } + // 找到所有子级记录 + childTypes := channelmod.GetChildChannelTypes() + childFilter := bson.M{ + channelmod.FN.ChannelStat.ParentChannel: settle.Channel, + channelmod.FN.ChannelStat.Type: bson.M{"$in": childTypes}, + channelmod.FN.ChannelStat.SumDate: bson.M{"$gte": settle.BeginTime, "$lte": settle.EndTime}, // 时间限定 + } + ChildsChannelStatList, err := channelmod.FindManyChannelStat(ctx, childFilter) + if err != nil { + return nil, err + } + // 把子级记录汇总到一级记录上面 + for _, parent := range ParentsChannelStatList { + for _, child := range ChildsChannelStatList { + if child.ParentChannel == parent.Channel && child.SumDate.Equal(parent.SumDate) { + channelmod.ChannelStatSummation(parent, child) // 把子渠道的数据累加到父渠道上面 + } + } + } + // 把Page列表项替换为带子渠道数据的项 + for i, pageItem := range PagedChannelStatList { + for j, parentItem := range ParentsChannelStatList { + if pageItem.ID.String() == parentItem.ID.String() { + PagedChannelStatList[i] = ParentsChannelStatList[j] + break + } + } + } + // 计算金币的数值:金币等于渠道直推充值金额-购买VIP金额-扣量 + for _, v := range PagedChannelStatList { + //v.VipPayCoin = (v.DirectAmount + v.FissionAmount - v.VipPayMoney - v.VipPayDeduction) + v.CorrectValidData() + v.CalcIncomeRate() + } + resp.List = PagedChannelStatList + resp.Count = int64(len(ParentsChannelStatList)) + return resp, nil +} + +// UpdateSettlementInfo2 更新指定渠道 +func UpdateSettlementInfo2(ctx context.Context, req proto.SettlementInfoUpdate2, accType define.ActType, account string) error { + + chReq := proto.SettlementInfoUpdate2{} + filter := bson.M{channelsettlementrecord.FN.ChannelSettlementRecord.ID: req.ID} + settle, err := channelsettlementrecord.FindOneChannelSettlementRecordEx(ctx, filter) + if err != nil { + return err + } + // 获取操作者名字 + var accName string + if accName, err = GetAccountName(ctx, accType, account); err != nil { + return fmt.Errorf("获取操作者账号[%s]的信息失败:%s", account, err.Error()) + } + set := bson.M{channelsettlementrecord.FN.ChannelSettlementRecord.UpdatedAt: time.Now()} + if req.Remark != nil { + set[channelsettlementrecord.FN.ChannelSettlementRecord.Remark] = req.Remark + chReq.Remark = req.Remark + } + // 状态转换检查 + switch settle.Status { + case channelsettlementrecord.SettlementInit: // 【发起】结算状态,可以修改和确认 + { + if req.Status == nil { // 渠道可以修改要结算的钱数,及钱包地址 + return fmt.Errorf("参数错误,要修改的状态字段为空") + } else { + if *req.Status == channelsettlementrecord.SettlementSuccess || *req.Status == channelsettlementrecord.SettlementFailed { + set[channelsettlementrecord.FN.ChannelSettlementRecord.Status] = req.Status + chReq.Status = req.Status + if *req.Status == channelsettlementrecord.SettlementSuccess { + if req.Usdt != nil { + set[channelsettlementrecord.FN.ChannelSettlementRecord.Usdt] = req.Usdt + chReq.Usdt = req.Usdt + } + if req.PayMoney != nil { + set[channelsettlementrecord.FN.ChannelSettlementRecord.PayMoney] = req.PayMoney + chReq.PayMoney = req.PayMoney + } + } + } else { + return fmt.Errorf("修改状态出错!因为结算状态为【发起申请】状态,只能修改为【打款成功】或【打款失败】") + } + } + } + case channelsettlementrecord.SettlementSuccess: + { + return fmt.Errorf("错误,已经成功的结算单不能修改") + } + case channelsettlementrecord.SettlementFailed: + { + return fmt.Errorf("错误,打款失败的结算单不能修改,只能删除后重新发起结算申请") + } + case channelsettlementrecord.SettlementDeleted: + { + return fmt.Errorf("错误,已删除的订单无法修改") + } + default: + { + return fmt.Errorf("状态无效") + } + } + + opItem := GetUpdateSettlementOperateItem(*settle, chReq, accType, account, accName, req.Pictures) + push := bson.M{channelsettlementrecord.FN.ChannelSettlementRecord.OperateHistory: opItem} + + //更新数据库 + setDoc := bson.M{"$set": set, "$push": push} + + serr := channelsettlementrecord.UpdateOneChannelSettlementRecord(ctx, filter, setDoc) + if serr != nil { + return serr + } + return nil +} + +func ExportSettleApplyForm(rPath string, transInfos []*channelsettlementrecord.ChannelSettlementRecord, appList []appInfoMod.AppInfo) error { + f := excelize.NewFile() + sheetName := "Sheet1" + // 设置列宽 + f.SetColWidth("Sheet1", "A", "W", 20) + // 设置表头行高 + f.SetRowHeight("Sheet1", 1, 30) + // 设置表头样式 + headStyleID, _ := f.NewStyle(`{ + "font":{ + "color":"#333333", + "bold":true, + "size":16, + "family":"arial" + }, + "alignment":{ + "vertical":"center", + "horizontal":"center" + } + }`) + + f.SetCellStyle("Sheet1", "A1", "W1", headStyleID) + + idx := f.NewSheet(sheetName) + var exportTransWaterTitle = map[string]string{ + "A1": "申请人", + "B1": "产品", + "C1": "渠道码", + "D1": "分成", + "E1": "结算期间", + "F1": "", + "G1": "新增", + "H1": "", + "I1": "金币充值", + "J1": "充值金额", + "K1": "结算金额", + "L1": "ARPU", + "M1": "收益比例", + "N1": "打款日期", + "O1": "打款金额", + "P1": "实际打款", + "Q1": "汇率", + "R1": "U金额", + "S1": "方式", + "T1": "钱包", + "U1": "打款资料", + "V1": "打款资料", + "W1": "备注", + } + for k, v := range exportTransWaterTitle { + f.SetCellValue(sheetName, k, v) + } + f.SetCellValue(sheetName, "E2", "开:") + f.SetCellValue(sheetName, "F2", "结:") + f.SetCellValue(sheetName, "G2", "未") + f.SetCellValue(sheetName, "H2", "扣") + + f.MergeCell(sheetName, "E1", "F1") + f.MergeCell(sheetName, "G1", "H1") + + SetCellValue := func(file *excelize.File, sheet, axis string, value string) { + //fmt.Printf("sheet: %s, axis:%s, value:%s\n", sheet, axis, value) + file.SetCellValue(sheetName, axis, value) + } + + for index, item := range transInfos { + col := 'A' // col 不能超过Z,即列输不能超过26列,超出将出现bug + row := index + 3 + axis := func() string { + ret := fmt.Sprintf("%s%d", string(col), row) + col++ + return ret + } + operator := "" + remark := "" + if len(item.OperateHistory) > 0 { + operator = item.OperateHistory[0].OperatorAccountName + remark = item.OperateHistory[0].Remark + if len(item.OperateHistory) > 1 { + if remark == "" { + remark = item.OperateHistory[len(item.OperateHistory)-1].Remark + } else { + s := item.OperateHistory[len(item.OperateHistory)-1].Remark + if s != "" { + remark += " / " + s + } + } + } + } + begin := item.BeginTime.Local().Format("2006-01-02") + end := item.EndTime.Local().Format("2006-01-02") + divide := "" + if item.Settlement == channelmod.SettlementCPA { + divide = fmt.Sprintf("%.2f", float64(item.CPAPrice)/100) + } else if item.Settlement == channelmod.SettlementCPS { + divide = fmt.Sprintf("%d%%", item.CPSRate) + } + + payMoneyStr := "" + if item.Status == channelsettlementrecord.SettlementSuccess { + payMoneyStr = IndentationDisplay(item.SettleMoney) + } + realMoneyStr := "" + realUsdtStr := "" + if item.Status == channelsettlementrecord.SettlementSuccess { + realMoneyStr = IndentationDisplay(item.PayMoney) + realUsdtStr = IndentationDisplay(item.Usdt) + } + //fmt.Printf("----- ROW %d -----\n", row) + product := fmt.Sprintf("%s%s", GetAppName(appList, item.AppId), strings.ToUpper(string(item.Settlement))) + SetCellValue(f, sheetName, axis(), operator) //申请人 + SetCellValue(f, sheetName, axis(), product) //产品 + SetCellValue(f, sheetName, axis(), item.Channel) //渠道码 + SetCellValue(f, sheetName, axis(), divide) //分成 + SetCellValue(f, sheetName, axis(), begin) //开 + SetCellValue(f, sheetName, axis(), end) //结 + SetCellValue(f, sheetName, axis(), FenToYuanDisplay(item.NewDirectCount+item.NewFissionCount+item.NewDeductionCount)) //未 + SetCellValue(f, sheetName, axis(), FenToYuanDisplay(item.NewDirectCount)) //扣 + SetCellValue(f, sheetName, axis(), IndentationDisplay(item.VipPayCoin)) //金币充值 + SetCellValue(f, sheetName, axis(), IndentationDisplay(item.VipPayMoney+item.VipPayDeduction)) //充值金额(这里显示的是:总充值-金币) + SetCellValue(f, sheetName, axis(), IndentationDisplay(item.SettleMoney)) //结算金额 + SetCellValue(f, sheetName, axis(), "") //ARPU + SetCellValue(f, sheetName, axis(), "") //收益比例 + SetCellValue(f, sheetName, axis(), "") //打款日期 + SetCellValue(f, sheetName, axis(), payMoneyStr) //打款金额 + SetCellValue(f, sheetName, axis(), realMoneyStr) //实际打款 + SetCellValue(f, sheetName, axis(), "") //汇率 + SetCellValue(f, sheetName, axis(), realUsdtStr) //U金额 + SetCellValue(f, sheetName, axis(), "") //方式 + SetCellValue(f, sheetName, axis(), "") //钱包 + SetCellValue(f, sheetName, axis(), item.Wallet.Addr1) //打款资料 + SetCellValue(f, sheetName, axis(), item.Wallet.Addr2) //打款资料 + SetCellValue(f, sheetName, axis(), remark) //备注 + } + f.SetActiveSheet(idx) + p, _ := os.Getwd() + fileName := path.Join(p, rPath) + if err := f.SaveAs(fileName); err != nil { + log.Error("SettlementInfo:ExportSettleForm save file to disk failed", + log.Any("fileName", fileName), + log.E(err)) + return err + } + return nil +} + +func export(rPath string, transInfos []*channelsettlementrecord.ChannelSettlementRecord, appList []appInfoMod.AppInfo) error { + f := excelize.NewFile() + sheetName := "Sheet1" + // 设置列宽 + f.SetColWidth("Sheet1", "A", "U", 20) + // 设置表头行高 + f.SetRowHeight("Sheet1", 1, 30) + // 设置表头样式 + headStyleID, _ := f.NewStyle(`{ + "font":{ + "color":"#333333", + "bold":true, + "size":16, + "family":"arial" + }, + "alignment":{ + "vertical":"center", + "horizontal":"center" + } + }`) + + f.SetCellStyle("Sheet1", "A1", "U1", headStyleID) + + idx := f.NewSheet(sheetName) + var exportTransWaterTitle = map[string]string{ + "A1": "开始时间", + "B1": "结束时间", + "C1": "渠道", + "D1": "结算方式", + "E1": "收款信息1", + "F1": "收款信息2", + "G1": "单价", + "H1": "分成比列", + "I1": "应用名称", + "J1": "新增", + "K1": "扣量", + "L1": "充值金额", + "M1": "金币充值", + "N1": "统计结算金额", + "O1": "申请结算金额", + "P1": "打款金额(CNY)", + "Q1": "打款金额(USDT)", + "R1": "备注", + "S1": "状态", + "T1": "创建时间", + "U1": "申请结算人", + } + for k, v := range exportTransWaterTitle { + f.SetCellValue(sheetName, k, v) + } + for k, v := range transInfos { + i := 'A' // i 不能超过Z,即列输不能超过26列,超出将出现bug + begin := v.BeginTime.Local().Format("2006-01-02") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), begin) //开始时间 + i++ + end := v.EndTime.Local().Format("2006-01-02") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), end) //结束时间 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Channel) //渠道 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Settlement) //结算方式 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Wallet.Addr1) //打款地址1 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Wallet.Addr2) //打款地址2 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.CPAPrice)/100) //单价 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.CPSRate) //分成比列 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), GetAppName(appList, v.AppId)) //应用名称 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.NewDirectCount) //新增 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.NewDeductionCount) //扣量 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.VipPayMoney+v.VipPayDeduction)/100) //充值金额 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.VipPayCoin)/100) //金币充值 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.TotalMoney)/100) //统计结算金额 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.SettleMoney)/100) //申请结算金额 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.PayMoney)/100) //打款金额 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.Usdt)/100) + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Remark) //备注 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Status.String()) + i++ + timeStr := v.CreatedAt.Local().Format("2006-01-02") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), timeStr) + opName := "" + if len(v.OperateHistory) > 0 { + opName = v.OperateHistory[0].OperatorAccountName + } + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), opName) + } + f.SetActiveSheet(idx) + p, _ := os.Getwd() + fileName := path.Join(p, rPath) + if err := f.SaveAs(fileName); err != nil { + log.Error("SettlementInfo:export save file to disk failed", + log.Any("fileName", fileName), + log.E(err)) + return err + } + return nil +} + +func GetAppName(appList []appInfoMod.AppInfo, appId int32) string { + for _, app := range appList { + if app.AppId == appId { + return app.Name + } + } + return "未知app" +} diff --git a/service/channelSer/settlementHelper.go b/service/channelSer/settlementHelper.go new file mode 100644 index 0000000..0c89a96 --- /dev/null +++ b/service/channelSer/settlementHelper.go @@ -0,0 +1,150 @@ +package channelSer + +import ( + "context" + "fmt" + "stat/api/proto" + "stat/common/utils" + "stat/middleware/define" + "stat/models/adminMod" + channelmod "stat/models/channelmod" + "stat/models/channelsettlementrecord" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +var ( + SystemStartTime = time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC) +) + +func SettlementInfoToApplyRecord(src *channelsettlementrecord.ChannelSettlementRecord) *proto.ApplyFormRecord { + ret := &proto.ApplyFormRecord{ + ID: src.ID, + Channel: src.Channel, + AppId: src.AppId, + BeginTime: src.BeginTime, + EndTime: src.EndTime, + TotalMoney: src.TotalMoney, + SettleMoney: src.SettleMoney, + Settlement: src.Settlement, + Wallet: src.Wallet, + PayMoney: src.PayMoney, + Usdt: src.Usdt, + Status: src.Status, + Remark: "", + Pictures: nil, + UpdatedAt: src.UpdatedAt, + CreatedAt: src.CreatedAt, + } + remark := "" + if len(src.OperateHistory) > 0 { + remark = src.OperateHistory[0].Remark + if len(src.OperateHistory) > 1 { + if remark == "" { + remark = src.OperateHistory[len(src.OperateHistory)-1].Remark + } else { + s := src.OperateHistory[len(src.OperateHistory)-1].Remark + if s != "" { + remark += " / " + s + } + } + } + ret.Pictures = src.OperateHistory[len(src.OperateHistory)-1].Pictures + } + ret.Remark = remark + + return ret +} + +func SettlementInfoListToApplyForm(lst channelsettlementrecord.ChannelSettlementRecordList) proto.ApplyFormRecordList { + res := make(proto.ApplyFormRecordList, 0) + for _, item := range lst { + a := SettlementInfoToApplyRecord(item) + res = append(res, a) + } + return res +} + +func FenToYuanDisplay(fen int64) string { + return fmt.Sprintf("%.2f", float64(fen)/float64(100)) +} + +func IndentationDisplay(v int64) string { + return fmt.Sprintf("%.2f", float64(v)/float64(10000)) +} + +func CheckAndFixTime(startTime, endTime *time.Time) (*time.Time, *time.Time, error) { + var start, end *time.Time + // 开始时间和结束时间 + if endTime == nil { + e := utils.BeginOfYesterday() + end = &e + } else { + end = endTime + } + if startTime == nil { + start = &SystemStartTime + } else { + start = startTime + } + // + if end.After(utils.BeginOfYesterday()) { + e := utils.BeginOfYesterday() + end = &e + } + if end.Before(*start) { + return nil, nil, fmt.Errorf("开始和结束的时间区间填写不正确") + } + return start, end, nil +} + +func GetUpdateSettlementOperateItem(old channelsettlementrecord.ChannelSettlementRecord, update proto.SettlementInfoUpdate2, + accType define.ActType, account string, accountName string, images []string) channelsettlementrecord.SettlementOperateItem { + res := channelsettlementrecord.SettlementOperateItem{} + res.OperateTime = time.Now() + if update.Remark != nil { + res.Remark = *update.Remark + } + res.OperatorAccountType = accType + res.OperatorAccount = account + res.OperatorAccountName = accountName + res.BeforeStatus = old.Status + if update.Status != nil && *update.Status != old.Status { + res.AfterStatus = *update.Status + res.Content += fmt.Sprintf("状态改变:(%s => %s)\n", old.Status.String(), update.Status.String()) + } else { + res.AfterStatus = old.Status + } + if update.Usdt != nil && *update.Usdt != old.Usdt { + res.Content += fmt.Sprintf("修改了打款金额(USDT):(%s => %s)\n", FenToYuanDisplay(old.Usdt), FenToYuanDisplay(*update.Usdt)) + } + if update.PayMoney != nil && *update.PayMoney != old.PayMoney { + res.Content += fmt.Sprintf("修改了打款金额(CNY): (%s => %s)\n", FenToYuanDisplay(old.PayMoney), FenToYuanDisplay(*update.PayMoney)) + } + if update.SettleMoney != nil && *update.SettleMoney != old.SettleMoney { + res.Content += fmt.Sprintf("修改了申请结算金额:(%s => %s)\n", FenToYuanDisplay(old.SettleMoney), FenToYuanDisplay(*update.SettleMoney)) + } + for _, img := range images { + res.Pictures = append(res.Pictures, img) + } + return res +} + +func GetAccountName(ctx context.Context, accType define.ActType, account string) (string, error) { + if accType == define.Admin { + if acc, err := adminMod.FindOneByAccount(ctx, account); err != nil { + return "", err + } else { + return acc.Name, nil + } + } else if accType == define.Channel { + if acc, err := channelmod.FindOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: account}); err != nil { + return "", err + } else { + return acc.Channel, nil + } + } else { + return "", fmt.Errorf("error account type: %s", accType) + } +} diff --git a/service/channelSer/stat.go b/service/channelSer/stat.go new file mode 100644 index 0000000..3fa2143 --- /dev/null +++ b/service/channelSer/stat.go @@ -0,0 +1,321 @@ +package channelSer + +import ( + "context" + "errors" + "runtime" + "stat/api/proto" + "stat/common/utils" + "stat/models/channelmod" + "time" + + "github.com/jinzhu/now" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// SearchChannelStat 查询渠道扣量规则信息 +func SearchChannelStat(ctx context.Context, req *proto.ChannelStatSearch) (*proto.ChannelStatSearchResp, error) { + resp := &proto.ChannelStatSearchResp{ + List: make(channelmod.ChannelStatList, 0), + } + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + if req.Channel != nil && *req.Channel != "" { + if req.WithChild != nil && *req.WithChild { + filter = bson.M{ + "$or": bson.A{ + bson.M{channelmod.FN.ChannelStat.Channel: *req.Channel}, + bson.M{channelmod.FN.ChannelStat.ParentChannel: *req.Channel}, + }, + } + } else { + filter[channelmod.FN.ChannelStat.Channel] = *req.Channel + } + } else if req.DayType != nil { + timeNow := time.Now() + now.WeekStartDay = time.Monday + Now := now.With(timeNow.In(time.Local)) + todayBegin := utils.BeginWithTime(timeNow) + weekBegin := Now.BeginningOfWeek() + monthBegin := Now.BeginningOfMonth() + var timeBegin time.Time + if *req.DayType == 1 { // 今天内 + timeBegin = todayBegin + } else if *req.DayType == 2 { // 昨天和今天 + timeBegin = todayBegin.AddDate(0, 0, -1) + } else if *req.DayType == 3 { // 三天内 + timeBegin = todayBegin.AddDate(0, 0, -2) + } else if *req.DayType == 4 { // 七天内 + timeBegin = todayBegin.AddDate(0, 0, -6) + } else if *req.DayType == 5 { // 本周内 + timeBegin = weekBegin + } else if *req.DayType == 6 { // 两周内 + timeBegin = weekBegin.AddDate(0, 0, -7) + } else if *req.DayType == 7 { // 本月内 + timeBegin = monthBegin + } else if *req.DayType == 8 { // 两月内 + timeBegin = monthBegin.AddDate(0, -1, 0) + } + channelList, err := channelmod.FindManyChannelInfo(ctx, bson.M{ + channelmod.FN.ChannelInfo.CreatedAt: bson.M{ + "$gte": timeBegin, + "$lte": timeNow, + }, + }) + if err != nil { + return resp, err + } + channelIds := make([]string, 0) + for _, channelInfo := range channelList { + channelIds = append(channelIds, channelInfo.Channel) + } + + if len(channelIds) > 0 { + if req.WithChild != nil && *req.WithChild { + filter = bson.M{ + "$or": bson.A{ + bson.M{channelmod.FN.ChannelStat.Channel: bson.M{"$in": channelIds}}, + bson.M{channelmod.FN.ChannelStat.ParentChannel: bson.M{"$in": channelIds}}, + }, + } + } else { + filter[channelmod.FN.ChannelStat.Channel] = bson.M{"$in": channelIds} + } + } else { + return resp, nil + } + } + + // + //排序 + if req.RankType != nil { + if *req.RankType == 1 { + opt.SetSort(bson.D{{Key: channelmod.FN.ChannelStat.SumDate, Value: -1}, {Key: channelmod.FN.ChannelStat.DirectAmount, Value: -1}}) + } else if *req.RankType == 2 { + opt.SetSort(bson.D{{Key: channelmod.FN.ChannelStat.SumDate, Value: -1}, {Key: channelmod.FN.ChannelStat.NewDirectCount, Value: -1}}) + } else if *req.RankType == 3 { + opt.SetSort(bson.D{{Key: channelmod.FN.ChannelStat.SumDate, Value: -1}, {Key: channelmod.FN.ChannelStat.NewRechargeAmount, Value: -1}}) + } else if *req.RankType == 4 { + opt.SetSort(bson.D{{Key: channelmod.FN.ChannelStat.SumDate, Value: -1}, {Key: channelmod.FN.ChannelStat.IncomeRate, Value: -1}}) + } + } else { + opt.SetSort(bson.D{{Key: channelmod.FN.ChannelStat.SumDate, Value: -1}, {Key: channelmod.FN.ChannelStat.NewDirectCount, Value: -1}}) + } + + if req.UserName != nil && *req.UserName != "" { + filter[channelmod.FN.ChannelStat.UserName] = bson.M{"$regex": *req.UserName} + } + + if req.AppId != nil { + filter[channelmod.FN.ChannelStat.AppId] = bson.M{"$in": *req.AppId} + } + + if req.Start != nil && req.End != nil { + filter[channelmod.FN.ChannelStat.SumDate] = bson.M{"$gte": *req.Start, "$lte": *req.End} + } + + if req.WithChild != nil && !*req.WithChild { + filter[channelmod.FN.ChannelStat.Type] = channelmod.ChannelTypeParent + } + if req.Settlement != nil { + filter[channelmod.FN.ChannelStat.Settlement] = *req.Settlement + } + if req.Detail != nil && *req.Detail { + if req.SumDate == nil { + return resp, errors.New("param error") + } + filter = bson.M{ + "$or": bson.A{ + bson.M{channelmod.FN.ChannelStat.Channel: *req.Channel}, + bson.M{channelmod.FN.ChannelStat.ParentChannel: *req.Channel}, + }, + channelmod.FN.ChannelStat.SumDate: *req.SumDate, + } + } + + ChannelStatList, err := channelmod.FindManyChannelStat(ctx, filter, opt) + if err != nil { + return resp, err + } + + for _, v := range ChannelStatList { + v.CorrectValidData() + v.CalcIncomeRate() + } + resp.List = ChannelStatList + + // 汇总 + canSum := utils.M(filter).HasKey(channelmod.FN.ChannelStat.AppId) && utils.M(filter).HasKey(channelmod.FN.ChannelStat.SumDate) + + if canSum { + var total int64 + err = channelmod.FindManyChannelStatShard(ctx, filter, 10000, func(item *channelmod.ChannelStat) { + total++ + channelmod.ChannelStatSummation(&resp.TotalInfo, item) + if req.WithChild != nil && *req.WithChild { + for _, v := range ChannelStatList { + if item.ParentChannel == v.Channel && v.SumDate.Equal(item.SumDate) { + channelmod.ChannelStatSummation(v, item) + } + } + } + }) + if err != nil { + return resp, err + } + if total == 0 { + return resp, nil + } + if total > 10000 { + runtime.GC() + } + resp.Total = total + var ruleInfo *channelmod.ChannelDeductionRule + if req.Channel != nil && *req.Channel != "" { + ruleFilter := bson.M{ + channelmod.FN.ChannelDeductionRule.Channel: req.Channel, + // channelmod.FN.ChannelDeductionRule.AppId: req.AppId, + } + ruleInfo, _ = channelmod.FindOneChannelDeductionRule(ctx, ruleFilter) + } + if ruleInfo != nil { + resp.TotalInfo.Channel = ruleInfo.Channel + resp.TotalInfo.Settlement = ruleInfo.Settlement + resp.TotalInfo.AppId = ruleInfo.AppId + resp.TotalInfo.CPAPrice = ruleInfo.CPAPrice + resp.TotalInfo.CPSRate = ruleInfo.CPSRate + resp.TotalInfo.AppType = ruleInfo.AppType + resp.TotalInfo.PromoteMode = ruleInfo.PromoteMode + resp.TotalInfo.CalcIncomeRate() + resp.Income, resp.Desc = channelmod.CalculateChannelIncome(&resp.TotalInfo) + } + } else { + resp.Total = 1000000 + } + + return resp, nil +} + +// SearchChannelSettlement 查询渠道结算信息 +func SearchChannelSettlement(ctx context.Context, req *proto.ChannelSettlementSearch) ( + *proto.ChannelSettlementSearchResp, error) { + resp := &proto.ChannelSettlementSearchResp{} + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelmod.FN.ChannelSettlement.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + if req.Channel != nil && *req.Channel != "" { + filter[channelmod.FN.ChannelSettlement.Channel] = *req.Channel + } + + if req.AppId != nil { + filter[channelmod.FN.ChannelSettlement.AppId] = *req.AppId + } + + if req.Start != nil && req.End != nil { + filter[channelmod.FN.ChannelSettlement.SumDate] = bson.M{"$gt": *req.Start, "$lt": *req.End} + } + + if req.WithChild != nil && *req.WithChild { + filter[channelmod.FN.ChannelSettlement.Type] = channelmod.ChannelTypeParent + } + + total, serr := channelmod.CountChannelSettlements(ctx, filter) + if serr != nil { + return nil, serr + } + if total == 0 { + return resp, nil + } + + ChannelSettlementList, err := channelmod.FindManyChannelSettlement(ctx, filter, opt) + if serr != nil { + return nil, err + } + + if req.WithChild != nil && *req.WithChild { + channels := make([]string, 0) + for _, v := range ChannelSettlementList { + channels = append(channels, v.Channel) + } + childTypes := channelmod.GetChildChannelTypes() + filter[channelmod.FN.ChannelSettlement.Type] = bson.M{"$in": childTypes} + filter[channelmod.FN.ChannelSettlement.ParentChannel] = bson.M{"$in": channels} + channelsettlementList, err := channelmod.FindManyChannelStat(ctx, filter) + if err != nil { + return nil, err + } + for _, channnelSettlementInfo := range channelsettlementList { + for _, v := range ChannelSettlementList { + if channnelSettlementInfo.ParentChannel == v.Channel { + channnelSettlementInfo.AccumulateTo(v) + } + } + } + } + + resp.Total = total + resp.List = ChannelSettlementList + return resp, nil +} + +// SearchChannelStatCompared 渠道同时段对比 +func SearchChannelStatCompared(ctx context.Context, req *proto.SearchChannelStatComparedReq) (*proto.SearchChannelStatComparedResp, error) { + resp := &proto.SearchChannelStatComparedResp{} + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + opt.SetSort( + bson.D{ + {Key: channelmod.FN.ChannelStatYestoday.SumDate, Value: -1}, + {Key: channelmod.FN.ChannelStatYestoday.NewCount, Value: -1}, + }, + ) + + if req.Channel != nil && *req.Channel != "" { + if req.WithChild != nil && *req.WithChild { + filter = bson.M{ + "$or": bson.A{ + bson.M{channelmod.FN.ChannelStatYestoday.Channel: *req.Channel}, + bson.M{channelmod.FN.ChannelStatYestoday.ParentChannel: *req.Channel}, + }, + } + } else { + filter[channelmod.FN.ChannelStatYestoday.Channel] = *req.Channel + } + } + + if req.AppId != nil { + filter[channelmod.FN.ChannelStatYestoday.AppId] = *req.AppId + } + + if req.Start != nil && req.End != nil { + filter[channelmod.FN.ChannelStatYestoday.SumDate] = bson.M{"$gte": *req.Start, "$lte": *req.End} + } + + if req.Settlement != nil { + filter[channelmod.FN.ChannelStatYestoday.Settlement] = *req.Settlement + } + total, err := channelmod.CountChannelStatYestoday(ctx, filter) + if err != nil { + return nil, err + } + + channelStatList, err := channelmod.FindManyChannelStatYestoday(ctx, filter, opt) + if err != nil { + return nil, err + } + + resp.Total = total + resp.List = channelStatList + + return resp, nil +} diff --git a/service/consumer/handler.go b/service/consumer/handler.go new file mode 100644 index 0000000..756d590 --- /dev/null +++ b/service/consumer/handler.go @@ -0,0 +1,991 @@ +package consumer + +import ( + "context" + "fmt" + "stat/common/enum/consts" + "stat/common/log" + "stat/common/statutils" + "stat/common/topicmessage" + "stat/common/utils" + "stat/models/accessmod" + "stat/models/channelmod" + downloadinfo "stat/models/downloadinfo" + "stat/models/rechargegamemod" + "stat/models/rechargemod" + "stat/models/registermod" + "stat/models/syncgamerecharge" + "stat/models/syncgamewater" + "stat/models/syncrecharge" + "stat/models/syncrecord" + "stat/models/syncvip" + "stat/models/syncwithdraw" + "stat/models/withdrawGameOrdermod" + "stat/models/withdrawUserOrdermod" + "stat/statg" + "strings" + + "time" + + "github.com/pkg/errors" + "go.mongodb.org/mongo-driver/bson" + "go.uber.org/zap" +) + +// 1.用户访问消息处理函数 +func UserAccessHandler(accessMsg *topicmessage.UserVisitMsg) error { + + accessInfo := accessmod.AccessMod{ + UserId: accessMsg.UserId, + AppId: accessMsg.AppId, + SysType: accessMsg.SysType, + DevType: accessMsg.DevType, + IP: accessMsg.IP, + Version: accessMsg.Version, + DevID: accessMsg.DevID, + VisitAt: accessMsg.VisitAt, + CreatedAt: time.Now(), + } + + // 查找用户信息 + userInfo, err := registermod.GetRegisterInfo(context.Background(), accessInfo.UserId, accessInfo.AppId) + if err != nil { + return err + } + + accessInfo.IsDirect = userInfo.IsDirect + accessInfo.DistrictCode = userInfo.DistrictCode + accessInfo.RegisterTime = userInfo.RegisterTime + accessInfo.IsFormalUser = userInfo.IsFormal + + if userInfo.UserId != accessInfo.UserId { + accessInfo.IsDirect = true + } + + return accessmod.AddAccessLog(context.Background(), &accessInfo) +} + +// 2.用户注册消息处理函数 +func UserRegisterHandler(registerMsg *topicmessage.UserRegisterMsg) error { + ctx := context.Background() + + registerInfo := registermod.RegisterMod{ + UserId: registerMsg.UserId, + AppId: registerMsg.AppId, + SysType: registerMsg.SysType, + DevType: registerMsg.DevType, + Mobile: registerMsg.Mobile, + Name: registerMsg.Name, + IP: registerMsg.IP, + IsDirect: true, + DistrictCode: strings.TrimSpace(registerMsg.DistrictCode), + DC: strings.TrimSpace(registerMsg.DistrictCode), + DistrictFrom: registermod.DistrictFromNone, + PromCode: registerMsg.PromCode, + RegisterTime: registerMsg.RegisterTime, + ParentPromCode: registerMsg.PromSeqe, + UserAgent: registerMsg.UserAgent, + IsDeduction: false, + } + var ipChecked bool + // 检测 + testUser, err := registermod.GetRegisterInfo(ctx, registerInfo.UserId, registerInfo.AppId) + if err != nil { + log.Error("UserRegisterHandler define err", log.Any("UserId", testUser.UserId), log.E(err)) + return err + } + if testUser.UserId == registerInfo.UserId { + return nil // 已存在 + } + if len(registerInfo.ParentPromCode) > 0 && len(registerInfo.DistrictCode) == 0 { + testUser, err := registermod.GetRegisterInfoByInviteCode(ctx, registerInfo.ParentPromCode, registerInfo.AppId) + if err != nil || testUser.PromCode != registerInfo.ParentPromCode { + log.Error("GetRegisterInfoByInviteCode define err", log.Any("UserId", testUser.UserId), log.E(err)) + } else { + // 推广相关逻辑 + registerInfo.IsDirect = false + registerInfo.DistrictFrom = registermod.DistrictFromPC + registerInfo.DistrictCode = testUser.DistrictCode + } + } + + if registerInfo.IP != "" { + if registerInfo.DistrictCode != "" { + channelInfo, _ := channelmod.FindOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: registerInfo.DistrictCode}) + if channelInfo == nil || channelInfo.Channel != registerInfo.DistrictCode { + registerInfo.DistrictCode = "" + } + } + + if registerInfo.DistrictCode == "" { + // 根据IP查询是否下载 + ipChecked = true + data, _ := downloadinfo.FindOneChannelIP(ctx, registerInfo.AppId, registerInfo.IP, registerInfo.SysType) + if data.DC != "" { + log.Info("channel info by IP ", log.Any("IP", registerInfo.IP), log.Any("app", registerInfo.AppId), log.Any("dc", data.DC)) + registerInfo.DistrictFrom = registermod.DistrictFromIP + registerInfo.IpMatched = true + registerInfo.DistrictCode = data.DC + } + } + } + + if registerInfo.DistrictCode != "" && registerInfo.DistrictFrom == registermod.DistrictFromNone { + registerInfo.DistrictFrom = registermod.DistrictFromDC + } + if !ipChecked && registerInfo.IP != "" { + data, _ := downloadinfo.FindOneChannelIP(ctx, registerInfo.AppId, registerInfo.IP, registerInfo.SysType) + if data.DC != "" { + registerInfo.IpMatched = true + } + } + registerInfo.BlocDeduction = false // 不扣量 + // 插入记录 + return registermod.AddRegisterLog(ctx, ®isterInfo) +} + +// 2.用户注册消息处理函数 +func FormalUserRegisterHandler(registerMsg *topicmessage.UserRegisterMsg) error { + ctx := context.Background() + + registerInfo := registermod.RegisterMod{ + UserId: registerMsg.UserId, + AppId: registerMsg.AppId, + SysType: registerMsg.SysType, + DevType: registerMsg.DevType, + Mobile: registerMsg.Mobile, + Name: registerMsg.Name, + IP: registerMsg.IP, + IsDirect: true, + DistrictCode: strings.TrimSpace(registerMsg.DistrictCode), + DC: strings.TrimSpace(registerMsg.DistrictCode), + DistrictFrom: registermod.DistrictFromNone, + PromCode: registerMsg.PromCode, + IsFormal: true, + FormalTime: registerMsg.RegisterTime, + RegisterTime: registerMsg.RegisterTime, + ParentPromCode: registerMsg.PromSeqe, + IsDeduction: false, + } + + // 检测 + testUser, err := registermod.GetRegisterInfo(ctx, registerInfo.UserId, registerInfo.AppId) + if err != nil { + log.Error("FormalUserRegisterHandler define err", log.Any("UserId", testUser.UserId), log.E(err)) + return err + } + if testUser.UserId == registerInfo.UserId { + if testUser.RegisterTime.Before(registerInfo.FormalTime) { + // 更新 + setdoc := bson.M{"$set": bson.M{ + "formalTime": registerInfo.FormalTime, + "isFormal": true, + }} + filter := bson.M{ + "appId": registerInfo.AppId, + "userId": registerInfo.UserId, + } + err := registermod.UpdateOneRegister(ctx, filter, setdoc) + if err != nil { + log.Error("NewCountMethod UpdateManyRegister ", log.E(err)) + } + } else { + log.Error("FormalUserRegisterHandler register or formal time err", log.Any("AppId", testUser.AppId), log.Any("UserId", testUser.UserId), log.Any("RegisterTime", testUser.RegisterTime), log.Any("FormalTime", registerInfo.FormalTime)) + return nil + } + } else { + // 插入 + if len(registerInfo.ParentPromCode) > 0 && len(registerInfo.DistrictCode) == 0 { + testUser, err := registermod.GetRegisterInfoByInviteCode(ctx, registerInfo.ParentPromCode, registerInfo.AppId) + if err != nil || testUser.PromCode != registerInfo.ParentPromCode { + log.Error("GetRegisterInfoByInviteCode define err", log.Any("UserId", testUser.UserId), log.E(err)) + } else { + // 推广相关逻辑 + registerInfo.IsDirect = false + registerInfo.DistrictFrom = registermod.DistrictFromPC + registerInfo.DistrictCode = testUser.DistrictCode + } + } else if registerInfo.DistrictCode == "" && registerInfo.IP != "" { + data, _ := downloadinfo.FindOneChannelIP(ctx, registerInfo.AppId, registerInfo.IP, registerInfo.SysType) + if data.DC != "" { + log.Info("channel info by IP ", log.Any("IP", registerInfo.IP), log.Any("app", registerInfo.AppId), log.Any("dc", data.DC)) + registerInfo.DistrictFrom = registermod.DistrictFromIP + registerInfo.DistrictCode = data.DC + } + } + + registerInfo.BlocDeduction = false // 不扣量 + + // 插入记录 + return registermod.AddRegisterLog(ctx, ®isterInfo) + } + return nil +} + +// 3.用户充值消息处理函数 +func UserReChargeHandler(rechargeMsg *topicmessage.UserRechargeMsg) error { + ctx := context.Background() + + rechargeInfo := rechargemod.RechargeMod{ + UserId: rechargeMsg.UserId, + AppId: rechargeMsg.AppId, + PlatformId: rechargeMsg.PlatformId, + SysType: rechargeMsg.SysType, + DevType: rechargeMsg.DevType, + ChannelName: rechargeMsg.ChannelName, + CID: rechargeMsg.CID, + Type: rechargeMsg.Type, + OrderId: rechargeMsg.OrderId, + Money: rechargeMsg.Money, + PayMoney: rechargeMsg.PayMoney, + Status: 3, + Rate: rechargeMsg.Rate, + SuccessAt: rechargeMsg.SuccessAt, + Repeat: false, + } + // 检测订单是否存在 + testRechargere, err := rechargemod.FindRechargeByOrder(ctx, rechargeInfo.AppId, rechargeInfo.OrderId) + if err != nil || testRechargere.OrderId == rechargeInfo.OrderId { + log.Error("UserReChargeHandler define err ", log.Any("OrderId", testRechargere.OrderId), log.E(err)) + return err + } + if testRechargere.OrderId == rechargeInfo.OrderId { + return nil + } + + // 查找用户信息 + userInfo, err := registermod.GetRegisterInfo(context.Background(), rechargeInfo.UserId, rechargeInfo.AppId) + if err != nil { + log.Error("UserReChargeHandler GetRegisterInfo failed", log.Any("UserId", rechargeInfo.UserId), log.Any("AppId", rechargeInfo.AppId), log.Any("UserId", userInfo.UserId), log.E(err)) + return err + } + if userInfo.UserId == rechargeInfo.UserId { + rechargeInfo.IsDirect = userInfo.IsDirect + rechargeInfo.DistrictCode = userInfo.DistrictCode + rechargeInfo.RegisterTime = userInfo.RegisterTime + rechargeInfo.PromCode = userInfo.PromCode + rechargeInfo.IsFormalUser = userInfo.IsFormal + // 判断用户是否充值 + hasRechargere, _ := rechargemod.FindRechargeByUser(ctx, rechargeInfo.AppId, int64(rechargeInfo.UserId)) + if hasRechargere.UserId == rechargeInfo.UserId { + rechargeInfo.Repeat = true + } + + } + // 更新记录 + err = rechargemod.AddRechargeLog(ctx, &rechargeInfo) + if err != nil { + log.Error("UserRegisterHandler AddRechargeLog err", log.E(err)) + return err + } + + // 集团 + return RechargeChannelHandle(ctx, &rechargeInfo) + + //fmt.Println("DistrictCode kafka recharge queue:", rechargeInfo) +} + +// 4.用户提现 +func UserWithdrawOrder(UserWithdrawMsg *topicmessage.UserWithdrawMsg) error { + ctx := context.Background() + + withdrawInfo := withdrawUserOrdermod.UserWithdrawOrder{ + AppId: UserWithdrawMsg.AppId, + UID: UserWithdrawMsg.UID, + Name: UserWithdrawMsg.Name, + OID: UserWithdrawMsg.OID, + Money: UserWithdrawMsg.Money, + PayMoney: UserWithdrawMsg.PayMoney, + PayType: UserWithdrawMsg.PayType, + ActName: UserWithdrawMsg.ActName, + Act: UserWithdrawMsg.Act, + DeviceType: UserWithdrawMsg.DeviceType, + DevID: UserWithdrawMsg.DevID, + Status: UserWithdrawMsg.Status, + SuccessAt: UserWithdrawMsg.SuccessAt, + UpdatedAt: UserWithdrawMsg.UpdatedAt, + CreatedAt: UserWithdrawMsg.CreatedAt, + } + + userInfo, err := registermod.GetRegisterInfo(ctx, UserWithdrawMsg.UID, UserWithdrawMsg.AppId) + if err != nil { + log.Error("rechargeDeduction GetRegisterInfo failed", log.Any("UserId", UserWithdrawMsg.UID), log.Any("AppId", UserWithdrawMsg.UID), log.Any("UserId", userInfo.UserId), log.E(err)) + return err + } + + // 兼容找不到用户 + if userInfo.UserId == UserWithdrawMsg.UID { + withdrawInfo.IsDirect = userInfo.IsDirect + withdrawInfo.DistrictCode = userInfo.DistrictCode + withdrawInfo.PromCode = userInfo.PromCode + withdrawInfo.IsFormalUser = userInfo.IsFormal + } else { + withdrawInfo.IsDirect = true + } + // 更新记录 + _, err = withdrawUserOrdermod.AddWithdrawOrder(ctx, &withdrawInfo) + if err != nil { + log.Error("UserWithdrawOrder AddWithdrawOrder: %s\n", log.E(err)) + return err + } + return nil + //fmt.Println("DistrictCode kafka withdraw queue:", withdrawInfo) +} + +// 4.充值全量 +func UserSyncRechargeOrderALL(rechargeOrder *topicmessage.UserRechargeMsg) error { + ctx := context.Background() + rechargeInfo := &syncrecharge.SyncRechargeOrder{ + UserId: rechargeOrder.UserId, + AppId: rechargeOrder.AppId, + PlatformId: rechargeOrder.PlatformId, + SysType: rechargeOrder.SysType, + DevType: rechargeOrder.DevType, + ChannelName: rechargeOrder.ChannelName, + CID: rechargeOrder.CID, + Type: rechargeOrder.Type, + OrderId: rechargeOrder.OrderId, + Money: rechargeOrder.Money, + PayMoney: rechargeOrder.PayMoney, + Status: rechargeOrder.Status, + Rate: rechargeOrder.Rate, + SuccessAt: rechargeOrder.SuccessAt, + CreatedAt: rechargeOrder.CreatedAt, + } + userInfo, err := registermod.GetRegisterInfo(ctx, rechargeOrder.UserId, rechargeOrder.AppId) + if err != nil { + return err + } + if userInfo.UserId == rechargeInfo.UserId { + rechargeInfo.IsDirect = userInfo.IsDirect + rechargeInfo.DistrictCode = userInfo.DistrictCode + rechargeInfo.PromCode = userInfo.PromCode + rechargeInfo.IsFormalUser = userInfo.IsFormal + } else { + rechargeInfo.IsDirect = true + } + if rechargeInfo.AppId == 494 { + log.Error("InsertOneSyncRechargeOrder@@@", zap.Any("rechargeInfo", rechargeInfo)) + orderinfo, _ := syncrecharge.FindOneSyncRechargeOrder(ctx, bson.M{syncrecharge.FN.SyncRechargeOrder.AppId: rechargeInfo.AppId, + syncrecharge.FN.SyncRechargeOrder.UserId: rechargeInfo.UserId, syncrecharge.FN.SyncRechargeOrder.PlatformId: rechargeInfo.PlatformId}) + if rechargeInfo.PlatformId == orderinfo.PlatformId { + log.Error("InsertOneSyncVip repeat", zap.Any("rechargeInfo", rechargeInfo)) + return nil + } + } + return syncrecharge.InsertOneSyncRechargeOrder(ctx, rechargeInfo) +} + +// 4.提现全量 +func UserSyncWithdrawOrderALL(UserWithdrawMsg *topicmessage.UserWithdrawMsg) error { + ctx := context.Background() + withdrawOrder := &syncwithdraw.SyncWithdraw{ + AppId: UserWithdrawMsg.AppId, + UID: UserWithdrawMsg.UID, + Name: UserWithdrawMsg.Name, + OID: UserWithdrawMsg.OID, + Money: UserWithdrawMsg.Money, + PayMoney: UserWithdrawMsg.PayMoney, + PayType: UserWithdrawMsg.PayType, + ActName: UserWithdrawMsg.ActName, + Act: UserWithdrawMsg.Act, + DeviceType: UserWithdrawMsg.DeviceType, + DevID: UserWithdrawMsg.DevID, + Status: UserWithdrawMsg.Status, + SuccessAt: UserWithdrawMsg.SuccessAt, + UpdatedAt: UserWithdrawMsg.UpdatedAt, + CreatedAt: UserWithdrawMsg.CreatedAt, + } + userInfo, err := registermod.GetRegisterInfo(ctx, withdrawOrder.UID, withdrawOrder.AppId) + if err != nil { + log.Error("UserSyncWithdrawOrderALL GetRegisterInfo failed", log.Any("UserId", withdrawOrder.UID), log.Any("AppId", withdrawOrder.AppId), log.Any("UserId", userInfo.UserId), log.E(err)) + return err + } + if userInfo.UserId != withdrawOrder.UID { + log.Error("UserSyncWithdrawOrderALL GetRegisterInfo failed", log.Any("UserId", withdrawOrder.UID), log.Any("AppId", withdrawOrder.AppId), log.Any("UserId", userInfo.UserId), log.E(err)) + } + withdrawOrder.IsDirect = userInfo.IsDirect + withdrawOrder.DistrictCode = userInfo.DistrictCode + withdrawOrder.PromCode = userInfo.PromCode + withdrawOrder.IsFormalUser = userInfo.IsFormal + + err = syncwithdraw.InsertOneSyncWithdraw(ctx, withdrawOrder) + if err != nil { + log.Error("UserSyncWithdrawOrderALL InsertOneSyncWithdraw failed", log.Any("UserId", withdrawOrder.UID), log.Any("AppId", withdrawOrder.AppId), log.Any("UserId", userInfo.UserId), log.E(err)) + } + return err +} + +// 5.VIP相关处理 +func UserSyncVIPOrderALL(UserBuyVipwMsg *topicmessage.UserBuyVIPMsg) error { + ctx := context.Background() + buyVipOrder := &syncvip.SyncVip{ + PlatformId: UserBuyVipwMsg.PlatformId, + AppId: UserBuyVipwMsg.AppId, + UID: UserBuyVipwMsg.UID, + Name: UserBuyVipwMsg.Name, + Money: UserBuyVipwMsg.Money, // 单位转换成分 + Amount: UserBuyVipwMsg.Amount * 100, // 单位转换成分 + BuyVIPType: UserBuyVipwMsg.BuyVIPType, + OID: UserBuyVipwMsg.OID, + DeviceType: UserBuyVipwMsg.DeviceType, + Status: UserBuyVipwMsg.Status, + Repeat: false, + SuccessAt: UserBuyVipwMsg.SuccessAt, + IsDeduction: false, + } + userInfo, err := registermod.GetRegisterInfo(ctx, UserBuyVipwMsg.UID, UserBuyVipwMsg.AppId) + if err != nil { + log.Error("UserSyncVIPOrderALL GetRegisterInfo failed", log.Any("UserId", UserBuyVipwMsg.UID), log.Any("AppId", UserBuyVipwMsg.AppId), log.Any("UserId", userInfo.UserId), log.E(err)) + return err + } + if userInfo.UserId == buyVipOrder.UID { + buyVipOrder.IsDirect = userInfo.IsDirect + buyVipOrder.DistrictCode = userInfo.DistrictCode + buyVipOrder.PromCode = userInfo.PromCode + buyVipOrder.RegisterTime = userInfo.RegisterTime + buyVipOrder.IsFormalUser = userInfo.IsFormal + + orderinfo, _ := syncvip.FindOneSyncVip(ctx, bson.M{syncvip.FN.SyncVip.AppId: buyVipOrder.AppId, syncvip.FN.SyncVip.UID: buyVipOrder.UID}) + if orderinfo.UID == buyVipOrder.UID { + buyVipOrder.Repeat = true + } + } + if buyVipOrder.AppId == 494 { + log.Error("InsertOneSyncVip@@@", zap.Any("buyVipOrder", buyVipOrder)) + orderinfo, _ := syncvip.FindOneSyncVip(ctx, bson.M{syncvip.FN.SyncVip.AppId: buyVipOrder.AppId, + syncvip.FN.SyncVip.UID: buyVipOrder.UID, syncvip.FN.SyncVip.PlatformId: buyVipOrder.PlatformId}) + if orderinfo.PlatformId == buyVipOrder.PlatformId { + log.Error("InsertOneSyncVip repeat", zap.Any("buyVipOrder", buyVipOrder)) + return nil + } + } + err = syncvip.InsertOneSyncVip(ctx, buyVipOrder) + if err != nil { + log.Error("UserSyncVIPOrderALL InsertOneSyncVip failed", log.Any("UserId", UserBuyVipwMsg.UID), log.Any("AppId", UserBuyVipwMsg.AppId), log.Any("UserId", userInfo.UserId), log.E(err)) + } + return err +} + +// 7.游戏充值 +func GameReChargeHandler(rechargeMsg *topicmessage.UserRechargeMsg) error { + ctx := context.Background() + + rechargeInfo := rechargegamemod.GameRechargeMod{ + UserId: rechargeMsg.UserId, + AppId: rechargeMsg.AppId, + PlatformId: rechargeMsg.PlatformId, + SysType: rechargeMsg.SysType, + DevType: rechargeMsg.DevType, + ChannelName: rechargeMsg.ChannelName, + CID: rechargeMsg.CID, + Type: rechargeMsg.Type, + OrderId: rechargeMsg.OrderId, + Money: rechargeMsg.Money, + PayMoney: rechargeMsg.PayMoney, + Status: 3, + SyncStatus: rechargeMsg.SyncStatus, + Rate: rechargeMsg.Rate, + SuccessAt: rechargeMsg.SuccessAt, + Repeat: false, + } + // 检测订单是否存在 + testRechargere, err := rechargegamemod.FindRechargeByOrder(ctx, rechargeInfo.AppId, rechargeInfo.OrderId) + if err != nil { + return err + } + if testRechargere.OrderId == rechargeInfo.OrderId { + return nil // 订单已存在 + } + + // 查找用户信息 + userInfo, err := registermod.GetRegisterInfo(context.Background(), rechargeInfo.UserId, rechargeInfo.AppId) + if err != nil { + log.Error("UserAccessHandler GetRegisterInfo failed", log.Any("UserId", rechargeInfo.UserId), log.Any("AppId", rechargeInfo.AppId), log.Any("UserId", userInfo.UserId), log.E(err)) + return err + } + if userInfo.UserId == rechargeInfo.UserId { + rechargeInfo.IsDirect = userInfo.IsDirect + rechargeInfo.DistrictCode = userInfo.DistrictCode + rechargeInfo.RegisterTime = userInfo.RegisterTime + rechargeInfo.PromCode = userInfo.PromCode + rechargeInfo.IsFormalUser = userInfo.IsFormal + // 判断用户是否充值 + hasRechargere, _ := rechargegamemod.FindRechargeByUser(ctx, rechargeInfo.AppId, int64(rechargeInfo.UserId)) + if hasRechargere.UserId == rechargeInfo.UserId { + rechargeInfo.Repeat = true + } + } + // 更新记录 + err = rechargegamemod.AddRechargeLog(ctx, &rechargeInfo) + if err != nil { + log.Error("UserRegisterHandler AddRechargeLog err", log.E(err)) + return err + } + + return nil + // 集团 + // RechargeChannelHandle(ctx, &rechargeInfo) + + //fmt.Println("DistrictCode kafka recharge queue:", rechargeInfo) + +} + +// 8.游戏充值全量 +func GameRechargeOrderALL(rechargeOrder *topicmessage.UserRechargeMsg) error { + ctx := context.Background() + rechargeInfo := &syncgamerecharge.SyncGameRechargeOrder{ + UserId: rechargeOrder.UserId, + AppId: rechargeOrder.AppId, + PlatformId: rechargeOrder.PlatformId, + SysType: rechargeOrder.SysType, + DevType: rechargeOrder.DevType, + ChannelName: rechargeOrder.ChannelName, + CID: rechargeOrder.CID, + Type: rechargeOrder.Type, + OrderId: rechargeOrder.OrderId, + Money: rechargeOrder.Money, + PayMoney: rechargeOrder.PayMoney, + Status: rechargeOrder.Status, + Rate: rechargeOrder.Rate, + SyncStatus: rechargeOrder.SyncStatus, + SuccessAt: rechargeOrder.SuccessAt, + CreatedAt: rechargeOrder.CreatedAt, + } + userInfo, err := registermod.GetRegisterInfo(ctx, rechargeOrder.UserId, rechargeOrder.AppId) + if err != nil { + return err + } + + if userInfo.UserId == rechargeInfo.UserId { + rechargeInfo.IsDirect = userInfo.IsDirect + rechargeInfo.DistrictCode = userInfo.DistrictCode + rechargeInfo.PromCode = userInfo.PromCode + rechargeInfo.IsFormalUser = userInfo.IsFormal + } else { + rechargeInfo.IsDirect = true + } + + err = syncgamerecharge.InsertOneSyncGameRechargeOrder(ctx, rechargeInfo) + if err != nil { + log.Error("GameRechargeOrderALL InsertOneSyncRechargeOrder failed", log.Any("UserId", rechargeOrder.UserId), log.Any("AppId", rechargeOrder.AppId), log.Any("UserId", userInfo.UserId), log.E(err)) + } + return err +} + +// 9.游戏提现 +func GameWithdrawOrder(UserWithdrawMsg *topicmessage.UserWithdrawMsg) error { + ctx := context.Background() + + withdrawInfo := withdrawGameOrdermod.GameWithdrawOrder{ + AppId: UserWithdrawMsg.AppId, + UID: UserWithdrawMsg.UID, + Name: UserWithdrawMsg.Name, + OID: UserWithdrawMsg.OID, + Money: UserWithdrawMsg.Money, + PayMoney: UserWithdrawMsg.PayMoney, + PayType: UserWithdrawMsg.PayType, + ActName: UserWithdrawMsg.ActName, + Act: UserWithdrawMsg.Act, + DeviceType: UserWithdrawMsg.DeviceType, + DevID: UserWithdrawMsg.DevID, + Status: UserWithdrawMsg.Status, + SuccessAt: UserWithdrawMsg.SuccessAt, + SyncStatus: UserWithdrawMsg.SyncStatus, + PayChannel: UserWithdrawMsg.PayChannel, + UpdatedAt: UserWithdrawMsg.UpdatedAt, + CreatedAt: UserWithdrawMsg.CreatedAt, + } + + userInfo, err := registermod.GetRegisterInfo(ctx, UserWithdrawMsg.UID, UserWithdrawMsg.AppId) + if err != nil { + log.Error("rechargeDeduction GetRegisterInfo failed", log.Any("UserId", UserWithdrawMsg.UID), log.Any("AppId", UserWithdrawMsg.UID), log.Any("UserId", userInfo.UserId), log.E(err)) + return err + } + + // 兼容找不到用户 + if userInfo.UserId == UserWithdrawMsg.UID { + withdrawInfo.IsDirect = userInfo.IsDirect + withdrawInfo.DistrictCode = userInfo.DistrictCode + withdrawInfo.PromCode = userInfo.PromCode + withdrawInfo.IsFormalUser = userInfo.IsFormal + } else { + withdrawInfo.IsDirect = true + } + + // 更新记录 + _, err = withdrawGameOrdermod.AddWithdrawOrder(ctx, &withdrawInfo) + if err != nil { + log.Error("UserWithdrawOrder AddWithdrawOrder: %s\n", log.E(err)) + } + + return err + //fmt.Println("DistrictCode kafka withdraw queue:", withdrawInfo) +} + +// 10.游戏提现 +func UserGameWater(useGamerWater *topicmessage.UserGameWaterMsg) error { + ctx := context.Background() + now := time.Now() + + gameWaterInfo := syncgamewater.SyncGameWater{ + AppId: useGamerWater.AppId, + UserId: useGamerWater.UID, + PlatformId: useGamerWater.PlatformId, + Date: useGamerWater.Date, + ValidBet: useGamerWater.ValidBet, + Profit: useGamerWater.Profit, + Revenue: useGamerWater.Revenue, + CreatedAt: now, + } + + userInfo, err := registermod.GetRegisterInfo(ctx, useGamerWater.UID, useGamerWater.AppId) + if err != nil { + log.Error("rechargeDeduction GetRegisterInfo failed", log.Any("UserId", useGamerWater.UID), log.Any("AppId", useGamerWater.UID), log.Any("UserId", userInfo.UserId), log.E(err)) + return err + } + + // 兼容找不到用户 + if userInfo.UserId == useGamerWater.UID { + gameWaterInfo.IsDirect = userInfo.IsDirect + gameWaterInfo.DistrictCode = userInfo.DistrictCode + gameWaterInfo.PromCode = userInfo.PromCode + gameWaterInfo.RegisterTime = userInfo.RegisterTime + gameWaterInfo.IsFormalUser = userInfo.IsFormal + } else { + gameWaterInfo.IsDirect = true + } + // 更新记录 + err = syncgamewater.InsertOneSyncGameWater(ctx, &gameWaterInfo) + if err != nil { + log.Error("UserWithdrawOrder AddWithdrawOrder: %s\n", log.E(err)) + } + + return err + //fmt.Println("DistrictCode kafka gamewater queue:", gameWaterInfo) +} + +func RunSyncJob(ctx context.Context) error { + recoredResult, err := syncrecord.LastRecordTimeMap(ctx) //第一次从默认记录时间开始统计 + if err != nil { + log.Error("statdistrict RunStat lastRecordTime failed!", log.E(err)) + return err + } + for _, record := range recoredResult { + log.Info("RunSyncJob start", log.Any("start", time.Now()), + log.Any("record", record.AppId), log.Any("job", record.Job)) + if record.Disabled { + continue + } + if !statg.GlobalEndpoints.GetIndexEndpoints(statg.Conf.ServerIndex).ExistsByAppId(record.AppId) { + continue // 不属于这个服务器的APP + } + // 任务开始 + statutils.GlobalSyncMonitor.SetData(record.AppId, record.Job, func(item *statutils.SyncItem) { + item.SetJobBegin(time.Now()) + item.CurrentCount = 0 + item.Error = nil + }) + err := processJobItem(ctx, &record) + // 任务结束 + statutils.GlobalSyncMonitor.SetData(record.AppId, record.Job, func(item *statutils.SyncItem) { + item.Error = err + item.SetJobEnd(time.Now()) + }) + + if err != nil { + var cErr *ContinueError + if !errors.As(err, &cErr) { + log.Info("RunSyncJob end err", log.Any("err", err)) + // return err + } + } + log.Info("RunSyncJob end", log.Any("end", time.Now()), + log.Any("record", record.AppId), log.Any("job", record.Job)) + } + return nil +} + +func processJobRequest(ctx context.Context, record *syncrecord.SyncRecord) (*topicmessage.StatcenterSyncResp, error) { + request := &topicmessage.StatcenterSyncReq{ + Job: record.Job, + UserId: record.UserId, + PlatformId: record.PlatformId, + SuccessTime: record.SuccessAt, + MaxSize: 5000, + } + url, err := AppCallbackUrl(record.AppId) + if err != nil { + return nil, err + } + apiUrl := url + "/api/web/statcenter/sync" + var resp *topicmessage.StatcenterSyncResp + if err = HttpRequest(ctx, apiUrl, &request, &resp); err != nil { + return nil, err + } + if resp.Code != 200 { + return nil, NewContinueError(fmt.Sprintf("http request code %d, url: %s", resp.Code, apiUrl)) + } + return resp, nil +} + +func processJobItem(ctx context.Context, record *syncrecord.SyncRecord) error { + // 请求开始 + statutils.GlobalSyncMonitor.SetData(record.AppId, record.Job, func(item *statutils.SyncItem) { + item.RequestBegin = time.Now() + }) + resp, err := processJobRequest(ctx, record) + if err != nil { + return err + } + // 请求结束 + statutils.GlobalSyncMonitor.SetData(record.AppId, record.Job, func(item *statutils.SyncItem) { + item.Error = err + item.RequestEnd = time.Now() + }) + if err != nil { + return err + } + + // 处理开始 + statutils.GlobalSyncMonitor.SetData(record.AppId, record.Job, func(item *statutils.SyncItem) { + item.ProcessBegin = time.Now() + }) + err = processJobData(ctx, record, resp, func(dataLatest time.Time, incValue int) { + // 处理中 + statutils.GlobalSyncMonitor.SetData(record.AppId, record.Job, func(item *statutils.SyncItem) { + item.IncCount(int64(incValue)) + item.DataLatest = dataLatest + }) + }) + // 处理结束 + statutils.GlobalSyncMonitor.SetData(record.AppId, record.Job, func(item *statutils.SyncItem) { + item.ProcessEnd = time.Now() + item.Error = err + }) + return err +} + +func processJobData(ctx context.Context, record *syncrecord.SyncRecord, resp *topicmessage.StatcenterSyncResp, onItem func(dataLatest time.Time, incValue int)) error { + if record.Job == syncrecord.VisitJob { + for _, v := range resp.VisitList { + if err := UserAccessHandler(v); err != nil { + return err + } + record.UserId = v.UserId + record.SuccessAt = v.VisitAt + record.PlatformId = v.PlatformId + + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err + } + } + onItem(record.SuccessAt, len(resp.VisitList)) + } else if record.Job == syncrecord.RechargeJob { + for _, v := range resp.RechargeList { + if err := UserReChargeHandler(v); err != nil { + return err + } + record.UserId = v.UserId + record.SuccessAt = v.SuccessAt + record.PlatformId = v.PlatformId + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.RechargeList)) + } else if record.Job == syncrecord.RegisterJob { + + for _, v := range resp.RegisterList { + if err := UserRegisterHandler(v); err != nil { + return err + } + + record.PlatformId = v.PlatformId + record.SuccessAt = v.RegisterTime + record.UserId = v.UserId + + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.RegisterList)) + } else if record.Job == syncrecord.RegisterLightJob { + var InvalidDataCount int + var lastError error + for _, v := range resp.RegisterList { + if !statutils.IsClientH5OrLight(v.SysType, v.DevType) { + InvalidDataCount++ + lastError = NewContinueError(fmt.Sprintf("系统类型不对,总无效:%d,Job:%s,App:%d,User:%d,SysType:%s,DevType:%s", InvalidDataCount, record.Job, record.AppId, v.UserId, v.SysType, v.DevType)) + continue + } + if err := FormalUserRegisterHandler(v); err != nil { + return err + } + + record.PlatformId = v.PlatformId + record.SuccessAt = v.RegisterTime + record.UserId = v.UserId + + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.RegisterList)-InvalidDataCount) + if lastError != nil { + return lastError + } + } else if record.Job == syncrecord.WithdrawJob { + for _, v := range resp.WithdrawList { + if err := UserWithdrawOrder(v); err != nil { + return err + } + + record.UserId = v.UID + record.SuccessAt = v.SuccessAt + + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.WithdrawList)) + } else if record.Job == syncrecord.VipJob { + if record.AppId == 494 { + log.Error("debug@@@", zap.Any("resp", resp)) + } + for _, v := range resp.VipList { + if err := UserSyncVIPOrderALL(v); err != nil { + return err + } + record.UserId = v.UID + record.SuccessAt = v.SuccessAt + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.VipList)) + } else if record.Job == syncrecord.WithdrawAll { + for _, v := range resp.WithdrawList { + if err := UserSyncWithdrawOrderALL(v); err != nil { + return err + } + record.UserId = v.UID + record.SuccessAt = v.CreatedAt + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.WithdrawList)) + } else if record.Job == syncrecord.RechargeAll { + if record.AppId == 494 { + log.Error("debug@@@", zap.Any("resp", resp)) + } + for _, v := range resp.RechargeList { + if err := UserSyncRechargeOrderALL(v); err != nil { + return err + } + record.UserId = v.UserId + record.SuccessAt = v.CreatedAt + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.RechargeList)) + } else if record.Job == syncrecord.GameRechargeOrder { + for _, v := range resp.GameRecharge { + if err := GameReChargeHandler(v); err != nil { + return err + } + record.UserId = v.UserId + record.SuccessAt = v.SuccessAt + record.PlatformId = v.PlatformId + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.GameRecharge)) + } else if record.Job == syncrecord.GameRechargeOrderAll { + for _, v := range resp.GameRecharge { + if err := GameRechargeOrderALL(v); err != nil { + return err + } + record.UserId = v.UserId + record.SuccessAt = v.CreatedAt + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.GameRecharge)) + } else if record.Job == syncrecord.GameWithdrawOrder { + for _, v := range resp.GameWithdraw { + if err := GameWithdrawOrder(v); err != nil { + return err + } + record.UserId = v.UID + record.SuccessAt = v.SuccessAt + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.GameWithdraw)) + } else if record.Job == syncrecord.GameWater { + for _, v := range resp.GameWater { + if err := UserGameWater(v); err != nil { + return err + } + record.UserId = v.UID + record.SuccessAt = v.SuccessAt + if err := syncrecord.UpsertItemRecord(ctx, record.Job, record.AppId, record.UserId, record.PlatformId, record.SuccessAt); err != nil { + log.Error("RunSyncJob 更新同步记录!", log.E(err)) + return err // keep loop, nil + } + } + onItem(record.SuccessAt, len(resp.GameWater)) + } else { + log.Error("RunSyncJob 类型不支持!", log.Any("job", record.Job)) + return errors.New("RunSyncJob 类型不支持") + } + return nil +} + +// 周期执行 +func SyncInit() { + if statg.Conf.RunMod != consts.RunModRelease { + return + } + defer utils.RecoverError(nil) + ticker := time.NewTicker(time.Second * 20) // 20秒一次 + ctx := context.Background() + + for t := range ticker.C { + fmt.Println("Begin task", t) + // 定时去app拉去任务 + if statg.Conf.KafkaServer { + statutils.ServerMon.RunWithName(func() error { + return RunSyncJob(ctx) + }, statutils.GetFuncName(RunSyncJob)) + } + } +} + +func AppCallbackUrl(appid int32) (url string, err error) { + info := statg.GlobalAppIdEndpoints[appid] + if info != nil { + if len(info.ServerUrl) == 0 { + return "", NewContinueError(fmt.Sprintf("appid %d is not config server url", appid)) + } + return info.ServerUrl, nil + } + return "", NewContinueError("appid err") +} diff --git a/service/consumer/landingpage.go b/service/consumer/landingpage.go new file mode 100644 index 0000000..9e27596 --- /dev/null +++ b/service/consumer/landingpage.go @@ -0,0 +1,12 @@ +package consumer + +import ( + "context" + downloadinfo "stat/models/downloadinfo" +) + +func TrackDcAndPcByIp(ctx context.Context, appId int32, ip, sysType string) (dc, pc string) { + data, _ := downloadinfo.FindOneChannelIP(ctx, appId, ip, sysType) + + return data.DC, data.PC +} diff --git a/service/consumer/rechargechannel.go b/service/consumer/rechargechannel.go new file mode 100644 index 0000000..0445ff1 --- /dev/null +++ b/service/consumer/rechargechannel.go @@ -0,0 +1,32 @@ +package consumer + +import ( + "context" + "stat/common/log" + "stat/common/utils" + "stat/models/rechargechannelmod" + "stat/models/rechargemod" + "strconv" +) + +func RechargeChannelHandle(ctx context.Context, rechageInfo *rechargemod.RechargeMod) error { + sumDate := utils.BeginWithTime(rechageInfo.SuccessAt) + rate := float64(4) + if rechageInfo.Rate != "" && rechageInfo.ChannelName != "daichong" { + rateF, err := strconv.ParseFloat(rechageInfo.Rate, 64) + if err != nil { + log.Error("RechargeChannelHandle rate is err", log.Any("rate", rechageInfo.Rate), log.Any("userid", rechageInfo.UserId), log.Any("appid", rechageInfo.AppId)) + return err + } + rate = rateF + } else if rechageInfo.ChannelName == "daichong" { + rate = float64(8) + rechageInfo.CID = "daichong" + } + channelMoney := int64((rate * float64(rechageInfo.PayMoney)) / 100) + err := rechargechannelmod.UpsertOneUserRechargeStat(ctx, rechageInfo.CID, rechageInfo.AppId, sumDate, rechageInfo.BlocDeduction, rechageInfo.Money, rechageInfo.PayMoney, channelMoney) + if err != nil { + log.Error("RechargeChannelHandle UpsertOneUserRechargeStat", log.Any("rate", rechageInfo.Rate), log.Any("userid", rechageInfo.UserId), log.Any("appid", rechageInfo.AppId), log.E(err)) + } + return err +} diff --git a/service/consumer/utils.go b/service/consumer/utils.go new file mode 100644 index 0000000..83f0cdd --- /dev/null +++ b/service/consumer/utils.go @@ -0,0 +1,26 @@ +package consumer + +import ( + "context" + "stat/common/utils" +) + +type ContinueError struct { + msg string +} + +func NewContinueError(text string) error { + ret := &ContinueError{ + msg: text, + } + return ret +} + +func (e *ContinueError) Error() string { + return e.msg +} + +// HttpRequest HttpRequest +func HttpRequest(ctx context.Context, url string, request interface{}, resp interface{}) error { + return utils.HttpPostRequestJson(url, request, resp) +} diff --git a/service/crossSer/cross.go b/service/crossSer/cross.go new file mode 100644 index 0000000..b87d550 --- /dev/null +++ b/service/crossSer/cross.go @@ -0,0 +1,568 @@ +package crossSer + +import ( + "context" + "fmt" + "sort" + "stat/api/proto" + "stat/common" + "stat/common/statutils" + "stat/common/tgbot" + "stat/common/utils" + "stat/models/botdailyhourstat" + "stat/statg" + "time" + + "github.com/wcharczuk/go-chart/v2" + + "github.com/wcharczuk/go-chart/v2/drawing" + + "github.com/vicanso/go-charts/v2" +) + +var Colors = []drawing.Color{ + drawing.ColorFromHex("0780cf"), + drawing.ColorFromHex("765005"), + drawing.ColorFromHex("fa6d1d"), + drawing.ColorFromHex("0e2c82"), + drawing.ColorFromHex("b6b51f"), + drawing.ColorFromHex("da1f18"), + drawing.ColorFromHex("701866"), + drawing.ColorFromHex("f47a75"), + drawing.ColorFromHex("009db2"), + drawing.ColorFromHex("024b51"), + drawing.ColorFromHex("0780cf"), + drawing.ColorFromHex("765005"), +} + +type CrossStatMethod = func(ctx context.Context, cmd *tgbot.Command) error + +// 统计方法汇总 +var CrossStatMethodMap = map[string]CrossStatMethod{ + statutils.StatProjectRecharge: CrossStatRecharge, + statutils.StatProjectRechargeNew: CrossStatRechargeNew, + statutils.StatProjectRechargeOld: CrossStatRechargeOld, + statutils.StatProjectRechargeGold: CrossStatRechargeGold, + statutils.StatProjectRechargeVip: CrossStatRechargeVip, + statutils.StatProjectRegister: CrossStatRegister, + statutils.StatProjectVisit: CrossStatVisit, + statutils.StatProjectOrder: CrossStatOrder, +} + +type CrossAppDownloadRes struct { + Code int32 `json:"code"` + Msg string `json:"msg"` + Tip string `json:"tip"` + Data *proto.PageButtonClickResp `json:"data"` + Time time.Time `json:"time"` +} + +type CrossStatRes struct { + Code int32 `json:"code"` + Msg string `json:"msg"` + Tip string `json:"tip"` + Data *proto.BotDailyHourListResp `json:"data"` + Time time.Time `json:"time"` +} + +type CrossMonthRes struct { + Code int32 `json:"code"` + Msg string `json:"msg"` + Tip string `json:"tip"` + Data *proto.BotMonthStatResp `json:"data"` + Time time.Time `json:"time"` +} + +type StatItem struct { + Value int64 + Stat *botdailyhourstat.BotHourStat +} + +type FuncGetStatValue func(item *botdailyhourstat.BotHourStat) int64 + +type StatItemList []*StatItem + +func (a StatItemList) Len() int { return len(a) } +func (a StatItemList) Less(i, j int) bool { return a[i].Value > a[j].Value } +func (a StatItemList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +func CrossMonthStat(ctx context.Context, cmd *tgbot.Command) error { + appId, _ := cmd.GetFlagInt32Value("-app") + monthStr := cmd.GetFlagStringValue("-month") + month, err := time.ParseInLocation("2006-01-02", monthStr, time.Local) + if err != nil { + return tgbot.NewUserError(cmd, "解析日期出错, 格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + getValue := func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.Recharge.Value() + } + statList := make(StatItemList, 0) + for _, addr := range statg.Conf.InnerServers { + req := &proto.BotMonthStatReq{Month: month} + if appId > 0 { + req.AppId = &appId + } + res := CrossMonthRes{} + err = InnerRequest(addr+"/api/stat/inner/botMonthStat", req, &res, true) + if err != nil { + return err + } + if res.Data == nil { + continue + } + for _, stat := range res.Data.List { + if statg.GlobalEndpoints.ExistsByAppId(stat.AppId) { + value := getValue(stat) + statList = append(statList, &StatItem{ + Value: value, + Stat: stat, + }) + } + } + } + // sort + sort.Sort(statList) + // 显示 + y, m, _ := month.Date() + for _, item := range statList { + appName := statg.GlobalEndpoints.ExistsByAppId(item.Stat.AppId) + title := fmt.Sprintf("%d年%d月【%s】数据汇总", y, m, appName) + text := item.Stat.DisplaySummaryText(title) + if err = cmd.SendBack(text); err != nil { + return err + } + } + return nil +} + +func CrossStatRecharge(ctx context.Context, cmd *tgbot.Command) error { + moveBackDays, _ := cmd.GetFlagInt64Value("-back") + if moveBackDays > 0 { + moveBackDays = moveBackDays * -1 + } + // get stats + now := time.Now() + reportTime := utils.RecentMinute(now, 60) + if moveBackDays != 0 { + reportTime = utils.BeginWithTime(now.AddDate(0, 0, int(moveBackDays)+1)) + } + title := GetDateDesc(0) + "充值排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, _, err := GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.Recharge.Value() / 100 + }) + if err != nil { + return err + } + cmd.PhotoPath = photo + return cmd.SendBack(fmt.Sprintf("充值排名:%s\n", reportTime.Format("2006-01-02T15:04:05"))) +} + +func CrossStatRechargeNew(ctx context.Context, cmd *tgbot.Command) error { + moveBackDays, _ := cmd.GetFlagInt64Value("-back") + if moveBackDays > 0 { + moveBackDays = moveBackDays * -1 + } + // get stats + now := time.Now() + reportTime := utils.RecentMinute(now, 60) + if moveBackDays != 0 { + reportTime = utils.BeginWithTime(now.AddDate(0, 0, int(moveBackDays)+1)) + } + title := GetDateDesc(0) + "新用户充值排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, _, err := GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.RechargeNew.Value() / 100 + }) + if err != nil { + return err + } + cmd.PhotoPath = photo + return cmd.SendBack(fmt.Sprintf("新用户充值排名:%s\n", reportTime.Format("2006-01-02T15:04:05"))) +} + +func CrossStatRechargeOld(ctx context.Context, cmd *tgbot.Command) error { + moveBackDays, _ := cmd.GetFlagInt64Value("-back") + if moveBackDays > 0 { + moveBackDays = moveBackDays * -1 + } + // get stats + now := time.Now() + reportTime := utils.RecentMinute(now, 60) + if moveBackDays != 0 { + reportTime = utils.BeginWithTime(now.AddDate(0, 0, int(moveBackDays)+1)) + } + title := GetDateDesc(0) + "老用户充值排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, _, err := GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.RechargeOld.Value() / 100 + }) + if err != nil { + return err + } + cmd.PhotoPath = photo + return cmd.SendBack(fmt.Sprintf("老用户充值排名:%s\n", reportTime.Format("2006-01-02T15:04:05"))) +} + +func CrossStatRechargeGold(ctx context.Context, cmd *tgbot.Command) error { + moveBackDays, _ := cmd.GetFlagInt64Value("-back") + if moveBackDays > 0 { + moveBackDays = moveBackDays * -1 + } + // get stats + now := time.Now() + reportTime := utils.RecentMinute(now, 60) + if moveBackDays != 0 { + reportTime = utils.BeginWithTime(now.AddDate(0, 0, int(moveBackDays)+1)) + } + title := GetDateDesc(0) + "金币充值排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, _, err := GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.RechargeGold.Value() / 100 + }) + if err != nil { + return err + } + cmd.PhotoPath = photo + return cmd.SendBack(fmt.Sprintf("金币充值排名:%s\n", reportTime.Format("2006-01-02T15:04:05"))) +} + +func CrossStatRechargeVip(ctx context.Context, cmd *tgbot.Command) error { + moveBackDays, _ := cmd.GetFlagInt64Value("-back") + if moveBackDays > 0 { + moveBackDays = moveBackDays * -1 + } + // get stats + now := time.Now() + reportTime := utils.RecentMinute(now, 60) + if moveBackDays != 0 { + reportTime = utils.BeginWithTime(now.AddDate(0, 0, int(moveBackDays)+1)) + } + title := GetDateDesc(0) + "会员充值排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, _, err := GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.RechargeVip.Value() / 100 + }) + if err != nil { + return err + } + cmd.PhotoPath = photo + return cmd.SendBack(fmt.Sprintf("会员充值排名:%s\n", reportTime.Format("2006-01-02T15:04:05"))) +} + +func CrossStatRegister(ctx context.Context, cmd *tgbot.Command) error { + moveBackDays, _ := cmd.GetFlagInt64Value("-back") + if moveBackDays > 0 { + moveBackDays = moveBackDays * -1 + } + // get stats + now := time.Now() + reportTime := utils.RecentMinute(now, 60) + if moveBackDays != 0 { + reportTime = utils.BeginWithTime(now.AddDate(0, 0, int(moveBackDays)+1)) + } + title := GetDateDesc(0) + "注册排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, _, err := GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.Register.Value() + }) + if err != nil { + return err + } + cmd.PhotoPath = photo + return cmd.SendBack(fmt.Sprintf("注册排名:%s\n", reportTime.Format("2006-01-02T15:04:05"))) +} + +func CrossStatVisit(ctx context.Context, cmd *tgbot.Command) error { + moveBackDays, _ := cmd.GetFlagInt64Value("-back") + if moveBackDays > 0 { + moveBackDays = moveBackDays * -1 + } + // get stats + now := time.Now() + reportTime := utils.RecentMinute(now, 60) + if moveBackDays != 0 { + reportTime = utils.BeginWithTime(now.AddDate(0, 0, int(moveBackDays)+1)) + } + title := GetDateDesc(0) + "日活排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, _, err := GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.Visit.Value() + }) + if err != nil { + return err + } + cmd.PhotoPath = photo + return cmd.SendBack(fmt.Sprintf("日活排名:%s\n", reportTime.Format("2006-01-02T15:04:05"))) +} + +func CrossStatOrder(ctx context.Context, cmd *tgbot.Command) error { + moveBackDays, _ := cmd.GetFlagInt64Value("-back") + if moveBackDays > 0 { + moveBackDays = moveBackDays * -1 + } + // get stats + now := time.Now() + reportTime := utils.RecentMinute(now, 60) + if moveBackDays != 0 { + reportTime = utils.BeginWithTime(now.AddDate(0, 0, int(moveBackDays)+1)) + } + title := GetDateDesc(0) + "订单排名:" + reportTime.Format("2006-01-02T15:04:05") + photo, _, err := GetRankPhoto(reportTime, title, func(item *botdailyhourstat.BotHourStat) int64 { + return item.TodayStat.Order.Count() + }) + if err != nil { + return err + } + cmd.PhotoPath = photo + return cmd.SendBack(fmt.Sprintf("订单排名:%s\n", reportTime.Format("2006-01-02T15:04:05"))) +} + +func GetRankPhoto(reportTime time.Time, title string, getValue FuncGetStatValue) (string, []byte, error) { + charts.SetDefaultFont(statutils.Font) + statList := make(StatItemList, 0) + registerStatList := make(StatItemList, 0) + var total, registerTotal, visitTotal int64 + for _, addr := range statg.Conf.InnerServers { + req := &proto.BotDailyHourListReq{ + Page: common.Page{ + PageNum: 1, + PageSize: 100, + }, + SumDateStart: reportTime, + SumDateStop: reportTime, + } + res := CrossStatRes{} + err := InnerRequest(addr+"/api/stat/inner/botStatList", req, &res, true) + if err != nil { + return "", nil, err + } + if res.Data == nil { + continue + } + + for _, stat := range res.Data.List { + if statg.GlobalEndpoints.GetBotRankEndpoints().ExistsByAppId(stat.AppId) { + value := getValue(stat) + total += value + statList = append(statList, &StatItem{ + Value: value, + Stat: stat, + }) + + registerValue := stat.TodayStat.Register.Total.Value() + registerTotal += registerValue + visitTotal += stat.TodayStat.Visit.Total.Value() + registerStatList = append(registerStatList, &StatItem{ + Value: registerValue, + Stat: stat, + }) + } + } + } + // sort + sort.Sort(statList) + // draw chart + xNames := make([]string, 0) + for _, stat := range statList { + xNames = append(xNames, statg.GlobalEndpoints.GetAppShortNameById(stat.Stat.AppId)) + } + sDatas := make([]charts.SeriesData, 0) + rDatas := make([]charts.SeriesData, 0) + for index, stat := range statList { + sDatas = append(sDatas, charts.SeriesData{ + Value: float64(stat.Value), + Style: charts.Style{ + FillColor: Colors[index%len(Colors)], + TextWrap: chart.TextWrapRune, + }, + }) + for _, registerStat := range registerStatList { + if stat.Stat.AppId == registerStat.Stat.AppId { + rDatas = append(rDatas, charts.SeriesData{ + Value: float64(registerStat.Value), + Style: charts.Style{ + FillColor: Colors[index%len(Colors)], + TextWrap: chart.TextWrapRune, + }, + }) + } + } + } + + chartOpt := charts.ChartOption{ + Width: statg.Conf.ChartsConfig.Width, + Height: statg.Conf.ChartsConfig.Height, + Type: charts.ChartOutputPNG, + Title: charts.TitleOption{ + Text: title, + }, + XAxis: charts.NewXAxisOption(xNames), + Legend: charts.LegendOption{ + Data: []string{ + fmt.Sprintf("应用:%d", len(xNames)), + fmt.Sprintf("充值:%d", total), + fmt.Sprintf("日活:%d", visitTotal), + fmt.Sprintf("注册:%d", registerTotal), + }, + Icon: charts.IconRect, + Left: charts.PositionRight, + }, + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeBar, + Data: sDatas, + Label: charts.SeriesLabel{ + Show: true, + Position: charts.PositionBottom, + }, + MarkLine: charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ), + }, + { + Type: charts.ChartTypeBar, + Data: rDatas, + Label: charts.SeriesLabel{ + Show: true, + Position: charts.PositionBottom, + }, + }, + }, + } + show := true + chartOpt.XAxis.Show = &show + d, err := charts.Render(chartOpt) + if err != nil { + return "", nil, err + } + buf, err := d.Bytes() + if err != nil { + return "", buf, err + } + photo := fmt.Sprintf("/tmp/%s.png", utils.UUID()) + if err = statutils.WriteBytesToFile(buf, photo); err != nil { + return "", buf, err + } + return photo, buf, nil +} + +func GetRankDetail(reportTime time.Time, title string, getValue FuncGetStatValue) (string, error) { + charts.SetDefaultFont(statutils.Font) + statList := make(StatItemList, 0) + registerStatList := make(StatItemList, 0) + var total, registerTotal int64 + for _, addr := range statg.Conf.InnerServers { + req := &proto.BotDailyHourListReq{ + Page: common.Page{ + PageNum: 1, + PageSize: 100, + }, + SumDateStart: reportTime, + SumDateStop: reportTime, + } + res := CrossStatRes{} + err := InnerRequest(addr+"/api/stat/inner/botStatList", req, &res, true) + if err != nil { + return "", err + } + if res.Data == nil { + continue + } + + for _, stat := range res.Data.List { + if statg.GlobalEndpoints.GetBotRankEndpoints().ExistsByAppId(stat.AppId) { + value := getValue(stat) + total += value + statList = append(statList, &StatItem{ + Value: value, + Stat: stat, + }) + + registerValue := stat.TodayStat.Register.Total.Value() + registerTotal += registerValue + registerStatList = append(registerStatList, &StatItem{ + Value: registerValue, + Stat: stat, + }) + } + } + } + // sort + sort.Sort(statList) + // draw chart + xNames := make([]string, 0) + for _, stat := range statList { + xNames = append(xNames, statg.GlobalEndpoints.GetAppShortNameById(stat.Stat.AppId)) + } + sDatas := make([]charts.SeriesData, 0) + rDatas := make([]charts.SeriesData, 0) + for index, stat := range statList { + sDatas = append(sDatas, charts.SeriesData{ + Value: float64(stat.Value), + Style: charts.Style{ + FillColor: Colors[index%len(Colors)], + TextWrap: chart.TextWrapRune, + }, + }) + for _, registerStat := range registerStatList { + if stat.Stat.AppId == registerStat.Stat.AppId { + rDatas = append(rDatas, charts.SeriesData{ + Value: float64(registerStat.Value), + Style: charts.Style{ + FillColor: Colors[index%len(Colors)], + TextWrap: chart.TextWrapRune, + }, + }) + } + } + } + + chartOpt := charts.ChartOption{ + Width: statg.Conf.ChartsConfig.Width, + Height: statg.Conf.ChartsConfig.Height, + Type: charts.ChartOutputPNG, + Title: charts.TitleOption{ + Text: title, + }, + XAxis: charts.NewXAxisOption(xNames), + Legend: charts.LegendOption{ + Data: []string{ + fmt.Sprintf("应用:%d", len(xNames)), + fmt.Sprintf("充值:%d", total), + fmt.Sprintf("注册:%d", registerTotal), + }, + Icon: charts.IconRect, + Left: charts.PositionRight, + }, + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeBar, + Data: sDatas, + Label: charts.SeriesLabel{ + Show: true, + Position: charts.PositionBottom, + }, + MarkLine: charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ), + }, + { + Type: charts.ChartTypeBar, + Data: rDatas, + Label: charts.SeriesLabel{ + Show: true, + Position: charts.PositionBottom, + }, + }, + }, + } + show := true + chartOpt.XAxis.Show = &show + d, err := charts.Render(chartOpt) + if err != nil { + return "", err + } + buf, err := d.Bytes() + if err != nil { + return "", err + } + photo := fmt.Sprintf("/tmp/%s.png", utils.UUID()) + if err = statutils.WriteBytesToFile(buf, photo); err != nil { + return "", err + } + return photo, nil +} diff --git a/service/crossSer/utils.go b/service/crossSer/utils.go new file mode 100644 index 0000000..4152533 --- /dev/null +++ b/service/crossSer/utils.go @@ -0,0 +1,103 @@ +package crossSer + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "stat/common/crypt" + "stat/statg" + "strings" + "time" +) + +func InnerCryptPost(requestURL string, postData []byte) (*http.Response, error) { + key := statg.Conf.InnerKey + enData, err := crypt.CoreAesEncryptEx(postData, 12, key) + if err != nil { + return nil, err + } + bodyReader := bytes.NewReader(enData) + req, err := http.NewRequest(http.MethodPost, requestURL, bodyReader) + if err != nil { + return nil, err + } + timeout := 30 * time.Second + if strings.Contains(requestURL, "botMonthStat") { + timeout = 15 * time.Minute + } + req.Header.Set("Content-Type", "application/octet-stream") + client := http.Client{ + Timeout: timeout, + } + resp, err := client.Do(req) + if err != nil { + return nil, err + } + enData, err = io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + deData, err := crypt.CoreAesDecryptEx(enData, 12, key) + if err != nil { + return resp, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(deData)) + resp.ContentLength = int64(len(deData)) + return resp, nil +} + +func InnerPlainPost(requestURL string, postData []byte) (*http.Response, error) { + bodyReader := bytes.NewReader(postData) + req, err := http.NewRequest(http.MethodPost, requestURL, bodyReader) + if err != nil { + return nil, err + } + timeout := 8 * time.Second + req.Header.Set("Content-Type", "application/json") + client := http.Client{ + Timeout: timeout, + } + return client.Do(req) +} + +func InnerRequest(url string, req interface{}, bind interface{}, crypt bool) error { + data, err := json.Marshal(req) + if err != nil { + return err + } + var resp *http.Response + if crypt { + resp, err = InnerCryptPost(url, data) + } else { + resp, err = InnerPlainPost(url, data) + } + if err != nil { + return err + } + if resp.StatusCode != 200 { + return fmt.Errorf("error status %s, http code %d", resp.Status, resp.StatusCode) + } + data, err = io.ReadAll(resp.Body) + if err != nil { + return err + } + return json.Unmarshal(data, bind) +} + +func GetDateDesc(moveBackDays int) string { + if moveBackDays < 0 { + moveBackDays = moveBackDays * -1 + } + switch moveBackDays { + case 0: + return "今天" + case 1: + return "昨天" + case 2: + return "前天" + default: + return fmt.Sprintf("前%d天", moveBackDays) + } +} diff --git a/service/dailystatadvertiseser/advertise.go b/service/dailystatadvertiseser/advertise.go new file mode 100644 index 0000000..987598a --- /dev/null +++ b/service/dailystatadvertiseser/advertise.go @@ -0,0 +1,100 @@ +package dailystatadvertiseser + +import ( + "context" + + "stat/common/utils" + "stat/models/dailystatadvertise" + + "time" + + "github.com/pkg/errors" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" +) + +//GetDailyStatAdvertise 按照参数搜索 +func GetDailyStatAdvertise(ctx context.Context, param *DailyStatAdvertiseSearch) (*DailyStatAdvertiseSearchResp, error) { + filter := bson.M{} + opt := &options.FindOptions{} + resp := &DailyStatAdvertiseSearchResp{} + + opt.SetSort(bson.M{dailystatadvertise.FN.DailyStatAdvertise.SumDate: -1}) + opt.SetSkip((param.PageNum - 1) * param.PageSize) + opt.SetLimit(param.PageSize) + + total, serr := dailystatadvertise.CountDailyStatAdvertises(ctx, filter) + if serr != nil { + return resp, serr + } + if total == 0 { + return resp, nil + } + + list, serr := dailystatadvertise.FindManyDailyStatAdvertise(ctx, filter, opt) + if serr != nil { + return resp, serr + } + resp.List = list + resp.Total = total + + return resp, nil +} + +//AddGraphic 添加一个 +func AddDailyStatAdvertise(ctx context.Context, + ac *dailystatadvertise.DailyStatAdvertise) error { + + ac.AppName = "蜜桃传媒" + ac.SumDate = utils.BeginWithTime(ac.SumDate) + serr := dailystatadvertise.InsertOneDailyStatAdvertise(ctx, ac) + if serr != nil { + return serr + } + return nil +} + +//DelDailyStatAdvertise 删除指定 +func DelDailyStatAdvertise(ctx context.Context, id string) error { + objectId, err := primitive.ObjectIDFromHex(id) + if err != nil { + return err + } + + adFilter := bson.M{dailystatadvertise.FN.DailyStatAdvertise.ID: objectId} + //删除 + count, serr := dailystatadvertise.DelOneDailyStatAdvertise(ctx, adFilter) + if serr != nil { + return serr + } + if count == 0 { + return errors.Errorf("DelDailyStatAdvertise") + } + return nil +} + +//UpdateDailyStatAdvertise 更新指定 +func UpdateDailyStatAdvertise(ctx context.Context, id string, + info *DailyStatAdvertiseUpdate) error { + now := time.Now() + info.UpdatedAt = &now + + if info.SumDate != nil { + sumdate := utils.BeginWithTime(*info.SumDate) + info.SumDate = &sumdate + } + + objectId, err := primitive.ObjectIDFromHex(id) + if err != nil { + return err + } + + adFilter := bson.M{dailystatadvertise.FN.DailyStatAdvertise.ID: objectId} + updateDoc := bson.M{"$set": info} + serr := dailystatadvertise.UpdateOneDailyStatAdvertise(ctx, adFilter, updateDoc) + if serr != nil { + return serr + } + return nil +} diff --git a/service/dailystatadvertiseser/define.go b/service/dailystatadvertiseser/define.go new file mode 100644 index 0000000..6d3b936 --- /dev/null +++ b/service/dailystatadvertiseser/define.go @@ -0,0 +1,37 @@ +package dailystatadvertiseser + +import ( + "stat/models/dailystatadvertise" + "time" +) + +// ActressPhotoSearch 模特管理 +type DailyStatAdvertiseSearch struct { + PageNum int64 `json:"pageNum"` + PageSize int64 `json:"pageSize"` +} + +type DailyStatAdvertiseSearchResp struct { + Total int64 `json:"total"` + List dailystatadvertise.DailyStatAdvertiseList `json:"list"` +} + +type DailyStatAdvertiseUpdate struct { + SumDate *time.Time `bson:"sumDate,omitempty" json:"sumDate,omitempty"` // 记录时间 按天对齐 + AppId *int32 `bson:"appId,omitempty" json:"appId"` // appId + NewDirectCount *int64 `bson:"newDirectCount,omitempty" json:"newDirectCount"` // 新增直推 + DirectVisitCount *int64 `bson:"directVisitCount,omitempty" json:"directVisitCount"` // 直推访问数 + Day1RetainRate *string `bson:"day1RetainRate,omitempty" json:"day1RetainRate"` // 次日留存率 + Day3RetainRate *string `bson:"day3RetainRate,omitempty" json:"day3RetainRate"` // 3日留存率 + Day7RetainRate *string `bson:"day7RetainRate,omitempty" json:"day7RetainRate"` // 7日留存率 + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` // 更新时间 +} + +type DailyStatAdvertiseUpdateReq struct { + Param DailyStatAdvertiseUpdate `json:"param" bson:"param"` // 参数 + Id string `json:"id" bson:"_id" binding:"required"` // 视频Id +} + +type DailyStatAdvertiseDelReq struct { + Id string `json:"id" bson:"_id" binding:"required"` // 视频Id +} diff --git a/service/domainser/checker.go b/service/domainser/checker.go new file mode 100644 index 0000000..9d6a319 --- /dev/null +++ b/service/domainser/checker.go @@ -0,0 +1,875 @@ +package domainser + +import ( + "context" + "fmt" + "math/rand" + "net/http" + "net/url" + "stat/common/log" + "stat/common/utils" + "stat/models/domainmod" + "stat/statg" + "strings" + "sync" + "time" + + "go.mongodb.org/mongo-driver/bson" + + "github.com/ddliu/go-httpclient" +) + +const ( + ApiKey = "a45d5d2c6c231f28f9bcccf4092eb246" + ApiDomain = "https://api.boce.com" + ApiCheckDuration = time.Second * 10 + ApiCheckTimeout = time.Minute * 2 + ApiCheckTryCount = 6 +) + +type NodeCache struct { + List NodeList + Last time.Time + Lock sync.Mutex +} + +type MutexResult struct { + List domainmod.CheckResultList + Lock sync.Mutex +} + +var ( + Cache = &NodeCache{ + List: make(NodeList, 0), + Last: time.Time{}, + Lock: sync.Mutex{}, + } +) + +func (c *NodeCache) NodeList() (NodeList, error) { + ret := make(NodeList, 0) + + c.Lock.Lock() + if len(c.List) > 0 && c.Last.After(time.Now().Add(-24*time.Hour)) { + for _, node := range c.List { + ret = append(ret, node) + } + c.Lock.Unlock() + return ret, nil + } + c.Lock.Unlock() + + list, err := GetNodeList() + if err != nil { + return ret, err + } + + if len(list) > 0 { + c.Lock.Lock() + c.List = list + c.Last = time.Now() + for _, node := range c.List { + ret = append(ret, node) + } + c.Lock.Unlock() + return ret, nil + } else { + return nil, fmt.Errorf("node list is empty") + } +} + +func GetNodeList() (NodeList, error) { + addr := fmt.Sprintf("https://task.boce.com/v3/node/list?key=%s", ApiKey) + res := &CommonResp{} + tryCount := 0 + for { + err := Get(addr, res, url.Values{}) + if err != nil { + tryCount++ + if tryCount > ApiCheckTryCount { + return nil, err + } + time.Sleep(ApiCheckDuration) + continue + } + break + } + if res.ErrorCode != 0 { + return nil, fmt.Errorf("获取检测节点列表失败:%s", GetApiErrorMessage(res.ErrorCode)) + } + return *res.Data.List, nil +} + +func (s *MutexResult) OnFinish(result *domainmod.CheckResult) { + s.Lock.Lock() + defer s.Lock.Unlock() + + s.List = append(s.List, result) +} + +func (s *MutexResult) RealErrors() []error { + ret := make([]error, 0) + for _, item := range s.List { + if item.CheckSucc && item.Error != nil { + ret = append(ret, item.Error) + } + } + return ret +} + +func (s *MutexResult) AllSuccess() bool { + for _, item := range s.List { + if item.CheckSucc && item.Error != nil { + return false + } + } + return true +} + +func (s *MutexResult) JumpErrors() []error { + ret := make([]error, 0) + for _, item := range s.List { + if !item.CheckSucc && item.Error != nil { + ret = append(ret, item.Error) + } + } + return ret +} + +func (s *MutexResult) Reports() string { + var ret string + for _, item := range s.List { + if item.Error != nil { + ret += "\n" + item.Error.Error() + "\n" + } + if len(item.NodeErrors) > 0 { + ret += strings.Join(item.NodeErrors, "\n\n") + } + } + return ret +} + +func (s *MutexResult) CheckStatus() (passCount int, jumpCount int, errorCount int) { + for _, item := range s.List { + if item.CheckSucc { + if item.Error != nil { + errorCount++ + } else { + passCount++ + } + } else { + jumpCount++ + } + } + return +} + +var ApiErrorMessage = map[int]string{ + 0: "成功", + 1: "鉴权失败", + 2: "参数错误", + 3: "波点不足或波点未配置", + 4: "生成任务id失败或任务id失效", +} + +func GetApiErrorMessage(code int) string { + ret := ApiErrorMessage[code] + if ret == "" { + return "未知错误" + } + return ret +} + +var ApiPathMap = map[domainmod.CheckType]ApiPath{ + domainmod.CheckTypeWeb: { + Create: "/v3/task/create/curl", + Query: "/v3/task/curl/", + Sleep: 5 * time.Minute, + NeedCreate: true, + }, + domainmod.CheckTypeDNS: { + Create: "/v3/task/create/dig", + Query: "/v3/task/dig/", + Sleep: 5 * time.Minute, + NeedCreate: true, + }, + domainmod.CheckTypePing: { + Create: "/v3/task/create/ping", + Query: "/v3/task/ping/", + Sleep: 5 * time.Minute, + NeedCreate: true, + }, + domainmod.CheckTypeHijack: { + Create: "/v3/task/create/hijack", + Query: "/v3/task/hijack/", + Sleep: 5 * time.Minute, + NeedCreate: true, + }, + domainmod.CheckTypePollute: { + Create: "", + Query: "/v3/task/create/pollute", + NeedCreate: false, + }, + domainmod.CheckTypeQQ: { + Create: "", + Query: "/v3/task/create/qq", + NeedCreate: false, + }, + domainmod.CheckTypeWeChat: { + Create: "", + Query: "/v3/task/create/wechat", + NeedCreate: false, + }, + domainmod.CheckTypeBlack: { + Create: "", + Query: "/v3/task/create/blacklist", + NeedCreate: false, + }, + domainmod.CheckTypeGFW: { + Create: "", + Query: "/v3/task/create/wall", + NeedCreate: false, + }, +} + +func init() { + httpclient.Defaults(httpclient.Map{ + "OPT_CONNECTTIMEOUT": 30 * time.Second, + "OPT_TIMEOUT": 10 * time.Second, + "Accept-Encoding": "gzip,deflate", + }) +} + +func GetChecker(item *domainmod.Domain, mode domainmod.CheckType, onFinish FnCheckFinish, nodes ...Node) Checker { + nodeList := make(NodeList, 0) + nodeList = append(nodeList, nodes...) + switch mode { + case domainmod.CheckTypeWeb: + return NewWebChecker(item, mode, onFinish, nodeList) + case domainmod.CheckTypeDNS: + return NewWebChecker(item, mode, onFinish, nodeList) + case domainmod.CheckTypePing: + return NewWebChecker(item, mode, onFinish, nodeList) + case domainmod.CheckTypeHijack: + return NewHijackChecker(item, mode, onFinish, nodeList) + case domainmod.CheckTypePollute: + return NewPolluteChecker(item, mode, onFinish) + case domainmod.CheckTypeQQ: + return NewQQChecker(item, mode, onFinish) + case domainmod.CheckTypeWeChat: + return NewWeChatChecker(item, mode, onFinish) + case domainmod.CheckTypeBlack: + return NewBlackChecker(item, mode, onFinish) + case domainmod.CheckTypeGFW: + return NewGFWChecker(item, mode, onFinish) + default: + return nil + } +} + +type DomainChecker struct { + Items domainmod.DomainList +} + +func (c *DomainChecker) StartCheck() error { + nodes, err := Cache.NodeList() + if err != nil { + return err + } + wg := utils.NewWaitGroup() + for _, domain := range c.Items { + _domain := domain + wg.Add(func() { + CheckDomain(_domain, nodes) + }) + } + wg.RunWaits() + return nil +} + +func CheckDomain(domain *domainmod.Domain, nodes NodeList) { + ctx := context.Background() + begin := time.Now() + status := domainmod.CheckStatusChecking + doc := &domainmod.DomainDoc{ + Status: &status, + CheckTime: &begin, + UpdatedAt: &begin, + } + if err := domainmod.UpdateOneDomain(ctx, bson.M{"_id": domain.ID}, bson.M{"$set": doc}); err != nil { + log.Warn("CheckDomain failed", log.E(err)) + return + } + rets := MutexResult{ + List: make(domainmod.CheckResultList, 0), + Lock: sync.Mutex{}, + } + wg := utils.NewWaitGroup() + for _, check := range domain.Checks { + _check := check + wg.Add(func() { + if checker := GetChecker(domain, _check, rets.OnFinish, nodes...); checker != nil { + time.Sleep(time.Duration(rand.Intn(10)) * time.Second) // 防并发访问 + checker.Check() + } + }) + } + wg.RunWaits() + end := time.Now() + doc = &domainmod.DomainDoc{ + CheckFinish: &end, + UpdatedAt: &end, + } + passCount, jumpCount, errCount := rets.CheckStatus() + doc.Results = &rets.List + if errCount > 0 { + report := rets.Reports() + doc.Report = &report + status0 := domainmod.CheckStatusFailed + //doc.Status = utils.PValue(domainmod.CheckStatusFailed) + if passCount > 0 { + //doc.Status = utils.PValue(domainmod.CheckStatusPartPass) + status0 = domainmod.CheckStatusPartPass + } + doc.Status = &status0 + } else { + if passCount > 0 { + if jumpCount > 0 { + //doc.Status = utils.PValue(domainmod.CheckStatusPartPass) + //doc.Report = utils.PValue(rets.Reports()) + status0 := domainmod.CheckStatusPartPass + report := rets.Reports() + doc.Status = &status0 + doc.Report = &report + } else { + //doc.Status = utils.PValue(domainmod.CheckStatusSucc) + //doc.Report = utils.PValue("完全通过") + status0 := domainmod.CheckStatusSucc + report := "完全通过" + doc.Status = &status0 + doc.Report = &report + } + } else { + //doc.Status = utils.PValue(domainmod.CheckStatusNone) + //doc.Report = utils.PValue(rets.Reports()) + status0 := domainmod.CheckStatusNone + report := rets.Reports() + doc.Status = &status0 + doc.Report = &report + } + } + + if err := domainmod.UpdateOneDomain(ctx, bson.M{"_id": domain.ID}, bson.M{"$set": doc}); err != nil { + log.Warn("CheckDomain failed", log.E(err)) + return + } + + if errCount > 0 { + text := fmt.Sprintf("域名检测:【%s】\n", domain.Name) + text += fmt.Sprintf("开始时间:【%s】\n", begin.Format("2006-01-02T15:04:05")) + text += fmt.Sprintf("结束时间:【%s】\n", end.Format("2006-01-02T15:04:05")) + text += fmt.Sprintf("检测用时:【%s】\n", end.Sub(begin)) + text += fmt.Sprintf("检测结果:【%s】\n", *doc.Status) + for _, result := range rets.List { + if result.CheckSucc { + if result.Error == nil { + text += fmt.Sprintf("%s: %s\n", result.CheckType.Name(), "\U0001F7E2 通过") + } else { + if result.NodeCount == 0 { + text += fmt.Sprintf("%s: %s\n", result.CheckType.Name(), "🔴 未通过") + } else { + if result.SuccRate < result.MinRate { + if result.SuccRate < 25 { + text += fmt.Sprintf("%s: %s\n", result.CheckType.Name(), "🔴 未通过") + } else { + text += fmt.Sprintf("%s: %s\n", result.CheckType.Name(), "\U0001F7E0 通过") + } + } else { + text += fmt.Sprintf("%s: %s\n", result.CheckType.Name(), "\U0001F7E2 通过") + } + } + } + } else { + text += fmt.Sprintf("%s: %s\n", result.CheckType.Name(), "🕓 超时") + } + } + if domain.Redirected { + text += fmt.Sprintf("域名跳转:【已做301跳转✅】\n") + text += fmt.Sprintf("跳转地址:【==>%s】\n", domain.RedirectDomain) + } else { + text += fmt.Sprintf("域名跳转:【未做301跳转🈚】\n") + } + + statg.Bot.SendDomainMessage(text) + } +} + +type WebChecker struct { + Item *domainmod.Domain + Mode domainmod.CheckType + Finish FnCheckFinish + Nodes NodeList +} + +func NewWebChecker(item *domainmod.Domain, mode domainmod.CheckType, onFinish FnCheckFinish, nodes NodeList) *WebChecker { + return &WebChecker{ + Item: item, + Mode: mode, + Finish: onFinish, + Nodes: nodes, + } +} + +func (s *WebChecker) Check() error { + ret := &domainmod.CheckResult{ + Domain: s.Item.Name, + CheckType: s.Mode, + BeginTime: time.Now(), + MinRate: s.Item.MinRate, + } + defer s.Finish(ret) + api, ok := ApiPathMap[s.Mode] + if !ok { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("域名%s的检测类型%d不支持", s.Item.Name, s.Mode) + return ret.Error + } + addr, err := api.GetCreateUrl(url.Values{ + "node_ids": []string{s.Nodes.SIdList(s.Item.MaxNodes)}, + "host": []string{s.Item.Name}, + }) + if err != nil { + ret.EndTime = time.Now() + ret.Error = err + return ret.Error + } + tryCount := 0 + res := &CommonResp{} + for { + err = Get(addr, res, url.Values{}) + if err != nil { + tryCount++ + if tryCount > ApiCheckTryCount { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("创建【%s】的【%s】检测任务超时:%s", s.Item.Name, s.Mode.Name(), err.Error()) + return ret.Error + } + time.Sleep(ApiCheckDuration) + continue + } + break + } + + if res.ErrorCode != 0 { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("创建【%s】的【%s】检测任务失败:%s", s.Item.Name, s.Mode.Name(), GetApiErrorMessage(res.ErrorCode)) + return ret.Error + } + // 获取查询ID + if res.Data.Id == nil || *res.Data.Id == "" { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("创建【%s】的【%s】检测任务失败:任务ID未空", s.Item.Name, s.Mode.Name()) + return ret.Error + } + TaskId := *res.Data.Id + // 去查询结果 + tryCount = 0 + addr, err = api.GetQueryUrlWithTaskId(TaskId, url.Values{}) + end := time.Now().Add(ApiCheckTimeout) + for { + time.Sleep(ApiCheckDuration) + webResp := &WebResp{} + err = Get(addr, webResp, url.Values{}) + if err != nil { + tryCount++ + if tryCount > ApiCheckTryCount { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("查询【%s】的【%s】检测结果超时:%s", s.Item.Name, s.Mode.Name(), err.Error()) + return ret.Error + } + continue + } + ret.CheckSucc = webResp.Done + if webResp.Done { + for _, node := range webResp.List { + if node.ErrorCode != 0 { + ret.FailedCount++ + ret.NodeErrors = append(ret.NodeErrors, node.ErrorString()) + } else { + ret.NodeCount++ + if node.HttpCode == http.StatusOK { + ret.SuccCount++ + } else { + ret.NodeErrors = append(ret.NodeErrors, node.ErrorString()) + } + } + } + if ret.NodeCount > 0 { + ret.SuccRate = float64(ret.SuccCount*100) / float64(ret.NodeCount) + if ret.SuccRate < ret.MinRate { + ret.Error = fmt.Errorf("节点通过率%.1f%%<%.1f%%,未通过!", ret.SuccRate, ret.MinRate) + } + } + break + } else { + if end.Before(time.Now()) { + ret.Error = fmt.Errorf("查询【%s】的【%s】检测超时", s.Item.Name, s.Mode.Name()) + break + } + } + + } + ret.EndTime = time.Now() + return ret.Error +} + +type HijackChecker struct { + Item *domainmod.Domain + Mode domainmod.CheckType + Finish FnCheckFinish + Nodes NodeList +} + +func NewHijackChecker(item *domainmod.Domain, mode domainmod.CheckType, onFinish FnCheckFinish, nodes NodeList) *HijackChecker { + return &HijackChecker{ + Item: item, + Mode: mode, + Finish: onFinish, + Nodes: nodes, + } +} + +func (s *HijackChecker) Check() error { + ret := &domainmod.CheckResult{ + Domain: s.Item.Name, + CheckType: s.Mode, + BeginTime: time.Now(), + MinRate: s.Item.MinRate, + } + defer s.Finish(ret) + api, ok := ApiPathMap[s.Mode] + if !ok { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("域名%s的检测类型%d不支持", s.Item.Name, s.Mode) + return ret.Error + } + addr, err := api.GetCreateUrl(url.Values{ + "node_ids": []string{s.Nodes.SIdList(s.Item.MaxNodes)}, + "host": []string{s.Item.Name}, + }) + if err != nil { + ret.EndTime = time.Now() + ret.Error = err + return ret.Error + } + tryCount := 0 + res := &CommonResp{} + for { + err = Get(addr, res, url.Values{}) + if err != nil { + tryCount++ + if tryCount > ApiCheckTryCount { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("创建【%s】的【%s】检测任务超时:%s", s.Item.Name, s.Mode.Name(), err.Error()) + return ret.Error + } + time.Sleep(ApiCheckDuration) + continue + } + break + } + + if res.ErrorCode != 0 { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("创建【%s】的【%s】检测任务失败:%s", s.Item.Name, s.Mode.Name(), GetApiErrorMessage(res.ErrorCode)) + return ret.Error + } + // 获取查询ID + if res.Data.Id == nil || *res.Data.Id == "" { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("创建【%s】的【%s】检测任务失败:任务ID未空", s.Item.Name, s.Mode.Name()) + return ret.Error + } + TaskId := *res.Data.Id + // 去查询结果 + tryCount = 0 + addr, err = api.GetQueryUrlWithTaskId(TaskId, url.Values{}) + end := time.Now().Add(ApiCheckTimeout) + for { + time.Sleep(ApiCheckDuration) + webResp := &HijackResp{} + err = Get(addr, webResp, url.Values{}) + if err != nil { + tryCount++ + if tryCount > ApiCheckTryCount { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("查询【%s】的【%s】接口错误【%d】次,超过最大重试次数:%s", s.Item.Name, s.Mode.Name(), tryCount, err.Error()) + return ret.Error + } + continue + } + ret.CheckSucc = webResp.Done + if webResp.Done { + for _, node := range webResp.List { + ret.NodeCount++ + if node.Hijack { + ret.FailedCount++ + ret.NodeErrors = append(ret.NodeErrors, node.ErrorString()) + } else { + ret.SuccCount++ + } + } + if ret.NodeCount > 0 { + ret.SuccRate = float64(ret.SuccCount*100) / float64(ret.NodeCount) + if ret.SuccRate < ret.MinRate { + ret.Error = fmt.Errorf("节点通过率%.1f%%<%.1f%%,未通过!", ret.SuccRate, ret.MinRate) + } + } + break + } else { + if end.Before(time.Now()) { + ret.Error = fmt.Errorf("查询【%s】的【%s】检测超时", s.Item.Name, s.Mode.Name()) + break + } + } + + } + ret.EndTime = time.Now() + return ret.Error +} + +type FuncCheckResult func(ret *domainmod.CheckResult, data map[string]int) + +func QueryCheck(item *domainmod.Domain, mode domainmod.CheckType, onFinish FnCheckFinish, onCheck FuncCheckResult) error { + ret := &domainmod.CheckResult{ + Domain: item.Name, + CheckType: mode, + BeginTime: time.Now(), + MinRate: item.MinRate, + } + defer onFinish(ret) + api, ok := ApiPathMap[mode] + if !ok { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("查询接口地址【%s】的【%s】出错", item.Name, mode.Name()) + return ret.Error + } + addr, err := api.GetQueryUrl(url.Values{"host": []string{item.Name}}) + polluteResp := &PolluteResp{} + tryCount := 0 + for { + tryCount++ + err = Get(addr, polluteResp, url.Values{}) + if err != nil { + if tryCount > ApiCheckTryCount { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("查询【%s】的【%s】接口错误【%d】次,超过最大重试次数:%s", item.Name, mode.Name(), tryCount, err.Error()) + return ret.Error + } + time.Sleep(ApiCheckDuration) + continue + } + break + } + + if polluteResp.ErrorCode != 0 { + ret.EndTime = time.Now() + ret.Error = fmt.Errorf("查询【%s】的【%s】返回值不是成功:%s", item.Name, mode.Name(), GetApiErrorMessage(polluteResp.ErrorCode)) + return ret.Error + } + ret.CheckSucc = true + onCheck(ret, polluteResp.Data) + ret.EndTime = time.Now() + return ret.Error +} + +type PolluteChecker struct { + Item *domainmod.Domain + Mode domainmod.CheckType + Finish FnCheckFinish +} + +func NewPolluteChecker(item *domainmod.Domain, mode domainmod.CheckType, onFinish FnCheckFinish) *PolluteChecker { + return &PolluteChecker{ + Item: item, + Mode: mode, + Finish: onFinish, + } +} + +func (s *PolluteChecker) Check() error { + return QueryCheck(s.Item, s.Mode, s.Finish, func(ret *domainmod.CheckResult, data map[string]int) { + if code, ok := data[s.Item.Name]; ok { //(-1 未注册,0 正常, 1 污染) + if ok { + if code == 0 { + ret.SuccRate = 100.0 + } else { + if code == 1 { + ret.Error = fmt.Errorf("域名被污染") + } else if code == -1 { + ret.Error = fmt.Errorf("域名未注册") + } else { + ret.Error = fmt.Errorf("未知错误码%d", code) + } + } + } else { + ret.Error = fmt.Errorf("返回值中未检测到域名") + } + } + }) +} + +type QQChecker struct { + Item *domainmod.Domain + Mode domainmod.CheckType + Finish FnCheckFinish +} + +func NewQQChecker(item *domainmod.Domain, mode domainmod.CheckType, onFinish FnCheckFinish) *QQChecker { + return &QQChecker{ + Item: item, + Mode: mode, + Finish: onFinish, + } +} + +func (s *QQChecker) Check() error { + return QueryCheck(s.Item, s.Mode, s.Finish, func(ret *domainmod.CheckResult, data map[string]int) { + if code, ok := data[s.Item.Name]; ok { //1正常, 2拦截, 3-检测失败 + if ok { + if code == 1 { + ret.CheckSucc = true + ret.SuccRate = 100.0 + } else { + if code == 2 { + ret.CheckSucc = true + ret.Error = fmt.Errorf("已被拦截") + } else if code == 3 { + ret.Error = fmt.Errorf("检测失败") + } else { + ret.Error = fmt.Errorf("检测值【%d】不知道意义", code) + } + } + } else { + ret.Error = fmt.Errorf("返回值中未检测到域名") + } + } + }) +} + +type WeChatChecker struct { + Item *domainmod.Domain + Mode domainmod.CheckType + Finish FnCheckFinish +} + +func NewWeChatChecker(item *domainmod.Domain, mode domainmod.CheckType, onFinish FnCheckFinish) *WeChatChecker { + return &WeChatChecker{ + Item: item, + Mode: mode, + Finish: onFinish, + } +} + +func (s *WeChatChecker) Check() error { + return QueryCheck(s.Item, s.Mode, s.Finish, func(ret *domainmod.CheckResult, data map[string]int) { + if code, ok := data[s.Item.Name]; ok { //1正常, 2拦截(域名被封), 3-检测失败,4-拦截(非微信官方链接,需跳转访问) + if ok { + if code == 1 || code == 4 { + ret.CheckSucc = true + ret.SuccRate = 100.0 + } else { + if code == 2 { + ret.CheckSucc = true + ret.Error = fmt.Errorf("已被拦截") + } else if code == 3 { + ret.Error = fmt.Errorf("检测失败") + } else { + ret.Error = fmt.Errorf("检测值【%d】不知道意义", code) + } + } + } else { + ret.Error = fmt.Errorf("返回值中未检测到域名") + } + } + }) +} + +type BlackChecker struct { + Item *domainmod.Domain + Mode domainmod.CheckType + Finish FnCheckFinish +} + +func NewBlackChecker(item *domainmod.Domain, mode domainmod.CheckType, onFinish FnCheckFinish) *BlackChecker { + return &BlackChecker{ + Item: item, + Mode: mode, + Finish: onFinish, + } +} + +func (s *BlackChecker) Check() error { + return QueryCheck(s.Item, s.Mode, s.Finish, func(ret *domainmod.CheckResult, data map[string]int) { + if code, ok := data[s.Item.Name]; ok { //1-正常, 2-在黑名单 + if ok { + if code == 1 { + ret.CheckSucc = true + ret.SuccRate = 100.0 + } else { + if code == 2 { + ret.CheckSucc = true + ret.Error = fmt.Errorf("在黑名单") + } else { + ret.Error = fmt.Errorf("检测值【%d】不知道意义", code) + } + } + } else { + ret.Error = fmt.Errorf("返回值中未检测到域名") + } + } + }) +} + +type GFWChecker struct { + Item *domainmod.Domain + Mode domainmod.CheckType + Finish FnCheckFinish +} + +func NewGFWChecker(item *domainmod.Domain, mode domainmod.CheckType, onFinish FnCheckFinish) *GFWChecker { + return &GFWChecker{ + Item: item, + Mode: mode, + Finish: onFinish, + } +} + +func (s *GFWChecker) Check() error { + return QueryCheck(s.Item, s.Mode, s.Finish, func(ret *domainmod.CheckResult, data map[string]int) { + if code, ok := data[s.Item.Name]; ok { //0 正常, 1 被墙, 2 疑似被墙, 3 无资源请重试,4 域名格式错误 + if ok { + if code == 0 { // 正常 + ret.CheckSucc = true + ret.SuccRate = 100.0 + } else { + if code == 1 { + ret.CheckSucc = true + ret.Error = fmt.Errorf("域名被墙") + } else if code == 2 { + ret.CheckSucc = true + ret.Error = fmt.Errorf("疑似被墙") + } else if code == 3 { + ret.Error = fmt.Errorf("无资源请重试") + } else if code == 4 { + ret.Error = fmt.Errorf("域名格式错误") + } else { + ret.Error = fmt.Errorf("检测值【%d】不知道意义", code) + } + } + } else { + ret.Error = fmt.Errorf("返回值中未检测到域名") + } + } + }) +} diff --git a/service/domainser/define.go b/service/domainser/define.go new file mode 100644 index 0000000..86444b5 --- /dev/null +++ b/service/domainser/define.go @@ -0,0 +1,135 @@ +package domainser + +import ( + "fmt" + "math/rand" + "sort" + "stat/models/domainmod" + "strings" + "time" +) + +type FnCheckFinish func(result *domainmod.CheckResult) + +type Checker interface { + Check() error +} + +type ApiPath struct { + Create string + Query string + Sleep time.Duration + NeedCreate bool +} + +type Node struct { + Id int `json:"id"` + NodeName string `json:"node_name"` + IspName string `json:"isp_name"` + IspCode int `json:"isp_code"` + Rand int +} + +type NodeList []Node + +func (n NodeList) Len() int { return len(n) } +func (n NodeList) Less(i, j int) bool { + return n[i].Rand < n[j].Rand +} +func (n NodeList) Swap(i, j int) { n[i], n[j] = n[j], n[i] } + +func (n NodeList) SIdList(max int32) string { + if max < 1 { + max = 1 + } + for _, node := range n { + node.Rand = rand.Int() + } + sort.Sort(n) + ss := make([]string, 0) + for _, node := range n { + if strings.Contains(node.IspName, "电信") || strings.Contains(node.IspName, "移动") || strings.Contains(node.IspName, "联通") { + ss = append(ss, fmt.Sprintf("%d", node.Id)) + } + } + if len(ss) > int(max) { + ss = ss[:max] + } + return strings.Join(ss, ",") +} + +type CommonResp struct { + ErrorCode int `json:"error_code"` + Error string `json:"error"` + Data struct { + Id *string `json:"id"` + List *NodeList `json:"list"` + } `json:"data"` +} + +type DomainResp struct { + ErrorCode int `json:"error_code"` + Error string `json:"error"` + Data map[string]int `json:"data"` +} + +type WebTestNode struct { + NodeId int `json:"node_id"` + NodeName string `json:"node_name"` + Host string `json:"host"` + OriginIp string `json:"origin_ip"` + HttpCode int `json:"http_code"` + RemoteIp string `json:"remote_ip"` + SizeDownload int `json:"size_download"` + SpeedDownload int `json:"speed_download"` + TimeConnect float64 `json:"time_connect"` + TimeNamelookup float64 `json:"time_namelookup"` + TimeStarttransfer float64 `json:"time_starttransfer"` + TimeTotal float64 `json:"time_total"` + ReportSource string `json:"report_source"` + SessionId string `json:"session_id"` + IpRegion string `json:"ip_region"` + IpIsp string `json:"ip_isp"` + ErrorCode int `json:"error_code"` + Error string `json:"error"` + TimeId string `json:"time_id"` +} +type WebTestNodeList []*WebTestNode + +func (n *WebTestNode) ErrorString() string { + return fmt.Sprintf("节点【%s】检测失败", n.NodeName) +} + +type WebResp struct { + Id string `json:"id"` + MaxNode int `json:"max_node"` + Done bool `json:"done"` + List WebTestNodeList `json:"list"` +} + +type HijackTestNode struct { + NodeId int `json:"node_id"` + Hijack bool `json:"hijack"` + NodeName string `json:"node_name"` + RemoteIp string `json:"remote_ip"` + Url string `json:"url"` + ReportSource string `json:"report_source"` +} + +func (n *HijackTestNode) ErrorString() string { + return fmt.Sprintf("节点【%s】已劫持", n.NodeName) +} + +type HijackResp struct { + Done bool `json:"done"` + HijackNum int `json:"hijack_num"` + Id string `json:"id"` + List []*HijackTestNode `json:"list"` + MaxNode int `json:"max_node"` +} + +type PolluteResp struct { + ErrorCode int `json:"error_code"` + Error string `json:"error"` + Data map[string]int `json:"data"` +} diff --git a/service/domainser/domainser.go b/service/domainser/domainser.go new file mode 100644 index 0000000..f0f03af --- /dev/null +++ b/service/domainser/domainser.go @@ -0,0 +1,76 @@ +package domainser + +import ( + "context" + "stat/common/enum/consts" + "stat/common/log" + "stat/common/statutils" + "stat/models/domainmod" + "stat/statg" + "time" + + "go.mongodb.org/mongo-driver/bson" + + "github.com/robfig/cron/v3" +) + +var ( + checkCron *cron.Cron +) + +func init() { + checkCron = cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(&log.Logger{}))) // 秒级定时任务 +} + +// Start 定时器任务启动 +func Start() { + log.Info("domain checker start...") + ctx := context.Background() + if statg.Conf.RunMod != consts.RunModRelease { + return + } + _, _ = checkCron.AddFunc("0 0/5 * * * ?", func() { + statutils.ServerMon.RunWithName(func() error { + return DomainCheck(ctx) + }, statutils.GetFuncName(DomainCheck)) + }) + checkCron.Start() +} + +func DomainCheck(ctx context.Context) error { + list, err := domainmod.FindManyDomain(ctx, bson.M{ + "enable": true, + "checkTime": bson.M{"$lt": time.Now().Add(-10 * time.Minute)}, + }) + if err != nil { + return err + } + + redirectedChecks := []domainmod.CheckType{domainmod.CheckTypePollute} + unRedirectedChecks := []domainmod.CheckType{domainmod.CheckTypePollute, domainmod.CheckTypeGFW} + + domains := make(domainmod.DomainList, 0) + for _, item := range list { + if item.Redirected { + item.Checks = redirectedChecks + } else { + item.Checks = unRedirectedChecks + } + if item.Status == domainmod.CheckStatusNone { + if item.CheckTime.Before(time.Now().Add(-10 * time.Minute)) { + domains = append(domains, item) + } + } else { + if item.CheckTime.Before(time.Now().Add(time.Duration(-item.CycleHour) * time.Hour)) { + domains = append(domains, item) + } + } + } + if len(domains) == 0 { + return nil + } + domainChecker := &DomainChecker{ + Items: domains, + } + return domainChecker.StartCheck() +} diff --git a/service/domainser/helper.go b/service/domainser/helper.go new file mode 100644 index 0000000..fb1b974 --- /dev/null +++ b/service/domainser/helper.go @@ -0,0 +1,95 @@ +package domainser + +import ( + "encoding/json" + "fmt" + "net" + "net/http" + "net/url" + "regexp" + "strings" + + "github.com/ddliu/go-httpclient" +) + +func ParseDomain(name string) (string, error) { + name = strings.TrimSpace(name) + if strings.Contains(strings.ToLower(name), "http:") || strings.Contains(strings.ToLower(name), "https:") { + u, err := url.Parse(name) + if err != nil { + return "", err + } + if u.Host == "" { + return "", fmt.Errorf("没有检测到有效的域名") + } + if net.ParseIP(u.Host) != nil { + return "", fmt.Errorf("只能填写域名,不能填写IP地址") + } + host, _, err := net.SplitHostPort(u.Host) + if err != nil { + return "", fmt.Errorf("域名无效") + } + return host, nil + } else { + re, err := regexp.Compile(`^(?:[_a-z0-9](?:[_a-z0-9-]{0,61}[a-z0-9])?\.)+(?:[a-z](?:[a-z0-9-]{0,61}[a-z0-9])?)?$`) + if err != nil { + return "", err + } + if !re.MatchString(name) { + return "", fmt.Errorf("请输入正确的域名") + } + return name, nil + } +} + +func (n *ApiPath) GetCreateUrl(param url.Values) (string, error) { + param.Set("key", ApiKey) + if n.NeedCreate { + base, err := url.Parse(ApiDomain + n.Create) + if err != nil { + return "", err + } + base.RawQuery = param.Encode() + return base.String(), nil + } else { + return "", fmt.Errorf("do not need create url") + } +} + +func (n *ApiPath) GetQueryUrlWithTaskId(taskId string, param url.Values) (string, error) { + param.Set("key", ApiKey) + base, err := url.Parse(ApiDomain + n.Query + taskId) + if err != nil { + return "", err + } + base.RawQuery = param.Encode() + return base.String(), nil +} + +func (n *ApiPath) GetQueryUrl(param url.Values) (string, error) { + param.Set("key", ApiKey) + base, err := url.Parse(ApiDomain + n.Query) + if err != nil { + return "", err + } + base.RawQuery = param.Encode() + return base.String(), nil +} + +func Get(url string, resp interface{}, param url.Values) error { + res, err := httpclient.Get(url, param) + if err != nil { + return fmt.Errorf("访问检测网站失败:%s", err.Error()) + } + if res.StatusCode != http.StatusOK { + return fmt.Errorf("访问检测网站失败, HTTP Code:%d, Error:%s", res.StatusCode, res.Status) + } + data, err := res.ReadAll() + if err != nil { + return fmt.Errorf("读取检测网站返回数据失败:%s", err.Error()) + } + if err = json.Unmarshal(data, resp); err != nil { + return fmt.Errorf("解码检测网站返回数据失败:%s", err.Error()) + } + return nil +} diff --git a/service/domainser/service.go b/service/domainser/service.go new file mode 100644 index 0000000..74a3cce --- /dev/null +++ b/service/domainser/service.go @@ -0,0 +1,133 @@ +package domainser + +import ( + "context" + "fmt" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/appInfoMod" + "stat/models/domainmod" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 获取DomainInfo列表 +func GetDomainInfoList(ctx context.Context, param proto.ListDomainInfoReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListDomainInfoRes{ + Total: 0, + List: make(domainmod.DomainList, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + + filter := bson.M{} + if param.Name != nil { + filter["name"] = bson.M{"$regex": fmt.Sprintf("^%s", *param.Name)} + } + if param.AppId != nil { + filter["appId"] = *param.AppId + } + if param.Enable != nil { + filter["enable"] = *param.Enable + } + if param.Status != nil { + filter["status"] = *param.Status + } + if param.Category != nil { + filter["category"] = *param.Category + } + if param.Check != nil { + filter["checks"] = bson.M{"$in": *param.Check} + } + opts := options.Find().SetSkip(skip).SetLimit(limit) + count, err := domainmod.CountDomains(ctx, filter) + if err != nil { + code = stdLog.Failure + return + } + aList, err := domainmod.FindManyDomain(ctx, filter, opts) + if err != nil { + code = stdLog.Failure + return + } + appMap, _ := appInfoMod.GetAllAppIdNameMap(ctx) + for _, item := range aList { + item.AppName = appMap[item.AppId] + } + + resp.Total = count + resp.List = aList + + data = resp + code = stdLog.Success + return +} + +// 添加DomainInfo +func AddDomainInfo(ctx context.Context, param proto.AddDomainInfoReq) (code stdLog.CodeType, data interface{}, err error) { + name, err := ParseDomain(param.Name) + if err != nil { + code = stdLog.ParamError + return + } + param.Name = name + now := time.Now() + param.UpdatedAt = now + param.CreatedAt = now + + if param.CycleHour < 1 { + param.CycleHour = 1 + } + + if err = domainmod.InsertOneDomain(ctx, ¶m.Domain); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 更新DomainInfo +func UpdateDomainInfo(ctx context.Context, param proto.UpdateDomainInfoReq) (code stdLog.CodeType, + data interface{}, err error) { + now := time.Now() + param.Update.UpdatedAt = &now + if param.Update.Name != nil { + var name string + name, err = ParseDomain(*param.Update.Name) + if err != nil { + code = stdLog.ParamError + return + } + param.Update.Name = &name + } + if param.Update.CycleHour != nil { + if *param.Update.CycleHour < 1 { + hour := int64(1) + param.Update.CycleHour = &hour + } + } + + if err = domainmod.UpdateOneDomain(ctx, bson.M{"_id": param.Id}, bson.M{"$set": param.Update}); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} + +// 删除DomainInfo +func DelDomainInfo(ctx context.Context, param proto.DelDomainInfoReq) (code stdLog.CodeType, data interface{}, err error) { + if _, err = domainmod.DelOneDomain(ctx, bson.M{"_id": param.Id}); err != nil { + code = stdLog.Failure + return + } + + code = stdLog.Success + return +} diff --git a/service/innerserverser/define.go b/service/innerserverser/define.go new file mode 100644 index 0000000..167e114 --- /dev/null +++ b/service/innerserverser/define.go @@ -0,0 +1,34 @@ +package innerserverser + +import ( + "stat/api/proto" + "time" +) + +type AppInformation struct { + Id int + Name string + BeginCol int + Total proto.InnerDailyRecharge +} + +type DayRecharge struct { + SumDate time.Time + List []*proto.InnerDailyRecharge // all items for one day + Dict map[int32]*proto.InnerDailyRecharge // map[appId]item + Total proto.InnerDailyRecharge +} + +type DayRechargeList []*DayRecharge + +func (d DayRechargeList) Len() int { + return len(d) +} + +func (d DayRechargeList) Less(i, j int) bool { + return d[i].SumDate.Before(d[j].SumDate) +} + +func (d DayRechargeList) Swap(i, j int) { + d[i], d[j] = d[j], d[i] +} diff --git a/service/innerserverser/innerbotxlsx.go b/service/innerserverser/innerbotxlsx.go new file mode 100644 index 0000000..4de16b4 --- /dev/null +++ b/service/innerserverser/innerbotxlsx.go @@ -0,0 +1,711 @@ +package innerserverser + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "github.com/360EntSecGroup-Skylar/excelize" + "go.mongodb.org/mongo-driver/bson" + "io" + "net/http" + "os" + "sort" + "stat/api/proto" + "stat/common/log" + "stat/common/tgbot" + "stat/common/utils" + "stat/models/appInfoMod" + "stat/models/dailystatmod" + "stat/statg" + "strconv" + "time" +) + +func InnerRequestBotcmd(url string, reqproto interface{}, bind interface{}) error { + data, err := json.Marshal(reqproto) + + if err != nil { + log.Error("InnerRequestBotcmd json.Marshal", log.Any("err", err)) + return err + } + + //resp, err = InnerPlainPost(url, data) + bodyReader := bytes.NewReader(data) + req, err := http.NewRequest(http.MethodPost, url, bodyReader) + if err != nil { + log.Error("InnerRequestBotcmd http.NewRequest", log.Any("err", err)) + return err + } + timeout := 30 * time.Second + req.Header.Set("Content-Type", "application/json") + client := http.Client{ + Timeout: timeout, + } + resp, err := client.Do(req) + + if err != nil { + log.Error("InnerRequestBotcmd http.NewRequest", log.Any("err", err)) + return err + } + + if resp.StatusCode != 200 { + err = fmt.Errorf("error status %s, http code %d", resp.Status, resp.StatusCode) + log.Error("InnerRequestBotcmd http.NewRequest resp", log.Any("err", err)) + return err + } + + defer resp.Body.Close() + + data, err = io.ReadAll(resp.Body) + if err != nil { + log.Error("InnerRequestBotcmd io.ReadAll", log.Any("err", err)) + return err + } + + return json.Unmarshal(data, bind) +} + +// bili请求过来的 +func InnerRecgaregeBotcmdList(ctx context.Context, req *proto.InnerRechargeBotcmdReq) ( + *proto.InnerDailyRechargeList, error) { + if req.InnerId != int32(statg.Conf.ServerIndex) { + err := fmt.Errorf("InnerRecgaregeBotcmdList req.InnerId %d", req.InnerId) + log.Error("InnerRecgaregeBotcmdList req.InnerId", log.Any("err", err)) + return nil, err + } + + resp := &proto.InnerDailyRechargeList{} + resp.List = make([]*proto.InnerDailyRecharge, 0) + + list, appinfo, err := GetDbListBotcmd(ctx, &req.EndTime, &req.BeginTime) + if err != nil { + log.Error("InnerRecgaregeBotcmdList:GetDbList", log.E(err)) + return nil, err + } + for _, info := range list { + if info.AppId == 889 { + continue + } + name := "" + if data, ok := appinfo[info.AppId]; ok { + name = data.Name + } + temp := &proto.InnerDailyRecharge{ + AppId: info.AppId, + Name: name, + Type: "", + DateTime: info.SumDate.Format("2006-01-02"), + DailyVistCount: info.TotalVisitCount, + DailyRegister: info.NewTotalCount, + DailyAppAmount: info.TotalAmount, + DailyGameAmount: info.GameRechageAmount, + RechargeOrder: info.SuccessRechargeOrder, + } + resp.List = append(resp.List, temp) + } + return resp, nil +} + +func GetDbListBotcmd(ctx context.Context, day *time.Time, yesterday *time.Time) ( + []*dailystatmod.DailyStatMod, map[int32]*appInfoMod.AppInfo, error) { + list := make([]*dailystatmod.DailyStatMod, 0) + appinfo, serr := appInfoMod.GetAllAppIdMap(ctx, bson.M{}) + if serr != nil { + log.Error("GetDbListBotcmd appInfoMod.GetAllAppInfo", log.Any("serr", serr)) + return nil, nil, serr + } + for _, info := range appinfo { + //data, serr := dailystatmod.FindOneDailyStat(ctx, info.AppId, yesterday) + rechargelist, serr := dailystatmod.GetDailyStatTotalList(ctx, &info.AppId, yesterday, day) + if serr != nil { + log.Error("GetDbListBotcmd dailystatmod.GetDailyStatTotalList", log.Any("serr", serr)) + continue + } + if rechargelist != nil { + list = append(list, rechargelist...) + } else { + log.Error("GetDbListBotcmd rechargelist nil") + } + } + return list, appinfo, nil +} + +func NewXlslFileBot(f *excelize.File, list []*proto.InnerDailyRecharge, + titlestyle, cellstyle int) error { + // 设置列宽 + f.SetColWidth(sheetName, "A", "AAA", 19) + + // 设置表头行高 + f.SetRowHeight(sheetName, 1, 25) + f.SetCellStyle(sheetName, "A1", "ZZ1", titlestyle) + f.SetCellStyle(sheetName, "A2", "ZZ2", titlestyle) + f.SetCellStyle(sheetName, "A3", "ZZ3", titlestyle) + + idx := f.NewSheet(sheetName) + + //f.MergeCell(sheetName, "A1", "A3") + f.SetCellValue(sheetName, "A1", "日期") + + //f.SetCellStyle(sheetName, "B2", "AAA2", cellstyle) + f.SetCellStyle(sheetName, "A4", "A50", cellstyle) + f.SetActiveSheet(idx) + + now := time.Now() + day := now.Format("2006-01") + //begin, end := utils.MonthDateRange(now) + beginday := utils.BeginOfMonth(now).Day() + endday := utils.EndOfMonth(now).Day() + + //设置日期 + index := "A" + for i := beginday; i <= endday; i++ { + tmp := fmt.Sprintf("%s%d", index, i+3) + rowday := fmt.Sprintf("%s-%02d", day, i) + + f.SetCellValue(sheetName, tmp, rowday) + } + + //新文件设置固定的主题和style + row := 1 + col := 2 + count := col + for _, info := range list { + begincol := count + count = count + 4 + titleindex := 0 + titlemap := make(map[string]string, 0) + for i := begincol; i <= count; i++ { + if titleindex < len(exportTransWaterTitle) { + titlecell, serr := utils.CoordinatesToCellName(begincol+titleindex, row+2) + if serr != nil { + return serr + } + titlemap[titlecell] = exportTransWaterTitle[titleindex] + } + titleindex++ + } + for key, value := range titlemap { + f.SetCellValue(sheetName, key, value) + } + info.BeginCol = begincol + // 第一行产品 + begincell, serr := utils.CoordinatesToCellName(begincol, row) + if serr != nil { + return serr + } + endcell, serr := utils.CoordinatesToCellName(count, row) + if serr != nil { + return serr + } + // 第一行appid + appidbegincell, serr := utils.CoordinatesToCellName(begincol, row+1) + if serr != nil { + return serr + } + appidendcell, serr := utils.CoordinatesToCellName(count, row+1) + if serr != nil { + return serr + } + f.MergeCell(sheetName, begincell, endcell) + /*if info.AppId != 0 { + if info.AppId == 888 { + f.SetCellValue(sheetName, begincell, info.Name+"(集团)") + } else { + f.SetCellValue(sheetName, begincell, info.Name+"(内部)") + } + } else { + */ + f.SetCellValue(sheetName, begincell, info.Name) + //} + + f.MergeCell(sheetName, appidbegincell, appidendcell) + //tmp := fmt.Sprintf("%s1", string(index0)) + f.SetCellValue(sheetName, appidbegincell, info.AppId) + count += 2 + } + return nil +} + +// bili请求麻豆知乎信息只在bili启动麻豆知乎只响应数据 +func InnerServerBotDateMonthStat(ctx context.Context, cmd *tgbot.Command) error { + if statg.Conf.ServerIndex != statg.ServerIndexBili { + log.Error("InnerServerBotDateMonthStat serverindex", + log.Any("serverindex", statg.Conf.ServerIndex)) + return nil + } + + log.Info("InnerServerBotDateMonthStat start") + sBegin := cmd.GetFlagStringValue("-begin") + if sBegin == "" { + return tgbot.NewUserError(cmd, "请输入查询开始日期,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + sEnd := cmd.GetFlagStringValue("-end") + if sEnd == "" { + return tgbot.NewUserError(cmd, "请输入查询结束日期,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + beginmonth, err := time.ParseInLocation("2006-01-02", sBegin, time.Local) + if err != nil { + return tgbot.NewUserError(cmd, "解析开始日期出错, 格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + //beginmonth = beginmonth.AddDate(0, 0, -1) + endmonth, err := time.ParseInLocation("2006-01-02", sEnd, time.Local) + if err != nil { + return tgbot.NewUserError(cmd, "解析结束日期出错, 格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + + list := make([]*proto.InnerDailyRecharge, 0) + for id, info := range statg.Conf.InnerServers { + if id == statg.ServerIndexBili { + continue + } + + if id != statg.ServerIndexBili && info == "" { + log.Error("InnerServerBotDateMonthStat server not found", + log.Any("statg.Conf.InnerServers", id)) + continue + } + req := &proto.InnerRechargeBotcmdReq{ + InnerId: int32(id), + BeginTime: beginmonth, + EndTime: endmonth, + } + url := info + "/api/stat/inner/rechargebotcmd/list" + log.Info("InnerServerBotDateMonthStat", log.Any("req", url)) + res := &proto.InnerDailyRechargeResp{} + err = InnerRequestBotcmd(url, req, res) + if err != nil { + log.Error("InnerServerBotDateMonthStat InnerRequest", + log.Any("InnerRequest", err)) + continue + } + if res == nil { + log.Error("InnerServerBotDateMonthStat InnerRequest data not found") + continue + } + if res.Data.List != nil && len(res.Data.List) > 0 { + list = append(list, res.Data.List...) + } + } + + bililist, appinfo, err := GetDbListBotcmd(ctx, &endmonth, &beginmonth) + if err != nil { + log.Error("InnerServerBotDateMonthStat:GetDbList", log.E(err)) + return err + } + + for _, info := range bililist { + name := "" + if data, ok := appinfo[info.AppId]; ok { + name = data.Name + } + temp := &proto.InnerDailyRecharge{ + AppId: info.AppId, + Name: name, + Type: "", + DateTime: info.SumDate.Format("2006-01-02"), + DailyVistCount: info.TotalVisitCount, + DailyRegister: info.NewTotalCount, + DailyAppAmount: info.TotalAmount, + DailyGameAmount: info.GameRechageAmount, + RechargeOrder: info.SuccessRechargeOrder, + } + list = append(list, temp) + } + + listmap := make(map[string]*proto.InnerDailyMap) + for _, info := range list { + if value, ok := listmap[info.DateTime]; ok { + value.List = append(value.List, info) + } else { + tempmap := &proto.InnerDailyMap{ + Id: info.DateTime, + List: make([]*proto.InnerDailyRecharge, 0), + } + tempmap.List = append(tempmap.List, info) + listmap[info.DateTime] = tempmap + } + } + + // 中间会不同日期加入新的appid要用所有的appid组成数组创建新xlsx + tempcell := make([]*proto.InnerDailyRecharge, 0) + tempmap0 := make(map[int32]*proto.InnerDailyRecharge) + for _, value := range listmap { + temp := &proto.InnerDailyRecharge{AppId: -1} + for _, info := range value.List { + temp.AppId = 0 + temp.Name = "天宇总充值" + temp.DateTime = info.DateTime + temp.CellType = 1 + temp.DailyVistCount += info.DailyVistCount + temp.DailyRegister += info.DailyRegister + temp.DailyAppAmount += info.DailyAppAmount + temp.DailyGameAmount += info.DailyGameAmount + temp.RechargeOrder += info.RechargeOrder + tempmap0[info.AppId] = info + } + tempmap0[temp.AppId] = temp + value.List = append(value.List, temp) + for i, j := 0, len(value.List)-1; i < j; i, j = i+1, j-1 { + value.List[i], value.List[j] = value.List[j], value.List[i] + } + } + + for _, value := range tempmap0 { + tempcell = append(tempcell, value) + } + sort.Slice(tempcell, func(i, j int) bool { + return tempcell[i].AppId < tempcell[j].AppId + }) + + var f *excelize.File + dir := beginmonth.Format("2006-01") + dayrow := beginmonth.Format("2006-01-02") + filePath := "/usr/local" + "/bakmonthbot/" + dir + "/" + filename := filePath + dayrow + ".xlsx" + if !DocExsit(filePath) { + err = os.MkdirAll(filePath, os.ModePerm) + if err != nil { + log.Error("InnerServerBotDateMonthStat:export save file to disk failed", + log.Any("fileName", filePath), + log.E(err)) + return err + } + } + + f = excelize.NewFile() + + if f == nil { + log.Error("InnerServerBotDateMonthStat f failed") + err = errors.New("InnerServerBotDateMonthStat f failed") + return err + } + + // 设置表头样式 + headStyleID, _ := f.NewStyle(titlestyle) + // 设置表头样式 + headStyleID0, _ := f.NewStyle(cellstyle) + + if tempcell != nil && len(tempcell) > 0 { + err = NewXlslFileBot(f, tempcell, headStyleID, headStyleID0) + if err != nil { + log.Error("InnerServerBotDateMonthStat excelize.OpenFile failed", + log.Any("fileName", filePath), + log.E(err)) + return err + } + } + + for key, value := range listmap { + cols := f.GetRows(sheetName) + if len(cols) < 2 || len(cols[1]) < len(value.List) { + return errors.New("InnerServerBotcmdMonthStat cols < 0") + } + for rowindex := 0; rowindex < len(cols); rowindex++ { + if cols[rowindex][0] != "" && cols[rowindex][0] == key { + for _, info := range value.List { + info.BeginRow = rowindex + 1 + info.IsOld = true + } + } + } + for colindex := 0; colindex < len(cols[1]); colindex++ { + for _, info := range value.List { + appid := strconv.Itoa(int(info.AppId)) + if cols[1][colindex] != "" && cols[1][colindex] == appid { + info.BeginCol = colindex + 1 + info.IsOld = true + } + } + } + + for _, info := range value.List { + cellday, serr := utils.CoordinatesToCellName(info.BeginCol, info.BeginRow) + if serr != nil { + log.Error("InnerServerBotDateMonthStat CoordinatesToCellName ", log.Any("err", serr)) + return serr + } + cellregister, serr := utils.CoordinatesToCellName(info.BeginCol+1, info.BeginRow) + if serr != nil { + log.Error("InnerServerBotDateMonthStat CoordinatesToCellName ", log.Any("err", serr)) + return serr + } + cellrecharge, serr := utils.CoordinatesToCellName(info.BeginCol+2, info.BeginRow) + if serr != nil { + log.Error("InnerServerBotDateMonthStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + cellgame, serr := utils.CoordinatesToCellName(info.BeginCol+3, info.BeginRow) + if serr != nil { + log.Error("InnerServerBotDateMonthStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + cellorder, serr := utils.CoordinatesToCellName(info.BeginCol+4, info.BeginRow) + if serr != nil { + log.Error("InnerServerBotDateMonthStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + + f.SetCellStyle(sheetName, cellday, cellday, headStyleID0) + totalamount := fmt.Sprintf("%.2f", float64(info.DailyVistCount)*0.01) + f.SetCellValue(sheetName, cellday, totalamount) + f.SetCellStyle(sheetName, cellregister, cellday, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyRegister)*0.01) + f.SetCellValue(sheetName, cellregister, totalamount) + f.SetCellStyle(sheetName, cellrecharge, cellday, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyAppAmount)*0.0001) + f.SetCellValue(sheetName, cellrecharge, totalamount) + if info.AppId == 0 || info.AppId == 888 { + f.SetCellStyle(sheetName, cellgame, cellday, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyGameAmount)*0.0001) + f.SetCellValue(sheetName, cellgame, totalamount) + } + f.SetCellStyle(sheetName, cellorder, cellday, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.RechargeOrder)*0.01) + f.SetCellValue(sheetName, cellorder, totalamount) + } + } + err = f.SaveAs(filename) + if err != nil { + log.Error("InnerServerBotDateMonthStat CoordinatesToCellName ", log.Any("err", err)) + + return err + } + if statg.RchssendBot != nil { + err = statg.RchssendBot.Sendrchstochat("天宇公司综合日报间隔日期", filename, tgbot.FileTypeDocument) + //statg.Bot.Sendrchstochat("充值", fileName, tgbot.FileTypeDocument) + if err != nil { + log.Error("InnerServerBotDateMonthStat Sendrchstochat", log.Any("Sendrchstochat", err)) + } + } + log.Info("InnerServerBotDateMonthStat end") + + return nil +} + +// bili请求麻豆知乎信息只在bili启动麻豆知乎只响应数据 +func InnerServerBotDateDayStat(ctx context.Context, cmd *tgbot.Command) error { + if statg.Conf.ServerIndex != statg.ServerIndexBili { + log.Error("InnerServerBotDateDayStat serverindex", + log.Any("serverindex", statg.Conf.ServerIndex)) + return nil + } + + log.Info("InnerServerBotDateDayStat start") + + sBegin := cmd.GetFlagStringValue("-date") + if sBegin == "" { + return tgbot.NewUserError(cmd, "请输入查询开始日期,格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + beginmonth, err := time.ParseInLocation("2006-01-02", sBegin, time.Local) + if err != nil { + return tgbot.NewUserError(cmd, "解析开始日期出错, 格式:\n"+cmd.Help+"\n"+cmd.Desc) + } + endmonth := beginmonth.AddDate(0, 0, 1) + + list := make([]*proto.InnerDailyRecharge, 0) + for id, info := range statg.Conf.InnerServers { + if id == statg.ServerIndexBili { + continue + } + + if id != statg.ServerIndexBili && info == "" { + log.Error("InnerServerBotDateDayStat server not found", + log.Any("InnerServerBotDateDayStat", id)) + continue + } + req := &proto.InnerRechargeBotcmdReq{ + InnerId: int32(id), + BeginTime: beginmonth, + EndTime: endmonth, + } + url := info + "/api/stat/inner/rechargebotcmd/list" + log.Info("InnerServerBotDateDayStat", log.Any("req", url)) + res := &proto.InnerDailyRechargeResp{} + err = InnerRequestBotcmd(url, req, res) + if err != nil { + log.Error("InnerServerBotDateDayStat InnerRequest", + log.Any("InnerRequest", err)) + continue + } + if res == nil { + log.Error("InnerServerBotDateDayStat InnerRequest data not found") + continue + } + if res.Data.List != nil && len(res.Data.List) > 0 { + list = append(list, res.Data.List...) + } + } + + bililist, appinfo, err := GetDbListBotcmd(ctx, &endmonth, &beginmonth) + if err != nil { + log.Error("InnerServerBotDateDayStat:GetDbListBotcmd", log.E(err)) + return err + } + + for _, info := range bililist { + name := "" + if data, ok := appinfo[info.AppId]; ok { + name = data.Name + } + temp := &proto.InnerDailyRecharge{ + AppId: info.AppId, + Name: name, + Type: "", + DateTime: info.SumDate.Format("2006-01-02"), + DailyVistCount: info.TotalVisitCount, + DailyRegister: info.NewTotalCount, + DailyAppAmount: info.TotalAmount, + DailyGameAmount: info.GameRechageAmount, + RechargeOrder: info.SuccessRechargeOrder, + } + list = append(list, temp) + } + + temp := &proto.InnerDailyRecharge{} + for _, info := range list { + temp.AppId = 0 + temp.CellType = 1 + temp.Name = "天宇总充值" + temp.DailyVistCount += info.DailyVistCount + temp.DailyRegister += info.DailyRegister + temp.DailyAppAmount += info.DailyAppAmount + temp.DailyGameAmount += info.DailyGameAmount + temp.RechargeOrder += info.RechargeOrder + } + list = append(list, temp) + for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 { + list[i], list[j] = list[j], list[i] + } + + var f *excelize.File + dir := beginmonth.Format("2006-01") + dayrow := beginmonth.Format("2006-01-02") + filePath := "/usr/local" + "/bakmonthday/" + dir + "/" + filename := filePath + dayrow + ".xlsx" + if !DocExsit(filePath) { + err = os.MkdirAll(filePath, os.ModePerm) + if err != nil { + log.Error("InnerServerBotDateDayStat:export save file to disk failed", + log.Any("fileName", filePath), + log.E(err)) + return err + } + } + + f = excelize.NewFile() + + if f == nil { + log.Error("InnerServerBotDateDayStat f failed") + err = errors.New("InnerServerBotDateDayStat f failed") + return err + } + + // 设置表头样式 + headStyleID, _ := f.NewStyle(titlestyle) + // 设置表头样式 + headStyleID0, _ := f.NewStyle(cellstyle) + + err = NewXlslFileBot(f, list, headStyleID, headStyleID0) + if err != nil { + log.Error("InnerServerBotDateDayStat excelize.OpenFile failed", + log.Any("fileName", filePath), + log.E(err)) + return err + } + + row := 0 + cols := f.GetRows(sheetName) + for rowindex, col := range cols { + for colindex, rowCell := range col { + if rowCell == "" { + continue + } + if colindex == 0 { + if rowCell == dayrow { + row = rowindex + 1 + } + } + } + } + + if row == 0 { + return errors.New("InnerServerBotDateDayStat row <= 0") + } + + for _, info := range list { + cellday, serr := utils.CoordinatesToCellName(info.BeginCol, row) + if serr != nil { + log.Error("InnerServerBotDateDayStat CoordinatesToCellName ", log.Any("err", serr)) + return serr + } + cellregister, serr := utils.CoordinatesToCellName(info.BeginCol+1, row) + if serr != nil { + log.Error("InnerServerBotDateDayStat CoordinatesToCellName ", log.Any("err", serr)) + return serr + } + cellrecharge, serr := utils.CoordinatesToCellName(info.BeginCol+2, row) + if serr != nil { + log.Error("InnerServerBotDateDayStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + cellgame, serr := utils.CoordinatesToCellName(info.BeginCol+3, row) + if serr != nil { + log.Error("InnerServerBotDateDayStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + cellorder, serr := utils.CoordinatesToCellName(info.BeginCol+4, row) + if serr != nil { + log.Error("InnerServerBotDateDayStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + + f.SetCellStyle(sheetName, cellday, cellday, headStyleID0) + totalamount := fmt.Sprintf("%.2f", float64(info.DailyVistCount)*0.01) + f.SetCellValue(sheetName, cellday, totalamount) + + f.SetCellStyle(sheetName, cellregister, cellregister, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyRegister)*0.01) + f.SetCellValue(sheetName, cellregister, totalamount) + + f.SetCellStyle(sheetName, cellrecharge, cellrecharge, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyAppAmount)*0.0001) + f.SetCellValue(sheetName, cellrecharge, totalamount) + + if info.AppId == 0 || info.AppId == 888 { + f.SetCellStyle(sheetName, cellgame, cellgame, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyGameAmount)*0.0001) + f.SetCellValue(sheetName, cellgame, totalamount) + } + + f.SetCellStyle(sheetName, cellorder, cellorder, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.RechargeOrder)*0.01) + f.SetCellValue(sheetName, cellorder, totalamount) + } + + err = f.SaveAs(filename) + if err != nil { + log.Error("InnerServerBotDateDayStat SaveAs ", log.Any("err", err)) + + return err + } + + if statg.RchssendBot != nil { + err = statg.RchssendBot.Sendrchstochat("天宇公司综合日报具体date", filename, + tgbot.FileTypeDocument) + if err != nil { + log.Error("InnerServerBotDateDayStat Sendrchstochat", log.Any("Sendrchstochat", err)) + } + } + + log.Info("InnerServerBotDateDayStat end") + + return nil +} diff --git a/service/innerserverser/innerserverser.go b/service/innerserverser/innerserverser.go new file mode 100644 index 0000000..f41e61a --- /dev/null +++ b/service/innerserverser/innerserverser.go @@ -0,0 +1,970 @@ +package innerserverser + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "os" + "path" + "sort" + "stat/api/proto" + "stat/common/log" + "stat/common/tgbot" + "stat/common/utils" + "stat/models/appInfoMod" + "stat/models/dailystatmod" + "stat/statg" + "time" + + "github.com/360EntSecGroup-Skylar/excelize" + "go.mongodb.org/mongo-driver/bson" +) + +const titlestyle = `{ + "font":{ + "color":"#333333", + "bold":true, + "size":16, + "family":"arial" + }, + + "alignment":{ + "vertical":"center", + "horizontal":"center", + "wrap_text":true + } + }` + +const cellstyle = `{ + "font":{ + "color":"#333333", + "bold":false, + "size":10, + "family":"arial" + }, + "alignment":{ + "vertical":"center", + "horizontal":"center", + "wrap_text":true + } + }` + +func InnerRequest(url string, reqproto interface{}, bind interface{}) error { + data, err := json.Marshal(reqproto) + + if err != nil { + log.Error("InnerRequest json.Marshal", log.Any("err", err)) + return err + } + + //resp, err = InnerPlainPost(url, data) + bodyReader := bytes.NewReader(data) + req, err := http.NewRequest(http.MethodPost, url, bodyReader) + if err != nil { + log.Error("InnerRequest http.NewRequest", log.Any("err", err)) + return err + } + timeout := 30 * time.Second + req.Header.Set("Content-Type", "application/json") + client := http.Client{ + Timeout: timeout, + } + resp, err := client.Do(req) + + if err != nil { + log.Error("InnerRequest http.NewRequest", log.Any("err", err)) + return err + } + + if resp.StatusCode != 200 { + err = fmt.Errorf("error status %s, http code %d", resp.Status, resp.StatusCode) + log.Error("InnerRequest http.NewRequest resp", log.Any("err", err)) + return err + } + + defer resp.Body.Close() + + data, err = io.ReadAll(resp.Body) + if err != nil { + log.Error("InnerRequest io.ReadAll", log.Any("err", err)) + return err + } + + return json.Unmarshal(data, bind) +} + +// bili请求过来的 +func InnerRecgaregeList(ctx context.Context, req *proto.InnerRechargeReq) ( + *proto.InnerDailyRechargeList, error) { + if req.InnerId != int32(statg.Conf.ServerIndex) { + err := fmt.Errorf("InnerRecgaregeList req.InnerId %d", req.InnerId) + log.Error("InnerRecgaregeList req.InnerId", log.Any("err", err)) + + return nil, err + } + + resp := &proto.InnerDailyRechargeList{} + resp.List = make([]*proto.InnerDailyRecharge, 0) + + begin := req.Begin + end := req.End + + list, appinfo, err := GetDailyStatList(ctx, &end, &begin) + if err != nil { + log.Error("InnerRecgaregeList:GetDbList", log.E(err)) + return nil, err + } + for _, info := range list { + if info.AppId == 889 { + continue + } + name := "" + if data, ok := appinfo[info.AppId]; ok { + name = data.Name + } + temp := &proto.InnerDailyRecharge{ + AppId: info.AppId, + Name: name, + Type: "", + SumDate: info.SumDate, + DateTime: info.SumDate.Format(time.DateOnly), + DailyVistCount: info.TotalVisitCount, + DailyRegister: info.NewTotalCount, + DailyAppAmount: info.TotalAmount, + DailyGameAmount: info.GameRechageAmount, + RechargeOrder: info.SuccessRechargeOrder, + } + resp.List = append(resp.List, temp) + } + return resp, nil +} + +func GetDbList(ctx context.Context, day *time.Time, yesterday *time.Time) ( + []*dailystatmod.DailyStatMod, map[int32]*appInfoMod.AppInfo, error) { + list := make([]*dailystatmod.DailyStatMod, 0) + appinfo, serr := appInfoMod.GetAllAppIdMap(ctx, bson.M{}) + if serr != nil { + log.Error("InnerServerDailyStat appInfoMod.GetAllAppInfo", log.Any("serr", serr)) + return nil, nil, serr + } + for _, info := range appinfo { + //data, serr := dailystatmod.FindOneDailyStat(ctx, info.AppId, yesterday) + rechargelist, serr := dailystatmod.GetDailyStatTotalList(ctx, &info.AppId, yesterday, day) + if serr != nil { + log.Error("InnerServerDailyStat dailystatmod.GetDailyStatTotalList", log.Any("serr", serr)) + continue + } + if len(rechargelist) != 1 { + log.Error("InnerServerDailyStat dailystatmod.GetDailyStatTotalList", + log.Any("len(rechargelist)", len(rechargelist)), log.Any("appid", info.AppId), + log.Any("yesterday", yesterday), log.Any("day", day)) + continue + } + if rechargelist != nil { + list = append(list, rechargelist...) + } else { + log.Error("InnerServerDailyStat rechargelist nil") + } + } + return list, appinfo, nil +} + +// 从这个方法开始bili本机调用 +func DocExsit(path string) bool { + _, err := os.Stat(path) + if err != nil { + if os.IsExist(err) { + return true + } + + return false + } + + return true +} + +// bili请求麻豆知乎信息只在bili启动麻豆知乎只响应数据 +func InnerServerDailyStat(ctx context.Context) error { + if statg.Conf.ServerIndex != statg.ServerIndexBili { + log.Error("InnerServerDailyStat serverindex", + log.Any("serverindex", statg.Conf.ServerIndex)) + return nil + } + log.Info("InnerServerDailyStat start") + list := make([]*proto.InnerDailyRecharge, 0) + now := time.Now() + + for id, info := range statg.Conf.InnerServers { + if id == statg.ServerIndexBili { + continue + } + + if id != statg.ServerIndexBili && info == "" { + log.Error("statg.Conf.InnerServers server not found", + log.Any("statg.Conf.InnerServers", id)) + continue + } + req := &proto.InnerRechargeReq{ + InnerId: int32(id), + Begin: utils.BeginWithTime(now).Add(-24 * time.Hour), + End: utils.BeginWithTime(now), + } + url := info + "/api/stat/inner/recharge/list" + log.Info("InnerServerDailyStat", log.Any("req", url)) + res := &proto.InnerDailyRechargeResp{} + err := InnerRequest(url, req, res) + if err != nil { + log.Error("InnerServerDailyStat InnerRequest", + log.Any("InnerRequest", err)) + continue + } + if res == nil { + log.Error("InnerServerDailyStat InnerRequest data not found") + continue + } + if res.Data.List != nil && len(res.Data.List) > 0 { + list = append(list, res.Data.List...) + } + } + + /*appinfo, serr := appInfoMod.GetAllAppIdMap(ctx, bson.M{}) + if serr != nil { + log.Error("InnerServerDailyStat appInfoMod.GetAllAppInfo", log.Any("serr", serr)) + return nil, serr + } + */ + + yesterday := utils.BeginOfYesterday() + day := utils.BeginOfToday() + + bililist, appinfo, err := GetDbList(ctx, &day, &yesterday) + if err != nil { + log.Error("InnerServerDailyStat:GetDbList", log.E(err)) + return err + } + + for _, info := range bililist { + name := "" + if data, ok := appinfo[info.AppId]; ok { + name = data.Name + } + temp := &proto.InnerDailyRecharge{ + AppId: info.AppId, + Name: name, + Type: "", + DateTime: "", + DailyVistCount: info.TotalVisitCount, + DailyRegister: info.NewTotalCount, + DailyAppAmount: info.TotalAmount, + DailyGameAmount: info.GameRechageAmount, + RechargeOrder: info.SuccessRechargeOrder, + } + list = append(list, temp) + } + + temp := &proto.InnerDailyRecharge{} + for _, info := range list { + temp.AppId = 0 + temp.Name = "天宇总充值" + temp.CellType = 1 + temp.DailyVistCount += info.DailyVistCount + temp.DailyRegister += info.DailyRegister + temp.DailyAppAmount += info.DailyAppAmount + temp.DailyGameAmount += info.DailyGameAmount + temp.RechargeOrder += info.RechargeOrder + } + list = append(list, temp) + for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 { + list[i], list[j] = list[j], list[i] + } + dir := yesterday.Format("2006-01-02") + filePath := "/usr/local" + "/bakexel/" + dir + "/" + //filename := utils.BeginOfToday().Format("2006-01-02") + if !DocExsit(filePath) { + err = os.Mkdir(filePath, os.ModePerm) + if err != nil { + log.Error("InnerServerDailyStat:export save file to disk failed", + log.Any("fileName", filePath), + log.E(err)) + return err + } + } + + f := excelize.NewFile() + + if f == nil { + log.Error("InnerServerDailyStat f failed") + err = errors.New("InnerServerDailyStat f failed") + return err + } + + // 设置列宽 + f.SetColWidth(sheetName, "A", "L", 23) + + // 设置表头行高 + f.SetRowHeight(sheetName, 1, 25) + // 设置表头样式 + headStyleID, _ := f.NewStyle(titlestyle) + headStyleID0, _ := f.NewStyle(cellstyle) + f.SetCellStyle(sheetName, "A1", "L1", headStyleID) + idx := f.NewSheet(sheetName) + var exportTransWaterTitleold = map[string]string{ + "A1": "产品", + "B1": "归属", + "C1": "日期", + "D1": "日活跃", + "E1": "日注册", + "F1": "视频日充值", + "G1": "棋牌日充值", + "H1": "交易笔数", + } + + rowindex := 'A' + for k, v := range exportTransWaterTitleold { + f.SetCellValue(sheetName, k, v) + row := fmt.Sprintf("%s%d", string(rowindex), 2) + + f.SetCellStyle(sheetName, row, row, headStyleID0) + rowindex++ + } + + for k, v := range list { + i := 'A' // i 不能超过Z,即列输不能超过26列,超出将出现bug + if v.AppId != 0 { + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Name) //名称 + } + i++ + + /*if v.AppId != 0 { + if v.AppId == 888 { + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), "集团") //归属 + } else { + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), "内部") //归属 + } + } + */ + i++ + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), dir) //时间 + i++ + + totalamount := fmt.Sprintf("%.2f", float64(v.DailyVistCount)*0.01) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), totalamount) //日活跃 + i++ + + totalamount = fmt.Sprintf("%.2f", float64(v.DailyRegister)*0.01) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), totalamount) //日注册 + i++ + + totalamount = fmt.Sprintf("%.2f", float64(v.DailyAppAmount)*0.0001) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), totalamount) //视频日充值 + i++ + + if v.AppId == 0 || v.AppId == 888 { + totalamount = fmt.Sprintf("%.2f", float64(v.DailyGameAmount)*0.0001) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), totalamount) //棋牌日充值 + } + i++ + + totalamount = fmt.Sprintf("%.2f", float64(v.RechargeOrder)*0.01) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), totalamount) //交易笔数 + } + + f.SetActiveSheet(idx) + fileName := filePath + dir + ".xlsx" + + if err = f.SaveAs(fileName); err != nil { + log.Error("InnerServerDailyStat:export save file to disk failed", + log.Any("fileName", fileName), + log.E(err)) + return err + } + + if statg.RchssendBot != nil { + err = statg.RchssendBot.Sendrchstochat("天宇公司日报", fileName, tgbot.FileTypeDocument) + //statg.Bot.Sendrchstochat("充值", fileName, tgbot.FileTypeDocument) + if err != nil { + log.Error("Sendrchstochat", log.Any("Sendrchstochat", err)) + } + } + + log.Info("InnerServerDailyStat end") + + return nil +} + +// bili请求麻豆知乎信息只在bili启动麻豆知乎只响应数据 +func InnerServerMonthStat(ctx context.Context, begin, end *time.Time) error { + if statg.Conf.ServerIndex != statg.ServerIndexBili { + log.Error("InnerServerMonthStat serverindex", + log.Any("serverindex", statg.Conf.ServerIndex)) + return nil + } + log.Info("InnerServerMonthStat start") + var f *excelize.File + newxlslfile := false + var err error + yesterday := utils.BeginOfYesterday() + day := utils.BeginOfToday() + + if begin != nil && end != nil { + yesterday = *begin + day = *end + } + dir := yesterday.Format("2006-01") + dayrow := yesterday.Format("2006-01-02") + filePath := "/usr/local" + "/bakmonth/" + dir + "/" + filename := filePath + dir + ".xlsx" + if !DocExsit(filePath) { + err = os.MkdirAll(filePath, os.ModePerm) + if err != nil { + log.Error("InnerServerMonthStat:export save file to disk failed", + log.Any("fileName", filePath), + log.E(err)) + return err + } + f = excelize.NewFile() + newxlslfile = true + } else { + if !DocExsit(filename) { + f = excelize.NewFile() + newxlslfile = true + } else { + f, err = excelize.OpenFile(filename) + if err != nil { + log.Error("InnerServerMonthStat excelize.OpenFile failed", + log.Any("fileName", filePath), + log.E(err)) + return err + } + } + } + + if f == nil { + log.Error("InnerServerMonthStat f failed") + err = errors.New("InnerServerMonthStat f failed") + return err + } + + list := make([]*proto.InnerDailyRecharge, 0) + for id, info := range statg.Conf.InnerServers { + if id == statg.ServerIndexBili { + continue + } + + if id != statg.ServerIndexBili && info == "" { + log.Error("InnerServerMonthStat server not found", + log.Any("statg.Conf.InnerServers", id)) + continue + } + req := &proto.InnerRechargeReq{ + InnerId: int32(id), + Begin: yesterday, + End: day, + } + url := info + "/api/stat/inner/recharge/list" + log.Info("InnerServerMonthStat", log.Any("req", url)) + res := &proto.InnerDailyRechargeResp{} + err = InnerRequest(url, req, res) + if err != nil { + log.Error("InnerServerMonthStat InnerRequest", + log.Any("InnerRequest", err)) + continue + } + if res == nil { + log.Error("InnerServerMonthStat InnerRequest data not found") + continue + } + if res.Data.List != nil && len(res.Data.List) > 0 { + list = append(list, res.Data.List...) + } + } + + bililist, appinfo, err := GetDbList(ctx, &day, &yesterday) + if err != nil { + log.Error("InnerServerMonthStat:GetDbList", log.E(err)) + return err + } + + for _, info := range bililist { + name := "" + if data, ok := appinfo[info.AppId]; ok { + name = data.Name + } + temp := &proto.InnerDailyRecharge{ + AppId: info.AppId, + Name: name, + Type: "", + DateTime: "", + DailyVistCount: info.TotalVisitCount, + DailyRegister: info.NewTotalCount, + DailyAppAmount: info.TotalAmount, + DailyGameAmount: info.GameRechageAmount, + RechargeOrder: info.SuccessRechargeOrder, + } + list = append(list, temp) + } + + temp := &proto.InnerDailyRecharge{} + for _, info := range list { + temp.AppId = 0 + temp.CellType = 1 + temp.Name = "天宇总充值" + temp.DailyVistCount += info.DailyVistCount + temp.DailyRegister += info.DailyRegister + temp.DailyAppAmount += info.DailyAppAmount + temp.DailyGameAmount += info.DailyGameAmount + temp.RechargeOrder += info.RechargeOrder + } + list = append(list, temp) + for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 { + list[i], list[j] = list[j], list[i] + } + + // 设置表头样式 + headStyleID, _ := f.NewStyle(titlestyle) + // 设置表头样式 + headStyleID0, _ := f.NewStyle(cellstyle) + + if newxlslfile { + err = NewXlslFile0(f, list, headStyleID, headStyleID0) + if err != nil { + log.Error("InnerServerMonthStat excelize.OpenFile failed", + log.Any("fileName", filePath), + log.E(err)) + return err + } + } else { + err = OpenOldXlsl(f, list) + if err != nil { + log.Error("InnerServerMonthStat excelize.OpenFile failed", + log.Any("fileName", filePath), + log.E(err)) + return err + } + } + + row := 0 + cols := f.GetRows(sheetName) + for rowindex, col := range cols { + for colindex, rowCell := range col { + if rowCell == "" { + continue + } + if colindex == 0 { + if rowCell == dayrow { + row = rowindex + 1 + } + } + } + } + if row == 0 { + return errors.New("InnerServerMonthStat row <= 0") + } + + for _, info := range list { + cellday, serr := utils.CoordinatesToCellName(info.BeginCol, row) + if serr != nil { + log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr)) + return serr + } + cellregister, serr := utils.CoordinatesToCellName(info.BeginCol+1, row) + if serr != nil { + log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr)) + return serr + } + cellrecharge, serr := utils.CoordinatesToCellName(info.BeginCol+2, row) + if serr != nil { + log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + cellgame, serr := utils.CoordinatesToCellName(info.BeginCol+3, row) + if serr != nil { + log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + cellorder, serr := utils.CoordinatesToCellName(info.BeginCol+4, row) + if serr != nil { + log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + + f.SetCellStyle(sheetName, cellday, cellday, headStyleID0) + totalamount := fmt.Sprintf("%.2f", float64(info.DailyVistCount)*0.01) + f.SetCellValue(sheetName, cellday, totalamount) + + f.SetCellStyle(sheetName, cellregister, cellregister, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyRegister)*0.01) + f.SetCellValue(sheetName, cellregister, totalamount) + + f.SetCellStyle(sheetName, cellrecharge, cellrecharge, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyAppAmount)*0.0001) + f.SetCellValue(sheetName, cellrecharge, totalamount) + + if info.AppId == 0 || info.AppId == 888 { + f.SetCellStyle(sheetName, cellgame, cellgame, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyGameAmount)*0.0001) + f.SetCellValue(sheetName, cellgame, totalamount) + } + + f.SetCellStyle(sheetName, cellorder, cellorder, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.RechargeOrder)*0.01) + f.SetCellValue(sheetName, cellorder, totalamount) + } + if newxlslfile { + err = f.SaveAs(filename) + if err != nil { + log.Error("InnerServerMonthStat SaveAs ", log.Any("err", err)) + + return err + } + } else { + err = f.Save() + if err != nil { + log.Error("InnerServerMonthStat Save ", log.Any("err", err)) + + return err + } + } + input, err := os.ReadFile(filename) + if err != nil { + log.Error("InnerServerMonthStat ReadFile ", log.Any("err", err)) + + return err + } + + destinationFile := filePath + dayrow + ".xlsx" + err = os.WriteFile(destinationFile, input, 0777) + if err != nil { + log.Error("InnerServerMonthStat WriteFile ", log.Any("err", err)) + + return err + } + if statg.RchssendBot != nil { + err = statg.RchssendBot.Sendrchstochat("天宇公司综合日报", destinationFile, + tgbot.FileTypeDocument) + if err != nil { + log.Error("InnerServerMonthStat", log.Any("Sendrchstochat", err)) + } + } + + log.Info("InnerServerMonthStat end") + + return nil +} + +func InnerServerMonthStat2(ctx context.Context, begin, end *time.Time, cmd *tgbot.Command) error { + if statg.Conf.ServerIndex != statg.ServerIndexBili { + log.Error("InnerServerMonthStat serverindex", + log.Any("serverindex", statg.Conf.ServerIndex)) + return nil + } + log.Info("InnerServerMonthStat start") + f := excelize.NewFile() + now := time.Now().AddDate(0, 0, -1) + start := utils.BeginOfMonth(now) + stop := utils.BeginWithTime(now).AddDate(0, 0, 1) + if begin != nil { + start = *begin + } + if end != nil { + stop = *end + } + listOrg := make([]*proto.InnerDailyRecharge, 0) + for id, info := range statg.Conf.InnerServers { + req := &proto.InnerRechargeReq{ + InnerId: int32(id), + Begin: start, + End: stop, + } + url := info + "/api/stat/inner/recharge/list" + log.Info("InnerServerMonthStat", log.Any("req", url)) + res := &proto.InnerDailyRechargeResp{} + err := InnerRequest(url, req, res) + if err != nil { + log.Error("InnerServerMonthStat InnerRequest", + log.Any("InnerRequest", err)) + continue + } + if res == nil { + log.Error("InnerServerMonthStat InnerRequest data not found") + continue + } + if res.Data.List != nil && len(res.Data.List) > 0 { + listOrg = append(listOrg, res.Data.List...) + } + } + appNames := make(map[int32]string) + appNames[0] = "天宇总充值" + source := map[int64]*DayRecharge{} + for _, info := range listOrg { + appNames[info.AppId] = info.Name + temp := &proto.InnerDailyRecharge{ + AppId: info.AppId, + Name: info.Name, + SumDate: info.SumDate, + DateTime: info.SumDate.Format(time.DateOnly), + DailyVistCount: info.DailyVistCount, + DailyRegister: info.DailyRegister, + DailyAppAmount: info.DailyAppAmount, + DailyGameAmount: info.DailyGameAmount, + RechargeOrder: info.RechargeOrder, + } + found, ok := source[info.SumDate.Unix()] + if !ok { + found = &DayRecharge{ + SumDate: info.SumDate, + List: make([]*proto.InnerDailyRecharge, 0), + Dict: make(map[int32]*proto.InnerDailyRecharge), + } + source[info.SumDate.Unix()] = found + } + found.List = append(found.List, temp) + found.Dict[info.AppId] = temp + found.Total.Name = "天宇总充值" + found.Total.DateTime = info.SumDate.Format(time.DateOnly) + found.Total.SumDate = info.SumDate + found.Total.DailyVistCount += temp.DailyVistCount + found.Total.DailyRegister += temp.DailyRegister + found.Total.DailyAppAmount += temp.DailyAppAmount + found.Total.DailyGameAmount += temp.DailyGameAmount + found.Total.RechargeOrder += temp.RechargeOrder + } + appIds := make([]int, 0) + for id, _ := range appNames { + appIds = append(appIds, int(id)) + } + sort.Sort(sort.IntSlice(appIds)) + AppInfos := make([]*AppInformation, 0) + for _, id := range appIds { + AppInfos = append(AppInfos, &AppInformation{ + Id: id, + Name: appNames[int32(id)], + }) + } + for _, value := range source { + value.Dict[0] = &value.Total + } + // 按APP汇总 + for _, app := range AppInfos { + for _, value := range source { + if info, ok := value.Dict[int32(app.Id)]; ok { + app.Total.DailyVistCount += info.DailyVistCount + app.Total.DailyRegister += info.DailyRegister + app.Total.DailyAppAmount += info.DailyAppAmount + app.Total.DailyGameAmount += info.DailyGameAmount + app.Total.RechargeOrder += info.RechargeOrder + } + } + } + // 设置表头样式 + headStyleID, _ := f.NewStyle(titlestyle) + // 设置表头样式 + headStyleID0, _ := f.NewStyle(cellstyle) + // 设置表结构 + err := NewXlslFile2(f, AppInfos, headStyleID, headStyleID0, now) + if err != nil { + log.Error("InnerServerMonthStat excelize.OpenFile failed", log.E(err)) + return err + } + // 设置数据 + row := 4 + for day := start; day.Before(stop); day = day.AddDate(0, 0, 1) { + if found, ok := source[day.Unix()]; ok { + for _, app := range AppInfos { + if info, ok2 := found.Dict[int32(app.Id)]; ok2 { + _ = SetAppData(f, info, row, app.BeginCol, headStyleID0) + } + } + } + row++ + } + // 设置总计 + row = utils.EndOfMonth(now).Day() - utils.BeginOfMonth(now).Day() + 1 + 4 + for _, app := range AppInfos { + _ = SetAppData(f, &app.Total, row, app.BeginCol, headStyleID0) + } + // 保存文件 + tempDir := os.TempDir() + fmt.Println("临时文件目录:", tempDir) + + // 创建一个临时文件 + yesterday := utils.BeginOfYesterday().Format(time.DateOnly) + fileName := path.Join(tempDir, fmt.Sprintf("%s.xlsx", yesterday)) + //defer os.Remove(fileName) // 确保程序结束后删除临时文件 + err = f.SaveAs(fileName) + if err != nil { + log.Error("InnerServerMonthStat SaveAs ", log.Any("err", err)) + return err + } + // 发送文件 + if cmd != nil { + err = cmd.SendFile("天宇公司综合日报", fileName) + } else { + if statg.RchssendBot != nil { + err = statg.RchssendBot.Sendrchstochat("天宇公司综合日报", fileName, tgbot.FileTypeDocument) + if err != nil { + log.Error("InnerServerMonthStat", log.Any("Sendrchstochat", err)) + } + } + } + return err +} + +func SetAppData(f *excelize.File, info *proto.InnerDailyRecharge, row, col int, headStyle int) error { + cellday, serr := utils.CoordinatesToCellName(col, row) + if serr != nil { + log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr)) + return serr + } + cellregister, serr := utils.CoordinatesToCellName(col+1, row) + if serr != nil { + log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr)) + return serr + } + cellrecharge, serr := utils.CoordinatesToCellName(col+2, row) + if serr != nil { + log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + cellgame, serr := utils.CoordinatesToCellName(col+3, row) + if serr != nil { + log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + cellorder, serr := utils.CoordinatesToCellName(col+4, row) + if serr != nil { + log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr)) + + return serr + } + + f.SetCellStyle(sheetName, cellday, cellday, headStyle) + totalamount := fmt.Sprintf("%.2f", float64(info.DailyVistCount)*0.01) + f.SetCellValue(sheetName, cellday, totalamount) + + f.SetCellStyle(sheetName, cellregister, cellregister, headStyle) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyRegister)*0.01) + f.SetCellValue(sheetName, cellregister, totalamount) + + f.SetCellStyle(sheetName, cellrecharge, cellrecharge, headStyle) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyAppAmount)*0.0001) + f.SetCellValue(sheetName, cellrecharge, totalamount) + + if info.AppId == 0 || info.AppId == 888 { + f.SetCellStyle(sheetName, cellgame, cellgame, headStyle) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyGameAmount)*0.0001) + f.SetCellValue(sheetName, cellgame, totalamount) + } + + f.SetCellStyle(sheetName, cellorder, cellorder, headStyle) + totalamount = fmt.Sprintf("%.2f", float64(info.RechargeOrder)*0.01) + f.SetCellValue(sheetName, cellorder, totalamount) + + return nil +} + +func GetDailyStatList(ctx context.Context, day *time.Time, yesterday *time.Time) ( + []*dailystatmod.DailyStatMod, map[int32]*appInfoMod.AppInfo, error) { + list := make([]*dailystatmod.DailyStatMod, 0) + appinfo, serr := appInfoMod.GetAllAppIdMap(ctx, bson.M{}) + if serr != nil { + log.Error("InnerServerDailyStat appInfoMod.GetAllAppInfo", log.Any("serr", serr)) + return nil, nil, serr + } + for _, info := range appinfo { + rechargelist, serr := dailystatmod.GetDailyStatTotalList(ctx, &info.AppId, yesterday, day) + if serr != nil { + log.Error("InnerServerDailyStat dailystatmod.GetDailyStatTotalList", log.Any("serr", serr)) + continue + } + if rechargelist != nil { + list = append(list, rechargelist...) + } else { + log.Error("InnerServerDailyStat rechargelist nil") + } + } + return list, appinfo, nil +} + +type appDailyDataStat struct { + AppName string `json:"appName"` // 产品名称 + AppId int32 `json:"appId"` // 产品Id + SumDate time.Time `json:"sumDate"` // 日期 + Type string `json:"type"` // 产品类型,pay:付费,free:免费 + TotalVisitCount float64 `json:"totalVisitCount"` // 日活跃 + TotalNewCount float64 `json:"totalNewCount"` // 日注册 + TotalVidAmount float64 `json:"totalVidAmount"` // 视频日充值 + TotalQpAmount float64 `json:"totalQpAmount"` // 棋牌日充值 + VipRechargeCount float64 `json:"vipRechargeCount"` // vip交易笔数 + CoinRechargeCount float64 `json:"coinRechargeCount"` // 金币交易笔数 + RechargeCount float64 `json:"rechargeCount"` // 交易总笔数 + MonthAmount float64 `json:"monthAmount"` // 当月总充值 + MonthNewCount float64 `json:"monthNewCount"` // 当月总注册 + MonthRechargeCount float64 `json:"monthRechargeCount"` // 当月总交易笔数 + MonthVisitCount float64 `json:"monthVisitCount"` // 当月总日活 +} + +func TianyuAppDailyData(ctx context.Context) ([]*appDailyDataStat, error) { + resp := make([]*appDailyDataStat, 0) + if statg.Conf.ServerIndex != statg.ServerIndexBili { + log.Error("InnerServerMonthStat serverindex", + log.Any("serverindex", statg.Conf.ServerIndex)) + return resp, nil + } + + log.Info("InnerServerMonthStat start") + now := time.Now().AddDate(0, 0, -1) + start := utils.BeginOfMonth(now) + stop := utils.BeginWithTime(now).AddDate(0, 0, 1) + + listOrg := make([]*proto.InnerDailyRecharge, 0) + for id, info := range statg.Conf.InnerServers { + req := &proto.InnerRechargeReq{ + InnerId: int32(id), + Begin: start, + End: stop, + } + url := info + "/api/stat/inner/recharge/list" + log.Info("InnerServerMonthStat", log.Any("req", url)) + res := &proto.InnerDailyRechargeResp{} + err := InnerRequest(url, req, res) + if err != nil { + log.Error("InnerServerMonthStat InnerRequest", + log.Any("InnerRequest", err)) + continue + } + if res == nil { + log.Error("InnerServerMonthStat InnerRequest data not found") + continue + } + if res.Data.List != nil && len(res.Data.List) > 0 { + listOrg = append(listOrg, res.Data.List...) + } + } + + for _, info := range listOrg { + temp := &appDailyDataStat{ + AppId: 100000 + info.AppId, + AppName: info.Name, + SumDate: info.SumDate, + TotalVisitCount: float64(info.DailyVistCount), + TotalNewCount: float64(info.DailyRegister), + TotalVidAmount: float64(info.DailyAppAmount), + TotalQpAmount: float64(info.DailyGameAmount), + RechargeCount: float64(info.RechargeOrder), + } + resp = append(resp, temp) + + } + return resp, nil +} diff --git a/service/innerserverser/innerxlsl.go b/service/innerserverser/innerxlsl.go new file mode 100644 index 0000000..a30668d --- /dev/null +++ b/service/innerserverser/innerxlsl.go @@ -0,0 +1,429 @@ +package innerserverser + +import ( + "errors" + "fmt" + "github.com/360EntSecGroup-Skylar/excelize" + "stat/api/proto" + "stat/common/log" + "stat/common/utils" + "strconv" + "time" +) + +var exportTransWaterTitle = []string{"日活跃", "日注册", "视频日充值", "棋牌日充值", "交易笔数"} + +const sheetName = "Sheet1" + +// 按字母 +func NewXlslFile(f *excelize.File, list []*proto.InnerDailyRecharge) { + // 设置表头样式 + headStyleID, _ := f.NewStyle(titlestyle) + filePath := "/usr/local" + "/bakexel/" + "vvvv.xlsx" + // 设置列宽 + f.SetColWidth("Sheet1", "A", "L", 23) + + // 设置表头行高 + //f.SetRowHeight("Sheet1", 1, 25) + f.SetCellStyle("Sheet1", "A1", "L1", headStyleID) + idx := f.NewSheet(sheetName) + f.MergeCell("Sheet1", "A1", "A2") + f.SetCellValue(sheetName, "A1", "日期") + f.SetCellStyle(sheetName, "A4", "A50", headStyleID) + f.SetActiveSheet(idx) + now := time.Now() + day := now.Format("2006-01") + begin, end := utils.MonthDateRange(now) + beginday := utils.BeginOfMonth(now).Day() + endday := utils.EndOfMonth(now).Day() + index := "A" + for i := beginday; i <= endday; i++ { + tmp := fmt.Sprintf("%s%d", index, i+2) + vvvvv := fmt.Sprintf("%s-%d", day, i) + f.SetCellValue(sheetName, tmp, vvvvv) + } + one := 'A' + begin0 := 'B' + temp0 := begin0 + pre := "" + for _, info := range list { + t0 := temp0 + countt0 := 1 + for i := 1; i < 5; i++ { + temp0 = t0 + int32(countt0) + countt0++ + if temp0 > 'Z' { + one++ + temp0 = 'A' + t0 = temp0 + countt0 = 1 + } + } + //merge := setcellindex + 5 + int32(index*5) + beginmerge := fmt.Sprintf("%s%s1", pre, string(begin0)) + if one > 'A' { + pre = string(one - 1) + } + endmerge := fmt.Sprintf("%s%s1", pre, string(temp0)) + temp0 += 2 + if temp0 > 'Z' { + one++ + temp0 = 'A' + temp0 - 'Z' - 1 + if one > 'A' { + pre = string(one - 1) + } + } + begin0 = temp0 + f.MergeCell("Sheet1", beginmerge, endmerge) + //tmp := fmt.Sprintf("%s1", string(index0)) + f.SetCellValue(sheetName, beginmerge, info.Name) + fmt.Println(beginmerge, endmerge) + } + err := f.SaveAs(filePath) + if err != nil { + fmt.Println(err) + } + fmt.Println(begin, end) +} + +// 按行列索引 +func NewXlslFile0(f *excelize.File, list []*proto.InnerDailyRecharge, titlestyle, cellstyle int) error { + // 设置列宽 + f.SetColWidth(sheetName, "A", "AAA", 19) + + // 设置表头行高 + f.SetRowHeight(sheetName, 1, 25) + f.SetCellStyle(sheetName, "A1", "ZZ1", titlestyle) + f.SetCellStyle(sheetName, "A2", "ZZ2", titlestyle) + f.SetCellStyle(sheetName, "A3", "ZZ3", titlestyle) + + idx := f.NewSheet(sheetName) + f.SetCellValue(sheetName, "A1", "日期") + f.SetActiveSheet(idx) + + now := time.Now() + dayformat := now.Format("2006-01") + + //begin, end := utils.MonthDateRange(now) + beginday := utils.BeginOfMonth(now).Day() + endday := utils.EndOfMonth(now).Day() + + //设置日期 + index := "A" + for i := beginday; i <= endday; i++ { + tmp := fmt.Sprintf("%s%d", index, i+3) + rowday := fmt.Sprintf("%s-%02d", dayformat, i) + + f.SetCellValue(sheetName, tmp, rowday) + } + + //新文件设置固定的主题和style + row := 1 + col := 2 + count := col + for _, info := range list { + begincol := count + count = count + 4 + titleindex := 0 + titlemap := make(map[string]string, 0) + for i := begincol; i <= count; i++ { + if titleindex < len(exportTransWaterTitle) { + titlecell, serr := utils.CoordinatesToCellName(begincol+titleindex, row+2) + if serr != nil { + log.Error("NewXlslFile0 CoordinatesToCellName ", log.Any("err", serr), + log.Any("title", exportTransWaterTitle[titleindex])) + return serr + } + titlemap[titlecell] = exportTransWaterTitle[titleindex] + } + titleindex++ + } + info.BeginCol = begincol + // 第一行产品 + begincell, serr := utils.CoordinatesToCellName(begincol, row) + if serr != nil { + log.Error("NewXlslFile0 CoordinatesToCellName ", log.Any("err", serr), + log.Any("infoname", info.Name)) + return serr + } + endcell, serr := utils.CoordinatesToCellName(count, row) + if serr != nil { + log.Error("NewXlslFile0 CoordinatesToCellName ", log.Any("err", serr), + log.Any("infoname", info.Name)) + return serr + } + // 第二行appid + appidbegincell, serr := utils.CoordinatesToCellName(begincol, row+1) + if serr != nil { + log.Error("NewXlslFile0 CoordinatesToCellName ", log.Any("err", serr), + log.Any("infoappid", info.AppId)) + return serr + } + appidendcell, serr := utils.CoordinatesToCellName(count, row+1) + if serr != nil { + log.Error("NewXlslFile0 CoordinatesToCellName ", log.Any("err", serr), + log.Any("infoappid", info.AppId)) + return serr + } + f.MergeCell(sheetName, begincell, endcell) + + f.MergeCell(sheetName, appidbegincell, appidendcell) + //tmp := fmt.Sprintf("%s1", string(index0)) + /*if info.AppId != 0 { + if info.AppId == 888 { + //tmp := fmt.Sprintf("%s1", string(index0)) + f.SetCellValue(sheetName, begincell, info.Name+"(集团)") + } else { + f.SetCellValue(sheetName, begincell, info.Name+"(内部)") + } + } else { + */ + f.SetCellValue(sheetName, begincell, info.Name) + //} + f.SetCellValue(sheetName, appidbegincell, info.AppId) + + //第三行app统计的信息 + for key, value := range titlemap { + //f.SetCellStyle(sheetName, key, key, cellstyle) + f.SetCellValue(sheetName, key, value) + } + count += 2 + } + return nil +} + +// 合并单元格 +func MergeCell(f *excelize.File, sheetname string, col int, list []*proto.InnerDailyRecharge) error { + row := 1 + count := col + 1 + for _, info := range list { + begincol := count + count = count + 4 + titleindex := 0 + titlemap := make(map[string]string, 0) + for i := begincol; i <= count; i++ { + if titleindex < len(exportTransWaterTitle) { + titlecell, serr := utils.CoordinatesToCellName(begincol+titleindex, row+2) + if serr != nil { + log.Error("MergeCell CoordinatesToCellName ", log.Any("err", serr), + log.Any("title", exportTransWaterTitle[titleindex])) + return serr + } + titlemap[titlecell] = exportTransWaterTitle[titleindex] + } + titleindex++ + } + begincell, serr := utils.CoordinatesToCellName(begincol, row) + if serr != nil { + log.Error("MergeCell CoordinatesToCellName ", log.Any("err", serr), + log.Any("infoname", info.Name)) + return serr + } + endcell, serr := utils.CoordinatesToCellName(count, row) + if serr != nil { + log.Error("MergeCell CoordinatesToCellName ", log.Any("err", serr), + log.Any("infoname", info.Name)) + return serr + } + // 第一行appid + appidbegincell, serr := utils.CoordinatesToCellName(begincol, row+1) + if serr != nil { + log.Error("MergeCell CoordinatesToCellName ", log.Any("err", serr), + log.Any("appid", info.AppId)) + return serr + } + appidendcell, serr := utils.CoordinatesToCellName(count, row+1) + if serr != nil { + log.Error("MergeCell CoordinatesToCellName ", log.Any("err", serr), + log.Any("appid", info.AppId)) + return serr + } + info.BeginCol = begincol + f.MergeCell(sheetname, begincell, endcell) + /*if info.AppId != 0 { + if info.AppId == 888 { + f.SetCellValue(sheetname, begincell, info.Name+"(集团)") + } else { + f.SetCellValue(sheetname, begincell, info.Name+"(内部)") + } + } else { + */ + f.SetCellValue(sheetname, begincell, info.Name) + //} + + f.MergeCell(sheetname, appidbegincell, appidendcell) + //tmp := fmt.Sprintf("%s1", string(index0)) + f.SetCellValue(sheetname, appidbegincell, info.AppId) + for key, value := range titlemap { + f.SetCellValue(sheetname, key, value) + } + count += 2 + } + + return nil +} + +func OpenOldXlsl(f *excelize.File, list []*proto.InnerDailyRecharge) error { + idx := f.GetSheetIndex(sheetName) + f.SetActiveSheet(idx) + + cols := f.GetRows(sheetName) + begincol := 0 + //查找数据开始单元格,新数据先合并单元格 + /*for rowindex, col := range cols { + for colindex, rowCell := range col { + if rowCell == "" { + continue + } + if rowindex == 1 { + for _, info := range list { + if rowCell == string(info.AppId) { + info.BeginRow = rowindex + 1 + info.BeginCol = colindex + 1 + info.IsOld = true + } + } + } + } + } + */ + + if len(cols) < 2 || len(cols[1]) < len(list) { + return errors.New("OpenOldXlsl cols < 0") + } + + /*for rowindex := 0; rowindex < len(cols); rowindex++ { + if cols[rowindex][0] != "" { + for _, info := range list { + if cols[rowindex][0] == info.DateTime { + info.BeginRow = rowindex + 1 + info.IsOld = true + } + } + } + } + */ + //旧的数据单元格开始信息 + for colindex := 0; colindex < len(cols[1]); colindex++ { + for _, info := range list { + appid := strconv.Itoa(int(info.AppId)) + if cols[1][colindex] != "" && cols[1][colindex] == appid { + info.BeginCol = colindex + 1 + info.IsOld = true + } + } + } + + //新的单元格从第几列信息 + newlist := make([]*proto.InnerDailyRecharge, 0) + for _, info := range list { + if info.IsOld { + if info.BeginCol > begincol { + begincol = info.BeginCol + } + } else { + newlist = append(newlist, info) + } + } + if len(newlist) > 0 { + serr := MergeCell(f, sheetName, begincol+5, newlist) + if serr != nil { + log.Error("OpenOldXlsl MergeCell ", log.Any("err", serr)) + return serr + } + } + + return nil +} + +func NewXlslFile2(f *excelize.File, list []*AppInformation, titlestyle, cellstyle int, now time.Time) error { + // 设置列宽 + f.SetColWidth(sheetName, "A", "AAA", 19) + + // 设置表头行高 + f.SetRowHeight(sheetName, 1, 25) + f.SetCellStyle(sheetName, "A1", "ZZ1", titlestyle) + f.SetCellStyle(sheetName, "A2", "ZZ2", titlestyle) + f.SetCellStyle(sheetName, "A3", "ZZ3", titlestyle) + + idx := f.NewSheet(sheetName) + f.SetCellValue(sheetName, "A1", "日期") + f.SetActiveSheet(idx) + + dayformat := now.Format("2006-01") + + //begin, end := utils.MonthDateRange(now) + beginday := utils.BeginOfMonth(now).Day() + endday := utils.EndOfMonth(now).Day() + + //设置日期 + index := "A" + for i := beginday; i <= endday; i++ { + tmp := fmt.Sprintf("%s%d", index, i+3) + rowday := fmt.Sprintf("%s-%02d", dayformat, i) + f.SetCellValue(sheetName, tmp, rowday) + } + // 设置汇总 + tmp := fmt.Sprintf("%s%d", index, endday+1+3) + f.SetCellValue(sheetName, tmp, "汇总") + + //新文件设置固定的主题和style + row := 1 + col := 2 + count := col + for _, info := range list { + begincol := count + count = count + 4 + titleindex := 0 + titlemap := make(map[string]string, 0) + for i := begincol; i <= count; i++ { + if titleindex < len(exportTransWaterTitle) { + titlecell, serr := utils.CoordinatesToCellName(begincol+titleindex, row+2) + if serr != nil { + log.Error("NewXlslFile0 CoordinatesToCellName ", log.Any("err", serr), + log.Any("title", exportTransWaterTitle[titleindex])) + return serr + } + titlemap[titlecell] = exportTransWaterTitle[titleindex] + } + titleindex++ + } + info.BeginCol = begincol + // 第一行产品 + begincell, serr := utils.CoordinatesToCellName(begincol, row) + if serr != nil { + log.Error("NewXlslFile0 CoordinatesToCellName ", log.Any("err", serr), + log.Any("infoname", info.Name)) + return serr + } + endcell, serr := utils.CoordinatesToCellName(count, row) + if serr != nil { + log.Error("NewXlslFile0 CoordinatesToCellName ", log.Any("err", serr), + log.Any("infoname", info.Name)) + return serr + } + // 第二行appid + appidbegincell, serr := utils.CoordinatesToCellName(begincol, row+1) + if serr != nil { + log.Error("NewXlslFile0 CoordinatesToCellName ", log.Any("err", serr), + log.Any("infoappid", info.Id)) + return serr + } + appidendcell, serr := utils.CoordinatesToCellName(count, row+1) + if serr != nil { + log.Error("NewXlslFile0 CoordinatesToCellName ", log.Any("err", serr), + log.Any("infoappid", info.Id)) + return serr + } + f.MergeCell(sheetName, begincell, endcell) + f.MergeCell(sheetName, appidbegincell, appidendcell) + f.SetCellValue(sheetName, begincell, info.Name) + f.SetCellValue(sheetName, appidbegincell, info.Id) + //第三行app统计的信息 + for key, value := range titlemap { + f.SetCellValue(sheetName, key, value) + } + count += 2 + } + return nil +} diff --git a/service/innerserverser/xlsl_test.go b/service/innerserverser/xlsl_test.go new file mode 100644 index 0000000..08e1d85 --- /dev/null +++ b/service/innerserverser/xlsl_test.go @@ -0,0 +1,189 @@ +package innerserverser + +import ( + "context" + "fmt" + "github.com/360EntSecGroup-Skylar/excelize" + "os" + "stat/api/proto" + "stat/common/log" + "stat/common/utils" + "stat/tool/pubtest" + "testing" +) + +func TestExel1(t *testing.T) { + var f *excelize.File + newxlslfile := false + day0 := utils.BeginOfYesterday() + dir := day0.Format("2006-01") + filePath := "/usr/local" + "/bakmonth/" + dir + "/" + //filename := utils.BeginOfYesterday().Format("2006-01-02") + if !DocExsit(filePath) { + err := os.MkdirAll(filePath, os.ModePerm) + if err != nil { + log.Error("InnerServerDailyStat:export save file to disk failed", + log.Any("fileName", filePath), + log.E(err)) + return + } + f = excelize.NewFile() + newxlslfile = true + } else { + if !DocExsit(filePath + dir + ".xlsx") { + f = excelize.NewFile() + newxlslfile = true + } else { + f, _ = excelize.OpenFile(filePath + dir + ".xlsx") + } + } + + // 设置表头样式 + headStyleID, _ := f.NewStyle(`{ + "font":{ + "color":"#333333", + "bold":true, + "size":16, + "family":"arial" + }, + "alignment":{ + "vertical":"center", + "horizontal":"center", + "wrap_text":true + } + }`) + + headStyleID0, _ := f.NewStyle(`{ + "font":{ + "color":"#333333", + "bold":false, + "size":10, + "family":"arial" + }, + "alignment":{ + "vertical":"center", + "horizontal":"center", + "wrap_text":true + } + }`) + pubtest.TestInit("/Users/mac/Desktop/madou/stat_center") + ctx := context.Background() + list := make([]*proto.InnerDailyRecharge, 0) + yesterday := utils.BeginOfYesterday0() + bililist, appinfo, err := GetDbList(ctx, &day0, &yesterday) + if err != nil { + log.Error("InnerServerDailyStat:GetDbList", log.E(err)) + } + + for _, info := range bililist { + name := "" + if data, ok := appinfo[info.AppId]; ok { + name = data.Name + } + temp := &proto.InnerDailyRecharge{ + AppId: info.AppId, + Name: name, + Type: "", + DateTime: "", + DailyVistCount: info.TotalVisitCount, + DailyRegister: info.NewTotalCount, + DailyAppAmount: info.TotalAmount, + DailyGameAmount: info.GameRechageAmount, + RechargeOrder: info.SuccessRechargeOrder, + } + list = append(list, temp) + } + + temp := &proto.InnerDailyRecharge{} + for _, info := range list { + temp.AppId = 0 + temp.Name = "天宇总充值" + temp.DailyVistCount += info.DailyVistCount + temp.DailyRegister += info.DailyRegister + temp.DailyAppAmount += info.DailyAppAmount + temp.DailyGameAmount += info.DailyGameAmount + temp.RechargeOrder += info.RechargeOrder + } + list = append(list, temp) + for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 { + list[i], list[j] = list[j], list[i] + } + + if newxlslfile { + NewXlslFile0(f, list, headStyleID, headStyleID0) + } else { + OpenOldXlsl(f, list) + } + + row := 1 + day := yesterday.Format("2006-01-02") + cols := f.GetRows("Sheet1") + for rowindex, col := range cols { + for colindex, rowCell := range col { + if rowCell == "" { + continue + } + if colindex == 0 { + if rowCell == day { + row = rowindex + } + } + } + } + + for _, info := range list { + cellday, serr := utils.CoordinatesToCellName(info.BeginCol, row) + if serr != nil { + log.Error("OpenOldXlsl CoordinatesToCellName ", log.Any("err", serr)) + continue + } + cellregister, serr := utils.CoordinatesToCellName(info.BeginCol+1, row) + if serr != nil { + log.Error("OpenOldXlsl CoordinatesToCellName ", log.Any("err", serr)) + continue + } + cellrecharge, serr := utils.CoordinatesToCellName(info.BeginCol+2, row) + if serr != nil { + log.Error("OpenOldXlsl CoordinatesToCellName ", log.Any("err", serr)) + continue + } + cellgame, serr := utils.CoordinatesToCellName(info.BeginCol+3, row) + if serr != nil { + log.Error("OpenOldXlsl CoordinatesToCellName ", log.Any("err", serr)) + continue + } + cellorder, serr := utils.CoordinatesToCellName(info.BeginCol+4, row) + if serr != nil { + log.Error("OpenOldXlsl CoordinatesToCellName ", log.Any("err", serr)) + continue + } + + f.SetCellStyle("Sheet1", cellday, cellday, headStyleID0) + totalamount := fmt.Sprintf("%.2f", float64(info.DailyVistCount)*0.01) + f.SetCellValue("Sheet1", cellday, totalamount) + f.SetCellStyle("Sheet1", cellregister, cellday, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyRegister)*0.01) + f.SetCellValue("Sheet1", cellregister, totalamount) + f.SetCellStyle("Sheet1", cellrecharge, cellday, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.DailyAppAmount)*0.0001) + f.SetCellValue("Sheet1", cellrecharge, totalamount) + f.SetCellStyle("Sheet1", cellgame, cellday, headStyleID0) + if info.AppId == 0 || info.AppId == 888 { + totalamount = fmt.Sprintf("%.2f", float64(info.DailyGameAmount)*0.0001) + } + f.SetCellValue("Sheet1", cellgame, totalamount) + f.SetCellStyle("Sheet1", cellorder, cellday, headStyleID0) + totalamount = fmt.Sprintf("%.2f", float64(info.RechargeOrder)*0.01) + f.SetCellValue("Sheet1", cellorder, totalamount) + } + if newxlslfile { + f.SaveAs(filePath + dir + ".xlsx") + } else { + f.Save() + } +} + +func TestExel0(t *testing.T) { + rowday := fmt.Sprintf("%s-%02d", "", 9) + fmt.Println(rowday) +} diff --git a/service/landpageSer/web.go b/service/landpageSer/web.go new file mode 100644 index 0000000..11bf250 --- /dev/null +++ b/service/landpageSer/web.go @@ -0,0 +1,214 @@ +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 +} diff --git a/service/mediatagSer/mediatag.go b/service/mediatagSer/mediatag.go new file mode 100644 index 0000000..ddbd385 --- /dev/null +++ b/service/mediatagSer/mediatag.go @@ -0,0 +1,90 @@ +package mediatagSer + +import ( + "context" + "stat/api/proto" + "stat/models/mediatag" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func MediaTag(ctx context.Context, req *proto.MediaTagSearch) (resp *proto.MediaTagSearchResp, err error) { + resp = &proto.MediaTagSearchResp{} + + filter := bson.M{} + opt := &options.FindOptions{} + + if req.Status != nil { + filter[mediatag.FN.MediaTag.Status] = *req.Status + } + if req.Name != nil { + filter[mediatag.FN.MediaTag.Name] = *req.Name + } + if req.Type != nil { + filter[mediatag.FN.MediaTag.Type] = *req.Type + } + opt.SetSort(bson.M{mediatag.FN.MediaTag.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + resp.Total, err = mediatag.CountMediaTags(ctx, filter) + if err != nil { + return nil, err + } + if resp.Total == 0 { + return resp, nil + } + MediaTagList, serr := mediatag.FindManyMediaTag(ctx, filter, opt) + if serr != nil { + return nil, serr + } + resp.List = MediaTagList + return +} + +func AddMediaTag(ctx context.Context, req *proto.MediaTagAddReq) error { + now := time.Now() + req.CreatedAt = now + req.UpdatedAt = now + + serr := mediatag.InsertOneMediaTag(ctx, &req.MediaTag) + if serr != nil { + return serr + } + return nil +} +func DelMediaTag(ctx context.Context, id string) error { + objectId, err := primitive.ObjectIDFromHex(id) + if err != nil { + return err + } + + adFilter := bson.M{mediatag.FN.MediaTag.ID: objectId} + //删除 + _, serr := mediatag.DelOneMediaTag(ctx, adFilter) + if serr != nil { + return serr + } + + return nil +} + +func UpdateMediaTag(ctx context.Context, req *proto.MediaTagUpdateReq) error { + now := time.Now() + req.Param.UpdatedAt = &now + objectId, err := primitive.ObjectIDFromHex(req.Id) + if err != nil { + return err + } + + adFilter := bson.M{mediatag.FN.MediaTag.ID: objectId} + updateDoc := bson.M{"$set": req.Param} + serr := mediatag.UpdateOneMediaTag(ctx, adFilter, updateDoc) + if serr != nil { + return serr + } + return nil +} diff --git a/service/monitorSer/monitor.go b/service/monitorSer/monitor.go new file mode 100644 index 0000000..af21fe0 --- /dev/null +++ b/service/monitorSer/monitor.go @@ -0,0 +1,90 @@ +package monitorSer + +import ( + "context" + "stat/api/proto" + "stat/models/monitormod" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func SearchMonitor(ctx context.Context, req *proto.MonitorSearch) (resp *proto.MonitorSearchResp, err error) { + resp = &proto.MonitorSearchResp{} + + filter := bson.M{} + opt := &options.FindOptions{} + + if req.Status != nil { + filter[monitormod.FN.Monitor.Status] = *req.Status + } + if req.Name != nil { + filter[monitormod.FN.Monitor.Name] = bson.M{"$regex": *req.Name} + } + if req.Category != nil { + filter[monitormod.FN.Monitor.Category] = *req.Category + } + opt.SetSort(bson.M{monitormod.FN.Monitor.CreatedAt: -1}) + opt.SetSkip((req.PageNum - 1) * req.PageSize) + opt.SetLimit(req.PageSize) + + resp.Total, err = monitormod.CountMonitors(ctx, filter) + if err != nil { + return nil, err + } + if resp.Total == 0 { + return resp, nil + } + MonitorList, serr := monitormod.FindManyMonitor(ctx, filter, opt) + if serr != nil { + return nil, serr + } + resp.List = MonitorList + return +} + +func AddMonitor(ctx context.Context, req *proto.MonitorAddReq) error { + now := time.Now() + req.CreatedAt = now + req.UpdatedAt = now + + serr := monitormod.InsertOneMonitor(ctx, &req.Monitor) + if serr != nil { + return serr + } + return nil +} +func DelMonitor(ctx context.Context, id string) error { + objectId, err := primitive.ObjectIDFromHex(id) + if err != nil { + return err + } + + adFilter := bson.M{monitormod.FN.Monitor.ID: objectId} + //删除 + _, serr := monitormod.DelOneMonitor(ctx, adFilter) + if serr != nil { + return serr + } + + return nil +} + +func UpdateMonitor(ctx context.Context, req *proto.MonitorUpdateReq) error { + now := time.Now() + req.Param.UpdatedAt = &now + objectId, err := primitive.ObjectIDFromHex(req.Id) + if err != nil { + return err + } + + adFilter := bson.M{monitormod.FN.Monitor.ID: objectId} + updateDoc := bson.M{"$set": req.Param} + serr := monitormod.UpdateOneMonitor(ctx, adFilter, updateDoc) + if serr != nil { + return serr + } + return nil +} diff --git a/service/monitorSer/service.go b/service/monitorSer/service.go new file mode 100644 index 0000000..143ed4f --- /dev/null +++ b/service/monitorSer/service.go @@ -0,0 +1,29 @@ +package monitorSer + +import ( + "github.com/robfig/cron/v3" + "stat/common/log" + "stat/common/statutils" +) + +var ( + auto *cron.Cron +) + +func init() { + auto = cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(&log.Logger{}))) // 秒级定时任务 +} + +func InitMonitor() { + _, _ = auto.AddFunc("0 1 * * * ?", func() { + statutils.ServerMon.RunWithName(func() error { + return MonitorCheck() + }, statutils.GetFuncName(MonitorCheck)) + }) + + auto.Start() +} + +func MonitorCheck() error { + return nil +} diff --git a/service/opLogSer/opLog.go b/service/opLogSer/opLog.go new file mode 100644 index 0000000..522099c --- /dev/null +++ b/service/opLogSer/opLog.go @@ -0,0 +1,63 @@ +package opLogSer + +import ( + "context" + "encoding/json" + "github.com/gin-gonic/gin" + "stat/api/proto" + "stat/common" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/opLogMod" + "time" +) + +// 添加操作日志 +func AddOpLog(ctx *gin.Context, account string, isAdmin bool, opData interface{}) { + common.Go(func() { + now := time.Now() + opDataStr, _ := json.Marshal(opData) + + doc := opLogMod.OpLog{ + Operator: account, + Router: ctx.Request.RequestURI, + Data: string(opDataStr), + IsAdmin: isAdmin, + CreatedAt: now, + } + + _ = opLogMod.AddOpLog(ctx, &doc) + }) +} + +func GetOpLogList(ctx context.Context, param proto.ListOpLogReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListOpLogRes{ + Total: 0, + List: make([]proto.OpLogInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + total, opList, err := opLogMod.GetOpLogList(ctx, param.Operator, param.Router, param.IsAdmin, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range opList { + tmp := proto.OpLogInfo{ + Operator: v.Operator, + Router: v.Router, + Data: v.Data, + IsAdmin: v.IsAdmin, + CreatedAt: v.CreatedAt, + } + + resp.List = append(resp.List, tmp) + } + + resp.Total = total + + data = resp + code = stdLog.Success + return +} diff --git a/service/smsser/smsser.go b/service/smsser/smsser.go new file mode 100644 index 0000000..cc92654 --- /dev/null +++ b/service/smsser/smsser.go @@ -0,0 +1,69 @@ +package smsser + +import ( + "fmt" + "time" + + "stat/common/log" + "stat/common/redis" + "stat/common/sms" + "stat/common/utils" +) + +const ( + CaptchaLen = 6 + MobileCaptchaExpire = 5 * time.Minute +) + +// SendSmsCode 发送验证码 +func SendSmsCode(mobile string) error { + code := utils.RandDigits(CaptchaLen) + //fmt.Println(code) + redisKey := fmt.Sprintf("captcha:mobile:%s", mobile) + err := redis.StatRds.Set(redisKey, code, MobileCaptchaExpire) + if err != nil { + log.Error("SendCaptcha Save Redis error", log.Any("mobile", mobile), log.E(err)) + return err + } + + err = sms.Send(sms.FengNiao, mobile, code) + if err != nil { + log.Error("SendCaptcha send err", log.Any("mobile", mobile), log.Any("Platform", sms.FengNiao), log.E(err)) + yunErr := sms.Send(sms.YunPian, mobile, code) + if yunErr != nil { + log.Error("SendCaptcha send err", log.Any("mobile", mobile), log.Any("Platform", sms.YunPian), log.E(err)) + return err + } + } + return nil +} + +// VerifySmsCode 验证验证码 +func VerifySmsCode(mobile string, code string) error { + redisKey := fmt.Sprintf("captcha:mobile:%s", mobile) + redisCode, err := redis.StatRds.Get(redisKey) + if err != nil { + log.Error("VerifySmsCode redis get err", log.E(err)) + return err + } + if redisCode != nil && *redisCode == code { + return nil + } else { + log.Info("VerifySmsCode miss", log.Any("mobile", mobile), log.Any("code", code), log.Any("redisCode", redisCode)) + return fmt.Errorf("VerifySmsCode miss") + } +} + +func GetSmsCode(mobile string) (string, error) { + redisKey := fmt.Sprintf("captcha:mobile:%s", mobile) + redisCode, err := redis.StatRds.Get(redisKey) + if err != nil { + log.Error("VerifySmsCode redis get err", log.E(err)) + return "", err + } + if redisCode != nil { + return *redisCode, nil + } else { + return "", nil + } +} diff --git a/service/srv_appcategory/appcategory.go b/service/srv_appcategory/appcategory.go new file mode 100644 index 0000000..8f21c32 --- /dev/null +++ b/service/srv_appcategory/appcategory.go @@ -0,0 +1,98 @@ +package srv_appcategory + +import ( + "context" + "stat/common/genId" + "stat/common/stdLog" + "stat/models/appcategory" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// GetAppCategory 按照参数搜索 +func GetAppCategory(ctx context.Context, param *AppCategorySearch) (*AppCategorySearchResp, *stdLog.SrvErr) { + filter := bson.M{} + opt := &options.FindOptions{} + resp := &AppCategorySearchResp{ + List: make(appcategory.AppCategoryList, 0), + Total: 0, + } + opt.SetSort(bson.M{"rank": 1}) + opt.SetSkip((param.PageNum - 1) * param.PageSize) + opt.SetLimit(param.PageSize) + + if param.ParentAppId != nil { + filter["parentAppId"] = param.ParentAppId + } + + total, serr := appcategory.CountAppCategories(ctx, filter) + if serr != nil { + return resp, serr + } + if total == 0 { + return resp, nil + } + + list, serr := appcategory.FindManyAppCategory(ctx, filter, opt) + if serr != nil { + return resp, serr + } + if list != nil && len(list) > 0 { + resp.List = list + resp.Total = total + } + + return resp, nil +} + +// AddAppCategory 添加一个 +func AddAppCategory(ctx context.Context, + ac *appcategory.AppCategory) *stdLog.SrvErr { + + now := time.Now() + ac.Id = genId.GetAppCategoryId() + ac.CreatedAt = now + ac.UpdatedAt = now + + if ac.Name == "" { + return stdLog.New(stdLog.ParamError, "", "name不能传空") + } + _, serr := appcategory.FindOneAppCategory(ctx, bson.M{"name": ac.Name}) + if serr == nil { + return stdLog.New(stdLog.ParamError, "", "name重名") + } + + serr = appcategory.InsertOneAppCategory(ctx, ac) + if serr != nil { + return serr + } + return nil +} + +// DelAppCategory 删除指定 +func DelAppCategory(ctx context.Context, id int64) *stdLog.SrvErr { + adFilter := bson.M{"_id": id} + //删除 + _, serr := appcategory.DelOneAppCategory(ctx, adFilter) + if serr != nil { + return serr + } + return nil +} + +// UpdateAppCategory 更新指定 +func UpdateAppCategory(ctx context.Context, id int64, + info *AppCategoryUpdate) *stdLog.SrvErr { + now := time.Now() + info.UpdatedAt = &now + + adFilter := bson.M{"_id": id} + updateDoc := bson.M{"$set": info} + serr := appcategory.UpdateOneAppCategory(ctx, adFilter, updateDoc) + if serr != nil { + return serr + } + return nil +} diff --git a/service/srv_appcategory/define.go b/service/srv_appcategory/define.go new file mode 100644 index 0000000..4377a54 --- /dev/null +++ b/service/srv_appcategory/define.go @@ -0,0 +1,37 @@ +package srv_appcategory + +import ( + "stat/common" + "stat/models/appcategory" + "time" +) + +// AppCategorySearch +type AppCategorySearch struct { + ParentAppId *int64 `json:"parentAppId" bson:"parentAppId"` + common.Page +} + +type AppCategorySearchResp struct { + Total int64 `json:"total"` + List appcategory.AppCategoryList `json:"list"` +} + +type AppCategoryUpdate struct { + ParentAppId *int64 `json:"parentAppId" bson:"parentAppId"` + Name *string `json:"name" bson:"name,omitempty"` // 名称 + Desc *string `json:"desc" bson:"desc,omitempty"` // 描述 + Status *bool `json:"status" bson:"status,omitempty"` // 状态 + Rank *int64 `json:"rank" bson:"rank,omitempty"` // 应用排序 + UpdatedAt *time.Time `json:"updatedAt" bson:"updatedAt,omitempty"` // 更新时间 + ImgType *int64 `json:"imgType" bson:"imgType,omitempty"` // 图片展示类型 0:应用图标 1.小图标 2.大图标 +} + +type AppCategoryUpdateReq struct { + Param AppCategoryUpdate `json:"param" bson:"param"` // 参数 + Id int64 `json:"id" bson:"_id,omitempty"` +} + +type AppCategoryDelReq struct { + Id int64 `json:"id" bson:"_id,omitempty"` +} diff --git a/service/srv_applicationstat/applicationstat.go b/service/srv_applicationstat/applicationstat.go new file mode 100644 index 0000000..02f9076 --- /dev/null +++ b/service/srv_applicationstat/applicationstat.go @@ -0,0 +1,191 @@ +package srv_applicationstat + +import ( + "context" + "stat/common/stdLog" + "stat/models/applicationmod" + "stat/models/applicationstat" + + "go.mongodb.org/mongo-driver/mongo/options" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// GetAppStatList 获取应用统计列表 +func GetAppStatList(ctx context.Context, param *GetApplicationStatReq) (*GetApplicationStatResp, *stdLog.SrvErr) { + resp := &GetApplicationStatResp{} + //先获取app列表 + appFilter := bson.M{} + statFilter := bson.M{} + if param.ParentAppId != nil { + appFilter["parentAppId"] = bson.M{"$in": *param.ParentAppId} + } + if param.ApplicationId != nil { + appFilter["_id"] = *param.ApplicationId + } + if param.ApplicationName != nil { + appFilter["name"] = *param.ApplicationName + } + appList, sErr := applicationmod.FindManyApplication(ctx, appFilter) + if sErr != nil { + return nil, sErr + } + applicationId := make([]primitive.ObjectID, 0) + for _, info := range appList { + applicationId = append(applicationId, info.Id) + } + statFilter["applicationDbId"] = bson.M{"$in": applicationId} + if param.Start != nil || param.End != nil { + statFilter[applicationstat.FN.ApplicationStat.SumData] = bson.M{"$gte": *param.Start, "$lte": *param.End} + } + + opt := &options.FindOptions{} + opt.SetSort(bson.M{applicationstat.FN.ApplicationStat.SumData: -1}) + opt.SetLimit(param.PageSize) + opt.SetSkip((param.PageNum - 1) * param.PageSize) + + totalStats, sErr := applicationstat.FindManyApplicationStat(ctx, statFilter) + if sErr != nil { + return nil, sErr + } + + pageStats, sErr := applicationstat.FindManyApplicationStat(ctx, statFilter, opt) + if sErr != nil { + return nil, sErr + } + + appDict := make(map[primitive.ObjectID]*applicationmod.Application) + for _, app := range appList { + appDict[app.Id] = app + } + + for _, stat := range totalStats { + resp.Summary.TotalClick += stat.Total + } + + for _, stat := range pageStats { + name := "" + parentAppId := int64(0) + app := appDict[stat.ApplicationDbId] + if app != nil { + name = app.Name + parentAppId = app.ParentAppId + } + hours := make([]int64, 24) + for hour := range hours { + hours[hour] = stat.HourData[hour] + } + doc := &AppStatInfo{ + Id: stat.Id, + ApplicationDbId: stat.ApplicationDbId, + ParentAppId: parentAppId, + AppName: name, + SumDate: stat.SumDate, + Total: stat.Total, + HourData: hours, + CreatedAt: stat.CreatedAt, + UpdatedAt: stat.UpdatedAt, + } + resp.List = append(resp.List, doc) + } + + resp.Total = int64(len(totalStats)) + return resp, nil +} + +// GetAppStatList 获取应用统计列表 +func GetAppTotalStatList(ctx context.Context, param *GetApplicationStatTotalReq) (*GetApplicationStatTotalResp, *stdLog.SrvErr) { + resp := &GetApplicationStatTotalResp{ + List: make([]*AppStatTotalInfo, 0), + } + + //先获取app列表 + appFilter := bson.M{} + if param.ParentAppId != nil { + appFilter["parentAppId"] = bson.M{"$in": *param.ParentAppId} + } + if param.ApplicationId != nil { + appFilter["_id"] = *param.ApplicationId + } + if param.ApplicationName != nil { + appFilter["name"] = *param.ApplicationName + } + appList, sErr := applicationmod.FindManyApplication(ctx, appFilter) + + if sErr != nil { + return nil, sErr + } + + applicationId := make([]primitive.ObjectID, 0) + appid := make(map[primitive.ObjectID]*applicationmod.Application) + for _, info := range appList { + applicationId = append(applicationId, info.Id) + appid[info.Id] = info + } + + filter := bson.M{} + filter["applicationDbId"] = bson.M{"$in": applicationId} + + if param.Start != nil && param.End != nil { + filter[applicationstat.FN.ApplicationStat.SumData] = bson.M{"$gte": *param.Start, "$lte": *param.End} + } + + pipeline := []bson.M{ + { + "$match": filter, + }, + { + "$group": bson.M{ + "_id": "$applicationDbId", + "total": bson.M{"$sum": "$total"}, + }, + }, + {"$sort": bson.D{{Key: "_id", Value: -1}}}, + } + + list := make([]StatTotalInfo, 0) + serr := applicationstat.AggregateApplicationStat(ctx, &list, pipeline) + + pipeline = []bson.M{ + { + "$match": filter, + }, + { + "$group": bson.M{ + "_id": "$applicationDbId", + "total": bson.M{"$sum": "$total"}, + }, + }, + {"$sort": bson.D{{Key: "_id", Value: -1}}}, + {"$skip": (param.PageNum - 1) * param.PageSize}, + {"$limit": param.PageSize}, + } + info := make([]StatTotalInfo, 0) + serr = applicationstat.AggregateApplicationStat(ctx, &info, pipeline) + if serr != nil { + return nil, serr + } + + if len(list) > 0 { + for _, app := range list { + resp.Summary.TotalClick += app.Total + } + } + + if len(info) > 0 { + for _, app := range info { + tmp := &AppStatTotalInfo{ + Id: app.Id, + Total: app.Total, + } + if value, ok := appid[app.Id]; ok { + tmp.ParentAppId = value.ParentAppId + tmp.AppName = value.Name + } + resp.List = append(resp.List, tmp) + } + } + resp.Total = int64(len(list)) + return resp, nil +} diff --git a/service/srv_applicationstat/define.go b/service/srv_applicationstat/define.go new file mode 100644 index 0000000..503a9f6 --- /dev/null +++ b/service/srv_applicationstat/define.go @@ -0,0 +1,67 @@ +package srv_applicationstat + +import ( + "stat/common" + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type AppStatSummary struct { + TotalClick int64 `json:"totalClick"` // 总点击 +} + +type AppStatInfo struct { + Id primitive.ObjectID `json:"id" bson:"_id,omitempty"` + ApplicationDbId primitive.ObjectID `json:"applicationDbId" bson:"applicationDbId"` //应用ID + ParentAppId int64 `json:"parentAppId" bson:"parentAppId"` //所属应用ID + AppName string `json:"appName" bson:"appName"` //应用名称 + 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"` //更新时间 +} + +// GetApplicationStatReq 获取app点击统计请求 +type GetApplicationStatReq struct { + common.Page + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + ParentAppId *[]int64 `json:"parentAppId"` // 所属应用ID + ApplicationId *primitive.ObjectID `json:"applicationId"` // 应用ID + ApplicationName *string `json:"applicationName"` // 应用名称 +} + +type GetApplicationStatResp struct { + Total int64 `json:"total"` + List []*AppStatInfo `json:"list"` + Summary AppStatSummary `json:"summary"` +} + +// GetApplicationStatReq 获取app点击统计请求 +type GetApplicationStatTotalReq struct { + common.Page + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 + ParentAppId *[]int64 `json:"parentAppId"` // 所属应用ID + ApplicationId *primitive.ObjectID `json:"applicationId"` // 应用ID + ApplicationName *string `json:"applicationName"` // 应用名称 +} + +type AppStatTotalInfo struct { + Id primitive.ObjectID `json:"id" bson:"id"` //应用ID + ParentAppId int64 `json:"parentAppId" bson:"parentAppId"` //所属应用ID + AppName string `json:"appName" bson:"appName"` //应用名称 + Total int64 `json:"total" bson:"total"` //总次数 +} +type StatTotalInfo struct { + Id primitive.ObjectID `json:"id" bson:"_id,omitempty"` //应用ID + Total int64 `json:"total"` //总次数 +} + +type GetApplicationStatTotalResp struct { + Total int64 `json:"total"` + List []*AppStatTotalInfo `json:"list"` + Summary AppStatSummary `json:"summary"` +} diff --git a/service/statSer/channelCodeStat.go b/service/statSer/channelCodeStat.go new file mode 100644 index 0000000..6d3d647 --- /dev/null +++ b/service/statSer/channelCodeStat.go @@ -0,0 +1,717 @@ +package statSer + +import ( + "context" + "fmt" + "os" + "path" + "sort" + "stat/api/proto" + "stat/common/log" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/channelCodeBlocStatMod" + "stat/models/channelmod" + "time" + + "github.com/360EntSecGroup-Skylar/excelize" + "go.mongodb.org/mongo-driver/bson" +) + +// // 获取渠道码统计信息列表 +// func ListChannelCodeStat(ctx context.Context, param proto.ListChannelCodeStatReq) (code stdLog.CodeType, data interface{}, err error) { +// resp := proto.ListChannelCodeStatRes{ +// Total: 0, +// List: make([]proto.ChannelCodeStatInfo, 0), +// } + +// // 获取需要过滤的渠道信息 +// channels1 := make([]string, 0) +// if param.Channel != nil { +// // 获取渠道信息 +// channelInfo, err := channelmod.GetChannelInfoByChannel(ctx, *param.Channel) +// if err != nil { +// code = stdLog.ChannelNotExists +// return code, data, err +// } + +// if channelInfo.Channel == "" { +// code = stdLog.Success +// return code, resp, nil +// } + +// // 获取子渠道 +// if channelInfo.ParentChannel == "" { +// chList, err := channelmod.GetAllChildChannel(ctx, channelInfo.Channel) +// if err != nil { +// code = stdLog.Failure +// return code, data, err +// } + +// for _, v := range chList { +// channels1 = append(channels1, v.Channel) +// } + +// } + +// channels1 = append(channels1, channelInfo.Channel) +// } + +// channels2 := make([]string, 0) +// // 根据渠道备注,获取渠道信息 +// if param.ChannelRemark != nil { +// // 获取渠道 +// chList, err := channelmod.GetChannelByRemark(ctx, *param.ChannelRemark) +// if err != nil { +// code = stdLog.Failure +// return code, data, err +// } + +// if len(chList) == 0 { +// code = stdLog.Success +// return code, resp, nil +// } + +// for _, v1 := range chList { +// // 获取子渠道 +// if v1.ParentChannel == "" && len(v1.Channel) > 0 { +// chList, err := channelmod.GetAllChildChannel(ctx, v1.Channel) +// if err != nil { +// code = stdLog.Failure +// return code, data, err +// } + +// for _, v2 := range chList { +// channels2 = append(channels2, v2.Channel) +// } + +// } + +// channels2 = append(channels2, v1.Channel) +// } +// } + +// channels := make([]string, 0) +// // 合并 +// if param.Channel != nil && param.ChannelRemark != nil { +// for _, ch1 := range channels1 { +// for _, ch2 := range channels2 { +// if ch1 == ch2 { +// channels = append(channels, ch1) +// } +// } +// } +// } else if param.Channel != nil && param.ChannelRemark == nil { +// channels = channels1 +// } else if param.Channel == nil && param.ChannelRemark != nil { +// channels = channels2 +// } + +// codes1 := make([]string, 0) +// // 获取渠道的渠道码 +// if len(channels) > 0 { +// codeList, err := channelCodeMod.GetChannelCodesByChannels(ctx, channels) +// if err != nil { +// code = stdLog.Failure +// return code, data, err +// } +// for _, v := range codeList { +// codes1 = append(codes1, v.ChannelCode) +// } +// } + +// codes := make([]string, 0) +// // 只搜索渠道码 +// if param.ChannelCode != nil && param.Channel == nil && param.ChannelRemark == nil { +// codes = append(codes, *param.ChannelCode) +// } else if param.ChannelCode != nil && (param.Channel != nil || param.ChannelRemark != nil) { +// codes2 := make([]string, 0) +// for _, v := range codes1 { +// if v == *param.ChannelCode { +// codes2 = []string{*param.ChannelCode} +// break +// } +// } + +// if len(codes2) == 0 { +// code = stdLog.Success +// return code, resp, nil +// } +// codes = codes2 +// } else { +// codes = codes1 +// } + +// skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) +// total, statList, err := channelCodeStatMod.GetChannelCodeStatList(ctx, codes, param.AppId, param.StartTime, param.EndTime, skip, limit) +// if err != nil { +// code = stdLog.Failure +// return +// } + +// appIds := make([]int32, 0) +// for _, v := range statList { +// appIds = append(appIds, v.AppId) +// } + +// appInfoMap, err := channelSer.MakeAppInfosMapByIds(ctx, appIds) +// if err != nil { +// code = stdLog.Failure +// return +// } + +// codeList, err := channelCodeMod.GetChannelCodesByIds(ctx, appIds) +// if err != nil { +// code = stdLog.Failure +// return +// } + +// appInfoCodeMap := make(map[string]*channelCodeMod.ChannelCode) +// for _, v := range codeList { +// _v := v +// appInfoCodeMap[v.ChannelCode+fmt.Sprintf("%d", v.AppId)] = &_v +// } + +// for _, v := range statList { +// appName := "" +// if appInfo, ok := appInfoMap[v.AppId]; ok { +// appName = appInfo.Name +// } + +// channel := "" +// settlement := channelmod.SettlementCPA +// rate := float64(0.8) +// if channelCodeInfo, ok := appInfoCodeMap[v.ChannelCode+fmt.Sprintf("%d", v.AppId)]; ok { +// channel = channelCodeInfo.Channel +// channelInfo, _ := channelmod.GetChannelInfoByChannel(ctx, channel) +// if channelInfo.Channel == channel { +// settlement = channelCodeInfo.Settlement +// if settlement == channelmod.SettlementCPS { +// rate = float64(channelInfo.CPSRate) / 100 +// } else { +// rate = float64(channelInfo.CPAPrice) +// } +// } +// } else { // 官方活没收益 +// rate = float64(200) +// } + +// tmp := proto.ChannelCodeStatInfo{ +// SumDate: v.SumDate, +// ChannelCode: v.ChannelCode, +// AppId: v.AppId, +// AppName: appName, +// Channel: channel, +// Settlement: settlement, +// NewDirectCount: v.NewDirectCount, +// NewFissionCount: v.NewFissionCount, +// NewDeductionCount: v.NewDeductionCount, +// DirectVisitCount: v.DirectVisitCount, +// FissionVisitCount: v.FissionVisitCount, +// Day1RetainRate: v.Day1RetainRate, +// Day3RetainRate: v.Day3RetainRate, +// Day7RetainRate: v.Day7RetainRate, +// Recharge: v.DirectAmount, +// FissionAmount: v.FissionAmount, +// DeductionAmount: v.DeductionAmount, +// NewRechargeCount: v.NewRechargeCount, +// NewRechargeAmount: v.NewRechargeAmount, +// LandPageVisitCount: v.LandPageVisitCount, +// TotalAmount: v.DirectAmount + v.FissionAmount + v.DeductionAmount, +// TotalNewCount: v.NewDirectCount + v.NewFissionCount + v.NewDeductionCount, +// IncomeRate: float64(0.0), +// UpdatedAt: v.UpdatedAt, +// } + +// if settlement == channelmod.SettlementCPS { +// tmp.CPSRate = rate +// channelIncome := float64(v.DirectAmount) * rate +// if channelIncome > 0 { +// tmp.IncomeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(tmp.Recharge+tmp.DeductionAmount+tmp.FissionAmount))/channelIncome), 64) + +// } +// } else { +// tmp.CPAPrice = rate / 100 +// channelIncome := float64(v.NewDirectCount) * rate +// if channelIncome > 0 { +// tmp.IncomeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(tmp.Recharge+tmp.DeductionAmount+tmp.FissionAmount))/channelIncome), 64) +// } +// } +// resp.List = append(resp.List, tmp) +// } + +// resp.Total = total + +// // 总量 + +// TotalList, err := channelCodeStatMod.GetChannelCodeStatListTotal(ctx, codes, param.AppId, param.StartTime, param.EndTime) +// if err != nil { +// log.Error("GetChannelCodeStatListTotal", log.E(err)) +// code = stdLog.Failure +// return +// } +// toatlSum := proto.ChannelCodeStatInfo{ +// IncomeRate: float64(0.0), +// } +// for _, valueInfo := range TotalList { +// toatlSum.NewDirectCount += valueInfo.NewDirectCount +// toatlSum.NewFissionCount += valueInfo.NewFissionCount +// toatlSum.NewDeductionCount += valueInfo.NewDeductionCount +// toatlSum.DirectVisitCount += valueInfo.DirectVisitCount +// toatlSum.FissionVisitCount += valueInfo.FissionVisitCount +// toatlSum.Day1RetainRate += valueInfo.Day1RetainRate +// toatlSum.Day3RetainRate += valueInfo.Day3RetainRate +// toatlSum.Day7RetainRate += valueInfo.Day7RetainRate +// toatlSum.Recharge += valueInfo.DirectAmount +// toatlSum.FissionAmount += valueInfo.FissionAmount +// toatlSum.DeductionAmount += valueInfo.DeductionAmount +// toatlSum.NewRechargeCount += valueInfo.NewRechargeCount +// toatlSum.NewRechargeAmount += valueInfo.NewRechargeAmount +// toatlSum.LandPageVisitCount += valueInfo.LandPageVisitCount +// toatlSum.TotalAmount += (valueInfo.DirectAmount + valueInfo.FissionAmount + valueInfo.DeductionAmount) +// toatlSum.TotalNewCount += (valueInfo.NewDirectCount + valueInfo.NewFissionCount + valueInfo.NewDeductionCount) +// } + +// resp.TotalInfo = toatlSum +// data = resp +// code = stdLog.Success +// return +// } + +// // 代理商获取渠道码统计信息列表 +// func ListChannelCodeStatAgent(ctx context.Context, account string, param proto.ListChannelCodeStatAgentReq) (code stdLog.CodeType, data interface{}, err error) { +// resp := proto.ListChannelCodeStatAgentRes{ +// Total: 0, +// List: make([]proto.ChannelCodeStatAgentInfo, 0), +// } + +// // 获取渠道信息 +// channelInfo, err := channelmod.GetChannelInfoByAccount(ctx, account) +// if err != nil || channelInfo.Channel == "" { +// code = stdLog.AgentAccountNotExists +// return +// } + +// // 获取子渠道 +// childChannels, err := channelmod.GetAllChildChannel(ctx, channelInfo.Channel) +// if err != nil || channelInfo.Channel == "" { +// code = stdLog.Failure +// return +// } +// channels := make([]string, 0) +// for _, v := range childChannels { +// channels = append(channels, v.Channel) +// } +// channels = append(channels, channelInfo.Channel) + +// // 获取渠道的渠道码 +// codeList, err := channelCodeMod.GetChannelCodesByChannels(ctx, channels) +// if err != nil { +// code = stdLog.Failure +// return +// } +// codes := make([]string, 0) +// channelCodeMap := make(map[string]string) + +// if param.ChannelCode != nil { +// codes = append(codes, *param.ChannelCode) +// for _, v := range codeList { +// channelCodeMap[v.ChannelCode+fmt.Sprintf("%d", v.AppId)] = v.Channel +// } +// } else { +// for _, v := range codeList { +// codes = append(codes, v.ChannelCode) +// channelCodeMap[v.ChannelCode+fmt.Sprintf("%d", v.AppId)] = v.Channel +// } +// } + +// skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) +// total, statList, err := channelCodeStatMod.GetChannelCodeStatAgentList(ctx, codes, *param.AppId, param.StartTime, param.EndTime, skip, limit) +// if err != nil { +// code = stdLog.Failure +// return +// } + +// for _, v := range statList { +// channelName, ok := channelCodeMap[v.ChannelCode+fmt.Sprintf("%d", v.AppId)] +// if !ok { // 只能查询渠道下面的渠道码 +// continue +// } + +// tmp := proto.ChannelCodeStatAgentInfo{ +// SumDate: v.SumDate, +// ChannelCode: v.ChannelCode, +// Channel: channelName, +// NewDirectCount: v.NewDirectCount, +// Recharge: v.DirectAmount, +// } + +// // CPA子渠道不显示充值金额 +// if channelInfo.ParentChannel != "" && channelInfo.Settlement == channelmod.SettlementCPA { +// tmp.Recharge = 0 +// } + +// resp.List = append(resp.List, tmp) +// } + +// totalStatList, err := channelCodeStatMod.GetChannelCodeStatAgentListTotal(ctx, codes, *param.AppId, param.StartTime, param.EndTime) +// if err != nil { +// code = stdLog.Failure +// return +// } +// totalCount := int64(0) +// totalAmount := int64(0) + +// for _, v := range totalStatList { +// _, ok := channelCodeMap[v.ChannelCode+fmt.Sprintf("%d", v.AppId)] +// if !ok { // 只能查询渠道下面的渠道码 +// continue +// } +// // CPA子渠道不显示充值金额 +// if channelInfo.ParentChannel != "" && channelInfo.Settlement == channelmod.SettlementCPA { +// totalAmount = 0 +// } else { +// totalAmount += v.DirectAmount +// } + +// totalCount += v.NewDirectCount +// } + +// resp.Total = total +// resp.TotalAmount = totalAmount +// resp.TotalCount = totalCount + +// data = resp +// code = stdLog.Success +// return +// } + +func CacheKey(channel *string, appId *int32, start, end *time.Time) string { + key := "" + if channel != nil { + key += fmt.Sprintf("channel:%s;", *channel) + } else { + key += "channel:;" + } + if appId != nil { + key += fmt.Sprintf("appId:%d;", *appId) + } else { + key += "appId:;" + } + if start != nil { + key += fmt.Sprintf("start:%v;", *start) + } else { + key += "start:;" + } + if end != nil { + key += fmt.Sprintf("end:%v;", *end) + } else { + key += "end:;" + } + return key +} + +// 获取渠道码统计信息列表(集团) +func ListBlocChannelCodeStat(ctx context.Context, param *proto.BlocListChannelCodeStatReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.BlocListChannelCodeStatRes{ + Total: 0, + List: make([]proto.BlocChannelCodeStatInfo, 0), + } + if param.Channel != nil && *param.Channel == channelmod.OfficialChannelDisplayName { + tmp := channelmod.OfficialChannelName + param.Channel = &tmp + } + + // 获取渠道的渠道码 + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + total, statList, err := channelCodeBlocStatMod.GetBlocChannelCodeBlocStatList(ctx, param.Channel, param.AppId, param.StartTime, param.EndTime, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + appIds := make([]int32, 0) + for _, v := range statList { + appIds = append(appIds, v.AppId) + } + + appInfoMap, err := MakeAppInfosMapByIds(ctx, appIds) + if err != nil { + code = stdLog.Failure + return + } + + childstatList := make([]*channelCodeBlocStatMod.ChannelCodeBlocStat, 0) + + if param.WithChild != nil && param.Channel != nil && len(*param.Channel) > 0 { + childChannelList, _ := channelmod.FindManyChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.ParentChannel: *param.Channel}) + if len(childChannelList) > 0 { + channelArray := make([]string, 0) + for _, v := range childChannelList { + channelArray = append(channelArray, v.Channel) + } + _, childstatList, _ = channelCodeBlocStatMod.GetBlocChannelCodeStatTotal(ctx, channelArray, param.AppId, param.StartTime, param.EndTime) + } + + // 汇总排序 (存在一级没有 二级存在的情况) + for _, childinfo := range childstatList { + find := false + for _, v := range statList { + if v.SumDate.Equal(childinfo.SumDate) { + find = true + } + } + if !find { + childinfo.ChannelCode = *param.Channel + statList = append(statList, childinfo) + } + } + sort.Sort(statList) + } + // get channels + channels := make([]string, 0, len(statList)) + for _, item := range statList { + channels = append(channels, item.ChannelCode) + } + ruleMap, err := MakeRuleMap(ctx, channels) + if err != nil { + code = stdLog.Failure + return + } + //组装 按照时间排序 + for _, v := range statList { + appName := "" + if appInfo, ok := appInfoMap[v.AppId]; ok { + appName = appInfo.Name + } + + for _, childinfo := range childstatList { + if v.SumDate.Equal(childinfo.SumDate) { + v.NewDirectCount += childinfo.NewDirectCount + v.NewFissionCount += childinfo.NewFissionCount + v.NewDeductionCount += childinfo.NewDeductionCount + v.DirectVisitCount += childinfo.DirectVisitCount + v.FissionVisitCount += childinfo.FissionVisitCount + v.DeductionAmount += childinfo.DeductionAmount + v.DirectAmount += childinfo.DirectAmount + v.FissionAmount += childinfo.FissionAmount + } + } + + tmp := proto.BlocChannelCodeStatInfo{ + SumDate: v.SumDate, + ChannelCode: channelmod.ChannelDisplayName(v.ChannelCode), + AppId: v.AppId, + AppName: appName, + Channel: v.Channel, + NewDirectCount: v.NewDirectCount, + NewFissionCount: v.NewFissionCount, + NewDeductionCount: v.NewDeductionCount, + DirectVisitCount: v.DirectVisitCount, + FissionVisitCount: v.FissionVisitCount, + DeductionAmount: v.DeductionAmount, + RechargeAmount: v.DirectAmount, + FissionAmount: v.FissionAmount, + UpdatedAt: v.UpdatedAt, + } + ruleinfo := ruleMap.GetRule(v.ChannelCode, v.AppId) + if ruleinfo != nil { + if ruleinfo.Settlement == channelmod.SettlementCPA { + tmp.Settlement = fmt.Sprintf("CPA_%.2f", float64(ruleinfo.CPAPrice)/100) + tmp.TodayIncome = tmp.NewDirectCount * ruleinfo.CPAPrice + } else if ruleinfo.Settlement == channelmod.SettlementCPS { + tmp.Settlement = fmt.Sprintf("CPS_%.2f", float64(ruleinfo.CPSRate)/100) + tmp.TodayIncome = tmp.RechargeAmount * ruleinfo.CPSRate / 100 + } else if ruleinfo.Settlement == channelmod.SettlementCPT { + tmp.Settlement = "CPT" + } else if ruleinfo.Settlement == channelmod.SettlementCPC { + tmp.Settlement = "CPC" + } + } + + resp.List = append(resp.List, tmp) + } + + resp.Total = total + + // 查询条件不为空时统计总量 + if param.Channel != nil || param.AppId != nil || (param.StartTime != nil && param.EndTime != nil) { + // 总量 + TotalList, err := channelCodeBlocStatMod.GetBlocChannelCodeBlocStatListTotal(ctx, param.Channel, param.AppId, param.StartTime, param.EndTime) + if err != nil { + code = stdLog.Failure + return code, nil, err + } + // get channels + channels = make([]string, 0, len(TotalList)) + for _, item := range TotalList { + channels = append(channels, item.ChannelCode) + } + ruleMap, err = MakeRuleMap(ctx, channels) + if err != nil { + code = stdLog.Failure + return code, nil, err + } + toatlSum := &proto.BlocChannelCodeStatInfo{} + for _, valueInfo := range TotalList { + toatlSum.NewDirectCount += valueInfo.NewDirectCount + toatlSum.NewFissionCount += valueInfo.NewFissionCount + toatlSum.DirectVisitCount += valueInfo.DirectVisitCount + toatlSum.FissionVisitCount += valueInfo.FissionVisitCount + toatlSum.RechargeAmount += valueInfo.DirectAmount + toatlSum.DeductionAmount += valueInfo.DeductionAmount + toatlSum.NewDeductionCount += valueInfo.NewDeductionCount + ruleinfo := ruleMap.GetRule(valueInfo.ChannelCode, valueInfo.AppId) + if ruleinfo != nil { + if ruleinfo.Settlement == channelmod.SettlementCPA { + toatlSum.TodayIncome += valueInfo.NewDirectCount * ruleinfo.CPAPrice + } else if ruleinfo.Settlement == channelmod.SettlementCPS { + toatlSum.TodayIncome += valueInfo.DirectAmount * ruleinfo.CPSRate / 100 + } + } + } + resp.TotalInfo = *toatlSum + } + data = resp + code = stdLog.Success + return +} + +func ListBlocChannelExport(ctx context.Context, param *proto.BlocListChannelCodeStatReq) (string, error) { + if param.Channel != nil && *param.Channel == channelmod.OfficialChannelDisplayName { + tmp := channelmod.OfficialChannelName + param.Channel = &tmp + } + // 获取渠道的渠道码 + statList, err := channelCodeBlocStatMod.GetBlocChannelCodeBlocStatListTotal(ctx, param.Channel, param.AppId, param.StartTime, param.EndTime) + if err != nil { + return "", err + } + + appIds := make([]int32, 0) + for _, v := range statList { + appIds = append(appIds, v.AppId) + } + + appInfoMap, err := MakeAppInfosMapByIds(ctx, appIds) + if err != nil { + return "", err + } + + // get channels + channels := make([]string, 0, len(statList)) + for _, item := range statList { + channels = append(channels, item.ChannelCode) + } + ruleMap, err := MakeRuleMap(ctx, channels) + if err != nil { + return "", err + } + + result := make([]*proto.BlocChannelCodeStatInfo, 0) + for _, v := range statList { + appName := "" + if appInfo, ok := appInfoMap[v.AppId]; ok { + appName = appInfo.Name + } + + tmp := &proto.BlocChannelCodeStatInfo{ + SumDate: v.SumDate, + ChannelCode: channelmod.ChannelDisplayName(v.ChannelCode), + AppId: v.AppId, + AppName: appName, + Channel: v.Channel, + NewDirectCount: v.NewDirectCount, + NewFissionCount: v.NewFissionCount, + DirectVisitCount: v.DirectVisitCount, + NewDeductionCount: v.NewDeductionCount, + FissionVisitCount: v.FissionVisitCount, + DeductionAmount: v.DeductionAmount, + RechargeAmount: v.DirectAmount, + FissionAmount: v.FissionAmount, + UpdatedAt: v.UpdatedAt, + } + ruleinfo := ruleMap.GetRule(v.ChannelCode, v.AppId) + if ruleinfo != nil { + if ruleinfo.Settlement == channelmod.SettlementCPA { + tmp.Settlement = fmt.Sprintf("CPA_%.2f", float64(ruleinfo.CPAPrice)/100) + tmp.TodayIncome = tmp.NewDirectCount * ruleinfo.CPAPrice + } else if ruleinfo.Settlement == channelmod.SettlementCPS { + tmp.Settlement = fmt.Sprintf("CPS_%.2f", float64(ruleinfo.CPSRate)/100) + tmp.TodayIncome = tmp.RechargeAmount * ruleinfo.CPSRate / 100 + } else if ruleinfo.Settlement == channelmod.SettlementCPT { + tmp.Settlement = "CPT" + } else if ruleinfo.Settlement == channelmod.SettlementCPC { + tmp.Settlement = "CPC" + } + } + result = append(result, tmp) + } + + filePath := fmt.Sprintf("./tmp/渠道列表-%s.xlsx", time.Now().Format("2006-01-02 15:04:05")) + + if err := export(ctx, filePath, result); err != nil { + return "", err + } + + return filePath, nil +} + +func export(ctx context.Context, rPath string, channelStatList []*proto.BlocChannelCodeStatInfo) error { + f := excelize.NewFile() + sheetName := "Sheet1" + idx := f.NewSheet(sheetName) + + var exportTransWaterTitle = map[string]string{} + + exportTransWaterTitle = map[string]string{ + "A1": "日期", + "B1": "渠道", + "C1": "结算方式", + "D1": "当日支出", + "E1": "新增(直推)", + "F1": "新增(裂变)", + "G1": "新增(扣量)", + "H1": "访问量", + "I1": "直推充值金额", + "J1": "裂变充值金额", + } + + for k, v := range exportTransWaterTitle { + f.SetCellValue(sheetName, k, v) + } + + for k, v := range channelStatList { + i := 'A' // i 不能超过Z,即列输不能超过26列,超出将出现bug + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.SumDate) + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.ChannelCode) + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Settlement) + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.TodayIncome)/100) + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.NewDirectCount) + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.NewFissionCount) + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.NewDeductionCount) + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.DirectVisitCount+v.FissionVisitCount) + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.DeductionAmount)/100) + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.FissionAmount)/100) + } + f.SetActiveSheet(idx) + p, _ := os.Getwd() + fileName := path.Join(p, rPath) + + if err := f.SaveAs(fileName); err != nil { + log.Error("srv_vipcode:export save file to disk failed", + log.Any("fileName", fileName), + log.E(err)) + return err + } + return nil +} diff --git a/service/statSer/dailyStat.go b/service/statSer/dailyStat.go new file mode 100644 index 0000000..e03783f --- /dev/null +++ b/service/statSer/dailyStat.go @@ -0,0 +1,957 @@ +package statSer + +import ( + "bytes" + "context" + "fmt" + "os" + "path" + "stat/api/proto" + "stat/common/log" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/appInfoMod" + "stat/models/blocDailystatmod" + "stat/models/botdailyhourstat" + "stat/models/channelmod" + "stat/models/dailyhourstatmod" + "stat/models/dailystatmod" + "stat/models/minutestatmod" + "stat/models/rechargemod" + "stat/models/registermod" + "stat/models/withdrawUserOrdermod" + "strconv" + "time" + + "github.com/360EntSecGroup-Skylar/excelize" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// 获取日常统计信息列表 +func ListDailyStat(ctx context.Context, param proto.ListDailyStatReq) (code stdLog.CodeType, data interface{}, err error) { + resp := &proto.ListDailyStatRes{ + Total: 0, + TotalInfo: &proto.DailyStatInfo{}, + List: make([]*proto.DailyStatInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + total, statList, err := dailystatmod.GetDailyStatList(ctx, param.AppId, param.StartTime, param.EndTime, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + appIds := make([]int32, 0) + for _, v := range statList { + appIds = append(appIds, v.AppId) + } + + appInfoMap, err := MakeAppInfosMapByIds(ctx, appIds) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range statList { + appName := "" + if appInfo, ok := appInfoMap[v.AppId]; ok { + appName = appInfo.Name + } + tmp := DailyStatToInfo(v) + tmp.AppName = appName + resp.List = append(resp.List, tmp) + } + + if param.AppId != nil || param.StartTime != nil || param.EndTime != nil { + var count int + err := dailystatmod.GetDailyStatTotalListShard(ctx, param.AppId, param.StartTime, param.EndTime, utils.GlobalShardMonth, func(item *dailystatmod.DailyStatMod) { + count++ + tmp := DailyStatToInfo(item) + DailyStatInfoAccumulate(resp.TotalInfo, tmp) + }) + if err != nil { + code = stdLog.Failure + return code, nil, err + } + // 计算留存率平均值 + if count > 0 { + resp.TotalInfo.Day1RetainRate = resp.TotalInfo.Day1RetainRate / float64(count) + resp.TotalInfo.Day3RetainRate = resp.TotalInfo.Day3RetainRate / float64(count) + resp.TotalInfo.Day7RetainRate = resp.TotalInfo.Day7RetainRate / float64(count) + } + } + resp.Total = total + data = resp + code = stdLog.Success + return +} + +// 获取日常统计信息列表 +func ListDailyStatExport(ctx context.Context, param proto.ListDailyStatReq) (string, error) { + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + _, statList, err := dailystatmod.GetDailyStatList(ctx, param.AppId, param.StartTime, param.EndTime, skip, limit) + if err != nil { + return "", err + } + + filePath := fmt.Sprintf("./tmp/日常统计信息列表-%s.xlsx", time.Now().Format("2006-01-02 15:04:05")) + if sErr := dailyStatexport(filePath, statList); sErr != nil { + return "", sErr + } + return filePath, nil +} + +func dailyStatexport(rPath string, transInfos []*dailystatmod.DailyStatMod) error { + f := excelize.NewFile() + sheetName := "Sheet1" + // 设置列宽 + f.SetColWidth("Sheet1", "A", "O", 20) + // 设置表头行高 + f.SetRowHeight("Sheet1", 1, 30) + // 设置表头样式 + headStyleID, _ := f.NewStyle(`{ + "font":{ + "color":"#333333", + "bold":true, + "size":16, + "family":"arial" + }, + "alignment":{ + "vertical":"center", + "horizontal":"center" + } + }`) + f.SetCellStyle("Sheet1", "A1", "O1", headStyleID) + + idx := f.NewSheet(sheetName) + var exportTransWaterTitle = map[string]string{ + "A1": "日期", + "B1": "总日活", + "C1": "android日活", + "D1": "ios日活", + "E1": "总新增", + "F1": "android新增", + "G1": "ios新增", + "H1": "总充值", + "I1": "android充值", + "J1": "ios充值", + "K1": "总新增H5", + "L1": "渠道新增", + "M1": "渠道总充值", + "N1": "老用户总充值", + "O1": "新用户总充值", + "P1": "复充总金额", + "Q1": "重充VIP总金额", + "R1": "拉起订单数", + "S1": "成功订单数", + } + for k, v := range exportTransWaterTitle { + f.SetCellValue(sheetName, k, v) + } + for k, v := range transInfos { + i := 'A' // i 不能超过Z,即列输不能超过26列,超出将出现bug + date := v.SumDate.Local().Format("2006-01-02") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), date) //日期 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.TotalVisitCount) //总日活 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.TotalVisitCount-(v.LightVisitCount+v.TodayH5VisitCount)) //android日活 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.LightVisitCount+v.TodayH5VisitCount) //ios日活 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.NewTotalCount) //总新增 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.NewTotalCount-(v.LightAddCount+v.H5AddCount)) //android总新增 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.LightAddCount+v.H5AddCount) //Ios总新增 + i++ + + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.TotalAmount)/100) //总充值 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.TodayAndroidRecharge)/100) //android充值 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.TotalAmount)/100-float64(v.TodayAndroidRecharge)/100) //ios充值 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.H5AddCount) //总新增H5 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.NewDistrictCount) //渠道新增 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.TodayDistrictRecharge)/100) //渠道总充值 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.TotalAmount-v.NewRechargeAmount)/100) //老用户总充值 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.NewRechargeAmount)/100) //新用户总充值 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.RepeatAmount)/100) //复充总金额 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.RepeatVipMoney)/100) //重充VIP总金额 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.TotalRechargeOrder) //拉起订单数 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.SuccessRechargeOrder) //成功订单数 + } + + f.SetActiveSheet(idx) + p, _ := os.Getwd() + fileName := path.Join(p, rPath) + if err := f.SaveAs(fileName); err != nil { + log.Error("SettlementInfo:export save file to disk failed", + log.Any("fileName", fileName), + log.E(err)) + return err + } + return nil +} + +// 获取日常统计信息列表 +func BlocListDailyStat(ctx context.Context, param proto.ListBlocDailyStatReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListBlocDailyStatRes{ + Total: 0, + List: make([]proto.BlocDailyStatInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + + total, statList, err := blocDailystatmod.GetBlocDailyStatList(ctx, param.AppId, param.StartTime, param.EndTime, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + appIds := make([]int32, 0) + for _, v := range statList { + appIds = append(appIds, v.AppId) + } + + appInfoMap, err := MakeAppInfosMapByIds(ctx, appIds) + if err != nil { + code = stdLog.Failure + return code, nil, err + } + + for _, v := range statList { + appName := "" + if appInfo, ok := appInfoMap[v.AppId]; ok { + appName = appInfo.Name + } + + tmp := proto.BlocDailyStatInfo{ + SumDate: v.SumDate, + AppId: v.AppId, + AppName: appName, + NewDirectCount: v.NewDirectCount, + NewFissionCount: v.NewFissionCount, + DirectVisitCount: v.DirectVisitCount, + FissionVisitCount: v.FissionVisitCount, + Day1RetainRate: v.Day1RetainRate, + Day3RetainRate: v.Day3RetainRate, + Day7RetainRate: v.Day7RetainRate, + DirectAmount: v.DirectAmount, + FissionAmount: v.FissionAmount, + NewRechargeCount: v.NewRechargeCount, + NewRechargeAmount: v.NewRechargeAmount, + DaichongAmout: v.DaichongAmout, + OnlineAmount: v.OnlineAmount, + UserWithDrawAmount: v.UserWithDrawAmount, + UserWithDrawPaymoneyAmount: v.UserWithDrawPaymoneyAmount, + GameRechageAmount: v.GameRechageAmount, + GameWithdrawAmount: v.GameWithdrawAmount, + TotalRechargeCount: v.TotalRechargeCount, + UpdatedAt: v.UpdatedAt, + } + + tmp.TotalVisitCount = v.DirectVisitCount + v.FissionVisitCount // 日活 + tmp.TotalAmount = v.DirectAmount + v.FissionAmount // 总充值 + tmp.TotalNewCount = v.NewDirectCount + v.NewFissionCount // 新增 + tmp.OldRechargeAmount = tmp.TotalAmount - tmp.NewRechargeAmount // 老用户充值 + total := v.DeductionAmountCount + v.DirectAmountCount + v.FissionAmountCount // 充值人数 + + if tmp.TotalAmount-tmp.DaichongAmout > 0 { + tmp.OnlineAmount = tmp.TotalAmount - tmp.DaichongAmout + } + + if tmp.TotalNewCount != 0 { + tmp.NewRechargeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(v.NewRechargeCount)/float64(tmp.TotalNewCount))*100), 64) + } + + if tmp.TotalVisitCount != 0 { + tmp.VisitRechargeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(total)/float64(tmp.TotalVisitCount))*100), 64) + } + + if total != 0 { + tmp.ARPPU = (tmp.DirectAmount + tmp.FissionAmount) / total // 金额 + } + if tmp.TotalVisitCount != 0 { + tmp.ARPU = tmp.TotalAmount / tmp.TotalVisitCount // 金额 + } + + resp.List = append(resp.List, tmp) + } + + if param.AppId != nil || param.StartTime != nil || param.EndTime != nil { + // 过滤条件至少有一个,不然不统计总数 + totalList, err := blocDailystatmod.GetBlocDailyStatListTotal(ctx, param.AppId, param.StartTime, param.EndTime) + if err != nil { + code = stdLog.Failure + return code, nil, err + } + for _, v := range totalList { + resp.TotalInfo.NewDirectCount += v.NewDirectCount + resp.TotalInfo.NewFissionCount += v.NewFissionCount + resp.TotalInfo.DirectVisitCount += v.DirectVisitCount + resp.TotalInfo.FissionVisitCount += v.FissionVisitCount + resp.TotalInfo.DirectAmount += v.DirectAmount + resp.TotalInfo.FissionAmount += v.FissionAmount + resp.TotalInfo.NewRechargeCount += v.NewRechargeCount + resp.TotalInfo.NewRechargeAmount += v.NewRechargeAmount + resp.TotalInfo.DaichongAmout += v.DaichongAmout + resp.TotalInfo.UserWithDrawAmount += v.UserWithDrawAmount + resp.TotalInfo.UserWithDrawPaymoneyAmount += v.UserWithDrawPaymoneyAmount + resp.TotalInfo.GameRechageAmount += v.GameRechageAmount + resp.TotalInfo.GameWithdrawAmount += v.GameWithdrawAmount + resp.TotalInfo.TotalRechargeCount += v.TotalRechargeCount + } + resp.TotalInfo.TotalVisitCount = resp.TotalInfo.DirectVisitCount + resp.TotalInfo.FissionVisitCount // 日活 + resp.TotalInfo.TotalAmount = resp.TotalInfo.DirectAmount + resp.TotalInfo.FissionAmount // 总充值 + resp.TotalInfo.TotalNewCount = resp.TotalInfo.NewDirectCount + resp.TotalInfo.NewFissionCount // 新增 + resp.TotalInfo.OldRechargeAmount = resp.TotalInfo.TotalAmount - resp.TotalInfo.NewRechargeAmount // 老用户充值 + if resp.TotalInfo.TotalAmount-resp.TotalInfo.DaichongAmout > 0 { + resp.TotalInfo.OnlineAmount = resp.TotalInfo.TotalAmount - resp.TotalInfo.DaichongAmout + } + } + resp.Total = total + data = resp + code = stdLog.Success + return +} + +// 获取充值明细(集团) +func BlocListRechargeDetailsInfo(ctx context.Context, param proto.ListBlocRechargeDetailsReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListBlocRechargeDetailsRes{ + Total: 0, + List: make([]proto.BlocRechargeDetailsInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + total, RechagerList, err := rechargemod.GetBlocRechargeDetailsList(ctx, param.AppId, param.StartTime, param.EndTime, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + appIds := make([]int32, 0) + appMap := make(map[int32]int32) + for _, v := range RechagerList { + if _, ok := appMap[v.AppId]; !ok { + appMap[v.AppId] = v.AppId + appIds = append(appIds, v.AppId) + } + } + //fmt.Println(appIds) + appInfoMap, err := MakeAppInfosMapByIds(ctx, appIds) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range RechagerList { + appName := "" + if appInfo, ok := appInfoMap[v.AppId]; ok { + appName = appInfo.Name + } + + tmp := proto.BlocRechargeDetailsInfo{ + UserId: v.PromCode, + AppName: appName, + SysType: v.SysType, + DevType: v.DevType, + ChannelName: v.ChannelName, + CID: v.CID, + Type: v.Type, + OrderId: v.OrderId, + Money: v.Money, + PayMoney: v.PayMoney, + Status: 3, + SuccessAt: v.SuccessAt, + } + resp.List = append(resp.List, tmp) + } + + resp.Total = total + + data = resp + code = stdLog.Success + return +} + +// 获取日常统计信息列表 +func BlocListDailyTotalStat(ctx context.Context, param proto.ListBlocDailyStatTotalReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListBlocDailyStatTotalRes{ + Total: 0, + List: make([]proto.BlocDailyStatTotalInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + + statList, err := blocDailystatmod.GetBlocDailyStatTotalList(ctx, param.StartTime, param.EndTime) + if err != nil { + code = stdLog.Failure + return + } + + count := int64(0) + for _, v := range statList { + if count >= skip && count <= skip+limit { + tmp := proto.BlocDailyStatTotalInfo{ + SumDate: v.SumDate, + NewDirectCount: v.NewDirectCount, + NewFissionCount: v.NewFissionCount, + DirectVisitCount: v.DirectVisitCount, + FissionVisitCount: v.FissionVisitCount, + DirectAmount: v.DirectAmount, + FissionAmount: v.FissionAmount, + NewRechargeCount: v.NewRechargeCount, + NewRechargeAmount: v.NewRechargeAmount, + DaichongAmout: v.DaichongAmout, + OnlineAmount: v.OnlineAmount, + UserWithDrawAmount: v.UserWithDrawAmount, + UserWithDrawPaymoneyAmount: v.UserWithDrawPaymoneyAmount, + GameRechageAmount: v.GameRechageAmount, + GameWithdrawAmount: v.GameWithdrawAmount, + TotalRechargeCount: v.TotalRechargeCount, + } + + tmp.TotalVisitCount = v.DirectVisitCount + v.FissionVisitCount // 日活 + tmp.TotalAmount = v.DirectAmount + v.FissionAmount // 总充值 + tmp.TotalNewCount = v.NewDirectCount + v.NewFissionCount // 新增 + tmp.OldRechargeAmount = tmp.TotalAmount - tmp.NewRechargeAmount // 老用户充值 + + if tmp.TotalAmount-tmp.DaichongAmout > 0 { + tmp.OnlineAmount = tmp.TotalAmount - tmp.DaichongAmout + } + + resp.List = append(resp.List, tmp) + } + count += 1 + } + + resp.Total = count + data = resp + code = stdLog.Success + return +} + +// 获取充值明细(集团) +func BlocListRegisterDetailsInfo(ctx context.Context, param proto.ListBlocRegisterDetailsReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListBlocRegisterDetailsRes{ + Total: 0, + List: make([]proto.BlocRegisterDetailsInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + total, RechagerList, err := registermod.GetBlocRegisterDetailsList(ctx, param.AppId, param.StartTime, param.EndTime, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + appIds := make([]int32, 0) + appMap := make(map[int32]int32) + for _, v := range RechagerList { + if _, ok := appMap[v.AppId]; !ok { + appMap[v.AppId] = v.AppId + appIds = append(appIds, v.AppId) + } + } + + appInfoMap, err := MakeAppInfosMapByIds(ctx, appIds) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range RechagerList { + appName := "" + if appInfo, ok := appInfoMap[v.AppId]; ok { + appName = appInfo.Name + } + + tmp := proto.BlocRegisterDetailsInfo{ + UserId: v.PromCode, + AppName: appName, + SysType: v.SysType, + DevType: v.DevType, + Mobile: v.Mobile, + IP: v.IP, + Name: v.Name, + IsDirect: v.IsDirect, + RegisterTime: v.RegisterTime, + } + resp.List = append(resp.List, tmp) + } + + resp.Total = total + + data = resp + code = stdLog.Success + return +} + +// 获取提现明细(集团) +func BlocListWithdrawDetailsInfo(ctx context.Context, param proto.ListBlocWithdrawDetailsReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListBlocWithdrawDetailsRes{ + Total: 0, + List: make([]proto.ListBlocWithdrawDetailsInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + total, RechagerList, err := withdrawUserOrdermod.GetBlocUserWithdrawOrderList(ctx, param.AppId, param.StartTime, param.EndTime, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + appIds := make([]int32, 0) + appMap := make(map[int32]int32) + for _, v := range RechagerList { + if _, ok := appMap[v.AppId]; !ok { + appMap[v.AppId] = v.AppId + appIds = append(appIds, v.AppId) + } + } + //fmt.Println(appIds) + appInfoMap, err := MakeAppInfosMapByIds(ctx, appIds) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range RechagerList { + appName := "" + if appInfo, ok := appInfoMap[v.AppId]; ok { + appName = appInfo.Name + } + + tmp := proto.ListBlocWithdrawDetailsInfo{ + UID: v.PromCode, + AppName: appName, + Name: v.Name, + Amount: v.Amount, + Money: v.Money, + PayMoney: v.PayMoney, + PayType: v.PayType, + OID: v.OID, + ActName: v.ActName, + Act: v.Act, + UserIP: v.UserIP, + DeviceType: v.DeviceType, + DevID: v.DevID, + Status: v.Status, + StatusDesc: v.StatusDesc, + SuccessAt: v.SuccessAt, + ReceivedAt: v.ReceivedAt, + } + resp.List = append(resp.List, tmp) + } + + resp.Total = total + + data = resp + code = stdLog.Success + return +} + +// 获取提现明细(集团) +func ListBlocRechargeChannelInfo(ctx context.Context, param proto.ListBlocRechargeChannelReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListBlocRechargeChannelRes{ + Total: 0, + List: make([]proto.ListBlocRechargeChannelInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + + statList, err := blocDailystatmod.GetBlocDailyStatTotalList(ctx, param.StartTime, param.EndTime) + if err != nil { + code = stdLog.Failure + return + } + + count := int64(0) + for _, v := range statList { + if count >= skip && count <= skip+limit { + tmp := proto.ListBlocRechargeChannelInfo{ + SumDate: v.SumDate, + ChannelName: "大白鲨", + BlocOrderMoney: v.DirectAmount + v.FissionAmount, + BlocChannelRate: 12, + } + + resp.List = append(resp.List, tmp) + } + count += 1 + } + + resp.Total = count + + data = resp + code = stdLog.Success + return +} + +func ListMinuteStat(ctx context.Context, param proto.ListMinuteStatReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListMinuteStatRes{ + TodayGraphList: make([]proto.MinuteStatInfo, 0), + } + + // 获取app信息 + appInfo, err := appInfoMod.GetAppInfoById(ctx, *param.AppId) + if err != nil { + code = stdLog.Failure + return + } + + resp.AppInfo = proto.AppInfoRes{ + AppId: appInfo.AppId, + Name: appInfo.Name, + LandPages: appInfo.LandPages, + IconImg: appInfo.IconImg, + CreatedAt: appInfo.CreatedAt, + UpdatedAt: appInfo.UpdatedAt, + } + + start := *param.SumDate + end := start.AddDate(0, 0, 1) + + todayStatList, err := minutestatmod.GetMinuteStatList(ctx, start, end, *param.AppId) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range todayStatList { + tmp := proto.MinuteStatInfo{ + SumDate: v.SumDate, + NewCount: v.NewCount, + AndroidAddCount: v.AndroidAddCount, + IosAddCount: v.IosAddCount, + H5AddCount: v.H5AddCount, + RechargetCount: v.RechargetCount, + RechargetMoney: v.RechargetMoney, + AccessCount: v.AccessCount, + AndroidAccessCount: v.AndroidAccessCount, + IosAccessCount: v.IosAccessCount + v.H5AccessCount, + LandpageAndroidClick: v.LandpageAndroidClick, + LandpageIosAppstoreClick: v.LandpageIosAppstoreClick, + LandpageIosAthorClick: v.LandpageIosAthorClick, + LandpageIosH5Click: v.LandpageIosH5Click, + LightGuestAddCount: v.LightGuestAddCount, + } + + resp.TodayGraphList = append(resp.TodayGraphList, tmp) + } + + compareTime := start.AddDate(0, 0, -1) + if param.CompareTime != nil { + compareTime = *param.CompareTime + } + compareTimeEnd := compareTime.AddDate(0, 0, 1) + yesterdayStatList, err := minutestatmod.GetMinuteStatList(ctx, compareTime, compareTimeEnd, *param.AppId) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range yesterdayStatList { + tmp := proto.MinuteStatInfo{ + SumDate: v.SumDate, + NewCount: v.NewCount, + AndroidAddCount: v.AndroidAddCount, + IosAddCount: v.IosAddCount, + H5AddCount: v.H5AddCount, + RechargetCount: v.RechargetCount, + RechargetMoney: v.RechargetMoney, + AccessCount: v.AccessCount, + AndroidAccessCount: v.AndroidAccessCount, + IosAccessCount: v.IosAccessCount + v.H5AccessCount, + LandpageAndroidClick: v.LandpageAndroidClick, + LandpageIosAppstoreClick: v.LandpageIosAppstoreClick, + LandpageIosAthorClick: v.LandpageIosAthorClick, + LandpageIosH5Click: v.LandpageIosH5Click, + LightGuestAddCount: v.LightGuestAddCount, + } + + resp.YesterdayGraphList = append(resp.YesterdayGraphList, tmp) + } + + data = resp + code = stdLog.Success + return +} + +// 获取日常统计信息列表 +func ListDailyHourStat(ctx context.Context, param *proto.ListDailyHourStatReq) (code stdLog.CodeType, data *proto.ListDailyHourStatRes, err error) { + resp := &proto.ListDailyHourStatRes{ + Total: 0, + List: make([]*proto.DailyHourStatInfo, 0), + } + filter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{dailyhourstatmod.FN.DailyHourStat.SumDate: -1}) + opt.SetSkip((param.PageNum - 1) * param.PageSize) + opt.SetLimit(param.PageSize) + + if param.AppId != nil { + filter[dailyhourstatmod.FN.DailyHourStat.AppId] = *param.AppId + } + if param.StartTime != nil && param.EndTime != nil { + filter[dailyhourstatmod.FN.DailyHourStat.SumDate] = bson.M{"$gte": *param.StartTime, "$lt": *param.EndTime} + } + if param.SumHour != nil { + filter[dailyhourstatmod.FN.DailyHourStat.SumHour] = *¶m.SumHour + } + + total, _ := dailyhourstatmod.CountDailyHourStats(ctx, filter) + + statList, err := dailyhourstatmod.FindManyDailyHourStat(ctx, filter, opt) + if err != nil { + code = stdLog.Failure + return + } + + appIds := make([]int32, 0) + for _, v := range statList { + appIds = append(appIds, v.AppId) + } + + appInfoMap, err := MakeAppInfosMapByIds(ctx, appIds) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range statList { + appName := "" + if appInfo, ok := appInfoMap[v.AppId]; ok { + appName = appInfo.Name + } + tmp := DailyHourStatToInfo(v) + tmp.AppName = appName + resp.List = append(resp.List, tmp) + } + resp.Total = total + data = resp + code = stdLog.Success + return +} + +// 获取日常统计信息列表 +func ListDailyHourStatExport(ctx context.Context, param *proto.ListDailyHourStatReq) (*bytes.Buffer, error) { + _, data, err := ListDailyHourStat(ctx, param) + if err != nil { + return nil, err + } + return ExportDailyHourStat(data.List) +} + +func ListHourStatLine(ctx context.Context, param proto.ListHourStatLineReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListHourStatLineResp{ + TodayGraphList: make([]proto.ListHourStatLineInfo, 0), + YesterdayGraphList: make([]proto.ListHourStatLineInfo, 0), + } + + // 获取app信息 + appInfo, err := appInfoMod.GetAppInfoById(ctx, *param.AppId) + if err != nil { + code = stdLog.Failure + return + } + + resp.AppInfo = proto.AppInfoRes{ + AppId: appInfo.AppId, + Name: appInfo.Name, + LandPages: appInfo.LandPages, + IconImg: appInfo.IconImg, + CreatedAt: appInfo.CreatedAt, + UpdatedAt: appInfo.UpdatedAt, + } + + start := *param.SumDate + end := start.AddDate(0, 0, 1) + + todayFilter := bson.M{ + "sumDate": bson.M{"$gte": start, "$lte": end}, + "appId": *param.AppId, + } + + todayStatList, err := botdailyhourstat.FindManyBotHourStat(ctx, todayFilter) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range todayStatList { + tmp := proto.ListHourStatLineInfo{ + SumDate: v.SumDate, + HourNewDistrict: v.HourStat.Register.Total.District.Count, + HourNewWeb: v.HourStat.Register.Total.Web.Count, + HourNewNormal: v.HourStat.Register.Total.Normal.Count, + HourNew: v.HourStat.Register.Count(), + HourAndroidNew: v.HourStat.Register.Android.Count(), + HourIosNew: v.HourStat.Register.Ios.Count(), + HourDistrictRecharge: v.HourStat.Recharge.Total.District.Value, + HourWebRecharge: v.HourStat.Recharge.Total.Web.Value, + HourNormalRecharge: v.HourStat.Recharge.Total.Normal.Value, + HourAndroidRecharge: v.HourStat.Recharge.Android.Value(), + HourIosRecharge: v.HourStat.Recharge.Ios.Value(), + HourVipRecharge: v.HourStat.RechargeVip.Value(), + HourDistrictVip: v.HourStat.RechargeVip.Total.District.Value, + HourWebVip: v.HourStat.RechargeVip.Total.Web.Value, + HourNormalVip: v.HourStat.RechargeVip.Total.Normal.Value, + } + + resp.TodayGraphList = append(resp.TodayGraphList, tmp) + } + + compareTime := start.AddDate(0, 0, -1) + if param.CompareTime != nil { + compareTime = *param.CompareTime + } + compareTimeEnd := compareTime.AddDate(0, 0, 1) + yestodayFilter := bson.M{ + "sumDate": bson.M{"$gte": compareTime, "$lte": compareTimeEnd}, + "appId": *param.AppId, + } + + yesterdayStatList, err := botdailyhourstat.FindManyBotHourStat(ctx, yestodayFilter) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range yesterdayStatList { + tmp := proto.ListHourStatLineInfo{ + SumDate: v.SumDate, + HourNewDistrict: v.HourStat.Register.Total.District.Count, + HourNewWeb: v.HourStat.Register.Total.Web.Count, + HourNewNormal: v.HourStat.Register.Total.Normal.Count, + HourNew: v.HourStat.Register.Count(), + HourAndroidNew: v.HourStat.Register.Android.Count(), + HourIosNew: v.HourStat.Register.Ios.Count(), + HourDistrictRecharge: v.HourStat.Recharge.Total.District.Value, + HourWebRecharge: v.HourStat.Recharge.Total.Web.Value, + HourNormalRecharge: v.HourStat.Recharge.Total.Normal.Value, + HourAndroidRecharge: v.HourStat.Recharge.Android.Value(), + HourIosRecharge: v.HourStat.Recharge.Ios.Value(), + HourVipRecharge: v.HourStat.RechargeVip.Value(), + HourDistrictVip: v.HourStat.RechargeVip.Total.District.Value, + HourWebVip: v.HourStat.RechargeVip.Total.Web.Value, + HourNormalVip: v.HourStat.RechargeVip.Total.Normal.Value, + } + + resp.YesterdayGraphList = append(resp.YesterdayGraphList, tmp) + } + + data = resp + code = stdLog.Success + return +} + +// 获取日常统计信息列表 +func ChannelStatExport(ctx context.Context, param proto.ChannelStatExportReq) (string, error) { + statfilter := bson.M{} + opt := &options.FindOptions{} + opt.SetSort(bson.M{channelmod.FN.ChannelStat.SumDate: -1}) + opt.SetLimit(5000) + + if param.AppId != nil && len(*param.AppId) > 0 { + statfilter[channelmod.FN.ChannelStat.AppId] = bson.M{"$in": *param.AppId} + } + + if param.Channel != nil { + statfilter[channelmod.FN.ChannelStat.Channel] = *param.Channel + } + if param.StartTime != nil && param.EndTime != nil { + statfilter[channelmod.FN.ChannelStat.SumDate] = bson.M{"$gte": *param.StartTime, "$lte": *param.EndTime} + } + + statList, err := channelmod.FindManyChannelStat(ctx, statfilter, opt) + if err != nil { + return "", err + } + + filePath := fmt.Sprintf("./tmp/渠道统计信息列表-%s.xlsx", time.Now().Format("2006-01-02 15:04:05")) + if sErr := channelStatexport(filePath, statList); sErr != nil { + return "", sErr + } + return filePath, nil +} + +func channelStatexport(rPath string, statInfos channelmod.ChannelStatList) error { + f := excelize.NewFile() + sheetName := "Sheet1" + // 设置列宽 + f.SetColWidth("Sheet1", "A", "O", 20) + // 设置表头行高 + f.SetRowHeight("Sheet1", 1, 30) + // 设置表头样式 + headStyleID, _ := f.NewStyle(`{ + "font":{ + "color":"#333333", + "bold":true, + "size":16, + "family":"arial" + }, + "alignment":{ + "vertical":"center", + "horizontal":"center" + } + }`) + f.SetCellStyle("Sheet1", "A1", "O1", headStyleID) + // 统计时间 app名称 所属渠道 总新增 总充值 + idx := f.NewSheet(sheetName) + var exportTransWaterTitle = map[string]string{ + "A1": "日期", + "B1": "APP名称", + "C1": "渠道码", + "D1": "总新增", + "E1": "总充值", + } + for k, v := range exportTransWaterTitle { + f.SetCellValue(sheetName, k, v) + } + appInfos, _ := appInfoMod.GetAllAppInfo(context.Background()) + + for k, v := range statInfos { + i := 'A' // i 不能超过Z,即列输不能超过26列,超出将出现bug + date := v.SumDate.Local().Format("2006-01-02") + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), date) //日期 + i++ + appName := "" + for _, appInfo := range appInfos { + if appInfo.AppId == v.AppId { + appName = appInfo.Name + } + } + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), appName) //APP名称 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Channel) //渠道吗 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.NewTotalCount) //总新增 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), float64(v.TotalAmount)/100) //总充值 + } + + f.SetActiveSheet(idx) + p, _ := os.Getwd() + fileName := path.Join(p, rPath) + if err := f.SaveAs(fileName); err != nil { + log.Error("SettlementInfo:export save file to disk failed", + log.Any("fileName", fileName), + log.E(err)) + return err + } + return nil +} diff --git a/service/statSer/game.go b/service/statSer/game.go new file mode 100644 index 0000000..150eeb6 --- /dev/null +++ b/service/statSer/game.go @@ -0,0 +1,133 @@ +package statSer + +import ( + "context" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/rechargegamemod" + "stat/models/withdrawGameOrdermod" +) + +// 获取充值明细(集团) +func GameRechargeList(ctx context.Context, param proto.ListBlocRechargeDetailsReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListBlocRechargeDetailsRes{ + Total: 0, + List: make([]proto.BlocRechargeDetailsInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + total, RechagerList, err := rechargegamemod.GetBlocRechargeDetailsList(ctx, param.AppId, param.StartTime, param.EndTime, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + appIds := make([]int32, 0) + appMap := make(map[int32]int32) + for _, v := range RechagerList { + if _, ok := appMap[v.AppId]; !ok { + appMap[v.AppId] = v.AppId + appIds = append(appIds, v.AppId) + } + } + //fmt.Println(appIds) + appInfoMap, err := MakeAppInfosMapByIds(ctx, appIds) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range RechagerList { + appName := "" + if appInfo, ok := appInfoMap[v.AppId]; ok { + appName = appInfo.Name + } + + tmp := proto.BlocRechargeDetailsInfo{ + UserId: v.PromCode, + AppName: appName, + SysType: v.SysType, + DevType: v.DevType, + ChannelName: v.ChannelName, + CID: v.CID, + Type: v.Type, + OrderId: v.OrderId, + Money: v.Money, + PayMoney: v.PayMoney, + Status: 3, + SuccessAt: v.SuccessAt, + } + resp.List = append(resp.List, tmp) + } + + resp.Total = total + + data = resp + code = stdLog.Success + return +} + +// 获取提现明细(集团) +func GameWithdrawList(ctx context.Context, param proto.ListBlocWithdrawDetailsReq) (code stdLog.CodeType, data interface{}, err error) { + resp := proto.ListBlocWithdrawDetailsRes{ + Total: 0, + List: make([]proto.ListBlocWithdrawDetailsInfo, 0), + } + + skip, limit := utils.ToDBPage(param.PageNum, param.PageSize) + total, RechagerList, err := withdrawGameOrdermod.GetBlocGameWithdrawOrderList(ctx, param.AppId, param.StartTime, param.EndTime, skip, limit) + if err != nil { + code = stdLog.Failure + return + } + + appIds := make([]int32, 0) + appMap := make(map[int32]int32) + for _, v := range RechagerList { + if _, ok := appMap[v.AppId]; !ok { + appMap[v.AppId] = v.AppId + appIds = append(appIds, v.AppId) + } + } + //fmt.Println(appIds) + appInfoMap, err := MakeAppInfosMapByIds(ctx, appIds) + if err != nil { + code = stdLog.Failure + return + } + + for _, v := range RechagerList { + appName := "" + if appInfo, ok := appInfoMap[v.AppId]; ok { + appName = appInfo.Name + } + + tmp := proto.ListBlocWithdrawDetailsInfo{ + UID: v.PromCode, + AppName: appName, + Name: v.Name, + Amount: v.Amount, + Money: v.Money, + PayMoney: v.PayMoney, + PayType: v.PayType, + OID: v.OID, + ActName: v.ActName, + Act: v.Act, + UserIP: v.UserIP, + DeviceType: v.DeviceType, + DevID: v.DevID, + Status: v.Status, + StatusDesc: v.StatusDesc, + SuccessAt: v.SuccessAt, + ReceivedAt: v.ReceivedAt, + } + resp.List = append(resp.List, tmp) + } + + resp.Total = total + + data = resp + code = stdLog.Success + return +} diff --git a/service/statSer/help.go b/service/statSer/help.go new file mode 100644 index 0000000..f940f52 --- /dev/null +++ b/service/statSer/help.go @@ -0,0 +1,617 @@ +package statSer + +import ( + "bytes" + "context" + "fmt" + "stat/api/proto" + "stat/models/appInfoMod" + "stat/models/channelmod" + "stat/models/dailyhourstatmod" + "stat/models/dailystatmod" + "strconv" + + "github.com/360EntSecGroup-Skylar/excelize" + "go.mongodb.org/mongo-driver/bson" +) + +type RuleMap map[string]*channelmod.ChannelDeductionRule + +func (c RuleMap) GetRule(channel string, appId int32) *channelmod.ChannelDeductionRule { + key := fmt.Sprintf("%s %d", channel, appId) + return c[key] +} + +func (c RuleMap) SetRule(rule *channelmod.ChannelDeductionRule) { + key := fmt.Sprintf("%s %d", rule.Channel, rule.AppId) + c[key] = rule +} + +func MakeRuleMap(ctx context.Context, channels []string) (RuleMap, error) { + ruleMap := make(RuleMap) + m := make(map[string]struct{}) + for _, s := range channels { + m[s] = struct{}{} + } + channels = make([]string, 0, len(m)) + for k := range m { + channels = append(channels, k) + } + rules, err := channelmod.FindManyChannelDeductionRule(ctx, bson.M{channelmod.FN.ChannelDeductionRule.Channel: bson.M{"$in": channels}}) + if err != nil { + return ruleMap, err + } + for _, item := range rules { + ruleMap.SetRule(item) + } + return ruleMap, nil +} + +func MakeAppInfosMapByIds(ctx context.Context, appIds []int32) (map[int32]*appInfoMod.AppInfo, error) { + r := make(map[int32]*appInfoMod.AppInfo) + + if len(appIds) == 0 { + return r, nil + } + + appList, err := appInfoMod.GetAppInfosByAppIds(ctx, appIds) + if err != nil { + return r, err + } + + for _, v := range appList { + _v := v + r[v.AppId] = &_v + } + + return r, nil +} + +func ExportDailyHourStat(transInfos []*proto.DailyHourStatInfo) (*bytes.Buffer, error) { + f := excelize.NewFile() + cell := func(row, col int) string { // row start form 0, col start form 0 + return fmt.Sprintf("%s%d", excelize.ToAlphaString(col), row+1) + } + sheetName := "Sheet1" + row0 := []string{0: "记录时间", 1: "APP名称", 2: "总充值", 3: "总新增", 4: "新增", 11: "充值", 19: "访问数", 21: "VIP", 24: "订单", 27: "落地页", 29: ""} + row1 := []string{4: "直推", 5: "裂变", 6: "安卓", 7: "IOS", 8: "自然", 9: "H5", 10: "扣量", 11: "直推", 12: "裂变", 13: "自然", + 14: "新增", 15: "老用户", 16: "复充", 17: "游戏充值", 18: "游戏提现", 19: "直推", 20: "裂变", 21: "余额", 22: "人民币", 23: "复充", + 24: "成功", 25: "拉起", 26: "成功率", 27: "安卓", 28: "商店包", 29: "企业签"} + // 设置列宽 + f.SetColWidth("Sheet1", excelize.ToAlphaString(0), excelize.ToAlphaString(1), 16) + f.SetColWidth("Sheet1", excelize.ToAlphaString(2), excelize.ToAlphaString(3), 10) + f.SetColWidth("Sheet1", excelize.ToAlphaString(4), excelize.ToAlphaString(len(row0)-1), 8) + // 设置表头行高 + f.SetRowHeight("Sheet1", 1, 30) + // 设置表头样式 + headStyleID, _ := f.NewStyle(`{ + "font":{ + "color":"#333333", + "bold":true, + "size":16, + "family":"arial" + }, + "alignment":{ + "vertical":"center", + "horizontal":"center" + } + }`) + + f.SetCellStyle("Sheet1", cell(0, 0), cell(0, len(row0)-1), headStyleID) + idx := f.NewSheet(sheetName) + // set main title + for col, name := range row0 { + f.SetCellValue(sheetName, cell(0, col), name) + } + // merge some title + var mergeCells = map[string]string{ + cell(0, 4): cell(0, 10), + cell(0, 11): cell(0, 18), + cell(0, 19): cell(0, 20), + cell(0, 21): cell(0, 23), + cell(0, 24): cell(0, 26), + cell(0, 27): cell(0, 29), + } + for hcell, vcell := range mergeCells { + f.MergeCell(sheetName, hcell, vcell) + } + // set sub title + for col, name := range row1 { + f.SetCellValue(sheetName, cell(1, col), name) + } + // set cell data + for k, v := range transInfos { + col := 0 + row := k + 2 + axis := func() string { + ret := cell(row, col) + col++ + return ret + } + fmtW := func(v int64) string { + return fmt.Sprintf("%.4f", float64(v)/float64(10000)) + } + f.SetCellValue(sheetName, axis(), v.SumDate.Local().Format("2006-01-02 15:04:05")) //记录时间 + f.SetCellValue(sheetName, axis(), v.AppName) //APP名称 + f.SetCellValue(sheetName, axis(), fmtW(v.DirectAmount+v.FissionAmount)) //总充值 + f.SetCellValue(sheetName, axis(), v.NewDirectCount+v.NewFissionCount) //总新增 + // Group 1 : E1-K1 = 7 + f.SetCellValue(sheetName, axis(), v.NewDirectCount) //新增-直推 + f.SetCellValue(sheetName, axis(), v.NewFissionCount) //新增-裂变 + f.SetCellValue(sheetName, axis(), v.NewAndroidCount) //新增-安卓 + f.SetCellValue(sheetName, axis(), v.NewIosCount) //新增-IOS + f.SetCellValue(sheetName, axis(), v.NewNaturalCount) //新增-自然 + f.SetCellValue(sheetName, axis(), v.NewH5Count) //新增-H5 + f.SetCellValue(sheetName, axis(), v.NewDeductionCount) //新增-扣量 + //Group 2 : L1-S1 = 8 + f.SetCellValue(sheetName, axis(), fmtW(v.DirectAmount)) //充值-直推 + f.SetCellValue(sheetName, axis(), fmtW(v.FissionAmount)) //充值-裂变 + f.SetCellValue(sheetName, axis(), fmtW(v.NaturalAmount)) //充值-自然 + f.SetCellValue(sheetName, axis(), fmtW(v.NewRechargeAmount)) //充值-新增 + f.SetCellValue(sheetName, axis(), fmtW(v.DirectAmount+v.FissionAmount-v.NewRechargeAmount)) //充值-老用户 + f.SetCellValue(sheetName, axis(), fmtW(v.RepeatAmount)) //充值-复充 + f.SetCellValue(sheetName, axis(), fmtW(v.GameRechageAmount)) //充值-游戏充值 + f.SetCellValue(sheetName, axis(), fmtW(v.GameWithdrawAmount)) //充值-游戏提现 + //Group 3 : T1-U1 = 2 + f.SetCellValue(sheetName, axis(), v.DirectVisitCount) //访问数-直推 + f.SetCellValue(sheetName, axis(), v.FissionVisitCount) //访问数-裂变 + //Group 4 : V1-X1 = 3 + f.SetCellValue(sheetName, axis(), fmtW(v.VipPayByAmount)) //VIP-余额 + f.SetCellValue(sheetName, axis(), fmtW(v.VipPayByMoney)) //VIP-人民币 + f.SetCellValue(sheetName, axis(), fmtW(v.VipRepeatAmount)) //VIP-复充 + //Group 5 : Y1-AA1 = 3 + f.SetCellValue(sheetName, axis(), v.SuccessRechargeOrder) //订单-成功 + f.SetCellValue(sheetName, axis(), v.TotalRechargeOrder) //订单-拉起 + f.SetCellValue(sheetName, axis(), v.RechargeSuccessRate) //订单-成功率 + //Group 6 : AB1-AD1 = 3 + f.SetCellValue(sheetName, axis(), v.LandpageAndroidClick) //落地页-安卓 + f.SetCellValue(sheetName, axis(), v.LandpageIosAppstoreClick) //落地页-商店包 + f.SetCellValue(sheetName, axis(), v.LandpageIosAthorClick) //落地页-企业签 + } + f.SetActiveSheet(idx) + buf := new(bytes.Buffer) + if err := f.Write(buf); err != nil { + return nil, err + } + return buf, nil +} + +func DailyStatInfoAccumulate(base, value *proto.DailyStatInfo) { + base.TotalNewCount += value.TotalNewCount + base.NewDirectCount += value.NewDirectCount + base.NewFissionCount += value.NewFissionCount + base.NewDeductionCount += value.NewDeductionCount + base.NewNaturalCount += value.NewNaturalCount + base.NewWebCount += value.NewWebCount + base.NewDistrictCount += value.NewDistrictCount + base.NewNormalCount += value.NewNormalCount + base.AndroidAddCount += value.AndroidAddCount + base.IosAddCount += value.IosAddCount + base.H5FormalCount += value.H5FormalCount + base.H5AddCount += value.H5AddCount + base.H5PcAddCount += value.H5PcAddCount + base.H5IosAddCount += value.H5IosAddCount + base.H5AndroidAddCount += value.H5AndroidAddCount + base.TotalVisitCount += value.TotalVisitCount + base.DirectVisitCount += value.DirectVisitCount + base.FissionVisitCount += value.FissionVisitCount + base.NaturalVisitCount += value.NaturalVisitCount + base.TodayDistrictVisitCount += value.TodayDistrictVisitCount + base.TodayWebVisitCount += value.TodayWebVisitCount + base.TodayNormalVisitCount += value.TodayNormalVisitCount + base.TodayIosVisitCount += value.TodayIosVisitCount + base.TodayAndroidVisitCount += value.TodayAndroidVisitCount + base.TodayH5VisitCount += value.TodayH5VisitCount + base.TodayH5PcVisitCount += value.TodayH5PcVisitCount + base.TodayH5IosVisitCount += value.TodayH5IosVisitCount + base.TodayH5AndroidVisitCount += value.TodayH5AndroidVisitCount + + base.LightVisitCount += value.LightVisitCount + base.LightDirectVisitCount += value.LightDirectVisitCount + base.LightFissionVisitCount += value.LightFissionVisitCount + base.LightDeductionVisitCount += value.LightDeductionVisitCount + base.LightNaturalVisitCount += value.LightNaturalVisitCount + base.LightWebVisitCount += value.LightWebVisitCount + base.LightDistrictVisitCount += value.LightDistrictVisitCount + base.LightNormalVisitCount += value.LightNormalVisitCount + + base.LightAddCount += value.LightAddCount + base.LightGuestAddCount += value.LightGuestAddCount + base.LightFormalAddCount += value.LightFormalAddCount + base.LightDirectCount += value.LightDirectCount + base.LightFissionCount += value.LightFissionCount + base.LightDeductionCount += value.LightDeductionCount + base.LightNaturalCount += value.LightNaturalCount + base.LightWebCount += value.LightWebCount + base.LightDistrictCount += value.LightDistrictCount + base.LightNormalCount += value.LightNormalCount + + base.TotalAmount += value.TotalAmount + base.DirectAmount += value.DirectAmount + base.FissionAmount += value.FissionAmount + base.DeductionAmount += value.DeductionAmount + base.NaturalAmount += value.NaturalAmount + base.TodayDistrictRecharge += value.TodayDistrictRecharge + base.TodayWebRecharge += value.TodayWebRecharge + base.TodayNormalRecharge += value.TodayNormalRecharge + base.TodayAndroidRecharge += value.TodayAndroidRecharge + base.TodayIosRecharge += value.TodayIosRecharge + base.LightRechargeCount += value.LightRechargeCount + base.LightDirectRechargeCount += value.LightDirectRechargeCount + base.LightFissionRechargeCount += value.LightFissionRechargeCount + base.LightDeductionRechargeCount += value.LightDeductionRechargeCount + base.LightNaturalRechargeCount += value.LightNaturalRechargeCount + base.LightWebRechargeCount += value.LightWebRechargeCount + base.LightDistrictRechargeCount += value.LightDistrictRechargeCount + base.LightNormalRechargeCount += value.LightNormalRechargeCount + base.LightRechargeAmount += value.LightRechargeAmount + base.LightDirectRechargeAmount += value.LightDirectRechargeAmount + base.LightFissionRechargeAmount += value.LightFissionRechargeAmount + base.LightDeductionRechargeAmount += value.LightDeductionRechargeAmount + base.LightNaturalRechargeAmount += value.LightNaturalRechargeAmount + base.LightWebRechargeAmount += value.LightWebRechargeAmount + base.LightDistrictRechargeAmount += value.LightDistrictRechargeAmount + base.LightNormalRechargeAmount += value.LightNormalRechargeAmount + base.TodayH5Recharge += value.TodayH5Recharge + base.TodayH5FormalRecharge += value.TodayH5FormalRecharge + base.TodayH5PcRecharge += value.TodayH5PcRecharge + base.TodayH5IosRecharge += value.TodayH5IosRecharge + base.TodayH5AndroidRecharge += value.TodayH5AndroidRecharge + base.VipPayByMoney += value.VipPayByMoney + base.PayForAthor += value.TotalAmount - value.VipPayByMoney + base.RepeatAmount += value.RepeatAmount + base.RepeatVipMoney += value.RepeatVipMoney + base.GameRechageAmount += value.GameRechageAmount + base.GameWithdrawAmount += value.GameWithdrawAmount + base.OldRechargeAmount += value.OldRechargeAmount + base.OldVipRecharge += value.OldVipRecharge + base.OldCoinRecharge += value.OldCoinRecharge + base.NewRechargeCount += value.NewRechargeCount + base.NewRechargeAmount += value.NewRechargeAmount + base.NewVipRecharge += value.NewVipRecharge + base.NewCoinRecharge += value.NewCoinRecharge + base.SuccessRechargeOrder += value.SuccessRechargeOrder + base.TotalRechargeOrder += value.TotalRechargeOrder + base.Day1RetainRate += value.Day1RetainRate + base.Day3RetainRate += value.Day3RetainRate + base.Day7RetainRate += value.Day7RetainRate + base.LandpageAndroidClick += value.LandpageAndroidClick + base.LandpageIosAppstoreClick += value.LandpageIosAppstoreClick + base.LandpageIosAthorClick += value.LandpageIosAthorClick + base.LandpageIosH5Click += value.LandpageIosH5Click + if base.NewCoinRecharge < 0 { + base.NewCoinRecharge = 0 + } + if base.OldVipRecharge < 0 { + base.OldVipRecharge = 0 + } + if base.OldCoinRecharge < 0 { + base.OldCoinRecharge = 0 + } + + if base.TotalRechargeOrder > 0 { + base.RechargeSuccessRate = fmt.Sprintf("%.3f", float64(base.SuccessRechargeOrder)/float64(base.TotalRechargeOrder)) + } + if base.TotalNewCount != 0 { + base.NewRechargeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(base.NewRechargeCount)/float64(base.TotalNewCount))*100), 64) + } + if base.TotalVisitCount != 0 { + base.VisitRechargeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(base.SuccessRechargeOrder)/float64(base.TotalVisitCount))*100), 64) + } + if base.SuccessRechargeOrder != 0 { + base.ARPPU = base.TotalAmount / base.SuccessRechargeOrder // 金额 + } + if base.TotalNewCount != 0 { + base.ARPU = base.TotalAmount / base.TotalNewCount // 金额 + } +} + +func DailyStatToInfo(src *dailystatmod.DailyStatMod) *proto.DailyStatInfo { + src.CorrectValidData() + ret := &proto.DailyStatInfo{ + SumDate: src.SumDate, + AppId: src.AppId, + AppName: "", // 外面赋值 + TotalNewCount: src.NewTotalCount, + NewDirectCount: src.NewDirectCount, + NewFissionCount: src.NewFissionCount, + NewDeductionCount: src.NewDeductionCount, + NewNaturalCount: src.NewNaturalCount, + NewWebCount: src.NewWebCount, + NewDistrictCount: src.NewDistrictCount, + NewNormalCount: src.NewNormalCount, + LightAddCount: src.LightAddCount, + LightGuestAddCount: src.LightGuestAddCount, + LightFormalAddCount: src.LightFormalAddCount, + LightDirectCount: src.LightDirectCount, + LightFissionCount: src.LightFissionCount, + LightDeductionCount: src.LightDeductionCount, + LightNaturalCount: src.LightNaturalCount, + LightWebCount: src.LightWebCount, + LightDistrictCount: src.LightDistrictCount, + LightNormalCount: src.LightNormalCount, + AndroidAddCount: src.AndroidAddCount, + IosAddCount: src.IosAddCount, + H5FormalCount: src.H5FormalCount, + H5AddCount: src.H5AddCount, + H5PcAddCount: src.H5PcAddCount, + H5IosAddCount: src.H5IosAddCount, + H5AndroidAddCount: src.H5AndroidAddCount, + TotalVisitCount: src.TotalVisitCount, + DirectVisitCount: src.DirectVisitCount, + FissionVisitCount: src.FissionVisitCount, + NaturalVisitCount: src.NaturalVisitCount, + TodayDistrictVisitCount: src.TodayDistrictVisitCount, + TodayWebVisitCount: src.TodayWebVisitCount, + TodayNormalVisitCount: src.TodayNormalVisitCount, + TodayIosVisitCount: src.TodayIosVisitCount, + TodayAndroidVisitCount: src.TodayAndroidVisitCount, + LightVisitCount: src.LightVisitCount, + LightDirectVisitCount: src.LightDirectVisitCount, + LightFissionVisitCount: src.LightFissionVisitCount, + LightDeductionVisitCount: src.LightDeductionVisitCount, + LightNaturalVisitCount: src.LightNaturalVisitCount, + LightWebVisitCount: src.LightWebVisitCount, + LightDistrictVisitCount: src.LightDistrictVisitCount, + LightNormalVisitCount: src.LightNormalVisitCount, + TodayH5VisitCount: src.TodayH5VisitCount, + TodayH5PcVisitCount: src.TodayH5PcVisitCount, + TodayH5IosVisitCount: src.TodayH5IosVisitCount, + TodayH5AndroidVisitCount: src.TodayH5AndroidVisitCount, + TotalAmount: src.TotalAmount, + DirectAmount: src.DirectAmount, + FissionAmount: src.FissionAmount, + DeductionAmount: src.DeductionAmount, + NaturalAmount: src.NaturalAmount, + TodayDistrictRecharge: src.TodayDistrictRecharge, + TodayWebRecharge: src.TodayWebRecharge, + TodayNormalRecharge: src.TodayNormalRecharge, + TodayAndroidRecharge: src.TodayAndroidRecharge, + TodayIosRecharge: src.TodayIosRecharge, + LightRechargeCount: src.LightRechargeCount, + LightDirectRechargeCount: src.LightDirectRechargeCount, + LightFissionRechargeCount: src.LightFissionRechargeCount, + LightDeductionRechargeCount: src.LightDeductionRechargeCount, + LightNaturalRechargeCount: src.LightNaturalRechargeCount, + LightWebRechargeCount: src.LightWebRechargeCount, + LightDistrictRechargeCount: src.LightDistrictRechargeCount, + LightNormalRechargeCount: src.LightNormalRechargeCount, + LightRechargeAmount: src.LightRechargeAmount, + LightDirectRechargeAmount: src.LightDirectRechargeAmount, + LightFissionRechargeAmount: src.LightFissionRechargeAmount, + LightDeductionRechargeAmount: src.LightDeductionRechargeAmount, + LightNaturalRechargeAmount: src.LightNaturalRechargeAmount, + LightWebRechargeAmount: src.LightWebRechargeAmount, + LightDistrictRechargeAmount: src.LightDistrictRechargeAmount, + LightNormalRechargeAmount: src.LightNormalRechargeAmount, + TodayH5Recharge: src.TodayH5Recharge, + TodayH5FormalRecharge: src.TodayH5FormalRecharge, + TodayH5PcRecharge: src.TodayH5PcRecharge, + TodayH5IosRecharge: src.TodayH5IosRecharge, + TodayH5AndroidRecharge: src.TodayH5AndroidRecharge, + ARPU: 0, // 下面赋值 + ARPPU: 0, // 下面赋值 + VipPayByMoney: src.VipPayByMoney, + PayForAthor: 0, // 下面赋值 + RepeatAmount: src.RepeatAmount, + RepeatVipMoney: src.RepeatVipMoney, + GameRechageAmount: src.GameRechageAmount, + GameWithdrawAmount: src.GameWithdrawAmount, + OldRechargeAmount: 0, // 下面赋值 + OldVipRecharge: 0, // 下面赋值 + OldCoinRecharge: 0, // 下面赋值 + NewRechargeCount: src.NewRechargeCount, + NewRechargeAmount: src.NewRechargeAmount, + NewVipRecharge: src.NewVipPayMoney, + NewCoinRecharge: 0, // 下面赋值 + NewRechargeRate: 0, // 下面赋值 + VisitRechargeRate: 0, // 下面赋值 + SuccessRechargeOrder: src.SuccessRechargeOrder, + TotalRechargeOrder: src.TotalRechargeOrder, + RechargeSuccessRate: "", //下面赋值 + Day1RetainRate: src.Day1RetainRate, + Day3RetainRate: src.Day3RetainRate, + Day7RetainRate: src.Day7RetainRate, + LandpageAndroidClick: src.LandpageAndroidClick, + LandpageIosAppstoreClick: src.LandpageIosAppstoreClick, + LandpageIosAthorClick: src.LandpageIosAthorClick, + LandpageIosH5Click: src.LandpageIosH5Click, + UpdatedAt: src.UpdatedAt, + } + if ret.TotalNewCount == 0 { + ret.TotalNewCount = ret.NewDirectCount + ret.NewFissionCount + ret.NewDeductionCount + } + if ret.TotalVisitCount == 0 { + ret.TotalVisitCount = ret.DirectVisitCount + ret.FissionVisitCount + ret.DeductionVisitCount + } + if ret.TotalAmount == 0 { + ret.TotalAmount = ret.DirectAmount + ret.FissionAmount + ret.DeductionAmount + } + + ret.PayForAthor = ret.TotalAmount - ret.VipPayByMoney + ret.OldRechargeAmount = ret.TotalAmount - ret.NewRechargeAmount + ret.OldVipRecharge = ret.VipPayByMoney - ret.NewVipRecharge + ret.OldCoinRecharge = ret.OldRechargeAmount - ret.OldVipRecharge + ret.NewCoinRecharge = ret.NewRechargeAmount - ret.NewVipRecharge + + if ret.NewCoinRecharge < 0 { + ret.NewCoinRecharge = 0 + } + if ret.OldVipRecharge < 0 { + ret.OldVipRecharge = 0 + } + if ret.OldCoinRecharge < 0 { + ret.OldCoinRecharge = 0 + } + + if ret.TotalRechargeOrder > 0 { + ret.RechargeSuccessRate = fmt.Sprintf("%.3f", float64(ret.SuccessRechargeOrder)/float64(ret.TotalRechargeOrder)) + } + if ret.TotalNewCount != 0 { + ret.ARPU = ret.TotalAmount / ret.TotalNewCount // 金额 + ret.NewRechargeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(ret.NewRechargeCount)/float64(ret.TotalNewCount))*100), 64) + } + if ret.TotalVisitCount != 0 { + ret.VisitRechargeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(ret.SuccessRechargeOrder)/float64(ret.TotalVisitCount))*100), 64) + } + if ret.SuccessRechargeOrder != 0 { + ret.ARPPU = ret.TotalAmount / ret.SuccessRechargeOrder // 金额 + } + + return ret +} + +func DailyHourStatToInfo(src *dailyhourstatmod.DailyHourStat) *proto.DailyHourStatInfo { + src.CorrectValidData() + ret := &proto.DailyHourStatInfo{ + SumDate: src.SumDate, + AppId: src.AppId, + SumHour: src.SumHour, + AppName: "", + NewTotalCount: src.NewTotalCount, + NewDirectCount: src.NewDirectCount, + NewFissionCount: src.NewFissionCount, + NewDeductionCount: src.NewDeductionCount, + NewNaturalCount: src.NewNaturalCount, + NewWebCount: src.NewWebCount, + NewNormalCount: src.NewNormalCount, + NewDistrictCount: src.NewDistrictCount, + NewAndroidCount: src.NewAndroidCount, + NewIosCount: src.NewIosCount, + NewLightCount: src.NewLightCount, + NewLightGuestCount: src.NewLightGuestCount, + NewLightFormalCount: src.NewLightFormalCount, + NewLightDirectCount: src.NewLightDirectCount, + NewLightFissionCount: src.NewLightFissionCount, + NewLightDeductionCount: src.NewLightDeductionCount, + NewLightNaturalCount: src.NewLightNaturalCount, + NewLightWebCount: src.NewLightWebCount, + NewLightNormalCount: src.NewLightNormalCount, + NewLightDistrictCount: src.NewLightDistrictCount, + NewH5Count: src.NewH5Count, + NewH5FormalCount: src.NewH5FormalCount, + NewH5PcCount: src.NewH5PcCount, + NewH5IosCount: src.NewH5IosCount, + NewH5AndroidCount: src.NewH5AndroidCount, + TotalVisitCount: src.TotalVisitCount, + DirectVisitCount: src.DirectVisitCount, + FissionVisitCount: src.FissionVisitCount, + NaturalVisitCount: src.NaturalVisitCount, + WebVisitCount: src.WebVisitCount, + NormalVisitCount: src.NormalVisitCount, + DistrictVisitCount: src.DistrictVisitCount, + IosVisitCount: src.IosVisitCount, + AndroidVisitCount: src.AndroidVisitCount, + LightVisitCount: src.LightVisitCount, + LightVisitDirectCount: src.LightVisitDirectCount, + LightVisitFissionCount: src.LightVisitFissionCount, + LightVisitDeductionCount: src.LightVisitDeductionCount, + LightVisitNaturalCount: src.LightVisitNaturalCount, + LightVisitWebCount: src.LightVisitWebCount, + LightVisitNormalCount: src.LightVisitNormalCount, + LightVisitDistrictCount: src.LightVisitDistrictCount, + H5VisitCount: src.H5VisitCount, + H5PcVisitCount: src.H5PcVisitCount, + H5IosVisitCount: src.H5IosVisitCount, + H5AndroidVisitCount: src.H5AndroidVisitCount, + TotalAmount: src.TotalAmount, + SuccessRechargeOrder: src.SuccessRechargeOrder, + DirectAmount: src.DirectAmount, + DirectAmountCount: src.DirectAmountCount, + FissionAmount: src.FissionAmount, + FissionAmountCount: src.FissionAmountCount, + NaturalAmount: src.NaturalAmount, + NaturalAmountCount: src.NaturalAmountCount, + DeductionAmount: src.DeductionAmount, + DeductionAmountCount: src.DeductionAmountCount, + WebAmount: src.WebAmount, + WebAmountCount: src.WebAmountCount, + NormalAmount: src.NormalAmount, + NormalAmountCount: src.NormalAmountCount, + DistrictAmount: src.DistrictAmount, + DistrictAmountCount: src.DistrictAmountCount, + AndroidAmount: src.AndroidAmount, + AndroidAmountCount: src.AndroidAmountCount, + IosAmount: src.IosAmount, + IosAmountCount: src.IosAmountCount, + LightAmount: src.LightAmount, + LightAmountCount: src.LightAmountCount, + LightDirectAmount: src.LightDirectAmount, + LightDirectAmountCount: src.LightDirectAmountCount, + LightFissionAmount: src.LightFissionAmount, + LightFissionAmountCount: src.LightFissionAmountCount, + LightDeductionAmount: src.LightDeductionAmount, + LightDeductionAmountCount: src.LightDeductionAmountCount, + LightNaturalAmount: src.LightNaturalAmount, + LightNaturalAmountCount: src.LightNaturalAmountCount, + LightWebAmount: src.LightWebAmount, + LightWebAmountCount: src.LightWebAmountCount, + LightNormalAmount: src.LightNormalAmount, + LightNormalAmountCount: src.LightNormalAmountCount, + LightDistrictAmount: src.LightDistrictAmount, + LightDistrictAmountCount: src.LightDistrictAmountCount, + H5Amount: src.H5Amount, + H5AmountCount: src.H5AmountCount, + H5FormalAmount: src.H5FormalAmount, + H5FormalAmountCount: src.H5FormalAmountCount, + H5PcAmount: src.H5PcAmount, + H5PcAmountCount: src.H5PcAmountCount, + H5IosAmount: src.H5IosAmount, + H5IosAmountCount: src.H5IosAmountCount, + H5AndroidAmount: src.H5AndroidAmount, + H5AndroidAmountCount: src.H5AndroidAmountCount, + RepeatAmount: src.RepeatAmount, + RepeatAmountCount: src.RepeatAmountCount, + NewRechargeAmount: src.NewRechargeAmount, + NewRechargeCount: src.NewRechargeCount, + NewCoinRecharge: 0, + NewVipRecharge: 0, + OldCoinRecharge: 0, + OldVipRecharge: 0, + OldRechargeAmount: 0, + VipPayByMoney: src.VipPayByMoney, + VipPayByAmount: src.VipPayByAmount, + VipRepeatAmount: src.VipRepeatAmount, + TotalRechargeOrder: src.TotalRechargeOrder, + RechargeSuccessRate: "", + GameRechageAmount: src.GameRechageAmount, + GameWithdrawAmount: src.GameWithdrawAmount, + LandpageAndroidClick: src.LandpageAndroidClick, + LandpageIosAppstoreClick: src.LandpageIosAppstoreClick, + LandpageIosAthorClick: src.LandpageIosAthorClick, + LandpageIosH5Click: src.LandpageIosH5Click, + UpdatedAt: src.UpdatedAt, + } + + if ret.NewTotalCount == 0 { + ret.NewTotalCount = ret.NewDirectCount + ret.NewFissionCount + ret.NewDeductionCount + } + if ret.TotalVisitCount == 0 { + ret.TotalVisitCount = ret.DirectVisitCount + ret.FissionVisitCount + } + if ret.TotalAmount == 0 { + ret.TotalAmount = ret.DirectAmount + ret.FissionAmount + ret.DeductionAmount + } + + ret.VipPayByAmount = ret.TotalAmount - ret.VipPayByMoney + ret.OldRechargeAmount = ret.TotalAmount - ret.NewRechargeAmount + ret.OldVipRecharge = ret.VipPayByMoney - ret.NewVipRecharge + ret.OldCoinRecharge = ret.OldRechargeAmount - ret.OldVipRecharge + ret.NewCoinRecharge = ret.NewRechargeAmount - ret.NewVipRecharge + + if ret.NewCoinRecharge < 0 { + ret.NewCoinRecharge = 0 + } + if ret.OldVipRecharge < 0 { + ret.OldVipRecharge = 0 + } + if ret.OldCoinRecharge < 0 { + ret.OldCoinRecharge = 0 + } + + if ret.TotalRechargeOrder > 0 { + ret.RechargeSuccessRate = fmt.Sprintf("%.3f", float64(ret.SuccessRechargeOrder)/float64(ret.TotalRechargeOrder)) + } + + return ret +} diff --git a/service/storage/proxy/object.go b/service/storage/proxy/object.go new file mode 100644 index 0000000..911f55d --- /dev/null +++ b/service/storage/proxy/object.go @@ -0,0 +1,179 @@ +package proxy + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "stat/common/httpUtils" + + "strings" +) + +const ( + apiDomain = "http://file.dhuqh.com/file/upload" +) + +var ( + header = map[string]string{"Content-Type": "application/json"} +) + +const ( + Success = 200 +) + +func UploadImg(fileName string, data []byte, domain string) (pathStr string, err error) { + r := objreq{ + Name: fileName, + Data: base64.StdEncoding.EncodeToString(data), + } + jsonbytes, err := json.Marshal(r) + if err != nil { + return + } + if len(domain) == 0 { + domain = apiDomain + } + url := domain + if !strings.Contains(domain, "/file/upload") { + url = domain + "/file/upload" + } + resp, err := httpUtils.Post(url, header, bytes.NewReader(jsonbytes)) + if err != nil { + return + } + + var or objresp + if err = json.Unmarshal(resp.Data, &or); err != nil { + return + } + if or.Code != Success { + err = fmt.Errorf("上传失败:%s", or.Msg) + return + } + pathStr = or.Object.Name + return +} + +func fileServer() (url string) { + return "http://ts.dhuqh.com" +} + +func PostOk(baseInfo *BaseInfo, domain string) (result *VideoOkResult, err error) { + result = &VideoOkResult{} + paramJson, err := json.Marshal(baseInfo) + if err != nil { + return + } + if len(domain) == 0 { + domain = fileServer() + } + url := domain + if !strings.Contains(domain, "/video/shard/info") { + url = domain + "/video/shard/info" + } + fr, err := httpUtils.Post(url, header, bytes.NewReader(paramJson)) + if err != nil { + return + } + if err = json.Unmarshal(fr.Data, result); err != nil { + return nil, err + } + return +} + +func UploadVideo(domain string, body *ShardBody) (result *Result, err error) { + if body == nil { + return nil, errors.New("no video to upload") + } + if len(domain) == 0 { + domain = fileServer() + } + url := domain + if !strings.Contains(domain, "/video/shard/body") { + url = domain + "/video/shard/body" + } + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + resp, err := httpUtils.Post(url, header, bytes.NewBuffer(buf)) + if err != nil { + return nil, err + } + result = new(Result) + if err = json.Unmarshal(resp.Data, result); err != nil { + return nil, err + } + return +} + +func PostSearch(param *MediaSearchReq, domain string) (result *MediaSearchResp, err error) { + result = &MediaSearchResp{} + paramJson, err := json.Marshal(param) + if err != nil { + return + } + if len(domain) == 0 { + domain = fileServer() + } + url := domain + if !strings.Contains(domain, "/video/search/list") { + url = domain + "/video/search/list" + } + fr, err := httpUtils.Post(url, header, bytes.NewReader(paramJson)) + if err != nil { + return + } + if err = json.Unmarshal(fr.Data, result); err != nil { + return nil, err + } + return +} + +func PostUpdate(param *MediasUpdateReq, domain string) (result *MediasUpdateResp, err error) { + result = &MediasUpdateResp{} + paramJson, err := json.Marshal(param) + if err != nil { + return + } + if len(domain) == 0 { + domain = fileServer() + } + url := domain + if !strings.Contains(domain, "/video/update") { + url = domain + "/video/update" + } + fr, err := httpUtils.Post(url, header, bytes.NewReader(paramJson)) + if err != nil { + return + } + if err = json.Unmarshal(fr.Data, result); err != nil { + return nil, err + } + return +} + +func PostDelete(param *MediasDelReq, domain string) (result *MediasDelResp, err error) { + result = &MediasDelResp{} + paramJson, err := json.Marshal(param) + if err != nil { + return + } + if len(domain) == 0 { + domain = fileServer() + } + url := domain + if !strings.Contains(domain, "/video/delete") { + url = domain + "/video/delete" + } + fr, err := httpUtils.Post(url, header, bytes.NewReader(paramJson)) + if err != nil { + return + } + if err = json.Unmarshal(fr.Data, result); err != nil { + return nil, err + } + return +} diff --git a/service/storage/proxy/proto.go b/service/storage/proxy/proto.go new file mode 100644 index 0000000..4921b01 --- /dev/null +++ b/service/storage/proxy/proto.go @@ -0,0 +1,150 @@ +package proxy + +import "time" + +type objreq struct { + Name string `json:"fileName"` + Data string `json:"fileData"` +} + +type Obj struct { + Domain string `json:"domain"` + Name string `json:"fileName"` +} + +type objresp struct { + Code int `json:"code"` + Object Obj `json:"data"` + Msg string `json:"msg"` +} + +type ShardBody struct { + TaskId string `json:"taskId,omitempty"` // 文档md5 + Pos int `json:"pos,omitempty"` // 位置 + FileData string `json:"fileData,omitempty"` // 数据 + Type string `json:"type,omitempty"` + TotalPos int `json:"totalPos,omitempty"` // 分片总数 +} + +type Data struct { + Id string `json:"id,omitempty"` + VideoUri string `json:"videoUri,omitempty"` +} + +type Result struct { + Code int `json:"code,omitempty"` // + Data Data `json:"data,omitempty"` // + Msg string `json:"msg,omitempty"` // +} + +type VideoOkResult struct { + Code int `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` // + Data string `json:"data,omitempty"` +} + +type BaseInfo struct { + ID string `json:"id,omitempty"` + Title string `json:"title,omitempty"` // 标题 + CheckSum string `json:"checkSum,omitempty"` // md5校验码 + VideoTime int32 `json:"videTime"` // 影片时长 + Publish string `bson:"publish,omitempty"` // 视频发布者 + Type string `json:"type"` // 视频:长视频/短视频--时间阈值 + Preview int32 `json:"preview"` // 预览普通视频:1:预览 2: + Country string `json:"country"` // 国家 (国产、日本、欧美.... 前端固定) + FirstTag string `json:"firstTag,omitempty"` // 一级标签 + SecondTags []string `json:"secondTags,omitempty"` // 二级标签标签 + CoverImg []string `json:"coverImg,omitempty"` // 封面 + PreFileName string `json:"preFileName,omitempty"` // 预览文件 + Status string `json:"status,omitempty"` // 当前状态 + Size int64 `json:"size"` // 文件size,单位byte + Filename string `json:"filename,omitempty"` // 文件名称 + Desc string `json:"desc,omitempty"` // 详细描述 + Directors []string `json:"director,omitempty"` // 导演 + Actors []string `json:"actors,omitempty"` // 演员 + Studio string `json:"studio,omitempty"` // 工作室 + Bango string `json:"bango,omitempty"` // 番号,唯一 + Via string `json:"via,omitempty"` // 来源 + Remark string `json:"remark,omitempty"` // 备注 + AddedTime string `json:"addedTime,omitempty"` // 上架时间 + UploadTime string `json:"uploadTime,omitempty"` // 上传时间 +} + +type VideoUpdate struct { + ID string `json:"id,omitempty"` + Title *string `json:"title,omitempty"` // 标题 + Publish *string `bson:"publish,omitempty"` // 视频发布者 + Type *string `json:"type"` // 视频:长视频/短视频--时间阈值 + Preview *int32 `json:"preview"` // 预览:1:预览 2:普通视频 + Country *string `json:"country"` // 国家 (国产、日本、欧美.... 前端固定) + FirstTag *string `json:"firstTag,omitempty"` // 一级标签 + SecondTags *[]string `json:"secondTags,omitempty"` // 二级标签标签 + CoverImg *[]string `json:"coverImg,omitempty"` // 封面 + PreFileName *string `json:"preFileName,omitempty"` // 预览文件 + Status *string `json:"status,omitempty"` // 当前状态 + Desc *string `json:"desc,omitempty"` // 详细描述 + Directors *[]string `json:"director,omitempty"` // 导演 + Actors *[]string `json:"actors,omitempty"` // 演员 + Studio *string `json:"studio,omitempty"` // 工作室 + Bango *string `json:"bango,omitempty"` // 番号,唯一 + Via *string `json:"via,omitempty"` // 来源 + Remark *string `json:"remark,omitempty"` // 备注 + AddedTime *string `json:"addedTime,omitempty"` // 上架时间 + UploadTime *string `json:"uploadTime,omitempty"` // 上传时间 +} + +type VideoSearch struct { + ID string `json:"id,omitempty"` + Title *string `json:"title,omitempty"` // 标题 + Publish *string `bson:"publish,omitempty"` // 视频发布者 + Type *string `json:"type"` // 视频:长视频/短视频--时间阈值 + Preview *int32 `json:"preview"` // 预览:1:预览 2:普通视频 + Country *string `json:"country"` // 国家 (国产、日本、欧美.... 前端固定) + FirstTag *string `json:"firstTag,omitempty"` // 一级标签 + SecondTags *[]string `json:"secondTags,omitempty"` // 二级标签标签 + Status *string `json:"status,omitempty"` // 当前状态 + Directors *[]string `json:"director,omitempty"` // 导演 + Actors *[]string `json:"actors,omitempty"` // 演员 + Studio *string `json:"studio,omitempty"` // 工作室 + Bango *string `json:"bango,omitempty"` // 番号,唯一 + Via *string `json:"via,omitempty"` // 来源 + Remark *string `json:"remark,omitempty"` // 备注 + AddedTime *string `json:"addedTime,omitempty"` // 上架时间 + UploadTime *string `json:"uploadTime,omitempty"` // 上传时间 + Start *time.Time `json:"start"` // 开始时间 + End *time.Time `json:"end"` // 结束时间 +} + +type UploadVideoBodyResp struct { + Id string `json:"id"` // 文件服返回的上传文件Id + VideoUri string `json:"videoUri"` // 文件服返回的视频uri +} + +type MediaSearchReq struct { + PageNum int64 `json:"pageNum"` + PageSize int64 `json:"pageSize"` + Param *VideoSearch `json:"param"` +} + +//MediaSearchReq 媒体搜索请求返回 +type MediaSearchResp struct { + Total int64 `json:"total"` + List []BaseInfo `json:"list"` +} + +type MediasDelReq struct { + Ids []string `json:"id"` +} + +//MediasDelResp 请求批量删除媒体回复 +type MediasDelResp struct { +} + +type MediasUpdateReq struct { + Ids []string `json:"id"` + VideoUpdate +} + +//MediasUpdateResp 请求批量更新媒体回复 +type MediasUpdateResp struct { +} diff --git a/service/storage/upload.go b/service/storage/upload.go new file mode 100644 index 0000000..84d6ccc --- /dev/null +++ b/service/storage/upload.go @@ -0,0 +1,145 @@ +package storage + +import ( + "bytes" + "context" + "encoding/base64" + "errors" + "fmt" + "mime/multipart" + "stat/service/storage/proxy" + "strconv" + "sync" +) + +var ( + buffer = bytes.Buffer{} + mtx sync.Mutex +) + +// web后台上传使用, form-data方式上传 +func UploadImage(ctx context.Context, f *multipart.FileHeader, domain string) (path string, err error) { + if f == nil { + return "", errors.New("file is nil!") + } + var file multipart.File + if file, err = f.Open(); err != nil { + return + } + + defer file.Close() + + mtx.Lock() + defer mtx.Unlock() + buffer.Reset() + if _, err = buffer.ReadFrom(file); err != nil { + return + } + return proxy.UploadImg(f.Filename, buffer.Bytes(), domain) +} + +func UploadVideoBody(ctx context.Context, form *multipart.Form, domain string) (*proxy.Result, error) { + if form == nil { + return nil, errors.New("multipart from is nil") + } + sb, err := makeShardBodyByForm(form) + if err != nil { + return nil, err + } + return proxy.UploadVideo(domain, sb) +} + +func VideoBody(ctx context.Context, taskId, typ, domain string, pos int, data []byte) (*proxy.Result, error) { + body := &proxy.ShardBody{ + TaskId: taskId, + Pos: pos, + FileData: base64.StdEncoding.EncodeToString(data), + Type: typ, + } + if typ == "1" { + body.Type = "AV" + } else if typ == "2" { + body.Type = "SP" + } + return proxy.UploadVideo(domain, body) +} + +func UploadVideoOK(ctx context.Context, in *proxy.BaseInfo, domain string) (*proxy.VideoOkResult, error) { + if in.Type == "1" { + in.Type = "AV" + } else if in.Type == "2" { + in.Type = "SP" + } + return proxy.PostOk(in, domain) +} + +func makeShardBodyByForm(form *multipart.Form) (*proxy.ShardBody, error) { + poss := form.Value["pos"] + taskIds := form.Value["taskId"] + types := form.Value["type"] + fs := form.File["file"] + totalPoss := form.Value["totalChunks"] + + var ( + pos, total int + taskId string + typ string + f *multipart.FileHeader + err error + ) + + if len(fs) == 0 || fs[0] == nil { + return nil, errors.New("no file") + } + f = fs[0] + + if len(poss) == 0 || poss[0] == "" { + return nil, errors.New("no pos") + } + if pos, err = strconv.Atoi(poss[0]); err != nil { + return nil, fmt.Errorf("invalid pos") + } + if len(totalPoss) == 0 || totalPoss[0] == "" { + return nil, errors.New("no totalPos") + } + if total, err = strconv.Atoi(totalPoss[0]); err != nil { + return nil, fmt.Errorf("invalid totalPos") + } + + if len(taskIds) == 0 || taskIds[0] == "" { + return nil, errors.New("no pos") + } + taskId = taskIds[0] + + if len(types) == 0 || types[0] == "" { + return nil, errors.New("no type") + } + if types[0] == "1" { + typ = "AV" + } else if types[0] == "2" { + typ = "SP" + } else { + typ = types[0] + } + + file, ne := f.Open() + if ne != nil { + return nil, ne + } + defer file.Close() + mtx.Lock() + defer mtx.Unlock() + buffer.Reset() + if _, err = buffer.ReadFrom(file); err != nil { + return nil, err + } + + resp := &proxy.ShardBody{ + TaskId: taskId, + Pos: pos, + FileData: base64.StdEncoding.EncodeToString(buffer.Bytes()), + Type: typ, + TotalPos: total, + } + return resp, nil +} diff --git a/service/userinviteser/userinvite.go b/service/userinviteser/userinvite.go new file mode 100644 index 0000000..f805e7a --- /dev/null +++ b/service/userinviteser/userinvite.go @@ -0,0 +1,59 @@ +package userinviteser + +import ( + "context" + + "stat/api/proto" + "stat/common/log" + "stat/models/channelmod" + "stat/models/downloadinfo" + "stat/models/registermod" + + "go.mongodb.org/mongo-driver/bson" +) + +func UserDistictInfo(ctx context.Context, param proto.UserDistrictReq) (data interface{}, err error) { + dictrictInfo := proto.UserDistrictInfo{} + dictrictInfo.IsDirect = true + dictrictInfo.DistrictCode = param.DistrictCode + + if param.IP != "" { + if param.DistrictCode != "" { + channelInfo, _ := channelmod.FindOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: param.DistrictCode}) + if channelInfo == nil || channelInfo.Channel != param.DistrictCode { + param.DistrictCode = "" + } + } + if param.DistrictCode == "" { + // 根据IP查询是否下载 + data, _ := downloadinfo.FindOneChannelIP(ctx, param.AppId, param.IP, param.SysType) + if data.DC != "" { + log.Info("channel info by IP ", log.Any("IP", param.IP), log.Any("app", param.AppId), log.Any("dc", data.DC)) + dictrictInfo.IsDirect = true + dictrictInfo.DistrictCode = data.DC + } + if data.PC != "" && param.PromSeqe == "" { + log.Info("channel info by IP ", log.Any("IP", param.IP), log.Any("app", param.AppId), log.Any("dc", data.DC)) + dictrictInfo.IsDirect = false + dictrictInfo.ParentPromCode = data.PC + } + } + } + return dictrictInfo, nil +} + +func UserDistrictCodeInfo(ctx context.Context, param proto.UserDistrictCodeReq) (data interface{}, err error) { + resp := proto.UserDistrictCodeResp{ + UserList: make([]proto.UserDistrictCodeInfo, 0), + } + for _, userId := range param.UserIds { + registerInfo, _ := registermod.GetRegisterInfo(ctx, userId, param.AppId) + codeInfo := proto.UserDistrictCodeInfo{ + UserId: registerInfo.UserId, + RegisterTime: registerInfo.RegisterTime, + DistrictCode: registerInfo.DistrictCode, + } + resp.UserList = append(resp.UserList, codeInfo) + } + return resp, nil +} diff --git a/service/versionSer/h5config.go b/service/versionSer/h5config.go new file mode 100644 index 0000000..e4e292f --- /dev/null +++ b/service/versionSer/h5config.go @@ -0,0 +1,141 @@ +package versionSer + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "os" + "regexp" + "stat/api/proto" + "stat/common/utils" + downloadinfo "stat/models/downloadinfo" + "stat/models/versionMod" + "stat/service/cacheSer" + "stat/statg" + "time" + + "github.com/xxjwxc/public/myglobal/snowflake" +) + +func GenerateConfigFile(origin, target, configFile, DC, PC string) ([]byte, string) { + if len(DC) > 0 && len(PC) > 0 { + node, err := snowflake.NewNode(1) + if err == nil { + id := node.Generate() + target = fmt.Sprintf("%s?dc=%s&pc=%s&UID=%d", target, DC, PC, id) + } + } else if len(DC) > 0 { + node, err := snowflake.NewNode(1) + if err == nil { + id := node.Generate() + target = fmt.Sprintf("%s?dc=%s&UID=%d", target, DC, id) + } + } else if len(PC) > 0 { + node, err := snowflake.NewNode(1) + if err == nil { + id := node.Generate() + target = fmt.Sprintf("%s?pc=%s&UID=%d", target, PC, id) + } + } else { + node, err := snowflake.NewNode(1) + if err == nil { + id := node.Generate() + target = fmt.Sprintf("%s?UID=%d", target, id) + } + } + target = fmt.Sprintf("%s&isLight=true", target) + output, _, err := readFile("conf/"+configFile, origin, target) + if err != nil { + output, _ = os.ReadFile("conf/" + configFile) + } + return output, configFile +} + +func GetAppConfig(appId int32) (origin, target, config string) { + endpoint := statg.GlobalAppIdEndpoints[appId] + if endpoint != nil { + origin = endpoint.H5Origin + target = endpoint.H5Target + config = endpoint.H5Config + } + return +} + +// PageButtonClick 落地页点击下载返回最新的下载链接 +func GetH5Config(ctx context.Context, req *proto.H5ConfigReq, userAgent string, ip string) ([]byte, string) { + req.DC = utils.RepairDC(req.DC) + downloadInfo := &downloadinfo.DownloadInfoModel{ + AppId: req.AppId, + IP: ip, + PC: req.PC, + DC: req.DC, + SysType: "light", + PackageType: versionMod.Light, + PeerIP: ip, + Domain: req.Domain, + UserAgent: userAgent, + CreatedAt: time.Now(), + } + cacheSer.Writers.LandPageClickWriter.Add(downloadInfo) + origin, target, config := GetAppConfig(req.AppId) + if origin == "" || target == "" || config == "" { + return nil, "madou.mobileconfig" + } + return GenerateConfigFile(origin, target, config, req.DC, req.PC) +} + +func readFile(filePath string, origin, target string) ([]byte, bool, error) { + var err error + var data []byte + cacheKey := fmt.Sprintf("h5config#%s", filePath) + if cache, exists := cacheSer.Cache.Get(cacheKey); exists { + if item, ok := cache.([]byte); ok { + data = item + } + } + if data == nil { + data, err = os.ReadFile(filePath) + if err != nil { + return nil, false, err + } + cacheSer.Cache.Set(cacheKey, data, 0) + } + + reader := bufio.NewReader(bytes.NewReader(data)) + needHandle := false + output := make([]byte, 0) + for { + line, _, err := reader.ReadLine() + if err != nil { + if err == io.EOF { + return output, needHandle, nil + } + return nil, needHandle, err + } + if ok, _ := regexp.Match(origin, line); ok { + reg := regexp.MustCompile(origin) + newByte := reg.ReplaceAll(line, []byte(target)) + output = append(output, newByte...) + output = append(output, []byte("\n")...) + if !needHandle { + needHandle = true + } + } else { + output = append(output, line...) + output = append(output, []byte("\n")...) + } + } + return output, needHandle, nil +} + +func GetH5ConfigV2(ctx context.Context, req *proto.H5ConfigReq, ip string) proto.H5ConfigV2Resp { + if req.AppId == 694 { + return proto.H5ConfigV2Resp{ + URL: "http://awll.yangjiaolian.top/91seman.mobileconfig", + } + } + + return proto.H5ConfigV2Resp{} +} diff --git a/service/versionSer/helper.go b/service/versionSer/helper.go new file mode 100644 index 0000000..05ff3ab --- /dev/null +++ b/service/versionSer/helper.go @@ -0,0 +1,337 @@ +package versionSer + +import ( + "context" + "fmt" + "io" + "math/rand" + "os" + "os/exec" + "path/filepath" + "stat/common/crypt" + "stat/common/redis" + "stat/common/utils" + "stat/models/channelmod" + "stat/models/channelpackage" + "stat/models/versionMod" + "stat/statg" + "strings" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "golang.org/x/exp/slices" +) + +func GetChannelApkOutputPath(appId int32, channel string, version string, date time.Time) string { + endpoint := statg.GlobalAppIdEndpoints[appId] + if endpoint == nil { + return "" + } + if endpoint.NameEn == "" { + return "" + } + return fmt.Sprintf(`%s/package/%s_%s_%s-%s.apk`, endpoint.NameEn, endpoint.NameEn, date.Format("20060102150405"), version, channel) +} + +func GetPackageBaseDomain(appId int32) []string { + packageUrlString := statg.Conf.URL.PackageUrl + if appId == 999 && len(statg.Conf.URL.BiliPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.BiliPackageUrl + } else if appId == 777 && len(statg.Conf.URL.HuanqiuPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.HuanqiuPackageUrl + } else if appId == 444 && len(statg.Conf.URL.ManhuaPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.ManhuaPackageUrl + } + packageUrlArray := strings.Split(packageUrlString, ";") + return packageUrlArray +} + +func ApkReportErrorLinks(ctx context.Context, pack *channelpackage.ChannelPackage, msg []string) { + if time.Since(pack.CheckLink) > channelpackage.ApkCheckLinkDuration { + filter := bson.M{ + channelpackage.FN.ChannelPackage.Id: pack.Id, + channelpackage.FN.ChannelPackage.CheckLink: pack.CheckLink, + } + update := bson.M{ + "$set": bson.M{ + channelpackage.FN.ChannelPackage.CheckLink: time.Now(), + }, + } + // 更新成功是生成apk的必要条件 + if err := channelpackage.UpdateOneChannelPackage(ctx, filter, update); err != nil { + return + } + // 汇报TG + text := fmt.Sprintf("检测到渠道包链接无法下载:\n") + text += fmt.Sprintf("渠道:【%s】\n", pack.Channel) + text += fmt.Sprintf("应用:【%s,ID=%d】\n", statg.GlobalEndpoints.GetAppShortNameById(pack.AppId), pack.AppId) + text += fmt.Sprintf("版本:【%s】\n", pack.Version) + text += fmt.Sprintf("文件:【%s】\n", pack.FileName) + text += fmt.Sprintf("生成:【%s】\n", pack.GenTime.Format(time.DateTime)) + text += fmt.Sprintf("错误: %s\n", msg) + text += fmt.Sprintf("提示: /channel_apk -channel=%s -app=%d", pack.Channel, pack.AppId) + statg.Bot.SendChannelApkMessage(text) + } +} + +func ApkCheckLinks(pack *channelpackage.ChannelPackage, domains []string) (bool, []string) { + ctx := context.Background() + links := pack.GetAllLink(domains) + if len(links) <= 0 { + return false, links + } + var msg string + for i := 0; i < len(links); i++ { + link := links[i] + err := CheckPackageLink(ctx, link) + if err != nil { + msg += fmt.Sprintf("【链接:%s】错误:%s\n", link, err.Error()) + } + } + return false, links +} + +func TryMakeChannelApk(ctx context.Context, appId int32, channel string, version *versionMod.VersionModel, pack *channelpackage.ChannelPackage, reason string, forceMake bool, logBody io.Writer) (*channelpackage.ChannelPackage, error) { + // 检查版本有没有原始链接 + if len(version.Link) <= 0 { + return pack, fmt.Errorf("version %d link is empty", version.Id) + } + // 先检查渠道是否存在 + remoteFile := GetChannelApkOutputPath(appId, channel, version.VersionNum, time.Now()) + chanInfo, err := channelmod.FindOneChannelInfo(ctx, bson.M{ + channelmod.FN.ChannelInfo.Channel: channel, + }) + if err != nil { + return pack, fmt.Errorf("渠道包生成失败,查询渠道【%s】出错: %v", channel, err) + } + if !chanInfo.Status { + return pack, fmt.Errorf("渠道包生成失败,渠道【%s】已被禁用,请启用该渠道后再次尝试", channel) + } + if !slices.Contains(chanInfo.AppIds, appId) { + return pack, fmt.Errorf("渠道包生成失败,应用【%s, ID=%d】未在渠道【%s】代理应用的列表中【%v】", statg.GlobalEndpoints.GetAppShortNameById(appId), appId, channel, chanInfo.AppIds) + } + // 开始生成 + lockCode := rand.Int63() + packID := primitive.NewObjectID() + now := time.Now() + if pack == nil { + pack = &channelpackage.ChannelPackage{ + Id: packID, + AppId: appId, + Channel: channel, + Version: version.VersionNum, + FileName: version.Md5, + UrlPath: remoteFile, + Status: channelpackage.ChanApkStatusMaking, + Desc: version.Info, + Reason: reason, + GenError: "第一次生成", + GenCount: 0, + LockCode: lockCode, + LockTime: now, + GenTime: now, + CreatedAt: now, + UpdatedAt: now, + } + // 插入成功是生成apk的必要条件 + serr := channelpackage.InsertOneChannelPackage(ctx, pack) + if serr != nil { + return pack, fmt.Errorf("渠道包生成失败,插入渠道包记录失败: \n渠道:【%s】\n应用:【%s,ID=%d】\n错误: %s", channel, statg.GlobalEndpoints.GetAppShortNameById(appId), appId, serr.Error()) + } + } else { + packID = pack.Id + if ok, left, tip := pack.CanMake(forceMake); !ok { + return pack, fmt.Errorf("渠道包生成失败【%s】,请在过【%v】后,再次尝试生成渠道【%s】的渠道包", tip, left, channel) + } + filter := bson.M{ + channelpackage.FN.ChannelPackage.Id: packID, + channelpackage.FN.ChannelPackage.LockCode: pack.LockCode, + } + update := bson.M{ + "$set": bson.M{ + channelpackage.FN.ChannelPackage.LockCode: lockCode, + channelpackage.FN.ChannelPackage.LockTime: time.Now(), + channelpackage.FN.ChannelPackage.GenTime: time.Now(), + }, + } + // 更新成功是生成apk的必要条件 + if serr := channelpackage.UpdateOneChannelPackage(ctx, filter, update); serr != nil { + return pack, fmt.Errorf("update failed, code:%d, msg:%s", serr.Code, serr.Msg) + } + } + filter := bson.M{ + channelpackage.FN.ChannelPackage.Id: packID, + channelpackage.FN.ChannelPackage.LockCode: lockCode, + } + err = makeChannelApk(version.Link[0], channel, remoteFile, logBody) + if err != nil { + // write error + update := bson.M{ + "$inc": bson.M{ + channelpackage.FN.ChannelPackage.GenCount: 1, + }, + "$set": bson.M{ + channelpackage.FN.ChannelPackage.LockTime: time.Time{}, // 重置锁 + channelpackage.FN.ChannelPackage.GenError: err.Error(), + channelpackage.FN.ChannelPackage.Status: channelpackage.ChanApkStatusFailure, + }, + } + _ = channelpackage.UpdateOneChannelPackage(ctx, filter, update) + return pack, err + } + update := bson.M{ + "$set": bson.M{ + channelpackage.FN.ChannelPackage.GenError: "success", + channelpackage.FN.ChannelPackage.UrlPath: remoteFile, + channelpackage.FN.ChannelPackage.FileName: version.Md5, + channelpackage.FN.ChannelPackage.Version: version.VersionNum, + channelpackage.FN.ChannelPackage.GenTime: time.Now(), + channelpackage.FN.ChannelPackage.Reason: reason, + channelpackage.FN.ChannelPackage.Desc: version.Info, + channelpackage.FN.ChannelPackage.LockTime: time.Time{}, // 重置锁 + channelpackage.FN.ChannelPackage.Status: channelpackage.ChanApkStatusSuccess, + }, + } + if serr := channelpackage.UpdateOneChannelPackage(ctx, filter, update); serr != nil { + return pack, fmt.Errorf("update failed,, code:%d, msg:%s", serr.Code, serr.Msg) + } + + //if forceMake { + // // 自动开启渠道自动打包 + // update := bson.M{ + // "$set": bson.M{channelmod.FN.ChannelInfo.AutoGenApk: true}, + // } + // _ = channelmod.UpdateOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: channel}, update) + //} + + pack2, serr := channelpackage.FindOneChannelPackage(ctx, filter) + if serr != nil { + return pack, fmt.Errorf("find failed, code:%d, msg:%s", serr.Code, serr.Msg) + } + return pack2, nil +} + +func makeChannelApk(downUrl string, channel string, remoteFile string, logBody io.Writer) error { + var out []byte + var err error + // 生成临时apk文件名 + step := 1 + tempPath := os.TempDir() + srcName := utils.RandStringBytes(12) + dstName := utils.RandStringBytes(12) + tmpSrcApk := filepath.Join(tempPath, srcName+".apk") + tmpDstPath := filepath.Join(tempPath, dstName) + if logBody != nil { + logBody.Write([]byte(fmt.Sprintf("tmpSrcApk=%s\n", tmpSrcApk))) + logBody.Write([]byte(fmt.Sprintf("tmpDstPath=%s\n", tmpDstPath))) + } + // 下载apk原始文件 + step = 2 + cmd := exec.Command("/usr/bin/curl", + "-o", + tmpSrcApk, + downUrl) + out, err = cmd.Output() + if err != nil { + return fmt.Errorf("%w, step=%d", err, step) + } + if logBody != nil { + logBody.Write([]byte(fmt.Sprintf("step=%d, cmd=%s, out=%s\n", step, cmd.String(), string(out)))) + } + defer func() { + _ = os.Remove(tmpSrcApk) + }() + step = 3 + // 生成渠道包 + cmd = exec.Command("/usr/bin/java", // 测试服 /tools/jdk/bin/java 正式服 /usr/bin/java + "-jar", + "/usr/lib/jar/packer-ng-2.0.1.jar", + "generate", + fmt.Sprintf("--channels=%s", channel), + fmt.Sprintf("--output=%s", tmpDstPath), + tmpSrcApk) + out, err = cmd.Output() + if err != nil { + return fmt.Errorf("%w, step=%d", err, step) + } + if logBody != nil { + logBody.Write([]byte(fmt.Sprintf("step=%d, cmd=%s, out=%s\n", step, cmd.String(), string(out)))) + } + step = 4 + // 上传到下载服务器 + fileName := filepath.Join(tmpDstPath, fmt.Sprintf("%s-%s.apk", srcName, channel)) + defer func() { + _ = os.Remove(fileName) + }() + cmd = exec.Command("/usr/bin/curl", + "-T", + fileName, + "-u", + "213apk:5JLm6dKS42Nsxmif", + fmt.Sprintf("ftp://216.83.58.213:21/%s", remoteFile)) + out, err = cmd.Output() + if err != nil { + return fmt.Errorf("%w, step=%d", err, step) + } + if logBody != nil { + logBody.Write([]byte(fmt.Sprintf("step=%d, cmd=%s, out=%s\n", step, cmd.String(), string(out)))) + } + return nil +} + +func SendLinkErrorMessageToBot(text string) { + defer utils.RecoverError(nil) + key := crypt.StrToMd5(text) + hash := redis.NewHash(redis.StatRds.Client(), redis.GetDownloadCheckBotMsgHashKey()) + _, _ = hash.Expire(time.Hour) + if exists, err := hash.Exists(key); err == nil && !exists { + _ = statg.Bot.SendMonitorMessage(text) + _, _ = hash.Set(key, text) + } +} + +func CheckChannelApkAutoGen(ctx context.Context, appId int32, channel string, version *versionMod.VersionModel, pack *channelpackage.ChannelPackage) { + var err error + if apkGenLock.LockedCount() > channelpackage.ApkGenerateParallelMax { + return // 不能超出并行任务数 + } + lockKey := fmt.Sprintf("id=%d#ch=%s", appId, channel) + expired := time.Now().Add(5 * time.Minute) + if locked := apkGenLock.TryLock(lockKey, expired); locked { + defer apkGenLock.UnLock(lockKey, expired) + bEnable := statg.Conf.ApkGenEnable + if !bEnable { + channelInfo, _ := channelmod.FindOneChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: channel}) + if channelInfo != nil && channelInfo.AutoGenApk { + bEnable = true + } + } + if bEnable { + canMake := pack == nil + if !canMake { + canMake, _, _ = pack.CanMake(false) + } + if canMake { + go func() { + defer utils.RecoverError(nil) + pack, err = TryMakeChannelApk(ctx, appId, channel, version, pack, "", false, nil) + if err == nil && pack != nil { + text := fmt.Sprintf("渠道包已全自动生成:\n") + text += fmt.Sprintf("渠道:【%s】\n", pack.Channel) + text += fmt.Sprintf("应用:【%s,ID=%d】\n", statg.GlobalEndpoints.GetAppShortNameById(pack.AppId), pack.AppId) + text += fmt.Sprintf("版本:【%s】\n", version.VersionNum) + text += fmt.Sprintf("文件:【%s】\n", version.Md5) + text += fmt.Sprintf("发布:【%s】\n", version.CreatedAt.Format(time.DateTime)) + text += fmt.Sprintf("生成:【%s】\n", pack.GenTime.Format(time.DateTime)) + baseUrls := GetPackageBaseDomain(pack.AppId) + for index, baseUrl := range baseUrls { + text += fmt.Sprintf("下载链接-%d: %s\n", index, pack.GetRandomLink([]string{baseUrl})) + } + statg.Bot.SendChannelApkMessage(text) + } + }() + } + } + } +} diff --git a/service/versionSer/landingpage.go b/service/versionSer/landingpage.go new file mode 100644 index 0000000..93db974 --- /dev/null +++ b/service/versionSer/landingpage.go @@ -0,0 +1,394 @@ +package versionSer + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "math/rand" + "stat/api/proto" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/channelpackage" + "stat/models/downloadCpc" + downloadinfo "stat/models/downloadinfo" + "stat/models/versionMod" + "stat/service/cacheSer" + "stat/service/crossSer" + "stat/statg" + "strings" + "sync" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +type ChannelParams struct { + PC string `json:"i" bson:"i"` //推广码 + DC string `json:"dc" bson:"dc"` //商区序列 + CH string `json:"ch" bson:"ch"` //渠道 +} + +var ( + appSvrUrlDict = make(map[int32]string) + appSvrIdxDict = make(map[int32]statg.ServerIndex) + once sync.Once + apkGenLock = utils.NewExpiredLock() + landPageVisit = utils.NewExpiredLock() + landPageClick = utils.NewExpiredLock() + landPageVisitIpTimeout = time.Hour // 每个IP,1个小时内无论访问多少次,都算一次 + landPageClickIpTimeout = time.Hour // 每个IP,1个小时内无论访问多少次,都算一次 +) + +func Init() { + once.Do(func() { + for _, endpoint := range statg.GlobalEndpoints { + appSvrIdxDict[endpoint.AppId] = endpoint.OwnerIndex + if url, ok := statg.Conf.InnerServers[endpoint.OwnerIndex]; ok { + appSvrUrlDict[endpoint.AppId] = url + } + } + }) +} + +// CrossButtonClick 跨服务器点击下载返回最新的下载链接 +func CrossButtonClick(ctx context.Context, userAgent string, peerIP string, req *proto.PageButtonClickReq) (resp *proto.PageButtonClickResp, err error) { + req.Ip = peerIP + srvIdx := appSvrIdxDict[req.AppId] + if srvIdx == statg.ServerIndexNone { + return nil, fmt.Errorf("appid %d not found", req.AppId) + } + if srvIdx == statg.Conf.ServerIndex { + return PageButtonClick(ctx, peerIP, userAgent, req) + } + addr := appSvrUrlDict[req.AppId] + if addr == "" { + return nil, fmt.Errorf("appid %d server not found", req.AppId) + } + res := crossSer.CrossAppDownloadRes{} + err = crossSer.InnerRequest(addr+"/api/stat/inner/appDownload", req, &res, false) + if err != nil { + return nil, err + } + if res.Data == nil { + return nil, fmt.Errorf("data not found") + } + return res.Data, nil +} + +// PageButtonClick 落地页点击下载返回最新的下载链接 +func PageButtonClick(ctx context.Context, userAgent string, peerIP string, req *proto.PageButtonClickReq) (resp *proto.PageButtonClickResp, err error) { + resp = &proto.PageButtonClickResp{} + + var channelCode ChannelParams + // TODO 存储记录 + _ = json.Unmarshal([]byte(req.Channel), &channelCode) + + if req.Ip == "" { + req.Ip = peerIP + } + channelCode.DC = utils.RepairDC(channelCode.DC) + + if req.Terminal == "ios" && req.PackageType == versionMod.Light { + var h5Req = &proto.H5ConfigReq{ + AppId: req.AppId, + DC: channelCode.DC, + PC: channelCode.PC, + Domain: channelCode.PC, + } + resp.Terminal = req.Terminal + resp.PackageType = req.PackageType + resp.Status = true + resp.LightData, _ = GetH5Config(ctx, h5Req, userAgent, req.Ip) + return + } + + downloadInfo := &downloadinfo.DownloadInfoModel{ + AppId: req.AppId, + IP: req.Ip, + Domain: req.Domain, + PC: channelCode.PC, + DC: channelCode.DC, + CH: channelCode.CH, + SysType: strings.ToLower(strings.TrimSpace(req.Terminal)), + PackageType: req.PackageType, + PeerIP: peerIP, + UserAgent: userAgent, + CreatedAt: time.Now(), + } + //和APP统一 + if req.PackageType == versionMod.Shop { + downloadInfo.SysType = "h5_ios" + } + + if landPageClick.TryLock(req.Ip, time.Now().Add(landPageClickIpTimeout)) { + cacheSer.Writers.LandPageClickWriter.Add(downloadInfo) + } + if downloadInfo.IP == "" { + downloadInfo.IP = peerIP + } + + var data *versionMod.VersionModel + cacheKey := fmt.Sprintf("version_button#appId:%d#%s#%d", req.AppId, req.Terminal, req.PackageType) + if cache, exists := cacheSer.Cache.Get(cacheKey); exists { + if item, ok := cache.(*versionMod.VersionModel); ok { + data = item + } + } + if data == nil { + data, err = versionMod.ButtonClick(ctx, req.AppId, req.Terminal, req.PackageType) + if err != nil { + return nil, err + } + cacheSer.Cache.Set(cacheKey, data, 2*time.Minute) + } + + resp.PackageType = data.PackageType + resp.Status = data.Status + resp.Terminal = data.Terminal + resp.VersionNum = data.VersionNum + resp.BackUrl = data.BackLink + resp.Link = append(resp.Link, data.Link...) + + // IOS的TF包管理 + if req.PackageType == versionMod.Tf { + // 1. FT包管理 + + for _, tfInfo := range data.TfInfo { + one := proto.TfInfo{ + AppName: tfInfo.AppName, + AppIcon: tfInfo.AppIcon, + URL: tfInfo.URL, + } + resp.Tf = append(resp.Tf, one) + } + + if len(resp.Tf) == 0 { + resp.Tf = make([]proto.TfInfo, 0) + for _, v := range data.Link { + tmp := proto.TfInfo{ + URL: v, + } + if len(data.BackLink) > 0 { + tmp.BackUrl = data.BackLink + } + resp.Tf = append(resp.Tf, tmp) + } + } + + return resp, nil + } + + if data.Terminal == "ios" { + // 配置多个随机返回一个 + if len(data.Link) >= 1 { + resp.Link = make([]string, 0) + index := rand.Intn(len(data.Link)) + resp.Link = append(resp.Link, data.Link[index]) + } + return + } + + // 新增批量打包逻辑 + if req.Terminal == "android" && len(data.Md5) > 0 { + randTime := int64(60*60) + int64(rand.Intn(60*60)) + + requestPackageTime := time.Now().Add(-time.Second * time.Duration(randTime)) + // 下载链接 + projectString := "" + beginPath := "" + pathList := strings.Split(strings.Replace(data.Md5, ".apk", "", -1), "_") + if len(pathList) == 3 { + beginPath = strings.TrimSpace(pathList[len(pathList)-1]) + } else { + return + } + + endpoint := statg.GlobalAppIdEndpoints[req.AppId] + if endpoint != nil { + projectString = fmt.Sprintf("%s/out/%s/%s%s_", endpoint.NameEn, beginPath, endpoint.NameEn, requestPackageTime.Format("20060102")[2:]) + } + if projectString != "" { + packageUrlString := statg.Conf.URL.PackageUrl + if req.AppId == 999 && len(statg.Conf.URL.BiliPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.BiliPackageUrl + } else if req.AppId == 777 && len(statg.Conf.URL.HuanqiuPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.HuanqiuPackageUrl + } else if req.AppId == 444 && len(statg.Conf.URL.ManhuaPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.ManhuaPackageUrl + } + + packageUrlArray := strings.Split(packageUrlString, ";") + + if len(packageUrlArray) > 0 { + if len(channelCode.DC) > 0 { //&& + pack, serr := channelpackage.FindOneChannelPackage(ctx, bson.M{ + channelpackage.FN.ChannelPackage.AppId: req.AppId, + channelpackage.FN.ChannelPackage.Channel: channelCode.DC, + channelpackage.FN.ChannelPackage.Version: data.VersionNum, + channelpackage.FN.ChannelPackage.FileName: data.Md5, + }) + if serr == nil || serr.Code == stdLog.DataNotExist { + if pack != nil && pack.Status == channelpackage.ChanApkStatusSuccess { + pass, links := ApkCheckLinks(pack, packageUrlArray) + if pass { + resp.Link = links + _ = pack.IncDownCount(ctx) + return resp, nil + } else { + ApkReportErrorLinks(ctx, pack, links) + } + } else { + CheckChannelApkAutoGen(ctx, req.AppId, channelCode.DC, data, pack) + } + } + } + // 默认使用第一个 + passedLinks := make([]string, 0) + for _, packageLink := range packageUrlArray { + link := strings.TrimSpace(packageLink + projectString + data.Md5) + checklink := link + cerr := CheckPackageLink(ctx, checklink) + if cerr != nil { + // log.Error("AppVersion", log.Any("link", link), log.E(cerr)) + // if statg.Conf.RunMod == consts.RunModRelease && !slices.Contains([]int32{666, 998}, req.AppId) { + // appDict, _ := appInfoMod.GetAllAppIdNameMap(ctx) + // text := fmt.Sprintf("【%s】Android 下载链接异常:\n链接:%s\n错误:%s\n", appDict[req.AppId], link, cerr.Error()) + // SendLinkErrorMessageToBot(text) + // } + } else { + passedLinks = append(passedLinks, link) + } + } + if len(passedLinks) > 0 { + resp.Link = passedLinks + } + } else { + link := strings.TrimSpace(packageUrlString + projectString + data.Md5) + resp.Link = []string{link} + } + } + } + + return +} + +// PageButtonList 落地页获取下载按钮 +func PageButtonList(ctx context.Context, isIos bool, peerIP string, req *proto.PageButtonListReq) (resp *proto.PageButtonListResp, err error) { + resp = &proto.PageButtonListResp{ + IosTF: false, + } + var channelCode ChannelParams + // TODO 存储记录 + _ = json.Unmarshal([]byte(req.Channel), &channelCode) + + channelCode.DC = utils.RepairDC(channelCode.DC) + + req.Ip = peerIP + + if req.Ip != "" { + logInfo := &downloadCpc.DownloadCpc{ + AppId: req.AppId, + IP: req.Ip, + PC: channelCode.PC, + DC: channelCode.DC, + CH: channelCode.CH, + PeerIP: peerIP, + CreatedAt: time.Now(), + } + if landPageVisit.TryLock(req.Ip, time.Now().Add(landPageVisitIpTimeout)) { + cacheSer.Writers.LandPageVisitWriter.Add(logInfo) + } + } + cacheKey := fmt.Sprintf("version_button_list#appId:%d", req.AppId) + var buttons versionMod.VersionList + if cache, exists := cacheSer.Cache.Get(cacheKey); exists { + if list, ok := cache.(versionMod.VersionList); ok { + buttons = list + } + } + if buttons == nil { + buttons, err = versionMod.ButtonList(ctx, req.AppId) + if err != nil { + err = errors.New("服务器内部错误") + return + } + cacheSer.Cache.Set(cacheKey, buttons, 0) + } + + if len(buttons) < 1 { + err = errors.New("请开启版本") + return + } + + for _, value := range buttons { + if isIos && value.Terminal == "android" { + // 如果是ios设备请求,记录是android 跳过 + continue + } + if value.PackageType == versionMod.Enterprise && value.Terminal == "ios" { + resp.IosDown = true + } + if value.PackageType == versionMod.Shop && value.Terminal == "ios" { + resp.IosStore = true + if len(value.Link) > 0 { + resp.IosLink = value.Link[0] + } + } + if value.PackageType == versionMod.Tf && value.Terminal == "ios" { + resp.IosTF = true + } + if value.PackageType == versionMod.Light && value.Terminal == "ios" { + resp.IosH5 = true + } + } + // android下载按钮 + packageUrlString := statg.Conf.URL.PackageUrl + if req.AppId == 999 && len(statg.Conf.URL.BiliPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.BiliPackageUrl + } else if req.AppId == 777 && len(statg.Conf.URL.HuanqiuPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.HuanqiuPackageUrl + } else if req.AppId == 444 && len(statg.Conf.URL.ManhuaPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.ManhuaPackageUrl + } + packageUrlArray := strings.Split(packageUrlString, ";") + resp.AndroidButton = len(packageUrlArray) + // 是否有渠道包 + var version *versionMod.VersionModel + versionKey := fmt.Sprintf("version_button#appId:%d#%s#%d", req.AppId, "android", 0) + if cache, exists := cacheSer.Cache.Get(versionKey); exists { + if item, ok := cache.(*versionMod.VersionModel); ok { + version = item + } + } + if version == nil { + version, err = versionMod.ButtonClick(ctx, req.AppId, "android", 0) + if err != nil { + return nil, err + } + cacheSer.Cache.Set(cacheKey, version, 2*time.Minute) + } + + pack, serr := channelpackage.FindOneChannelPackage(ctx, bson.M{ + channelpackage.FN.ChannelPackage.AppId: req.AppId, + channelpackage.FN.ChannelPackage.Channel: channelCode.DC, + channelpackage.FN.ChannelPackage.Version: version.VersionNum, + channelpackage.FN.ChannelPackage.FileName: version.Md5, + }) + if serr != nil && serr.Code != stdLog.DataNotExist { + return nil, errors.New(serr.Msg) + } + if pack != nil && pack.Status == channelpackage.ChanApkStatusSuccess { + resp.HasChannelApk = true + } + + // ----------------End--------------- + + resp.Contact = proto.ContactInfo{ + Telegram: "https://t.me/madoutiktok", + Paoto: "https://ptcc.in/madouyingshi", + Madou: "http://madou101.com", + } + + return +} diff --git a/service/versionSer/web.go b/service/versionSer/web.go new file mode 100644 index 0000000..65971c9 --- /dev/null +++ b/service/versionSer/web.go @@ -0,0 +1,284 @@ +package versionSer + +import ( + "context" + "fmt" + "math/rand" + "net/http" + "stat/api/proto" + "stat/common/enum/consts" + "stat/common/genId" + "stat/common/log" + "stat/common/redis" + "stat/common/tf" + "stat/common/utils" + "stat/models/appInfoMod" + "stat/models/versionMod" + "stat/statg" + "strings" + "time" + + "github.com/caixw/lib.go/encoding/version" + "github.com/jinzhu/copier" +) + +// ListVersion 获取版本信息 +func ListVersion(ctx context.Context, req *proto.VersionListReq) (resp *proto.VersionListResp, err error) { + resp = &proto.VersionListResp{ + Data: make([]*proto.VersionInfo, 0), + } + + skip, limit := utils.ToDBPage(req.PageNum, req.PageSize) + + data, count, err := versionMod.GetVersionList(ctx, req.AppId, skip, limit) + if err != nil { + return nil, err + } + + appInfoList, err := appInfoMod.GetAllAppInfo(ctx) + if err != nil { + return nil, err + } + + for _, v := range data { + versionInfo := proto.VersionInfo{ + Id: v.Id, + AppId: v.AppId, + VersionNum: v.VersionNum, + Terminal: v.Terminal, + Link: v.Link, + Info: v.Info, + PackageType: v.PackageType, + IsForceUpdate: v.IsForceUpdate, + MinVersion: v.MinVersion, + Status: v.Status, + Size: v.Size, + Md5: v.Md5, + BackLink: v.BackLink, + } + for _, appinfo := range appInfoList { + if appinfo.AppId == v.AppId { + versionInfo.AppName = appinfo.Name + } + } + resp.Data = append(resp.Data, &versionInfo) + } + resp.Count = count + + return +} + +// DeleteVersion 删除版本 +func DeleteVersion(ctx context.Context, id int64) (err error) { + err = versionMod.DelVersion(ctx, id) + return +} + +// AddVersion 添加版本 +func AddVersion(ctx context.Context, req *proto.VersionAddReq) (err error) { + model := &versionMod.VersionModel{} + + // TODO:修改成指针 + err = copier.Copy(model, req) + if err != nil { + return + } + + model.TfInfo = make([]versionMod.TfInfo, 0) + if req.PackageType == versionMod.Tf { + for _, url := range req.Link { + tmp := versionMod.TfInfo{ + URL: strings.TrimSpace(url), + } + if req.PackageType == versionMod.Tf { + result, err := tf.CheckTFValid(url) + if err != nil { + log.Error("runCheckUrl CheckTFValid", log.Any("url", url), log.E(err)) + continue + } + tmp.AppIcon = result.AppIcon + tmp.AppName = result.AppName + } + model.TfInfo = append(model.TfInfo, tmp) + } + } + model.VersionNum = strings.TrimSpace(model.VersionNum) + model.CreatedAt = time.Now() + model.UpdatedAt = time.Now() + model.Id = genId.GetNextVersionId() + + err = versionMod.AddVersion(ctx, model) + return +} + +// DeleteVersion 删除版本 +func UpdateVersion(ctx context.Context, req *proto.VersionUpdateReq) (err error) { + model := &versionMod.VersionModel{} + err = copier.Copy(model, req) + if err != nil { + return + } + model.TfInfo = make([]versionMod.TfInfo, 0) + if req.PackageType != nil && *req.PackageType == versionMod.Tf { + for _, url := range *req.Link { + tmp := versionMod.TfInfo{ + URL: strings.TrimSpace(url), + } + if *req.PackageType == versionMod.Tf { + result, err := tf.CheckTFValid(url) + if err != nil { + log.Error("runCheckUrl CheckTFValid", log.Any("url", url), log.E(err)) + continue + } + tmp.AppIcon = result.AppIcon + tmp.AppName = result.AppName + } + model.TfInfo = append(model.TfInfo, tmp) + } + } + + model.UpdatedAt = time.Now() + + err = versionMod.UpdateVersion(ctx, model) + return +} + +func AppVersion(ctx context.Context, req *proto.AppVersionReq) (resp *proto.AppVersionResp, err error) { + var list1 []*versionMod.VersionModel + var list []*versionMod.VersionModel + resp = &proto.AppVersionResp{} + + if req.SysType == "android" { + list1, err = versionMod.FindVersByPkgTyps(ctx, req.AppId, req.SysType, req.CurVersion, 0) + if err != nil { + return + } + } else { + // ios 包 + list1, err = versionMod.FindIosVersion(ctx, req.AppId, req.SysType, req.CurVersion, []versionMod.PkgType{versionMod.Shop}) + if err != nil { + return + } + } + + list = make([]*versionMod.VersionModel, 0) + for _, v := range list1 { + if version.Compare(v.VersionNum, req.CurVersion) > 0 { + list = append(list, v) + } else if req.CurVersion == "9.9.9" { + list = append(list, v) + } + } + if len(list) == 0 || len(req.CurVersion) == 0 || req.CurVersion == "null" { + resp.HasNewVersion = false + return + } + + var minVersion string + for _, value := range list { + if len(value.MinVersion) > 0 && value.MinVersion > minVersion { + minVersion = value.MinVersion + break + } else if value.IsForceUpdate { + minVersion = value.VersionNum + } + } + + resp.HasNewVersion = true + resp.ServerVersion = list[0].VersionNum + resp.DownloadLink = list[0].Link + resp.Description = list[0].Info + resp.IsForceUpdate = list[0].IsForceUpdate + + if len(minVersion) > 0 { + if minVersion > req.CurVersion { + resp.IsForceUpdate = true + } + } + + if len(resp.DownloadLink) > 0 && len(resp.DownloadLink[0]) < 2 && list[0].Terminal == "ios" && len(list[0].BackLink) > 2 { + resp.DownloadLink = []string{list[0].BackLink} + return + } + + // // 新增批量打包逻辑 + if req.SysType == "android" && len(list[0].Md5) > 0 { + // 包名称:com.pf.ys201114 + randTime := int64(60*60) + int64(rand.Intn(60*60)) + + requestPackageTime := time.Now().Add(-time.Second * time.Duration(randTime)) // 报毒包随机 + // 下载链接 + projectString := "" + beginPath := "" + pathList := strings.Split(strings.Replace(list[0].Md5, ".apk", "", -1), "_") + if len(pathList) > 0 { + beginPath = strings.TrimSpace(pathList[len(pathList)-1]) + } else { + return + } + endpoint := statg.GlobalAppIdEndpoints[req.AppId] + if endpoint != nil { + projectString = fmt.Sprintf("%s/out/%s/%s%s_", endpoint.NameEn, beginPath, endpoint.NameEn, requestPackageTime.Format("20060102")[2:]) + } + if projectString != "" { + packageUrlString := statg.Conf.URL.PackageUrl + if req.AppId == 999 && len(statg.Conf.URL.BiliPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.BiliPackageUrl + } else if req.AppId == 777 && len(statg.Conf.URL.HuanqiuPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.HuanqiuPackageUrl + } else if req.AppId == 444 && len(statg.Conf.URL.ManhuaPackageUrl) > 0 { + packageUrlString = statg.Conf.URL.ManhuaPackageUrl + } + packageUrlArray := strings.Split(packageUrlString, ";") + packageUrl := packageUrlString + if len(packageUrlArray) > 0 { + // 默认使用第一个 + packageUrl = packageUrlArray[0] + } + link := strings.TrimSpace(packageUrl + projectString + list[0].Md5) + + checklink := link + cerr := CheckPackageLink(ctx, checklink) + if cerr != nil { + log.Error("AppVersion", log.Any("link", link), log.E(cerr)) + if statg.Conf.RunMod == consts.RunModRelease { + // 比特币和溅射淫行下载链接异常不需要报警 + if req.AppId != 998 { + //text := fmt.Sprintf("[警告]:应用名称:统计中心\nandroid下载链接异常: 版本:%s-->%s\n链接%s %s\n\n", req.CurVersion, list[0].VersionNum, link, cerr.Error()) + appDict, _ := appInfoMod.GetAllAppIdNameMap(ctx) + text := fmt.Sprintf("【%s】Android下载链接异常:\n链接:%s\n错误:%s\n", appDict[req.AppId], link, cerr.Error()) + SendLinkErrorMessageToBot(text) + } + } + } else { + resp.DownloadLink = []string{link} + } + } + } + return +} + +// CheckPackageLink 下载链接下载检测 +func CheckPackageLink(ctx context.Context, url_https string) (err error) { + url := strings.Replace(url_https, "https", "http", -1) + redisKey := fmt.Sprintf("channelpackagecheck:%s", url) + status, _ := redis.StatRds.Exists(redisKey) + if status { // 存在 + return nil + } + + // 检测下载地址 + resp, err := http.Head(url) + if err != nil { + return err + } + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusGatewayTimeout { + return fmt.Errorf("file is %d ", resp.StatusCode) + } + _ = redis.StatRds.Set(redisKey, "1", 24*time.Hour) + return nil +} + +func NewChannelDownLoadLink(ctx context.Context, req *proto.ChannelDownLoadLinkReq) (resp *proto.ChannelDownLoadLinkResp) { + return nil +} diff --git a/skd/job/advertisejob/advertisejob.go b/skd/job/advertisejob/advertisejob.go new file mode 100644 index 0000000..824adc5 --- /dev/null +++ b/skd/job/advertisejob/advertisejob.go @@ -0,0 +1,374 @@ +package advertisejob + +import ( + "context" + "errors" + "fmt" + "stat/common/config" + "stat/common/log" + "stat/common/redis" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/advertiseLocMod" + "stat/models/advertiseMod" + "stat/models/advertisestat" + "stat/models/appInfoMod" + "stat/models/applicationmod" + "stat/statg" + "strconv" + "strings" + "time" + + "go.mongodb.org/mongo-driver/mongo/options" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" +) + +type TAdsHourCountMap map[int64]advertisestat.THourStat + +// AdvertiseClickDayHourStat not include endHour self +func AdvertiseClickDayHourStat(set *redis.Hash, sumDate time.Time, endHour int) error { + data, err := set.NameValues() + if err != nil { + return err + } + if len(data) == 0 { + return nil + } + // app dict + filter := bson.M{} + appDbDict, err := appInfoMod.GetAllAppIdMap(context.Background(), filter) + if err != nil { + return nil + } + source := make(TAdsHourCountMap) + appDict := make(map[int64]int32) + for name, value := range data { + ss := strings.Split(name, redis.AdvertiseClickDayHashIdHourSep) + if len(ss) != 3 { + continue + } + appId, err := strconv.ParseInt(ss[0], 10, 32) + if err != nil { + continue + } + if appId <= 0 { + continue + } + if _, exist := appDbDict[int32(appId)]; !exist { + continue + } + adsId, err := strconv.ParseInt(ss[1], 10, 64) + if err != nil { + continue + } + if adsId <= 0 { + continue + } + hour, err := strconv.Atoi(ss[2]) + if err != nil { + continue + } + if hour >= endHour { + continue + } + appDict[adsId] = int32(appId) + stat := source[adsId] + if stat == nil { + stat = make(advertisestat.THourStat) + source[adsId] = stat + for h := 0; h < endHour; h++ { + stat[h] = 0 + } + } + if count, err := strconv.ParseInt(value, 10, 64); err == nil { + stat[hour] = count + } + } + + ctx := context.Background() + for adsId, stat := range source { + now := time.Now().Local() + total := stat.Total() + update := &advertisestat.Update{ + Total: &total, + HourData: &stat, + UpdatedAt: &now, + } + // 尝试更新文档 + err = advertisestat.UpdateOneAdvertiseStat(ctx, bson.M{ + advertisestat.FN.AdvertiseStat.AdsId: adsId, + advertisestat.FN.AdvertiseStat.SumData: sumDate, + }, bson.M{"$set": update}) + if err != nil { + if err == mongo.ErrNoDocuments { + // 不存在则插入 + doc := &advertisestat.AdvertiseStat{ + Id: primitive.NewObjectID(), + AdsId: adsId, + AppId: appDict[adsId], + SumDate: sumDate, + Total: stat.Total(), + HourData: stat, + UpdatedAt: now, + CreatedAt: now, + } + err = advertisestat.InsertOneAdvertiseStat(ctx, doc) + if err != nil { + return err + } + } else { + return err + } + } + } + return nil +} + +func StatAdvertiseHourStat() error { + now := time.Now().Local() + // 给今天的Redis集合设置过期时间 + setToday := redis.GetAdvertiseClickDayHash(now) + if err := redis.StatRds.Expire(setToday.Key(), 4*24*time.Hour); err != nil { + log.Error("set redis set expire time failed", log.Any(setToday.Key(), err)) + return err + } + // 今日统计 + err := AdvertiseClickDayHourStat(setToday, utils.BeginWithTime(now), now.Hour()) + if err != nil { + log.Error("AdvertiseClickDayHourStat Today Failed", log.Any(setToday.Key(), err)) + return err + } + // 昨日统计 + yesterday := now.Add(-24 * time.Hour) + setYesterday := redis.GetAdvertiseClickDayHash(yesterday) + if exists, err := redis.StatRds.Exists(setYesterday.Key()); err == nil && exists { + err = AdvertiseClickDayHourStat(setYesterday, utils.BeginWithTime(yesterday), 24) + if err != nil { + log.Error("AdvertiseClickDayHourStat Yesterday Failed", log.Any(setToday.Key(), err)) + return err + } + } + return nil +} + +type AdvertiseTemp struct { + Advertise advertiseMod.Advertise `bson:"advertise"` // 应用id + Loc advertiseLocMod.AdvertiseLocation `bson:"loc"` // 应用id +} +type AdvertiseMap struct { + AppId int32 `bson:"appId"` // 应用id + Name string `bson:"name"` // 应用name + List []AdvertiseTemp `bson:"list"` // 广告list +} +type ApplicationMap struct { + AppId int32 `bson:"appId"` // 所属产品appIdid + Name string `bson:"name"` // 所属产品name + List []ApplicationTemp `bson:"list"` // list +} + +type ApplicationTemp struct { + Application applicationmod.Application `bson:"advertise"` // 应用信息 +} + +func AdvertiseExpireSend() error { + ctx := context.Background() + now := time.Now() + + tomorrow := now.AddDate(0, 0, 1) + + sort := bson.D{{Key: "appId", Value: 1}} + opts := options.Find().SetSort(sort) + + filter := bson.M{"isActive": true, + "endTime": bson.M{"$lte": tomorrow}} + list, serr := advertiseMod.FindAdvertiselist(ctx, filter, opts) + if serr != nil && serr.Code != stdLog.DataEmpty { + log.Error("AdvertiseExpireSend err", log.E(serr)) + return errors.New(serr.Error()) + } + + if len(list) <= 0 { + return nil + } + + // 获取app信息 + appIds := make([]int32, 0) + for _, v := range list { + appIds = append(appIds, v.AppId) + } + + appList, err := appInfoMod.GetAppInfosByAppIds(ctx, appIds) + if err != nil { + log.Error("AdvertiseExpireSend GetAppInfosByAppIds err", log.E(err)) + return err + } + appMap := make(map[int32]appInfoMod.AppInfo) + for _, v := range appList { + appMap[v.AppId] = v + } + + adsmap := make(map[int32]*AdvertiseMap) + for _, v := range list { + // 获取位置信息 + adsLocInfo, err := advertiseLocMod.FindLocationByAppIdAndLocId(ctx, v.AppId, v.LocId) + if err != nil { + log.Error("AdvertiseExpireSend FindLocationByAppIdAndLocId err", log.E(err), + log.Any("appid", v.AppId), log.Any("locid", v.LocId)) + continue + } + if info, ok := adsmap[v.AppId]; ok { + temp := AdvertiseTemp{ + Advertise: v, + Loc: adsLocInfo, + } + info.List = append(info.List, temp) + } else { + ads := &AdvertiseMap{} + ads.List = make([]AdvertiseTemp, 0) + ads.AppId = v.AppId + + if appInfo, ok := appMap[v.AppId]; ok { + ads.Name = appInfo.Name + } + + temp := AdvertiseTemp{ + Advertise: v, + Loc: adsLocInfo, + } + ads.List = append(ads.List, temp) + + adsmap[ads.AppId] = ads + } + } + + if statg.Bot != nil { + text := "" + for _, info := range adsmap { + text += "=======================================\n" + text += fmt.Sprintf("【%s】有广告已过期\n", info.Name) + for _, value := range info.List { + if value.Advertise.EndTime.After(now) { + text += fmt.Sprintf(" 【标题: %s】【位置: %s】将过期 【%s】 \n", + value.Advertise.Title, value.Loc.Name, value.Advertise.EndTime.Format("2006.01.02")) + } else { + text += fmt.Sprintf(" 【标题: %s】【位置: %s】已过期 【%s】 \n", + value.Advertise.Title, value.Loc.Name, value.Advertise.EndTime.Format("2006.01.02")) + } + } + } + + if text != "" { + text += statg.Tgbotsend + statg.Bot.SendAdvsSendMessage(text) + } + } else { + log.Error("AdvertiseExpireSend statg.Bot nil") + } + + return nil +} + +// 过期应用检测告警 +func ApplicationExpireSend() error { + ctx := context.Background() + now := time.Now() + + tomorrow := now.AddDate(0, 0, 1) + + sort := bson.D{{Key: "endTime", Value: 1}} + opts := options.Find().SetSort(sort) + + filter := bson.M{"status": true, + "endTime": bson.M{"$lte": tomorrow}} + list, serr := applicationmod.FindManyApplication(ctx, filter, opts) + if serr != nil && serr.Code != stdLog.DataEmpty { + log.Error("AdvertiseExpireSend err", log.E(serr)) + return errors.New(serr.Error()) + } + + if len(list) <= 0 { + return nil + } + + // 获取app信息 + appIds := make([]int32, 0) + for _, v := range list { + appIds = append(appIds, int32(v.ParentAppId)) + } + + appList, err := appInfoMod.GetAppInfosByAppIds(ctx, appIds) + if err != nil { + log.Error("AdvertiseExpireSend GetAppInfosByAppIds err", log.E(err)) + return err + } + appMap := make(map[int32]appInfoMod.AppInfo) + for _, v := range appList { + appMap[v.AppId] = v + } + + appsmap := make(map[int32]*ApplicationMap) + for _, v := range list { + if info, ok := appsmap[int32(v.ParentAppId)]; ok { + temp := ApplicationTemp{ + Application: *v, + } + info.List = append(info.List, temp) + } else { + apps := &ApplicationMap{} + apps.List = make([]ApplicationTemp, 0) + apps.AppId = int32(v.ParentAppId) + + if appInfo, ok := appMap[int32(v.ParentAppId)]; ok { + apps.Name = appInfo.Name + } + + temp := ApplicationTemp{ + Application: *v, + } + apps.List = append(apps.List, temp) + + appsmap[apps.AppId] = apps + } + } + + if statg.Bot != nil { + text := "" + for _, info := range appsmap { + text += "=======================================\n" + text += fmt.Sprintf("【%s】有应用过期告警\n", info.Name) + for _, value := range info.List { + if value.Application.EndTime.After(now) { + text += fmt.Sprintf(" 【应用名称: %s】【ID: %s】将过期 【%s】 \n", + value.Application.Name, value.Application.Id.Hex(), value.Application.EndTime.Format("2006.01.02")) + } else { + text += fmt.Sprintf(" 【应用名称: %s】【ID: %s】已过期 【%s】 \n", + value.Application.Name, value.Application.Id.Hex(), value.Application.EndTime.Format("2006.01.02")) + } + } + } + + if text != "" { + text += statg.Tgbotsend + statg.Bot.SendAdvsSendMessage(text) + } + } else { + log.Error("ApplicationExpireSend statg.Bot nil") + } + + return nil +} + +func LoadTgbotsend() error { + conf := statg.GlobalConfig{} + err := config.LoadJSON("conf/server.json", &conf) + if err != nil { + log.Fatal("load配置失败", log.E(err)) + return err + } + statg.Tgbotsend = conf.TgbotSend + fmt.Println(statg.Tgbotsend) + return nil +} diff --git a/skd/job/application/application.go b/skd/job/application/application.go new file mode 100644 index 0000000..32a4d7c --- /dev/null +++ b/skd/job/application/application.go @@ -0,0 +1,195 @@ +package applicationjob + +import ( + "context" + "stat/common/log" + "stat/common/redis" + "stat/common/stdLog" + "stat/common/utils" + "stat/models/applicationmod" + "stat/models/applicationstat" + "stat/service/innerserverser" + "strconv" + "strings" + "time" + + "go.mongodb.org/mongo-driver/bson" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type TAppHourCountMap map[string]applicationstat.THourStat + +// AppClickDayHourStat not include endHour self +func AppClickDayHourStat(set *redis.Hash, sumDate time.Time, endHour int) error { + data, err := set.NameValues() + if err != nil { + return err + } + if len(data) == 0 { + return nil + } + source := make(TAppHourCountMap) + for name, value := range data { + ss := strings.Split(name, redis.AppClickDaySetIdHourSep) + if len(ss) != 2 { + continue + } + id := ss[0] + if len(id) != 24 { + continue + } + hour, err := strconv.Atoi(ss[1]) + if err != nil { + continue + } + if hour >= endHour { + continue + } + stat := source[id] + if stat == nil { + stat = make(applicationstat.THourStat) + source[id] = stat + for h := 0; h < endHour; h++ { + stat[h] = 0 + } + } + if count, err := strconv.ParseInt(value, 10, 64); err == nil { + stat[hour] = count + } + } + + ctx := context.Background() + for id, stat := range source { + /*appidslice := strings.Split(id, "_") + if len(appidslice) != 2 { + log.Error("AppClickDayHourStat", log.Any(id, stat)) + continue + } + appId, err := strconv.Atoi(appidslice[0]) + if err != nil { + continue + } + parentAppId, err := strconv.Atoi(appidslice[1]) + if err != nil { + continue + } + */ + appId, err := primitive.ObjectIDFromHex(id) + if err != nil { + continue + } + now := time.Now().Local() + total := stat.Total() + update := &applicationstat.Update{ + Total: &total, + HourData: &stat, + UpdatedAt: &now, + } + // 尝试更新文档 + sErr := applicationstat.UpdateOneApplicationStat(ctx, bson.M{ + "applicationDbId": appId, + applicationstat.FN.ApplicationStat.SumData: sumDate, + }, bson.M{"$set": update}) + if sErr != nil { + if sErr.Code == stdLog.DataNotExist { + // 不存在则插入 + doc := &applicationstat.ApplicationStat{ + Id: primitive.NewObjectID(), + ApplicationDbId: appId, + SumDate: sumDate, + Total: stat.Total(), + HourData: stat, + UpdatedAt: now, + CreatedAt: now, + } + sErr = applicationstat.InsertOneApplicationStat(ctx, doc) + if sErr != nil { + return sErr + } + } else { + return sErr + } + } + } + + return nil +} + +func StatAppHourClick() error { + log.Info("configser:StatAppHourClick begin") + + defer log.Info("configser:StatAppHourClick end") + + now := time.Now().Local() + // 给今天的Redis集合设置过期时间 + setToday := redis.GetAppClickDaySet(now) + if err := redis.StatRds.Expire(setToday.Key(), 2*24*time.Hour); err != nil { + log.Error("set redis set expire time failed", log.Any(setToday.Key(), err)) + return err + } + // 今日统计 + err := AppClickDayHourStat(setToday, utils.BeginWithTime(now), now.Hour()) + if err != nil { + log.Error("AppClickDayHourStat Today Failed", log.Any(setToday.Key(), err)) + return err + } + // 昨日统计 + yesterday := now.Add(-24 * time.Hour) + setYesterday := redis.GetAppClickDaySet(yesterday) + if exists, err := redis.StatRds.Exists(setYesterday.Key()); err == nil && exists { + err = AppClickDayHourStat(setYesterday, utils.BeginWithTime(yesterday), 24) + if err != nil { + log.Error("AppClickDayHourStat Yesterday Failed", log.Any(setToday.Key(), err)) + return err + } + // 删除昨日统计集合 + redis.StatRds.Del(setYesterday.Key()) + } + + return nil +} + +func RechargeDayXlsl() error { + err := innerserverser.InnerServerDailyStat(context.Background()) + + if err != nil { + log.Error("RechargeDayXlsl", log.Any("err", err)) + + return err + } + + return nil +} + +func RechargeMonthXlsl() error { + err := innerserverser.InnerServerMonthStat2(context.Background(), nil, nil, nil) + + if err != nil { + log.Error("RechargeMonthXlsl", log.Any("err", err)) + + return err + } + + return nil +} + +func CloseExpiredApplications() error { + log.Info("applicationjob:CloseExpiredApplications begin") + + defer log.Info("applicationjob:CloseExpiredApplications end") + + now := time.Now().Local() + filter := bson.M{ + "status": true, + "endTime": bson.M{"$lt": now}, + } + + update := bson.M{"$set": bson.M{"status": false}} + serr := applicationmod.UpdateManyApplication(context.Background(), filter, update) + if serr != nil { + log.Error("application FindAdsByAppId Find err", log.E(serr)) + return serr + } + return nil +} diff --git a/skd/job/blocstatdaily/method.go b/skd/job/blocstatdaily/method.go new file mode 100644 index 0000000..509b4d3 --- /dev/null +++ b/skd/job/blocstatdaily/method.go @@ -0,0 +1,450 @@ +package blocstatdaily + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/utils" + "stat/models/accessmod" + "stat/models/blocDailystatmod" + "stat/models/rechargemod" + "stat/models/registermod" + "stat/models/withdrawUserOrdermod" + "strconv" + "time" +) + +const ( + DirectVisitCount string = "directVisitCount" // 直推访问数 + FissionVisitCount string = "fissionVisitCount" // 裂变访问数 + Day1RetainRate string = "day1RetainRate" // 次日留存率 + Day3RetainRate string = "day3RetainRate" // 3日留存率 + Day7RetainRate string = "day7RetainRate" // 7日留存率 + RechargeAmount string = "rechargeAmount" // 直推充值金额 + FissionAmount string = "fissionAmount" // 裂变充值金额 + NewDirectCount string = "newDirectCount" // 新增直推 + NewFissionCount string = "newFissionCount" // 新增裂变 + DaichongAmout string = "daichongAmout" // 代充金额 + OnlineAmount string = "onlineAmount" // 在线充值 + NewRechargeCount string = "newRechargeCount" // 新增充值数 + UserWithdrawAmount string = "userWithdrawAmount" // 用户提现 +) + +func defaultTimeMap(defaultStatDate time.Time) map[string]time.Time { + return map[string]time.Time{ + DirectVisitCount: defaultStatDate, // 直推访问用户数 + FissionVisitCount: defaultStatDate, // 裂变访问数 + Day1RetainRate: defaultStatDate, // 次日留存率 + Day3RetainRate: defaultStatDate, // 3日留存率 + Day7RetainRate: defaultStatDate, // 7日留存率 + RechargeAmount: defaultStatDate, // 直推充值金额 + FissionAmount: defaultStatDate, // 裂变充值金额 + NewDirectCount: defaultStatDate, // 新增直推 + NewFissionCount: defaultStatDate, // 新增裂变 + DaichongAmout: defaultStatDate, // 代充金额 + OnlineAmount: defaultStatDate, // 在线充值 + NewRechargeCount: defaultStatDate, // 新增充值数 + UserWithdrawAmount: defaultStatDate, // 用户提现 + } +} + +// 获取统计方法 +type StatMethod = func(ctx context.Context, start time.Time, end time.Time, appIds []int32) error + +// 统计方法汇总 +var statMethodMap = map[string]StatMethod{ + DirectVisitCount: DirectVisitCountMethod, // 直推访问用户数 + FissionVisitCount: FissionVisitCountMethod, // 裂变访问数 + Day1RetainRate: Day1RetainRateMethod, // 次日留存率 + Day3RetainRate: Day3RetainRateMethod, // 3日留存率 + Day7RetainRate: Day7RetainRateMethod, // 7日留存率 + RechargeAmount: DirectAmountMethod, // 直推充值金额 + FissionAmount: FissionAmountMethod, // 裂变充值金额 + NewDirectCount: NewDirectCountMethod, // 新增直推 + NewFissionCount: NewFissionCountMethod, // 新增裂变 + DaichongAmout: DaichongAmoutMethod, // 代充金额 + OnlineAmount: OnlineAmountMethod, // 在线充值 + NewRechargeCount: NewRechargeCountMethod, // 新增充值数 + UserWithdrawAmount: UserWithdrawAmountMethod, // 用户提现 +} + +// DirectVisitCountMethod 访问用户数 +func DirectVisitCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + isDirect := true + + userCount, err := accessmod.BlocDailyStatCount(ctx, appid, &isDirect, nil, start, end) + if err != nil { + log.Error("DirectVisitCountMethod BlocDailyStatCount", log.E(err)) + return err + } + + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + DirectVisitCount: &userCount, + } + + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("DirectVisitCountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} + +// FissionVisitCountMethod 裂变访问数 +func FissionVisitCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + isDirect := false + + userCount, err := accessmod.BlocDailyStatCount(ctx, appid, &isDirect, nil, start, end) + if err != nil { + log.Error("DirectVisitCountMethod BlocDailyStatCount", log.E(err)) + return err + } + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + FissionVisitCount: &userCount, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("FissionVisitCountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} + +// Day1RetainRateMethod 次日留存率 +func Day1RetainRateMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + rate := float64(0) + + registerStart := utils.BeginWithTime(start.AddDate(0, 0, -1)) + registerEnd := utils.EndWithTime(start.AddDate(0, 0, -1)) + + registerCount, err := registermod.TotalAddUserCount(ctx, appid, registerStart, registerEnd) + if err != nil { + log.Error("Day1RetainRateMethod s", log.E(err)) + return err + } + VistitCount, err := accessmod.DailyUserVisitCountByRegister(ctx, appid, start, end, registerStart, registerEnd) + if err != nil { + log.Error("Day1RetainRateMethod DailyUserVisitCountByRegister", log.E(err)) + return err + } + + if registerCount > 0 { + rate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 100*(float64(VistitCount)/float64(registerCount))), 64) + + } + + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + Day1RetainRate: &rate, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("Day1RetainRateMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} + +// Day3RetainRateMethod 3日留存率 +func Day3RetainRateMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + + registerStart := utils.BeginWithTime(start.AddDate(0, 0, -2)) + registerEnd := utils.EndWithTime(start.AddDate(0, 0, -2)) + rate := float64(0) + + registerCount, err := registermod.TotalAddUserCount(ctx, appid, registerStart, registerEnd) + if err != nil { + log.Error("Day3RetainRateMethod DailyUserRegisterCount", log.E(err)) + return err + } + VistitCount, err := accessmod.DailyUserVisitCountByRegister(ctx, appid, start, end, registerStart, registerEnd) + if err != nil { + log.Error("Day3RetainRateMethod DailyUserVisitCountByRegister", log.E(err)) + return err + } + + if registerCount > 0 { + rate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 100*(float64(VistitCount)/float64(registerCount))), 64) + + } + + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + Day3RetainRate: &rate, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("Day3RetainRateMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} + +// Day7RetainRateMethod 7日留存率 +func Day7RetainRateMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + registerStart := utils.BeginWithTime(start.AddDate(0, 0, -6)) + registerEnd := utils.EndWithTime(start.AddDate(0, 0, -6)) + rate := float64(0) + + registerCount, err := registermod.TotalAddUserCount(ctx, appid, registerStart, registerEnd) + if err != nil { + log.Error("Day3RetainRateMethod DailyUserRegisterCount", log.E(err)) + return err + } + VistitCount, err := accessmod.DailyUserVisitCountByRegister(ctx, appid, start, end, registerStart, registerEnd) + if err != nil { + log.Error("Day3RetainRateMethod DailyUserVisitCountByRegister", log.E(err)) + return err + } + + if registerCount > 0 { + rate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 100*(float64(VistitCount)/float64(registerCount))), 64) + + } + + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + Day7RetainRate: &rate, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("Day7RetainRateMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} + +// DirectAmountMethod 直推充值金额 +func DirectAmountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + // 获取充值金额 + count, amount, err := rechargemod.BlocDirectRechargeAmount(ctx, appid, start, end) + if err != nil { + log.Error("DirectAmountMethod BlocDirectRechargeAmount ", log.E(err)) + return err + } + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + DirectAmount: &amount, + DirectAmountCount: &count, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("DirectAmountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} + +// FissionAmountMethod 裂变充值金额 +func FissionAmountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + // 获取充值金额 + count, amount, err := rechargemod.BlocFissionRechargeAmount(ctx, appid, start, end) + if err != nil { + log.Error("FissionAmountMethod BlocFissionRechargeAmount ", log.E(err)) + return err + } + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + FissionAmount: &amount, + FissionAmountCount: &count, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("FissionAmountMethod UpsertBlocDailyStat ", log.E(err)) + return err + } + } + return nil +} + +// NewDirectCountMethod 新增直推 +func NewDirectCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + + count, err := registermod.BlocDirectAddUserCount(ctx, appid, start, end) + if err != nil { + log.Error("NewDirectCountMethod DeductionRechargeAmount ", log.E(err)) + return err + } + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + NewDirectCount: &count, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("NewDirectCountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + return nil +} + +// NewFissionCountMethod 新增裂变 +func NewFissionCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + + count, err := registermod.BlocFissionAddUserCount(ctx, appid, start, end) + if err != nil { + log.Error("NewFissionCountMethod DeductionRechargeAmount ", log.E(err)) + return err + } + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + NewFissionCount: &count, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("NewFissionCountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + return nil +} + +// DaichongAmoutMethod 代充金额 +func DaichongAmoutMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + _, money, err := rechargemod.BlocGetDaichongAmout(ctx, appid, start, end) + if err != nil { + log.Error("DaichongAmoutMethod BlocGetDaichongAmout ", log.E(err)) + return err + } + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + DaichongAmout: &money, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertBlocDailyStat ", log.E(err)) + return err + } + } + return nil +} + +// OnlineAmountMethod 在线充值 +func OnlineAmountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + _, money, err := rechargemod.BlocGetOnlineAmount(ctx, appid, start, end) + if err != nil { + log.Error("DaichongAmoutMethod BlocGetOnlineAmount ", log.E(err)) + return err + } + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + OnlineAmount: &money, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertBlocDailyStat ", log.E(err)) + return err + } + } + return nil +} + +// NewRechargeCountMethod 新增充值 +func NewRechargeCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + + for _, appid := range appIds { + // 获取充值金额 + result, err := rechargemod.BlocTotalDistricRechargeAmount(ctx, appid, start, end) + if err != nil { + log.Error("NewRechargeCountMethod BlocTotalDistricRechargeAmount ", log.E(err)) + return err + } + totalRechargeCount := int64(len(result)) + amountMap := make(map[uint64]int64) + userIds := make([]uint64, 0) + for _, value := range result { + userIds = append(userIds, value.UserId) + if key, ok := amountMap[value.UserId]; ok { + //存在 + amountMap[value.UserId] = value.PayMoney + key + } else { + amountMap[value.UserId] = value.PayMoney + } + } + + // 获取注册信息 + userList, err := registermod.TimeVisitUsersInfoByTime(ctx, appid, userIds, start, end) + if err != nil { + log.Error("NewRechargeCountMethod TotalDistricRechargeAmount ", log.E(err)) + return err + } + amount := int64(0) + count := int64(0) + for _, user := range userList { + count += 1 + if key, ok := amountMap[user.UserId]; ok { + amount += key + } + } + + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + NewRechargeCount: &count, + NewRechargeAmount: &amount, + TotalRechargeCount: &totalRechargeCount, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("DeductionAmountMethod UpsertDailyStat ", log.E(err)) + return err + } + + } + return nil +} + +// UserWithdrawAmountMethod 用户提现 +func UserWithdrawAmountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + // 获取充值金额 + result, err := withdrawUserOrdermod.GetBlocUserWithdrawOrder(ctx, appid, start, end) + if err != nil { + log.Error("NewRechargeCountMethod BlocTotalDistricRechargeAmount ", log.E(err)) + return err + } + + payMoney := int64(0) + money := int64(0) + for _, withdrawInfo := range result { + payMoney += withdrawInfo.PayMoney + money += withdrawInfo.Money + } + + // 更新数据库 + doc := blocDailystatmod.BlocDailyStatDoc{ + UserWithDrawAmount: &money, + UserWithDrawPaymoneyAmount: &payMoney, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("DeductionAmountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + return nil +} diff --git a/skd/job/blocstatdaily/stat.go b/skd/job/blocstatdaily/stat.go new file mode 100644 index 0000000..f65cbe6 --- /dev/null +++ b/skd/job/blocstatdaily/stat.go @@ -0,0 +1,112 @@ +package blocstatdaily + +import ( + "context" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + "stat/models/appInfoMod" + statrecordmod "stat/models/statrecord" + "time" +) + +/* +* 主要统计任务: +* 1、统计每天的app的直推访问数、裂变访问数、次日留存率、3日留存率、7日留存率。(表格) +* 2、按5分钟一个点,记录实时数据 app(新增、访问数....)。(曲线图) + */ + +// RunDayStat 任务1:统计前一天日活(每天1点开始统计) +func RunStat(defaultStatDate time.Time) error { + log.Info("daily stat running...") + ctx := context.Background() + recordMap := defaultTimeMap(defaultStatDate) + + // 1.获取统计项上次统计的时候(每天执行) + recoredResult, err := statrecordmod.LastRecordTimeMap(ctx, statrecordmod.BlocDailyStatDayJob) //第一次从默认记录时间开始统计 + if err != nil { + log.Error("Daily RunStat lastRecordTime failed!", log.E(err)) + return err + } + for _, record := range recoredResult { + recordMap[record.Item] = record.RecordTime + } + + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("daily RunStat GetAppIds failed!", log.E(err)) + return err + } + + statFrq := 24 * time.Hour // 统计频率 + curStatTime := utils.BeginOfToday() // 本次统计时间 + + for item, lastStatAt := range recordMap { + _lastStatAt := lastStatAt + for curStatTime.After(_lastStatAt) { + end := _lastStatAt.Add(statFrq) + // 超过本次统计结束时间,则结束 + if end.After(curStatTime) { + end = curStatTime + } + + err := runStatMethod(ctx, item, _lastStatAt, end, appIds) + if err != nil { + log.Error("daily statByTimeRange failed!", log.E(err), log.Any("item", item)) + return err + } + _lastStatAt = end + } + recordMap[item] = _lastStatAt + } + return nil +} + +// 实时统计每天的情况 +func RunStatToday() { + ctx := context.Background() + start := utils.BeginOfToday() + end := utils.EndOfToday() + log.Info("daily today stat running...") + + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("daily today RunStat GetAppIds failed!", log.E(err)) + return + } + + for item, statMethod := range statMethodMap { + // 调用统计方法,获取数据 + err := statMethod(ctx, start, end, appIds) + if err != nil { + log.Error("Daily today stat statByTimeRange statMethod failed!", log.Any("statItem", item), log.E(err)) + } + } + +} + +// runStatMethod 调用统计项方法 +func runStatMethod(ctx context.Context, item string, start, end time.Time, appIds []int32) (err error) { + // 1.获取统计方法 + statMethod, ok := statMethodMap[item] + if !ok { + return nil + } + + // 调用统计方法,获取数据 + err = statutils.ServerMon.RunWithName(func() error { + return statMethod(ctx, start, end, appIds) + }, statutils.GetFuncName(statMethod)) + + if err != nil { + log.Error("Daily stat statByTimeRange statMethod failed!", log.Any("statItem", item), log.E(err)) + return err + } + + // 3.更新记录 + if err := statrecordmod.UpsertItemRecord(ctx, statrecordmod.BlocDailyStatDayJob, item, end); err != nil { + log.Error("Daily stat commit UpsertItemRecord failed!", log.E(err)) + return err + } + return nil +} diff --git a/skd/job/blocstatdistrict/method.go b/skd/job/blocstatdistrict/method.go new file mode 100644 index 0000000..76c503f --- /dev/null +++ b/skd/job/blocstatdistrict/method.go @@ -0,0 +1,197 @@ +package blocstatdistrict + +import ( + "context" + "stat/common/log" + "stat/common/utils" + "stat/models/accessmod" + "stat/models/channelCodeBlocStatMod" + "stat/models/rechargemod" + "stat/models/registermod" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +const ( + DirectVisitCount string = "directVisitCount" // 访问数 + RechargeAmount string = "rechargeAmount" // 充值金额 + NewDirectCount string = "newDirectCount" // 新增 +) + +func defaultTimeMap(defaultStatDate time.Time) map[string]time.Time { + return map[string]time.Time{ + DirectVisitCount: defaultStatDate, // 访问数 + RechargeAmount: defaultStatDate, // 充值金额 + NewDirectCount: defaultStatDate, // 新增 + } +} + +// 获取统计方法 +type StatMethod = func(ctx context.Context, start time.Time, end time.Time, appIds []int32) error + +// 统计方法汇总 +var statMethodMap = map[string]StatMethod{ + DirectVisitCount: DirectVisitCountMethod, // 访问数 + RechargeAmount: RechargeAmountMethod, // 充值金额 + NewDirectCount: NewDirectCountMethod, // 新增 +} + +// DirectVisitCountMethod 直推访问数 +func DirectVisitCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + type districtVisitInfo struct { + DirectVisitCount int64 // 直推访问数 + FissionVisitCount int64 // 裂变访问数 + } + + for _, appid := range appIds { + + districtVisitMap := make(map[string]*districtVisitInfo) + + err := accessmod.VisitInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(item *accessmod.AccessMod) { + if len(item.DistrictCode) > 0 && !item.BlocDeduction { + if item.IsDirect { + if value, ok := districtVisitMap[item.DistrictCode]; !ok { + districtVisitMap[item.DistrictCode] = &districtVisitInfo{ + DirectVisitCount: 1, + } + } else { + value.DirectVisitCount += 1 + } + } else if !item.IsDirect { // 裂变 + if value, ok := districtVisitMap[item.DistrictCode]; !ok { + districtVisitMap[item.DistrictCode] = &districtVisitInfo{ + FissionVisitCount: 1, + } + } else { + value.FissionVisitCount += 1 + } + } + } + }) + if err != nil { + log.Error("VisitCountMethod VisitInfoByTimeShard ", log.E(err)) + return err + } + // 插入数据库 + for k, v := range districtVisitMap { + // 更新渠道存 + err = channelCodeBlocStatMod.UpsertOneDistrictVisitStat(ctx, k, appid, start, v.DirectVisitCount, v.FissionVisitCount) + if err != nil { + log.Error("VisitCountMethod UpsertOneDistrictVisitStat ", log.E(err)) + return err + } + } + } + return nil +} + +// RechargeAmountMethod 用户充值 +func RechargeAmountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + type districtRechargeUserIds struct { + RechangeAmount int64 + FissionAmount int64 + DeductionAmount int64 + } + for _, appid := range appIds { + rechangeUserMap := make(map[string]*districtRechargeUserIds) + // 获取充值金额 + + filter := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}, "districtCode": bson.M{"$gt": ""}} + rechargeList, _ := rechargemod.FindManyRechargeInfo(ctx, filter) + + for _, rechargeInfo := range rechargeList { + if len(rechargeInfo.DistrictCode) > 0 { // 充值不存在扣量 + if rechargeInfo.IsDirect { + if value, ok := rechangeUserMap[rechargeInfo.DistrictCode]; !ok { + rechangeUserMap[rechargeInfo.DistrictCode] = &districtRechargeUserIds{ + RechangeAmount: rechargeInfo.Money, + } + } else { + value.RechangeAmount += rechargeInfo.Money + } + } else { + if value, ok := rechangeUserMap[rechargeInfo.DistrictCode]; !ok { + rechangeUserMap[rechargeInfo.DistrictCode] = &districtRechargeUserIds{ + FissionAmount: rechargeInfo.Money, + } + } else { + + value.FissionAmount += rechargeInfo.Money + } + } + } + } + // 插入数据库 + for k, v := range rechangeUserMap { + // 更新渠道存 + err := channelCodeBlocStatMod.UpsertOneDistrictRechargeStat(ctx, k, appid, start, v.RechangeAmount, v.FissionAmount, v.DeductionAmount) + if err != nil { + log.Error("VisitCountMethod UpsertOneDistrictVisitStat ", log.E(err)) + return err + } + } + } + return nil +} + +// NewDirectCountMethod 新增 +func NewDirectCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + type districtRegister struct { + NewDirectCount int64 + NewFissionCount int64 + NewDeductionCount int64 + } + for _, appid := range appIds { + rechangeUserMap := make(map[string]*districtRegister) + + // 获取充值金额 + err := registermod.RegisterUsersInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(registerInfo *registermod.RegisterMod) { + if len(registerInfo.DistrictCode) > 0 { + if registerInfo.IsDeduction { + if value, ok := rechangeUserMap[registerInfo.DistrictCode]; !ok { + rechangeUserMap[registerInfo.DistrictCode] = &districtRegister{ + NewDeductionCount: 1, + } + } else { + value.NewDeductionCount += 1 + } + } else { + if registerInfo.IsDirect { + if value, ok := rechangeUserMap[registerInfo.DistrictCode]; !ok { + rechangeUserMap[registerInfo.DistrictCode] = &districtRegister{ + NewDirectCount: 1, + } + } else { + + value.NewDirectCount += 1 + } + } else { + if value, ok := rechangeUserMap[registerInfo.DistrictCode]; !ok { + rechangeUserMap[registerInfo.DistrictCode] = &districtRegister{ + NewFissionCount: 1, + } + } else { + + value.NewFissionCount += 1 + } + } + } + } + }) + if err != nil { + log.Error("NewRechargeCountMethod TotalDistricRechargeAmount ", log.E(err)) + return err + } + // 插入数据库 + for k, v := range rechangeUserMap { + // 更新渠道存 + err := channelCodeBlocStatMod.UpsertOneUserRegisterStat(ctx, k, appid, start, v.NewDirectCount, v.NewFissionCount, v.NewDeductionCount) + if err != nil { + log.Error("VisitCountMethod UpsertOneDistrictVisitStat ", log.E(err)) + return err + } + } + } + return nil +} diff --git a/skd/job/blocstatdistrict/stat.go b/skd/job/blocstatdistrict/stat.go new file mode 100644 index 0000000..7a7f9b3 --- /dev/null +++ b/skd/job/blocstatdistrict/stat.go @@ -0,0 +1,89 @@ +package blocstatdistrict + +import ( + "context" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + "stat/models/appInfoMod" + statrecordmod "stat/models/statrecord" + "time" +) + +/* +* 主要统计任务: +* 1、渠道每天的:直推访问数、裂变访问数、次日留存率、3日留存率、7日留存率。 + */ +func RunStat(defaultStatDate time.Time) error { + log.Info("statdistrict stat running...") + ctx := context.Background() + recordMap := defaultTimeMap(defaultStatDate) + + // 1.获取统计项上次统计的时候(每天执行) + recoredResult, err := statrecordmod.LastRecordTimeMap(ctx, statrecordmod.BlocDiscStatJob) //第一次从默认记录时间开始统计 + if err != nil { + log.Error("statdistrict RunStat lastRecordTime failed!", log.E(err)) + return err + } + for _, record := range recoredResult { + recordMap[record.Item] = record.RecordTime + } + + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("statdistrict RunStat GetAppIds failed!", log.E(err)) + return err + } + + statFrq := 24 * time.Hour // 统计频率 + curStatTime := utils.BeginOfToday() // 本次统计时间 + + for item, lastStatAt := range recordMap { + _lastStatAt := lastStatAt + for curStatTime.After(_lastStatAt) { + end := _lastStatAt.Add(statFrq) + + // 超过本次统计结束时间,则结束 + if end.After(curStatTime) { + end = curStatTime + } + // 根据时间段统计数据 + err := runStatMethod(ctx, item, _lastStatAt, end, appIds) + if err != nil { + log.Error("statdistrict statByTimeRange failed!", log.E(err), log.Any("item", item)) + return err + } + _lastStatAt = end + //fmt.Println(_lastStatAt) + } + recordMap[item] = _lastStatAt + } + return nil +} + +// runStatMethod 调用统计项方法 +func runStatMethod(ctx context.Context, item string, start, end time.Time, appIds []int32) (err error) { + // 1.获取统计方法 + statMethod, ok := statMethodMap[item] + if !ok { + return nil + } + //fmt.Println(item) + + // 调用统计方法,获取数据 + err = statutils.ServerMon.RunWithName(func() error { + return statMethod(ctx, start, end, appIds) + }, statutils.GetFuncName(statMethod)) + + if err != nil { + log.Error("statdistrict stat statByTimeRange statMethod failed!", log.Any("statItem", item), log.E(err)) + return err + } + + // 3.更新记录 + if err := statrecordmod.UpsertItemRecord(ctx, statrecordmod.BlocDiscStatJob, item, end); err != nil { + log.Error("statdistrict stat commit UpsertItemRecord failed!", log.E(err)) + return err + } + return nil +} diff --git a/skd/job/domaincheck/method.go b/skd/job/domaincheck/method.go new file mode 100644 index 0000000..bfd6585 --- /dev/null +++ b/skd/job/domaincheck/method.go @@ -0,0 +1,82 @@ +package domaincheck + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/tf" + "stat/models/appInfoMod" + "stat/models/landingPage" + "stat/models/versionMod" + "stat/statg" + "strings" +) + +func DomainCheck() error { + ctx := context.Background() + domainList, err := landingPage.FindAllLandingPage(ctx) + if err != nil { + log.Error("DomainCheck", log.E(err)) + return err + } + availableCountCheck(ctx, domainList) + return nil +} + +func availableCountCheck(ctx context.Context, domainList []landingPage.LandingPage) { + m := make(map[int32]int) + for _, v := range domainList { + m[v.AppId]++ + } + var tips []string + for appID, count := range m { + log.Info("availableCountCheck", log.Any("appID", appID), log.Any("count", count)) + if count <= 2 { + appinfo, _ := appInfoMod.GetAppInfoById(ctx, appID) + tips = append(tips, fmt.Sprintf("[%s]可用域名还剩:%d个.", appinfo.Name, count)) + } + } + if len(tips) > 0 { + txt := strings.Join(tips, "\n") + statg.Bot.SendMonitorMessage(txt) + } +} + +func TFCheck() error { + ctx := context.Background() + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("daily RunStat GetAppIds failed!", log.E(err)) + return err + } + + versionList := make([]versionMod.VersionModel, 0) + fmt.Println("TF域名检测 versionList", len(versionList)) + for _, appid := range appIds { + version, err := versionMod.GetTfUrlList(ctx, appid) + if err != nil { + log.Error("TFCheck GetTfUrlList", log.E(err)) + return err + } + versionList = append(versionList, version) + } + + for _, version := range versionList { + for _, url := range version.Link { + fmt.Println("TF域名检测", url) + result, err := tf.CheckTFValid(url) + if err != nil { + log.Error("runCheckUrl CheckTFValid", log.Any("url", url), log.E(err)) + continue + } + valid := result.Valid + desc := result.Desc + if !valid { + appinfo, _ := appInfoMod.GetAppInfoById(ctx, version.AppId) + text := fmt.Sprintf("[统计同学]:应用名称:%s\ntf域名异常\nURL:%s\nversion:%s\ndesc:%s", appinfo.Name, url, version.VersionNum, desc) + statg.Bot.SendMonitorMessage(text) + } + } + } + return nil +} diff --git a/skd/job/limitstat/limitstat.go b/skd/job/limitstat/limitstat.go new file mode 100644 index 0000000..f62a751 --- /dev/null +++ b/skd/job/limitstat/limitstat.go @@ -0,0 +1,84 @@ +package limitstat + +import ( + "encoding/json" + "sort" + "stat/common/log" + "stat/common/redis" + "stat/service/cacheSer" + "stat/statg" + "time" +) + +var mgr *redis.Manager + +func getRedisMgr() (*redis.Manager, error) { + if mgr == nil { + m, err := redis.NewManagerWithUrl(statg.Conf.Redis.Url, func(opt *redis.Options) { + opt.ReadTimeout = 60 * time.Second + }) + if err != nil { + return nil, err + } + mgr = m + } + return mgr, nil +} + +func IpAddressLimitStat() error { + m, err := getRedisMgr() + if err != nil { + log.Error("get redis mgr failed", log.E(err)) + return err + } + var piece = 1000 + todayList := make(redis.BucketList, 0) + today := time.Now().Local() + todayKey := redis.GetIpLimitSpecifiedDayKey(statg.Conf.Host, statg.Conf.Port, today) + todayHash := redis.NewHash(m.Client(), todayKey) + if err := todayHash.Scan("", int64(piece), func(name, value string) { + bucket := redis.Bucket{} + if err := json.Unmarshal([]byte(value), &bucket); err == nil { + bucket.Name = name + todayList = append(todayList, &bucket) + } + }); err != nil { + return err + } + sort.Sort(todayList) + cacheSer.IpLimitStatCache.Lock.Lock() + if len(todayList) >= 1000 { + cacheSer.IpLimitStatCache.IpLimitBucketTopToday = todayList[:1000] + } else { + cacheSer.IpLimitStatCache.IpLimitBucketTopToday = todayList[:] + } + cacheSer.IpLimitStatCache.Lock.Unlock() + + yesterday := today.Add(-24 * time.Hour) + yesterdayKey := redis.GetIpLimitSpecifiedDayKey(statg.Conf.Host, statg.Conf.Port, yesterday) + history := redis.NewHash(m.Client(), redis.IpLimiterDayRecordKey) + if exists, err := history.Exists(yesterdayKey); err != nil || exists { + return err + } + yesterdayList := make(redis.BucketList, 0) + yesterdayHash := redis.NewHash(m.Client(), yesterdayKey) + if err := yesterdayHash.Scan("", int64(piece), func(name, value string) { + bucket := redis.Bucket{} + if err := json.Unmarshal([]byte(value), &bucket); err == nil { + bucket.Name = name + yesterdayList = append(yesterdayList, &bucket) + } + }); err != nil { + return err + } + sort.Sort(yesterdayList) + cacheSer.IpLimitStatCache.Lock.Lock() + if len(yesterdayList) >= 1000 { + cacheSer.IpLimitStatCache.IpLimitBucketTopToday = yesterdayList[:1000] + } else { + cacheSer.IpLimitStatCache.IpLimitBucketTopToday = yesterdayList[:] + } + cacheSer.IpLimitStatCache.Lock.Unlock() + _, err = history.Set(yesterdayKey, "1") + return err +} diff --git a/skd/job/monitor/method.go b/skd/job/monitor/method.go new file mode 100644 index 0000000..1e06a11 --- /dev/null +++ b/skd/job/monitor/method.go @@ -0,0 +1,241 @@ +package monitor + +import ( + "context" + "fmt" + "stat/common/enum/consts" + "stat/common/log" + "stat/models/appInfoMod" + "stat/models/channelmod" + "stat/models/downloadinfo" + "stat/models/registermod" + "stat/statg" + "strings" + "time" +) + +type LanpageMonitor struct { + Minute int64 + LastDay int64 +} + +var lastIosCount int64 +var lastAndroidCount int64 + +var lastBiliIosCount int64 +var lastNhavIosCount int64 + +var lastHuawenIosCount int64 + +var lastZhihuIosCount int64 + +var lanpages = []string{"madougg.com"} +var channels = []string{"xza00267", "xza00182", "xza00082", "xza00139", "xza00242", "sqt00120", "xza00274", "xza00258", "ysa00021", "fabuye", channelmod.OfficialChannelName, "mdapp01", "mdapp", "modelweb", "mdapp02", "mdapp03"} + +func RunMonitor() error { + msg := RunLandPageMonitor() + statg.Bot.SendDownloadMessage(msg) + + channelMsg := ChannelMonitor() + statg.Bot.SendDownloadMessage(channelMsg) + return nil +} + +func RunLandPageMonitor() string { + ctx := context.Background() + appid := int32(888) // 麻豆 + end := time.Now() + start := end.Add(-30 * time.Minute) + + lanpageMap := make(map[string]*LanpageMonitor) + + downloadList, serr := downloadinfo.GetAccessCountByTime(ctx, appid, start, end) + if serr != nil { + log.Error("RunMonitor, GetAccessCountByTime", log.E(serr)) + return "" + } + + for _, valueInfo := range downloadList { + if len(valueInfo.Domain) > 0 { + domain := valueInfo.Domain + if strings.Contains(valueInfo.Domain, "https://") { + domain = strings.Replace(valueInfo.Domain, "https://", "", -1) + } else if strings.Contains(valueInfo.Domain, "http://") { + domain = strings.Replace(valueInfo.Domain, "http://", "", -1) + } + + if value, ok := lanpageMap[domain]; ok { + value.Minute += 1 + } else { + lanpageMap[domain] = &LanpageMonitor{ + Minute: 1, + } + } + } + } + + lastDayEnd := time.Now().AddDate(0, 0, -1) + lastDayStart := lastDayEnd.Add(-30 * time.Minute) + + LastDownloadList, serr := downloadinfo.GetAccessCountByTime(ctx, appid, lastDayStart, lastDayEnd) + if serr != nil { + log.Error("RunMonitor, GetAccessCountByTime", log.E(serr)) + return "" + } + for _, valueInfo := range LastDownloadList { + if len(valueInfo.Domain) > 0 { + domain := valueInfo.Domain + if strings.Contains(valueInfo.Domain, "https://") { + domain = strings.Replace(valueInfo.Domain, "https://", "", -1) + } else if strings.Contains(valueInfo.Domain, "http://") { + domain = strings.Replace(valueInfo.Domain, "http://", "", -1) + } + + if value, ok := lanpageMap[domain]; ok { + value.LastDay += 1 + } else { + lanpageMap[domain] = &LanpageMonitor{ + LastDay: 1, + } + } + } + } + + // 整理渠道数据 + tgTxt := "落地页监控:\n" + // tgTxt += fmt.Sprintf("开始: %s\n结束: %s\n", start.Format("2006-01-02T15:04:05"), end.Format("2006-01-02T15:04:05")) + for _, lanpage := range lanpages { + for k, value := range lanpageMap { + if k == lanpage { + message := fmt.Sprintf("%s: 当日:%d 昨日:%d\n", k, value.Minute, value.LastDay) + tgTxt += message + } + } + } + if len(lanpageMap) > 0 { + return tgTxt + } + + return "" +} + +func ChannelMonitor() string { + ctx := context.Background() + appid := int32(888) // 麻豆 + end := time.Now() + start := end.Add(-30 * time.Minute) + lastDayEnd := time.Now().AddDate(0, 0, -1) + lastDayStart := lastDayEnd.Add(-30 * time.Minute) + + channelMap := make(map[string]*LanpageMonitor) + for _, channelinfo := range channels { + registerList, err := registermod.RegisterUsersInfoByDistrict(ctx, appid, channelinfo, start, end) + if err != nil { + log.Error("NewCountMethod RegisterUsersInfoByDistrict ", log.E(err)) + return "" + } + + for _, valueInfo := range registerList { + if valueInfo.IsDirect { + if value, ok := channelMap[valueInfo.DistrictCode]; ok { + value.Minute += 1 + } else { + channelMap[valueInfo.DistrictCode] = &LanpageMonitor{ + Minute: 1, + } + } + } + } + + LastDayRegisterList, err := registermod.RegisterUsersInfoByDistrict(ctx, appid, channelinfo, lastDayStart, lastDayEnd) + if err != nil { + log.Error("NewCountMethod RegisterUsersInfoByDistrict ", log.E(err)) + return "" + } + + for _, valueInfo := range LastDayRegisterList { + if valueInfo.IsDirect { + if value, ok := channelMap[valueInfo.DistrictCode]; ok { + value.LastDay += 1 + } else { + channelMap[valueInfo.DistrictCode] = &LanpageMonitor{ + LastDay: 1, + } + } + } + } + } + + // 自来量 + fissionCount, err := registermod.FissionAddUserCount(ctx, appid, start, end) + if err != nil { + log.Error("NewCountMethod RegisterUsersInfoByDistrict ", log.E(err)) + return "" + } + + LastDayFissionCount, err := registermod.FissionAddUserCount(ctx, appid, lastDayStart, lastDayEnd) + if err != nil { + log.Error("NewCountMethod RegisterUsersInfoByDistrict ", log.E(err)) + return "" + } + + channelMap["裂变"] = &LanpageMonitor{ + LastDay: LastDayFissionCount, + Minute: fissionCount, + } + + // 整理渠道数据 + tgTxt := "麻豆渠道监控:\n" + // tgTxt += fmt.Sprintf("开始: %s\n结束: %s\n", start.Format("2006-01-02T15:04:05"), end.Format("2006-01-02T15:04:05")) + for k, value := range channelMap { + if channelmod.IsOfficialChannelName(k) { + k = "自来量" + } + message := fmt.Sprintf("%s: 当日:%d 昨日:%d\n", k, value.Minute, value.LastDay) + tgTxt += message + } + if len(channelMap) > 0 { + return tgTxt + } + + // 统计数据 + return "" +} + +func NewCountMonitor() error { + ctx := context.Background() + end := time.Now() + start := end.Add(-time.Minute * 10) + + appIds := []int32{999, 694, 594, 494, 888, 444, 66666} + + for _, appid := range appIds { + iosCount, err := registermod.IosAddUserCount(ctx, appid, start, end) + if err != nil { + log.Error("DirectVisitCountMethod IosAddUserCount", log.E(err)) + return err + } + androidCount, err := registermod.AndroidAddUserCount(ctx, appid, start, end) + if err != nil { + log.Error("DirectVisitCountMethod IosAddUserCount", log.E(err)) + return err + } + + if statg.Conf.RunMod == consts.RunModRelease { + if androidCount <= 10 || iosCount <= 5 { + appinfo, _ := appInfoMod.GetAppInfoById(ctx, appid) + // 必须存在 + if appinfo.AppId == appid { + text := fmt.Sprintf("[警告]:应用名称:%s\n2分钟新增异常:\n时间:%s\nandroid:%d\nios:%d\n", appinfo.Name, start, androidCount, iosCount) + err = statg.Bot.SendMonitorMessage(text) + if err != nil { + log.Error("tg Send ", log.E(err)) + continue + } + } + } + } + + } + return nil +} diff --git a/skd/job/statdaily/method.go b/skd/job/statdaily/method.go new file mode 100644 index 0000000..f098bb6 --- /dev/null +++ b/skd/job/statdaily/method.go @@ -0,0 +1,525 @@ +package statdaily + +import ( + "context" + "errors" + "fmt" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + "stat/models/accessmod" + "stat/models/blocDailystatmod" + "stat/models/dailystatmod" + "stat/models/downloadinfo" + "stat/models/rechargegamemod" + "stat/models/rechargemod" + "stat/models/registermod" + "stat/models/syncrecharge" + "stat/models/syncvip" + "stat/models/versionMod" + "stat/models/withdrawGameOrdermod" + "strconv" + "strings" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +const ( + AppVisitCount string = "appVisitCount" // app访问数 + Day1RetainRate string = "day1RetainRate" // 次日留存率 + Day3RetainRate string = "day3RetainRate" // 3日留存率 + Day7RetainRate string = "day7RetainRate" // 7日留存率 + RechargeAmount string = "rechargeAmount" // 充值金额 + NewDirectCount string = "newDirectCount" // 直推 + VipRechargeAmount string = "vipRechargeAmount" // VIP购买数 + RechargeCount string = "rechargeCount" // 充值次数 + GameRecharge string = "gameRecharge" // 游戏充值 + LandpageClick string = "landpageClick" // 落地页下载按钮点击次数 +) + +func defaultTimeMap(defaultStatDate time.Time) map[string]time.Time { + return map[string]time.Time{ + AppVisitCount: defaultStatDate, // app访问人数 + Day1RetainRate: defaultStatDate, // 次日留存率 + Day3RetainRate: defaultStatDate, // 3日留存率 + Day7RetainRate: defaultStatDate, // 7日留存率 + RechargeAmount: defaultStatDate, // 直推充值金额 + NewDirectCount: defaultStatDate, // 新增直推 + VipRechargeAmount: defaultStatDate, // VIP购买数 + RechargeCount: defaultStatDate, // 充值次数 + GameRecharge: defaultStatDate, // 游戏充值 + LandpageClick: defaultStatDate, // 落地页 + } +} + +// 获取统计方法 +type StatMethod = func(ctx context.Context, start time.Time, end time.Time, appIds []int32) error + +// 统计方法汇总 +var statMethodMap = map[string]StatMethod{ + AppVisitCount: AppVisitCountMethod, // 访问数 + Day1RetainRate: Day1RetainRateMethod, // 次日留存率 + Day3RetainRate: Day3RetainRateMethod, // 3日留存率 + Day7RetainRate: Day7RetainRateMethod, // 7日留存率 + RechargeAmount: AmountMethod, // 直推充值金额 + NewDirectCount: NewCountMethod, // 注册用户 + VipRechargeAmount: VipRechargeAmountMethod, // VIP购买数 + RechargeCount: RechargeCountMethod, // 充值次数 + GameRecharge: GameRechargeMethod, // 游戏充值 + LandpageClick: LandpageClickMethod, // 落地页 +} + +// AppVisitCountMethod app访问数 +func AppVisitCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + stat := &statutils.Stat{} + err := accessmod.VisitInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(item *accessmod.AccessMod) { + client := statutils.GetClientInfo(item.SysType, item.DevType, + item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + stat.Add(1, client) + }) + if err != nil { + log.Error("AppVisitCountMethod:VisitInfoByTimeShard", log.E(err)) + return err + } + //更新数据库 + doc := dailystatmod.DailyStatDoc{ + TotalVisitCount: stat.CountRef(), + DirectVisitCount: stat.Total.Direct.CountRef(), + DeductionVisitCount: stat.Total.Deduction.CountRef(), + NaturalVisitCount: stat.Total.Direct.Natural.CountRef(), + FissionVisitCount: stat.Total.Fission.CountRef(), + TodayDistrictVisitCount: stat.Total.District.CountRef(), + TodayWebVisitCount: stat.Total.Web.CountRef(), + TodayNormalVisitCount: stat.Total.Normal.CountRef(), + TodayIosVisitCount: stat.Ios.CountRef(), + TodayAndroidVisitCount: stat.Android.CountRef(), + LightVisitCount: stat.Light.CountRef(), + LightDirectVisitCount: stat.Light.Total.Direct.CountRef(), + LightFissionVisitCount: stat.Light.Total.Fission.CountRef(), + LightDeductionVisitCount: stat.Light.Total.Deduction.CountRef(), + LightNaturalVisitCount: stat.Light.Total.Direct.Natural.CountRef(), + LightWebVisitCount: stat.Light.Total.Web.CountRef(), + LightDistrictVisitCount: stat.Light.Total.District.CountRef(), + LightNormalVisitCount: stat.Light.Total.Normal.CountRef(), + TodayH5VisitCount: stat.H5.CountRef(), + TodayH5PcVisitCount: stat.H5.Pc.CountRef(), + TodayH5IosVisitCount: stat.H5.Ios.CountRef(), + TodayH5AndroidVisitCount: stat.H5.Android.CountRef(), + } + err = dailystatmod.UpsertDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("H5appVisitCountMethod:UpsertDailyStat", log.E(err)) + return err + } + } + return nil +} + +// Day1RetainRateMethod 次日留存率 +func Day1RetainRateMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + rate := float64(0) + + registerStart := utils.BeginWithTime(start.AddDate(0, 0, -1)) + registerEnd := utils.EndWithTime(start.AddDate(0, 0, -1)) + registerCount, err := registermod.TotalAddUserCount(ctx, appid, registerStart, registerEnd) + if err != nil { + log.Error("Day1RetainRateMethod s", log.E(err)) + return err + } + + VistitCount, err := accessmod.DailyUserVisitCountByRegister(ctx, appid, start, end, registerStart, registerEnd) + if err != nil { + log.Error("Day1RetainRateMethod DailyUserVisitCountByRegister", log.E(err)) + return err + } + + if registerCount > 0 { + rate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 100*(float64(VistitCount)/float64(registerCount))), 64) + //fmt.Println(VistitCount, registerCount, rate) + } + + // 更新数据库 + doc := dailystatmod.DailyStatDoc{ + Day1RetainRate: &rate, + } + err = dailystatmod.UpsertDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("Day1RetainRateMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} + +// Day3RetainRateMethod 3日留存率 +func Day3RetainRateMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + rate := float64(0) + + registerStart := utils.BeginWithTime(start.AddDate(0, 0, -2)) + registerEnd := utils.EndWithTime(start.AddDate(0, 0, -2)) + + registerCount, err := registermod.TotalAddUserCount(ctx, appid, registerStart, registerEnd) + if err != nil { + log.Error("Day1RetainRateMethod s", log.E(err)) + return err + } + VistitCount, err := accessmod.DailyUserVisitCountByRegister(ctx, appid, start, end, registerStart, registerEnd) + if err != nil { + log.Error("Day1RetainRateMethod DailyUserVisitCountByRegister", log.E(err)) + return err + } + + if registerCount > 0 { + rate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 100*(float64(VistitCount)/float64(registerCount))), 64) + + } + + // 更新数据库 + doc := dailystatmod.DailyStatDoc{ + Day3RetainRate: &rate, + } + err = dailystatmod.UpsertDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("Day3RetainRateMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} + +// Day7RetainRateMethod 7日留存率 +func Day7RetainRateMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + rate := float64(0) + + registerStart := utils.BeginWithTime(start.AddDate(0, 0, -6)) + registerEnd := utils.EndWithTime(start.AddDate(0, 0, -6)) + + registerCount, err := registermod.TotalAddUserCount(ctx, appid, registerStart, registerEnd) + if err != nil { + log.Error("Day1RetainRateMethod s", log.E(err)) + return err + } + VistitCount, err := accessmod.DailyUserVisitCountByRegister(ctx, appid, start, end, registerStart, registerEnd) + if err != nil { + log.Error("Day1RetainRateMethod DailyUserVisitCountByRegister", log.E(err)) + return err + } + + if registerCount > 0 { + rate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 100*(float64(VistitCount)/float64(registerCount))), 64) + } + + // 更新数据库 + doc := dailystatmod.DailyStatDoc{ + Day7RetainRate: &rate, + } + err = dailystatmod.UpsertDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("Day7RetainRateMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} + +// AmountMethod 直推充值金额 +func AmountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + // 获取充值金额 + itemList, err := rechargemod.TotalRechargeListV1(ctx, appid, start, end) + if err != nil { + log.Error("DirectAmountMethod DirectRechargeAmount ", log.E(err)) + return err + } + stat := &statutils.Stat{} + repStat := &statutils.Stat{} + newStat := &statutils.Stat{} + for _, item := range itemList { + client := statutils.GetClientInfo(item.SysType, item.DevType, item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + stat.Add(item.PayMoney, client) + if item.RegisterTime.After(item.SuccessAt.AddDate(0, 0, -1)) { + newStat.Add(item.PayMoney, client) + } + if item.Repeat { + repStat.Add(item.PayMoney, client) + } + } + // 更新数据库 + doc := dailystatmod.DailyStatDoc{ + TotalAmount: stat.ValueRef(), + SuccessRechargeOrder: stat.CountRef(), + DirectAmount: stat.Total.Direct.ValueRef(), + DirectAmountCount: stat.Total.Direct.CountRef(), + FissionAmount: stat.Total.Fission.ValueRef(), + FissionAmountCount: stat.Total.Fission.CountRef(), + NaturalAmount: stat.Total.Direct.Natural.ValueRef(), + NaturalAmountCount: stat.Total.Direct.Natural.CountRef(), + DeductionAmount: stat.Total.Deduction.ValueRef(), + DeductionAmountCount: stat.Total.Deduction.CountRef(), + TodayWebRecharge: stat.Total.Web.ValueRef(), + TodayDistrictRecharge: stat.Total.District.ValueRef(), + TodayNormalRecharge: stat.Total.Normal.ValueRef(), + TodayAndroidRecharge: stat.Android.ValueRef(), + TodayIosRecharge: stat.Ios.ValueRef(), + LightRechargeCount: stat.Light.CountRef(), + LightDirectRechargeCount: stat.Light.Total.Direct.CountRef(), + LightFissionRechargeCount: stat.Light.Total.Fission.CountRef(), + LightDeductionRechargeCount: stat.Light.Total.Deduction.CountRef(), + LightNaturalRechargeCount: stat.Light.Total.Direct.Natural.CountRef(), + LightWebRechargeCount: stat.Light.Total.Web.CountRef(), + LightDistrictRechargeCount: stat.Light.Total.District.CountRef(), + LightNormalRechargeCount: stat.Light.Total.Normal.CountRef(), + LightRechargeAmount: stat.Light.ValueRef(), + LightDirectRechargeAmount: stat.Light.Total.Direct.ValueRef(), + LightFissionRechargeAmount: stat.Light.Total.Fission.ValueRef(), + LightDeductionRechargeAmount: stat.Light.Total.Deduction.ValueRef(), + LightNaturalRechargeAmount: stat.Light.Total.Direct.Natural.ValueRef(), + LightWebRechargeAmount: stat.Light.Total.Web.ValueRef(), + LightDistrictRechargeAmount: stat.Light.Total.District.ValueRef(), + LightNormalRechargeAmount: stat.Light.Total.Normal.ValueRef(), + TodayH5Recharge: stat.H5.ValueRef(), + TodayH5IosRecharge: stat.H5.Ios.ValueRef(), + TodayH5AndroidRecharge: stat.H5.Android.ValueRef(), + TodayH5PcRecharge: stat.H5.Pc.ValueRef(), + NewRechargeAmount: newStat.ValueRef(), + NewRechargeCount: newStat.CountRef(), + RepeatAmount: repStat.ValueRef(), + RepeatCount: repStat.CountRef(), + } + err = dailystatmod.UpsertDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("DirectAmountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} + +func NewCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + stat := &statutils.Stat{} + userDict := make(map[uint64]bool) + err := registermod.RegisterFormalsInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + if item.IsFormal && statutils.IsClientH5OrLight(item.SysType, item.DevType) { + if _, exists := userDict[item.UserId]; !exists { + userDict[item.UserId] = true + client := statutils.GetClientInfo(item.SysType, item.DevType, + item.DistrictCode, item.IsDirect, false, item.IsFormal) + stat.Add(1, client) + } + } + }) + if err != nil { + return err + } + err = registermod.RegisterUsersInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + userDict[item.UserId] = true + client := statutils.GetClientInfo(item.SysType, item.DevType, + item.DistrictCode, item.IsDirect, false, item.IsFormal) + stat.Add(1, client) + }) + if err != nil { + return err + } + + doc := dailystatmod.DailyStatDoc{ + NewTotalCount: stat.CountRef(), + NewDirectCount: stat.Total.Direct.CountRef(), + NewFissionCount: stat.Total.Fission.CountRef(), + NewDeductionCount: stat.Total.Deduction.CountRef(), + NewNaturalCount: stat.Total.Direct.Natural.CountRef(), + NewWebCount: stat.Total.Web.CountRef(), + NewDistrictCount: stat.Total.District.CountRef(), + NewNormalCount: stat.Total.Normal.CountRef(), + AndroidAddCount: stat.Android.CountRef(), + IosAddCount: stat.Ios.CountRef(), + LightAddCount: stat.Light.CountRef(), + LightGuestAddCount: stat.Light.Guest.CountRef(), + LightFormalAddCount: stat.Light.Formal.CountRef(), + LightDirectCount: stat.Light.Total.Direct.CountRef(), + LightFissionCount: stat.Light.Total.Fission.CountRef(), + LightDeductionCount: stat.Light.Total.Deduction.CountRef(), + LightNaturalCount: stat.Light.Total.Direct.Natural.CountRef(), + LightWebCount: stat.Light.Total.Web.CountRef(), + LightDistrictCount: stat.Light.Total.District.CountRef(), + LightNormalCount: stat.Light.Total.Normal.CountRef(), + H5AddCount: stat.H5.CountRef(), + H5PcAddCount: stat.H5.Pc.CountRef(), + H5IosAddCount: stat.H5.Ios.CountRef(), + H5AndroidAddCount: stat.H5.Android.CountRef(), + H5FormalCount: stat.H5.Formal.CountRef(), + } + err = dailystatmod.UpsertDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + return nil +} + +// VipRechargeAmountMethod VIP购买次数 +func VipRechargeAmountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + money := int64(0) + amount := int64(0) + NewVipPayMoney := int64(0) + RepeatVipMoney := int64(0) + + filter := bson.M{syncvip.FN.SyncVip.AppId: appid, syncvip.FN.SyncVip.SuccessAt: bson.M{"$gt": start, "$lt": end}} + viporderList, serr := syncvip.FindManySyncVip(ctx, filter) + if serr != nil { + return errors.New(serr.Error()) + } + for _, viporder := range viporderList { + money += viporder.Money + amount += viporder.Amount + if viporder.RegisterTime.After(viporder.SuccessAt.AddDate(0, 0, -1)) { + NewVipPayMoney += viporder.Money + + } + if viporder.Repeat { + RepeatVipMoney += viporder.Money + } + } + // 更新数据库 + doc := dailystatmod.DailyStatDoc{ + VipPayByMoney: &money, + VipPayByAmount: &amount, + NewVipPayMoney: &NewVipPayMoney, + RepeatVipMoney: &RepeatVipMoney, + } + err := dailystatmod.UpsertDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + return nil +} + +// RechargeCountMethod 充值次数 +func RechargeCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + + filter := bson.M{syncvip.FN.SyncVip.AppId: appid, syncrecharge.FN.SyncRechargeOrder.CreatedAt: bson.M{"$gt": start, "$lt": end}} + total, serr := syncrecharge.CountSyncRechargeOrders(ctx, filter) + if serr != nil { + return errors.New(serr.Error()) + } + doc := dailystatmod.DailyStatDoc{ + TotalRechargeOrder: &total, + } + err := dailystatmod.UpsertDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertDailyStat ", log.E(err)) + return err + } + + } + return nil +} + +// GameRechargeMethod 游戏充值 +func GameRechargeMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + rechageAmount := int64(0) + withdrawAmount := int64(0) + + withdrawList, serr := withdrawGameOrdermod.GetGameWithdrawOrder(ctx, appid, start, end) + if serr != nil { + return errors.New(serr.Error()) + } + + for _, withdrawInfo := range withdrawList { + withdrawAmount += withdrawInfo.PayMoney + } + filter := bson.M{"appId": appid, "successAt": bson.M{"$gt": start, "$lte": end}} + rechageList, serr := rechargegamemod.FindManyRechargeInfo(ctx, filter) + if serr != nil { + return errors.New(serr.Error()) + } + + for _, rechageInfo := range rechageList { + rechageAmount += rechageInfo.PayMoney + } + + // 更新数据库 + doc := dailystatmod.DailyStatDoc{ + GameRechageAmount: &rechageAmount, + GameWithdrawAmount: &withdrawAmount, + } + err := dailystatmod.UpsertDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertDailyStat ", log.E(err)) + return err + } + + // 更新数据库 + blocDoc := blocDailystatmod.BlocDailyStatDoc{ + GameRechageAmount: &rechageAmount, + GameWithdrawAmount: &withdrawAmount, + } + err = blocDailystatmod.UpsertBlocDailyStat(ctx, start, appid, blocDoc) + if err != nil { + log.Error("DeductionAmountMethod UpsertDailyStat ", log.E(err)) + return err + } + + } + return nil +} + +// LandpageClickMethod 落地页访问次数 +func LandpageClickMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + + downloadList, err := downloadinfo.GetAccessCountByTime(ctx, appid, start, end) + if err != nil { + log.Error("RunMonitor, GetAccessCountByTime", log.E(err)) + return err + } + androidClick := int64(0) + appstoreClick := int64(0) + iosAtherClick := int64(0) + lightClick := int64(0) + + for _, downloadInfo := range downloadList { + if downloadInfo.SysType == "android" { + androidClick += 1 + } else if strings.Contains(downloadInfo.SysType, "ios") || strings.Contains(downloadInfo.SysType, "light") { + if downloadInfo.PackageType == versionMod.Shop { + appstoreClick += 1 + } else if downloadInfo.PackageType == versionMod.Enterprise { + iosAtherClick += 1 + } else if downloadInfo.PackageType == versionMod.Light { + lightClick += 1 + } + } + } + + // 更新数据库 + doc := dailystatmod.DailyStatDoc{ + LandpageAndroidClick: &androidClick, + LandpageIosAppstoreClick: &appstoreClick, + LandpageIosAthorClick: &iosAtherClick, + LandpageIosH5Click: &lightClick, + } + err = dailystatmod.UpsertDailyStat(ctx, start, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} diff --git a/skd/job/statdaily/stat.go b/skd/job/statdaily/stat.go new file mode 100644 index 0000000..cdfb497 --- /dev/null +++ b/skd/job/statdaily/stat.go @@ -0,0 +1,119 @@ +package statdaily + +import ( + "context" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + "stat/models/appInfoMod" + statrecordmod "stat/models/statrecord" + "time" +) + +/* +* 主要统计任务: +* 1、统计每天的app的直推访问数、裂变访问数、次日留存率、3日留存率、7日留存率。(表格) +* 2、按5分钟一个点,记录实时数据 app(新增、访问数....)。(曲线图) + */ + +// RunDayStat 任务1:统计前一天日活(每天1点开始统计) +func RunStat(defaultStatDate time.Time) error { + log.Info("daily stat running...") + ctx := context.Background() + recordMap := defaultTimeMap(defaultStatDate) + + // 1.获取统计项上次统计的时候(每天执行) + recoredResult, err := statrecordmod.LastRecordTimeMap(ctx, statrecordmod.DailyStatDayJob) //第一次从默认记录时间开始统计 + if err != nil { + log.Error("Daily RunStat lastRecordTime failed!", log.E(err)) + return err + } + for _, record := range recoredResult { + recordMap[record.Item] = record.RecordTime + } + + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("daily RunStat GetAppIds failed!", log.E(err)) + return err + } + + statFrq := 24 * time.Hour // 统计频率 + curStatTime := utils.BeginOfToday() // 本次统计时间 + + for item, lastStatAt := range recordMap { + _lastStatAt := lastStatAt + for curStatTime.After(_lastStatAt) { + end := _lastStatAt.Add(statFrq) + + // 超过本次统计结束时间,则结束 + if end.After(curStatTime) { + end = curStatTime + } + // 根据时间段统计数据 + err := runStatMethod(ctx, item, _lastStatAt, end, appIds) + if err != nil { + log.Error("daily statByTimeRange failed!", log.E(err), log.Any("item", item)) + return err + } + _lastStatAt = end + } + recordMap[item] = _lastStatAt + } + return nil +} + +// 实时统计每天的情况 +func RunStatToday() error { + ctx := context.Background() + + now := time.Now().Add(time.Minute * -5) + start := utils.BeginWithTime(now) + end := utils.EndWithTime(now) + + log.Info("daily today stat running...") + + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("daily today RunStat GetAppIds failed!", log.E(err)) + return err + } + var lastErr error + for item, statMethod := range statMethodMap { + // 调用统计方法,获取数据 + err = statutils.ServerMon.RunWithName(func() error { + return statMethod(ctx, start, end, appIds) + }, statutils.GetFuncName(statMethod)) + if err != nil { + lastErr = err + log.Error("Daily today stat statByTimeRange statMethod failed!", log.Any("statItem", item), log.E(err)) + } + } + return lastErr +} + +// runStatMethod 调用统计项方法 +func runStatMethod(ctx context.Context, item string, start, end time.Time, appIds []int32) (err error) { + // 1.获取统计方法 + statMethod, ok := statMethodMap[item] + if !ok { + return nil + } + + // 调用统计方法,获取数据 + err = statutils.ServerMon.RunWithName(func() error { + return statMethod(ctx, start, end, appIds) + }, statutils.GetFuncName(statMethod)) + + if err != nil { + log.Error("Daily stat statByTimeRange statMethod failed!", log.Any("statItem", item), log.E(err)) + return err + } + + // 3.更新记录 + if err := statrecordmod.UpsertItemRecord(ctx, statrecordmod.DailyStatDayJob, item, end); err != nil { + log.Error("Daily stat commit UpsertItemRecord failed!", log.E(err)) + return err + } + return nil +} diff --git a/skd/job/statdaily/stat2.go b/skd/job/statdaily/stat2.go new file mode 100644 index 0000000..299b0ff --- /dev/null +++ b/skd/job/statdaily/stat2.go @@ -0,0 +1,39 @@ +package statdaily + +import ( + "context" + "fmt" + "stat/models/dailystatmod" + "time" +) + +// 查询日活 +func RunStatIos() { + appId := int32(999) + start := time.Now().AddDate(0, -5, 0) + end := time.Now() + statList, _ := dailystatmod.GetDailyStatTotalList(context.Background(), &appId, &start, &end) + for _, statInfo := range statList { + //占比 + iosrechage := statInfo.TotalAmount - statInfo.TodayAndroidRecharge + iosStore := statInfo.TodayH5Recharge + iosrechageRate := float64(iosrechage) / float64(statInfo.TotalAmount) + iosStoreRate := float64(iosStore) / float64(statInfo.TotalAmount) + iosNew := statInfo.NewTotalCount - statInfo.AndroidAddCount + iosNewRate := float64(iosNew) / float64(statInfo.NewTotalCount) + iosStoreNew := statInfo.H5AddCount + iosStoreNewRate := float64(iosStoreNew) / float64(statInfo.NewTotalCount) + iosVisit := statInfo.TotalVisitCount - statInfo.TodayAndroidVisitCount + iosVisitRate := float64(iosVisit) / float64(statInfo.TotalVisitCount) + + iosStoreVisit := statInfo.TodayH5VisitCount + iosStoreVisitRate := float64(iosStoreNew) / float64(statInfo.TotalVisitCount) + + text := fmt.Sprintf("日期:%s\n", statInfo.SumDate.Format("2006-01-02")) + text += fmt.Sprintf(" 总充值:%d 总新增:%d\n", statInfo.TotalAmount/100, statInfo.NewTotalCount) + text += fmt.Sprintf(" Ios充值:%d(占比:%.2f) 商店包充值:%d(占比:%.2f)\n", iosrechage/100, iosrechageRate*100, iosStore/100, iosStoreRate*100) + text += fmt.Sprintf(" Ios新增:%d(占比:%.2f) 商店包新增:%d(占比:%.2f)\n", iosNew, iosNewRate*100, iosStoreNew, iosStoreNewRate*100) + text += fmt.Sprintf(" Ios日活:%d(占比:%.2f) 商店包日活:%d(占比:%.2f)\n", iosVisit, iosVisitRate*100, iosStoreVisit, iosStoreVisitRate*100) + fmt.Println(text) + } +} diff --git a/skd/job/statdailyhour/method.go b/skd/job/statdailyhour/method.go new file mode 100644 index 0000000..5927bce --- /dev/null +++ b/skd/job/statdailyhour/method.go @@ -0,0 +1,395 @@ +package statdailyhour + +import ( + "context" + "errors" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + "stat/models/accessmod" + "stat/models/dailyhourstatmod" + "stat/models/downloadinfo" + "stat/models/rechargegamemod" + "stat/models/rechargemod" + "stat/models/registermod" + "stat/models/syncrecharge" + "stat/models/syncvip" + "stat/models/versionMod" + "stat/models/withdrawGameOrdermod" + "strings" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +const ( + AppVisitCount string = "appVisitCount" // app访问数 + RechargeAmount string = "rechargeAmount" // 直推充值金额 + NewCount string = "newDirectCount" // 新增直推 + VipRechargeAmount string = "vipRechargeAmount" // VIP购买数 + RechargeOrderCount string = "RechargeOrder" // VIP购买数 + GameRecharge string = "GameRecharget" // 游戏充值 + LandpageClick string = "landpageClick" // 游戏充值 +) + +func defaultTimeMap(defaultStatDate time.Time) map[string]time.Time { + return map[string]time.Time{ + AppVisitCount: defaultStatDate, // App访问人数 + RechargeAmount: defaultStatDate, // 直推充值金额 + NewCount: defaultStatDate, // 新增直推 + VipRechargeAmount: defaultStatDate, // VIP购买数 + RechargeOrderCount: defaultStatDate, // 发起充值数 + GameRecharge: defaultStatDate, // 游戏充值 + LandpageClick: defaultStatDate, // 落地页 + } +} + +// 获取统计方法 +type StatMethod = func(ctx context.Context, start time.Time, end time.Time, appIds []int32) error + +// 统计方法汇总 +var statMethodMap = map[string]StatMethod{ + AppVisitCount: AppVisitCountMethod, // App访问人数 + RechargeAmount: RechargeAmountMethod, // 直推充值金额 + NewCount: NewCountMethod, // 新增数 + VipRechargeAmount: VipRechargeAmountMethod, // VIP购买数 + RechargeOrderCount: RechargeCountMethod, // 发起充值数 + GameRecharge: GameRechargeMethod, // 游戏充值 + LandpageClick: LandpageClickMethod, // 落地页 +} + +// AppVisitCountMethod app访问数 +func AppVisitCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + stat := &statutils.Stat{} + err := accessmod.VisitInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(item *accessmod.AccessMod) { + client := statutils.GetClientInfo(item.SysType, item.DevType, item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + stat.Add(1, client) + }) + if err != nil { + log.Error("AppVisitCountMethod ", log.E(err)) + return err + } + //更新数据库 + doc := dailyhourstatmod.DailyHourStatDoc{ + TotalVisitCount: stat.CountRef(), + DirectVisitCount: stat.Total.Direct.CountRef(), + NaturalVisitCount: stat.Total.Direct.Natural.CountRef(), + FissionVisitCount: stat.Total.Fission.CountRef(), + DeductionVisitCount: stat.Total.Deduction.CountRef(), + IosVisitCount: stat.Ios.CountRef(), + AndroidVisitCount: stat.Android.CountRef(), + LightVisitCount: stat.Light.CountRef(), + LightVisitDirectCount: stat.Light.Total.Direct.CountRef(), + LightVisitFissionCount: stat.Light.Total.Fission.CountRef(), + LightVisitDeductionCount: stat.Light.Total.Deduction.CountRef(), + LightVisitNaturalCount: stat.Light.Total.Direct.Natural.CountRef(), + LightVisitWebCount: stat.Light.Total.Web.CountRef(), + LightVisitNormalCount: stat.Light.Total.Normal.CountRef(), + LightVisitDistrictCount: stat.Light.Total.District.CountRef(), + H5VisitCount: stat.H5.CountRef(), + H5PcVisitCount: stat.H5.Pc.CountRef(), + H5IosVisitCount: stat.H5.Ios.CountRef(), + H5AndroidVisitCount: stat.H5.Android.CountRef(), + WebVisitCount: stat.Total.Web.CountRef(), + NormalVisitCount: stat.Total.Normal.CountRef(), + DistrictVisitCount: stat.Total.District.CountRef(), + } + err = dailyhourstatmod.UpsertDailyHourStat(ctx, end, appid, doc) + if err != nil { + log.Error("DirectAmountMethod UpsertDailyHourStat ", log.E(err)) + return err + } + } + return nil +} + +// RechargeAmountMethod 充值金额 +func RechargeAmountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + // 获取充值金额 + itemList, err := rechargemod.TotalRechargeListV1(ctx, appid, start, end) + if err != nil { + log.Error("DirectAmountMethod DirectRechargeAmount ", log.E(err)) + return err + } + stat := &statutils.Stat{} + repStat := &statutils.Stat{} + newStat := &statutils.Stat{} + for _, item := range itemList { + client := statutils.GetClientInfo(item.SysType, item.DevType, item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + stat.Add(item.Money, client) + if item.RegisterTime.After(item.SuccessAt.AddDate(0, 0, -1)) { + newStat.Add(item.Money, client) + } + if item.Repeat { + repStat.Add(item.Money, client) + } + } + + // 更新数据库 + doc := dailyhourstatmod.DailyHourStatDoc{ + TotalAmount: stat.ValueRef(), + SuccessRechargeOrder: stat.CountRef(), + DirectAmount: stat.Total.Direct.ValueRef(), + DirectAmountCount: stat.Total.Direct.CountRef(), + FissionAmount: stat.Total.Fission.ValueRef(), + FissionAmountCount: stat.Total.Fission.CountRef(), + NaturalAmount: stat.Total.Direct.Natural.ValueRef(), + NaturalAmountCount: stat.Total.Direct.Natural.CountRef(), + DeductionAmount: stat.Total.Deduction.ValueRef(), + DeductionAmountCount: stat.Total.Deduction.CountRef(), + AndroidAmount: stat.Android.ValueRef(), + AndroidAmountCount: stat.Android.CountRef(), + IosAmount: stat.Ios.ValueRef(), + IosAmountCount: stat.Ios.CountRef(), + LightAmount: stat.Light.ValueRef(), + LightDirectAmount: stat.Light.Total.Direct.ValueRef(), + LightFissionAmount: stat.Light.Total.Fission.ValueRef(), + LightDeductionAmount: stat.Light.Total.Deduction.ValueRef(), + LightNaturalAmount: stat.Light.Total.Direct.Natural.ValueRef(), + LightWebAmount: stat.Light.Total.Web.ValueRef(), + LightNormalAmount: stat.Light.Total.Normal.ValueRef(), + LightDistrictAmount: stat.Light.Total.District.ValueRef(), + LightAmountCount: stat.Light.CountRef(), + LightDirectAmountCount: stat.Light.Total.Direct.CountRef(), + LightFissionAmountCount: stat.Light.Total.Fission.CountRef(), + LightDeductionAmountCount: stat.Light.Total.Deduction.CountRef(), + LightNaturalAmountCount: stat.Light.Total.Direct.Natural.CountRef(), + LightWebAmountCount: stat.Light.Total.Web.CountRef(), + LightNormalAmountCount: stat.Light.Total.Normal.CountRef(), + LightDistrictAmountCount: stat.Light.Total.District.CountRef(), + H5Amount: stat.H5.ValueRef(), + H5AmountCount: stat.H5.CountRef(), + H5FormalAmount: stat.H5.Formal.ValueRef(), + H5FormalAmountCount: stat.H5.Formal.CountRef(), + H5PcAmount: stat.H5.Pc.ValueRef(), + H5PcAmountCount: stat.H5.Pc.CountRef(), + H5IosAmount: stat.H5.Ios.ValueRef(), + H5IosAmountCount: stat.H5.Ios.CountRef(), + H5AndroidAmount: stat.Android.ValueRef(), + H5AndroidAmountCount: stat.Android.CountRef(), + WebAmount: stat.Total.Web.ValueRef(), + WebAmountCount: stat.Total.Web.CountRef(), + NormalAmount: stat.Total.Normal.ValueRef(), + NormalAmountCount: stat.Total.Normal.CountRef(), + DistrictAmount: stat.Total.District.ValueRef(), + DistrictAmountCount: stat.Total.District.CountRef(), + RepeatAmount: repStat.ValueRef(), + RepeatAmountCount: repStat.CountRef(), + NewRechargeAmount: newStat.ValueRef(), + NewRechargeCount: newStat.CountRef(), + } + err = dailyhourstatmod.UpsertDailyHourStat(ctx, end, appid, doc) + if err != nil { + log.Error("DirectAmountMethod UpsertDailyHourStat ", log.E(err)) + return err + } + } + return nil +} + +// NewCountMethod 新增直推 +func NewCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + stat := &statutils.Stat{} + userDict := make(map[uint64]bool) + err := registermod.RegisterFormalsInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + if item.IsFormal && statutils.IsClientH5OrLight(item.SysType, item.DevType) { + if _, exists := userDict[item.UserId]; !exists { + userDict[item.UserId] = true + client := statutils.GetClientInfo(item.SysType, item.DevType, + item.DistrictCode, item.IsDirect, false, item.IsFormal) + stat.Add(1, client) + } + } + }) + if err != nil { + return err + } + err = registermod.RegisterUsersInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + userDict[item.UserId] = true + client := statutils.GetClientInfo(item.SysType, item.DevType, + item.DistrictCode, item.IsDirect, false, item.IsFormal) + stat.Add(1, client) + }) + if err != nil { + return err + } + + hour := end.Local().Hour() + // 更新数据库 + doc := dailyhourstatmod.DailyHourStatDoc{ + SumHour: &hour, + NewTotalCount: stat.CountRef(), + NewDirectCount: stat.Total.Direct.CountRef(), + NewFissionCount: stat.Total.Fission.CountRef(), + NewDeductionCount: stat.Total.Deduction.CountRef(), + NewNaturalCount: stat.Total.Direct.Natural.CountRef(), + NewAndroidCount: stat.Android.Total.CountRef(), + NewIosCount: stat.Ios.Total.CountRef(), + NewLightCount: stat.Light.CountRef(), + NewLightGuestCount: stat.Light.Guest.CountRef(), + NewLightFormalCount: stat.Light.Formal.CountRef(), + NewLightDirectCount: stat.Light.Total.Direct.CountRef(), + NewLightFissionCount: stat.Light.Total.Fission.CountRef(), + NewLightDeductionCount: stat.Light.Total.Deduction.CountRef(), + NewLightNaturalCount: stat.Light.Total.Direct.Natural.CountRef(), + NewLightWebCount: stat.Light.Total.Web.CountRef(), + NewLightNormalCount: stat.Light.Total.Normal.CountRef(), + NewLightDistrictCount: stat.Light.Total.District.CountRef(), + NewH5Count: stat.H5.CountRef(), + NewH5PcCount: stat.H5.Pc.CountRef(), + NewH5IosCount: stat.H5.Ios.CountRef(), + NewH5AndroidCount: stat.H5.Android.CountRef(), + NewWebCount: stat.Total.Web.CountRef(), + NewNormalCount: stat.Total.Normal.CountRef(), + NewDistrictCount: stat.Total.District.CountRef(), + } + err = dailyhourstatmod.UpsertDailyHourStat(ctx, end, appid, doc) + if err != nil { + log.Error("NewDirectCountMethod UpsertDailyHourStat ", log.E(err)) + return err + } + } + return nil +} + +// VipRechargeAmountMethod VIP购买次数 +func VipRechargeAmountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + money := int64(0) + amount := int64(0) + repeat := int64(0) + + filter := bson.M{syncvip.FN.SyncVip.AppId: appid, syncvip.FN.SyncVip.SuccessAt: bson.M{"$gt": start, "$lt": end}} + viporderList, serr := syncvip.FindManySyncVip(ctx, filter) + if serr != nil { + return errors.New(serr.Error()) + } + for _, viporder := range viporderList { + money += viporder.Money + amount += viporder.Amount + if viporder.Repeat { + repeat += viporder.Money + } + } + // 更新数据库 + doc := dailyhourstatmod.DailyHourStatDoc{ + VipPayByMoney: &money, + VipPayByAmount: &amount, + VipRepeatAmount: &repeat, + } + err := dailyhourstatmod.UpsertDailyHourStat(ctx, end, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertDailyHourStat ", log.E(err)) + return err + } + } + return nil +} + +// RechargeCountMethod 充值次数 +func RechargeCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + + filter := bson.M{syncvip.FN.SyncVip.AppId: appid, syncrecharge.FN.SyncRechargeOrder.CreatedAt: bson.M{"$gt": start, "$lt": end}} + total, serr := syncrecharge.CountSyncRechargeOrders(ctx, filter) + if serr != nil { + return errors.New(serr.Error()) + } + + // 更新数据库 + doc := dailyhourstatmod.DailyHourStatDoc{ + TotalRechargeOrder: &total, + } + err := dailyhourstatmod.UpsertDailyHourStat(ctx, end, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertDailyHourStat ", log.E(err)) + return err + } + } + return nil +} + +// GameRechargeMethod 游戏充值 +func GameRechargeMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + rechageAmount := int64(0) + withdrawAmount := int64(0) + + withdrawList, serr := withdrawGameOrdermod.GetGameWithdrawOrder(ctx, appid, start, end) + if serr != nil { + return errors.New(serr.Error()) + } + + for _, withdrawInfo := range withdrawList { + withdrawAmount += withdrawInfo.Money + } + filter := bson.M{"appId": appid, "successAt": bson.M{"$gt": start, "$lt": end}} + rechageList, serr := rechargegamemod.FindManyRechargeInfo(ctx, filter) + if serr != nil { + return errors.New(serr.Error()) + } + + for _, rechageInfo := range rechageList { + rechageAmount += rechageInfo.Money + } + + // 更新数据库 + doc := dailyhourstatmod.DailyHourStatDoc{ + GameRechageAmount: &rechageAmount, + GameWithdrawAmount: &withdrawAmount, + } + err := dailyhourstatmod.UpsertDailyHourStat(ctx, end, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertDailyHourStat ", log.E(err)) + return err + } + } + return nil +} + +// LandpageClickMethod 落地页访问次数 +func LandpageClickMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + + downloadList, err := downloadinfo.GetAccessCountByTime(ctx, appid, start, end) + if err != nil { + log.Error("RunMonitor, GetAccessCountByTime", log.E(err)) + return err + } + androidClick := int64(0) + appstoreClick := int64(0) + iosAtherClick := int64(0) + h5Click := int64(0) + + for _, downloadInfo := range downloadList { + if downloadInfo.SysType == "android" { + androidClick += 1 + } else if strings.Contains(downloadInfo.SysType, "ios") || strings.Contains(downloadInfo.SysType, "light") { + if downloadInfo.PackageType == versionMod.Shop { + appstoreClick += 1 + } else if downloadInfo.PackageType == versionMod.Enterprise { + iosAtherClick += 1 + } else if downloadInfo.PackageType == versionMod.Light { + h5Click += 1 + } + } + } + // 更新数据库 + doc := dailyhourstatmod.DailyHourStatDoc{ + LandpageAndroidClick: &androidClick, + LandpageIosAppstoreClick: &appstoreClick, + LandpageIosAthorClick: &iosAtherClick, + LandpageIosH5Click: &h5Click, + } + err = dailyhourstatmod.UpsertDailyHourStat(ctx, end, appid, doc) + if err != nil { + log.Error("NewDeductionCountMethod UpsertDailyHourStat ", log.E(err)) + return err + } + } + + return nil +} diff --git a/skd/job/statdailyhour/stat.go b/skd/job/statdailyhour/stat.go new file mode 100644 index 0000000..8e6bc2d --- /dev/null +++ b/skd/job/statdailyhour/stat.go @@ -0,0 +1,107 @@ +package statdailyhour + +import ( + "context" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + "stat/models/appInfoMod" + statrecordmod "stat/models/statrecord" + "time" +) + +func RunStat(defaultStatDate time.Time) error { + log.Info("daily stat running...") + ctx := context.Background() + recordMap := defaultTimeMap(defaultStatDate) + + // 1.获取统计项上次统计的时候(每天执行) + recoredResult, err := statrecordmod.LastRecordTimeMap(ctx, statrecordmod.DailyHourStatDayJob) //第一次从默认记录时间开始统计 + if err != nil { + log.Error("Daily RunStat lastRecordTime failed!", log.E(err)) + return err + } + for _, record := range recoredResult { + recordMap[record.Item] = record.RecordTime + } + + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("daily RunStat GetAppIds failed!", log.E(err)) + return err + } + + now := time.Now().Add(time.Minute * -5) + statFrq := 1 * time.Hour // 统计频率时间 + curStatTime := utils.RecentMinute(now, 60) // 按60分钟对齐 + + for item, lastStatAt := range recordMap { + _lastStatAt := lastStatAt + for curStatTime.After(_lastStatAt) { + end := _lastStatAt.Add(statFrq) + + // 超过本次统计结束时间,则结束 + if end.After(curStatTime) { + end = curStatTime + } + // 根据时间段统计数据 + err := runStatMethod(ctx, item, _lastStatAt, end, appIds) + if err != nil { + log.Error("daily statByTimeRange failed!", log.E(err), log.Any("item", item)) + return err + } + _lastStatAt = end + } + recordMap[item] = _lastStatAt + } + return nil +} + +// 实时统计每天的情况 +func RunStatToday() { + ctx := context.Background() + start := utils.BeginOfToday() + end := utils.EndOfToday() + log.Info("daily today stat running...") + + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("daily today RunStat GetAppIds failed!", log.E(err)) + return + } + + for item, statMethod := range statMethodMap { + // 调用统计方法,获取数据 + err := statMethod(ctx, start, end, appIds) + if err != nil { + log.Error("Daily today stat statByTimeRange statMethod failed!", log.Any("statItem", item), log.E(err)) + } + } + +} + +// runStatMethod 调用统计项方法 +func runStatMethod(ctx context.Context, item string, start, end time.Time, appIds []int32) (err error) { + // 1.获取统计方法 + statMethod, ok := statMethodMap[item] + if !ok { + return nil + } + + // 调用统计方法,获取数据 + err = statutils.ServerMon.RunWithName(func() error { + return statMethod(ctx, start, end, appIds) + }, statutils.GetFuncName(statMethod)) + + if err != nil { + log.Error("Daily stat statByTimeRange statMethod failed!", log.Any("statItem", item), log.E(err)) + return err + } + + // 3.更新记录 + if err := statrecordmod.UpsertItemRecord(ctx, statrecordmod.DailyHourStatDayJob, item, end); err != nil { + log.Error("Daily stat commit UpsertItemRecord failed!", log.E(err)) + return err + } + return nil +} diff --git a/skd/job/statdistrict/method.go b/skd/job/statdistrict/method.go new file mode 100644 index 0000000..f363338 --- /dev/null +++ b/skd/job/statdistrict/method.go @@ -0,0 +1,231 @@ +package statdistrict + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/utils" + "stat/models/accessmod" + "stat/models/channelmod" + "stat/models/registermod" + "strconv" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +const ( + Day1RetainRate string = "day1RetainRate" // 次日留存率 + Day3RetainRate string = "day3RetainRate" // 3日留存率 + Day7RetainRate string = "day7RetainRate" // 7日留存率 +) + +func defaultTimeMap(defaultStatDate time.Time) map[string]time.Time { + return map[string]time.Time{ + Day1RetainRate: defaultStatDate, // 次日留存率 + Day3RetainRate: defaultStatDate, // 3日留存率 + Day7RetainRate: defaultStatDate, // 7日留存率 + } +} + +// 获取统计方法 +type StatMethod = func(ctx context.Context, start time.Time, end time.Time, appIds []int32) error + +// 统计方法汇总 +var statMethodMap = map[string]StatMethod{ + Day1RetainRate: Day1RetainRateMethod, // 次日留存率 + Day3RetainRate: Day3RetainRateMethod, // 3日留存率 + Day7RetainRate: Day7RetainRateMethod, // 7日留存率 +} + +// Day1RetainRateMethod 次日留存率 +func Day1RetainRateMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + registerStart := utils.BeginWithTime(start.AddDate(0, 0, -1)) + registerEnd := utils.EndWithTime(start.AddDate(0, 0, -1)) + + for _, appid := range appIds { + districtMap := make(map[string]*registermod.DayRegisterAndVisit) + + // 获取注册用户 + err := registermod.RegisterUsersInfoByTimeShard(ctx, appid, registerStart, registerEnd, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + if value, ok := districtMap[item.DistrictCode]; !ok { + districtMap[item.DistrictCode] = ®istermod.DayRegisterAndVisit{ + RegisterCount: 1, + } + } else { + value.RegisterCount += 1 + } + }) + if err != nil { + log.Error("Day1RetainRateMethod RegisterUsersInfoByTimeShard", log.E(err)) + return err + } + // 获取访问用户 + err = accessmod.DailyUserVisitCountByInfoShard(ctx, appid, start, end, utils.GlobalShardHour, registerStart, registerEnd, func(item *accessmod.AccessMod) { + if value, ok := districtMap[item.DistrictCode]; !ok { + districtMap[item.DistrictCode] = ®istermod.DayRegisterAndVisit{ + TodayVisitCount: 1, + } + } else { + value.TodayVisitCount += 1 + } + }) + if err != nil { + log.Error("Day1RetainRateMethod DailyUserVisitCountByInfoShard", log.E(err)) + return err + } + // 插入数据库 + for districtCode, districtValue := range districtMap { + rate := float64(0) + if districtValue != nil && districtValue.RegisterCount > 0 { + rate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 100*(float64(districtValue.TodayVisitCount)/float64(districtValue.RegisterCount))), 64) + } + + // 更新渠道留存 + statFilter := bson.M{ + channelmod.FN.ChannelStat.Channel: districtCode, + channelmod.FN.ChannelStat.SumDate: start, + channelmod.FN.ChannelStat.AppId: appid, + } + setDoc := bson.M{ + "$set": bson.M{ + channelmod.FN.ChannelStat.Day1RetainRate: rate, + }, + } + serr := channelmod.UpdateOneChannelStat(ctx, statFilter, setDoc) + if serr != nil { + log.Error("Day1RetainRateMethod UpdateOneChannelStat ", log.E(err)) + return err + } + } + } + + return nil +} + +// Day3RetainRateMethod 3日留存率 +func Day3RetainRateMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + registerStart := utils.BeginWithTime(start.AddDate(0, 0, -2)) + registerEnd := utils.EndWithTime(start.AddDate(0, 0, -2)) + + for _, appid := range appIds { + districtMap := make(map[string]*registermod.DayRegisterAndVisit) + // 获取注册用户 + err := registermod.RegisterUsersInfoByTimeShard(ctx, appid, registerStart, registerEnd, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + if value, ok := districtMap[item.DistrictCode]; !ok { + districtMap[item.DistrictCode] = ®istermod.DayRegisterAndVisit{ + RegisterCount: 1, + } + } else { + value.RegisterCount += 1 + } + }) + if err != nil { + log.Error("Day3RetainRateMethod RegisterUsersInfoByTimeShard", log.E(err)) + return err + } + // 获取访问用户 + err = accessmod.DailyUserVisitCountByInfoShard(ctx, appid, start, end, utils.GlobalShardHour, registerStart, registerEnd, func(item *accessmod.AccessMod) { + if value, ok := districtMap[item.DistrictCode]; !ok { + districtMap[item.DistrictCode] = ®istermod.DayRegisterAndVisit{ + TodayVisitCount: 1, + } + } else { + value.TodayVisitCount += 1 + } + }) + if err != nil { + log.Error("Day3RetainRateMethod DailyUserVisitCountByInfoShard", log.E(err)) + return err + } + // 插入数据库 + for districtCode, districtValue := range districtMap { + rate := float64(0) + if districtValue != nil && districtValue.RegisterCount > 0 { + rate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 100*(float64(districtValue.TodayVisitCount)/float64(districtValue.RegisterCount))), 64) + } + + // 更新渠道留存 + statFilter := bson.M{ + channelmod.FN.ChannelStat.Channel: districtCode, + channelmod.FN.ChannelStat.SumDate: start, + channelmod.FN.ChannelStat.AppId: appid, + } + setDoc := bson.M{ + "$set": bson.M{ + channelmod.FN.ChannelStat.Day3RetainRate: rate, + }, + } + serr := channelmod.UpdateOneChannelStat(ctx, statFilter, setDoc) + if serr != nil { + log.Error("Day1RetainRateMethod UpdateOneChannelStat", log.E(err)) + return err + } + } + } + + return nil +} + +// Day7RetainRateMethod 7日留存率 +func Day7RetainRateMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + registerStart := utils.BeginWithTime(start.AddDate(0, 0, -6)) + registerEnd := utils.EndWithTime(start.AddDate(0, 0, -6)) + for _, appid := range appIds { + districtMap := make(map[string]*registermod.DayRegisterAndVisit) + // 获取注册用户 + err := registermod.RegisterUsersInfoByTimeShard(ctx, appid, registerStart, registerEnd, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + if value, ok := districtMap[item.DistrictCode]; !ok { + districtMap[item.DistrictCode] = ®istermod.DayRegisterAndVisit{ + RegisterCount: 1, + } + } else { + value.RegisterCount += 1 + } + }) + if err != nil { + log.Error("VisitCountMethod GetAccessUserByTime", log.E(err)) + return err + } + // 获取访问用户 + err = accessmod.DailyUserVisitCountByInfoShard(ctx, appid, start, end, utils.GlobalShardHour, registerStart, registerEnd, func(item *accessmod.AccessMod) { + if value, ok := districtMap[item.DistrictCode]; !ok { + districtMap[item.DistrictCode] = ®istermod.DayRegisterAndVisit{ + TodayVisitCount: 1, + } + } else { + value.TodayVisitCount += 1 + } + }) + if err != nil { + log.Error("VisitCountMethod GetAccessUserByTime", log.E(err)) + return err + } + // 插入数据库 + for districtCode, districtValue := range districtMap { + rate := float64(0) + if districtValue != nil && districtValue.RegisterCount > 0 { + rate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 100*(float64(districtValue.TodayVisitCount)/float64(districtValue.RegisterCount))), 64) + } + + // 更新渠道留存 + statFilter := bson.M{ + channelmod.FN.ChannelStat.Channel: districtCode, + channelmod.FN.ChannelStat.SumDate: start, + channelmod.FN.ChannelStat.AppId: appid, + } + setDoc := bson.M{ + "$set": bson.M{ + channelmod.FN.ChannelStat.Day7RetainRate: rate, + }, + } + serr := channelmod.UpdateOneChannelStat(ctx, statFilter, setDoc) + if serr != nil { + log.Error("Day1RetainRateMethod UpsertOneDistrictStat ", log.E(err)) + return err + } + } + } + + return nil +} diff --git a/skd/job/statdistrict/stat.go b/skd/job/statdistrict/stat.go new file mode 100644 index 0000000..23637a1 --- /dev/null +++ b/skd/job/statdistrict/stat.go @@ -0,0 +1,87 @@ +package statdistrict + +import ( + "context" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + "stat/models/appInfoMod" + statrecordmod "stat/models/statrecord" + "time" +) + +/* +* 主要统计任务: +* 1、渠道每天的:直推访问数、裂变访问数、次日留存率、3日留存率、7日留存率。 + */ +func RunStat(defaultStatDate time.Time) error { + log.Info("statdistrict stat running...") + ctx := context.Background() + recordMap := defaultTimeMap(defaultStatDate) + + // 1.获取统计项上次统计的时候(每天执行) + recoredResult, err := statrecordmod.LastRecordTimeMap(ctx, statrecordmod.DiscStatJob) //第一次从默认记录时间开始统计 + if err != nil { + log.Error("statdistrict RunStat lastRecordTime failed!", log.E(err)) + return err + } + for _, record := range recoredResult { + recordMap[record.Item] = record.RecordTime + } + + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("statdistrict RunStat GetAppIds failed!", log.E(err)) + return err + } + + statFrq := 24 * time.Hour // 统计频率 + curStatTime := utils.BeginOfToday() // 本次统计时间 + + for item, lastStatAt := range recordMap { + _lastStatAt := lastStatAt + for curStatTime.After(_lastStatAt) { + end := _lastStatAt.Add(statFrq) + + // 超过本次统计结束时间,则结束 + if end.After(curStatTime) { + end = curStatTime + } + // 根据时间段统计数据 + err := runStatMethod(ctx, item, _lastStatAt, end, appIds) + if err != nil { + log.Error("statdistrict statByTimeRange failed!", log.E(err), log.Any("item", item)) + return err + } + _lastStatAt = end + } + recordMap[item] = _lastStatAt + } + return nil +} + +// runStatMethod 调用统计项方法 +func runStatMethod(ctx context.Context, item string, start, end time.Time, appIds []int32) (err error) { + // 1.获取统计方法 + statMethod, ok := statMethodMap[item] + if !ok { + return nil + } + + // 调用统计方法,获取数据 + err = statutils.ServerMon.RunWithName(func() error { + return statMethod(ctx, start, end, appIds) + }, statutils.GetFuncName(statMethod)) + + if err != nil { + log.Error("statdistrict stat statByTimeRange statMethod failed!", log.Any("statItem", item), log.E(err)) + return err + } + + // 3.更新记录 + if err := statrecordmod.UpsertItemRecord(ctx, statrecordmod.DiscStatJob, item, end); err != nil { + log.Error("statdistrict stat commit UpsertItemRecord failed!", log.E(err)) + return err + } + return nil +} diff --git a/skd/job/stathour/method.go b/skd/job/stathour/method.go new file mode 100644 index 0000000..2e4782d --- /dev/null +++ b/skd/job/stathour/method.go @@ -0,0 +1,260 @@ +package stathour + +import ( + "context" + "fmt" + "stat/common/enum/consts" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + "stat/models/accessmod" + "stat/models/appInfoMod" + downloadinfo "stat/models/downloadinfo" + "stat/models/minutestatmod" + "stat/models/rechargemod" + "stat/models/registermod" + "stat/models/versionMod" + "stat/statg" + "strings" + "time" +) + +const ( + VisitCount string = "visitCount" // 访问数 + NewCount string = "newCount" // 新增数 + RechargeCount string = "rechargeCount" // 充值订单数 + LandpageClick string = "landpageClick" // 落地页访问次数 + +) + +func defaultTimeMap(defaultStatDate time.Time) map[string]time.Time { + return map[string]time.Time{ + RechargeCount: defaultStatDate, // 充值订单数 + NewCount: defaultStatDate, // 新增数 + VisitCount: defaultStatDate, // 访问数 + LandpageClick: defaultStatDate, // 落地页访问次数 + } + +} + +// 获取统计方法 +type StatMethod = func(ctx context.Context, start time.Time, end time.Time, appIds []int32) error + +// 统计方法汇总 +var statMethodMap = map[string]StatMethod{ + RechargeCount: RechargeCountMethod, // 充值订单数 + NewCount: NewCountMethod, // 新增数 + VisitCount: VisitCountMethod, // 访问数 + LandpageClick: LandpageClickMethod, // 落地页访问次数 +} + +// RechargeCountMethod 充值订单数 +func RechargeCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + // 获取充值金额 + itemList, err := rechargemod.TotalRechargeListV1(ctx, appid, start, end) + if err != nil { + log.Error("DirectAmountMethod DirectRechargeAmount ", log.E(err)) + return err + } + stat := &statutils.Stat{} + for _, item := range itemList { + client := statutils.GetClientInfo(item.SysType, item.DevType, item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + stat.Add(item.PayMoney, client) + } + // 更新数据库 + doc := &minutestatmod.MinuteStatDoc{ + RechargetCount: stat.CountRef(), + RechargetMoney: stat.ValueRef(), + DirectAmount: stat.Total.Direct.ValueRef(), + FissionAmount: &stat.Total.Fission.Value, + DistrictRecharge: &stat.Total.District.Value, + WebRecharge: &stat.Total.Web.Value, + NormalRecharge: &stat.Total.Normal.Value, + AndroidRecharge: stat.Android.ValueRef(), + IosRecharge: stat.Ios.ValueRef(), + LightRecharge: stat.Light.ValueRef(), + H5Recharge: stat.H5.ValueRef(), + } + err = minutestatmod.UpsertMinuteDocStat(ctx, start, appid, doc) + if err != nil { + log.Error("RechargeCountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + return nil +} + +// NewCountMethod 新增数 +func NewCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + stat := &statutils.Stat{} + userDict := make(map[uint64]bool) + err := registermod.RegisterFormalsInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + if item.IsFormal && statutils.IsClientH5OrLight(item.SysType, item.DevType) { + if _, exists := userDict[item.UserId]; !exists { + userDict[item.UserId] = true + client := statutils.GetClientInfo(item.SysType, item.DevType, + item.DistrictCode, item.IsDirect, false, item.IsFormal) + stat.Add(1, client) + } + } + }) + if err != nil { + return err + } + err = registermod.RegisterUsersInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + userDict[item.UserId] = true + client := statutils.GetClientInfo(item.SysType, item.DevType, + item.DistrictCode, item.IsDirect, false, item.IsFormal) + stat.Add(1, client) + }) + if err != nil { + return err + } + // 更新数据库 + doc := &minutestatmod.MinuteStatDoc{ + NewCount: stat.Total.CountRef(), + DirectAddCount: stat.Total.Direct.CountRef(), + FissionAddCount: &stat.Total.Fission.Count, + WebAddCount: &stat.Total.Web.Count, + DistrictAddCount: &stat.Total.District.Count, + NormalAddCount: &stat.Total.Normal.Count, + AndroidAddCount: stat.Android.CountRef(), + IosAddCount: stat.Ios.CountRef(), + LightGuestAddCount: stat.Light.Guest.CountRef(), + LightFormalAddCount: stat.Light.Formal.CountRef(), + H5AddCount: stat.H5.CountRef(), + H5FormalAddCount: stat.H5.Formal.CountRef(), + } + err = minutestatmod.UpsertMinuteDocStat(ctx, start, appid, doc) + if err != nil { + log.Error("DirectVisitCountMethod UpsertDailyStat ", log.E(err)) + return err + } + + iosCount := *stat.Ios.CountRef() + androidCount := *stat.Android.CountRef() + + if statg.Conf.RunMod == consts.RunModRelease && appid == 888 { + if iosCount < 5 || androidCount <= 40 { + appinfo, _ := appInfoMod.GetAppInfoById(ctx, appid) + text := fmt.Sprintf("[警告]:应用名称:%s\n10分钟新增异常:\n时间:%s\nandroid:%d\nios:%d\n", appinfo.Name, start, androidCount, iosCount) + err = statg.Bot.SendMonitorMessage(text) + if err != nil { + log.Error("tg Send ", log.E(err)) + continue + } + } + } + + if statg.Conf.RunMod == consts.RunModRelease && appid == 999 { + if iosCount < 5 || androidCount <= 40 { + appinfo, _ := appInfoMod.GetAppInfoById(ctx, appid) + text := fmt.Sprintf("[警告]:应用名称:%s\n10分钟新增异常:\n时间:%s\nandroid:%d\nios:%d\n", appinfo.Name, start, androidCount, iosCount) + err = statg.Bot.SendMonitorMessage(text) + if err != nil { + log.Error("tg Send ", log.E(err)) + continue + } + } + } + + if statg.Conf.RunMod == consts.RunModRelease && (appid == 222 || appid == 80) { + if iosCount <= 2 || androidCount <= 10 { + appinfo, _ := appInfoMod.GetAppInfoById(ctx, appid) + text := fmt.Sprintf("[警告]:应用名称:%s\n10分钟新增异常:\n时间:%s\nandroid:%d\nios:%d\n", appinfo.Name, start, androidCount, iosCount) + err = statg.Bot.SendMonitorMessage(text) + if err != nil { + log.Error("tg Send ", log.E(err)) + continue + } + } + } + + } + return nil +} + +// VisitCountMethod 访问数 +func VisitCountMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + start = start.Add(-time.Minute * 10) + end = end.Add(-time.Minute * 10) + for _, appid := range appIds { + stat := &statutils.Stat{} + err := accessmod.VisitInfoByTimeShard(ctx, appid, start, end, utils.GlobalShardHour, func(item *accessmod.AccessMod) { + client := statutils.GetClientInfo(item.SysType, item.DevType, + item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + stat.Add(1, client) + }) + if err != nil { + log.Error("AppVisitCountMethod:VisitInfoByTimeShard", log.E(err)) + return err + } + // 更新数据库 + doc := &minutestatmod.MinuteStatDoc{ + AccessCount: stat.CountRef(), + DirectAccessCount: stat.Total.Direct.CountRef(), + NaturalAccessCount: stat.Total.Direct.Natural.CountRef(), + FissionAccessCount: stat.Total.Fission.CountRef(), + DistrictAccessCount: stat.Total.District.CountRef(), + WebAccessCount: stat.Total.Web.CountRef(), + NormalAccessCount: stat.Total.Normal.CountRef(), + AndroidAccessCount: stat.Android.CountRef(), + IosAccessCount: stat.Ios.CountRef(), + H5AccessCount: stat.H5.CountRef(), + LightAccessCount: stat.Light.CountRef(), + } + err = minutestatmod.UpsertMinuteDocStat(ctx, start, appid, doc) + if err != nil { + log.Error("DirectVisitCountMethod UpsertDailyStat ", log.E(err)) + return err + } + + } + return nil +} + +// LandpageClickMethod 落地页访问次数 +func LandpageClickMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + + downloadList, err := downloadinfo.GetAccessCountByTime(ctx, appid, start, end) + if err != nil { + log.Error("RunMonitor, GetAccessCountByTime", log.E(err)) + return err + } + androidClick := int64(0) + appstoreClick := int64(0) + iosAtherClick := int64(0) + h5Click := int64(0) + + for _, downloadInfo := range downloadList { + if downloadInfo.SysType == "android" { + androidClick += 1 + } else if strings.Contains(downloadInfo.SysType, "ios") || strings.Contains(downloadInfo.SysType, "light") { + if downloadInfo.PackageType == versionMod.Shop { + appstoreClick += 1 + } else if downloadInfo.PackageType == versionMod.Enterprise { + iosAtherClick += 1 + } else if downloadInfo.PackageType == versionMod.Light { + h5Click += 1 + } + } + } + // 更新数据库 + doc := &minutestatmod.MinuteStatDoc{ + LandpageAndroidClick: &androidClick, + LandpageIosAppstoreClick: &appstoreClick, + LandpageIosAthorClick: &iosAtherClick, + LandpageIosH5Click: &h5Click, + } + err = minutestatmod.UpsertMinuteDocStat(ctx, start, appid, doc) + if err != nil { + log.Error("DirectVisitCountMethod UpsertDailyStat ", log.E(err)) + return err + } + } + + return nil +} diff --git a/skd/job/stathour/stat.go b/skd/job/stathour/stat.go new file mode 100644 index 0000000..25225ad --- /dev/null +++ b/skd/job/stathour/stat.go @@ -0,0 +1,94 @@ +package stathour + +import ( + "context" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + "stat/models/appInfoMod" + statrecordmod "stat/models/statrecord" + "time" +) + +/* +* 主要统计任务: +* 按1个小时一个点,记录实时数据 app(新增、访问数....) + */ + +// RunStat // 按10分钟的频率去统计 +func RunStat(defaultStatDate time.Time) error { + log.Info("APP hour stat ......") + ctx := context.Background() + recordMap := defaultTimeMap(defaultStatDate) + + // 1.获取统计项上次统计的时候(每天执行) + recoredResult, err := statrecordmod.LastRecordTimeMap(ctx, statrecordmod.AppHour) //第一次从默认记录时间开始统计 + if err != nil { + log.Error("APP hour stat ", log.E(err)) + return err + } + for _, record := range recoredResult { + recordMap[record.Item] = record.RecordTime + } + + now := time.Now().Add(time.Minute * -5) // 延迟5分钟,数据同步完成 + statFrq := 10 * time.Minute // 统计频率 + curStatTime := utils.RecentMinute(now, 10) // 按10分钟对齐 + + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("APP hour stat GetAppIds failed!", log.E(err)) + return err + } + + for item, lastStatAt := range recordMap { + _lastStatAt := lastStatAt + + for curStatTime.After(_lastStatAt) { + end := _lastStatAt.Add(statFrq) + // 超过本次统计结束时间,则结束 + if end.After(curStatTime) { + end = curStatTime + } + // 根据时间段统计数据 + //fmt.Println("APP hour stat ", _lastStatAt, end) + err := runStatMethod(ctx, item, _lastStatAt, end, appIds) + if err != nil { + log.Error("APP hour stat runStatMethod failed!", log.E(err), log.Any("item", item)) + return err + } + + _lastStatAt = end + } + recordMap[item] = _lastStatAt + } + log.Info("APP hour stat ") + return nil +} + +// runStatMethod 调用统计项方法 +func runStatMethod(ctx context.Context, item string, start, end time.Time, appIds []int32) (err error) { + // 1.获取统计方法 + statMethod, ok := statMethodMap[item] + if !ok { + return nil + } + + // 调用统计方法,获取数据 + err = statutils.ServerMon.RunWithName(func() error { + return statMethod(ctx, start, end, appIds) + }, statutils.GetFuncName(statMethod)) + + if err != nil { + log.Error("APP hour stat statMethod failed!", log.Any("statItem", item), log.E(err)) + return err + } + + // 3.更新记录 + if err := statrecordmod.UpsertItemRecord(ctx, statrecordmod.AppHour, item, end); err != nil { + log.Error("APP hour stat commit UpsertItemRecord failed!", log.E(err)) + return err + } + + return nil +} diff --git a/skd/job/statlandpage/stat.go b/skd/job/statlandpage/stat.go new file mode 100644 index 0000000..b6f46ea --- /dev/null +++ b/skd/job/statlandpage/stat.go @@ -0,0 +1,92 @@ +package statlandpage + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + statrecordmod "stat/models/statrecord" + "time" +) + +type StatMethod func(ctx context.Context, start, end time.Time) error +type TimeAlignFunc func(t time.Time) time.Time + +func timeAlignForDaily(t time.Time) time.Time { + return utils.BeginWithTime(t) +} +func timeAlignForHour(t time.Time) time.Time { + return utils.RecentMinute(t, 60) +} + +func RunStatHour(defaultStatDate time.Time) error { + ctx := context.Background() + job := statrecordmod.LandPageHourStatJob + recordMap := defaultTimeMap(defaultStatDate) + return recordStat(ctx, recordMap, job, time.Hour, -time.Hour, statLandPageHourApps, timeAlignForHour) +} + +func RunStatDaily(defaultStatDate time.Time) error { + ctx := context.Background() + job := statrecordmod.LandPageDailyStatJob + recordMap := defaultTimeMap(defaultStatDate) + return recordStat(ctx, recordMap, job, 24*time.Hour, -time.Hour, statLandPageDailyApps, timeAlignForDaily) +} + +// recordStat 统计 +func recordStat(ctx context.Context, recordMap map[string]time.Time, job string, timeStep, timeBack time.Duration, stat StatMethod, align TimeAlignFunc) error { + recordResult, err := statrecordmod.LastRecordTimeMap(ctx, job) //第一次从默认记录时间开始统计 + if err != nil { + log.Error("LastRecordTimeMap", log.E(err)) + return err + } + for _, record := range recordResult { + recordMap[record.Item] = record.RecordTime + } + + now := time.Now().Add(timeBack) + curStatTime := align(now) + + for item, lastStatAt := range recordMap { + _lastStatAt := align(lastStatAt) + + for curStatTime.After(_lastStatAt) { + end := _lastStatAt.Add(timeStep) + + fmt.Printf("item:%s, start:%s, end:%s\n", item, _lastStatAt, end) + + err := runStatMethod(ctx, item, job, _lastStatAt, end, stat) + if err != nil { + log.Error("recordStat failed!", log.E(err), log.Any("item", item), log.Any("job", job)) + return err + } + + _lastStatAt = end + } + + recordMap[item] = _lastStatAt + } + return err +} + +// runStatMethod 调用统计项方法 +func runStatMethod(ctx context.Context, item, job string, start, end time.Time, stat StatMethod) error { + var err error + // 调用统计方法,获取数据 + err = statutils.ServerMon.RunWithName(func() error { + return stat(ctx, start, end) + }, statutils.GetFuncName(stat)) + + if err != nil { + log.Error("runStatMethod failed!", log.Any("statItem", item), log.E(err)) + return err + } + + if err := statrecordmod.UpsertItemRecord(ctx, job, item, end); err != nil { + log.Error("commit UpsertItemRecord failed!", log.E(err)) + return err + } + + return nil +} diff --git a/skd/job/statlandpage/stat_test.go b/skd/job/statlandpage/stat_test.go new file mode 100644 index 0000000..b16f1f0 --- /dev/null +++ b/skd/job/statlandpage/stat_test.go @@ -0,0 +1,18 @@ +package statlandpage + +import ( + "stat/common/utils" + "stat/tool/pubtest" + "testing" + "time" +) + +func TestRunStat(t *testing.T) { + pubtest.TestInit("/Users/mac/Works/codes/stat_center/run/zhihu-test") + s, _ := time.Parse(time.RFC3339, "2023-06-15T15:00:00+08:00") + //curStatTime := utils.RecentMinute(s, 60) // 按60分钟对齐 + curStatTime := utils.BeginWithTime(s) // 按60分钟对齐 + //fmt.Printf("%s", curStatTime) + + RunStatDaily(curStatTime) +} diff --git a/skd/job/statlandpage/statlandpage.go b/skd/job/statlandpage/statlandpage.go new file mode 100644 index 0000000..58b4585 --- /dev/null +++ b/skd/job/statlandpage/statlandpage.go @@ -0,0 +1,134 @@ +package statlandpage + +import ( + "context" + "stat/common/log" + "stat/common/utils" + "stat/models/appInfoMod" + "stat/models/downloadCpc" + "stat/models/downloadinfo" + "stat/models/downloadstat" + "stat/models/registermod" + "time" + + "go.mongodb.org/mongo-driver/mongo" + + "go.mongodb.org/mongo-driver/bson/primitive" + + "go.mongodb.org/mongo-driver/bson" +) + +const ( + LandPageStat string = "landPageStat" // 落地页统计 +) + +func defaultTimeMap(defaultStatDate time.Time) map[string]time.Time { + return map[string]time.Time{ + LandPageStat: defaultStatDate, // 落地页统计 + } +} + +func statLandPageDailyApps(ctx context.Context, start, end time.Time) error { + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("GetAppIds failed!", log.E(err)) + return err + } + for _, id := range appIds { + if err := statLandPage(ctx, start, end, id, downloadstat.StatTypeDaily); err != nil { + return err + } + } + time.Sleep(3 * time.Second) + return nil +} + +func statLandPageHourApps(ctx context.Context, start, end time.Time) error { + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("GetAppIds failed!", log.E(err)) + return err + } + for _, id := range appIds { + if err := statLandPage(ctx, start, end, id, downloadstat.StatTypeHour); err != nil { + return err + } + } + return nil +} + +func statLandPage(ctx context.Context, start, end time.Time, appId int32, statType downloadstat.StatType) error { + old, err := downloadstat.FindOneStat(ctx, bson.M{ + "appId": appId, + "type": statType, + "sumDate": start, + }) + if err != nil { + if err != mongo.ErrNoDocuments { + return err + } + } + if old != nil { + return nil // 已经存在 + } + visitTotal := int64(0) + visitDict := make(map[string]int64) + visitList, err := downloadCpc.FindManyDownloadCpc(ctx, bson.M{ + "appId": appId, + "createdAt": bson.M{"$gte": start, "$lt": end}, + }) + if err != nil { + return err + } + for _, visit := range visitList { + visitTotal++ + visitDict[visit.IP]++ + } + downTotal := int64(0) + downDict := make(map[string]int64) + downDictEx := make(map[string]int64) + downList, err := downloadinfo.FindManyDownloadInfo(ctx, bson.M{ + "appId": appId, + "createdAt": bson.M{"$gte": start.Add(-time.Hour), "$lt": end}, + }) + if err != nil { + return err + } + for _, down := range downList { + downDictEx[down.IP]++ + if !down.CreatedAt.Before(start) && down.CreatedAt.Before(end) { + downTotal++ + downDict[down.IP]++ + } + } + registerDict := make(map[string]int64) + var registerCount int64 + err = registermod.RegisterUsersInfoByTimeShard(ctx, appId, start, end, utils.GlobalShardHour, func(item *registermod.RegisterMod) { + if _, exists := downDictEx[item.IP]; exists { + registerDict[item.IP]++ + registerCount++ // 这里只计算来自落地页的注册 + } + }) + if err != nil { + return err + } + + stat := &downloadstat.Stat{ + ID: primitive.NewObjectID(), + AppId: appId, + SumDate: start, + EndDate: end, + Hour: start.Hour(), + Type: statType, + VisitTotal: visitTotal, + VisitUnique: int64(len(visitDict)), + DownTotal: downTotal, + DownUnique: int64(len(downDict)), + InstallTotal: registerCount, // 落地页注册 + InstallUnique: int64(len(registerDict)), + UpdatedAt: time.Now(), + CreatedAt: time.Now(), + } + + return downloadstat.InsertOneStat(ctx, stat) +} diff --git a/skd/job/statminute/method.go b/skd/job/statminute/method.go new file mode 100644 index 0000000..c6813b3 --- /dev/null +++ b/skd/job/statminute/method.go @@ -0,0 +1,602 @@ +package statminute + +import ( + "context" + "fmt" + "math/rand" + "stat/common/log" + "stat/common/statutils" + "stat/common/topicmessage" + "stat/common/utils" + "stat/models/accessmod" + "stat/models/channelmod" + "stat/models/downloadinfo" + "stat/models/rechargegamemod" + "stat/models/rechargemod" + "stat/models/registermod" + "stat/models/syncvip" + "stat/models/versionMod" + "stat/models/withdrawGameOrdermod" + "strings" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +const ( + ChannelStat string = "visitInfo" // 渠道统计 +) + +func defaultTimeMap(defaultStatDate time.Time) map[string]time.Time { + return map[string]time.Time{ + ChannelStat: defaultStatDate, // 渠道统计 + } +} + +// 获取统计方法 +type StatMethod = func(ctx context.Context, start time.Time, end time.Time, appIds []int32) error + +// 统计方法汇总 +var statMethodMap = map[string]StatMethod{ + ChannelStat: ChannelSettlementMethod, // 渠道统计 +} + +func canUserDeduction(ruleInfo *channelmod.ChannelDeductionRule, index int, incomeRate float64, isDirect bool) bool { + rate := int32(0) // 扣量比例 + if ruleInfo.Settlement == channelmod.SettlementCPA || ruleInfo.Settlement == channelmod.SettlementCPS { + //自动扣量 + if ruleInfo.Settlement == channelmod.SettlementCPA && ruleInfo.AutoDeduction && incomeRate > 0.0 && ruleInfo.LessIncomeRate > incomeRate { + rate = 80 + } else { + if index < 1 { // 一阶 + rate = ruleInfo.First + } else if index <= 3 { // 二阶 + rate = ruleInfo.Second + } else if index <= 6 { // 三阶 + rate = ruleInfo.Third + } else if index <= 10 { // 四阶 + rate = ruleInfo.Fourth + } else { + rate = ruleInfo.Fifth + } + } + if isDirect && int32(rand.Intn(100)) < rate { // rate扣量比例 + return true + } + } + return false +} + +func deductionCountMethod(ctx context.Context, ruleInfo *channelmod.ChannelDeductionRule, settlement *channelmod.ChannelSettlement, registerList []*registermod.RegisterMod, incomeRate float64) error { + deductionUserIds := make([]int64, 0) + // 先计算扣量 + for index, item := range registerList { + item.IsDeduction = false + if canUserDeduction(ruleInfo, index, incomeRate, item.IsDirect) { + item.IsDeduction = true + deductionUserIds = append(deductionUserIds, int64(item.UserId)) + } + } + // 统计IP + ipDict := make(map[string]int64) + for _, item := range registerList { + if item.IP != "" { + ipDict[item.IP]++ + } + } + // 1.统计这段时间内的注册用户 + stat := &statutils.Stat{} + uniqueStat := &statutils.Stat{} + for _, item := range registerList { + client := statutils.GetClientInfo(item.SysType, item.DevType, item.DistrictCode, item.IsDirect, item.IsDeduction, item.IsFormal) + stat.Add(1, client) + if _, exists := ipDict[item.IP]; exists { + uniqueStat.Add(1, client) + } + } + settlement.NewTotalIpCount += uniqueStat.Count() + settlement.NewTotalCount += stat.Total.Count() + settlement.NewDirectCount += stat.Total.Direct.Count() + settlement.NewFissionCount += stat.Total.Fission.Count + settlement.NewDeductionCount += stat.Total.Deduction.Count + settlement.NewLightCount += stat.Light.Count() + settlement.NewLightDirectCount += stat.Light.Total.Direct.Count() + settlement.NewLightFissionCount += stat.Light.Total.Fission.Count + settlement.NewLightDeductionCount += stat.Light.Total.Deduction.Count + settlement.NewLightNaturalCount += stat.Light.Total.Direct.Natural.Count + settlement.NewLightGuestCount += stat.Light.Guest.Count() + settlement.NewLightGuestDirectCount += stat.Light.Guest.Direct.Count() + settlement.NewLightGuestFissionCount += stat.Light.Guest.Fission.Count + settlement.NewLightGuestDeductionCount += stat.Light.Guest.Deduction.Count + settlement.NewLightFormalCount += stat.Light.Formal.Count() + settlement.NewLightFormalDirectCount += stat.Light.Formal.Direct.Count() + settlement.NewLightFormalFissionCount += stat.Light.Formal.Fission.Count + settlement.NewLightFormalDeductionCount += stat.Light.Formal.Deduction.Count + settlement.NewAndroidCount += stat.Android.Count() + settlement.NewAndroidDirectCount += stat.Android.Direct.Count() + settlement.NewAndroidFissionCount += stat.Android.Fission.Count + settlement.NewAndroidDeductionCount += stat.Android.Deduction.Count + settlement.NewIosCount += stat.Ios.Count() + settlement.NewIosDirectCount += stat.Ios.Direct.Count() + settlement.NewIosFissionCount += stat.Ios.Fission.Count + settlement.NewIosDeductionCount += stat.Ios.Deduction.Count + settlement.NewH5Count += stat.H5.Count() + settlement.NewH5DirectCount += stat.H5.Total.Direct.Count() + settlement.NewH5FissionCount += stat.H5.Total.Fission.Count + settlement.NewH5DeductionCount += stat.H5.Total.Deduction.Count + settlement.NewH5AndroidCount += stat.H5.Android.Count() + settlement.NewH5IosCount += stat.H5.Ios.Count() + settlement.NewH5PcCount += stat.H5.Pc.Count() + settlement.NewH5FormalCount += stat.H5.Formal.Count() + settlement.NewH5FormalDirectCount += stat.H5.Formal.Direct.Count() + settlement.NewH5FormalFissionCount += stat.H5.Formal.Fission.Count + settlement.NewH5FormalDeductionCount += stat.H5.Formal.Deduction.Count + + // 5 更新扣量用户 + if len(deductionUserIds) > 0 { + setdoc := bson.M{"$set": bson.M{"isDeduction": true}} + filter := bson.M{ + "appId": ruleInfo.AppId, + "userId": bson.M{"$in": deductionUserIds}, + } + err := registermod.UpdateManyRegister(ctx, filter, setdoc) + if err != nil { + log.Error("NewCountMethod UpdateManyRegister ", log.E(err)) + return err + } + } + return nil +} + +func channelChannelStatMethod(ctx context.Context, ruleInfo *channelmod.ChannelDeductionRule, settlement *channelmod.ChannelSettlement, visitList accessmod.VisitInfoList, + start, end time.Time, appid int32) error { + + stat := &statutils.Stat{} + for _, item := range visitList { + client := statutils.GetClientInfo(item.SysType, item.DevType, item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + stat.Add(1, client) + } + settlement.TotalVisitCount = stat.Count() + settlement.DirectVisitCount = stat.Total.Direct.Count() + settlement.FissionVisitCount = stat.Total.Fission.Count + settlement.AndroidVisitCount = stat.Android.Count() + settlement.IosVisitCount = stat.Ios.Count() + settlement.LightVisitCount = stat.Light.Count() + settlement.LightVisitDirectCount = stat.Light.Total.Direct.Count() + settlement.LightVisitFissionCount = stat.Light.Total.Fission.Count + settlement.LightVisitDeductionCount = stat.Light.Total.Deduction.Count + settlement.LightVisitNaturalCount = stat.Light.Total.Direct.Natural.Count + settlement.H5VisitCount = stat.H5.Count() + settlement.H5AndroidVisitCount = stat.H5.Android.Count() + settlement.H5IosVisitCount = stat.H5.Ios.Count() + settlement.H5PcVisitCount = stat.H5.Pc.Count() + + return nil +} + +func channelVipMethod(ctx context.Context, ruleInfo *channelmod.ChannelDeductionRule, settlement *channelmod.ChannelSettlement, VipList syncvip.SyncVipList, + start, end time.Time, appid int32) error { + deductionVipOrderIds := make([]primitive.ObjectID, 0) + for _, buyInfo := range VipList { + // 统计渠道信息 + if buyInfo.IsDirect && buyInfo.BuyVIPType == topicmessage.BuyVIPTypeMoney { + if ruleInfo.Settlement == channelmod.SettlementCPS { + if ruleInfo.TodayTime != utils.BeginWithTime(start) { + ruleInfo.TodayDeduction = 0 + ruleInfo.TodayTime = utils.BeginWithTime(start) + } + ruleInfo.TodayDeduction += buyInfo.Money + if ruleInfo.CPSBegin < ruleInfo.TodayDeduction { + if int32(rand.Intn(100)) < int32(ruleInfo.CPSDeductionRate) { + deductionVipOrderIds = append(deductionVipOrderIds, buyInfo.ID) + settlement.VipPayDeduction += buyInfo.Money + } + } + } + } + // 统计信息 + if buyInfo.IsDirect { + if buyInfo.BuyVIPType == topicmessage.BuyVIPTypeMoney { + settlement.VipPayMoney += buyInfo.Money + } else { + settlement.VipPayCoin += buyInfo.Amount + } + } + } + + if len(deductionVipOrderIds) > 0 { + settlement.VipPayMoney = settlement.VipPayMoney - settlement.VipPayDeduction + + setdoc := bson.M{"$set": bson.M{syncvip.FN.SyncVip.IsDeduction: true}} + filter := bson.M{ + syncvip.FN.SyncVip.ID: bson.M{"$in": deductionVipOrderIds}, + syncvip.FN.SyncVip.AppId: ruleInfo.AppId, + } + err := syncvip.UpdateOneSyncVip(ctx, filter, setdoc) + if err != nil { + log.Error("channelRechargeCountMethod UpdateManyRecharge ", log.E(err)) + return err + } + } + return nil +} + +func channelRechargeCountMethod(ctx context.Context, ruleInfo *channelmod.ChannelDeductionRule, settlement *channelmod.ChannelSettlement, rechargeList rechargemod.RechargeInfoList, + start, end time.Time, appid int32) error { + + stat := &statutils.Stat{} + statNew := statutils.Stat{} + for _, item := range rechargeList { + client := statutils.GetClientInfo(item.SysType, item.DevType, item.DistrictCode, item.IsDirect, false, item.IsFormalUser) + stat.Add(item.Money, client) + if item.RegisterTime.After(item.SuccessAt.AddDate(0, 0, -1)) { + statNew.Add(item.Money, client) + } + } + settlement.TotalAmount = stat.Value() + settlement.DirectAmount = stat.Total.Direct.Value() + settlement.DirectAmountCount = stat.Total.Direct.Count() + settlement.FissionAmount = stat.Total.Fission.Value + settlement.FissionAmountCount = stat.Total.Fission.Count + settlement.NaturalAmount = stat.Total.Direct.Natural.Value + settlement.NaturalAmountCount = stat.Total.Direct.Natural.Count + settlement.DeductionAmount = stat.Total.Deduction.Value + settlement.DeductionAmountCount = stat.Total.Deduction.Count + settlement.AndroidAmount = stat.Android.Value() + settlement.AndroidAmountCount = stat.Android.Count() + settlement.IosAmount = stat.Ios.Value() + settlement.IosAmountCount = stat.Ios.Count() + settlement.H5Amount = stat.H5.Value() + settlement.H5AmountCount = stat.H5.Count() + settlement.LightAmount = stat.Light.Value() + settlement.LightAmountCount = stat.Light.Count() + settlement.LightDirectAmount = stat.Light.Total.Direct.Value() + settlement.LightDirectAmountCount = stat.Light.Total.Direct.Count() + settlement.LightFissionAmount = stat.Light.Total.Fission.Value + settlement.LightFissionAmountCount = stat.Light.Total.Fission.Count + settlement.LightDeductionAmount = stat.Light.Total.Deduction.Value + settlement.LightDeductionAmountCount = stat.Light.Total.Deduction.Count + settlement.LightNaturalAmount = stat.Light.Total.Direct.Natural.Value + settlement.LightNaturalAmountCount = stat.Light.Total.Direct.Natural.Count + settlement.NewRechargeAmount = statNew.Value() + return nil +} + +// GameRechargeMethod 游戏充值 +func channelGameRechargeMethod(ctx context.Context, ruleInfo *channelmod.ChannelDeductionRule, + rechageList rechargegamemod.GameRechargeInfoList, withdrawList []withdrawGameOrdermod.GameWithdrawOrder, + settlement *channelmod.ChannelSettlement, + start, end time.Time, appid int32) error { + + for _, withdrawInfo := range withdrawList { + if ruleInfo.Channel == withdrawInfo.DistrictCode { + settlement.GameWithdrawAmount += withdrawInfo.Money + } + } + + for _, rechageInfo := range rechageList { + if ruleInfo.Channel == rechageInfo.DistrictCode { + settlement.GameRechageAmount += rechageInfo.Money + } + } + + return nil +} + +// channelLandPageMethod 落地页访问 +func channelLandPageMethod(ctx context.Context, settlement *channelmod.ChannelSettlement, start, end time.Time, appid int32) error { + itemList, err := downloadinfo.GetChannelDownloadPageListByTime(ctx, settlement.Channel, appid, start, end) + if err != nil { + return err + } + androidClick := int64(0) + appstoreClick := int64(0) + iosAtherClick := int64(0) + lightClick := int64(0) + + for _, downloadInfo := range itemList { + if downloadInfo.SysType == "android" { + androidClick += 1 + } else if strings.Contains(downloadInfo.SysType, "ios") || strings.Contains(downloadInfo.SysType, "light") { + if downloadInfo.PackageType == versionMod.Shop { + appstoreClick += 1 + } else if downloadInfo.PackageType == versionMod.Enterprise { + iosAtherClick += 1 + } else if downloadInfo.PackageType == versionMod.Light { + lightClick += 1 + } + } + } + + settlement.LandPageVisitCount = int64(len(itemList)) + settlement.LandpageAndroidClick = androidClick + settlement.LandpageIosAppstoreClick = appstoreClick + settlement.LandpageIosAthorClick = iosAtherClick + settlement.LandpageIosH5Click = lightClick + + return nil +} + +// ChannelSettlementMethod 渠道计算 +func ChannelSettlementMethod(ctx context.Context, start time.Time, end time.Time, appIds []int32) error { + for _, appid := range appIds { + channelDeductionRules, err := channelmod.FindManyChannelDeductionRule(ctx, bson.M{channelmod.FN.ChannelDeductionRule.AppId: appid}) + if err != nil { + log.Error("ChannelSettlementMethod FindManyChannelDeductionRule", log.E(err)) + return err + } + + channnels := make([]string, 0) + for _, channnelInfo := range channelDeductionRules { + channnels = append(channnels, channnelInfo.Channel) + } + channelInfolist, err := channelmod.FindManyChannelInfo(ctx, bson.M{channelmod.FN.ChannelInfo.Channel: bson.M{"$in": channnels}}) + if err != nil { + log.Error("ChannelSettlementMethod FindManyChannelInfo", log.E(err)) + return err + } + registerList, err := registermod.RegisterUsersInfoByTime(ctx, appid, start, end) + if err != nil { + log.Error("NewCountMethod RegisterUsersInfoByDistrict ", log.E(err)) + return err + } + + registerFormalList, err := registermod.RegisterFormalsInfoByTime(ctx, appid, start, end) + if err != nil { + log.Error("NewCountMethod RegisterUsersInfoByDistrict ", log.E(err)) + return err + } + + vipfilter := bson.M{ + syncvip.FN.SyncVip.AppId: appid, + syncvip.FN.SyncVip.SuccessAt: bson.M{"$gte": start, "$lt": end}, + } + + VipList, err := syncvip.FindManySyncVip(ctx, vipfilter) + if err != nil { + log.Error("ChannelChannelStatMethod FindManyVisitInfo ", log.E(err)) + return err + } + + visitFilter := bson.M{"appId": appid, "visitAt": bson.M{"$gte": start, "$lt": end}} + visitList, _ := accessmod.FindManyVisitInfo(ctx, visitFilter) + + rechargeFilter := bson.M{"appId": appid, "successAt": bson.M{"$gte": start, "$lt": end}} + rechargeList, _ := rechargemod.FindManyRechargeInfo(ctx, rechargeFilter) + + for _, ruleInfo := range channelDeductionRules { + if ruleInfo.CreatedAt.After(start) { + continue + } + //fmt.Println("channelDeductionRules", ruleInfo.Channel) + settlement := &channelmod.ChannelSettlement{ + SumDate: start, + AppId: appid, + AppType: ruleInfo.AppType, + PromoteMode: ruleInfo.PromoteMode, + Channel: ruleInfo.Channel, + } + for _, channelInfo := range channelInfolist { + if channelInfo.Channel == ruleInfo.Channel { + settlement.Type = channelInfo.Type + settlement.ParentChannel = channelInfo.ParentChannel + settlement.UserName = channelInfo.UserName + } + } + if ruleInfo.SettlementTime == start { + // 已经结算 + continue + } + + statFilter := bson.M{ + channelmod.FN.ChannelStat.Channel: ruleInfo.Channel, + channelmod.FN.ChannelStat.SumDate: utils.BeginWithTime(start), + channelmod.FN.ChannelStat.AppId: appid, + } + + channelStatInfo, err := channelmod.FindOneChannelStat(ctx, statFilter) + if err != nil { + log.Error("ChannelSettlementMethod CountChannelStats", log.E(err)) + return err + } + + // 统计新增情况 + userDict := make(map[uint64]bool) + channelRegisterList := make([]*registermod.RegisterMod, 0) + for _, v := range registerFormalList { + if v.IsFormal && statutils.IsClientH5OrLight(v.SysType, v.DevType) { + if v.DistrictCode == ruleInfo.Channel { + userDict[v.UserId] = true + channelRegisterList = append(channelRegisterList, v) + } + } + } + for _, v := range registerList { + if v.DistrictCode == ruleInfo.Channel { + if _, exists := userDict[v.UserId]; !exists { + userDict[v.UserId] = true + channelRegisterList = append(channelRegisterList, v) + } + } + } + oldIncomeRate := float64(0) + if channelStatInfo != nil { + oldIncomeRate = channelStatInfo.IncomeRate + } + deductionCountMethod(ctx, ruleInfo, settlement, channelRegisterList, oldIncomeRate) + + // 统计访问量 + channelAccessList := make(accessmod.VisitInfoList, 0) + for _, v := range visitList { + if v.DistrictCode == ruleInfo.Channel { + channelAccessList = append(channelAccessList, v) + } + } + channelChannelStatMethod(ctx, ruleInfo, settlement, channelAccessList, start, end, appid) + + // 统计充值数据 + channelRechargeList := make(rechargemod.RechargeInfoList, 0) + for _, v := range rechargeList { + if v.DistrictCode == ruleInfo.Channel { + channelRechargeList = append(channelRechargeList, v) + } + } + channelRechargeCountMethod(ctx, ruleInfo, settlement, channelRechargeList, start, end, appid) + + // 统计VIP购买 + channelVipList := make(syncvip.SyncVipList, 0) + for _, v := range VipList { + if v.DistrictCode == ruleInfo.Channel { + channelVipList = append(channelVipList, v) + } + } + channelVipMethod(ctx, ruleInfo, settlement, channelVipList, start, end, appid) + + channelLandPageMethod(ctx, settlement, start, end, appid) + + // 更新渠道信息 + ruleFilter := bson.M{channelmod.FN.ChannelDeductionRule.ID: ruleInfo.ID} + ruleSet := bson.M{"$set": bson.M{ + channelmod.FN.ChannelDeductionRule.SettlementTime: start, + channelmod.FN.ChannelDeductionRule.TodayTime: ruleInfo.TodayTime, + channelmod.FN.ChannelDeductionRule.TodayDeduction: ruleInfo.TodayDeduction, + }} + + err = channelmod.UpdateManyChannelDeductionRule(ctx, ruleFilter, ruleSet) + if err != nil { + log.Error("ChannelSettlementMethod UpdateManyChannelDeductionRule", log.E(err)) + return err + } + + settlement.CorrectValidData() + + //插入数据 + err = channelmod.InsertOneChannelSettlement(ctx, settlement) + if err != nil { + log.Error("ChannelSettlementMethod InsertOneChannelSettlement", log.E(err)) + return err + } + + if channelStatInfo.Channel != ruleInfo.Channel { + channelStatInfo.Channel = ruleInfo.Channel + channelStatInfo.SumDate = utils.BeginWithTime(start) + channelStatInfo.AppId = appid + channelStatInfo.Type = settlement.Type + channelStatInfo.UserName = settlement.UserName + channelStatInfo.Settlement = ruleInfo.Settlement + channelStatInfo.CPAPrice = ruleInfo.CPAPrice + channelStatInfo.CPSRate = ruleInfo.CPSRate + channelStatInfo.AppType = ruleInfo.AppType + channelStatInfo.PromoteMode = ruleInfo.PromoteMode + channelStatInfo.ParentChannel = settlement.ParentChannel + channelStatInfo.IsPay = false + // 数据赋值 + settlement.AssignmentTo(channelStatInfo) + // 插入记录 + err = channelmod.InsertOneChannelStat(ctx, channelStatInfo) + if err != nil { + log.Error("ChannelSettlementMethod InsertOneChannelStat", log.E(err)) + return err + } + } else { + // 数据累加 + settlement.AccumulateTo(channelStatInfo) + // 更新记录 + setdoc := bson.M{"$set": channelStatInfo} + err = channelmod.UpdateOneChannelStat(ctx, statFilter, setdoc) + if err != nil { + log.Error("ChannelSettlementMethod UpdateOneChannelStat", log.E(err)) + return err + } + } + } + } + return nil +} + +// 更新渠道数据 +func ChannelSettlementUpdateByHour() error { + ctx := context.Background() + nowHour := utils.BeginOfHour() + + statFilter := bson.M{ + channelmod.FN.ChannelStat.SumDate: utils.BeginWithTime(nowHour.Add(-30 * time.Minute)), // 确保:0点是获取上一天数据 + "$or": bson.A{ + bson.M{channelmod.FN.ChannelStat.NewDirectCount: bson.M{"$gt": 0}}, + bson.M{channelmod.FN.ChannelStat.DirectAmount: bson.M{"$gt": 0}}, + }, + } + statList, err := channelmod.FindManyChannelStat(ctx, statFilter) + if err != nil { + log.Error("ChannelSettlementUpdateByHour FindManyChannelStat", log.E(err)) + return err + } + + yesterdayFilter := bson.M{ + channelmod.FN.ChannelStatYestoday.SumDate: nowHour.AddDate(0, 0, -1), + } + + statYesterdayList, _ := channelmod.FindManyChannelStatYestoday(ctx, yesterdayFilter) + + for _, channelStatInfo := range statList { + channelStatInfoYesterday := &channelmod.ChannelStatYesterday{ + // base + Channel: channelStatInfo.Channel, + SumDate: nowHour, + AppId: channelStatInfo.AppId, + ParentChannel: channelStatInfo.ParentChannel, + Settlement: channelStatInfo.Settlement, + UpdatedAt: time.Now(), + CreatedAt: time.Now(), + // new + NewCount: channelStatInfo.NewTotalCount, + NewDirectCount: channelStatInfo.NewDirectCount, + NewFissionCount: channelStatInfo.NewFissionCount, + NewAndroidCount: channelStatInfo.NewAndroidCount, + NewIosCount: channelStatInfo.NewIosCount, + NewH5Count: channelStatInfo.NewH5Count, + NewH5FormalCount: channelStatInfo.NewH5FormalCount, + NewLightGuestCount: channelStatInfo.NewLightGuestCount, + NewLightFormalCount: channelStatInfo.NewLightFormalCount, + // recharge + RechargeAmount: channelStatInfo.TotalAmount, + DirectAmount: channelStatInfo.DirectAmount, + FissionAmount: channelStatInfo.FissionAmount, + AndroidRechargeAmount: channelStatInfo.AndroidAmount, + IosRechargeAmount: channelStatInfo.IosAmount, + LightRechargeAmount: channelStatInfo.LightAmount, + H5RechargeAmount: channelStatInfo.H5Amount, + // other + VipPayCoin: channelStatInfo.VipPayCoin, + VipPayMoney: channelStatInfo.VipPayMoney, + VipPayDeduction: channelStatInfo.VipPayDeduction, + } + + for _, yesterdayStatInfo := range statYesterdayList { + // 获取昨天数据 + if yesterdayStatInfo.Channel == channelStatInfo.Channel && yesterdayStatInfo.AppId == channelStatInfo.AppId { + newYesterday := yesterdayStatInfo.NewCount + newToday := channelStatInfo.NewTotalCount + channelStatInfoYesterday.NewIncreaseCount = newToday - newYesterday + if newYesterday != 0 { + channelStatInfoYesterday.NewIncreaseRate = fmt.Sprintf("%.2f", float64(newToday-newYesterday)*100/float64(newYesterday)) + "%" + } + rechargeYesterday := yesterdayStatInfo.RechargeAmount + rechargeToday := channelStatInfo.TotalAmount + channelStatInfoYesterday.RechargeIncreaseAmount = rechargeToday - rechargeYesterday + if rechargeYesterday != 0 { + channelStatInfoYesterday.RechargeIncreaseRate = fmt.Sprintf("%.2f", float64(rechargeToday-rechargeYesterday)*100/float64(rechargeYesterday)) + "%" + } + } + } + + err := channelmod.InsertOneChannelStatYestoday(ctx, channelStatInfoYesterday) + if err != nil { + log.Error("ChannelSettlementMethod InsertOneChannelStatYestoday", log.E(err)) + return err + } + } + + return nil +} diff --git a/skd/job/statminute/stat.go b/skd/job/statminute/stat.go new file mode 100644 index 0000000..2da8e45 --- /dev/null +++ b/skd/job/statminute/stat.go @@ -0,0 +1,95 @@ +package statminute + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/statutils" + "stat/common/utils" + "stat/models/appInfoMod" + statrecordmod "stat/models/statrecord" + "time" +) + +/* +* 主要统计任务: +* 按5分钟一个点,记录实时数据 app(新增、访问数....)。(曲线图) + */ + +// RunStat 任务1:统计每天日活 +func RunStat(defaultStatDate time.Time) error { + log.Info("channel deduction ......") + ctx := context.Background() + recordMap := defaultTimeMap(defaultStatDate) + + // 1.获取统计项上次统计的时候(每天执行) + recoredResult, err := statrecordmod.LastRecordTimeMap(ctx, statrecordmod.ChannelDeduction) //第一次从默认记录时间开始统计 + if err != nil { + log.Error("channel deduction ", log.E(err)) + return err + } + for _, record := range recoredResult { + recordMap[record.Item] = record.RecordTime + } + + now := time.Now().Add(time.Minute * -5) // 延迟2分钟,数据同步完成 + statFrq := 15 * time.Minute // 统计频率 + curStatTime := utils.RecentMinute(now, 15) // 按15分钟对齐 + + appIds, err := appInfoMod.GetAppIds(ctx) + if err != nil { + log.Error("channel deduction GetAppIds failed!", log.E(err)) + return err + } + + for item, lastStatAt := range recordMap { + _lastStatAt := lastStatAt + + for curStatTime.After(_lastStatAt) { + end := _lastStatAt.Add(statFrq) + // 超过本次统计结束时间,则结束 + if end.After(curStatTime) { + end = curStatTime + } + // 根据时间段统计数据 + fmt.Println("channel deduction ", _lastStatAt, end) + err := runStatMethod(ctx, item, _lastStatAt, end, appIds) + if err != nil { + log.Error("channel deduction runStatMethod failed!", log.E(err), log.Any("item", item)) + return err + } + + _lastStatAt = end + } + recordMap[item] = _lastStatAt + } + log.Info("channel deduction ") + return err +} + +// runStatMethod 调用统计项方法 +func runStatMethod(ctx context.Context, item string, start, end time.Time, appIds []int32) (err error) { + // 1.获取统计方法 + statMethod, ok := statMethodMap[item] + if !ok { + return nil + } + + // 调用统计方法,获取数据 + err = statutils.ServerMon.RunWithName(func() error { + return statMethod(ctx, start, end, appIds) + }, statutils.GetFuncName(statMethod)) + + if err != nil { + log.Error("channel deduction statMethod failed!", log.Any("statItem", item), log.E(err)) + return err + } + + // 3.更新记录 + if err := statrecordmod.UpsertItemRecord(ctx, statrecordmod.ChannelDeduction, item, end); err != nil { + log.Error("channel deduction commit UpsertItemRecord failed!", log.E(err)) + return err + } + + return nil +} diff --git a/skd/skd.go b/skd/skd.go new file mode 100644 index 0000000..561a1d8 --- /dev/null +++ b/skd/skd.go @@ -0,0 +1,158 @@ +package skd + +import ( + "context" + "math/rand" + "stat/common/enum/consts" + "stat/common/log" + "stat/common/statutils" + "stat/skd/job/advertisejob" + applicationjob "stat/skd/job/application" + "stat/skd/job/blocstatdaily" + "stat/skd/job/blocstatdistrict" + "stat/skd/job/limitstat" + "stat/skd/job/statdaily" + "stat/skd/job/statdailyhour" + "stat/skd/job/statdistrict" + "stat/skd/job/stathour" + "stat/skd/job/statlandpage" + "stat/statg" + "time" + + "github.com/robfig/cron/v3" +) + +var ( + skdCron *cron.Cron +) + +func init() { + skdCron = cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(&log.Logger{}))) // 秒级定时任务 +} + +// Start 定时器任务启动 +func Start() { + log.Info("skd start...") + + rand.Seed(time.Now().UnixNano()) + + if statg.Conf.RunMod != consts.RunModRelease { + return + } + + // 获取默认统计开始日期 + defaultStatDate, err := getDefaultStatDate() + if err != nil { + log.Error("defaultStatDate invalid", log.E(err)) + return + } + + if statg.Conf.RunMod == consts.RunModRelease { + // IP限制统计 + _, _ = skdCron.AddFunc("0 5 */1 * * ?", func() { + statutils.ServerMon.Run(limitstat.IpAddressLimitStat) + }) + // 广告点击统计 + _, _ = skdCron.AddFunc("0 5 */1 * * ?", func() { + statutils.ServerMon.Run(advertisejob.StatAdvertiseHourStat) + }) + // 落地页小时统计 + _, _ = skdCron.AddFunc("0 28 */1 * * ?", func() { + defaultTime, _ := time.Parse(time.RFC3339, "2023-08-01T00:00:00+08:00") + statutils.ServerMon.Run1(statlandpage.RunStatHour, defaultTime) + }) + // 落地页每日统计 + _, _ = skdCron.AddFunc("0 40 0 * * ?", func() { + defaultTime, _ := time.Parse(time.RFC3339, "2023-08-01T00:00:00+08:00") + statutils.ServerMon.Run1(statlandpage.RunStatDaily, defaultTime) + }) + // 日活统计,统计上一天日活,校正 + _, _ = skdCron.AddFunc("0 35 0 * * ?", func() { + statutils.ServerMon.Run1(statdaily.RunStat, defaultStatDate) + + if statg.Conf.ServerIndex.IsMadou() { + statutils.ServerMon.Run1(blocstatdaily.RunStat, defaultStatDate) + statutils.ServerMon.Run1(blocstatdistrict.RunStat, defaultStatDate) + } + }) + + // 日活统计,统计上一天日活,校正 + if statg.Conf.ServerIndex.IsMadou() { + _, _ = skdCron.AddFunc("0 35 2 * * ?", func() { + statutils.ServerMon.Run1(statdistrict.RunStat, defaultStatDate) + }) + } + + // 日常统计数据、每小时数据 + _, _ = skdCron.AddFunc("0 0/5 * * * ?", func() { + statutils.ServerMon.Run(statdaily.RunStatToday) + statutils.ServerMon.Run1(statdailyhour.RunStat, defaultStatDate) + }) + + // 统计首页曲线图 + _, _ = skdCron.AddFunc("0 0/5 * * * ?", func() { + statutils.ServerMon.Run1(stathour.RunStat, defaultStatDate) + }) + + if statg.Conf.ServerIndex.IsMadou() { + // 渠道结算 + // _, _ = skdCron.AddFunc("0 0/5 * * * ?", func() { + // statutils.ServerMon.Run1(statminute.RunStat, defaultStatDate) + // }) + } + } + + // 应用点击统计 + id, err := skdCron.AddFunc("0 5 */1 * * ?", func() { + statutils.ServerMon.Run(applicationjob.StatAppHourClick) + }) + + // 不在发送数据 + // if statg.Conf.ServerIndex == statg.ServerIndexBili { + // // 充值 + // _, _ = skdCron.AddFunc("0 40 0 * * ?", func() { + // // statutils.ServerMon.Run(applicationjob.RechargeDayXlsl) + // }) + // // 充值 + // _, _ = skdCron.AddFunc("0 50 0 * * ?", func() { + // // statutils.ServerMon.Run(applicationjob.RechargeMonthXlsl) + // }) + // } + + // 过期广告 + _, _ = skdCron.AddFunc("0 0 10 * * ?", func() { + statutils.ServerMon.Run(advertisejob.AdvertiseExpireSend) + }) + + // 过期应用检测告警 + _, _ = skdCron.AddFunc("0 1 10 * * ?", func() { + statutils.ServerMon.Run(advertisejob.ApplicationExpireSend) + }) + + // 广告配置 + skdCron.AddFunc("0 0/5 * * * ?", func() { + statutils.ServerMon.Run(advertisejob.LoadTgbotsend) + }) + + if err != nil { + log.Error("defaultStatDate invalid", log.E(err), log.Any("id", id)) + return + } + skdCron.Start() +} + +// Stop 定时器任务停止 +func Stop() { + ctx := skdCron.Stop() + <-ctx.Done() + err := ctx.Err() + if err != nil && err != context.Canceled { + log.Error("skd job stop error", log.E(err)) + return + } + log.Info("skd jobs end!", log.Any("end at", time.Now())) +} + +func getDefaultStatDate() (time.Time, error) { + return time.ParseInLocation("2006-01-02", "2021-03-01", time.Local) +} diff --git a/skd/skd_test.go b/skd/skd_test.go new file mode 100644 index 0000000..c703f13 --- /dev/null +++ b/skd/skd_test.go @@ -0,0 +1,249 @@ +package skd + +import ( + "context" + "fmt" + "github.com/360EntSecGroup-Skylar/excelize" + "go.mongodb.org/mongo-driver/bson" + "os" + "stat/api/proto" + "stat/common/log" + "stat/common/utils" + "stat/models/appInfoMod" + "stat/models/dailystatmod" + "stat/service/botser" + "stat/service/innerserverser" + "stat/skd/job/advertisejob" + "stat/statg" + "stat/tool/pubtest" + "testing" + "time" +) + +func TestTime1(t *testing.T) { + loc, _ := time.LoadLocation("Asia/Shanghai") + tc, _ := time.ParseInLocation(time.DateTime, "2024-07-22 00:00:00", loc) + t1 := tc.UTC() + t.Log(t1.String()) +} + +func TestStart(t *testing.T) { + + s, _ := time.Parse(time.RFC3339, "2023-06-08T00:00:00+08:00") + t.Log("ORI", s) + t.Log("UTC:", s.UTC()) + //time.Local, _ = time.LoadLocation("Asia/Shanghai") + localCST, _ := time.LoadLocation("Asia/Shanghai") + t.Log(s.In(localCST)) + t.Log(s.In(time.Local)) + + t.Log(fmt.Sprintf("统计时间:[%s]\n", s.Format("2006-01-02T15:04:05"))) + s = time.Now() + t.Log(fmt.Sprintf("统计时间:[%s]\n", s.Format("2006-01-02T15:04:05"))) + s = utils.RecentMinute(s, 60) + t.Log(fmt.Sprintf("统计时间:[%s]\n", s.Format("2006-01-02T15:04:05"))) +} + +func TestTg(t *testing.T) { + pubtest.TestInit("/Users/mac/Desktop/madou/stat_center") + // 机器人初始化 + statg.InitBot() + // 启动机器人 + botser.StartBot() + advertisejob.AdvertiseExpireSend() +} + +func DocExsit(path string) bool { + _, err := os.Stat(path) + if err != nil { + if os.IsExist(err) { + return true + } + + return false + } + + return true +} + +func TestExel(t *testing.T) { + filePath := "/usr/local" + "/bakexel/" + if !DocExsit(filePath) { + err := os.Mkdir(filePath, os.ModePerm) + if err != nil { + fmt.Println(err) + } + } + + pubtest.TestInit("/Users/mac/Desktop/madou/stat_center") + + ctx := context.Background() + + f := excelize.NewFile() + sheetName := "Sheet1" + // 设置列宽 + f.SetColWidth("Sheet1", "A", "L", 23) + + // 设置表头行高 + f.SetRowHeight("Sheet1", 1, 25) + // 设置表头样式 + headStyleID, _ := f.NewStyle(`{ + "font":{ + "color":"#333333", + "bold":true, + "size":16, + "family":"arial" + }, + "alignment":{ + "vertical":"center", + "horizontal":"center", + "wrap_text":true + } + }`) + f.SetCellStyle("Sheet1", "A1", "L1", headStyleID) + idx := f.NewSheet(sheetName) + var exportTransWaterTitle = map[string]string{ + "A1": "产品", + "B1": "归属", + "C1": "日期", + "D1": "日活跃", + "E1": "日注册", + "F1": "视频日充值", + "G1": "棋牌日充值", + "H1": "交易笔数", + } + + for k, v := range exportTransWaterTitle { + f.SetCellValue(sheetName, k, v) + } + + appinfo, serr := appInfoMod.GetAllAppIdMap(ctx, bson.M{}) + if serr != nil { + log.Error("rechargebot appInfoMod.GetAllAppInfo", log.Any("serr", serr)) + return + } + list := make([]*dailystatmod.DailyStatMod, 0) + yesterday := utils.BeginOfYesterday() + + //day := utils.BeginOfToday() + for _, info := range appinfo { + data, serr := dailystatmod.FindOneDailyStat(ctx, info.AppId, yesterday) + if serr != nil { + log.Error("rechargebot dailystatmod.GetDailyStatTotalList", log.Any("serr", serr)) + } + /*if len(rechargelist) != 1 { + log.Error("rechargebot dailystatmod.GetDailyStatTotalList", + log.Any("len(rechargelist)", len(rechargelist)), log.Any("appid", info.AppId), + log.Any("yesterday", yesterday), log.Any("day", day)) + continue + } + */ + list = append(list, &data) + } + + for k, v := range list { + i := 'A' // i 不能超过Z,即列输不能超过26列,超出将出现bug + name := "" + if info, ok := appinfo[v.AppId]; ok { + name = info.Name + } + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), name) //名称 + i++ + if v.AppId == 888 { + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), "集团") //归属 + } else { + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), "app") //归属 + } + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", + string(i), k+2), yesterday.Format("2006-02-01")) //时间 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.TotalVisitCount) //日活跃 + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.NewTotalCount) //日注册 + i++ + totalamount := fmt.Sprintf("%.2f", float64(v.TotalAmount)*0.0001) + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", + string(i), k+2), totalamount) //视频日充值 + i++ + if v.AppId == 888 { + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", + string(i), k+2), v.GameRechageAmount) //棋牌日充值 + } + i++ + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", + string(i), k+2), v.SuccessRechargeOrder) //交易笔数 + } + f.SetActiveSheet(idx) + fileName := filePath + utils.BeginOfToday().Format("2006-01-02") + "充值" + ".xlsx" + if err := f.SaveAs(fileName); err != nil { + log.Error("redeemCodeExport:export save file to disk failed", + log.Any("fileName", fileName), + log.E(err)) + } + //statg.Bot.SendAdvsSendMessage() +} + +func TestExel0(t *testing.T) { + pubtest.TestInit("/Users/mac/Desktop/madou/stat_center") + list := make([]*proto.InnerDailyRecharge, 0) + for id, info := range statg.Conf.InnerServers { + if id == statg.ServerIndexBili { + continue + } + + if id != statg.ServerIndexBili && info == "" { + log.Error("statg.Conf.InnerServers server not found", + log.Any("statg.Conf.InnerServers", id)) + continue + } + req := &proto.InnerRechargeReq{ + InnerId: int32(id), + } + res := &proto.InnerDailyRechargeResp{} + err := innerserverser.InnerRequest(info+"/api/stat/inner/recharge/list", req, res) + if err != nil { + log.Error("InnerServerDailyStat InnerRequest", + log.Any("InnerRequest", err)) + continue + } + if res == nil { + log.Error("InnerServerDailyStat InnerRequest data not found") + continue + } + if res.Data.List != nil && len(res.Data.List) > 0 { + list = append(list, res.Data.List...) + } + } + log.Info("list", log.Any("list", list)) +} + +func TestExel1(t *testing.T) { + pubtest.TestInit("/Users/mac/Desktop/madou/stat_center") + // 机器人初始化 + statg.InitBot() + // 启动机器人 + botser.StartBot() + err := innerserverser.InnerServerDailyStat(context.Background()) + fmt.Println(err) +} + +func TestExelmonth(t *testing.T) { + pubtest.TestInit("/Users/mac/Desktop/madou/stat_center") + // 机器人初始化 + statg.InitBot() + // 启动机器人 + botser.StartBot() + list := make([]*proto.InnerDailyRecharge, 0) + ctx := context.Background() + err := innerserverser.InnerServerDailyStat(context.Background()) + err = innerserverser.InnerServerMonthStat(ctx, nil, nil) + if err != nil { + log.Error("err", log.Any("err", err)) + } + log.Info("list", log.Any("list", list)) + time.Sleep(10 * time.Second) +} + +func TestExelbotmonth(t *testing.T) { +} diff --git a/statg/bot.go b/statg/bot.go new file mode 100644 index 0000000..206fa20 --- /dev/null +++ b/statg/bot.go @@ -0,0 +1,84 @@ +package statg + +import ( + "stat/common/tgbot" + "stat/common/utils" +) + +var ( + Bot *tgbot.TgBot + RchssendBot *tgbot.TgBot +) + +type BotTokens struct { + Madou string `json:"madou"` + Zhihu string `json:"zhihu"` + Bili string `json:"bili"` + Xcb string `json:"xcb"` + Dev string `json:"dev"` + Rchssend string `json:"rchssend"` +} + +type BotChats struct { + Broadcast []int64 `json:"broadcast"` // 广播群 + Command []int64 `json:"command"` // 命令群 + Monitor []int64 `json:"monitor"` // 监控群 + Download []int64 `json:"download"` // 下载监控 + Domain []int64 `json:"domain"` // 域名监控群 + Develop []int64 `json:"develop"` // 开发调试群 + Private []int64 `json:"private"` // 私聊用户列表 + BlocStat []int64 `json:"blocStat"` // 集团统计群 + Advertise []int64 `json:"advertise"` // 广告监控群 + ChannelApk []int64 `json:"channelApk"` // 渠道包生成群 + Project []int64 `json:"project"` // 来自项目的消息 + AdvsSend []int64 `json:"advssend"` //广告群 + Rchssend []int64 `json:"rchssend"` //广告群 +} + +type BotConfig struct { + Tokens BotTokens `json:"tokens"` + Chats BotChats `json:"chats"` + Allow map[int64][]string `json:"allow"` // 原本不允许使用命令的群,额外允许使用指定命令 +} + +// 数据库初始化好以后调用 +func InitBot() { + + defer func() { + utils.RecoverError(nil) + }() + + chats := &tgbot.TgChats{ + BroadcastChats: Conf.BotConfig.Chats.Broadcast, + CommandChats: Conf.BotConfig.Chats.Command, + MonitorChats: Conf.BotConfig.Chats.Monitor, + DownloadChats: Conf.BotConfig.Chats.Download, + DomainChats: Conf.BotConfig.Chats.Domain, + DevelopChats: Conf.BotConfig.Chats.Develop, + PrivateUsers: Conf.BotConfig.Chats.Private, + BlocStats: Conf.BotConfig.Chats.BlocStat, + Advertise: Conf.BotConfig.Chats.Advertise, + ChannelApk: Conf.BotConfig.Chats.ChannelApk, + Project: Conf.BotConfig.Chats.Project, + AdvsSend: Conf.BotConfig.Chats.AdvsSend, + //Rchssend: Conf.BotConfig.Chats.Rchssend, + } + + chat0s := &tgbot.TgChats{ + Rchssend: Conf.BotConfig.Chats.Rchssend, + } + + if Conf.ServerIndex.IsBili() { + Bot, _ = tgbot.NewTgBot(Conf.BotConfig.Tokens.Bili, chats, Conf.BotConfig.Allow) + RchssendBot, _ = tgbot.NewTgBot(Conf.BotConfig.Tokens.Rchssend, chat0s, Conf.BotConfig.Allow) + } else if Conf.ServerIndex.IsMadou() { + Bot, _ = tgbot.NewTgBot(Conf.BotConfig.Tokens.Madou, chats, Conf.BotConfig.Allow) + } else if Conf.ServerIndex.IsZhihu() { + Bot, _ = tgbot.NewTgBot(Conf.BotConfig.Tokens.Zhihu, chats, Conf.BotConfig.Allow) + } else if Conf.ServerIndex.IsXcb() { + Bot, _ = tgbot.NewTgBot(Conf.BotConfig.Tokens.Xcb, chats, Conf.BotConfig.Allow) + } else { + Bot, _ = tgbot.NewTgBot(Conf.BotConfig.Tokens.Dev, chats, Conf.BotConfig.Allow) + } + +} diff --git a/statg/config.go b/statg/config.go new file mode 100644 index 0000000..9be11f7 --- /dev/null +++ b/statg/config.go @@ -0,0 +1,97 @@ +package statg + +import ( + "stat/common/config" + "stat/common/enum/consts" + "stat/common/httputil" + "stat/common/log" + + "github.com/dchest/captcha" +) + +var ( + Conf GlobalConfig + ProxyCfg *httputil.ProxyCfg + VerifyIMGStore captcha.Store + Tgbotsend string +) + +type ChartsConfig struct { + Width int `json:"width"` + Height int `json:"height"` +} + +type GlobalConfig struct { + ServerIndex ServerIndex `json:"serverIndex"` //1:麻豆,2:逼哩,3:知乎 + RunMod consts.RunMod `json:"runMod"` + Pprof bool `json:"pprof"` + JwtKey string `json:"jwtKey"` + InnerKey string `json:"innerKey"` + InnerServers map[ServerIndex]string `json:"innerServers"` + Kafka struct { + Url string `json:"url"` + Group string `json:"group"` + } `json:"kafka"` + Mongo struct { + Url string `json:"url"` + } `json:"mongo"` + Redis struct { + Url string `json:"url"` + } `json:"redis"` + Limit struct { + Ip struct { + Capacity int64 `json:"capacity"` + Rate int64 `json:"rate"` + } `json:"ip"` + } `json:"limit"` + URL struct { + PackageUrl string `json:"packageUrl"` + BiliPackageUrl string `json:"biliPackageUrl"` + HuanqiuPackageUrl string `json:"huanqiuPackageUrl"` + ManhuaPackageUrl string `json:"manhuaPackageUrl"` + } `json:"url"` + ProxyUrl struct { + File string `json:"file"` + FileRes string `json:"fileRes"` + } `json:"proxyUrl"` + KafkaServer bool `json:"kafkaServer"` + Host string `json:"host"` + Port int `json:"port"` + IsVersion bool `json:"versionServer"` + ImgUploadUrl string `json:"imgUploadUrl"` + LandPageCDN string `json:"landPageCDN"` + BotConfig BotConfig `json:"botConfig"` + TgbotSend string `json:"tgbotSend"` + ApkGenEnable bool `json:"apkGenEnable"` + ChartsConfig ChartsConfig `json:"chartsConfig"` + AppConfig Endpoints `json:"appConfig"` +} + +func LoadConfig(path string) error { + err := config.LoadJSON(path, &Conf) + if err != nil { + log.Fatal("加载本地配置失败", log.E(err)) + return err + } + // set default value + if Conf.Limit.Ip.Capacity <= 0 { + Conf.Limit.Ip.Capacity = 300 + } + if Conf.Limit.Ip.Rate <= 0 { + Conf.Limit.Ip.Rate = 5 + } + if Conf.ChartsConfig.Width <= 0 { + Conf.ChartsConfig.Width = 1600 + } + if Conf.ChartsConfig.Height <= 0 { + Conf.ChartsConfig.Height = 400 + } + Tgbotsend = Conf.TgbotSend + // app config + GlobalEndpoints = Conf.AppConfig + for _, item := range GlobalEndpoints { + GlobalIndexEndpoints[item.OwnerIndex] = append(GlobalIndexEndpoints[item.OwnerIndex], item) + GlobalAppIdEndpoints[item.AppId] = item + } + return nil +} diff --git a/statg/define.go b/statg/define.go new file mode 100644 index 0000000..77a1534 --- /dev/null +++ b/statg/define.go @@ -0,0 +1,42 @@ +package statg + +type ServerIndex int32 + +const ( + ServerIndexNone ServerIndex = 0 + ServerIndexMadou ServerIndex = 1 + ServerIndexBili ServerIndex = 2 + ServerIndexZhihu ServerIndex = 3 + ServerIndexXcb ServerIndex = 4 +) + +func (s ServerIndex) IsMadou() bool { + return s == ServerIndexMadou +} + +func (s ServerIndex) IsBili() bool { + return s == ServerIndexBili +} + +func (s ServerIndex) IsZhihu() bool { + return s == ServerIndexZhihu +} + +func (s ServerIndex) IsXcb() bool { + return s == ServerIndexXcb +} + +func (s ServerIndex) Name() string { + switch s { + case ServerIndexMadou: + return "麻豆" + case ServerIndexBili: + return "逼哩" + case ServerIndexZhihu: + return "知乎" + case ServerIndexXcb: + return "咻车" + default: + return "未知" + } +} diff --git a/statg/endpoint.go b/statg/endpoint.go new file mode 100644 index 0000000..7a6a89d --- /dev/null +++ b/statg/endpoint.go @@ -0,0 +1,82 @@ +package statg + +type Endpoint struct { + AppId int32 `json:"appId"` // APPID + NameFull string `json:"nameFull"` // APP全名 + NameShort string `json:"nameShort"` // APP短名 + NameEn string `json:"nameEn"` // 名字英文缩写 + ServerUrl string `json:"serverUrl"` // APP服务器地址 + H5Origin string `json:"h5Origin"` // H5原地址 + H5Target string `json:"h5Target"` // H5目标地址 + H5Config string `json:"h5Config"` // H5配置文件 + BotStat bool `json:"hourStat"` // 参与机器人统计 + BotRank bool `json:"hourReport"` // 参与机器人排名 + OwnerIndex ServerIndex `json:"ownerIndex"` // 所属服务器编号 +} + +type Endpoints []*Endpoint +type IndexEndpoints map[ServerIndex]Endpoints +type AppIdEndpoints map[int32]*Endpoint + +func (s Endpoints) GetIndexEndpoints(index ServerIndex) Endpoints { + ret := make(Endpoints, 0) + for _, endpoint := range s { + if endpoint.OwnerIndex == index { + ret = append(ret, endpoint) + } + } + return ret +} + +func (s Endpoints) GetBotStatEndpoints() Endpoints { + ret := make(Endpoints, 0) + for _, endpoint := range s { + if endpoint.BotStat { + ret = append(ret, endpoint) + } + } + return ret +} + +func (s Endpoints) GetBotRankEndpoints() Endpoints { + ret := make(Endpoints, 0) + for _, endpoint := range s { + if endpoint.BotRank { + ret = append(ret, endpoint) + } + } + return ret +} + +func (s Endpoints) ExistsByAppId(appId int32) bool { + for _, endpoint := range s { + if endpoint.AppId == appId { + return true + } + } + return false +} + +func (s Endpoints) GetEndpointByAppId(appId int32) *Endpoint { + for _, endpoint := range s { + if endpoint.AppId == appId { + return endpoint + } + } + return nil +} + +func (s Endpoints) GetAppShortNameById(appId int32) string { + for _, endpoint := range s { + if endpoint.AppId == appId { + return endpoint.NameShort + } + } + return "" +} + +var ( + GlobalEndpoints = make(Endpoints, 0) + GlobalIndexEndpoints = make(IndexEndpoints) + GlobalAppIdEndpoints = make(AppIdEndpoints) +) diff --git a/tool/dspSync/main.go b/tool/dspSync/main.go new file mode 100644 index 0000000..1a93738 --- /dev/null +++ b/tool/dspSync/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "stat/common/log" + "stat/tool/dspSync/model" + "stat/tool/dspSync/service" + "time" +) + +func initMongoDB() error { + + if err := model.InitMongoDB(); err != nil { + log.Error("InitMongoDB err", log.E(err)) + return err + } + + return nil +} + +func main() { + initMongoDB() + time.Local, _ = time.LoadLocation("Asia/Shanghai") + _ = service.UserStatInfo() //用户同步完成可执行 +} diff --git a/tool/dspSync/model/district.go b/tool/dspSync/model/district.go new file mode 100644 index 0000000..ed0fab9 --- /dev/null +++ b/tool/dspSync/model/district.go @@ -0,0 +1,98 @@ +package model + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +// DistrictInfo 渠道原始信息 +type DistrictInfo struct { + Code string `bson:"code"` //商区码 + Name string `bson:"name"` //账号 + Mobile string `bson:"mobile"` //手机号 + Parent string `bson:"parent"` //parent + Password string `bson:"password"` //密码 + DiscType int `bson:"discType"` //商区类型/结算类型 + DividendRatio float64 `bson:"dividendRatio"` //分红比例 参与结算 + DisSettlement bool `bson:"disSettlement"` //禁止结算 + UserUnitCent float64 `bson:"userUnitCent"` //用户单价 单位:分 + NUDeductionRatio float64 `bson:"nuDeductionRatio"` //新增用户扣量比例 + NUDedLowerOutset int64 `bson:"nuDedLowerOutset"` //新增用户扣量起点 + NUDedAt time.Time `bson:"nuDedAt"` //新增用户扣量时间 + RechgDeductionRatio float64 `bson:"rechgDeductionRatio"` //充值扣量比例 + RechgDedLowerOutset int64 `bson:"rechgDedLowerOutset"` //充值扣量起点 + RechgDedAt time.Time `bson:"rechgDedAt"` //充值扣量时间 + ChildMax int `bson:"childMax"` //最大孩子数 + Disable bool `bson:"disable"` //禁用 + Lock bool `bson:"lock"` //禁止登陆 + DisTrans bool `bson:"disTrans"` //禁止交易 + DisAd bool `bson:"disAd"` //禁止广告 + DisMulDivi bool `bson:"disMulDivi"` //禁止多级分成(目前针对CPS) + PayPassword string `bson:"payPassword"` //支付密码 + BalanceCent float64 `bson:"balance"` //余额 单位:分 + Remark string `bson:"remark"` //备注 + CreatedAt time.Time `bson:"createdAt"` //文档创建时间 + UpdatedAt time.Time `bson:"updatedAt"` //文档更新时间 +} + +// DspDistrictCodeInfo 渠道码信息 +type DspDistrictCodeInfo struct { + DiscCode string `bson:"discCode"` //商圈码 + PromSeq string `bson:"promSeq"` //推广序列 + Remark string `bson:"remark"` //备注 + CreatedAt time.Time `bson:"createdAt"` + DeletedAt time.Time `bson:"deletedAt,omitempty"` //删除时间 +} + +type BillLog struct { + SumDate time.Time `bson:"sumDate"` //日期 + DiscType string `bson:"discType"` //商区类型 + DistrictCode string `bson:"districtCode"` //商圈码 + Name string `bson:"name"` //账号 + Cent float64 `bson:"cent"` //人民币分 + Desc string `bson:"desc"` //记录描述 + CreatedAt time.Time `bson:"createdAt"` //创建时间 +} + +const CollDistrict = "district" +const CollDistrictCode = "prom_seqe" + +var dbDistrict *mongos.MongoTool +var dbDistrictcode *mongos.MongoTool +var dbDistrictLog *mongos.MongoTool + +func DistrictInit() { + dbDistrict = mongos.New(ManagerDsp, CollDistrict) + dbDistrictcode = mongos.New(ManagerDsp, CollDistrictCode) +} + +// FindDspDistrictInfo 查询所有渠道 +func FindDspDistrictInfo(ctx context.Context) ([]DistrictInfo, error) { + list := make([]DistrictInfo, 0) + query := bson.M{} + + if err := dbDistrict.Find(ctx, &list, query); err != nil { + log.Error(fmt.Sprintf("model %s FindDspDistrictInfo Find error", CollDistrict), log.E(err)) + return list, err + } + + return list, nil +} + +// FindDspDistrictCodeInfo 查询渠道的渠道码 +func FindDspDistrictCodeInfo(ctx context.Context, discCode string) ([]DspDistrictCodeInfo, error) { + list := make([]DspDistrictCodeInfo, 0) + query := bson.M{"discCode": discCode} + + if err := dbDistrictcode.Find(ctx, &list, query); err != nil { + log.Error(fmt.Sprintf("model %s FindDspDistrictInfo Find error", CollDistrict), log.E(err)) + return list, err + } + + return list, nil +} diff --git a/tool/dspSync/model/init.go b/tool/dspSync/model/init.go new file mode 100644 index 0000000..12401f5 --- /dev/null +++ b/tool/dspSync/model/init.go @@ -0,0 +1,39 @@ +package model + +import ( + "stat/common/log" + "stat/common/mongos" + "stat/models" +) + +var ( + ManagerDsp *mongos.Manager + ManagerStat *mongos.Manager +) + +// InitMongoDB 初始化同步数据库 +func InitMongoDB() error { + // DspDB := mongos.NewManager("mongodb://yinse:7P1pwdsMLds6QOB092Xq@172.104.42.200:47018/video?direct=game&maxPoolSize=200&connectTimeout=30&authSource=video") + // if err := DspDB.Connect(); err != nil { + // log.Error("mgoDB connect err", log.E(err)) + // return err + // } + // ManagerDsp = DspDB + + // // 初始化表链接 + // UserInit() + // RechargeInit() + // WithdrawInit() + + statDB := mongos.NewManager("mongodb://stat:ebCJuLfJQAGKVDecdFH0@172.104.42.200:47017,139.162.18.46:47017,139.162.35.214:47017/statcentre?maxPoolSize=200&connectTimeout=30&authSource=statcentre") + if err := statDB.Connect(); err != nil { + log.Error("mgoDB connect err", log.E(err)) + return err + } + mongos.MgoManager = statDB + + // 初始化数据库索引 + models.InitIndex() + + return nil +} diff --git a/tool/dspSync/model/recharge.go b/tool/dspSync/model/recharge.go new file mode 100644 index 0000000..5768a03 --- /dev/null +++ b/tool/dspSync/model/recharge.go @@ -0,0 +1,93 @@ +package model + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type DspRecharge struct { + ID primitive.ObjectID `json:"id" bson:"_id,omitempty"` //流水id + UID uint64 `json:"uid" bson:"uid"` //用户id + DevType string `json:"devType" bson:"devType"` //设备系统类型 ios pc android + Channel string `json:"channel" bson:"channel"` //渠道类型 鲨鱼 金鱼 + OID string `json:"oid" bson:"oid"` //支付平台订单号 + WithdrawType string `json:"WithdrawType" bson:"WithdrawType"` //充值类型 + Money int64 `json:"money" bson:"money"` //充值金额 订单金额 李秋山确认 + PayMoney int64 `json:"payMoney" bson:"payMoney"` //实际到账金额 用户实际支付金额 李秋山确认 + Status int `json:"status" bson:"status"` //1进行中 2付款失败 3付款成功 4已经退款 + SuccessAt time.Time `json:"successAt" bson:"successAt"` //回调成功时间 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //创建时间 + IsDirect bool `json:"isDirect" bson:"isDirect"` //true:是直推用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` //商区码 +} + +const CollRecharge = "recharge_order" + +var dbRecharge *mongos.MongoTool + +func RechargeInit() { + dbRecharge = mongos.New(ManagerDsp, CollRecharge) +} + +// FindDspRecharge 查询用户 +func FindDspRecharge(ctx context.Context, skip int64, limit int64) ([]DspRecharge, error) { + list := make([]DspRecharge, 0) + + beginTimeStr := "2020-07-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}} + + sort := bson.D{{Key: "successAt", Value: 1}} + opts := options.Find().SetSkip(skip).SetLimit(limit).SetSort(sort) + + if err := dbRecharge.Find(ctx, &list, query, opts); err != nil { + log.Error(fmt.Sprintf("model %s FindDspRecharge Find error", CollDistrict), log.E(err)) + return list, err + } + + return list, nil +} + +func FindDspRechargeCount(ctx context.Context) (count int64, err error) { + + beginTimeStr := "2020-07-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}} + + count, err = dbRecharge.Count(ctx, query) + if err != nil { + log.Error(fmt.Sprintf("model %s FindDspRecharge Find error", CollDistrict), log.E(err)) + return count, err + } + + return count, nil +} + +// FindDspDistrictRecharge +func FindDspDistrictRecharge(ctx context.Context, district string) ([]DspRecharge, error) { + list := make([]DspRecharge, 0) + + beginTimeStr := "2020-10-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}, "districtCode": district} + + if err := dbRecharge.Find(ctx, &list, query); err != nil { + log.Error(fmt.Sprintf("model %s FindDspDistrictRecharge Find error", CollDistrict), log.E(err)) + return list, err + } + + return list, nil +} + +// diff --git a/tool/dspSync/model/userinfo.go b/tool/dspSync/model/userinfo.go new file mode 100644 index 0000000..9d6e44e --- /dev/null +++ b/tool/dspSync/model/userinfo.go @@ -0,0 +1,69 @@ +package model + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type DspUser struct { + UID uint64 `json:"uid" bson:"uid"` //用户id + SysType string `json:"sysType" bson:"sysType"` //系统类型 + DevType string `json:"devType" bson:"devType"` //设备类型 + Mobile string `json:"mobile" bson:"mobile"` //手机号 + Name string `json:"name" bson:"name"` //名字 + DistrictCode string `json:"districtCode" bson:"districtCode"` //商区码 + PromCode string `json:"promotionCode" bson:"promotionCode"` //推广码 + IsDirect bool `json:"isDirect" bson:"isDirect"` //true:是直推用户 + CreatedAt time.Time `bson:"createdAt"` //文档创建时间 +} + +const CollUser = "user" + +var dbUser *mongos.MongoTool + +func UserInit() { + dbUser = mongos.New(ManagerDsp, CollUser) +} + +// FindDspUserInfo 查询用户 +func FindDspUserInfo(ctx context.Context, skip int64, limit int64) ([]DspUser, error) { + list := make([]DspUser, 0) + query := bson.M{} + sort := bson.D{{Key: "_id", Value: 1}} + opts := options.Find().SetSkip(skip).SetLimit(limit).SetSort(sort) + + if err := dbUser.Find(ctx, &list, query, opts); err != nil { + log.Error(fmt.Sprintf("model %s FindDspUserInfo Find error", CollDistrict), log.E(err)) + return list, err + } + + return list, nil +} + +func FindOneUserInfo(ctx context.Context, uid uint64) (user DspUser, err error) { + query := bson.M{"uid": uid} + + if err := dbUser.FindOne(ctx, &user, query); err != nil { + log.Error(fmt.Sprintf("model %s FindDspUserInfo Find error", CollDistrict), log.E(err)) + return user, err + } + + return user, nil +} + +func FindManyUserInfo(ctx context.Context, uid []uint64) (user []DspUser, err error) { + query := bson.M{"uid": bson.M{"$in": uid}} + + if err := dbUser.Find(ctx, &user, query); err != nil { + log.Error(fmt.Sprintf("model %s FindDspUserInfo Find error", CollDistrict), log.E(err)) + return user, err + } + + return user, nil +} diff --git a/tool/dspSync/model/withdraw.go b/tool/dspSync/model/withdraw.go new file mode 100644 index 0000000..01f57ff --- /dev/null +++ b/tool/dspSync/model/withdraw.go @@ -0,0 +1,71 @@ +package model + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/common/utils" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type DspWithdraw struct { + ID primitive.ObjectID `json:"id" bson:"_id,omitempty"` //流水id + AppId int32 `json:"appId" bson:"appId"` // appID + UID uint64 `json:"uid" bson:"uid"` //用户id + Name string `json:"name" bson:"name"` //用户名 + Amount int64 `json:"amount" bson:"amount"` //蝴蝶币数量 + OID string `json:"oid" bson:"oid"` //第三方支付平台id + Money int64 `json:"money" bson:"money" binding:"required"` //提现金额 + PayMoney int64 `json:"payMoney" bson:"payMoney"` //实际到账 + PayType string `json:"payType" bson:"payType" binding:"required"` //提现方式,alipay,bankcard + ActName string `json:"actName" bson:"actName"` //交易账户持有人 + Act string `json:"act" bson:"act"` //交易账户 + UserIP string `json:"userIp" bson:"userIp"` //用户ip + DeviceType string `json:"deviceType" bson:"deviceType"` //设备类型 + DevID string `json:"devID" bson:"devID"` //设备id + Status int `json:"status" bson:"status"` //1未审核 2审核通过,转账中 3已拒绝 4未知错误 5提现成功 6提现失败 + StatusDesc string `json:"statusDesc" bson:"statusDesc"` //状态说明 + CheckedAt time.Time `json:"checkedAt" bson:"checkedAt"` //审核时间 + ProgressAt time.Time `json:"progressAt" bson:"progressAt"` //第三方下单成功时间 + SuccessAt time.Time `json:"successAt" bson:"successAt"` //回调成功时间 + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` //刷新时间 + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //提现申请时间 + ReceivedAt time.Time `json:"receivedAt" bson:"receivedAt"` //到账时间 李秋山确认 三方出款时间 + BlocDeduction bool `json:"blocDeduction" bson:"blocDeduction"` //集团扣量(特定渠道扣量) + IsDirect bool `json:"isDirect" bson:"isDirect"` //true:是直推用户 + DistrictCode string `json:"districtCode" bson:"districtCode"` //渠道码 + PromCode string `json:"promCode,omitempty" bson:"promCode"` //用户推广序列 +} + +const CollWithdraw = "withdraw_order" + +var dbWithdraw *mongos.MongoTool + +func WithdrawInit() { + dbWithdraw = mongos.New(ManagerDsp, CollWithdraw) +} + +// FindDspWithdraw 查询用户 +func FindDspWithdraw(ctx context.Context, skip int64, limit int64) ([]DspWithdraw, error) { + list := make([]DspWithdraw, 0) + + beginTimeStr := "2020-07-01T00:00:00-08:00" + + beginTime := utils.StrTimeToTime(beginTimeStr) + query := bson.M{"successAt": bson.M{"$gt": beginTime}, "withdrawType": 1} + + sort := bson.D{{Key: "successAt", Value: 1}} + opts := options.Find().SetSkip(skip).SetLimit(limit).SetSort(sort) + + if err := dbWithdraw.Find(ctx, &list, query, opts); err != nil { + log.Error(fmt.Sprintf("model %s FindDspWithdraw Find error", CollDistrict), log.E(err)) + return list, err + } + + return list, nil +} diff --git a/tool/dspSync/service/service.go b/tool/dspSync/service/service.go new file mode 100644 index 0000000..168e7f3 --- /dev/null +++ b/tool/dspSync/service/service.go @@ -0,0 +1,74 @@ +package service + +import ( + "context" + "fmt" + "stat/models/advertiseMod" +) + +type InviteInfo struct { + Count int64 +} + +func UserStatInfo() error { + ctx := context.Background() + adsList, err := advertiseMod.FindAds(ctx) + if err != nil { + return err + } + //fmt.Println(len(adsList)) + for _, v := range adsList { + links := make([]advertiseMod.LinkInfo, 0) + links = append(links, advertiseMod.LinkInfo{ + Link: v.Link, + Weight: 100, + Foreign: false, + }) + doc := advertiseMod.UpdateAds{ + Links: &links, + } + + err = advertiseMod.UpdateAdvertise(ctx, v.Id, doc) + if err != nil { + fmt.Println(err) + } + + } + + return nil +} + +// func UserStatInfo() error { +// ctx := context.Background() +// userList, err := registermod.TimeUsersStatInfoByTime(ctx, 1) +// if err != nil { +// return err +// } +// fmt.Println(len(userList)) +// userIds := make([]uint64, 0) +// for _, v := range userList { +// if v.AppId == 1 { +// userIds = append(userIds, v.UserId) +// } +// } +// dspuserList, _ := model.FindManyUserInfo(ctx, userIds) + +// writeModels := make([]mongo.WriteModel, 0) +// for _, v := range dspuserList { +// model := mongo.NewUpdateOneModel() +// filter := bson.M{"userId": v.UID, "appId": 1} +// update := bson.M{"$set": bson.M{"promCode": v.PromCode}} +// model.SetFilter(filter).SetUpdate(update) + +// writeModels = append(writeModels, model) +// fmt.Println(filter, update) +// } +// fmt.Println("update.............") +// err = registermod.UpdateRegisterInfo(ctx, writeModels) +// if err != nil { +// log.Error("SyncUserInfo UpdateRegisterInfo", log.E(err)) +// return err +// } + +// return nil +// } diff --git a/tool/gen_bson_tag/error.txt b/tool/gen_bson_tag/error.txt new file mode 100644 index 0000000..e69de29 diff --git a/tool/gen_bson_tag/gen_bson_tag.go b/tool/gen_bson_tag/gen_bson_tag.go new file mode 100644 index 0000000..c12ceeb --- /dev/null +++ b/tool/gen_bson_tag/gen_bson_tag.go @@ -0,0 +1,791 @@ +package main + +import ( + "bufio" + "bytes" + "encoding/base64" + "encoding/json" + "flag" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "regexp" + "sort" + "strings" + + "go.uber.org/zap/zapcore" + + "go.uber.org/zap" +) + +var sbr, ser, mbr, mer *regexp.Regexp +var out *bufio.Writer +var model string +var log *zap.SugaredLogger + +type table struct { + tableName string + // <字段名、bson名> + filedInfo map[string]interface{} +} + +var rootPath string +var dealPath string +var tmpPath string + +func init() { + zl, _ := zap.NewDevelopment(zap.IncreaseLevel(zapcore.WarnLevel)) + log = zl.Sugar() + + // rootPath = "/Volumes/work/prj" // 项目根目录 + currDir, _ := os.Getwd() // 获取当前目录 + rootPath = func() string { + v := LookupProjectRootByGomod() + if v != "" { + return v + } + // 获取上四级目录 + // rootPath = strCurrDir+"/../../../../" + return getParentDir(getParentDir(currDir)) + }() + dealPath = "/pub/models" // 处理目录 + tmpPath = "/temp" // 临时目录 +} + +func LookupProjectRootByGomod() string { + currDir, _ := os.Getwd() + var dir = currDir + for { + found, err := isProjectRoot(dir) + if err != nil { + return "" + } + if found { + break + } + dir = filepath.Dir(dir) + if dir == "/" { + return "" + } + } + return dir +} + +func isProjectRoot(dir string) (bool, error) { + modFileName := filepath.Join(dir, "go.mod") + _, err := os.Stat(modFileName) + if err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + + // 验证go.mod文件 + f, err := os.Open(modFileName) + if err != nil { + return false, err + } + data, err := ioutil.ReadAll(io.LimitReader(f, 20)) + if err != nil { + return false, err + } + + if bytes.Contains(data, []byte("module stat")) { + return true, nil + } + + return false, nil +} + +func getCurDir() string { + dir, err := filepath.Abs(filepath.Dir(os.Args[0])) + if err != nil { + // log.Fatal(err) + fmt.Sprint(err) + } + return strings.Replace(dir, "\\", "/", -1) +} + +func substr(s string, pos, length int) string { + runes := []rune(s) + l := pos + length + if l > len(runes) { + l = len(runes) + } + return string(runes[pos:l]) +} + +func getParentDir(dir string) string { + return substr(dir, 0, strings.LastIndex(dir, "/")) +} + +func shellCmd(cmdStr string) (string, error) { + cmd := exec.Command("/bin/bash", "-c", cmdStr) + var outb bytes.Buffer + var errb bytes.Buffer + cmd.Stdout = &outb + cmd.Stderr = &errb + ec := cmd.Run() + log.Infof("command: %s", cmdStr) + if outb.Len() > 0 { + log.Debug("stdout: %s", outb.String()) + } + if errb.Len() > 0 { + log.Errorf("stderr: %s", errb.String()) + } + + return outb.String(), ec +} + +func parseStruct(tbName string, br *bufio.Reader) map[string]interface{} { + subStructName := regexp.MustCompile("(\\w+)\\s+struct\\s{$") + // endFlag := regexp.MustCompile(`}`) + endFlag := regexp.MustCompile(`}`) + // <字段名、tag名> + filedInfo := make(map[string]interface{}) + + for { + line, _, ec := br.ReadLine() + if nil != ec { + return filedInfo + } + + if strings.HasPrefix(strings.TrimSpace(string(line)), "//") { + continue + } + + if "" == string(line) { + continue + } + + end := endFlag.FindStringSubmatch(string(line)) + if len(end) > 0 { + log.Info("end ...") + + return filedInfo + } + log.Infof(string(line)) + if subStruct := subStructName.FindStringSubmatch(string(line)); len(subStruct) > 0 { + subFiledInfo := parseStruct(subStruct[1], br) + filedInfo[subStruct[1]] = &table{ + tableName: subStruct[1], + filedInfo: subFiledInfo, + } + + continue + } + + flags := strings.Split(string(line), "bson") + + if len(flags) > 1 { + tag := regexp.MustCompile(":\"(\\w+)\"") + dst := tag.FindStringSubmatch(flags[1]) + dstName := "" + if len(dst) < 1 { + // 带有omit的 + tagomt := regexp.MustCompile(":\"(\\w+),omitempty\"") + dst = tagomt.FindStringSubmatch(flags[1]) + dstName = dst[1] + } else { + dstName = dst[1] + } + filedName := strings.Split(strings.TrimSpace(string(line)), " ") + + log.Info("aaaaa, ", filedName[0], " -> ", dstName) + + // structBuf += fmt.Sprintf("const T%s%s = \"%s\"\n", tbName, filedName[0], dstName) + filedInfo[filedName[0]] = dstName + + } else if strings.Contains(string(line), "\"inline\"") { + // 内联结构体 + continue + } else { + log.Error("parse bson is failed, code = ", string(line)) + os.Exit(1) + } + } +} + +func makeStr(tab table, parentTab string) (string, string) { + structsBuf := fmt.Sprintf("//%s\n", tab.tableName) + if "" != parentTab { + structsBuf += fmt.Sprintf("%s struct {\n", tab.tableName) + } else { + structsBuf += fmt.Sprintf("type Tag%s struct {\n", tab.tableName) + } + + initsBuf := fmt.Sprintf("\n") + + var sortedNames []string + for name, _ := range tab.filedInfo { + sortedNames = append(sortedNames, name) + } + sort.Strings(sortedNames) + + for _, filedName := range sortedNames { + field := tab.filedInfo[filedName] + switch field.(type) { + case string: + structsBuf += fmt.Sprintf("%s string\n", filedName) + if "" != parentTab { + initsBuf += fmt.Sprintf("Fn%s.%s.%s = \"%v\"\n", parentTab, tab.tableName, filedName, field) + } else { + initsBuf += fmt.Sprintf("Fn%s.%s = \"%v\"\n", tab.tableName, filedName, field) + } + case *table: + subTab := field.(*table) + var buf1, buf2 string + if "" != parentTab { + buf1, buf2 = makeStr(*subTab, parentTab+"."+tab.tableName) + } else { + buf1, buf2 = makeStr(*subTab, tab.tableName) + } + + structsBuf += buf1 + initsBuf += buf2 + } + } + structsBuf += fmt.Sprintf("}\n\n\n") + initsBuf += fmt.Sprintf("\n") + + return structsBuf, initsBuf +} + +func getAllModel(fileName string) []string { + cmd := fmt.Sprintf(`cat %s | grep "^type " | grep "struct {$" | awk '{print $2}' | tr "\n" " "`, fileName) + output, err := shellCmd(cmd) + if nil != err { + panic(err) + } + + models := strings.Split(output, " ") + return models[:len(models)-1] +} + +func parseOrm(fileName string) (resultFileBuf string) { + models := getAllModel(fileName) + log.Info(fileName, models) + // 构建临时文件 + + return "" + packageName, _ := shellCmd(fmt.Sprintf(`cat %s | grep ^package | awk '{print $2}'`, fileName)) + packageName = strings.TrimSpace(packageName) + if "" == packageName { + log.Errorf("can not parse package name, stop it") + os.Exit(1) + } + + var tables []table + + defer func() { + if len(tables) > 0 { + resultFileBuf = fmt.Sprintf("package %s\n", packageName) + structsBuf := "" + initsBuf := "func init() {" + + for _, v := range tables { + buf1, buf2 := makeStr(v, "") + structsBuf += buf1 + initsBuf += buf2 + } + initsBuf += fmt.Sprintf("\n}\n") + + resultFileBuf += structsBuf + resultFileBuf += fmt.Sprintf("\n\n\n\n\n") + + for _, v := range tables { + resultFileBuf += fmt.Sprintf("var Fn%s Tag%s\n", v.tableName, v.tableName) + } + + resultFileBuf += initsBuf + resultFileBuf += fmt.Sprintf("\n") + } + }() + + // structsBuf := "package " + packageName + "\n" + // fnsBuf := "func init() {\n" + // initBuf := "" + + tableName := regexp.MustCompile("^type\\s+(\\w+)\\s+struct\\s{$") + // endFlag := regexp.MustCompile(`}`) + file, _ := os.Open(fileName) + br := bufio.NewReader(file) + + // inStruct := false + // tbName := "" + for { + line, _, ec := br.ReadLine() + if nil != ec { + return + } + + names := tableName.FindStringSubmatch(string(line)) + if len(names) > 1 { + log.Info("begin -> ", names[1]) + // tbName = names[1] + // structBuf := ("//" + names[1] + "\n") + // structBuf += fmt.Sprintf("type Tag%s struct {\n", tbName) + + // inStruct = true + + filedInfo := parseStruct(names[1], br) + + tables = append(tables, table{ + tableName: names[1], + filedInfo: filedInfo, + }) + + continue + } + + } +} + +func writeGoFile(packageName string, packgePath string, tableMetas []TableMeta, dstFile string) { + // orms := `[]interface{}{orm.UserEx{}, orm.User{}}` + // shellCmd(fmt.Sprintf("rm -f %s/src/%s/tag.go", os.Getenv("GOPATH"), packgePath)) + // orms := `[]interface{}` + // for k, _ := range tableNames { + // tableNames[k] = "orm." + tableNames[k] + "{}" + // } + var tbOrms []string + var cmdParams []string + for _, meta := range tableMetas { + tbOrms = append(tbOrms, "orm."+meta.StructName+"{}") + cmdParams = append(cmdParams, fmt.Sprintf("%v--%v", meta.StructName, meta.DbName)) + } + // strCmdParam := strings.Join(cmdParams, "---") + strCmdParam := func() string { + data, _ := json.Marshal(tableMetas) + return base64.StdEncoding.EncodeToString([]byte(data)) + }() + + orms := "[]interface{}{" + strings.Join(tbOrms, ",") + "}" + + buf := []byte(`package main + + import ( + // orm "PACKAGE-PATH" + orm "stat/temp/orm" + "fmt" + "io/ioutil" + "os" + "reflect" + "strings" + "sort" + "encoding/json" + "encoding/base64" + ) + + func getBson(ormName string, tag string) string { + if tag == "" { + panic(ormName + "miss bson tag") + } + + array := strings.Split(tag, ",") + if len(array) <= 1 { + return tag + } + + return strings.TrimSpace(array[0]) + } + + type fieldStruct struct { + parentTag string + parentName string + subFieldInfo map[string]string + } + + func parse(param interface{}, tab int) map[string]interface{} { + fieldData := make(map[string]interface{}) + + t := reflect.TypeOf(param) + v := reflect.ValueOf(param) + for i := 0; i < v.NumField(); i++ { + if v.Field(i).CanInterface() { + + if v.Field(i).Type().Kind() == reflect.Struct { + if "time.Time" == fmt.Sprintf("%v", t.Field(i).Type) { + + fieldData[t.Field(i).Name] = getBson(t.Field(i).Name, t.Field(i).Tag.Get("bson")) + continue + } + structField := v.Field(i).Type() + //fmt.Printf("%v %v\n", t.Field(i).Name, t.Field(i).Tag) + subFields := &fieldStruct{ + parentTag: getBson(t.Field(i).Name, t.Field(i).Tag.Get("bson")), + parentName: t.Field(i).Name, + subFieldInfo: make(map[string]string), + } + for j := 0; j < structField.NumField(); j++ { + // fmt.Printf(" %s %s \n", + // structField.Field(j).Name, + // structField.Field(j).Tag) + subFields.subFieldInfo[structField.Field(j).Name] = getBson(structField.Field(j).Name, structField.Field(j).Tag.Get("bson")) + } + fieldData[t.Field(i).Name] = subFields + + continue + } + + // fmt.Printf("%s %s \n", + // t.Field(i).Name, + // t.Field(i).Tag) + + fieldData[t.Field(i).Name] = getBson(t.Field(i).Name, t.Field(i).Tag.Get("bson")) + } + + } + + return fieldData + } + + type TableMeta struct { + StructName string + DbName string + } + + func main() { + param := PARAM + packageName := "PACKAGE-NAME" + structsBuf := fmt.Sprintf("package %s \n", packageName) + initsBuf := "func init() {\n" + tabsBuf := "var FN struct {\n" + + decodeMetas := func(arg string) []TableMeta { + v, _ := base64.StdEncoding.DecodeString(strings.TrimSpace(arg)) + var tableMetas []TableMeta + if err := json.Unmarshal([]byte(v), &tableMetas); err != nil { + panic(err) + } + return tableMetas + } + + tableMetas := decodeMetas(os.Args[1]) + + for _, v := range param { + fieldInfo := parse(v, 0) + if len(fieldInfo) > 0 { + keys := make([]string, 0, len(fieldInfo)) + hasID := false + for fieldname, fieldTag := range fieldInfo { + keys = append(keys,fieldname) + switch fieldTag.(type) { + case string: + tempStr := fieldTag.(string) + if tempStr == "_id" { + hasID = true + } + } + } + + if !hasID { + panic("table miss _id") + } + sort.Strings(keys) + + temp := reflect.TypeOf(v) + tabNames := strings.Split(fmt.Sprintf("%v", temp), ".") + tabName := "Tag" + tabNames[1] + tabsBuf += fmt.Sprintf("%s %s\n", tabNames[1], tabName) + structsBuf += fmt.Sprintf("type %s struct {\n", tabName) + for _, fieldname := range keys { + fieldTag := fieldInfo[fieldname] + switch fieldTag.(type) { + case *fieldStruct: + subStruct := fieldTag.(*fieldStruct) + + // 嵌套字段也排序 + var sortedFieldNames []string + for subFieldName := range subStruct.subFieldInfo { + sortedFieldNames = append(sortedFieldNames, subFieldName) + } + sort.Strings(sortedFieldNames) + + structsBuf += fmt.Sprintf("%s struct {\n", subStruct.parentName) + for _, subFieldName := range sortedFieldNames { + subFieldTag := subStruct.subFieldInfo[subFieldName] + structsBuf += fmt.Sprintf("%s string\n", subFieldName) + initsBuf += fmt.Sprintf("FN.%s.%s.%s = \"%s.%s\"\n", tabNames[1], subStruct.parentName, subFieldName, subStruct.parentTag, subFieldTag) + } + structsBuf += "}\n" + + default: + structsBuf += fmt.Sprintf("%s string\n", fieldname) + initsBuf += fmt.Sprintf("FN.%s.%s = \"%s\"\n", tabNames[1], fieldname, fieldTag) + } + + } + + structsBuf += "}\n" + + } + } + + //initsBuf += "}\n" + tabsBuf += "}\n\n\n" + //tabsBuf += "var FN XXX\n\n" + + tabsBuf += "var TN struct {\n" + //tabsBuf += "var FN XXX\n\n" + + for _, meta := range tableMetas { + tabsBuf += fmt.Sprintf("%s string\n", meta.StructName) + initsBuf += fmt.Sprintf("TN.%v = \"%v\"\n", meta.StructName, meta.DbName) + } + + tabsBuf += "}\n" + initsBuf += "}\n" + + totalBuf := structsBuf + tabsBuf + initsBuf + + fmt.Println(totalBuf) + + err3 := ioutil.WriteFile(fmt.Sprintf("%s/%s/tag.go", "PACKAGE-ROOTPATH", "PACKAGE-PATH"), []byte(totalBuf), 0777) + // err3 := ioutil.WriteFile(fmt.Sprintf("%s/%s/tag_1.go", "PACKAGE-ROOTPATH", "PACKAGE-PATH"), []byte(totalBuf), 0777) + // err3 := ioutil.WriteFile(fmt.Sprintf("%s/src/%s/tag.go", os.Getenv("GOPATH"), "PACKAGE-PATH"), []byte(totalBuf), 0777) + + fmt.Println("write file, err = ", err3) + }`) + + ioutil.WriteFile(dstFile, buf, 0777) + // shellCmd(fmt.Sprintf(`echo "%s" > %s`, string(buf), dstFile)) + cmd := fmt.Sprintf(`sed -i '' 's#PACKAGE-PATH#%s#g' %s`, packgePath, dstFile) + shellCmd(cmd) + + // fmt.Println(cmd) + // output, err := shellCmd(cmd) + // fmt.Println(err, output) + + cmd = fmt.Sprintf(`sed -i '' 's#PACKAGE-ROOTPATH#%s#g' %s`, rootPath, dstFile) + shellCmd(cmd) + + cmd = fmt.Sprintf(`sed -i '' 's/PACKAGE-NAME/%s/g' %s`, packageName, dstFile) + shellCmd(cmd) + + cmd = fmt.Sprintf(`sed -i '' 's/PARAM/%s/g' %s`, orms, dstFile) + shellCmd(cmd) + + cmd = "go run " + dstFile + " " + strCmdParam + shellCmd(cmd) + + cmd = fmt.Sprintf(`go fmt %s`, rootPath+"/"+packgePath+"/tag.go") + shellCmd(cmd) + +} + +type TableMeta struct { + StructName string + DbName string +} + +// 返回值:<结构体名、表名> +func getOrmName(servicePath string) []TableMeta { + tableMetas := make([]TableMeta, 0) + tableName := regexp.MustCompile("^type\\s+(\\w+)\\s+struct\\s{$") + files, _, _ := GetFilesAndDirs(servicePath) + for _, file := range files { + if "tag.go" != file { + fileBuf, _ := os.Open(file) + br := bufio.NewReader(fileBuf) + + // inStruct := false + tbName := "" + // hasFlag := false + for { + line, _, ec := br.ReadLine() + if nil != ec { + break + } + + if strings.HasPrefix(string(line), "// @table:") { + temp := strings.Split(string(line), ":") + tbName = strings.TrimSpace(temp[1]) + if "" == tbName { + panic("tb name is empty, error table description") + } + + // hasFlag = true + continue + } + + if "" != tbName { + if names := tableName.FindStringSubmatch(string(line)); len(names) > 0 { + log.Infof("有效表结构: (%v -> %v)\n", names[1], tbName) + // tabs = append(tabs, names[1]) + // tabs[names[1]] = tbName + tableMetas = append(tableMetas, TableMeta{ + StructName: names[1], + DbName: tbName, + }) + } + } + // hasFlag = false + tbName = "" + } + } + } + + return tableMetas +} + +func genTagImpl(servicePath string) { + // path := servicePath + // files, err := ioutil.ReadDir(path) + // if err != nil { + // fmt.Println("read dir faild:", err.Error()) + // return + // } + + // fileBuf := "\n\n\n" + // for _, file := range files { + // if "tag.go" != file.Name() && strings.HasSuffix(file.Name(), ".go") { + // fileBuf += parseOrm(path + "/" + file.Name()) + // } + + // } + + // if len(fileBuf) > 100 { + // shellCmd(fmt.Sprintf(`echo '%s' > %s`, fileBuf, path+"/tag.go")) + // shellCmd("go fmt " + path + "/tag.go") + // } + + cmd := fmt.Sprintf(`ls -l %s | grep type.go | grep -v "^d"| grep -v "tag.go" | tail -n 1 | awk '{print $NF}'`, servicePath) + output, err := shellCmd(cmd) + if err != nil { + panic("has error, " + cmd) + } + + output = strings.TrimSpace(output) + cmd = fmt.Sprintf(`cat %s/%s | grep "^package " | awk '{print $2}'`, servicePath, output) + packageName, err2 := shellCmd(cmd) + if err2 != nil { + panic("has error, " + cmd) + } + packageName = strings.TrimSpace(packageName) + + // gopath := os.Getenv("GOPATH") + // packagePath := strings.TrimLeft(servicePath, gopath+"/") + packagePath := strings.TrimPrefix(servicePath, rootPath+"/") + + log.Infof("处理%v包...", packageName) + tableMetas := getOrmName(rootPath + "/" + packagePath) + if len(tableMetas) <= 0 { + return + } + + // shellCmd("mkdir -p $GOPATH/src/plus/server/temp") + // shellCmd("rm -rf $GOPATH/src/plus/server/temp") + shellCmd(fmt.Sprintf("rm -rf %s%s", rootPath, tmpPath)) + + // shellCmd("mkdir -p $GOPATH/src/plus/server/temp/orm") + // strTest := fmt.Sprintf("------------- mkdir -p %s%s/orm", rootPath, tmpPath) + // fmt.Println(strTest) + shellCmd(fmt.Sprintf("mkdir -p %s%s/orm", rootPath, tmpPath)) + // shellCmd("mkdir -p "+rootPath+tmpPath+"/orm") + // shellCmd("cp $GOPATH/src/" + packagePath + "/*_define.go $GOPATH/src/plus/server/temp/orm/") + shellCmd("cp " + rootPath + "/" + packagePath + "/type.go " + rootPath + tmpPath + "/orm/") + + // writeGoFile(packageName, packagePath, tabs, os.Getenv("GOPATH")+"/src/plus/server/temp/main.go") + writeGoFile(packageName, packagePath, tableMetas, fmt.Sprintf("%s%s/main.go", rootPath, tmpPath)) + // output, err = shellCmd(``) + + // _, err = shellCmd(`cat `) + // writeGoFile(packageName, packagePath) +} + +// 获取指定目录下的所有文件和目录 +func GetFilesAndDirs(dirPth string) (files []string, dirs []string, err error) { + dir, err := ioutil.ReadDir(dirPth) + if err != nil { + return nil, nil, err + } + + PthSep := string(os.PathSeparator) + // suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写 + dirs = append(dirs, dirPth) + for _, fi := range dir { + if fi.IsDir() { // 目录, 递归遍历 + dirs = append(dirs, dirPth+PthSep+fi.Name()) + GetFilesAndDirs(dirPth + PthSep + fi.Name()) + } else { + // 过滤指定格式 + ok := strings.HasSuffix(fi.Name(), ".go") + if ok { + files = append(files, dirPth+PthSep+fi.Name()) + } + } + } + + return files, dirs, nil +} + +// 获取指定目录下的所有文件,包含子目录下的文件 +func GetAllFiles(dirPth string) (files []string, err error) { + var dirs []string + dir, err := ioutil.ReadDir(dirPth) + if err != nil { + return nil, err + } + + PthSep := string(os.PathSeparator) + // suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写 + + for _, fi := range dir { + if fi.IsDir() { // 目录, 递归遍历 + dirs = append(dirs, dirPth+PthSep+fi.Name()) + GetAllFiles(dirPth + PthSep + fi.Name()) + } else { + // 过滤指定格式 + ok := strings.HasSuffix(fi.Name(), ".go") + if ok { + files = append(files, dirPth+PthSep+fi.Name()) + } + } + } + + // 读取子目录下文件 + for _, table := range dirs { + temp, _ := GetAllFiles(table) + for _, temp1 := range temp { + files = append(files, temp1) + } + } + + return files, nil +} + +func genTag(path string) { + + _, dirs, _ := GetFilesAndDirs(path) + for _, dir := range dirs { + subFiles, _, _ := GetFilesAndDirs(dir) + if len(subFiles) > 0 { + genTagImpl(dir) + } + } +} + +// func genTag1(path string) { +// genTagImpl(path) +// } + +func main() { + path := "" + if "" == path { + path = rootPath + dealPath + } + + flag.StringVar(&model, "m", "", "指定要生成的model,不指定则生成所有model") + flag.Parse() + + if model != "" { + path = filepath.Join(path, model) + } + + genTagImpl("/Users/mac/code/stat_center/models/channelmod") +} diff --git a/tool/pubtest/pubtest.go b/tool/pubtest/pubtest.go new file mode 100644 index 0000000..6d307f7 --- /dev/null +++ b/tool/pubtest/pubtest.go @@ -0,0 +1,93 @@ +package pubtest + +import ( + "fmt" + "os" + "stat/common/config" + "stat/common/genId" + "stat/common/log" + "stat/common/mongos" + "stat/common/redis" + "stat/models" + "stat/service/cacheSer" + "stat/statg" + "time" +) + +func TestInit(workPath string) error { + // 设置时区 + time.Local, _ = time.LoadLocation("Asia/Shanghai") + + // 更换工作目录 + pwd, _ := os.Getwd() + fmt.Println("开始工作目录", pwd) + if err := os.Chdir(workPath); err != nil { + return err + } + // 初始化配置文件 + if err := initConfig(); err != nil { + return err + } + // 恢复工作目录 + if err := os.Chdir(pwd); err != nil { + return err + } + // 初始化数据库 + if err := initMongoDB(); err != nil { + return err + } + // 初始化redis + if err := initRedis(); err != nil { + return err + } + // 初始化缓存 + cacheSer.Init() + // 自增id + genId.Start() + + return nil +} + +func initConfig() error { + err := config.LoadJSON("conf/server.json", &statg.Conf) + if err != nil { + log.Fatal("加载本地配置失败", log.E(err)) + return err + } + // set default value + if statg.Conf.Limit.Ip.Capacity <= 0 { + statg.Conf.Limit.Ip.Capacity = 300 + } + if statg.Conf.Limit.Ip.Rate <= 0 { + statg.Conf.Limit.Ip.Rate = 5 + } + statg.Tgbotsend = statg.Conf.TgbotSend + return nil +} + +func initMongoDB() error { + mgoDB := mongos.NewManager(statg.Conf.Mongo.Url) + if err := mgoDB.Connect(); err != nil { + log.Error("mgoDB connect err", log.E(err)) + return err + } + + mongos.MgoManager = mgoDB + + // 初始化数据库索引 + models.InitIndex() + + return nil +} + +func initRedis() error { + rds, err := redis.NewManagerWithUrl(statg.Conf.Redis.Url, nil) + if err != nil { + log.Error("rds init err", log.E(err)) + return err + } + + redis.StatRds = rds + + return nil +} diff --git a/tool/sqSync/main.go b/tool/sqSync/main.go new file mode 100644 index 0000000..6c45a5c --- /dev/null +++ b/tool/sqSync/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "stat/common/log" + "stat/tool/sqSync/model" + + "stat/tool/sqSync/service" +) + +func initMongoDB() error { + + if err := model.InitMongoDB(); err != nil { + log.Error("InitMongoDB err", log.E(err)) + return err + } + + return nil +} + +func main() { + initMongoDB() + // _ = service.SyncDistrictInfo() + _ = service.SyncUserInfo() + // _ = service.SyncAdsInfo() +} diff --git a/tool/sqSync/model/district.go b/tool/sqSync/model/district.go new file mode 100644 index 0000000..ff8923a --- /dev/null +++ b/tool/sqSync/model/district.go @@ -0,0 +1,89 @@ +package model + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "github.com/shopspring/decimal" + "go.mongodb.org/mongo-driver/bson" +) + +// DistrictInfo 渠道原始信息 +type DistrictInfo struct { + Code string `bson:"code"` //商区码 + Name string `bson:"name"` //账号 + Mobile string `bson:"mobile"` //手机号 + Parent string `bson:"parent"` //parent + Password string `bson:"password"` //密码 + DiscType int `bson:"discType"` //商区类型/结算类型 + DividendRatio float64 `bson:"dividendRatio"` //分红比例 参与结算 + DisSettlement bool `bson:"disSettlement"` //禁止结算 + UserUnitCent float64 `bson:"userUnitCent"` //用户单价 单位:分 + NUDeductionRatio float64 `bson:"nuDeductionRatio"` //新增用户扣量比例 + NUDedLowerOutset int64 `bson:"nuDedLowerOutset"` //新增用户扣量起点 + NUDedAt time.Time `bson:"nuDedAt"` //新增用户扣量时间 + RechgDeductionRatio float64 `bson:"rechgDeductionRatio"` //充值扣量比例 + RechgDedLowerOutset int64 `bson:"rechgDedLowerOutset"` //充值扣量起点 + RechgDedAt time.Time `bson:"rechgDedAt"` //充值扣量时间 + ChildMax int `bson:"childMax"` //最大孩子数 + Disable bool `bson:"disable"` //禁用 + Lock bool `bson:"lock"` //禁止登陆 + DisTrans bool `bson:"disTrans"` //禁止交易 + DisAd bool `bson:"disAd"` //禁止广告 + DisMulDivi bool `bson:"disMulDivi"` //禁止多级分成(目前针对CPS) + PayPassword string `bson:"payPassword"` //支付密码 + BalanceCent decimal.Decimal `bson:"balance"` //余额 单位:分 + Remark string `bson:"remark"` //备注 + CreatedAt time.Time `bson:"createdAt"` //文档创建时间 + UpdatedAt time.Time `bson:"updatedAt"` //文档更新时间 +} + +// YhDistrictCodeInfo 渠道码信息 +type YhDistrictCodeInfo struct { + DiscCode string `bson:"discCode"` //商圈码 + PromSeq string `bson:"promSeq"` //推广序列 + Remark string `bson:"remark"` //备注 + PromCode string `bson:"promCode"` //备注 + CreatedAt time.Time `bson:"createdAt"` + DeletedAt time.Time `bson:"deletedAt,omitempty"` //删除时间 +} + +const CollDistrict = "district" +const CollDistrictCode = "disc_prom_seqe" + +var dbDistrict *mongos.MongoTool +var dbDistrictcode *mongos.MongoTool + +func DistrictInit() { + dbDistrict = mongos.New(ManagerYh, CollDistrict) + dbDistrictcode = mongos.New(ManagerYh, CollDistrictCode) +} + +// FindYhDistrictInfo 查询所有渠道 +func FindSQDistrictInfo(ctx context.Context) ([]DistrictInfo, error) { + list := make([]DistrictInfo, 0) + query := bson.M{} + + if err := dbDistrict.Find(ctx, &list, query); err != nil { + log.Error(fmt.Sprintf("model %s FindYhDistrictInfo Find error", CollDistrict), log.E(err)) + return list, err + } + + return list, nil +} + +// FindSQDistrictCodeInfo 查询渠道的渠道码 +func FindSQDistrictCodeInfo(ctx context.Context, discCode string) ([]YhDistrictCodeInfo, error) { + list := make([]YhDistrictCodeInfo, 0) + query := bson.M{"discCode": discCode} + + if err := dbDistrictcode.Find(ctx, &list, query); err != nil { + log.Error(fmt.Sprintf("model %s FindYhDistrictInfo Find error", CollDistrict), log.E(err)) + return list, err + } + + return list, nil +} diff --git a/tool/sqSync/model/init.go b/tool/sqSync/model/init.go new file mode 100644 index 0000000..c4fb8a9 --- /dev/null +++ b/tool/sqSync/model/init.go @@ -0,0 +1,39 @@ +package model + +import ( + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/models" +) + +var ( + ManagerYh *mongos.Manager + ManagerStat *mongos.Manager +) + +// InitMongoDB 初始化同步数据库 +func InitMongoDB() error { + yhDB := mongos.NewManager("mongodb://read:6zwcDUpPy7dMkLTeWwHX@172.104.42.200:47017,139.162.18.46:47017,139.162.35.214:47017/sz?direct=game&maxPoolSize=200&connectTimeout=30&authSource=admin") + if err := yhDB.Connect(); err != nil { + log.Error("mgoDB connect err", log.E(err)) + return err + } + ManagerYh = yhDB + + // 初始化表链接 + DistrictInit() + UserInit() + + statDB := mongos.NewManager("mongodb://bill:E4OSVEd6zuWibxJo@118.107.44.79:47017/statcentre?direct=game&maxPoolSize=200&connectTimeout=30&authSource=statcentre") + if err := statDB.Connect(); err != nil { + log.Error("mgoDB connect err", log.E(err)) + return err + } + mongos.MgoManager = statDB + fmt.Println(statDB) + // 初始化数据库索引 + models.InitIndex() + + return nil +} diff --git a/tool/sqSync/model/userinfo.go b/tool/sqSync/model/userinfo.go new file mode 100644 index 0000000..f0ac1e8 --- /dev/null +++ b/tool/sqSync/model/userinfo.go @@ -0,0 +1,48 @@ +package model + +import ( + "context" + "fmt" + "stat/common/log" + "stat/common/mongos" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type YhUser struct { + UID uint64 `json:"id" bson:"id"` //用户id + SysType string `json:"sysType" bson:"sysType"` //系统类型 + DevType string `json:"deviceType" bson:"deviceType"` //设备类型 + Mobile string `json:"mobile" bson:"mobile"` //手机号 + Name string `json:"nickName" bson:"nickName"` //名字 + DistrictCode string `json:"agentInviteCode" bson:"agentInviteCode"` //商区码 + PromSeqe string `json:"promSeqe" bson:"promSeqe"` //推广序列 + PromCode string `json:"inviteCode" bson:"inviteCode"` //邀请码 + IsDirect bool `json:"isDirect" bson:"isDirect"` //true:是直推用户 + CreatedAt time.Time `bson:"createdAt"` //文档创建时间 +} + +const CollUser = "server_user" + +var dbUser *mongos.MongoTool + +func UserInit() { + dbUser = mongos.New(ManagerYh, CollUser) +} + +// FindSQUserInfo 查询用户 +func FindSQUserInfo(ctx context.Context, skip int64, limit int64) ([]YhUser, error) { + list := make([]YhUser, 0) + query := bson.M{} + sort := bson.D{{Key: "_id", Value: 1}} + opts := options.Find().SetSkip(skip).SetLimit(limit).SetSort(sort).SetProjection(bson.M{"id": 1, "sysType": 1, "deviceType": 1, "mobile": 1, "nickName": 1, "agentInviteCode": 1, "inviteCode": 1, "isDirect": 1, "createdAt": 1}) + + if err := dbUser.Find(ctx, &list, query, opts); err != nil { + log.Error(fmt.Sprintf("model %s FindYhUserInfo Find error", CollDistrict), log.E(err)) + return list, err + } + + return list, nil +} diff --git a/tool/sqSync/service/service.go b/tool/sqSync/service/service.go new file mode 100644 index 0000000..8517c24 --- /dev/null +++ b/tool/sqSync/service/service.go @@ -0,0 +1,141 @@ +package service + +import ( + "context" + "stat/common/log" + "stat/models/registermod" + "stat/tool/sqSync/model" +) + +func SyncUserInfo() error { + skip := int64(0) + limit := int64(10000) + ctx := context.Background() + //fmt.Println("before delete:", skip) + for { + //fmt.Println(skip) + userlist, err := model.FindSQUserInfo(ctx, skip, limit) + if err != nil { + log.Error("SyncUserInfo FindSQUserInfo", log.E(err)) + return err + } + // 转换 + //fmt.Println(len(userlist)) + + docs := make([]*registermod.RegisterMod, 0) + for _, userInfo := range userlist { + doc := registermod.RegisterMod{ + UserId: userInfo.UID, + AppId: 2, + SysType: userInfo.SysType, + DevType: userInfo.DevType, + Mobile: userInfo.Mobile, + Name: userInfo.Name, + IsDirect: userInfo.IsDirect, + DistrictCode: userInfo.DistrictCode, + RegisterTime: userInfo.CreatedAt, + IsDeduction: false, + PromCode: userInfo.PromCode, + } + docs = append(docs, &doc) + } + + if err = registermod.AddManyRegisterCode(ctx, &docs); err != nil { + log.Error("SyncUserInfo AddManyRegisterCode", log.E(err)) + return err + } + + // 插入数据库 + skip = skip + int64(len(userlist)) + //fmt.Println(skip) + if int64(len(userlist)) < limit { + log.Info("SyncUserInfo total:", log.Any("total", skip)) + return nil + } + + } +} + +/* + 滑动窗口告诉发送端 接收端还有多少缓冲去可以接受数据, 于是发送端可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来 + 以此控制发送数据的速率,从而达到流量控制,窗口大小是一个16bit字段,大小65536 socket的接收缓冲区大小 + + CLose sync =1 seq=x + syc-send sync=1 ACK=1 seq=y ack=x=1 listen + EStablisend ACK=1 seq=x+1 ack=y+1 SYNC-Recv + + + Fin——wait FIN =1 seq + fin_wait2 ACk=1 seq=v ack=u+1 + FIN=1,acl + + 半关闭状态, 客户端没有数据发送来 closewait 半关闭状态 + + Timewait 和closewait的区别: + timewait 指主动发起关闭连接方 在收到对端 fin +ack后进入等待关闭,施放 + 确保客户端发送的最后一个ACK报文能够到达服务器,因为ACK可能丢失, 服务器可能认为没收到,启动超时从传机制,导致服务器处理close_wait状态,新的连接不会出现旧连接报文 + + closewait 被动关闭的机器接收到对方请求关闭的fin豹纹,在第一次ACK应答后,进入close——wait状态, 同志应用层发送剩余数据,关闭相关资源 + 我们一般在/etc/sysctl.conf文件中来修改默认值 + + 滑动窗口 + 动态改变窗口大小来调节两台主机间数据传输,tcp/IP支持全双工的数据传输,因此TCP有两个滑动串口, 一个用于接收, 一个用于发送 + + TCP的确认机制,滑动串口是TCP使用的一种流量控制方法,该协议允许发送在同志并等待确认前可以连续发送多个分组,犹豫发送方不必每发送一个分组就停止袭来等待确认,因此该协议 + 可以加速数据船 + 流量控制,端到端,接收端额应用层处理速度决定 + + + 分布式一致性 + 对于一个分布式系统而言,分区容错性是一个最基本的要求,因此既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点 + 分区容错性也就成为一个分布式系统必然需要面对和解决的问题,因此系统架构师往往把精力花在如何根据业务特点在C一致性和A可用性之前寻求平衡 +base理论 + 基本可用 出现不可预知状态时,允许 + 软状态,允许数据存在中间状态,并认为该状态不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。 + 最终一致性 + 最终一致性 强调的是所有的数据副本,在经过一段时间的同步之后,最终都能够达到一个一直的状态,因此最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的 + 强一致性。 + 大型高可用可扩展的分布式系统和传统ACID特性相反, 牺牲强一致性来活动可用性, + A 原子性 一致性 隔离性能 持久性 + + etcd就是使用raft算法来保持数据一致性的 与raft类似的还有POXOS算法和 ZAB协议等 + + etcd和console + + leader 和 follower + 选举超时时间 一定周期/时间 150ms-300ms 之间的随机数 心跳<选举周期 + + + 选举周期 + 周期数 + + + 面对对象编程: + + + 封装 + public、pretected、private + + + 继承 + + + + + 多态 + + nginx 是以even处理模型为基础摩卡,它为了支持跨平台,抽象出了event模块,一部IO,主要是epoll + event模块的主要功能就是监听,监听accept后建立的连接,对读写事件进行添加删除,事件处理模型和nginx的非阻塞IO模型结合在一起使用,当IO可读可写的时候,相应的事件就会被唤醒 + 此时就会处理事件的回掉函数 + + + + 面试: + 拓扑: + + + + + + +*/ diff --git a/tool/yc/main.go b/tool/yc/main.go new file mode 100644 index 0000000..a2dfe59 --- /dev/null +++ b/tool/yc/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "stat/common/log" + "stat/tool/yc/model" + "stat/tool/yc/service" + "time" +) + +func initMongoDB() error { + + if err := model.InitMongoDB(); err != nil { + log.Error("InitMongoDB err", log.E(err)) + return err + } + + return nil +} + +func main() { + initMongoDB() + time.Local, _ = time.LoadLocation("Asia/Shanghai") + _ = service.SyncUserInfo() + +} diff --git a/tool/yc/model/init.go b/tool/yc/model/init.go new file mode 100644 index 0000000..28c5b7a --- /dev/null +++ b/tool/yc/model/init.go @@ -0,0 +1,25 @@ +package model + +import ( + "fmt" + "stat/common/log" + "stat/common/mongos" + "stat/models" +) + +// InitMongoDB 初始化同步数据库 +func InitMongoDB() error { + + statDB := mongos.NewManager("mongodb://stat:7u9CUAEE1Nv2tSvz@192.53.118.36:47017,192.53.173.209:47017,139.162.65.62:47017,172.105.237.106:47017,172.105.189.212:47017/stat?replicaSet=MDstat&maxPoolSize=200&connectTimeout=30&authSource=stat") + if err := statDB.Connect(); err != nil { + log.Error("mgoDB connect err", log.E(err)) + return err + } + mongos.MgoManager = statDB + + // 初始化数据库索引 + models.InitIndex() + fmt.Println("init") + + return nil +} diff --git a/tool/yc/service/service.go b/tool/yc/service/service.go new file mode 100644 index 0000000..397100e --- /dev/null +++ b/tool/yc/service/service.go @@ -0,0 +1,83 @@ +package service + +import ( + "context" + "stat/common/log" + "stat/common/utils" + "stat/models/syncvip" + "time" + + "go.mongodb.org/mongo-driver/bson" +) + +func SyncUserInfo() error { + ctx := context.Background() + + end := utils.BeginOfToday() + start := end.AddDate(0, 0, -1) + + registerMap := make(map[time.Time]int64) + + filter := bson.M{ + syncvip.FN.SyncVip.AppId: 888, + syncvip.FN.SyncVip.SuccessAt: bson.M{"$gte": start, "$lt": end}, + } + + VipList, err := syncvip.FindManySyncVip(ctx, filter) + if err != nil { + log.Error("ChannelChannelStatMethod FindManyVisitInfo ", log.E(err)) + return err + } + //fmt.Println(len(VipList)) + + for _, orderinfo := range VipList { + registerTime := utils.BeginWithTime(orderinfo.RegisterTime) + if registerTime.Before(start.AddDate(0, 0, -20)) { + continue + } + if money, ok := registerMap[registerTime]; ok { + registerMap[registerTime] = money + orderinfo.Money + } else { + registerMap[registerTime] = orderinfo.Money + } + } + + //for key, value := range registerMap { + // fmt.Println(key, "充值金额:", fmt.Sprintf("%02f", float64(value)/100)) + //} + + return nil +} + +// func SyncUserInfo() error { +// ctx := context.Background() + +// end := utils.BeginOfToday().AddDate(0, 0, -15) +// start := end.AddDate(0, 0, -1) + +// registerMap := make(map[time.Time]int64) +// // 获取充值金额 +// rechargeList, err := rechargemod.TotalDistricRechargeAmountV1(ctx, 888, start, end) +// if err != nil { +// log.Error("DirectAmountMethod DirectRechargeAmount ", log.E(err)) +// return err +// } + +// for _, orderinfo := range rechargeList { +// registerTime := utils.BeginWithTime(orderinfo.RegisterTime) +// if registerTime.Before(start.AddDate(0, 0, -20)) { +// continue +// } +// if money, ok := registerMap[registerTime]; ok { +// registerMap[registerTime] = money + orderinfo.Money +// } else { +// registerMap[registerTime] = orderinfo.Money +// } +// } + +// for key, value := range registerMap { +// fmt.Println(key, "充值金额:", fmt.Sprintf("%02f", float64(value)/100)) +// } + +// return nil +// } diff --git a/tool/yc/yc b/tool/yc/yc new file mode 100755 index 0000000..c57acc8 Binary files /dev/null and b/tool/yc/yc differ