Merge remote-tracking branch 'origin/lichang'
This commit is contained in:
10
.vscode/launch.json
vendored
10
.vscode/launch.json
vendored
@@ -29,15 +29,6 @@
|
|||||||
"program": "d:/local.git/be.ems/sshsvc/sshsvc.go",
|
"program": "d:/local.git/be.ems/sshsvc/sshsvc.go",
|
||||||
"console": "integratedTerminal"
|
"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",
|
"name": "debug crontask",
|
||||||
"type": "go",
|
"type": "go",
|
||||||
@@ -52,7 +43,6 @@
|
|||||||
"request": "launch",
|
"request": "launch",
|
||||||
"mode": "debug",
|
"mode": "debug",
|
||||||
"program": "d:/local.git/be.ems/tools/encode",
|
"program": "d:/local.git/be.ems/tools/encode",
|
||||||
//"args": ["-p","../../config/param/smf_param_config.yaml"],
|
|
||||||
"console": "integratedTerminal"
|
"console": "integratedTerminal"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -890,7 +890,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
"param_config": {
|
"ne_config": {
|
||||||
"retFmt": "GetDB",
|
"retFmt": "GetDB",
|
||||||
"retMsg": "RetCode = %d operation succeeded\n\n",
|
"retMsg": "RetCode = %d operation succeeded\n\n",
|
||||||
"errMsg": "ErrorCode = %d operation failed: %s\n\n",
|
"errMsg": "ErrorCode = %d operation failed: %s\n\n",
|
||||||
@@ -903,27 +903,22 @@
|
|||||||
"cols": [
|
"cols": [
|
||||||
{
|
{
|
||||||
"name": "ne_type",
|
"name": "ne_type",
|
||||||
"display": "NE type",
|
"display": "NE Type",
|
||||||
"length": 10
|
"length": 10
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "ne_id",
|
"name": "param_display",
|
||||||
"display": "NE ID",
|
"display": "Parameter Display",
|
||||||
"length": 28
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "top_tag",
|
|
||||||
"display": "Parameters tag",
|
|
||||||
"length": 128
|
"length": 128
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "param_name",
|
"name": "param_name",
|
||||||
"display": "Parameter name list",
|
"display": "Parameter Name",
|
||||||
"length": 256
|
"length": 256
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "param_value",
|
"name": "param_value",
|
||||||
"display": "Parameter value list",
|
"display": "Parameter Value",
|
||||||
"length": 256
|
"length": 256
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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 (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 (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 (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 (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 (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');
|
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');
|
||||||
|
|||||||
@@ -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 (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 (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 (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 (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 (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}');
|
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}');
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -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 (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 (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 (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 (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 (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, '');
|
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, '');
|
||||||
|
|||||||
@@ -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 (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 (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 (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 (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 (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, '');
|
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, '');
|
||||||
|
|||||||
@@ -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 {
|
if neInfo.RmUID == cdrEvent.RmUID {
|
||||||
// 推送到ws订阅组
|
// 推送到ws订阅组
|
||||||
switch neInfo.NeType {
|
switch neInfo.NeType {
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
@@ -157,7 +157,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 刷新缓存,不存在结构体网元Id空字符串
|
// 刷新缓存,不存在结构体网元Id空字符串
|
||||||
neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
|
neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
|
||||||
|
|
||||||
mapRow := make(map[string]interface{})
|
mapRow := make(map[string]interface{})
|
||||||
row := map[string]interface{}{"affectedRows": affected}
|
row := map[string]interface{}{"affectedRows": affected}
|
||||||
@@ -208,7 +208,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 刷新缓存,不存在结构体网元Id空字符串
|
// 刷新缓存,不存在结构体网元Id空字符串
|
||||||
neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
|
neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
|
||||||
|
|
||||||
services.ResponseStatusOK204NoContent(w)
|
services.ResponseStatusOK204NoContent(w)
|
||||||
return
|
return
|
||||||
@@ -267,7 +267,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 刷新缓存,不存在结构体网元Id空字符串
|
// 刷新缓存,不存在结构体网元Id空字符串
|
||||||
neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
|
neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
|
||||||
|
|
||||||
mapRow := make(map[string]interface{})
|
mapRow := make(map[string]interface{})
|
||||||
row := map[string]interface{}{"affectedRows": affected}
|
row := map[string]interface{}{"affectedRows": affected}
|
||||||
@@ -319,7 +319,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 刷新缓存,不存在结构体网元Id空字符串
|
// 刷新缓存,不存在结构体网元Id空字符串
|
||||||
neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
|
neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
|
||||||
|
|
||||||
services.ResponseStatusOK204NoContent(w)
|
services.ResponseStatusOK204NoContent(w)
|
||||||
return
|
return
|
||||||
@@ -381,7 +381,7 @@ func DeleteNeInfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 刷新缓存,不存在结构体网元Id空字符串
|
// 刷新缓存,不存在结构体网元Id空字符串
|
||||||
neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
|
neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
|
||||||
|
|
||||||
mapRow := make(map[string]interface{})
|
mapRow := make(map[string]interface{})
|
||||||
row := map[string]interface{}{"affectedRows": affected}
|
row := map[string]interface{}{"affectedRows": affected}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ func GetParamConfigFromNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId)
|
neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId)
|
||||||
|
|
||||||
var response services.DataResponse
|
var response services.DataResponse
|
||||||
if neInfo.NeId == neId && neInfo.NeId != "" {
|
if neInfo.NeId == neId && neInfo.NeId != "" {
|
||||||
@@ -76,7 +76,7 @@ func PostParamConfigToNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId)
|
neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId)
|
||||||
|
|
||||||
if neInfo.NeId != neId || neInfo.NeId == "" {
|
if neInfo.NeId != neId || neInfo.NeId == "" {
|
||||||
log.Error("neId is empty")
|
log.Error("neId is empty")
|
||||||
@@ -128,7 +128,7 @@ func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
neId := ctx.GetQuery(r, "ne_id")
|
neId := ctx.GetQuery(r, "ne_id")
|
||||||
neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId)
|
neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId)
|
||||||
|
|
||||||
if neInfo.NeId != neId || neInfo.NeId == "" {
|
if neInfo.NeId != neId || neInfo.NeId == "" {
|
||||||
log.Error("neId is empty")
|
log.Error("neId is empty")
|
||||||
@@ -181,7 +181,7 @@ func DeleteParamConfigToNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
neId := ctx.GetQuery(r, "ne_id")
|
neId := ctx.GetQuery(r, "ne_id")
|
||||||
neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId)
|
neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId)
|
||||||
|
|
||||||
if neInfo.NeId != neId || neInfo.NeId == "" {
|
if neInfo.NeId != neId || neInfo.NeId == "" {
|
||||||
log.Error("neId is empty")
|
log.Error("neId is empty")
|
||||||
|
|||||||
@@ -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 {
|
if neInfo.RmUID == ueEvent.RmUID {
|
||||||
// 推送到ws订阅组
|
// 推送到ws订阅组
|
||||||
if ueEvent.NeType == "MME" {
|
if ueEvent.NeType == "MME" {
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ func PostMML2ToNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
log.Debug("neType:", neType, "neId", neId)
|
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 {
|
if len(neInfoArr) < 1 {
|
||||||
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||||
return
|
return
|
||||||
@@ -235,7 +235,7 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
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 {
|
if len(neInfoArr) < 1 {
|
||||||
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||||
return
|
return
|
||||||
@@ -635,7 +635,7 @@ func PostMMLToOMC(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
log.Debug("neType:", neType, "neId", neId)
|
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 {
|
if len(neInfoArr) < 1 {
|
||||||
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -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
|
// custom kpi report to FE
|
||||||
kpiCEvent := map[string]any{
|
kpiCEvent := map[string]any{
|
||||||
// kip_id ...
|
// kip_id ...
|
||||||
@@ -335,135 +335,6 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
services.ResponseStatusOK204NoContent(w)
|
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 {
|
type MeasureTask struct {
|
||||||
Tasks []Task `json:"Tasks"`
|
Tasks []Task `json:"Tasks"`
|
||||||
NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */
|
NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId)
|
neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId)
|
||||||
|
|
||||||
var response services.MapResponse
|
var response services.MapResponse
|
||||||
if neInfo.NeId == neId && neInfo.NeId != "" {
|
if neInfo.NeId == neId && neInfo.NeId != "" {
|
||||||
|
|||||||
@@ -428,68 +428,6 @@ func XormParseResult(body []byte) ([]NeInfo, error) {
|
|||||||
return neInfo, nil
|
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) {
|
func ConstructUpdateSQLArray(tableName string, updateData interface{}, whereCondition string) (string, []string) {
|
||||||
log.Debug("ConstructUpdateSQL processing... ")
|
log.Debug("ConstructUpdateSQL processing... ")
|
||||||
log.Debug("Request updateData:", updateData)
|
log.Debug("Request updateData:", updateData)
|
||||||
|
|||||||
@@ -207,13 +207,6 @@ func init() {
|
|||||||
Register("PUT", cm.CustomUriSoftwareNE, cm.ActiveSoftwareToNF, nil)
|
Register("PUT", cm.CustomUriSoftwareNE, cm.ActiveSoftwareToNF, nil)
|
||||||
Register("PATCH", cm.CustomUriSoftwareNE, cm.RollBackSoftwareToNF, 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 跟踪任务
|
// Trace management 跟踪任务
|
||||||
Register("POST", trace.UriTraceTask, trace.PostTraceTaskToNF, midware.LogOperate(collectlogs.OptionNew("Trace Task", collectlogs.BUSINESS_TYPE_INSERT)))
|
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)))
|
Register("PUT", trace.UriTraceTask, trace.PutTraceTaskToNF, midware.LogOperate(collectlogs.OptionNew("Trace Task", collectlogs.BUSINESS_TYPE_UPDATE)))
|
||||||
|
|||||||
76
src/framework/utils/file/tar.go
Normal file
76
src/framework/utils/file/tar.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
@@ -11,19 +11,16 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var NewProcessor = &NeConfigBackupProcessor{
|
var NewProcessor = &NeConfigBackupProcessor{
|
||||||
neConfigBackupService: neService.NewNeConfigBackupImpl,
|
neConfigBackupService: neService.NewNeConfigBackup,
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
count: 0,
|
count: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
// NeConfigBackupProcessor 网元配置文件定期备份
|
// NeConfigBackupProcessor 网元配置文件定期备份
|
||||||
type NeConfigBackupProcessor struct {
|
type NeConfigBackupProcessor struct {
|
||||||
// 网元配置文件备份记录服务
|
neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务
|
||||||
neConfigBackupService neService.INeConfigBackup
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
// 网元信息服务
|
count int // 执行次数
|
||||||
neInfoService neService.INeInfo
|
|
||||||
// 执行次数
|
|
||||||
count int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *NeConfigBackupProcessor) Execute(data any) (any, error) {
|
func (s *NeConfigBackupProcessor) Execute(data any) (any, error) {
|
||||||
|
|||||||
@@ -15,19 +15,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 AlarmController 结构体
|
// 实例化控制层 AlarmController 结构体
|
||||||
var NewAlarmController = &AlarmController{
|
var NewAlarm = &AlarmController{
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
alarmService: neDataService.NewAlarmImpl,
|
alarmService: neDataService.NewAlarm,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 告警数据
|
// 告警数据
|
||||||
//
|
//
|
||||||
// PATH /alarm
|
// PATH /alarm
|
||||||
type AlarmController struct {
|
type AlarmController struct {
|
||||||
// 网元信息服务
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
neInfoService neService.INeInfo
|
alarmService *neDataService.Alarm // 告警信息服务
|
||||||
// 告警信息服务
|
|
||||||
alarmService neDataService.IAlarm
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 告警列表
|
// 告警列表
|
||||||
|
|||||||
@@ -11,19 +11,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 PerfKPIController 结构体
|
// 实例化控制层 PerfKPIController 结构体
|
||||||
var NewPerfKPIController = &PerfKPIController{
|
var NewPerfKPI = &PerfKPIController{
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
perfKPIService: neDataService.NewPerfKPIImpl,
|
perfKPIService: neDataService.NewPerfKPI,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 性能统计
|
// 性能统计
|
||||||
//
|
//
|
||||||
// PATH /kpi
|
// PATH /kpi
|
||||||
type PerfKPIController struct {
|
type PerfKPIController struct {
|
||||||
// 网元信息服务
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
neInfoService neService.INeInfo
|
perfKPIService *neDataService.PerfKPI // 统计信息服务
|
||||||
// 统计信息服务
|
|
||||||
perfKPIService neDataService.IPerfKPI
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取统计数据
|
// 获取统计数据
|
||||||
|
|||||||
@@ -22,19 +22,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 AMFController 结构体
|
// 实例化控制层 AMFController 结构体
|
||||||
var NewAMFController = &AMFController{
|
var NewAMF = &AMFController{
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
ueEventService: neDataService.NewUEEventAMFImpl,
|
ueEventService: neDataService.NewUEEventAMF,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元AMF
|
// 网元AMF
|
||||||
//
|
//
|
||||||
// PATH /amf
|
// PATH /amf
|
||||||
type AMFController struct {
|
type AMFController struct {
|
||||||
// 网元信息服务
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
neInfoService neService.INeInfo
|
ueEventService *neDataService.UEEventAMF // UE会话事件服务
|
||||||
// UE会话事件服务
|
|
||||||
ueEventService neDataService.IUEEventAMF
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UE会话列表
|
// UE会话列表
|
||||||
|
|||||||
@@ -23,19 +23,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 IMSController 结构体
|
// 实例化控制层 IMSController 结构体
|
||||||
var NewIMSController = &IMSController{
|
var NewIMS = &IMSController{
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
cdrEventService: neDataService.NewCDREventIMSImpl,
|
cdrEventService: neDataService.NewCDREventIMS,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元IMS
|
// 网元IMS
|
||||||
//
|
//
|
||||||
// PATH /ims
|
// PATH /ims
|
||||||
type IMSController struct {
|
type IMSController struct {
|
||||||
// 网元信息服务
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
neInfoService neService.INeInfo
|
cdrEventService *neDataService.CDREventIMS // CDR会话事件服务
|
||||||
// CDR会话事件服务
|
|
||||||
cdrEventService neDataService.ICDREventIMS
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CDR会话列表
|
// CDR会话列表
|
||||||
|
|||||||
@@ -23,19 +23,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 MMEController 结构体
|
// 实例化控制层 MMEController 结构体
|
||||||
var NewMMEController = &MMEController{
|
var NewMME = &MMEController{
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
ueEventService: neDataService.NewUEEventMMEImpl,
|
ueEventService: neDataService.NewUEEventMME,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元MME
|
// 网元MME
|
||||||
//
|
//
|
||||||
// PATH /mme
|
// PATH /mme
|
||||||
type MMEController struct {
|
type MMEController struct {
|
||||||
// 网元信息服务
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
neInfoService neService.INeInfo
|
ueEventService *neDataService.UEEventMME // UE会话事件服务
|
||||||
// UE会话事件服务
|
|
||||||
ueEventService neDataService.IUEEventMME
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UE会话列表
|
// UE会话列表
|
||||||
|
|||||||
@@ -22,22 +22,19 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 SMFController 结构体
|
// 实例化控制层 SMFController 结构体
|
||||||
var NewSMFController = &SMFController{
|
var NewSMF = &SMFController{
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
cdrEventService: neDataService.NewCDREventSMFImpl,
|
cdrEventService: neDataService.NewCDREventSMF,
|
||||||
udmUserInfoService: *neDataService.NewUDMUserInfo,
|
udmUserInfoService: neDataService.NewUDMUserInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元SMF
|
// 网元SMF
|
||||||
//
|
//
|
||||||
// PATH /smf
|
// PATH /smf
|
||||||
type SMFController struct {
|
type SMFController struct {
|
||||||
// 网元信息服务
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
neInfoService neService.INeInfo
|
cdrEventService *neDataService.CDREventSMF // CDR会话事件服务
|
||||||
// CDR会话事件服务
|
udmUserInfoService *neDataService.UDMUserInfo // UDM用户信息服务
|
||||||
cdrEventService neDataService.ICDREventSMF
|
|
||||||
// UDM用户信息服务
|
|
||||||
udmUserInfoService neDataService.UDMUserInfo
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CDR会话列表
|
// CDR会话列表
|
||||||
|
|||||||
@@ -22,19 +22,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 SMSCController 结构体
|
// 实例化控制层 SMSCController 结构体
|
||||||
var NewSMSCController = &SMSCController{
|
var NewSMSC = &SMSCController{
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
cdrEventService: neDataService.NewCDREventSMSCImpl,
|
cdrEventService: neDataService.NewCDREventSMSC,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元SMSC
|
// 网元SMSC
|
||||||
//
|
//
|
||||||
// PATH /smsc
|
// PATH /smsc
|
||||||
type SMSCController struct {
|
type SMSCController struct {
|
||||||
// 网元信息服务
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
neInfoService neService.INeInfo
|
cdrEventService *neDataService.CDREventSMSC // CDR会话事件服务
|
||||||
// CDR会话事件服务
|
|
||||||
cdrEventService neDataService.ICDREventSMSC
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CDR会话列表
|
// CDR会话列表
|
||||||
|
|||||||
@@ -24,17 +24,15 @@ import (
|
|||||||
// 实例化控制层 UDMAuthController 结构体
|
// 实例化控制层 UDMAuthController 结构体
|
||||||
var NewUDMAuth = &UDMAuthController{
|
var NewUDMAuth = &UDMAuthController{
|
||||||
udmAuthService: neDataService.NewUDMAuthUser,
|
udmAuthService: neDataService.NewUDMAuthUser,
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
// UDM鉴权用户
|
// UDM鉴权用户
|
||||||
//
|
//
|
||||||
// PATH /udm/auth
|
// PATH /udm/auth
|
||||||
type UDMAuthController struct {
|
type UDMAuthController struct {
|
||||||
// UDM鉴权信息服务
|
udmAuthService *neDataService.UDMAuthUser // UDM鉴权信息服务
|
||||||
udmAuthService *neDataService.UDMAuthUser
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
// 网元信息服务
|
|
||||||
neInfoService neService.INeInfo
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UDM鉴权用户重载数据
|
// UDM鉴权用户重载数据
|
||||||
|
|||||||
@@ -23,17 +23,15 @@ import (
|
|||||||
// 实例化控制层 UDMSubController 结构体
|
// 实例化控制层 UDMSubController 结构体
|
||||||
var NewUDMSub = &UDMSubController{
|
var NewUDMSub = &UDMSubController{
|
||||||
udmSubService: neDataService.NewUDMSub,
|
udmSubService: neDataService.NewUDMSub,
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
// UDM签约用户
|
// UDM签约用户
|
||||||
//
|
//
|
||||||
// PATH /udm/sub
|
// PATH /udm/sub
|
||||||
type UDMSubController struct {
|
type UDMSubController struct {
|
||||||
// UDM签约信息服务
|
udmSubService *neDataService.UDMSubUser // UDM签约信息服务
|
||||||
udmSubService *neDataService.UDMSubUser
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
// 网元信息服务
|
|
||||||
neInfoService neService.INeInfo
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UDM签约用户重载数据
|
// UDM签约用户重载数据
|
||||||
|
|||||||
@@ -10,19 +10,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 UPFController 结构体
|
// 实例化控制层 UPFController 结构体
|
||||||
var NewUPFController = &UPFController{
|
var NewUPF = &UPFController{
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
perfKPIService: neDataService.NewPerfKPIImpl,
|
perfKPIService: neDataService.NewPerfKPI,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元UPF
|
// 网元UPF
|
||||||
//
|
//
|
||||||
// PATH /upf
|
// PATH /upf
|
||||||
type UPFController struct {
|
type UPFController struct {
|
||||||
// 网元信息服务
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
neInfoService neService.INeInfo
|
perfKPIService *neDataService.PerfKPI // 统计信息服务
|
||||||
// 统计信息服务
|
|
||||||
perfKPIService neDataService.IPerfKPI
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 总流量数 N3上行 N6下行
|
// 总流量数 N3上行 N6下行
|
||||||
|
|||||||
@@ -21,11 +21,11 @@ func Setup(router *gin.Engine) {
|
|||||||
{
|
{
|
||||||
kpiGroup.GET("/title",
|
kpiGroup.GET("/title",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewPerfKPIController.Title,
|
controller.NewPerfKPI.Title,
|
||||||
)
|
)
|
||||||
kpiGroup.GET("/data",
|
kpiGroup.GET("/data",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewPerfKPIController.GoldKPI,
|
controller.NewPerfKPI.GoldKPI,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,11 +34,11 @@ func Setup(router *gin.Engine) {
|
|||||||
{
|
{
|
||||||
alarmGroup.GET("/list",
|
alarmGroup.GET("/list",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewAlarmController.List,
|
controller.NewAlarm.List,
|
||||||
)
|
)
|
||||||
alarmGroup.DELETE("/:alarmIds",
|
alarmGroup.DELETE("/:alarmIds",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewAlarmController.Remove,
|
controller.NewAlarm.Remove,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,17 +47,17 @@ func Setup(router *gin.Engine) {
|
|||||||
{
|
{
|
||||||
imsGroup.GET("/cdr/list",
|
imsGroup.GET("/cdr/list",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewIMSController.CDRList,
|
controller.NewIMS.CDRList,
|
||||||
)
|
)
|
||||||
imsGroup.DELETE("/cdr/:cdrIds",
|
imsGroup.DELETE("/cdr/:cdrIds",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_DELETE)),
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_DELETE)),
|
||||||
controller.NewIMSController.CDRRemove,
|
controller.NewIMS.CDRRemove,
|
||||||
)
|
)
|
||||||
imsGroup.POST("/cdr/export",
|
imsGroup.POST("/cdr/export",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_EXPORT)),
|
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",
|
smscGroup.GET("/cdr/list",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewSMSCController.CDRList,
|
controller.NewSMSC.CDRList,
|
||||||
)
|
)
|
||||||
smscGroup.DELETE("/cdr/:cdrIds",
|
smscGroup.DELETE("/cdr/:cdrIds",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_DELETE)),
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_DELETE)),
|
||||||
controller.NewSMSCController.CDRRemove,
|
controller.NewSMSC.CDRRemove,
|
||||||
)
|
)
|
||||||
smscGroup.POST("/cdr/export",
|
smscGroup.POST("/cdr/export",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_EXPORT)),
|
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",
|
smfGroup.GET("/cdr/list",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewSMFController.CDRList,
|
controller.NewSMF.CDRList,
|
||||||
)
|
)
|
||||||
smfGroup.DELETE("/cdr/:cdrIds",
|
smfGroup.DELETE("/cdr/:cdrIds",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_DELETE)),
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_DELETE)),
|
||||||
controller.NewSMFController.CDRRemove,
|
controller.NewSMF.CDRRemove,
|
||||||
)
|
)
|
||||||
smfGroup.POST("/cdr/export",
|
smfGroup.POST("/cdr/export",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_EXPORT)),
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_EXPORT)),
|
||||||
controller.NewSMFController.CDRExport,
|
controller.NewSMF.CDRExport,
|
||||||
)
|
)
|
||||||
smfGroup.GET("/subscribers",
|
smfGroup.GET("/subscribers",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewSMFController.SubUserList,
|
controller.NewSMF.SubUserList,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,17 +108,17 @@ func Setup(router *gin.Engine) {
|
|||||||
{
|
{
|
||||||
amfGroup.GET("/ue/list",
|
amfGroup.GET("/ue/list",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewAMFController.UEList,
|
controller.NewAMF.UEList,
|
||||||
)
|
)
|
||||||
amfGroup.DELETE("/ue/:ueIds",
|
amfGroup.DELETE("/ue/:ueIds",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_DELETE)),
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_DELETE)),
|
||||||
controller.NewAMFController.UERemove,
|
controller.NewAMF.UERemove,
|
||||||
)
|
)
|
||||||
amfGroup.POST("/ue/export",
|
amfGroup.POST("/ue/export",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_EXPORT)),
|
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",
|
upfGroup.GET("/totalFlow",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewUPFController.TotalFlow,
|
controller.NewUPF.TotalFlow,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,17 +244,17 @@ func Setup(router *gin.Engine) {
|
|||||||
{
|
{
|
||||||
mmeGroup.GET("/ue/list",
|
mmeGroup.GET("/ue/list",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewMMEController.UEList,
|
controller.NewMME.UEList,
|
||||||
)
|
)
|
||||||
mmeGroup.DELETE("/ue/:ueIds",
|
mmeGroup.DELETE("/ue/:ueIds",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_DELETE)),
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_DELETE)),
|
||||||
controller.NewMMEController.UERemove,
|
controller.NewMME.UERemove,
|
||||||
)
|
)
|
||||||
mmeGroup.POST("/ue/export",
|
mmeGroup.POST("/ue/export",
|
||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_EXPORT)),
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_EXPORT)),
|
||||||
controller.NewMMEController.UEExport,
|
controller.NewMME.UEExport,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,194 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
// 告警 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type IAlarm interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(querys model.AlarmQuery) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_data/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectByIds 通过ID查询
|
// 实例化数据层 Alarm 结构体
|
||||||
SelectByIds(ids []string) []model.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 批量删除信息
|
resultMap: map[string]string{
|
||||||
DeleteByIds(ids []string) int64
|
"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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,189 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
// CDR会话事件IMS 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type ICDREventIMS interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(querys model.CDREventIMSQuery) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_data/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectByIds 通过ID查询
|
// 实例化数据层 CDREventIMS 结构体
|
||||||
SelectByIds(cdrIds []string) []model.CDREventIMS
|
var NewCDREventIMS = &CDREventIMS{
|
||||||
|
selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`,
|
||||||
|
|
||||||
// DeleteByIds 批量删除信息
|
resultMap: map[string]string{
|
||||||
DeleteByIds(cdrIds []string) int64
|
"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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,170 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
// CDR会话事件SMF 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type ICDREventSMF interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(querys model.CDREventSMFQuery) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_data/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectByIds 通过ID查询
|
// 实例化数据层 CDREventSMF 结构体
|
||||||
SelectByIds(cdrIds []string) []model.CDREventSMF
|
var NewCDREventSMF = &CDREventSMF{
|
||||||
|
selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`,
|
||||||
|
|
||||||
// DeleteByIds 批量删除信息
|
resultMap: map[string]string{
|
||||||
DeleteByIds(cdrIds []string) int64
|
"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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,181 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
// CDR会话事件SMSC 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type ICDREventSMSC interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(querys model.CDREventSMSCQuery) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_data/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectByIds 通过ID查询
|
// 实例化数据层 CDREventSMSC 结构体
|
||||||
SelectByIds(cdrIds []string) []model.CDREventSMSC
|
var NewCDREventSMSC = &CDREventSMSC{
|
||||||
|
selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smsc`,
|
||||||
|
|
||||||
// DeleteByIds 批量删除信息
|
resultMap: map[string]string{
|
||||||
DeleteByIds(cdrIds []string) int64
|
"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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,131 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
// 性能统计 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type IPerfKPI interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectGoldKPI 通过网元指标数据信息
|
"be.ems/src/modules/network_data/model"
|
||||||
SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any
|
)
|
||||||
|
|
||||||
// SelectGoldKPITitle 网元对应的指标名称
|
// 实例化数据层 PerfKPI 结构体
|
||||||
SelectGoldKPITitle(neType string) []model.GoldKPITitle
|
var NewPerfKPI = &PerfKPI{}
|
||||||
|
|
||||||
// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行
|
// PerfKPI 性能统计 数据层处理
|
||||||
SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any
|
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]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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]
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,175 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
// UE会话事件AMF 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type IUEEventAMF interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(querys model.UEEventAMFQuery) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_data/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectByIds 通过ID查询
|
// 实例化数据层 UEEventAMF 结构体
|
||||||
SelectByIds(ueIds []string) []model.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 批量删除信息
|
resultMap: map[string]string{
|
||||||
DeleteByIds(ueIds []string) int64
|
"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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,175 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
// UE会话事件MME 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type IUEEventMME interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(querys model.UEEventMMEQuery) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_data/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectByIds 通过ID查询
|
// 实例化数据层 UEEventMME 结构体
|
||||||
SelectByIds(ueIds []string) []model.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 批量删除信息
|
resultMap: map[string]string{
|
||||||
DeleteByIds(ueIds []string) int64
|
"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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,39 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
// 告警 服务层接口
|
"be.ems/src/modules/network_data/model"
|
||||||
type IAlarm interface {
|
"be.ems/src/modules/network_data/repository"
|
||||||
// SelectPage 根据条件分页查询
|
)
|
||||||
SelectPage(querys model.AlarmQuery) map[string]any
|
|
||||||
|
|
||||||
// DeleteByIds 批量删除信息
|
// 实例化数据层 Alarm 结构体
|
||||||
DeleteByIds(ids []string) (int64, error)
|
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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,39 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
// CDR会话事件IMS 服务层接口
|
"be.ems/src/modules/network_data/model"
|
||||||
type ICDREventIMS interface {
|
"be.ems/src/modules/network_data/repository"
|
||||||
// SelectPage 根据条件分页查询
|
)
|
||||||
SelectPage(querys model.CDREventIMSQuery) map[string]any
|
|
||||||
|
|
||||||
// DeleteByIds 批量删除信息
|
// 实例化数据层 CDREventIMS 结构体
|
||||||
DeleteByIds(cdrIds []string) (int64, error)
|
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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,39 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
// CDR会话事件SMF 服务层接口
|
"be.ems/src/modules/network_data/model"
|
||||||
type ICDREventSMF interface {
|
"be.ems/src/modules/network_data/repository"
|
||||||
// SelectPage 根据条件分页查询
|
)
|
||||||
SelectPage(querys model.CDREventSMFQuery) map[string]any
|
|
||||||
|
|
||||||
// DeleteByIds 批量删除信息
|
// 实例化数据层 CDREventSMF 结构体
|
||||||
DeleteByIds(cdrIds []string) (int64, error)
|
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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,39 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
// CDR会话事件SMSC 服务层接口
|
"be.ems/src/modules/network_data/model"
|
||||||
type ICDREventSMSC interface {
|
"be.ems/src/modules/network_data/repository"
|
||||||
// SelectPage 根据条件分页查询
|
)
|
||||||
SelectPage(querys model.CDREventSMSCQuery) map[string]any
|
|
||||||
|
|
||||||
// DeleteByIds 批量删除信息
|
// 实例化数据层 CDREventSMSC 结构体
|
||||||
DeleteByIds(cdrIds []string) (int64, error)
|
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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,79 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
// 性能统计 服务层接口
|
"be.ems/src/framework/constants/cachekey"
|
||||||
type IPerfKPI interface {
|
"be.ems/src/framework/redis"
|
||||||
// SelectGoldKPI 通过网元指标数据信息
|
"be.ems/src/modules/network_data/model"
|
||||||
SelectGoldKPI(query model.GoldKPIQuery) []map[string]any
|
"be.ems/src/modules/network_data/repository"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectGoldKPITitle 网元对应的指标名称
|
// 实例化数据层 PerfKPI 结构体
|
||||||
SelectGoldKPITitle(neType string) []model.GoldKPITitle
|
var NewPerfKPI = &PerfKPI{
|
||||||
|
perfKPIRepository: repository.NewPerfKPI,
|
||||||
// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行
|
}
|
||||||
SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any
|
|
||||||
|
// 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,40 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
// UE会话事件AMF 服务层接口
|
"be.ems/src/modules/network_data/model"
|
||||||
type IUEEventAMF interface {
|
"be.ems/src/modules/network_data/repository"
|
||||||
// SelectPage 根据条件分页查询
|
)
|
||||||
SelectPage(querys model.UEEventAMFQuery) map[string]any
|
|
||||||
|
|
||||||
// DeleteByIds 批量删除信息
|
// 实例化数据层 UEEventAMF 结构体
|
||||||
DeleteByIds(ueIds []string) (int64, error)
|
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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,39 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_data/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
// UE会话事件MME 服务层接口
|
"be.ems/src/modules/network_data/model"
|
||||||
type IUEEventMME interface {
|
"be.ems/src/modules/network_data/repository"
|
||||||
// SelectPage 根据条件分页查询
|
)
|
||||||
SelectPage(querys model.UEEventMMEQuery) map[string]any
|
|
||||||
|
|
||||||
// DeleteByIds 批量删除信息
|
// 实例化数据层 UEEventMME 结构体
|
||||||
DeleteByIds(ueIds []string) (int64, error)
|
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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
|
||||||
}
|
|
||||||
@@ -20,7 +20,7 @@ import (
|
|||||||
|
|
||||||
// 实例化控制层 NeActionController 结构体
|
// 实例化控制层 NeActionController 结构体
|
||||||
var NewNeAction = &NeActionController{
|
var NewNeAction = &NeActionController{
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元处理请求
|
// 网元处理请求
|
||||||
@@ -28,7 +28,7 @@ var NewNeAction = &NeActionController{
|
|||||||
// PATH /action
|
// PATH /action
|
||||||
type NeActionController struct {
|
type NeActionController struct {
|
||||||
// 网元信息服务
|
// 网元信息服务
|
||||||
neInfoService neService.INeInfo
|
neInfoService *neService.NeInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送文件从本地到网元
|
// 发送文件从本地到网元
|
||||||
|
|||||||
@@ -18,18 +18,16 @@ import (
|
|||||||
|
|
||||||
// NewNeConfig 网元参数配置 实例化控制层
|
// NewNeConfig 网元参数配置 实例化控制层
|
||||||
var NewNeConfig = &NeConfigController{
|
var NewNeConfig = &NeConfigController{
|
||||||
neConfigService: neService.NewNeConfigImpl,
|
neConfigService: neService.NewNeConfig,
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元参数配置
|
// 网元参数配置
|
||||||
//
|
//
|
||||||
// PATH /config
|
// PATH /config
|
||||||
type NeConfigController struct {
|
type NeConfigController struct {
|
||||||
// 网元参数配置可用属性值服务
|
neConfigService *neService.NeConfig // 网元参数配置可用属性值服务
|
||||||
neConfigService neService.INeConfig
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
// 网元信息服务
|
|
||||||
neInfoService neService.INeInfo
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元参数配置可用属性值列表
|
// 网元参数配置可用属性值列表
|
||||||
|
|||||||
@@ -18,18 +18,16 @@ import (
|
|||||||
|
|
||||||
// NewNeConfigBackup 实例化控制层 NeConfigBackupController 结构体
|
// NewNeConfigBackup 实例化控制层 NeConfigBackupController 结构体
|
||||||
var NewNeConfigBackup = &NeConfigBackupController{
|
var NewNeConfigBackup = &NeConfigBackupController{
|
||||||
neConfigBackupService: neService.NewNeConfigBackupImpl,
|
neConfigBackupService: neService.NewNeConfigBackup,
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元配置文件备份记录
|
// 网元配置文件备份记录
|
||||||
//
|
//
|
||||||
// PATH /config/backup
|
// PATH /config/backup
|
||||||
type NeConfigBackupController struct {
|
type NeConfigBackupController struct {
|
||||||
// 网元配置文件备份记录服务
|
neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务
|
||||||
neConfigBackupService neService.INeConfigBackup
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
// 网元信息服务
|
|
||||||
neInfoService neService.INeInfo
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元配置文件备份记录列表
|
// 网元配置文件备份记录列表
|
||||||
|
|||||||
@@ -17,15 +17,14 @@ import (
|
|||||||
|
|
||||||
// 实例化控制层 NeHostController 结构体
|
// 实例化控制层 NeHostController 结构体
|
||||||
var NewNeHost = &NeHostController{
|
var NewNeHost = &NeHostController{
|
||||||
neHostService: neService.NewNeHostImpl,
|
neHostService: neService.NewNeHost,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元主机连接请求
|
// 网元主机连接请求
|
||||||
//
|
//
|
||||||
// PATH /host
|
// PATH /host
|
||||||
type NeHostController struct {
|
type NeHostController struct {
|
||||||
// 网元主机连接服务
|
neHostService *neService.NeHost // 网元主机连接服务
|
||||||
neHostService neService.INeHost
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元主机列表
|
// 网元主机列表
|
||||||
|
|||||||
@@ -15,15 +15,14 @@ import (
|
|||||||
|
|
||||||
// 实例化控制层 NeHostCmdController 结构体
|
// 实例化控制层 NeHostCmdController 结构体
|
||||||
var NewNeHostCmd = &NeHostCmdController{
|
var NewNeHostCmd = &NeHostCmdController{
|
||||||
neHostCmdService: neService.NewNeHostCmdImpl,
|
neHostCmdService: neService.NewNeHostCmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元主机命令请求
|
// 网元主机命令请求
|
||||||
//
|
//
|
||||||
// PATH /hostCmd
|
// PATH /hostCmd
|
||||||
type NeHostCmdController struct {
|
type NeHostCmdController struct {
|
||||||
// 网元主机命令服务
|
neHostCmdService *neService.NeHostCmd // 网元主机命令服务
|
||||||
neHostCmdService neService.INeHostCmd
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元主机命令列表
|
// 网元主机命令列表
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ import (
|
|||||||
|
|
||||||
// 实例化控制层 NeInfoController 结构体
|
// 实例化控制层 NeInfoController 结构体
|
||||||
var NewNeInfo = &NeInfoController{
|
var NewNeInfo = &NeInfoController{
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
neLicenseService: neService.NewNeLicenseImpl,
|
neLicenseService: neService.NewNeLicense,
|
||||||
neVersionService: neService.NewNeVersion,
|
neVersionService: neService.NewNeVersion,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,12 +27,9 @@ var NewNeInfo = &NeInfoController{
|
|||||||
//
|
//
|
||||||
// PATH /info
|
// PATH /info
|
||||||
type NeInfoController struct {
|
type NeInfoController struct {
|
||||||
// 网元信息服务
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
neInfoService neService.INeInfo
|
neLicenseService *neService.NeLicense // 网元授权激活信息服务
|
||||||
// 网元授权激活信息服务
|
neVersionService *neService.NeVersion // 网元版本信息服务
|
||||||
neLicenseService neService.INeLicense
|
|
||||||
// 网元版本信息服务
|
|
||||||
neVersionService *neService.NeVersion
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// neStateCacheMap 网元状态缓存最后一次成功的信息
|
// neStateCacheMap 网元状态缓存最后一次成功的信息
|
||||||
|
|||||||
@@ -15,18 +15,16 @@ import (
|
|||||||
|
|
||||||
// 实例化控制层 NeLicenseController 结构体
|
// 实例化控制层 NeLicenseController 结构体
|
||||||
var NewNeLicense = &NeLicenseController{
|
var NewNeLicense = &NeLicenseController{
|
||||||
neLicenseService: neService.NewNeLicenseImpl,
|
neLicenseService: neService.NewNeLicense,
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
neInfoService: neService.NewNeInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元授权激活请求
|
// 网元授权激活请求
|
||||||
//
|
//
|
||||||
// PATH /license
|
// PATH /license
|
||||||
type NeLicenseController struct {
|
type NeLicenseController struct {
|
||||||
// 网元授权激活服务
|
neLicenseService *neService.NeLicense // 网元授权激活服务
|
||||||
neLicenseService neService.INeLicense
|
neInfoService *neService.NeInfo // 网元信息服务
|
||||||
// 网元信息服务
|
|
||||||
neInfoService neService.INeInfo
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元授权激活列表
|
// 网元授权激活列表
|
||||||
|
|||||||
@@ -15,15 +15,14 @@ import (
|
|||||||
|
|
||||||
// 实例化控制层 NeSoftwareController 结构体
|
// 实例化控制层 NeSoftwareController 结构体
|
||||||
var NewNeSoftware = &NeSoftwareController{
|
var NewNeSoftware = &NeSoftwareController{
|
||||||
neSoftwareService: neService.NewNeSoftwareImpl,
|
neSoftwareService: neService.NewNeSoftware,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元软件包请求
|
// 网元软件包请求
|
||||||
//
|
//
|
||||||
// PATH /software
|
// PATH /software
|
||||||
type NeSoftwareController struct {
|
type NeSoftwareController struct {
|
||||||
// 网元软件包服务
|
neSoftwareService *neService.NeSoftware // 网元软件包服务
|
||||||
neSoftwareService neService.INeSoftware
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元软件包列表
|
// 网元软件包列表
|
||||||
|
|||||||
@@ -18,8 +18,7 @@ var NewNeVersion = &NeVersionController{
|
|||||||
//
|
//
|
||||||
// PATH /version
|
// PATH /version
|
||||||
type NeVersionController struct {
|
type NeVersionController struct {
|
||||||
// 网元版本服务
|
neVersionService *neService.NeVersion // 网元版本服务
|
||||||
neVersionService *neService.NeVersion
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元版本列表
|
// 网元版本列表
|
||||||
|
|||||||
@@ -351,13 +351,13 @@ func Setup(router *gin.Engine) {
|
|||||||
// InitLoad 初始参数
|
// InitLoad 初始参数
|
||||||
func InitLoad() {
|
func InitLoad() {
|
||||||
// 启动时,清除缓存-网元类型
|
// 启动时,清除缓存-网元类型
|
||||||
service.NewNeInfoImpl.ClearNeCacheByNeType("*")
|
service.NewNeInfo.ClearNeCacheByNeType("*")
|
||||||
service.NewNeInfoImpl.SelectNeInfoByRmuid("")
|
service.NewNeInfo.SelectNeInfoByRmuid("")
|
||||||
// 启动时,网元公共参数数据记录到全局变量
|
// 启动时,网元公共参数数据记录到全局变量
|
||||||
if para5GMap, err := service.NewNeInfoImpl.NeConfPara5GRead(); para5GMap != nil && err == nil {
|
if para5GMap, err := service.NewNeInfo.NeConfPara5GRead(); para5GMap != nil && err == nil {
|
||||||
service.NewNeInfoImpl.NeConfPara5GWirte(para5GMap, nil)
|
service.NewNeInfo.NeConfPara5GWirte(para5GMap, nil)
|
||||||
}
|
}
|
||||||
// 启动时,清除缓存-网元参数配置可用属性值
|
// 启动时,清除缓存-网元参数配置可用属性值
|
||||||
service.NewNeConfigImpl.ClearNeCacheByNeType("*")
|
service.NewNeConfig.ClearNeCacheByNeType("*")
|
||||||
service.NewNeConfigImpl.RefreshByNeTypeAndNeID("*")
|
service.NewNeConfig.RefreshByNeTypeAndNeID("*")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,259 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
// INeConfig 网元参数配置可用属性值 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type INeConfig interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询字典类型
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(query map[string]any) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_element/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化数据层 NeConfig 结构体
|
||||||
SelectList(param model.NeConfig) []model.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查询
|
resultMap: map[string]string{
|
||||||
SelectByIds(ids []string) []model.NeConfig
|
"id": "ID",
|
||||||
|
"ne_type": "NeType",
|
||||||
// Insert 新增信息
|
"param_name": "ParamName",
|
||||||
Insert(param model.NeConfig) string
|
"param_display": "ParamDisplay",
|
||||||
|
"param_type": "ParamType",
|
||||||
// Update 修改信息
|
"param_json": "ParamJson",
|
||||||
Update(param model.NeConfig) int64
|
"param_sort": "ParamSort",
|
||||||
|
"param_perms": "ParamPerms",
|
||||||
// DeleteByIds 批量删除信息
|
"update_time": "UpdateTime",
|
||||||
DeleteByIds(ids []string) int64
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,24 +1,262 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
// INeConfigBackup 网元配置文件备份记录 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type INeConfigBackup interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询字典类型
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(query map[string]any) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_element/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化数据层 NeConfigBackup 结构体
|
||||||
SelectList(item model.NeConfigBackup) []model.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查询
|
resultMap: map[string]string{
|
||||||
SelectByIds(ids []string) []model.NeConfigBackup
|
"id": "ID",
|
||||||
|
"ne_type": "NeType",
|
||||||
// Insert 新增信息
|
"ne_id": "NeId",
|
||||||
Insert(item model.NeConfigBackup) string
|
"name": "Name",
|
||||||
|
"path": "Path",
|
||||||
// Update 修改信息
|
"remark": "Remark",
|
||||||
Update(item model.NeConfigBackup) int64
|
"create_by": "CreateBy",
|
||||||
|
"create_time": "CreateTime",
|
||||||
// DeleteByIds 批量删除信息
|
"update_by": "UpdateBy",
|
||||||
DeleteByIds(ids []string) int64
|
"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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,27 +1,376 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
// INeHost 网元主机连接 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type INeHost interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询字典类型
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(query map[string]any) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_element/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化数据层 NeHost 结构体
|
||||||
SelectList(neHost model.NeHost) []model.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查询
|
resultMap: map[string]string{
|
||||||
SelectByIds(hostIds []string) []model.NeHost
|
"host_id": "HostID",
|
||||||
|
"host_type": "HostType",
|
||||||
// Insert 新增信息
|
"group_id": "GroupID",
|
||||||
Insert(neHost model.NeHost) string
|
"title": "Title",
|
||||||
|
"addr": "Addr",
|
||||||
// Update 修改信息
|
"port": "Port",
|
||||||
Update(neHost model.NeHost) int64
|
"user": "User",
|
||||||
|
"auth_mode": "AuthMode",
|
||||||
// DeleteByIds 批量删除网元主机连接信息
|
"password": "Password",
|
||||||
DeleteByIds(hostIds []string) int64
|
"private_key": "PrivateKey",
|
||||||
|
"private_password": "PassPhrase",
|
||||||
// CheckUniqueNeHost 校验主机是否唯一
|
"remark": "Remark",
|
||||||
CheckUniqueNeHost(neHost model.NeHost) string
|
"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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,27 +1,306 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
// INeHostCmd 网元主机命令 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type INeHostCmd interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询字典类型
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(query map[string]any) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_element/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化数据层 NeHostCmd 结构体
|
||||||
SelectList(neHostCmd model.NeHostCmd) []model.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查询
|
resultMap: map[string]string{
|
||||||
SelectByIds(cmdIds []string) []model.NeHostCmd
|
"cmd_id": "CmdID",
|
||||||
|
"cmd_type": "CmdType",
|
||||||
// Insert 新增信息
|
"group_id": "GroupID",
|
||||||
Insert(neHostCmd model.NeHostCmd) string
|
"title": "Title",
|
||||||
|
"command": "Command",
|
||||||
// Update 修改信息
|
"remark": "Remark",
|
||||||
Update(neHostCmd model.NeHostCmd) int64
|
"create_by": "CreateBy",
|
||||||
|
"create_time": "CreateTime",
|
||||||
// DeleteByIds 批量删除信息
|
"update_by": "UpdateBy",
|
||||||
DeleteByIds(cmdIds []string) int64
|
"update_time": "UpdateTime",
|
||||||
|
},
|
||||||
// CheckUniqueGroupTitle 校验同类型组内是否唯一
|
}
|
||||||
CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string
|
|
||||||
|
// 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,32 +1,405 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import (
|
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"
|
"be.ems/src/modules/network_element/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 网元信息 数据层接口
|
// neListSort 网元列表预设排序
|
||||||
type INeInfo interface {
|
var neListSort = []string{
|
||||||
// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息
|
"OMC",
|
||||||
SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo
|
"IMS",
|
||||||
|
"AMF",
|
||||||
// SelectPage 根据条件分页查询
|
"AUSF",
|
||||||
SelectPage(query map[string]any) map[string]any
|
"UDM",
|
||||||
|
"SMF",
|
||||||
// SelectList 查询列表
|
"PCF",
|
||||||
SelectList(neInfo model.NeInfo) []model.NeInfo
|
"NSSF",
|
||||||
|
"NRF",
|
||||||
// SelectByIds 通过ID查询
|
"UPF",
|
||||||
SelectByIds(infoIds []string) []model.NeInfo
|
"LMF",
|
||||||
|
"NEF",
|
||||||
// Insert 新增信息
|
"MME",
|
||||||
Insert(neInfo model.NeInfo) string
|
"N3IWF",
|
||||||
|
"MOCNGW",
|
||||||
// Update 修改信息
|
"SMSC",
|
||||||
Update(neInfo model.NeInfo) int64
|
"CBC",
|
||||||
|
}
|
||||||
// DeleteByIds 批量删除网元信息
|
|
||||||
DeleteByIds(infoIds []string) int64
|
// 实例化数据层 NeInfo 结构体
|
||||||
|
var NewNeInfo = &NeInfo{
|
||||||
// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一
|
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`,
|
||||||
CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string
|
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,24 +1,297 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
// INeLicense 网元授权激活信息 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type INeLicense interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询字典类型
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(query map[string]any) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_element/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化数据层 NeLicense 结构体
|
||||||
SelectList(neLicense model.NeLicense) []model.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查询
|
resultMap: map[string]string{
|
||||||
SelectByIds(ids []string) []model.NeLicense
|
"id": "ID",
|
||||||
|
"ne_type": "NeType",
|
||||||
// Insert 新增信息
|
"ne_id": "NeId",
|
||||||
Insert(neLicense model.NeLicense) string
|
"activation_request_code": "ActivationRequestCode",
|
||||||
|
"license_path": "LicensePath",
|
||||||
// Update 修改信息
|
"serial_num": "SerialNum",
|
||||||
Update(neLicense model.NeLicense) int64
|
"expiry_date": "ExpiryDate",
|
||||||
|
"status": "Status",
|
||||||
// DeleteByIds 批量删除信息
|
"remark": "Remark",
|
||||||
DeleteByIds(ids []string) int64
|
"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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,27 +1,317 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
// INeSoftware 网元软件包信息 数据层接口
|
"be.ems/src/framework/datasource"
|
||||||
type INeSoftware interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询字典类型
|
"be.ems/src/framework/utils/parse"
|
||||||
SelectPage(query map[string]any) map[string]any
|
"be.ems/src/framework/utils/repo"
|
||||||
|
"be.ems/src/modules/network_element/model"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化数据层 NeSoftware 结构体
|
||||||
SelectList(neSoftware model.NeSoftware) []model.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查询
|
resultMap: map[string]string{
|
||||||
SelectByIds(ids []string) []model.NeSoftware
|
"id": "ID",
|
||||||
|
"ne_type": "NeType",
|
||||||
// Insert 新增信息
|
"name": "Name",
|
||||||
Insert(neSoftware model.NeSoftware) string
|
"path": "Path",
|
||||||
|
"version": "Version",
|
||||||
// Update 修改信息
|
"description": "Description",
|
||||||
Update(neSoftware model.NeSoftware) int64
|
"create_by": "CreateBy",
|
||||||
|
"create_time": "CreateTime",
|
||||||
// DeleteByIds 批量删除信息
|
"update_by": "UpdateBy",
|
||||||
DeleteByIds(ids []string) int64
|
"update_time": "UpdateTime",
|
||||||
|
},
|
||||||
// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一
|
}
|
||||||
CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string
|
|
||||||
|
// 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,36 +1,163 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
// INeConfig 网元参数配置可用属性值 服务层接口
|
"be.ems/src/framework/constants/cachekey"
|
||||||
type INeConfig interface {
|
"be.ems/src/framework/redis"
|
||||||
// RefreshByNeType 通过ne_type刷新redis中的缓存
|
"be.ems/src/modules/network_element/model"
|
||||||
RefreshByNeTypeAndNeID(neType string) []model.NeConfig
|
"be.ems/src/modules/network_element/repository"
|
||||||
|
)
|
||||||
|
|
||||||
// ClearNeCacheByNeType 清除网元类型参数配置缓存
|
// 实例化服务层 NeConfig 结构体
|
||||||
ClearNeCacheByNeType(neType string) bool
|
var NewNeConfig = &NeConfig{
|
||||||
|
neConfigRepository: repository.NewNeConfig,
|
||||||
// SelectNeConfigByNeType 查询网元类型参数配置
|
}
|
||||||
SelectNeConfigByNeType(neType string) []model.NeConfig
|
|
||||||
|
// NeConfig 网元参数配置可用属性值 服务层处理
|
||||||
// SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名
|
type NeConfig struct {
|
||||||
SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig
|
neConfigRepository *repository.NeConfig // 网元参数配置可用属性值表
|
||||||
|
}
|
||||||
// SelectNeHostPage 分页查询列表数据
|
|
||||||
SelectPage(query map[string]any) map[string]any
|
// RefreshByNeType 通过ne_type刷新redis中的缓存
|
||||||
|
func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig {
|
||||||
// SelectList 根据实体查询
|
// 多个
|
||||||
SelectList(param model.NeConfig) []model.NeConfig
|
if neType == "" || neType == "*" {
|
||||||
|
neConfigList := r.neConfigRepository.SelectList(model.NeConfig{})
|
||||||
// SelectByIds 通过ID查询
|
if len(neConfigList) > 0 {
|
||||||
SelectById(id string) model.NeConfig
|
neConfigGroup := map[string][]model.NeConfig{}
|
||||||
|
for _, v := range neConfigList {
|
||||||
// Insert 新增信息
|
if item, ok := neConfigGroup[v.NeType]; ok {
|
||||||
Insert(param model.NeConfig) string
|
neConfigGroup[v.NeType] = append(item, v)
|
||||||
|
} else {
|
||||||
// Update 修改信息
|
neConfigGroup[v.NeType] = []model.NeConfig{v}
|
||||||
Update(param model.NeConfig) int64
|
}
|
||||||
|
}
|
||||||
// DeleteByIds 批量删除信息
|
for k, v := range neConfigGroup {
|
||||||
DeleteByIds(ids []string) (int64, error)
|
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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
|
||||||
}
|
|
||||||
@@ -1,30 +1,201 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
// INeConfigBackup 网元配置文件备份记录 服务层接口
|
"be.ems/src/framework/utils/date"
|
||||||
type INeConfigBackup interface {
|
"be.ems/src/framework/utils/file"
|
||||||
// SelectNeHostPage 分页查询列表数据
|
"be.ems/src/modules/network_element/model"
|
||||||
SelectPage(query map[string]any) map[string]any
|
"be.ems/src/modules/network_element/repository"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化服务层 NeConfigBackup 结构体
|
||||||
SelectList(item model.NeConfigBackup) []model.NeConfigBackup
|
var NewNeConfigBackup = &NeConfigBackup{
|
||||||
|
neConfigBackupRepository: repository.NewNeConfigBackup,
|
||||||
// SelectByIds 通过ID查询
|
}
|
||||||
SelectById(id string) model.NeConfigBackup
|
|
||||||
|
// NeConfigBackup 网元配置文件备份记录 服务层处理
|
||||||
// Insert 新增信息
|
type NeConfigBackup struct {
|
||||||
Insert(item model.NeConfigBackup) string
|
neConfigBackupRepository *repository.NeConfigBackup // 网元配置文件备份记录
|
||||||
|
}
|
||||||
// Update 修改信息
|
|
||||||
Update(item model.NeConfigBackup) int64
|
// SelectNeHostPage 分页查询列表数据
|
||||||
|
func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any {
|
||||||
// DeleteByIds 批量删除信息
|
return r.neConfigBackupRepository.SelectPage(query)
|
||||||
DeleteByIds(ids []string) (int64, error)
|
}
|
||||||
|
|
||||||
// NeConfigLocalToNe 网元配置文件复制到网元端覆盖
|
// SelectConfigList 查询列表
|
||||||
NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error
|
func (r *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup {
|
||||||
|
return r.neConfigBackupRepository.SelectList(item)
|
||||||
// NeConfigNeToLocal 网元备份文件网元端复制到本地
|
}
|
||||||
NeConfigNeToLocal(neInfo model.NeInfo) (string, error)
|
|
||||||
|
// 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,30 +1,171 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
// INeHost 网元主机连接 服务层接口
|
"be.ems/src/framework/config"
|
||||||
type INeHost interface {
|
"be.ems/src/framework/logger"
|
||||||
// SelectPage 根据条件分页查询字典类型
|
"be.ems/src/framework/utils/crypto"
|
||||||
SelectPage(query map[string]any) map[string]any
|
"be.ems/src/modules/network_element/model"
|
||||||
|
"be.ems/src/modules/network_element/repository"
|
||||||
|
)
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化服务层 NeHost 结构体
|
||||||
SelectList(neHost model.NeHost) []model.NeHost
|
var NewNeHost = &NeHost{
|
||||||
|
neHostRepository: repository.NewNeHost,
|
||||||
// SelectById 通过ID查询
|
}
|
||||||
SelectById(hostId string) model.NeHost
|
|
||||||
|
// NeHost 网元主机连接 服务层处理
|
||||||
// CheckUniqueHostTitle 校验分组组和主机名称是否唯一
|
type NeHost struct {
|
||||||
CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool
|
neHostRepository *repository.NeHost // 网元主机连接表
|
||||||
|
}
|
||||||
// Insert 新增信息
|
|
||||||
Insert(neHost model.NeHost) string
|
// SelectNeHostPage 分页查询列表数据
|
||||||
|
func (r *NeHost) SelectPage(query map[string]any) map[string]any {
|
||||||
// Update 修改信息
|
return r.neHostRepository.SelectPage(query)
|
||||||
Update(neHost model.NeHost) int64
|
}
|
||||||
|
|
||||||
// Insert 批量添加
|
// SelectConfigList 查询列表
|
||||||
Inserts(neHosts []model.NeHost) int64
|
func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost {
|
||||||
|
return r.neHostRepository.SelectList(neHost)
|
||||||
// DeleteByIds 批量删除网元主机连接信息
|
}
|
||||||
DeleteByIds(hostIds []string) (int64, error)
|
|
||||||
|
// 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 == ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 == ""
|
|
||||||
}
|
|
||||||
@@ -1,27 +1,79 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
// INeHostCmd 网元主机命令 服务层接口
|
"be.ems/src/modules/network_element/model"
|
||||||
type INeHostCmd interface {
|
"be.ems/src/modules/network_element/repository"
|
||||||
// SelectPage 根据条件分页查询字典类型
|
)
|
||||||
SelectPage(query map[string]any) map[string]any
|
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化服务层 NeHostCmd 结构体
|
||||||
SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd
|
var NewNeHostCmd = &NeHostCmd{
|
||||||
|
neHostCmdRepository: repository.NewNeHostCmd,
|
||||||
// SelectByIds 通过ID查询
|
}
|
||||||
SelectById(cmdId string) model.NeHostCmd
|
|
||||||
|
// NeHostCmd 网元主机命令 服务层处理
|
||||||
// Insert 新增信息
|
type NeHostCmd struct {
|
||||||
Insert(neHostCmd model.NeHostCmd) string
|
neHostCmdRepository *repository.NeHostCmd // 网元主机命令表
|
||||||
|
}
|
||||||
// Update 修改信息
|
|
||||||
Update(neHostCmd model.NeHostCmd) int64
|
// SelectNeHostPage 分页查询列表数据
|
||||||
|
func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any {
|
||||||
// DeleteByIds 批量删除信息
|
return r.neHostCmdRepository.SelectPage(query)
|
||||||
DeleteByIds(cmdIds []string) (int64, error)
|
}
|
||||||
|
|
||||||
// CheckUniqueGroupTitle 校验同类型组内是否唯一
|
// SelectConfigList 查询列表
|
||||||
CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool
|
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 == ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 == ""
|
|
||||||
}
|
|
||||||
@@ -1,72 +1,918 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
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/telnet"
|
||||||
|
"be.ems/src/framework/utils/parse"
|
||||||
"be.ems/src/framework/utils/ssh"
|
"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/model"
|
||||||
|
"be.ems/src/modules/network_element/repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 网元信息 服务层接口
|
// 实例化服务层 NeInfo 结构体
|
||||||
type INeInfo interface {
|
var NewNeInfo = &NeInfo{
|
||||||
// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息
|
neInfoRepository: repository.NewNeInfo,
|
||||||
SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo
|
Para5GData: map[string]string{},
|
||||||
|
}
|
||||||
// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存
|
|
||||||
RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo
|
// 网元信息 服务层处理
|
||||||
|
type NeInfo struct {
|
||||||
// ClearNeCacheByNeType 清除网元类型缓存
|
// 网元信息数据信息
|
||||||
ClearNeCacheByNeType(neType string) bool
|
neInfoRepository *repository.NeInfo
|
||||||
|
Para5GData map[string]string
|
||||||
// SelectNeInfoByRmuid 通过rmUID查询网元信息
|
}
|
||||||
SelectNeInfoByRmuid(rmUid string) model.NeInfo
|
|
||||||
|
// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息
|
||||||
// SelectPage 根据条件分页查询
|
func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo {
|
||||||
//
|
var neInfo model.NeInfo
|
||||||
// bandStatus 带状态信息
|
key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID)
|
||||||
SelectPage(query map[string]any, bandStatus bool) map[string]any
|
jsonStr, _ := redis.Get("", key)
|
||||||
|
if len(jsonStr) > 7 {
|
||||||
// SelectList 查询列表
|
err := json.Unmarshal([]byte(jsonStr), &neInfo)
|
||||||
//
|
if err != nil {
|
||||||
// bandStatus 带状态信息
|
neInfo = model.NeInfo{}
|
||||||
// bandHost 带主机信息
|
}
|
||||||
SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo
|
} else {
|
||||||
|
neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID)
|
||||||
// SelectByIds 通过ID查询
|
if neInfo.ID != "" && neInfo.NeId == neID {
|
||||||
//
|
redis.Del("", key)
|
||||||
// bandStatus 带主机信息
|
values, _ := json.Marshal(neInfo)
|
||||||
SelectById(infoId string, bandHost bool) model.NeInfo
|
redis.Set("", key, string(values))
|
||||||
|
}
|
||||||
// Insert 新增信息
|
}
|
||||||
Insert(neInfo model.NeInfo) string
|
return neInfo
|
||||||
|
}
|
||||||
// Update 修改信息
|
|
||||||
Update(neInfo model.NeInfo) int64
|
// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存
|
||||||
|
func (r *NeInfo) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo {
|
||||||
// DeleteByIds 批量删除信息
|
var neInfo model.NeInfo
|
||||||
DeleteByIds(infoIds []string) (int64, error)
|
key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID)
|
||||||
|
redis.Del("", key)
|
||||||
// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一
|
neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID)
|
||||||
CheckUniqueNeTypeAndNeId(neType, neId, id string) bool
|
if neInfo.ID != "" && neInfo.NeId == neID {
|
||||||
|
values, _ := json.Marshal(neInfo)
|
||||||
// NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close()
|
redis.Set("", key, string(values))
|
||||||
NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error)
|
}
|
||||||
|
return neInfo
|
||||||
// NeRunSSHCmd 网元主机的SSH客户端发送cmd命令
|
}
|
||||||
NeRunSSHCmd(neType, neId, cmd string) (string, error)
|
|
||||||
|
// ClearNeCacheByNeType 清除网元类型缓存
|
||||||
// NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close()
|
func (r *NeInfo) ClearNeCacheByNeType(neType string) bool {
|
||||||
// num 是网元主机telnet 1:4100 2:5200
|
key := fmt.Sprintf("%s*", cachekey.NE_KEY)
|
||||||
NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error)
|
if neType != "*" {
|
||||||
|
key = fmt.Sprintf("%s%s*", cachekey.NE_KEY, neType)
|
||||||
// NeConfOAMReadSync 网元OAM配置文件读取
|
}
|
||||||
NeConfOAMReadSync(neType, neId string) (map[string]any, error)
|
keys, err := redis.GetKeys("", key)
|
||||||
|
if err != nil {
|
||||||
// NeConfOAMWirteSync 网元OAM配置文件生成并同步
|
return false
|
||||||
NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error
|
}
|
||||||
|
delOk, _ := redis.DelKeys("", keys)
|
||||||
// NeConfPara5GRead 网元公共配置文件读取
|
return delOk
|
||||||
NeConfPara5GRead() (map[string]any, error)
|
}
|
||||||
|
|
||||||
// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId
|
// SelectNeInfoByRmuid 通过rmUID查询网元信息
|
||||||
NeConfPara5GWirte(content map[string]any, syncNE []string) error
|
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),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,34 +1,190 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
// INeLicense 网元授权激活信息 服务层接口
|
"be.ems/src/framework/utils/file"
|
||||||
type INeLicense interface {
|
"be.ems/src/modules/network_element/model"
|
||||||
// SelectPage 根据条件分页查询字典类型
|
"be.ems/src/modules/network_element/repository"
|
||||||
SelectPage(query map[string]any) map[string]any
|
)
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化服务层 NeLicense 结构体
|
||||||
SelectList(neLicense model.NeLicense) []model.NeLicense
|
var NewNeLicense = &NeLicense{
|
||||||
|
neLicenseRepository: repository.NewNeLicense,
|
||||||
// SelectById 通过ID查询
|
}
|
||||||
SelectById(id string) model.NeLicense
|
|
||||||
|
// NeLicense 网元授权激活信息 服务层处理
|
||||||
// Insert 新增信息
|
type NeLicense struct {
|
||||||
Insert(neLicense model.NeLicense) string
|
neLicenseRepository *repository.NeLicense // 网元授权激活信息表
|
||||||
|
}
|
||||||
// Update 修改信息
|
|
||||||
Update(neLicense model.NeLicense) int64
|
// SelectNeHostPage 分页查询列表数据
|
||||||
|
func (r *NeLicense) SelectPage(query map[string]any) map[string]any {
|
||||||
// DeleteByIds 批量删除信息
|
return r.neLicenseRepository.SelectPage(query)
|
||||||
DeleteByIds(ids []string) (int64, error)
|
}
|
||||||
|
|
||||||
// SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息
|
// SelectConfigList 查询列表
|
||||||
SelectByNeTypeAndNeID(neType, neId string) model.NeLicense
|
func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense {
|
||||||
|
return r.neLicenseRepository.SelectList(neLicense)
|
||||||
// ReadLicenseInfo 读取授权文件信息
|
}
|
||||||
// 返回激活申请码, 激活文件
|
|
||||||
ReadLicenseInfo(neLicense model.NeLicense) (string, string)
|
// SelectByIds 通过ID查询
|
||||||
|
func (r *NeLicense) SelectById(id string) model.NeLicense {
|
||||||
// UploadLicense 授权文件上传到网元主机
|
if id == "" {
|
||||||
UploadLicense(neLicense model.NeLicense) error
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -1,30 +1,142 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import "be.ems/src/modules/network_element/model"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
// INeSoftware 网元软件包信息 服务层接口
|
"be.ems/src/framework/utils/file"
|
||||||
type INeSoftware interface {
|
"be.ems/src/modules/network_element/model"
|
||||||
// SelectPage 根据条件分页查询字典类型
|
"be.ems/src/modules/network_element/repository"
|
||||||
SelectPage(query map[string]any) map[string]any
|
)
|
||||||
|
|
||||||
// SelectList 根据实体查询
|
// 实例化服务层 NeSoftware 结构体
|
||||||
SelectList(neSoftware model.NeSoftware) []model.NeSoftware
|
var NewNeSoftware = &NeSoftware{
|
||||||
|
neSoftwareRepository: repository.NewNeSoftware,
|
||||||
// SelectById 通过ID查询
|
}
|
||||||
SelectById(id string) model.NeSoftware
|
|
||||||
|
// NeSoftware 网元软件包信息 服务层处理
|
||||||
// Insert 新增信息
|
type NeSoftware struct {
|
||||||
Insert(neSoftware model.NeSoftware) string
|
neSoftwareRepository *repository.NeSoftware // 网元软件包信息
|
||||||
|
}
|
||||||
// Update 修改信息
|
|
||||||
Update(neSoftware model.NeSoftware) int64
|
// SelectNeHostPage 分页查询列表数据
|
||||||
|
func (r *NeSoftware) SelectPage(query map[string]any) map[string]any {
|
||||||
// DeleteByIds 批量删除信息
|
return r.neSoftwareRepository.SelectPage(query)
|
||||||
DeleteByIds(ids []string) (int64, error)
|
}
|
||||||
|
|
||||||
// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一
|
// SelectConfigList 查询列表
|
||||||
CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool
|
func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware {
|
||||||
|
return r.neSoftwareRepository.SelectList(neSoftware)
|
||||||
// UpdateVersions 更新软件包对应网元的新版本
|
}
|
||||||
UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64
|
|
||||||
|
// 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -21,8 +21,7 @@ var NewNeVersion = &NeVersion{
|
|||||||
|
|
||||||
// NeVersion 网元版本信息 服务层处理
|
// NeVersion 网元版本信息 服务层处理
|
||||||
type NeVersion struct {
|
type NeVersion struct {
|
||||||
// 网元版本信息表
|
neVersionRepository *repository.NeVersion // 网元版本信息表
|
||||||
neVersionRepository *repository.NeVersion
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SelectNeHostPage 分页查询列表数据
|
// SelectNeHostPage 分页查询列表数据
|
||||||
@@ -55,7 +54,7 @@ func (r *NeVersion) checkNeVersion(arr *[]model.NeVersion) {
|
|||||||
for i := range *arr {
|
for i := range *arr {
|
||||||
item := (*arr)[i]
|
item := (*arr)[i]
|
||||||
// 查询网元获取IP
|
// 查询网元获取IP
|
||||||
neInfo := NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(item.NeType, item.NeId)
|
neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(item.NeType, item.NeId)
|
||||||
if neInfo.NeId != item.NeId || neInfo.IP == "" {
|
if neInfo.NeId != item.NeId || neInfo.IP == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -136,7 +135,7 @@ func (r *NeVersion) SelectByNeTypeAndNeID(neType, neId string) model.NeVersion {
|
|||||||
// action 安装行为:install upgrade rollback
|
// action 安装行为:install upgrade rollback
|
||||||
func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) {
|
func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) {
|
||||||
// 网元主机的SSH客户端
|
// 网元主机的SSH客户端
|
||||||
sshClient, err := NewNeInfoImpl.NeRunSSHClient(neVersion.NeType, neVersion.NeId)
|
sshClient, err := NewNeInfo.NeRunSSHClient(neVersion.NeType, neVersion.NeId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -158,11 +157,11 @@ func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput m
|
|||||||
// ========= 安装时设置 =========
|
// ========= 安装时设置 =========
|
||||||
if action == "install" {
|
if action == "install" {
|
||||||
// 网元公共配置文件
|
// 网元公共配置文件
|
||||||
para5GMap, err := NewNeInfoImpl.NeConfPara5GRead()
|
para5GMap, err := NewNeInfo.NeConfPara5GRead()
|
||||||
if para5GMap == nil || err != nil {
|
if para5GMap == nil || err != nil {
|
||||||
return "", fmt.Errorf("error read para5G file info")
|
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")
|
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
|
return okFlagStr, cmdStrArr, nil
|
||||||
} else if neType == "IMS" {
|
} else if neType == "IMS" {
|
||||||
if action == "install" {
|
if action == "install" {
|
||||||
para5GData := NewNeInfoImpl.Para5GData
|
para5GData := NewNeInfo.Para5GData
|
||||||
cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n")
|
cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n")
|
||||||
|
|
||||||
// 公网 PLMN地址
|
// 公网 PLMN地址
|
||||||
@@ -313,7 +312,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if action == "install" {
|
if action == "install" {
|
||||||
para5GData := NewNeInfoImpl.Para5GData
|
para5GData := NewNeInfo.Para5GData
|
||||||
cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n")
|
cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n")
|
||||||
|
|
||||||
// AMF配置修改
|
// AMF配置修改
|
||||||
@@ -538,14 +537,14 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string)
|
|||||||
if action == "install" && (neTypeLower == "ims" || neTypeLower == "udm") {
|
if action == "install" && (neTypeLower == "ims" || neTypeLower == "udm") {
|
||||||
// adb
|
// adb
|
||||||
if strings.Contains(pkgCmdStr, "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, "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, 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")
|
cmdStrArr = append(cmdStrArr, "sudo service adb restart \n")
|
||||||
}
|
}
|
||||||
// kvdb
|
// kvdb
|
||||||
if strings.Contains(pkgCmdStr, "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, "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, 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")
|
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 {
|
func (r *NeVersion) operateDome(action string, neVersion model.NeVersion) error {
|
||||||
if action == "install" {
|
if action == "install" {
|
||||||
// 网元信息
|
// 网元信息
|
||||||
neInfo := NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId)
|
neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId)
|
||||||
if neInfo.NeId != neVersion.NeId {
|
if neInfo.NeId != neVersion.NeId {
|
||||||
return fmt.Errorf("error found neinfo")
|
return fmt.Errorf("error found neinfo")
|
||||||
}
|
}
|
||||||
// ========= 网元OAM配置文件 start ==========
|
// ========= 网元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")
|
return fmt.Errorf("error wirte OAM file info")
|
||||||
}
|
}
|
||||||
// ========= 网元OAM配置文件 end ===========
|
// ========= 网元OAM配置文件 end ===========
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ func (s *IPerfController) Run(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 网元主机的SSH客户端
|
// 网元主机的SSH客户端
|
||||||
sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId)
|
sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, result.ErrMsg(err.Error()))
|
c.JSON(200, result.ErrMsg(err.Error()))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ func (s *PingController) Run(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 网元主机的SSH客户端
|
// 网元主机的SSH客户端
|
||||||
sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId)
|
sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, result.ErrMsg(err.Error()))
|
c.JSON(200, result.ErrMsg(err.Error()))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -16,20 +16,15 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 实例化服务层 IPerf 结构体
|
// 实例化服务层 IPerf 结构体
|
||||||
var NewIPerf = &IPerf{
|
var NewIPerf = &IPerf{}
|
||||||
neInfoService: neService.NewNeInfoImpl,
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPerf 网络性能测试工具 服务层处理
|
// IPerf 网络性能测试工具 服务层处理
|
||||||
type IPerf struct {
|
type IPerf struct{}
|
||||||
// 网元信息服务
|
|
||||||
neInfoService neService.INeInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
// Version 查询版本信息
|
// Version 查询版本信息
|
||||||
func (s *IPerf) Version(meType, neId string) (string, error) {
|
func (s *IPerf) Version(meType, neId string) (string, error) {
|
||||||
// 网元主机的SSH客户端
|
// 网元主机的SSH客户端
|
||||||
sshClient, err := s.neInfoService.NeRunSSHClient(meType, neId)
|
sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -46,7 +41,7 @@ func (s *IPerf) Version(meType, neId string) (string, error) {
|
|||||||
// Install 安装iperf3
|
// Install 安装iperf3
|
||||||
func (s *IPerf) Install(meType, neId string) error {
|
func (s *IPerf) Install(meType, neId string) error {
|
||||||
// 网元主机的SSH客户端
|
// 网元主机的SSH客户端
|
||||||
sshClient, err := s.neInfoService.NeRunSSHClient(meType, neId)
|
sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user