perf: cdr/ue/kpi查询列表数据排序改为程序内处理,加快sql查询速度
This commit is contained in:
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user