diff --git a/database/install/ne_state.sql b/database/install/ne_state.sql index c9cc4de7..6d44ed7e 100644 --- a/database/install/ne_state.sql +++ b/database/install/ne_state.sql @@ -4,25 +4,23 @@ SET FOREIGN_KEY_CHECKS = 0; -- -- Table structure for table `ne_state` -- - - DROP TABLE IF EXISTS `ne_state`; - -CREATE TABLE `ne_state` ( +CREATE TABLE `ne_state` ( `id` int NOT NULL AUTO_INCREMENT, - `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `version` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `capability` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `serial_num` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `expiry_date` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-', - `cpu_usage` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, - `mem_usage` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, - `disk_space` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, - `timestamp` datetime NULL DEFAULT CURRENT_TIMESTAMP, + `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `version` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '版本', + `capability` bigint DEFAULT '0' COMMENT '用户容量', + `serial_num` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '序列号', + `expiry_date` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '许可证到期日期', + `sys_cpu_usage` float DEFAULT '0' COMMENT 'cpu使用率-sys', + `sys_mem_usage` float DEFAULT '0' COMMENT '内存使用率-sys', + `sys_disk_usage` float DEFAULT '0' COMMENT '磁盘使用率-sys', + `nf_cpu_usage` float DEFAULT '0' COMMENT 'cpu使用率-nf', + `nf_mem_used` bigint DEFAULT '0' COMMENT '内存使用KB-nf', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_ne_type_id`(`ne_type` ASC, `ne_id` ASC) USING BTREE, - INDEX `idx_timestamp`(`timestamp` ASC) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 8551941 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + KEY `idx_type_id_time` (`ne_type`,`ne_id`,`create_time`) USING BTREE COMMENT 'idx_state_ne_type_id_at' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_状态记录内存/CPU/磁盘'; SET FOREIGN_KEY_CHECKS=1; diff --git a/database/upgrade/upg_nb_state.sql b/database/upgrade/upg_nb_state.sql index bc26eea9..6d44ed7e 100644 --- a/database/upgrade/upg_nb_state.sql +++ b/database/upgrade/upg_nb_state.sql @@ -1,21 +1,26 @@ --- --- Table structure for table `nb_state` --- +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; -CREATE TABLE IF NOT EXISTS `nb_state` ( +-- +-- Table structure for table `ne_state` +-- +DROP TABLE IF EXISTS `ne_state`; +CREATE TABLE `ne_state` ( `id` int NOT NULL AUTO_INCREMENT, - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型 AMF MME', - `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', - `rm_uid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '资源唯一标识', + `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `version` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '版本', + `capability` bigint DEFAULT '0' COMMENT '用户容量', + `serial_num` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '序列号', + `expiry_date` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '许可证到期日期', + `sys_cpu_usage` float DEFAULT '0' COMMENT 'cpu使用率-sys', + `sys_mem_usage` float DEFAULT '0' COMMENT '内存使用率-sys', + `sys_disk_usage` float DEFAULT '0' COMMENT '磁盘使用率-sys', + `nf_cpu_usage` float DEFAULT '0' COMMENT 'cpu使用率-nf', + `nf_mem_used` bigint DEFAULT '0' COMMENT '内存使用KB-nf', `create_time` bigint DEFAULT '0' COMMENT '创建时间', - `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '基站IP地址', - `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '基站名称', - `position` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '基站位置', - `nb_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '基站设备名称', - `state` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'OFF' COMMENT '基站状态 OFF ON', - `time` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '状态时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_type_id_uid_cat` (`ne_type`,`ne_id`,`rm_uid`,`create_time`) USING BTREE COMMENT '唯一网元类型和ID' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='基站状态记录表'; + KEY `idx_type_id_time` (`ne_type`,`ne_id`,`create_time`) USING BTREE COMMENT 'idx_state_ne_type_id_at' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_状态记录内存/CPU/磁盘'; --- Dump completed on 2025-02-08 12:50:13 +SET FOREIGN_KEY_CHECKS=1; diff --git a/src/modules/network_data/controller/all_ne_state.go b/src/modules/network_data/controller/all_ne_state.go new file mode 100644 index 00000000..66862313 --- /dev/null +++ b/src/modules/network_data/controller/all_ne_state.go @@ -0,0 +1,59 @@ +package controller + +import ( + "fmt" + + "github.com/gin-gonic/gin" + + "be.ems/src/framework/resp" + "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" +) + +// 实例化控制层 NEStateController 结构体 +var NewNEState = &NEStateController{ + neInfoService: neService.NewNeInfo, + neStateService: neDataService.NewNEState, +} + +// 网元状态记录 +// +// PATH /ne-state +type NEStateController struct { + neInfoService *neService.NeInfo // 网元信息服务 + neStateService *neDataService.NEState // 网元状态服务 +} + +// 网元状态记录-内存/CPU/磁盘列表 +// +// GET /list +// +// @Tags network_data +// @Accept json +// @Produce json +// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) default(AMF) +// @Param neId query string true "NE ID" default(001) +// @Param pageNum query number true "pageNum" default(1) +// @Param pageSize query number true "pageSize" default(10) +// @Param startTime query number false "Start time (timestamped milliseconds)" default(1729162507596) +// @Param endTime query number false "End time (timestamped milliseconds)" default(1729164187611) +// @Param sortField query string false "Sort fields, fill in result fields" Enums(id,create_time) default(id) +// @Param sortOrder query string false "Sort by ascending or descending order" Enums(asc,desc) default(asc) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary NE Status Record - Memory/CPU/Disk List +// @Description NE Status Record - Memory/CPU/Disk List +// @Router /ne-state/list [get] +func (s NEStateController) List(c *gin.Context) { + var query model.NEStateQuery + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(422001, errMsgs)) + return + } + + // 查询数据 + rows, total := s.neStateService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) +} diff --git a/src/modules/network_data/model/ne_state.go b/src/modules/network_data/model/ne_state.go new file mode 100644 index 00000000..b875f58f --- /dev/null +++ b/src/modules/network_data/model/ne_state.go @@ -0,0 +1,35 @@ +package model + +// NEState 网元状态记录表 ne_state +type NEState struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeId string `json:"neId" gorm:"column:ne_id"` + Version string `json:"version" gorm:"column:version"` // 版本 + Capability int64 `json:"capability" gorm:"column:capability"` // 用户容量 + SerialNum string `json:"serialNum" gorm:"column:serial_num"` // 序列号 + ExpiryDate string `json:"expiryDate" gorm:"column:expiry_date"` // 许可证到期日期 + SysCpuUsage float64 `json:"sysCpuUsage" gorm:"column:sys_cpu_usage"` // cpu使用率-sys + SysMemUsage float64 `json:"sysMemUsage" gorm:"column:sys_mem_usage"` // 内存使用率-sys + SysDiskUsage float64 `json:"sysDiskUsage" gorm:"column:sys_disk_usage"` // 磁盘使用率-sys + NfCpuUsage float64 `json:"nfCpuUsage" gorm:"column:nf_cpu_usage"` // cpu使用率-nf + NfMemUsed int64 `json:"nfMemUsed" gorm:"column:nf_mem_used"` // 内存使用KB-nf + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 +} + +// TableName 表名称 +func (*NEState) TableName() string { + return "ne_state" +} + +// NEStateQuery 查询参数结构体 +type NEStateQuery struct { + NeType string `json:"neType" form:"neType" binding:"required"` + NeID string `json:"neId" form:"neId" binding:"required"` + PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` + PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` + BeginTime string `json:"beginTime" form:"beginTime"` + EndTime string `json:"endTime" form:"endTime"` + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=id create_time"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc +} diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index 88b2758b..a7a8d456 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -46,6 +46,15 @@ func Setup(router *gin.Engine) { ) } + // 网元状态记录信息 + neStateGroup := neDataGroup.Group("/ne-state") + { + neStateGroup.GET("/list", + middleware.PreAuthorize(nil), + controller.NewNEState.List, + ) + } + // 基站状态历史记录信息 含AMF/MME nbStateGroup := neDataGroup.Group("/nb-state") { @@ -222,6 +231,23 @@ func Setup(router *gin.Engine) { ) } + // 备份数据 + backupGroup := neDataGroup.Group("/backup") + { + backupGroup.GET("/ftp", + middleware.PreAuthorize(nil), + controller.NewBackup.FTPInfo, + ) + backupGroup.PUT("/ftp", + middleware.PreAuthorize(nil), + controller.NewBackup.FTPUpdate, + ) + backupGroup.POST("/ftp", + middleware.PreAuthorize(nil), + controller.NewBackup.FTPPush, + ) + } + // 网元UDM 签约用户信息 udmSubGroup := neDataGroup.Group("/udm/sub") { diff --git a/src/modules/network_data/repository/ne_state.go b/src/modules/network_data/repository/ne_state.go new file mode 100644 index 00000000..05f48a8f --- /dev/null +++ b/src/modules/network_data/repository/ne_state.go @@ -0,0 +1,110 @@ +package repository + +import ( + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 NEState 结构体 +var NewNEState = &NEState{} + +// NEState 网元状态记录表 数据层处理 +type NEState struct{} + +// SelectByPage 分页查询集合 +func (r NEState) SelectByPage(query model.NEStateQuery) ([]model.NEState, int64) { + tx := db.DB("").Model(&model.NEState{}) + // 查询条件拼接 + if query.NeType != "" { + tx = tx.Where("ne_type = ?", query.NeType) + } + if query.NeID != "" { + tx = tx.Where("ne_id = ?", query.NeID) + } + if query.BeginTime != "" { + startTime := query.BeginTime + if len(startTime) == 10 { + startTime = startTime + "000" + } + tx = tx.Where("create_time >= ?", startTime) + } + if query.EndTime != "" { + endTime := query.EndTime + if len(endTime) == 10 { + endTime = endTime + "999" + } + tx = tx.Where("create_time <= ?", endTime) + } + + // 查询结果 + var total int64 = 0 + rows := []model.NEState{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } + + // 排序 + if query.SortField != "" { + sortField := query.SortField + if query.SortOrder == "desc" { + sortField = sortField + " desc" + } + tx = tx.Order(sortField) + } + + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// SelectByIds 通过ID查询 +func (r NEState) SelectByIds(ids []string) []model.NEState { + rows := []model.NEState{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.NEState{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// DeleteByTime 删除信息 +func (r NEState) DeleteByTime(ltTime int64) int64 { + if ltTime <= 0 { + return 0 + } + tx := db.DB("").Where("create_time < ?", ltTime) + if err := tx.Delete(&model.NEState{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// Insert 新增信息 +func (r NEState) Insert(param model.NEState) int64 { + param.CreateTime = time.Now().UnixMilli() + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} diff --git a/src/modules/network_data/service/ne_state.go b/src/modules/network_data/service/ne_state.go new file mode 100644 index 00000000..be467f18 --- /dev/null +++ b/src/modules/network_data/service/ne_state.go @@ -0,0 +1,31 @@ +package service + +import ( + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) + +// 实例化数据层 NEState 结构体 +var NewNEState = &NEState{ + neStateRepository: repository.NewNEState, +} + +// NEState 网元状态记录表 服务层处理 +type NEState struct { + neStateRepository *repository.NEState // 网元状态记录信息 +} + +// FindByPage 根据条件分页查询 +func (r NEState) FindByPage(query model.NEStateQuery) ([]model.NEState, int64) { + return r.neStateRepository.SelectByPage(query) +} + +// Insert 插入数据 +func (r NEState) Insert(item model.NEState) int64 { + return r.neStateRepository.Insert(item) +} + +// DeleteByTime 删除数据 +func (r NEState) DeleteByTime(ltTime int64) int64 { + return r.neStateRepository.DeleteByTime(ltTime) +}