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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user