Merge remote-tracking branch 'origin/lichang'
This commit is contained in:
@@ -504,3 +504,35 @@ amf:
|
|||||||
filter: '{"0":"false","1":"true"}'
|
filter: '{"0":"false","1":"true"}'
|
||||||
display: "statusReportEnabled"
|
display: "statusReportEnabled"
|
||||||
comment: ""
|
comment: ""
|
||||||
|
gnbList:
|
||||||
|
display: "Gnb List Config"
|
||||||
|
sort: 13
|
||||||
|
array:
|
||||||
|
- name: "index"
|
||||||
|
type: "int"
|
||||||
|
value: "0"
|
||||||
|
access: "read-only"
|
||||||
|
filter: "0~128"
|
||||||
|
display: "Index"
|
||||||
|
comment: "0~128"
|
||||||
|
- name: "name"
|
||||||
|
type: "string"
|
||||||
|
value: "Gnb"
|
||||||
|
access: "read-write"
|
||||||
|
filter: "0~64"
|
||||||
|
display: "GNB Name"
|
||||||
|
comment: "text content length 0~64"
|
||||||
|
- name: "address"
|
||||||
|
type: "string"
|
||||||
|
value: "192.168.8.1"
|
||||||
|
access: "read-write"
|
||||||
|
filter: "0~64"
|
||||||
|
display: "GNB Address"
|
||||||
|
comment: "text content length 0~64"
|
||||||
|
- name: "position"
|
||||||
|
type: "string"
|
||||||
|
value: "Area-B"
|
||||||
|
access: "read-write"
|
||||||
|
filter: "0~64"
|
||||||
|
display: "Position"
|
||||||
|
comment: "location description. Prohibition of spaces, length of text content 0-64"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,48 +1,20 @@
|
|||||||
-- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64)
|
|
||||||
--
|
|
||||||
-- Host: 192.168.2.219 Database: omc_db
|
|
||||||
-- ------------------------------------------------------
|
|
||||||
-- Server version 10.3.38-MariaDB
|
|
||||||
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
||||||
/*!40101 SET NAMES utf8mb4 */;
|
|
||||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
|
||||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
|
||||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
||||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
|
||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `ue_event`
|
-- Table structure for table `ue_event`
|
||||||
--
|
--
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `ue_event`;
|
DROP TABLE IF EXISTS `ue_event`;
|
||||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
CREATE TABLE `ue_event` (
|
||||||
/*!40101 SET character_set_client = utf8 */;
|
`id` int NOT NULL AUTO_INCREMENT,
|
||||||
CREATE TABLE `ue_event` (
|
`ne_type` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`ne_type` varchar(32) DEFAULT NULL,
|
`rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`ne_name` varchar(64) DEFAULT NULL,
|
`timestamp` int DEFAULT NULL,
|
||||||
`rm_uid` varchar(32) DEFAULT NULL,
|
`event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state',
|
||||||
`timestamp` int(11) DEFAULT NULL,
|
`event_json` longtext COLLATE utf8mb4_general_ci,
|
||||||
`event_type` varchar(16) DEFAULT NULL COMMENT 'auth-result/detach/cm-state',
|
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
|
||||||
`event_json` longtext DEFAULT NULL,
|
|
||||||
`created_at` datetime DEFAULT current_timestamp(),
|
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
KEY `id` (`id`) USING BTREE
|
KEY `id` (`id`) USING BTREE,
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
|
KEY `idx_type_timestamp` (`ne_type`,`timestamp`,`event_type`) USING BTREE
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
|
||||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
|
||||||
|
|
||||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
|
||||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
|
||||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
|
||||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
|
||||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
|
||||||
|
|
||||||
-- Dump completed on 2024-03-06 17:26:59
|
-- Dump completed on 2024-03-06 17:26:59
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ CREATE TABLE `ue_event_amf` (
|
|||||||
`ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
`ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
`rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`timestamp` int DEFAULT NULL,
|
`timestamp` int DEFAULT NULL,
|
||||||
`event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'auth-result/detach/cm-state',
|
`event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state',
|
||||||
`event_json` longtext COLLATE utf8mb4_general_ci,
|
`event_json` longtext COLLATE utf8mb4_general_ci,
|
||||||
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
|
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ CREATE TABLE `ue_event_mme` (
|
|||||||
`ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
`ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
`rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`timestamp` int DEFAULT NULL,
|
`timestamp` int DEFAULT NULL,
|
||||||
`event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'ECM STATUS, EMM STATUS',
|
`event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state',
|
||||||
`event_json` longtext COLLATE utf8mb4_general_ci,
|
`event_json` longtext COLLATE utf8mb4_general_ci,
|
||||||
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
|
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
|||||||
@@ -1,19 +1,3 @@
|
|||||||
/*
|
|
||||||
Navicat Premium Data Transfer
|
|
||||||
|
|
||||||
Source Server : local_mariadb
|
|
||||||
Source Server Type : MariaDB
|
|
||||||
Source Server Version : 100338 (10.3.38-MariaDB)
|
|
||||||
Source Host : localhost:33066
|
|
||||||
Source Schema : omc_db
|
|
||||||
|
|
||||||
Target Server Type : MariaDB
|
|
||||||
Target Server Version : 100338 (10.3.38-MariaDB)
|
|
||||||
File Encoding : 65001
|
|
||||||
|
|
||||||
Date: 22/01/2024 17:03:39
|
|
||||||
*/
|
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
SET NAMES utf8mb4;
|
||||||
SET FOREIGN_KEY_CHECKS = 0;
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
@@ -21,16 +5,17 @@ SET FOREIGN_KEY_CHECKS = 0;
|
|||||||
-- Table structure for ue_event
|
-- Table structure for ue_event
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `ue_event` (
|
CREATE TABLE IF NOT EXISTS `ue_event` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int NOT NULL AUTO_INCREMENT,
|
||||||
`ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
`ne_type` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
`ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
`rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`timestamp` int(11) NULL DEFAULT NULL,
|
`timestamp` int DEFAULT NULL,
|
||||||
`event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'auth-result/detach/cm-state',
|
`event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state',
|
||||||
`event_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
`event_json` longtext COLLATE utf8mb4_general_ci,
|
||||||
`created_at` datetime NULL DEFAULT current_timestamp(),
|
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
INDEX `id`(`id`) USING BTREE
|
KEY `id` (`id`) USING BTREE,
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
KEY `idx_type_timestamp` (`ne_type`,`timestamp`,`event_type`) USING BTREE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|||||||
@@ -1,32 +1,17 @@
|
|||||||
/*
|
|
||||||
Navicat Premium Data Transfer
|
|
||||||
|
|
||||||
Source Server : local_mariadb
|
|
||||||
Source Server Type : MariaDB
|
|
||||||
Source Server Version : 100338 (10.3.38-MariaDB)
|
|
||||||
Source Host : localhost:33066
|
|
||||||
Source Schema : omc_db
|
|
||||||
|
|
||||||
Target Server Type : MariaDB
|
|
||||||
Target Server Version : 100338 (10.3.38-MariaDB)
|
|
||||||
File Encoding : 65001
|
|
||||||
|
|
||||||
Date: 22/01/2024 17:03:39
|
|
||||||
*/
|
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
SET NAMES utf8mb4;
|
||||||
SET FOREIGN_KEY_CHECKS = 0;
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for ue_event_amf
|
-- Table structure for ue_event_amf
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `ue_event_amf`;
|
||||||
CREATE TABLE IF NOT EXISTS `ue_event_amf` (
|
CREATE TABLE IF NOT EXISTS `ue_event_amf` (
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` int NOT NULL AUTO_INCREMENT,
|
||||||
`ne_type` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
`ne_type` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
`ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
`rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`timestamp` int DEFAULT NULL,
|
`timestamp` int DEFAULT NULL,
|
||||||
`event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'auth-result/detach/cm-state',
|
`event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state',
|
||||||
`event_json` longtext COLLATE utf8mb4_general_ci,
|
`event_json` longtext COLLATE utf8mb4_general_ci,
|
||||||
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
|
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
|||||||
@@ -4,13 +4,14 @@ SET FOREIGN_KEY_CHECKS = 0;
|
|||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for ue_event_mme
|
-- Table structure for ue_event_mme
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `ue_event_mme`;
|
||||||
CREATE TABLE IF NOT EXISTS `ue_event_mme` (
|
CREATE TABLE IF NOT EXISTS `ue_event_mme` (
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` int NOT NULL AUTO_INCREMENT,
|
||||||
`ne_type` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
`ne_type` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
`ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
`rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||||
`timestamp` int DEFAULT NULL,
|
`timestamp` int DEFAULT NULL,
|
||||||
`event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'ECM STATUS, EMM STATUS',
|
`event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state',
|
||||||
`event_json` longtext COLLATE utf8mb4_general_ci,
|
`event_json` longtext COLLATE utf8mb4_general_ci,
|
||||||
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
|
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
|||||||
@@ -1,19 +1,17 @@
|
|||||||
package event
|
package event
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"be.ems/lib/core/ctx"
|
"be.ems/lib/core/ctx"
|
||||||
"be.ems/lib/dborm"
|
"be.ems/lib/dborm"
|
||||||
"be.ems/lib/global"
|
|
||||||
"be.ems/lib/log"
|
"be.ems/lib/log"
|
||||||
"be.ems/lib/services"
|
"be.ems/lib/services"
|
||||||
"be.ems/restagent/config"
|
"be.ems/restagent/config"
|
||||||
|
"be.ems/src/framework/utils/parse"
|
||||||
neService "be.ems/src/modules/network_element/service"
|
neService "be.ems/src/modules/network_element/service"
|
||||||
wsService "be.ems/src/modules/ws/service"
|
wsService "be.ems/src/modules/ws/service"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@@ -36,34 +34,100 @@ type UEEvent struct {
|
|||||||
EventJson map[string]any `json:"eventJSON" xorm:"event_json"`
|
EventJson map[string]any `json:"eventJSON" xorm:"event_json"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 旧AMF上报处理
|
||||||
func PostUEEventFromAMF(c *gin.Context) {
|
func PostUEEventFromAMF(c *gin.Context) {
|
||||||
log.Info("PostUEEventFromAMF processing... ")
|
log.Info("PostUEEventFromAMF processing... ")
|
||||||
|
|
||||||
body, err := io.ReadAll(io.LimitReader(c.Request.Body, global.RequestBodyMaxLen))
|
|
||||||
if err != nil {
|
|
||||||
log.Error("Failed to io.ReadAll: ", err)
|
|
||||||
services.ResponseNotFound404UriNotExist(c.Writer, c.Request)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//vars := mux.Vars(c.Request)
|
|
||||||
eventType, ok := c.Params.Get("eventType")
|
eventType, ok := c.Params.Get("eventType")
|
||||||
if !ok || eventType == "" {
|
if !ok || eventType == "" {
|
||||||
log.Error("eventType is empty")
|
log.Error("eventType is empty")
|
||||||
services.ResponseNotFound404UriNotExist(c.Writer, c.Request)
|
services.ResponseNotFound404UriNotExist(c.Writer, c.Request)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ueEvent := new(UEEvent)
|
var body map[string]any
|
||||||
err = json.Unmarshal(body, &ueEvent.EventJson)
|
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
|
||||||
if err != nil {
|
|
||||||
log.Error("Failed to Unmarshal ueEvent:", err)
|
log.Error("Failed to Unmarshal ueEvent:", err)
|
||||||
services.ResponseInternalServerError500ProcessError(c.Writer, err)
|
services.ResponseInternalServerError500ProcessError(c.Writer, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ueEvent.NeType = "AMF"
|
|
||||||
ueEvent.Timestamp = time.Now().Unix()
|
ueEvent := UEEvent{
|
||||||
ueEvent.EventType = eventType
|
NeType: "AMF",
|
||||||
log.Trace("ueEvent AMF:", ueEvent)
|
Timestamp: time.Now().Unix(),
|
||||||
|
EventType: eventType,
|
||||||
|
}
|
||||||
|
// 从eventJson中获取rmUID
|
||||||
|
if v, ok := body["rmUID"]; ok {
|
||||||
|
ueEvent.RmUID = fmt.Sprint(v)
|
||||||
|
} else {
|
||||||
|
ueEvent.RmUID = "4400HXAMF001"
|
||||||
|
}
|
||||||
|
if v, ok := body["neName"]; ok {
|
||||||
|
ueEvent.NeName = fmt.Sprint(v)
|
||||||
|
} else {
|
||||||
|
ueEvent.NeName = "AMF_001"
|
||||||
|
}
|
||||||
|
|
||||||
|
// 统一格式
|
||||||
|
eventJson := map[string]any{"cellID": 0, "gNBID": "", "imsi": "", "onlineNumber": 0, "result": "", "tacID": 0, "timestamp": 0, "time": 0, "type": eventType}
|
||||||
|
switch eventType {
|
||||||
|
case "auth-result":
|
||||||
|
// {"authCode":"200","authMessage":"成功","authTime":"2024-12-07 16:48:37","cellID":"3","gNBID":"1","imsi":"460002082100000","onlineNumber":1,"tacID":"81"}
|
||||||
|
if v, ok := body["imsi"]; ok {
|
||||||
|
eventJson["imsi"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
if v, ok := body["cellID"]; ok {
|
||||||
|
eventJson["cellID"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
if v, ok := body["gNBID"]; ok {
|
||||||
|
eventJson["gNBID"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
if v, ok := body["tacID"]; ok {
|
||||||
|
eventJson["tacID"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
if v, ok := body["onlineNumber"]; ok {
|
||||||
|
eventJson["onlineNumber"] = parse.Number(v)
|
||||||
|
}
|
||||||
|
if v, ok := body["authCode"]; ok {
|
||||||
|
eventJson["result"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
if v, ok := body["authTime"]; ok {
|
||||||
|
eventJson["timestamp"] = ueEvent.Timestamp
|
||||||
|
eventJson["time"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
case "detach":
|
||||||
|
// {"detachResult":0,"detachTime":"2024-12-07 18:00:47","imsi":"460002082100000"}
|
||||||
|
if v, ok := body["imsi"]; ok {
|
||||||
|
eventJson["imsi"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
if v, ok := body["detachResult"]; ok {
|
||||||
|
if fmt.Sprint(v) == "0" {
|
||||||
|
eventJson["result"] = "200"
|
||||||
|
} else {
|
||||||
|
eventJson["result"] = "500"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if v, ok := body["detachTime"]; ok {
|
||||||
|
eventJson["timestamp"] = ueEvent.Timestamp
|
||||||
|
eventJson["time"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
case "cm-state":
|
||||||
|
// {"changeTime":"2024-12-07 17:07:52","imsi":"460002082100000","onlineNumber":1,"status":2}
|
||||||
|
if v, ok := body["imsi"]; ok {
|
||||||
|
eventJson["imsi"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
if v, ok := body["onlineNumber"]; ok {
|
||||||
|
eventJson["onlineNumber"] = parse.Number(v)
|
||||||
|
}
|
||||||
|
if v, ok := body["status"]; ok {
|
||||||
|
eventJson["result"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
if v, ok := body["changeTime"]; ok {
|
||||||
|
eventJson["timestamp"] = ueEvent.Timestamp
|
||||||
|
eventJson["time"] = fmt.Sprint(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ueEvent.EventJson = eventJson
|
||||||
|
|
||||||
affected, err := dborm.XormInsertTableOne("ue_event_amf", ueEvent)
|
affected, err := dborm.XormInsertTableOne("ue_event_amf", ueEvent)
|
||||||
if err != nil && affected <= 0 {
|
if err != nil && affected <= 0 {
|
||||||
@@ -72,13 +136,20 @@ func PostUEEventFromAMF(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// AMF没有RmUID,直接推送
|
// 发送到匹配的网元
|
||||||
// 推送到ws订阅组
|
neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(ueEvent.RmUID)
|
||||||
wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, ueEvent)
|
if neInfo.RmUID == ueEvent.RmUID {
|
||||||
|
// 推送到ws订阅组
|
||||||
|
if ueEvent.NeType == "AMF" {
|
||||||
|
wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, ueEvent)
|
||||||
|
wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE+"_"+neInfo.NeId, ueEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
services.ResponseStatusOK204NoContent(c.Writer)
|
services.ResponseStatusOK204NoContent(c.Writer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UE上报处理
|
||||||
func PostUEEvent(w http.ResponseWriter, r *http.Request) {
|
func PostUEEvent(w http.ResponseWriter, r *http.Request) {
|
||||||
log.Info("PostUEEvent processing... ")
|
log.Info("PostUEEvent processing... ")
|
||||||
|
|
||||||
@@ -103,7 +174,12 @@ func PostUEEvent(w http.ResponseWriter, r *http.Request) {
|
|||||||
if neInfo.RmUID == ueEvent.RmUID {
|
if neInfo.RmUID == ueEvent.RmUID {
|
||||||
// 推送到ws订阅组
|
// 推送到ws订阅组
|
||||||
if ueEvent.NeType == "MME" {
|
if ueEvent.NeType == "MME" {
|
||||||
wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE+neInfo.NeId, ueEvent)
|
wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE, ueEvent)
|
||||||
|
wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE+"_"+neInfo.NeId, ueEvent)
|
||||||
|
}
|
||||||
|
if ueEvent.NeType == "AMF" {
|
||||||
|
wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, ueEvent)
|
||||||
|
wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE+"_"+neInfo.NeId, ueEvent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,25 +1,20 @@
|
|||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"be.ems/src/framework/i18n"
|
"be.ems/src/framework/i18n"
|
||||||
"be.ems/src/framework/logger"
|
|
||||||
"be.ems/src/framework/utils/ctx"
|
"be.ems/src/framework/utils/ctx"
|
||||||
"be.ems/src/framework/utils/file"
|
|
||||||
"be.ems/src/framework/utils/parse"
|
"be.ems/src/framework/utils/parse"
|
||||||
"be.ems/src/framework/vo/result"
|
"be.ems/src/framework/vo/result"
|
||||||
"be.ems/src/modules/network_data/model"
|
"be.ems/src/modules/network_data/model"
|
||||||
neDataService "be.ems/src/modules/network_data/service"
|
neDataService "be.ems/src/modules/network_data/service"
|
||||||
neFetchlink "be.ems/src/modules/network_element/fetch_link"
|
neFetchlink "be.ems/src/modules/network_element/fetch_link"
|
||||||
neService "be.ems/src/modules/network_element/service"
|
neService "be.ems/src/modules/network_element/service"
|
||||||
sysService "be.ems/src/modules/system/service"
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gin-gonic/gin/binding"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 AMFController 结构体
|
// 实例化控制层 AMFController 结构体
|
||||||
@@ -48,12 +43,12 @@ func (s *AMFController) UEList(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查询网元获取IP
|
// 查询网元获取IP
|
||||||
// neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID)
|
neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("AMF", querys.NeID)
|
||||||
// if neInfo.NeId != querys.NeID || neInfo.IP == "" {
|
if neInfo.NeId != querys.NeID || neInfo.IP == "" {
|
||||||
// c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
// querys.RmUID = neInfo.RmUID
|
querys.RmUID = neInfo.RmUID
|
||||||
|
|
||||||
// 查询数据
|
// 查询数据
|
||||||
rows, total := s.ueEventService.SelectPage(querys)
|
rows, total := s.ueEventService.SelectPage(querys)
|
||||||
@@ -93,7 +88,7 @@ func (s *AMFController) UEExport(c *gin.Context) {
|
|||||||
language := ctx.AcceptLanguage(c)
|
language := ctx.AcceptLanguage(c)
|
||||||
// 查询结果,根据查询条件结果,单页最大值限制
|
// 查询结果,根据查询条件结果,单页最大值限制
|
||||||
var querys model.UEEventAMFQuery
|
var querys model.UEEventAMFQuery
|
||||||
if err := c.ShouldBindBodyWith(&querys, binding.JSON); err != nil {
|
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
|
||||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -101,6 +96,13 @@ func (s *AMFController) UEExport(c *gin.Context) {
|
|||||||
if querys.PageSize > 10000 {
|
if querys.PageSize > 10000 {
|
||||||
querys.PageSize = 10000
|
querys.PageSize = 10000
|
||||||
}
|
}
|
||||||
|
// 查询网元获取IP
|
||||||
|
neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("AMF", querys.NeID)
|
||||||
|
if neInfo.NeId != querys.NeID || neInfo.IP == "" {
|
||||||
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
querys.RmUID = neInfo.RmUID
|
||||||
rows, total := s.ueEventService.SelectPage(querys)
|
rows, total := s.ueEventService.SelectPage(querys)
|
||||||
if total == 0 {
|
if total == 0 {
|
||||||
// 导出数据记录为空
|
// 导出数据记录为空
|
||||||
@@ -110,95 +112,8 @@ func (s *AMFController) UEExport(c *gin.Context) {
|
|||||||
|
|
||||||
// 导出文件名称
|
// 导出文件名称
|
||||||
fileName := fmt.Sprintf("amf_ue_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli())
|
fileName := fmt.Sprintf("amf_ue_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli())
|
||||||
// 第一行表头标题
|
|
||||||
headerCells := map[string]string{
|
|
||||||
"A1": "ID",
|
|
||||||
"B1": "IMSI",
|
|
||||||
"C1": "Event Type",
|
|
||||||
"D1": "Result",
|
|
||||||
"E1": "Time",
|
|
||||||
}
|
|
||||||
// 读取字典数据 UE 事件类型
|
|
||||||
dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type")
|
|
||||||
// 读取字典数据 UE 事件认证代码类型
|
|
||||||
dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code")
|
|
||||||
// 读取字典数据 UE 事件CM状态
|
|
||||||
dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state")
|
|
||||||
// 从第二行开始的数据
|
|
||||||
dataCells := make([]map[string]any, 0)
|
|
||||||
for i, row := range rows {
|
|
||||||
idx := strconv.Itoa(i + 2)
|
|
||||||
// 解析 JSON 字符串为 map
|
|
||||||
var eventJSON map[string]interface{}
|
|
||||||
err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON)
|
|
||||||
if err != nil {
|
|
||||||
logger.Warnf("UEExport Error parsing JSON: %s", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 取IMSI
|
|
||||||
imsi := ""
|
|
||||||
if v, ok := eventJSON["imsi"]; ok && v != nil {
|
|
||||||
imsi = v.(string)
|
|
||||||
}
|
|
||||||
// 取类型
|
|
||||||
eventType := ""
|
|
||||||
for _, v := range dictUEEventType {
|
|
||||||
if row.EventType == v.DictValue {
|
|
||||||
eventType = i18n.TKey(language, v.DictLabel)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 取结果
|
|
||||||
eventResult := ""
|
|
||||||
// 取时间
|
|
||||||
timeStr := ""
|
|
||||||
if row.EventType == "auth-result" {
|
|
||||||
if v, ok := eventJSON["authTime"]; ok && v != nil {
|
|
||||||
timeStr = v.(string)
|
|
||||||
}
|
|
||||||
if v, ok := eventJSON["authCode"]; ok && v != nil {
|
|
||||||
eventResult = v.(string)
|
|
||||||
for _, v := range dictUEAauthCode {
|
|
||||||
if eventResult == v.DictValue {
|
|
||||||
eventResult = i18n.TKey(language, v.DictLabel)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if row.EventType == "detach" {
|
|
||||||
if v, ok := eventJSON["detachTime"]; ok && v != nil {
|
|
||||||
timeStr = v.(string)
|
|
||||||
}
|
|
||||||
eventResult = "Success"
|
|
||||||
}
|
|
||||||
if row.EventType == "cm-state" {
|
|
||||||
if v, ok := eventJSON["changeTime"]; ok && v != nil {
|
|
||||||
timeStr = v.(string)
|
|
||||||
}
|
|
||||||
if v, ok := eventJSON["status"]; ok && v != nil {
|
|
||||||
eventResult = fmt.Sprint(v)
|
|
||||||
for _, v := range dictUEEventCmState {
|
|
||||||
if eventResult == v.DictValue {
|
|
||||||
eventResult = i18n.TKey(language, v.DictLabel)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dataCells = append(dataCells, map[string]any{
|
|
||||||
"A" + idx: row.ID,
|
|
||||||
"B" + idx: imsi,
|
|
||||||
"C" + idx: eventType,
|
|
||||||
"D" + idx: eventResult,
|
|
||||||
"E" + idx: timeStr,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 导出数据表格
|
// 导出数据表格
|
||||||
saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "")
|
saveFilePath, err := s.ueEventService.ExportXlsx(rows, fileName, language)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, result.ErrMsg(err.Error()))
|
c.JSON(200, result.ErrMsg(err.Error()))
|
||||||
return
|
return
|
||||||
@@ -214,7 +129,7 @@ func (s *AMFController) NbInfoList(c *gin.Context) {
|
|||||||
language := ctx.AcceptLanguage(c)
|
language := ctx.AcceptLanguage(c)
|
||||||
var query struct {
|
var query struct {
|
||||||
NeId string `form:"neId" binding:"required"`
|
NeId string `form:"neId" binding:"required"`
|
||||||
NbId string `form:"nbId"`
|
NbId string `form:"id"`
|
||||||
}
|
}
|
||||||
if err := c.ShouldBindQuery(&query); err != nil {
|
if err := c.ShouldBindQuery(&query); err != nil {
|
||||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||||
@@ -230,7 +145,7 @@ func (s *AMFController) NbInfoList(c *gin.Context) {
|
|||||||
|
|
||||||
// 网元直连
|
// 网元直连
|
||||||
data, err := neFetchlink.AMFNbInfoList(neInfo, map[string]string{
|
data, err := neFetchlink.AMFNbInfoList(neInfo, map[string]string{
|
||||||
"nbId": query.NbId,
|
"id": query.NbId,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, result.ErrMsg(err.Error()))
|
c.JSON(200, result.ErrMsg(err.Error()))
|
||||||
@@ -239,3 +154,33 @@ func (s *AMFController) NbInfoList(c *gin.Context) {
|
|||||||
|
|
||||||
c.JSON(200, result.OkData(data))
|
c.JSON(200, result.OkData(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 接入基站状态信息列表
|
||||||
|
//
|
||||||
|
// GET /nb/list-cfg
|
||||||
|
func (s *AMFController) NbStateList(c *gin.Context) {
|
||||||
|
language := ctx.AcceptLanguage(c)
|
||||||
|
var query struct {
|
||||||
|
NeId string `form:"neId" binding:"required"`
|
||||||
|
}
|
||||||
|
if err := c.ShouldBindQuery(&query); err != nil {
|
||||||
|
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询网元信息
|
||||||
|
neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("AMF", query.NeId)
|
||||||
|
if neInfo.NeId != query.NeId || neInfo.IP == "" {
|
||||||
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 网元直连
|
||||||
|
data, err := neFetchlink.AMFGnbStateList(neInfo)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(200, result.ErrMsg(err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, result.OkData(data))
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,26 +1,20 @@
|
|||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"be.ems/src/framework/i18n"
|
"be.ems/src/framework/i18n"
|
||||||
"be.ems/src/framework/logger"
|
|
||||||
"be.ems/src/framework/utils/ctx"
|
"be.ems/src/framework/utils/ctx"
|
||||||
"be.ems/src/framework/utils/date"
|
|
||||||
"be.ems/src/framework/utils/file"
|
|
||||||
"be.ems/src/framework/utils/parse"
|
"be.ems/src/framework/utils/parse"
|
||||||
"be.ems/src/framework/vo/result"
|
"be.ems/src/framework/vo/result"
|
||||||
"be.ems/src/modules/network_data/model"
|
"be.ems/src/modules/network_data/model"
|
||||||
neDataService "be.ems/src/modules/network_data/service"
|
neDataService "be.ems/src/modules/network_data/service"
|
||||||
neFetchlink "be.ems/src/modules/network_element/fetch_link"
|
neFetchlink "be.ems/src/modules/network_element/fetch_link"
|
||||||
neService "be.ems/src/modules/network_element/service"
|
neService "be.ems/src/modules/network_element/service"
|
||||||
sysService "be.ems/src/modules/system/service"
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gin-gonic/gin/binding"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 IMSController 结构体
|
// 实例化控制层 IMSController 结构体
|
||||||
@@ -94,7 +88,7 @@ func (s *IMSController) CDRExport(c *gin.Context) {
|
|||||||
language := ctx.AcceptLanguage(c)
|
language := ctx.AcceptLanguage(c)
|
||||||
// 查询结果,根据查询条件结果,单页最大值限制
|
// 查询结果,根据查询条件结果,单页最大值限制
|
||||||
var querys model.CDREventIMSQuery
|
var querys model.CDREventIMSQuery
|
||||||
if err := c.ShouldBindBodyWith(&querys, binding.JSON); err != nil {
|
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
|
||||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -118,99 +112,8 @@ func (s *IMSController) CDRExport(c *gin.Context) {
|
|||||||
|
|
||||||
// 导出文件名称
|
// 导出文件名称
|
||||||
fileName := fmt.Sprintf("ims_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli())
|
fileName := fmt.Sprintf("ims_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli())
|
||||||
// 第一行表头标题
|
|
||||||
headerCells := map[string]string{
|
|
||||||
"A1": "ID",
|
|
||||||
"B1": "Record Behavior",
|
|
||||||
"C1": "Type",
|
|
||||||
"D1": "Caller",
|
|
||||||
"E1": "Called",
|
|
||||||
"F1": "Duration",
|
|
||||||
"G1": "Result",
|
|
||||||
"H1": "Time",
|
|
||||||
}
|
|
||||||
// 读取字典数据 CDR SIP响应代码类别类型
|
|
||||||
dictCDRSipCode := sysService.NewSysDictData.SelectDictDataByType("cdr_sip_code")
|
|
||||||
// 读取字典数据 CDR 呼叫类型
|
|
||||||
dictCDRCallType := sysService.NewSysDictData.SelectDictDataByType("cdr_call_type")
|
|
||||||
// 从第二行开始的数据
|
|
||||||
dataCells := make([]map[string]any, 0)
|
|
||||||
for i, row := range rows {
|
|
||||||
idx := strconv.Itoa(i + 2)
|
|
||||||
// 解析 JSON 字符串为 map
|
|
||||||
var cdrJSON map[string]interface{}
|
|
||||||
err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON)
|
|
||||||
if err != nil {
|
|
||||||
logger.Warnf("CDRExport Error parsing JSON: %s", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// 记录类型
|
|
||||||
recordType := ""
|
|
||||||
if v, ok := cdrJSON["recordType"]; ok && v != nil {
|
|
||||||
recordType = v.(string)
|
|
||||||
}
|
|
||||||
// 呼叫类型
|
|
||||||
callType := "sms"
|
|
||||||
callTypeLable := "SMS"
|
|
||||||
if v, ok := cdrJSON["callType"]; ok && v != nil {
|
|
||||||
callType = v.(string)
|
|
||||||
for _, v := range dictCDRCallType {
|
|
||||||
if callType == v.DictValue {
|
|
||||||
callTypeLable = i18n.TKey(language, v.DictLabel)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 被叫
|
|
||||||
called := ""
|
|
||||||
if v, ok := cdrJSON["calledParty"]; ok && v != nil {
|
|
||||||
called = v.(string)
|
|
||||||
}
|
|
||||||
// 主叫
|
|
||||||
caller := ""
|
|
||||||
if v, ok := cdrJSON["callerParty"]; ok && v != nil {
|
|
||||||
caller = v.(string)
|
|
||||||
}
|
|
||||||
// 时长
|
|
||||||
duration := "-"
|
|
||||||
if v, ok := cdrJSON["callDuration"]; ok && v != nil && callType != "sms" {
|
|
||||||
duration = fmt.Sprint(parse.Number(v))
|
|
||||||
}
|
|
||||||
// 呼叫结果 非短信都有code作为结果 sms短信都ok
|
|
||||||
callResult := "Success"
|
|
||||||
if v, ok := cdrJSON["cause"]; ok && v != nil && callType != "sms" {
|
|
||||||
cause := fmt.Sprint(v)
|
|
||||||
for _, v := range dictCDRSipCode {
|
|
||||||
if cause == v.DictValue {
|
|
||||||
callResult = i18n.TKey(language, v.DictLabel)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 取时间
|
|
||||||
timeStr := ""
|
|
||||||
if v, ok := cdrJSON["releaseTime"]; ok && v != nil {
|
|
||||||
if releaseTime := parse.Number(v); releaseTime > 0 {
|
|
||||||
timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
|
||||||
} else {
|
|
||||||
timeStr = v.(string)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dataCells = append(dataCells, map[string]any{
|
|
||||||
"A" + idx: row.ID,
|
|
||||||
"B" + idx: recordType,
|
|
||||||
"C" + idx: callTypeLable,
|
|
||||||
"D" + idx: caller,
|
|
||||||
"E" + idx: called,
|
|
||||||
"F" + idx: duration,
|
|
||||||
"G" + idx: callResult,
|
|
||||||
"H" + idx: timeStr,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 导出数据表格
|
// 导出数据表格
|
||||||
saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "")
|
saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName, language)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, result.ErrMsg(err.Error()))
|
c.JSON(200, result.ErrMsg(err.Error()))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -1,24 +1,18 @@
|
|||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"be.ems/src/framework/i18n"
|
"be.ems/src/framework/i18n"
|
||||||
"be.ems/src/framework/logger"
|
|
||||||
"be.ems/src/framework/utils/ctx"
|
"be.ems/src/framework/utils/ctx"
|
||||||
"be.ems/src/framework/utils/date"
|
|
||||||
"be.ems/src/framework/utils/file"
|
|
||||||
"be.ems/src/framework/utils/parse"
|
"be.ems/src/framework/utils/parse"
|
||||||
"be.ems/src/framework/vo/result"
|
"be.ems/src/framework/vo/result"
|
||||||
"be.ems/src/modules/network_data/model"
|
"be.ems/src/modules/network_data/model"
|
||||||
neDataService "be.ems/src/modules/network_data/service"
|
neDataService "be.ems/src/modules/network_data/service"
|
||||||
neFetchlink "be.ems/src/modules/network_element/fetch_link"
|
neFetchlink "be.ems/src/modules/network_element/fetch_link"
|
||||||
neService "be.ems/src/modules/network_element/service"
|
neService "be.ems/src/modules/network_element/service"
|
||||||
sysService "be.ems/src/modules/system/service"
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gin-gonic/gin/binding"
|
"github.com/gin-gonic/gin/binding"
|
||||||
)
|
)
|
||||||
@@ -49,12 +43,12 @@ func (s *MMEController) UEList(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查询网元获取IP
|
// 查询网元获取IP
|
||||||
// neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID)
|
neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("MME", querys.NeID)
|
||||||
// if neInfo.NeId != querys.NeID || neInfo.IP == "" {
|
if neInfo.NeId != querys.NeID || neInfo.IP == "" {
|
||||||
// c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
// querys.RmUID = neInfo.RmUID
|
querys.RmUID = neInfo.RmUID
|
||||||
|
|
||||||
// 查询数据
|
// 查询数据
|
||||||
rows, total := s.ueEventService.SelectPage(querys)
|
rows, total := s.ueEventService.SelectPage(querys)
|
||||||
@@ -102,6 +96,13 @@ func (s *MMEController) UEExport(c *gin.Context) {
|
|||||||
if querys.PageSize > 10000 {
|
if querys.PageSize > 10000 {
|
||||||
querys.PageSize = 10000
|
querys.PageSize = 10000
|
||||||
}
|
}
|
||||||
|
// 查询网元获取IP
|
||||||
|
neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("MME", querys.NeID)
|
||||||
|
if neInfo.NeId != querys.NeID || neInfo.IP == "" {
|
||||||
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
querys.RmUID = neInfo.RmUID
|
||||||
rows, total := s.ueEventService.SelectPage(querys)
|
rows, total := s.ueEventService.SelectPage(querys)
|
||||||
if total == 0 {
|
if total == 0 {
|
||||||
// 导出数据记录为空
|
// 导出数据记录为空
|
||||||
@@ -111,84 +112,8 @@ func (s *MMEController) UEExport(c *gin.Context) {
|
|||||||
|
|
||||||
// 导出文件名称
|
// 导出文件名称
|
||||||
fileName := fmt.Sprintf("mme_ue_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli())
|
fileName := fmt.Sprintf("mme_ue_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli())
|
||||||
// 第一行表头标题
|
|
||||||
headerCells := map[string]string{
|
|
||||||
"A1": "ID",
|
|
||||||
"B1": "IMSI",
|
|
||||||
"C1": "Event Type",
|
|
||||||
"D1": "Result",
|
|
||||||
"E1": "Time",
|
|
||||||
}
|
|
||||||
// 读取字典数据 UE 事件类型
|
|
||||||
dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type")
|
|
||||||
// 读取字典数据 UE 事件认证代码类型
|
|
||||||
dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code")
|
|
||||||
// 读取字典数据 UE 事件CM状态
|
|
||||||
dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state")
|
|
||||||
// 从第二行开始的数据
|
|
||||||
dataCells := make([]map[string]any, 0)
|
|
||||||
for i, row := range rows {
|
|
||||||
idx := strconv.Itoa(i + 2)
|
|
||||||
// 解析 JSON 字符串为 map
|
|
||||||
var eventJSON map[string]interface{}
|
|
||||||
err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON)
|
|
||||||
if err != nil {
|
|
||||||
logger.Warnf("UEExport Error parsing JSON: %s", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 取IMSI
|
|
||||||
imsi := ""
|
|
||||||
if v, ok := eventJSON["imsi"]; ok && v != nil {
|
|
||||||
imsi = v.(string)
|
|
||||||
}
|
|
||||||
// 取类型
|
|
||||||
eventType := row.EventType
|
|
||||||
for _, v := range dictUEEventType {
|
|
||||||
if row.EventType == v.DictValue {
|
|
||||||
eventType = i18n.TKey(language, v.DictLabel)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 取结果
|
|
||||||
eventResult := ""
|
|
||||||
if v, ok := eventJSON["result"]; ok && v != nil {
|
|
||||||
eventResult = v.(string)
|
|
||||||
if row.EventType == "auth-result" {
|
|
||||||
for _, v := range dictUEAauthCode {
|
|
||||||
if eventResult == v.DictValue {
|
|
||||||
eventResult = i18n.TKey(language, v.DictLabel)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if row.EventType == "cm-state" {
|
|
||||||
for _, v := range dictUEEventCmState {
|
|
||||||
if eventResult == v.DictValue {
|
|
||||||
eventResult = i18n.TKey(language, v.DictLabel)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 取时间
|
|
||||||
timeStr := ""
|
|
||||||
if v, ok := eventJSON["timestamp"]; ok && v != nil {
|
|
||||||
rowTime := parse.Number(v)
|
|
||||||
timeStr = date.ParseDateToStr(rowTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
|
||||||
}
|
|
||||||
|
|
||||||
dataCells = append(dataCells, map[string]any{
|
|
||||||
"A" + idx: row.ID,
|
|
||||||
"B" + idx: imsi,
|
|
||||||
"C" + idx: eventType,
|
|
||||||
"D" + idx: eventResult,
|
|
||||||
"E" + idx: timeStr,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 导出数据表格
|
// 导出数据表格
|
||||||
saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "")
|
saveFilePath, err := s.ueEventService.ExportXlsx(rows, fileName, language)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, result.ErrMsg(err.Error()))
|
c.JSON(200, result.ErrMsg(err.Error()))
|
||||||
return
|
return
|
||||||
@@ -204,7 +129,7 @@ func (s *MMEController) NbInfoList(c *gin.Context) {
|
|||||||
language := ctx.AcceptLanguage(c)
|
language := ctx.AcceptLanguage(c)
|
||||||
var query struct {
|
var query struct {
|
||||||
NeId string `form:"neId" binding:"required"`
|
NeId string `form:"neId" binding:"required"`
|
||||||
NbId string `form:"nbId"`
|
NbId string `form:"id"`
|
||||||
}
|
}
|
||||||
if err := c.ShouldBindQuery(&query); err != nil {
|
if err := c.ShouldBindQuery(&query); err != nil {
|
||||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||||
@@ -220,7 +145,7 @@ func (s *MMEController) NbInfoList(c *gin.Context) {
|
|||||||
|
|
||||||
// 网元直连
|
// 网元直连
|
||||||
data, err := neFetchlink.MMENbInfoList(neInfo, map[string]string{
|
data, err := neFetchlink.MMENbInfoList(neInfo, map[string]string{
|
||||||
"nbId": query.NbId,
|
"id": query.NbId,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, result.ErrMsg(err.Error()))
|
c.JSON(200, result.ErrMsg(err.Error()))
|
||||||
|
|||||||
@@ -1,25 +1,19 @@
|
|||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"be.ems/src/framework/i18n"
|
"be.ems/src/framework/i18n"
|
||||||
"be.ems/src/framework/logger"
|
|
||||||
"be.ems/src/framework/utils/ctx"
|
"be.ems/src/framework/utils/ctx"
|
||||||
"be.ems/src/framework/utils/date"
|
|
||||||
"be.ems/src/framework/utils/file"
|
|
||||||
"be.ems/src/framework/utils/parse"
|
"be.ems/src/framework/utils/parse"
|
||||||
"be.ems/src/framework/vo/result"
|
"be.ems/src/framework/vo/result"
|
||||||
"be.ems/src/modules/network_data/model"
|
"be.ems/src/modules/network_data/model"
|
||||||
neDataService "be.ems/src/modules/network_data/service"
|
neDataService "be.ems/src/modules/network_data/service"
|
||||||
neService "be.ems/src/modules/network_element/service"
|
neService "be.ems/src/modules/network_element/service"
|
||||||
sysService "be.ems/src/modules/system/service"
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gin-gonic/gin/binding"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 实例化控制层 SMSCController 结构体
|
// 实例化控制层 SMSCController 结构体
|
||||||
@@ -93,7 +87,7 @@ func (s *SMSCController) CDRExport(c *gin.Context) {
|
|||||||
language := ctx.AcceptLanguage(c)
|
language := ctx.AcceptLanguage(c)
|
||||||
// 查询结果,根据查询条件结果,单页最大值限制
|
// 查询结果,根据查询条件结果,单页最大值限制
|
||||||
var querys model.CDREventSMSCQuery
|
var querys model.CDREventSMSCQuery
|
||||||
if err := c.ShouldBindBodyWith(&querys, binding.JSON); err != nil {
|
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
|
||||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -117,90 +111,8 @@ func (s *SMSCController) CDRExport(c *gin.Context) {
|
|||||||
|
|
||||||
// 导出文件名称
|
// 导出文件名称
|
||||||
fileName := fmt.Sprintf("smsc_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli())
|
fileName := fmt.Sprintf("smsc_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli())
|
||||||
// 第一行表头标题
|
|
||||||
headerCells := map[string]string{
|
|
||||||
"A1": "ID",
|
|
||||||
"B1": "Record Behavior",
|
|
||||||
"C1": "Service Type",
|
|
||||||
"D1": "Caller",
|
|
||||||
"E1": "Called",
|
|
||||||
"F1": "Result",
|
|
||||||
"G1": "Time",
|
|
||||||
}
|
|
||||||
// 读取字典数据 CDR 原因码
|
|
||||||
dictCDRCauseCode := sysService.NewSysDictData.SelectDictDataByType("cdr_cause_code")
|
|
||||||
// 从第二行开始的数据
|
|
||||||
dataCells := make([]map[string]any, 0)
|
|
||||||
for i, row := range rows {
|
|
||||||
idx := strconv.Itoa(i + 2)
|
|
||||||
// 解析 JSON 字符串为 map
|
|
||||||
var cdrJSON map[string]interface{}
|
|
||||||
err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON)
|
|
||||||
if err != nil {
|
|
||||||
logger.Warnf("CDRExport Error parsing JSON: %s", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// 记录类型
|
|
||||||
recordType := ""
|
|
||||||
if v, ok := cdrJSON["recordType"]; ok && v != nil {
|
|
||||||
recordType = v.(string)
|
|
||||||
}
|
|
||||||
// 服务类型
|
|
||||||
serviceType := ""
|
|
||||||
if v, ok := cdrJSON["serviceType"]; ok && v != nil {
|
|
||||||
serviceType = v.(string)
|
|
||||||
}
|
|
||||||
// 被叫
|
|
||||||
called := ""
|
|
||||||
if v, ok := cdrJSON["calledParty"]; ok && v != nil {
|
|
||||||
called = v.(string)
|
|
||||||
}
|
|
||||||
// 主叫
|
|
||||||
caller := ""
|
|
||||||
if v, ok := cdrJSON["callerParty"]; ok && v != nil {
|
|
||||||
caller = v.(string)
|
|
||||||
}
|
|
||||||
// 呼叫结果 0失败,1成功
|
|
||||||
callResult := "Fail"
|
|
||||||
if v, ok := cdrJSON["result"]; ok && v != nil {
|
|
||||||
resultVal := parse.Number(v)
|
|
||||||
if resultVal == 1 {
|
|
||||||
callResult = "Success"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 结果原因
|
|
||||||
if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" {
|
|
||||||
cause := fmt.Sprint(v)
|
|
||||||
for _, v := range dictCDRCauseCode {
|
|
||||||
if cause == v.DictValue {
|
|
||||||
callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DictLabel))
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 取时间
|
|
||||||
timeStr := ""
|
|
||||||
if v, ok := cdrJSON["updateTime"]; ok && v != nil {
|
|
||||||
if releaseTime := parse.Number(v); releaseTime > 0 {
|
|
||||||
timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
|
||||||
} else {
|
|
||||||
timeStr = v.(string)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dataCells = append(dataCells, map[string]any{
|
|
||||||
"A" + idx: row.ID,
|
|
||||||
"B" + idx: recordType,
|
|
||||||
"C" + idx: serviceType,
|
|
||||||
"D" + idx: caller,
|
|
||||||
"E" + idx: called,
|
|
||||||
"F" + idx: callResult,
|
|
||||||
"G" + idx: timeStr,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 导出数据表格
|
// 导出数据表格
|
||||||
saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "")
|
saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName, language)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(200, result.ErrMsg(err.Error()))
|
c.JSON(200, result.ErrMsg(err.Error()))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -136,6 +136,10 @@ func Setup(router *gin.Engine) {
|
|||||||
middleware.PreAuthorize(nil),
|
middleware.PreAuthorize(nil),
|
||||||
controller.NewAMF.NbInfoList,
|
controller.NewAMF.NbInfoList,
|
||||||
)
|
)
|
||||||
|
amfGroup.GET("/nb/list-cfg",
|
||||||
|
middleware.PreAuthorize(nil),
|
||||||
|
controller.NewAMF.NbStateList,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 网元UPF
|
// 网元UPF
|
||||||
|
|||||||
@@ -1,10 +1,18 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"be.ems/src/framework/i18n"
|
||||||
|
"be.ems/src/framework/logger"
|
||||||
|
"be.ems/src/framework/utils/date"
|
||||||
|
"be.ems/src/framework/utils/file"
|
||||||
|
"be.ems/src/framework/utils/parse"
|
||||||
"be.ems/src/modules/network_data/model"
|
"be.ems/src/modules/network_data/model"
|
||||||
"be.ems/src/modules/network_data/repository"
|
"be.ems/src/modules/network_data/repository"
|
||||||
|
sysService "be.ems/src/modules/system/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 实例化数据层 CDREventIMS 结构体
|
// 实例化数据层 CDREventIMS 结构体
|
||||||
@@ -37,3 +45,100 @@ func (r *CDREventIMS) DeleteByIds(cdrIds []string) (int64, error) {
|
|||||||
// 删除信息失败!
|
// 删除信息失败!
|
||||||
return 0, fmt.Errorf("delete fail")
|
return 0, fmt.Errorf("delete fail")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExportXlsx 导出数据到 xlsx 文件
|
||||||
|
func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language string) (string, error) {
|
||||||
|
// 第一行表头标题
|
||||||
|
headerCells := map[string]string{
|
||||||
|
"A1": "ID",
|
||||||
|
"B1": "Record Behavior",
|
||||||
|
"C1": "Type",
|
||||||
|
"D1": "Caller",
|
||||||
|
"E1": "Called",
|
||||||
|
"F1": "Duration",
|
||||||
|
"G1": "Result",
|
||||||
|
"H1": "Time",
|
||||||
|
}
|
||||||
|
// 读取字典数据 CDR SIP响应代码类别类型
|
||||||
|
dictCDRSipCode := sysService.NewSysDictData.SelectDictDataByType("cdr_sip_code")
|
||||||
|
// 读取字典数据 CDR 呼叫类型
|
||||||
|
dictCDRCallType := sysService.NewSysDictData.SelectDictDataByType("cdr_call_type")
|
||||||
|
// 从第二行开始的数据
|
||||||
|
dataCells := make([]map[string]any, 0)
|
||||||
|
for i, row := range rows {
|
||||||
|
idx := strconv.Itoa(i + 2)
|
||||||
|
// 解析 JSON 字符串为 map
|
||||||
|
var cdrJSON map[string]interface{}
|
||||||
|
err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON)
|
||||||
|
if err != nil {
|
||||||
|
logger.Warnf("CDRExport Error parsing JSON: %s", err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 记录类型
|
||||||
|
recordType := ""
|
||||||
|
if v, ok := cdrJSON["recordType"]; ok && v != nil {
|
||||||
|
recordType = v.(string)
|
||||||
|
}
|
||||||
|
// 呼叫类型
|
||||||
|
callType := "sms"
|
||||||
|
callTypeLable := "SMS"
|
||||||
|
if v, ok := cdrJSON["callType"]; ok && v != nil {
|
||||||
|
callType = v.(string)
|
||||||
|
for _, v := range dictCDRCallType {
|
||||||
|
if callType == v.DictValue {
|
||||||
|
callTypeLable = i18n.TKey(language, v.DictLabel)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 被叫
|
||||||
|
called := ""
|
||||||
|
if v, ok := cdrJSON["calledParty"]; ok && v != nil {
|
||||||
|
called = v.(string)
|
||||||
|
}
|
||||||
|
// 主叫
|
||||||
|
caller := ""
|
||||||
|
if v, ok := cdrJSON["callerParty"]; ok && v != nil {
|
||||||
|
caller = v.(string)
|
||||||
|
}
|
||||||
|
// 时长
|
||||||
|
duration := "-"
|
||||||
|
if v, ok := cdrJSON["callDuration"]; ok && v != nil && callType != "sms" {
|
||||||
|
duration = fmt.Sprint(parse.Number(v))
|
||||||
|
}
|
||||||
|
// 呼叫结果 非短信都有code作为结果 sms短信都ok
|
||||||
|
callResult := "Success"
|
||||||
|
if v, ok := cdrJSON["cause"]; ok && v != nil && callType != "sms" {
|
||||||
|
cause := fmt.Sprint(v)
|
||||||
|
for _, v := range dictCDRSipCode {
|
||||||
|
if cause == v.DictValue {
|
||||||
|
callResult = i18n.TKey(language, v.DictLabel)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 取时间
|
||||||
|
timeStr := ""
|
||||||
|
if v, ok := cdrJSON["releaseTime"]; ok && v != nil {
|
||||||
|
if releaseTime := parse.Number(v); releaseTime > 0 {
|
||||||
|
timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
||||||
|
} else {
|
||||||
|
timeStr = v.(string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dataCells = append(dataCells, map[string]any{
|
||||||
|
"A" + idx: row.ID,
|
||||||
|
"B" + idx: recordType,
|
||||||
|
"C" + idx: callTypeLable,
|
||||||
|
"D" + idx: caller,
|
||||||
|
"E" + idx: called,
|
||||||
|
"F" + idx: duration,
|
||||||
|
"G" + idx: callResult,
|
||||||
|
"H" + idx: timeStr,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出数据表格
|
||||||
|
return file.WriteSheet(headerCells, dataCells, fileName, "")
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,10 +1,18 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"be.ems/src/framework/i18n"
|
||||||
|
"be.ems/src/framework/logger"
|
||||||
|
"be.ems/src/framework/utils/date"
|
||||||
|
"be.ems/src/framework/utils/file"
|
||||||
|
"be.ems/src/framework/utils/parse"
|
||||||
"be.ems/src/modules/network_data/model"
|
"be.ems/src/modules/network_data/model"
|
||||||
"be.ems/src/modules/network_data/repository"
|
"be.ems/src/modules/network_data/repository"
|
||||||
|
sysService "be.ems/src/modules/system/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 实例化数据层 CDREventSMSC 结构体
|
// 实例化数据层 CDREventSMSC 结构体
|
||||||
@@ -37,3 +45,91 @@ func (r *CDREventSMSC) DeleteByIds(cdrIds []string) (int64, error) {
|
|||||||
// 删除信息失败!
|
// 删除信息失败!
|
||||||
return 0, fmt.Errorf("delete fail")
|
return 0, fmt.Errorf("delete fail")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExportXlsx 导出数据到 xlsx 文件
|
||||||
|
func (r CDREventSMSC) ExportXlsx(rows []model.CDREventSMSC, fileName, language string) (string, error) {
|
||||||
|
// 第一行表头标题
|
||||||
|
headerCells := map[string]string{
|
||||||
|
"A1": "ID",
|
||||||
|
"B1": "Record Behavior",
|
||||||
|
"C1": "Service Type",
|
||||||
|
"D1": "Caller",
|
||||||
|
"E1": "Called",
|
||||||
|
"F1": "Result",
|
||||||
|
"G1": "Time",
|
||||||
|
}
|
||||||
|
// 读取字典数据 CDR 原因码
|
||||||
|
dictCDRCauseCode := sysService.NewSysDictData.SelectDictDataByType("cdr_cause_code")
|
||||||
|
// 从第二行开始的数据
|
||||||
|
dataCells := make([]map[string]any, 0)
|
||||||
|
for i, row := range rows {
|
||||||
|
idx := strconv.Itoa(i + 2)
|
||||||
|
// 解析 JSON 字符串为 map
|
||||||
|
var cdrJSON map[string]interface{}
|
||||||
|
err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON)
|
||||||
|
if err != nil {
|
||||||
|
logger.Warnf("CDRExport Error parsing JSON: %s", err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 记录类型
|
||||||
|
recordType := ""
|
||||||
|
if v, ok := cdrJSON["recordType"]; ok && v != nil {
|
||||||
|
recordType = v.(string)
|
||||||
|
}
|
||||||
|
// 服务类型
|
||||||
|
serviceType := ""
|
||||||
|
if v, ok := cdrJSON["serviceType"]; ok && v != nil {
|
||||||
|
serviceType = v.(string)
|
||||||
|
}
|
||||||
|
// 被叫
|
||||||
|
called := ""
|
||||||
|
if v, ok := cdrJSON["calledParty"]; ok && v != nil {
|
||||||
|
called = v.(string)
|
||||||
|
}
|
||||||
|
// 主叫
|
||||||
|
caller := ""
|
||||||
|
if v, ok := cdrJSON["callerParty"]; ok && v != nil {
|
||||||
|
caller = v.(string)
|
||||||
|
}
|
||||||
|
// 呼叫结果 0失败,1成功
|
||||||
|
callResult := "Fail"
|
||||||
|
if v, ok := cdrJSON["result"]; ok && v != nil {
|
||||||
|
resultVal := parse.Number(v)
|
||||||
|
if resultVal == 1 {
|
||||||
|
callResult = "Success"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 结果原因
|
||||||
|
if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" {
|
||||||
|
cause := fmt.Sprint(v)
|
||||||
|
for _, v := range dictCDRCauseCode {
|
||||||
|
if cause == v.DictValue {
|
||||||
|
callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DictLabel))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 取时间
|
||||||
|
timeStr := ""
|
||||||
|
if v, ok := cdrJSON["updateTime"]; ok && v != nil {
|
||||||
|
if releaseTime := parse.Number(v); releaseTime > 0 {
|
||||||
|
timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
||||||
|
} else {
|
||||||
|
timeStr = v.(string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dataCells = append(dataCells, map[string]any{
|
||||||
|
"A" + idx: row.ID,
|
||||||
|
"B" + idx: recordType,
|
||||||
|
"C" + idx: serviceType,
|
||||||
|
"D" + idx: caller,
|
||||||
|
"E" + idx: called,
|
||||||
|
"F" + idx: callResult,
|
||||||
|
"G" + idx: timeStr,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出数据表格
|
||||||
|
return file.WriteSheet(headerCells, dataCells, fileName, "")
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,10 +1,16 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"be.ems/src/framework/i18n"
|
||||||
|
"be.ems/src/framework/logger"
|
||||||
|
"be.ems/src/framework/utils/file"
|
||||||
"be.ems/src/modules/network_data/model"
|
"be.ems/src/modules/network_data/model"
|
||||||
"be.ems/src/modules/network_data/repository"
|
"be.ems/src/modules/network_data/repository"
|
||||||
|
sysService "be.ems/src/modules/system/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 实例化数据层 UEEventAMF 结构体
|
// 实例化数据层 UEEventAMF 结构体
|
||||||
@@ -14,8 +20,7 @@ var NewUEEventAMF = &UEEventAMF{
|
|||||||
|
|
||||||
// UEEventAMF UE会话事件AMF 服务层处理
|
// UEEventAMF UE会话事件AMF 服务层处理
|
||||||
type UEEventAMF struct {
|
type UEEventAMF struct {
|
||||||
// UE会话事件数据信息
|
ueEventRepository *repository.UEEventAMF // UE会话事件数据信息
|
||||||
ueEventRepository *repository.UEEventAMF
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SelectPage 根据条件分页查询
|
// SelectPage 根据条件分页查询
|
||||||
@@ -38,3 +43,96 @@ func (r *UEEventAMF) DeleteByIds(ueIds []string) (int64, error) {
|
|||||||
// 删除信息失败!
|
// 删除信息失败!
|
||||||
return 0, fmt.Errorf("delete fail")
|
return 0, fmt.Errorf("delete fail")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExportXlsx 导出数据到 xlsx 文件
|
||||||
|
func (r UEEventAMF) ExportXlsx(rows []model.UEEventAMF, fileName, language string) (string, error) {
|
||||||
|
// 第一行表头标题
|
||||||
|
headerCells := map[string]string{
|
||||||
|
"A1": "ID",
|
||||||
|
"B1": "IMSI",
|
||||||
|
"C1": "Event Type",
|
||||||
|
"D1": "Result",
|
||||||
|
"E1": "Time",
|
||||||
|
}
|
||||||
|
// 读取字典数据 UE 事件类型
|
||||||
|
dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type")
|
||||||
|
// 读取字典数据 UE 事件认证代码类型
|
||||||
|
dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code")
|
||||||
|
// 读取字典数据 UE 事件CM状态
|
||||||
|
dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state")
|
||||||
|
// 从第二行开始的数据
|
||||||
|
dataCells := make([]map[string]any, 0)
|
||||||
|
for i, row := range rows {
|
||||||
|
idx := strconv.Itoa(i + 2)
|
||||||
|
// 解析 JSON 字符串为 map
|
||||||
|
var eventJSON map[string]interface{}
|
||||||
|
err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON)
|
||||||
|
if err != nil {
|
||||||
|
logger.Warnf("UEExport Error parsing JSON: %s", err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// 取IMSI
|
||||||
|
imsi := ""
|
||||||
|
if v, ok := eventJSON["imsi"]; ok && v != nil {
|
||||||
|
imsi = v.(string)
|
||||||
|
}
|
||||||
|
// 取类型
|
||||||
|
eventType := ""
|
||||||
|
for _, v := range dictUEEventType {
|
||||||
|
if row.EventType == v.DictValue {
|
||||||
|
eventType = i18n.TKey(language, v.DictLabel)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 取结果
|
||||||
|
eventResult := ""
|
||||||
|
// 取时间
|
||||||
|
timeStr := ""
|
||||||
|
if row.EventType == "auth-result" {
|
||||||
|
if v, ok := eventJSON["authTime"]; ok && v != nil {
|
||||||
|
timeStr = v.(string)
|
||||||
|
}
|
||||||
|
if v, ok := eventJSON["authCode"]; ok && v != nil {
|
||||||
|
eventResult = v.(string)
|
||||||
|
for _, v := range dictUEAauthCode {
|
||||||
|
if eventResult == v.DictValue {
|
||||||
|
eventResult = i18n.TKey(language, v.DictLabel)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if row.EventType == "detach" {
|
||||||
|
if v, ok := eventJSON["detachTime"]; ok && v != nil {
|
||||||
|
timeStr = v.(string)
|
||||||
|
}
|
||||||
|
eventResult = "Success"
|
||||||
|
}
|
||||||
|
if row.EventType == "cm-state" {
|
||||||
|
if v, ok := eventJSON["changeTime"]; ok && v != nil {
|
||||||
|
timeStr = v.(string)
|
||||||
|
}
|
||||||
|
if v, ok := eventJSON["status"]; ok && v != nil {
|
||||||
|
eventResult = fmt.Sprint(v)
|
||||||
|
for _, v := range dictUEEventCmState {
|
||||||
|
if eventResult == v.DictValue {
|
||||||
|
eventResult = i18n.TKey(language, v.DictLabel)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dataCells = append(dataCells, map[string]any{
|
||||||
|
"A" + idx: row.ID,
|
||||||
|
"B" + idx: imsi,
|
||||||
|
"C" + idx: eventType,
|
||||||
|
"D" + idx: eventResult,
|
||||||
|
"E" + idx: timeStr,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出数据表格
|
||||||
|
return file.WriteSheet(headerCells, dataCells, fileName, "")
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,10 +1,18 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"be.ems/src/framework/i18n"
|
||||||
|
"be.ems/src/framework/logger"
|
||||||
|
"be.ems/src/framework/utils/date"
|
||||||
|
"be.ems/src/framework/utils/file"
|
||||||
|
"be.ems/src/framework/utils/parse"
|
||||||
"be.ems/src/modules/network_data/model"
|
"be.ems/src/modules/network_data/model"
|
||||||
"be.ems/src/modules/network_data/repository"
|
"be.ems/src/modules/network_data/repository"
|
||||||
|
sysService "be.ems/src/modules/system/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 实例化数据层 UEEventMME 结构体
|
// 实例化数据层 UEEventMME 结构体
|
||||||
@@ -37,3 +45,86 @@ func (r *UEEventMME) DeleteByIds(ueIds []string) (int64, error) {
|
|||||||
// 删除信息失败!
|
// 删除信息失败!
|
||||||
return 0, fmt.Errorf("delete fail")
|
return 0, fmt.Errorf("delete fail")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExportXlsx 导出数据到 xlsx 文件
|
||||||
|
func (r UEEventMME) ExportXlsx(rows []model.UEEventMME, fileName, language string) (string, error) {
|
||||||
|
// 第一行表头标题
|
||||||
|
headerCells := map[string]string{
|
||||||
|
"A1": "ID",
|
||||||
|
"B1": "IMSI",
|
||||||
|
"C1": "Event Type",
|
||||||
|
"D1": "Result",
|
||||||
|
"E1": "Time",
|
||||||
|
}
|
||||||
|
// 读取字典数据 UE 事件类型
|
||||||
|
dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type")
|
||||||
|
// 读取字典数据 UE 事件认证代码类型
|
||||||
|
dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code")
|
||||||
|
// 读取字典数据 UE 事件CM状态
|
||||||
|
dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state")
|
||||||
|
// 从第二行开始的数据
|
||||||
|
dataCells := make([]map[string]any, 0)
|
||||||
|
for i, row := range rows {
|
||||||
|
idx := strconv.Itoa(i + 2)
|
||||||
|
// 解析 JSON 字符串为 map
|
||||||
|
var eventJSON map[string]interface{}
|
||||||
|
err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON)
|
||||||
|
if err != nil {
|
||||||
|
logger.Warnf("UEExport Error parsing JSON: %s", err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// 取IMSI
|
||||||
|
imsi := ""
|
||||||
|
if v, ok := eventJSON["imsi"]; ok && v != nil {
|
||||||
|
imsi = v.(string)
|
||||||
|
}
|
||||||
|
// 取类型
|
||||||
|
eventType := row.EventType
|
||||||
|
for _, v := range dictUEEventType {
|
||||||
|
if row.EventType == v.DictValue {
|
||||||
|
eventType = i18n.TKey(language, v.DictLabel)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 取结果
|
||||||
|
eventResult := ""
|
||||||
|
if v, ok := eventJSON["result"]; ok && v != nil {
|
||||||
|
eventResult = v.(string)
|
||||||
|
if row.EventType == "auth-result" {
|
||||||
|
for _, v := range dictUEAauthCode {
|
||||||
|
if eventResult == v.DictValue {
|
||||||
|
eventResult = i18n.TKey(language, v.DictLabel)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if row.EventType == "cm-state" {
|
||||||
|
for _, v := range dictUEEventCmState {
|
||||||
|
if eventResult == v.DictValue {
|
||||||
|
eventResult = i18n.TKey(language, v.DictLabel)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 取时间
|
||||||
|
timeStr := ""
|
||||||
|
if v, ok := eventJSON["timestamp"]; ok && v != nil {
|
||||||
|
rowTime := parse.Number(v)
|
||||||
|
timeStr = date.ParseDateToStr(rowTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
||||||
|
}
|
||||||
|
|
||||||
|
dataCells = append(dataCells, map[string]any{
|
||||||
|
"A" + idx: row.ID,
|
||||||
|
"B" + idx: imsi,
|
||||||
|
"C" + idx: eventType,
|
||||||
|
"D" + idx: eventResult,
|
||||||
|
"E" + idx: timeStr,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出数据表格
|
||||||
|
return file.WriteSheet(headerCells, dataCells, fileName, "")
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ import (
|
|||||||
|
|
||||||
// AMFNbInfoList AMF基站信息
|
// AMFNbInfoList AMF基站信息
|
||||||
//
|
//
|
||||||
// 查询参数 {"nbId":"7"}
|
// 查询参数 {"id":"7"}
|
||||||
//
|
//
|
||||||
// 返回结果 []
|
// 返回结果 []
|
||||||
func AMFNbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) {
|
func AMFNbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) {
|
||||||
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbInfo", neInfo.IP, neInfo.Port)
|
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbInfo", neInfo.IP, neInfo.Port)
|
||||||
// 查询参数拼接
|
// 查询参数拼接
|
||||||
query := []string{}
|
query := []string{}
|
||||||
if v, ok := data["nbId"]; ok && v != "" {
|
if v, ok := data["id"]; ok && v != "" {
|
||||||
query = append(query, fmt.Sprintf("nbId=%s", v))
|
query = append(query, fmt.Sprintf("nbId=%s", v))
|
||||||
}
|
}
|
||||||
if len(query) > 0 {
|
if len(query) > 0 {
|
||||||
@@ -44,7 +44,47 @@ func AMFNbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]an
|
|||||||
|
|
||||||
// 固定返回字段,方便前端解析
|
// 固定返回字段,方便前端解析
|
||||||
if v, ok := resData["data"]; ok && v != nil {
|
if v, ok := resData["data"]; ok && v != nil {
|
||||||
return v.([]map[string]any), nil
|
if arr := v.([]any); len(arr) > 0 {
|
||||||
|
result := make([]map[string]any, len(arr))
|
||||||
|
for i, item := range arr {
|
||||||
|
result[i] = item.(map[string]any)
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return []map[string]any{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AMFGnbStateList AMF基站状态信息,对比配置项gnbList
|
||||||
|
//
|
||||||
|
// 返回结果 []
|
||||||
|
func AMFGnbStateList(neInfo model.NeInfo) ([]map[string]any, error) {
|
||||||
|
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbState", neInfo.IP, neInfo.Port)
|
||||||
|
resBytes, err := fetch.Get(neUrl, nil, 60_000)
|
||||||
|
if err != nil {
|
||||||
|
errStr := err.Error()
|
||||||
|
logger.Warnf("AMFNbInfoList Get \"%s\"", neUrl)
|
||||||
|
logger.Errorf("AMFNbInfoList %s", errStr)
|
||||||
|
return nil, fmt.Errorf("NeService AMF API Error")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 序列化结果 {"data":[{"name": "Gnb","address": "192.168.8.1","state": "INACTIVE"}]}
|
||||||
|
var resData map[string]any
|
||||||
|
err = json.Unmarshal(resBytes, &resData)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("AMFNbInfoList Unmarshal %s", err.Error())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 固定返回字段,方便前端解析
|
||||||
|
if v, ok := resData["data"]; ok && v != nil {
|
||||||
|
if arr := v.([]any); len(arr) > 0 {
|
||||||
|
result := make([]map[string]any, len(arr))
|
||||||
|
for i, item := range arr {
|
||||||
|
result[i] = item.(map[string]any)
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return []map[string]any{}, nil
|
return []map[string]any{}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,7 +88,13 @@ func IMSUeSessionList(neInfo model.NeInfo, data map[string]string) ([]map[string
|
|||||||
|
|
||||||
// 固定返回字段,方便前端解析
|
// 固定返回字段,方便前端解析
|
||||||
if v, ok := resData["data"]; ok && v != nil {
|
if v, ok := resData["data"]; ok && v != nil {
|
||||||
return v.([]map[string]any), nil
|
if arr := v.([]any); len(arr) > 0 {
|
||||||
|
result := make([]map[string]any, len(arr))
|
||||||
|
for i, item := range arr {
|
||||||
|
result[i] = item.(map[string]any)
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return []map[string]any{}, nil
|
return []map[string]any{}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ import (
|
|||||||
|
|
||||||
// MMENbInfoList AMF基站信息
|
// MMENbInfoList AMF基站信息
|
||||||
//
|
//
|
||||||
// 查询参数 {"nbId":"7"}
|
// 查询参数 {"id":"7"}
|
||||||
//
|
//
|
||||||
// 返回结果 []
|
// 返回结果 []
|
||||||
func MMENbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) {
|
func MMENbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) {
|
||||||
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbInfo", neInfo.IP, neInfo.Port)
|
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbInfo", neInfo.IP, neInfo.Port)
|
||||||
// 查询参数拼接
|
// 查询参数拼接
|
||||||
query := []string{}
|
query := []string{}
|
||||||
if v, ok := data["nbId"]; ok && v != "" {
|
if v, ok := data["id"]; ok && v != "" {
|
||||||
query = append(query, fmt.Sprintf("nbId=%s", v))
|
query = append(query, fmt.Sprintf("nbId=%s", v))
|
||||||
}
|
}
|
||||||
if len(query) > 0 {
|
if len(query) > 0 {
|
||||||
@@ -44,7 +44,13 @@ func MMENbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]an
|
|||||||
|
|
||||||
// 固定返回字段,方便前端解析
|
// 固定返回字段,方便前端解析
|
||||||
if v, ok := resData["data"]; ok && v != nil {
|
if v, ok := resData["data"]; ok && v != nil {
|
||||||
return v.([]map[string]any), nil
|
if arr := v.([]any); len(arr) > 0 {
|
||||||
|
result := make([]map[string]any, len(arr))
|
||||||
|
for i, item := range arr {
|
||||||
|
result[i] = item.(map[string]any)
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return []map[string]any{}, nil
|
return []map[string]any{}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,10 @@ func NeConfigInfo(neInfo model.NeInfo, paramName string) (map[string]any, error)
|
|||||||
logger.Errorf("NeConfigInfo Unmarshal %s", err.Error())
|
logger.Errorf("NeConfigInfo Unmarshal %s", err.Error())
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
// 网元参数配置信息为空时是{},需要补充data属性
|
||||||
|
if _, ok := resData["data"]; !ok {
|
||||||
|
resData["data"] = []map[string]any{}
|
||||||
|
}
|
||||||
return resData, nil
|
return resData, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"be.ems/src/framework/vo/result"
|
"be.ems/src/framework/vo/result"
|
||||||
neDataModel "be.ems/src/modules/network_data/model"
|
neDataModel "be.ems/src/modules/network_data/model"
|
||||||
neDataService "be.ems/src/modules/network_data/service"
|
neDataService "be.ems/src/modules/network_data/service"
|
||||||
|
neService "be.ems/src/modules/network_element/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetUEConnectByAMF 获取UE会话事件-AMF
|
// GetUEConnectByAMF 获取UE会话事件-AMF
|
||||||
@@ -20,6 +21,13 @@ func GetUEConnectByAMF(requestID string, data any) ([]byte, error) {
|
|||||||
return nil, fmt.Errorf("query data structure error")
|
return nil, fmt.Errorf("query data structure error")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查询网元获取IP
|
||||||
|
neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID("AMF", query.NeID)
|
||||||
|
if neInfo.NeId != query.NeID || neInfo.IP == "" {
|
||||||
|
return nil, fmt.Errorf("not fount neId info")
|
||||||
|
}
|
||||||
|
query.RmUID = neInfo.RmUID
|
||||||
|
|
||||||
rows, total := neDataService.NewUEEventAMF.SelectPage(query)
|
rows, total := neDataService.NewUEEventAMF.SelectPage(query)
|
||||||
resultByte, err := json.Marshal(result.Ok(map[string]any{
|
resultByte, err := json.Marshal(result.Ok(map[string]any{
|
||||||
"requestId": requestID,
|
"requestId": requestID,
|
||||||
@@ -38,6 +46,13 @@ func GetUEConnectByMME(requestID string, data any) ([]byte, error) {
|
|||||||
return nil, fmt.Errorf("query data structure error")
|
return nil, fmt.Errorf("query data structure error")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查询网元获取IP
|
||||||
|
neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID("MME", query.NeID)
|
||||||
|
if neInfo.NeId != query.NeID || neInfo.IP == "" {
|
||||||
|
return nil, fmt.Errorf("not fount neId info")
|
||||||
|
}
|
||||||
|
query.RmUID = neInfo.RmUID
|
||||||
|
|
||||||
rows, total := neDataService.NewUEEventMME.SelectPage(query)
|
rows, total := neDataService.NewUEEventMME.SelectPage(query)
|
||||||
resultByte, err := json.Marshal(result.Ok(map[string]any{
|
resultByte, err := json.Marshal(result.Ok(map[string]any{
|
||||||
"requestId": requestID,
|
"requestId": requestID,
|
||||||
|
|||||||
@@ -30,10 +30,10 @@ const (
|
|||||||
GROUP_SMSC_CDR = "1007_"
|
GROUP_SMSC_CDR = "1007_"
|
||||||
// 组号-SGWC_CDR会话事件 1008_neId
|
// 组号-SGWC_CDR会话事件 1008_neId
|
||||||
GROUP_SGWC_CDR = "1008_"
|
GROUP_SGWC_CDR = "1008_"
|
||||||
// 组号-AMF_UE会话事件
|
// 组号-AMF_UE会话事件 1010_neId
|
||||||
GROUP_AMF_UE = "1010"
|
GROUP_AMF_UE = "1010"
|
||||||
// 组号-MME_UE会话事件 1011_neId
|
// 组号-MME_UE会话事件 1011_neId
|
||||||
GROUP_MME_UE = "1011_"
|
GROUP_MME_UE = "1011"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 实例化服务层 WSSend 结构体
|
// 实例化服务层 WSSend 结构体
|
||||||
|
|||||||
Reference in New Issue
Block a user