From 3c7d24cfde2e4fe59ccf4101e69c8b5bf1f7bad3 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 28 Aug 2025 18:55:54 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20cdr/ue/kpi=E6=9F=A5=E8=AF=A2=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=95=B0=E6=8D=AE=E6=8E=92=E5=BA=8F=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=86=85=E5=A4=84=E7=90=86=EF=BC=8C=E5=8A=A0?= =?UTF-8?q?=E5=BF=ABsql=E6=9F=A5=E8=AF=A2=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network_data/repository/cdr_event.go | 65 +++++++++++++++---- .../network_data/repository/kpi_c_report.go | 50 +++++++++++--- .../network_data/repository/kpi_report.go | 50 +++++++++++--- .../network_data/repository/ue_event.go | 62 ++++++++++++++---- 4 files changed, 185 insertions(+), 42 deletions(-) diff --git a/src/modules/network_data/repository/cdr_event.go b/src/modules/network_data/repository/cdr_event.go index d115e3d1..ee7783dd 100644 --- a/src/modules/network_data/repository/cdr_event.go +++ b/src/modules/network_data/repository/cdr_event.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" "time" @@ -91,26 +92,64 @@ func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model. // 分页 pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) - tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) - - // 排序 - if v, ok := query["sortField"]; ok && v != "" { - sortSql := v - if o, ok := query["sortOrder"]; ok && o != "" { - if o == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - tx = tx.Order(sortSql) + if pageNum == 0 && pageSize > int(total) { + pageSize = int(total) } + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query err => %v", err) } + // 排序 + if v, ok := query["sortField"]; ok && v != "" { + sortField := v + sortOrder := "asc" + if o, ok := query["sortOrder"]; ok && o != "" { + if o == "desc" { + sortOrder = "desc" + } else { + sortOrder = "asc" + } + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.CDREvent) any{ + "id": func(row *model.CDREvent) any { return row.ID }, + "timestamp": func(row *model.CDREvent) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) + } + return rows, total } diff --git a/src/modules/network_data/repository/kpi_c_report.go b/src/modules/network_data/repository/kpi_c_report.go index 244f9d70..f87a7c51 100644 --- a/src/modules/network_data/repository/kpi_c_report.go +++ b/src/modules/network_data/repository/kpi_c_report.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" "time" @@ -37,19 +38,52 @@ func (r KpiCReport) SelectKPI(query model.KPICQuery) []model.KpiCReport { if query.EndTime != 0 { tx = tx.Where("created_at <= ?", query.EndTime) } - // 排序 - if query.SortField == "" || query.SortField == "timeGroup" { - query.SortField = "created_at" - } - if query.SortOrder == "" { - query.SortOrder = "desc" - } - tx = tx.Order(fmt.Sprintf("%s %s", query.SortField, query.SortOrder)) // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) return rows } + // 排序 + if query.SortField != "" { + sortField := query.SortField + sortOrder := query.SortOrder + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.KpiCReport) any{ + "id": func(row *model.KpiCReport) any { return row.ID }, + "timeGroup": func(row *model.KpiCReport) any { return row.CreatedAt }, + "createdAt": func(row *model.KpiCReport) any { return row.CreatedAt }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) + } return rows } diff --git a/src/modules/network_data/repository/kpi_report.go b/src/modules/network_data/repository/kpi_report.go index e451e7fc..351814b4 100644 --- a/src/modules/network_data/repository/kpi_report.go +++ b/src/modules/network_data/repository/kpi_report.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" "time" @@ -37,19 +38,52 @@ func (r KpiReport) SelectKPI(query model.KPIQuery) []model.KpiReport { if query.EndTime != 0 { tx = tx.Where("created_at <= ?", query.EndTime) } - // 排序 - if query.SortField == "" || query.SortField == "timeGroup" { - query.SortField = "created_at" - } - if query.SortOrder == "" { - query.SortOrder = "desc" - } - tx = tx.Order(fmt.Sprintf("%s %s", query.SortField, query.SortOrder)) // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) return rows } + // 排序 + if query.SortField != "" { + sortField := query.SortField + sortOrder := query.SortOrder + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.KpiReport) any{ + "id": func(row *model.KpiReport) any { return row.ID }, + "timeGroup": func(row *model.KpiReport) any { return row.CreatedAt }, + "createdAt": func(row *model.KpiReport) any { return row.CreatedAt }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) + } return rows } diff --git a/src/modules/network_data/repository/ue_event.go b/src/modules/network_data/repository/ue_event.go index c2eb2579..eee193e7 100644 --- a/src/modules/network_data/repository/ue_event.go +++ b/src/modules/network_data/repository/ue_event.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" "time" @@ -58,24 +59,59 @@ func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.U pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) - // 排序 - if v, ok := query["sortField"]; ok && v != "" { - sortSql := v - if o, ok := query["sortOrder"]; ok && o != "" { - if o == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - tx = tx.Order(sortSql) - } - // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query err => %v", err) } + // 排序 + if v, ok := query["sortField"]; ok && v != "" { + sortField := v + sortOrder := "asc" + if o, ok := query["sortOrder"]; ok && o != "" { + if o == "desc" { + sortOrder = "desc" + } else { + sortOrder = "asc" + } + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UEEvent) any{ + "id": func(row *model.UEEvent) any { return row.ID }, + "timestamp": func(row *model.UEEvent) any { return row.CreatedAt }, + "createdAt": func(row *model.UEEvent) any { return row.CreatedAt }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) + } return rows, total }