From b01c38c4ac00b4d751fe11625697e23db8f3d4e3 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 18:00:20 +0800 Subject: [PATCH 1/6] =?UTF-8?q?del:=20=E7=A7=BB=E9=99=A4param=5Fconfig?= =?UTF-8?q?=E8=A1=A8=E7=9B=B8=E5=85=B3=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 10 - config/mml_map/http_mml_map.json | 17 +- database/common/mml_command.sql | 2 +- database/common/mml_http_map.sql | 2 +- database/common/param_config.sql | 114 ---------- lib/dborm/dborm.go | 62 ----- tools/loadpconf/db.go | 101 --------- tools/loadpconf/load.go | 375 ------------------------------- tools/loadpconf/loadpconf.go | 21 -- tools/loadpconf/loadpconf.yaml | 17 -- tools/loadpconf/makefile | 22 -- tools/misc/tables_c.lst | 2 +- 12 files changed, 9 insertions(+), 736 deletions(-) delete mode 100644 database/common/param_config.sql delete mode 100644 tools/loadpconf/db.go delete mode 100644 tools/loadpconf/load.go delete mode 100644 tools/loadpconf/loadpconf.go delete mode 100644 tools/loadpconf/loadpconf.yaml delete mode 100644 tools/loadpconf/makefile diff --git a/.vscode/launch.json b/.vscode/launch.json index 3ce5d98b..305ed684 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -29,15 +29,6 @@ "program": "d:/local.git/be.ems/sshsvc/sshsvc.go", "console": "integratedTerminal" }, - { - "name": "debug loadpconf", - "type": "go", - "request": "launch", - "mode": "debug", - "program": "d:/local.git/be.ems/tools/loadpconf", - "args": ["-p","../../config/param/smf_param_config.yaml"], - "console": "integratedTerminal" - }, { "name": "debug crontask", "type": "go", @@ -52,7 +43,6 @@ "request": "launch", "mode": "debug", "program": "d:/local.git/be.ems/tools/encode", - //"args": ["-p","../../config/param/smf_param_config.yaml"], "console": "integratedTerminal" } ] diff --git a/config/mml_map/http_mml_map.json b/config/mml_map/http_mml_map.json index 8e8ec408..d70652ec 100644 --- a/config/mml_map/http_mml_map.json +++ b/config/mml_map/http_mml_map.json @@ -890,7 +890,7 @@ } -"param_config": { +"ne_config": { "retFmt": "GetDB", "retMsg": "RetCode = %d operation succeeded\n\n", "errMsg": "ErrorCode = %d operation failed: %s\n\n", @@ -903,27 +903,22 @@ "cols": [ { "name": "ne_type", - "display": "NE type", + "display": "NE Type", "length": 10 }, { - "name": "ne_id", - "display": "NE ID", - "length": 28 - }, - { - "name": "top_tag", - "display": "Parameters tag", + "name": "param_display", + "display": "Parameter Display", "length": 128 }, { "name": "param_name", - "display": "Parameter name list", + "display": "Parameter Name", "length": 256 }, { "name": "param_value", - "display": "Parameter value list", + "display": "Parameter Value", "length": 256 } ], diff --git a/database/common/mml_command.sql b/database/common/mml_command.sql index 302d0ed4..43d1e488 100644 --- a/database/common/mml_command.sql +++ b/database/common/mml_command.sql @@ -43,7 +43,7 @@ INSERT INTO `mml_command` VALUES (1594, 'OMC', 'neManagement', 'Network Element INSERT INTO `mml_command` VALUES (1595, 'OMC', 'neManagement', 'Network Element Management', 'add', 'neinfo', 'Add Network Element', '[{\"alias\":\"ne_type\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"netype\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"neid\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"rm_uid\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Resource management UID\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"rmuid\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ip\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"port\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_name\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE name\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"nename\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"pv_flag\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"PV flag\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"pvflag\",\"optional\":\"false\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1596, 'OMC', 'neManagement', 'Network Element Management', 'mod', 'neinfo', 'Modify Network Element', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"rm_uid\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Resource management UID\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"rmuid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ip\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"ip\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"port\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"port\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_name\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE name\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"nename\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"pv_flag\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"PV flag\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"pvflag\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1597, 'OMC', 'neManagement', 'Network Element Management', 'del', 'neinfo', 'Delete Network Element', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"name\":\"netype\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"name\":\"neid\",\"optional\":\"false\",\"type\":\"string\"}]', 'Active'); -INSERT INTO `mml_command` VALUES (1598, 'OMC', 'neConfigManagement', 'NE Config Parameter Management', 'dsp', 'neconfig', 'Display NE Config Parameter', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"top_tag\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Parameter tag\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"tag\",\"optional\":\"true\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_command` VALUES (1598, 'OMC', 'neConfigManagement', 'NE Config Parameter Management', 'dsp', 'neconfig', 'Display NE Config Parameter', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE Type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"param_display\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Parameters Display\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"paramDisplay\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1599, 'OMC', 'faultManagement', 'Fault Management', 'dsp', 'alarm', 'Display Alarm Information', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE UID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_name\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE name\",\"filter\":\"\",\"name\":\"nename\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"alarm_code\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm code\",\"filter\":\"\",\"name\":\"alarmcode\",\"optional\":\"true\",\"type\":\"int\"},{\"alias\":\"orig_severity\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Original severity\",\"filter\":\"{\\\"Critical\\\":\\\"Critical\\\",\\\"Major\\\":\\\"Major\\\",\\\"Minor\\\":\\\"Minor\\\",\\\"Warning\\\":\\\"Warning\\\",\\\"Event\\\":\\\"Event\\\"}\",\"name\":\"origseverity\",\"optional\":\"true\",\"type\":\"enum\"},{\"alias\":\"pv_flag\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"PV flag\",\"filter\":\"\",\"name\":\"pvflag\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"event_time\\u003e\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm event start time\",\"filter\":\"\",\"name\":\"starttime\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"event_time\\u003c\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm event end time\",\"filter\":\"\",\"name\":\"endtime\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"alarm_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm type\",\"filter\":\"{\\\"CommunicationAlarm\\\":\\\"CommunicationAlarm\\\",\\\"EquipmentAlarm\\\":\\\"EquipmentAlarm\\\",\\\"ProcessingFailure\\\":\\\"ProcessingFailure\\\",\\\"EnvironmentalAlarm\\\":\\\"EnvironmentalAlarm\\\",\\\"QualityOfServiceAlarm\\\":\\\"QualityOfServiceAlarm\\\"}\",\"name\":\"alarmtype\",\"optional\":\"true\",\"type\":\"enum\"},{\"alias\":\"alarm_status\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm status\",\"filter\":\"\",\"name\":\"alarmstatus\",\"optional\":\"true\",\"type\":\"int\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1600, 'OMC', 'systemCommand', 'Linux System Command', 'run', 'shell', 'Run Shell Command', '[{\"alias\":\"cmd\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Shell command\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); INSERT INTO `mml_command` VALUES (1601, 'OMC', 'licenseManagement', 'License Management', 'dsp', 'licenseinfo', 'Display NE License Information', '[{\"alias\":\"neType\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"neId\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"}]', 'Inactive'); diff --git a/database/common/mml_http_map.sql b/database/common/mml_http_map.sql index 48d9e647..b058e48d 100644 --- a/database/common/mml_http_map.sql +++ b/database/common/mml_http_map.sql @@ -65,7 +65,7 @@ INSERT INTO `mml_http_map` VALUES (22, 'OMC', 'act', 'measuretask', 'Put', '/api INSERT INTO `mml_http_map` VALUES (23, 'OMC', 'dea', 'measuretask', 'Put', '/api/rest/dataManagement/v1/omc_db/measure_task', NULL, NULL, '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"measure_task\",\r\n \"cols\": [\r\n {\r\n \"name\": \"status\",\r\n \"alias\": \"status\",\r\n \"type\": \"int\",\r\n \"length\": 11,\r\n \"value\": \"Inactive\"\r\n }\r\n ]\r\n}\r\n', '{\r\n \"retFmt\": \"PutDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); INSERT INTO `mml_http_map` VALUES (24, 'OMC', 'dsp', 'nbicm', 'Get', '/api/rest/dataManagement/v1/omc_db/nbi_cm', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NBI Resources Management\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"rm_uid\",\r\n \"display\": \"RM UID\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"user_label\",\r\n \"display\": \"User label\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"object_type\",\r\n \"display\": \"Object type\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"pv_flag\",\r\n \"display\": \"PV flag\",\r\n \"length\": 8\r\n },\r\n {\r\n \"name\": \"value_json\",\r\n \"display\": \"NBI resource management\",\r\n \"length\": 200\r\n } \r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}\r\n'); INSERT INTO `mml_http_map` VALUES (25, 'OMC', 'upg', 'neversion', 'Put', '/api/rest/dataManagement/v1/omc_db/ne_version', NULL, NULL, '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"ne_version\",\r\n \"cols\": [\r\n {\r\n \"name\": \"status\",\r\n \"alias\": \"status\",\r\n \"type\": \"string\",\r\n \"length\": 8,\r\n \"value\": \"Active\"\r\n }\r\n ]\r\n}', '{\r\n \"retFmt\": \"PutDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); -INSERT INTO `mml_http_map` VALUES (26, 'OMC', 'dsp', 'neconfig', 'Get', '/api/rest/dataManagement/v1/omc_db/param_config', NULL, 'SQL', '?SQL=select+ne_type,ne_id,top_tag,json_extract(param_json,\'$.*[*].name\')+AS+param_name,JSON_EXTRACT(param_json,\'$.*[*].value\')+as+param_value+from+param_config', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE Config Parameters\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"top_tag\",\r\n \"display\": \"Parameters tag\",\r\n \"length\": 128\r\n },\r\n {\r\n \"name\": \"param_name\",\r\n \"display\": \"Parameter name list\",\r\n \"length\": 256\r\n },\r\n {\r\n \"name\": \"param_value\",\r\n \"display\": \"Parameter value list\",\r\n \"length\": 256\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}'); +INSERT INTO `mml_http_map` VALUES (26, 'OMC', 'dsp', 'neconfig', 'Get', '/api/rest/dataManagement/v1/omc_db/ne_config', NULL, 'SQL', '?SQL=select+ne_type,param_display,JSON_UNQUOTE(json_extract(param_json,\'$[0].name\'))+as+param_name,JSON_UNQUOTE(json_extract(param_json,\'$[0].value\'))+as+param_value+from+ne_config', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE Config Parameters\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE Type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"param_display\",\r\n \"display\": \"Parameter Display\",\r\n \"length\": 128\r\n },\r\n {\r\n \"name\": \"param_name\",\r\n \"display\": \"Parameter Name\",\r\n \"length\": 256\r\n },\r\n {\r\n \"name\": \"param_value\",\r\n \"display\": \"Parameter Value\",\r\n \"length\": 256\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}'); INSERT INTO `mml_http_map` VALUES (27, 'OMC', 'lst', 'license', 'Get', '/api/rest/dataManagement/v1/omc_db/ne_license', NULL, 'loc', '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE License Information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"serial_no\",\r\n \"display\": \"Serial no\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"capcity\",\r\n \"display\": \"License capcity\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"used\",\r\n \"display\": \"License used\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"feature_enabled\",\r\n \"display\": \"Feature enabled\",\r\n \"length\": 30\r\n },\r\n {\r\n \"name\": \"expiration_date\",\r\n \"display\": \"License expiration date\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}'); INSERT INTO `mml_http_map` VALUES (28, 'OMC', 'dep', 'license', 'Put', '/api/rest/dataManagement/v1/omc_db/ne_license', NULL, 'loc', '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"ne_license\",\r\n \"callFunc\": \"DeploymentLicense\"\r\n}', '{\r\n \"retFmt\": \"DeleteDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); INSERT INTO `mml_http_map` VALUES (29, 'OMC', 'rel', 'license', 'Put', '/api/rest/dataManagement/v1/omc_db/ne_license', NULL, 'loc', '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"ne_license\",\r\n \"callFunc\": \"InstallLicense\"\r\n}', '{\r\n \"retFmt\": \"DeleteDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); diff --git a/database/common/param_config.sql b/database/common/param_config.sql deleted file mode 100644 index be2e722c..00000000 --- a/database/common/param_config.sql +++ /dev/null @@ -1,114 +0,0 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for param_config --- ---------------------------- -DROP TABLE IF EXISTS `param_config`; -CREATE TABLE `param_config` ( - `id` int NOT NULL AUTO_INCREMENT, - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', - `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', - `top_tag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `top_display` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `method` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作属性 get只读强制不可编辑删除 put可编辑 delete可删除 post可新增', - `param_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'accesss属性控制:只读read-only/read/ro 读写read-write', - PRIMARY KEY (`id`) USING BTREE, - KEY `idx_type_name` (`ne_type`,`top_tag`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元参数配置可用属性值'; - --- ---------------------------- --- Records of param_config --- ---------------------------- -INSERT INTO `param_config` VALUES (595, 'N3IWF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IKEBindAddress\",\"filter\":\"\",\"name\":\"ikeBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPBindAddress\",\"filter\":\"\",\"name\":\"gtpBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.161\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"n3iwf.5gc.mnc00.mcc460.pub.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"InternalIP\",\"filter\":\"\",\"name\":\"internalIP\",\"type\":\"string\",\"value\":\"172.16.1.190\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UdmIPAddrPort\",\"filter\":\"\",\"name\":\"udmAddr\",\"type\":\"string\",\"value\":\"172.16.1.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SmfIPAddress\",\"filter\":\"\",\"name\":\"smfIPAddr\",\"type\":\"string\",\"value\":\"172.16.1.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3IPAddress\",\"filter\":\"\",\"name\":\"n3IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6IPAddress\",\"filter\":\"\",\"name\":\"n6IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"}]}'); -INSERT INTO `param_config` VALUES (1106, 'AUSF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1107, 'NRF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.180\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1108, 'NRF', '', 'registeredNFs', 'Registered NFs', 'get', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF Type\",\"filter\":\"^.{1,128}$\",\"name\":\"nfType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Status\",\"filter\":\"^.{1,128}$\",\"name\":\"status\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"^.{1,128}$\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"^.{1,128}$\",\"name\":\"ipAddress\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1243, 'NSSF', '', 'general', 'General', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSSF Name\",\"filter\":\"\",\"name\":\"nssfName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1244, 'NSSF', '', 'sbi', 'SBI', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"\",\"name\":\"scheme\",\"type\":\"string\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv4\",\"filter\":\"\",\"name\":\"registerIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv4\",\"filter\":\"\",\"name\":\"bindingIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv6\",\"filter\":\"\",\"name\":\"registerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv6\",\"filter\":\"\",\"name\":\"bindingIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"name\":\"port\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv4\",\"filter\":\"\",\"name\":\"telnetIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv6\",\"filter\":\"\",\"name\":\"telnetIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet Port\",\"filter\":\"\",\"name\":\"telnetPort\",\"type\":\"int\",\"value\":\"4100\"}]}'); -INSERT INTO `param_config` VALUES (1245, 'NSSF', '', 'supportedNetworkSliceList', 'Supported Network Slice List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TAC\",\"filter\":\"\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SST\",\"filter\":\"\",\"name\":\"supportedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SD\",\"filter\":\"\",\"name\":\"supportedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SST\",\"filter\":\"\",\"name\":\"restrictedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SD\",\"filter\":\"\",\"name\":\"restrictedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF ID\",\"filter\":\"\",\"name\":\"nrfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSI ID\",\"filter\":\"\",\"name\":\"nsiId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Access Type\",\"filter\":\"\",\"name\":\"accessType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Set ID\",\"filter\":\"\",\"name\":\"amfSetId\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1246, 'NSSF', '', 'plmnMappingList', 'PLMN Mapping List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Operator Name\",\"filter\":\"\",\"name\":\"operatorName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"02\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SST\",\"filter\":\"\",\"name\":\"servingSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SD\",\"filter\":\"\",\"name\":\"servingSnssaiSd\",\"type\":\"string\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SST\",\"filter\":\"\",\"name\":\"homeSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SD\",\"filter\":\"\",\"name\":\"homeSnssaiSd\",\"type\":\"string\",\"value\":\"1\"}]}'); - --- AMF 更新时间2024/07/16 15:00 -INSERT INTO `param_config` VALUES (1473, 'AMF', '', 'system', 'System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Name\",\"filter\":\"0~64\",\"name\":\"amfName\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Relative Capacity\",\"filter\":\"0~255\",\"name\":\"relativeCapacity\",\"type\":\"int\",\"value\":\"255\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiServerIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiServerPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"0~64\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF URI\",\"filter\":\"0~64\",\"name\":\"ausfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"0~64\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF URI\",\"filter\":\"0~64\",\"name\":\"smfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.150:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"0~64\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LMF URI\",\"filter\":\"0~64\",\"name\":\"lmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.200:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NEF URI\",\"filter\":\"0~64\",\"name\":\"nefUri\",\"type\":\"string\",\"value\":\"http://172.16.5.210:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMEI Restriction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed IMEI Prefix\",\"filter\":\"0~128\",\"name\":\"allowedImeiPrefix\",\"type\":\"string\",\"value\":\"869583045\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Correction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN\",\"filter\":\"0~64\",\"name\":\"defaultDnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Integrity Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NIA0\\\",\\\"1\\\":\\\"NIA1\\\",\\\"2\\\":\\\"NIA2\\\",\\\"3\\\":\\\"NIA3\\\"}\",\"name\":\"integrityAlgorithm\",\"type\":\"enum\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Ciphering Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NEA0\\\",\\\"1\\\":\\\"NEA1\\\",\\\"2\\\":\\\"NEA2\\\",\\\"3\\\":\\\"NEA3\\\"}\",\"name\":\"cipheringAlgorithm\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3502\",\"filter\":\"1~65535\",\"name\":\"t3502\",\"type\":\"int\",\"value\":\"720\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3512\",\"filter\":\"1~65535\",\"name\":\"t3512\",\"type\":\"int\",\"value\":\"3600\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3513\",\"filter\":\"1~65535\",\"name\":\"t3513\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3522\",\"filter\":\"1~65535\",\"name\":\"t3522\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3550\",\"filter\":\"1~65535\",\"name\":\"t3550\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3555\",\"filter\":\"1~65535\",\"name\":\"t3555\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3560\",\"filter\":\"1~65535\",\"name\":\"t3560\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3565\",\"filter\":\"1~65535\",\"name\":\"t3565\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3570\",\"filter\":\"1~65535\",\"name\":\"t3570\",\"type\":\"int\",\"value\":\"6\"}]}'); -INSERT INTO `param_config` VALUES (1474, 'AMF', '', 'association', 'TNL Association List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NGAP IP\",\"filter\":\"0~64\",\"name\":\"ngapIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"NGAP SCTP Port\",\"filter\":\"0~65535\",\"name\":\"ngapSctpPort\",\"type\":\"int\",\"value\":\"38412\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Weight\",\"filter\":\"0~255\",\"name\":\"weightFactor\",\"type\":\"int\",\"value\":\"255\"}]}'); -INSERT INTO `param_config` VALUES (1475, 'AMF', '', 'guami', 'GUAMI List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1476, 'AMF', '', 'tai', 'TAI List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1477, 'AMF', '', 'slice', 'Slice List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~127\",\"display\":\"SST\",\"filter\":\"0~127\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"^[A-Fa-f0-9]{6}\",\"name\":\"sd\",\"type\":\"regex\",\"value\":\"000001\"}]}'); - -INSERT INTO `param_config` VALUES (1480, 'MOCNGW', '', 'system', 'System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP South Address\",\"filter\":\"0~64\",\"name\":\"s1apSouthAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP North Address\",\"filter\":\"0~64\",\"name\":\"s1apNorthAddr\",\"type\":\"string\",\"value\":\"192.168.8.163\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1048575\",\"display\":\"ENB ID\",\"filter\":\"0~1048575\",\"name\":\"enbId\",\"type\":\"int\",\"value\":\"24\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"userPlaneEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"}]}'); -INSERT INTO `param_config` VALUES (1481, 'MOCNGW', '', 'mme', 'MME List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP Address\",\"filter\":\"0~64\",\"name\":\"s1apAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S1AP Port\",\"filter\":\"0~65535\",\"name\":\"s1apPort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"}]}'); -INSERT INTO `param_config` VALUES (1482, 'MOCNGW', '', 'upgw', 'UPGW Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.1.159\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"PFCP Port\",\"filter\":\"0~65535\",\"name\":\"pfcpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U South Address\",\"filter\":\"0~64\",\"name\":\"gtpuSouthAddr\",\"type\":\"string\",\"value\":\"10.10.1.2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U North Address\",\"filter\":\"0~64\",\"name\":\"gtpuNorthAddr\",\"type\":\"string\",\"value\":\"192.168.7.123\"}]}'); -INSERT INTO `param_config` VALUES (1525, 'PCF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"}]}'); -INSERT INTO `param_config` VALUES (1526, 'PCF', '', 'serviceAreaRestriction', 'Service Area Restriction', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1527, 'PCF', '', 'pccRules', 'PCC Rules', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Precedence\",\"filter\":\"0~255\",\"name\":\"precedence\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP ID\",\"filter\":\"^.{1,63}$\",\"name\":\"appId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Template\",\"filter\":\"^.{1,255}$\",\"name\":\"flowTemplate\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"trafficControlId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1528, 'PCF', '', 'sessionRules', 'Session Rules', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrDl\",\"type\":\"string\",\"value\":\"200Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrUl\",\"type\":\"string\",\"value\":\"100Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Averaging Window\",\"filter\":\"0~4095\",\"name\":\"averagingWindow\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Data Burst Volume\",\"filter\":\"0~4095\",\"name\":\"maxDataBurstVolume\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1529, 'PCF', '', 'gxServer', 'Gx Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1530, 'PCF', '', 'rxServer', 'Rx Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1531, 'PCF', '', 'flowTemplate', 'Flow Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"^.{1,127}$\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"permit out ip from any to assigned\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Direction\",\"filter\":\"{\\\"0\\\":\\\"Unspecified\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Bidirectional\\\"}\",\"name\":\"flowDirection\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1532, 'PCF', '', 'qosTemplate', 'QoS Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default QoS Flow Indication\",\"filter\":\"false;true;\",\"name\":\"defQosFlowIndication\",\"type\":\"bool\",\"value\":\"false\"}]}'); -INSERT INTO `param_config` VALUES (1533, 'PCF', '', 'usageMonitoringTemplate', 'Usage Monitoring Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"umId\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold(KB)\",\"filter\":\"\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"5242880\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Uplink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdUplink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Downlink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdDownlink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time Threshold\",\"filter\":\"\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Time\",\"filter\":\"\",\"name\":\"inactivityTime\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1534, 'PCF', '', 'trafficControlTemplate', 'Traffic Control Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"tcId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Status\",\"filter\":\"{\\\"0\\\":\\\"Disable\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Enable\\\", \\\"4\\\":\\\"Remove\\\"}\",\"name\":\"flowStatus\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mute Notify\",\"filter\":\"false;true;\",\"name\":\"muteNotif\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Route to Location DNAI\",\"filter\":\"^.{1,63}$\",\"name\":\"dnai\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1535, 'PCF', '', 'headerEnrichTemplate', 'Header Enrich Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Type\",\"filter\":\"{\\\"0\\\":\\\"GPSI\\\", \\\"1\\\":\\\"SUPI\\\", \\\"2\\\":\\\"UE IP\\\", \\\"3\\\":\\\"User Location\\\", \\\"4\\\":\\\"DNN\\\"}\",\"name\":\"headerType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Name\",\"filter\":\"^.{1,63}$\",\"name\":\"headerName\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1591, 'SMSC', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cdrFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SM Validity\",\"filter\":\"0-2147483647\",\"name\":\"smValidity\",\"type\":\"int\",\"value\":\"259200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"logFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable local users.\",\"display\":\"Local Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable outbound roaming users.\",\"display\":\"Local Roaming Out Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localRoamingOutPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable inbound roaming users.\",\"display\":\"Visitor Roaming In Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"visitorRoamingInPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to other unattainable users.\",\"display\":\"Other Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"otherPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Define the maximum port number that the queue of pending SMS may grow to.\",\"display\":\"Polling Number\",\"filter\":\"0-64\",\"name\":\"pollingNumber\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"Specify the priority parameter of SM_RP_PRI. true = High; false = Low.\",\"display\":\"Priority Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"priorityFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable TP-Reply-Path parameter in the SMS-DELIVER data unit.\",\"display\":\"TP Reply Path Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"tpReplyPathFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMSC Domain\",\"filter\":\"0~16\",\"name\":\"smscDomain\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CSFB VoLTE Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbVolteFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Camel Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"camelFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SCF Address\",\"filter\":\"0~16\",\"name\":\"scfAddress\",\"type\":\"string\",\"value\":\"0.0.0.0\"}]}'); -INSERT INTO `param_config` VALUES (1592, 'SMSC', '', 'msisdnsegment', 'MSISDN Segment List', 'put', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start MSISDN\",\"filter\":\"0~32\",\"name\":\"startMSISDN\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End MSISDN\",\"filter\":\"0~32\",\"name\":\"endMSISDN\",\"type\":\"string\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1593, 'SMSC', '', 'smpplink', 'SMPP Link List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~63\",\"display\":\"Index\",\"filter\":\"0~63\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0~32\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Number\",\"filter\":\"0~32\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Coding Scheme\",\"filter\":\"{\\\"0\\\":\\\"smpp7def7\\\",\\\"1\\\":\\\"smpp8dcs4def7\\\",\\\"2\\\":\\\"smpp8dcs0def7\\\",\\\"16\\\":\\\"smpp7def8\\\",\\\"17\\\":\\\"smpp8dcs4def8\\\",\\\"18\\\":\\\"smpp8dcs0def8\\\"}\",\"name\":\"dataCodingScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Platform Num\",\"filter\":\"{\\\"0\\\":\\\"plat0\\\",\\\"1\\\":\\\"plat1\\\",\\\"2\\\":\\\"ignore\\\"}\",\"name\":\"platformNum\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time To Live\",\"filter\":\"0-2147483647\",\"name\":\"timeToLive\",\"type\":\"int\",\"value\":\"604800\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Manipulation Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"manipulationFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type of Number\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"international\\\",\\\"2\\\":\\\"national\\\",\\\"3\\\":\\\"networkSpecific\\\",\\\"4\\\":\\\"subscriberNumber\\\",\\\"5\\\":\\\"alphanumeric\\\",\\\"6\\\":\\\"abbreviated\\\"}\",\"name\":\"ton\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Plan Indicator\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"isdn\\\",\\\"3\\\":\\\"data\\\",\\\"4\\\":\\\"telex\\\",\\\"6\\\":\\\"landMobile\\\",\\\"8\\\":\\\"national\\\",\\\"9\\\":\\\"private\\\",\\\"10\\\":\\\"ermes\\\",\\\"14\\\":\\\"internet\\\",\\\"18\\\":\\\"wapClientID\\\"}\",\"name\":\"npi\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Role Type\",\"filter\":\"{\\\"0\\\":\\\"server\\\",\\\"1\\\":\\\"client\\\"}\",\"name\":\"roleType\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1628, 'UDM', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.140\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF IP\",\"filter\":\"\",\"name\":\"ausfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"omc.com\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"0~4095\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Capacity\",\"filter\":\"0~65535\",\"name\":\"capacity\",\"type\":\"int\",\"value\":\"4096\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SUPI Ranges\",\"filter\":\"^imsi-\\\\d{15}~imsi-\\\\d{15}$\",\"name\":\"supiRanges\",\"type\":\"regex\",\"value\":\"imsi-001010100080000~imsi-001010100080099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GPSI Ranges\",\"filter\":\"^msisdn-\\\\d{2,15}~msisdn-\\\\d{2,15}$\",\"name\":\"gpsiRanges\",\"type\":\"regex\",\"value\":\"msisdn-69072000~msisdn-69072099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Link\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"redisLink\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Address\",\"filter\":\"\",\"name\":\"redisAddr\",\"type\":\"string\",\"value\":\"172.16.5.140:6379\"}]}'); -INSERT INTO `param_config` VALUES (1629, 'UDM', '', 'subsUEAmbr', 'Subs UE AMBR', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"uplink\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"downlink\",\"type\":\"regex\",\"value\":\"2 Gbps\"}]}'); -INSERT INTO `param_config` VALUES (1630, 'UDM', '', 'subsNssais', 'Subs NSSAIs', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Features\",\"filter\":\"^[0-9a-fA-F]{8}$\",\"name\":\"supportedFeatures\",\"type\":\"regex\",\"value\":\"00000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Single NSSAIs\",\"filter\":\"\",\"name\":\"defaultSingleNSSAIs\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Single NSSAIs\",\"filter\":\"\",\"name\":\"singleNssais\",\"type\":\"string\",\"value\":\"1-000002\"}]}'); -INSERT INTO `param_config` VALUES (1631, 'UDM', '', 'forbiddenAreas', 'Forbidden Areas', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"}]}'); -INSERT INTO `param_config` VALUES (1632, 'UDM', '', 'serviceAreaRestriction', 'Service Area Restriction', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1633, 'UDM', '', 'smfSelection', 'Subs SMF Selection', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SNSSAI\",\"filter\":\"^\\\\d{1,3}[A-Fa-f0-9]{6}$\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{1,32}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN Indicator\",\"filter\":\"false;true;\",\"name\":\"defaultDnnInd\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LBO Roaming Allowed\",\"filter\":\"false;true;\",\"name\":\"lboRoamingAllowed\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"false;true;\",\"name\":\"iwkEpsInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"false;true;\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"false\"}],\"comment\":\"\",\"display\":\"DNN List\",\"filter\":\"1~4\",\"name\":\"dnnList\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1634, 'UDM', '', 'dnn', 'DNN Conf', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default PDU Session Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\"}\",\"name\":\"defaultPDUSessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed PDU Session Types\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\",\\\"5\\\":\\\"IPv4 \\u0026 IPv6\\\",\\\"6\\\":\\\"IPv4 \\u0026 IPv4v6\\\",\\\"7\\\":\\\"IPv6 \\u0026 IPv4v6\\\",\\\"8\\\":\\\"IPv4 \\u0026 IPv6 \\u0026 IPv4v6\\\"}\",\"name\":\"allowedPDUSessionTypes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"5qi\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority Level\",\"filter\":\"1~127\",\"name\":\"priorityLevel\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default SSC Mode\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\"}\",\"name\":\"defaultSSCmode\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed SSC Modes\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\",\\\"3\\\":\\\"SSC Mode1 \\u0026 SSC Mode2\\\",\\\"4\\\":\\\"SSC Mode1 \\u0026 SSC Mode3\\\",\\\"5\\\":\\\"SSC Mode2 \\u0026 SSC Mode3\\\",\\\"6\\\":\\\"SSC Mode1 \\u0026 SSC Mode2 \\u0026 SSC Mode3\\\"}\",\"name\":\"allowedSSCmodes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"\",\"name\":\"interworkingEPSIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristics\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristics\",\"type\":\"string\",\"value\":\"0001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrUL\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrDL\",\"type\":\"regex\",\"value\":\"2 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IP Address\",\"filter\":\"\",\"name\":\"staticIPAddress\",\"type\":\"ipv4\",\"value\":\"192.168.1.100\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Integrity\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneIntegrity\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Confidentiality\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneConfidentiality\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"0~255\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1635, 'UDM', '', 'epsTemplate', 'EPS User Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{0,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_eps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APN OI Replacement\",\"filter\":\"^.{0,31}$\",\"name\":\"apnOIReplacement\",\"type\":\"string\",\"value\":\"money\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RFSP\",\"filter\":\"\",\"name\":\"rfsp\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RAU TAU Timer\",\"filter\":\"\",\"name\":\"rauTauTimer\",\"type\":\"int\",\"value\":\"120\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]}'); -INSERT INTO `param_config` VALUES (1636, 'UDM', '', 'epsApn', 'EPS APN', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{0,127}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"IPv4 or IPv6\\\"}\",\"name\":\"pdnType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QCI\",\"filter\":\"1~255\",\"name\":\"qci\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority\",\"filter\":\"1~127\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"8\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Context Identifier\",\"filter\":\"\",\"name\":\"contextIdentifier\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"VPLMN Dynamic Address Allowed\",\"filter\":\"false;true;\",\"name\":\"vplmnDynamicAddressAllowed\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN GW Allocation Type\",\"filter\":\"{\\\"0\\\":\\\"Static\\\",\\\"1\\\":\\\"Dynamic\\\"}\",\"name\":\"pdnGWAllocationType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]}'); -INSERT INTO `param_config` VALUES (1637, 'UDM', '', 'applicationServer', 'Application Server', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AS Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Handling\",\"filter\":\"{\\\"0\\\":\\\"Session Continued\\\",\\\"1\\\":\\\"Session Terminated\\\"}\",\"name\":\"defaultHandling\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:192.168.8.26:7060\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Diameter Address\",\"filter\":\"^.{1,127}$\",\"name\":\"diameterAddress\",\"type\":\"string\",\"value\":\"mmtel.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rep Data Size Limit\",\"filter\":\"0~65535\",\"name\":\"repDataSizeLimit\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Request\",\"filter\":\"false;true;\",\"name\":\"includeRegisterRequest\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Response\",\"filter\":\"false;true;\",\"name\":\"includeRegisterResponse\",\"type\":\"bool\",\"value\":\"false\"}]}'); -INSERT INTO `param_config` VALUES (1638, 'UDM', '', 'scscfSet', 'SCSCF Set', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:scscf.ims.mnc001.mcc001.3gppnetwork.org:6060\"}]}'); -INSERT INTO `param_config` VALUES (1639, 'UDM', '', 'triggerPoint', 'Trigger Point', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Type CNF\",\"filter\":\"0~1\",\"name\":\"conditionTypeCNF\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Negated\",\"filter\":\"0~1\",\"name\":\"conditionNegated\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group\",\"filter\":\"0~4096\",\"name\":\"group\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"^.{0,32}$\",\"name\":\"method\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Header\",\"filter\":\"^.{0,64}$\",\"name\":\"sipHeader\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Content\",\"filter\":\"^.{0,64}$\",\"name\":\"sipContent\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"SPT List\",\"filter\":\"1~4\",\"name\":\"sptList\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1640, 'UDM', '', 's6aServer', 'S6a Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1641, 'UDM', '', 'cxServer', 'Cx Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); - --- SMF 更新时间2024/06/17 17:50 -INSERT INTO `param_config` VALUES (1645, 'SMF', '', 'smfSystem', 'SMF System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI IP\",\"filter\":\"\",\"name\":\"sbiIpAddr\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv4\",\"filter\":\"\",\"name\":\"n4Ipv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv6\",\"filter\":\"\",\"name\":\"n4Ipv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv4\",\"filter\":\"\",\"name\":\"n4UIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv6\",\"filter\":\"\",\"name\":\"n4UIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"\",\"name\":\"amfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.120:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF Enable\",\"filter\":\"\",\"name\":\"pcfEnable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"display\":\"5G Charging Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"chfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Primary URI\",\"filter\":\"\",\"name\":\"chfPrimaryUri\",\"type\":\"string\",\"value\":\"http://172.16.5.240:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Secondary URI\",\"filter\":\"\",\"name\":\"chfSecondaryUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv4\",\"filter\":\"\",\"name\":\"primaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"114.114.114.114\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv4\",\"filter\":\"\",\"name\":\"secondaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv6\",\"filter\":\"\",\"name\":\"primaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv6\",\"filter\":\"\",\"name\":\"secondaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv4\",\"filter\":\"\",\"name\":\"primaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv4\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv6\",\"filter\":\"\",\"name\":\"primaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv6\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE MTU\",\"filter\":\"0~65535\",\"name\":\"ueMtu\",\"type\":\"int\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1646, 'SMF', '', 'spgwSystem', 'SPGW Sytem Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local S11 IP\",\"filter\":\"\",\"name\":\"s11Ip\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter IP\",\"filter\":\"\",\"name\":\"localDiameterIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Host Name\",\"filter\":\"\",\"name\":\"localDiameterHostName\",\"type\":\"string\",\"value\":\"smf.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Realm Name\",\"filter\":\"\",\"name\":\"localDiameterRealmName\",\"type\":\"string\",\"value\":\"mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gy Enable\",\"filter\":\"false;true;\",\"name\":\"peerGyEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gy IP\",\"filter\":\"\",\"name\":\"primaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gy IP\",\"filter\":\"\",\"name\":\"secondaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Enable\",\"filter\":\"false;true;\",\"name\":\"peerGxEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Charging Enable\",\"filter\":\"false;true;\",\"name\":\"gxChargingEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gx IP\",\"filter\":\"\",\"name\":\"primaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gx IP\",\"filter\":\"\",\"name\":\"secondaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"}]}'); -INSERT INTO `param_config` VALUES (1647, 'SMF', '', 'upfConfig', 'UPF Config', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"id\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"e.g. ip:port\",\"display\":\"Address\",\"filter\":\"7~45\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"},{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"}],\"display\":\"UE DNN IP Pool\",\"name\":\"ueDnnIpPool\"}]}'); -INSERT INTO `param_config` VALUES (1648, 'SMF', '', 'dnnSelectUpf', 'DNN Select UPF', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1649, 'SMF', '', 'dnnTaiSelectUpf', 'DNN TAI Select UPF', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"MCC+MNC+TAC\",\"display\":\"TAI\",\"filter\":\"1~64\",\"name\":\"tai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf2-Id\"}]}'); -INSERT INTO `param_config` VALUES (1650, 'SMF', '', 'snssaiSelectUpf', 'SNSSAI Select UPF', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"sst1-sd1;sst2-sd2;sst3-sd3\",\"display\":\"SNSSAI\",\"filter\":\"1~64\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"upf1-id;upf2-id;upf3-id\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf1-Id\"}]}'); -INSERT INTO `param_config` VALUES (1651, 'SMF', '', 'offlineChargingConfig', 'Offline Charging Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Name\",\"filter\":\"\",\"name\":\"cdrFileName\",\"type\":\"string\",\"value\":\"smf.cdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Path\",\"filter\":\"\",\"name\":\"cdrFilePath\",\"type\":\"string\",\"value\":\"/var/log/smfCdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Num\",\"filter\":\"1~999999999\",\"name\":\"cdrFileNum\",\"type\":\"int\",\"value\":\"50\"},{\"access\":\"read-write\",\"comment\":\"Megabytes\",\"display\":\"CDR File Size\",\"filter\":\"1~999999\",\"name\":\"cdrFileSize\",\"type\":\"int\",\"value\":\"300\"},{\"access\":\"read-write\",\"comment\":\"Days\",\"display\":\"CDR File Max Age\",\"filter\":\"0~9999\",\"name\":\"cdrFileMaxAge\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Free Subscribers CDR Enable\",\"filter\":\"\",\"name\":\"freeSubsCdrEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"Seconds\",\"display\":\"Time Threshold\",\"filter\":\"0~999999999\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"600\"},{\"access\":\"read-write\",\"comment\":\"Bytes\",\"display\":\"Volume Threshold\",\"filter\":\"0~999999999999999\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"0\"}]}'); - --- MME 更新时间2024/06/27 15:13 -INSERT INTO `param_config` VALUES (1657, 'MME', '', 'system', 'System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"CSFB Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"VoLTE Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"volteEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S1 MME IP\",\"filter\":\"0~64\",\"name\":\"s1MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"S1 MME Port\",\"filter\":\"0~65535\",\"name\":\"s1MmePort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S11 MME IP\",\"filter\":\"0~64\",\"name\":\"s11MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S11 MME Port\",\"filter\":\"0~65535\",\"name\":\"s11MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S10 MME IP\",\"filter\":\"0~64\",\"name\":\"s10MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.178\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S10 MME Port\",\"filter\":\"0~65535\",\"name\":\"s10MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGs MME IP\",\"filter\":\"0~64\",\"name\":\"sgsMmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"SGs MME Port\",\"filter\":\"0~65535\",\"name\":\"sgsMmePort\",\"type\":\"int\",\"value\":\"29118\"},{\"access\":\"read-write\",\"comment\":\"0~100\",\"display\":\"S6A MME Identity\",\"filter\":\"0~100\",\"name\":\"s6aIdentity\",\"type\":\"string\",\"value\":\"mme.epc.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"0~20\",\"display\":\"S6A MME IP\",\"filter\":\"0~20\",\"name\":\"localIp\",\"type\":\"string\",\"value\":\"172.16.5.220\"}]}'); -INSERT INTO `param_config` VALUES (1658, 'MME', '', 'gummei', 'Gummei List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Group ID\",\"filter\":\"0~65535\",\"name\":\"groupId\",\"type\":\"int\",\"value\":\"4\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Code\",\"filter\":\"0~255\",\"name\":\"code\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1659, 'MME', '', 'tai', 'TAI List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1660, 'MME', '', 'hss', 'HSS List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{1,15}$\",\"display\":\"IMSI Prefix\",\"filter\":\"^[0-9]{1,15}$\",\"name\":\"imsiPre\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"HSS Hostname\",\"filter\":\"0~128\",\"name\":\"hssHostname\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"SCTP|TCP\",\"display\":\"Protocol\",\"filter\":\"0~8\",\"name\":\"protocol\",\"type\":\"string\",\"value\":\"SCTP\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"HSS Port\",\"filter\":\"0~65535\",\"name\":\"hssPort\",\"type\":\"int\",\"value\":\"3868\"}]}'); -INSERT INTO `param_config` VALUES (1661, 'MME', '', 'sgw', 'SGW List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGW IP\",\"filter\":\"0~64\",\"name\":\"sgwIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"}]}'); -INSERT INTO `param_config` VALUES (1662, 'MME', '', 'pgw', 'PGW List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"APN\",\"filter\":\"0~128\",\"name\":\"apn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"PGW IP\",\"filter\":\"0~64\",\"name\":\"pgwIp\",\"type\":\"string\",\"value\":\"192.168.1.181\"}]}'); -INSERT INTO `param_config` VALUES (1663, 'MME', '', 'amf', 'AMF List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~16777215\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"AMF IP\",\"filter\":\"0~64\",\"name\":\"amfIp\",\"type\":\"string\",\"value\":\"172.16.5.120\"}]}'); - --- UPF 更新时间2024/07/15 14:30 -INSERT INTO `param_config` VALUES (1681, 'UPF', '', 'general', 'General', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Config File Directory\",\"filter\":\"\",\"name\":\"configFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/etc/upf/\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"EXE File Directory\",\"filter\":\"\",\"name\":\"exeFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/bin/\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~8\",\"display\":\"Data Forwarder Number\",\"filter\":\"1~8\",\"name\":\"dataForwarderNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Common Statistic Interval\",\"filter\":\"\",\"name\":\"commonStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Statistic Interval\",\"filter\":\"\",\"name\":\"userStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N3 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN3OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N6 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN6OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Checksum Offload\",\"filter\":\"0~255\",\"name\":\"checksumOffload\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Downlink Buffer Num\",\"filter\":\"\",\"name\":\"maxDownlinkBufferNum\",\"type\":\"int\",\"value\":\"50\"}]}'); -INSERT INTO `param_config` VALUES (1682, 'UPF', '', 'logger', 'Logger', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log File Full Path\",\"filter\":\"\",\"name\":\"logFileFullPath\",\"type\":\"string\",\"value\":\"/var/log/upf.log\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Upfd Log Level\",\"filter\":\"\",\"name\":\"upfdLogLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Upfd Log Transfer\",\"filter\":\"\",\"name\":\"upfdLogTransfer\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Report Caller\",\"filter\":\"\",\"name\":\"reportCaller\",\"type\":\"bool\",\"value\":\"false\"}]}'); -INSERT INTO `param_config` VALUES (1683, 'UPF', '', 'pfcp', 'PFCP', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local UDP Port\",\"filter\":\"1~65535\",\"name\":\"localUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv4\",\"filter\":\"\",\"name\":\"smfIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv6\",\"filter\":\"\",\"name\":\"smfIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"SMF UDP Port\",\"filter\":\"1~65535\",\"name\":\"smfUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Retry Interval\",\"filter\":\"1~255\",\"name\":\"retryInterval\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Max Retry\",\"filter\":\"0~255\",\"name\":\"maxRetry\",\"type\":\"int\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Heartbeat Interval\",\"filter\":\"1~255\",\"name\":\"heartbeatInterval\",\"type\":\"int\",\"value\":\"15\"}]}'); -INSERT INTO `param_config` VALUES (1684, 'UPF', '', 'telnet', 'Telnet', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local Port\",\"filter\":\"1~65535\",\"name\":\"localPort\",\"type\":\"int\",\"value\":\"4100\"}]}'); -INSERT INTO `param_config` VALUES (1685, 'UPF', '', 'redisDb', 'Redis DB', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"tcp|udp\",\"display\":\"Net Type\",\"filter\":\"\",\"name\":\"netType\",\"type\":\"string\",\"value\":\"tcp\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Address\",\"filter\":\"\",\"name\":\"serverAddr\",\"type\":\"string\",\"value\":\"0.0.0.0:0\"}]}'); -INSERT INTO `param_config` VALUES (1686, 'UPF', '', 'dataForwarderCommon', 'Data Forwarder Common', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"upfd|tun\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"string\",\"value\":\"upfd\"},{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Instance ID\",\"filter\":\"1~8\",\"name\":\"instanceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Main CPU\",\"filter\":\"1~255\",\"name\":\"mainCpu\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"2,3,4,5 or 2-5\",\"display\":\"CPU Workers\",\"filter\":\"\",\"name\":\"cpuWorkers\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"data forwarder already run or not\",\"display\":\"Is Run\",\"filter\":\"0~1\",\"name\":\"isRun\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Hot Standby work or not\",\"display\":\"Is Hot Standby\",\"filter\":\"0~1\",\"name\":\"isHotStandby\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The value from which TEID is allocated\",\"display\":\"TEID Start\",\"filter\":\"\",\"name\":\"teidStart\",\"type\":\"int\",\"value\":\"16777216\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Heartbeat Interval\",\"filter\":\"\",\"name\":\"n3HeartbeatInterval\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX TX Queue Num\",\"filter\":\"\",\"name\":\"rxTxQueueNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"data rx\\u0026tx use C socket\",\"display\":\"Use Socket\",\"filter\":\"0~1\",\"name\":\"useSocket\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable 5G ethernet LAN\",\"display\":\"Enable Tap\",\"filter\":\"0~1\",\"name\":\"enableTap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable PFCP Qer Control\",\"display\":\"Enable Qer\",\"filter\":\"0~1\",\"name\":\"enableQer\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1687, 'UPF', '', 'dataForwarderUpfd', 'Data Forwarder Upfd', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"Currently only support vfio-pci\",\"display\":\"UIO Driver\",\"filter\":\"\",\"name\":\"uioDriver\",\"type\":\"string\",\"value\":\"vfio-pci\"},{\"access\":\"read-write\",\"comment\":\"The format must be IP:Port\",\"display\":\"Telnet Address IP:Port\",\"filter\":\"\",\"name\":\"commandlineListen\",\"type\":\"string\",\"value\":\"localhost:5002\"},{\"access\":\"read-write\",\"comment\":\"the unit is GB\",\"display\":\"Heap Size GB\",\"filter\":\"1~8\",\"name\":\"heapSizeGB\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"the unit is MB\",\"display\":\"State Seg Size MB\",\"filter\":\"64~512\",\"name\":\"stateSegSizeMB\",\"type\":\"int\",\"value\":\"256\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK No PCI\",\"filter\":\"0~1\",\"name\":\"dpdkNoPci\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mem Channel Num\",\"filter\":\"0~128\",\"name\":\"memChannelNum\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Base Va\",\"filter\":\"\",\"name\":\"sessionBaseVa\",\"type\":\"string\",\"value\":\"0x2000000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Buffers Per Numa\",\"filter\":\"\",\"name\":\"buffersPerNuma\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 RSS Hash\",\"filter\":\"\",\"name\":\"n3RssHash\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1688, 'UPF', '', 'dataInterfaceList', 'Data Interface List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"N3|N6|N9|N19\",\"display\":\"Interface Type\",\"filter\":\"\",\"name\":\"interfaceType\",\"type\":\"string\",\"value\":\"N3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface ID\",\"filter\":\"1~32\",\"name\":\"interfaceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"host|vmxnet3|dpdk|socket|uds\",\"display\":\"Driver Type\",\"filter\":\"\",\"name\":\"driverType\",\"type\":\"string\",\"value\":\"host\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"IPv4\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"IPv4 Address List\",\"filter\":\"0~8\",\"name\":\"ipv4AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"IPv6 Address List\",\"filter\":\"0~8\",\"name\":\"ipv6AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MAC Address\",\"filter\":\"\",\"name\":\"macAddr\",\"type\":\"string\",\"value\":\"00:00:00:00:00:00\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface PCI\",\"filter\":\"\",\"name\":\"interfacePCI\",\"type\":\"string\",\"value\":\"0000:00:00.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Network Card Name\",\"filter\":\"\",\"name\":\"systemNetworkCardName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"null|bak|sub|xor|round|lacp\",\"display\":\"Bond Type\",\"filter\":\"\",\"name\":\"bondType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Bond ID\",\"filter\":\"0~32\",\"name\":\"bondId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD TX Interval Ms\",\"filter\":\"\",\"name\":\"bfdTxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD RX Interval Ms\",\"filter\":\"\",\"name\":\"bfdRxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"default\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv4\",\"filter\":\"\",\"name\":\"bfdGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv6\",\"filter\":\"\",\"name\":\"bfdGatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MTU\",\"filter\":\"0~65535\",\"name\":\"mtu\",\"type\":\"int\",\"value\":\"1500\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Src Port\",\"filter\":\"1~65535\",\"name\":\"udpSrcPort\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Listen Port\",\"filter\":\"0~65536\",\"name\":\"udpListenPort\",\"type\":\"int\",\"value\":\"2152\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Local File Full Path\",\"filter\":\"\",\"name\":\"udsLocalFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Remote File Full Path\",\"filter\":\"\",\"name\":\"udsRemoteFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Detection Type\",\"filter\":\"0~1\",\"name\":\"linkDetectionType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NAT Interface ID\",\"filter\":\"0~1\",\"name\":\"natInterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv4 Pool List\",\"filter\":\"1~32\",\"name\":\"gtpuRemoteIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"gtpuRemoteIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPU Signaling Handle\",\"filter\":\"0~1\",\"name\":\"gtpuSignalingHandle\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMS Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"imsDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"dataDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inner DSCP Value Map\",\"filter\":\"0~1\",\"name\":\"innerDSCPValueMap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Support Speed Mbps\",\"filter\":\"0~65536\",\"name\":\"maxSupportSpeedMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkRxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkTxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkRxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkTxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK Workers\",\"filter\":\"\",\"name\":\"dpdkworkers\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1689, 'UPF', '', 'networkControlCommon', 'Network Control Common', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Disabled\",\"filter\":\"0~1\",\"name\":\"localSwitchDisabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TCP Sync Per Second\",\"filter\":\"\",\"name\":\"maxTCPSyncPerSecond\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF Max Support Mbps\",\"filter\":\"\",\"name\":\"upfMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dscp Inner Mapping\",\"filter\":\"\",\"name\":\"dscpInnerMapping\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1690, 'UPF', '', 'networkControlDnnList', 'Network Control DNN List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Header Enrich Info List\",\"filter\":\"0~32\",\"name\":\"headerEnrichInfoList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Check\",\"filter\":\"0~1\",\"name\":\"localSwitchCheck\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"UE IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"UE IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"Dst Server IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"Dst Server IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"Gateway IP Type\",\"filter\":\"\",\"name\":\"gatewayIpType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv4\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv6\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv6\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1691, 'UPF', '', 'networkControlSnssaiList', 'Network Control SNSSAI List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SST\",\"filter\":\"\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"sd\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1692, 'UPF', '', 'networkControlAclWhiteList', 'Network Control ACL White List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]}'); -INSERT INTO `param_config` VALUES (1693, 'UPF', '', 'networkControlAclBlackList', 'Network Control ACL Black List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]}'); -INSERT INTO `param_config` VALUES (1694, 'UPF', '', 'networkControlDnsServerList', 'Network Control DNS Server List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1\",\"display\":\"Enabled\",\"filter\":\"0~1\",\"name\":\"enabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNS Name\",\"filter\":\"\",\"name\":\"dnsName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv4\",\"filter\":\"\",\"name\":\"serverIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv6\",\"filter\":\"\",\"name\":\"serverIpv6\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1695, 'UPF', '', 'dpiCommon', 'DPI Common', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Detect Packet Num\",\"filter\":\"\",\"name\":\"maxDetectPacketNum\",\"type\":\"int\",\"value\":\"20\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1696, 'UPF', '', 'dpiHeaderEnrichInfoList', 'DPI Header Enrich Info List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1697, 'UPF', '', 'dpiAppList', 'DPI APP List', '', '{\"array\":[{\"access\":\"read-write\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP Name\",\"filter\":\"\",\"name\":\"appName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Proxy Enabled\",\"filter\":\"0~1\",\"name\":\"proxyEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Force Check Type\",\"filter\":\"0~1\",\"name\":\"forceCheckType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"\",\"name\":\"ruleId\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"REGEX Match\",\"filter\":\"\",\"name\":\"regexMatch\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Custom Name\",\"filter\":\"\",\"name\":\"customName\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Rule List\",\"filter\":\"0~32\",\"name\":\"ruleList\",\"type\":\"int\",\"value\":\"1\"}]}'); - --- IMS 更新时间2024/06/26 14.41 -INSERT INTO `param_config` VALUES (1700, 'IMS', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Label\",\"filter\":\"\",\"name\":\"label\",\"type\":\"string\",\"value\":\"ims-core\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MCC\",\"filter\":\"\",\"name\":\"hplmnMCC\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MNC\",\"filter\":\"\",\"name\":\"hplmnMNC\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Network IPv4\",\"filter\":\"\",\"name\":\"LocalNetworkIPv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv4\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv6\",\"filter\":\"\",\"name\":\"serviceIPv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 1\",\"filter\":\"\",\"name\":\"domainName1\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 2\",\"filter\":\"\",\"name\":\"domainName2\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 3\",\"filter\":\"\",\"name\":\"domainName3\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 4\",\"filter\":\"\",\"name\":\"domainName4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MultiIPStack Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"multiIPStackInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register Timer\",\"filter\":\"120~1000000\",\"name\":\"registerTimer\",\"type\":\"int\",\"value\":\"7200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Call Duration\",\"filter\":\"1800~1000000\",\"name\":\"maxCallDuration\",\"type\":\"int\",\"value\":\"43200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal SMS Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalSMSInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal CDR Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalCDRInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal KPI Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalKPIInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF IP Address\",\"filter\":\"\",\"name\":\"pcfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"}]}'); -INSERT INTO `param_config` VALUES (1701, 'IMS', '', 'plmn', 'PLMN List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"^[0-9]{3}$\",\"name\":\"mcc\",\"type\":\"regex\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"^[0-9]{2,3}$\",\"name\":\"mnc\",\"type\":\"regex\",\"value\":\"01\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain\",\"filter\":\"0~128\",\"name\":\"domain\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1702, 'IMS', '', 'mmtel_dialplan', 'MMTEL Dialplan', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NaName\",\"filter\":\"0~128\",\"name\":\"naName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Title\",\"filter\":\"0~128\",\"name\":\"title\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"0-2\",\"name\":\"method\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~128\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start\",\"filter\":\"0~128\",\"name\":\"start\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End\",\"filter\":\"0~128\",\"name\":\"end\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Attrib\",\"filter\":\"0~128\",\"name\":\"attrib\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Len\",\"filter\":\"0~128\",\"name\":\"numberLen\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rsc\",\"filter\":\"0~128\",\"name\":\"rsc\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Nai\",\"filter\":\"0~128\",\"name\":\"e164Nai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Delete\",\"filter\":\"0~128\",\"name\":\"e164Delete\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Insert\",\"filter\":\"0~128\",\"name\":\"e164Insert\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"Enable: Close/Open\",\"display\":\"Admin State\",\"filter\":\"{\\\"0\\\":\\\"Close\\\", \\\"1\\\":\\\"Open\\\"}\",\"name\":\"adminState\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1703, 'IMS', '', 'ds_system', 'DS System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"dispatchSystemInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Transcode Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"transcodeInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System IPv4\",\"filter\":\"\",\"name\":\"dispatchSystemIP\",\"type\":\"ipv4\",\"value\":\"1.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Port\",\"filter\":\"\",\"name\":\"dispatchSystemPort\",\"type\":\"int\",\"value\":\"5060\"}]}'); - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/lib/dborm/dborm.go b/lib/dborm/dborm.go index d3a0a3dc..1f782c0d 100644 --- a/lib/dborm/dborm.go +++ b/lib/dborm/dborm.go @@ -428,68 +428,6 @@ func XormParseResult(body []byte) ([]NeInfo, error) { return neInfo, nil } -type ParamConfig struct { - // Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType"` - NeId string `json:"neId"` - TopTag string `json:"topTag"` - TopDisplay string `json:"topDisplay"` - ParamJson string `json:"paramJson"` -} - -func XormInsertParamConfig(mapJson *map[string]interface{}) (int64, error) { - var affected, a int64 - var err error - paramConfig := new(ParamConfig) - for n, d := range *mapJson { - if d == nil { - break - } - log.Debugf("n: %s", n) - - for t, p := range d.(map[string]interface{}) { - if p == nil { - break - } - log.Debug("t:", t) - log.Debug("p:", p) - for k, v := range p.(map[string]interface{}) { - log.Debug("k, v: ", k, v) - if k == "display" { - paramConfig.TopDisplay = fmt.Sprintf("%v", v) - - } else { - pc, _ := json.Marshal(v) - paramConfig.ParamJson = fmt.Sprintf("{\"%v\":%v}", k, string(pc)) - } - } - - paramConfig.NeType = strings.ToUpper(n) - paramConfig.NeId = "" - paramConfig.TopTag = t - // paramConfig.TopDisplay = p["display"] - // paramConfig.ParamJson = p.(string) - - log.Debug("paramConfig:", paramConfig) - - xSession := xEngine.NewSession() - defer xSession.Close() - _, err = xSession.Table("param_config").Where("ne_type = ? and top_tag = ?", paramConfig.NeType, paramConfig.TopTag).Delete() - if err != nil { - log.Error("Failed to insert param_config:", err) - } - a, err = xSession.Insert(paramConfig) - if err != nil { - log.Error("Failed to insert param_config:", err) - } - affected += a - xSession.Commit() - } - } - - return affected, err -} - func ConstructUpdateSQLArray(tableName string, updateData interface{}, whereCondition string) (string, []string) { log.Debug("ConstructUpdateSQL processing... ") log.Debug("Request updateData:", updateData) diff --git a/tools/loadpconf/db.go b/tools/loadpconf/db.go deleted file mode 100644 index c460a3a9..00000000 --- a/tools/loadpconf/db.go +++ /dev/null @@ -1,101 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - - "strings" - - _ "github.com/go-sql-driver/mysql" - "xorm.io/xorm" -) - -var xEngine *xorm.Engine - -func XormConnectDatabaseWithUri(sql string) (*xorm.Engine, error) { - // sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", db.User, db.Password, db.Host, db.Port, db.Name) - sqlStr := fmt.Sprintf("%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", sql) - // fmt.Printf("sqlStr:%s:******@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", db.User, db.Host, db.Port, db.Name) - var err error - xEngine, err = xorm.NewEngine("mysql", sqlStr) //1、Create xorm engine - if err != nil { - fmt.Println("Failed to connect database:", err) - return nil, err - } - xEngine.ShowSQL(true) - return xEngine, nil -} - -type ParamConfig struct { - // Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType"` - NeId string `json:"neId"` - TopTag string `json:"topTag"` - TopDisplay string `json:"topDisplay"` - Method string `json:"method"` - ParamJson string `json:"paramJson"` -} - -func XormInsertParamConfig(mapJson *map[string]interface{}) (int64, error) { - var affected, a int64 - var err error - paramConfig := new(ParamConfig) - for n, d := range *mapJson { - if d == nil { - break - } - fmt.Printf("n: %s", n) - - session := xEngine.NewSession() - defer session.Close() - _, err = session.Table("param_config").Where("ne_type = ?", strings.ToUpper(n)).Delete() - if err != nil { - fmt.Println("Failed to delete param_config:", err) - } - session.Commit() - - for t, p := range d.(map[string]interface{}) { - if p == nil { - break - } - fmt.Println("t:", t) - fmt.Println("p:", p) - for k, v := range p.(map[string]interface{}) { - fmt.Println("k, v: ", k, v) - if k == "display" { - paramConfig.TopDisplay = fmt.Sprintf("%v", v) - - } else if k == "method" { - if v != "" { - paramConfig.Method = fmt.Sprintf("%v", v) - } - } else { - pc, _ := json.Marshal(v) - paramConfig.ParamJson = fmt.Sprintf("{\"%v\":%v}", k, string(pc)) - } - } - - paramConfig.NeType = strings.ToUpper(n) - paramConfig.NeId = "" - paramConfig.TopTag = t - // paramConfig.TopDisplay = p["display"] - // paramConfig.ParamJson = p.(string) - - fmt.Println("paramConfig:", paramConfig) - - session := xEngine.NewSession() - defer session.Close() - // _, err = session.Table("param_config").Where("ne_type = ? and top_tag = ?", paramConfig.NeType, paramConfig.TopTag).Delete() - // if err != nil { - // fmt.Println("Failed to delete param_config:", err) - // } - a, err = session.Insert(paramConfig) - if err != nil { - fmt.Println("Failed to insert param_config:", err) - } - session.Commit() - affected += a - } - } - return affected, err -} diff --git a/tools/loadpconf/load.go b/tools/loadpconf/load.go deleted file mode 100644 index 329f7cab..00000000 --- a/tools/loadpconf/load.go +++ /dev/null @@ -1,375 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - "reflect" - - "gopkg.in/yaml.v3" -) - -// Yaml struct of config -type YamlConfig struct { - Logger struct { - File string `yaml:"file"` - Level string `yaml:"level"` - } - - Rest struct { - Addr string `yaml:"addr"` - Port uint16 `yaml:"port"` - } - - Database struct { - Type string `yaml:"type"` - User string `yaml:"user"` - Password string `yaml:"password"` - Host string `yaml:"host"` - Port string `yaml:"port"` - Name string `yaml:"name"` - } - ParamFileDir string `yaml:"paramfiledir"` -} - -var yamlConfig YamlConfig - -func ReadConfig(configFile string) { - yamlFile, err := os.ReadFile(configFile) - if err != nil { - fmt.Printf("ioutil.ReadFile %s err %v", configFile, err) - } - // fmt.Println("yamlfile:", string(yamlFile)) - - err = yaml.Unmarshal(yamlFile, &yamlConfig) - if err != nil { - fmt.Printf("Unmarshal: %v when to struct", err) - } -} - -func GetYamlConfig() *YamlConfig { - return &yamlConfig -} - -//var mapYaml map[string]interface{} - -func ReadParamConfig(fileName string) *map[string]interface{} { - file, err := os.ReadFile(fileName) - if err != nil { - fmt.Println("yamlFile.Get err", err) - } - - mapYaml := make(map[string]interface{}) - - var node yaml.Node - err = yaml.Unmarshal(file, &node) - if err != nil { - fmt.Printf("yaml.Unmarshal: %v when to struct", err) - } - err = unmarshalNode(&node, &mapYaml) - if err != nil { - fmt.Println("Failed to unmarshalNode:", err) - } - - // var node yaml.Node - // err = yaml.Unmarshal(file, &node) - // if err != nil { - // fmt.Printf("yaml.Unmarshal: %v when to struct", err) - // } - - // err = unmarshalNode(&node, reflect.ValueOf(&mapYaml)) - // if err != nil { - // fmt.Println("Failed to unmarshalNode:", err) - // } - - err = yaml.Unmarshal(file, &mapYaml) - if err != nil { - fmt.Printf("yaml.Unmarshal: %v when to struct", err) - } - // fmt.Println("mapYaml:", mapYaml) - - return &mapYaml -} - -func GetAllFile(dir string, s []string) ([]string, error) { - rd, err := os.ReadDir(dir) - if err != nil { - fmt.Println("read dir fail:", err) - return s, err - } - - for _, fi := range rd { - if !fi.IsDir() { - fullName := dir + "/" + fi.Name() - s = append(s, fullName) - } - } - return s, nil -} - -const defaultConfigFile = "./loadpconf.yaml" - -var ( - version string - buildTime string - goVer string -) - -var pfiles []string - -func init() { - cfile := flag.String("c", defaultConfigFile, "config file") - pfile := flag.String("p", "", "param file") - pv := flag.Bool("v", false, "print version") - ph := flag.Bool("h", false, "print help") - - flag.Parse() - if *pv { - fmt.Printf("OMC initems version: %s\n%s\n%s\n\n", version, buildTime, goVer) - os.Exit(0) - } - if *ph { - flag.Usage() - os.Exit(0) - } - - ReadConfig(*cfile) - - fmt.Println("pfile:", *pfile) - if *pfile != "" { - pfiles = append(pfiles, *pfile) - } else { - pfiles, _ = GetAllFile(yamlConfig.ParamFileDir, pfiles) - } - fmt.Println("pfiles:", pfiles) -} - -func unmarshalNode(node *yaml.Node, out interface{}) error { - switch node.Kind { - case yaml.DocumentNode: - return unmarshalNode(node.Content[0], out) - case yaml.MappingNode: - m := nodeToMap(node) - return unmarshalMap(m, out) - case yaml.SequenceNode: - s := nodeToSlice(node) - return unmarshalSlice(s, out) - case yaml.ScalarNode: - return unmarshalScalar(node, out) - default: - return fmt.Errorf("unknown node kind: %v", node.Kind) - } -} - -func nodeToMap(node *yaml.Node) map[string]*yaml.Node { - m := make(map[string]*yaml.Node) - for i := 0; i < len(node.Content); i += 2 { - key := node.Content[i].Value - value := node.Content[i+1] - m[key] = value - } - return m -} - -func unmarshalMap(m map[string]*yaml.Node, out interface{}) error { - data, ok := out.(*map[string]interface{}) - if !ok { - return fmt.Errorf("out must be a map[string]interface{}") - } - - *data = make(map[string]interface{}) - for key, value := range m { - var v interface{} - err := unmarshalNode(value, &v) - if err != nil { - return err - } - (*data)[key] = v - } - return nil -} - -func nodeToSlice(node *yaml.Node) []*yaml.Node { - return node.Content -} - -func unmarshalSlice(s []*yaml.Node, out interface{}) error { - data, ok := out.(*[]interface{}) - if !ok { - return fmt.Errorf("out must be a []interface{}") - } - - *data = make([]interface{}, len(s)) - for i, value := range s { - var v interface{} - err := unmarshalNode(value, &v) - if err != nil { - return err - } - (*data)[i] = v - } - return nil -} - -func unmarshalScalar(node *yaml.Node, out interface{}) error { - switch node.Tag { - case "!!str": - val := reflect.ValueOf(node.Value) - val.Elem().Set(reflect.ValueOf(out)) - //*out = node.Value - case "!!int": - val := reflect.ValueOf(node.Value) - val.Elem().Set(reflect.ValueOf(out)) - //*out = node.Value - case "!!float": - val := reflect.ValueOf(node.Value) - val.Elem().Set(reflect.ValueOf(out)) - //*out = node.Value - case "!!bool": - val := reflect.ValueOf(node.Value == "true") - val.Elem().Set(reflect.ValueOf(out)) - //*out = node.Value == "true" - case "!!null": - val := reflect.ValueOf(node.Value) - val.Elem().Set(reflect.ValueOf(out)) - //*out = nil - default: - return fmt.Errorf("unknown scalar tag: %v", node.Tag) - } - return nil -} - -/* -func unmarshalNode(node *yaml.Node, out reflect.Value) error { - switch node.Kind { - case yaml.DocumentNode: - return unmarshalNode(node.Content[0], out) - case yaml.MappingNode: - m := nodeToMap(node) - return unmarshalMap(m, out) - case yaml.SequenceNode: - s := nodeToSlice(node) - return unmarshalSlice(s, out) - case yaml.ScalarNode: - return unmarshalScalar(node, out) - default: - return fmt.Errorf("unknown node kind: %v", node.Kind) - } -} - -func nodeToMap(node *yaml.Node) map[string]*yaml.Node { - m := make(map[string]*yaml.Node) - for i := 0; i < len(node.Content); i += 2 { - key := node.Content[i].Value - value := node.Content[i+1] - m[key] = value - } - return m -} - -func unmarshalMap(m map[string]*yaml.Node, out reflect.Value) error { - if out.Kind() != reflect.Ptr || out.IsNil() { - return fmt.Errorf("out must be a non-nil pointer") - } - - outType := out.Type().Elem() - if outType.Kind() != reflect.Map { - return fmt.Errorf("out must be a pointer to a map") - } - - mapType := outType.Elem() - if mapType.Kind() != reflect.Interface && mapType.Kind() != reflect.Map { - return fmt.Errorf("out must be a pointer to a map of interface{}") - } - - out.Set(reflect.MakeMap(outType)) - - for key, value := range m { - var v reflect.Value - if mapType.Kind() == reflect.Interface { - v = reflect.New(reflect.TypeOf((*interface{})(nil)).Elem()) - } else { - v = reflect.New(mapType) - } - - err := unmarshalNode(value, v.Elem()) - if err != nil { - return err - } - - out.Elem().SetMapIndex(reflect.ValueOf(key), v.Elem()) - } - - return nil -} - -func nodeToSlice(node *yaml.Node) []*yaml.Node { - return node.Content -} - -func unmarshalSlice(s []*yaml.Node, out reflect.Value) error { - if out.Kind() != reflect.Ptr || out.IsNil() { - return fmt.Errorf("out must be a non-nil pointer") - } - - outType := out.Type().Elem() - if outType.Kind() != reflect.Slice { - return fmt.Errorf("out must be a pointer to a slice") - } - - sliceType := outType.Elem() - if sliceType.Kind() != reflect.Interface && sliceType.Kind() != reflect.Slice { - return fmt.Errorf("out must be a pointer to a slice of interface{}") - } - - out.Set(reflect.MakeSlice(outType, len(s), len(s))) - - for i, value := range s { - var v reflect.Value - if sliceType.Kind() == reflect.Interface { - v = reflect.New(reflect.TypeOf((*interface{})(nil)).Elem()) - } else { - v = reflect.New(sliceType) - } - - err := unmarshalNode(value, v.Elem()) - if err != nil { - return err - } - - out.Elem().Index(i).Set(v.Elem()) - } - - return nil -} - -func unmarshalScalar(node *yaml.Node, out reflect.Value) error { - switch node.Tag { - case "!!str": - out.SetString(node.Value) - case "!!int": - i, err := strconv.ParseInt(node.Value, 10, 64) - if err != nil { - return err - } - out.SetInt(i) - case "!!float": - f, err := strconv.ParseFloat(node.Value, 64) - if err != nil { - return err - } - out.SetFloat(f) - case "!!bool": - b, err := strconv.ParseBool(node.Value) - if err != nil { - return err - } - out.SetBool(b) - case "!!null": - out.Set(reflect.Zero(out.Type())) - default: - return fmt.Errorf("unknown scalar tag: %v", node.Tag) - } - return nil -} -*/ diff --git a/tools/loadpconf/loadpconf.go b/tools/loadpconf/loadpconf.go deleted file mode 100644 index 08faf5e0..00000000 --- a/tools/loadpconf/loadpconf.go +++ /dev/null @@ -1,21 +0,0 @@ -package main - -import ( - "fmt" -) - -func main() { - fmt.Println("========================= OMC loadpconf startup =========================") - fmt.Printf("OMC loadpconf version: %s %s %s", version, buildTime, goVer) - - for _, f := range pfiles { - fmt.Println("f:", f) - paramMap := ReadParamConfig(f) - fmt.Println("paramMap:", paramMap) - db := yamlConfig.Database - sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", db.User, db.Password, db.Host, db.Port, db.Name) - XormConnectDatabaseWithUri(sqlStr) - XormInsertParamConfig(paramMap) - } - -} diff --git a/tools/loadpconf/loadpconf.yaml b/tools/loadpconf/loadpconf.yaml deleted file mode 100644 index f0b038e6..00000000 --- a/tools/loadpconf/loadpconf.yaml +++ /dev/null @@ -1,17 +0,0 @@ -logger: - file: ./initems.log - level: trace - -rest: - addr: 0.0.0.0 - port: 3040 - -database: - type: mysql - user: root - password: 1000omc@kp! - host: 127.0.0.1 - port: 33066 - name: omc_db - -paramfiledir: ../../config/param diff --git a/tools/loadpconf/makefile b/tools/loadpconf/makefile deleted file mode 100644 index 1a46296e..00000000 --- a/tools/loadpconf/makefile +++ /dev/null @@ -1,22 +0,0 @@ -# Makefile for rest agent project - -PROJECT = OMC -VERSION = 5GC16.1.1 -PLATFORM = amd64 -DEBDIR = ../../../deb -ETCDIR = ../../../etc -RELEASEDIR = ../../../release -LIBDIR = ../lib -BINNAME = loadpconf - -.PHONY: build $(BINNAME) -build $(BINNAME): - go build -o $(BINNAME) -v -ldflags "-X 'main.version=$(VERSION)' \ - -X 'main.buildTime=`date`' \ - -X 'main.goVer=`go version`'" - -run: $(BINNAME) - ./$(BINNAME) - -clean: - rm ./$(BINNAME) diff --git a/tools/misc/tables_c.lst b/tools/misc/tables_c.lst index 4a0a0ef4..5203389c 100644 --- a/tools/misc/tables_c.lst +++ b/tools/misc/tables_c.lst @@ -9,7 +9,7 @@ mml_command mml_http_map mml_subscriber mml_system -param_config +ne_config pm_custom_title title_info trace_info From ecbd298437ee240269b6e7ae7bc8ffab08c042cd Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 18:04:49 +0800 Subject: [PATCH 2/6] =?UTF-8?q?del:=20=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?PostGoldKPIFromNF=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/pm/performance.go | 129 ------------------------------------- 1 file changed, 129 deletions(-) diff --git a/features/pm/performance.go b/features/pm/performance.go index 94aea455..c7a5b3b3 100644 --- a/features/pm/performance.go +++ b/features/pm/performance.go @@ -335,135 +335,6 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { services.ResponseStatusOK204NoContent(w) } -// PostGoldKPIFromNF 已废弃 -// post kpi report from NEs, insert insto gold_kpi table, discard... -func PostGoldKPIFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostKPIReportFromNF processing... ") - - vars := mux.Vars(r) - apiVer := vars["apiVersion"] - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Faile to io.ReadAll: ", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Request body:", string(body)) - kpiReport := new(KpiReport) - _ = json.Unmarshal(body, &kpiReport) - log.Trace("kpiReport:", kpiReport) - - session := xEngine.NewSession() - defer session.Close() - goldKpi := new(GoldKpi) - layout := time.RFC3339Nano - goldKpi.Date = GetDateFromTimeString(layout, kpiReport.Task.Period.StartTime) - goldKpi.Index, _ = strconv.Atoi(vars["index"]) - goldKpi.StartTime = global.GetFmtTimeString(layout, kpiReport.Task.Period.StartTime, time.DateTime) - goldKpi.EndTime = global.GetFmtTimeString(layout, kpiReport.Task.Period.EndTime, time.DateTime) - // get time granularity from startTime and endTime - seconds, _ := global.GetSecondDuration(goldKpi.StartTime, goldKpi.EndTime) - goldKpi.Granularity = 60 - if seconds != 0 && seconds <= math.MaxInt8 && seconds >= math.MinInt8 { - goldKpi.Granularity = int8(seconds) - } - goldKpi.NEName = kpiReport.Task.NE.NEName - goldKpi.RmUid = kpiReport.Task.NE.RmUID - goldKpi.NEType = kpiReport.Task.NE.NeType - goldKpi.Timestamp = global.GetFmtTimeString(layout, kpiReport.Timestamp, time.DateTime) - // 黄金指标事件对象 - kpiEvent := map[string]any{ - // kip_id ... - "neType": goldKpi.NEType, - "neName": goldKpi.NEName, - "rmUID": goldKpi.RmUid, - "startIndex": goldKpi.Index, - "timeGroup": goldKpi.StartTime, - } - // insert into new kpi_report_xxx table - kpiData := new(KpiData) - kpiData.Date = goldKpi.Date - kpiData.Index = goldKpi.Index - //st, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.StartTime, time.Local) - //et, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.EndTime, time.Local) - kpiData.StartTime = goldKpi.StartTime - kpiData.EndTime = goldKpi.EndTime - kpiData.Granularity = goldKpi.Granularity - kpiData.NEName = goldKpi.NEName - kpiData.NEType = goldKpi.NEType - kpiData.RmUid = goldKpi.RmUid - kpiVal := new(KPIVal) - kpiData.CreatedAt = time.Now().UnixMilli() - for _, k := range kpiReport.Task.NE.KPIs { - kpiEvent[k.KPIID] = k.Value // kip_id - goldKpi.KpiId = k.KPIID - goldKpi.Value = k.Value - goldKpi.Error = k.Err - - kpiVal.KPIID = k.KPIID - kpiVal.Value = int64(k.Value) - kpiVal.Err = k.Err - kpiData.KPIValues = append(kpiData.KPIValues, *kpiVal) - - //log.Trace("goldKpi:", goldKpi) - - // 启动事务 - err := session.Begin() - if err != nil { - log.Error("Failed to Begin gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - gkpi := &GoldKpi{} - _, err = session.Where("id = ?", 1).ForUpdate().Get(gkpi) - if err != nil { - // 回滚事务 - session.Rollback() - log.Error("Failed to ForUpdate gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - affected, err := session.Insert(goldKpi) - if err != nil && affected <= 0 { - session.Rollback() - log.Error("Failed to insert gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // 提交事务 - err = session.Commit() - if err != nil { - log.Error("Failed to Commit gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - // insert kpi_report table, no session - tableName := "kpi_report_" + strings.ToLower(kpiReport.Task.NE.NeType) - affected, err := xEngine.Table(tableName).Insert(kpiData) - if err != nil && affected <= 0 { - log.Errorf("Failed to insert %s:%v", tableName, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 推送到ws订阅组 - wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI, kpiEvent) - if goldKpi.NEType == "UPF" { - wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF, kpiEvent) - } - - services.ResponseStatusOK204NoContent(w) -} - type MeasureTask struct { Tasks []Task `json:"Tasks"` NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */ From ee93b68683c56af7aa8c71bde9eb28c91963f7d1 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 19:03:52 +0800 Subject: [PATCH 3/6] =?UTF-8?q?del:=20=E7=A7=BB=E9=99=A4=E6=97=A7=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3/objectType/license?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/cm/license.go | 558 ----------------------------------------- lib/routes/routes.go | 7 - 2 files changed, 565 deletions(-) delete mode 100644 features/cm/license.go diff --git a/features/cm/license.go b/features/cm/license.go deleted file mode 100644 index ed4299cc..00000000 --- a/features/cm/license.go +++ /dev/null @@ -1,558 +0,0 @@ -package cm - -import ( - "fmt" - "io" - "net/http" - "os" - "os/exec" - "strings" - - "be.ems/lib/core/ctx" - "be.ems/lib/dborm" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/restagent/config" - neModel "be.ems/src/modules/network_element/model" - neService "be.ems/src/modules/network_element/service" - "github.com/gorilla/mux" -) - -var ( - // General License URI - UriLicense = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/license" - UriLicenseExt = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/license" - - CustomUriLicense = config.UriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/license" - CustomUriLicenseExt = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/license" -) - -func UploadLicenseFile(w http.ResponseWriter, r *http.Request) { - log.Debug("UploadLicenseFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - // neTypeUpper := strings.ToUpper(neType) - // neTypeLower := strings.ToLower(neType) - - services.ResponseStatusOK204NoContent(w) -} - -func DownloadLicenseFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DownloadLicenseFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - // // neTypeUpper := strings.ToUpper(neType) - // //neTypeLower := strings.ToLower(neType) - - // version := vars["version"] - // if version == "" { - // log.Error("version is empty") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - // neSoftware, err := dborm.XormGetDataBySQL(sql) - // if err != nil { - // log.Error("Faile to XormGetDataBySQL:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } else if len(*neSoftware) == 0 { - // err := global.ErrCMNotFoundTargetSoftware - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // fileName := (*neSoftware)[0]["file_name"] - // path := (*neSoftware)[0]["path"] - // md5Sum := (*neSoftware)[0]["md5_sum"] - - // services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, path, md5Sum) -} - -func DeleteLcenseFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteLcenseFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - // neTypeUpper := strings.ToUpper(neType) - // //neTypeLower := strings.ToLower(neType) - - // version := vars["version"] - // if version == "" { - // log.Error("version is empty") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - // neSoftware, err := dborm.XormGetDataBySQL(sql) - // if err != nil { - // log.Error("Faile to XormGetDataBySQL:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } else if len(*neSoftware) == 0 { - // err := global.ErrCMNotFoundTargetSoftware - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // where := fmt.Sprintf("ne_type='%s' and version='%s'", neTypeUpper, version) - // affected, err := dborm.XormDeleteDataByWhere(where, "ne_software") - // if err != nil || affected == 0 { - // log.Error("Faile to XormGetDataBySQL:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // fileName := (*neSoftware)[0]["file_name"] - // path := (*neSoftware)[0]["path"] - // filePath := fmt.Sprintf("%s/%s", path, fileName) - // err = os.Remove(filePath) - // if err != nil { - // log.Error("Faile to Remove:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - services.ResponseStatusOK204NoContent(w) -} - -// type MMLRequest struct { -// MML []string `json:"mml"` -// } - -// var TIME_DELAY_AFTER_WRITE time.Duration = 200 -// var TIME_DEAD_LINE time.Duration = 10 - -// func init() { -// if config.GetYamlConfig().MML.Sleep != 0 { -// TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep) -// } -// if config.GetYamlConfig().MML.DeadLine != 0 { -// TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine) -// } -// } - -func UploadLicenseFileData(w http.ResponseWriter, r *http.Request) { - log.Info("UploadLicenseFileData processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - - //md5Param := services.GetUriParamString(r, "md5Sum", ",", false, false) - - neId := services.GetUriParamString(r, "neId", ",", false, false) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Errorf("Failed to get ne_info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("neInfo:", neInfo) - - licensePath := fmt.Sprintf("%s/%s", config.GetYamlConfig().OMC.License, neTypeLower) - err = os.MkdirAll(licensePath, os.ModePerm) - if err != nil { - log.Error("Failed to Mkdir:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - //fileName, err := services.HandleUploadFile(r, softwarePath, "") - - // 解析multipart/form-data请求 - err = r.ParseMultipartForm(10 << 20) // 10MB - if err != nil { - log.Error("Faile to ParseMultipartForm:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 获取文件和数据 - licFile := r.MultipartForm.File["file"] - data := r.MultipartForm.Value["comment"] - - var licenseFileName, comment string - - // 处理license文件 - if len(licFile) > 0 { - file := licFile[0] - // 打开文件 - f, err := file.Open() - if err != nil { - log.Error("Faile to Open:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer f.Close() - - // 创建本地文件 - dst, err := os.Create(licensePath + "/" + file.Filename) - if err != nil { - log.Error("Faile to Create:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer dst.Close() - - licenseFileName = file.Filename - // 将文件内容拷贝到本地文件 - _, err = io.Copy(dst, f) - if err != nil { - log.Error("Faile to Copy:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - // 处理数据 - if len(data) > 0 { - comment = data[0] - } - - neLicensePath := strings.ReplaceAll(config.GetYamlConfig().NE.LicenseDir, "{neType}", neTypeLower) - - srcFile := fmt.Sprintf("%s/%s", licensePath, licenseFileName) - scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - cmd := exec.Command("scp", "-r", srcFile, scpDir) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // backup system.ini to system.ini.bak - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - cpCmd := fmt.Sprintf("sudo test -f %s/system.ini && cp -f %s/system.ini %s/system.ini.bak||echo 0", - neLicensePath, neLicensePath, neLicensePath) - cmd = exec.Command("ssh", sshHost, cpCmd) - out, err = cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to execute cp command:%v, cmd:%s", err, cpCmd) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // replace system.ini - neFilePath := config.GetYamlConfig().NE.ScpDir + "/" + licenseFileName - cpCmd = fmt.Sprintf("sudo mv -f %s %s/system.ini", neFilePath, neLicensePath) - cmd = exec.Command("ssh", sshHost, cpCmd) - out, err = cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute cp command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - /* - // judge license if expired - isRestart := false - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, neTypeLower) - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}). - //SetHeaders(map[string]string{"accessToken": token}). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Get(requestURI2NF) - if err != nil { - log.Error("Failed to get system state:", err) - isRestart = true - } else { - systemState := make(map[string]interface{}) - _ = json.Unmarshal(resp.Body(), &systemState) - expiryDate := fmt.Sprintf("%v", systemState["expiryDate"]) - t1_expiry, _ := time.ParseInLocation(time.DateOnly, expiryDate, time.Local) - nowDate := time.Now().Local() - nowDate.Format(time.DateOnly) - isRestart = t1_expiry.Before(nowDate) - } - // case non-expired license: send NE reload license MML - if !isRestart { - // send reload license MML - var buf [20 * 1024]byte - //buf := make([]byte, 0) - var n int - if neInfo != nil { - switch strings.ToLower(neType) { - case "ims": - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer conn.Close() - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - - _, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0:n])) - - _, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - mmlCommand := "check lic\r\n" - - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - // upf telnet buffer只能读取一次,需要去掉前面的多余字符 - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - if !strings.Contains(result, "COMMAND OK") { - err = fmt.Errorf("failed to check license, %s", result) - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer conn.Close() - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - _, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0:n])) - - mmlCommand := "check lic\n" - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - if !strings.Contains(result, "COMMAND OK") { - err = fmt.Errorf("failed to check license, %s", result) - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - } - } else { - // case expired license: restart NE service - switch neTypeLower { - case "omc": - restartCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh restart", config.GetYamlConfig().NE.OmcDir) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh restart omc:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "ims": - restartCmd := "sudo ims-stop && sudo ims-start" - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo systemctl command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - restartCmd := fmt.Sprintf("sudo systemctl restart %s.service", neTypeLower) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo systemctl command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - } - */ - - // neLicense := dborm.NeLicense{ - // NeType: neTypeUpper, - // NeID: neId, - // Status: "ACTIVE", - // Path: licensePath, - // FileName: licenseFileName, - // Comment: comment, - // } - - // log.Debug("neLicense:", neLicense) - // _, err = dborm.XormInsertTableOne("ne_license", neLicense) - // if err != nil { - // log.Error("Faile to XormInsertTableOne:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // } - - neLicense := neModel.NeLicense{ - NeType: neTypeUpper, - NeId: neId, - Status: "0", - LicensePath: neFilePath, - Remark: comment, - } - - log.Debug("neLicense:", neLicense) - - // 检查是否存在授权记录 - neLicense2 := neService.NewNeLicenseImpl.SelectByNeTypeAndNeID(neTypeUpper, neId) - if neLicense2.NeId != neId { - // 读取授权码 - code, _ := neService.NewNeLicenseImpl.ReadLicenseInfo(neLicense) - neLicense.ActivationRequestCode = code - - neLicense.CreateBy = ctx.LoginUserToUserName(r) - insertId := neService.NewNeLicenseImpl.Insert(neLicense) - if insertId != "" { - services.ResponseStatusOK204NoContent(w) - return - } - } else { - neLicense2.UpdateBy = ctx.LoginUserToUserName(r) - upRows := neService.NewNeLicenseImpl.Update(neLicense2) - if upRows > 0 { - services.ResponseStatusOK204NoContent(w) - return - } - } - - services.ResponseInternalServerError500ProcessError(w, err) -} diff --git a/lib/routes/routes.go b/lib/routes/routes.go index 70459094..a3143d02 100644 --- a/lib/routes/routes.go +++ b/lib/routes/routes.go @@ -207,13 +207,6 @@ func init() { Register("PUT", cm.CustomUriSoftwareNE, cm.ActiveSoftwareToNF, nil) Register("PATCH", cm.CustomUriSoftwareNE, cm.RollBackSoftwareToNF, nil) - // License management - Register("POST", cm.UriLicense, cm.UploadLicenseFileData, midware.LogOperate(collectlogs.OptionNew("License", collectlogs.BUSINESS_TYPE_INSERT))) - Register("POST", cm.UriLicenseExt, cm.UploadLicenseFileData, midware.LogOperate(collectlogs.OptionNew("License", collectlogs.BUSINESS_TYPE_INSERT))) - - Register("POST", cm.CustomUriLicense, cm.UploadLicenseFileData, nil) - Register("POST", cm.CustomUriLicenseExt, cm.UploadLicenseFileData, nil) - // Trace management 跟踪任务 Register("POST", trace.UriTraceTask, trace.PostTraceTaskToNF, midware.LogOperate(collectlogs.OptionNew("Trace Task", collectlogs.BUSINESS_TYPE_INSERT))) Register("PUT", trace.UriTraceTask, trace.PutTraceTaskToNF, midware.LogOperate(collectlogs.OptionNew("Trace Task", collectlogs.BUSINESS_TYPE_UPDATE))) From 94bba0c910bb8c18079d4b7d29d06cb7dbb4a1c5 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 19:04:48 +0800 Subject: [PATCH 4/6] =?UTF-8?q?add:=20=E6=96=87=E4=BB=B6=E5=B7=A5=E5=85=B7?= =?UTF-8?q?tar=E5=8E=8B=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/utils/file/tar.go | 76 +++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/framework/utils/file/tar.go diff --git a/src/framework/utils/file/tar.go b/src/framework/utils/file/tar.go new file mode 100644 index 00000000..22c3fb67 --- /dev/null +++ b/src/framework/utils/file/tar.go @@ -0,0 +1,76 @@ +package file + +import ( + "archive/tar" + "compress/gzip" + "io" + "os" + "path/filepath" +) + +// CompressTarGZByDir 将目录下文件添加到 tar.gz 压缩文件 +func CompressTarGZByDir(zipFilePath, dirPath string) error { + // 创建本地输出目录 + if err := os.MkdirAll(filepath.Dir(zipFilePath), 0775); err != nil { + return err + } + + // 创建输出文件 + tarFile, err := os.Create(zipFilePath) + if err != nil { + return err + } + defer tarFile.Close() + + gw := gzip.NewWriter(tarFile) + defer gw.Close() + + tw := tar.NewWriter(gw) + defer tw.Close() + + // 遍历目录下的所有文件和子目录 + err = filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + // 忽略目录 + if info.IsDir() { + return nil + } + + // 创建文件条目 + header, err := tar.FileInfoHeader(info, "") + if err != nil { + return err + } + relPath, err := filepath.Rel(dirPath, path) + if err != nil { + return err + } + header.Name = relPath + if err := tw.WriteHeader(header); err != nil { + return err + } + if !info.Mode().IsRegular() { + return nil + } + + // 打开文件 + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + // 写入文件内容 + _, err = io.Copy(tw, file) + if err != nil { + return err + } + + return nil + }) + + return err +} From 1f0c932be86e01d73481689048f60b9ae2794fb1 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 19:06:12 +0800 Subject: [PATCH 5/6] =?UTF-8?q?style:=20=E5=8E=BB=E9=99=A4Impl=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=A3=B0=E6=98=8E=E5=B1=82=E8=81=9A=E7=84=A6=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/cdr/cdrevent.go | 2 +- features/cm/ne.go | 10 +- features/cm/param.go | 8 +- features/event/event.go | 2 +- features/mml/mml.go | 6 +- features/pm/performance.go | 2 +- features/ue/ue.go | 2 +- .../ne_config_backup/ne_config_backup.go | 13 +- .../network_data/controller/all_alarm.go | 12 +- .../network_data/controller/all_kpi.go | 12 +- src/modules/network_data/controller/amf.go | 12 +- src/modules/network_data/controller/ims.go | 12 +- src/modules/network_data/controller/mme.go | 12 +- src/modules/network_data/controller/smf.go | 17 +- src/modules/network_data/controller/smsc.go | 12 +- .../network_data/controller/udm_auth.go | 8 +- .../network_data/controller/udm_sub.go | 8 +- src/modules/network_data/controller/upf.go | 12 +- src/modules/network_data/network_data.go | 42 +- src/modules/network_data/repository/alarm.go | 197 +++- .../network_data/repository/alarm.impl.go | 194 ---- .../network_data/repository/cdr_event_ims.go | 192 +++- .../repository/cdr_event_ims.impl.go | 189 ---- .../network_data/repository/cdr_event_smf.go | 173 +++- .../repository/cdr_event_smf.impl.go | 170 --- .../network_data/repository/cdr_event_smsc.go | 184 +++- .../repository/cdr_event_smsc.impl.go | 181 ---- .../network_data/repository/perf_kpi.go | 134 ++- .../network_data/repository/perf_kpi.impl.go | 131 --- .../network_data/repository/ue_event_amf.go | 178 +++- .../repository/ue_event_amf.impl.go | 175 ---- .../network_data/repository/ue_event_mme.go | 178 +++- .../repository/ue_event_mme.impl.go | 175 ---- src/modules/network_data/service/alarm.go | 41 +- .../network_data/service/alarm.impl.go | 40 - .../network_data/service/cdr_event_ims.go | 41 +- .../service/cdr_event_ims.impl.go | 40 - .../network_data/service/cdr_event_smf.go | 41 +- .../service/cdr_event_smf.impl.go | 37 - .../network_data/service/cdr_event_smsc.go | 41 +- .../service/cdr_event_smsc.impl.go | 37 - src/modules/network_data/service/perf_kpi.go | 84 +- .../network_data/service/perf_kpi.impl.go | 80 -- .../network_data/service/ue_event_amf.go | 42 +- .../network_data/service/ue_event_amf.impl.go | 40 - .../network_data/service/ue_event_mme.go | 41 +- .../network_data/service/ue_event_mme.impl.go | 40 - .../network_element/controller/action.go | 4 +- .../network_element/controller/ne_config.go | 10 +- .../controller/ne_config_backup.go | 10 +- .../network_element/controller/ne_host.go | 5 +- .../network_element/controller/ne_host_cmd.go | 5 +- .../network_element/controller/ne_info.go | 13 +- .../network_element/controller/ne_license.go | 10 +- .../network_element/controller/ne_software.go | 5 +- .../network_element/controller/ne_version.go | 3 +- .../network_element/network_element.go | 12 +- .../network_element/repository/ne_config.go | 271 ++++- .../repository/ne_config.impl.go | 259 ----- .../repository/ne_config_backup.go | 274 ++++- .../repository/ne_config_backup.impl.go | 262 ----- .../network_element/repository/ne_host.go | 391 ++++++- .../repository/ne_host.impl.go | 376 ------- .../network_element/repository/ne_host_cmd.go | 321 +++++- .../repository/ne_host_cmd.impl.go | 306 ------ .../network_element/repository/ne_info.go | 423 +++++++- .../repository/ne_info.impl.go | 405 -------- .../network_element/repository/ne_license.go | 309 +++++- .../repository/ne_license.impl.go | 297 ------ .../network_element/repository/ne_software.go | 332 +++++- .../repository/ne_software.impl.go | 317 ------ .../network_element/service/ne_config.go | 189 +++- .../network_element/service/ne_config.impl.go | 164 --- .../service/ne_config_backup.go | 221 +++- .../service/ne_config_backup.impl.go | 202 ---- .../network_element/service/ne_host.go | 191 +++- .../network_element/service/ne_host.impl.go | 172 ---- .../network_element/service/ne_host_cmd.go | 96 +- .../service/ne_host_cmd.impl.go | 80 -- .../network_element/service/ne_info.go | 972 ++++++++++++++++-- .../network_element/service/ne_info.impl.go | 918 ----------------- .../network_element/service/ne_license.go | 214 +++- .../service/ne_license.impl.go | 191 ---- .../network_element/service/ne_software.go | 162 ++- .../service/ne_software.impl.go | 143 --- .../network_element/service/ne_version.go | 23 +- src/modules/tool/controller/iperf.go | 2 +- src/modules/tool/controller/ping.go | 2 +- src/modules/tool/service/iperf.go | 13 +- src/modules/tool/service/ping.go | 10 +- src/modules/trace/controller/tcpdump.go | 4 +- .../trace/controller/trace_task_hlr.go | 8 +- src/modules/trace/service/tcpdump.go | 5 +- src/modules/trace/service/trace_task.go | 6 +- src/modules/trace/service/trace_task_hlr.go | 8 +- src/modules/ws/controller/ws_ssh.go | 2 +- src/modules/ws/controller/ws_telnet.go | 2 +- src/modules/ws/controller/ws_view.go | 2 +- src/modules/ws/processor/cdr_connect.go | 12 +- src/modules/ws/processor/ne_state.go | 2 +- src/modules/ws/processor/ue_connect.go | 4 +- src/modules/ws/processor/upf_total_flow.go | 4 +- 102 files changed, 5624 insertions(+), 6320 deletions(-) delete mode 100644 src/modules/network_data/repository/alarm.impl.go delete mode 100644 src/modules/network_data/repository/cdr_event_ims.impl.go delete mode 100644 src/modules/network_data/repository/cdr_event_smf.impl.go delete mode 100644 src/modules/network_data/repository/cdr_event_smsc.impl.go delete mode 100644 src/modules/network_data/repository/perf_kpi.impl.go delete mode 100644 src/modules/network_data/repository/ue_event_amf.impl.go delete mode 100644 src/modules/network_data/repository/ue_event_mme.impl.go delete mode 100644 src/modules/network_data/service/alarm.impl.go delete mode 100644 src/modules/network_data/service/cdr_event_ims.impl.go delete mode 100644 src/modules/network_data/service/cdr_event_smf.impl.go delete mode 100644 src/modules/network_data/service/cdr_event_smsc.impl.go delete mode 100644 src/modules/network_data/service/perf_kpi.impl.go delete mode 100644 src/modules/network_data/service/ue_event_amf.impl.go delete mode 100644 src/modules/network_data/service/ue_event_mme.impl.go delete mode 100644 src/modules/network_element/repository/ne_config.impl.go delete mode 100644 src/modules/network_element/repository/ne_config_backup.impl.go delete mode 100644 src/modules/network_element/repository/ne_host.impl.go delete mode 100644 src/modules/network_element/repository/ne_host_cmd.impl.go delete mode 100644 src/modules/network_element/repository/ne_info.impl.go delete mode 100644 src/modules/network_element/repository/ne_license.impl.go delete mode 100644 src/modules/network_element/repository/ne_software.impl.go delete mode 100644 src/modules/network_element/service/ne_config.impl.go delete mode 100644 src/modules/network_element/service/ne_config_backup.impl.go delete mode 100644 src/modules/network_element/service/ne_host.impl.go delete mode 100644 src/modules/network_element/service/ne_host_cmd.impl.go delete mode 100644 src/modules/network_element/service/ne_info.impl.go delete mode 100644 src/modules/network_element/service/ne_license.impl.go delete mode 100644 src/modules/network_element/service/ne_software.impl.go diff --git a/features/cdr/cdrevent.go b/features/cdr/cdrevent.go index 6361fa05..12bb6766 100644 --- a/features/cdr/cdrevent.go +++ b/features/cdr/cdrevent.go @@ -56,7 +56,7 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(cdrEvent.RmUID) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(cdrEvent.RmUID) if neInfo.RmUID == cdrEvent.RmUID { // 推送到ws订阅组 switch neInfo.NeType { diff --git a/features/cm/ne.go b/features/cm/ne.go index 665c3f8f..f5f10071 100644 --- a/features/cm/ne.go +++ b/features/cm/ne.go @@ -157,7 +157,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} @@ -208,7 +208,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) services.ResponseStatusOK204NoContent(w) return @@ -267,7 +267,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} @@ -319,7 +319,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) services.ResponseStatusOK204NoContent(w) return @@ -381,7 +381,7 @@ func DeleteNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} diff --git a/features/cm/param.go b/features/cm/param.go index 9e5a62fb..c44c9743 100644 --- a/features/cm/param.go +++ b/features/cm/param.go @@ -39,7 +39,7 @@ func GetParamConfigFromNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) var response services.DataResponse if neInfo.NeId == neId && neInfo.NeId != "" { @@ -76,7 +76,7 @@ func PostParamConfigToNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") @@ -128,7 +128,7 @@ func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) { } neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") @@ -181,7 +181,7 @@ func DeleteParamConfigToNF(w http.ResponseWriter, r *http.Request) { } neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") diff --git a/features/event/event.go b/features/event/event.go index faad0e11..1f75012b 100644 --- a/features/event/event.go +++ b/features/event/event.go @@ -99,7 +99,7 @@ func PostUEEvent(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(ueEvent.RmUID) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(ueEvent.RmUID) if neInfo.RmUID == ueEvent.RmUID { // 推送到ws订阅组 if ueEvent.NeType == "MME" { diff --git a/features/mml/mml.go b/features/mml/mml.go index 537b0cde..feaa6910 100644 --- a/features/mml/mml.go +++ b/features/mml/mml.go @@ -83,7 +83,7 @@ func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { } log.Debug("neType:", neType, "neId", neId) - neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return @@ -235,7 +235,7 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { return } - neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return @@ -635,7 +635,7 @@ func PostMMLToOMC(w http.ResponseWriter, r *http.Request) { } log.Debug("neType:", neType, "neId", neId) - neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, false) + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, false) if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return diff --git a/features/pm/performance.go b/features/pm/performance.go index c7a5b3b3..cd54c741 100644 --- a/features/pm/performance.go +++ b/features/pm/performance.go @@ -288,7 +288,7 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(kpiData.RmUid) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(kpiData.RmUid) // custom kpi report to FE kpiCEvent := map[string]any{ // kip_id ... diff --git a/features/ue/ue.go b/features/ue/ue.go index 5581bb6f..cd2bb024 100644 --- a/features/ue/ue.go +++ b/features/ue/ue.go @@ -253,7 +253,7 @@ func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) var response services.MapResponse if neInfo.NeId == neId && neInfo.NeId != "" { 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 8263e19d..bb36135c 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 @@ -11,19 +11,16 @@ import ( ) var NewProcessor = &NeConfigBackupProcessor{ - neConfigBackupService: neService.NewNeConfigBackupImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigBackupService: neService.NewNeConfigBackup, + neInfoService: neService.NewNeInfo, count: 0, } // NeConfigBackupProcessor 网元配置文件定期备份 type NeConfigBackupProcessor struct { - // 网元配置文件备份记录服务 - neConfigBackupService neService.INeConfigBackup - // 网元信息服务 - neInfoService neService.INeInfo - // 执行次数 - count int + neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 + neInfoService *neService.NeInfo // 网元信息服务 + count int // 执行次数 } func (s *NeConfigBackupProcessor) Execute(data any) (any, error) { diff --git a/src/modules/network_data/controller/all_alarm.go b/src/modules/network_data/controller/all_alarm.go index da67adaf..2372de98 100644 --- a/src/modules/network_data/controller/all_alarm.go +++ b/src/modules/network_data/controller/all_alarm.go @@ -15,19 +15,17 @@ import ( ) // 实例化控制层 AlarmController 结构体 -var NewAlarmController = &AlarmController{ - neInfoService: neService.NewNeInfoImpl, - alarmService: neDataService.NewAlarmImpl, +var NewAlarm = &AlarmController{ + neInfoService: neService.NewNeInfo, + alarmService: neDataService.NewAlarm, } // 告警数据 // // PATH /alarm type AlarmController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 告警信息服务 - alarmService neDataService.IAlarm + neInfoService *neService.NeInfo // 网元信息服务 + alarmService *neDataService.Alarm // 告警信息服务 } // 告警列表 diff --git a/src/modules/network_data/controller/all_kpi.go b/src/modules/network_data/controller/all_kpi.go index 221eb655..e3dbc720 100644 --- a/src/modules/network_data/controller/all_kpi.go +++ b/src/modules/network_data/controller/all_kpi.go @@ -11,19 +11,17 @@ import ( ) // 实例化控制层 PerfKPIController 结构体 -var NewPerfKPIController = &PerfKPIController{ - neInfoService: neService.NewNeInfoImpl, - perfKPIService: neDataService.NewPerfKPIImpl, +var NewPerfKPI = &PerfKPIController{ + neInfoService: neService.NewNeInfo, + perfKPIService: neDataService.NewPerfKPI, } // 性能统计 // // PATH /kpi type PerfKPIController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 统计信息服务 - perfKPIService neDataService.IPerfKPI + neInfoService *neService.NeInfo // 网元信息服务 + perfKPIService *neDataService.PerfKPI // 统计信息服务 } // 获取统计数据 diff --git a/src/modules/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index fbc7142f..a41e95c9 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -22,19 +22,17 @@ import ( ) // 实例化控制层 AMFController 结构体 -var NewAMFController = &AMFController{ - neInfoService: neService.NewNeInfoImpl, - ueEventService: neDataService.NewUEEventAMFImpl, +var NewAMF = &AMFController{ + neInfoService: neService.NewNeInfo, + ueEventService: neDataService.NewUEEventAMF, } // 网元AMF // // PATH /amf type AMFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // UE会话事件服务 - ueEventService neDataService.IUEEventAMF + neInfoService *neService.NeInfo // 网元信息服务 + ueEventService *neDataService.UEEventAMF // UE会话事件服务 } // UE会话列表 diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 22221200..051ceb1b 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -23,19 +23,17 @@ import ( ) // 实例化控制层 IMSController 结构体 -var NewIMSController = &IMSController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventIMSImpl, +var NewIMS = &IMSController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventIMS, } // 网元IMS // // PATH /ims type IMSController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventIMS + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventIMS // CDR会话事件服务 } // CDR会话列表 diff --git a/src/modules/network_data/controller/mme.go b/src/modules/network_data/controller/mme.go index a7707a18..1c61daa0 100644 --- a/src/modules/network_data/controller/mme.go +++ b/src/modules/network_data/controller/mme.go @@ -23,19 +23,17 @@ import ( ) // 实例化控制层 MMEController 结构体 -var NewMMEController = &MMEController{ - neInfoService: neService.NewNeInfoImpl, - ueEventService: neDataService.NewUEEventMMEImpl, +var NewMME = &MMEController{ + neInfoService: neService.NewNeInfo, + ueEventService: neDataService.NewUEEventMME, } // 网元MME // // PATH /mme type MMEController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // UE会话事件服务 - ueEventService neDataService.IUEEventMME + neInfoService *neService.NeInfo // 网元信息服务 + ueEventService *neDataService.UEEventMME // UE会话事件服务 } // UE会话列表 diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index 0dc48827..d944f813 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -22,22 +22,19 @@ import ( ) // 实例化控制层 SMFController 结构体 -var NewSMFController = &SMFController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventSMFImpl, - udmUserInfoService: *neDataService.NewUDMUserInfo, +var NewSMF = &SMFController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventSMF, + udmUserInfoService: neDataService.NewUDMUserInfo, } // 网元SMF // // PATH /smf type SMFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventSMF - // UDM用户信息服务 - udmUserInfoService neDataService.UDMUserInfo + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventSMF // CDR会话事件服务 + udmUserInfoService *neDataService.UDMUserInfo // UDM用户信息服务 } // CDR会话列表 diff --git a/src/modules/network_data/controller/smsc.go b/src/modules/network_data/controller/smsc.go index 6ebcb75d..167d097a 100644 --- a/src/modules/network_data/controller/smsc.go +++ b/src/modules/network_data/controller/smsc.go @@ -22,19 +22,17 @@ import ( ) // 实例化控制层 SMSCController 结构体 -var NewSMSCController = &SMSCController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventSMSCImpl, +var NewSMSC = &SMSCController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventSMSC, } // 网元SMSC // // PATH /smsc type SMSCController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventSMSC + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventSMSC // CDR会话事件服务 } // CDR会话列表 diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index de05f3ea..dbaeb3ec 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -24,17 +24,15 @@ import ( // 实例化控制层 UDMAuthController 结构体 var NewUDMAuth = &UDMAuthController{ udmAuthService: neDataService.NewUDMAuthUser, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // UDM鉴权用户 // // PATH /udm/auth type UDMAuthController struct { - // UDM鉴权信息服务 - udmAuthService *neDataService.UDMAuthUser - // 网元信息服务 - neInfoService neService.INeInfo + udmAuthService *neDataService.UDMAuthUser // UDM鉴权信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // UDM鉴权用户重载数据 diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index 3a7facc4..cec49570 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -23,17 +23,15 @@ import ( // 实例化控制层 UDMSubController 结构体 var NewUDMSub = &UDMSubController{ udmSubService: neDataService.NewUDMSub, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // UDM签约用户 // // PATH /udm/sub type UDMSubController struct { - // UDM签约信息服务 - udmSubService *neDataService.UDMSubUser - // 网元信息服务 - neInfoService neService.INeInfo + udmSubService *neDataService.UDMSubUser // UDM签约信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // UDM签约用户重载数据 diff --git a/src/modules/network_data/controller/upf.go b/src/modules/network_data/controller/upf.go index 366fc15d..0d0acd5e 100644 --- a/src/modules/network_data/controller/upf.go +++ b/src/modules/network_data/controller/upf.go @@ -10,19 +10,17 @@ import ( ) // 实例化控制层 UPFController 结构体 -var NewUPFController = &UPFController{ - neInfoService: neService.NewNeInfoImpl, - perfKPIService: neDataService.NewPerfKPIImpl, +var NewUPF = &UPFController{ + neInfoService: neService.NewNeInfo, + perfKPIService: neDataService.NewPerfKPI, } // 网元UPF // // PATH /upf type UPFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 统计信息服务 - perfKPIService neDataService.IPerfKPI + neInfoService *neService.NeInfo // 网元信息服务 + perfKPIService *neDataService.PerfKPI // 统计信息服务 } // 总流量数 N3上行 N6下行 diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index e60cdd9f..a114f75b 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -21,11 +21,11 @@ func Setup(router *gin.Engine) { { kpiGroup.GET("/title", middleware.PreAuthorize(nil), - controller.NewPerfKPIController.Title, + controller.NewPerfKPI.Title, ) kpiGroup.GET("/data", middleware.PreAuthorize(nil), - controller.NewPerfKPIController.GoldKPI, + controller.NewPerfKPI.GoldKPI, ) } @@ -34,11 +34,11 @@ func Setup(router *gin.Engine) { { alarmGroup.GET("/list", middleware.PreAuthorize(nil), - controller.NewAlarmController.List, + controller.NewAlarm.List, ) alarmGroup.DELETE("/:alarmIds", middleware.PreAuthorize(nil), - controller.NewAlarmController.Remove, + controller.NewAlarm.Remove, ) } @@ -47,17 +47,17 @@ func Setup(router *gin.Engine) { { imsGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewIMSController.CDRList, + controller.NewIMS.CDRList, ) imsGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewIMSController.CDRRemove, + controller.NewIMS.CDRRemove, ) imsGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewIMSController.CDRExport, + controller.NewIMS.CDRExport, ) } @@ -66,17 +66,17 @@ func Setup(router *gin.Engine) { { smscGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewSMSCController.CDRList, + controller.NewSMSC.CDRList, ) smscGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewSMSCController.CDRRemove, + controller.NewSMSC.CDRRemove, ) smscGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewSMSCController.CDRExport, + controller.NewSMSC.CDRExport, ) } @@ -85,21 +85,21 @@ func Setup(router *gin.Engine) { { smfGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewSMFController.CDRList, + controller.NewSMF.CDRList, ) smfGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewSMFController.CDRRemove, + controller.NewSMF.CDRRemove, ) smfGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewSMFController.CDRExport, + controller.NewSMF.CDRExport, ) smfGroup.GET("/subscribers", middleware.PreAuthorize(nil), - controller.NewSMFController.SubUserList, + controller.NewSMF.SubUserList, ) } @@ -108,17 +108,17 @@ func Setup(router *gin.Engine) { { amfGroup.GET("/ue/list", middleware.PreAuthorize(nil), - controller.NewAMFController.UEList, + controller.NewAMF.UEList, ) amfGroup.DELETE("/ue/:ueIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewAMFController.UERemove, + controller.NewAMF.UERemove, ) amfGroup.POST("/ue/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewAMFController.UEExport, + controller.NewAMF.UEExport, ) } @@ -127,7 +127,7 @@ func Setup(router *gin.Engine) { { upfGroup.GET("/totalFlow", middleware.PreAuthorize(nil), - controller.NewUPFController.TotalFlow, + controller.NewUPF.TotalFlow, ) } @@ -244,17 +244,17 @@ func Setup(router *gin.Engine) { { mmeGroup.GET("/ue/list", middleware.PreAuthorize(nil), - controller.NewMMEController.UEList, + controller.NewMME.UEList, ) mmeGroup.DELETE("/ue/:ueIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewMMEController.UERemove, + controller.NewMME.UERemove, ) mmeGroup.POST("/ue/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewMMEController.UEExport, + controller.NewMME.UEExport, ) } } diff --git a/src/modules/network_data/repository/alarm.go b/src/modules/network_data/repository/alarm.go index 0ea43bb0..41d50325 100644 --- a/src/modules/network_data/repository/alarm.go +++ b/src/modules/network_data/repository/alarm.go @@ -1,15 +1,194 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// 告警 数据层接口 -type IAlarm interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.AlarmQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.Alarm +// 实例化数据层 Alarm 结构体 +var NewAlarm = &Alarm{ + selectSql: `select + id, alarm_seq, alarm_id, alarm_title, ne_type, ne_id, alarm_code, event_time, + alarm_type, orig_severity, perceived_severity, pv_flag, ne_name, object_uid, object_name, + object_type, location_info, province, alarm_status, specific_problem, specific_problem_id, + add_info, counter, latest_event_time, ack_state, ack_time, ack_user, clear_type, + clear_time, clear_user, timestamp + from alarm`, - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "alarm_seq": "AlarmSeq", + "alarm_id": "AlarmId", + "alarm_title": "AlarmTitle", + "ne_type": "NeType", + "ne_id": "NeId", + "alarm_code": "AlarmCode", + "event_time": "EventTime", + "alarm_type": "AlarmType", + "orig_severity": "OrigSeverity", + "perceived_severity": "PerceivedSeverity", + "pv_flag": "PvFlag", + "ne_name": "NeName", + "object_uid": "ObjectUid", + "object_name": "ObjectName", + "object_type": "ObjectType", + "location_info": "LocationInfo", + "province": "Province", + "alarm_status": "AlarmStatus", + "specific_problem": "SpecificProblem", + "specific_problem_id": "SpecificProblemId", + "add_info": "AddInfo", + "counter": "Counter", + "latest_event_time": "LatestEventTime", + "ack_state": "AckState", + "ack_time": "AckTime", + "ack_user": "AckUser", + "clear_type": "ClearType", + "clear_time": "ClearTime", + "clear_user": "ClearUser", + "timestamp": "Timestamp", + }, +} + +// Alarm 告警 数据层处理 +type Alarm struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *Alarm) convertResultRows(rows []map[string]any) []model.Alarm { + arr := make([]model.Alarm, 0) + for _, row := range rows { + item := model.Alarm{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *Alarm) SelectPage(querys model.AlarmQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "object_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + params = append(params, querys.EndTime) + } + if querys.OrigSeverity != "" { + eventTypes := strings.Split(querys.OrigSeverity, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("orig_severity in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.Alarm{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from alarm" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *Alarm) SelectByIds(ids []string) []model.Alarm { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.Alarm{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *Alarm) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from alarm where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/alarm.impl.go b/src/modules/network_data/repository/alarm.impl.go deleted file mode 100644 index 6a97dbf8..00000000 --- a/src/modules/network_data/repository/alarm.impl.go +++ /dev/null @@ -1,194 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 AlarmImpl 结构体 -var NewAlarmImpl = &AlarmImpl{ - selectSql: `select - id, alarm_seq, alarm_id, alarm_title, ne_type, ne_id, alarm_code, event_time, - alarm_type, orig_severity, perceived_severity, pv_flag, ne_name, object_uid, object_name, - object_type, location_info, province, alarm_status, specific_problem, specific_problem_id, - add_info, counter, latest_event_time, ack_state, ack_time, ack_user, clear_type, - clear_time, clear_user, timestamp - from alarm`, - - resultMap: map[string]string{ - "id": "ID", - "alarm_seq": "AlarmSeq", - "alarm_id": "AlarmId", - "alarm_title": "AlarmTitle", - "ne_type": "NeType", - "ne_id": "NeId", - "alarm_code": "AlarmCode", - "event_time": "EventTime", - "alarm_type": "AlarmType", - "orig_severity": "OrigSeverity", - "perceived_severity": "PerceivedSeverity", - "pv_flag": "PvFlag", - "ne_name": "NeName", - "object_uid": "ObjectUid", - "object_name": "ObjectName", - "object_type": "ObjectType", - "location_info": "LocationInfo", - "province": "Province", - "alarm_status": "AlarmStatus", - "specific_problem": "SpecificProblem", - "specific_problem_id": "SpecificProblemId", - "add_info": "AddInfo", - "counter": "Counter", - "latest_event_time": "LatestEventTime", - "ack_state": "AckState", - "ack_time": "AckTime", - "ack_user": "AckUser", - "clear_type": "ClearType", - "clear_time": "ClearTime", - "clear_user": "ClearUser", - "timestamp": "Timestamp", - }, -} - -// AlarmImpl 告警 数据层处理 -type AlarmImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *AlarmImpl) convertResultRows(rows []map[string]any) []model.Alarm { - arr := make([]model.Alarm, 0) - for _, row := range rows { - item := model.Alarm{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *AlarmImpl) SelectPage(querys model.AlarmQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "object_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - params = append(params, querys.EndTime) - } - if querys.OrigSeverity != "" { - eventTypes := strings.Split(querys.OrigSeverity, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("orig_severity in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.Alarm{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from alarm" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *AlarmImpl) SelectByIds(ids []string) []model.Alarm { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.Alarm{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *AlarmImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from alarm where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_ims.go b/src/modules/network_data/repository/cdr_event_ims.go index fcc9a7bb..598e848c 100644 --- a/src/modules/network_data/repository/cdr_event_ims.go +++ b/src/modules/network_data/repository/cdr_event_ims.go @@ -1,15 +1,189 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件IMS 数据层接口 -type ICDREventIMS interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventIMSQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventIMS +// 实例化数据层 CDREventIMS 结构体 +var NewCDREventIMS = &CDREventIMS{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventIMS CDR会话事件IMS 数据层处理 +type CDREventIMS struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventIMS) convertResultRows(rows []map[string]any) []model.CDREventIMS { + arr := make([]model.CDREventIMS, 0) + for _, row := range rows { + item := model.CDREventIMS{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.CallerParty != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.callerParty') = ?") + params = append(params, querys.CallerParty) + } + if querys.CalledParty != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.calledParty') = ?") + params = append(params, querys.CalledParty) + } + // MySQL8支持的 + // if querys.RecordType != "" { + // recordTypes := strings.Split(querys.RecordType, ",") + // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) + // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) + // for _, recordType := range recordTypes { + // params = append(params, recordType) + // } + // } + // Mariadb不支持json in查询改or + if querys.RecordType != "" { + recordTypes := strings.Split(querys.RecordType, ",") + var queryStrArr []string + for _, recordType := range recordTypes { + queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, recordType) + } + conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventIMS{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_ims" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventIMS) SelectByIds(cdrIds []string) []model.CDREventIMS { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventIMS{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventIMS) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_ims where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_ims.impl.go b/src/modules/network_data/repository/cdr_event_ims.impl.go deleted file mode 100644 index 6d67b6ca..00000000 --- a/src/modules/network_data/repository/cdr_event_ims.impl.go +++ /dev/null @@ -1,189 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventImpl 结构体 -var NewCDREventIMSImpl = &CDREventIMSImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventIMSImpl CDR会话事件IMS 数据层处理 -type CDREventIMSImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventIMSImpl) convertResultRows(rows []map[string]any) []model.CDREventIMS { - arr := make([]model.CDREventIMS, 0) - for _, row := range rows { - item := model.CDREventIMS{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventIMSImpl) SelectPage(querys model.CDREventIMSQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.CallerParty != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.callerParty') = ?") - params = append(params, querys.CallerParty) - } - if querys.CalledParty != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.calledParty') = ?") - params = append(params, querys.CalledParty) - } - // MySQL8支持的 - // if querys.RecordType != "" { - // recordTypes := strings.Split(querys.RecordType, ",") - // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) - // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) - // for _, recordType := range recordTypes { - // params = append(params, recordType) - // } - // } - // Mariadb不支持json in查询改or - if querys.RecordType != "" { - recordTypes := strings.Split(querys.RecordType, ",") - var queryStrArr []string - for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, recordType) - } - conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventIMS{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_ims" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventIMSImpl) SelectByIds(cdrIds []string) []model.CDREventIMS { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventIMS{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventIMSImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_ims where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_smf.go b/src/modules/network_data/repository/cdr_event_smf.go index 1a950a29..14f49cfc 100644 --- a/src/modules/network_data/repository/cdr_event_smf.go +++ b/src/modules/network_data/repository/cdr_event_smf.go @@ -1,15 +1,170 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件SMF 数据层接口 -type ICDREventSMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMFQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventSMF +// 实例化数据层 CDREventSMF 结构体 +var NewCDREventSMF = &CDREventSMF{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventSMF CDR会话事件 数据层处理 +type CDREventSMF struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventSMF) convertResultRows(rows []map[string]any) []model.CDREventSMF { + arr := make([]model.CDREventSMF, 0) + for _, row := range rows { + item := model.CDREventSMF{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.RecordType != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, querys.RecordType) + } + if querys.SubscriberID != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?") + params = append(params, querys.SubscriberID) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventSMF{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_smf" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventSMF) SelectByIds(cdrIds []string) []model.CDREventSMF { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventSMF{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMF) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_smf where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_smf.impl.go b/src/modules/network_data/repository/cdr_event_smf.impl.go deleted file mode 100644 index 97c98aa7..00000000 --- a/src/modules/network_data/repository/cdr_event_smf.impl.go +++ /dev/null @@ -1,170 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSMFImpl 结构体 -var NewCDREventSMFImpl = &CDREventSMFImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventSMFImpl CDR会话事件 数据层处理 -type CDREventSMFImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventSMFImpl) convertResultRows(rows []map[string]any) []model.CDREventSMF { - arr := make([]model.CDREventSMF, 0) - for _, row := range rows { - item := model.CDREventSMF{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventSMFImpl) SelectPage(querys model.CDREventSMFQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.RecordType != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, querys.RecordType) - } - if querys.SubscriberID != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?") - params = append(params, querys.SubscriberID) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventSMF{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smf" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventSMFImpl) SelectByIds(cdrIds []string) []model.CDREventSMF { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventSMF{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMFImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_smf where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_smsc.go b/src/modules/network_data/repository/cdr_event_smsc.go index 403e0e40..7673e7bf 100644 --- a/src/modules/network_data/repository/cdr_event_smsc.go +++ b/src/modules/network_data/repository/cdr_event_smsc.go @@ -1,15 +1,181 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件SMSC 数据层接口 -type ICDREventSMSC interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMSCQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventSMSC +// 实例化数据层 CDREventSMSC 结构体 +var NewCDREventSMSC = &CDREventSMSC{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smsc`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventSMSC CDR会话事件 数据层处理 +type CDREventSMSC struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventSMSC) convertResultRows(rows []map[string]any) []model.CDREventSMSC { + arr := make([]model.CDREventSMSC, 0) + for _, row := range rows { + item := model.CDREventSMSC{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + // MySQL8支持的 + // if querys.RecordType != "" { + // recordTypes := strings.Split(querys.RecordType, ",") + // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) + // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) + // for _, recordType := range recordTypes { + // params = append(params, recordType) + // } + // } + // Mariadb不支持json in查询改or + if querys.RecordType != "" { + recordTypes := strings.Split(querys.RecordType, ",") + var queryStrArr []string + for _, recordType := range recordTypes { + queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, recordType) + } + conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventSMSC{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_smsc" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventSMSC) SelectByIds(cdrIds []string) []model.CDREventSMSC { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventSMSC{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMSC) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_smsc where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_smsc.impl.go b/src/modules/network_data/repository/cdr_event_smsc.impl.go deleted file mode 100644 index 82182313..00000000 --- a/src/modules/network_data/repository/cdr_event_smsc.impl.go +++ /dev/null @@ -1,181 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSMSCImpl 结构体 -var NewCDREventSMSCImpl = &CDREventSMSCImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smsc`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventSMSCImpl CDR会话事件 数据层处理 -type CDREventSMSCImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventSMSCImpl) convertResultRows(rows []map[string]any) []model.CDREventSMSC { - arr := make([]model.CDREventSMSC, 0) - for _, row := range rows { - item := model.CDREventSMSC{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventSMSCImpl) SelectPage(querys model.CDREventSMSCQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - // MySQL8支持的 - // if querys.RecordType != "" { - // recordTypes := strings.Split(querys.RecordType, ",") - // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) - // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) - // for _, recordType := range recordTypes { - // params = append(params, recordType) - // } - // } - // Mariadb不支持json in查询改or - if querys.RecordType != "" { - recordTypes := strings.Split(querys.RecordType, ",") - var queryStrArr []string - for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, recordType) - } - conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventSMSC{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smsc" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventSMSCImpl) SelectByIds(cdrIds []string) []model.CDREventSMSC { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventSMSC{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMSCImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_smsc where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/perf_kpi.go b/src/modules/network_data/repository/perf_kpi.go index 1a00957f..e757fe01 100644 --- a/src/modules/network_data/repository/perf_kpi.go +++ b/src/modules/network_data/repository/perf_kpi.go @@ -1,15 +1,131 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// 性能统计 数据层接口 -type IPerfKPI interface { - // SelectGoldKPI 通过网元指标数据信息 - SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) - // SelectGoldKPITitle 网元对应的指标名称 - SelectGoldKPITitle(neType string) []model.GoldKPITitle +// 实例化数据层 PerfKPI 结构体 +var NewPerfKPI = &PerfKPI{} - // SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 - SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any +// PerfKPI 性能统计 数据层处理 +type PerfKPI struct{} + +// SelectGoldKPI 通过网元指标数据信息 +func (r *PerfKPI) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + var tableName string = "kpi_report_" + if query.RmUID != "" { + conditions = append(conditions, "gk.rm_uid = ?") + params = append(params, query.RmUID) + } + if query.NeType != "" { + //conditions = append(conditions, "gk.ne_type = ?") + // params = append(params, query.NeType) + tableName += strings.ToLower(query.NeType) + } + if query.StartTime != "" { + conditions = append(conditions, "gk.created_at >= ?") + params = append(params, query.StartTime) + } + if query.EndTime != "" { + conditions = append(conditions, "gk.created_at <= ?") + params = append(params, query.EndTime) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询字段列 + var fields = []string{ + // fmt.Sprintf("FROM_UNIXTIME(FLOOR(gk.created_at / (%d * 1000)) * %d) AS timeGroup", query.Interval, query.Interval), + fmt.Sprintf("CONCAT(FLOOR(gk.created_at / (%d * 1000)) * (%d * 1000)) AS timeGroup", query.Interval, query.Interval), // 时间戳毫秒 + "min(CASE WHEN gk.index != '' THEN gk.index ELSE 0 END) AS startIndex", + "min(CASE WHEN gk.ne_type != '' THEN gk.ne_type ELSE 0 END) AS neType", + "min(CASE WHEN gk.ne_name != '' THEN gk.ne_name ELSE 0 END) AS neName", + } + for i, kid := range kpiIds { + // 特殊字段,只取最后一次收到的非0值 + if kid == "AMF.01" || kid == "UDM.01" || kid == "UDM.02" || kid == "UDM.03" || kid == "SMF.01" { + str := fmt.Sprintf("IFNULL(SUBSTRING_INDEX(GROUP_CONCAT( CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') END ), ',', 1), 0) AS '%s'", i, kid, i, kid) + fields = append(fields, str) + } else { + str := fmt.Sprintf("sum(CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') ELSE 0 END) AS '%s'", i, kid, i, kid) + fields = append(fields, str) + } + } + fieldsSql := strings.Join(fields, ",") + + // 查询数据 + if query.SortField == "" { + query.SortField = "timeGroup" + } + if query.SortOrder == "" { + query.SortOrder = "desc" + } + orderSql := fmt.Sprintf(" order by %s %s", query.SortField, query.SortOrder) + querySql := fmt.Sprintf("SELECT %s FROM %s gk %s GROUP BY timeGroup %s", fieldsSql, tableName, whereSql, orderSql) + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + return results +} + +// SelectGoldKPITitle 网元对应的指标名称 +func (r *PerfKPI) SelectGoldKPITitle(neType string) []model.GoldKPITitle { + result := []model.GoldKPITitle{} + tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result) + if err := tx.Error; err != nil { + logger.Errorf("Find err => %v", err) + } + return result +} + +// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 +func (r *PerfKPI) SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if neType != "" { + conditions = append(conditions, "kupf.ne_type = ?") + params = append(params, neType) + } + if rmUID != "" { + conditions = append(conditions, "kupf.rm_uid = ?") + params = append(params, rmUID) + } + if startDate != "" { + conditions = append(conditions, "kupf.created_at >= ?") + params = append(params, startDate) + } + if endDate != "" { + conditions = append(conditions, "kupf.created_at <= ?") + params = append(params, endDate) + } + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := `SELECT + sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[2].kpi_id') = 'UPF.03' THEN JSON_EXTRACT(kupf.kpi_values, '$[2].value') ELSE 0 END ) AS 'up', + sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[5].kpi_id') = 'UPF.06' THEN JSON_EXTRACT(kupf.kpi_values, '$[5].value') ELSE 0 END ) AS 'down' + FROM kpi_report_upf kupf` + results, err := datasource.RawDB("", querySql+whereSql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + return results[0] } diff --git a/src/modules/network_data/repository/perf_kpi.impl.go b/src/modules/network_data/repository/perf_kpi.impl.go deleted file mode 100644 index b7ac5bb8..00000000 --- a/src/modules/network_data/repository/perf_kpi.impl.go +++ /dev/null @@ -1,131 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 PerfKPIImpl 结构体 -var NewPerfKPIImpl = &PerfKPIImpl{} - -// PerfKPIImpl 性能统计 数据层处理 -type PerfKPIImpl struct{} - -// SelectGoldKPI 通过网元指标数据信息 -func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - var tableName string = "kpi_report_" - if query.RmUID != "" { - conditions = append(conditions, "gk.rm_uid = ?") - params = append(params, query.RmUID) - } - if query.NeType != "" { - //conditions = append(conditions, "gk.ne_type = ?") - // params = append(params, query.NeType) - tableName += strings.ToLower(query.NeType) - } - if query.StartTime != "" { - conditions = append(conditions, "gk.created_at >= ?") - params = append(params, query.StartTime) - } - if query.EndTime != "" { - conditions = append(conditions, "gk.created_at <= ?") - params = append(params, query.EndTime) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询字段列 - var fields = []string{ - // fmt.Sprintf("FROM_UNIXTIME(FLOOR(gk.created_at / (%d * 1000)) * %d) AS timeGroup", query.Interval, query.Interval), - fmt.Sprintf("CONCAT(FLOOR(gk.created_at / (%d * 1000)) * (%d * 1000)) AS timeGroup", query.Interval, query.Interval), // 时间戳毫秒 - "min(CASE WHEN gk.index != '' THEN gk.index ELSE 0 END) AS startIndex", - "min(CASE WHEN gk.ne_type != '' THEN gk.ne_type ELSE 0 END) AS neType", - "min(CASE WHEN gk.ne_name != '' THEN gk.ne_name ELSE 0 END) AS neName", - } - for i, kid := range kpiIds { - // 特殊字段,只取最后一次收到的非0值 - if kid == "AMF.01" || kid == "UDM.01" || kid == "UDM.02" || kid == "UDM.03" || kid == "SMF.01" { - str := fmt.Sprintf("IFNULL(SUBSTRING_INDEX(GROUP_CONCAT( CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') END ), ',', 1), 0) AS '%s'", i, kid, i, kid) - fields = append(fields, str) - } else { - str := fmt.Sprintf("sum(CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') ELSE 0 END) AS '%s'", i, kid, i, kid) - fields = append(fields, str) - } - } - fieldsSql := strings.Join(fields, ",") - - // 查询数据 - if query.SortField == "" { - query.SortField = "timeGroup" - } - if query.SortOrder == "" { - query.SortOrder = "desc" - } - orderSql := fmt.Sprintf(" order by %s %s", query.SortField, query.SortOrder) - querySql := fmt.Sprintf("SELECT %s FROM %s gk %s GROUP BY timeGroup %s", fieldsSql, tableName, whereSql, orderSql) - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results -} - -// SelectGoldKPITitle 网元对应的指标名称 -func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle { - result := []model.GoldKPITitle{} - tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result) - if err := tx.Error; err != nil { - logger.Errorf("Find err => %v", err) - } - return result -} - -// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 -func (r *PerfKPIImpl) SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if neType != "" { - conditions = append(conditions, "kupf.ne_type = ?") - params = append(params, neType) - } - if rmUID != "" { - conditions = append(conditions, "kupf.rm_uid = ?") - params = append(params, rmUID) - } - if startDate != "" { - conditions = append(conditions, "kupf.created_at >= ?") - params = append(params, startDate) - } - if endDate != "" { - conditions = append(conditions, "kupf.created_at <= ?") - params = append(params, endDate) - } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := `SELECT - sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[2].kpi_id') = 'UPF.03' THEN JSON_EXTRACT(kupf.kpi_values, '$[2].value') ELSE 0 END ) AS 'up', - sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[5].kpi_id') = 'UPF.06' THEN JSON_EXTRACT(kupf.kpi_values, '$[5].value') ELSE 0 END ) AS 'down' - FROM kpi_report_upf kupf` - results, err := datasource.RawDB("", querySql+whereSql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results[0] -} diff --git a/src/modules/network_data/repository/ue_event_amf.go b/src/modules/network_data/repository/ue_event_amf.go index 4e053a01..76442b8c 100644 --- a/src/modules/network_data/repository/ue_event_amf.go +++ b/src/modules/network_data/repository/ue_event_amf.go @@ -1,15 +1,175 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// UE会话事件AMF 数据层接口 -type IUEEventAMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventAMFQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ueIds []string) []model.UEEventAMF +// 实例化数据层 UEEventAMF 结构体 +var NewUEEventAMF = &UEEventAMF{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_amf`, - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "event_type": "EventType", + "event_json": "EventJSONStr", + "created_at": "CreatedAt", + }, +} + +// UEEventAMF UE会话事件 数据层处理 +type UEEventAMF struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *UEEventAMF) convertResultRows(rows []map[string]any) []model.UEEventAMF { + arr := make([]model.UEEventAMF, 0) + for _, row := range rows { + item := model.UEEventAMF{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *UEEventAMF) SelectPage(querys model.UEEventAMFQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.EventType != "" { + eventTypes := strings.Split(querys.EventType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + if querys.IMSI != "" { + conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") + params = append(params, querys.IMSI) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.UEEventAMF{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ue_event_amf" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *UEEventAMF) SelectByIds(ueIds []string) []model.UEEventAMF { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.UEEventAMF{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventAMF) DeleteByIds(ueIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + sql := "delete from ue_event_amf where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/ue_event_amf.impl.go b/src/modules/network_data/repository/ue_event_amf.impl.go deleted file mode 100644 index b442207c..00000000 --- a/src/modules/network_data/repository/ue_event_amf.impl.go +++ /dev/null @@ -1,175 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 UEEventAMFImpl 结构体 -var NewUEEventAMFImpl = &UEEventAMFImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_amf`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "event_type": "EventType", - "event_json": "EventJSONStr", - "created_at": "CreatedAt", - }, -} - -// UEEventAMFImpl UE会话事件 数据层处理 -type UEEventAMFImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *UEEventAMFImpl) convertResultRows(rows []map[string]any) []model.UEEventAMF { - arr := make([]model.UEEventAMF, 0) - for _, row := range rows { - item := model.UEEventAMF{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *UEEventAMFImpl) SelectPage(querys model.UEEventAMFQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.EventType != "" { - eventTypes := strings.Split(querys.EventType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - if querys.IMSI != "" { - conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") - params = append(params, querys.IMSI) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.UEEventAMF{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ue_event_amf" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *UEEventAMFImpl) SelectByIds(ueIds []string) []model.UEEventAMF { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.UEEventAMF{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventAMFImpl) DeleteByIds(ueIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - sql := "delete from ue_event_amf where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/ue_event_mme.go b/src/modules/network_data/repository/ue_event_mme.go index 7a77fb18..a035f5aa 100644 --- a/src/modules/network_data/repository/ue_event_mme.go +++ b/src/modules/network_data/repository/ue_event_mme.go @@ -1,15 +1,175 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// UE会话事件MME 数据层接口 -type IUEEventMME interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventMMEQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ueIds []string) []model.UEEventMME +// 实例化数据层 UEEventMME 结构体 +var NewUEEventMME = &UEEventMME{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_mme`, - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "event_type": "EventType", + "event_json": "EventJSONStr", + "created_at": "CreatedAt", + }, +} + +// UEEventMME UE会话事件 数据层处理 +type UEEventMME struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *UEEventMME) convertResultRows(rows []map[string]any) []model.UEEventMME { + arr := make([]model.UEEventMME, 0) + for _, row := range rows { + item := model.UEEventMME{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *UEEventMME) SelectPage(querys model.UEEventMMEQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.EventType != "" { + eventTypes := strings.Split(querys.EventType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + if querys.IMSI != "" { + conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") + params = append(params, querys.IMSI) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.UEEventMME{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ue_event_mme" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *UEEventMME) SelectByIds(ueIds []string) []model.UEEventMME { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.UEEventMME{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventMME) DeleteByIds(ueIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + sql := "delete from ue_event_mme where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/ue_event_mme.impl.go b/src/modules/network_data/repository/ue_event_mme.impl.go deleted file mode 100644 index 180bc9df..00000000 --- a/src/modules/network_data/repository/ue_event_mme.impl.go +++ /dev/null @@ -1,175 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 UEEventMMEImpl 结构体 -var NewUEEventMMEImpl = &UEEventMMEImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_mme`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "event_type": "EventType", - "event_json": "EventJSONStr", - "created_at": "CreatedAt", - }, -} - -// UEEventMMEImpl UE会话事件 数据层处理 -type UEEventMMEImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *UEEventMMEImpl) convertResultRows(rows []map[string]any) []model.UEEventMME { - arr := make([]model.UEEventMME, 0) - for _, row := range rows { - item := model.UEEventMME{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *UEEventMMEImpl) SelectPage(querys model.UEEventMMEQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.EventType != "" { - eventTypes := strings.Split(querys.EventType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - if querys.IMSI != "" { - conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") - params = append(params, querys.IMSI) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.UEEventMME{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ue_event_mme" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *UEEventMMEImpl) SelectByIds(ueIds []string) []model.UEEventMME { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.UEEventMME{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventMMEImpl) DeleteByIds(ueIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - sql := "delete from ue_event_mme where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/service/alarm.go b/src/modules/network_data/service/alarm.go index 3c466ee4..3df04ead 100644 --- a/src/modules/network_data/service/alarm.go +++ b/src/modules/network_data/service/alarm.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// 告警 服务层接口 -type IAlarm interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.AlarmQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) +// 实例化数据层 Alarm 结构体 +var NewAlarm = &Alarm{ + alarmRepository: repository.NewAlarm, +} + +// Alarm 告警 服务层处理 +type Alarm struct { + alarmRepository *repository.Alarm // 告警数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *Alarm) SelectPage(querys model.AlarmQuery) map[string]any { + return r.alarmRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *Alarm) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.alarmRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(data) == len(ids) { + rows := r.alarmRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/alarm.impl.go b/src/modules/network_data/service/alarm.impl.go deleted file mode 100644 index e988ed13..00000000 --- a/src/modules/network_data/service/alarm.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 AlarmImpl 结构体 -var NewAlarmImpl = &AlarmImpl{ - alarmRepository: repository.NewAlarmImpl, -} - -// AlarmImpl 告警 服务层处理 -type AlarmImpl struct { - // 告警数据信息 - alarmRepository repository.IAlarm -} - -// SelectPage 根据条件分页查询 -func (r *AlarmImpl) SelectPage(querys model.AlarmQuery) map[string]any { - return r.alarmRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *AlarmImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.alarmRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(data) == len(ids) { - rows := r.alarmRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_ims.go b/src/modules/network_data/service/cdr_event_ims.go index 2f5be53e..922fb024 100644 --- a/src/modules/network_data/service/cdr_event_ims.go +++ b/src/modules/network_data/service/cdr_event_ims.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件IMS 服务层接口 -type ICDREventIMS interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventIMSQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventIMS 结构体 +var NewCDREventIMS = &CDREventIMS{ + cdrEventIMSRepository: repository.NewCDREventIMS, +} + +// CDREventImpl CDR会话事件IMS 服务层处理 +type CDREventIMS struct { + cdrEventIMSRepository *repository.CDREventIMS // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { + return r.cdrEventIMSRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventIMS) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventIMSRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventIMSRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_ims.impl.go b/src/modules/network_data/service/cdr_event_ims.impl.go deleted file mode 100644 index 15dfbd81..00000000 --- a/src/modules/network_data/service/cdr_event_ims.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 NewCDREventIMSImpl 结构体 -var NewCDREventIMSImpl = &CDREventIMSImpl{ - cdrEventIMSRepository: repository.NewCDREventIMSImpl, -} - -// CDREventImpl CDR会话事件IMS 服务层处理 -type CDREventIMSImpl struct { - // CDR会话事件数据信息 - cdrEventIMSRepository repository.ICDREventIMS -} - -// SelectPage 根据条件分页查询 -func (r *CDREventIMSImpl) SelectPage(querys model.CDREventIMSQuery) map[string]any { - return r.cdrEventIMSRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventIMSImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventIMSRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventIMSRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_smf.go b/src/modules/network_data/service/cdr_event_smf.go index 1e55a690..abd30a85 100644 --- a/src/modules/network_data/service/cdr_event_smf.go +++ b/src/modules/network_data/service/cdr_event_smf.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件SMF 服务层接口 -type ICDREventSMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMFQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventSMF 结构体 +var NewCDREventSMF = &CDREventSMF{ + cdrEventRepository: repository.NewCDREventSMF, +} + +// CDREventSMF CDR会话事件SMF 服务层处理 +type CDREventSMF struct { + cdrEventRepository *repository.CDREventSMF // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { + return r.cdrEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMF) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_smf.impl.go b/src/modules/network_data/service/cdr_event_smf.impl.go deleted file mode 100644 index 09d2e48a..00000000 --- a/src/modules/network_data/service/cdr_event_smf.impl.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -var NewCDREventSMFImpl = &CDREventSMFImpl{ - cdrEventRepository: repository.NewCDREventSMFImpl, -} - -type CDREventSMFImpl struct { - // CDR会话事件数据信息 - cdrEventRepository repository.ICDREventSMF -} - -func (r *CDREventSMFImpl) SelectPage(querys model.CDREventSMFQuery) map[string]any { - return r.cdrEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMFImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_smsc.go b/src/modules/network_data/service/cdr_event_smsc.go index 472ffea7..39448874 100644 --- a/src/modules/network_data/service/cdr_event_smsc.go +++ b/src/modules/network_data/service/cdr_event_smsc.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件SMSC 服务层接口 -type ICDREventSMSC interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMSCQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventSMSC 结构体 +var NewCDREventSMSC = &CDREventSMSC{ + cdrEventRepository: repository.NewCDREventSMSC, +} + +// CDREventSMSC CDR会话事件SMSC 服务层处理 +type CDREventSMSC struct { + cdrEventRepository *repository.CDREventSMSC // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any { + return r.cdrEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMSC) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_smsc.impl.go b/src/modules/network_data/service/cdr_event_smsc.impl.go deleted file mode 100644 index b2d27f3d..00000000 --- a/src/modules/network_data/service/cdr_event_smsc.impl.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -var NewCDREventSMSCImpl = &CDREventSMSCImpl{ - cdrEventRepository: repository.NewCDREventSMSCImpl, -} - -type CDREventSMSCImpl struct { - // CDR会话事件数据信息 - cdrEventRepository repository.ICDREventSMSC -} - -func (r *CDREventSMSCImpl) SelectPage(querys model.CDREventSMSCQuery) map[string]any { - return r.cdrEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMSCImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/perf_kpi.go b/src/modules/network_data/service/perf_kpi.go index fcd7d768..b4aef0c4 100644 --- a/src/modules/network_data/service/perf_kpi.go +++ b/src/modules/network_data/service/perf_kpi.go @@ -1,15 +1,79 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "encoding/json" + "fmt" + "time" -// 性能统计 服务层接口 -type IPerfKPI interface { - // SelectGoldKPI 通过网元指标数据信息 - SelectGoldKPI(query model.GoldKPIQuery) []map[string]any + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // SelectGoldKPITitle 网元对应的指标名称 - SelectGoldKPITitle(neType string) []model.GoldKPITitle - - // SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 - SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any +// 实例化数据层 PerfKPI 结构体 +var NewPerfKPI = &PerfKPI{ + perfKPIRepository: repository.NewPerfKPI, +} + +// PerfKPI 性能统计 服务层处理 +type PerfKPI struct { + perfKPIRepository *repository.PerfKPI // 性能统计数据信息 +} + +// SelectGoldKPI 通过网元指标数据信息 +func (r *PerfKPI) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any { + // 获取数据指标id + var kpiIds []string + kpiTitles := r.perfKPIRepository.SelectGoldKPITitle(query.NeType) + for _, kpiId := range kpiTitles { + kpiIds = append(kpiIds, kpiId.KPIID) + } + + data := r.perfKPIRepository.SelectGoldKPI(query, kpiIds) + if data == nil { + return []map[string]any{} + } + return data +} + +// SelectGoldKPITitle 网元对应的指标名称 +func (r *PerfKPI) SelectGoldKPITitle(neType string) []model.GoldKPITitle { + return r.perfKPIRepository.SelectGoldKPITitle(neType) +} + +// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 +func (r *PerfKPI) SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any { + now := time.Now() + // 获取当前日期 + endDate := fmt.Sprint(now.UnixMilli()) + // 将当前日期前几天数 + startDate := fmt.Sprint(now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()) + + var info map[string]any + + // 读取缓存数据 小于2分钟重新缓存 + key := fmt.Sprintf("%sUPF:totalFlow:%s_%d", cachekey.NE_DATA_KEY, rmUID, day) + infoStr, _ := redis.Get("", key) + if infoStr != "" { + json.Unmarshal([]byte(infoStr), &info) + expireSecond, _ := redis.GetExpire("", key) + if expireSecond > 120 { + return info + } + } + // down * 8 / 1000 / 1000 单位M + info = r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) + if v, ok := info["up"]; ok && v == nil { + info["up"] = 0 + } + if v, ok := info["down"]; ok && v == nil { + info["down"] = 0 + } + + // 保存到缓存 + infoJSON, _ := json.Marshal(info) + redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute) + + return info } diff --git a/src/modules/network_data/service/perf_kpi.impl.go b/src/modules/network_data/service/perf_kpi.impl.go deleted file mode 100644 index f34f5508..00000000 --- a/src/modules/network_data/service/perf_kpi.impl.go +++ /dev/null @@ -1,80 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "time" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/redis" - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 PerfKPIImpl 结构体 -var NewPerfKPIImpl = &PerfKPIImpl{ - perfKPIRepository: repository.NewPerfKPIImpl, -} - -// PerfKPIImpl 性能统计 服务层处理 -type PerfKPIImpl struct { - // 性能统计数据信息 - perfKPIRepository repository.IPerfKPI -} - -// SelectGoldKPI 通过网元指标数据信息 -func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any { - // 获取数据指标id - var kpiIds []string - kpiTitles := r.perfKPIRepository.SelectGoldKPITitle(query.NeType) - for _, kpiId := range kpiTitles { - kpiIds = append(kpiIds, kpiId.KPIID) - } - - data := r.perfKPIRepository.SelectGoldKPI(query, kpiIds) - if data == nil { - return []map[string]any{} - } - return data -} - -// SelectGoldKPITitle 网元对应的指标名称 -func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle { - return r.perfKPIRepository.SelectGoldKPITitle(neType) -} - -// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 -func (r *PerfKPIImpl) SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any { - now := time.Now() - // 获取当前日期 - endDate := fmt.Sprint(now.UnixMilli()) - // 将当前日期前几天数 - startDate := fmt.Sprint(now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()) - - var info map[string]any - - // 读取缓存数据 小于2分钟重新缓存 - key := fmt.Sprintf("%sUPF:totalFlow:%s_%d", cachekey.NE_DATA_KEY, rmUID, day) - infoStr, _ := redis.Get("", key) - if infoStr != "" { - json.Unmarshal([]byte(infoStr), &info) - expireSecond, _ := redis.GetExpire("", key) - if expireSecond > 120 { - return info - } - } - // down * 8 / 1000 / 1000 单位M - info = r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) - if v, ok := info["up"]; ok && v == nil { - info["up"] = 0 - } - if v, ok := info["down"]; ok && v == nil { - info["down"] = 0 - } - - // 保存到缓存 - infoJSON, _ := json.Marshal(info) - redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute) - - return info -} diff --git a/src/modules/network_data/service/ue_event_amf.go b/src/modules/network_data/service/ue_event_amf.go index e5f77a63..29fdec2d 100644 --- a/src/modules/network_data/service/ue_event_amf.go +++ b/src/modules/network_data/service/ue_event_amf.go @@ -1,12 +1,40 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// UE会话事件AMF 服务层接口 -type IUEEventAMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventAMFQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) (int64, error) +// 实例化数据层 UEEventAMF 结构体 +var NewUEEventAMF = &UEEventAMF{ + ueEventRepository: repository.NewUEEventAMF, +} + +// UEEventAMF UE会话事件AMF 服务层处理 +type UEEventAMF struct { + // UE会话事件数据信息 + ueEventRepository *repository.UEEventAMF +} + +// SelectPage 根据条件分页查询 +func (r *UEEventAMF) SelectPage(querys model.UEEventAMFQuery) map[string]any { + return r.ueEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventAMF) DeleteByIds(ueIds []string) (int64, error) { + // 检查是否存在 + ids := r.ueEventRepository.SelectByIds(ueIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(ids) == len(ueIds) { + rows := r.ueEventRepository.DeleteByIds(ueIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/ue_event_amf.impl.go b/src/modules/network_data/service/ue_event_amf.impl.go deleted file mode 100644 index 8d5f61c9..00000000 --- a/src/modules/network_data/service/ue_event_amf.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 UEEventMMEImpl 结构体 -var NewUEEventMMEImpl = &UEEventMMEImpl{ - ueEventRepository: repository.NewUEEventMMEImpl, -} - -// UEEventMMEImpl UE会话事件MME 服务层处理 -type UEEventMMEImpl struct { - // UE会话事件数据信息 - ueEventRepository repository.IUEEventMME -} - -// SelectPage 根据条件分页查询 -func (r *UEEventMMEImpl) SelectPage(querys model.UEEventMMEQuery) map[string]any { - return r.ueEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventMMEImpl) DeleteByIds(ueIds []string) (int64, error) { - // 检查是否存在 - ids := r.ueEventRepository.SelectByIds(ueIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(ids) == len(ueIds) { - rows := r.ueEventRepository.DeleteByIds(ueIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/ue_event_mme.go b/src/modules/network_data/service/ue_event_mme.go index d4b5dd86..dd034b25 100644 --- a/src/modules/network_data/service/ue_event_mme.go +++ b/src/modules/network_data/service/ue_event_mme.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// UE会话事件MME 服务层接口 -type IUEEventMME interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventMMEQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) (int64, error) +// 实例化数据层 UEEventMME 结构体 +var NewUEEventMME = &UEEventMME{ + ueEventRepository: repository.NewUEEventMME, +} + +// UEEventMME UE会话事件MME 服务层处理 +type UEEventMME struct { + ueEventRepository *repository.UEEventMME // UE会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *UEEventMME) SelectPage(querys model.UEEventMMEQuery) map[string]any { + return r.ueEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventMME) DeleteByIds(ueIds []string) (int64, error) { + // 检查是否存在 + ids := r.ueEventRepository.SelectByIds(ueIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(ids) == len(ueIds) { + rows := r.ueEventRepository.DeleteByIds(ueIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/ue_event_mme.impl.go b/src/modules/network_data/service/ue_event_mme.impl.go deleted file mode 100644 index 9c7e0710..00000000 --- a/src/modules/network_data/service/ue_event_mme.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 UEEventAMFImpl 结构体 -var NewUEEventAMFImpl = &UEEventAMFImpl{ - ueEventRepository: repository.NewUEEventAMFImpl, -} - -// UEEventAMFImpl UE会话事件AMF 服务层处理 -type UEEventAMFImpl struct { - // UE会话事件数据信息 - ueEventRepository repository.IUEEventAMF -} - -// SelectPage 根据条件分页查询 -func (r *UEEventAMFImpl) SelectPage(querys model.UEEventAMFQuery) map[string]any { - return r.ueEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventAMFImpl) DeleteByIds(ueIds []string) (int64, error) { - // 检查是否存在 - ids := r.ueEventRepository.SelectByIds(ueIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(ids) == len(ueIds) { - rows := r.ueEventRepository.DeleteByIds(ueIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_element/controller/action.go b/src/modules/network_element/controller/action.go index 0d121b7d..7d6ebc6f 100644 --- a/src/modules/network_element/controller/action.go +++ b/src/modules/network_element/controller/action.go @@ -20,7 +20,7 @@ import ( // 实例化控制层 NeActionController 结构体 var NewNeAction = &NeActionController{ - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // 网元处理请求 @@ -28,7 +28,7 @@ var NewNeAction = &NeActionController{ // PATH /action type NeActionController struct { // 网元信息服务 - neInfoService neService.INeInfo + neInfoService *neService.NeInfo } // 发送文件从本地到网元 diff --git a/src/modules/network_element/controller/ne_config.go b/src/modules/network_element/controller/ne_config.go index e1d737bb..c6c25be6 100644 --- a/src/modules/network_element/controller/ne_config.go +++ b/src/modules/network_element/controller/ne_config.go @@ -18,18 +18,16 @@ import ( // NewNeConfig 网元参数配置 实例化控制层 var NewNeConfig = &NeConfigController{ - neConfigService: neService.NewNeConfigImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigService: neService.NewNeConfig, + neInfoService: neService.NewNeInfo, } // 网元参数配置 // // PATH /config type NeConfigController struct { - // 网元参数配置可用属性值服务 - neConfigService neService.INeConfig - // 网元信息服务 - neInfoService neService.INeInfo + neConfigService *neService.NeConfig // 网元参数配置可用属性值服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元参数配置可用属性值列表 diff --git a/src/modules/network_element/controller/ne_config_backup.go b/src/modules/network_element/controller/ne_config_backup.go index 1ba1870c..90937dc3 100644 --- a/src/modules/network_element/controller/ne_config_backup.go +++ b/src/modules/network_element/controller/ne_config_backup.go @@ -18,18 +18,16 @@ import ( // NewNeConfigBackup 实例化控制层 NeConfigBackupController 结构体 var NewNeConfigBackup = &NeConfigBackupController{ - neConfigBackupService: neService.NewNeConfigBackupImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigBackupService: neService.NewNeConfigBackup, + neInfoService: neService.NewNeInfo, } // 网元配置文件备份记录 // // PATH /config/backup type NeConfigBackupController struct { - // 网元配置文件备份记录服务 - neConfigBackupService neService.INeConfigBackup - // 网元信息服务 - neInfoService neService.INeInfo + neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元配置文件备份记录列表 diff --git a/src/modules/network_element/controller/ne_host.go b/src/modules/network_element/controller/ne_host.go index 7f8b9cdc..3b9c1871 100644 --- a/src/modules/network_element/controller/ne_host.go +++ b/src/modules/network_element/controller/ne_host.go @@ -17,15 +17,14 @@ import ( // 实例化控制层 NeHostController 结构体 var NewNeHost = &NeHostController{ - neHostService: neService.NewNeHostImpl, + neHostService: neService.NewNeHost, } // 网元主机连接请求 // // PATH /host type NeHostController struct { - // 网元主机连接服务 - neHostService neService.INeHost + neHostService *neService.NeHost // 网元主机连接服务 } // 网元主机列表 diff --git a/src/modules/network_element/controller/ne_host_cmd.go b/src/modules/network_element/controller/ne_host_cmd.go index f817a59a..31031da5 100644 --- a/src/modules/network_element/controller/ne_host_cmd.go +++ b/src/modules/network_element/controller/ne_host_cmd.go @@ -15,15 +15,14 @@ import ( // 实例化控制层 NeHostCmdController 结构体 var NewNeHostCmd = &NeHostCmdController{ - neHostCmdService: neService.NewNeHostCmdImpl, + neHostCmdService: neService.NewNeHostCmd, } // 网元主机命令请求 // // PATH /hostCmd type NeHostCmdController struct { - // 网元主机命令服务 - neHostCmdService neService.INeHostCmd + neHostCmdService *neService.NeHostCmd // 网元主机命令服务 } // 网元主机命令列表 diff --git a/src/modules/network_element/controller/ne_info.go b/src/modules/network_element/controller/ne_info.go index 001b778a..c2ce7ab3 100644 --- a/src/modules/network_element/controller/ne_info.go +++ b/src/modules/network_element/controller/ne_info.go @@ -18,8 +18,8 @@ import ( // 实例化控制层 NeInfoController 结构体 var NewNeInfo = &NeInfoController{ - neInfoService: neService.NewNeInfoImpl, - neLicenseService: neService.NewNeLicenseImpl, + neInfoService: neService.NewNeInfo, + neLicenseService: neService.NewNeLicense, neVersionService: neService.NewNeVersion, } @@ -27,12 +27,9 @@ var NewNeInfo = &NeInfoController{ // // PATH /info type NeInfoController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 网元授权激活信息服务 - neLicenseService neService.INeLicense - // 网元版本信息服务 - neVersionService *neService.NeVersion + neInfoService *neService.NeInfo // 网元信息服务 + neLicenseService *neService.NeLicense // 网元授权激活信息服务 + neVersionService *neService.NeVersion // 网元版本信息服务 } // neStateCacheMap 网元状态缓存最后一次成功的信息 diff --git a/src/modules/network_element/controller/ne_license.go b/src/modules/network_element/controller/ne_license.go index 3b4dd4ce..4ddf1ed5 100644 --- a/src/modules/network_element/controller/ne_license.go +++ b/src/modules/network_element/controller/ne_license.go @@ -15,18 +15,16 @@ import ( // 实例化控制层 NeLicenseController 结构体 var NewNeLicense = &NeLicenseController{ - neLicenseService: neService.NewNeLicenseImpl, - neInfoService: neService.NewNeInfoImpl, + neLicenseService: neService.NewNeLicense, + neInfoService: neService.NewNeInfo, } // 网元授权激活请求 // // PATH /license type NeLicenseController struct { - // 网元授权激活服务 - neLicenseService neService.INeLicense - // 网元信息服务 - neInfoService neService.INeInfo + neLicenseService *neService.NeLicense // 网元授权激活服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元授权激活列表 diff --git a/src/modules/network_element/controller/ne_software.go b/src/modules/network_element/controller/ne_software.go index fb15beb8..25c05803 100644 --- a/src/modules/network_element/controller/ne_software.go +++ b/src/modules/network_element/controller/ne_software.go @@ -15,15 +15,14 @@ import ( // 实例化控制层 NeSoftwareController 结构体 var NewNeSoftware = &NeSoftwareController{ - neSoftwareService: neService.NewNeSoftwareImpl, + neSoftwareService: neService.NewNeSoftware, } // 网元软件包请求 // // PATH /software type NeSoftwareController struct { - // 网元软件包服务 - neSoftwareService neService.INeSoftware + neSoftwareService *neService.NeSoftware // 网元软件包服务 } // 网元软件包列表 diff --git a/src/modules/network_element/controller/ne_version.go b/src/modules/network_element/controller/ne_version.go index 366e30c2..366c9891 100644 --- a/src/modules/network_element/controller/ne_version.go +++ b/src/modules/network_element/controller/ne_version.go @@ -18,8 +18,7 @@ var NewNeVersion = &NeVersionController{ // // PATH /version type NeVersionController struct { - // 网元版本服务 - neVersionService *neService.NeVersion + neVersionService *neService.NeVersion // 网元版本服务 } // 网元版本列表 diff --git a/src/modules/network_element/network_element.go b/src/modules/network_element/network_element.go index 89cd4624..8dc59a6d 100644 --- a/src/modules/network_element/network_element.go +++ b/src/modules/network_element/network_element.go @@ -351,13 +351,13 @@ func Setup(router *gin.Engine) { // InitLoad 初始参数 func InitLoad() { // 启动时,清除缓存-网元类型 - service.NewNeInfoImpl.ClearNeCacheByNeType("*") - service.NewNeInfoImpl.SelectNeInfoByRmuid("") + service.NewNeInfo.ClearNeCacheByNeType("*") + service.NewNeInfo.SelectNeInfoByRmuid("") // 启动时,网元公共参数数据记录到全局变量 - if para5GMap, err := service.NewNeInfoImpl.NeConfPara5GRead(); para5GMap != nil && err == nil { - service.NewNeInfoImpl.NeConfPara5GWirte(para5GMap, nil) + if para5GMap, err := service.NewNeInfo.NeConfPara5GRead(); para5GMap != nil && err == nil { + service.NewNeInfo.NeConfPara5GWirte(para5GMap, nil) } // 启动时,清除缓存-网元参数配置可用属性值 - service.NewNeConfigImpl.ClearNeCacheByNeType("*") - service.NewNeConfigImpl.RefreshByNeTypeAndNeID("*") + service.NewNeConfig.ClearNeCacheByNeType("*") + service.NewNeConfig.RefreshByNeTypeAndNeID("*") } diff --git a/src/modules/network_element/repository/ne_config.go b/src/modules/network_element/repository/ne_config.go index 5f555b3e..29ea68f5 100644 --- a/src/modules/network_element/repository/ne_config.go +++ b/src/modules/network_element/repository/ne_config.go @@ -1,24 +1,259 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "strings" + "time" -// INeConfig 网元参数配置可用属性值 数据层接口 -type INeConfig interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(param model.NeConfig) []model.NeConfig +// 实例化数据层 NeConfig 结构体 +var NewNeConfig = &NeConfig{ + selectSql: `select id, ne_type, param_name, param_display, param_type, param_json, param_sort, param_perms, update_time from ne_config`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeConfig - - // Insert 新增信息 - Insert(param model.NeConfig) string - - // Update 修改信息 - Update(param model.NeConfig) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "param_name": "ParamName", + "param_display": "ParamDisplay", + "param_type": "ParamType", + "param_json": "ParamJson", + "param_sort": "ParamSort", + "param_perms": "ParamPerms", + "update_time": "UpdateTime", + }, +} + +// NeConfig 网元参数配置可用属性值 数据层处理 +type NeConfig struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeConfig) convertResultRows(rows []map[string]any) []model.NeConfig { + arr := make([]model.NeConfig, 0) + for _, row := range rows { + item := model.NeConfig{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeConfig) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, v) + } + if v, ok := query["paramName"]; ok && v != "" { + conditions = append(conditions, "param_name = ?") + params = append(params, v) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(id) as 'total' from ne_config" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { + // 查询条件拼接 + var conditions []string + var params []any + if param.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, param.NeType) + } + if param.ParamName != "" { + conditions = append(conditions, "param_name = ?") + params = append(params, param.ParamName) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by param_sort asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeConfig) SelectByIds(ids []string) []model.NeConfig { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeConfig{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeConfig) Insert(param model.NeConfig) string { + // 参数拼接 + params := make(map[string]any) + if param.NeType != "" { + params["ne_type"] = param.NeType + } + if param.ParamName != "" { + params["param_name"] = param.ParamName + } + if param.ParamDisplay != "" { + params["param_display"] = param.ParamDisplay + } + if param.ParamType != "" { + params["param_type"] = param.ParamType + } + if param.ParamJson != "" { + params["param_json"] = param.ParamJson + } + params["param_sort"] = param.ParamSort + if param.ParamPerms != "" { + params["param_perms"] = param.ParamPerms + } + params["update_time"] = time.Now().UnixMilli() + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_config (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeConfig) Update(param model.NeConfig) int64 { + // 参数拼接 + params := make(map[string]any) + if param.NeType != "" { + params["ne_type"] = param.NeType + } + if param.ParamName != "" { + params["param_name"] = param.ParamName + } + if param.ParamDisplay != "" { + params["param_display"] = param.ParamDisplay + } + if param.ParamType != "" { + params["param_type"] = param.ParamType + } + if param.ParamJson != "" { + params["param_json"] = param.ParamJson + } + params["param_sort"] = param.ParamSort + if param.ParamPerms != "" { + params["param_perms"] = param.ParamPerms + } + params["update_time"] = time.Now().UnixMilli() + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_config set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, param.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeConfig) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from ne_config where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_config.impl.go b/src/modules/network_element/repository/ne_config.impl.go deleted file mode 100644 index d7a845ef..00000000 --- a/src/modules/network_element/repository/ne_config.impl.go +++ /dev/null @@ -1,259 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// NewNeConfigImpl 网元参数配置可用属性值 实例化数据层 -var NewNeConfigImpl = &NeConfigImpl{ - selectSql: `select id, ne_type, param_name, param_display, param_type, param_json, param_sort, param_perms, update_time from ne_config`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "param_name": "ParamName", - "param_display": "ParamDisplay", - "param_type": "ParamType", - "param_json": "ParamJson", - "param_sort": "ParamSort", - "param_perms": "ParamPerms", - "update_time": "UpdateTime", - }, -} - -// NeConfigImpl 网元参数配置可用属性值 数据层处理 -type NeConfigImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeConfigImpl) convertResultRows(rows []map[string]any) []model.NeConfig { - arr := make([]model.NeConfig, 0) - for _, row := range rows { - item := model.NeConfig{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeConfigImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, v) - } - if v, ok := query["paramName"]; ok && v != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(id) as 'total' from ne_config" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeConfigImpl) SelectList(param model.NeConfig) []model.NeConfig { - // 查询条件拼接 - var conditions []string - var params []any - if param.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, param.NeType) - } - if param.ParamName != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, param.ParamName) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by param_sort asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigImpl) SelectByIds(ids []string) []model.NeConfig { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeConfig{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeConfigImpl) Insert(param model.NeConfig) string { - // 参数拼接 - params := make(map[string]any) - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJson != "" { - params["param_json"] = param.ParamJson - } - params["param_sort"] = param.ParamSort - if param.ParamPerms != "" { - params["param_perms"] = param.ParamPerms - } - params["update_time"] = time.Now().UnixMilli() - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_config (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeConfigImpl) Update(param model.NeConfig) int64 { - // 参数拼接 - params := make(map[string]any) - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJson != "" { - params["param_json"] = param.ParamJson - } - params["param_sort"] = param.ParamSort - if param.ParamPerms != "" { - params["param_perms"] = param.ParamPerms - } - params["update_time"] = time.Now().UnixMilli() - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_config set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, param.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from ne_config where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_config_backup.go b/src/modules/network_element/repository/ne_config_backup.go index 131f363d..3354034d 100644 --- a/src/modules/network_element/repository/ne_config_backup.go +++ b/src/modules/network_element/repository/ne_config_backup.go @@ -1,24 +1,262 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "strings" + "time" -// INeConfigBackup 网元配置文件备份记录 数据层接口 -type INeConfigBackup interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(item model.NeConfigBackup) []model.NeConfigBackup +// 实例化数据层 NeConfigBackup 结构体 +var NewNeConfigBackup = &NeConfigBackup{ + selectSql: `select + id, ne_type, ne_id, name, path, remark, create_by, create_time, update_by, update_time + from ne_config_backup`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeConfigBackup - - // Insert 新增信息 - Insert(item model.NeConfigBackup) string - - // Update 修改信息 - Update(item model.NeConfigBackup) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "name": "Name", + "path": "Path", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeConfigBackup 网元配置文件备份记录 数据层处理 +type NeConfigBackup struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeConfigBackup) convertResultRows(rows []map[string]any) []model.NeConfigBackup { + arr := make([]model.NeConfigBackup, 0) + for _, row := range rows { + item := model.NeConfigBackup{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["name"]; ok && v != "" { + conditions = append(conditions, "name like concat(concat('%', ?), '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_config_backup" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " order by id desc limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { + // 查询条件拼接 + var conditions []string + var params []any + if item.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, item.NeType) + } + if item.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, item.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeConfigBackup) SelectByIds(cmdIds []string) []model.NeConfigBackup { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeConfigBackup{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeConfigBackup) Insert(item model.NeConfigBackup) string { + // 参数拼接 + params := make(map[string]any) + if item.NeType != "" { + params["ne_type"] = item.NeType + } + if item.NeId != "" { + params["ne_id"] = item.NeId + } + if item.Name != "" { + params["name"] = item.Name + } + if item.Path != "" { + params["path"] = item.Path + } + if item.Remark != "" { + params["remark"] = item.Remark + } + if item.CreateBy != "" { + params["create_by"] = item.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_config_backup (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeConfigBackup) Update(item model.NeConfigBackup) int64 { + // 参数拼接 + params := make(map[string]any) + if item.NeType != "" { + params["ne_type"] = item.NeType + } + if item.NeId != "" { + params["ne_id"] = item.NeId + } + if item.Name != "" { + params["name"] = item.Name + } + if item.Path != "" { + params["path"] = item.Path + } + params["remark"] = item.Remark + if item.UpdateBy != "" { + params["update_by"] = item.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_config_backup set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, item.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeConfigBackup) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from ne_config_backup where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_config_backup.impl.go b/src/modules/network_element/repository/ne_config_backup.impl.go deleted file mode 100644 index 17331822..00000000 --- a/src/modules/network_element/repository/ne_config_backup.impl.go +++ /dev/null @@ -1,262 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeConfigBackupImpl 结构体 -var NewNeConfigBackupImpl = &NeConfigBackupImpl{ - selectSql: `select - id, ne_type, ne_id, name, path, remark, create_by, create_time, update_by, update_time - from ne_config_backup`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "name": "Name", - "path": "Path", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeConfigBackupImpl 网元配置文件备份记录 数据层处理 -type NeConfigBackupImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeConfigBackupImpl) convertResultRows(rows []map[string]any) []model.NeConfigBackup { - arr := make([]model.NeConfigBackup, 0) - for _, row := range rows { - item := model.NeConfigBackup{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeConfigBackupImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["name"]; ok && v != "" { - conditions = append(conditions, "name like concat(concat('%', ?), '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_config_backup" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeConfigBackupImpl) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { - // 查询条件拼接 - var conditions []string - var params []any - if item.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, item.NeType) - } - if item.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, item.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigBackupImpl) SelectByIds(cmdIds []string) []model.NeConfigBackup { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeConfigBackup{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeConfigBackupImpl) Insert(item model.NeConfigBackup) string { - // 参数拼接 - params := make(map[string]any) - if item.NeType != "" { - params["ne_type"] = item.NeType - } - if item.NeId != "" { - params["ne_id"] = item.NeId - } - if item.Name != "" { - params["name"] = item.Name - } - if item.Path != "" { - params["path"] = item.Path - } - if item.Remark != "" { - params["remark"] = item.Remark - } - if item.CreateBy != "" { - params["create_by"] = item.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_config_backup (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeConfigBackupImpl) Update(item model.NeConfigBackup) int64 { - // 参数拼接 - params := make(map[string]any) - if item.NeType != "" { - params["ne_type"] = item.NeType - } - if item.NeId != "" { - params["ne_id"] = item.NeId - } - if item.Name != "" { - params["name"] = item.Name - } - if item.Path != "" { - params["path"] = item.Path - } - params["remark"] = item.Remark - if item.UpdateBy != "" { - params["update_by"] = item.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_config_backup set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, item.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigBackupImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from ne_config_backup where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_host.go b/src/modules/network_element/repository/ne_host.go index a61fb968..ca957179 100644 --- a/src/modules/network_element/repository/ne_host.go +++ b/src/modules/network_element/repository/ne_host.go @@ -1,27 +1,376 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeHost 网元主机连接 数据层接口 -type INeHost interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neHost model.NeHost) []model.NeHost +// 实例化数据层 NeHost 结构体 +var NewNeHost = &NeHost{ + selectSql: `select + host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, remark, create_by, create_time, update_by, update_time + from ne_host`, - // SelectByIds 通过ID查询 - SelectByIds(hostIds []string) []model.NeHost - - // Insert 新增信息 - Insert(neHost model.NeHost) string - - // Update 修改信息 - Update(neHost model.NeHost) int64 - - // DeleteByIds 批量删除网元主机连接信息 - DeleteByIds(hostIds []string) int64 - - // CheckUniqueNeHost 校验主机是否唯一 - CheckUniqueNeHost(neHost model.NeHost) string + resultMap: map[string]string{ + "host_id": "HostID", + "host_type": "HostType", + "group_id": "GroupID", + "title": "Title", + "addr": "Addr", + "port": "Port", + "user": "User", + "auth_mode": "AuthMode", + "password": "Password", + "private_key": "PrivateKey", + "private_password": "PassPhrase", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeHost 网元主机连接 数据层处理 +type NeHost struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeHost) convertResultRows(rows []map[string]any) []model.NeHost { + arr := make([]model.NeHost, 0) + for _, row := range rows { + item := model.NeHost{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeHost) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["hostType"]; ok && v != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["groupId"]; ok && v != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["title"]; ok && v != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_host" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost { + // 查询条件拼接 + var conditions []string + var params []any + if neHost.HostType != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, neHost.HostType) + } + if neHost.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHost.GroupID) + } + if neHost.Title != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, neHost.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by update_time asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeHost) SelectByIds(hostIds []string) []model.NeHost { + placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) + querySql := r.selectSql + " where host_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(hostIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeHost{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueNeHost 校验主机是否唯一 +func (r *NeHost) CheckUniqueNeHost(neHost model.NeHost) string { + // 查询条件拼接 + var conditions []string + var params []any + if neHost.HostType != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, neHost.HostType) + } + if neHost.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHost.GroupID) + } + if neHost.Title != "" { + conditions = append(conditions, "title = ?") + params = append(params, neHost.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeHost) Insert(neHost model.NeHost) string { + // 参数拼接 + params := make(map[string]any) + if neHost.HostType != "" { + params["host_type"] = neHost.HostType + } + if neHost.GroupID != "" { + params["group_id"] = neHost.GroupID + } + if neHost.Title != "" { + params["title"] = neHost.Title + } + if neHost.Addr != "" { + params["addr"] = neHost.Addr + } + if neHost.Port > 0 { + params["port"] = neHost.Port + } + if neHost.User != "" { + params["user"] = neHost.User + } + if neHost.AuthMode != "" { + params["auth_mode"] = neHost.AuthMode + } + if neHost.Password != "" { + params["password"] = neHost.Password + } + if neHost.PrivateKey != "" { + params["private_key"] = neHost.PrivateKey + } + if neHost.PassPhrase != "" { + params["pass_phrase"] = neHost.PassPhrase + } + if neHost.Remark != "" { + params["remark"] = neHost.Remark + } + if neHost.CreateBy != "" { + params["create_by"] = neHost.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 根据认证模式清除不必要的信息 + if neHost.AuthMode == "0" { + params["private_key"] = "" + params["pass_phrase"] = "" + } + if neHost.AuthMode == "1" { + params["password"] = "" + } + if neHost.AuthMode == "2" { + params["password"] = "" + params["private_key"] = "" + params["pass_phrase"] = "" + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_host (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeHost) Update(neHost model.NeHost) int64 { + // 参数拼接 + params := make(map[string]any) + if neHost.HostType != "" { + params["host_type"] = neHost.HostType + } + if neHost.GroupID != "" { + params["group_id"] = neHost.GroupID + } + if neHost.Title != "" { + params["title"] = neHost.Title + } + if neHost.Addr != "" { + params["addr"] = neHost.Addr + } + if neHost.Port > 0 { + params["port"] = neHost.Port + } + if neHost.User != "" { + params["user"] = neHost.User + } + if neHost.AuthMode != "" { + params["auth_mode"] = neHost.AuthMode + } + if neHost.Password != "" { + params["password"] = neHost.Password + } + if neHost.PrivateKey != "" { + params["private_key"] = neHost.PrivateKey + } + if neHost.PassPhrase != "" { + params["pass_phrase"] = neHost.PassPhrase + } + params["remark"] = neHost.Remark + if neHost.UpdateBy != "" { + params["update_by"] = neHost.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 根据认证模式清除不必要的信息 + if neHost.AuthMode == "0" { + params["private_key"] = "" + params["pass_phrase"] = "" + } + if neHost.AuthMode == "1" { + params["password"] = "" + } + if neHost.AuthMode == "2" { + params["password"] = "" + params["private_key"] = "" + params["pass_phrase"] = "" + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_host set " + strings.Join(keys, ",") + " where host_id = ?" + + // 执行更新 + values = append(values, neHost.HostID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除网元主机连接信息 +func (r *NeHost) DeleteByIds(hostIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) + sql := "delete from ne_host where host_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(hostIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_host.impl.go b/src/modules/network_element/repository/ne_host.impl.go deleted file mode 100644 index 5988ad94..00000000 --- a/src/modules/network_element/repository/ne_host.impl.go +++ /dev/null @@ -1,376 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeHostImpl 结构体 -var NewNeHostImpl = &NeHostImpl{ - selectSql: `select - host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, remark, create_by, create_time, update_by, update_time - from ne_host`, - - resultMap: map[string]string{ - "host_id": "HostID", - "host_type": "HostType", - "group_id": "GroupID", - "title": "Title", - "addr": "Addr", - "port": "Port", - "user": "User", - "auth_mode": "AuthMode", - "password": "Password", - "private_key": "PrivateKey", - "private_password": "PassPhrase", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeHostImpl 网元主机连接 数据层处理 -type NeHostImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeHostImpl) convertResultRows(rows []map[string]any) []model.NeHost { - arr := make([]model.NeHost, 0) - for _, row := range rows { - item := model.NeHost{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeHostImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["hostType"]; ok && v != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["groupId"]; ok && v != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_host" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeHostImpl) SelectList(neHost model.NeHost) []model.NeHost { - // 查询条件拼接 - var conditions []string - var params []any - if neHost.HostType != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, neHost.HostType) - } - if neHost.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHost.GroupID) - } - if neHost.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, neHost.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by update_time asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeHostImpl) SelectByIds(hostIds []string) []model.NeHost { - placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) - querySql := r.selectSql + " where host_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(hostIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeHost{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueNeHost 校验主机是否唯一 -func (r *NeHostImpl) CheckUniqueNeHost(neHost model.NeHost) string { - // 查询条件拼接 - var conditions []string - var params []any - if neHost.HostType != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, neHost.HostType) - } - if neHost.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHost.GroupID) - } - if neHost.Title != "" { - conditions = append(conditions, "title = ?") - params = append(params, neHost.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeHostImpl) Insert(neHost model.NeHost) string { - // 参数拼接 - params := make(map[string]any) - if neHost.HostType != "" { - params["host_type"] = neHost.HostType - } - if neHost.GroupID != "" { - params["group_id"] = neHost.GroupID - } - if neHost.Title != "" { - params["title"] = neHost.Title - } - if neHost.Addr != "" { - params["addr"] = neHost.Addr - } - if neHost.Port > 0 { - params["port"] = neHost.Port - } - if neHost.User != "" { - params["user"] = neHost.User - } - if neHost.AuthMode != "" { - params["auth_mode"] = neHost.AuthMode - } - if neHost.Password != "" { - params["password"] = neHost.Password - } - if neHost.PrivateKey != "" { - params["private_key"] = neHost.PrivateKey - } - if neHost.PassPhrase != "" { - params["pass_phrase"] = neHost.PassPhrase - } - if neHost.Remark != "" { - params["remark"] = neHost.Remark - } - if neHost.CreateBy != "" { - params["create_by"] = neHost.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 根据认证模式清除不必要的信息 - if neHost.AuthMode == "0" { - params["private_key"] = "" - params["pass_phrase"] = "" - } - if neHost.AuthMode == "1" { - params["password"] = "" - } - if neHost.AuthMode == "2" { - params["password"] = "" - params["private_key"] = "" - params["pass_phrase"] = "" - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_host (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeHostImpl) Update(neHost model.NeHost) int64 { - // 参数拼接 - params := make(map[string]any) - if neHost.HostType != "" { - params["host_type"] = neHost.HostType - } - if neHost.GroupID != "" { - params["group_id"] = neHost.GroupID - } - if neHost.Title != "" { - params["title"] = neHost.Title - } - if neHost.Addr != "" { - params["addr"] = neHost.Addr - } - if neHost.Port > 0 { - params["port"] = neHost.Port - } - if neHost.User != "" { - params["user"] = neHost.User - } - if neHost.AuthMode != "" { - params["auth_mode"] = neHost.AuthMode - } - if neHost.Password != "" { - params["password"] = neHost.Password - } - if neHost.PrivateKey != "" { - params["private_key"] = neHost.PrivateKey - } - if neHost.PassPhrase != "" { - params["pass_phrase"] = neHost.PassPhrase - } - params["remark"] = neHost.Remark - if neHost.UpdateBy != "" { - params["update_by"] = neHost.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 根据认证模式清除不必要的信息 - if neHost.AuthMode == "0" { - params["private_key"] = "" - params["pass_phrase"] = "" - } - if neHost.AuthMode == "1" { - params["password"] = "" - } - if neHost.AuthMode == "2" { - params["password"] = "" - params["private_key"] = "" - params["pass_phrase"] = "" - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_host set " + strings.Join(keys, ",") + " where host_id = ?" - - // 执行更新 - values = append(values, neHost.HostID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除网元主机连接信息 -func (r *NeHostImpl) DeleteByIds(hostIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) - sql := "delete from ne_host where host_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(hostIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_host_cmd.go b/src/modules/network_element/repository/ne_host_cmd.go index 170441bc..4ef57073 100644 --- a/src/modules/network_element/repository/ne_host_cmd.go +++ b/src/modules/network_element/repository/ne_host_cmd.go @@ -1,27 +1,306 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeHostCmd 网元主机命令 数据层接口 -type INeHostCmd interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd +// 实例化数据层 NeHostCmd 结构体 +var NewNeHostCmd = &NeHostCmd{ + selectSql: `select + cmd_id, cmd_type, group_id, title, command, remark, create_by, create_time, update_by, update_time + from ne_host_cmd`, - // SelectByIds 通过ID查询 - SelectByIds(cmdIds []string) []model.NeHostCmd - - // Insert 新增信息 - Insert(neHostCmd model.NeHostCmd) string - - // Update 修改信息 - Update(neHostCmd model.NeHostCmd) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(cmdIds []string) int64 - - // CheckUniqueGroupTitle 校验同类型组内是否唯一 - CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string + resultMap: map[string]string{ + "cmd_id": "CmdID", + "cmd_type": "CmdType", + "group_id": "GroupID", + "title": "Title", + "command": "Command", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeHostCmd 网元主机连接 数据层处理 +type NeHostCmd struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeHostCmd) convertResultRows(rows []map[string]any) []model.NeHostCmd { + arr := make([]model.NeHostCmd, 0) + for _, row := range rows { + item := model.NeHostCmd{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["cmdType"]; ok && v != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["groupId"]; ok && v != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["title"]; ok && v != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_host_cmd" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeHostCmd) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { + // 查询条件拼接 + var conditions []string + var params []any + if neHostCmd.CmdType != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, neHostCmd.CmdType) + } + if neHostCmd.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHostCmd.GroupID) + } + if neHostCmd.Title != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, neHostCmd.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by update_time asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeHostCmd) SelectByIds(cmdIds []string) []model.NeHostCmd { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where cmd_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeHostCmd{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueGroupTitle 校验同类型组内是否唯一 +func (r *NeHostCmd) CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string { + // 查询条件拼接 + var conditions []string + var params []any + if neHostCmd.CmdType != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, neHostCmd.CmdType) + } + if neHostCmd.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHostCmd.GroupID) + } + if neHostCmd.Title != "" { + conditions = append(conditions, "title = ?") + params = append(params, neHostCmd.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) string { + // 参数拼接 + params := make(map[string]any) + if neHostCmd.CmdType != "" { + params["cmd_type"] = neHostCmd.CmdType + } + if neHostCmd.GroupID != "" { + params["group_id"] = neHostCmd.GroupID + } + if neHostCmd.Title != "" { + params["title"] = neHostCmd.Title + } + if neHostCmd.Command != "" { + params["command"] = neHostCmd.Command + } + if neHostCmd.Remark != "" { + params["remark"] = neHostCmd.Remark + } + if neHostCmd.CreateBy != "" { + params["create_by"] = neHostCmd.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_host_cmd (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeHostCmd) Update(neHostCmd model.NeHostCmd) int64 { + // 参数拼接 + params := make(map[string]any) + if neHostCmd.CmdType != "" { + params["cmd_type"] = neHostCmd.CmdType + } + if neHostCmd.GroupID != "" { + params["group_id"] = neHostCmd.GroupID + } + if neHostCmd.Title != "" { + params["title"] = neHostCmd.Title + } + if neHostCmd.Command != "" { + params["command"] = neHostCmd.Command + } + params["remark"] = neHostCmd.Remark + if neHostCmd.UpdateBy != "" { + params["update_by"] = neHostCmd.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_host_cmd set " + strings.Join(keys, ",") + " where cmd_id = ?" + + // 执行更新 + values = append(values, neHostCmd.CmdID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeHostCmd) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_host_cmd where cmd_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_host_cmd.impl.go b/src/modules/network_element/repository/ne_host_cmd.impl.go deleted file mode 100644 index b4bb279e..00000000 --- a/src/modules/network_element/repository/ne_host_cmd.impl.go +++ /dev/null @@ -1,306 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeHostCmdImpl 结构体 -var NewNeHostCmdImpl = &NeHostCmdImpl{ - selectSql: `select - cmd_id, cmd_type, group_id, title, command, remark, create_by, create_time, update_by, update_time - from ne_host_cmd`, - - resultMap: map[string]string{ - "cmd_id": "CmdID", - "cmd_type": "CmdType", - "group_id": "GroupID", - "title": "Title", - "command": "Command", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeHostCmdImpl 网元主机连接 数据层处理 -type NeHostCmdImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeHostCmdImpl) convertResultRows(rows []map[string]any) []model.NeHostCmd { - arr := make([]model.NeHostCmd, 0) - for _, row := range rows { - item := model.NeHostCmd{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeHostCmdImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["cmdType"]; ok && v != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["groupId"]; ok && v != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_host_cmd" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeHostCmdImpl) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { - // 查询条件拼接 - var conditions []string - var params []any - if neHostCmd.CmdType != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, neHostCmd.CmdType) - } - if neHostCmd.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHostCmd.GroupID) - } - if neHostCmd.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, neHostCmd.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by update_time asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeHostCmdImpl) SelectByIds(cmdIds []string) []model.NeHostCmd { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where cmd_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeHostCmd{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueGroupTitle 校验同类型组内是否唯一 -func (r *NeHostCmdImpl) CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string { - // 查询条件拼接 - var conditions []string - var params []any - if neHostCmd.CmdType != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, neHostCmd.CmdType) - } - if neHostCmd.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHostCmd.GroupID) - } - if neHostCmd.Title != "" { - conditions = append(conditions, "title = ?") - params = append(params, neHostCmd.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeHostCmdImpl) Insert(neHostCmd model.NeHostCmd) string { - // 参数拼接 - params := make(map[string]any) - if neHostCmd.CmdType != "" { - params["cmd_type"] = neHostCmd.CmdType - } - if neHostCmd.GroupID != "" { - params["group_id"] = neHostCmd.GroupID - } - if neHostCmd.Title != "" { - params["title"] = neHostCmd.Title - } - if neHostCmd.Command != "" { - params["command"] = neHostCmd.Command - } - if neHostCmd.Remark != "" { - params["remark"] = neHostCmd.Remark - } - if neHostCmd.CreateBy != "" { - params["create_by"] = neHostCmd.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_host_cmd (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeHostCmdImpl) Update(neHostCmd model.NeHostCmd) int64 { - // 参数拼接 - params := make(map[string]any) - if neHostCmd.CmdType != "" { - params["cmd_type"] = neHostCmd.CmdType - } - if neHostCmd.GroupID != "" { - params["group_id"] = neHostCmd.GroupID - } - if neHostCmd.Title != "" { - params["title"] = neHostCmd.Title - } - if neHostCmd.Command != "" { - params["command"] = neHostCmd.Command - } - params["remark"] = neHostCmd.Remark - if neHostCmd.UpdateBy != "" { - params["update_by"] = neHostCmd.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_host_cmd set " + strings.Join(keys, ",") + " where cmd_id = ?" - - // 执行更新 - values = append(values, neHostCmd.CmdID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeHostCmdImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_host_cmd where cmd_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_info.go b/src/modules/network_element/repository/ne_info.go index c09d034a..effa5554 100644 --- a/src/modules/network_element/repository/ne_info.go +++ b/src/modules/network_element/repository/ne_info.go @@ -1,32 +1,405 @@ package repository import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_element/model" ) -// 网元信息 数据层接口 -type INeInfo interface { - // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 - SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo - - // SelectPage 根据条件分页查询 - SelectPage(query map[string]any) map[string]any - - // SelectList 查询列表 - SelectList(neInfo model.NeInfo) []model.NeInfo - - // SelectByIds 通过ID查询 - SelectByIds(infoIds []string) []model.NeInfo - - // Insert 新增信息 - Insert(neInfo model.NeInfo) string - - // Update 修改信息 - Update(neInfo model.NeInfo) int64 - - // DeleteByIds 批量删除网元信息 - DeleteByIds(infoIds []string) int64 - - // CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 - CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string +// neListSort 网元列表预设排序 +var neListSort = []string{ + "OMC", + "IMS", + "AMF", + "AUSF", + "UDM", + "SMF", + "PCF", + "NSSF", + "NRF", + "UPF", + "LMF", + "NEF", + "MME", + "N3IWF", + "MOCNGW", + "SMSC", + "CBC", +} + +// 实例化数据层 NeInfo 结构体 +var NewNeInfo = &NeInfo{ + selectSql: `select id, ne_type, ne_id, rm_uid, ne_name, ip, port, pv_flag, province, vendor_name, dn, ne_address, host_ids, status, remark, create_by, create_time, update_by, update_time from ne_info`, + + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "rm_uid": "RmUID", + "ne_name": "NeName", + "ip": "IP", + "port": "Port", + "pv_flag": "PvFlag", + "province": "Province", + "vendor_name": "VendorName", + "dn": "Dn", + "ne_address": "NeAddress", + "host_ids": "HostIDs", + "status": "Status", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeInfo 网元信息表 数据层处理 +type NeInfo struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeInfo) convertResultRows(rows []map[string]any) []model.NeInfo { + arr := make([]model.NeInfo, 0) + for _, row := range rows { + item := model.NeInfo{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + + // 创建优先级映射 + priority := make(map[string]int) + for i, v := range neListSort { + priority[v] = i + } + // 冒泡排序 + n := len(arr) + for i := 0; i < n-1; i++ { + for j := 0; j < n-i-1; j++ { + if priority[arr[j].NeType] > priority[arr[j+1].NeType] { + // 交换元素 + arr[j], arr[j+1] = arr[j+1], arr[j] + } + } + } + + return arr +} + +// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 +func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { + querySql := r.selectSql + " where ne_type = ? and ne_id = ?" + results, err := datasource.RawDB("", querySql, []any{neType, neID}) + if err != nil { + logger.Errorf("query err => %v", err) + return model.NeInfo{} + } + // 转换实体 + rows := r.convertResultRows(results) + if len(rows) > 0 { + return rows[0] + } + return model.NeInfo{} +} + +// SelectPage 根据条件分页查询 +func (r *NeInfo) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["rmUid"]; ok && v != "" { + conditions = append(conditions, "rmUid like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeInfo{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_info" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 查询列表 +func (r *NeInfo) SelectList(neInfo model.NeInfo) []model.NeInfo { + // 查询条件拼接 + var conditions []string + var params []any + if neInfo.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neInfo.NeType) + } + if neInfo.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neInfo.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeInfo) SelectByIds(infoIds []string) []model.NeInfo { + placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(infoIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeInfo{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 +func (r *NeInfo) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { + // 查询条件拼接 + var conditions []string + var params []any + if neInfo.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neInfo.NeType) + } + if neInfo.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neInfo.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select id as 'str' from ne_info " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeInfo) Insert(neInfo model.NeInfo) string { + // 参数拼接 + params := make(map[string]any) + if neInfo.NeType != "" { + params["ne_type"] = neInfo.NeType + } + if neInfo.NeId != "" { + params["ne_id"] = neInfo.NeId + } + if neInfo.RmUID != "" { + params["rm_uid"] = neInfo.RmUID + } + if neInfo.NeName != "" { + params["ne_name"] = neInfo.NeName + } + if neInfo.IP != "" { + params["ip"] = neInfo.IP + } + if neInfo.Port > 0 { + params["port"] = neInfo.Port + } + if neInfo.PvFlag != "" { + params["pv_flag"] = neInfo.PvFlag + } + if neInfo.Province != "" { + params["province"] = neInfo.Province + } + if neInfo.VendorName != "" { + params["vendor_name"] = neInfo.VendorName + } + if neInfo.Dn != "" { + params["dn"] = neInfo.Dn + } + if neInfo.NeAddress != "" { + params["ne_address"] = neInfo.NeAddress + } + if neInfo.HostIDs != "" { + params["host_ids"] = neInfo.HostIDs + } + if neInfo.Status != "" { + params["status"] = neInfo.Status + } + if neInfo.Remark != "" { + params["remark"] = neInfo.Remark + } + if neInfo.CreateBy != "" { + params["create_by"] = neInfo.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_info (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeInfo) Update(neInfo model.NeInfo) int64 { + // 参数拼接 + params := make(map[string]any) + if neInfo.NeType != "" { + params["ne_type"] = neInfo.NeType + } + if neInfo.NeId != "" { + params["ne_id"] = neInfo.NeId + } + if neInfo.RmUID != "" { + params["rm_uid"] = neInfo.RmUID + } + if neInfo.NeName != "" { + params["ne_name"] = neInfo.NeName + } + if neInfo.IP != "" { + params["ip"] = neInfo.IP + } + if neInfo.Port > 0 { + params["port"] = neInfo.Port + } + if neInfo.PvFlag != "" { + params["pv_flag"] = neInfo.PvFlag + } + params["province"] = neInfo.Province + params["vendor_name"] = neInfo.VendorName + params["dn"] = neInfo.Dn + params["ne_address"] = neInfo.NeAddress + if neInfo.HostIDs != "" { + params["host_ids"] = neInfo.HostIDs + } + params["remark"] = neInfo.Remark + if neInfo.Status != "" { + params["status"] = neInfo.Status + } + if neInfo.UpdateBy != "" { + params["update_by"] = neInfo.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_info set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neInfo.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除网元信息 +func (r *NeInfo) DeleteByIds(infoIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) + sql := "delete from ne_info where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(infoIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_info.impl.go b/src/modules/network_element/repository/ne_info.impl.go deleted file mode 100644 index adbc75c8..00000000 --- a/src/modules/network_element/repository/ne_info.impl.go +++ /dev/null @@ -1,405 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// neListSort 网元列表预设排序 -var neListSort = []string{ - "OMC", - "IMS", - "AMF", - "AUSF", - "UDM", - "SMF", - "PCF", - "NSSF", - "NRF", - "UPF", - "LMF", - "NEF", - "MME", - "N3IWF", - "MOCNGW", - "SMSC", - "CBC", -} - -// 实例化数据层 NeInfoImpl 结构体 -var NewNeInfoImpl = &NeInfoImpl{ - selectSql: `select id, ne_type, ne_id, rm_uid, ne_name, ip, port, pv_flag, province, vendor_name, dn, ne_address, host_ids, status, remark, create_by, create_time, update_by, update_time from ne_info`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "rm_uid": "RmUID", - "ne_name": "NeName", - "ip": "IP", - "port": "Port", - "pv_flag": "PvFlag", - "province": "Province", - "vendor_name": "VendorName", - "dn": "Dn", - "ne_address": "NeAddress", - "host_ids": "HostIDs", - "status": "Status", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeInfoImpl 网元信息表 数据层处理 -type NeInfoImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeInfoImpl) convertResultRows(rows []map[string]any) []model.NeInfo { - arr := make([]model.NeInfo, 0) - for _, row := range rows { - item := model.NeInfo{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - - // 创建优先级映射 - priority := make(map[string]int) - for i, v := range neListSort { - priority[v] = i - } - // 冒泡排序 - n := len(arr) - for i := 0; i < n-1; i++ { - for j := 0; j < n-i-1; j++ { - if priority[arr[j].NeType] > priority[arr[j+1].NeType] { - // 交换元素 - arr[j], arr[j+1] = arr[j+1], arr[j] - } - } - } - - return arr -} - -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { - querySql := r.selectSql + " where ne_type = ? and ne_id = ?" - results, err := datasource.RawDB("", querySql, []any{neType, neID}) - if err != nil { - logger.Errorf("query err => %v", err) - return model.NeInfo{} - } - // 转换实体 - rows := r.convertResultRows(results) - if len(rows) > 0 { - return rows[0] - } - return model.NeInfo{} -} - -// SelectPage 根据条件分页查询 -func (r *NeInfoImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["rmUid"]; ok && v != "" { - conditions = append(conditions, "rmUid like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeInfo{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_info" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 查询列表 -func (r *NeInfoImpl) SelectList(neInfo model.NeInfo) []model.NeInfo { - // 查询条件拼接 - var conditions []string - var params []any - if neInfo.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neInfo.NeType) - } - if neInfo.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neInfo.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeInfoImpl) SelectByIds(infoIds []string) []model.NeInfo { - placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(infoIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeInfo{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 -func (r *NeInfoImpl) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { - // 查询条件拼接 - var conditions []string - var params []any - if neInfo.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neInfo.NeType) - } - if neInfo.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neInfo.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select id as 'str' from ne_info " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeInfoImpl) Insert(neInfo model.NeInfo) string { - // 参数拼接 - params := make(map[string]any) - if neInfo.NeType != "" { - params["ne_type"] = neInfo.NeType - } - if neInfo.NeId != "" { - params["ne_id"] = neInfo.NeId - } - if neInfo.RmUID != "" { - params["rm_uid"] = neInfo.RmUID - } - if neInfo.NeName != "" { - params["ne_name"] = neInfo.NeName - } - if neInfo.IP != "" { - params["ip"] = neInfo.IP - } - if neInfo.Port > 0 { - params["port"] = neInfo.Port - } - if neInfo.PvFlag != "" { - params["pv_flag"] = neInfo.PvFlag - } - if neInfo.Province != "" { - params["province"] = neInfo.Province - } - if neInfo.VendorName != "" { - params["vendor_name"] = neInfo.VendorName - } - if neInfo.Dn != "" { - params["dn"] = neInfo.Dn - } - if neInfo.NeAddress != "" { - params["ne_address"] = neInfo.NeAddress - } - if neInfo.HostIDs != "" { - params["host_ids"] = neInfo.HostIDs - } - if neInfo.Status != "" { - params["status"] = neInfo.Status - } - if neInfo.Remark != "" { - params["remark"] = neInfo.Remark - } - if neInfo.CreateBy != "" { - params["create_by"] = neInfo.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_info (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeInfoImpl) Update(neInfo model.NeInfo) int64 { - // 参数拼接 - params := make(map[string]any) - if neInfo.NeType != "" { - params["ne_type"] = neInfo.NeType - } - if neInfo.NeId != "" { - params["ne_id"] = neInfo.NeId - } - if neInfo.RmUID != "" { - params["rm_uid"] = neInfo.RmUID - } - if neInfo.NeName != "" { - params["ne_name"] = neInfo.NeName - } - if neInfo.IP != "" { - params["ip"] = neInfo.IP - } - if neInfo.Port > 0 { - params["port"] = neInfo.Port - } - if neInfo.PvFlag != "" { - params["pv_flag"] = neInfo.PvFlag - } - params["province"] = neInfo.Province - params["vendor_name"] = neInfo.VendorName - params["dn"] = neInfo.Dn - params["ne_address"] = neInfo.NeAddress - if neInfo.HostIDs != "" { - params["host_ids"] = neInfo.HostIDs - } - params["remark"] = neInfo.Remark - if neInfo.Status != "" { - params["status"] = neInfo.Status - } - if neInfo.UpdateBy != "" { - params["update_by"] = neInfo.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_info set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neInfo.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除网元信息 -func (r *NeInfoImpl) DeleteByIds(infoIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) - sql := "delete from ne_info where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(infoIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_license.go b/src/modules/network_element/repository/ne_license.go index 83cc42ac..5aad6b32 100644 --- a/src/modules/network_element/repository/ne_license.go +++ b/src/modules/network_element/repository/ne_license.go @@ -1,24 +1,297 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "strings" + "time" -// INeLicense 网元授权激活信息 数据层接口 -type INeLicense interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neLicense model.NeLicense) []model.NeLicense +// 实例化数据层 NeLicense 结构体 +var NewNeLicense = &NeLicense{ + selectSql: `select + id, ne_type, ne_id, activation_request_code, license_path, serial_num, expiry_date, status, remark, create_by, create_time, update_by, update_time + from ne_license`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeLicense - - // Insert 新增信息 - Insert(neLicense model.NeLicense) string - - // Update 修改信息 - Update(neLicense model.NeLicense) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "activation_request_code": "ActivationRequestCode", + "license_path": "LicensePath", + "serial_num": "SerialNum", + "expiry_date": "ExpiryDate", + "status": "Status", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeLicense 网元授权激活信息 数据层处理 +type NeLicense struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeLicense) convertResultRows(rows []map[string]any) []model.NeLicense { + arr := make([]model.NeLicense, 0) + for _, row := range rows { + item := model.NeLicense{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeLicense) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["expiryDate"]; ok && v != "" { + conditions = append(conditions, "expiry_date = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["createBy"]; ok && v != "" { + conditions = append(conditions, "create_by like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_license" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense { + // 查询条件拼接 + var conditions []string + var params []any + if neLicense.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neLicense.NeType) + } + if neLicense.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neLicense.NeId) + } + if neLicense.ExpiryDate != "" { + conditions = append(conditions, "expiry_date = ?") + params = append(params, neLicense.ExpiryDate) + } + if neLicense.CreateBy != "" { + conditions = append(conditions, "create_by like concat(?, '%')") + params = append(params, neLicense.CreateBy) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeLicense) SelectByIds(cmdIds []string) []model.NeLicense { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeLicense{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeLicense) Insert(neLicense model.NeLicense) string { + // 参数拼接 + params := make(map[string]any) + if neLicense.NeType != "" { + params["ne_type"] = neLicense.NeType + } + if neLicense.NeId != "" { + params["ne_id"] = neLicense.NeId + } + if neLicense.ActivationRequestCode != "" { + params["activation_request_code"] = neLicense.ActivationRequestCode + } + if neLicense.LicensePath != "" { + params["license_path"] = neLicense.LicensePath + } + if neLicense.SerialNum != "" { + params["serial_num"] = neLicense.SerialNum + } + if neLicense.ExpiryDate != "" { + params["expiry_date"] = neLicense.ExpiryDate + } + if neLicense.Status != "" { + params["status"] = neLicense.Status + } + if neLicense.Remark != "" { + params["remark"] = neLicense.Remark + } + if neLicense.CreateBy != "" { + params["create_by"] = neLicense.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_license (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeLicense) Update(neLicense model.NeLicense) int64 { + // 参数拼接 + params := make(map[string]any) + if neLicense.NeType != "" { + params["ne_type"] = neLicense.NeType + } + if neLicense.NeId != "" { + params["ne_id"] = neLicense.NeId + } + if neLicense.ActivationRequestCode != "" { + params["activation_request_code"] = neLicense.ActivationRequestCode + } + if neLicense.LicensePath != "" { + params["license_path"] = neLicense.LicensePath + } + if neLicense.SerialNum != "" { + params["serial_num"] = neLicense.SerialNum + } + if neLicense.ExpiryDate != "" { + params["expiry_date"] = neLicense.ExpiryDate + } + if neLicense.Status != "" { + params["status"] = neLicense.Status + } + if neLicense.Remark != "" { + params["remark"] = neLicense.Remark + } + if neLicense.UpdateBy != "" { + params["update_by"] = neLicense.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_license set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neLicense.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeLicense) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_license where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_license.impl.go b/src/modules/network_element/repository/ne_license.impl.go deleted file mode 100644 index 0daee946..00000000 --- a/src/modules/network_element/repository/ne_license.impl.go +++ /dev/null @@ -1,297 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeLicense 结构体 -var NewNeLicenseImpl = &NeLicenseImpl{ - selectSql: `select - id, ne_type, ne_id, activation_request_code, license_path, serial_num, expiry_date, status, remark, create_by, create_time, update_by, update_time - from ne_license`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "activation_request_code": "ActivationRequestCode", - "license_path": "LicensePath", - "serial_num": "SerialNum", - "expiry_date": "ExpiryDate", - "status": "Status", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeLicenseImpl 网元授权激活信息 数据层处理 -type NeLicenseImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeLicenseImpl) convertResultRows(rows []map[string]any) []model.NeLicense { - arr := make([]model.NeLicense, 0) - for _, row := range rows { - item := model.NeLicense{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeLicenseImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["expiryDate"]; ok && v != "" { - conditions = append(conditions, "expiry_date = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["createBy"]; ok && v != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_license" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeLicenseImpl) SelectList(neLicense model.NeLicense) []model.NeLicense { - // 查询条件拼接 - var conditions []string - var params []any - if neLicense.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neLicense.NeType) - } - if neLicense.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neLicense.NeId) - } - if neLicense.ExpiryDate != "" { - conditions = append(conditions, "expiry_date = ?") - params = append(params, neLicense.ExpiryDate) - } - if neLicense.CreateBy != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, neLicense.CreateBy) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeLicenseImpl) SelectByIds(cmdIds []string) []model.NeLicense { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeLicense{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeLicenseImpl) Insert(neLicense model.NeLicense) string { - // 参数拼接 - params := make(map[string]any) - if neLicense.NeType != "" { - params["ne_type"] = neLicense.NeType - } - if neLicense.NeId != "" { - params["ne_id"] = neLicense.NeId - } - if neLicense.ActivationRequestCode != "" { - params["activation_request_code"] = neLicense.ActivationRequestCode - } - if neLicense.LicensePath != "" { - params["license_path"] = neLicense.LicensePath - } - if neLicense.SerialNum != "" { - params["serial_num"] = neLicense.SerialNum - } - if neLicense.ExpiryDate != "" { - params["expiry_date"] = neLicense.ExpiryDate - } - if neLicense.Status != "" { - params["status"] = neLicense.Status - } - if neLicense.Remark != "" { - params["remark"] = neLicense.Remark - } - if neLicense.CreateBy != "" { - params["create_by"] = neLicense.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_license (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeLicenseImpl) Update(neLicense model.NeLicense) int64 { - // 参数拼接 - params := make(map[string]any) - if neLicense.NeType != "" { - params["ne_type"] = neLicense.NeType - } - if neLicense.NeId != "" { - params["ne_id"] = neLicense.NeId - } - if neLicense.ActivationRequestCode != "" { - params["activation_request_code"] = neLicense.ActivationRequestCode - } - if neLicense.LicensePath != "" { - params["license_path"] = neLicense.LicensePath - } - if neLicense.SerialNum != "" { - params["serial_num"] = neLicense.SerialNum - } - if neLicense.ExpiryDate != "" { - params["expiry_date"] = neLicense.ExpiryDate - } - if neLicense.Status != "" { - params["status"] = neLicense.Status - } - if neLicense.Remark != "" { - params["remark"] = neLicense.Remark - } - if neLicense.UpdateBy != "" { - params["update_by"] = neLicense.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_license set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neLicense.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeLicenseImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_license where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_software.go b/src/modules/network_element/repository/ne_software.go index f6d0f23e..d039ec6d 100644 --- a/src/modules/network_element/repository/ne_software.go +++ b/src/modules/network_element/repository/ne_software.go @@ -1,27 +1,317 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeSoftware 网元软件包信息 数据层接口 -type INeSoftware interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neSoftware model.NeSoftware) []model.NeSoftware +// 实例化数据层 NeSoftware 结构体 +var NewNeSoftware = &NeSoftware{ + selectSql: `select + id, ne_type, name, path, version, description, create_by, create_time, update_by, update_time + from ne_software`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeSoftware - - // Insert 新增信息 - Insert(neSoftware model.NeSoftware) string - - // Update 修改信息 - Update(neSoftware model.NeSoftware) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 - - // CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 - CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "name": "Name", + "path": "Path", + "version": "Version", + "description": "Description", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeSoftware 网元软件包信息 数据层处理 +type NeSoftware struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeSoftware) convertResultRows(rows []map[string]any) []model.NeSoftware { + arr := make([]model.NeSoftware, 0) + for _, row := range rows { + item := model.NeSoftware{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeSoftware) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + softwareType := v.(string) + if strings.Contains(softwareType, ",") { + softwareTypeArr := strings.Split(softwareType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(softwareTypeArr)) + conditions = append(conditions, "ne_type in ("+placeholder+")") + parameters := repo.ConvertIdsSlice(softwareTypeArr) + params = append(params, parameters...) + } else { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(softwareType, " ")) + } + } + if v, ok := query["name"]; ok && v != "" { + conditions = append(conditions, "name like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["version"]; ok && v != "" { + conditions = append(conditions, "version like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_software" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " order by id desc limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { + // 查询条件拼接 + var conditions []string + var params []any + if neSoftware.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neSoftware.NeType) + } + if neSoftware.Path != "" { + conditions = append(conditions, "path = ?") + params = append(params, neSoftware.Path) + } + if neSoftware.Version != "" { + conditions = append(conditions, "version = ?") + params = append(params, neSoftware.Version) + } + if neSoftware.Name != "" { + conditions = append(conditions, "name like concat(?, '%')") + params = append(params, neSoftware.Name) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeSoftware) SelectByIds(cmdIds []string) []model.NeSoftware { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeSoftware{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 +func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string { + // 查询条件拼接 + var conditions []string + var params []any + if neSoftware.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neSoftware.NeType) + } + if neSoftware.Version != "" { + conditions = append(conditions, "version = ?") + params = append(params, neSoftware.Version) + } + if neSoftware.Name != "" { + conditions = append(conditions, "name = ?") + params = append(params, neSoftware.Name) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select id as 'str' from ne_software " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { + // 参数拼接 + params := make(map[string]any) + if neSoftware.NeType != "" { + params["ne_type"] = neSoftware.NeType + } + if neSoftware.Name != "" { + params["name"] = neSoftware.Name + } + if neSoftware.Path != "" { + params["path"] = neSoftware.Path + } + if neSoftware.Version != "" { + params["version"] = neSoftware.Version + } + params["description"] = neSoftware.Description + if neSoftware.CreateBy != "" { + params["create_by"] = neSoftware.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_software (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { + // 参数拼接 + params := make(map[string]any) + if neSoftware.NeType != "" { + params["ne_type"] = neSoftware.NeType + } + if neSoftware.Name != "" { + params["name"] = neSoftware.Name + } + if neSoftware.Path != "" { + params["path"] = neSoftware.Path + } + if neSoftware.Version != "" { + params["version"] = neSoftware.Version + } + params["description"] = neSoftware.Description + if neSoftware.UpdateBy != "" { + params["update_by"] = neSoftware.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_software set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neSoftware.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeSoftware) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_software where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_software.impl.go b/src/modules/network_element/repository/ne_software.impl.go deleted file mode 100644 index 5aa8cda6..00000000 --- a/src/modules/network_element/repository/ne_software.impl.go +++ /dev/null @@ -1,317 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeSoftware 结构体 -var NewNeSoftwareImpl = &NeSoftwareImpl{ - selectSql: `select - id, ne_type, name, path, version, description, create_by, create_time, update_by, update_time - from ne_software`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "name": "Name", - "path": "Path", - "version": "Version", - "description": "Description", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeSoftwareImpl 网元软件包信息 数据层处理 -type NeSoftwareImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeSoftwareImpl) convertResultRows(rows []map[string]any) []model.NeSoftware { - arr := make([]model.NeSoftware, 0) - for _, row := range rows { - item := model.NeSoftware{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeSoftwareImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - softwareType := v.(string) - if strings.Contains(softwareType, ",") { - softwareTypeArr := strings.Split(softwareType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(softwareTypeArr)) - conditions = append(conditions, "ne_type in ("+placeholder+")") - parameters := repo.ConvertIdsSlice(softwareTypeArr) - params = append(params, parameters...) - } else { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(softwareType, " ")) - } - } - if v, ok := query["name"]; ok && v != "" { - conditions = append(conditions, "name like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["version"]; ok && v != "" { - conditions = append(conditions, "version like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_software" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeSoftwareImpl) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { - // 查询条件拼接 - var conditions []string - var params []any - if neSoftware.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neSoftware.NeType) - } - if neSoftware.Path != "" { - conditions = append(conditions, "path = ?") - params = append(params, neSoftware.Path) - } - if neSoftware.Version != "" { - conditions = append(conditions, "version = ?") - params = append(params, neSoftware.Version) - } - if neSoftware.Name != "" { - conditions = append(conditions, "name like concat(?, '%')") - params = append(params, neSoftware.Name) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeSoftwareImpl) SelectByIds(cmdIds []string) []model.NeSoftware { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeSoftware{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 -func (r *NeSoftwareImpl) CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string { - // 查询条件拼接 - var conditions []string - var params []any - if neSoftware.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neSoftware.NeType) - } - if neSoftware.Version != "" { - conditions = append(conditions, "version = ?") - params = append(params, neSoftware.Version) - } - if neSoftware.Name != "" { - conditions = append(conditions, "name = ?") - params = append(params, neSoftware.Name) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select id as 'str' from ne_software " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeSoftwareImpl) Insert(neSoftware model.NeSoftware) string { - // 参数拼接 - params := make(map[string]any) - if neSoftware.NeType != "" { - params["ne_type"] = neSoftware.NeType - } - if neSoftware.Name != "" { - params["name"] = neSoftware.Name - } - if neSoftware.Path != "" { - params["path"] = neSoftware.Path - } - if neSoftware.Version != "" { - params["version"] = neSoftware.Version - } - params["description"] = neSoftware.Description - if neSoftware.CreateBy != "" { - params["create_by"] = neSoftware.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_software (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeSoftwareImpl) Update(neSoftware model.NeSoftware) int64 { - // 参数拼接 - params := make(map[string]any) - if neSoftware.NeType != "" { - params["ne_type"] = neSoftware.NeType - } - if neSoftware.Name != "" { - params["name"] = neSoftware.Name - } - if neSoftware.Path != "" { - params["path"] = neSoftware.Path - } - if neSoftware.Version != "" { - params["version"] = neSoftware.Version - } - params["description"] = neSoftware.Description - if neSoftware.UpdateBy != "" { - params["update_by"] = neSoftware.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_software set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neSoftware.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeSoftwareImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_software where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/service/ne_config.go b/src/modules/network_element/service/ne_config.go index e63c0b51..f607c0ab 100644 --- a/src/modules/network_element/service/ne_config.go +++ b/src/modules/network_element/service/ne_config.go @@ -1,36 +1,163 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "encoding/json" + "fmt" + "strings" -// INeConfig 网元参数配置可用属性值 服务层接口 -type INeConfig interface { - // RefreshByNeType 通过ne_type刷新redis中的缓存 - RefreshByNeTypeAndNeID(neType string) []model.NeConfig + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // ClearNeCacheByNeType 清除网元类型参数配置缓存 - ClearNeCacheByNeType(neType string) bool - - // SelectNeConfigByNeType 查询网元类型参数配置 - SelectNeConfigByNeType(neType string) []model.NeConfig - - // SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 - SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig - - // SelectNeHostPage 分页查询列表数据 - SelectPage(query map[string]any) map[string]any - - // SelectList 根据实体查询 - SelectList(param model.NeConfig) []model.NeConfig - - // SelectByIds 通过ID查询 - SelectById(id string) model.NeConfig - - // Insert 新增信息 - Insert(param model.NeConfig) string - - // Update 修改信息 - Update(param model.NeConfig) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) +// 实例化服务层 NeConfig 结构体 +var NewNeConfig = &NeConfig{ + neConfigRepository: repository.NewNeConfig, +} + +// NeConfig 网元参数配置可用属性值 服务层处理 +type NeConfig struct { + neConfigRepository *repository.NeConfig // 网元参数配置可用属性值表 +} + +// RefreshByNeType 通过ne_type刷新redis中的缓存 +func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { + // 多个 + if neType == "" || neType == "*" { + neConfigList := r.neConfigRepository.SelectList(model.NeConfig{}) + if len(neConfigList) > 0 { + neConfigGroup := map[string][]model.NeConfig{} + for _, v := range neConfigList { + if item, ok := neConfigGroup[v.NeType]; ok { + neConfigGroup[v.NeType] = append(item, v) + } else { + neConfigGroup[v.NeType] = []model.NeConfig{v} + } + } + for k, v := range neConfigGroup { + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(k)) + redis.Del("", key) + if len(v) > 0 { + for i, item := range v { + if err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData); err != nil { + continue + } + v[i] = item + } + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + } + } + } + return neConfigList + } + // 单个 + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) + redis.Del("", key) + neConfigList := r.neConfigRepository.SelectList(model.NeConfig{ + NeType: neType, + }) + if len(neConfigList) > 0 { + for i, v := range neConfigList { + if err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData); err != nil { + continue + } + neConfigList[i] = v + } + values, _ := json.Marshal(neConfigList) + redis.Set("", key, string(values)) + } + return neConfigList +} + +// ClearNeCacheByNeType 清除网元类型参数配置缓存 +func (r *NeConfig) ClearNeCacheByNeType(neType string) bool { + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, neType) + if neType == "*" { + key = fmt.Sprintf("%sNeConfig:*", cachekey.NE_DATA_KEY) + } + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + delOk, _ := redis.DelKeys("", keys) + return delOk +} + +// SelectNeConfigByNeType 查询网元类型参数配置 +func (r *NeConfig) SelectNeConfigByNeType(neType string) []model.NeConfig { + var neConfigList []model.NeConfig + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + err := json.Unmarshal([]byte(jsonStr), &neConfigList) + if err != nil { + neConfigList = []model.NeConfig{} + } + } else { + neConfigList = r.RefreshByNeTypeAndNeID(neType) + } + return neConfigList +} + +// SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 +func (r *NeConfig) SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig { + neConfigList := r.SelectNeConfigByNeType(neType) + var neConfig model.NeConfig + for _, v := range neConfigList { + if v.ParamName == paramName { + neConfig = v + break + } + } + return neConfig +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeConfig) SelectPage(query map[string]any) map[string]any { + return r.neConfigRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { + return r.neConfigRepository.SelectList(param) +} + +// SelectByIds 通过ID查询 +func (r *NeConfig) SelectById(id string) model.NeConfig { + if id == "" { + return model.NeConfig{} + } + neHosts := r.neConfigRepository.SelectByIds([]string{id}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeConfig{} +} + +// Insert 新增信息 +func (r *NeConfig) Insert(param model.NeConfig) string { + return r.neConfigRepository.Insert(param) +} + +// Update 修改信息 +func (r *NeConfig) Update(param model.NeConfig) int64 { + return r.neConfigRepository.Update(param) +} + +// DeleteByIds 批量删除信息 +func (r *NeConfig) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.neConfigRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("param.noData") + } + + if len(data) == len(ids) { + rows := r.neConfigRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_element/service/ne_config.impl.go b/src/modules/network_element/service/ne_config.impl.go deleted file mode 100644 index 120f5bf4..00000000 --- a/src/modules/network_element/service/ne_config.impl.go +++ /dev/null @@ -1,164 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "strings" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/redis" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// NewNeConfigImpl 网元参数配置可用属性值 实例化服务层 -var NewNeConfigImpl = &NeConfigImpl{ - neConfigRepository: repository.NewNeConfigImpl, -} - -// NeConfigImpl 网元参数配置可用属性值 服务层处理 -type NeConfigImpl struct { - // 网元参数配置可用属性值表 - neConfigRepository repository.INeConfig -} - -// RefreshByNeType 通过ne_type刷新redis中的缓存 -func (r *NeConfigImpl) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { - // 多个 - if neType == "" || neType == "*" { - neConfigList := r.neConfigRepository.SelectList(model.NeConfig{}) - if len(neConfigList) > 0 { - neConfigGroup := map[string][]model.NeConfig{} - for _, v := range neConfigList { - if item, ok := neConfigGroup[v.NeType]; ok { - neConfigGroup[v.NeType] = append(item, v) - } else { - neConfigGroup[v.NeType] = []model.NeConfig{v} - } - } - for k, v := range neConfigGroup { - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(k)) - redis.Del("", key) - if len(v) > 0 { - for i, item := range v { - if err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData); err != nil { - continue - } - v[i] = item - } - values, _ := json.Marshal(v) - redis.Set("", key, string(values)) - } - } - } - return neConfigList - } - // 单个 - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) - redis.Del("", key) - neConfigList := r.neConfigRepository.SelectList(model.NeConfig{ - NeType: neType, - }) - if len(neConfigList) > 0 { - for i, v := range neConfigList { - if err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData); err != nil { - continue - } - neConfigList[i] = v - } - values, _ := json.Marshal(neConfigList) - redis.Set("", key, string(values)) - } - return neConfigList -} - -// ClearNeCacheByNeType 清除网元类型参数配置缓存 -func (r *NeConfigImpl) ClearNeCacheByNeType(neType string) bool { - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, neType) - if neType == "*" { - key = fmt.Sprintf("%sNeConfig:*", cachekey.NE_DATA_KEY) - } - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// SelectNeConfigByNeType 查询网元类型参数配置 -func (r *NeConfigImpl) SelectNeConfigByNeType(neType string) []model.NeConfig { - var neConfigList []model.NeConfig - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &neConfigList) - if err != nil { - neConfigList = []model.NeConfig{} - } - } else { - neConfigList = r.RefreshByNeTypeAndNeID(neType) - } - return neConfigList -} - -// SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 -func (r *NeConfigImpl) SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig { - neConfigList := r.SelectNeConfigByNeType(neType) - var neConfig model.NeConfig - for _, v := range neConfigList { - if v.ParamName == paramName { - neConfig = v - break - } - } - return neConfig -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeConfigImpl) SelectPage(query map[string]any) map[string]any { - return r.neConfigRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeConfigImpl) SelectList(param model.NeConfig) []model.NeConfig { - return r.neConfigRepository.SelectList(param) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigImpl) SelectById(id string) model.NeConfig { - if id == "" { - return model.NeConfig{} - } - neHosts := r.neConfigRepository.SelectByIds([]string{id}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeConfig{} -} - -// Insert 新增信息 -func (r *NeConfigImpl) Insert(param model.NeConfig) string { - return r.neConfigRepository.Insert(param) -} - -// Update 修改信息 -func (r *NeConfigImpl) Update(param model.NeConfig) int64 { - return r.neConfigRepository.Update(param) -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.neConfigRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("param.noData") - } - - if len(data) == len(ids) { - rows := r.neConfigRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_element/service/ne_config_backup.go b/src/modules/network_element/service/ne_config_backup.go index 3f8239f6..9c2d6ba8 100644 --- a/src/modules/network_element/service/ne_config_backup.go +++ b/src/modules/network_element/service/ne_config_backup.go @@ -1,30 +1,201 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "os" + "runtime" + "strings" + "time" -// INeConfigBackup 网元配置文件备份记录 服务层接口 -type INeConfigBackup interface { - // SelectNeHostPage 分页查询列表数据 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(item model.NeConfigBackup) []model.NeConfigBackup - - // SelectByIds 通过ID查询 - SelectById(id string) model.NeConfigBackup - - // Insert 新增信息 - Insert(item model.NeConfigBackup) string - - // Update 修改信息 - Update(item model.NeConfigBackup) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // NeConfigLocalToNe 网元配置文件复制到网元端覆盖 - NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error - - // NeConfigNeToLocal 网元备份文件网元端复制到本地 - NeConfigNeToLocal(neInfo model.NeInfo) (string, error) +// 实例化服务层 NeConfigBackup 结构体 +var NewNeConfigBackup = &NeConfigBackup{ + neConfigBackupRepository: repository.NewNeConfigBackup, +} + +// NeConfigBackup 网元配置文件备份记录 服务层处理 +type NeConfigBackup struct { + neConfigBackupRepository *repository.NeConfigBackup // 网元配置文件备份记录 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any { + return r.neConfigBackupRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { + return r.neConfigBackupRepository.SelectList(item) +} + +// SelectByIds 通过ID查询 +func (r *NeConfigBackup) SelectById(id string) model.NeConfigBackup { + if id == "" { + return model.NeConfigBackup{} + } + arr := r.neConfigBackupRepository.SelectByIds([]string{id}) + if len(arr) > 0 { + return arr[0] + } + return model.NeConfigBackup{} +} + +// Insert 新增信息 +func (r *NeConfigBackup) Insert(item model.NeConfigBackup) string { + return r.neConfigBackupRepository.Insert(item) +} + +// Update 修改信息 +func (r *NeConfigBackup) Update(item model.NeConfigBackup) int64 { + return r.neConfigBackupRepository.Update(item) +} + +// DeleteByIds 批量删除信息 +func (r *NeConfigBackup) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.neConfigBackupRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("neConfigBackup.noData") + } + + if len(data) == len(ids) { + rows := r.neConfigBackupRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// NeConfigLocalToNe 网元配置文件复制到网元端覆盖 +func (r *NeConfigBackup) NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error { + neTypeLower := strings.ToLower(neInfo.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeId) + if err := file.UnZip(localFile, localDirPath); err != nil { + return fmt.Errorf("unzip err") + } + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + + // 网元配置端上的临时目录 + neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) + sshClient.RunCMD(fmt.Sprintf("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp)) + // 复制到网元端 + if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil { + return fmt.Errorf("copy config to ne err") + } + + // 配置复制到网元内 + if neTypeLower == "ims" { + // ims目录 + imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} + for _, v := range imsDirArr { + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/ims && sudo cp -rf %s/ims/%s /usr/local/etc/ims/%v && sudo chmod 755 -R /usr/local/etc/ims/%s", neDirTemp, v, v, v)) + } + // mf目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/mf && sudo cp -rf %s/mf/* /usr/local/etc/mf && sudo chmod 755 -R /usr/local/etc/mf", neDirTemp)) + // rtproxy目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/rtproxy && sudo cp -rf %s/rtproxy/* /usr/local/etc/rtproxy && sudo chmod 755 /usr/local/etc/rtproxy/rtproxy.conf", neDirTemp)) + // iwf目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/iwf && sudo cp -rf %s/iwf/* /usr/local/etc/iwf && sudo chmod 755 /usr/local/etc/iwf/*.yaml", neDirTemp)) + } else if neTypeLower == "omc" { + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/omc/etc && sudo cp -rf %s/* /usr/local/omc/etc && sudo chmod 755 /usr/local/omc/etc/*.{yaml,conf}", neDirTemp)) + } else { + neEtcPath := fmt.Sprintf("/usr/local/etc/%s", neTypeLower) + chmodFile := fmt.Sprintf("sudo chmod 755 %s/*.yaml", neEtcPath) + if neTypeLower == "mme" { + chmodFile = fmt.Sprintf("sudo chmod 755 %s/*.{yaml,conf}", neEtcPath) + } + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/* %s && %s", neDirTemp, neEtcPath, chmodFile)) + } + + _ = os.RemoveAll(localDirPath) // 删除本地临时目录 + sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 + return nil +} + +// NeConfigNeToLocal 网元备份文件网元端复制到本地 +func (r *NeConfigBackup) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) { + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return "", fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return "", fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + + neTypeLower := strings.ToLower(neInfo.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_export", omcPath, neTypeLower, neInfo.NeId) + + // 网元配置文件先复制到临时目录 + sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") + neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) + if neTypeLower == "ims" { + // ims目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/ims", neDirTemp)) + imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} + for _, v := range imsDirArr { + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf /usr/local/etc/ims/%s %s/ims", v, neDirTemp)) + } + // mf目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/mf && sudo cp -rf /usr/local/etc/mf %s", neDirTemp, neDirTemp)) + // rtproxy目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/rtproxy && sudo cp -rf /usr/local/etc/rtproxy/rtproxy.conf %s/rtproxy", neDirTemp, neDirTemp)) + // iwf目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/iwf && sudo cp -rf /usr/local/etc/iwf/*.yaml %s/iwf", neDirTemp, neDirTemp)) + } else if neTypeLower == "omc" { + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf /usr/local/omc/etc/*.{yaml,conf} %s", neDirTemp, neDirTemp)) + } else { + nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", neTypeLower) + if neTypeLower == "mme" { + nePath = fmt.Sprintf("/usr/local/etc/%s/*.{yaml,conf}", neTypeLower) + } + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", neDirTemp, nePath, neDirTemp)) + } + + // 网元端复制到本地 + if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirPath); err != nil { + return "", fmt.Errorf("copy config err") + } + + // 压缩zip文件名 + zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeId, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) + zipFilePath := fmt.Sprintf("%s/%s/%s/backup/%s", omcPath, neTypeLower, neInfo.NeId, zipFileName) + if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil { + return "", fmt.Errorf("compress zip err") + } + + _ = os.RemoveAll(localDirPath) // 删除本地临时目录 + sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 + return zipFilePath, nil } diff --git a/src/modules/network_element/service/ne_config_backup.impl.go b/src/modules/network_element/service/ne_config_backup.impl.go deleted file mode 100644 index f1eee5cb..00000000 --- a/src/modules/network_element/service/ne_config_backup.impl.go +++ /dev/null @@ -1,202 +0,0 @@ -package service - -import ( - "fmt" - "os" - "runtime" - "strings" - "time" - - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/file" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// NewNeConfigBackupImpl 网元配置文件备份记录 实例化服务层 -var NewNeConfigBackupImpl = &NeConfigBackupImpl{ - neConfigBackupRepository: repository.NewNeConfigBackupImpl, -} - -// NeConfigBackupImpl 网元配置文件备份记录 服务层处理 -type NeConfigBackupImpl struct { - // 网元配置文件备份记录 - neConfigBackupRepository repository.INeConfigBackup -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeConfigBackupImpl) SelectPage(query map[string]any) map[string]any { - return r.neConfigBackupRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeConfigBackupImpl) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { - return r.neConfigBackupRepository.SelectList(item) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigBackupImpl) SelectById(id string) model.NeConfigBackup { - if id == "" { - return model.NeConfigBackup{} - } - arr := r.neConfigBackupRepository.SelectByIds([]string{id}) - if len(arr) > 0 { - return arr[0] - } - return model.NeConfigBackup{} -} - -// Insert 新增信息 -func (r *NeConfigBackupImpl) Insert(item model.NeConfigBackup) string { - return r.neConfigBackupRepository.Insert(item) -} - -// Update 修改信息 -func (r *NeConfigBackupImpl) Update(item model.NeConfigBackup) int64 { - return r.neConfigBackupRepository.Update(item) -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigBackupImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.neConfigBackupRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("neConfigBackup.noData") - } - - if len(data) == len(ids) { - rows := r.neConfigBackupRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// NeConfigLocalToNe 网元配置文件复制到网元端覆盖 -func (r *NeConfigBackupImpl) NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error { - neTypeLower := strings.ToLower(neInfo.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeId) - if err := file.UnZip(localFile, localDirPath); err != nil { - return fmt.Errorf("unzip err") - } - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - - // 网元配置端上的临时目录 - neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) - sshClient.RunCMD(fmt.Sprintf("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp)) - // 复制到网元端 - if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil { - return fmt.Errorf("copy config to ne err") - } - - // 配置复制到网元内 - if neTypeLower == "ims" { - // ims目录 - imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} - for _, v := range imsDirArr { - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/ims && sudo cp -rf %s/ims/%s /usr/local/etc/ims/%v && sudo chmod 755 -R /usr/local/etc/ims/%s", neDirTemp, v, v, v)) - } - // mf目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/mf && sudo cp -rf %s/mf/* /usr/local/etc/mf && sudo chmod 755 -R /usr/local/etc/mf", neDirTemp)) - // rtproxy目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/rtproxy && sudo cp -rf %s/rtproxy/* /usr/local/etc/rtproxy && sudo chmod 755 /usr/local/etc/rtproxy/rtproxy.conf", neDirTemp)) - // iwf目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/iwf && sudo cp -rf %s/iwf/* /usr/local/etc/iwf && sudo chmod 755 /usr/local/etc/iwf/*.yaml", neDirTemp)) - } else if neTypeLower == "omc" { - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/omc/etc && sudo cp -rf %s/* /usr/local/omc/etc && sudo chmod 755 /usr/local/omc/etc/*.{yaml,conf}", neDirTemp)) - } else { - neEtcPath := fmt.Sprintf("/usr/local/etc/%s", neTypeLower) - chmodFile := fmt.Sprintf("sudo chmod 755 %s/*.yaml", neEtcPath) - if neTypeLower == "mme" { - chmodFile = fmt.Sprintf("sudo chmod 755 %s/*.{yaml,conf}", neEtcPath) - } - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/* %s && %s", neDirTemp, neEtcPath, chmodFile)) - } - - _ = os.RemoveAll(localDirPath) // 删除本地临时目录 - sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 - return nil -} - -// NeConfigNeToLocal 网元备份文件网元端复制到本地 -func (r *NeConfigBackupImpl) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) { - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return "", fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - - neTypeLower := strings.ToLower(neInfo.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_export", omcPath, neTypeLower, neInfo.NeId) - - // 网元配置文件先复制到临时目录 - sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") - neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) - if neTypeLower == "ims" { - // ims目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/ims", neDirTemp)) - imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} - for _, v := range imsDirArr { - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf /usr/local/etc/ims/%s %s/ims", v, neDirTemp)) - } - // mf目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/mf && sudo cp -rf /usr/local/etc/mf %s", neDirTemp, neDirTemp)) - // rtproxy目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/rtproxy && sudo cp -rf /usr/local/etc/rtproxy/rtproxy.conf %s/rtproxy", neDirTemp, neDirTemp)) - // iwf目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/iwf && sudo cp -rf /usr/local/etc/iwf/*.yaml %s/iwf", neDirTemp, neDirTemp)) - } else if neTypeLower == "omc" { - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf /usr/local/omc/etc/*.{yaml,conf} %s", neDirTemp, neDirTemp)) - } else { - nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", neTypeLower) - if neTypeLower == "mme" { - nePath = fmt.Sprintf("/usr/local/etc/%s/*.{yaml,conf}", neTypeLower) - } - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", neDirTemp, nePath, neDirTemp)) - } - - // 网元端复制到本地 - if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirPath); err != nil { - return "", fmt.Errorf("copy config err") - } - - // 压缩zip文件名 - zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeId, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) - zipFilePath := fmt.Sprintf("%s/%s/%s/backup/%s", omcPath, neTypeLower, neInfo.NeId, zipFileName) - if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil { - return "", fmt.Errorf("compress zip err") - } - - _ = os.RemoveAll(localDirPath) // 删除本地临时目录 - sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 - return zipFilePath, nil -} diff --git a/src/modules/network_element/service/ne_host.go b/src/modules/network_element/service/ne_host.go index 08f54432..c8ee1c29 100644 --- a/src/modules/network_element/service/ne_host.go +++ b/src/modules/network_element/service/ne_host.go @@ -1,30 +1,171 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" -// INeHost 网元主机连接 服务层接口 -type INeHost interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/crypto" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neHost model.NeHost) []model.NeHost - - // SelectById 通过ID查询 - SelectById(hostId string) model.NeHost - - // CheckUniqueHostTitle 校验分组组和主机名称是否唯一 - CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool - - // Insert 新增信息 - Insert(neHost model.NeHost) string - - // Update 修改信息 - Update(neHost model.NeHost) int64 - - // Insert 批量添加 - Inserts(neHosts []model.NeHost) int64 - - // DeleteByIds 批量删除网元主机连接信息 - DeleteByIds(hostIds []string) (int64, error) +// 实例化服务层 NeHost 结构体 +var NewNeHost = &NeHost{ + neHostRepository: repository.NewNeHost, +} + +// NeHost 网元主机连接 服务层处理 +type NeHost struct { + neHostRepository *repository.NeHost // 网元主机连接表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeHost) SelectPage(query map[string]any) map[string]any { + return r.neHostRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost { + return r.neHostRepository.SelectList(neHost) +} + +// SelectByIds 通过ID查询 +func (r *NeHost) SelectById(hostId string) model.NeHost { + neHost := model.NeHost{} + if hostId == "" { + return neHost + } + neHosts := r.neHostRepository.SelectByIds([]string{hostId}) + if len(neHosts) > 0 { + neHost := neHosts[0] + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordDe, err := crypto.AESDecryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.Password = passwordDe + } + if neHost.PrivateKey != "" { + privateKeyDe, err := crypto.AESDecryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.PrivateKey = privateKeyDe + } + if neHost.PassPhrase != "" { + passPhraseDe, err := crypto.AESDecryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.PassPhrase = passPhraseDe + } + return neHost + } + return model.NeHost{} +} + +// Insert 批量添加 +func (r *NeHost) Inserts(neHosts []model.NeHost) int64 { + var num int64 = 0 + for _, v := range neHosts { + hostId := r.neHostRepository.Insert(v) + if hostId != "" { + num += 1 + } + } + return num +} + +// Insert 新增信息 +func (r *NeHost) Insert(neHost model.NeHost) string { + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.Password = passwordEn + } + if neHost.PrivateKey != "" { + privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.PrivateKey = privateKeyEn + } + if neHost.PassPhrase != "" { + passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.PassPhrase = passPhraseEn + } + return r.neHostRepository.Insert(neHost) +} + +// Update 修改信息 +func (r *NeHost) Update(neHost model.NeHost) int64 { + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("update password encrypt: %v", err.Error()) + return 0 + } + neHost.Password = passwordEn + } + if neHost.PrivateKey != "" { + privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("update private key encrypt: %v", err.Error()) + return 0 + } + neHost.PrivateKey = privateKeyEn + } + if neHost.PassPhrase != "" { + passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("update pass phrase encrypt: %v", err.Error()) + return 0 + } + neHost.PassPhrase = passPhraseEn + } + return r.neHostRepository.Update(neHost) +} + +// DeleteByIds 批量删除网元主机连接信息 +func (r *NeHost) DeleteByIds(hostIds []string) (int64, error) { + // 检查是否存在 + ids := r.neHostRepository.SelectByIds(hostIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("neHost.noData") + } + + if len(ids) == len(hostIds) { + rows := r.neHostRepository.DeleteByIds(hostIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueHostTitle 校验分组组和主机名称是否唯一 +func (r *NeHost) CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool { + uniqueId := r.neHostRepository.CheckUniqueNeHost(model.NeHost{ + HostType: hostType, + GroupID: groupId, + Title: title, + }) + if uniqueId == hostId { + return true + } + return uniqueId == "" } diff --git a/src/modules/network_element/service/ne_host.impl.go b/src/modules/network_element/service/ne_host.impl.go deleted file mode 100644 index fa5fee26..00000000 --- a/src/modules/network_element/service/ne_host.impl.go +++ /dev/null @@ -1,172 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/framework/config" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/crypto" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeHostImpl 结构体 -var NewNeHostImpl = &NeHostImpl{ - neHostRepository: repository.NewNeHostImpl, -} - -// NeHostImpl 网元主机连接 服务层处理 -type NeHostImpl struct { - // 网元主机连接表 - neHostRepository repository.INeHost -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeHostImpl) SelectPage(query map[string]any) map[string]any { - return r.neHostRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeHostImpl) SelectList(neHost model.NeHost) []model.NeHost { - return r.neHostRepository.SelectList(neHost) -} - -// SelectByIds 通过ID查询 -func (r *NeHostImpl) SelectById(hostId string) model.NeHost { - neHost := model.NeHost{} - if hostId == "" { - return neHost - } - neHosts := r.neHostRepository.SelectByIds([]string{hostId}) - if len(neHosts) > 0 { - neHost := neHosts[0] - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordDe, err := crypto.AESDecryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.Password = passwordDe - } - if neHost.PrivateKey != "" { - privateKeyDe, err := crypto.AESDecryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.PrivateKey = privateKeyDe - } - if neHost.PassPhrase != "" { - passPhraseDe, err := crypto.AESDecryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.PassPhrase = passPhraseDe - } - return neHost - } - return model.NeHost{} -} - -// Insert 批量添加 -func (r *NeHostImpl) Inserts(neHosts []model.NeHost) int64 { - var num int64 = 0 - for _, v := range neHosts { - hostId := r.neHostRepository.Insert(v) - if hostId != "" { - num += 1 - } - } - return num -} - -// Insert 新增信息 -func (r *NeHostImpl) Insert(neHost model.NeHost) string { - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.Password = passwordEn - } - if neHost.PrivateKey != "" { - privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.PrivateKey = privateKeyEn - } - if neHost.PassPhrase != "" { - passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.PassPhrase = passPhraseEn - } - return r.neHostRepository.Insert(neHost) -} - -// Update 修改信息 -func (r *NeHostImpl) Update(neHost model.NeHost) int64 { - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("update password encrypt: %v", err.Error()) - return 0 - } - neHost.Password = passwordEn - } - if neHost.PrivateKey != "" { - privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("update private key encrypt: %v", err.Error()) - return 0 - } - neHost.PrivateKey = privateKeyEn - } - if neHost.PassPhrase != "" { - passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("update pass phrase encrypt: %v", err.Error()) - return 0 - } - neHost.PassPhrase = passPhraseEn - } - return r.neHostRepository.Update(neHost) -} - -// DeleteByIds 批量删除网元主机连接信息 -func (r *NeHostImpl) DeleteByIds(hostIds []string) (int64, error) { - // 检查是否存在 - ids := r.neHostRepository.SelectByIds(hostIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("neHost.noData") - } - - if len(ids) == len(hostIds) { - rows := r.neHostRepository.DeleteByIds(hostIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueHostTitle 校验分组组和主机名称是否唯一 -func (r *NeHostImpl) CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool { - uniqueId := r.neHostRepository.CheckUniqueNeHost(model.NeHost{ - HostType: hostType, - GroupID: groupId, - Title: title, - }) - if uniqueId == hostId { - return true - } - return uniqueId == "" -} diff --git a/src/modules/network_element/service/ne_host_cmd.go b/src/modules/network_element/service/ne_host_cmd.go index eaea5a35..1936848d 100644 --- a/src/modules/network_element/service/ne_host_cmd.go +++ b/src/modules/network_element/service/ne_host_cmd.go @@ -1,27 +1,79 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" -// INeHostCmd 网元主机命令 服务层接口 -type INeHostCmd interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd - - // SelectByIds 通过ID查询 - SelectById(cmdId string) model.NeHostCmd - - // Insert 新增信息 - Insert(neHostCmd model.NeHostCmd) string - - // Update 修改信息 - Update(neHostCmd model.NeHostCmd) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(cmdIds []string) (int64, error) - - // CheckUniqueGroupTitle 校验同类型组内是否唯一 - CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool +// 实例化服务层 NeHostCmd 结构体 +var NewNeHostCmd = &NeHostCmd{ + neHostCmdRepository: repository.NewNeHostCmd, +} + +// NeHostCmd 网元主机命令 服务层处理 +type NeHostCmd struct { + neHostCmdRepository *repository.NeHostCmd // 网元主机命令表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any { + return r.neHostCmdRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeHostCmd) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { + return r.neHostCmdRepository.SelectList(neHostCmd) +} + +// SelectByIds 通过ID查询 +func (r *NeHostCmd) SelectById(cmdId string) model.NeHostCmd { + if cmdId == "" { + return model.NeHostCmd{} + } + neHosts := r.neHostCmdRepository.SelectByIds([]string{cmdId}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeHostCmd{} +} + +// Insert 新增信息 +func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) string { + return r.neHostCmdRepository.Insert(neHostCmd) +} + +// Update 修改信息 +func (r *NeHostCmd) Update(neHostCmd model.NeHostCmd) int64 { + return r.neHostCmdRepository.Update(neHostCmd) +} + +// DeleteByIds 批量删除信息 +func (r *NeHostCmd) DeleteByIds(cmdIds []string) (int64, error) { + // 检查是否存在 + ids := r.neHostCmdRepository.SelectByIds(cmdIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("neHostCmd.noData") + } + + if len(ids) == len(cmdIds) { + rows := r.neHostCmdRepository.DeleteByIds(cmdIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueGroupTitle 校验同类型组内是否唯一 +func (r *NeHostCmd) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool { + uniqueId := r.neHostCmdRepository.CheckUniqueGroupTitle(model.NeHostCmd{ + CmdType: cmdType, + GroupID: groupId, + Title: title, + }) + if uniqueId == cmdId { + return true + } + return uniqueId == "" } diff --git a/src/modules/network_element/service/ne_host_cmd.impl.go b/src/modules/network_element/service/ne_host_cmd.impl.go deleted file mode 100644 index a38c9ba7..00000000 --- a/src/modules/network_element/service/ne_host_cmd.impl.go +++ /dev/null @@ -1,80 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeHostCmdImpl 结构体 -var NewNeHostCmdImpl = &NeHostCmdImpl{ - neHostCmdRepository: repository.NewNeHostCmdImpl, -} - -// NeHostCmdImpl 网元主机命令 服务层处理 -type NeHostCmdImpl struct { - // 网元主机命令表 - neHostCmdRepository repository.INeHostCmd -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeHostCmdImpl) SelectPage(query map[string]any) map[string]any { - return r.neHostCmdRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeHostCmdImpl) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { - return r.neHostCmdRepository.SelectList(neHostCmd) -} - -// SelectByIds 通过ID查询 -func (r *NeHostCmdImpl) SelectById(cmdId string) model.NeHostCmd { - if cmdId == "" { - return model.NeHostCmd{} - } - neHosts := r.neHostCmdRepository.SelectByIds([]string{cmdId}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeHostCmd{} -} - -// Insert 新增信息 -func (r *NeHostCmdImpl) Insert(neHostCmd model.NeHostCmd) string { - return r.neHostCmdRepository.Insert(neHostCmd) -} - -// Update 修改信息 -func (r *NeHostCmdImpl) Update(neHostCmd model.NeHostCmd) int64 { - return r.neHostCmdRepository.Update(neHostCmd) -} - -// DeleteByIds 批量删除信息 -func (r *NeHostCmdImpl) DeleteByIds(cmdIds []string) (int64, error) { - // 检查是否存在 - ids := r.neHostCmdRepository.SelectByIds(cmdIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("neHostCmd.noData") - } - - if len(ids) == len(cmdIds) { - rows := r.neHostCmdRepository.DeleteByIds(cmdIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueGroupTitle 校验同类型组内是否唯一 -func (r *NeHostCmdImpl) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool { - uniqueId := r.neHostCmdRepository.CheckUniqueGroupTitle(model.NeHostCmd{ - CmdType: cmdType, - GroupID: groupId, - Title: title, - }) - if uniqueId == cmdId { - return true - } - return uniqueId == "" -} diff --git a/src/modules/network_element/service/ne_info.go b/src/modules/network_element/service/ne_info.go index 94e08e63..2c70a697 100644 --- a/src/modules/network_element/service/ne_info.go +++ b/src/modules/network_element/service/ne_info.go @@ -1,72 +1,918 @@ package service import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/logger" + "be.ems/src/framework/redis" "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/parse" "be.ems/src/framework/utils/ssh" + neFetchlink "be.ems/src/modules/network_element/fetch_link" "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" ) -// 网元信息 服务层接口 -type INeInfo interface { - // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 - SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo - - // RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 - RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo - - // ClearNeCacheByNeType 清除网元类型缓存 - ClearNeCacheByNeType(neType string) bool - - // SelectNeInfoByRmuid 通过rmUID查询网元信息 - SelectNeInfoByRmuid(rmUid string) model.NeInfo - - // SelectPage 根据条件分页查询 - // - // bandStatus 带状态信息 - SelectPage(query map[string]any, bandStatus bool) map[string]any - - // SelectList 查询列表 - // - // bandStatus 带状态信息 - // bandHost 带主机信息 - SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo - - // SelectByIds 通过ID查询 - // - // bandStatus 带主机信息 - SelectById(infoId string, bandHost bool) model.NeInfo - - // Insert 新增信息 - Insert(neInfo model.NeInfo) string - - // Update 修改信息 - Update(neInfo model.NeInfo) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(infoIds []string) (int64, error) - - // CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 - CheckUniqueNeTypeAndNeId(neType, neId, id string) bool - - // NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() - NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) - - // NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 - NeRunSSHCmd(neType, neId, cmd string) (string, error) - - // NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() - // num 是网元主机telnet 1:4100 2:5200 - NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) - - // NeConfOAMReadSync 网元OAM配置文件读取 - NeConfOAMReadSync(neType, neId string) (map[string]any, error) - - // NeConfOAMWirteSync 网元OAM配置文件生成并同步 - NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error - - // NeConfPara5GRead 网元公共配置文件读取 - NeConfPara5GRead() (map[string]any, error) - - // NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId - NeConfPara5GWirte(content map[string]any, syncNE []string) error +// 实例化服务层 NeInfo 结构体 +var NewNeInfo = &NeInfo{ + neInfoRepository: repository.NewNeInfo, + Para5GData: map[string]string{}, +} + +// 网元信息 服务层处理 +type NeInfo struct { + // 网元信息数据信息 + neInfoRepository *repository.NeInfo + Para5GData map[string]string +} + +// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 +func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { + var neInfo model.NeInfo + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + err := json.Unmarshal([]byte(jsonStr), &neInfo) + if err != nil { + neInfo = model.NeInfo{} + } + } else { + neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) + if neInfo.ID != "" && neInfo.NeId == neID { + redis.Del("", key) + values, _ := json.Marshal(neInfo) + redis.Set("", key, string(values)) + } + } + return neInfo +} + +// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 +func (r *NeInfo) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { + var neInfo model.NeInfo + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) + redis.Del("", key) + neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) + if neInfo.ID != "" && neInfo.NeId == neID { + values, _ := json.Marshal(neInfo) + redis.Set("", key, string(values)) + } + return neInfo +} + +// ClearNeCacheByNeType 清除网元类型缓存 +func (r *NeInfo) ClearNeCacheByNeType(neType string) bool { + key := fmt.Sprintf("%s*", cachekey.NE_KEY) + if neType != "*" { + key = fmt.Sprintf("%s%s*", cachekey.NE_KEY, neType) + } + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + delOk, _ := redis.DelKeys("", keys) + return delOk +} + +// SelectNeInfoByRmuid 通过rmUID查询网元信息 +func (r *NeInfo) SelectNeInfoByRmuid(rmUid string) model.NeInfo { + var neInfo model.NeInfo + cacheKeys, _ := redis.GetKeys("", cachekey.NE_KEY+"*") + if len(cacheKeys) > 0 { + for _, key := range cacheKeys { + var v model.NeInfo + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + json.Unmarshal([]byte(jsonStr), &v) + } + if v.RmUID == rmUid { + neInfo = v + break + } + } + } else { + neInfos := r.SelectList(neInfo, false, false) + for _, v := range neInfos { + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(v.NeType), v.NeId) + redis.Del("", key) + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + if v.RmUID == rmUid { + neInfo = v + } + } + } + return neInfo +} + +// SelectPage 根据条件分页查询 +// +// bandStatus 带状态信息 +func (r *NeInfo) SelectPage(query map[string]any, bandStatus bool) map[string]any { + data := r.neInfoRepository.SelectPage(query) + + // 网元直连读取网元服务状态 + if bandStatus { + rows := data["rows"].([]model.NeInfo) + r.bandNeStatus(&rows) + } + + return data +} + +// SelectList 查询列表 +// +// bandStatus 带状态信息 +// bandHost 带主机信息 +func (r *NeInfo) SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo { + list := r.neInfoRepository.SelectList(ne) + + // 网元直连读取网元服务状态 + if bandStatus { + r.bandNeStatus(&list) + } + + // 网元主机信息 + if bandHost { + r.bandNeHosts(&list) + } + + return list +} + +// bandNeStatus 网元列表项数据带网元服务状态 +func (r *NeInfo) bandNeStatus(arr *[]model.NeInfo) { + for i := range *arr { + v := (*arr)[i] + result, err := neFetchlink.NeState(v) + if err != nil { + (*arr)[i].ServerState = map[string]any{ + "online": false, + } + // 网元状态设置为离线 + if v.Status != "0" { + v.Status = "0" + (*arr)[i].Status = v.Status + r.neInfoRepository.Update(v) + } + continue + } + result["online"] = true + (*arr)[i].ServerState = result + // 网元状态设置为在线 + if v.Status != "1" { + // 下发网管配置信息给网元 + _, err = neFetchlink.NeConfigOMC(v) + if err == nil { + v.Status = "1" + } else { + v.Status = "2" + } + (*arr)[i].Status = v.Status + r.neInfoRepository.Update(v) + } + } +} + +// bandNeHosts 网元列表项数据带网元主机信息 +func (r *NeInfo) bandNeHosts(arr *[]model.NeInfo) { + for i := range *arr { + v := (*arr)[i] + if v.HostIDs != "" { + hostIds := strings.Split(v.HostIDs, ",") + if len(hostIds) <= 1 { + continue + } + for _, hostId := range hostIds { + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + continue + } + (*arr)[i].Hosts = append((*arr)[i].Hosts, neHost) + } + } + } +} + +// SelectByIds 通过ID查询 +// +// bandHost 带主机信息 +func (r *NeInfo) SelectById(infoId string, bandHost bool) model.NeInfo { + if infoId == "" { + return model.NeInfo{} + } + neInfos := r.neInfoRepository.SelectByIds([]string{infoId}) + if len(neInfos) > 0 { + // 带主机信息 + if neInfos[0].HostIDs != "" && bandHost { + r.bandNeHosts(&neInfos) + } + return neInfos[0] + } + return model.NeInfo{} +} + +// Insert 新增信息 +func (r *NeInfo) Insert(neInfo model.NeInfo) string { + // 主机信息新增 + if neInfo.Hosts != nil { + var hostIDs []string + for _, host := range neInfo.Hosts { + host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) + host.GroupID = "1" + hostId := NewNeHost.Insert(host) + if hostId != "" { + hostIDs = append(hostIDs, hostId) + } + } + neInfo.HostIDs = strings.Join(hostIDs, ",") + } + + insertId := r.neInfoRepository.Insert(neInfo) + if insertId != "" { + // 刷新缓存 + r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + } + return insertId +} + +// Update 修改信息 +func (r *NeInfo) Update(neInfo model.NeInfo) int64 { + // 主机信息更新 + if neInfo.Hosts != nil { + for _, host := range neInfo.Hosts { + if host.HostID != "" { + host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) + host.GroupID = "1" + NewNeHost.Update(host) + } + } + } + + num := r.neInfoRepository.Update(neInfo) + if num > 0 { + // 刷新缓存 + r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + } + return num +} + +// DeleteByIds 批量删除信息 +func (r *NeInfo) DeleteByIds(infoIds []string) (int64, error) { + // 检查是否存在 + infos := r.neInfoRepository.SelectByIds(infoIds) + if len(infos) <= 0 { + return 0, fmt.Errorf("neHostCmd.noData") + } + + if len(infos) == len(infoIds) { + for _, v := range infos { + // 主机信息删除 + if v.HostIDs != "" { + NewNeHost.DeleteByIds(strings.Split(v.HostIDs, ",")) + } + // 删除License + neLicense := NewNeLicense.SelectByNeTypeAndNeID(v.NeType, v.NeId) + if neLicense.NeId == v.NeId { + NewNeLicense.DeleteByIds([]string{neLicense.ID}) + } + // 删除Version + neVersion := NewNeVersion.SelectByNeTypeAndNeID(v.NeType, v.NeId) + if neVersion.NeId == v.NeId { + NewNeVersion.DeleteByIds([]string{neVersion.ID}) + } + // 缓存信息删除 + redis.Del("", fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, v.NeType, v.NeId)) + } + rows := r.neInfoRepository.DeleteByIds(infoIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 +func (r *NeInfo) CheckUniqueNeTypeAndNeId(neType, neId, id string) bool { + uniqueId := r.neInfoRepository.CheckUniqueNeTypeAndNeId(model.NeInfo{ + NeType: neType, + NeId: neId, + }) + if uniqueId == id { + return true + } + return uniqueId == "" +} + +// NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() +func (r *NeInfo) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { + neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId { + logger.Errorf("NeRunSSHClient NeType:%s NeID:%s not found", neType, neId) + return nil, fmt.Errorf("neinfo not found") + } + // 取主机信息 + if neInfo.HostIDs == "" { + logger.Errorf("NeRunSSHClient NeType:%s NeID:%s hostId not found", neType, neId) + return nil, fmt.Errorf("neinfo hostId not found") + } + hostIds := strings.Split(neInfo.HostIDs, ",") + if len(hostIds) <= 1 { + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host id not found") + } + hostId := hostIds[0] // 网元主机ssh 0:22 + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host not found") + } + if neHost.HostType != "ssh" { + logger.Errorf("NeRunSSHClient Hosts first HostType %s not ssh", neHost.HostType) + return nil, fmt.Errorf("neinfo host type not ssh") + } + + var connSSH ssh.ConnSSH + neHost.CopyTo(&connSSH) + var client *ssh.ConnSSH + var err error + if neHost.AuthMode == "2" { + client, err = connSSH.NewClientByLocalPrivate() + } else { + client, err = connSSH.NewClient() + } + if err != nil { + logger.Errorf("NeRunSSHClient NewClient err => %s", err.Error()) + return nil, fmt.Errorf("neinfo ssh client new err") + } + return client, nil +} + +// NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 +func (r *NeInfo) NeRunSSHCmd(neType, neId, cmd string) (string, error) { + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return "", err + } + defer sshClient.Close() + + // 执行命令 + output, err := sshClient.RunCMD(cmd) + if err != nil { + logger.Errorf("NeRunSSHCmd RunCMD %s err => %s", output, err.Error()) + return "", fmt.Errorf("neinfo ssh run cmd err") + } + return output, nil +} + +// NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() +// num 是网元主机telnet 1:4100 2:5200 +func (r *NeInfo) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { + neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId { + logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s not found", neType, neId) + return nil, fmt.Errorf("neinfo not found") + } + // 取主机信息 + if neInfo.HostIDs == "" { + logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s hostId not found", neType, neId) + return nil, fmt.Errorf("neinfo hostId not found") + } + hostIds := strings.Split(neInfo.HostIDs, ",") + if len(hostIds) <= 1 { + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host id not found") + } + hostId := hostIds[num] // 网元主机telnet 1:4100 2:5200 + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host not found") + } + + // 创建链接Telnet客户端 + var connTelnet telnet.ConnTelnet + neHost.CopyTo(&connTelnet) + telnetClient, err := connTelnet.NewClient() + if err != nil { + logger.Errorf("NeRunTelnetClient NewClient err => %s", err.Error()) + return nil, fmt.Errorf("neinfo telnet client new err") + } + return telnetClient, nil +} + +// NeConfOAMReadSync 网元OAM配置文件读取 +func (r *NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { + oamData, err := r.neConfOAMRead(neType, neId, true) + if err != nil { + return nil, err + } + + // UPF和SMF 全小写的key + if _, ok := oamData["httpmanagecfg"]; ok { + content := map[string]any{} + // 网元HTTP服务 + // if v, ok := oamData["httpmanagecfg"]; ok { + // item := v.(map[string]any) + // } + // 对网管HTTP配置 + if v, ok := oamData["oamconfig"]; ok { + item := v.(map[string]any) + if v, ok := item["iptype"]; ok && v != "" && v != nil { + ipType := v.(string) + if ipType == "ipv6" { + content["omcIP"] = item["ipv6"] + } + if ipType == "ipv4" { + content["omcIP"] = item["ipv4"] + } + } + content["oamEnable"] = item["enable"] + content["oamPort"] = item["port"] + } + // 对网管SNMP配置 + if v, ok := oamData["snmpconfig"]; ok { + item := v.(map[string]any) + content["snmpEnable"] = item["enable"] + content["snmpPort"] = item["port"] + } + // 对网管KPI上报配置 + if v, ok := oamData["kpiconfig"]; ok { + item := v.(map[string]any) + content["kpiEnable"] = item["enable"] + content["kpiTimer"] = item["timer"] + } + + oamData := r.neConfOAMData() + r.neConfOAMWirte(neType, neId, oamData, false) + r.NeConfOAMWirteSync(model.NeInfo{ + NeType: neType, + NeId: neId, + }, content, false) + return r.neConfOAMRead(neType, neId, false) + } + + // NSSF和MME 配置KPIconfig名不一致时 + if v, ok := oamData["KPIconfig"]; ok && v != nil { + item := v.(map[string]any) + oamData["kpiConfig"] = item + delete(oamData, "KPIconfig") + r.neConfOAMWirte(neType, neId, oamData, false) + } + + return oamData, nil +} + +// neConfOAMData 网元OAM配置文件默认格式数据 +func (r *NeInfo) neConfOAMData() map[string]any { + return map[string]any{ + "httpManageCfg": map[string]any{ + "ipType": "ipv4", + "ipv4": "172.16.5.1", // 必改 + "ipv6": "", + "port": 33030, + "scheme": "http", + }, + "oamConfig": map[string]any{ + "enable": true, + "ipType": "ipv4", + "ipv4": "172.16.5.100", // 必改 + "ipv6": "", + "port": 33030, + "scheme": "http", + // 必改 + "neConfig": map[string]any{ + "neId": "001", + "rmUid": "4400HX1XXX001", + "neName": "XXX_001", + "dn": "-", + "vendorName": "GD", + "province": "-", + "pvFlag": "PNF", + }, + }, + "snmpConfig": map[string]any{ + "enable": false, + "ipType": "ipv4", + "ipv4": "172.16.5.1", // 必改 + "ipv6": "", + "port": 4957, + }, + "kpiConfig": map[string]any{ + "enable": true, + "timer": 60, // 必改 + }, + // "pubConfigPath": "/usr/local/etc/conf/para5G.yaml", // 网元只会读一次后续会置空,建议不放 + } +} + +// neConfOAMRead 网元OAM配置文件读取 sync从网元端同步到本地 +func (r *NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) { + neTypeLower := strings.ToLower(neType) + fileName := "oam_manager.yaml" + // 网管本地路径 + localFilePath := fmt.Sprintf("/usr/local/etc/omc/ne_config/%s/%s/%s", neTypeLower, neId, fileName) + if runtime.GOOS == "windows" { + localFilePath = fmt.Sprintf("C:%s", localFilePath) + } + + // 从网元端同步到本地 + if sync { + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return nil, fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return nil, fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + // 网元端文件路径 + neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo touch %s && sudo chmod o+rw %s", neFilePath, neFilePath)) + // 网元端复制到本地 + if err = sftpClient.CopyFileRemoteToLocal(neFilePath, localFilePath); err != nil { + return nil, fmt.Errorf("copy oam config err") + } + } + + // 读取文件内容 + bytes, err := os.ReadFile(localFilePath) + if err != nil { + // logger.Warnf("NeConfOAMRead ReadFile => %s", err.Error()) + // return nil, fmt.Errorf("read file error") + // 无保留文件时返回默认文件数据 + oamData := r.neConfOAMData() + r.neConfOAMWirte(neType, neId, oamData, false) + return oamData, nil + } + content := string(bytes) + + // 序列化Map + mapData, err := parse.ConvertConfigToMap("yaml", content) + if err != nil { + logger.Warnf("NeConfOAMRead ConvertConfigToMap => %s", err.Error()) + return nil, fmt.Errorf("content convert type error") + } + return mapData, nil +} + +// neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端 +func (r *NeInfo) neConfOAMWirte(neType, neId string, content any, sync bool) error { + neTypeLower := strings.ToLower(neType) + fileName := "oam_manager.yaml" + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neId, fileName) + + // 写入文件 + if err := parse.ConvertConfigToFile("yaml", localFilePath, content); err != nil { + return fmt.Errorf("please check if the file exists or write permissions") + } + + // 同步到网元端 + if sync { + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return err + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return err + } + defer sftpClient.Close() + + // 网元端配置路径 + neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) + neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) + // 复制到网元进行覆盖 + if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { + return fmt.Errorf("please check if scp remote copy is allowed") + } + } + + return nil +} + +// NeConfOAMWirteSync 网元OAM配置文件生成并同步 +func (r *NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error { + oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId, false) + if oamData == nil || err != nil { + return fmt.Errorf("error read OAM file info") + } + // 网元HTTP服务 + if v, ok := oamData["httpManageCfg"]; ok { + item := v.(map[string]any) + item["port"] = neInfo.Port + if strings.Contains(neInfo.IP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = neInfo.IP + } + if strings.Contains(neInfo.IP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = neInfo.IP + } + + oamData["httpManageCfg"] = item + } + // 对网管HTTP配置 + if v, ok := oamData["oamConfig"]; ok { + item := v.(map[string]any) + item["neConfig"] = map[string]string{ + "neId": neInfo.NeId, + "rmUid": neInfo.RmUID, + "neName": neInfo.NeName, + "dn": neInfo.Dn, + "vendorName": neInfo.VendorName, + "province": neInfo.Province, + "pvFlag": neInfo.PvFlag, + } + + // 公共参数指定的OMC + if omcIP, ok := r.Para5GData["OMC_IP"]; ok && omcIP != "" { + if strings.Contains(omcIP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = omcIP + } + if strings.Contains(omcIP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = omcIP + } + } + + if v, ok := content["omcIP"]; ok && v != "" && v != nil { + omcIP := v.(string) + if strings.Contains(omcIP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = omcIP + } + if strings.Contains(omcIP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = omcIP + } + } + if oamEnable, ok := content["oamEnable"]; ok && oamEnable != nil { + item["enable"] = parse.Boolean(oamEnable) + } + if oamPort, ok := content["oamPort"]; ok && oamPort != nil { + item["port"] = parse.Number(oamPort) + } + oamData["oamConfig"] = item + } + // 对网管SNMP配置 + if v, ok := oamData["snmpConfig"]; ok { + item := v.(map[string]any) + if strings.Contains(neInfo.IP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = neInfo.IP + } + if strings.Contains(neInfo.IP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = neInfo.IP + } + + if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil { + item["enable"] = parse.Boolean(snmpEnable) + } + if snmpPort, ok := content["snmpPort"]; ok && snmpPort != nil { + item["port"] = parse.Number(snmpPort) + } + oamData["snmpConfig"] = item + } + // 对网管KPI上报配置 + if v, ok := oamData["kpiConfig"]; ok { + item := v.(map[string]any) + if neInfo.NeType == "UPF" { + item["timer"] = 5 + } else { + item["timer"] = 60 + } + + if kpiEnable, ok := content["kpiEnable"]; ok && kpiEnable != nil { + item["enable"] = parse.Boolean(kpiEnable) + } + if kpiTimer, ok := content["kpiTimer"]; ok && kpiTimer != nil { + item["timer"] = parse.Number(kpiTimer) + } + oamData["kpiConfig"] = item + } + if err := r.neConfOAMWirte(neInfo.NeType, neInfo.NeId, oamData, sync); err != nil { + return fmt.Errorf("error wirte OAM file info") + } + return nil +} + +// NeConfPara5GRead 网元公共配置文件读取 +func (r *NeInfo) NeConfPara5GRead() (map[string]any, error) { + // 网管本地路径 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + // 读取文件内容 + bytes, err := os.ReadFile(omcFilePath) + if err != nil { + logger.Warnf("NeConfPara5GRead ReadFile => %s", err.Error()) + return nil, fmt.Errorf("read file error") + } + content := string(bytes) + + // 序列化Map + mapData, err := parse.ConvertConfigToMap("yaml", content) + if err != nil { + logger.Warnf("NeConfPara5GRead ConvertConfigToMap => %s", err.Error()) + return nil, fmt.Errorf("content convert type error") + } + return mapData, nil +} + +// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId +func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) error { + // 网管本地路径 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + + if err := parse.ConvertConfigToFile("yaml", omcFilePath, content); err != nil { + return fmt.Errorf("please check if the file exists or write permissions") + } + + // 同步到网元端 + if len(syncNE) > 0 { + errMsg := []string{} + for _, neTI := range syncNE { + ti := strings.SplitN(neTI, "@", 2) + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(ti[0], ti[1]) + if err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) + continue + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) + continue + } + defer sftpClient.Close() + + // 网元端配置路径 + neFilePath := "/usr/local/etc/conf/para5G.yaml" + neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) + // 复制到网元进行覆盖 + if err = sftpClient.CopyFileLocalToRemote(omcFilePath, neFilePath); err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : please check if scp remote copy is allowed", ti)) + continue + } + } + if len(errMsg) > 0 { + return fmt.Errorf("%s", strings.Join(errMsg, "\r\n")) + } + } + + // 转换一份数据到全局 + r.Para5GData = r.neConfPara5GDataConvert(content) + return nil +} + +// NeConfPara5GConvert 网元公共配置数据转化 content网元公共配置文件读取内容 +func (r *NeInfo) neConfPara5GDataConvert(content map[string]any) map[string]string { + defer func() { + if err := recover(); err != nil { + logger.Errorf("NeConfPara5GDataConvert panic: %v", err) + // 文件异常就删除配置 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + os.Remove(omcFilePath) + } + }() + + basic := content["basic"].(map[string]any) + external := content["external"].(map[string]any) + sbi := content["sbi"].(map[string]any) + + mcc := "460" + mnc := "01" + mncDomain := "001" + if plmnId, plmnIdOk := basic["plmnId"].(map[string]any); plmnIdOk { + mcc = plmnId["mcc"].(string) + mnc = plmnId["mnc"].(string) + // If a user input two digit MNC, add a leading zero + if len(mnc) == 2 { + mncDomain = fmt.Sprintf("0%s", mnc) + } else { + mncDomain = mnc + } + } + + sst := "1" + sd := "000001" + if plmnId, plmnIdOk := basic["snssai"].(map[string]any); plmnIdOk { + sst = plmnId["sst"].(string) + sd = plmnId["sd"].(string) + } + + n3IPAmdMask := external["upfn3_ip"].(string) + n3Arr := strings.SplitN(n3IPAmdMask, "/", 2) + n3IP := n3Arr[0] + n3Mask := "255.255.255.0" + if len(n3Arr) > 1 { + n3Mask = parse.ConvertIPMask(parse.Number(n3Arr[1])) + } + + n6IPAmdMask := external["upfn6_ip"].(string) + n6Arr := strings.SplitN(n6IPAmdMask, "/", 2) + n6IP := n6Arr[0] + n6Mask := "255.255.255.0" + if len(n6Arr) > 1 { + n6Mask = parse.ConvertIPMask(parse.Number(n6Arr[1])) + } + + ueIPAmdMask := external["ue_pool"].(string) + ueArr := strings.SplitN(ueIPAmdMask, "/", 2) + ueIP := ueArr[0] + ueCicr := "24" + ueMask := "255.255.255.0" + if len(ueArr) > 1 { + ueCicr = ueArr[1] + ueMask = parse.ConvertIPMask(parse.Number(ueArr[1])) + } + + return map[string]string{ + // basic + "TAC": basic["tac"].(string), + "MCC": mcc, + "MNC": mnc, + "MNC_DOMAIN": mncDomain, + "SST": sst, + "SD": sd, + "DNN_DATA": basic["dnn_data"].(string), + "DNN_IMS": basic["dnn_ims"].(string), + + // external + "N2_IP": external["amfn2_ip"].(string), + "UE_POOL": external["ue_pool"].(string), + "UE_IP": ueIP, + "UE_MASK": ueMask, + "UE_CIDR": ueCicr, + "UPF_TYPE": external["upf_type"].(string), // StandardUPF LightUPF + "N3_IP": n3IP, + "N3_MASK": n3Mask, + "N3_GW": external["upfn3_gw"].(string), + "N3_PCI": external["upfn3_pci"].(string), + "N3_MAC": external["upfn3_mac"].(string), + "N6_IP": n6IP, + "N6_MASK": n6Mask, + "N6_GW": external["upfn6_gw"].(string), + "N6_PCI": external["upfn6_pci"].(string), + "N6_MAC": external["upfn6_mac"].(string), + + "SIP_IP": external["ims_sip_ip"].(string), + + "S1_MMEIP": external["mmes1_ip"].(string), + "S11_MMEIP": external["mmes11_ip"].(string), + "S10_MMEIP": external["mmes10_ip"].(string), + + // sbi + "OMC_IP": sbi["omc_ip"].(string), + "IMS_IP": sbi["ims_ip"].(string), + "AMF_IP": sbi["amf_ip"].(string), + "AUSF_IP": sbi["ausf_ip"].(string), + "UDM_IP": sbi["udm_ip"].(string), + "SMF_IP": sbi["smf_ip"].(string), + "PCF_IP": sbi["pcf_ip"].(string), + "NSSF_IP": sbi["nssf_ip"].(string), + "NRF_IP": sbi["nrf_ip"].(string), + "UPF_IP": sbi["upf_ip"].(string), + "LMF_IP": sbi["lmf_ip"].(string), + "NEF_IP": sbi["nef_ip"].(string), + "MME_IP": sbi["mme_ip"].(string), + "N3IWF_IP": sbi["n3iwf_ip"].(string), + "SMSC_IP": sbi["smsc_ip"].(string), + + "DB_IP": sbi["db_ip"].(string), + } } diff --git a/src/modules/network_element/service/ne_info.impl.go b/src/modules/network_element/service/ne_info.impl.go deleted file mode 100644 index 9a12e47c..00000000 --- a/src/modules/network_element/service/ne_info.impl.go +++ /dev/null @@ -1,918 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/logger" - "be.ems/src/framework/redis" - "be.ems/src/framework/telnet" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/ssh" - neFetchlink "be.ems/src/modules/network_element/fetch_link" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeInfoImpl 结构体 -var NewNeInfoImpl = &NeInfoImpl{ - neInfoRepository: repository.NewNeInfoImpl, - Para5GData: map[string]string{}, -} - -// 网元信息 服务层处理 -type NeInfoImpl struct { - // 网元信息数据信息 - neInfoRepository repository.INeInfo - Para5GData map[string]string -} - -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { - var neInfo model.NeInfo - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &neInfo) - if err != nil { - neInfo = model.NeInfo{} - } - } else { - neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) - if neInfo.ID != "" && neInfo.NeId == neID { - redis.Del("", key) - values, _ := json.Marshal(neInfo) - redis.Set("", key, string(values)) - } - } - return neInfo -} - -// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 -func (r *NeInfoImpl) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { - var neInfo model.NeInfo - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) - redis.Del("", key) - neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) - if neInfo.ID != "" && neInfo.NeId == neID { - values, _ := json.Marshal(neInfo) - redis.Set("", key, string(values)) - } - return neInfo -} - -// ClearNeCacheByNeType 清除网元类型缓存 -func (r *NeInfoImpl) ClearNeCacheByNeType(neType string) bool { - key := fmt.Sprintf("%s*", cachekey.NE_KEY) - if neType != "*" { - key = fmt.Sprintf("%s%s*", cachekey.NE_KEY, neType) - } - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// SelectNeInfoByRmuid 通过rmUID查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByRmuid(rmUid string) model.NeInfo { - var neInfo model.NeInfo - cacheKeys, _ := redis.GetKeys("", cachekey.NE_KEY+"*") - if len(cacheKeys) > 0 { - for _, key := range cacheKeys { - var v model.NeInfo - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - json.Unmarshal([]byte(jsonStr), &v) - } - if v.RmUID == rmUid { - neInfo = v - break - } - } - } else { - neInfos := r.SelectList(neInfo, false, false) - for _, v := range neInfos { - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(v.NeType), v.NeId) - redis.Del("", key) - values, _ := json.Marshal(v) - redis.Set("", key, string(values)) - if v.RmUID == rmUid { - neInfo = v - } - } - } - return neInfo -} - -// SelectPage 根据条件分页查询 -// -// bandStatus 带状态信息 -func (r *NeInfoImpl) SelectPage(query map[string]any, bandStatus bool) map[string]any { - data := r.neInfoRepository.SelectPage(query) - - // 网元直连读取网元服务状态 - if bandStatus { - rows := data["rows"].([]model.NeInfo) - r.bandNeStatus(&rows) - } - - return data -} - -// SelectList 查询列表 -// -// bandStatus 带状态信息 -// bandHost 带主机信息 -func (r *NeInfoImpl) SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo { - list := r.neInfoRepository.SelectList(ne) - - // 网元直连读取网元服务状态 - if bandStatus { - r.bandNeStatus(&list) - } - - // 网元主机信息 - if bandHost { - r.bandNeHosts(&list) - } - - return list -} - -// bandNeStatus 网元列表项数据带网元服务状态 -func (r *NeInfoImpl) bandNeStatus(arr *[]model.NeInfo) { - for i := range *arr { - v := (*arr)[i] - result, err := neFetchlink.NeState(v) - if err != nil { - (*arr)[i].ServerState = map[string]any{ - "online": false, - } - // 网元状态设置为离线 - if v.Status != "0" { - v.Status = "0" - (*arr)[i].Status = v.Status - r.neInfoRepository.Update(v) - } - continue - } - result["online"] = true - (*arr)[i].ServerState = result - // 网元状态设置为在线 - if v.Status != "1" { - // 下发网管配置信息给网元 - _, err = neFetchlink.NeConfigOMC(v) - if err == nil { - v.Status = "1" - } else { - v.Status = "2" - } - (*arr)[i].Status = v.Status - r.neInfoRepository.Update(v) - } - } -} - -// bandNeHosts 网元列表项数据带网元主机信息 -func (r *NeInfoImpl) bandNeHosts(arr *[]model.NeInfo) { - for i := range *arr { - v := (*arr)[i] - if v.HostIDs != "" { - hostIds := strings.Split(v.HostIDs, ",") - if len(hostIds) <= 1 { - continue - } - for _, hostId := range hostIds { - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - continue - } - (*arr)[i].Hosts = append((*arr)[i].Hosts, neHost) - } - } - } -} - -// SelectByIds 通过ID查询 -// -// bandHost 带主机信息 -func (r *NeInfoImpl) SelectById(infoId string, bandHost bool) model.NeInfo { - if infoId == "" { - return model.NeInfo{} - } - neInfos := r.neInfoRepository.SelectByIds([]string{infoId}) - if len(neInfos) > 0 { - // 带主机信息 - if neInfos[0].HostIDs != "" && bandHost { - r.bandNeHosts(&neInfos) - } - return neInfos[0] - } - return model.NeInfo{} -} - -// Insert 新增信息 -func (r *NeInfoImpl) Insert(neInfo model.NeInfo) string { - // 主机信息新增 - if neInfo.Hosts != nil { - var hostIDs []string - for _, host := range neInfo.Hosts { - host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) - host.GroupID = "1" - hostId := NewNeHostImpl.Insert(host) - if hostId != "" { - hostIDs = append(hostIDs, hostId) - } - } - neInfo.HostIDs = strings.Join(hostIDs, ",") - } - - insertId := r.neInfoRepository.Insert(neInfo) - if insertId != "" { - // 刷新缓存 - r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - } - return insertId -} - -// Update 修改信息 -func (r *NeInfoImpl) Update(neInfo model.NeInfo) int64 { - // 主机信息更新 - if neInfo.Hosts != nil { - for _, host := range neInfo.Hosts { - if host.HostID != "" { - host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) - host.GroupID = "1" - NewNeHostImpl.Update(host) - } - } - } - - num := r.neInfoRepository.Update(neInfo) - if num > 0 { - // 刷新缓存 - r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - } - return num -} - -// DeleteByIds 批量删除信息 -func (r *NeInfoImpl) DeleteByIds(infoIds []string) (int64, error) { - // 检查是否存在 - infos := r.neInfoRepository.SelectByIds(infoIds) - if len(infos) <= 0 { - return 0, fmt.Errorf("neHostCmd.noData") - } - - if len(infos) == len(infoIds) { - for _, v := range infos { - // 主机信息删除 - if v.HostIDs != "" { - NewNeHostImpl.DeleteByIds(strings.Split(v.HostIDs, ",")) - } - // 删除License - neLicense := NewNeLicenseImpl.SelectByNeTypeAndNeID(v.NeType, v.NeId) - if neLicense.NeId == v.NeId { - NewNeLicenseImpl.DeleteByIds([]string{neLicense.ID}) - } - // 删除Version - neVersion := NewNeVersion.SelectByNeTypeAndNeID(v.NeType, v.NeId) - if neVersion.NeId == v.NeId { - NewNeVersion.DeleteByIds([]string{neVersion.ID}) - } - // 缓存信息删除 - redis.Del("", fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, v.NeType, v.NeId)) - } - rows := r.neInfoRepository.DeleteByIds(infoIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 -func (r *NeInfoImpl) CheckUniqueNeTypeAndNeId(neType, neId, id string) bool { - uniqueId := r.neInfoRepository.CheckUniqueNeTypeAndNeId(model.NeInfo{ - NeType: neType, - NeId: neId, - }) - if uniqueId == id { - return true - } - return uniqueId == "" -} - -// NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() -func (r *NeInfoImpl) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { - logger.Errorf("NeRunSSHClient NeType:%s NeID:%s not found", neType, neId) - return nil, fmt.Errorf("neinfo not found") - } - // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunSSHClient NeType:%s NeID:%s hostId not found", neType, neId) - return nil, fmt.Errorf("neinfo hostId not found") - } - hostIds := strings.Split(neInfo.HostIDs, ",") - if len(hostIds) <= 1 { - logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host id not found") - } - hostId := hostIds[0] // 网元主机ssh 0:22 - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host not found") - } - if neHost.HostType != "ssh" { - logger.Errorf("NeRunSSHClient Hosts first HostType %s not ssh", neHost.HostType) - return nil, fmt.Errorf("neinfo host type not ssh") - } - - var connSSH ssh.ConnSSH - neHost.CopyTo(&connSSH) - var client *ssh.ConnSSH - var err error - if neHost.AuthMode == "2" { - client, err = connSSH.NewClientByLocalPrivate() - } else { - client, err = connSSH.NewClient() - } - if err != nil { - logger.Errorf("NeRunSSHClient NewClient err => %s", err.Error()) - return nil, fmt.Errorf("neinfo ssh client new err") - } - return client, nil -} - -// NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 -func (r *NeInfoImpl) NeRunSSHCmd(neType, neId, cmd string) (string, error) { - sshClient, err := r.NeRunSSHClient(neType, neId) - if err != nil { - return "", err - } - defer sshClient.Close() - - // 执行命令 - output, err := sshClient.RunCMD(cmd) - if err != nil { - logger.Errorf("NeRunSSHCmd RunCMD %s err => %s", output, err.Error()) - return "", fmt.Errorf("neinfo ssh run cmd err") - } - return output, nil -} - -// NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() -// num 是网元主机telnet 1:4100 2:5200 -func (r *NeInfoImpl) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { - logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s not found", neType, neId) - return nil, fmt.Errorf("neinfo not found") - } - // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s hostId not found", neType, neId) - return nil, fmt.Errorf("neinfo hostId not found") - } - hostIds := strings.Split(neInfo.HostIDs, ",") - if len(hostIds) <= 1 { - logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host id not found") - } - hostId := hostIds[num] // 网元主机telnet 1:4100 2:5200 - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host not found") - } - - // 创建链接Telnet客户端 - var connTelnet telnet.ConnTelnet - neHost.CopyTo(&connTelnet) - telnetClient, err := connTelnet.NewClient() - if err != nil { - logger.Errorf("NeRunTelnetClient NewClient err => %s", err.Error()) - return nil, fmt.Errorf("neinfo telnet client new err") - } - return telnetClient, nil -} - -// NeConfOAMReadSync 网元OAM配置文件读取 -func (r *NeInfoImpl) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { - oamData, err := r.neConfOAMRead(neType, neId, true) - if err != nil { - return nil, err - } - - // UPF和SMF 全小写的key - if _, ok := oamData["httpmanagecfg"]; ok { - content := map[string]any{} - // 网元HTTP服务 - // if v, ok := oamData["httpmanagecfg"]; ok { - // item := v.(map[string]any) - // } - // 对网管HTTP配置 - if v, ok := oamData["oamconfig"]; ok { - item := v.(map[string]any) - if v, ok := item["iptype"]; ok && v != "" && v != nil { - ipType := v.(string) - if ipType == "ipv6" { - content["omcIP"] = item["ipv6"] - } - if ipType == "ipv4" { - content["omcIP"] = item["ipv4"] - } - } - content["oamEnable"] = item["enable"] - content["oamPort"] = item["port"] - } - // 对网管SNMP配置 - if v, ok := oamData["snmpconfig"]; ok { - item := v.(map[string]any) - content["snmpEnable"] = item["enable"] - content["snmpPort"] = item["port"] - } - // 对网管KPI上报配置 - if v, ok := oamData["kpiconfig"]; ok { - item := v.(map[string]any) - content["kpiEnable"] = item["enable"] - content["kpiTimer"] = item["timer"] - } - - oamData := r.neConfOAMData() - r.neConfOAMWirte(neType, neId, oamData, false) - r.NeConfOAMWirteSync(model.NeInfo{ - NeType: neType, - NeId: neId, - }, content, false) - return r.neConfOAMRead(neType, neId, false) - } - - // NSSF和MME 配置KPIconfig名不一致时 - if v, ok := oamData["KPIconfig"]; ok && v != nil { - item := v.(map[string]any) - oamData["kpiConfig"] = item - delete(oamData, "KPIconfig") - r.neConfOAMWirte(neType, neId, oamData, false) - } - - return oamData, nil -} - -// neConfOAMData 网元OAM配置文件默认格式数据 -func (r *NeInfoImpl) neConfOAMData() map[string]any { - return map[string]any{ - "httpManageCfg": map[string]any{ - "ipType": "ipv4", - "ipv4": "172.16.5.1", // 必改 - "ipv6": "", - "port": 33030, - "scheme": "http", - }, - "oamConfig": map[string]any{ - "enable": true, - "ipType": "ipv4", - "ipv4": "172.16.5.100", // 必改 - "ipv6": "", - "port": 33030, - "scheme": "http", - // 必改 - "neConfig": map[string]any{ - "neId": "001", - "rmUid": "4400HX1XXX001", - "neName": "XXX_001", - "dn": "-", - "vendorName": "GD", - "province": "-", - "pvFlag": "PNF", - }, - }, - "snmpConfig": map[string]any{ - "enable": false, - "ipType": "ipv4", - "ipv4": "172.16.5.1", // 必改 - "ipv6": "", - "port": 4957, - }, - "kpiConfig": map[string]any{ - "enable": true, - "timer": 60, // 必改 - }, - // "pubConfigPath": "/usr/local/etc/conf/para5G.yaml", // 网元只会读一次后续会置空,建议不放 - } -} - -// neConfOAMRead 网元OAM配置文件读取 sync从网元端同步到本地 -func (r *NeInfoImpl) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) { - neTypeLower := strings.ToLower(neType) - fileName := "oam_manager.yaml" - // 网管本地路径 - localFilePath := fmt.Sprintf("/usr/local/etc/omc/ne_config/%s/%s/%s", neTypeLower, neId, fileName) - if runtime.GOOS == "windows" { - localFilePath = fmt.Sprintf("C:%s", localFilePath) - } - - // 从网元端同步到本地 - if sync { - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neType, neId) - if err != nil { - return nil, fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return nil, fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - // 网元端文件路径 - neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo touch %s && sudo chmod o+rw %s", neFilePath, neFilePath)) - // 网元端复制到本地 - if err = sftpClient.CopyFileRemoteToLocal(neFilePath, localFilePath); err != nil { - return nil, fmt.Errorf("copy oam config err") - } - } - - // 读取文件内容 - bytes, err := os.ReadFile(localFilePath) - if err != nil { - // logger.Warnf("NeConfOAMRead ReadFile => %s", err.Error()) - // return nil, fmt.Errorf("read file error") - // 无保留文件时返回默认文件数据 - oamData := r.neConfOAMData() - r.neConfOAMWirte(neType, neId, oamData, false) - return oamData, nil - } - content := string(bytes) - - // 序列化Map - mapData, err := parse.ConvertConfigToMap("yaml", content) - if err != nil { - logger.Warnf("NeConfOAMRead ConvertConfigToMap => %s", err.Error()) - return nil, fmt.Errorf("content convert type error") - } - return mapData, nil -} - -// neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端 -func (r *NeInfoImpl) neConfOAMWirte(neType, neId string, content any, sync bool) error { - neTypeLower := strings.ToLower(neType) - fileName := "oam_manager.yaml" - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neId, fileName) - - // 写入文件 - if err := parse.ConvertConfigToFile("yaml", localFilePath, content); err != nil { - return fmt.Errorf("please check if the file exists or write permissions") - } - - // 同步到网元端 - if sync { - // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(neType, neId) - if err != nil { - return err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return err - } - defer sftpClient.Close() - - // 网元端配置路径 - neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) - neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) - // 复制到网元进行覆盖 - if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { - return fmt.Errorf("please check if scp remote copy is allowed") - } - } - - return nil -} - -// NeConfOAMWirteSync 网元OAM配置文件生成并同步 -func (r *NeInfoImpl) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error { - oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId, false) - if oamData == nil || err != nil { - return fmt.Errorf("error read OAM file info") - } - // 网元HTTP服务 - if v, ok := oamData["httpManageCfg"]; ok { - item := v.(map[string]any) - item["port"] = neInfo.Port - if strings.Contains(neInfo.IP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = neInfo.IP - } - if strings.Contains(neInfo.IP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = neInfo.IP - } - - oamData["httpManageCfg"] = item - } - // 对网管HTTP配置 - if v, ok := oamData["oamConfig"]; ok { - item := v.(map[string]any) - item["neConfig"] = map[string]string{ - "neId": neInfo.NeId, - "rmUid": neInfo.RmUID, - "neName": neInfo.NeName, - "dn": neInfo.Dn, - "vendorName": neInfo.VendorName, - "province": neInfo.Province, - "pvFlag": neInfo.PvFlag, - } - - // 公共参数指定的OMC - if omcIP, ok := r.Para5GData["OMC_IP"]; ok && omcIP != "" { - if strings.Contains(omcIP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = omcIP - } - if strings.Contains(omcIP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = omcIP - } - } - - if v, ok := content["omcIP"]; ok && v != "" && v != nil { - omcIP := v.(string) - if strings.Contains(omcIP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = omcIP - } - if strings.Contains(omcIP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = omcIP - } - } - if oamEnable, ok := content["oamEnable"]; ok && oamEnable != nil { - item["enable"] = parse.Boolean(oamEnable) - } - if oamPort, ok := content["oamPort"]; ok && oamPort != nil { - item["port"] = parse.Number(oamPort) - } - oamData["oamConfig"] = item - } - // 对网管SNMP配置 - if v, ok := oamData["snmpConfig"]; ok { - item := v.(map[string]any) - if strings.Contains(neInfo.IP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = neInfo.IP - } - if strings.Contains(neInfo.IP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = neInfo.IP - } - - if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil { - item["enable"] = parse.Boolean(snmpEnable) - } - if snmpPort, ok := content["snmpPort"]; ok && snmpPort != nil { - item["port"] = parse.Number(snmpPort) - } - oamData["snmpConfig"] = item - } - // 对网管KPI上报配置 - if v, ok := oamData["kpiConfig"]; ok { - item := v.(map[string]any) - if neInfo.NeType == "UPF" { - item["timer"] = 5 - } else { - item["timer"] = 60 - } - - if kpiEnable, ok := content["kpiEnable"]; ok && kpiEnable != nil { - item["enable"] = parse.Boolean(kpiEnable) - } - if kpiTimer, ok := content["kpiTimer"]; ok && kpiTimer != nil { - item["timer"] = parse.Number(kpiTimer) - } - oamData["kpiConfig"] = item - } - if err := NewNeInfoImpl.neConfOAMWirte(neInfo.NeType, neInfo.NeId, oamData, sync); err != nil { - return fmt.Errorf("error wirte OAM file info") - } - return nil -} - -// NeConfPara5GRead 网元公共配置文件读取 -func (r *NeInfoImpl) NeConfPara5GRead() (map[string]any, error) { - // 网管本地路径 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - // 读取文件内容 - bytes, err := os.ReadFile(omcFilePath) - if err != nil { - logger.Warnf("NeConfPara5GRead ReadFile => %s", err.Error()) - return nil, fmt.Errorf("read file error") - } - content := string(bytes) - - // 序列化Map - mapData, err := parse.ConvertConfigToMap("yaml", content) - if err != nil { - logger.Warnf("NeConfPara5GRead ConvertConfigToMap => %s", err.Error()) - return nil, fmt.Errorf("content convert type error") - } - return mapData, nil -} - -// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId -func (r *NeInfoImpl) NeConfPara5GWirte(content map[string]any, syncNE []string) error { - // 网管本地路径 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - - if err := parse.ConvertConfigToFile("yaml", omcFilePath, content); err != nil { - return fmt.Errorf("please check if the file exists or write permissions") - } - - // 同步到网元端 - if len(syncNE) > 0 { - errMsg := []string{} - for _, neTI := range syncNE { - ti := strings.SplitN(neTI, "@", 2) - // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(ti[0], ti[1]) - if err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) - continue - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) - continue - } - defer sftpClient.Close() - - // 网元端配置路径 - neFilePath := "/usr/local/etc/conf/para5G.yaml" - neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) - // 复制到网元进行覆盖 - if err = sftpClient.CopyFileLocalToRemote(omcFilePath, neFilePath); err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : please check if scp remote copy is allowed", ti)) - continue - } - } - if len(errMsg) > 0 { - return fmt.Errorf(strings.Join(errMsg, "\r\n")) - } - } - - // 转换一份数据到全局 - r.Para5GData = r.neConfPara5GDataConvert(content) - return nil -} - -// NeConfPara5GConvert 网元公共配置数据转化 content网元公共配置文件读取内容 -func (r *NeInfoImpl) neConfPara5GDataConvert(content map[string]any) map[string]string { - defer func() { - if err := recover(); err != nil { - logger.Errorf("NeConfPara5GDataConvert panic: %v", err) - // 文件异常就删除配置 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - os.Remove(omcFilePath) - } - }() - - basic := content["basic"].(map[string]any) - external := content["external"].(map[string]any) - sbi := content["sbi"].(map[string]any) - - mcc := "460" - mnc := "01" - mncDomain := "001" - if plmnId, plmnIdOk := basic["plmnId"].(map[string]any); plmnIdOk { - mcc = plmnId["mcc"].(string) - mnc = plmnId["mnc"].(string) - // If a user input two digit MNC, add a leading zero - if len(mnc) == 2 { - mncDomain = fmt.Sprintf("0%s", mnc) - } else { - mncDomain = mnc - } - } - - sst := "1" - sd := "000001" - if plmnId, plmnIdOk := basic["snssai"].(map[string]any); plmnIdOk { - sst = plmnId["sst"].(string) - sd = plmnId["sd"].(string) - } - - n3IPAmdMask := external["upfn3_ip"].(string) - n3Arr := strings.SplitN(n3IPAmdMask, "/", 2) - n3IP := n3Arr[0] - n3Mask := "255.255.255.0" - if len(n3Arr) > 1 { - n3Mask = parse.ConvertIPMask(parse.Number(n3Arr[1])) - } - - n6IPAmdMask := external["upfn6_ip"].(string) - n6Arr := strings.SplitN(n6IPAmdMask, "/", 2) - n6IP := n6Arr[0] - n6Mask := "255.255.255.0" - if len(n6Arr) > 1 { - n6Mask = parse.ConvertIPMask(parse.Number(n6Arr[1])) - } - - ueIPAmdMask := external["ue_pool"].(string) - ueArr := strings.SplitN(ueIPAmdMask, "/", 2) - ueIP := ueArr[0] - ueCicr := "24" - ueMask := "255.255.255.0" - if len(ueArr) > 1 { - ueCicr = ueArr[1] - ueMask = parse.ConvertIPMask(parse.Number(ueArr[1])) - } - - return map[string]string{ - // basic - "TAC": basic["tac"].(string), - "MCC": mcc, - "MNC": mnc, - "MNC_DOMAIN": mncDomain, - "SST": sst, - "SD": sd, - "DNN_DATA": basic["dnn_data"].(string), - "DNN_IMS": basic["dnn_ims"].(string), - - // external - "N2_IP": external["amfn2_ip"].(string), - "UE_POOL": external["ue_pool"].(string), - "UE_IP": ueIP, - "UE_MASK": ueMask, - "UE_CIDR": ueCicr, - "UPF_TYPE": external["upf_type"].(string), // StandardUPF LightUPF - "N3_IP": n3IP, - "N3_MASK": n3Mask, - "N3_GW": external["upfn3_gw"].(string), - "N3_PCI": external["upfn3_pci"].(string), - "N3_MAC": external["upfn3_mac"].(string), - "N6_IP": n6IP, - "N6_MASK": n6Mask, - "N6_GW": external["upfn6_gw"].(string), - "N6_PCI": external["upfn6_pci"].(string), - "N6_MAC": external["upfn6_mac"].(string), - - "SIP_IP": external["ims_sip_ip"].(string), - - "S1_MMEIP": external["mmes1_ip"].(string), - "S11_MMEIP": external["mmes11_ip"].(string), - "S10_MMEIP": external["mmes10_ip"].(string), - - // sbi - "OMC_IP": sbi["omc_ip"].(string), - "IMS_IP": sbi["ims_ip"].(string), - "AMF_IP": sbi["amf_ip"].(string), - "AUSF_IP": sbi["ausf_ip"].(string), - "UDM_IP": sbi["udm_ip"].(string), - "SMF_IP": sbi["smf_ip"].(string), - "PCF_IP": sbi["pcf_ip"].(string), - "NSSF_IP": sbi["nssf_ip"].(string), - "NRF_IP": sbi["nrf_ip"].(string), - "UPF_IP": sbi["upf_ip"].(string), - "LMF_IP": sbi["lmf_ip"].(string), - "NEF_IP": sbi["nef_ip"].(string), - "MME_IP": sbi["mme_ip"].(string), - "N3IWF_IP": sbi["n3iwf_ip"].(string), - "SMSC_IP": sbi["smsc_ip"].(string), - - "DB_IP": sbi["db_ip"].(string), - } -} diff --git a/src/modules/network_element/service/ne_license.go b/src/modules/network_element/service/ne_license.go index ace554d1..fa84b155 100644 --- a/src/modules/network_element/service/ne_license.go +++ b/src/modules/network_element/service/ne_license.go @@ -1,34 +1,190 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + "time" -// INeLicense 网元授权激活信息 服务层接口 -type INeLicense interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neLicense model.NeLicense) []model.NeLicense - - // SelectById 通过ID查询 - SelectById(id string) model.NeLicense - - // Insert 新增信息 - Insert(neLicense model.NeLicense) string - - // Update 修改信息 - Update(neLicense model.NeLicense) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 - SelectByNeTypeAndNeID(neType, neId string) model.NeLicense - - // ReadLicenseInfo 读取授权文件信息 - // 返回激活申请码, 激活文件 - ReadLicenseInfo(neLicense model.NeLicense) (string, string) - - // UploadLicense 授权文件上传到网元主机 - UploadLicense(neLicense model.NeLicense) error +// 实例化服务层 NeLicense 结构体 +var NewNeLicense = &NeLicense{ + neLicenseRepository: repository.NewNeLicense, +} + +// NeLicense 网元授权激活信息 服务层处理 +type NeLicense struct { + neLicenseRepository *repository.NeLicense // 网元授权激活信息表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeLicense) SelectPage(query map[string]any) map[string]any { + return r.neLicenseRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense { + return r.neLicenseRepository.SelectList(neLicense) +} + +// SelectByIds 通过ID查询 +func (r *NeLicense) SelectById(id string) model.NeLicense { + if id == "" { + return model.NeLicense{} + } + neLicenses := r.neLicenseRepository.SelectByIds([]string{id}) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// Insert 新增信息 +func (r *NeLicense) Insert(neLicense model.NeLicense) string { + return r.neLicenseRepository.Insert(neLicense) +} + +// Update 修改信息 +func (r *NeLicense) Update(neLicense model.NeLicense) int64 { + return r.neLicenseRepository.Update(neLicense) +} + +// DeleteByIds 批量删除信息 +func (r *NeLicense) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rowIds := r.neLicenseRepository.SelectByIds(ids) + if len(rowIds) <= 0 { + return 0, fmt.Errorf("neLicense.noData") + } + + if len(rowIds) == len(ids) { + rows := r.neLicenseRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// SelectByTypeAndID 通过网元类型和网元ID查询 +func (r *NeLicense) SelectByTypeAndID(neType, neId string) model.NeLicense { + neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ + NeType: neType, + NeId: neId, + }) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 +func (r *NeLicense) SelectByNeTypeAndNeID(neType, neId string) model.NeLicense { + neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ + NeType: neType, + NeId: neId, + }) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// ReadLicenseInfo 读取授权文件信息 +// 返回激活申请码, 激活文件 +func (r *NeLicense) ReadLicenseInfo(neLicense model.NeLicense) (string, string) { + neTypeLower := strings.ToLower(neLicense.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_license" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeId) + // 网元端授权文件路径 + nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower) + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.NeType, neLicense.NeId) + if err != nil { + return "", "" + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return "", "" + } + defer sftpClient.Close() + + // 复制授权申请码到本地 + if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil { + return "", "" + } + // 读取文件内容 + bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt") + if err != nil { + return "", "" + } + + // 复制激活文件到本地 + licensePath := "" + if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil { + licensePath = omcPath + "/system.ini" + } + return strings.TrimSpace(string(bytes)), licensePath +} + +// UploadLicense 授权文件上传到网元主机 +func (r *NeLicense) UploadLicense(neLicense model.NeLicense) error { + // 检查文件是否存在 + omcLicensePath := file.ParseUploadFilePath(neLicense.LicensePath) + if _, err := os.Stat(omcLicensePath); err != nil { + return fmt.Errorf("file read failure") + } + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.NeType, neLicense.NeId) + if err != nil { + return err + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return err + } + defer sftpClient.Close() + + // 网元端授权文件路径 + neTypeLower := strings.ToLower(neLicense.NeType) + neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower) + neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath)) + + // 尝试备份授权文件 + neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405")) + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack)) + + // 上传授权文件去覆盖 + if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil { + return fmt.Errorf("please check if scp remote copy is allowed") + } + + // 重启服务 + if neLicense.Reload { + cmdStr := fmt.Sprintf("sudo service %s restart", neTypeLower) + if neTypeLower == "ims" { + cmdStr = "ims-stop || true && ims-start" + } else if neTypeLower == "omc" { + cmdStr = "sudo systemctl restart restagent" + } + sshClient.RunCMD(cmdStr) + } + return nil } diff --git a/src/modules/network_element/service/ne_license.impl.go b/src/modules/network_element/service/ne_license.impl.go deleted file mode 100644 index 9d11804d..00000000 --- a/src/modules/network_element/service/ne_license.impl.go +++ /dev/null @@ -1,191 +0,0 @@ -package service - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - "time" - - "be.ems/src/framework/utils/file" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeLicenseImpl 结构体 -var NewNeLicenseImpl = &NeLicenseImpl{ - neLicenseRepository: repository.NewNeLicenseImpl, -} - -// NeLicenseImpl 网元授权激活信息 服务层处理 -type NeLicenseImpl struct { - // 网元授权激活信息表 - neLicenseRepository repository.INeLicense -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeLicenseImpl) SelectPage(query map[string]any) map[string]any { - return r.neLicenseRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeLicenseImpl) SelectList(neLicense model.NeLicense) []model.NeLicense { - return r.neLicenseRepository.SelectList(neLicense) -} - -// SelectByIds 通过ID查询 -func (r *NeLicenseImpl) SelectById(id string) model.NeLicense { - if id == "" { - return model.NeLicense{} - } - neLicenses := r.neLicenseRepository.SelectByIds([]string{id}) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// Insert 新增信息 -func (r *NeLicenseImpl) Insert(neLicense model.NeLicense) string { - return r.neLicenseRepository.Insert(neLicense) -} - -// Update 修改信息 -func (r *NeLicenseImpl) Update(neLicense model.NeLicense) int64 { - return r.neLicenseRepository.Update(neLicense) -} - -// DeleteByIds 批量删除信息 -func (r *NeLicenseImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - rowIds := r.neLicenseRepository.SelectByIds(ids) - if len(rowIds) <= 0 { - return 0, fmt.Errorf("neLicense.noData") - } - - if len(rowIds) == len(ids) { - rows := r.neLicenseRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// SelectByTypeAndID 通过网元类型和网元ID查询 -func (r *NeLicenseImpl) SelectByTypeAndID(neType, neId string) model.NeLicense { - neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ - NeType: neType, - NeId: neId, - }) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 -func (r *NeLicenseImpl) SelectByNeTypeAndNeID(neType, neId string) model.NeLicense { - neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ - NeType: neType, - NeId: neId, - }) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// ReadLicenseInfo 读取授权文件信息 -// 返回激活申请码, 激活文件 -func (r *NeLicenseImpl) ReadLicenseInfo(neLicense model.NeLicense) (string, string) { - neTypeLower := strings.ToLower(neLicense.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_license" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeId) - // 网元端授权文件路径 - nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower) - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neLicense.NeType, neLicense.NeId) - if err != nil { - return "", "" - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", "" - } - defer sftpClient.Close() - - // 复制授权申请码到本地 - if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil { - return "", "" - } - // 读取文件内容 - bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt") - if err != nil { - return "", "" - } - - // 复制激活文件到本地 - licensePath := "" - if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil { - licensePath = omcPath + "/system.ini" - } - return strings.TrimSpace(string(bytes)), licensePath -} - -// UploadLicense 授权文件上传到网元主机 -func (r *NeLicenseImpl) UploadLicense(neLicense model.NeLicense) error { - // 检查文件是否存在 - omcLicensePath := file.ParseUploadFilePath(neLicense.LicensePath) - if _, err := os.Stat(omcLicensePath); err != nil { - return fmt.Errorf("file read failure") - } - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neLicense.NeType, neLicense.NeId) - if err != nil { - return err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return err - } - defer sftpClient.Close() - - // 网元端授权文件路径 - neTypeLower := strings.ToLower(neLicense.NeType) - neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower) - neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath)) - - // 尝试备份授权文件 - neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405")) - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack)) - - // 上传授权文件去覆盖 - if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil { - return fmt.Errorf("please check if scp remote copy is allowed") - } - - // 重启服务 - if neLicense.Reload { - cmdStr := fmt.Sprintf("sudo service %s restart", neTypeLower) - if neTypeLower == "ims" { - cmdStr = "ims-stop || true && ims-start" - } else if neTypeLower == "omc" { - cmdStr = "sudo systemctl restart restagent" - } - sshClient.RunCMD(cmdStr) - } - return nil -} diff --git a/src/modules/network_element/service/ne_software.go b/src/modules/network_element/service/ne_software.go index 37e9ad4a..c4910f05 100644 --- a/src/modules/network_element/service/ne_software.go +++ b/src/modules/network_element/service/ne_software.go @@ -1,30 +1,142 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "os" -// INeSoftware 网元软件包信息 服务层接口 -type INeSoftware interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neSoftware model.NeSoftware) []model.NeSoftware - - // SelectById 通过ID查询 - SelectById(id string) model.NeSoftware - - // Insert 新增信息 - Insert(neSoftware model.NeSoftware) string - - // Update 修改信息 - Update(neSoftware model.NeSoftware) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 - CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool - - // UpdateVersions 更新软件包对应网元的新版本 - UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 +// 实例化服务层 NeSoftware 结构体 +var NewNeSoftware = &NeSoftware{ + neSoftwareRepository: repository.NewNeSoftware, +} + +// NeSoftware 网元软件包信息 服务层处理 +type NeSoftware struct { + neSoftwareRepository *repository.NeSoftware // 网元软件包信息 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeSoftware) SelectPage(query map[string]any) map[string]any { + return r.neSoftwareRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { + return r.neSoftwareRepository.SelectList(neSoftware) +} + +// SelectByIds 通过ID查询 +func (r *NeSoftware) SelectById(id string) model.NeSoftware { + if id == "" { + return model.NeSoftware{} + } + neHosts := r.neSoftwareRepository.SelectByIds([]string{id}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeSoftware{} +} + +// Insert 新增信息 +func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { + inserId := r.neSoftwareRepository.Insert(neSoftware) + if inserId != "" { + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(model.NeVersion{NeType: neSoftware.NeType}, false) + if len(neVersions) > 0 { + for _, neVersion := range neVersions { + neVersion.NewName = neSoftware.Name + neVersion.NewVersion = neSoftware.Version + neVersion.NewPath = neSoftware.Path + neVersion.Status = "3" + neVersion.UpdateBy = neSoftware.CreateBy + NewNeVersion.Update(neVersion) + } + } + } + return inserId +} + +// Update 修改信息 +func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { + rows := r.neSoftwareRepository.Update(neSoftware) + if rows > 0 { + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(model.NeVersion{ + NeType: neSoftware.NeType, + Status: "3", + }, false) + if len(neVersions) > 0 { + for _, neVersion := range neVersions { + neVersion.NewName = neSoftware.Name + neVersion.NewVersion = neSoftware.Version + neVersion.NewPath = neSoftware.Path + neVersion.Status = "3" + neVersion.UpdateBy = neSoftware.UpdateBy + NewNeVersion.Update(neVersion) + } + } + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeSoftware) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rows := r.neSoftwareRepository.SelectByIds(ids) + if len(rows) <= 0 { + return 0, fmt.Errorf("neSoftware.noData") + } + + if len(rows) == len(ids) { + // 遍历软件包列表进行文件删除 + for _, row := range rows { + // 检查文件是否存在 + filePath := file.ParseUploadFilePath(row.Path) + if _, err := os.Stat(filePath); err != nil { + continue + } + os.Remove(filePath) + } + rows := r.neSoftwareRepository.DeleteByIds(ids) + return rows, nil + } + + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 +func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool { + uniqueId := r.neSoftwareRepository.CheckUniqueTypeAndNameAndVersion(model.NeSoftware{ + NeType: neType, + Name: name, + Version: version, + }) + if uniqueId == id { + return true + } + return uniqueId == "" +} + +// UpdateVersions 更新软件包对应网元的新版本 +func (r *NeSoftware) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { + var rows int64 = 0 + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(neVersion, false) + if len(neVersions) > 0 { + for _, v := range neVersions { + v.NewName = neSoftware.Name + v.NewVersion = neSoftware.Version + v.NewPath = neSoftware.Path + v.Status = "3" + v.UpdateBy = neVersion.UpdateBy + rows += NewNeVersion.Update(v) + } + } + return rows } diff --git a/src/modules/network_element/service/ne_software.impl.go b/src/modules/network_element/service/ne_software.impl.go deleted file mode 100644 index 326ae339..00000000 --- a/src/modules/network_element/service/ne_software.impl.go +++ /dev/null @@ -1,143 +0,0 @@ -package service - -import ( - "fmt" - "os" - - "be.ems/src/framework/utils/file" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeSoftwareImpl 结构体 -var NewNeSoftwareImpl = &NeSoftwareImpl{ - neSoftwareRepository: repository.NewNeSoftwareImpl, -} - -// NeSoftwareImpl 网元软件包信息 服务层处理 -type NeSoftwareImpl struct { - // 网元软件包信息 - neSoftwareRepository repository.INeSoftware -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeSoftwareImpl) SelectPage(query map[string]any) map[string]any { - return r.neSoftwareRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeSoftwareImpl) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { - return r.neSoftwareRepository.SelectList(neSoftware) -} - -// SelectByIds 通过ID查询 -func (r *NeSoftwareImpl) SelectById(id string) model.NeSoftware { - if id == "" { - return model.NeSoftware{} - } - neHosts := r.neSoftwareRepository.SelectByIds([]string{id}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeSoftware{} -} - -// Insert 新增信息 -func (r *NeSoftwareImpl) Insert(neSoftware model.NeSoftware) string { - inserId := r.neSoftwareRepository.Insert(neSoftware) - if inserId != "" { - // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(model.NeVersion{NeType: neSoftware.NeType}, false) - if len(neVersions) > 0 { - for _, neVersion := range neVersions { - neVersion.NewName = neSoftware.Name - neVersion.NewVersion = neSoftware.Version - neVersion.NewPath = neSoftware.Path - neVersion.Status = "3" - neVersion.UpdateBy = neSoftware.CreateBy - NewNeVersion.Update(neVersion) - } - } - } - return inserId -} - -// Update 修改信息 -func (r *NeSoftwareImpl) Update(neSoftware model.NeSoftware) int64 { - rows := r.neSoftwareRepository.Update(neSoftware) - if rows > 0 { - // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(model.NeVersion{ - NeType: neSoftware.NeType, - Status: "3", - }, false) - if len(neVersions) > 0 { - for _, neVersion := range neVersions { - neVersion.NewName = neSoftware.Name - neVersion.NewVersion = neSoftware.Version - neVersion.NewPath = neSoftware.Path - neVersion.Status = "3" - neVersion.UpdateBy = neSoftware.UpdateBy - NewNeVersion.Update(neVersion) - } - } - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeSoftwareImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - rows := r.neSoftwareRepository.SelectByIds(ids) - if len(rows) <= 0 { - return 0, fmt.Errorf("neSoftware.noData") - } - - if len(rows) == len(ids) { - // 遍历软件包列表进行文件删除 - for _, row := range rows { - // 检查文件是否存在 - filePath := file.ParseUploadFilePath(row.Path) - if _, err := os.Stat(filePath); err != nil { - continue - } - os.Remove(filePath) - } - rows := r.neSoftwareRepository.DeleteByIds(ids) - return rows, nil - } - - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 -func (r *NeSoftwareImpl) CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool { - uniqueId := r.neSoftwareRepository.CheckUniqueTypeAndNameAndVersion(model.NeSoftware{ - NeType: neType, - Name: name, - Version: version, - }) - if uniqueId == id { - return true - } - return uniqueId == "" -} - -// UpdateVersions 更新软件包对应网元的新版本 -func (r *NeSoftwareImpl) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { - var rows int64 = 0 - // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(neVersion, false) - if len(neVersions) > 0 { - for _, v := range neVersions { - v.NewName = neSoftware.Name - v.NewVersion = neSoftware.Version - v.NewPath = neSoftware.Path - v.Status = "3" - v.UpdateBy = neVersion.UpdateBy - rows += NewNeVersion.Update(v) - } - } - return rows -} diff --git a/src/modules/network_element/service/ne_version.go b/src/modules/network_element/service/ne_version.go index e064c70c..4b6f21d6 100644 --- a/src/modules/network_element/service/ne_version.go +++ b/src/modules/network_element/service/ne_version.go @@ -21,8 +21,7 @@ var NewNeVersion = &NeVersion{ // NeVersion 网元版本信息 服务层处理 type NeVersion struct { - // 网元版本信息表 - neVersionRepository *repository.NeVersion + neVersionRepository *repository.NeVersion // 网元版本信息表 } // SelectNeHostPage 分页查询列表数据 @@ -55,7 +54,7 @@ func (r *NeVersion) checkNeVersion(arr *[]model.NeVersion) { for i := range *arr { item := (*arr)[i] // 查询网元获取IP - neInfo := NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(item.NeType, item.NeId) + neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(item.NeType, item.NeId) if neInfo.NeId != item.NeId || neInfo.IP == "" { continue } @@ -136,7 +135,7 @@ func (r *NeVersion) SelectByNeTypeAndNeID(neType, neId string) model.NeVersion { // action 安装行为:install upgrade rollback func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) { // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neVersion.NeType, neVersion.NeId) + sshClient, err := NewNeInfo.NeRunSSHClient(neVersion.NeType, neVersion.NeId) if err != nil { return "", err } @@ -158,11 +157,11 @@ func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput m // ========= 安装时设置 ========= if action == "install" { // 网元公共配置文件 - para5GMap, err := NewNeInfoImpl.NeConfPara5GRead() + para5GMap, err := NewNeInfo.NeConfPara5GRead() if para5GMap == nil || err != nil { return "", fmt.Errorf("error read para5G file info") } - if err := NewNeInfoImpl.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.NeType, neVersion.NeId)}); err != nil { + if err := NewNeInfo.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.NeType, neVersion.NeId)}); err != nil { return "", fmt.Errorf("error wirte para5G file info") } } @@ -271,7 +270,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) return okFlagStr, cmdStrArr, nil } else if neType == "IMS" { if action == "install" { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") // 公网 PLMN地址 @@ -313,7 +312,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) } } else { if action == "install" { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") // AMF配置修改 @@ -538,14 +537,14 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) if action == "install" && (neTypeLower == "ims" || neTypeLower == "udm") { // adb if strings.Contains(pkgCmdStr, "adb") { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/adb/default/adb.conf /usr/local/etc/adb/adb.conf \n") cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind 127.0.0.1 %s/g\" /usr/local/etc/adb/adb.conf \n", para5GData["DB_IP"])) cmdStrArr = append(cmdStrArr, "sudo service adb restart \n") } // kvdb if strings.Contains(pkgCmdStr, "kvdb") { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/kvdb/default/kvdb.conf /usr/local/etc/kvdb/kvdb.conf \n") cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind 127.0.0.1 %s/g\" /usr/local/etc/kvdb/kvdb.conf \n", para5GData["DB_IP"])) cmdStrArr = append(cmdStrArr, "sudo service kvdb restart \n") @@ -654,12 +653,12 @@ func (r *NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]strin func (r *NeVersion) operateDome(action string, neVersion model.NeVersion) error { if action == "install" { // 网元信息 - neInfo := NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) + neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) if neInfo.NeId != neVersion.NeId { return fmt.Errorf("error found neinfo") } // ========= 网元OAM配置文件 start ========== - if err := NewNeInfoImpl.NeConfOAMWirteSync(neInfo, nil, true); err != nil { + if err := NewNeInfo.NeConfOAMWirteSync(neInfo, nil, true); err != nil { return fmt.Errorf("error wirte OAM file info") } // ========= 网元OAM配置文件 end =========== diff --git a/src/modules/tool/controller/iperf.go b/src/modules/tool/controller/iperf.go index c908d584..71413d6b 100644 --- a/src/modules/tool/controller/iperf.go +++ b/src/modules/tool/controller/iperf.go @@ -99,7 +99,7 @@ func (s *IPerfController) Run(c *gin.Context) { } // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/tool/controller/ping.go b/src/modules/tool/controller/ping.go index 7af020de..3f3f5b44 100644 --- a/src/modules/tool/controller/ping.go +++ b/src/modules/tool/controller/ping.go @@ -105,7 +105,7 @@ func (s *PingController) Run(c *gin.Context) { } // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/tool/service/iperf.go b/src/modules/tool/service/iperf.go index ae204513..84ec00b6 100644 --- a/src/modules/tool/service/iperf.go +++ b/src/modules/tool/service/iperf.go @@ -16,20 +16,15 @@ import ( ) // 实例化服务层 IPerf 结构体 -var NewIPerf = &IPerf{ - neInfoService: neService.NewNeInfoImpl, -} +var NewIPerf = &IPerf{} // IPerf 网络性能测试工具 服务层处理 -type IPerf struct { - // 网元信息服务 - neInfoService neService.INeInfo -} +type IPerf struct{} // Version 查询版本信息 func (s *IPerf) Version(meType, neId string) (string, error) { // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(meType, neId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId) if err != nil { return "", err } @@ -46,7 +41,7 @@ func (s *IPerf) Version(meType, neId string) (string, error) { // Install 安装iperf3 func (s *IPerf) Install(meType, neId string) error { // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(meType, neId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId) if err != nil { return err } diff --git a/src/modules/tool/service/ping.go b/src/modules/tool/service/ping.go index 100ef9db..1ce9b016 100644 --- a/src/modules/tool/service/ping.go +++ b/src/modules/tool/service/ping.go @@ -10,22 +10,16 @@ import ( "be.ems/src/framework/logger" "be.ems/src/framework/utils/ssh" "be.ems/src/framework/vo/result" - neService "be.ems/src/modules/network_element/service" "be.ems/src/modules/tool/model" wsModel "be.ems/src/modules/ws/model" probing "github.com/prometheus-community/pro-bing" ) // 实例化服务层 Ping 结构体 -var NewPing = &Ping{ - neInfoService: neService.NewNeInfoImpl, -} +var NewPing = &Ping{} // Ping 网络性能测试工具 服务层处理 -type Ping struct { - // 网元信息服务 - neInfoService neService.INeInfo -} +type Ping struct{} // Statistics ping基本信息 func (s *Ping) Statistics(ping model.Ping) (map[string]any, error) { diff --git a/src/modules/trace/controller/tcpdump.go b/src/modules/trace/controller/tcpdump.go index 9ef6fa60..03ace4da 100644 --- a/src/modules/trace/controller/tcpdump.go +++ b/src/modules/trace/controller/tcpdump.go @@ -16,7 +16,7 @@ import ( // 实例化控制层 TCPdumpController 结构体 var NewTCPdump = &TCPdumpController{ tcpdumpService: traceService.NewTCPdump, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // 信令抓包 @@ -24,7 +24,7 @@ var NewTCPdump = &TCPdumpController{ // PATH /tcpdump type TCPdumpController struct { tcpdumpService *traceService.TCPdump // 信令抓包服务 - neInfoService neService.INeInfo // 网元信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元抓包PACP 开始 diff --git a/src/modules/trace/controller/trace_task_hlr.go b/src/modules/trace/controller/trace_task_hlr.go index 4b659015..07acc5ba 100644 --- a/src/modules/trace/controller/trace_task_hlr.go +++ b/src/modules/trace/controller/trace_task_hlr.go @@ -21,7 +21,7 @@ import ( // 实例化控制层 TraceTaskHlrController 结构体 var NewTraceTaskHlr = &TraceTaskHlrController{ - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, traceTaskHlrService: traceService.NewTraceTaskHlr, } @@ -29,10 +29,8 @@ var NewTraceTaskHlr = &TraceTaskHlrController{ // // PATH /task/hlr type TraceTaskHlrController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 跟踪_任务给HRL网元信息服务 - traceTaskHlrService *traceService.TraceTaskHlr + neInfoService *neService.NeInfo // 网元信息服务 + traceTaskHlrService *traceService.TraceTaskHlr // 跟踪_任务给HRL网元信息服务 } // 跟踪任务列表 diff --git a/src/modules/trace/service/tcpdump.go b/src/modules/trace/service/tcpdump.go index 2511736d..72c8553d 100644 --- a/src/modules/trace/service/tcpdump.go +++ b/src/modules/trace/service/tcpdump.go @@ -18,13 +18,12 @@ import ( // 实例化服务层 TCPdump 结构体 var NewTCPdump = &TCPdump{ - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // 信令抓包 服务层处理 type TCPdump struct { - // 网元信息服务 - neInfoService neService.INeInfo + neInfoService *neService.NeInfo // 网元信息服务 } // 抓包进程PID diff --git a/src/modules/trace/service/trace_task.go b/src/modules/trace/service/trace_task.go index bc1682c7..98e8d7c0 100644 --- a/src/modules/trace/service/trace_task.go +++ b/src/modules/trace/service/trace_task.go @@ -189,7 +189,7 @@ func (r *TraceTask) Insert(task model.TraceTask) error { task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) if neInfo.NeId != task.NeId || neInfo.IP == "" { return fmt.Errorf("app.common.noNEInfo") } @@ -254,7 +254,7 @@ func (r *TraceTask) Update(task model.TraceTask) error { task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) if neInfo.NeId != task.NeId || neInfo.IP == "" { return fmt.Errorf("app.common.noNEInfo") } @@ -309,7 +309,7 @@ func (r *TraceTask) DeleteByIds(ids []string) (int64, error) { if len(rows) == len(ids) { // 停止任务 for _, v := range rows { - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(v.NeType, v.NeId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(v.NeType, v.NeId) if neInfo.NeId != v.NeId || neInfo.IP == "" { continue } diff --git a/src/modules/trace/service/trace_task_hlr.go b/src/modules/trace/service/trace_task_hlr.go index 835f1c11..9eee3843 100644 --- a/src/modules/trace/service/trace_task_hlr.go +++ b/src/modules/trace/service/trace_task_hlr.go @@ -17,15 +17,13 @@ import ( // 实例化数据层 TraceTaskHlr 结构体 var NewTraceTaskHlr = &TraceTaskHlr{ traceTaskHlrRepository: repository.NewTraceTaskHlr, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // TraceTaskHlr 跟踪_任务给HRL网元 服务层处理 type TraceTaskHlr struct { - // 跟踪_任务给HRL网元数据信息 - traceTaskHlrRepository *repository.TraceTaskHlr - // 网元信息服务 - neInfoService neService.INeInfo + traceTaskHlrRepository *repository.TraceTaskHlr // 跟踪_任务给HRL网元数据信息 + neInfoService *neService.NeInfo // 网元信息服务 } // SelectPage 根据条件分页查询 diff --git a/src/modules/ws/controller/ws_ssh.go b/src/modules/ws/controller/ws_ssh.go index d5444c44..db33b6bd 100644 --- a/src/modules/ws/controller/ws_ssh.go +++ b/src/modules/ws/controller/ws_ssh.go @@ -43,7 +43,7 @@ func (s *WSController) SSH(c *gin.Context) { return } - neHost := neService.NewNeHostImpl.SelectById(query.HostId) + neHost := neService.NewNeHost.SelectById(query.HostId) if neHost.HostID != query.HostId || neHost.HostType != "ssh" { // 没有可访问主机信息数据! c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) diff --git a/src/modules/ws/controller/ws_telnet.go b/src/modules/ws/controller/ws_telnet.go index 668d0ec4..34f52240 100644 --- a/src/modules/ws/controller/ws_telnet.go +++ b/src/modules/ws/controller/ws_telnet.go @@ -43,7 +43,7 @@ func (s *WSController) Telnet(c *gin.Context) { return } - neHost := neService.NewNeHostImpl.SelectById(query.HostId) + neHost := neService.NewNeHost.SelectById(query.HostId) if neHost.HostID != query.HostId || neHost.HostType != "telnet" { // 没有可访问主机信息数据! c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) diff --git a/src/modules/ws/controller/ws_view.go b/src/modules/ws/controller/ws_view.go index 56c77f89..2b2594d2 100644 --- a/src/modules/ws/controller/ws_view.go +++ b/src/modules/ws/controller/ws_view.go @@ -44,7 +44,7 @@ func (s *WSController) ShellView(c *gin.Context) { } // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/ws/processor/cdr_connect.go b/src/modules/ws/processor/cdr_connect.go index f7d1efff..5cfc7776 100644 --- a/src/modules/ws/processor/cdr_connect.go +++ b/src/modules/ws/processor/cdr_connect.go @@ -22,13 +22,13 @@ func GetCDRConnectByIMS(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventIMSImpl.SelectPage(query) + dataMap := neDataService.NewCDREventIMS.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -47,13 +47,13 @@ func GetCDRConnectBySMF(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventSMFImpl.SelectPage(query) + dataMap := neDataService.NewCDREventSMF.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -72,13 +72,13 @@ func GetCDRConnectBySMSC(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventSMSCImpl.SelectPage(query) + dataMap := neDataService.NewCDREventSMSC.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, diff --git a/src/modules/ws/processor/ne_state.go b/src/modules/ws/processor/ne_state.go index 64e76e72..bd4b1446 100644 --- a/src/modules/ws/processor/ne_state.go +++ b/src/modules/ws/processor/ne_state.go @@ -28,7 +28,7 @@ func GetNeState(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { return nil, fmt.Errorf("no matching network element information found") } diff --git a/src/modules/ws/processor/ue_connect.go b/src/modules/ws/processor/ue_connect.go index bb0f6492..f6903819 100644 --- a/src/modules/ws/processor/ue_connect.go +++ b/src/modules/ws/processor/ue_connect.go @@ -20,7 +20,7 @@ func GetUEConnectByAMF(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } - dataMap := neDataService.NewUEEventAMFImpl.SelectPage(query) + dataMap := neDataService.NewUEEventAMF.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -38,7 +38,7 @@ func GetUEConnectByMME(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } - dataMap := neDataService.NewUEEventMMEImpl.SelectPage(query) + dataMap := neDataService.NewUEEventMME.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, diff --git a/src/modules/ws/processor/upf_total_flow.go b/src/modules/ws/processor/upf_total_flow.go index 9a86786a..0186dcd3 100644 --- a/src/modules/ws/processor/upf_total_flow.go +++ b/src/modules/ws/processor/upf_total_flow.go @@ -29,12 +29,12 @@ func GetUPFTotalFlow(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { return nil, fmt.Errorf("no matching network element information found") } - dataMap := neDataService.NewPerfKPIImpl.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) + dataMap := neDataService.NewPerfKPI.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, From 00ff6217c84cc0b54de75539c00dabbeb06f742b Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 19:46:45 +0800 Subject: [PATCH 6/6] =?UTF-8?q?sql:=20=E8=8F=9C=E5=8D=95Tool=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/sys_menu.sql | 1 + database/upgrade/upg_sys_menu.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/database/install/sys_menu.sql b/database/install/sys_menu.sql index da713786..030f85d1 100644 --- a/database/install/sys_menu.sql +++ b/database/install/sys_menu.sql @@ -49,6 +49,7 @@ CREATE TABLE `sys_menu` ( INSERT INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', NULL, '1', '1', 'D', '1', '1', NULL, 'icon-xiangmu', 'supervisor', 1700000000000, NULL, 0, 'menu.systemRemark'); INSERT INTO `sys_menu` VALUES (4, 'menu.config', 0, 3, 'configManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.configRemark'); INSERT INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUserRemark'); +INSERT INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, 'supervisor', 1715413568692, 'menu.toolsRemark'); INSERT INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 1, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 4, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); INSERT INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 6, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); diff --git a/database/upgrade/upg_sys_menu.sql b/database/upgrade/upg_sys_menu.sql index 73f92388..d94224b7 100644 --- a/database/upgrade/upg_sys_menu.sql +++ b/database/upgrade/upg_sys_menu.sql @@ -32,6 +32,7 @@ CREATE TABLE IF NOT EXISTS `sys_menu` ( REPLACE INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', NULL, '1', '1', 'D', '1', '1', NULL, 'icon-xiangmu', 'supervisor', 1700000000000, NULL, 0, 'menu.systemRemark'); REPLACE INTO `sys_menu` VALUES (4, 'menu.config', 0, 3, 'configManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.configRemark'); REPLACE INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUserRemark'); +REPLACE INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1715413568692, 'supervisor', 1715413568692, 'menu.toolsRemark'); REPLACE INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 1, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 4, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); REPLACE INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 6, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, '');