Merge branch 'main-v2' into lite-ba
This commit is contained in:
@@ -1,5 +1,14 @@
|
||||
# 版本发布日志
|
||||
|
||||
## 2.2510.2-20251011
|
||||
|
||||
- 新增 导出udm-auth未加密数据
|
||||
- 新增 cdr-ims的mos和cct统计接口
|
||||
- 优化 导出SMSC添加result code和result cause列
|
||||
- 优化 拼写错误Menory->Memory
|
||||
- 优化 UDM批量操作加载数据根据前缀重载
|
||||
- 优化 添加分布式锁以防止多个任务同时执行
|
||||
|
||||
## 2.2509.4-20250926
|
||||
|
||||
- 优化 UDM用户数据导出文件带createTime字段
|
||||
|
||||
@@ -850,7 +850,7 @@ INSERT INTO "sys_i18n" VALUES (746, 'dictData.cdr_sip_code_cause.580', '因其
|
||||
INSERT INTO "sys_i18n" VALUES (747, 'dictData.cdr_sip_code_cause.603', '被叫拒接', 'MT explicitly rejected the call');
|
||||
INSERT INTO "sys_i18n" VALUES (748, 'dictData.cdr_sip_code_cause.606', '呼叫已到达用户设备,但会话设置的某些部分不可接受', 'The call reached the user’s device, but some parts of the session setup weren it acceptable');
|
||||
INSERT INTO "sys_i18n" VALUES (749, 'dictType.cdr_sip_code_cause', 'IMS-Voice-SIP响应代码类别类型原因', 'IMS-Voice-SIP Response Code Category Type Cause');
|
||||
INSERT INTO "sys_i18n" VALUES (750, 'job.backup_export_log', '备份-日志数据定期导出', 'Backup-Periodic export of Log Data');
|
||||
INSERT INTO "sys_i18n" VALUES (750, 'job.backup_export_log', '备份-系统日志数据定期导出', 'Backup-Periodic export of System Log Data');
|
||||
INSERT INTO "sys_i18n" VALUES (751, 'job.backup_export_log_remark', 'dataType: 类型支持 operate/login
|
||||
fileType: 文件类型 csv/xlsx
|
||||
hour: 数据时间从任务执行时间前的小时数', 'Backup-Periodic export of dataType: type support operate/login
|
||||
@@ -990,6 +990,7 @@ INSERT INTO "sys_i18n" VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错
|
||||
INSERT INTO "sys_i18n" VALUES (807, 'dictData.cdr_cause_smsc.10', 'CAMEL 流程错误', 'CAMEL process error');
|
||||
INSERT INTO "sys_i18n" VALUES (808, 'menu.neData.udmAuth.exportDec', '导出解密', 'Export Dec');
|
||||
INSERT INTO "sys_i18n" VALUES (809, 'dictType.cdr_cause_smsc', 'SMSC CDR 响应原因代码类别类型', 'SMSC CDR Cause Code Type');
|
||||
INSERT INTO "sys_i18n" VALUES (810, 'job.backup_export_log_ne', '备份-网元日志数据定期导出', 'Backup-Periodic export of NE Log Data');
|
||||
|
||||
INSERT INTO "sys_i18n" VALUES (2000, 'menu.psap.agent', '座席', 'Agent');
|
||||
INSERT INTO "sys_i18n" VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information');
|
||||
|
||||
@@ -52,3 +52,4 @@ INSERT INTO "sys_job" VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_exp
|
||||
INSERT INTO "sys_job" VALUES (32, 'job.backup_export_cdr', 'SYSTEM', 'backup_export_cdr', '{"dataType":["ims","smf","sgwc","smsc"],"fileType":"xlsx","hour":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_cdr_remark');
|
||||
INSERT INTO "sys_job" VALUES (33, 'job.backup_export_log', 'SYSTEM', 'backup_export_log', '{"dataType":["operate","login"],"fileType":"xlsx","hour":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_log_remark');
|
||||
INSERT INTO "sys_job" VALUES (34, 'job.backup_export_kpi', 'SYSTEM', 'backup_export_kpi', '{"dataType":["ims","amf","udm","smf","pcf","upf","mme","smsc"],"fileType":"xlsx","hour":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_kpi_remark');
|
||||
INSERT INTO "sys_job" VALUES (35, 'job.backup_export_log_ne', 'SYSTEM', 'backup_export_log_ne', '', '0 59 23 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, '');
|
||||
|
||||
@@ -849,7 +849,7 @@ REPLACE INTO "sys_i18n" VALUES (746, 'dictData.cdr_sip_code_cause.580', '因其
|
||||
REPLACE INTO "sys_i18n" VALUES (747, 'dictData.cdr_sip_code_cause.603', '被叫拒接', 'MT explicitly rejected the call');
|
||||
REPLACE INTO "sys_i18n" VALUES (748, 'dictData.cdr_sip_code_cause.606', '呼叫已到达用户设备,但会话设置的某些部分不可接受', 'The call reached the user’s device, but some parts of the session setup weren it acceptable');
|
||||
REPLACE INTO "sys_i18n" VALUES (749, 'dictType.cdr_sip_code_cause', 'IMS-Voice-SIP响应代码类别类型原因', 'IMS-Voice-SIP Response Code Category Type Cause');
|
||||
REPLACE INTO "sys_i18n" VALUES (750, 'job.backup_export_log', '备份-日志数据定期导出', 'Backup-Periodic export of Log Data');
|
||||
REPLACE INTO "sys_i18n" VALUES (750, 'job.backup_export_log', '备份-系统日志数据定期导出', 'Backup-Periodic export of System Log Data');
|
||||
REPLACE INTO "sys_i18n" VALUES (751, 'job.backup_export_log_remark', 'dataType: 类型支持 operate/login
|
||||
fileType: 文件类型 csv/xlsx
|
||||
hour: 数据时间从任务执行时间前的小时数', 'Backup-Periodic export of dataType: type support operate/login
|
||||
@@ -989,6 +989,7 @@ REPLACE INTO "sys_i18n" VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错
|
||||
REPLACE INTO "sys_i18n" VALUES (807, 'dictData.cdr_cause_smsc.10', 'CAMEL 流程错误', 'CAMEL process error');
|
||||
REPLACE INTO "sys_i18n" VALUES (808, 'menu.neData.udmAuth.exportDec', '导出解密', 'Export Dec');
|
||||
REPLACE INTO "sys_i18n" VALUES (809, 'dictType.cdr_cause_smsc', 'SMSC CDR 响应原因代码类别类型', 'SMSC CDR Cause Code Type');
|
||||
REPLACE INTO "sys_i18n" VALUES (810, 'job.backup_export_log_ne', '备份-网元日志数据定期导出', 'Backup-Periodic export of NE Log Data');
|
||||
|
||||
REPLACE INTO "sys_i18n" VALUES (2000, 'menu.psap.agent', '座席', 'Agent');
|
||||
REPLACE INTO "sys_i18n" VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information');
|
||||
|
||||
@@ -51,3 +51,4 @@ REPLACE INTO "sys_job" VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_ex
|
||||
REPLACE INTO "sys_job" VALUES (32, 'job.backup_export_cdr', 'SYSTEM', 'backup_export_cdr', '{"dataType":["ims","smf","sgwc","smsc"],"fileType":"xlsx","hour":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_cdr_remark');
|
||||
REPLACE INTO "sys_job" VALUES (33, 'job.backup_export_log', 'SYSTEM', 'backup_export_log', '{"dataType":["operate","login"],"fileType":"xlsx","hour":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_log_remark');
|
||||
REPLACE INTO "sys_job" VALUES (34, 'job.backup_export_kpi', 'SYSTEM', 'backup_export_kpi', '{"dataType":["ims","amf","udm","smf","pcf","upf","mme","smsc"],"fileType":"xlsx","hour":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_kpi_remark');
|
||||
REPLACE INTO "sys_job" VALUES (35, 'job.backup_export_log_ne', 'SYSTEM', 'backup_export_log_ne', '', '0 59 23 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, '');
|
||||
|
||||
@@ -764,7 +764,7 @@ INSERT INTO `sys_i18n` VALUES (746, 'dictData.cdr_sip_code_cause.580', '因其
|
||||
INSERT INTO `sys_i18n` VALUES (747, 'dictData.cdr_sip_code_cause.603', '被叫拒接', 'MT explicitly rejected the call');
|
||||
INSERT INTO `sys_i18n` VALUES (748, 'dictData.cdr_sip_code_cause.606', '呼叫已到达用户设备,但会话设置的某些部分不可接受', 'The call reached the user’s device, but some parts of the session setup weren it acceptable');
|
||||
INSERT INTO `sys_i18n` VALUES (749, 'dictType.cdr_sip_code_cause', 'IMS-Voice-SIP响应代码类别类型原因', 'IMS-Voice-SIP Response Code Category Type Cause');
|
||||
INSERT INTO `sys_i18n` VALUES (750, 'job.backup_export_log', '备份-日志数据定期导出', 'Backup-Periodic export of Log Data');
|
||||
INSERT INTO `sys_i18n` VALUES (750, 'job.backup_export_log', '备份-系统日志数据定期导出', 'Backup-Periodic export of System Log Data');
|
||||
INSERT INTO `sys_i18n` VALUES (751, 'job.backup_export_log_remark', 'dataType: 类型支持 operate/login\nfileType: 文件类型 csv/xlsx\nhour: 数据时间从任务执行时间前的小时数', 'Backup-Periodic export of dataType: type support operate/login\nfileType: file type csv/xlsx\nhour: data time from the hour before the task execution time');
|
||||
INSERT INTO `sys_i18n` VALUES (752, 'job.ne_alarm_state_check_cmd', '网元告警-内存/CPU/磁盘检查', 'NE Alarm-Memory/CPU/Disk Checks');
|
||||
INSERT INTO `sys_i18n` VALUES (753, 'job.ne_alarm_state_check_cmd_remark', '检查网元的内存/CPU/磁盘检查健康状况,在出现过阈值时发出警报。\r\n\r\nAlarm type:\r\nCommunicationAlarm=1\r\nEquipmentAlarm=2\r\nProcessingFailure=3\r\nEnvironmentalAlarm=4\r\nQualityOfServiceAlarm=5\r\n\r\nSeverity:\r\nCritical=1\r\nMajor=2\r\nMinor=3\r\nWarning=4\r\n\r\nAddInfo: 告警补充信息\r\ncpuUseGt: CPU使用率大于, 范围0~100*CPU核心数\r\nmemUseGt: 内存使用率大于, 范围0~100%\r\ndiskUseGt: 磁盘使用率大于, 范围0~100%', 'Checks the memory/CPU/disk check health of the network element and sends alerts when thresholds are crossed.\n\nAlarm type:\nCommunicationAlarm=1\nEquipmentAlarm=2\nProcessingFailure=3\nEnvironmentalAlarm=4\nQualityOfServiceAlarm=5\n\nSeverity:\nCritical=1\nMajor=2\nMinor=3\nWarning=4\r\n\r\nAddInfo: Additional information on alarms\r\ncpuUseGt: CPU utilization is greater than, range 0~100*number of CPU cores\r\nmemUseGt: Memory utilization greater than, range 0 to 100%\r\ndiskUseGt: Disk utilization greater than, range 0 to 100%');
|
||||
@@ -824,6 +824,7 @@ INSERT INTO `sys_i18n` VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错
|
||||
INSERT INTO `sys_i18n` VALUES (807, 'dictData.cdr_cause_smsc.10', 'CAMEL 流程错误', 'CAMEL process error');
|
||||
INSERT INTO `sys_i18n` VALUES (808, 'menu.neData.udmAuth.exportDec', '导出解密', 'Export Dec');
|
||||
INSERT INTO `sys_i18n` VALUES (809, 'dictType.cdr_cause_smsc', 'SMSC CDR 响应原因代码类别类型', 'SMSC CDR Cause Code Type');
|
||||
INSERT INTO `sys_i18n` VALUES (810, 'job.backup_export_log_ne', '备份-网元日志数据定期导出', 'Backup-Periodic export of NE Log Data');
|
||||
|
||||
INSERT INTO `sys_i18n` VALUES (2000, 'menu.psap.agent', '座席', 'Agent');
|
||||
INSERT INTO `sys_i18n` VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information');
|
||||
|
||||
@@ -47,6 +47,7 @@ INSERT INTO `sys_job` VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_exp
|
||||
INSERT INTO `sys_job` VALUES (32, 'job.backup_export_cdr', 'SYSTEM', 'backup_export_cdr', '{\"dataType\":[\"ims\",\"smf\",\"sgwc\",\"smsc\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_cdr_remark');
|
||||
INSERT INTO `sys_job` VALUES (33, 'job.backup_export_log', 'SYSTEM', 'backup_export_log', '{\"dataType\":[\"operate\",\"login\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_log_remark');
|
||||
INSERT INTO `sys_job` VALUES (34, 'job.backup_export_kpi', 'SYSTEM', 'backup_export_kpi', '{\"dataType\":[\"ims\",\"amf\",\"udm\",\"smf\",\"pcf\",\"upf\",\"mme\",\"smsc\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_kpi_remark');
|
||||
INSERT INTO `sys_job` VALUES (35, 'job.backup_export_log_ne', 'SYSTEM', 'backup_export_log_ne', '', '0 59 23 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, '');
|
||||
|
||||
|
||||
-- INSERT INTO `sys_job` VALUES (34, 'job.backup_export_table_sys_log_operate', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"id\",\"title\",\"business_type\",\"opera_by\",\"opera_url_method\",\"opera_url\",\"opera_ip\",\"status\",\"opera_time\",\"cost_time\"],\"tableName\":\"sys_log_operate\",\"backupPath\":\"/log/operate_log\"}', '0 0 0/1 * * ?', '3', '0', '0', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_sys_log_operate_remark');
|
||||
|
||||
@@ -761,7 +761,7 @@ REPLACE INTO `sys_i18n` VALUES (746, 'dictData.cdr_sip_code_cause.580', '因其
|
||||
REPLACE INTO `sys_i18n` VALUES (747, 'dictData.cdr_sip_code_cause.603', '被叫拒接', 'MT explicitly rejected the call');
|
||||
REPLACE INTO `sys_i18n` VALUES (748, 'dictData.cdr_sip_code_cause.606', '呼叫已到达用户设备,但会话设置的某些部分不可接受', 'The call reached the user’s device, but some parts of the session setup weren it acceptable');
|
||||
REPLACE INTO `sys_i18n` VALUES (749, 'dictType.cdr_sip_code_cause', 'IMS-Voice-SIP响应代码类别类型原因', 'IMS-Voice-SIP Response Code Category Type Cause');
|
||||
REPLACE INTO `sys_i18n` VALUES (750, 'job.backup_export_log', '备份-日志数据定期导出', 'Backup-Periodic export of Log Data');
|
||||
REPLACE INTO `sys_i18n` VALUES (750, 'job.backup_export_log', '备份-系统日志数据定期导出', 'Backup-Periodic export of System Log Data');
|
||||
REPLACE INTO `sys_i18n` VALUES (751, 'job.backup_export_log_remark', 'dataType: 类型支持 operate/login\nfileType: 文件类型 csv/xlsx\nhour: 数据时间从任务执行时间前的小时数', 'Backup-Periodic export of dataType: type support operate/login\nfileType: file type csv/xlsx\nhour: data time from the hour before the task execution time');
|
||||
REPLACE INTO `sys_i18n` VALUES (752, 'job.ne_alarm_state_check_cmd', '网元告警-内存/CPU/磁盘检查', 'NE Alarm-Memory/CPU/Disk Checks');
|
||||
REPLACE INTO `sys_i18n` VALUES (753, 'job.ne_alarm_state_check_cmd_remark', '检查网元的内存/CPU/磁盘检查健康状况,在出现过阈值时发出警报。\r\n\r\nAlarm type:\r\nCommunicationAlarm=1\r\nEquipmentAlarm=2\r\nProcessingFailure=3\r\nEnvironmentalAlarm=4\r\nQualityOfServiceAlarm=5\r\n\r\nSeverity:\r\nCritical=1\r\nMajor=2\r\nMinor=3\r\nWarning=4\r\n\r\nAddInfo: 告警补充信息\r\ncpuUseGt: CPU使用率大于, 范围0~100*CPU核心数\r\nmemUseGt: 内存使用率大于, 范围0~100%\r\ndiskUseGt: 磁盘使用率大于, 范围0~100%', 'Checks the memory/CPU/disk check health of the network element and sends alerts when thresholds are crossed.\n\nAlarm type:\nCommunicationAlarm=1\nEquipmentAlarm=2\nProcessingFailure=3\nEnvironmentalAlarm=4\nQualityOfServiceAlarm=5\n\nSeverity:\nCritical=1\nMajor=2\nMinor=3\nWarning=4\r\n\r\nAddInfo: Additional information on alarms\r\ncpuUseGt: CPU utilization is greater than, range 0~100*number of CPU cores\r\nmemUseGt: Memory utilization greater than, range 0 to 100%\r\ndiskUseGt: Disk utilization greater than, range 0 to 100%');
|
||||
@@ -821,6 +821,7 @@ REPLACE INTO `sys_i18n` VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错
|
||||
REPLACE INTO `sys_i18n` VALUES (807, 'dictData.cdr_cause_smsc.10', 'CAMEL 流程错误', 'CAMEL process error');
|
||||
REPLACE INTO `sys_i18n` VALUES (808, 'menu.neData.udmAuth.exportDec', '导出解密', 'Export Dec');
|
||||
REPLACE INTO `sys_i18n` VALUES (809, 'dictType.cdr_cause_smsc', 'SMSC CDR 响应原因代码类别类型', 'SMSC CDR Cause Code Type');
|
||||
REPLACE INTO `sys_i18n` VALUES (810, 'job.backup_export_log_ne', '备份-网元日志数据定期导出', 'Backup-Periodic export of NE Log Data');
|
||||
|
||||
REPLACE INTO `sys_i18n` VALUES (2000, 'menu.psap.agent', '座席', 'Agent');
|
||||
REPLACE INTO `sys_i18n` VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information');
|
||||
|
||||
@@ -63,6 +63,7 @@ REPLACE INTO `sys_job` VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_ex
|
||||
REPLACE INTO `sys_job` VALUES (32, 'job.backup_export_cdr', 'SYSTEM', 'backup_export_cdr', '{\"dataType\":[\"ims\",\"smf\",\"sgwc\",\"smsc\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_cdr_remark');
|
||||
REPLACE INTO `sys_job` VALUES (33, 'job.backup_export_log', 'SYSTEM', 'backup_export_log', '{\"dataType\":[\"operate\",\"login\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_log_remark');
|
||||
REPLACE INTO `sys_job` VALUES (34, 'job.backup_export_kpi', 'SYSTEM', 'backup_export_kpi', '{\"dataType\":[\"ims\",\"amf\",\"udm\",\"smf\",\"pcf\",\"upf\",\"mme\",\"smsc\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_kpi_remark');
|
||||
REPLACE INTO `sys_job` VALUES (35, 'job.backup_export_log_ne', 'SYSTEM', 'backup_export_log_ne', '', '0 59 23 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, '');
|
||||
|
||||
|
||||
-- REPLACE INTO `sys_job` VALUES (34, 'job.backup_export_table_sys_log_operate', 'SYSTEM', 'backup_export_table', '{\"hour\":1,\"columns\":[\"id\",\"title\",\"business_type\",\"opera_by\",\"opera_url_method\",\"opera_url\",\"opera_ip\",\"status\",\"opera_time\",\"cost_time\"],\"tableName\":\"sys_log_operate\",\"backupPath\":\"/log/operate_log\"}', '0 0 0/1 * * ?', '3', '0', '0', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.backup_export_table_sys_log_operate_remark');
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user