diff --git a/build/database/lite/install/ne_state.sql b/build/database/lite/install/ne_state.sql index 7ddea274..08a6528b 100644 --- a/build/database/lite/install/ne_state.sql +++ b/build/database/lite/install/ne_state.sql @@ -7,13 +7,15 @@ CREATE TABLE "ne_state" ( "ne_type" text(16), "ne_id" text(32), "version" text(16), - "capability" text(64), + "capability" integer, "serial_num" text(16), "expiry_date" text(10), - "cpu_usage" text, - "mem_usage" text, - "disk_space" text, - "timestamp" integer(20), + "sys_cpu_usage" integer, + "sys_mem_usage" integer, + "sys_disk_usage" integer, + "nf_cpu_usage" integer, + "nf_mem_used" integer, + "create_time" integer, PRIMARY KEY ("id") ); @@ -24,7 +26,7 @@ CREATE INDEX "idx_type_id_time" ON "ne_state" ( "ne_type" ASC, "ne_id" ASC, - "timestamp" ASC + "create_time" ASC ); -- ---------------------------- diff --git a/build/database/std/install/ne_state.sql b/build/database/std/install/ne_state.sql index 844650fb..6d44ed7e 100644 --- a/build/database/std/install/ne_state.sql +++ b/build/database/std/install/ne_state.sql @@ -5,21 +5,22 @@ SET FOREIGN_KEY_CHECKS = 0; -- 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(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 '', - `capability` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', - `serial_num` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', - `expiry_date` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', - `cpu_usage` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'json信息', - `mem_usage` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'json信息', - `disk_space` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'json信息', - `timestamp` bigint DEFAULT '0' COMMENT '创建时间', + `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, - KEY `idx_type_id_time` (`ne_type`,`ne_id`,`timestamp`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci 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/磁盘'; 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 bab4b2c5..d0a68959 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -84,6 +84,15 @@ func Setup(router *gin.Engine) { ) } + // 网元状态记录信息 + neStateGroup := neDataGroup.Group("/ne-state") + { + neStateGroup.GET("/list", + middleware.AuthorizeUser(nil), + controller.NewNEState.List, + ) + } + // 基站状态历史记录信息 含AMF/MME nbStateGroup := neDataGroup.Group("/nb-state") { diff --git a/src/modules/network_data/repository/nb_state.go b/src/modules/network_data/repository/nb_state.go index 0c3fa1ed..6faf437c 100644 --- a/src/modules/network_data/repository/nb_state.go +++ b/src/modules/network_data/repository/nb_state.go @@ -5,6 +5,7 @@ import ( "be.ems/src/framework/database/db" "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" "be.ems/src/modules/network_data/model" ) @@ -35,14 +36,14 @@ func (r NBState) SelectByPage(query model.NBStateQuery) ([]model.NBState, int64) if len(startTime) == 10 { startTime = startTime + "000" } - tx = tx.Where("create_time >= ?", startTime) + tx = tx.Where("time >= ?", date.ParseDateToStr(startTime, date.YYYY_MM_DDTHH_MM_SSZ)) } if query.EndTime != "" { endTime := query.EndTime if len(endTime) == 10 { endTime = endTime + "999" } - tx = tx.Where("create_time <= ?", endTime) + tx = tx.Where("time <= ?", date.ParseDateToStr(endTime, date.YYYY_MM_DDTHH_MM_SSZ)) } // 查询结果 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) +}