From 1f0e0cfce2dceb1e66b4ddbd73a811415faffa2d Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 25 Sep 2025 15:20:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/constants/alarm.go | 27 ++++--- src/framework/utils/expr/expr.go | 44 +++++++++++ .../network_element/fetch_link/alarm.go | 39 ++++++++++ .../network_element/service/ne_info.go | 78 +++++++++++++++++++ src/modules/system/service/sys_dict_data.go | 5 ++ 5 files changed, 182 insertions(+), 11 deletions(-) create mode 100644 src/framework/utils/expr/expr.go create mode 100644 src/modules/network_element/fetch_link/alarm.go diff --git a/src/framework/constants/alarm.go b/src/framework/constants/alarm.go index c3ce9dd2..db38dcaa 100644 --- a/src/framework/constants/alarm.go +++ b/src/framework/constants/alarm.go @@ -1,15 +1,20 @@ package constants -// 告警 alarmCode 常量 const ( - // ALARM_EVENT_REBOOT 事件-网元重启 - ALARM_EVENT_REBOOT = 9000 - // ALARM_STATE_CHECK 告警-状态检查 - ALARM_STATE_CHECK = 10000 - // ALARM_RAM_CPU_CHECK 告警-内存/CPU/磁盘检查 - ALARM_CMD_CHECK = 10001 - // ALARM_LICENSE_CHECK 告警-网元License到期检查 - ALARM_LICENSE_CHECK = 10002 - // ALARM_UDM_DB_SYNC 告警-UDM DB同步检查 - ALARM_UDM_DB_SYNC = 10003 + ALARM_EVENT_REBOOT = 9000 // 告警Code-事件-网元重启 + ALARM_STATE_CHECK = 10000 // 告警Code-状态检查 + ALARM_CMD_CHECK = 10001 // 告警Code-内存/CPU/磁盘检查 + ALARM_LICENSE_CHECK = 10002 // 告警Code-网元License到期检查 + ALARM_UDM_DB_SYNC = 10003 // 告警Code-UDM DB同步检查 +) + +const ( + ALARM_ACK_STATE_NOT_ACK = "NotAck" // 告警确认状态-未确认 + ALARM_ACK_STATE_ACK = "Ack" // 告警确认状态-已确认 +) + +const ( + ALARM_CLEAR_TYPE_NOT_CLEAR = "NotClear" // 告警清除状态-未清除 + ALARM_CLEAR_TYPE_AUTO_CLEAR = "AutoClear" // 告警清除状态-自动清除 + ALARM_CLEAR_TYPE_MANUAL_CLEAR = "ManualClear" // 告警清除状态-手动清除 ) diff --git a/src/framework/utils/expr/expr.go b/src/framework/utils/expr/expr.go new file mode 100644 index 00000000..cd7ba420 --- /dev/null +++ b/src/framework/utils/expr/expr.go @@ -0,0 +1,44 @@ +package expr + +import ( + "fmt" + "regexp" + "strings" + + "github.com/expr-lang/expr" +) + +// Eval 计算表达式返回结果 +func Eval(exprStr string, env map[string]any) (any, error) { + return expr.Eval(exprStr, env) +} + +// ParseExprEnv 解析表达式环境变量 +// 比如 "('SMF.03'/'SMF.04')*100" +// 变量传入"SMF.03": 3 +func ParseExprEnv(exprStr string, env map[string]any) (string, map[string]any) { + // 使用正则表达式匹配带单引号的变量名 + re := regexp.MustCompile(`'([^']+)'`) + tempEnv := make(map[string]any) + tempExpr := exprStr + varCount := 0 + matches := re.FindAllStringSubmatch(exprStr, -1) + for _, match := range matches { + paramName := match[1] + tempVarName := fmt.Sprintf("var%d", varCount) + tempEnv[tempVarName] = env[paramName] + tempExpr = strings.Replace(tempExpr, match[0], tempVarName, 1) + varCount++ + } + + // 合并临时环境变量和原环境变量 + combinedEnv := make(map[string]any) + for k, v := range env { + combinedEnv[k] = v + } + for k, v := range tempEnv { + combinedEnv[k] = v + } + + return tempExpr, combinedEnv +} diff --git a/src/modules/network_element/fetch_link/alarm.go b/src/modules/network_element/fetch_link/alarm.go new file mode 100644 index 00000000..b6721597 --- /dev/null +++ b/src/modules/network_element/fetch_link/alarm.go @@ -0,0 +1,39 @@ +package fetchlink + +import ( + "encoding/json" + "fmt" + "strings" + + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" +) + +// AlarmHistory 告警历史记录 +func AlarmHistory(neInfo model.NeInfo) ([]map[string]any, error) { + // 网元参数配置信息 + neUrl := fmt.Sprintf("http://%s:%d/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType)) + resBytes, err := fetch.Get(neUrl, nil, 60_000) + var resData []map[string]any + if err != nil { + errStr := err.Error() + logger.Warnf("AlarmHistory Get \"%s\"", neUrl) + if !(strings.HasPrefix(errStr, "201") || strings.HasPrefix(errStr, "202") || strings.HasPrefix(errStr, "204")) { + logger.Errorf("AlarmHistory %s", err.Error()) + return nil, fmt.Errorf("NeService Alarm History Info API Error") + } + } + + if len(resBytes) == 0 { + return resData, nil + } + + // 序列化结果 + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("AlarmHistory Unmarshal %s", err.Error()) + return nil, err + } + return resData, nil +} diff --git a/src/modules/network_element/service/ne_info.go b/src/modules/network_element/service/ne_info.go index 9042eecd..46e8ef34 100644 --- a/src/modules/network_element/service/ne_info.go +++ b/src/modules/network_element/service/ne_info.go @@ -129,6 +129,33 @@ func (r *NeInfo) SelectNeInfoByNeType(neType string) []model.NeInfo { return neInfo } +// FindByNeType 通过ne_type查询网元信息 +func (r NeInfo) FindByNeType(neType string) []model.NeInfo { + neInfo := make([]model.NeInfo, 0) + key := fmt.Sprintf("%s%s:*", cachekey.NE_KEY, strings.ToUpper(neType)) + cacheKeys, _ := redis.GetKeys("", key) + if len(cacheKeys) > 0 { + for _, key := range cacheKeys { + var v model.NeInfo + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + json.Unmarshal([]byte(jsonStr), &v) + } + neInfo = append(neInfo, v) + } + return neInfo + } else { + neInfo = r.neInfoRepository.SelectList(model.NeInfo{NeType: neType}) + for _, v := range neInfo { + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(v.NeType), v.NeId) + redis.Del("", key) + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + } + } + return neInfo +} + // SelectNeInfoByRmuid 通过rmUID查询网元信息 func (r *NeInfo) SelectNeInfoByRmuid(rmUid string) model.NeInfo { var neInfo model.NeInfo @@ -160,6 +187,37 @@ func (r *NeInfo) SelectNeInfoByRmuid(rmUid string) model.NeInfo { return neInfo } +// FindByRmuid 通过rmUID查询网元信息 +func (r *NeInfo) FindByRmuid(rmUid string) model.NeInfo { + var neInfo model.NeInfo + cacheKeys, _ := redis.GetKeys("", cachekey.NE_KEY+"*") + if len(cacheKeys) > 0 { + for _, key := range cacheKeys { + var v model.NeInfo + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + json.Unmarshal([]byte(jsonStr), &v) + } + if v.RmUID == rmUid { + neInfo = v + break + } + } + } else { + neInfos := r.SelectList(neInfo, false, false) + for _, v := range neInfos { + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(v.NeType), v.NeId) + redis.Del("", key) + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + if v.RmUID == rmUid { + neInfo = v + } + } + } + return neInfo +} + // SelectPage 根据条件分页查询 // // bandStatus 带状态信息 @@ -194,6 +252,26 @@ func (r *NeInfo) SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []m return list } +// Find 查询列表 +// +// bandStatus 带状态信息 +// bandHost 带主机信息 +func (r NeInfo) Find(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo { + list := r.neInfoRepository.SelectList(ne) + + // 网元直连读取网元服务状态 + if bandStatus { + r.bandNeStatus(&list) + } + + // 网元主机信息 + if bandHost { + r.bandNeHosts(&list) + } + + return list +} + // bandNeStatus 网元列表项数据带网元服务状态 func (r *NeInfo) bandNeStatus(arr *[]model.NeInfo) { for i := range *arr { diff --git a/src/modules/system/service/sys_dict_data.go b/src/modules/system/service/sys_dict_data.go index d5581078..ea8bc332 100644 --- a/src/modules/system/service/sys_dict_data.go +++ b/src/modules/system/service/sys_dict_data.go @@ -46,6 +46,11 @@ func (r *SysDictData) SelectDictDataByType(dictType string) []model.SysDictData return r.sysDictTypeService.DictDataCache(dictType) } +// FindByType 根据字典类型查询信息 +func (r *SysDictData) FindByType(dictType string) []model.SysDictData { + return r.sysDictTypeService.DictDataCache(dictType) +} + // CheckUniqueDictLabel 校验字典标签是否唯一 func (r *SysDictData) CheckUniqueDictLabel(dictType, dictLabel, dictCode string) bool { uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{