From 967a6c38fd10a260bf4732ea401569e9d67ac28d Mon Sep 17 00:00:00 2001 From: chenlin Date: Fri, 1 Nov 2024 16:30:13 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=EF=BC=8C=E6=A3=80=E6=9F=A5=E5=8E=86=E5=8F=B2=E9=80=80?= =?UTF-8?q?=E8=AE=A2=E7=94=A8=E6=88=B7=EF=BC=88=E9=9D=9E1=E5=B0=8F?= =?UTF-8?q?=E6=97=B6=E9=80=80=E8=AE=A2=EF=BC=89=E6=98=AF=E5=90=A6=E6=9C=89?= =?UTF-8?q?=E8=AF=AF=E5=88=A4=EF=BC=9B=202.=E4=BC=98=E5=8C=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=95=99=E5=AD=98=E8=AE=B0=E5=BD=95=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=9B=203.=E4=BC=98=E5=8C=96=E5=8E=86=E5=8F=B2=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=AF=BC=E5=87=BAexcel=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 | 83 ++++++++++++++----------- app/admin/models/migu.go | 57 +++++++++++++++++ cmd/api/server.go | 5 ++ 3 files changed, 110 insertions(+), 35 deletions(-) diff --git a/app/admin/apis/migumanage/migu_admin.go b/app/admin/apis/migumanage/migu_admin.go index a4188c8..6816113 100644 --- a/app/admin/apis/migumanage/migu_admin.go +++ b/app/admin/apis/migumanage/migu_admin.go @@ -443,8 +443,14 @@ func (e MiGuDeployService) HistoricalSummaryList(c *gin.Context) { return } - // 执行查询 - err = qs.Offset(pageNum * req.PageSize).Limit(req.PageSize).Find(&historicalSummaryList).Error + // 判断是否导出Excel + if req.IsExport == 1 { + // 执行查询 + err = qs.Find(&historicalSummaryList).Error + } else { + // 执行查询 + err = qs.Offset(pageNum * req.PageSize).Limit(req.PageSize).Find(&historicalSummaryList).Error + } if err != nil { logger.Errorf("HistoricalSummaryList query err: %#v", err) response.Error(c, http.StatusInternalServerError, err, "查询失败") @@ -633,34 +639,25 @@ func (e MiGuDeployService) UserRetentionList(c *gin.Context) { } resp.PageSize = req.PageSize - // 获取开始和结束时间 - retentionMonth := req.RetentionMonth // 例如 "2024-10" - if retentionMonth == "" { - retentionMonth = time.Now().Format("2006-01") - } + qs := e.Orm.Model(&models.MgOrder{}) - // 解析出年和月 - year, month, err := models.ParseYearMonth(retentionMonth) - if err != nil { - response.Error(c, http.StatusBadRequest, err, "日期格式错误") - return - } - - // 计算该月份的第一天和最后一天 - startDate := time.Date(year, month, 1, 0, 0, 0, 0, time.UTC) // 当月第一天 - endDate := startDate.AddDate(0, 1, 0).Add(-time.Second) // 当月最后一天的最后一毫秒 - - // 定义返回的响应结构 - var retentionList []models.MgUserRetention - - // 查询用户留存数据 - 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) + //// 获取开始和结束时间 + //retentionMonth := req.RetentionMonth // 例如 "2024-10" + //if retentionMonth != "" { + // //retentionMonth = time.Now().Format("2006-01") + // + // // 解析出年和月 + // year, month, err := models.ParseYearMonth(retentionMonth) + // if err != nil { + // response.Error(c, http.StatusBadRequest, err, "日期格式错误") + // return + // } + // + // // 计算该月份的第一天和最后一天 + // startDate := time.Date(year, month, 1, 0, 0, 0, 0, time.UTC) // 当月第一天 + // endDate := startDate.AddDate(0, 1, 0).Add(-time.Second) // 当月最后一天的最后一毫秒 + // qs = qs.Where("subscribe_time >= ? AND subscribe_time <= ?", startDate, endDate) + //} // 处理产品编号 (SkuCode) 过滤条件 if req.SkuCode != "" { @@ -672,14 +669,19 @@ func (e MiGuDeployService) UserRetentionList(c *gin.Context) { qs = qs.Where("channel_code = ?", req.Channel) } - err = qs.Group("retention_month, channel_code, product_id"). + // 定义返回的响应结构 + var retentionList []models.MgUserRetention + + // 查询用户留存数据 + err := qs. + Select(`DATE_FORMAT(subscribe_time, '%Y-%m') AS retention_month, + COUNT(phone_number) AS new_user_count, + COUNT(CASE WHEN state = 1 THEN phone_number END) AS retained_user_count, + channel_code, product_id, + IFNULL(FORMAT(COUNT(CASE WHEN state = 1 THEN phone_number END) / NULLIF(COUNT(phone_number), 0) * 100, 2), 0) AS retention_rate`). + 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) @@ -687,6 +689,17 @@ func (e MiGuDeployService) UserRetentionList(c *gin.Context) { return } + // 如果传递了月份参数,则在内存中过滤对应月份的数据 + if req.RetentionMonth != "" { + var filteredList []models.MgUserRetention + for _, item := range retentionList { + if item.RetentionMonth == req.RetentionMonth { + filteredList = append(filteredList, item) + } + } + retentionList = filteredList + } + for i := range retentionList { retentionList[i].RetentionRate += "%" } diff --git a/app/admin/models/migu.go b/app/admin/models/migu.go index 941a6c6..47bba11 100644 --- a/app/admin/models/migu.go +++ b/app/admin/models/migu.go @@ -1052,6 +1052,63 @@ func CheckAllOrderState() { } } +// CheckCancelOrderState 定时任务,检查历史退订阅用户是否有误判 +func CheckCancelOrderState() { + if database.Db == nil { + log.Println("Database connection is nil") + fmt.Println("Database connection is nil") + return + } + + // 查询订单列表已退订且不是1小时内退订的用户 + var orderList []MgOrder + + err := database.Db.Where("state = 2 and is_one_hour_cancel != 1").Order("created_at desc"). + Find(&orderList).Error + + if err != nil { + fmt.Println("query mg_order err:", err.Error()) + return + } + + for i, _ := range orderList { + for j := 0; j < 5; j++ { + var req QueryRightsInfoReq + req.AppChannelList = append(req.AppChannelList, ChannelCode) + req.Mobile = orderList[i].PhoneNumber + + resp, err := MiGuQueryRightsInfo(&req) + if err != nil { + fmt.Println("CheckOrderState MiGuQueryRightsInfo err:", err.Error()) + logger.Errorf("CheckOrderState MiGuQueryRightsInfo err:", err.Error()) + continue + } + + // 有退订数据 + if len(resp.ResultData) != 0 { + if resp.ResultData[0].IsUnsub == 1 { // 已退订 + break + } else if resp.ResultData[0].IsUnsub == 0 { // 没有退订 + fmt.Println("**********CheckCancelOrderState get:", orderList[i].PhoneNumber) + var unsubTime *time.Time = nil + err = database.Db.Table("mg_order").Where("order_serial = ?", orderList[i].OrderSerial).Updates(map[string]interface{}{ + "state": SubscribeOK, + "is_one_hour_cancel": 0, + "unsubscribe_time": unsubTime, + "updated_at": time.Now(), + }).Error + break + } + } else { + if j == 1 { + break + } + continue + } + } + } +} + // ExportHistoricalSummaryToExcel 历史汇总数据导出excel func ExportHistoricalSummaryToExcel(data []MgHistoricalSummary, db *gorm.DB) (string, error) { // 创建一个新的Excel文件 diff --git a/cmd/api/server.go b/cmd/api/server.go index 0232d4e..d28867e 100644 --- a/cmd/api/server.go +++ b/cmd/api/server.go @@ -97,6 +97,11 @@ func run() error { fmt.Println("err:", err) } + err = s.Every(1).Day().At("02:30").Do(models.CheckCancelOrderState) + if err != nil { + fmt.Println("err:", err) + } + <-s.Start() }()