From 27b5403339bf6a3b1536178b99c94c4d6a8eff69 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Jul 2025 14:52:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=91=8A=E8=AD=A6=E5=88=86=E7=BB=84?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=95=B0=E9=87=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network_data/controller/all_alarm.go | 54 ++++++++++++- src/modules/network_data/network_data.go | 12 +++ src/modules/network_data/repository/alarm.go | 18 +++++ src/modules/network_data/service/alarm.go | 76 +++++++++++++++++-- 4 files changed, 153 insertions(+), 7 deletions(-) diff --git a/src/modules/network_data/controller/all_alarm.go b/src/modules/network_data/controller/all_alarm.go index b9e41d99..631028ed 100644 --- a/src/modules/network_data/controller/all_alarm.go +++ b/src/modules/network_data/controller/all_alarm.go @@ -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 diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index 2df1faab..3985cece 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -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, + ) } // 告警日志数据信息 diff --git a/src/modules/network_data/repository/alarm.go b/src/modules/network_data/repository/alarm.go index 9cbbea1c..745662b7 100644 --- a/src/modules/network_data/repository/alarm.go +++ b/src/modules/network_data/repository/alarm.go @@ -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 +} diff --git a/src/modules/network_data/service/alarm.go b/src/modules/network_data/service/alarm.go index 737acb0b..f68958c5 100644 --- a/src/modules/network_data/service/alarm.go +++ b/src/modules/network_data/service/alarm.go @@ -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 文件