feat: 告警分组统计数量接口
This commit is contained in:
@@ -43,7 +43,7 @@ type AlarmController struct {
|
|||||||
// @Param pvFlag query string false "PV Flag" Enums(PNF,VNF)
|
// @Param pvFlag query string false "PV Flag" Enums(PNF,VNF)
|
||||||
// @Param alarmCode query string false "alarm status code"
|
// @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 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 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 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 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))
|
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
|
// GET /export
|
||||||
|
|||||||
@@ -59,6 +59,18 @@ func Setup(router *gin.Engine) {
|
|||||||
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.alarm", collectlogs.BUSINESS_TYPE_EXPORT)),
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.alarm", collectlogs.BUSINESS_TYPE_EXPORT)),
|
||||||
controller.NewAlarm.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,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 告警日志数据信息
|
// 告警日志数据信息
|
||||||
|
|||||||
@@ -192,3 +192,21 @@ func (r Alarm) SelectAlarmSeqLast(neType, neId string) int64 {
|
|||||||
}
|
}
|
||||||
return alarmSeq
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/tsmask/go-oam"
|
"github.com/tsmask/go-oam"
|
||||||
|
"github.com/tsmask/go-oam/src/framework/utils/parse"
|
||||||
|
|
||||||
"be.ems/src/framework/constants"
|
"be.ems/src/framework/constants"
|
||||||
"be.ems/src/framework/i18n"
|
"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")
|
return 0, fmt.Errorf("ack fail")
|
||||||
}
|
}
|
||||||
|
|
||||||
// InsertAndForword 新增信息并转发通知
|
// CountType 告警类别数量
|
||||||
func (s Alarm) InsertAndForword(param model.Alarm) int64 {
|
func (s Alarm) CountType(alarmStatus string) []map[string]any {
|
||||||
rows := s.alarmRepository.Insert(param)
|
data := []map[string]any{}
|
||||||
if rows > 0 {
|
alarmTypeArr := []string{
|
||||||
// 转发通知 TODO
|
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 文件
|
// ExportXlsx 导出数据到 xlsx 文件
|
||||||
|
|||||||
Reference in New Issue
Block a user