Quellcode durchsuchen

电商带货看数据

Ethan vor 5 Monaten
Ursprung
Commit
7dfea42f9e

+ 56 - 1
app/controller/task_controller.go

@@ -820,7 +820,62 @@ func (t TaskController) LocalLifeDel(c *gin.Context) {
 	returnSuccess(c, 20000, resultMap)
 }
 
-// 删除种草任务
+// 电商带货看数据-达人数据
 func (t TaskController) TalentDataDetail(c *gin.Context) {
+	param := &vo.SelectionShowDataParam{}
+	err := c.BindJSON(param)
+	if err != nil {
+		logrus.Errorf("Request bind err:%+v\n", err)
+		returnError(c, 40000, "参数错误")
+		return
+	}
+	result, err := service.ViewDataService{}.SelectionTalentDataDetail(param)
+	if err != nil {
+		logrus.Errorf("[TalentDataDetail] call Show err:%+v\n", err)
+		returnError(c, 40000, err.Error())
+		return
+	}
+	resultMap := make(map[string]vo.ReSelectionTalentData)
+	resultMap["dataInfo"] = result
+	returnSuccess(c, 20000, resultMap)
+}
 
+// 电商带货看数据-领样数据
+func (t TaskController) SampleDataDetail(c *gin.Context) {
+	param := &vo.SelectionShowDataParam{}
+	err := c.BindJSON(param)
+	if err != nil {
+		logrus.Errorf("Request bind err:%+v\n", err)
+		returnError(c, 40000, "参数错误")
+		return
+	}
+	result, err := service.ViewDataService{}.SelectionSampleDataDetail(param)
+	if err != nil {
+		logrus.Errorf("[SampleDataDetail] call Show err:%+v\n", err)
+		returnError(c, 40000, err.Error())
+		return
+	}
+	resultMap := make(map[string]vo.ReSelectionSampleData)
+	resultMap["dataInfo"] = result
+	returnSuccess(c, 20000, resultMap)
+}
+
+// 电商带货看数据-带货数据
+func (t TaskController) SelectionDataDetail(c *gin.Context) {
+	param := &vo.SelectionShowDataParam{}
+	err := c.BindJSON(param)
+	if err != nil {
+		logrus.Errorf("Request bind err:%+v\n", err)
+		returnError(c, 40000, "参数错误")
+		return
+	}
+	result, err := service.ViewDataService{}.SelectionDataDetail(param)
+	if err != nil {
+		logrus.Errorf("[SelectionDataDetail] call Show err:%+v\n", err)
+		returnError(c, 40000, err.Error())
+		return
+	}
+	resultMap := make(map[string]vo.ReSelectionData)
+	resultMap["dataInfo"] = result
+	returnSuccess(c, 20000, resultMap)
 }

+ 210 - 0
app/service/view_data_service.go

@@ -0,0 +1,210 @@
+package service
+
+import (
+	"fmt"
+	"math/rand"
+	"time"
+	"youngee_b_api/app/vo"
+)
+
+type ViewDataService struct{}
+
+func (v ViewDataService) SelectionTalentDataDetail(param *vo.SelectionShowDataParam) (vo.ReSelectionTalentData, error) {
+	// 设置随机种子
+	rand.Seed(time.Now().UnixNano())
+
+	// 随机生成 AddWindowNum 列表
+	var rangeLength int64
+	if param.Type == 1 {
+		rangeLength = 7
+	} else if param.Type == 2 {
+		rangeLength = 30
+	} else {
+		rangeLength = 90
+	}
+	addWindowNum := make([]int64, rangeLength)
+	for i := range addWindowNum {
+		addWindowNum[i] = rand.Int63n(1000) // 随机生成0-999的数
+	}
+
+	// 随机生成 SalesDistribution 和 FansDistribution 列表
+	salesDistribution := []int64{
+		rand.Int63n(1000),
+		rand.Int63n(500),
+		rand.Int63n(100),
+		rand.Int63n(50),
+		rand.Int63n(10),
+		rand.Int63n(5),
+	}
+	fansDistribution := []int64{
+		rand.Int63n(1000),
+		rand.Int63n(20),
+		rand.Int63n(5),
+		rand.Int63n(3),
+	}
+
+	// 随机生成 RegionRank 列表
+	regions := []string{"广东", "广西", "海南", "湖南", "浙江", "福建", "河南", "江苏", "四川", "江西"}
+	regionRank := make([]vo.RankItem, len(regions))
+	totalPercent := 0.0
+	for i := 0; i < len(regions)-1; i++ {
+		percent := rand.Float64() * (1 - totalPercent) / 2 // 确保生成的总和小于 1
+		totalPercent += percent
+		regionRank[i] = vo.RankItem{
+			Region:  regions[i],
+			Percent: percent,
+		}
+	}
+	// 最后一个元素的 Percent 设置为 1 - totalPercent,确保总和小于 1
+	regionRank[len(regions)-1] = vo.RankItem{
+		Region:  regions[len(regions)-1],
+		Percent: 1 - totalPercent,
+	}
+
+	reSelectionTalentData := vo.ReSelectionTalentData{
+		AddWindowNum:      addWindowNum,
+		AvgFanNum:         rand.Int63n(10000), // 平均粉丝数
+		SalesDistribution: salesDistribution,
+		FansDistribution:  fansDistribution,
+		MaleNum:           rand.Int63n(500), // 随机生成男性人数
+		FemaleNum:         rand.Int63n(500), // 随机生成女性人数
+		RegionRank:        regionRank,
+	}
+
+	return reSelectionTalentData, nil
+}
+
+func (v ViewDataService) SelectionSampleDataDetail(param *vo.SelectionShowDataParam) (vo.ReSelectionSampleData, error) {
+	// 设置随机种子
+	rand.Seed(time.Now().UnixNano())
+
+	// 随机生成 AddWindowNum 列表
+	var rangeLength int64
+	if param.Type == 1 {
+		rangeLength = 7
+	} else if param.Type == 2 {
+		rangeLength = 30
+	} else {
+		rangeLength = 90
+	}
+	enrollNum := make([]int64, rangeLength)
+	for i := range enrollNum {
+		enrollNum[i] = rand.Int63n(1000) // 随机生成0-999的数
+	}
+
+	// 随机生成 SalesDistribution 和 FansDistribution 列表
+	salesDistribution := []int64{
+		rand.Int63n(1000),
+		rand.Int63n(500),
+		rand.Int63n(100),
+		rand.Int63n(50),
+		rand.Int63n(10),
+		rand.Int63n(5),
+	}
+	fansDistribution := []int64{
+		rand.Int63n(1000),
+		rand.Int63n(20),
+		rand.Int63n(5),
+		rand.Int63n(3),
+	}
+
+	// 随机生成 RegionRank 列表
+	regions := []string{"广东", "广西", "海南", "湖南", "浙江", "福建", "河南", "江苏", "四川", "江西"}
+	regionRank := make([]vo.RankItem, len(regions))
+	totalPercent := 0.0
+	for i := 0; i < len(regions)-1; i++ {
+		percent := rand.Float64() * (1 - totalPercent) / 2 // 确保生成的总和小于 1
+		totalPercent += percent
+		regionRank[i] = vo.RankItem{
+			Region:  regions[i],
+			Percent: percent,
+		}
+	}
+	// 最后一个元素的 Percent 设置为 1 - totalPercent,确保总和小于 1
+	regionRank[len(regions)-1] = vo.RankItem{
+		Region:  regions[len(regions)-1],
+		Percent: 1 - totalPercent,
+	}
+
+	reSelectionTalentData := vo.ReSelectionSampleData{
+		EnrollNum:         enrollNum,
+		AgreeSampleNum:    rand.Int63n(10000),
+		SampledNum:        rand.Int63n(1000),
+		AvgFanNum:         rand.Int63n(10000),
+		SalesDistribution: salesDistribution,
+		FansDistribution:  fansDistribution,
+		MaleNum:           rand.Int63n(500), // 随机生成男性人数
+		FemaleNum:         rand.Int63n(500), // 随机生成女性人数
+		RegionRank:        regionRank,
+	}
+
+	return reSelectionTalentData, nil
+}
+
+func (v ViewDataService) SelectionDataDetail(param *vo.SelectionShowDataParam) (vo.ReSelectionData, error) {
+	// 设置随机种子
+	rand.Seed(time.Now().UnixNano())
+
+	// 随机生成 AddWindowNum 列表
+	var rangeLength int64
+	if param.Type == 1 {
+		rangeLength = 7
+	} else if param.Type == 2 {
+		rangeLength = 30
+	} else {
+		rangeLength = 90
+	}
+	payData := make([]float64, rangeLength)
+	for i := range payData {
+		payData[i] = rand.Float64() * 10000
+	}
+	estimateData := make([]float64, rangeLength)
+	for i := range estimateData {
+		estimateData[i] = rand.Float64() * 10000
+	}
+	payOrderNum := make([]int64, rangeLength)
+	for i := range payOrderNum {
+		payOrderNum[i] = rand.Int63n(1000)
+	}
+	saleOrderNum := make([]int64, rangeLength)
+	for i := range saleOrderNum {
+		saleOrderNum[i] = rand.Int63n(1000)
+	}
+
+	// 随机生成 TalentMsgList 数据
+	totalTalents := rand.Int63n(100) // 假设总共有100个达人
+	talentMsgList := make([]vo.TalentMsg, 0, param.PageSize)
+	start := (param.Page - 1) * param.PageSize
+	end := start + param.PageSize
+	if end > totalTalents {
+		end = totalTalents
+	}
+
+	for i := start; i < end; i++ {
+		talentMsgList = append(talentMsgList, vo.TalentMsg{
+			PhotoUrl: fmt.Sprintf("https://example.com/photo/%d.jpg", i),
+			Nickname: fmt.Sprintf("达人%d", i),
+			Account:  fmt.Sprintf("account_%d", i),
+			OrderNum: rand.Int63n(100),
+			GMV:      rand.Float64() * 10000,
+		})
+	}
+	resultVO := vo.ResultVO{
+		Page:     int(param.Page),
+		PageSize: int(param.PageSize),
+		Total:    totalTalents,
+		Data:     talentMsgList,
+	}
+
+	reSelectionData := vo.ReSelectionData{
+		PayData:            payData,
+		EstimateData:       estimateData,
+		ForecastCommission: rand.Float64() * 100000,
+		PayOrderNum:        payOrderNum,
+		SaleOrderNum:       saleOrderNum,
+		AvgCommissionRate:  rand.Float64(),
+		TalentMsgList:      resultVO,
+	}
+
+	return reSelectionData, nil
+}

+ 31 - 24
app/vo/re_selection_data.go

@@ -1,36 +1,43 @@
 package vo
 
+// 看数据-达人数据
 type ReSelectionTalentData struct {
-	AddWindowNum      []int64 `json:"addWindowNum"`      // 添加橱窗达人数
-	AvgFanNum         int64   `json:"avgFanNum"`         // 平均粉丝数
-	SalesDistribution []int64 `json:"salesDistribution"` // 领样达人销量分布[100-, 100-1000, 1000-5000, 5000-1w, 1w-10w, 10w+]
-	FansDistribution  []int64 `json:"fansDistribution"`  // 达人粉丝数分布[1w-, 1w-10w, 10w-100w, 100w+]
-	MaleNum           int64   `json:"maleNum"`
-	FemaleNum         int64   `json:"femaleNum"`
-	// 达人地区分布(没有该数据
+	AddWindowNum      []int64    `json:"addWindowNum"`      // 添加橱窗达人数
+	AvgFanNum         int64      `json:"avgFanNum"`         // 平均粉丝数
+	SalesDistribution []int64    `json:"salesDistribution"` // 领样达人销量分布[100-, 100-1000, 1000-5000, 5000-1w, 1w-10w, 10w+]
+	FansDistribution  []int64    `json:"fansDistribution"`  // 达人粉丝数分布[1w-, 1w-10w, 10w-100w, 100w+]
+	MaleNum           int64      `json:"maleNum"`
+	FemaleNum         int64      `json:"femaleNum"`
+	RegionRank        []RankItem `json:"regionRank"` // 达人地区分布(top10
 }
 
+type RankItem struct {
+	Region  string  `json:"region"`
+	Percent float64 `json:"percent"`
+}
+
+// 看数据-领样数据
 type ReSelectionSampleData struct {
-	EnrollNum         []int64 `json:"enrollNum"`         // 报名人数
-	AgreeSampleNum    int64   `json:"agreeSampleNum"`    // 同意寄样数
-	SampledNum        int64   `json:"sampledNum"`        // 已发样数
-	AvgFanNum         int64   `json:"avgFanNum"`         // 平均粉丝数
-	SalesDistribution []int64 `json:"salesDistribution"` // 达人销量分布[100-, 100-1000, 1000-5000, 5000-1w, 1w-10w, 10w+]
-	FansDistribution  []int64 `json:"fansDistribution"`  // 达人粉丝数分布[1w-, 1w-10w, 10w-100w, 100w+]
-	MaleNum           int64   `json:"maleNum"`
-	FemaleNum         int64   `json:"femaleNum"`
-	// 达人地区分布(没有该数据
+	EnrollNum         []int64    `json:"enrollNum"`         // 报名人数
+	AgreeSampleNum    int64      `json:"agreeSampleNum"`    // 同意寄样数
+	SampledNum        int64      `json:"sampledNum"`        // 已发样数
+	AvgFanNum         int64      `json:"avgFanNum"`         // 平均粉丝数
+	SalesDistribution []int64    `json:"salesDistribution"` // 领样达人销量分布[100-, 100-1000, 1000-5000, 5000-1w, 1w-10w, 10w+]
+	FansDistribution  []int64    `json:"fansDistribution"`  // 达人粉丝数分布[1w-, 1w-10w, 10w-100w, 100w+]
+	MaleNum           int64      `json:"maleNum"`
+	FemaleNum         int64      `json:"femaleNum"`
+	RegionRank        []RankItem `json:"regionRank"` // 达人地区分布(top10
 }
 
+// 看数据-带货数据
 type ReSelectionData struct {
-	EnrollNum          []int64     `json:"enrollNum"`         // 报名人数
-	PayData            []int64     `json:"payData"`           // 支付GMV
-	EstimateData       []int64     `json:"estimateData"`      // 结算GMV
-	ForecastCommission int64       `json:"forecastData"`      // 预估佣金支出
-	PayOrderNum        []int64     `json:"payOrderNum"`       // 支付订单量
-	SaleOrderNum       []int64     `json:"saleOrderNum"`      // 出单达人合计
-	AvgCommissionRate  float64     `json:"avgCommissionRate"` // 平均佣金率
-	TalentMsgList      []TalentMsg `json:"talentMsgList"`
+	PayData            []float64 `json:"payData"`           // 支付GMV
+	EstimateData       []float64 `json:"estimateData"`      // 结算GMV
+	ForecastCommission float64   `json:"forecastData"`      // 预估佣金支出
+	PayOrderNum        []int64   `json:"payOrderNum"`       // 支付订单量
+	SaleOrderNum       []int64   `json:"saleOrderNum"`      // 出单达人合计
+	AvgCommissionRate  float64   `json:"avgCommissionRate"` // 平均佣金率
+	TalentMsgList      ResultVO  `json:"talentMsgList"`     // 出单情况的达人信息
 }
 
 type TalentMsg struct {

+ 10 - 0
app/vo/selection_show_data_param.go

@@ -0,0 +1,10 @@
+package vo
+
+type SelectionShowDataParam struct {
+	SelectionId  string `json:"selection_id"`
+	EnterpriseId string `json:"enterprise_id"`
+	SubAccountId int64  `json:"sub_account_id"`
+	Type         int64  `json:"type"` // 1近七天 2近30天 3近90天 4自然月
+	Page         int64  `json:"page"`
+	PageSize     int64  `json:"page_size"`
+}

+ 10 - 8
route/init.go

@@ -197,14 +197,16 @@ func InitRoute(r *gin.Engine) {
 		task.POST("/product/findAll", controller.TaskController{}.GetAllProduct) // 关联商品-已有商品展示
 		task.POST("/product/create", controller.TaskController{}.CreateProduct)  // 关联商品-新建商品
 
-		task.POST("/selection/create", controller.TaskController{}.CreateSelection)       // 创建带货任务
-		task.POST("/selection/update", controller.TaskController{}.UpdateSelection)       // 更新带货任务(样品奖励、补充信息)
-		task.POST("/selection/detail", controller.TaskController{}.GetSelectionDetail)    // 电商带货任务预览
-		task.POST("/selection/toReview", controller.TaskController{}.SelectionToReview)   // 电商带货提交审核
-		task.POST("/selection/task/list", controller.TaskController{}.SelectionTaskList)  // 电商带货任务列表
-		task.POST("/selection/del", controller.TaskController{}.SelectionDel)             // 删除带货任务
-		task.POST("/selection/check", controller.TaskController{}.CheckSelectionInfo)     // 电商带货任务审核
-		task.POST("/selection/data/talent", controller.TaskController{}.TalentDataDetail) // 电商带货看数据-达人数据
+		task.POST("/selection/create", controller.TaskController{}.CreateSelection)             // 创建带货任务
+		task.POST("/selection/update", controller.TaskController{}.UpdateSelection)             // 更新带货任务(样品奖励、补充信息)
+		task.POST("/selection/detail", controller.TaskController{}.GetSelectionDetail)          // 电商带货任务预览
+		task.POST("/selection/toReview", controller.TaskController{}.SelectionToReview)         // 电商带货提交审核
+		task.POST("/selection/task/list", controller.TaskController{}.SelectionTaskList)        // 电商带货任务列表
+		task.POST("/selection/del", controller.TaskController{}.SelectionDel)                   // 删除带货任务
+		task.POST("/selection/check", controller.TaskController{}.CheckSelectionInfo)           // 电商带货任务审核
+		task.POST("/selection/data/talent", controller.TaskController{}.TalentDataDetail)       // 电商带货看数据-达人数据
+		task.POST("/selection/data/sample", controller.TaskController{}.SampleDataDetail)       // 电商带货看数据-领样数据
+		task.POST("/selection/data/selection", controller.TaskController{}.SelectionDataDetail) // 电商带货看数据-带货数据
 
 		task.POST("/project/create", controller.TaskController{}.CreateProject)              // 创建种草任务
 		task.POST("/project/update", controller.TaskController{}.UpdateProject)              // 更新公开种草任务