From 2f382db28d110707acd27b3ba47a7f6be658063b Mon Sep 17 00:00:00 2001 From: chenlin Date: Tue, 22 Oct 2024 16:22:38 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E9=A6=96=E9=A1=B5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=EF=BC=9B=202.?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E6=B1=87=E6=80=BB=E5=92=8C=E5=AE=9E=E6=97=B6?= =?UTF-8?q?=E6=B1=87=E6=80=BB=E5=A2=9E=E5=8A=A0=E9=80=80=E8=AE=A2=E7=8E=87?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/migumanage/migu_admin.go | 162 +++++++++++++++++++++++- app/admin/models/migu.go | 62 +++++++-- app/admin/router/migu.go | 1 + docs/admin/admin_docs.go | 158 ++++++++++++++++++++++- docs/admin/admin_swagger.json | 154 +++++++++++++++++++++- docs/admin/admin_swagger.yaml | 107 +++++++++++++++- 6 files changed, 620 insertions(+), 24 deletions(-) diff --git a/app/admin/apis/migumanage/migu_admin.go b/app/admin/apis/migumanage/migu_admin.go index 9e2510d..260a7c4 100644 --- a/app/admin/apis/migumanage/migu_admin.go +++ b/app/admin/apis/migumanage/migu_admin.go @@ -397,7 +397,11 @@ func (e MiGuDeployService) HistoricalSummaryList(c *gin.Context) { AND DATE(created_at) = DATE(mg_order.subscribe_time)) AS submission_count, COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) AS new_user_unsub_within_hour, COUNT(CASE WHEN mg_order.state = 2 THEN 1 END) AS new_user_unsub_on_day, - COUNT(*) AS new_user_count`). + COUNT(*) AS new_user_count, + CONCAT(ROUND(COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) * 100.0 / + NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_within_hour_rate, + CONCAT(ROUND(COUNT(CASE WHEN mg_order.state = 2 THEN 1 END) * 100.0 / + NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate`). Where("mg_order.subscribe_time >= ? AND mg_order.subscribe_time <= ?", startTime, endTime). Group("DATE(mg_order.subscribe_time), mg_order.product_id, mg_order.channel_code"). Order("mg_order.product_id, mg_order.channel_code, mg_order.subscribe_time"). @@ -496,8 +500,12 @@ func (e MiGuDeployService) RealtimeSummaryList(c *gin.Context) { AND created_at <= ?) AS submission_count, COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) AS new_user_unsub_within_hour, COUNT(CASE WHEN mg_order.state = 2 THEN 1 END) AS new_user_unsub_on_day, - COUNT(CASE WHEN mg_order.created_at >= ? AND mg_order.created_at <= ? THEN 1 END) AS new_user_count`, - startDate, endDate, startDate, endDate). + COUNT(CASE WHEN mg_order.created_at >= ? AND mg_order.created_at <= ? THEN 1 END) AS new_user_count, + CONCAT(ROUND(COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) * 100.0 / + NULLIF(COUNT(CASE WHEN mg_order.created_at >= ? AND mg_order.created_at <= ? THEN 1 END), 0), 2), '%') AS new_user_unsub_within_hour_rate, + CONCAT(ROUND(COUNT(CASE WHEN mg_order.state = 2 THEN 1 END) * 100.0 / + NULLIF(COUNT(CASE WHEN mg_order.created_at >= ? AND mg_order.created_at <= ? THEN 1 END), 0), 2), '%') AS new_user_unsub_on_day_rate`, + startDate, endDate, startDate, endDate, startDate, endDate, startDate, endDate). Where("mg_order.created_at >= ? AND mg_order.created_at <= ?", startDate, endDate). Group("product_id, channel_code"). Order("product_id, channel_code"). @@ -594,16 +602,32 @@ func (e MiGuDeployService) UserRetentionList(c *gin.Context) { var retentionList []models.MgUserRetention // 查询用户留存数据 - err = e.Orm.Model(&models.MgOrder{}). + qs := e.Orm.Model(&models.MgOrder{}). Select(`DATE_FORMAT(created_at, '%Y-%m') AS retention_month, COUNT(DISTINCT phone_number) AS new_user_count, COUNT(DISTINCT CASE WHEN state != 2 THEN phone_number END) AS retained_user_count, channel_code, product_id, IFNULL(FORMAT(COUNT(DISTINCT CASE WHEN state != 2 THEN phone_number END) / NULLIF(COUNT(DISTINCT phone_number), 0) * 100, 2), 0) AS retention_rate`). - Where("created_at >= ? AND created_at <= ?", startDate, endDate). - Group("retention_month, channel_code, product_id"). + Where("created_at >= ? AND created_at <= ?", startDate, endDate) + + // 处理产品编号 (SkuCode) 过滤条件 + if req.SkuCode != "" { + qs = qs.Where("product_id = ?", req.SkuCode) + } + + // 处理渠道名称 (Channel) 过滤条件 + if req.Channel != "" { + qs = qs.Where("channel_code = ?", req.Channel) + } + + err = qs.Group("retention_month, channel_code, product_id"). Order("retention_month"). Find(&retentionList).Error + if err != nil { + logger.Errorf("DailyData query err: %#v", err) + response.Error(c, http.StatusInternalServerError, err, "查询失败") + return + } if err != nil { e.Logger.Errorf("UserRetentionList query error: %#v", err) @@ -737,6 +761,132 @@ func (e MiGuDeployService) SysChannelList(c *gin.Context) { e.OK(resp, "") } +// HomepageDataSummary 查询首页汇总数据 +// @Summary 查询首页汇总数据 +// @Tags 2024-咪咕-管理后台 +// @Produce json +// @Accept json +// @Param request body models.HomepageDataSummaryReq true "查询首页汇总数据" +// @Success 200 {object} models.HomepageDataSummaryResp +// @Router /api/v1/admin/home/data [post] +func (e MiGuDeployService) HomepageDataSummary(c *gin.Context) { + fmt.Println("HomepageDataSummary") + err := e.MakeContext(c).MakeOrm().Errors + if err != nil { + fmt.Println("MakeContext err:", err) + e.Logger.Error(err) + return + } + + // 请求参数绑定 + req := &models.HomepageDataSummaryReq{} + if c.ShouldBindJSON(req) != nil { + logger.Errorf("para err") + response.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") + return + } + + resp := models.HomepageDataSummaryResp{} + var summaryData models.SummaryData + + // 设置开始时间和结束时间 + startTime := req.StartTime + endTime := req.EndTime + if startTime == "" { + startTime = "1970-01-01 00:00:00" + } + if endTime == "" { + endTime = time.Now().Format("2006-01-02 15:04:05") + } + + // 查询汇总数据 + qs := e.Orm.Model(&models.MgOrder{}). + Select(`COUNT(*) AS total_user_count, + COUNT(CASE WHEN state = 2 THEN 1 END) AS unsubscribed_user_count, + COUNT(CASE WHEN is_one_hour_cancel = 1 THEN 1 END) AS one_hour_unsubscribed_user_count`). + Where("subscribe_time >= ? AND subscribe_time <= ?", startTime, endTime) + + // 添加产品和渠道的过滤条件 + if req.SkuCode != "" { + qs = qs.Where("product_id = ?", req.SkuCode) + } + if req.Channel != "" { + qs = qs.Where("channel_code = ?", req.Channel) + } + + err = qs.Find(&summaryData).Error + if err != nil { + logger.Errorf("HomepageDataSummary query err: %#v", err) + response.Error(c, http.StatusInternalServerError, err, "查询失败") + return + } + + // 计算留存用户数 + summaryData.RetainedUserCount = summaryData.TotalUserCount - summaryData.UnsubscribedUserCount + + // 计算留存率 + if summaryData.TotalUserCount > 0 { + summaryData.RetentionRate = fmt.Sprintf("%.2f%%", float64(summaryData.RetainedUserCount)*100.0/float64(summaryData.TotalUserCount)) + } else { + summaryData.RetentionRate = "0.00%" + } + + // 计算退订率 + if summaryData.TotalUserCount > 0 { + summaryData.UnsubscribeRate = fmt.Sprintf("%.2f%%", float64(summaryData.UnsubscribedUserCount)*100.0/float64(summaryData.TotalUserCount)) + summaryData.OneHourUnsubscribeRate = fmt.Sprintf("%.2f%%", float64(summaryData.OneHourUnsubscribedUserCount)*100.0/float64(summaryData.TotalUserCount)) + } else { + summaryData.UnsubscribeRate = "0.00%" + summaryData.OneHourUnsubscribeRate = "0.00%" + } + + resp.Summary = summaryData + + // 查询每日数据 + var dailyDataList []models.DailyData + dailyQuery := e.Orm.Model(&models.MgOrder{}). + Select(`DATE(subscribe_time) AS date, + COUNT(*) AS new_user_count, + COUNT(CASE WHEN state = 2 THEN 1 END) AS unsubscribed_user_count, + COUNT(CASE WHEN is_one_hour_cancel = 1 THEN 1 END) AS unsubscribed_within_one_hour`). + Where("subscribe_time >= ? AND subscribe_time <= ?", startTime, endTime) + + // 处理产品编号 (SkuCode) 过滤条件 + if req.SkuCode != "" { + dailyQuery = dailyQuery.Where("product_id = ?", req.SkuCode) + } + + // 处理渠道名称 (Channel) 过滤条件 + if req.Channel != "" { + dailyQuery = dailyQuery.Where("channel_code = ?", req.Channel) + } + + err = dailyQuery.Group("DATE(subscribe_time)"). + Order("DATE(subscribe_time)"). + Find(&dailyDataList).Error + if err != nil { + logger.Errorf("DailyData query err: %#v", err) + response.Error(c, http.StatusInternalServerError, err, "查询失败") + return + } + + // 计算每日退订率 + for i := range dailyDataList { + if dailyDataList[i].NewUserCount > 0 { + dailyDataList[i].UnsubscribeRate = fmt.Sprintf("%.2f%%", float64(dailyDataList[i].UnsubscribedUserCount)*100.0/float64(dailyDataList[i].NewUserCount)) + dailyDataList[i].UnsubscribeWithinOneHourRate = fmt.Sprintf("%.2f%%", float64(dailyDataList[i].UnsubscribedWithinOneHour)*100.0/float64(dailyDataList[i].NewUserCount)) + } else { + dailyDataList[i].UnsubscribeRate = "0.00%" + dailyDataList[i].UnsubscribeWithinOneHourRate = "0.00%" + } + } + + resp.DailyDataList = dailyDataList + + // 返回结果 + e.OK(resp, "") +} + // AddChannel 新增渠道 // @Summary 新增渠道 // @Tags 2024-咪咕-管理后台 diff --git a/app/admin/models/migu.go b/app/admin/models/migu.go index 37ef86d..1f28e57 100644 --- a/app/admin/models/migu.go +++ b/app/admin/models/migu.go @@ -79,24 +79,28 @@ type MgChannel struct { // MgHistoricalSummary 历史汇总查询表对应的结构体 type MgHistoricalSummary struct { - Date string `gorm:"type:date" json:"date"` // 日期 - ProductID int64 `json:"product_id"` // 产品ID - ChannelCode string `gorm:"size:255" json:"channel_code"` // 渠道编码 - SubmissionCount int `json:"submission_count"` // 提交数 - NewUserCount int `json:"new_user_count"` // 新用户数 - NewUserUnsubWithinHour int `json:"new_user_unsub_within_hour"` // 当日新用户退订数(1小时以内) - NewUserUnsubOnDay int `json:"new_user_unsub_on_day"` // 当日新用户退订数 + Date string `gorm:"type:date" json:"date"` // 日期 + ProductID int64 `json:"product_id"` // 产品ID + ChannelCode string `gorm:"size:255" json:"channel_code"` // 渠道编码 + SubmissionCount int `json:"submission_count"` // 提交数 + NewUserCount int `json:"new_user_count"` // 新用户数 + NewUserUnsubWithinHour int `json:"new_user_unsub_within_hour"` // 当日新用户退订数(1小时以内) + NewUserUnsubWithinHourRate string `json:"new_user_unsub_within_hour_rate"` // 当日新用户退订率(1小时以内) + NewUserUnsubOnDay int `json:"new_user_unsub_on_day"` // 当日新用户退订数 + NewUserUnsubOnDayRate string `json:"new_user_unsub_on_day_rate"` // 当日新用户退订率 //Province string `gorm:"size:255" json:"province"` // 省份 } // MgRealtimeSummary 当日实时汇总表对应的结构体 type MgRealtimeSummary struct { - ProductID int64 `json:"product_id"` // 产品ID - ChannelCode string `json:"channel_code"` // 渠道编码 - SubmissionCount int `json:"submission_count"` // 提交数 - NewUserCount int `json:"new_user_count"` // 新用户数 - NewUserUnsubWithinHour int `json:"new_user_unsub_within_hour"` // 当日新用户退订数(1小时以内) - NewUserUnsubOnDay int `json:"new_user_unsub_on_day"` // 当日新用户退订数 + ProductID int64 `json:"product_id"` // 产品ID + ChannelCode string `json:"channel_code"` // 渠道编码 + SubmissionCount int `json:"submission_count"` // 提交数 + NewUserCount int `json:"new_user_count"` // 新用户数 + NewUserUnsubWithinHour int `json:"new_user_unsub_within_hour"` // 当日新用户退订数(1小时以内) + NewUserUnsubWithinHourRate string `json:"new_user_unsub_within_hour_rate"` // 当日新用户退订率(1小时以内) + NewUserUnsubOnDay int `json:"new_user_unsub_on_day"` // 当日新用户退订数 + NewUserUnsubOnDayRate string `json:"new_user_unsub_on_day_rate"` // 当日新用户退订率 //Province string `json:"province"` // 省份 } @@ -485,6 +489,38 @@ type DeleteChannelResp struct { // Any relevant response fields can go here } +type HomepageDataSummaryReq struct { + StartTime string `json:"start_time"` // 查询开始时间 + EndTime string `json:"end_time"` // 查询结束时间 + SkuCode string `json:"sku_code"` // 产品编号 + Channel string `json:"channel"` // 渠道名称 +} + +type DailyData struct { + Date string `json:"date"` // 日期 + NewUserCount int64 `json:"new_user_count"` // 新增用户数 + UnsubscribedUserCount int64 `json:"unsubscribed_user_count"` // 退订用户数 + UnsubscribedWithinOneHour int64 `json:"unsubscribed_within_one_hour"` // 1小时内退订用户数 + UnsubscribeRate string `json:"unsubscribe_rate"` // 退订率 + UnsubscribeWithinOneHourRate string `json:"unsubscribe_within_one_hour_rate"` // 1小时内退订率 +} + +type HomepageDataSummaryResp struct { + Summary SummaryData `json:"summary"` // 汇总数据 + DailyDataList []DailyData `json:"daily_data"` // 每天的数据列表 +} + +// SummaryData represents the overall summary data +type SummaryData struct { + TotalUserCount int `json:"total_user_count"` // 总用户数 + UnsubscribedUserCount int `json:"unsubscribed_user_count"` // 退订用户数 + OneHourUnsubscribedUserCount int `json:"one_hour_unsubscribed_user_count"` // 1小时内退订用户数 + RetainedUserCount int `json:"retained_user_count"` // 留存用户数 + UnsubscribeRate string `json:"unsubscribe_rate"` // 退订率 (字符串,保留两位小数,如 "26.35%") + OneHourUnsubscribeRate string `json:"one_hour_unsubscribe_rate"` // 1小时退订率 (字符串,保留两位小数,如 "26.35%") + RetentionRate string `json:"retention_rate"` // 留存率 (字符串,保留两位小数,如 "73.65%") +} + // MiGuCaptchaRequest 调用下单接口(森越转发) func MiGuCaptchaRequest(r *MiGuSendCaptchaReq) (MiGuRsp, error) { var miGuResp MiGuRsp diff --git a/app/admin/router/migu.go b/app/admin/router/migu.go index dbcd4a1..79db8c9 100644 --- a/app/admin/router/migu.go +++ b/app/admin/router/migu.go @@ -27,6 +27,7 @@ func registerMiGuControlManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.Gi api.POST("realtime_summary/list", apiMiGu.RealtimeSummaryList) // 当日实时汇总 api.POST("user_retention/list", apiMiGu.UserRetentionList) // 用户留存记录 api.POST("sys_channel/list", apiMiGu.SysChannelList) // 查询系统所有渠道编码 + api.POST("home/data", apiMiGu.HomepageDataSummary) // 查询首页汇总数据 } } diff --git a/docs/admin/admin_docs.go b/docs/admin/admin_docs.go index 2908671..d4b73f4 100644 --- a/docs/admin/admin_docs.go +++ b/docs/admin/admin_docs.go @@ -118,6 +118,39 @@ const docTemplateadmin = `{ } } }, + "/api/v1/admin/home/data": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "2024-咪咕-管理后台" + ], + "summary": "查询首页汇总数据", + "parameters": [ + { + "description": "查询首页汇总数据", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.HomepageDataSummaryReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.HomepageDataSummaryResp" + } + } + } + } + }, "/api/v1/admin/order/list": { "post": { "consumes": [ @@ -4738,7 +4771,7 @@ const docTemplateadmin = `{ "type": "string" }, "status": { - "description": "状态 (0: 停用, 1: 启用) (必填)", + "description": "状态 (2: 停用, 1: 启用) (必填)", "type": "integer" }, "sub_channel_code": { @@ -4899,6 +4932,35 @@ const docTemplateadmin = `{ } } }, + "models.DailyData": { + "type": "object", + "properties": { + "date": { + "description": "日期", + "type": "string" + }, + "new_user_count": { + "description": "新增用户数", + "type": "integer" + }, + "unsubscribe_rate": { + "description": "退订率", + "type": "string" + }, + "unsubscribe_within_one_hour_rate": { + "description": "1小时内退订率", + "type": "string" + }, + "unsubscribed_user_count": { + "description": "退订用户数", + "type": "integer" + }, + "unsubscribed_within_one_hour": { + "description": "1小时内退订用户数", + "type": "integer" + } + } + }, "models.HistoricalSummaryListReq": { "type": "object", "properties": { @@ -4948,6 +5010,47 @@ const docTemplateadmin = `{ } } }, + "models.HomepageDataSummaryReq": { + "type": "object", + "properties": { + "channel": { + "description": "渠道名称", + "type": "string" + }, + "end_time": { + "description": "查询结束时间", + "type": "string" + }, + "sku_code": { + "description": "产品编号", + "type": "string" + }, + "start_time": { + "description": "查询开始时间", + "type": "string" + } + } + }, + "models.HomepageDataSummaryResp": { + "type": "object", + "properties": { + "daily_data": { + "description": "每天的数据列表", + "type": "array", + "items": { + "$ref": "#/definitions/models.DailyData" + } + }, + "summary": { + "description": "汇总数据", + "allOf": [ + { + "$ref": "#/definitions/models.SummaryData" + } + ] + } + } + }, "models.MgChannel": { "type": "object", "properties": { @@ -5006,10 +5109,18 @@ const docTemplateadmin = `{ "description": "当日新用户退订数", "type": "integer" }, + "new_user_unsub_on_day_rate": { + "description": "当日新用户退订率", + "type": "string" + }, "new_user_unsub_within_hour": { "description": "当日新用户退订数(1小时以内)", "type": "integer" }, + "new_user_unsub_within_hour_rate": { + "description": "当日新用户退订率(1小时以内)", + "type": "string" + }, "product_id": { "description": "产品ID", "type": "integer" @@ -5133,10 +5244,18 @@ const docTemplateadmin = `{ "description": "当日新用户退订数", "type": "integer" }, + "new_user_unsub_on_day_rate": { + "description": "当日新用户退订率", + "type": "string" + }, "new_user_unsub_within_hour": { "description": "当日新用户退订数(1小时以内)", "type": "integer" }, + "new_user_unsub_within_hour_rate": { + "description": "当日新用户退订率(1小时以内)", + "type": "string" + }, "product_id": { "description": "产品ID", "type": "integer" @@ -5689,6 +5808,39 @@ const docTemplateadmin = `{ } } }, + "models.SummaryData": { + "type": "object", + "properties": { + "one_hour_unsubscribe_rate": { + "description": "1小时退订率 (字符串,保留两位小数,如 \"26.35%\")", + "type": "string" + }, + "one_hour_unsubscribed_user_count": { + "description": "1小时内退订用户数", + "type": "integer" + }, + "retained_user_count": { + "description": "留存用户数", + "type": "integer" + }, + "retention_rate": { + "description": "留存率 (字符串,保留两位小数,如 \"73.65%\")", + "type": "string" + }, + "total_user_count": { + "description": "总用户数", + "type": "integer" + }, + "unsubscribe_rate": { + "description": "退订率 (字符串,保留两位小数,如 \"26.35%\")", + "type": "string" + }, + "unsubscribed_user_count": { + "description": "退订用户数", + "type": "integer" + } + } + }, "models.SysChannelListReq": { "type": "object", "properties": { @@ -6144,8 +6296,8 @@ var SwaggerInfoadmin = &swag.Spec{ Description: "基于Gin + Vue + Element UI的前后端分离权限管理系统的接口文档\n添加qq群: 521386980 进入技术交流群 请先star,谢谢!", InfoInstanceName: "admin", SwaggerTemplate: docTemplateadmin, - //LeftDelim: "{{", - //RightDelim: "}}", + LeftDelim: "{{", + RightDelim: "}}", } func init() { diff --git a/docs/admin/admin_swagger.json b/docs/admin/admin_swagger.json index fe5e1b2..b1eb8c3 100644 --- a/docs/admin/admin_swagger.json +++ b/docs/admin/admin_swagger.json @@ -110,6 +110,39 @@ } } }, + "/api/v1/admin/home/data": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "2024-咪咕-管理后台" + ], + "summary": "查询首页汇总数据", + "parameters": [ + { + "description": "查询首页汇总数据", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.HomepageDataSummaryReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.HomepageDataSummaryResp" + } + } + } + } + }, "/api/v1/admin/order/list": { "post": { "consumes": [ @@ -4730,7 +4763,7 @@ "type": "string" }, "status": { - "description": "状态 (0: 停用, 1: 启用) (必填)", + "description": "状态 (2: 停用, 1: 启用) (必填)", "type": "integer" }, "sub_channel_code": { @@ -4891,6 +4924,35 @@ } } }, + "models.DailyData": { + "type": "object", + "properties": { + "date": { + "description": "日期", + "type": "string" + }, + "new_user_count": { + "description": "新增用户数", + "type": "integer" + }, + "unsubscribe_rate": { + "description": "退订率", + "type": "string" + }, + "unsubscribe_within_one_hour_rate": { + "description": "1小时内退订率", + "type": "string" + }, + "unsubscribed_user_count": { + "description": "退订用户数", + "type": "integer" + }, + "unsubscribed_within_one_hour": { + "description": "1小时内退订用户数", + "type": "integer" + } + } + }, "models.HistoricalSummaryListReq": { "type": "object", "properties": { @@ -4940,6 +5002,47 @@ } } }, + "models.HomepageDataSummaryReq": { + "type": "object", + "properties": { + "channel": { + "description": "渠道名称", + "type": "string" + }, + "end_time": { + "description": "查询结束时间", + "type": "string" + }, + "sku_code": { + "description": "产品编号", + "type": "string" + }, + "start_time": { + "description": "查询开始时间", + "type": "string" + } + } + }, + "models.HomepageDataSummaryResp": { + "type": "object", + "properties": { + "daily_data": { + "description": "每天的数据列表", + "type": "array", + "items": { + "$ref": "#/definitions/models.DailyData" + } + }, + "summary": { + "description": "汇总数据", + "allOf": [ + { + "$ref": "#/definitions/models.SummaryData" + } + ] + } + } + }, "models.MgChannel": { "type": "object", "properties": { @@ -4998,10 +5101,18 @@ "description": "当日新用户退订数", "type": "integer" }, + "new_user_unsub_on_day_rate": { + "description": "当日新用户退订率", + "type": "string" + }, "new_user_unsub_within_hour": { "description": "当日新用户退订数(1小时以内)", "type": "integer" }, + "new_user_unsub_within_hour_rate": { + "description": "当日新用户退订率(1小时以内)", + "type": "string" + }, "product_id": { "description": "产品ID", "type": "integer" @@ -5125,10 +5236,18 @@ "description": "当日新用户退订数", "type": "integer" }, + "new_user_unsub_on_day_rate": { + "description": "当日新用户退订率", + "type": "string" + }, "new_user_unsub_within_hour": { "description": "当日新用户退订数(1小时以内)", "type": "integer" }, + "new_user_unsub_within_hour_rate": { + "description": "当日新用户退订率(1小时以内)", + "type": "string" + }, "product_id": { "description": "产品ID", "type": "integer" @@ -5681,6 +5800,39 @@ } } }, + "models.SummaryData": { + "type": "object", + "properties": { + "one_hour_unsubscribe_rate": { + "description": "1小时退订率 (字符串,保留两位小数,如 \"26.35%\")", + "type": "string" + }, + "one_hour_unsubscribed_user_count": { + "description": "1小时内退订用户数", + "type": "integer" + }, + "retained_user_count": { + "description": "留存用户数", + "type": "integer" + }, + "retention_rate": { + "description": "留存率 (字符串,保留两位小数,如 \"73.65%\")", + "type": "string" + }, + "total_user_count": { + "description": "总用户数", + "type": "integer" + }, + "unsubscribe_rate": { + "description": "退订率 (字符串,保留两位小数,如 \"26.35%\")", + "type": "string" + }, + "unsubscribed_user_count": { + "description": "退订用户数", + "type": "integer" + } + } + }, "models.SysChannelListReq": { "type": "object", "properties": { diff --git a/docs/admin/admin_swagger.yaml b/docs/admin/admin_swagger.yaml index 2263ae4..1f0cccd 100644 --- a/docs/admin/admin_swagger.yaml +++ b/docs/admin/admin_swagger.yaml @@ -872,7 +872,7 @@ definitions: description: 备注 (非必填) type: string status: - description: '状态 (0: 停用, 1: 启用) (必填)' + description: '状态 (2: 停用, 1: 启用) (必填)' type: integer sub_channel_code: description: 子渠道编码 (必填) @@ -989,6 +989,27 @@ definitions: requestId: type: string type: object + models.DailyData: + properties: + date: + description: 日期 + type: string + new_user_count: + description: 新增用户数 + type: integer + unsubscribe_rate: + description: 退订率 + type: string + unsubscribe_within_one_hour_rate: + description: 1小时内退订率 + type: string + unsubscribed_user_count: + description: 退订用户数 + type: integer + unsubscribed_within_one_hour: + description: 1小时内退订用户数 + type: integer + type: object models.HistoricalSummaryListReq: properties: channel: @@ -1023,6 +1044,33 @@ definitions: page_size: type: integer type: object + models.HomepageDataSummaryReq: + properties: + channel: + description: 渠道名称 + type: string + end_time: + description: 查询结束时间 + type: string + sku_code: + description: 产品编号 + type: string + start_time: + description: 查询开始时间 + type: string + type: object + models.HomepageDataSummaryResp: + properties: + daily_data: + description: 每天的数据列表 + items: + $ref: '#/definitions/models.DailyData' + type: array + summary: + allOf: + - $ref: '#/definitions/models.SummaryData' + description: 汇总数据 + type: object models.MgChannel: properties: createdAt: @@ -1065,9 +1113,15 @@ definitions: new_user_unsub_on_day: description: 当日新用户退订数 type: integer + new_user_unsub_on_day_rate: + description: 当日新用户退订率 + type: string new_user_unsub_within_hour: description: 当日新用户退订数(1小时以内) type: integer + new_user_unsub_within_hour_rate: + description: 当日新用户退订率(1小时以内) + type: string product_id: description: 产品ID type: integer @@ -1157,9 +1211,15 @@ definitions: new_user_unsub_on_day: description: 当日新用户退订数 type: integer + new_user_unsub_on_day_rate: + description: 当日新用户退订率 + type: string new_user_unsub_within_hour: description: 当日新用户退订数(1小时以内) type: integer + new_user_unsub_within_hour_rate: + description: 当日新用户退订率(1小时以内) + type: string product_id: description: 产品ID type: integer @@ -1548,6 +1608,30 @@ definitions: linkId: type: string type: object + models.SummaryData: + properties: + one_hour_unsubscribe_rate: + description: 1小时退订率 (字符串,保留两位小数,如 "26.35%") + type: string + one_hour_unsubscribed_user_count: + description: 1小时内退订用户数 + type: integer + retained_user_count: + description: 留存用户数 + type: integer + retention_rate: + description: 留存率 (字符串,保留两位小数,如 "73.65%") + type: string + total_user_count: + description: 总用户数 + type: integer + unsubscribe_rate: + description: 退订率 (字符串,保留两位小数,如 "26.35%") + type: string + unsubscribed_user_count: + description: 退订用户数 + type: integer + type: object models.SysChannelListReq: properties: page_num: @@ -1917,6 +2001,27 @@ paths: summary: 历史汇总查询 tags: - 2024-咪咕-管理后台 + /api/v1/admin/home/data: + post: + consumes: + - application/json + parameters: + - description: 查询首页汇总数据 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.HomepageDataSummaryReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.HomepageDataSummaryResp' + summary: 查询首页汇总数据 + tags: + - 2024-咪咕-管理后台 /api/v1/admin/order/list: post: consumes: