feat: 添加告警类型字段并新增告警相关接口

This commit is contained in:
TsMask
2025-02-28 15:58:43 +08:00
parent 53a3e73946
commit f92e9a1704
14 changed files with 157 additions and 166 deletions

View File

@@ -15,6 +15,7 @@ CREATE TABLE `alarm_forward_log` (
`alarm_code` int DEFAULT '0' COMMENT '告警状态码',
`alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题',
`alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '告警状态 0:clear, 1:active',
`alarm_type` varchar(10) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5',
`orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)',
`event_time` bigint DEFAULT '0' COMMENT '事件产生时间 秒级',
`created_at` bigint DEFAULT '0' COMMENT '创建时间',

View File

@@ -13,6 +13,7 @@ CREATE TABLE `alarm_log` (
`alarm_code` int DEFAULT '0' COMMENT '告警状态码',
`alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题',
`alarm_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '告警状态 0:clear, 1:active',
`alarm_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5',
`orig_severity` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)',
`event_time` bigint DEFAULT '0' COMMENT '事件产生时间 秒级',
`created_at` bigint DEFAULT '0' COMMENT '创建时间',

View File

@@ -365,6 +365,7 @@ func alarmSaveLog(neInfo neModel.NeInfo, v Alarm) int64 {
AlarmTitle: v.AlarmTitle,
AlarmCode: int64(v.AlarmCode),
AlarmStatus: fmt.Sprint(v.AlarmStatus),
AlarmType: alarmTypeValue(v.AlarmType),
OrigSeverity: origSeverityValue(v.OrigSeverity),
EventTime: eventTime.UnixMilli(),
}

View File

@@ -185,6 +185,7 @@ func writeLog(alarmData *Alarm, toUser, forwardBy string, err error) error {
AlarmTitle: alarmData.AlarmTitle,
AlarmCode: int64(alarmData.AlarmCode),
AlarmStatus: fmt.Sprint(alarmData.AlarmStatus),
AlarmType: alarmTypeValue(alarmData.AlarmType),
OrigSeverity: origSeverityValue(alarmData.OrigSeverity),
EventTime: eventTime.UnixMilli(),
Type: forwardBy,

View File

@@ -30,11 +30,15 @@ func CodeMsg(code int, msg string) Resp {
}
// Ok 响应成功结果
func Ok(v map[string]any) Resp {
if v == nil {
return Resp{Code: CODE_SUCCESS, Msg: MSG_SUCCCESS}
func Ok(v map[string]any) map[string]any {
args := make(map[string]any)
args["code"] = CODE_SUCCESS
args["msg"] = MSG_SUCCCESS
// v合并到args
for key, value := range v {
args[key] = value
}
return Resp{Code: CODE_SUCCESS, Msg: MSG_SUCCCESS, Data: v}
return args
}
// OkMsg 响应成功结果信息
@@ -48,11 +52,15 @@ func OkData(data any) Resp {
}
// Err 响应失败结果 map[string]any{}
func Err(v map[string]any) Resp {
if v == nil {
return Resp{Code: CODE_ERROR, Msg: MSG_ERROR}
func Err(v map[string]any) map[string]any {
args := make(map[string]any)
args["code"] = CODE_SUCCESS
args["msg"] = MSG_SUCCCESS
// v合并到args
for key, value := range v {
args[key] = value
}
return Resp{Code: CODE_ERROR, Msg: MSG_ERROR, Data: v}
return args
}
// ErrMsg 响应失败结果信息

View File

@@ -0,0 +1,52 @@
package controller
import (
"fmt"
"be.ems/src/framework/resp"
"be.ems/src/modules/network_data/model"
neDataService "be.ems/src/modules/network_data/service"
"github.com/gin-gonic/gin"
)
// 实例化控制层 AlarmForwardController 结构体
var NewAlarmForward = &AlarmForwardController{
alarmForwardLogService: neDataService.NewAlarmForwardLog,
}
// 告警数据
//
// PATH /alarm/forward
type AlarmForwardController struct {
alarmForwardLogService *neDataService.AlarmForwardLog // 告警转发记录服务
}
// 告警转发日志列表
//
// GET /log/list
//
// @Tags network_data/alarm_forward
// @Accept json
// @Produce json
// @Param neType query string false "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) Enums(1,2,3,4)
// @Param sortField query string false "Sort fields, fill in result fields" default(event_time)
// @Param sortOrder query string false "Sort by ascending or descending order, asc desc" default(asc)
// @Param pageNum query number true "pageNum" default(1)
// @Param pageSize query number true "pageSize" default(10)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Alarm Forward Log List
// @Description Alarm Forward Log List
// @Router /neData/alarm/forward/log/list [get]
func (s AlarmForwardController) List(c *gin.Context) {
var query model.AlarmForwardLogQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
return
}
// 查询数据
rows, total := s.alarmForwardLogService.FindByPage(query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}

View File

@@ -3,29 +3,25 @@ package controller
import (
"fmt"
"be.ems/src/framework/i18n"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
"be.ems/src/framework/utils/parse"
"be.ems/src/modules/network_data/model"
neDataService "be.ems/src/modules/network_data/service"
neService "be.ems/src/modules/network_element/service"
"github.com/gin-gonic/gin"
)
// 实例化控制层 AlarmLogController 结构体
var NewAlarmLog = &AlarmLogController{
neInfoService: neService.NewNeInfo,
alarmLogService: neDataService.NewAlarmLog,
alarmEventService: neDataService.NewAlarmEvent,
}
// 告警数据
//
// PATH /alarm/log
type AlarmLogController struct {
neInfoService *neService.NeInfo // 网元信息服务
alarmLogService *neDataService.AlarmLog // 告警信息服务
alarmLogService *neDataService.AlarmLog // 告警日志信息服务
alarmEventService *neDataService.AlarmEvent // 告警事件信息服务
}
// 告警日志列表
@@ -37,12 +33,9 @@ type AlarmLogController struct {
// @Produce json
// @Param neType query string false "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC)
// @Param neId query string false "NE ID The actual record is the network element RmUid"
// @Param neName query string false "NE Name"
// @Param pvFlag query string false "PV Flag" Enums(PNF,VNF)
// @Param alarmLogCode query string false "AlarmLog status code"
// @Param alarmLogType query string false "AlarmLog type Communication AlarmLogs=1, Equipment AlarmLogs=2, Processing faults=3, Environmental AlarmLogs=4, Quality of service AlarmLogs=5" Enums(1,2,3,4,5)
// @Param alarmLogStatus query string false "AlarmLog status 0:clear, 1:active" Enums(0,1)
// @Param origSeverity query string false "AlarmLog Type 1: Critical, 2: Major, 3: Minor, 4: Warning" Enums(1,2,3,4)
// @Param alarmStatus query string false "Alarm status 0:clear, 1:active" Enums(0,1)
// @Param origSeverity query string false "Alarm Type 1: Critical, 2: Major, 3: Minor, 4: Warning" Enums(1,2,3,4)
// @Param sortField query string false "Sort fields, fill in result fields" default(event_time)
// @Param sortOrder query string false "Sort by ascending or descending order, asc desc" default(asc)
// @Param pageNum query number true "pageNum" default(1)
@@ -52,7 +45,7 @@ type AlarmLogController struct {
// @Summary AlarmLog List
// @Description AlarmLog List
// @Router /neData/alarm/log/list [get]
func (s *AlarmLogController) List(c *gin.Context) {
func (s AlarmLogController) List(c *gin.Context) {
var query model.AlarmLogQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -64,30 +57,35 @@ func (s *AlarmLogController) List(c *gin.Context) {
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}
// 告警删除
// 告警事件日志列表
//
// DELETE /:id
func (s AlarmLogController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
id := c.Param("id")
if id == "" {
c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty"))
// GET /event
//
// @Tags network_data/alarm_log
// @Accept json
// @Produce json
// @Param neType query string false "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC)
// @Param neId query string false "NE ID The actual record is the network element RmUid"
// @Param alarmLogType query string false "AlarmLog type Communication AlarmLogs=1, Equipment AlarmLogs=2, Processing faults=3, Environmental AlarmLogs=4, Quality of service AlarmLogs=5" Enums(1,2,3,4,5)
// @Param alarmStatus query string false "Alarm status 0:clear, 1:active" Enums(0,1)
// @Param origSeverity query string false "Alarm Type 1: Critical, 2: Major, 3: Minor, 4: Warning" Enums(1,2,3,4)
// @Param sortField query string false "Sort fields, fill in result fields" default(event_time)
// @Param sortOrder query string false "Sort by ascending or descending order, asc desc" default(asc)
// @Param pageNum query number true "pageNum" default(1)
// @Param pageSize query number true "pageSize" default(10)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Alarm Event Log List
// @Description Alarm Event Log List
// @Router /neData/alarm/log/event [get]
func (s AlarmLogController) Event(c *gin.Context) {
var query model.AlarmEventQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(40422, errMsgs))
return
}
// 处理字符转id数组后去重
uniqueIDs := parse.RemoveDuplicatesToArray(id, ",")
// 转换成int64数组类型
ids := make([]int64, 0)
for _, v := range uniqueIDs {
ids = append(ids, parse.Number(v))
}
rows, err := s.alarmLogService.DeleteByIds(ids)
if err != nil {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error())))
return
}
msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows})
c.JSON(200, resp.OkMsg(msg))
// 查询数据
rows, total := s.alarmEventService.FindByPage(query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}

View File

@@ -10,6 +10,7 @@ type AlarmForwardLog struct {
AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码
AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题
AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 0:clear, 1:active
AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5
OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)
EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 秒级
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间
@@ -27,8 +28,6 @@ func (*AlarmForwardLog) TableName() string {
type AlarmForwardLogQuery struct {
NeType string `json:"neType" form:"neType"` // 网元类型
NeID string `json:"neId" form:"neId"` // 网元ID
NeName string `json:"neName" form:"neName"`
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=0 1"` // 告警状态 0:clear, 1:active
BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time
EndTime int64 `json:"endTime" form:"endTime"`
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段

View File

@@ -10,6 +10,7 @@ type AlarmLog struct {
AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码
AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题
AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 0:clear, 1:active
AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5
OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)
EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 秒级
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间
@@ -24,8 +25,8 @@ func (*AlarmLog) TableName() string {
type AlarmLogQuery struct {
NeType string `json:"neType" form:"neType"` // 网元类型
NeID string `json:"neId" form:"neId"` // 网元ID
NeName string `json:"neName" form:"neName"`
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=0 1"` // 告警状态 0:clear, 1:active
OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF)
BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time
EndTime int64 `json:"endTime" form:"endTime"`
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段

View File

@@ -50,6 +50,29 @@ func Setup(router *gin.Engine) {
)
}
// 告警日志数据信息
alarmLogGroup := neDataGroup.Group("/alarm/log")
{
alarmLogGroup.GET("/list",
middleware.PreAuthorize(nil),
controller.NewAlarmLog.List,
)
alarmLogGroup.GET("/event",
middleware.PreAuthorize(nil),
controller.NewAlarmLog.Event,
)
}
// 告警转发数据信息
alarmForwardGroup := neDataGroup.Group("/alarm/forward")
{
alarmForwardGroup.GET("/log/list",
middleware.PreAuthorize(nil),
controller.NewAlarmForward.List,
)
}
// 基站状态历史记录信息 含AMF/MME
nbStateGroup := neDataGroup.Group("/nb-state")
{

View File

@@ -11,7 +11,7 @@ import (
// 实例化数据层 AlarmForwardLog 结构体
var NewAlarmForwardLog = &AlarmForwardLog{}
// AlarmForwardLog 基站状态记录表 数据层处理
// AlarmForwardLog 告警转发记录表 数据层处理
type AlarmForwardLog struct{}
// SelectByPage 分页查询集合
@@ -25,10 +25,10 @@ func (r AlarmForwardLog) SelectByPage(query model.AlarmForwardLogQuery) ([]model
tx = tx.Where("ne_id = ?", query.NeID)
}
if query.BeginTime != 0 {
tx = tx.Where("create_time >= ?", query.BeginTime)
tx = tx.Where("created_at >= ?", query.BeginTime)
}
if query.EndTime != 0 {
tx = tx.Where("create_time <= ?", query.EndTime)
tx = tx.Where("created_at <= ?", query.EndTime)
}
// 查询结果

View File

@@ -25,10 +25,10 @@ func (r AlarmLog) SelectByPage(query model.AlarmLogQuery) ([]model.AlarmLog, int
tx = tx.Where("ne_id = ?", query.NeID)
}
if query.BeginTime != 0 {
tx = tx.Where("create_time >= ?", query.BeginTime)
tx = tx.Where("created_at >= ?", query.BeginTime)
}
if query.EndTime != 0 {
tx = tx.Where("create_time <= ?", query.EndTime)
tx = tx.Where("created_at <= ?", query.EndTime)
}
// 查询结果

View File

@@ -1,11 +1,6 @@
package service
import (
"fmt"
"strconv"
"be.ems/src/framework/i18n"
"be.ems/src/framework/utils/file"
"be.ems/src/modules/network_data/model"
"be.ems/src/modules/network_data/repository"
)
@@ -15,9 +10,9 @@ var NewAlarmForwardLog = &AlarmForwardLog{
alarmForwardLogRepository: repository.NewAlarmForwardLog,
}
// AlarmForwardLog 基站状态记录表 服务层处理
// AlarmForwardLog 告警转发记录表 服务层处理
type AlarmForwardLog struct {
alarmForwardLogRepository *repository.AlarmForwardLog // 基站状态记录信息
alarmForwardLogRepository *repository.AlarmForwardLog // 告警转发记录信息
}
// FindByPage 根据条件分页查询
@@ -29,45 +24,3 @@ func (r AlarmForwardLog) FindByPage(query model.AlarmForwardLogQuery) ([]model.A
func (r AlarmForwardLog) Insert(item model.AlarmForwardLog) int64 {
return r.alarmForwardLogRepository.Insert(item)
}
// DeleteByIds 批量删除信息
func (r AlarmForwardLog) DeleteByIds(ids []int64) (int64, error) {
// 检查是否存在
arr := r.alarmForwardLogRepository.SelectByIds(ids)
if len(arr) <= 0 {
return 0, fmt.Errorf("not data")
}
if len(arr) == len(ids) {
rows := r.alarmForwardLogRepository.DeleteByIds(ids)
return rows, nil
}
// 删除信息失败!
return 0, fmt.Errorf("delete fail")
}
// ExportXlsx 导出数据到 xlsx 文件
func (r AlarmForwardLog) ExportXlsx(rows []model.AlarmForwardLog, fileName, language string) (string, error) {
// 第一行表头标题
headerCells := map[string]string{
"A1": i18n.TKey(language, "AlarmForwardLog.export.id"),
"B1": i18n.TKey(language, "AlarmForwardLog.export.alarmCode"),
"C1": i18n.TKey(language, "AlarmForwardLog.export.alarmSeq"),
"D1": i18n.TKey(language, "AlarmForwardLog.export.eventTime"),
}
// 从第二行开始的数据
dataCells := make([]map[string]any, 0)
for i, row := range rows {
idx := strconv.Itoa(i + 2)
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,
"B" + idx: row.AlarmCode,
"C" + idx: row.AlarmSeq,
"D" + idx: row.EventTime,
})
}
// 导出数据表格
return file.WriteSheet(headerCells, dataCells, fileName, "Sheet1")
}

View File

@@ -1,11 +1,6 @@
package service
import (
"fmt"
"strconv"
"be.ems/src/framework/i18n"
"be.ems/src/framework/utils/file"
"be.ems/src/modules/network_data/model"
"be.ems/src/modules/network_data/repository"
)
@@ -29,45 +24,3 @@ func (r AlarmLog) FindByPage(query model.AlarmLogQuery) ([]model.AlarmLog, int64
func (r AlarmLog) Insert(item model.AlarmLog) int64 {
return r.alarmLogRepository.Insert(item)
}
// DeleteByIds 批量删除信息
func (r AlarmLog) DeleteByIds(ids []int64) (int64, error) {
// 检查是否存在
arr := r.alarmLogRepository.SelectByIds(ids)
if len(arr) <= 0 {
return 0, fmt.Errorf("not data")
}
if len(arr) == len(ids) {
rows := r.alarmLogRepository.DeleteByIds(ids)
return rows, nil
}
// 删除信息失败!
return 0, fmt.Errorf("delete fail")
}
// ExportXlsx 导出数据到 xlsx 文件
func (r AlarmLog) ExportXlsx(rows []model.AlarmLog, fileName, language string) (string, error) {
// 第一行表头标题
headerCells := map[string]string{
"A1": i18n.TKey(language, "alarmLog.export.id"),
"B1": i18n.TKey(language, "alarmLog.export.alarmCode"),
"C1": i18n.TKey(language, "alarmLog.export.alarmSeq"),
"D1": i18n.TKey(language, "alarmLog.export.eventTime"),
}
// 从第二行开始的数据
dataCells := make([]map[string]any, 0)
for i, row := range rows {
idx := strconv.Itoa(i + 2)
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,
"B" + idx: row.AlarmCode,
"C" + idx: row.AlarmSeq,
"D" + idx: row.EventTime,
})
}
// 导出数据表格
return file.WriteSheet(headerCells, dataCells, fileName, "Sheet1")
}