Files
be.ems/src/modules/network_element/service/ne_state.go
TsMask e7ae390f6e ref: 重构网元状态,提升加载网元列表带状态速度
Refactor network element state management

- Removed the NE state endpoint and related service logic from the network_data module.
- Introduced a new NEStateController to handle network element state records.
- Implemented NEState service and repository for managing state records in the database.
- Updated NEInfo and NeLicense controllers to utilize the new NEState service for fetching and saving state information.
- Enhanced state handling in the websocket processor to reflect the latest state of network elements.
- Added caching logic for network element states using Redis.
- Improved error handling and response formatting for state queries.
2025-10-27 15:15:27 +08:00

138 lines
3.9 KiB
Go

package service
import (
"fmt"
"sort"
"strconv"
"be.ems/src/modules/network_element/model"
"be.ems/src/modules/network_element/repository"
"github.com/tsmask/go-oam/framework/utils/parse"
)
// 实例化数据层 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(neType, neId string, ltTime int64) int64 {
return r.neStateRepository.DeleteByTime(neType, neId, ltTime)
}
// Last 查询最新状态
func (r NEState) Last(neType, neId string) model.NEState {
return r.neStateRepository.SelectByLast(neType, neId)
}
// ParseState 解析状态数据
func (r NEState) ParseState(neInfo model.NeInfo, state model.NEState) map[string]any {
if state.ID == 0 {
return map[string]any{}
}
return map[string]any{
"neId": neInfo.NeId,
"neName": neInfo.NeName,
"neType": neInfo.NeType,
"neIP": neInfo.IP,
"standby": state.Standby,
"version": state.NeVersion,
"sn": state.SerialNum,
"expire": state.ExpiryDate,
"refreshTime": state.RefreshTime,
"ueNumber": state.UENumber,
"nbNumber": state.NbNumber,
"hostname": state.HostName,
"os": state.OS,
"sysCpuUsage": state.SysCpuUsage,
"sysMemUsage": state.SysMemUsage,
"sysDiskUsage": state.SysDiskUsage,
"nfCpuUsage": state.NfCpuUsage,
"nfMemUsed": state.NfMemUsed,
}
}
// SaveState 网元直连返回的状态数据保存
func (r NEState) SaveState(state map[string]any) model.NEState {
// 网元CPU使用率
var nfCpuUsage float64 = 0
// CPU使用率
var sysCpuUsage float64 = 0
if state["cpu"] != nil {
cpu := state["cpu"].(map[string]any)
v := parse.Number(cpu["sysCpuUsage"])
sysCpuUsage = float64(v) / 100
nfv := parse.Number(cpu["nfCpuUsage"])
nfCpuUsage = float64(nfv) / 100
}
// 网元内存使用KB
var nfMemUsed int64 = 0
// 内存使用率
var sysMemUsage float64 = 0
if state["mem"] != nil {
mem := state["mem"].(map[string]any)
v := parse.Number(mem["sysMemUsage"])
sysMemUsage = float64(v) / 100
nfMemUsed = parse.Number(mem["nfUsedMem"])
}
// 磁盘使用率
var sysDiskUsage float64 = 0
if state["disk"] != nil {
mem := state["disk"].(map[string]any)
disks := mem["partitionInfo"].([]any)
sort.Slice(disks, func(i, j int) bool {
iUsed := parse.Number(disks[i].(map[string]any)["used"])
jUsed := parse.Number(disks[j].(map[string]any)["used"])
return iUsed > jUsed
})
disk := disks[0].(map[string]any)
total := parse.Number(disk["total"])
used := parse.Number(disk["used"])
sysDiskUsage = (float64(used) / float64(total)) * 100
sysDiskUsage, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", sysDiskUsage), 64)
}
// 插入网元状态记录
neState := model.NEState{
NeType: fmt.Sprint(state["neType"]),
NeId: fmt.Sprint(state["neId"]),
NeVersion: fmt.Sprint(state["version"]),
Standby: parse.Number(state["standby"]),
UENumber: parse.Number(state["ueNumber"]),
NbNumber: parse.Number(state["nbNumber"]),
SerialNum: fmt.Sprint(state["sn"]),
ExpiryDate: fmt.Sprint(state["expire"]),
HostName: fmt.Sprint(state["hostname"]),
OS: fmt.Sprint(state["os"]),
SysCpuUsage: sysCpuUsage,
SysMemUsage: sysMemUsage,
SysDiskUsage: sysDiskUsage,
NfCpuUsage: nfCpuUsage,
NfMemUsed: nfMemUsed,
RefreshTime: parse.Number(state["refreshTime"]),
}
insertId := r.neStateRepository.Insert(neState)
if insertId > 0 {
neState.ID = insertId
}
return neState
}