feat: 告警分组统计数量接口

This commit is contained in:
TsMask
2025-07-16 14:52:52 +08:00
parent a667691fff
commit 27b5403339
4 changed files with 153 additions and 7 deletions

View File

@@ -43,7 +43,7 @@ type AlarmController struct {
// @Param pvFlag query string false "PV Flag" Enums(PNF,VNF)
// @Param alarmCode query string false "alarm status code"
// @Param alarmType query string false "Alarm type Communication alarms=1, Equipment alarms=2, Processing faults=3, Environmental alarms=4, Quality of service alarms=5" Enums(1,2,3,4,5)
// @Param alarmStatus query string false "Alarm status 0:clear, 1:active" Enums(0,1)
// @Param alarmStatus query string false "Alarm status Clear 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)
@@ -139,6 +139,58 @@ func (s AlarmController) Ack(c *gin.Context) {
c.JSON(200, resp.OkData(rows))
}
// 告警级别数量
//
// GET /count/severity
func (s AlarmController) CountSeverity(c *gin.Context) {
var query struct {
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
data := s.alarmService.CountSeverity(query.AlarmStatus)
c.JSON(200, resp.OkData(data))
}
// 告警类别数量
//
// GET /count/type
func (s AlarmController) CountType(c *gin.Context) {
var query struct {
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
data := s.alarmService.CountType(query.AlarmStatus)
c.JSON(200, resp.OkData(data))
}
// 告警状态前几排名
//
// GET /count/ne
func (s AlarmController) CountNe(c *gin.Context) {
var query struct {
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态
Top int `json:"top" form:"top" binding:"required"` // 前几
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
data := s.alarmService.CountNe(query.AlarmStatus, query.Top)
c.JSON(200, resp.OkData(data))
}
// 告警列表导出
//
// GET /export

View File

@@ -59,6 +59,18 @@ func Setup(router *gin.Engine) {
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.alarm", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewAlarm.Export,
)
alarmGroup.GET("/count/type",
middleware.AuthorizeUser(nil),
controller.NewAlarm.CountType,
)
alarmGroup.GET("/count/severity",
middleware.AuthorizeUser(nil),
controller.NewAlarm.CountSeverity,
)
alarmGroup.GET("/count/ne",
middleware.AuthorizeUser(nil),
controller.NewAlarm.CountNe,
)
}
// 告警日志数据信息

View File

@@ -192,3 +192,21 @@ func (r Alarm) SelectAlarmSeqLast(neType, neId string) int64 {
}
return alarmSeq
}
// GroupTotal 分组统计
func (r Alarm) GroupTotal(alarmStatus string, group string, limit int) []map[string]any {
tx := db.DB("").Model(&model.Alarm{})
tx = tx.Select("count(*) as total", group)
tx = tx.Where("alarm_status=?", alarmStatus)
tx = tx.Group(group).Order("total DESC")
// 查询数据
var rows []map[string]any = make([]map[string]any, 0)
if limit > 0 {
tx = tx.Limit(limit)
}
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows
}
return rows
}

View File

@@ -6,6 +6,7 @@ import (
"time"
"github.com/tsmask/go-oam"
"github.com/tsmask/go-oam/src/framework/utils/parse"
"be.ems/src/framework/constants"
"be.ems/src/framework/i18n"
@@ -115,13 +116,76 @@ func (r Alarm) AckByIds(ids []int64, ackUser, ackState string) (int64, error) {
return 0, fmt.Errorf("ack fail")
}
// InsertAndForword 新增信息并转发通知
func (s Alarm) InsertAndForword(param model.Alarm) int64 {
rows := s.alarmRepository.Insert(param)
if rows > 0 {
// 转发通知 TODO
// CountType 告警类别数量
func (s Alarm) CountType(alarmStatus string) []map[string]any {
data := []map[string]any{}
alarmTypeArr := []string{
oam.ALARM_TYPE_COMMUNICATION_ALARM,
oam.ALARM_TYPE_EQUIPMENT_ALARM,
oam.ALARM_TYPE_PROCESSING_FAILURE,
oam.ALARM_TYPE_ENVIRONMENTAL_ALARM,
oam.ALARM_TYPE_QUALITY_OF_SERVICE_ALARM,
}
return rows
for _, v := range alarmTypeArr {
data = append(data, map[string]any{
"alarmType": v,
"total": 0,
})
}
// 告警类别数量
rows := s.alarmRepository.GroupTotal(alarmStatus, "alarm_type", -1)
for _, item := range data {
for _, v := range rows {
str := fmt.Sprint(v["alarm_type"])
if str == item["alarmType"] {
item["alarmType"] = str
item["total"] = parse.Number(v["total"])
}
}
}
return data
}
// CountSeverity 告警级别数量
func (s Alarm) CountSeverity(alarmStatus string) []map[string]any {
data := []map[string]any{}
alarmTypeArr := []string{
oam.ALARM_SEVERITY_CRITICAL,
oam.ALARM_SEVERITY_MAJOR,
oam.ALARM_SEVERITY_MINOR,
oam.ALARM_SEVERITY_WARNING,
}
for _, v := range alarmTypeArr {
data = append(data, map[string]any{
"severity": v,
"total": 0,
})
}
// 数量
rows := s.alarmRepository.GroupTotal(alarmStatus, "perceived_severity", -1)
for _, item := range data {
for _, v := range rows {
str := fmt.Sprint(v["perceived_severity"])
if str == item["severity"] {
item["severity"] = str
item["total"] = parse.Number(v["total"])
}
}
}
return data
}
// CountNe 告警状态前几排名
func (s Alarm) CountNe(alarmStatus string, top int) []map[string]any {
data := s.alarmRepository.GroupTotal(alarmStatus, "ne_type", top)
for _, v := range data {
v["neType"] = fmt.Sprint(v["ne_type"])
v["total"] = parse.Number(v["total"])
delete(v, "ne_type")
}
return data
}
// ExportXlsx 导出数据到 xlsx 文件