diff --git a/app/admin/apis/migumanage/migu_admin.go b/app/admin/apis/migumanage/migu_admin.go index 80c1668..65bcd4b 100644 --- a/app/admin/apis/migumanage/migu_admin.go +++ b/app/admin/apis/migumanage/migu_admin.go @@ -428,39 +428,81 @@ func (e MiGuDeployService) HistoricalSummaryListOld(c *gin.Context) { // 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") + //qs := e.Orm.Model(&models.MgOrder{}). + // Select(`DATE_FORMAT(mg_order.subscribe_time, '%Y-%m-%d') AS date, + // mg_order.product_id, + // mg_order.channel_code, + // (SELECT COUNT(*) + // FROM mg_transaction_log + // WHERE verification_code != '' + // AND channel_code = mg_order.channel_code + // 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 AND mg_order.unsubscribe_time >= ? AND mg_order.unsubscribe_time <= ? THEN 1 END) AS new_user_unsub_on_day, + // 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 AND mg_order.unsubscribe_time >= ? AND mg_order.unsubscribe_time <= ? THEN 1 END) * 100.0 / + // NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate, + // IFNULL( + // CONCAT( + // LEAST( + // ROUND(COUNT(*) * 100.0 / NULLIF( + // (SELECT COUNT(*) + // FROM mg_transaction_log + // WHERE verification_code != '' + // AND channel_code = mg_order.channel_code + // AND DATE(created_at) = DATE(mg_order.subscribe_time)), 0), 2), + // 100.00 + // ), + // '%' + // ), + // '0.00%' + // ) AS submission_success_rate`, + // startTime, endTime, startTime, endTime). + // 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 DESC") + qs := e.Orm.Model(&models.MgOrder{}). - Select(`DATE_FORMAT(mg_order.subscribe_time, '%Y-%m-%d') AS date, - mg_order.product_id, - mg_order.channel_code, - (SELECT COUNT(*) - FROM mg_transaction_log - WHERE verification_code != '' - AND channel_code = mg_order.channel_code - 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 AND mg_order.unsubscribe_time >= ? AND mg_order.unsubscribe_time <= ? THEN 1 END) AS new_user_unsub_on_day, - 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 AND mg_order.unsubscribe_time >= ? AND mg_order.unsubscribe_time <= ? THEN 1 END) * 100.0 / - NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate, + Select(` + DATE_FORMAT(mg_order.subscribe_time, '%Y-%m-%d') AS date, + mg_order.product_id, + mg_order.channel_code, + IFNULL(submission_count.submission_count, 0) 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 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) AS new_user_unsub_on_day, + COUNT(*) AS new_user_count, + SUM(CASE WHEN mg_order.state = 2 THEN 1 ELSE 0 END) AS total_new_user_unsub, + 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 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate, + CONCAT(ROUND(SUM(CASE WHEN mg_order.state = 2 THEN 1 ELSE 0 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS total_new_user_unsub_rate, IFNULL( - CONCAT( - LEAST( - ROUND(COUNT(*) * 100.0 / NULLIF( - (SELECT COUNT(*) - FROM mg_transaction_log - WHERE verification_code != '' - AND channel_code = mg_order.channel_code - AND DATE(created_at) = DATE(mg_order.subscribe_time)), 0), 2), - 100.00 - ), - '%' - ), - '0.00%' - ) AS submission_success_rate`, - startTime, endTime, startTime, endTime). - Where("mg_order.subscribe_time >= ? AND mg_order.subscribe_time <= ?", startTime, endTime). + CONCAT( + LEAST( + ROUND(COUNT(*) * 100.0 / NULLIF(submission_count.submission_count, 0), 2), + 100.00 + ), + '%' + ), + '0.00%' + ) AS submission_success_rate + `). + // 使用 Joins 来替代 LeftJoin 进行左连接 + Joins(` + LEFT JOIN ( + SELECT + channel_code, + DATE(created_at) AS created_date, + COUNT(*) AS submission_count + FROM mg_transaction_log + WHERE verification_code != '' + GROUP BY channel_code, created_date + ) AS submission_count + ON submission_count.channel_code = mg_order.channel_code + AND submission_count.created_date = DATE(mg_order.subscribe_time) + `). + Where("mg_order.subscribe_time BETWEEN ? AND ?", 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 DESC") @@ -797,6 +839,68 @@ func (e MiGuDeployService) processTimeRange(startTime, endTime, minDate, maxDate // return data, nil //} +//// 查询历史数据 +//func (e MiGuDeployService) queryHistoricalSummary(startTime, endTime string, req *models.HistoricalSummaryListReq) ([]models.MgHistoricalSummary, error) { +// qs := e.Orm.Model(&models.MgOrder{}). +// Select(` +// DATE_FORMAT(mg_order.subscribe_time, '%Y-%m-%d') AS date, +// mg_order.product_id, +// mg_order.channel_code, +// ( +// SELECT COUNT(*) +// FROM mg_transaction_log +// WHERE verification_code != '' +// AND channel_code = mg_order.channel_code +// 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 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) AS new_user_unsub_on_day, +// COUNT(*) AS new_user_count, +// SUM(CASE WHEN mg_order.state = 2 THEN 1 ELSE 0 END) AS total_new_user_unsub, +// 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 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate, +// CONCAT(ROUND(SUM(CASE WHEN mg_order.state = 2 THEN 1 ELSE 0 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS total_new_user_unsub_rate, +// IFNULL( +// CONCAT( +// LEAST( +// ROUND(COUNT(*) * 100.0 / NULLIF( +// (SELECT COUNT(*) +// FROM mg_transaction_log +// WHERE verification_code != '' +// AND channel_code = mg_order.channel_code +// AND DATE(created_at) = DATE(mg_order.subscribe_time)), 0), 2), +// 100.00 +// ), +// '%' +// ), +// '0.00%' +// ) AS submission_success_rate +// `). +// Where("mg_order.subscribe_time BETWEEN ? AND ?", 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 DESC") +// +// if req.SkuCode != 0 { +// qs = qs.Where("product_id = ?", req.SkuCode) +// } +// if req.Channel != "" { +// qs = qs.Where("channel_code = ?", req.Channel) +// } +// +// var data []models.MgHistoricalSummary +// var err error +// if req.IsExport == 1 { +// err = qs.Find(&data).Error +// } else { +// err = qs.Limit(req.PageSize).Find(&data).Error +// } +// if err != nil { +// return nil, err +// } +// +// return data, nil +//} + // 查询历史数据 func (e MiGuDeployService) queryHistoricalSummary(startTime, endTime string, req *models.HistoricalSummaryListReq) ([]models.MgHistoricalSummary, error) { qs := e.Orm.Model(&models.MgOrder{}). @@ -804,13 +908,7 @@ func (e MiGuDeployService) queryHistoricalSummary(startTime, endTime string, req DATE_FORMAT(mg_order.subscribe_time, '%Y-%m-%d') AS date, mg_order.product_id, mg_order.channel_code, - ( - SELECT COUNT(*) - FROM mg_transaction_log - WHERE verification_code != '' - AND channel_code = mg_order.channel_code - AND DATE(created_at) = DATE(mg_order.subscribe_time) - ) AS submission_count, + IFNULL(submission_count.submission_count, 0) 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 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) AS new_user_unsub_on_day, COUNT(*) AS new_user_count, @@ -819,37 +917,49 @@ func (e MiGuDeployService) queryHistoricalSummary(startTime, endTime string, req CONCAT(ROUND(COUNT(CASE WHEN mg_order.state = 2 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate, CONCAT(ROUND(SUM(CASE WHEN mg_order.state = 2 THEN 1 ELSE 0 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS total_new_user_unsub_rate, IFNULL( - CONCAT( - LEAST( - ROUND(COUNT(*) * 100.0 / NULLIF( - (SELECT COUNT(*) - FROM mg_transaction_log - WHERE verification_code != '' - AND channel_code = mg_order.channel_code - AND DATE(created_at) = DATE(mg_order.subscribe_time)), 0), 2), - 100.00 - ), - '%' - ), - '0.00%' - ) AS submission_success_rate + CONCAT( + LEAST( + ROUND(COUNT(*) * 100.0 / NULLIF(submission_count.submission_count, 0), 2), + 100.00 + ), + '%' + ), + '0.00%' + ) AS submission_success_rate + `). + // 使用 Joins 来替代 LeftJoin 进行左连接 + Joins(` + LEFT JOIN ( + SELECT + channel_code, + DATE(created_at) AS created_date, + COUNT(*) AS submission_count + FROM mg_transaction_log + WHERE verification_code != '' + GROUP BY channel_code, created_date + ) AS submission_count + ON submission_count.channel_code = mg_order.channel_code + AND submission_count.created_date = DATE(mg_order.subscribe_time) `). Where("mg_order.subscribe_time BETWEEN ? AND ?", 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 DESC") + // 根据请求条件过滤 if req.SkuCode != 0 { - qs = qs.Where("product_id = ?", req.SkuCode) + qs = qs.Where("mg_order.product_id = ?", req.SkuCode) } if req.Channel != "" { - qs = qs.Where("channel_code = ?", req.Channel) + qs = qs.Where("mg_order.channel_code = ?", req.Channel) } var data []models.MgHistoricalSummary var err error if req.IsExport == 1 { + // 导出数据不限制分页 err = qs.Find(&data).Error } else { + // 非导出时进行分页查询 err = qs.Limit(req.PageSize).Find(&data).Error } if err != nil { @@ -2683,7 +2793,7 @@ func (e MiGuDeployService) queryHistoricalDataByHour(startTime, endTime string, // 如果转换失败,按原样比较;否则按数字顺序排序 if errI != nil && errJ != nil { - return filteredData[i].Hour < filteredData[j].Hour + return filteredData[i].Hour > filteredData[j].Hour } if errI != nil { // 如果 i 的 hour 无法转换为数字,则认为它大于 j @@ -2693,7 +2803,7 @@ func (e MiGuDeployService) queryHistoricalDataByHour(startTime, endTime string, // 如果 j 的 hour 无法转换为数字,则认为它大于 i return true } - return hourI < hourJ + return hourI > hourJ }) // 如果是导出数据,直接返回所有数据 diff --git a/app/admin/router/migu.go b/app/admin/router/migu.go index 0b24438..c864b6a 100644 --- a/app/admin/router/migu.go +++ b/app/admin/router/migu.go @@ -21,18 +21,18 @@ func registerMiGuControlManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.Gi //api.POST("channel/update", apiMiGu.UpdateChannel) // 编辑渠道 //api.POST("channel/delete", apiMiGu.DeleteChannel) // 删除渠道 - api.POST("transaction/list", apiMiGu.TransactionList) // 查询交易流水记录 - api.POST("order/list", apiMiGu.OrderList) // 查询订单列表 - api.POST("historical_summary/list", apiMiGu.HistoricalSummaryListNew) // 历史汇总查询 - api.POST("hour_summary/list", apiMiGu.HourSummaryList) // 历史汇总查询(按小时) - api.POST("realtime_summary/list", apiMiGu.RealtimeSummaryList) // 当日实时汇总 - api.POST("user_retention/list", apiMiGu.UserRetentionList) // 用户留存记录 - api.POST("user_day_retention/list", apiMiGu.UserDayRetentionList) // 用户留存记录(按天) - api.POST("sys_channel/list", apiMiGu.SysChannelList) // 查询系统所有渠道编码 - api.POST("home/data", apiMiGu.HomepageDataSummary) // 查询首页汇总数据 - api.POST("home/revenue_analysis", apiMiGu.CalculateRevenueAnalysis) // 查询不同日期的留存月份 + api.POST("transaction/list", apiMiGu.TransactionList) // 查询交易流水记录 + api.POST("order/list", apiMiGu.OrderList) // 查询订单列表 + //api.POST("historical_summary/list", apiMiGu.HistoricalSummaryListNew) // 历史汇总查询 + api.POST("hour_summary/list", apiMiGu.HourSummaryList) // 历史汇总查询(按小时) + api.POST("realtime_summary/list", apiMiGu.RealtimeSummaryList) // 当日实时汇总 + api.POST("user_retention/list", apiMiGu.UserRetentionList) // 用户留存记录 + api.POST("user_day_retention/list", apiMiGu.UserDayRetentionList) // 用户留存记录(按天) + api.POST("sys_channel/list", apiMiGu.SysChannelList) // 查询系统所有渠道编码 + api.POST("home/data", apiMiGu.HomepageDataSummary) // 查询首页汇总数据 + api.POST("home/revenue_analysis", apiMiGu.CalculateRevenueAnalysis) // 查询不同日期的留存月份 - //api.POST("historical_summary/list_old", apiMiGu.HistoricalSummaryListOld) // 历史汇总查询 + api.POST("historical_summary/list", apiMiGu.HistoricalSummaryListOld) // 历史汇总查询 //api.POST("order/import", apiMiGu.ImportExcelToMgOrderHandler) // 通过excel导入订单数据 //api.POST("order/import_update", apiMiGu.ImportExcelToMgOrderHandlerUpdate) // 通过excel导入订单退订数据 }