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.
This commit is contained in:
TsMask
2025-10-27 15:15:27 +08:00
parent 667d0fdad8
commit e7ae390f6e
18 changed files with 428 additions and 343 deletions

View File

@@ -3,8 +3,9 @@ package controller
import (
"fmt"
"strings"
"sync"
"be.ems/src/framework/constants"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/i18n"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
@@ -21,6 +22,7 @@ var NewNeInfo = &NeInfoController{
neInfoService: neService.NewNeInfo,
neLicenseService: neService.NewNeLicense,
neVersionService: neService.NewNeVersion,
neStateService: neService.NewNEState,
}
// 网元信息请求
@@ -30,12 +32,9 @@ type NeInfoController struct {
neInfoService *neService.NeInfo // 网元信息服务
neLicenseService *neService.NeLicense // 网元授权激活信息服务
neVersionService *neService.NeVersion // 网元版本信息服务
neStateService *neService.NEState // 网元状态服务
}
// neStateCacheMap 网元状态缓存最后一次成功的信息
var neStateCacheMap sync.Map
var mutex sync.Mutex
// 网元信息状态
//
// GET /state
@@ -67,37 +66,18 @@ func (s NeInfoController) State(c *gin.Context) {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
neKey := fmt.Sprintf("%s_%s", neInfo.NeType, neInfo.NeId)
state := s.neStateService.Last(neInfo.NeType, neInfo.NeId)
result := s.neStateService.ParseState(neInfo, state)
// 网元直连
resData, err := neFetchlink.NeState(neInfo)
if err != nil {
mutex.Lock()
// 异常取上次缓存
resDataCache, ok := neStateCacheMap.Load(neKey)
if ok && resDataCache != nil {
resDataCache.(map[string]any)["online"] = false
} else {
resDataCache = map[string]any{
"online": false,
"neId": neInfo.NeId,
"neName": neInfo.NeName,
"neType": neInfo.NeType,
"neIP": neInfo.IP,
}
}
neStateCacheMap.Store(neKey, resDataCache)
mutex.Unlock()
c.JSON(200, resp.OkData(resDataCache))
return
// 没状态标记,视为离线
key := fmt.Sprintf("%s:%s:%s_status", constants.CACHE_NE_INFO, neInfo.NeType, neInfo.NeId)
keyNum, err := redis.Has("", key)
if keyNum == 0 || err != nil {
result["online"] = false
} else {
result["online"] = true
}
// 存入缓存
resData["online"] = true
mutex.Lock()
neStateCacheMap.Store(neKey, resData)
mutex.Unlock()
c.JSON(200, resp.OkData(resData))
c.JSON(200, resp.OkData(result))
}
// 网元neType和neID查询
@@ -362,22 +342,6 @@ func (s NeInfoController) Add(c *gin.Context) {
return
}
// 获取网元状态是否正常
body.ServerState, err = neFetchlink.NeState(body)
if err != nil {
body.Status = 0
} else {
// 网元状态设置为在线
body.Status = 1
if parse.Boolean(body.ServerState["standby"]) {
body.Status = 3
}
// 下发网管配置信息给网元
if _, err = neFetchlink.NeConfigOMC(body); err != nil {
body.Status = 2
}
}
loginUserName := reqctx.LoginUserToUserName(c)
// 新增Version信息
neVersion := model.NeVersion{
@@ -392,24 +356,34 @@ func (s NeInfoController) Add(c *gin.Context) {
CreateBy: loginUserName,
}
// 已有网元可获取的信息
if body.ServerState != nil {
if v, ok := body.ServerState["version"]; ok && v != nil {
body.NeVersion = fmt.Sprint(v)
neVersion.Version = fmt.Sprint(v)
// 获取网元状态是否正常
key := fmt.Sprintf("%s:%s:%s_status", constants.CACHE_NE_INFO, body.NeType, body.NeId)
state, err := neFetchlink.NeState(body)
if err != nil {
redis.Del("", key)
body.Status = 0
} else {
redis.Set("", key, body.RmUID, 0)
// 网元状态设置为在线
body.Status = 1
if parse.Boolean(state["standby"]) {
body.Status = 3
}
if v, ok := body.ServerState["sn"]; ok && v != nil {
neLicense.SerialNum = fmt.Sprint(v)
// 下发网管配置信息给网元
if _, err = neFetchlink.NeConfigOMC(body); err != nil {
body.Status = 2
}
if v, ok := body.ServerState["expire"]; ok && v != nil {
neLicense.ExpiryDate = fmt.Sprint(v)
// 网元状态记录
neState := s.neStateService.SaveState(state)
body.ServerState = s.neStateService.ParseState(body, neState)
if neState.ID > 0 {
body.NeVersion = neState.NeVersion
neVersion.Version = neState.NeVersion
neLicense.SerialNum = neState.SerialNum
neLicense.ExpiryDate = neState.ExpiryDate
neLicense.Status = "1"
}
if v, ok := body.ServerState["ueNumber"]; ok && v != nil {
neLicense.UeNumber = parse.Number(v)
}
if v, ok := body.ServerState["nbNumber"]; ok && v != nil {
neLicense.NbNumber = parse.Number(v)
neLicense.UeNumber = neState.UENumber
neLicense.NbNumber = neState.NbNumber
}
}
@@ -475,62 +449,41 @@ func (s NeInfoController) Edit(c *gin.Context) {
}
}
loginUserName := reqctx.LoginUserToUserName(c)
neLicense := s.neLicenseService.FindByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
neVersion := s.neVersionService.FindByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
// 获取网元状态是否正常
body.ServerState, err = neFetchlink.NeState(neInfo)
key := fmt.Sprintf("%s:%s:%s_status", constants.CACHE_NE_INFO, body.NeType, body.NeId)
state, err := neFetchlink.NeState(body)
if err != nil {
redis.Del("", key)
body.Status = 0
} else {
redis.Set("", key, body.RmUID, 0)
// 网元状态设置为在线
body.Status = 1
if parse.Boolean(body.ServerState["standby"]) {
if parse.Boolean(state["standby"]) {
body.Status = 3
}
// 下发网管配置信息给网元
if _, err = neFetchlink.NeConfigOMC(body); err != nil {
body.Status = 2
}
}
loginUserName := reqctx.LoginUserToUserName(c)
neLicense := s.neLicenseService.FindByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
neVersion := s.neVersionService.FindByNeTypeAndNeID(neInfo.NeType, neInfo.NeId)
// 已有网元可获取的信息
if body.ServerState != nil {
if v, ok := body.ServerState["version"]; ok && v != nil {
body.NeVersion = fmt.Sprint(v)
neVersion.Version = fmt.Sprint(v)
neVersion.UpdateBy = loginUserName
}
if v, ok := body.ServerState["sn"]; ok && v != nil {
neLicense.SerialNum = fmt.Sprint(v)
}
if v, ok := body.ServerState["expire"]; ok && v != nil {
neLicense.ExpiryDate = fmt.Sprint(v)
// 网元状态记录
neState := s.neStateService.SaveState(state)
body.ServerState = s.neStateService.ParseState(body, neState)
if neState.ID > 0 {
body.NeVersion = neState.NeVersion
neVersion.Version = neState.NeVersion
s.neVersionService.Update(neVersion)
neLicense.SerialNum = neState.SerialNum
neLicense.ExpiryDate = neState.ExpiryDate
neLicense.Status = "1"
neLicense.UpdateBy = loginUserName
neLicense.UeNumber = neState.UENumber
neLicense.NbNumber = neState.NbNumber
s.neLicenseService.Update(neLicense)
}
if v, ok := body.ServerState["ueNumber"]; ok && v != nil {
neLicense.UeNumber = parse.Number(v)
}
if v, ok := body.ServerState["nbNumber"]; ok && v != nil {
neLicense.NbNumber = parse.Number(v)
}
}
if neVersion.ID <= 0 {
if neVersion.NeType != body.NeType || neVersion.NeId != body.NeId {
neVersion.NeType = body.NeType
neVersion.NeId = body.NeId
}
s.neVersionService.Update(neVersion)
}
if neLicense.ID <= 0 {
if neLicense.NeType != body.NeType || neLicense.NeId != body.NeId {
neLicense.NeType = body.NeType
neLicense.NeId = body.NeId
}
s.neLicenseService.Update(neLicense)
}
body.UpdateBy = loginUserName