From ab46cdfa8a573857fe6a5f1a053bb8c584525f85 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 28 Aug 2025 20:56: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 --- features/pm/kpi_c_report/controller.go | 49 +++++- .../network_data/repository/all_perf_kpi.go | 50 +++++- .../network_data/repository/cdr_event_ims.go | 107 ++++++++++--- .../network_data/repository/cdr_event_sgwc.go | 49 ++++-- .../network_data/repository/cdr_event_smf.go | 107 ++++++++++--- .../network_data/repository/cdr_event_smsc.go | 143 +++++++++++++++--- .../network_data/repository/ue_event_amf.go | 107 ++++++++++--- .../network_data/repository/ue_event_mme.go | 108 ++++++++++--- 8 files changed, 574 insertions(+), 146 deletions(-) diff --git a/features/pm/kpi_c_report/controller.go b/features/pm/kpi_c_report/controller.go index 7dc6dcf6..3efc2531 100644 --- a/features/pm/kpi_c_report/controller.go +++ b/features/pm/kpi_c_report/controller.go @@ -3,6 +3,7 @@ package kpi_c_report import ( "fmt" "net/http" + "sort" "strconv" "strings" @@ -131,10 +132,10 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { } // order by - if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { - orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dbg = dbg.Order(orderBy) - } + // if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { + // orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) + // dbg = dbg.Order(orderBy) + // } //err := dborm.DefaultDB().Table(tableName).Where(whereSql, params...).Find(&reports).Error err := dbg.Find(&results).Error @@ -143,6 +144,46 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) { return } + // 排序 + if querys.SortField != "" { + sort.SliceStable(results, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*KpiCReport) any{ + "id": func(row *KpiCReport) any { return row.ID }, + "timeGroup": func(row *KpiCReport) any { return row.CreatedAt.Unix() }, + "created_at": func(row *KpiCReport) any { return row.CreatedAt.Unix() }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.SortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return results[i].ID < results[j].ID + } + + // 获取比较值 + valI, valJ := getter(&results[i]), getter(&results[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.SortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return results[i].ID < results[j].ID + } + }) + } + reports := []map[string]any{} for _, r := range results { report := map[string]any{ diff --git a/src/modules/network_data/repository/all_perf_kpi.go b/src/modules/network_data/repository/all_perf_kpi.go index b01c9bea..743bb2aa 100644 --- a/src/modules/network_data/repository/all_perf_kpi.go +++ b/src/modules/network_data/repository/all_perf_kpi.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" "be.ems/lib/log" @@ -113,19 +114,52 @@ func (r PerfKPI) SelectKPI(query model.GoldKPIQuery) []model.KpiReport { if query.EndTime != "" { 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 != "" { + 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 }, + "created_at": func(row *model.KpiReport) any { return row.CreatedAt }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[query.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 query.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if query.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/cdr_event_ims.go b/src/modules/network_data/repository/cdr_event_ims.go index f7d92716..a5d74fd0 100644 --- a/src/modules/network_data/repository/cdr_event_ims.go +++ b/src/modules/network_data/repository/cdr_event_ims.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" dborm "be.ems/lib/core/datasource" @@ -170,29 +171,55 @@ func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { params = append(params, pageNum*pageSize) params = append(params, pageSize) - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by %s,id desc ", sortSql) - } - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql + querySql := r.selectSql + whereSql + pageSql results, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err => %v", err) } + rows := r.convertResultRows(results) + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.CDREventIMS) any{ + "id": func(row *model.CDREventIMS) any { return row.ID }, + "timestamp": func(row *model.CDREventIMS) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.SortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) + } // 转换实体 - result["rows"] = r.convertResultRows(results) + result["rows"] = rows return result } @@ -245,15 +272,6 @@ func (r CDREventIMS) SelectByPage(querys model.CDREventIMSQuery) ([]model.CDREve return rows, total } - // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) if pageNum == 0 && pageSize > int(total) { @@ -265,6 +283,45 @@ func (r CDREventIMS) SelectByPage(querys model.CDREventIMSQuery) ([]model.CDREve logger.Errorf("query find err => %v", err.Error()) return rows, total } + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.CDREventIMS) any{ + "id": func(row *model.CDREventIMS) any { return row.ID }, + "timestamp": func(row *model.CDREventIMS) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.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/cdr_event_sgwc.go b/src/modules/network_data/repository/cdr_event_sgwc.go index 49e7f7eb..c7ff6025 100644 --- a/src/modules/network_data/repository/cdr_event_sgwc.go +++ b/src/modules/network_data/repository/cdr_event_sgwc.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "be.ems/src/framework/datasource" "be.ems/src/framework/logger" @@ -54,15 +55,6 @@ func (r CDREventSGWC) SelectByPage(querys model.CDREventSGWCQuery) ([]model.CDRE return rows, total } - // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) if pageNum == 0 && pageSize > int(total) { @@ -74,6 +66,45 @@ func (r CDREventSGWC) SelectByPage(querys model.CDREventSGWCQuery) ([]model.CDRE logger.Errorf("query find err => %v", err.Error()) return rows, total } + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.CDREventSGWC) any{ + "id": func(row *model.CDREventSGWC) any { return row.ID }, + "timestamp": func(row *model.CDREventSGWC) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.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/cdr_event_smf.go b/src/modules/network_data/repository/cdr_event_smf.go index 56db1f26..b4bb80ea 100644 --- a/src/modules/network_data/repository/cdr_event_smf.go +++ b/src/modules/network_data/repository/cdr_event_smf.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" dborm "be.ems/lib/core/datasource" @@ -157,29 +158,55 @@ func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { params = append(params, pageNum*pageSize) params = append(params, pageSize) - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by %s,id desc ", sortSql) - } - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql + querySql := r.selectSql + whereSql + pageSql results, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err => %v", err) } + rows := r.convertResultRows(results) + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.CDREventSMF) any{ + "id": func(row *model.CDREventSMF) any { return row.ID }, + "timestamp": func(row *model.CDREventSMF) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.SortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) + } // 转换实体 - result["rows"] = r.convertResultRows(results) + result["rows"] = rows return result } @@ -226,15 +253,6 @@ func (r CDREventSMF) SelectByPage(querys model.CDREventSMFQuery) ([]model.CDREve return rows, total } - // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) if pageNum == 0 && pageSize > int(total) { @@ -246,6 +264,45 @@ func (r CDREventSMF) SelectByPage(querys model.CDREventSMFQuery) ([]model.CDREve logger.Errorf("query find err => %v", err.Error()) return rows, total } + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.CDREventSMF) any{ + "id": func(row *model.CDREventSMF) any { return row.ID }, + "timestamp": func(row *model.CDREventSMF) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.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/cdr_event_smsc.go b/src/modules/network_data/repository/cdr_event_smsc.go index 30bc27af..a56572b4 100644 --- a/src/modules/network_data/repository/cdr_event_smsc.go +++ b/src/modules/network_data/repository/cdr_event_smsc.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" dborm "be.ems/lib/core/datasource" @@ -167,33 +168,62 @@ func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any // 分页 pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + if pageNum == 0 && pageSize > total { + pageSize = total + } pageSql := " limit ?,? " params = append(params, pageNum*pageSize) params = append(params, pageSize) - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by %s,id desc ", sortSql) - } - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql + querySql := r.selectSql + whereSql + pageSql results, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err => %v", err) } + rows := r.convertResultRows(results) + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.CDREventSMSC) any{ + "id": func(row *model.CDREventSMSC) any { return row.ID }, + "timestamp": func(row *model.CDREventSMSC) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.SortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) + } // 转换实体 - result["rows"] = r.convertResultRows(results) + result["rows"] = rows return result } @@ -246,15 +276,6 @@ func (r CDREventSMSC) SelectByPage(querys model.CDREventSMSCQuery) ([]model.CDRE return rows, total } - // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) if pageNum == 0 && pageSize > int(total) { @@ -266,6 +287,78 @@ func (r CDREventSMSC) SelectByPage(querys model.CDREventSMSCQuery) ([]model.CDRE logger.Errorf("query find err => %v", err.Error()) return rows, total } + + // const maxPageSize = 50000 + // if pageSize > maxPageSize { + // var allRows []model.CDREventSMSC + // // 保存原始查询条件 + // originalTx := tx + // // 计算总批次数 + // totalBatches := (pageSize + maxPageSize - 1) / maxPageSize + // for i := range totalBatches { + // var batchRows []model.CDREventSMSC + // currentOffset := pageNum*pageSize + i*maxPageSize + // currentLimit := maxPageSize + // // 最后一批可能不足maxPageSize + // if i == totalBatches-1 { + // currentLimit = pageSize - i*maxPageSize + // } + // // 执行当前批次查询 + // err := originalTx.Limit(currentLimit).Offset(currentOffset).Find(&batchRows).Error + // if err != nil { + // logger.Errorf("batch query %d failed: %v", i, err) + // return nil, 0 + // } + // allRows = append(allRows, batchRows...) + // } + // rows = allRows + // } else { + // tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + // err := tx.Find(&rows).Error + // if err != nil { + // logger.Errorf("query find err => %v", err.Error()) + // return rows, total + // } + // } + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.CDREventSMSC) any{ + "id": func(row *model.CDREventSMSC) any { return row.ID }, + "timestamp": func(row *model.CDREventSMSC) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.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/ue_event_amf.go b/src/modules/network_data/repository/ue_event_amf.go index 348b6989..f19a6465 100644 --- a/src/modules/network_data/repository/ue_event_amf.go +++ b/src/modules/network_data/repository/ue_event_amf.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" dborm "be.ems/lib/core/datasource" @@ -157,29 +158,55 @@ func (r *UEEventAMF) SelectPage(querys model.UEEventAMFQuery) map[string]any { params = append(params, pageNum*pageSize) params = append(params, pageSize) - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by %s,id desc ", sortSql) - } - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql + querySql := r.selectSql + whereSql + pageSql results, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err => %v", err) } + rows := r.convertResultRows(results) + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UEEventAMF) any{ + "id": func(row *model.UEEventAMF) any { return row.ID }, + "timestamp": func(row *model.UEEventAMF) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.SortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) + } // 转换实体 - result["rows"] = r.convertResultRows(results) + result["rows"] = rows return result } @@ -224,15 +251,6 @@ func (r UEEventAMF) SelectByPage(querys model.UEEventAMFQuery) ([]model.UEEventA return rows, total } - // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) @@ -241,6 +259,45 @@ func (r UEEventAMF) SelectByPage(querys model.UEEventAMFQuery) ([]model.UEEventA logger.Errorf("query find err => %v", err.Error()) return rows, total } + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UEEventAMF) any{ + "id": func(row *model.UEEventAMF) any { return row.ID }, + "timestamp": func(row *model.UEEventAMF) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.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/ue_event_mme.go b/src/modules/network_data/repository/ue_event_mme.go index cebb940d..6382cc7a 100644 --- a/src/modules/network_data/repository/ue_event_mme.go +++ b/src/modules/network_data/repository/ue_event_mme.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" dborm "be.ems/lib/core/datasource" @@ -157,29 +158,56 @@ func (r *UEEventMME) SelectPage(querys model.UEEventMMEQuery) map[string]any { params = append(params, pageNum*pageSize) params = append(params, pageSize) - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by %s,id desc ", sortSql) - } - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql + querySql := r.selectSql + whereSql + pageSql results, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err => %v", err) } + rows := r.convertResultRows(results) + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UEEventMME) any{ + "id": func(row *model.UEEventMME) any { return row.ID }, + "timestamp": func(row *model.UEEventMME) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.SortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) + } + // 转换实体 - result["rows"] = r.convertResultRows(results) + result["rows"] = rows return result } @@ -224,15 +252,6 @@ func (r UEEventMME) SelectByPage(querys model.UEEventMMEQuery) ([]model.UEEventM return rows, total } - // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) @@ -241,6 +260,45 @@ func (r UEEventMME) SelectByPage(querys model.UEEventMMEQuery) ([]model.UEEventM logger.Errorf("query find err => %v", err.Error()) return rows, total } + + // 排序 + if querys.SortField != "" { + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UEEventMME) any{ + "id": func(row *model.UEEventMME) any { return row.ID }, + "timestamp": func(row *model.UEEventMME) any { return row.Timestamp }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[querys.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 querys.SortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if querys.SortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) + } return rows, total }