wucan 5 mesiacov pred
rodič
commit
8827b3cee5
4 zmenil súbory, kde vykonal 274 pridanie a 23 odobranie
  1. 227 0
      controller/v1/userAds.go
  2. 28 23
      controller/v1/userBehavior.go
  3. 14 0
      model/user.go
  4. 5 0
      route/api.go

+ 227 - 0
controller/v1/userAds.go

@@ -0,0 +1,227 @@
+package v1
+
+import (
+	"designs/app/common/request"
+	"designs/app/common/response"
+	"designs/global"
+	"designs/model"
+	"designs/utils"
+	"github.com/gin-gonic/gin"
+	"math"
+	"time"
+)
+
+// 用户广告数据总览
+func UserAdsOverview(c *gin.Context) {
+	form := request.Check(c, &struct {
+		Gid string   `json:"gid" binding:"required"`
+		Pf  []string `form:"pf" binding:"required"`
+	}{})
+
+	//近七日广告总数
+	//查询近七日活跃总数
+	now := time.Now()
+	sevenDayAgo := now.AddDate(0, 0, -7)
+	thirtyDayAgo := now.AddDate(0, 0, -30)
+
+	var adsCount7 int64
+	err := global.App.DB.Table("user_see_ads").
+		Where("gid", form.Gid).
+		WhereIn("pf", form.Pf).
+		Where("createdAt", ">=", sevenDayAgo).
+		Where("createdAt", "<=", now).
+		Count(&adsCount7).Error
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	//近30天广告总数
+	var adsCount30 int64
+	err = global.App.DB.Table("user_see_ads").
+		Where("gid", form.Gid).
+		WhereIn("pf", form.Pf).
+		Where("createdAt", ">=", thirtyDayAgo).
+		Where("createdAt", "<=", now).
+		Count(&adsCount30).Error
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	//近七日活跃用户人均看广告数
+	var activeUserCount7 int64
+	err = global.App.DB.Table("user_login").
+		Where("gid", form.Gid).
+		WhereIn("pf", form.Pf).
+		Where("loginTime", ">=", sevenDayAgo).
+		Where("loginTime", "<=", now).
+		Distinct("userId").
+		Count(&activeUserCount7).Error
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	//用户人均看广告数
+	var userTotal int64
+	err = global.App.DB.Table("user").
+		Where("gid", form.Gid).
+		WhereIn("pf", form.Pf).Count(&userTotal).Error
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+	var adsTotal int64
+	err = global.App.DB.Table("user_see_ads").
+		Where("gid", form.Gid).
+		WhereIn("pf", form.Pf).Count(&adsTotal).Error
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	var avgUserAds float64
+	var avgUserAds7 float64
+	if activeUserCount7 == 0 {
+		avgUserAds7 = 0
+	} else {
+		avgUserAds7 = float64(adsCount7) / float64(activeUserCount7)
+	}
+
+	if userTotal == 0 {
+		avgUserAds = 0
+	} else {
+		avgUserAds = float64(adsTotal) / float64(userTotal)
+	}
+
+	response.Success(c, gin.H{
+		"data": map[string]interface{}{
+			"adsCount7":   adsCount7,
+			"adsCount30":  adsCount30,
+			"avgUserAds":  math.Round(avgUserAds*100) / 100,
+			"avgUserAds7": math.Round(avgUserAds7*100) / 100,
+		},
+	})
+
+}
+
+// 每日看广告总数
+func UserAdsDaily(c *gin.Context) {
+	form := request.Check(c, &struct {
+		Gid       string   `json:"gid" binding:"required"`
+		Pf        []string `form:"pf" binding:""`
+		StartTime string   `form:"startTime" json:"startTime" binding:"required"`
+		EndTime   string   `form:"endTime" json:"endTime" binding:"required"`
+	}{})
+
+	dates := utils.GetTimeDayDate(form.StartTime, form.EndTime)
+	//response.Success(c, gin.H{
+	//	"dates": dates,
+	//})
+	//return
+
+	form.EndTime = form.EndTime + " 23:59:59"
+
+	//近七日广告总数
+	var userAdsDaily []struct {
+		Date  string `json:"date" gorm:"not null;column:date;"`
+		Count int64  `json:"count" gorm:"not null;column:count;"`
+	}
+
+	err := global.App.DB.Table("user_see_ads").
+		Where("gid", form.Gid).
+		WhereIn("pf", form.Pf).
+		Where("createdAt", ">=", form.StartTime).
+		Where("createdAt", "<=", form.EndTime).
+		Group("date").
+		Select("count(*) as count", "date").
+		Scan(&userAdsDaily).Error
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	res := make(map[string]interface{})
+	for k := range dates {
+		res[k] = 0
+	}
+
+	for _, v := range userAdsDaily {
+		date := v.Date[0:4] + "-" + v.Date[4:6] + "-" + v.Date[6:]
+		res[date] = v.Count
+	}
+
+	var count int64
+	for _, v := range userAdsDaily {
+		count = count + v.Count
+	}
+
+	response.Success(c, gin.H{
+		"data": map[string]interface{}{
+			"userAdsDaily": res,
+			"count":        count,
+			"avg":          count / int64(len(dates)),
+		},
+	})
+
+}
+
+// 广告详细数据()
+func UserAdsDetail(c *gin.Context) {
+	form := request.Check(c, &struct {
+		Gid       string   `json:"gid" binding:"required"`
+		Pf        []string `form:"pf" binding:""`
+		StartTime string   `form:"startTime" json:"startTime" binding:""`
+		EndTime   string   `form:"endTime" json:"endTime" binding:""`
+		AdsState  []int    `json:"adsState" binding:""`
+		AdsType   string   `json:"adsType" binding:""`
+		OpenId    string   `json:"openId" binding:""`
+		Offset    int      `json:"offset" binding:""`
+		Limit     int      `json:"limit" binding:""`
+		Order     string   `json:"order" binding:""`
+	}{})
+	form.EndTime = form.EndTime + " 23:59:59"
+
+	query := global.App.DB.Table("user_see_ads").
+		LeftJoin("user", "user.userId = user_see_ads.userId and user.pf = user_see_ads.pf and user.gid = user_see_ads.gid")
+
+	query = query.Where("user_see_ads.gid", form.Gid).WhereIn("user_see_ads.pf", form.Pf)
+	if form.StartTime != "" && form.EndTime != "" {
+		query = query.Where("user_see_ads.createdAt", ">=", form.StartTime).Where("user_see_ads.createdAt", "<=", form.EndTime)
+	}
+	if len(form.AdsState) > 0 {
+		query = query.WhereIn("adsState", form.AdsState)
+	}
+	if form.OpenId != "" {
+		query = query.Where("openId", form.OpenId)
+	}
+	if form.AdsType != "" {
+		query = query.Where("adsType", form.AdsType)
+	}
+
+	var count int64
+	err := query.Count(&count).Error
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	var resData []struct {
+		model.UserSeeAds
+		OpenId string `json:"openId" gorm:"not null;column:openId;"`
+	}
+	err = query.Select("user_see_ads.*", "user.openId").
+		Offset(form.Offset).Limit(form.Limit).
+		Order("user_see_ads.id desc").Scan(&resData).Error
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	response.Success(c, gin.H{
+		"data":  resData,
+		"count": count,
+	})
+
+}

+ 28 - 23
controller/v1/userBehavior.go

@@ -13,7 +13,7 @@ import (
 	"go.mongodb.org/mongo-driver/v2/bson"
 	"go.mongodb.org/mongo-driver/v2/mongo/options"
 	"math"
-	"strconv"
+	"math/big"
 	"time"
 )
 
@@ -779,8 +779,8 @@ func AdRelatedList(c *gin.Context) {
 		Offset int `form:"offset" json:"offset" binding:""`
 		Limit  int `form:"limit" json:"limit" binding:""`
 
-		Pid string `form:"pid" json:"pid" binding:""`
-		Aid string `form:"aid" json:"aid" binding:""`
+		Pid int    `form:"pid" json:"pid" binding:""`
+		Aid int    `form:"aid" json:"aid" binding:""`
 		Cid string `form:"cid" json:"cid" binding:""`
 
 		CreateTime interface{} `form:"createTime" json:"createTime" binding:""`
@@ -795,14 +795,14 @@ func AdRelatedList(c *gin.Context) {
 
 	ctx := context.Background()
 	filter := bson.M{}
-	if form.Pid != "" {
-		filter["pid"] = bson.M{"$regex": form.Pid}
+	if form.Pid != 0 {
+		filter["pid"] = form.Pid
 	}
-	if form.Aid != "" {
-		filter["adData.aid"] = form.Aid
+	if form.Aid != 0 {
+		filter["aid"] = form.Aid
 	}
 	if form.Cid != "" {
-		filter["adData.cid"] = form.Cid
+		filter["cid"] = form.Cid
 	}
 
 	if form.CreateTime != nil {
@@ -998,23 +998,23 @@ func AdRelatedList(c *gin.Context) {
 
 // ConversionCondition 转化条件
 type ConversionCondition struct {
-	Id               string  `bson:"_id" json:"id"`
-	Gid              string  `bson:"gid" json:"gid"`
-	Pid              int64   `bson:"pid" json:"pid"`
-	Aid              int64   `bson:"aid" json:"aid"`
-	Type             string  `bson:"type"  json:"type"`
-	StartNum         int     `bson:"start_num" json:"start_num"` //启动次数
-	EstimatedRevenue float32 `bson:"revenue" json:"revenue"`     //当日预估收益
-	Duration         int64   `bson:"duration" json:"duration"`   //当日在线时长
-	ReqRewardedAd    int     `bson:"req_count" json:"req_count"` //当日的激励视频广告请求次数
-	ExpRewardedAd    int     `bson:"exp_count" json:"exp_count"` //当日的激励视频广告曝光次数
+	Id               string   `bson:"_id" json:"id"`
+	Gid              string   `bson:"gid" json:"gid"`
+	Pid              *big.Int `bson:"pid" json:"pid"`
+	Aid              *big.Int `bson:"aid" json:"aid"`
+	Type             string   `bson:"type"  json:"type"`
+	StartNum         int      `bson:"start_num" json:"start_num"` //启动次数
+	EstimatedRevenue float32  `bson:"revenue" json:"revenue"`     //当日预估收益
+	Duration         int64    `bson:"duration" json:"duration"`   //当日在线时长
+	ReqRewardedAd    int      `bson:"req_count" json:"req_count"` //当日的激励视频广告请求次数
+	ExpRewardedAd    int      `bson:"exp_count" json:"exp_count"` //当日的激励视频广告曝光次数
 }
 
 func SetGameCondition(c *gin.Context) {
 	form := request.Check(c, &struct {
 		Gid              string  `form:"gid" json:"gid" binding:"required"`
-		Pid              int64   `form:"pid" json:"pid" binding:""`
-		Aid              int64   `form:"aid" json:"aid" binding:""`
+		Pid              string  `form:"pid" json:"pid" binding:""`
+		Aid              string  `form:"aid" json:"aid" binding:""`
 		Type             string  `form:"type" json:"type" binding:"required"`
 		StartNum         int     `form:"start_num" json:"start_num" binding:""`
 		EstimatedRevenue float32 `form:"revenue" json:"revenue" binding:""`
@@ -1023,7 +1023,12 @@ func SetGameCondition(c *gin.Context) {
 		ExpRewardedAd    int     `form:"exp_count" json:"exp_count" binding:""`
 	}{})
 
-	id := fmt.Sprintf("%s|%s|%s|%s", form.Gid, strconv.Itoa(int(form.Pid)), strconv.Itoa(int(form.Aid)), form.Type)
+	id := fmt.Sprintf("%s|%s|%s|%s", form.Gid, form.Pid, form.Aid, form.Type)
+
+	PidInt := new(big.Int)
+	PidInt.SetString(form.Pid, 10)
+	AidInt := new(big.Int)
+	AidInt.SetString(form.Aid, 10)
 
 	collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
 	filter := bson.M{"_id": id}
@@ -1061,8 +1066,8 @@ func SetGameCondition(c *gin.Context) {
 		//不存在,新增
 		insert := ConversionCondition{
 			Id:               id,
-			Pid:              form.Pid,
-			Aid:              form.Aid,
+			Pid:              PidInt,
+			Aid:              AidInt,
 			Gid:              form.Gid,
 			Type:             form.Type,
 			StartNum:         form.StartNum,

+ 14 - 0
model/user.go

@@ -58,6 +58,20 @@ type Admin struct {
 	UpdatedAt time.Time `json:"updatedAt" gorm:"column:updatedAt;"`
 }
 
+type UserSeeAds struct {
+	ID        int    `json:"id" gorm:"not null;"`
+	Pf        string `json:"pf" gorm:"not null;"`
+	Gid       string `json:"gid" gorm:"not null;"`
+	UserId    int    `json:"userId" gorm:"not null;column:userId;"`
+	Date      string `json:"date" gorm:"not null;"`
+	CreatedAt XTime  `json:"createdAt" gorm:"column:createdAt;"`
+	StartTime XTime  `json:"startTime" gorm:"column:startTime;"`
+	AdsId     string `json:"adsId" gorm:"not null;column:adsId;"`
+	AdsType   string `json:"adsType" gorm:"not null;column:adsType;"`
+	AdsScene  string `json:"adsScene" gorm:"not null;column:adsScene;"`
+	AdsState  int    `json:"adsState" gorm:"not null;column:adsState;"`
+}
+
 // 1. 创建 time.Time 类型的副本 XTime;
 type XTime struct {
 	time.Time

+ 5 - 0
route/api.go

@@ -64,6 +64,11 @@ func SetApiGroupRoutes(router *gin.RouterGroup) {
 		GroupV1.POST("/user/adRelatedList", v1.AdRelatedList)
 		GroupV1.POST("/user/setGameCondition", v1.SetGameCondition)
 		GroupV1.POST("/user/gameConditionList", v1.GameConditionList)
+
+		//广告数据相关接口
+		GroupV1.POST("/user/userAdsOverview", v1.UserAdsOverview)
+		GroupV1.POST("/user/userAdsDaily", v1.UserAdsDaily)
+		GroupV1.POST("/user/userAdsDetail", v1.UserAdsDetail)
 	}
 
 	router.POST("/SetUserBehaviorBak", v1.SetUserBehaviorBak)       //测试接口