294 lines
7.3 KiB
Go
294 lines
7.3 KiB
Go
package controller
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
"sync"
|
||
|
||
"be.ems/src/framework/i18n"
|
||
"be.ems/src/framework/utils/ctx"
|
||
"be.ems/src/framework/utils/parse"
|
||
"be.ems/src/framework/vo/result"
|
||
"be.ems/src/modules/network_element/model"
|
||
neService "be.ems/src/modules/network_element/service"
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/gin-gonic/gin/binding"
|
||
)
|
||
|
||
// 实例化控制层 NeInfoController 结构体
|
||
var NewNeInfo = &NeInfoController{
|
||
neInfoService: neService.NewNeInfoImpl,
|
||
}
|
||
|
||
// 网元信息请求
|
||
//
|
||
// PATH /
|
||
type NeInfoController struct {
|
||
// 网元信息服务
|
||
neInfoService neService.INeInfo
|
||
}
|
||
|
||
// neStateCacheMap 网元状态缓存最后一次成功的信息
|
||
var neStateCacheMap sync.Map
|
||
var mutex sync.Mutex
|
||
|
||
// 网元信息状态
|
||
//
|
||
// GET /state
|
||
func (s *NeInfoController) State(c *gin.Context) {
|
||
language := ctx.AcceptLanguage(c)
|
||
var querys struct {
|
||
NeType string `form:"neType" binding:"required"`
|
||
NeID string `form:"neId" binding:"required"`
|
||
}
|
||
if err := c.ShouldBindQuery(&querys); err != nil {
|
||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||
return
|
||
}
|
||
|
||
neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID)
|
||
if neInfo.NeId != querys.NeID || neInfo.IP == "" {
|
||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||
return
|
||
}
|
||
neKey := fmt.Sprintf("%s_%s", neInfo.NeType, neInfo.NeId)
|
||
|
||
// 网元直连
|
||
resData, err := neService.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, result.OkData(resDataCache))
|
||
return
|
||
}
|
||
|
||
// 存入缓存
|
||
resData["online"] = true
|
||
mutex.Lock()
|
||
neStateCacheMap.Store(neKey, resData)
|
||
mutex.Unlock()
|
||
c.JSON(200, result.OkData(resData))
|
||
}
|
||
|
||
// 网元信息列表
|
||
//
|
||
// GET /list
|
||
func (s *NeInfoController) List(c *gin.Context) {
|
||
querys := ctx.QueryMap(c)
|
||
bandStatus := false
|
||
if v, ok := querys["bandStatus"]; ok && v != nil {
|
||
bandStatus = parse.Boolean(v)
|
||
}
|
||
data := s.neInfoService.SelectPage(querys, bandStatus)
|
||
c.JSON(200, result.Ok(data))
|
||
}
|
||
|
||
// 网元信息列表全部无分页
|
||
//
|
||
// GET /listAll
|
||
func (s *NeInfoController) ListAll(c *gin.Context) {
|
||
language := ctx.AcceptLanguage(c)
|
||
var querys struct {
|
||
NeType string `form:"neType"`
|
||
NeId string `form:"neId"`
|
||
BandStatus string `form:"bandStatus"`
|
||
}
|
||
if err := c.ShouldBindQuery(&querys); err != nil {
|
||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||
return
|
||
}
|
||
|
||
// 查询实体参数
|
||
ne := model.NeInfo{}
|
||
if querys.NeType != "" {
|
||
ne.NeType = querys.NeType
|
||
}
|
||
if querys.NeId != "" {
|
||
ne.NeId = querys.NeId
|
||
}
|
||
bandStatus := parse.Boolean(querys.BandStatus)
|
||
neList := s.neInfoService.SelectList(ne, bandStatus)
|
||
if len(neList) == 0 {
|
||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||
return
|
||
}
|
||
c.JSON(200, result.OkData(neList))
|
||
}
|
||
|
||
// 网元信息
|
||
//
|
||
// GET /:infoId
|
||
func (s *NeInfoController) Info(c *gin.Context) {
|
||
language := ctx.AcceptLanguage(c)
|
||
infoId := c.Param("infoId")
|
||
if infoId == "" {
|
||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||
return
|
||
}
|
||
|
||
neHost := s.neInfoService.SelectById(infoId, true)
|
||
if neHost.ID != infoId {
|
||
// 没有可访问网元信息数据!
|
||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "neInfo.noData")))
|
||
return
|
||
}
|
||
|
||
c.JSON(200, result.OkData(neHost))
|
||
}
|
||
|
||
// 网元neType和neID查询
|
||
//
|
||
// GET /
|
||
func (s *NeInfoController) NeTypeAndID(c *gin.Context) {
|
||
language := ctx.AcceptLanguage(c)
|
||
var querys struct {
|
||
NeType string `form:"neType" binding:"required"`
|
||
NeID string `form:"neId" binding:"required"`
|
||
}
|
||
if err := c.ShouldBindQuery(&querys); err != nil {
|
||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||
return
|
||
}
|
||
|
||
neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID)
|
||
if neInfo.NeId != querys.NeID || neInfo.IP == "" {
|
||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||
return
|
||
}
|
||
c.JSON(200, result.OkData(neInfo))
|
||
}
|
||
|
||
// 网元信息新增
|
||
//
|
||
// POST /
|
||
func (s *NeInfoController) Add(c *gin.Context) {
|
||
language := ctx.AcceptLanguage(c)
|
||
var body model.NeInfo
|
||
err := c.ShouldBindBodyWith(&body, binding.JSON)
|
||
if err != nil || body.ID != "" {
|
||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||
return
|
||
}
|
||
|
||
// 检查属性值唯一
|
||
uniqueInfo := s.neInfoService.CheckUniqueNeTypeAndNeId(body.NeType, body.NeId, "")
|
||
if !uniqueInfo {
|
||
// 网元信息操作【%s】失败,同类型下标识已存在
|
||
msg := i18n.TTemplate(language, "neInfo.errKeyExists", map[string]any{"key": body.NeId})
|
||
c.JSON(200, result.ErrMsg(msg))
|
||
return
|
||
}
|
||
|
||
// 获取网元状态是否正常
|
||
_, err = neService.NeState(body)
|
||
if err != nil {
|
||
body.Status = "1"
|
||
} else {
|
||
// 下发网管配置信息给网元
|
||
_, err = neService.NeConfigOMC(body)
|
||
if err == nil {
|
||
body.Status = "0"
|
||
} else {
|
||
body.Status = "3"
|
||
}
|
||
}
|
||
|
||
insertId := s.neInfoService.Insert(body)
|
||
if insertId != "" {
|
||
c.JSON(200, result.Ok(nil))
|
||
return
|
||
}
|
||
c.JSON(200, result.Err(nil))
|
||
}
|
||
|
||
// 网元信息修改
|
||
//
|
||
// PUT /
|
||
func (s *NeInfoController) Edit(c *gin.Context) {
|
||
language := ctx.AcceptLanguage(c)
|
||
var body model.NeInfo
|
||
err := c.ShouldBindBodyWith(&body, binding.JSON)
|
||
if err != nil || body.ID == "" {
|
||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||
return
|
||
}
|
||
|
||
// 检查属性值唯一
|
||
uniqueHostCmd := s.neInfoService.CheckUniqueNeTypeAndNeId(body.NeType, body.NeId, body.ID)
|
||
if !uniqueHostCmd {
|
||
// 网元信息操作【%s】失败,同类型下标识已存在
|
||
msg := i18n.TTemplate(language, "neInfo.errKeyExists", map[string]any{"key": body.NeId})
|
||
c.JSON(200, result.ErrMsg(msg))
|
||
return
|
||
}
|
||
|
||
// 检查是否存在
|
||
neInfo := s.neInfoService.SelectById(body.ID, false)
|
||
if neInfo.ID != body.ID {
|
||
// 没有可访问网元信息数据!
|
||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "neInfo.noData")))
|
||
return
|
||
}
|
||
|
||
// 获取网元状态是否正常
|
||
_, err = neService.NeState(body)
|
||
if err != nil {
|
||
body.Status = "1"
|
||
} else {
|
||
// 下发网管配置信息给网元
|
||
_, err = neService.NeConfigOMC(body)
|
||
if err == nil {
|
||
body.Status = "0"
|
||
} else {
|
||
body.Status = "3"
|
||
}
|
||
}
|
||
|
||
rows := s.neInfoService.Update(body)
|
||
if rows > 0 {
|
||
c.JSON(200, result.Ok(nil))
|
||
return
|
||
}
|
||
c.JSON(200, result.Err(nil))
|
||
}
|
||
|
||
// 网元信息删除
|
||
//
|
||
// DELETE /:infoIds
|
||
func (s *NeInfoController) Remove(c *gin.Context) {
|
||
language := ctx.AcceptLanguage(c)
|
||
infoIds := c.Param("infoIds")
|
||
if infoIds == "" {
|
||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||
return
|
||
}
|
||
// 处理字符转id数组后去重
|
||
ids := strings.Split(infoIds, ",")
|
||
uniqueIDs := parse.RemoveDuplicates(ids)
|
||
if len(uniqueIDs) <= 0 {
|
||
c.JSON(200, result.Err(nil))
|
||
return
|
||
}
|
||
rows, err := s.neInfoService.DeleteByIds(uniqueIDs)
|
||
if err != nil {
|
||
c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error())))
|
||
return
|
||
}
|
||
msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows})
|
||
c.JSON(200, result.OkMsg(msg))
|
||
}
|