Merge branch 'main-v2' into lite-ba

This commit is contained in:
TsMask
2025-10-14 18:07:34 +08:00
40 changed files with 266 additions and 193 deletions

View File

@@ -51,7 +51,7 @@ func (s *BackupExportCDRProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_cdr:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -51,7 +51,7 @@ func (s *BackupExportKPIProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_kpi:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -46,7 +46,7 @@ func (s *BackupExportLogProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_log:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -0,0 +1,140 @@
package backup_export_log_ne
import (
"fmt"
"path/filepath"
"strings"
"time"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger"
"be.ems/src/framework/ssh"
neDataService "be.ems/src/modules/network_data/service"
neModel "be.ems/src/modules/network_element/model"
neService "be.ems/src/modules/network_element/service"
)
var NewProcessor = &BackupExportLogNEProcessor{
count: 0,
backupService: neDataService.NewBackup,
neInfoService: neService.NewNeInfo,
logFilePath: "/var/log",
}
// BackupExportLogNEProcessor 备份导出日志任务处理
type BackupExportLogNEProcessor struct {
count int // 执行次数
backupService *neDataService.Backup // 备份相关服务
neInfoService *neService.NeInfo // 网元信息服务
logFilePath string // 日志文件目录
}
func (s *BackupExportLogNEProcessor) Execute(data any) (any, error) {
s.count++ // 执行次数加一
options := data.(cron.JobData)
sysJob := options.SysJob
logger.Infof("重复:%v 任务ID:%d 执行次数:%d", options.Repeat, sysJob.JobId, s.count)
// 返回结果,用于记录执行结果
result := map[string]any{
"count": s.count,
}
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_log_ne:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)
// 时间目录
timeDir := time.Now().Format("20060102150405")
neList := s.neInfoService.Find(neModel.NeInfo{}, false, false)
for _, neInfo := range neList {
if neInfo.IP == "" {
continue
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId)
if err != nil {
result[neInfo.NeName] = err.Error()
continue
}
defer sshClient.Close()
// 网元主机的SSH客户端进行文件传输
sftpClient, err := sshClient.NewClientSFTP()
if err != nil {
result[neInfo.NeName] = err.Error()
continue
}
defer sftpClient.Close()
// 备份导出日志
if neInfo.NeType == "IMS" {
imsDirArr := [...]string{"icscf", "bgcf", "mmtel", "pcscf", "scscf", "iwf", "bsf", "ismc"}
for _, dirPath := range imsDirArr {
logFilePathIMS := filepath.ToSlash(filepath.Join(s.logFilePath, "ims", dirPath))
output := s.backup(timeDir, logFilePathIMS, neInfo, sshClient, sftpClient)
for k, v := range output {
result[k+"-"+dirPath] = v
}
}
} else {
output := s.backup(timeDir, s.logFilePath, neInfo, sshClient, sftpClient)
for k, v := range output {
result[k] = v
}
}
}
// 返回结果,用于记录执行结果
return result, nil
}
// backup 备份导出日志
func (s *BackupExportLogNEProcessor) backup(timeDir string, logFilePath string, neInfo neModel.NeInfo, sshClient *ssh.ConnSSH, sftpClient *ssh.SSHClientSFTP) map[string]string {
var result = map[string]string{}
// 获取文件列表
search := strings.ToLower(neInfo.NeType)
if neInfo.NeType == "IMS" {
search = ""
}
rows, err := ssh.FileList(sshClient, logFilePath, search)
if err != nil {
result[neInfo.NeName] = err.Error()
return result
}
// 计算今天00:00:00的时间戳
today := time.Now()
todayStart := time.Date(today.Year(), today.Month(), today.Day(), 0, 0, 0, 0, today.Location())
todayStartTimestamp := todayStart.Unix()
for _, row := range rows {
if row.ModifiedTime < todayStartTimestamp || row.FileType != "file" {
continue
}
// 网元日志文件路径
neFilePath := fmt.Sprintf("%s/%s", logFilePath, row.FileName)
// 复制到备份目录
neDirPath := fmt.Sprintf("%s/%s", search, row.FileName)
if neInfo.NeType == "IMS" {
neDirPath = strings.Replace(neFilePath, s.logFilePath, "", 1)
}
localFilePath := filepath.Join(s.backupService.BACKUP_DIR, "/log/ne_log", timeDir, neDirPath)
if err := sftpClient.CopyFileRemoteToLocal(neFilePath, localFilePath); err != nil {
result[neInfo.NeName+"-copy"] = err.Error()
continue
}
// 上传到FTP服务器
if err := s.backupService.FTPPushFile(localFilePath, "log"); err != nil {
result[neInfo.NeName+"-copy-ftp"] = "ok, ftp err:" + err.Error()
continue
}
}
return result
}

View File

@@ -57,7 +57,7 @@ func (s *BackupExportTableProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_table:%d:%s", sysJob.JobId, params.TableName)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -50,7 +50,7 @@ func (s *BackupExportUDMProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_export_udm:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -41,7 +41,7 @@ func (s *BackupRemoveFileProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:backup_remove_file:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -32,7 +32,7 @@ func (s *DeleteAlarmRecordProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_alarm_record:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -33,7 +33,7 @@ func (s *DeleteCDRRecordProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_cdr_record:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -55,7 +55,7 @@ func (s *DeleteDataRecordProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_data_record:%d:%s", sysJob.JobId, params.TableName)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -33,7 +33,7 @@ func (s *DeleteKPIRecordProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_kpi_record:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -40,7 +40,7 @@ func (s *DeleteNeConfigBackupProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_ne_config_backup:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -33,7 +33,7 @@ func (s *DeleteUENBRecordProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:delete_uenb_record:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -3,6 +3,7 @@ package monitor_sys_resource
import (
"encoding/json"
"fmt"
"time"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
@@ -34,7 +35,7 @@ func (s *MonitorSysResourceProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:monitor_sys_resource:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -53,7 +53,7 @@ func (s *NeAlarmStateCheckProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:ne_alarm_state_check:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -74,7 +74,7 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:ne_alarm_state_check_cmd:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -55,7 +55,7 @@ func (s *NeAlarmStateCheckLicenseProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:ne_alarm_state_check_license:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -3,6 +3,7 @@ package ne_config_backup
import (
"fmt"
"path/filepath"
"time"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
@@ -39,7 +40,7 @@ func (s *NeConfigBackupProcessor) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:ne_config_backup:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -2,6 +2,7 @@ package ne_data_udm
import (
"fmt"
"time"
"be.ems/src/framework/cron"
"be.ems/src/framework/database/redis"
@@ -38,7 +39,7 @@ func (s *NeDataUDM) Execute(data any) (any, error) {
// 分布式锁,防止多个任务同时执行
lockKey := fmt.Sprintf("processor:ne_data_udm:%d", sysJob.JobId)
if ok := redis.SetNX("", lockKey, 0); !ok {
if ok := redis.SetNX("", lockKey, time.Minute); !ok {
return nil, cron.ErrTaskRunning
}
defer redis.Del("", lockKey)

View File

@@ -5,6 +5,7 @@ import (
processorBackupExportCDR "be.ems/src/modules/crontask/processor/backup_export_cdr"
processorBackupExportKPI "be.ems/src/modules/crontask/processor/backup_export_kpi"
processorBackupExportLog "be.ems/src/modules/crontask/processor/backup_export_log"
processorBackupExportLogNE "be.ems/src/modules/crontask/processor/backup_export_log_ne"
processorBackupExportTable "be.ems/src/modules/crontask/processor/backup_export_table"
processorBackupExportUDM "be.ems/src/modules/crontask/processor/backup_export_udm"
processorBackupRemoveFile "be.ems/src/modules/crontask/processor/backup_remove_file"
@@ -59,8 +60,10 @@ func InitCronQueue() {
cron.CreateQueue("backup_export_udm", processorBackupExportUDM.NewProcessor)
// 备份-导出CDR数据
cron.CreateQueue("backup_export_cdr", processorBackupExportCDR.NewProcessor)
// 备份-导出Log数据
// 备份-导出系统Log数据
cron.CreateQueue("backup_export_log", processorBackupExportLog.NewProcessor)
// 备份-导出KPI数据
cron.CreateQueue("backup_export_kpi", processorBackupExportKPI.NewProcessor)
// 备份-导出网元Log数据
cron.CreateQueue("backup_export_log_ne", processorBackupExportLogNE.NewProcessor)
}

View File

@@ -44,26 +44,25 @@ func (r NeHost) SelectByPage(query map[string]string) ([]model.NeHost, int64) {
// 排序
if sv, ok := query["sortField"]; ok && sv != "" {
sortSql := fmt.Sprint(sv)
if sortSql == "updateTime" {
sortSql = "update_time"
sortField := fmt.Sprint(sv)
if sortField == "updateTime" {
sortField = "update_time"
}
if sortSql == "createTime" {
sortSql = "create_time"
if sortField == "createTime" {
sortField = "create_time"
}
if ov, ok := query["sortOrder"]; ok && ov != "" {
if fmt.Sprint(ov) == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o != "asc" {
sortOrder = "desc"
}
}
tx = tx.Order(sortSql)
tx = tx.Order(fmt.Sprintf("%s %s", sortField, sortOrder))
}
err := tx.Find(&rows).Error
if err != nil {
logger.Errorf("query find err => %v", err.Error())
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
return rows, total
}
return rows, total

View File

@@ -2,7 +2,6 @@ package repository
import (
"fmt"
"sort"
"strings"
"time"
@@ -99,59 +98,22 @@ func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model.
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
}
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o != "asc" {
sortOrder = "desc"
}
}
tx = tx.Order(fmt.Sprintf("%s %s", v, sortOrder))
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
return rows, total
}
// 排序
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
}

View File

@@ -164,22 +164,20 @@ func (r KpiCReport) TitleSelectByPage(query map[string]string) ([]model.KpiCTitl
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortSql := v
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
if o != "asc" {
sortOrder = "desc"
}
}
tx = tx.Order(sortSql)
tx = tx.Order(fmt.Sprintf("%s %s", v, sortOrder))
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
return rows, total
}
return rows, total
}

View File

@@ -188,22 +188,20 @@ func (r KpiReport) TitleSelectByPage(query map[string]string) ([]model.KpiTitle,
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortSql := v
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
if o != "asc" {
sortOrder = "desc"
}
}
tx = tx.Order(sortSql)
tx = tx.Order(fmt.Sprintf("%s %s", v, sortOrder))
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
return rows, total
}
return rows, total
}

View File

@@ -57,22 +57,20 @@ func (r *UDMAuthUser) SelectPage(query map[string]string) ([]model.UDMAuthUser,
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortSql := v
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
if o != "asc" {
sortOrder = "desc"
}
}
tx = tx.Order(sortSql)
tx = tx.Order(fmt.Sprintf("%s %s", v, sortOrder))
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
return rows, total
}
return rows, total
}

View File

@@ -34,21 +34,24 @@ func (r UDMExtend) SelectByPage(query map[string]string) ([]model.UDMExtend, int
return rows, total
}
// 分页
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortField := v
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
sortField = sortField + " desc"
if o != "asc" {
sortOrder = "desc"
}
}
tx = tx.Order(sortField)
tx = tx.Order(fmt.Sprintf("%s %s", v, sortOrder))
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
err := tx.Find(&rows).Error
if err != nil {
logger.Errorf("query find err => %v", err.Error())
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
return rows, total
}
return rows, total

View File

@@ -60,22 +60,20 @@ func (r *UDMSubUser) SelectPage(query map[string]string) ([]model.UDMSubUser, in
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortSql := v
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
if o != "asc" {
sortOrder = "desc"
}
}
tx = tx.Order(sortSql)
tx = tx.Order(fmt.Sprintf("%s %s", v, sortOrder))
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
return rows, total
}
return rows, total
}

View File

@@ -57,24 +57,20 @@ func (r UDMVOIPUser) SelectPage(query map[string]string) ([]model.UDMVOIPUser, i
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortSql := v
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
if o != "asc" {
sortOrder = "desc"
}
}
tx = tx.Order(sortSql)
} else {
tx = tx.Order("username asc")
tx = tx.Order(fmt.Sprintf("%s %s", v, sortOrder))
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
return rows, total
}
return rows, total
}

View File

@@ -66,24 +66,20 @@ func (r UDMVolteIMSUser) SelectPage(query map[string]string) ([]model.UDMVolteIM
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortSql := v
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
if o != "asc" {
sortOrder = "desc"
}
}
tx = tx.Order(sortSql)
} else {
tx = tx.Order("imsi asc")
tx = tx.Order(fmt.Sprintf("%s %s", v, sortOrder))
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
return rows, total
}
return rows, total
}

View File

@@ -2,7 +2,6 @@ package repository
import (
"fmt"
"sort"
"strings"
"time"
@@ -61,58 +60,21 @@ func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.U
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
}
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o != "asc" {
sortOrder = "desc"
}
}
tx = tx.Order(fmt.Sprintf("%s %s", v, sortOrder))
}
// 查询数据
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
}
return rows, total
}

View File

@@ -90,7 +90,7 @@ func (r Backup) FTPPushFile(localFilePath, tag string) error {
return nil
}
// BackupOMCImport 网元配置文件复制到网元端覆盖
// BackupOMCImport 备份OMC 配置文件导入
func (r Backup) BackupOMCImport(localZipFile string) error {
neInfoService := neService.NewNeInfo
neVersionService := neService.NewNeVersion