From 7118e163b37ba736d62ded3fef69043d668743fc Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 11 Oct 2025 19:08:09 +0800 Subject: [PATCH 1/6] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=202.2510.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d83c99f6..1045b019 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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字段 From 2ed73d9683d4230df0df5a5fecadf7b34d6ecc7e Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 11 Oct 2025 19:41:15 +0800 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=E8=AE=B0=E5=BD=95=E5=86=B2=E7=AA=81?= =?UTF-8?q?805?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/database/lite/install/sys_i18n.sql | 2 +- build/database/lite/upgrade/upg_sys_i18n.sql | 2 +- build/database/std/install/sys_i18n.sql | 2 +- build/database/std/upgrade/upg_sys_i18n.sql | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/database/lite/install/sys_i18n.sql b/build/database/lite/install/sys_i18n.sql index 262fa2de..0f77d089 100644 --- a/build/database/lite/install/sys_i18n.sql +++ b/build/database/lite/install/sys_i18n.sql @@ -985,7 +985,7 @@ INSERT INTO "sys_i18n" VALUES (801, 'dictData.cdr_cause_smsc.4', '未知服务 INSERT INTO "sys_i18n" VALUES (802, 'dictData.cdr_cause_smsc.5', '消息源数据中缺少必需参数源地址(RP-OA)', 'Missing Required Parameter Originating Address(RP-OA) in Message Originating data'); INSERT INTO "sys_i18n" VALUES (803, 'dictData.cdr_cause_smsc.6', 'SMSC解码错误或消息来源数据', 'Error in smsc decoding Message Originating data'); INSERT INTO "sys_i18n" VALUES (804, 'dictData.cdr_cause_smsc.7', '消息发起路由失败(无法确定如何路由呼叫号码(通过4G/2G))', 'Message Originating routing failed(not know how to route called number(via 4G/2g))'); -INSERT INTO "sys_i18n" VALUES (804, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包(cscf→smsc)', 'SMSC not receive RP-ACK pkg(cscf->smsc)'); +INSERT INTO "sys_i18n" VALUES (805, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包(cscf→smsc)', 'SMSC not receive RP-ACK pkg(cscf->smsc)'); INSERT INTO "sys_i18n" VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错误的RP-ACK数据包(cscf→smsc)', 'SMSC receive wrong RP-ACK pkg(cscf->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'); diff --git a/build/database/lite/upgrade/upg_sys_i18n.sql b/build/database/lite/upgrade/upg_sys_i18n.sql index 013b572e..1bdb5992 100644 --- a/build/database/lite/upgrade/upg_sys_i18n.sql +++ b/build/database/lite/upgrade/upg_sys_i18n.sql @@ -984,7 +984,7 @@ REPLACE INTO "sys_i18n" VALUES (801, 'dictData.cdr_cause_smsc.4', '未知服务 REPLACE INTO "sys_i18n" VALUES (802, 'dictData.cdr_cause_smsc.5', '消息源数据中缺少必需参数源地址(RP-OA)', 'Missing Required Parameter Originating Address(RP-OA) in Message Originating data'); REPLACE INTO "sys_i18n" VALUES (803, 'dictData.cdr_cause_smsc.6', 'SMSC解码错误或消息来源数据', 'Error in smsc decoding Message Originating data'); REPLACE INTO "sys_i18n" VALUES (804, 'dictData.cdr_cause_smsc.7', '消息发起路由失败(无法确定如何路由呼叫号码(通过4G/2G))', 'Message Originating routing failed(not know how to route called number(via 4G/2g))'); -REPLACE INTO "sys_i18n" VALUES (804, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包(cscf→smsc)', 'SMSC not receive RP-ACK pkg(cscf->smsc)'); +REPLACE INTO "sys_i18n" VALUES (805, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包(cscf→smsc)', 'SMSC not receive RP-ACK pkg(cscf->smsc)'); REPLACE INTO "sys_i18n" VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错误的RP-ACK数据包(cscf→smsc)', 'SMSC receive wrong RP-ACK pkg(cscf->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'); diff --git a/build/database/std/install/sys_i18n.sql b/build/database/std/install/sys_i18n.sql index 51a06373..86ce5288 100644 --- a/build/database/std/install/sys_i18n.sql +++ b/build/database/std/install/sys_i18n.sql @@ -819,7 +819,7 @@ INSERT INTO `sys_i18n` VALUES (801, 'dictData.cdr_cause_smsc.4', '未知服务 INSERT INTO `sys_i18n` VALUES (802, 'dictData.cdr_cause_smsc.5', '消息源数据中缺少必需参数源地址(RP-OA)', 'Missing Required Parameter Originating Address(RP-OA) in Message Originating data'); INSERT INTO `sys_i18n` VALUES (803, 'dictData.cdr_cause_smsc.6', 'SMSC解码错误或消息来源数据', 'Error in smsc decoding Message Originating data'); INSERT INTO `sys_i18n` VALUES (804, 'dictData.cdr_cause_smsc.7', '消息发起路由失败(无法确定如何路由呼叫号码(通过4G/2G))', 'Message Originating routing failed(not know how to route called number(via 4G/2g))'); -INSERT INTO `sys_i18n` VALUES (804, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包(cscf→smsc)', 'SMSC not receive RP-ACK pkg(cscf->smsc)'); +INSERT INTO `sys_i18n` VALUES (805, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包(cscf→smsc)', 'SMSC not receive RP-ACK pkg(cscf->smsc)'); INSERT INTO `sys_i18n` VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错误的RP-ACK数据包(cscf→smsc)', 'SMSC receive wrong RP-ACK pkg(cscf->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'); diff --git a/build/database/std/upgrade/upg_sys_i18n.sql b/build/database/std/upgrade/upg_sys_i18n.sql index f3f02234..152ddec5 100644 --- a/build/database/std/upgrade/upg_sys_i18n.sql +++ b/build/database/std/upgrade/upg_sys_i18n.sql @@ -816,7 +816,7 @@ REPLACE INTO `sys_i18n` VALUES (801, 'dictData.cdr_cause_smsc.4', '未知服务 REPLACE INTO `sys_i18n` VALUES (802, 'dictData.cdr_cause_smsc.5', '消息源数据中缺少必需参数源地址(RP-OA)', 'Missing Required Parameter Originating Address(RP-OA) in Message Originating data'); REPLACE INTO `sys_i18n` VALUES (803, 'dictData.cdr_cause_smsc.6', 'SMSC解码错误或消息来源数据', 'Error in smsc decoding Message Originating data'); REPLACE INTO `sys_i18n` VALUES (804, 'dictData.cdr_cause_smsc.7', '消息发起路由失败(无法确定如何路由呼叫号码(通过4G/2G))', 'Message Originating routing failed(not know how to route called number(via 4G/2g))'); -REPLACE INTO `sys_i18n` VALUES (804, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包(cscf→smsc)', 'SMSC not receive RP-ACK pkg(cscf->smsc)'); +REPLACE INTO `sys_i18n` VALUES (805, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包(cscf→smsc)', 'SMSC not receive RP-ACK pkg(cscf->smsc)'); REPLACE INTO `sys_i18n` VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错误的RP-ACK数据包(cscf→smsc)', 'SMSC receive wrong RP-ACK pkg(cscf->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'); From 45b6263679f763110f9bd8775f5d5d05715a6ba3 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 14 Oct 2025 11:06:27 +0800 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=E5=A4=87=E4=BB=BD=E7=BD=91?= =?UTF-8?q?=E5=85=83Log=E6=96=87=E4=BB=B6=E5=88=B0=E7=BD=91=E7=AE=A1?= =?UTF-8?q?=E6=94=AF=E6=8C=81ftp=E8=BD=AC=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/database/lite/install/sys_i18n.sql | 3 +- build/database/lite/install/sys_job.sql | 1 + build/database/lite/upgrade/upg_sys_i18n.sql | 3 +- build/database/lite/upgrade/upg_sys_job.sql | 1 + build/database/std/install/sys_i18n.sql | 3 +- build/database/std/install/sys_job.sql | 1 + build/database/std/upgrade/upg_sys_i18n.sql | 3 +- build/database/std/upgrade/upg_sys_job.sql | 1 + .../backup_export_log_ne.go | 140 ++++++++++++++++++ src/modules/crontask/processor/processor.go | 5 +- 10 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 src/modules/crontask/processor/backup_export_log_ne/backup_export_log_ne.go diff --git a/build/database/lite/install/sys_i18n.sql b/build/database/lite/install/sys_i18n.sql index 0f77d089..d7826ae2 100644 --- a/build/database/lite/install/sys_i18n.sql +++ b/build/database/lite/install/sys_i18n.sql @@ -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'); diff --git a/build/database/lite/install/sys_job.sql b/build/database/lite/install/sys_job.sql index f86ec067..57d89899 100644 --- a/build/database/lite/install/sys_job.sql +++ b/build/database/lite/install/sys_job.sql @@ -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, ''); diff --git a/build/database/lite/upgrade/upg_sys_i18n.sql b/build/database/lite/upgrade/upg_sys_i18n.sql index 1bdb5992..d887cdce 100644 --- a/build/database/lite/upgrade/upg_sys_i18n.sql +++ b/build/database/lite/upgrade/upg_sys_i18n.sql @@ -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'); diff --git a/build/database/lite/upgrade/upg_sys_job.sql b/build/database/lite/upgrade/upg_sys_job.sql index 20043760..7cbe43e1 100644 --- a/build/database/lite/upgrade/upg_sys_job.sql +++ b/build/database/lite/upgrade/upg_sys_job.sql @@ -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, ''); diff --git a/build/database/std/install/sys_i18n.sql b/build/database/std/install/sys_i18n.sql index 86ce5288..c536a3a2 100644 --- a/build/database/std/install/sys_i18n.sql +++ b/build/database/std/install/sys_i18n.sql @@ -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'); diff --git a/build/database/std/install/sys_job.sql b/build/database/std/install/sys_job.sql index 6e0412a5..c5a84331 100644 --- a/build/database/std/install/sys_job.sql +++ b/build/database/std/install/sys_job.sql @@ -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'); diff --git a/build/database/std/upgrade/upg_sys_i18n.sql b/build/database/std/upgrade/upg_sys_i18n.sql index 152ddec5..2083fdcc 100644 --- a/build/database/std/upgrade/upg_sys_i18n.sql +++ b/build/database/std/upgrade/upg_sys_i18n.sql @@ -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'); diff --git a/build/database/std/upgrade/upg_sys_job.sql b/build/database/std/upgrade/upg_sys_job.sql index 893c15c1..3694c45c 100644 --- a/build/database/std/upgrade/upg_sys_job.sql +++ b/build/database/std/upgrade/upg_sys_job.sql @@ -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'); diff --git a/src/modules/crontask/processor/backup_export_log_ne/backup_export_log_ne.go b/src/modules/crontask/processor/backup_export_log_ne/backup_export_log_ne.go new file mode 100644 index 00000000..fe50dd7c --- /dev/null +++ b/src/modules/crontask/processor/backup_export_log_ne/backup_export_log_ne.go @@ -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 +} diff --git a/src/modules/crontask/processor/processor.go b/src/modules/crontask/processor/processor.go index a87b84ea..d64fb22d 100644 --- a/src/modules/crontask/processor/processor.go +++ b/src/modules/crontask/processor/processor.go @@ -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) } From 654c2519292d80418d0f51d3245405183d438949 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 14 Oct 2025 11:07:08 +0800 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=E8=AE=BE=E7=BD=AE=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E9=94=81=E8=B6=85=E6=97=B61=E5=88=86=E9=92=9F?= =?UTF-8?q?=E8=A7=A3=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crontask/processor/backup_export_cdr/backup_export_cdr.go | 2 +- .../crontask/processor/backup_export_kpi/backup_export_kpi.go | 2 +- .../crontask/processor/backup_export_log/backup_export_log.go | 2 +- .../processor/backup_export_table/backup_export_table.go | 2 +- .../crontask/processor/backup_export_udm/backup_export_udm.go | 2 +- .../processor/backup_remove_file/backup_remove_file.go | 2 +- .../processor/delete_alarm_record/delete_alarm_record.go | 2 +- .../crontask/processor/delete_cdr_record/delete_cdr_record.go | 2 +- .../processor/delete_data_record/delete_data_record.go | 2 +- .../crontask/processor/delete_kpi_record/delete_kpi_record.go | 2 +- .../delete_ne_config_backup/delete_ne_config_backup.go | 2 +- .../processor/delete_uenb_record/delete_uenb_record.go | 2 +- .../processor/monitor_sys_resource/monitor_sys_resource.go | 3 ++- .../processor/ne_alarm_state_check/ne_alarm_state_check.go | 2 +- .../ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go | 2 +- .../ne_alarm_state_check_license.go | 2 +- .../crontask/processor/ne_config_backup/ne_config_backup.go | 3 ++- src/modules/crontask/processor/ne_data_udm/ne_data_udm.go | 3 ++- 18 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go b/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go index 7e2c0652..ce197a51 100644 --- a/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go +++ b/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go @@ -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) diff --git a/src/modules/crontask/processor/backup_export_kpi/backup_export_kpi.go b/src/modules/crontask/processor/backup_export_kpi/backup_export_kpi.go index 15d0f910..dbe9095f 100644 --- a/src/modules/crontask/processor/backup_export_kpi/backup_export_kpi.go +++ b/src/modules/crontask/processor/backup_export_kpi/backup_export_kpi.go @@ -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) diff --git a/src/modules/crontask/processor/backup_export_log/backup_export_log.go b/src/modules/crontask/processor/backup_export_log/backup_export_log.go index ccb6d00b..99009702 100644 --- a/src/modules/crontask/processor/backup_export_log/backup_export_log.go +++ b/src/modules/crontask/processor/backup_export_log/backup_export_log.go @@ -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) diff --git a/src/modules/crontask/processor/backup_export_table/backup_export_table.go b/src/modules/crontask/processor/backup_export_table/backup_export_table.go index 2d817186..6112a9bc 100644 --- a/src/modules/crontask/processor/backup_export_table/backup_export_table.go +++ b/src/modules/crontask/processor/backup_export_table/backup_export_table.go @@ -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) diff --git a/src/modules/crontask/processor/backup_export_udm/backup_export_udm.go b/src/modules/crontask/processor/backup_export_udm/backup_export_udm.go index a547c255..c417ee90 100644 --- a/src/modules/crontask/processor/backup_export_udm/backup_export_udm.go +++ b/src/modules/crontask/processor/backup_export_udm/backup_export_udm.go @@ -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) diff --git a/src/modules/crontask/processor/backup_remove_file/backup_remove_file.go b/src/modules/crontask/processor/backup_remove_file/backup_remove_file.go index 5e8866e6..11bc4ad7 100644 --- a/src/modules/crontask/processor/backup_remove_file/backup_remove_file.go +++ b/src/modules/crontask/processor/backup_remove_file/backup_remove_file.go @@ -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) diff --git a/src/modules/crontask/processor/delete_alarm_record/delete_alarm_record.go b/src/modules/crontask/processor/delete_alarm_record/delete_alarm_record.go index 9435f6f4..d044ae82 100644 --- a/src/modules/crontask/processor/delete_alarm_record/delete_alarm_record.go +++ b/src/modules/crontask/processor/delete_alarm_record/delete_alarm_record.go @@ -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) diff --git a/src/modules/crontask/processor/delete_cdr_record/delete_cdr_record.go b/src/modules/crontask/processor/delete_cdr_record/delete_cdr_record.go index b5483f73..08b29805 100644 --- a/src/modules/crontask/processor/delete_cdr_record/delete_cdr_record.go +++ b/src/modules/crontask/processor/delete_cdr_record/delete_cdr_record.go @@ -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) diff --git a/src/modules/crontask/processor/delete_data_record/delete_data_record.go b/src/modules/crontask/processor/delete_data_record/delete_data_record.go index b4a44288..bbecdf83 100644 --- a/src/modules/crontask/processor/delete_data_record/delete_data_record.go +++ b/src/modules/crontask/processor/delete_data_record/delete_data_record.go @@ -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) diff --git a/src/modules/crontask/processor/delete_kpi_record/delete_kpi_record.go b/src/modules/crontask/processor/delete_kpi_record/delete_kpi_record.go index 68597053..0973f8aa 100644 --- a/src/modules/crontask/processor/delete_kpi_record/delete_kpi_record.go +++ b/src/modules/crontask/processor/delete_kpi_record/delete_kpi_record.go @@ -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) diff --git a/src/modules/crontask/processor/delete_ne_config_backup/delete_ne_config_backup.go b/src/modules/crontask/processor/delete_ne_config_backup/delete_ne_config_backup.go index 583f3920..c06b45c5 100644 --- a/src/modules/crontask/processor/delete_ne_config_backup/delete_ne_config_backup.go +++ b/src/modules/crontask/processor/delete_ne_config_backup/delete_ne_config_backup.go @@ -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) diff --git a/src/modules/crontask/processor/delete_uenb_record/delete_uenb_record.go b/src/modules/crontask/processor/delete_uenb_record/delete_uenb_record.go index 289241ec..b62be732 100644 --- a/src/modules/crontask/processor/delete_uenb_record/delete_uenb_record.go +++ b/src/modules/crontask/processor/delete_uenb_record/delete_uenb_record.go @@ -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) diff --git a/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go b/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go index cc037dbf..349ae6e2 100644 --- a/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go +++ b/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go @@ -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) diff --git a/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go b/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go index dca6fb1d..682c75fa 100644 --- a/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go +++ b/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go @@ -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) diff --git a/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go b/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go index 53402749..881c1cf8 100644 --- a/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go +++ b/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go @@ -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) diff --git a/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go b/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go index 007d520b..29fed408 100644 --- a/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go +++ b/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go @@ -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) diff --git a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go index aa7b188d..08e14fdc 100644 --- a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go +++ b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go @@ -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) diff --git a/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go b/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go index 699a3b19..8bf5b8a1 100644 --- a/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go +++ b/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go @@ -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) From b75796c6344dba4d7f77d3aab472d157eb79c6c3 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 14 Oct 2025 11:18:39 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20=E5=A4=87=E4=BB=BDOMC=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E5=AF=BC=E5=85=A5=E7=BC=BA=E5=B0=91?= =?UTF-8?q?omc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_data/service/backup.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/network_data/service/backup.go b/src/modules/network_data/service/backup.go index d15b6b05..51b236ba 100644 --- a/src/modules/network_data/service/backup.go +++ b/src/modules/network_data/service/backup.go @@ -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 @@ -149,7 +149,7 @@ func (r Backup) BackupOMCImport(localZipFile string) error { } // 新增网元信息 for _, neInfo := range neInfos { - if neInfo.NeId == "" || neInfo.NeType == "OMC" { + if neInfo.NeId == "" { continue } // 删除网元信息 From e02362283f1ee78ef14d8df83ac81d8af6944dba Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 14 Oct 2025 14:34:49 +0800 Subject: [PATCH 6/6] =?UTF-8?q?fix:=20=E6=95=B0=E6=8D=AE=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=9D=A1=E4=BB=B6=E6=8E=92=E5=BA=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network_data/repository/cdr_event.go | 62 ++++--------------- .../network_data/repository/kpi_c_report.go | 12 ++-- .../network_data/repository/kpi_report.go | 12 ++-- .../network_data/repository/udm_auth.go | 12 ++-- .../network_data/repository/udm_extend.go | 21 ++++--- .../network_data/repository/udm_sub.go | 12 ++-- .../network_data/repository/udm_voip.go | 14 ++--- .../network_data/repository/udm_volte_ims.go | 14 ++--- .../network_data/repository/ue_event.go | 62 ++++--------------- .../network_element/repository/ne_host.go | 27 ++++---- 10 files changed, 79 insertions(+), 169 deletions(-) diff --git a/src/modules/network_data/repository/cdr_event.go b/src/modules/network_data/repository/cdr_event.go index ae9cae73..e269e7b3 100644 --- a/src/modules/network_data/repository/cdr_event.go +++ b/src/modules/network_data/repository/cdr_event.go @@ -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 } diff --git a/src/modules/network_data/repository/kpi_c_report.go b/src/modules/network_data/repository/kpi_c_report.go index f87a7c51..5280c730 100644 --- a/src/modules/network_data/repository/kpi_c_report.go +++ b/src/modules/network_data/repository/kpi_c_report.go @@ -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 } diff --git a/src/modules/network_data/repository/kpi_report.go b/src/modules/network_data/repository/kpi_report.go index 1ff0b8b1..82e5fb75 100644 --- a/src/modules/network_data/repository/kpi_report.go +++ b/src/modules/network_data/repository/kpi_report.go @@ -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 } diff --git a/src/modules/network_data/repository/udm_auth.go b/src/modules/network_data/repository/udm_auth.go index c665b9de..e9231a2d 100644 --- a/src/modules/network_data/repository/udm_auth.go +++ b/src/modules/network_data/repository/udm_auth.go @@ -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 } diff --git a/src/modules/network_data/repository/udm_extend.go b/src/modules/network_data/repository/udm_extend.go index 00a4d73e..b027832f 100644 --- a/src/modules/network_data/repository/udm_extend.go +++ b/src/modules/network_data/repository/udm_extend.go @@ -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 diff --git a/src/modules/network_data/repository/udm_sub.go b/src/modules/network_data/repository/udm_sub.go index 2a939045..977cd799 100644 --- a/src/modules/network_data/repository/udm_sub.go +++ b/src/modules/network_data/repository/udm_sub.go @@ -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 } diff --git a/src/modules/network_data/repository/udm_voip.go b/src/modules/network_data/repository/udm_voip.go index ada692aa..dfb5a0db 100644 --- a/src/modules/network_data/repository/udm_voip.go +++ b/src/modules/network_data/repository/udm_voip.go @@ -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 } diff --git a/src/modules/network_data/repository/udm_volte_ims.go b/src/modules/network_data/repository/udm_volte_ims.go index 984ccc4c..0871d9b9 100644 --- a/src/modules/network_data/repository/udm_volte_ims.go +++ b/src/modules/network_data/repository/udm_volte_ims.go @@ -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 } diff --git a/src/modules/network_data/repository/ue_event.go b/src/modules/network_data/repository/ue_event.go index ef98e2f6..465f1e28 100644 --- a/src/modules/network_data/repository/ue_event.go +++ b/src/modules/network_data/repository/ue_event.go @@ -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 } diff --git a/src/modules/network_element/repository/ne_host.go b/src/modules/network_element/repository/ne_host.go index c2102736..d89cc747 100644 --- a/src/modules/network_element/repository/ne_host.go +++ b/src/modules/network_element/repository/ne_host.go @@ -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