diff --git a/features/cdr/cdrevent.go b/features/cdr/cdrevent.go index 6361fa05..12bb6766 100644 --- a/features/cdr/cdrevent.go +++ b/features/cdr/cdrevent.go @@ -56,7 +56,7 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(cdrEvent.RmUID) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(cdrEvent.RmUID) if neInfo.RmUID == cdrEvent.RmUID { // 推送到ws订阅组 switch neInfo.NeType { diff --git a/features/cm/ne.go b/features/cm/ne.go index 665c3f8f..f5f10071 100644 --- a/features/cm/ne.go +++ b/features/cm/ne.go @@ -157,7 +157,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} @@ -208,7 +208,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) services.ResponseStatusOK204NoContent(w) return @@ -267,7 +267,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} @@ -319,7 +319,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) services.ResponseStatusOK204NoContent(w) return @@ -381,7 +381,7 @@ func DeleteNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} diff --git a/features/cm/param.go b/features/cm/param.go index 9e5a62fb..c44c9743 100644 --- a/features/cm/param.go +++ b/features/cm/param.go @@ -39,7 +39,7 @@ func GetParamConfigFromNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) var response services.DataResponse if neInfo.NeId == neId && neInfo.NeId != "" { @@ -76,7 +76,7 @@ func PostParamConfigToNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") @@ -128,7 +128,7 @@ func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) { } neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") @@ -181,7 +181,7 @@ func DeleteParamConfigToNF(w http.ResponseWriter, r *http.Request) { } neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") diff --git a/features/event/event.go b/features/event/event.go index faad0e11..1f75012b 100644 --- a/features/event/event.go +++ b/features/event/event.go @@ -99,7 +99,7 @@ func PostUEEvent(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(ueEvent.RmUID) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(ueEvent.RmUID) if neInfo.RmUID == ueEvent.RmUID { // 推送到ws订阅组 if ueEvent.NeType == "MME" { diff --git a/features/mml/mml.go b/features/mml/mml.go index 537b0cde..feaa6910 100644 --- a/features/mml/mml.go +++ b/features/mml/mml.go @@ -83,7 +83,7 @@ func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { } log.Debug("neType:", neType, "neId", neId) - neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return @@ -235,7 +235,7 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { return } - neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return @@ -635,7 +635,7 @@ func PostMMLToOMC(w http.ResponseWriter, r *http.Request) { } log.Debug("neType:", neType, "neId", neId) - neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, false) + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, false) if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return diff --git a/features/pm/performance.go b/features/pm/performance.go index c7a5b3b3..cd54c741 100644 --- a/features/pm/performance.go +++ b/features/pm/performance.go @@ -288,7 +288,7 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(kpiData.RmUid) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(kpiData.RmUid) // custom kpi report to FE kpiCEvent := map[string]any{ // kip_id ... diff --git a/features/ue/ue.go b/features/ue/ue.go index 5581bb6f..cd2bb024 100644 --- a/features/ue/ue.go +++ b/features/ue/ue.go @@ -253,7 +253,7 @@ func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) var response services.MapResponse if neInfo.NeId == neId && neInfo.NeId != "" { diff --git a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go index 8263e19d..bb36135c 100644 --- a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go +++ b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go @@ -11,19 +11,16 @@ import ( ) var NewProcessor = &NeConfigBackupProcessor{ - neConfigBackupService: neService.NewNeConfigBackupImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigBackupService: neService.NewNeConfigBackup, + neInfoService: neService.NewNeInfo, count: 0, } // NeConfigBackupProcessor 网元配置文件定期备份 type NeConfigBackupProcessor struct { - // 网元配置文件备份记录服务 - neConfigBackupService neService.INeConfigBackup - // 网元信息服务 - neInfoService neService.INeInfo - // 执行次数 - count int + neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 + neInfoService *neService.NeInfo // 网元信息服务 + count int // 执行次数 } func (s *NeConfigBackupProcessor) Execute(data any) (any, error) { diff --git a/src/modules/network_data/controller/all_alarm.go b/src/modules/network_data/controller/all_alarm.go index da67adaf..2372de98 100644 --- a/src/modules/network_data/controller/all_alarm.go +++ b/src/modules/network_data/controller/all_alarm.go @@ -15,19 +15,17 @@ import ( ) // 实例化控制层 AlarmController 结构体 -var NewAlarmController = &AlarmController{ - neInfoService: neService.NewNeInfoImpl, - alarmService: neDataService.NewAlarmImpl, +var NewAlarm = &AlarmController{ + neInfoService: neService.NewNeInfo, + alarmService: neDataService.NewAlarm, } // 告警数据 // // PATH /alarm type AlarmController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 告警信息服务 - alarmService neDataService.IAlarm + neInfoService *neService.NeInfo // 网元信息服务 + alarmService *neDataService.Alarm // 告警信息服务 } // 告警列表 diff --git a/src/modules/network_data/controller/all_kpi.go b/src/modules/network_data/controller/all_kpi.go index 221eb655..e3dbc720 100644 --- a/src/modules/network_data/controller/all_kpi.go +++ b/src/modules/network_data/controller/all_kpi.go @@ -11,19 +11,17 @@ import ( ) // 实例化控制层 PerfKPIController 结构体 -var NewPerfKPIController = &PerfKPIController{ - neInfoService: neService.NewNeInfoImpl, - perfKPIService: neDataService.NewPerfKPIImpl, +var NewPerfKPI = &PerfKPIController{ + neInfoService: neService.NewNeInfo, + perfKPIService: neDataService.NewPerfKPI, } // 性能统计 // // PATH /kpi type PerfKPIController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 统计信息服务 - perfKPIService neDataService.IPerfKPI + neInfoService *neService.NeInfo // 网元信息服务 + perfKPIService *neDataService.PerfKPI // 统计信息服务 } // 获取统计数据 diff --git a/src/modules/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index fbc7142f..a41e95c9 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -22,19 +22,17 @@ import ( ) // 实例化控制层 AMFController 结构体 -var NewAMFController = &AMFController{ - neInfoService: neService.NewNeInfoImpl, - ueEventService: neDataService.NewUEEventAMFImpl, +var NewAMF = &AMFController{ + neInfoService: neService.NewNeInfo, + ueEventService: neDataService.NewUEEventAMF, } // 网元AMF // // PATH /amf type AMFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // UE会话事件服务 - ueEventService neDataService.IUEEventAMF + neInfoService *neService.NeInfo // 网元信息服务 + ueEventService *neDataService.UEEventAMF // UE会话事件服务 } // UE会话列表 diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 22221200..051ceb1b 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -23,19 +23,17 @@ import ( ) // 实例化控制层 IMSController 结构体 -var NewIMSController = &IMSController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventIMSImpl, +var NewIMS = &IMSController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventIMS, } // 网元IMS // // PATH /ims type IMSController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventIMS + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventIMS // CDR会话事件服务 } // CDR会话列表 diff --git a/src/modules/network_data/controller/mme.go b/src/modules/network_data/controller/mme.go index a7707a18..1c61daa0 100644 --- a/src/modules/network_data/controller/mme.go +++ b/src/modules/network_data/controller/mme.go @@ -23,19 +23,17 @@ import ( ) // 实例化控制层 MMEController 结构体 -var NewMMEController = &MMEController{ - neInfoService: neService.NewNeInfoImpl, - ueEventService: neDataService.NewUEEventMMEImpl, +var NewMME = &MMEController{ + neInfoService: neService.NewNeInfo, + ueEventService: neDataService.NewUEEventMME, } // 网元MME // // PATH /mme type MMEController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // UE会话事件服务 - ueEventService neDataService.IUEEventMME + neInfoService *neService.NeInfo // 网元信息服务 + ueEventService *neDataService.UEEventMME // UE会话事件服务 } // UE会话列表 diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index 0dc48827..d944f813 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -22,22 +22,19 @@ import ( ) // 实例化控制层 SMFController 结构体 -var NewSMFController = &SMFController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventSMFImpl, - udmUserInfoService: *neDataService.NewUDMUserInfo, +var NewSMF = &SMFController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventSMF, + udmUserInfoService: neDataService.NewUDMUserInfo, } // 网元SMF // // PATH /smf type SMFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventSMF - // UDM用户信息服务 - udmUserInfoService neDataService.UDMUserInfo + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventSMF // CDR会话事件服务 + udmUserInfoService *neDataService.UDMUserInfo // UDM用户信息服务 } // CDR会话列表 diff --git a/src/modules/network_data/controller/smsc.go b/src/modules/network_data/controller/smsc.go index 6ebcb75d..167d097a 100644 --- a/src/modules/network_data/controller/smsc.go +++ b/src/modules/network_data/controller/smsc.go @@ -22,19 +22,17 @@ import ( ) // 实例化控制层 SMSCController 结构体 -var NewSMSCController = &SMSCController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventSMSCImpl, +var NewSMSC = &SMSCController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventSMSC, } // 网元SMSC // // PATH /smsc type SMSCController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventSMSC + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventSMSC // CDR会话事件服务 } // CDR会话列表 diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index de05f3ea..dbaeb3ec 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -24,17 +24,15 @@ import ( // 实例化控制层 UDMAuthController 结构体 var NewUDMAuth = &UDMAuthController{ udmAuthService: neDataService.NewUDMAuthUser, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // UDM鉴权用户 // // PATH /udm/auth type UDMAuthController struct { - // UDM鉴权信息服务 - udmAuthService *neDataService.UDMAuthUser - // 网元信息服务 - neInfoService neService.INeInfo + udmAuthService *neDataService.UDMAuthUser // UDM鉴权信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // UDM鉴权用户重载数据 diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index 3a7facc4..cec49570 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -23,17 +23,15 @@ import ( // 实例化控制层 UDMSubController 结构体 var NewUDMSub = &UDMSubController{ udmSubService: neDataService.NewUDMSub, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // UDM签约用户 // // PATH /udm/sub type UDMSubController struct { - // UDM签约信息服务 - udmSubService *neDataService.UDMSubUser - // 网元信息服务 - neInfoService neService.INeInfo + udmSubService *neDataService.UDMSubUser // UDM签约信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // UDM签约用户重载数据 diff --git a/src/modules/network_data/controller/upf.go b/src/modules/network_data/controller/upf.go index 366fc15d..0d0acd5e 100644 --- a/src/modules/network_data/controller/upf.go +++ b/src/modules/network_data/controller/upf.go @@ -10,19 +10,17 @@ import ( ) // 实例化控制层 UPFController 结构体 -var NewUPFController = &UPFController{ - neInfoService: neService.NewNeInfoImpl, - perfKPIService: neDataService.NewPerfKPIImpl, +var NewUPF = &UPFController{ + neInfoService: neService.NewNeInfo, + perfKPIService: neDataService.NewPerfKPI, } // 网元UPF // // PATH /upf type UPFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 统计信息服务 - perfKPIService neDataService.IPerfKPI + neInfoService *neService.NeInfo // 网元信息服务 + perfKPIService *neDataService.PerfKPI // 统计信息服务 } // 总流量数 N3上行 N6下行 diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index e60cdd9f..a114f75b 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -21,11 +21,11 @@ func Setup(router *gin.Engine) { { kpiGroup.GET("/title", middleware.PreAuthorize(nil), - controller.NewPerfKPIController.Title, + controller.NewPerfKPI.Title, ) kpiGroup.GET("/data", middleware.PreAuthorize(nil), - controller.NewPerfKPIController.GoldKPI, + controller.NewPerfKPI.GoldKPI, ) } @@ -34,11 +34,11 @@ func Setup(router *gin.Engine) { { alarmGroup.GET("/list", middleware.PreAuthorize(nil), - controller.NewAlarmController.List, + controller.NewAlarm.List, ) alarmGroup.DELETE("/:alarmIds", middleware.PreAuthorize(nil), - controller.NewAlarmController.Remove, + controller.NewAlarm.Remove, ) } @@ -47,17 +47,17 @@ func Setup(router *gin.Engine) { { imsGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewIMSController.CDRList, + controller.NewIMS.CDRList, ) imsGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewIMSController.CDRRemove, + controller.NewIMS.CDRRemove, ) imsGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewIMSController.CDRExport, + controller.NewIMS.CDRExport, ) } @@ -66,17 +66,17 @@ func Setup(router *gin.Engine) { { smscGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewSMSCController.CDRList, + controller.NewSMSC.CDRList, ) smscGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewSMSCController.CDRRemove, + controller.NewSMSC.CDRRemove, ) smscGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewSMSCController.CDRExport, + controller.NewSMSC.CDRExport, ) } @@ -85,21 +85,21 @@ func Setup(router *gin.Engine) { { smfGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewSMFController.CDRList, + controller.NewSMF.CDRList, ) smfGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewSMFController.CDRRemove, + controller.NewSMF.CDRRemove, ) smfGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewSMFController.CDRExport, + controller.NewSMF.CDRExport, ) smfGroup.GET("/subscribers", middleware.PreAuthorize(nil), - controller.NewSMFController.SubUserList, + controller.NewSMF.SubUserList, ) } @@ -108,17 +108,17 @@ func Setup(router *gin.Engine) { { amfGroup.GET("/ue/list", middleware.PreAuthorize(nil), - controller.NewAMFController.UEList, + controller.NewAMF.UEList, ) amfGroup.DELETE("/ue/:ueIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewAMFController.UERemove, + controller.NewAMF.UERemove, ) amfGroup.POST("/ue/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewAMFController.UEExport, + controller.NewAMF.UEExport, ) } @@ -127,7 +127,7 @@ func Setup(router *gin.Engine) { { upfGroup.GET("/totalFlow", middleware.PreAuthorize(nil), - controller.NewUPFController.TotalFlow, + controller.NewUPF.TotalFlow, ) } @@ -244,17 +244,17 @@ func Setup(router *gin.Engine) { { mmeGroup.GET("/ue/list", middleware.PreAuthorize(nil), - controller.NewMMEController.UEList, + controller.NewMME.UEList, ) mmeGroup.DELETE("/ue/:ueIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewMMEController.UERemove, + controller.NewMME.UERemove, ) mmeGroup.POST("/ue/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewMMEController.UEExport, + controller.NewMME.UEExport, ) } } diff --git a/src/modules/network_data/repository/alarm.go b/src/modules/network_data/repository/alarm.go index 0ea43bb0..41d50325 100644 --- a/src/modules/network_data/repository/alarm.go +++ b/src/modules/network_data/repository/alarm.go @@ -1,15 +1,194 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// 告警 数据层接口 -type IAlarm interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.AlarmQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.Alarm +// 实例化数据层 Alarm 结构体 +var NewAlarm = &Alarm{ + selectSql: `select + id, alarm_seq, alarm_id, alarm_title, ne_type, ne_id, alarm_code, event_time, + alarm_type, orig_severity, perceived_severity, pv_flag, ne_name, object_uid, object_name, + object_type, location_info, province, alarm_status, specific_problem, specific_problem_id, + add_info, counter, latest_event_time, ack_state, ack_time, ack_user, clear_type, + clear_time, clear_user, timestamp + from alarm`, - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "alarm_seq": "AlarmSeq", + "alarm_id": "AlarmId", + "alarm_title": "AlarmTitle", + "ne_type": "NeType", + "ne_id": "NeId", + "alarm_code": "AlarmCode", + "event_time": "EventTime", + "alarm_type": "AlarmType", + "orig_severity": "OrigSeverity", + "perceived_severity": "PerceivedSeverity", + "pv_flag": "PvFlag", + "ne_name": "NeName", + "object_uid": "ObjectUid", + "object_name": "ObjectName", + "object_type": "ObjectType", + "location_info": "LocationInfo", + "province": "Province", + "alarm_status": "AlarmStatus", + "specific_problem": "SpecificProblem", + "specific_problem_id": "SpecificProblemId", + "add_info": "AddInfo", + "counter": "Counter", + "latest_event_time": "LatestEventTime", + "ack_state": "AckState", + "ack_time": "AckTime", + "ack_user": "AckUser", + "clear_type": "ClearType", + "clear_time": "ClearTime", + "clear_user": "ClearUser", + "timestamp": "Timestamp", + }, +} + +// Alarm 告警 数据层处理 +type Alarm struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *Alarm) convertResultRows(rows []map[string]any) []model.Alarm { + arr := make([]model.Alarm, 0) + for _, row := range rows { + item := model.Alarm{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *Alarm) SelectPage(querys model.AlarmQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "object_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + params = append(params, querys.EndTime) + } + if querys.OrigSeverity != "" { + eventTypes := strings.Split(querys.OrigSeverity, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("orig_severity in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.Alarm{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from alarm" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *Alarm) SelectByIds(ids []string) []model.Alarm { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.Alarm{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *Alarm) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from alarm where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/alarm.impl.go b/src/modules/network_data/repository/alarm.impl.go deleted file mode 100644 index 6a97dbf8..00000000 --- a/src/modules/network_data/repository/alarm.impl.go +++ /dev/null @@ -1,194 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 AlarmImpl 结构体 -var NewAlarmImpl = &AlarmImpl{ - selectSql: `select - id, alarm_seq, alarm_id, alarm_title, ne_type, ne_id, alarm_code, event_time, - alarm_type, orig_severity, perceived_severity, pv_flag, ne_name, object_uid, object_name, - object_type, location_info, province, alarm_status, specific_problem, specific_problem_id, - add_info, counter, latest_event_time, ack_state, ack_time, ack_user, clear_type, - clear_time, clear_user, timestamp - from alarm`, - - resultMap: map[string]string{ - "id": "ID", - "alarm_seq": "AlarmSeq", - "alarm_id": "AlarmId", - "alarm_title": "AlarmTitle", - "ne_type": "NeType", - "ne_id": "NeId", - "alarm_code": "AlarmCode", - "event_time": "EventTime", - "alarm_type": "AlarmType", - "orig_severity": "OrigSeverity", - "perceived_severity": "PerceivedSeverity", - "pv_flag": "PvFlag", - "ne_name": "NeName", - "object_uid": "ObjectUid", - "object_name": "ObjectName", - "object_type": "ObjectType", - "location_info": "LocationInfo", - "province": "Province", - "alarm_status": "AlarmStatus", - "specific_problem": "SpecificProblem", - "specific_problem_id": "SpecificProblemId", - "add_info": "AddInfo", - "counter": "Counter", - "latest_event_time": "LatestEventTime", - "ack_state": "AckState", - "ack_time": "AckTime", - "ack_user": "AckUser", - "clear_type": "ClearType", - "clear_time": "ClearTime", - "clear_user": "ClearUser", - "timestamp": "Timestamp", - }, -} - -// AlarmImpl 告警 数据层处理 -type AlarmImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *AlarmImpl) convertResultRows(rows []map[string]any) []model.Alarm { - arr := make([]model.Alarm, 0) - for _, row := range rows { - item := model.Alarm{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *AlarmImpl) SelectPage(querys model.AlarmQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "object_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - params = append(params, querys.EndTime) - } - if querys.OrigSeverity != "" { - eventTypes := strings.Split(querys.OrigSeverity, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("orig_severity in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.Alarm{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from alarm" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *AlarmImpl) SelectByIds(ids []string) []model.Alarm { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.Alarm{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *AlarmImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from alarm where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_ims.go b/src/modules/network_data/repository/cdr_event_ims.go index fcc9a7bb..598e848c 100644 --- a/src/modules/network_data/repository/cdr_event_ims.go +++ b/src/modules/network_data/repository/cdr_event_ims.go @@ -1,15 +1,189 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件IMS 数据层接口 -type ICDREventIMS interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventIMSQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventIMS +// 实例化数据层 CDREventIMS 结构体 +var NewCDREventIMS = &CDREventIMS{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventIMS CDR会话事件IMS 数据层处理 +type CDREventIMS struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventIMS) convertResultRows(rows []map[string]any) []model.CDREventIMS { + arr := make([]model.CDREventIMS, 0) + for _, row := range rows { + item := model.CDREventIMS{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.CallerParty != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.callerParty') = ?") + params = append(params, querys.CallerParty) + } + if querys.CalledParty != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.calledParty') = ?") + params = append(params, querys.CalledParty) + } + // MySQL8支持的 + // if querys.RecordType != "" { + // recordTypes := strings.Split(querys.RecordType, ",") + // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) + // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) + // for _, recordType := range recordTypes { + // params = append(params, recordType) + // } + // } + // Mariadb不支持json in查询改or + if querys.RecordType != "" { + recordTypes := strings.Split(querys.RecordType, ",") + var queryStrArr []string + for _, recordType := range recordTypes { + queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, recordType) + } + conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventIMS{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_ims" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventIMS) SelectByIds(cdrIds []string) []model.CDREventIMS { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventIMS{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventIMS) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_ims where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_ims.impl.go b/src/modules/network_data/repository/cdr_event_ims.impl.go deleted file mode 100644 index 6d67b6ca..00000000 --- a/src/modules/network_data/repository/cdr_event_ims.impl.go +++ /dev/null @@ -1,189 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventImpl 结构体 -var NewCDREventIMSImpl = &CDREventIMSImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventIMSImpl CDR会话事件IMS 数据层处理 -type CDREventIMSImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventIMSImpl) convertResultRows(rows []map[string]any) []model.CDREventIMS { - arr := make([]model.CDREventIMS, 0) - for _, row := range rows { - item := model.CDREventIMS{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventIMSImpl) SelectPage(querys model.CDREventIMSQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.CallerParty != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.callerParty') = ?") - params = append(params, querys.CallerParty) - } - if querys.CalledParty != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.calledParty') = ?") - params = append(params, querys.CalledParty) - } - // MySQL8支持的 - // if querys.RecordType != "" { - // recordTypes := strings.Split(querys.RecordType, ",") - // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) - // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) - // for _, recordType := range recordTypes { - // params = append(params, recordType) - // } - // } - // Mariadb不支持json in查询改or - if querys.RecordType != "" { - recordTypes := strings.Split(querys.RecordType, ",") - var queryStrArr []string - for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, recordType) - } - conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventIMS{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_ims" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventIMSImpl) SelectByIds(cdrIds []string) []model.CDREventIMS { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventIMS{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventIMSImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_ims where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_smf.go b/src/modules/network_data/repository/cdr_event_smf.go index 1a950a29..14f49cfc 100644 --- a/src/modules/network_data/repository/cdr_event_smf.go +++ b/src/modules/network_data/repository/cdr_event_smf.go @@ -1,15 +1,170 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件SMF 数据层接口 -type ICDREventSMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMFQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventSMF +// 实例化数据层 CDREventSMF 结构体 +var NewCDREventSMF = &CDREventSMF{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventSMF CDR会话事件 数据层处理 +type CDREventSMF struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventSMF) convertResultRows(rows []map[string]any) []model.CDREventSMF { + arr := make([]model.CDREventSMF, 0) + for _, row := range rows { + item := model.CDREventSMF{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.RecordType != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, querys.RecordType) + } + if querys.SubscriberID != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?") + params = append(params, querys.SubscriberID) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventSMF{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_smf" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventSMF) SelectByIds(cdrIds []string) []model.CDREventSMF { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventSMF{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMF) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_smf where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_smf.impl.go b/src/modules/network_data/repository/cdr_event_smf.impl.go deleted file mode 100644 index 97c98aa7..00000000 --- a/src/modules/network_data/repository/cdr_event_smf.impl.go +++ /dev/null @@ -1,170 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSMFImpl 结构体 -var NewCDREventSMFImpl = &CDREventSMFImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventSMFImpl CDR会话事件 数据层处理 -type CDREventSMFImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventSMFImpl) convertResultRows(rows []map[string]any) []model.CDREventSMF { - arr := make([]model.CDREventSMF, 0) - for _, row := range rows { - item := model.CDREventSMF{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventSMFImpl) SelectPage(querys model.CDREventSMFQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.RecordType != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, querys.RecordType) - } - if querys.SubscriberID != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?") - params = append(params, querys.SubscriberID) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventSMF{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smf" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventSMFImpl) SelectByIds(cdrIds []string) []model.CDREventSMF { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventSMF{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMFImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_smf where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_smsc.go b/src/modules/network_data/repository/cdr_event_smsc.go index 403e0e40..7673e7bf 100644 --- a/src/modules/network_data/repository/cdr_event_smsc.go +++ b/src/modules/network_data/repository/cdr_event_smsc.go @@ -1,15 +1,181 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件SMSC 数据层接口 -type ICDREventSMSC interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMSCQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventSMSC +// 实例化数据层 CDREventSMSC 结构体 +var NewCDREventSMSC = &CDREventSMSC{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smsc`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventSMSC CDR会话事件 数据层处理 +type CDREventSMSC struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventSMSC) convertResultRows(rows []map[string]any) []model.CDREventSMSC { + arr := make([]model.CDREventSMSC, 0) + for _, row := range rows { + item := model.CDREventSMSC{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + // MySQL8支持的 + // if querys.RecordType != "" { + // recordTypes := strings.Split(querys.RecordType, ",") + // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) + // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) + // for _, recordType := range recordTypes { + // params = append(params, recordType) + // } + // } + // Mariadb不支持json in查询改or + if querys.RecordType != "" { + recordTypes := strings.Split(querys.RecordType, ",") + var queryStrArr []string + for _, recordType := range recordTypes { + queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, recordType) + } + conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventSMSC{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_smsc" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventSMSC) SelectByIds(cdrIds []string) []model.CDREventSMSC { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventSMSC{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMSC) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_smsc where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_smsc.impl.go b/src/modules/network_data/repository/cdr_event_smsc.impl.go deleted file mode 100644 index 82182313..00000000 --- a/src/modules/network_data/repository/cdr_event_smsc.impl.go +++ /dev/null @@ -1,181 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSMSCImpl 结构体 -var NewCDREventSMSCImpl = &CDREventSMSCImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smsc`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventSMSCImpl CDR会话事件 数据层处理 -type CDREventSMSCImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventSMSCImpl) convertResultRows(rows []map[string]any) []model.CDREventSMSC { - arr := make([]model.CDREventSMSC, 0) - for _, row := range rows { - item := model.CDREventSMSC{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventSMSCImpl) SelectPage(querys model.CDREventSMSCQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - // MySQL8支持的 - // if querys.RecordType != "" { - // recordTypes := strings.Split(querys.RecordType, ",") - // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) - // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) - // for _, recordType := range recordTypes { - // params = append(params, recordType) - // } - // } - // Mariadb不支持json in查询改or - if querys.RecordType != "" { - recordTypes := strings.Split(querys.RecordType, ",") - var queryStrArr []string - for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, recordType) - } - conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventSMSC{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smsc" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventSMSCImpl) SelectByIds(cdrIds []string) []model.CDREventSMSC { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventSMSC{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMSCImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_smsc where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/perf_kpi.go b/src/modules/network_data/repository/perf_kpi.go index 1a00957f..e757fe01 100644 --- a/src/modules/network_data/repository/perf_kpi.go +++ b/src/modules/network_data/repository/perf_kpi.go @@ -1,15 +1,131 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// 性能统计 数据层接口 -type IPerfKPI interface { - // SelectGoldKPI 通过网元指标数据信息 - SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) - // SelectGoldKPITitle 网元对应的指标名称 - SelectGoldKPITitle(neType string) []model.GoldKPITitle +// 实例化数据层 PerfKPI 结构体 +var NewPerfKPI = &PerfKPI{} - // SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 - SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any +// PerfKPI 性能统计 数据层处理 +type PerfKPI struct{} + +// SelectGoldKPI 通过网元指标数据信息 +func (r *PerfKPI) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + var tableName string = "kpi_report_" + if query.RmUID != "" { + conditions = append(conditions, "gk.rm_uid = ?") + params = append(params, query.RmUID) + } + if query.NeType != "" { + //conditions = append(conditions, "gk.ne_type = ?") + // params = append(params, query.NeType) + tableName += strings.ToLower(query.NeType) + } + if query.StartTime != "" { + conditions = append(conditions, "gk.created_at >= ?") + params = append(params, query.StartTime) + } + if query.EndTime != "" { + conditions = append(conditions, "gk.created_at <= ?") + params = append(params, query.EndTime) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询字段列 + var fields = []string{ + // fmt.Sprintf("FROM_UNIXTIME(FLOOR(gk.created_at / (%d * 1000)) * %d) AS timeGroup", query.Interval, query.Interval), + fmt.Sprintf("CONCAT(FLOOR(gk.created_at / (%d * 1000)) * (%d * 1000)) AS timeGroup", query.Interval, query.Interval), // 时间戳毫秒 + "min(CASE WHEN gk.index != '' THEN gk.index ELSE 0 END) AS startIndex", + "min(CASE WHEN gk.ne_type != '' THEN gk.ne_type ELSE 0 END) AS neType", + "min(CASE WHEN gk.ne_name != '' THEN gk.ne_name ELSE 0 END) AS neName", + } + for i, kid := range kpiIds { + // 特殊字段,只取最后一次收到的非0值 + if kid == "AMF.01" || kid == "UDM.01" || kid == "UDM.02" || kid == "UDM.03" || kid == "SMF.01" { + str := fmt.Sprintf("IFNULL(SUBSTRING_INDEX(GROUP_CONCAT( CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') END ), ',', 1), 0) AS '%s'", i, kid, i, kid) + fields = append(fields, str) + } else { + str := fmt.Sprintf("sum(CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') ELSE 0 END) AS '%s'", i, kid, i, kid) + fields = append(fields, str) + } + } + fieldsSql := strings.Join(fields, ",") + + // 查询数据 + if query.SortField == "" { + query.SortField = "timeGroup" + } + if query.SortOrder == "" { + query.SortOrder = "desc" + } + orderSql := fmt.Sprintf(" order by %s %s", query.SortField, query.SortOrder) + querySql := fmt.Sprintf("SELECT %s FROM %s gk %s GROUP BY timeGroup %s", fieldsSql, tableName, whereSql, orderSql) + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + return results +} + +// SelectGoldKPITitle 网元对应的指标名称 +func (r *PerfKPI) SelectGoldKPITitle(neType string) []model.GoldKPITitle { + result := []model.GoldKPITitle{} + tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result) + if err := tx.Error; err != nil { + logger.Errorf("Find err => %v", err) + } + return result +} + +// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 +func (r *PerfKPI) SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if neType != "" { + conditions = append(conditions, "kupf.ne_type = ?") + params = append(params, neType) + } + if rmUID != "" { + conditions = append(conditions, "kupf.rm_uid = ?") + params = append(params, rmUID) + } + if startDate != "" { + conditions = append(conditions, "kupf.created_at >= ?") + params = append(params, startDate) + } + if endDate != "" { + conditions = append(conditions, "kupf.created_at <= ?") + params = append(params, endDate) + } + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := `SELECT + sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[2].kpi_id') = 'UPF.03' THEN JSON_EXTRACT(kupf.kpi_values, '$[2].value') ELSE 0 END ) AS 'up', + sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[5].kpi_id') = 'UPF.06' THEN JSON_EXTRACT(kupf.kpi_values, '$[5].value') ELSE 0 END ) AS 'down' + FROM kpi_report_upf kupf` + results, err := datasource.RawDB("", querySql+whereSql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + return results[0] } diff --git a/src/modules/network_data/repository/perf_kpi.impl.go b/src/modules/network_data/repository/perf_kpi.impl.go deleted file mode 100644 index b7ac5bb8..00000000 --- a/src/modules/network_data/repository/perf_kpi.impl.go +++ /dev/null @@ -1,131 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 PerfKPIImpl 结构体 -var NewPerfKPIImpl = &PerfKPIImpl{} - -// PerfKPIImpl 性能统计 数据层处理 -type PerfKPIImpl struct{} - -// SelectGoldKPI 通过网元指标数据信息 -func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - var tableName string = "kpi_report_" - if query.RmUID != "" { - conditions = append(conditions, "gk.rm_uid = ?") - params = append(params, query.RmUID) - } - if query.NeType != "" { - //conditions = append(conditions, "gk.ne_type = ?") - // params = append(params, query.NeType) - tableName += strings.ToLower(query.NeType) - } - if query.StartTime != "" { - conditions = append(conditions, "gk.created_at >= ?") - params = append(params, query.StartTime) - } - if query.EndTime != "" { - conditions = append(conditions, "gk.created_at <= ?") - params = append(params, query.EndTime) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询字段列 - var fields = []string{ - // fmt.Sprintf("FROM_UNIXTIME(FLOOR(gk.created_at / (%d * 1000)) * %d) AS timeGroup", query.Interval, query.Interval), - fmt.Sprintf("CONCAT(FLOOR(gk.created_at / (%d * 1000)) * (%d * 1000)) AS timeGroup", query.Interval, query.Interval), // 时间戳毫秒 - "min(CASE WHEN gk.index != '' THEN gk.index ELSE 0 END) AS startIndex", - "min(CASE WHEN gk.ne_type != '' THEN gk.ne_type ELSE 0 END) AS neType", - "min(CASE WHEN gk.ne_name != '' THEN gk.ne_name ELSE 0 END) AS neName", - } - for i, kid := range kpiIds { - // 特殊字段,只取最后一次收到的非0值 - if kid == "AMF.01" || kid == "UDM.01" || kid == "UDM.02" || kid == "UDM.03" || kid == "SMF.01" { - str := fmt.Sprintf("IFNULL(SUBSTRING_INDEX(GROUP_CONCAT( CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') END ), ',', 1), 0) AS '%s'", i, kid, i, kid) - fields = append(fields, str) - } else { - str := fmt.Sprintf("sum(CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') ELSE 0 END) AS '%s'", i, kid, i, kid) - fields = append(fields, str) - } - } - fieldsSql := strings.Join(fields, ",") - - // 查询数据 - if query.SortField == "" { - query.SortField = "timeGroup" - } - if query.SortOrder == "" { - query.SortOrder = "desc" - } - orderSql := fmt.Sprintf(" order by %s %s", query.SortField, query.SortOrder) - querySql := fmt.Sprintf("SELECT %s FROM %s gk %s GROUP BY timeGroup %s", fieldsSql, tableName, whereSql, orderSql) - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results -} - -// SelectGoldKPITitle 网元对应的指标名称 -func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle { - result := []model.GoldKPITitle{} - tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result) - if err := tx.Error; err != nil { - logger.Errorf("Find err => %v", err) - } - return result -} - -// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 -func (r *PerfKPIImpl) SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if neType != "" { - conditions = append(conditions, "kupf.ne_type = ?") - params = append(params, neType) - } - if rmUID != "" { - conditions = append(conditions, "kupf.rm_uid = ?") - params = append(params, rmUID) - } - if startDate != "" { - conditions = append(conditions, "kupf.created_at >= ?") - params = append(params, startDate) - } - if endDate != "" { - conditions = append(conditions, "kupf.created_at <= ?") - params = append(params, endDate) - } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := `SELECT - sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[2].kpi_id') = 'UPF.03' THEN JSON_EXTRACT(kupf.kpi_values, '$[2].value') ELSE 0 END ) AS 'up', - sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[5].kpi_id') = 'UPF.06' THEN JSON_EXTRACT(kupf.kpi_values, '$[5].value') ELSE 0 END ) AS 'down' - FROM kpi_report_upf kupf` - results, err := datasource.RawDB("", querySql+whereSql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results[0] -} diff --git a/src/modules/network_data/repository/ue_event_amf.go b/src/modules/network_data/repository/ue_event_amf.go index 4e053a01..76442b8c 100644 --- a/src/modules/network_data/repository/ue_event_amf.go +++ b/src/modules/network_data/repository/ue_event_amf.go @@ -1,15 +1,175 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// UE会话事件AMF 数据层接口 -type IUEEventAMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventAMFQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ueIds []string) []model.UEEventAMF +// 实例化数据层 UEEventAMF 结构体 +var NewUEEventAMF = &UEEventAMF{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_amf`, - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "event_type": "EventType", + "event_json": "EventJSONStr", + "created_at": "CreatedAt", + }, +} + +// UEEventAMF UE会话事件 数据层处理 +type UEEventAMF struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *UEEventAMF) convertResultRows(rows []map[string]any) []model.UEEventAMF { + arr := make([]model.UEEventAMF, 0) + for _, row := range rows { + item := model.UEEventAMF{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *UEEventAMF) SelectPage(querys model.UEEventAMFQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.EventType != "" { + eventTypes := strings.Split(querys.EventType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + if querys.IMSI != "" { + conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") + params = append(params, querys.IMSI) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.UEEventAMF{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ue_event_amf" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *UEEventAMF) SelectByIds(ueIds []string) []model.UEEventAMF { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.UEEventAMF{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventAMF) DeleteByIds(ueIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + sql := "delete from ue_event_amf where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/ue_event_amf.impl.go b/src/modules/network_data/repository/ue_event_amf.impl.go deleted file mode 100644 index b442207c..00000000 --- a/src/modules/network_data/repository/ue_event_amf.impl.go +++ /dev/null @@ -1,175 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 UEEventAMFImpl 结构体 -var NewUEEventAMFImpl = &UEEventAMFImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_amf`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "event_type": "EventType", - "event_json": "EventJSONStr", - "created_at": "CreatedAt", - }, -} - -// UEEventAMFImpl UE会话事件 数据层处理 -type UEEventAMFImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *UEEventAMFImpl) convertResultRows(rows []map[string]any) []model.UEEventAMF { - arr := make([]model.UEEventAMF, 0) - for _, row := range rows { - item := model.UEEventAMF{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *UEEventAMFImpl) SelectPage(querys model.UEEventAMFQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.EventType != "" { - eventTypes := strings.Split(querys.EventType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - if querys.IMSI != "" { - conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") - params = append(params, querys.IMSI) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.UEEventAMF{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ue_event_amf" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *UEEventAMFImpl) SelectByIds(ueIds []string) []model.UEEventAMF { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.UEEventAMF{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventAMFImpl) DeleteByIds(ueIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - sql := "delete from ue_event_amf where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/ue_event_mme.go b/src/modules/network_data/repository/ue_event_mme.go index 7a77fb18..a035f5aa 100644 --- a/src/modules/network_data/repository/ue_event_mme.go +++ b/src/modules/network_data/repository/ue_event_mme.go @@ -1,15 +1,175 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// UE会话事件MME 数据层接口 -type IUEEventMME interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventMMEQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ueIds []string) []model.UEEventMME +// 实例化数据层 UEEventMME 结构体 +var NewUEEventMME = &UEEventMME{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_mme`, - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "event_type": "EventType", + "event_json": "EventJSONStr", + "created_at": "CreatedAt", + }, +} + +// UEEventMME UE会话事件 数据层处理 +type UEEventMME struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *UEEventMME) convertResultRows(rows []map[string]any) []model.UEEventMME { + arr := make([]model.UEEventMME, 0) + for _, row := range rows { + item := model.UEEventMME{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *UEEventMME) SelectPage(querys model.UEEventMMEQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.EventType != "" { + eventTypes := strings.Split(querys.EventType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + if querys.IMSI != "" { + conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") + params = append(params, querys.IMSI) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.UEEventMME{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ue_event_mme" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *UEEventMME) SelectByIds(ueIds []string) []model.UEEventMME { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.UEEventMME{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventMME) DeleteByIds(ueIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + sql := "delete from ue_event_mme where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/ue_event_mme.impl.go b/src/modules/network_data/repository/ue_event_mme.impl.go deleted file mode 100644 index 180bc9df..00000000 --- a/src/modules/network_data/repository/ue_event_mme.impl.go +++ /dev/null @@ -1,175 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 UEEventMMEImpl 结构体 -var NewUEEventMMEImpl = &UEEventMMEImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_mme`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "event_type": "EventType", - "event_json": "EventJSONStr", - "created_at": "CreatedAt", - }, -} - -// UEEventMMEImpl UE会话事件 数据层处理 -type UEEventMMEImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *UEEventMMEImpl) convertResultRows(rows []map[string]any) []model.UEEventMME { - arr := make([]model.UEEventMME, 0) - for _, row := range rows { - item := model.UEEventMME{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *UEEventMMEImpl) SelectPage(querys model.UEEventMMEQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.EventType != "" { - eventTypes := strings.Split(querys.EventType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - if querys.IMSI != "" { - conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") - params = append(params, querys.IMSI) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.UEEventMME{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ue_event_mme" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *UEEventMMEImpl) SelectByIds(ueIds []string) []model.UEEventMME { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.UEEventMME{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventMMEImpl) DeleteByIds(ueIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - sql := "delete from ue_event_mme where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/service/alarm.go b/src/modules/network_data/service/alarm.go index 3c466ee4..3df04ead 100644 --- a/src/modules/network_data/service/alarm.go +++ b/src/modules/network_data/service/alarm.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// 告警 服务层接口 -type IAlarm interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.AlarmQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) +// 实例化数据层 Alarm 结构体 +var NewAlarm = &Alarm{ + alarmRepository: repository.NewAlarm, +} + +// Alarm 告警 服务层处理 +type Alarm struct { + alarmRepository *repository.Alarm // 告警数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *Alarm) SelectPage(querys model.AlarmQuery) map[string]any { + return r.alarmRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *Alarm) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.alarmRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(data) == len(ids) { + rows := r.alarmRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/alarm.impl.go b/src/modules/network_data/service/alarm.impl.go deleted file mode 100644 index e988ed13..00000000 --- a/src/modules/network_data/service/alarm.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 AlarmImpl 结构体 -var NewAlarmImpl = &AlarmImpl{ - alarmRepository: repository.NewAlarmImpl, -} - -// AlarmImpl 告警 服务层处理 -type AlarmImpl struct { - // 告警数据信息 - alarmRepository repository.IAlarm -} - -// SelectPage 根据条件分页查询 -func (r *AlarmImpl) SelectPage(querys model.AlarmQuery) map[string]any { - return r.alarmRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *AlarmImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.alarmRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(data) == len(ids) { - rows := r.alarmRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_ims.go b/src/modules/network_data/service/cdr_event_ims.go index 2f5be53e..922fb024 100644 --- a/src/modules/network_data/service/cdr_event_ims.go +++ b/src/modules/network_data/service/cdr_event_ims.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件IMS 服务层接口 -type ICDREventIMS interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventIMSQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventIMS 结构体 +var NewCDREventIMS = &CDREventIMS{ + cdrEventIMSRepository: repository.NewCDREventIMS, +} + +// CDREventImpl CDR会话事件IMS 服务层处理 +type CDREventIMS struct { + cdrEventIMSRepository *repository.CDREventIMS // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { + return r.cdrEventIMSRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventIMS) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventIMSRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventIMSRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_ims.impl.go b/src/modules/network_data/service/cdr_event_ims.impl.go deleted file mode 100644 index 15dfbd81..00000000 --- a/src/modules/network_data/service/cdr_event_ims.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 NewCDREventIMSImpl 结构体 -var NewCDREventIMSImpl = &CDREventIMSImpl{ - cdrEventIMSRepository: repository.NewCDREventIMSImpl, -} - -// CDREventImpl CDR会话事件IMS 服务层处理 -type CDREventIMSImpl struct { - // CDR会话事件数据信息 - cdrEventIMSRepository repository.ICDREventIMS -} - -// SelectPage 根据条件分页查询 -func (r *CDREventIMSImpl) SelectPage(querys model.CDREventIMSQuery) map[string]any { - return r.cdrEventIMSRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventIMSImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventIMSRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventIMSRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_smf.go b/src/modules/network_data/service/cdr_event_smf.go index 1e55a690..abd30a85 100644 --- a/src/modules/network_data/service/cdr_event_smf.go +++ b/src/modules/network_data/service/cdr_event_smf.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件SMF 服务层接口 -type ICDREventSMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMFQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventSMF 结构体 +var NewCDREventSMF = &CDREventSMF{ + cdrEventRepository: repository.NewCDREventSMF, +} + +// CDREventSMF CDR会话事件SMF 服务层处理 +type CDREventSMF struct { + cdrEventRepository *repository.CDREventSMF // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { + return r.cdrEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMF) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_smf.impl.go b/src/modules/network_data/service/cdr_event_smf.impl.go deleted file mode 100644 index 09d2e48a..00000000 --- a/src/modules/network_data/service/cdr_event_smf.impl.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -var NewCDREventSMFImpl = &CDREventSMFImpl{ - cdrEventRepository: repository.NewCDREventSMFImpl, -} - -type CDREventSMFImpl struct { - // CDR会话事件数据信息 - cdrEventRepository repository.ICDREventSMF -} - -func (r *CDREventSMFImpl) SelectPage(querys model.CDREventSMFQuery) map[string]any { - return r.cdrEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMFImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_smsc.go b/src/modules/network_data/service/cdr_event_smsc.go index 472ffea7..39448874 100644 --- a/src/modules/network_data/service/cdr_event_smsc.go +++ b/src/modules/network_data/service/cdr_event_smsc.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件SMSC 服务层接口 -type ICDREventSMSC interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMSCQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventSMSC 结构体 +var NewCDREventSMSC = &CDREventSMSC{ + cdrEventRepository: repository.NewCDREventSMSC, +} + +// CDREventSMSC CDR会话事件SMSC 服务层处理 +type CDREventSMSC struct { + cdrEventRepository *repository.CDREventSMSC // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any { + return r.cdrEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMSC) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_smsc.impl.go b/src/modules/network_data/service/cdr_event_smsc.impl.go deleted file mode 100644 index b2d27f3d..00000000 --- a/src/modules/network_data/service/cdr_event_smsc.impl.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -var NewCDREventSMSCImpl = &CDREventSMSCImpl{ - cdrEventRepository: repository.NewCDREventSMSCImpl, -} - -type CDREventSMSCImpl struct { - // CDR会话事件数据信息 - cdrEventRepository repository.ICDREventSMSC -} - -func (r *CDREventSMSCImpl) SelectPage(querys model.CDREventSMSCQuery) map[string]any { - return r.cdrEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMSCImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/perf_kpi.go b/src/modules/network_data/service/perf_kpi.go index fcd7d768..b4aef0c4 100644 --- a/src/modules/network_data/service/perf_kpi.go +++ b/src/modules/network_data/service/perf_kpi.go @@ -1,15 +1,79 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "encoding/json" + "fmt" + "time" -// 性能统计 服务层接口 -type IPerfKPI interface { - // SelectGoldKPI 通过网元指标数据信息 - SelectGoldKPI(query model.GoldKPIQuery) []map[string]any + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // SelectGoldKPITitle 网元对应的指标名称 - SelectGoldKPITitle(neType string) []model.GoldKPITitle - - // SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 - SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any +// 实例化数据层 PerfKPI 结构体 +var NewPerfKPI = &PerfKPI{ + perfKPIRepository: repository.NewPerfKPI, +} + +// PerfKPI 性能统计 服务层处理 +type PerfKPI struct { + perfKPIRepository *repository.PerfKPI // 性能统计数据信息 +} + +// SelectGoldKPI 通过网元指标数据信息 +func (r *PerfKPI) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any { + // 获取数据指标id + var kpiIds []string + kpiTitles := r.perfKPIRepository.SelectGoldKPITitle(query.NeType) + for _, kpiId := range kpiTitles { + kpiIds = append(kpiIds, kpiId.KPIID) + } + + data := r.perfKPIRepository.SelectGoldKPI(query, kpiIds) + if data == nil { + return []map[string]any{} + } + return data +} + +// SelectGoldKPITitle 网元对应的指标名称 +func (r *PerfKPI) SelectGoldKPITitle(neType string) []model.GoldKPITitle { + return r.perfKPIRepository.SelectGoldKPITitle(neType) +} + +// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 +func (r *PerfKPI) SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any { + now := time.Now() + // 获取当前日期 + endDate := fmt.Sprint(now.UnixMilli()) + // 将当前日期前几天数 + startDate := fmt.Sprint(now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()) + + var info map[string]any + + // 读取缓存数据 小于2分钟重新缓存 + key := fmt.Sprintf("%sUPF:totalFlow:%s_%d", cachekey.NE_DATA_KEY, rmUID, day) + infoStr, _ := redis.Get("", key) + if infoStr != "" { + json.Unmarshal([]byte(infoStr), &info) + expireSecond, _ := redis.GetExpire("", key) + if expireSecond > 120 { + return info + } + } + // down * 8 / 1000 / 1000 单位M + info = r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) + if v, ok := info["up"]; ok && v == nil { + info["up"] = 0 + } + if v, ok := info["down"]; ok && v == nil { + info["down"] = 0 + } + + // 保存到缓存 + infoJSON, _ := json.Marshal(info) + redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute) + + return info } diff --git a/src/modules/network_data/service/perf_kpi.impl.go b/src/modules/network_data/service/perf_kpi.impl.go deleted file mode 100644 index f34f5508..00000000 --- a/src/modules/network_data/service/perf_kpi.impl.go +++ /dev/null @@ -1,80 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "time" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/redis" - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 PerfKPIImpl 结构体 -var NewPerfKPIImpl = &PerfKPIImpl{ - perfKPIRepository: repository.NewPerfKPIImpl, -} - -// PerfKPIImpl 性能统计 服务层处理 -type PerfKPIImpl struct { - // 性能统计数据信息 - perfKPIRepository repository.IPerfKPI -} - -// SelectGoldKPI 通过网元指标数据信息 -func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any { - // 获取数据指标id - var kpiIds []string - kpiTitles := r.perfKPIRepository.SelectGoldKPITitle(query.NeType) - for _, kpiId := range kpiTitles { - kpiIds = append(kpiIds, kpiId.KPIID) - } - - data := r.perfKPIRepository.SelectGoldKPI(query, kpiIds) - if data == nil { - return []map[string]any{} - } - return data -} - -// SelectGoldKPITitle 网元对应的指标名称 -func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle { - return r.perfKPIRepository.SelectGoldKPITitle(neType) -} - -// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 -func (r *PerfKPIImpl) SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any { - now := time.Now() - // 获取当前日期 - endDate := fmt.Sprint(now.UnixMilli()) - // 将当前日期前几天数 - startDate := fmt.Sprint(now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()) - - var info map[string]any - - // 读取缓存数据 小于2分钟重新缓存 - key := fmt.Sprintf("%sUPF:totalFlow:%s_%d", cachekey.NE_DATA_KEY, rmUID, day) - infoStr, _ := redis.Get("", key) - if infoStr != "" { - json.Unmarshal([]byte(infoStr), &info) - expireSecond, _ := redis.GetExpire("", key) - if expireSecond > 120 { - return info - } - } - // down * 8 / 1000 / 1000 单位M - info = r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) - if v, ok := info["up"]; ok && v == nil { - info["up"] = 0 - } - if v, ok := info["down"]; ok && v == nil { - info["down"] = 0 - } - - // 保存到缓存 - infoJSON, _ := json.Marshal(info) - redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute) - - return info -} diff --git a/src/modules/network_data/service/ue_event_amf.go b/src/modules/network_data/service/ue_event_amf.go index e5f77a63..29fdec2d 100644 --- a/src/modules/network_data/service/ue_event_amf.go +++ b/src/modules/network_data/service/ue_event_amf.go @@ -1,12 +1,40 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// UE会话事件AMF 服务层接口 -type IUEEventAMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventAMFQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) (int64, error) +// 实例化数据层 UEEventAMF 结构体 +var NewUEEventAMF = &UEEventAMF{ + ueEventRepository: repository.NewUEEventAMF, +} + +// UEEventAMF UE会话事件AMF 服务层处理 +type UEEventAMF struct { + // UE会话事件数据信息 + ueEventRepository *repository.UEEventAMF +} + +// SelectPage 根据条件分页查询 +func (r *UEEventAMF) SelectPage(querys model.UEEventAMFQuery) map[string]any { + return r.ueEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventAMF) DeleteByIds(ueIds []string) (int64, error) { + // 检查是否存在 + ids := r.ueEventRepository.SelectByIds(ueIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(ids) == len(ueIds) { + rows := r.ueEventRepository.DeleteByIds(ueIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/ue_event_amf.impl.go b/src/modules/network_data/service/ue_event_amf.impl.go deleted file mode 100644 index 8d5f61c9..00000000 --- a/src/modules/network_data/service/ue_event_amf.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 UEEventMMEImpl 结构体 -var NewUEEventMMEImpl = &UEEventMMEImpl{ - ueEventRepository: repository.NewUEEventMMEImpl, -} - -// UEEventMMEImpl UE会话事件MME 服务层处理 -type UEEventMMEImpl struct { - // UE会话事件数据信息 - ueEventRepository repository.IUEEventMME -} - -// SelectPage 根据条件分页查询 -func (r *UEEventMMEImpl) SelectPage(querys model.UEEventMMEQuery) map[string]any { - return r.ueEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventMMEImpl) DeleteByIds(ueIds []string) (int64, error) { - // 检查是否存在 - ids := r.ueEventRepository.SelectByIds(ueIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(ids) == len(ueIds) { - rows := r.ueEventRepository.DeleteByIds(ueIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/ue_event_mme.go b/src/modules/network_data/service/ue_event_mme.go index d4b5dd86..dd034b25 100644 --- a/src/modules/network_data/service/ue_event_mme.go +++ b/src/modules/network_data/service/ue_event_mme.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// UE会话事件MME 服务层接口 -type IUEEventMME interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventMMEQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) (int64, error) +// 实例化数据层 UEEventMME 结构体 +var NewUEEventMME = &UEEventMME{ + ueEventRepository: repository.NewUEEventMME, +} + +// UEEventMME UE会话事件MME 服务层处理 +type UEEventMME struct { + ueEventRepository *repository.UEEventMME // UE会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *UEEventMME) SelectPage(querys model.UEEventMMEQuery) map[string]any { + return r.ueEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventMME) DeleteByIds(ueIds []string) (int64, error) { + // 检查是否存在 + ids := r.ueEventRepository.SelectByIds(ueIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(ids) == len(ueIds) { + rows := r.ueEventRepository.DeleteByIds(ueIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/ue_event_mme.impl.go b/src/modules/network_data/service/ue_event_mme.impl.go deleted file mode 100644 index 9c7e0710..00000000 --- a/src/modules/network_data/service/ue_event_mme.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 UEEventAMFImpl 结构体 -var NewUEEventAMFImpl = &UEEventAMFImpl{ - ueEventRepository: repository.NewUEEventAMFImpl, -} - -// UEEventAMFImpl UE会话事件AMF 服务层处理 -type UEEventAMFImpl struct { - // UE会话事件数据信息 - ueEventRepository repository.IUEEventAMF -} - -// SelectPage 根据条件分页查询 -func (r *UEEventAMFImpl) SelectPage(querys model.UEEventAMFQuery) map[string]any { - return r.ueEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventAMFImpl) DeleteByIds(ueIds []string) (int64, error) { - // 检查是否存在 - ids := r.ueEventRepository.SelectByIds(ueIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(ids) == len(ueIds) { - rows := r.ueEventRepository.DeleteByIds(ueIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_element/controller/action.go b/src/modules/network_element/controller/action.go index 0d121b7d..7d6ebc6f 100644 --- a/src/modules/network_element/controller/action.go +++ b/src/modules/network_element/controller/action.go @@ -20,7 +20,7 @@ import ( // 实例化控制层 NeActionController 结构体 var NewNeAction = &NeActionController{ - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // 网元处理请求 @@ -28,7 +28,7 @@ var NewNeAction = &NeActionController{ // PATH /action type NeActionController struct { // 网元信息服务 - neInfoService neService.INeInfo + neInfoService *neService.NeInfo } // 发送文件从本地到网元 diff --git a/src/modules/network_element/controller/ne_config.go b/src/modules/network_element/controller/ne_config.go index e1d737bb..c6c25be6 100644 --- a/src/modules/network_element/controller/ne_config.go +++ b/src/modules/network_element/controller/ne_config.go @@ -18,18 +18,16 @@ import ( // NewNeConfig 网元参数配置 实例化控制层 var NewNeConfig = &NeConfigController{ - neConfigService: neService.NewNeConfigImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigService: neService.NewNeConfig, + neInfoService: neService.NewNeInfo, } // 网元参数配置 // // PATH /config type NeConfigController struct { - // 网元参数配置可用属性值服务 - neConfigService neService.INeConfig - // 网元信息服务 - neInfoService neService.INeInfo + neConfigService *neService.NeConfig // 网元参数配置可用属性值服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元参数配置可用属性值列表 diff --git a/src/modules/network_element/controller/ne_config_backup.go b/src/modules/network_element/controller/ne_config_backup.go index 1ba1870c..90937dc3 100644 --- a/src/modules/network_element/controller/ne_config_backup.go +++ b/src/modules/network_element/controller/ne_config_backup.go @@ -18,18 +18,16 @@ import ( // NewNeConfigBackup 实例化控制层 NeConfigBackupController 结构体 var NewNeConfigBackup = &NeConfigBackupController{ - neConfigBackupService: neService.NewNeConfigBackupImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigBackupService: neService.NewNeConfigBackup, + neInfoService: neService.NewNeInfo, } // 网元配置文件备份记录 // // PATH /config/backup type NeConfigBackupController struct { - // 网元配置文件备份记录服务 - neConfigBackupService neService.INeConfigBackup - // 网元信息服务 - neInfoService neService.INeInfo + neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元配置文件备份记录列表 diff --git a/src/modules/network_element/controller/ne_host.go b/src/modules/network_element/controller/ne_host.go index 7f8b9cdc..3b9c1871 100644 --- a/src/modules/network_element/controller/ne_host.go +++ b/src/modules/network_element/controller/ne_host.go @@ -17,15 +17,14 @@ import ( // 实例化控制层 NeHostController 结构体 var NewNeHost = &NeHostController{ - neHostService: neService.NewNeHostImpl, + neHostService: neService.NewNeHost, } // 网元主机连接请求 // // PATH /host type NeHostController struct { - // 网元主机连接服务 - neHostService neService.INeHost + neHostService *neService.NeHost // 网元主机连接服务 } // 网元主机列表 diff --git a/src/modules/network_element/controller/ne_host_cmd.go b/src/modules/network_element/controller/ne_host_cmd.go index f817a59a..31031da5 100644 --- a/src/modules/network_element/controller/ne_host_cmd.go +++ b/src/modules/network_element/controller/ne_host_cmd.go @@ -15,15 +15,14 @@ import ( // 实例化控制层 NeHostCmdController 结构体 var NewNeHostCmd = &NeHostCmdController{ - neHostCmdService: neService.NewNeHostCmdImpl, + neHostCmdService: neService.NewNeHostCmd, } // 网元主机命令请求 // // PATH /hostCmd type NeHostCmdController struct { - // 网元主机命令服务 - neHostCmdService neService.INeHostCmd + neHostCmdService *neService.NeHostCmd // 网元主机命令服务 } // 网元主机命令列表 diff --git a/src/modules/network_element/controller/ne_info.go b/src/modules/network_element/controller/ne_info.go index 001b778a..c2ce7ab3 100644 --- a/src/modules/network_element/controller/ne_info.go +++ b/src/modules/network_element/controller/ne_info.go @@ -18,8 +18,8 @@ import ( // 实例化控制层 NeInfoController 结构体 var NewNeInfo = &NeInfoController{ - neInfoService: neService.NewNeInfoImpl, - neLicenseService: neService.NewNeLicenseImpl, + neInfoService: neService.NewNeInfo, + neLicenseService: neService.NewNeLicense, neVersionService: neService.NewNeVersion, } @@ -27,12 +27,9 @@ var NewNeInfo = &NeInfoController{ // // PATH /info type NeInfoController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 网元授权激活信息服务 - neLicenseService neService.INeLicense - // 网元版本信息服务 - neVersionService *neService.NeVersion + neInfoService *neService.NeInfo // 网元信息服务 + neLicenseService *neService.NeLicense // 网元授权激活信息服务 + neVersionService *neService.NeVersion // 网元版本信息服务 } // neStateCacheMap 网元状态缓存最后一次成功的信息 diff --git a/src/modules/network_element/controller/ne_license.go b/src/modules/network_element/controller/ne_license.go index 3b4dd4ce..4ddf1ed5 100644 --- a/src/modules/network_element/controller/ne_license.go +++ b/src/modules/network_element/controller/ne_license.go @@ -15,18 +15,16 @@ import ( // 实例化控制层 NeLicenseController 结构体 var NewNeLicense = &NeLicenseController{ - neLicenseService: neService.NewNeLicenseImpl, - neInfoService: neService.NewNeInfoImpl, + neLicenseService: neService.NewNeLicense, + neInfoService: neService.NewNeInfo, } // 网元授权激活请求 // // PATH /license type NeLicenseController struct { - // 网元授权激活服务 - neLicenseService neService.INeLicense - // 网元信息服务 - neInfoService neService.INeInfo + neLicenseService *neService.NeLicense // 网元授权激活服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元授权激活列表 diff --git a/src/modules/network_element/controller/ne_software.go b/src/modules/network_element/controller/ne_software.go index fb15beb8..25c05803 100644 --- a/src/modules/network_element/controller/ne_software.go +++ b/src/modules/network_element/controller/ne_software.go @@ -15,15 +15,14 @@ import ( // 实例化控制层 NeSoftwareController 结构体 var NewNeSoftware = &NeSoftwareController{ - neSoftwareService: neService.NewNeSoftwareImpl, + neSoftwareService: neService.NewNeSoftware, } // 网元软件包请求 // // PATH /software type NeSoftwareController struct { - // 网元软件包服务 - neSoftwareService neService.INeSoftware + neSoftwareService *neService.NeSoftware // 网元软件包服务 } // 网元软件包列表 diff --git a/src/modules/network_element/controller/ne_version.go b/src/modules/network_element/controller/ne_version.go index 366e30c2..366c9891 100644 --- a/src/modules/network_element/controller/ne_version.go +++ b/src/modules/network_element/controller/ne_version.go @@ -18,8 +18,7 @@ var NewNeVersion = &NeVersionController{ // // PATH /version type NeVersionController struct { - // 网元版本服务 - neVersionService *neService.NeVersion + neVersionService *neService.NeVersion // 网元版本服务 } // 网元版本列表 diff --git a/src/modules/network_element/network_element.go b/src/modules/network_element/network_element.go index 89cd4624..8dc59a6d 100644 --- a/src/modules/network_element/network_element.go +++ b/src/modules/network_element/network_element.go @@ -351,13 +351,13 @@ func Setup(router *gin.Engine) { // InitLoad 初始参数 func InitLoad() { // 启动时,清除缓存-网元类型 - service.NewNeInfoImpl.ClearNeCacheByNeType("*") - service.NewNeInfoImpl.SelectNeInfoByRmuid("") + service.NewNeInfo.ClearNeCacheByNeType("*") + service.NewNeInfo.SelectNeInfoByRmuid("") // 启动时,网元公共参数数据记录到全局变量 - if para5GMap, err := service.NewNeInfoImpl.NeConfPara5GRead(); para5GMap != nil && err == nil { - service.NewNeInfoImpl.NeConfPara5GWirte(para5GMap, nil) + if para5GMap, err := service.NewNeInfo.NeConfPara5GRead(); para5GMap != nil && err == nil { + service.NewNeInfo.NeConfPara5GWirte(para5GMap, nil) } // 启动时,清除缓存-网元参数配置可用属性值 - service.NewNeConfigImpl.ClearNeCacheByNeType("*") - service.NewNeConfigImpl.RefreshByNeTypeAndNeID("*") + service.NewNeConfig.ClearNeCacheByNeType("*") + service.NewNeConfig.RefreshByNeTypeAndNeID("*") } diff --git a/src/modules/network_element/repository/ne_config.go b/src/modules/network_element/repository/ne_config.go index 5f555b3e..29ea68f5 100644 --- a/src/modules/network_element/repository/ne_config.go +++ b/src/modules/network_element/repository/ne_config.go @@ -1,24 +1,259 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "strings" + "time" -// INeConfig 网元参数配置可用属性值 数据层接口 -type INeConfig interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(param model.NeConfig) []model.NeConfig +// 实例化数据层 NeConfig 结构体 +var NewNeConfig = &NeConfig{ + selectSql: `select id, ne_type, param_name, param_display, param_type, param_json, param_sort, param_perms, update_time from ne_config`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeConfig - - // Insert 新增信息 - Insert(param model.NeConfig) string - - // Update 修改信息 - Update(param model.NeConfig) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "param_name": "ParamName", + "param_display": "ParamDisplay", + "param_type": "ParamType", + "param_json": "ParamJson", + "param_sort": "ParamSort", + "param_perms": "ParamPerms", + "update_time": "UpdateTime", + }, +} + +// NeConfig 网元参数配置可用属性值 数据层处理 +type NeConfig struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeConfig) convertResultRows(rows []map[string]any) []model.NeConfig { + arr := make([]model.NeConfig, 0) + for _, row := range rows { + item := model.NeConfig{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeConfig) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, v) + } + if v, ok := query["paramName"]; ok && v != "" { + conditions = append(conditions, "param_name = ?") + params = append(params, v) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(id) as 'total' from ne_config" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { + // 查询条件拼接 + var conditions []string + var params []any + if param.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, param.NeType) + } + if param.ParamName != "" { + conditions = append(conditions, "param_name = ?") + params = append(params, param.ParamName) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by param_sort asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeConfig) SelectByIds(ids []string) []model.NeConfig { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeConfig{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeConfig) Insert(param model.NeConfig) string { + // 参数拼接 + params := make(map[string]any) + if param.NeType != "" { + params["ne_type"] = param.NeType + } + if param.ParamName != "" { + params["param_name"] = param.ParamName + } + if param.ParamDisplay != "" { + params["param_display"] = param.ParamDisplay + } + if param.ParamType != "" { + params["param_type"] = param.ParamType + } + if param.ParamJson != "" { + params["param_json"] = param.ParamJson + } + params["param_sort"] = param.ParamSort + if param.ParamPerms != "" { + params["param_perms"] = param.ParamPerms + } + params["update_time"] = time.Now().UnixMilli() + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_config (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeConfig) Update(param model.NeConfig) int64 { + // 参数拼接 + params := make(map[string]any) + if param.NeType != "" { + params["ne_type"] = param.NeType + } + if param.ParamName != "" { + params["param_name"] = param.ParamName + } + if param.ParamDisplay != "" { + params["param_display"] = param.ParamDisplay + } + if param.ParamType != "" { + params["param_type"] = param.ParamType + } + if param.ParamJson != "" { + params["param_json"] = param.ParamJson + } + params["param_sort"] = param.ParamSort + if param.ParamPerms != "" { + params["param_perms"] = param.ParamPerms + } + params["update_time"] = time.Now().UnixMilli() + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_config set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, param.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeConfig) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from ne_config where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_config.impl.go b/src/modules/network_element/repository/ne_config.impl.go deleted file mode 100644 index d7a845ef..00000000 --- a/src/modules/network_element/repository/ne_config.impl.go +++ /dev/null @@ -1,259 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// NewNeConfigImpl 网元参数配置可用属性值 实例化数据层 -var NewNeConfigImpl = &NeConfigImpl{ - selectSql: `select id, ne_type, param_name, param_display, param_type, param_json, param_sort, param_perms, update_time from ne_config`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "param_name": "ParamName", - "param_display": "ParamDisplay", - "param_type": "ParamType", - "param_json": "ParamJson", - "param_sort": "ParamSort", - "param_perms": "ParamPerms", - "update_time": "UpdateTime", - }, -} - -// NeConfigImpl 网元参数配置可用属性值 数据层处理 -type NeConfigImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeConfigImpl) convertResultRows(rows []map[string]any) []model.NeConfig { - arr := make([]model.NeConfig, 0) - for _, row := range rows { - item := model.NeConfig{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeConfigImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, v) - } - if v, ok := query["paramName"]; ok && v != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(id) as 'total' from ne_config" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeConfigImpl) SelectList(param model.NeConfig) []model.NeConfig { - // 查询条件拼接 - var conditions []string - var params []any - if param.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, param.NeType) - } - if param.ParamName != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, param.ParamName) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by param_sort asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigImpl) SelectByIds(ids []string) []model.NeConfig { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeConfig{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeConfigImpl) Insert(param model.NeConfig) string { - // 参数拼接 - params := make(map[string]any) - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJson != "" { - params["param_json"] = param.ParamJson - } - params["param_sort"] = param.ParamSort - if param.ParamPerms != "" { - params["param_perms"] = param.ParamPerms - } - params["update_time"] = time.Now().UnixMilli() - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_config (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeConfigImpl) Update(param model.NeConfig) int64 { - // 参数拼接 - params := make(map[string]any) - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJson != "" { - params["param_json"] = param.ParamJson - } - params["param_sort"] = param.ParamSort - if param.ParamPerms != "" { - params["param_perms"] = param.ParamPerms - } - params["update_time"] = time.Now().UnixMilli() - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_config set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, param.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from ne_config where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_config_backup.go b/src/modules/network_element/repository/ne_config_backup.go index 131f363d..3354034d 100644 --- a/src/modules/network_element/repository/ne_config_backup.go +++ b/src/modules/network_element/repository/ne_config_backup.go @@ -1,24 +1,262 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "strings" + "time" -// INeConfigBackup 网元配置文件备份记录 数据层接口 -type INeConfigBackup interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(item model.NeConfigBackup) []model.NeConfigBackup +// 实例化数据层 NeConfigBackup 结构体 +var NewNeConfigBackup = &NeConfigBackup{ + selectSql: `select + id, ne_type, ne_id, name, path, remark, create_by, create_time, update_by, update_time + from ne_config_backup`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeConfigBackup - - // Insert 新增信息 - Insert(item model.NeConfigBackup) string - - // Update 修改信息 - Update(item model.NeConfigBackup) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "name": "Name", + "path": "Path", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeConfigBackup 网元配置文件备份记录 数据层处理 +type NeConfigBackup struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeConfigBackup) convertResultRows(rows []map[string]any) []model.NeConfigBackup { + arr := make([]model.NeConfigBackup, 0) + for _, row := range rows { + item := model.NeConfigBackup{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["name"]; ok && v != "" { + conditions = append(conditions, "name like concat(concat('%', ?), '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_config_backup" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " order by id desc limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { + // 查询条件拼接 + var conditions []string + var params []any + if item.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, item.NeType) + } + if item.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, item.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeConfigBackup) SelectByIds(cmdIds []string) []model.NeConfigBackup { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeConfigBackup{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeConfigBackup) Insert(item model.NeConfigBackup) string { + // 参数拼接 + params := make(map[string]any) + if item.NeType != "" { + params["ne_type"] = item.NeType + } + if item.NeId != "" { + params["ne_id"] = item.NeId + } + if item.Name != "" { + params["name"] = item.Name + } + if item.Path != "" { + params["path"] = item.Path + } + if item.Remark != "" { + params["remark"] = item.Remark + } + if item.CreateBy != "" { + params["create_by"] = item.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_config_backup (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeConfigBackup) Update(item model.NeConfigBackup) int64 { + // 参数拼接 + params := make(map[string]any) + if item.NeType != "" { + params["ne_type"] = item.NeType + } + if item.NeId != "" { + params["ne_id"] = item.NeId + } + if item.Name != "" { + params["name"] = item.Name + } + if item.Path != "" { + params["path"] = item.Path + } + params["remark"] = item.Remark + if item.UpdateBy != "" { + params["update_by"] = item.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_config_backup set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, item.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeConfigBackup) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from ne_config_backup where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_config_backup.impl.go b/src/modules/network_element/repository/ne_config_backup.impl.go deleted file mode 100644 index 17331822..00000000 --- a/src/modules/network_element/repository/ne_config_backup.impl.go +++ /dev/null @@ -1,262 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeConfigBackupImpl 结构体 -var NewNeConfigBackupImpl = &NeConfigBackupImpl{ - selectSql: `select - id, ne_type, ne_id, name, path, remark, create_by, create_time, update_by, update_time - from ne_config_backup`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "name": "Name", - "path": "Path", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeConfigBackupImpl 网元配置文件备份记录 数据层处理 -type NeConfigBackupImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeConfigBackupImpl) convertResultRows(rows []map[string]any) []model.NeConfigBackup { - arr := make([]model.NeConfigBackup, 0) - for _, row := range rows { - item := model.NeConfigBackup{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeConfigBackupImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["name"]; ok && v != "" { - conditions = append(conditions, "name like concat(concat('%', ?), '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_config_backup" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeConfigBackupImpl) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { - // 查询条件拼接 - var conditions []string - var params []any - if item.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, item.NeType) - } - if item.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, item.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigBackupImpl) SelectByIds(cmdIds []string) []model.NeConfigBackup { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeConfigBackup{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeConfigBackupImpl) Insert(item model.NeConfigBackup) string { - // 参数拼接 - params := make(map[string]any) - if item.NeType != "" { - params["ne_type"] = item.NeType - } - if item.NeId != "" { - params["ne_id"] = item.NeId - } - if item.Name != "" { - params["name"] = item.Name - } - if item.Path != "" { - params["path"] = item.Path - } - if item.Remark != "" { - params["remark"] = item.Remark - } - if item.CreateBy != "" { - params["create_by"] = item.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_config_backup (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeConfigBackupImpl) Update(item model.NeConfigBackup) int64 { - // 参数拼接 - params := make(map[string]any) - if item.NeType != "" { - params["ne_type"] = item.NeType - } - if item.NeId != "" { - params["ne_id"] = item.NeId - } - if item.Name != "" { - params["name"] = item.Name - } - if item.Path != "" { - params["path"] = item.Path - } - params["remark"] = item.Remark - if item.UpdateBy != "" { - params["update_by"] = item.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_config_backup set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, item.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigBackupImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from ne_config_backup where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_host.go b/src/modules/network_element/repository/ne_host.go index a61fb968..ca957179 100644 --- a/src/modules/network_element/repository/ne_host.go +++ b/src/modules/network_element/repository/ne_host.go @@ -1,27 +1,376 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeHost 网元主机连接 数据层接口 -type INeHost interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neHost model.NeHost) []model.NeHost +// 实例化数据层 NeHost 结构体 +var NewNeHost = &NeHost{ + selectSql: `select + host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, remark, create_by, create_time, update_by, update_time + from ne_host`, - // SelectByIds 通过ID查询 - SelectByIds(hostIds []string) []model.NeHost - - // Insert 新增信息 - Insert(neHost model.NeHost) string - - // Update 修改信息 - Update(neHost model.NeHost) int64 - - // DeleteByIds 批量删除网元主机连接信息 - DeleteByIds(hostIds []string) int64 - - // CheckUniqueNeHost 校验主机是否唯一 - CheckUniqueNeHost(neHost model.NeHost) string + resultMap: map[string]string{ + "host_id": "HostID", + "host_type": "HostType", + "group_id": "GroupID", + "title": "Title", + "addr": "Addr", + "port": "Port", + "user": "User", + "auth_mode": "AuthMode", + "password": "Password", + "private_key": "PrivateKey", + "private_password": "PassPhrase", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeHost 网元主机连接 数据层处理 +type NeHost struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeHost) convertResultRows(rows []map[string]any) []model.NeHost { + arr := make([]model.NeHost, 0) + for _, row := range rows { + item := model.NeHost{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeHost) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["hostType"]; ok && v != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["groupId"]; ok && v != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["title"]; ok && v != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_host" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost { + // 查询条件拼接 + var conditions []string + var params []any + if neHost.HostType != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, neHost.HostType) + } + if neHost.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHost.GroupID) + } + if neHost.Title != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, neHost.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by update_time asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeHost) SelectByIds(hostIds []string) []model.NeHost { + placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) + querySql := r.selectSql + " where host_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(hostIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeHost{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueNeHost 校验主机是否唯一 +func (r *NeHost) CheckUniqueNeHost(neHost model.NeHost) string { + // 查询条件拼接 + var conditions []string + var params []any + if neHost.HostType != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, neHost.HostType) + } + if neHost.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHost.GroupID) + } + if neHost.Title != "" { + conditions = append(conditions, "title = ?") + params = append(params, neHost.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeHost) Insert(neHost model.NeHost) string { + // 参数拼接 + params := make(map[string]any) + if neHost.HostType != "" { + params["host_type"] = neHost.HostType + } + if neHost.GroupID != "" { + params["group_id"] = neHost.GroupID + } + if neHost.Title != "" { + params["title"] = neHost.Title + } + if neHost.Addr != "" { + params["addr"] = neHost.Addr + } + if neHost.Port > 0 { + params["port"] = neHost.Port + } + if neHost.User != "" { + params["user"] = neHost.User + } + if neHost.AuthMode != "" { + params["auth_mode"] = neHost.AuthMode + } + if neHost.Password != "" { + params["password"] = neHost.Password + } + if neHost.PrivateKey != "" { + params["private_key"] = neHost.PrivateKey + } + if neHost.PassPhrase != "" { + params["pass_phrase"] = neHost.PassPhrase + } + if neHost.Remark != "" { + params["remark"] = neHost.Remark + } + if neHost.CreateBy != "" { + params["create_by"] = neHost.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 根据认证模式清除不必要的信息 + if neHost.AuthMode == "0" { + params["private_key"] = "" + params["pass_phrase"] = "" + } + if neHost.AuthMode == "1" { + params["password"] = "" + } + if neHost.AuthMode == "2" { + params["password"] = "" + params["private_key"] = "" + params["pass_phrase"] = "" + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_host (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeHost) Update(neHost model.NeHost) int64 { + // 参数拼接 + params := make(map[string]any) + if neHost.HostType != "" { + params["host_type"] = neHost.HostType + } + if neHost.GroupID != "" { + params["group_id"] = neHost.GroupID + } + if neHost.Title != "" { + params["title"] = neHost.Title + } + if neHost.Addr != "" { + params["addr"] = neHost.Addr + } + if neHost.Port > 0 { + params["port"] = neHost.Port + } + if neHost.User != "" { + params["user"] = neHost.User + } + if neHost.AuthMode != "" { + params["auth_mode"] = neHost.AuthMode + } + if neHost.Password != "" { + params["password"] = neHost.Password + } + if neHost.PrivateKey != "" { + params["private_key"] = neHost.PrivateKey + } + if neHost.PassPhrase != "" { + params["pass_phrase"] = neHost.PassPhrase + } + params["remark"] = neHost.Remark + if neHost.UpdateBy != "" { + params["update_by"] = neHost.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 根据认证模式清除不必要的信息 + if neHost.AuthMode == "0" { + params["private_key"] = "" + params["pass_phrase"] = "" + } + if neHost.AuthMode == "1" { + params["password"] = "" + } + if neHost.AuthMode == "2" { + params["password"] = "" + params["private_key"] = "" + params["pass_phrase"] = "" + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_host set " + strings.Join(keys, ",") + " where host_id = ?" + + // 执行更新 + values = append(values, neHost.HostID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除网元主机连接信息 +func (r *NeHost) DeleteByIds(hostIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) + sql := "delete from ne_host where host_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(hostIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_host.impl.go b/src/modules/network_element/repository/ne_host.impl.go deleted file mode 100644 index 5988ad94..00000000 --- a/src/modules/network_element/repository/ne_host.impl.go +++ /dev/null @@ -1,376 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeHostImpl 结构体 -var NewNeHostImpl = &NeHostImpl{ - selectSql: `select - host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, remark, create_by, create_time, update_by, update_time - from ne_host`, - - resultMap: map[string]string{ - "host_id": "HostID", - "host_type": "HostType", - "group_id": "GroupID", - "title": "Title", - "addr": "Addr", - "port": "Port", - "user": "User", - "auth_mode": "AuthMode", - "password": "Password", - "private_key": "PrivateKey", - "private_password": "PassPhrase", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeHostImpl 网元主机连接 数据层处理 -type NeHostImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeHostImpl) convertResultRows(rows []map[string]any) []model.NeHost { - arr := make([]model.NeHost, 0) - for _, row := range rows { - item := model.NeHost{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeHostImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["hostType"]; ok && v != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["groupId"]; ok && v != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_host" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeHostImpl) SelectList(neHost model.NeHost) []model.NeHost { - // 查询条件拼接 - var conditions []string - var params []any - if neHost.HostType != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, neHost.HostType) - } - if neHost.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHost.GroupID) - } - if neHost.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, neHost.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by update_time asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeHostImpl) SelectByIds(hostIds []string) []model.NeHost { - placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) - querySql := r.selectSql + " where host_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(hostIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeHost{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueNeHost 校验主机是否唯一 -func (r *NeHostImpl) CheckUniqueNeHost(neHost model.NeHost) string { - // 查询条件拼接 - var conditions []string - var params []any - if neHost.HostType != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, neHost.HostType) - } - if neHost.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHost.GroupID) - } - if neHost.Title != "" { - conditions = append(conditions, "title = ?") - params = append(params, neHost.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeHostImpl) Insert(neHost model.NeHost) string { - // 参数拼接 - params := make(map[string]any) - if neHost.HostType != "" { - params["host_type"] = neHost.HostType - } - if neHost.GroupID != "" { - params["group_id"] = neHost.GroupID - } - if neHost.Title != "" { - params["title"] = neHost.Title - } - if neHost.Addr != "" { - params["addr"] = neHost.Addr - } - if neHost.Port > 0 { - params["port"] = neHost.Port - } - if neHost.User != "" { - params["user"] = neHost.User - } - if neHost.AuthMode != "" { - params["auth_mode"] = neHost.AuthMode - } - if neHost.Password != "" { - params["password"] = neHost.Password - } - if neHost.PrivateKey != "" { - params["private_key"] = neHost.PrivateKey - } - if neHost.PassPhrase != "" { - params["pass_phrase"] = neHost.PassPhrase - } - if neHost.Remark != "" { - params["remark"] = neHost.Remark - } - if neHost.CreateBy != "" { - params["create_by"] = neHost.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 根据认证模式清除不必要的信息 - if neHost.AuthMode == "0" { - params["private_key"] = "" - params["pass_phrase"] = "" - } - if neHost.AuthMode == "1" { - params["password"] = "" - } - if neHost.AuthMode == "2" { - params["password"] = "" - params["private_key"] = "" - params["pass_phrase"] = "" - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_host (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeHostImpl) Update(neHost model.NeHost) int64 { - // 参数拼接 - params := make(map[string]any) - if neHost.HostType != "" { - params["host_type"] = neHost.HostType - } - if neHost.GroupID != "" { - params["group_id"] = neHost.GroupID - } - if neHost.Title != "" { - params["title"] = neHost.Title - } - if neHost.Addr != "" { - params["addr"] = neHost.Addr - } - if neHost.Port > 0 { - params["port"] = neHost.Port - } - if neHost.User != "" { - params["user"] = neHost.User - } - if neHost.AuthMode != "" { - params["auth_mode"] = neHost.AuthMode - } - if neHost.Password != "" { - params["password"] = neHost.Password - } - if neHost.PrivateKey != "" { - params["private_key"] = neHost.PrivateKey - } - if neHost.PassPhrase != "" { - params["pass_phrase"] = neHost.PassPhrase - } - params["remark"] = neHost.Remark - if neHost.UpdateBy != "" { - params["update_by"] = neHost.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 根据认证模式清除不必要的信息 - if neHost.AuthMode == "0" { - params["private_key"] = "" - params["pass_phrase"] = "" - } - if neHost.AuthMode == "1" { - params["password"] = "" - } - if neHost.AuthMode == "2" { - params["password"] = "" - params["private_key"] = "" - params["pass_phrase"] = "" - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_host set " + strings.Join(keys, ",") + " where host_id = ?" - - // 执行更新 - values = append(values, neHost.HostID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除网元主机连接信息 -func (r *NeHostImpl) DeleteByIds(hostIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) - sql := "delete from ne_host where host_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(hostIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_host_cmd.go b/src/modules/network_element/repository/ne_host_cmd.go index 170441bc..4ef57073 100644 --- a/src/modules/network_element/repository/ne_host_cmd.go +++ b/src/modules/network_element/repository/ne_host_cmd.go @@ -1,27 +1,306 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeHostCmd 网元主机命令 数据层接口 -type INeHostCmd interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd +// 实例化数据层 NeHostCmd 结构体 +var NewNeHostCmd = &NeHostCmd{ + selectSql: `select + cmd_id, cmd_type, group_id, title, command, remark, create_by, create_time, update_by, update_time + from ne_host_cmd`, - // SelectByIds 通过ID查询 - SelectByIds(cmdIds []string) []model.NeHostCmd - - // Insert 新增信息 - Insert(neHostCmd model.NeHostCmd) string - - // Update 修改信息 - Update(neHostCmd model.NeHostCmd) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(cmdIds []string) int64 - - // CheckUniqueGroupTitle 校验同类型组内是否唯一 - CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string + resultMap: map[string]string{ + "cmd_id": "CmdID", + "cmd_type": "CmdType", + "group_id": "GroupID", + "title": "Title", + "command": "Command", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeHostCmd 网元主机连接 数据层处理 +type NeHostCmd struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeHostCmd) convertResultRows(rows []map[string]any) []model.NeHostCmd { + arr := make([]model.NeHostCmd, 0) + for _, row := range rows { + item := model.NeHostCmd{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["cmdType"]; ok && v != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["groupId"]; ok && v != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["title"]; ok && v != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_host_cmd" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeHostCmd) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { + // 查询条件拼接 + var conditions []string + var params []any + if neHostCmd.CmdType != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, neHostCmd.CmdType) + } + if neHostCmd.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHostCmd.GroupID) + } + if neHostCmd.Title != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, neHostCmd.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by update_time asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeHostCmd) SelectByIds(cmdIds []string) []model.NeHostCmd { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where cmd_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeHostCmd{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueGroupTitle 校验同类型组内是否唯一 +func (r *NeHostCmd) CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string { + // 查询条件拼接 + var conditions []string + var params []any + if neHostCmd.CmdType != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, neHostCmd.CmdType) + } + if neHostCmd.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHostCmd.GroupID) + } + if neHostCmd.Title != "" { + conditions = append(conditions, "title = ?") + params = append(params, neHostCmd.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) string { + // 参数拼接 + params := make(map[string]any) + if neHostCmd.CmdType != "" { + params["cmd_type"] = neHostCmd.CmdType + } + if neHostCmd.GroupID != "" { + params["group_id"] = neHostCmd.GroupID + } + if neHostCmd.Title != "" { + params["title"] = neHostCmd.Title + } + if neHostCmd.Command != "" { + params["command"] = neHostCmd.Command + } + if neHostCmd.Remark != "" { + params["remark"] = neHostCmd.Remark + } + if neHostCmd.CreateBy != "" { + params["create_by"] = neHostCmd.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_host_cmd (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeHostCmd) Update(neHostCmd model.NeHostCmd) int64 { + // 参数拼接 + params := make(map[string]any) + if neHostCmd.CmdType != "" { + params["cmd_type"] = neHostCmd.CmdType + } + if neHostCmd.GroupID != "" { + params["group_id"] = neHostCmd.GroupID + } + if neHostCmd.Title != "" { + params["title"] = neHostCmd.Title + } + if neHostCmd.Command != "" { + params["command"] = neHostCmd.Command + } + params["remark"] = neHostCmd.Remark + if neHostCmd.UpdateBy != "" { + params["update_by"] = neHostCmd.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_host_cmd set " + strings.Join(keys, ",") + " where cmd_id = ?" + + // 执行更新 + values = append(values, neHostCmd.CmdID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeHostCmd) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_host_cmd where cmd_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_host_cmd.impl.go b/src/modules/network_element/repository/ne_host_cmd.impl.go deleted file mode 100644 index b4bb279e..00000000 --- a/src/modules/network_element/repository/ne_host_cmd.impl.go +++ /dev/null @@ -1,306 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeHostCmdImpl 结构体 -var NewNeHostCmdImpl = &NeHostCmdImpl{ - selectSql: `select - cmd_id, cmd_type, group_id, title, command, remark, create_by, create_time, update_by, update_time - from ne_host_cmd`, - - resultMap: map[string]string{ - "cmd_id": "CmdID", - "cmd_type": "CmdType", - "group_id": "GroupID", - "title": "Title", - "command": "Command", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeHostCmdImpl 网元主机连接 数据层处理 -type NeHostCmdImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeHostCmdImpl) convertResultRows(rows []map[string]any) []model.NeHostCmd { - arr := make([]model.NeHostCmd, 0) - for _, row := range rows { - item := model.NeHostCmd{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeHostCmdImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["cmdType"]; ok && v != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["groupId"]; ok && v != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_host_cmd" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeHostCmdImpl) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { - // 查询条件拼接 - var conditions []string - var params []any - if neHostCmd.CmdType != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, neHostCmd.CmdType) - } - if neHostCmd.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHostCmd.GroupID) - } - if neHostCmd.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, neHostCmd.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by update_time asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeHostCmdImpl) SelectByIds(cmdIds []string) []model.NeHostCmd { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where cmd_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeHostCmd{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueGroupTitle 校验同类型组内是否唯一 -func (r *NeHostCmdImpl) CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string { - // 查询条件拼接 - var conditions []string - var params []any - if neHostCmd.CmdType != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, neHostCmd.CmdType) - } - if neHostCmd.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHostCmd.GroupID) - } - if neHostCmd.Title != "" { - conditions = append(conditions, "title = ?") - params = append(params, neHostCmd.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeHostCmdImpl) Insert(neHostCmd model.NeHostCmd) string { - // 参数拼接 - params := make(map[string]any) - if neHostCmd.CmdType != "" { - params["cmd_type"] = neHostCmd.CmdType - } - if neHostCmd.GroupID != "" { - params["group_id"] = neHostCmd.GroupID - } - if neHostCmd.Title != "" { - params["title"] = neHostCmd.Title - } - if neHostCmd.Command != "" { - params["command"] = neHostCmd.Command - } - if neHostCmd.Remark != "" { - params["remark"] = neHostCmd.Remark - } - if neHostCmd.CreateBy != "" { - params["create_by"] = neHostCmd.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_host_cmd (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeHostCmdImpl) Update(neHostCmd model.NeHostCmd) int64 { - // 参数拼接 - params := make(map[string]any) - if neHostCmd.CmdType != "" { - params["cmd_type"] = neHostCmd.CmdType - } - if neHostCmd.GroupID != "" { - params["group_id"] = neHostCmd.GroupID - } - if neHostCmd.Title != "" { - params["title"] = neHostCmd.Title - } - if neHostCmd.Command != "" { - params["command"] = neHostCmd.Command - } - params["remark"] = neHostCmd.Remark - if neHostCmd.UpdateBy != "" { - params["update_by"] = neHostCmd.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_host_cmd set " + strings.Join(keys, ",") + " where cmd_id = ?" - - // 执行更新 - values = append(values, neHostCmd.CmdID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeHostCmdImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_host_cmd where cmd_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_info.go b/src/modules/network_element/repository/ne_info.go index c09d034a..effa5554 100644 --- a/src/modules/network_element/repository/ne_info.go +++ b/src/modules/network_element/repository/ne_info.go @@ -1,32 +1,405 @@ package repository import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_element/model" ) -// 网元信息 数据层接口 -type INeInfo interface { - // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 - SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo - - // SelectPage 根据条件分页查询 - SelectPage(query map[string]any) map[string]any - - // SelectList 查询列表 - SelectList(neInfo model.NeInfo) []model.NeInfo - - // SelectByIds 通过ID查询 - SelectByIds(infoIds []string) []model.NeInfo - - // Insert 新增信息 - Insert(neInfo model.NeInfo) string - - // Update 修改信息 - Update(neInfo model.NeInfo) int64 - - // DeleteByIds 批量删除网元信息 - DeleteByIds(infoIds []string) int64 - - // CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 - CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string +// neListSort 网元列表预设排序 +var neListSort = []string{ + "OMC", + "IMS", + "AMF", + "AUSF", + "UDM", + "SMF", + "PCF", + "NSSF", + "NRF", + "UPF", + "LMF", + "NEF", + "MME", + "N3IWF", + "MOCNGW", + "SMSC", + "CBC", +} + +// 实例化数据层 NeInfo 结构体 +var NewNeInfo = &NeInfo{ + selectSql: `select id, ne_type, ne_id, rm_uid, ne_name, ip, port, pv_flag, province, vendor_name, dn, ne_address, host_ids, status, remark, create_by, create_time, update_by, update_time from ne_info`, + + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "rm_uid": "RmUID", + "ne_name": "NeName", + "ip": "IP", + "port": "Port", + "pv_flag": "PvFlag", + "province": "Province", + "vendor_name": "VendorName", + "dn": "Dn", + "ne_address": "NeAddress", + "host_ids": "HostIDs", + "status": "Status", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeInfo 网元信息表 数据层处理 +type NeInfo struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeInfo) convertResultRows(rows []map[string]any) []model.NeInfo { + arr := make([]model.NeInfo, 0) + for _, row := range rows { + item := model.NeInfo{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + + // 创建优先级映射 + priority := make(map[string]int) + for i, v := range neListSort { + priority[v] = i + } + // 冒泡排序 + n := len(arr) + for i := 0; i < n-1; i++ { + for j := 0; j < n-i-1; j++ { + if priority[arr[j].NeType] > priority[arr[j+1].NeType] { + // 交换元素 + arr[j], arr[j+1] = arr[j+1], arr[j] + } + } + } + + return arr +} + +// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 +func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { + querySql := r.selectSql + " where ne_type = ? and ne_id = ?" + results, err := datasource.RawDB("", querySql, []any{neType, neID}) + if err != nil { + logger.Errorf("query err => %v", err) + return model.NeInfo{} + } + // 转换实体 + rows := r.convertResultRows(results) + if len(rows) > 0 { + return rows[0] + } + return model.NeInfo{} +} + +// SelectPage 根据条件分页查询 +func (r *NeInfo) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["rmUid"]; ok && v != "" { + conditions = append(conditions, "rmUid like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeInfo{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_info" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 查询列表 +func (r *NeInfo) SelectList(neInfo model.NeInfo) []model.NeInfo { + // 查询条件拼接 + var conditions []string + var params []any + if neInfo.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neInfo.NeType) + } + if neInfo.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neInfo.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeInfo) SelectByIds(infoIds []string) []model.NeInfo { + placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(infoIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeInfo{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 +func (r *NeInfo) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { + // 查询条件拼接 + var conditions []string + var params []any + if neInfo.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neInfo.NeType) + } + if neInfo.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neInfo.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select id as 'str' from ne_info " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeInfo) Insert(neInfo model.NeInfo) string { + // 参数拼接 + params := make(map[string]any) + if neInfo.NeType != "" { + params["ne_type"] = neInfo.NeType + } + if neInfo.NeId != "" { + params["ne_id"] = neInfo.NeId + } + if neInfo.RmUID != "" { + params["rm_uid"] = neInfo.RmUID + } + if neInfo.NeName != "" { + params["ne_name"] = neInfo.NeName + } + if neInfo.IP != "" { + params["ip"] = neInfo.IP + } + if neInfo.Port > 0 { + params["port"] = neInfo.Port + } + if neInfo.PvFlag != "" { + params["pv_flag"] = neInfo.PvFlag + } + if neInfo.Province != "" { + params["province"] = neInfo.Province + } + if neInfo.VendorName != "" { + params["vendor_name"] = neInfo.VendorName + } + if neInfo.Dn != "" { + params["dn"] = neInfo.Dn + } + if neInfo.NeAddress != "" { + params["ne_address"] = neInfo.NeAddress + } + if neInfo.HostIDs != "" { + params["host_ids"] = neInfo.HostIDs + } + if neInfo.Status != "" { + params["status"] = neInfo.Status + } + if neInfo.Remark != "" { + params["remark"] = neInfo.Remark + } + if neInfo.CreateBy != "" { + params["create_by"] = neInfo.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_info (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeInfo) Update(neInfo model.NeInfo) int64 { + // 参数拼接 + params := make(map[string]any) + if neInfo.NeType != "" { + params["ne_type"] = neInfo.NeType + } + if neInfo.NeId != "" { + params["ne_id"] = neInfo.NeId + } + if neInfo.RmUID != "" { + params["rm_uid"] = neInfo.RmUID + } + if neInfo.NeName != "" { + params["ne_name"] = neInfo.NeName + } + if neInfo.IP != "" { + params["ip"] = neInfo.IP + } + if neInfo.Port > 0 { + params["port"] = neInfo.Port + } + if neInfo.PvFlag != "" { + params["pv_flag"] = neInfo.PvFlag + } + params["province"] = neInfo.Province + params["vendor_name"] = neInfo.VendorName + params["dn"] = neInfo.Dn + params["ne_address"] = neInfo.NeAddress + if neInfo.HostIDs != "" { + params["host_ids"] = neInfo.HostIDs + } + params["remark"] = neInfo.Remark + if neInfo.Status != "" { + params["status"] = neInfo.Status + } + if neInfo.UpdateBy != "" { + params["update_by"] = neInfo.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_info set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neInfo.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除网元信息 +func (r *NeInfo) DeleteByIds(infoIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) + sql := "delete from ne_info where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(infoIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_info.impl.go b/src/modules/network_element/repository/ne_info.impl.go deleted file mode 100644 index adbc75c8..00000000 --- a/src/modules/network_element/repository/ne_info.impl.go +++ /dev/null @@ -1,405 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// neListSort 网元列表预设排序 -var neListSort = []string{ - "OMC", - "IMS", - "AMF", - "AUSF", - "UDM", - "SMF", - "PCF", - "NSSF", - "NRF", - "UPF", - "LMF", - "NEF", - "MME", - "N3IWF", - "MOCNGW", - "SMSC", - "CBC", -} - -// 实例化数据层 NeInfoImpl 结构体 -var NewNeInfoImpl = &NeInfoImpl{ - selectSql: `select id, ne_type, ne_id, rm_uid, ne_name, ip, port, pv_flag, province, vendor_name, dn, ne_address, host_ids, status, remark, create_by, create_time, update_by, update_time from ne_info`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "rm_uid": "RmUID", - "ne_name": "NeName", - "ip": "IP", - "port": "Port", - "pv_flag": "PvFlag", - "province": "Province", - "vendor_name": "VendorName", - "dn": "Dn", - "ne_address": "NeAddress", - "host_ids": "HostIDs", - "status": "Status", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeInfoImpl 网元信息表 数据层处理 -type NeInfoImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeInfoImpl) convertResultRows(rows []map[string]any) []model.NeInfo { - arr := make([]model.NeInfo, 0) - for _, row := range rows { - item := model.NeInfo{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - - // 创建优先级映射 - priority := make(map[string]int) - for i, v := range neListSort { - priority[v] = i - } - // 冒泡排序 - n := len(arr) - for i := 0; i < n-1; i++ { - for j := 0; j < n-i-1; j++ { - if priority[arr[j].NeType] > priority[arr[j+1].NeType] { - // 交换元素 - arr[j], arr[j+1] = arr[j+1], arr[j] - } - } - } - - return arr -} - -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { - querySql := r.selectSql + " where ne_type = ? and ne_id = ?" - results, err := datasource.RawDB("", querySql, []any{neType, neID}) - if err != nil { - logger.Errorf("query err => %v", err) - return model.NeInfo{} - } - // 转换实体 - rows := r.convertResultRows(results) - if len(rows) > 0 { - return rows[0] - } - return model.NeInfo{} -} - -// SelectPage 根据条件分页查询 -func (r *NeInfoImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["rmUid"]; ok && v != "" { - conditions = append(conditions, "rmUid like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeInfo{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_info" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 查询列表 -func (r *NeInfoImpl) SelectList(neInfo model.NeInfo) []model.NeInfo { - // 查询条件拼接 - var conditions []string - var params []any - if neInfo.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neInfo.NeType) - } - if neInfo.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neInfo.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeInfoImpl) SelectByIds(infoIds []string) []model.NeInfo { - placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(infoIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeInfo{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 -func (r *NeInfoImpl) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { - // 查询条件拼接 - var conditions []string - var params []any - if neInfo.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neInfo.NeType) - } - if neInfo.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neInfo.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select id as 'str' from ne_info " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeInfoImpl) Insert(neInfo model.NeInfo) string { - // 参数拼接 - params := make(map[string]any) - if neInfo.NeType != "" { - params["ne_type"] = neInfo.NeType - } - if neInfo.NeId != "" { - params["ne_id"] = neInfo.NeId - } - if neInfo.RmUID != "" { - params["rm_uid"] = neInfo.RmUID - } - if neInfo.NeName != "" { - params["ne_name"] = neInfo.NeName - } - if neInfo.IP != "" { - params["ip"] = neInfo.IP - } - if neInfo.Port > 0 { - params["port"] = neInfo.Port - } - if neInfo.PvFlag != "" { - params["pv_flag"] = neInfo.PvFlag - } - if neInfo.Province != "" { - params["province"] = neInfo.Province - } - if neInfo.VendorName != "" { - params["vendor_name"] = neInfo.VendorName - } - if neInfo.Dn != "" { - params["dn"] = neInfo.Dn - } - if neInfo.NeAddress != "" { - params["ne_address"] = neInfo.NeAddress - } - if neInfo.HostIDs != "" { - params["host_ids"] = neInfo.HostIDs - } - if neInfo.Status != "" { - params["status"] = neInfo.Status - } - if neInfo.Remark != "" { - params["remark"] = neInfo.Remark - } - if neInfo.CreateBy != "" { - params["create_by"] = neInfo.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_info (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeInfoImpl) Update(neInfo model.NeInfo) int64 { - // 参数拼接 - params := make(map[string]any) - if neInfo.NeType != "" { - params["ne_type"] = neInfo.NeType - } - if neInfo.NeId != "" { - params["ne_id"] = neInfo.NeId - } - if neInfo.RmUID != "" { - params["rm_uid"] = neInfo.RmUID - } - if neInfo.NeName != "" { - params["ne_name"] = neInfo.NeName - } - if neInfo.IP != "" { - params["ip"] = neInfo.IP - } - if neInfo.Port > 0 { - params["port"] = neInfo.Port - } - if neInfo.PvFlag != "" { - params["pv_flag"] = neInfo.PvFlag - } - params["province"] = neInfo.Province - params["vendor_name"] = neInfo.VendorName - params["dn"] = neInfo.Dn - params["ne_address"] = neInfo.NeAddress - if neInfo.HostIDs != "" { - params["host_ids"] = neInfo.HostIDs - } - params["remark"] = neInfo.Remark - if neInfo.Status != "" { - params["status"] = neInfo.Status - } - if neInfo.UpdateBy != "" { - params["update_by"] = neInfo.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_info set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neInfo.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除网元信息 -func (r *NeInfoImpl) DeleteByIds(infoIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) - sql := "delete from ne_info where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(infoIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_license.go b/src/modules/network_element/repository/ne_license.go index 83cc42ac..5aad6b32 100644 --- a/src/modules/network_element/repository/ne_license.go +++ b/src/modules/network_element/repository/ne_license.go @@ -1,24 +1,297 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "strings" + "time" -// INeLicense 网元授权激活信息 数据层接口 -type INeLicense interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neLicense model.NeLicense) []model.NeLicense +// 实例化数据层 NeLicense 结构体 +var NewNeLicense = &NeLicense{ + selectSql: `select + id, ne_type, ne_id, activation_request_code, license_path, serial_num, expiry_date, status, remark, create_by, create_time, update_by, update_time + from ne_license`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeLicense - - // Insert 新增信息 - Insert(neLicense model.NeLicense) string - - // Update 修改信息 - Update(neLicense model.NeLicense) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "activation_request_code": "ActivationRequestCode", + "license_path": "LicensePath", + "serial_num": "SerialNum", + "expiry_date": "ExpiryDate", + "status": "Status", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeLicense 网元授权激活信息 数据层处理 +type NeLicense struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeLicense) convertResultRows(rows []map[string]any) []model.NeLicense { + arr := make([]model.NeLicense, 0) + for _, row := range rows { + item := model.NeLicense{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeLicense) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["expiryDate"]; ok && v != "" { + conditions = append(conditions, "expiry_date = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["createBy"]; ok && v != "" { + conditions = append(conditions, "create_by like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_license" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense { + // 查询条件拼接 + var conditions []string + var params []any + if neLicense.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neLicense.NeType) + } + if neLicense.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neLicense.NeId) + } + if neLicense.ExpiryDate != "" { + conditions = append(conditions, "expiry_date = ?") + params = append(params, neLicense.ExpiryDate) + } + if neLicense.CreateBy != "" { + conditions = append(conditions, "create_by like concat(?, '%')") + params = append(params, neLicense.CreateBy) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeLicense) SelectByIds(cmdIds []string) []model.NeLicense { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeLicense{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeLicense) Insert(neLicense model.NeLicense) string { + // 参数拼接 + params := make(map[string]any) + if neLicense.NeType != "" { + params["ne_type"] = neLicense.NeType + } + if neLicense.NeId != "" { + params["ne_id"] = neLicense.NeId + } + if neLicense.ActivationRequestCode != "" { + params["activation_request_code"] = neLicense.ActivationRequestCode + } + if neLicense.LicensePath != "" { + params["license_path"] = neLicense.LicensePath + } + if neLicense.SerialNum != "" { + params["serial_num"] = neLicense.SerialNum + } + if neLicense.ExpiryDate != "" { + params["expiry_date"] = neLicense.ExpiryDate + } + if neLicense.Status != "" { + params["status"] = neLicense.Status + } + if neLicense.Remark != "" { + params["remark"] = neLicense.Remark + } + if neLicense.CreateBy != "" { + params["create_by"] = neLicense.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_license (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeLicense) Update(neLicense model.NeLicense) int64 { + // 参数拼接 + params := make(map[string]any) + if neLicense.NeType != "" { + params["ne_type"] = neLicense.NeType + } + if neLicense.NeId != "" { + params["ne_id"] = neLicense.NeId + } + if neLicense.ActivationRequestCode != "" { + params["activation_request_code"] = neLicense.ActivationRequestCode + } + if neLicense.LicensePath != "" { + params["license_path"] = neLicense.LicensePath + } + if neLicense.SerialNum != "" { + params["serial_num"] = neLicense.SerialNum + } + if neLicense.ExpiryDate != "" { + params["expiry_date"] = neLicense.ExpiryDate + } + if neLicense.Status != "" { + params["status"] = neLicense.Status + } + if neLicense.Remark != "" { + params["remark"] = neLicense.Remark + } + if neLicense.UpdateBy != "" { + params["update_by"] = neLicense.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_license set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neLicense.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeLicense) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_license where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_license.impl.go b/src/modules/network_element/repository/ne_license.impl.go deleted file mode 100644 index 0daee946..00000000 --- a/src/modules/network_element/repository/ne_license.impl.go +++ /dev/null @@ -1,297 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeLicense 结构体 -var NewNeLicenseImpl = &NeLicenseImpl{ - selectSql: `select - id, ne_type, ne_id, activation_request_code, license_path, serial_num, expiry_date, status, remark, create_by, create_time, update_by, update_time - from ne_license`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "activation_request_code": "ActivationRequestCode", - "license_path": "LicensePath", - "serial_num": "SerialNum", - "expiry_date": "ExpiryDate", - "status": "Status", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeLicenseImpl 网元授权激活信息 数据层处理 -type NeLicenseImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeLicenseImpl) convertResultRows(rows []map[string]any) []model.NeLicense { - arr := make([]model.NeLicense, 0) - for _, row := range rows { - item := model.NeLicense{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeLicenseImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["expiryDate"]; ok && v != "" { - conditions = append(conditions, "expiry_date = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["createBy"]; ok && v != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_license" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeLicenseImpl) SelectList(neLicense model.NeLicense) []model.NeLicense { - // 查询条件拼接 - var conditions []string - var params []any - if neLicense.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neLicense.NeType) - } - if neLicense.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neLicense.NeId) - } - if neLicense.ExpiryDate != "" { - conditions = append(conditions, "expiry_date = ?") - params = append(params, neLicense.ExpiryDate) - } - if neLicense.CreateBy != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, neLicense.CreateBy) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeLicenseImpl) SelectByIds(cmdIds []string) []model.NeLicense { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeLicense{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeLicenseImpl) Insert(neLicense model.NeLicense) string { - // 参数拼接 - params := make(map[string]any) - if neLicense.NeType != "" { - params["ne_type"] = neLicense.NeType - } - if neLicense.NeId != "" { - params["ne_id"] = neLicense.NeId - } - if neLicense.ActivationRequestCode != "" { - params["activation_request_code"] = neLicense.ActivationRequestCode - } - if neLicense.LicensePath != "" { - params["license_path"] = neLicense.LicensePath - } - if neLicense.SerialNum != "" { - params["serial_num"] = neLicense.SerialNum - } - if neLicense.ExpiryDate != "" { - params["expiry_date"] = neLicense.ExpiryDate - } - if neLicense.Status != "" { - params["status"] = neLicense.Status - } - if neLicense.Remark != "" { - params["remark"] = neLicense.Remark - } - if neLicense.CreateBy != "" { - params["create_by"] = neLicense.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_license (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeLicenseImpl) Update(neLicense model.NeLicense) int64 { - // 参数拼接 - params := make(map[string]any) - if neLicense.NeType != "" { - params["ne_type"] = neLicense.NeType - } - if neLicense.NeId != "" { - params["ne_id"] = neLicense.NeId - } - if neLicense.ActivationRequestCode != "" { - params["activation_request_code"] = neLicense.ActivationRequestCode - } - if neLicense.LicensePath != "" { - params["license_path"] = neLicense.LicensePath - } - if neLicense.SerialNum != "" { - params["serial_num"] = neLicense.SerialNum - } - if neLicense.ExpiryDate != "" { - params["expiry_date"] = neLicense.ExpiryDate - } - if neLicense.Status != "" { - params["status"] = neLicense.Status - } - if neLicense.Remark != "" { - params["remark"] = neLicense.Remark - } - if neLicense.UpdateBy != "" { - params["update_by"] = neLicense.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_license set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neLicense.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeLicenseImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_license where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_software.go b/src/modules/network_element/repository/ne_software.go index f6d0f23e..d039ec6d 100644 --- a/src/modules/network_element/repository/ne_software.go +++ b/src/modules/network_element/repository/ne_software.go @@ -1,27 +1,317 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeSoftware 网元软件包信息 数据层接口 -type INeSoftware interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neSoftware model.NeSoftware) []model.NeSoftware +// 实例化数据层 NeSoftware 结构体 +var NewNeSoftware = &NeSoftware{ + selectSql: `select + id, ne_type, name, path, version, description, create_by, create_time, update_by, update_time + from ne_software`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeSoftware - - // Insert 新增信息 - Insert(neSoftware model.NeSoftware) string - - // Update 修改信息 - Update(neSoftware model.NeSoftware) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 - - // CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 - CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "name": "Name", + "path": "Path", + "version": "Version", + "description": "Description", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeSoftware 网元软件包信息 数据层处理 +type NeSoftware struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeSoftware) convertResultRows(rows []map[string]any) []model.NeSoftware { + arr := make([]model.NeSoftware, 0) + for _, row := range rows { + item := model.NeSoftware{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeSoftware) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + softwareType := v.(string) + if strings.Contains(softwareType, ",") { + softwareTypeArr := strings.Split(softwareType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(softwareTypeArr)) + conditions = append(conditions, "ne_type in ("+placeholder+")") + parameters := repo.ConvertIdsSlice(softwareTypeArr) + params = append(params, parameters...) + } else { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(softwareType, " ")) + } + } + if v, ok := query["name"]; ok && v != "" { + conditions = append(conditions, "name like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["version"]; ok && v != "" { + conditions = append(conditions, "version like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_software" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " order by id desc limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { + // 查询条件拼接 + var conditions []string + var params []any + if neSoftware.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neSoftware.NeType) + } + if neSoftware.Path != "" { + conditions = append(conditions, "path = ?") + params = append(params, neSoftware.Path) + } + if neSoftware.Version != "" { + conditions = append(conditions, "version = ?") + params = append(params, neSoftware.Version) + } + if neSoftware.Name != "" { + conditions = append(conditions, "name like concat(?, '%')") + params = append(params, neSoftware.Name) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeSoftware) SelectByIds(cmdIds []string) []model.NeSoftware { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeSoftware{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 +func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string { + // 查询条件拼接 + var conditions []string + var params []any + if neSoftware.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neSoftware.NeType) + } + if neSoftware.Version != "" { + conditions = append(conditions, "version = ?") + params = append(params, neSoftware.Version) + } + if neSoftware.Name != "" { + conditions = append(conditions, "name = ?") + params = append(params, neSoftware.Name) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select id as 'str' from ne_software " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { + // 参数拼接 + params := make(map[string]any) + if neSoftware.NeType != "" { + params["ne_type"] = neSoftware.NeType + } + if neSoftware.Name != "" { + params["name"] = neSoftware.Name + } + if neSoftware.Path != "" { + params["path"] = neSoftware.Path + } + if neSoftware.Version != "" { + params["version"] = neSoftware.Version + } + params["description"] = neSoftware.Description + if neSoftware.CreateBy != "" { + params["create_by"] = neSoftware.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_software (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { + // 参数拼接 + params := make(map[string]any) + if neSoftware.NeType != "" { + params["ne_type"] = neSoftware.NeType + } + if neSoftware.Name != "" { + params["name"] = neSoftware.Name + } + if neSoftware.Path != "" { + params["path"] = neSoftware.Path + } + if neSoftware.Version != "" { + params["version"] = neSoftware.Version + } + params["description"] = neSoftware.Description + if neSoftware.UpdateBy != "" { + params["update_by"] = neSoftware.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_software set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neSoftware.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeSoftware) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_software where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_software.impl.go b/src/modules/network_element/repository/ne_software.impl.go deleted file mode 100644 index 5aa8cda6..00000000 --- a/src/modules/network_element/repository/ne_software.impl.go +++ /dev/null @@ -1,317 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeSoftware 结构体 -var NewNeSoftwareImpl = &NeSoftwareImpl{ - selectSql: `select - id, ne_type, name, path, version, description, create_by, create_time, update_by, update_time - from ne_software`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "name": "Name", - "path": "Path", - "version": "Version", - "description": "Description", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeSoftwareImpl 网元软件包信息 数据层处理 -type NeSoftwareImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeSoftwareImpl) convertResultRows(rows []map[string]any) []model.NeSoftware { - arr := make([]model.NeSoftware, 0) - for _, row := range rows { - item := model.NeSoftware{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeSoftwareImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - softwareType := v.(string) - if strings.Contains(softwareType, ",") { - softwareTypeArr := strings.Split(softwareType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(softwareTypeArr)) - conditions = append(conditions, "ne_type in ("+placeholder+")") - parameters := repo.ConvertIdsSlice(softwareTypeArr) - params = append(params, parameters...) - } else { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(softwareType, " ")) - } - } - if v, ok := query["name"]; ok && v != "" { - conditions = append(conditions, "name like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["version"]; ok && v != "" { - conditions = append(conditions, "version like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_software" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeSoftwareImpl) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { - // 查询条件拼接 - var conditions []string - var params []any - if neSoftware.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neSoftware.NeType) - } - if neSoftware.Path != "" { - conditions = append(conditions, "path = ?") - params = append(params, neSoftware.Path) - } - if neSoftware.Version != "" { - conditions = append(conditions, "version = ?") - params = append(params, neSoftware.Version) - } - if neSoftware.Name != "" { - conditions = append(conditions, "name like concat(?, '%')") - params = append(params, neSoftware.Name) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeSoftwareImpl) SelectByIds(cmdIds []string) []model.NeSoftware { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeSoftware{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 -func (r *NeSoftwareImpl) CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string { - // 查询条件拼接 - var conditions []string - var params []any - if neSoftware.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neSoftware.NeType) - } - if neSoftware.Version != "" { - conditions = append(conditions, "version = ?") - params = append(params, neSoftware.Version) - } - if neSoftware.Name != "" { - conditions = append(conditions, "name = ?") - params = append(params, neSoftware.Name) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select id as 'str' from ne_software " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeSoftwareImpl) Insert(neSoftware model.NeSoftware) string { - // 参数拼接 - params := make(map[string]any) - if neSoftware.NeType != "" { - params["ne_type"] = neSoftware.NeType - } - if neSoftware.Name != "" { - params["name"] = neSoftware.Name - } - if neSoftware.Path != "" { - params["path"] = neSoftware.Path - } - if neSoftware.Version != "" { - params["version"] = neSoftware.Version - } - params["description"] = neSoftware.Description - if neSoftware.CreateBy != "" { - params["create_by"] = neSoftware.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_software (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeSoftwareImpl) Update(neSoftware model.NeSoftware) int64 { - // 参数拼接 - params := make(map[string]any) - if neSoftware.NeType != "" { - params["ne_type"] = neSoftware.NeType - } - if neSoftware.Name != "" { - params["name"] = neSoftware.Name - } - if neSoftware.Path != "" { - params["path"] = neSoftware.Path - } - if neSoftware.Version != "" { - params["version"] = neSoftware.Version - } - params["description"] = neSoftware.Description - if neSoftware.UpdateBy != "" { - params["update_by"] = neSoftware.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_software set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neSoftware.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeSoftwareImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_software where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/service/ne_config.go b/src/modules/network_element/service/ne_config.go index e63c0b51..f607c0ab 100644 --- a/src/modules/network_element/service/ne_config.go +++ b/src/modules/network_element/service/ne_config.go @@ -1,36 +1,163 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "encoding/json" + "fmt" + "strings" -// INeConfig 网元参数配置可用属性值 服务层接口 -type INeConfig interface { - // RefreshByNeType 通过ne_type刷新redis中的缓存 - RefreshByNeTypeAndNeID(neType string) []model.NeConfig + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // ClearNeCacheByNeType 清除网元类型参数配置缓存 - ClearNeCacheByNeType(neType string) bool - - // SelectNeConfigByNeType 查询网元类型参数配置 - SelectNeConfigByNeType(neType string) []model.NeConfig - - // SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 - SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig - - // SelectNeHostPage 分页查询列表数据 - SelectPage(query map[string]any) map[string]any - - // SelectList 根据实体查询 - SelectList(param model.NeConfig) []model.NeConfig - - // SelectByIds 通过ID查询 - SelectById(id string) model.NeConfig - - // Insert 新增信息 - Insert(param model.NeConfig) string - - // Update 修改信息 - Update(param model.NeConfig) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) +// 实例化服务层 NeConfig 结构体 +var NewNeConfig = &NeConfig{ + neConfigRepository: repository.NewNeConfig, +} + +// NeConfig 网元参数配置可用属性值 服务层处理 +type NeConfig struct { + neConfigRepository *repository.NeConfig // 网元参数配置可用属性值表 +} + +// RefreshByNeType 通过ne_type刷新redis中的缓存 +func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { + // 多个 + if neType == "" || neType == "*" { + neConfigList := r.neConfigRepository.SelectList(model.NeConfig{}) + if len(neConfigList) > 0 { + neConfigGroup := map[string][]model.NeConfig{} + for _, v := range neConfigList { + if item, ok := neConfigGroup[v.NeType]; ok { + neConfigGroup[v.NeType] = append(item, v) + } else { + neConfigGroup[v.NeType] = []model.NeConfig{v} + } + } + for k, v := range neConfigGroup { + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(k)) + redis.Del("", key) + if len(v) > 0 { + for i, item := range v { + if err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData); err != nil { + continue + } + v[i] = item + } + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + } + } + } + return neConfigList + } + // 单个 + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) + redis.Del("", key) + neConfigList := r.neConfigRepository.SelectList(model.NeConfig{ + NeType: neType, + }) + if len(neConfigList) > 0 { + for i, v := range neConfigList { + if err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData); err != nil { + continue + } + neConfigList[i] = v + } + values, _ := json.Marshal(neConfigList) + redis.Set("", key, string(values)) + } + return neConfigList +} + +// ClearNeCacheByNeType 清除网元类型参数配置缓存 +func (r *NeConfig) ClearNeCacheByNeType(neType string) bool { + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, neType) + if neType == "*" { + key = fmt.Sprintf("%sNeConfig:*", cachekey.NE_DATA_KEY) + } + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + delOk, _ := redis.DelKeys("", keys) + return delOk +} + +// SelectNeConfigByNeType 查询网元类型参数配置 +func (r *NeConfig) SelectNeConfigByNeType(neType string) []model.NeConfig { + var neConfigList []model.NeConfig + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + err := json.Unmarshal([]byte(jsonStr), &neConfigList) + if err != nil { + neConfigList = []model.NeConfig{} + } + } else { + neConfigList = r.RefreshByNeTypeAndNeID(neType) + } + return neConfigList +} + +// SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 +func (r *NeConfig) SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig { + neConfigList := r.SelectNeConfigByNeType(neType) + var neConfig model.NeConfig + for _, v := range neConfigList { + if v.ParamName == paramName { + neConfig = v + break + } + } + return neConfig +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeConfig) SelectPage(query map[string]any) map[string]any { + return r.neConfigRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { + return r.neConfigRepository.SelectList(param) +} + +// SelectByIds 通过ID查询 +func (r *NeConfig) SelectById(id string) model.NeConfig { + if id == "" { + return model.NeConfig{} + } + neHosts := r.neConfigRepository.SelectByIds([]string{id}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeConfig{} +} + +// Insert 新增信息 +func (r *NeConfig) Insert(param model.NeConfig) string { + return r.neConfigRepository.Insert(param) +} + +// Update 修改信息 +func (r *NeConfig) Update(param model.NeConfig) int64 { + return r.neConfigRepository.Update(param) +} + +// DeleteByIds 批量删除信息 +func (r *NeConfig) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.neConfigRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("param.noData") + } + + if len(data) == len(ids) { + rows := r.neConfigRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_element/service/ne_config.impl.go b/src/modules/network_element/service/ne_config.impl.go deleted file mode 100644 index 120f5bf4..00000000 --- a/src/modules/network_element/service/ne_config.impl.go +++ /dev/null @@ -1,164 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "strings" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/redis" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// NewNeConfigImpl 网元参数配置可用属性值 实例化服务层 -var NewNeConfigImpl = &NeConfigImpl{ - neConfigRepository: repository.NewNeConfigImpl, -} - -// NeConfigImpl 网元参数配置可用属性值 服务层处理 -type NeConfigImpl struct { - // 网元参数配置可用属性值表 - neConfigRepository repository.INeConfig -} - -// RefreshByNeType 通过ne_type刷新redis中的缓存 -func (r *NeConfigImpl) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { - // 多个 - if neType == "" || neType == "*" { - neConfigList := r.neConfigRepository.SelectList(model.NeConfig{}) - if len(neConfigList) > 0 { - neConfigGroup := map[string][]model.NeConfig{} - for _, v := range neConfigList { - if item, ok := neConfigGroup[v.NeType]; ok { - neConfigGroup[v.NeType] = append(item, v) - } else { - neConfigGroup[v.NeType] = []model.NeConfig{v} - } - } - for k, v := range neConfigGroup { - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(k)) - redis.Del("", key) - if len(v) > 0 { - for i, item := range v { - if err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData); err != nil { - continue - } - v[i] = item - } - values, _ := json.Marshal(v) - redis.Set("", key, string(values)) - } - } - } - return neConfigList - } - // 单个 - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) - redis.Del("", key) - neConfigList := r.neConfigRepository.SelectList(model.NeConfig{ - NeType: neType, - }) - if len(neConfigList) > 0 { - for i, v := range neConfigList { - if err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData); err != nil { - continue - } - neConfigList[i] = v - } - values, _ := json.Marshal(neConfigList) - redis.Set("", key, string(values)) - } - return neConfigList -} - -// ClearNeCacheByNeType 清除网元类型参数配置缓存 -func (r *NeConfigImpl) ClearNeCacheByNeType(neType string) bool { - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, neType) - if neType == "*" { - key = fmt.Sprintf("%sNeConfig:*", cachekey.NE_DATA_KEY) - } - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// SelectNeConfigByNeType 查询网元类型参数配置 -func (r *NeConfigImpl) SelectNeConfigByNeType(neType string) []model.NeConfig { - var neConfigList []model.NeConfig - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &neConfigList) - if err != nil { - neConfigList = []model.NeConfig{} - } - } else { - neConfigList = r.RefreshByNeTypeAndNeID(neType) - } - return neConfigList -} - -// SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 -func (r *NeConfigImpl) SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig { - neConfigList := r.SelectNeConfigByNeType(neType) - var neConfig model.NeConfig - for _, v := range neConfigList { - if v.ParamName == paramName { - neConfig = v - break - } - } - return neConfig -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeConfigImpl) SelectPage(query map[string]any) map[string]any { - return r.neConfigRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeConfigImpl) SelectList(param model.NeConfig) []model.NeConfig { - return r.neConfigRepository.SelectList(param) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigImpl) SelectById(id string) model.NeConfig { - if id == "" { - return model.NeConfig{} - } - neHosts := r.neConfigRepository.SelectByIds([]string{id}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeConfig{} -} - -// Insert 新增信息 -func (r *NeConfigImpl) Insert(param model.NeConfig) string { - return r.neConfigRepository.Insert(param) -} - -// Update 修改信息 -func (r *NeConfigImpl) Update(param model.NeConfig) int64 { - return r.neConfigRepository.Update(param) -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.neConfigRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("param.noData") - } - - if len(data) == len(ids) { - rows := r.neConfigRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_element/service/ne_config_backup.go b/src/modules/network_element/service/ne_config_backup.go index 3f8239f6..9c2d6ba8 100644 --- a/src/modules/network_element/service/ne_config_backup.go +++ b/src/modules/network_element/service/ne_config_backup.go @@ -1,30 +1,201 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "os" + "runtime" + "strings" + "time" -// INeConfigBackup 网元配置文件备份记录 服务层接口 -type INeConfigBackup interface { - // SelectNeHostPage 分页查询列表数据 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(item model.NeConfigBackup) []model.NeConfigBackup - - // SelectByIds 通过ID查询 - SelectById(id string) model.NeConfigBackup - - // Insert 新增信息 - Insert(item model.NeConfigBackup) string - - // Update 修改信息 - Update(item model.NeConfigBackup) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // NeConfigLocalToNe 网元配置文件复制到网元端覆盖 - NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error - - // NeConfigNeToLocal 网元备份文件网元端复制到本地 - NeConfigNeToLocal(neInfo model.NeInfo) (string, error) +// 实例化服务层 NeConfigBackup 结构体 +var NewNeConfigBackup = &NeConfigBackup{ + neConfigBackupRepository: repository.NewNeConfigBackup, +} + +// NeConfigBackup 网元配置文件备份记录 服务层处理 +type NeConfigBackup struct { + neConfigBackupRepository *repository.NeConfigBackup // 网元配置文件备份记录 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any { + return r.neConfigBackupRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { + return r.neConfigBackupRepository.SelectList(item) +} + +// SelectByIds 通过ID查询 +func (r *NeConfigBackup) SelectById(id string) model.NeConfigBackup { + if id == "" { + return model.NeConfigBackup{} + } + arr := r.neConfigBackupRepository.SelectByIds([]string{id}) + if len(arr) > 0 { + return arr[0] + } + return model.NeConfigBackup{} +} + +// Insert 新增信息 +func (r *NeConfigBackup) Insert(item model.NeConfigBackup) string { + return r.neConfigBackupRepository.Insert(item) +} + +// Update 修改信息 +func (r *NeConfigBackup) Update(item model.NeConfigBackup) int64 { + return r.neConfigBackupRepository.Update(item) +} + +// DeleteByIds 批量删除信息 +func (r *NeConfigBackup) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.neConfigBackupRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("neConfigBackup.noData") + } + + if len(data) == len(ids) { + rows := r.neConfigBackupRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// NeConfigLocalToNe 网元配置文件复制到网元端覆盖 +func (r *NeConfigBackup) NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error { + neTypeLower := strings.ToLower(neInfo.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeId) + if err := file.UnZip(localFile, localDirPath); err != nil { + return fmt.Errorf("unzip err") + } + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + + // 网元配置端上的临时目录 + neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) + sshClient.RunCMD(fmt.Sprintf("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp)) + // 复制到网元端 + if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil { + return fmt.Errorf("copy config to ne err") + } + + // 配置复制到网元内 + if neTypeLower == "ims" { + // ims目录 + imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} + for _, v := range imsDirArr { + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/ims && sudo cp -rf %s/ims/%s /usr/local/etc/ims/%v && sudo chmod 755 -R /usr/local/etc/ims/%s", neDirTemp, v, v, v)) + } + // mf目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/mf && sudo cp -rf %s/mf/* /usr/local/etc/mf && sudo chmod 755 -R /usr/local/etc/mf", neDirTemp)) + // rtproxy目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/rtproxy && sudo cp -rf %s/rtproxy/* /usr/local/etc/rtproxy && sudo chmod 755 /usr/local/etc/rtproxy/rtproxy.conf", neDirTemp)) + // iwf目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/iwf && sudo cp -rf %s/iwf/* /usr/local/etc/iwf && sudo chmod 755 /usr/local/etc/iwf/*.yaml", neDirTemp)) + } else if neTypeLower == "omc" { + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/omc/etc && sudo cp -rf %s/* /usr/local/omc/etc && sudo chmod 755 /usr/local/omc/etc/*.{yaml,conf}", neDirTemp)) + } else { + neEtcPath := fmt.Sprintf("/usr/local/etc/%s", neTypeLower) + chmodFile := fmt.Sprintf("sudo chmod 755 %s/*.yaml", neEtcPath) + if neTypeLower == "mme" { + chmodFile = fmt.Sprintf("sudo chmod 755 %s/*.{yaml,conf}", neEtcPath) + } + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/* %s && %s", neDirTemp, neEtcPath, chmodFile)) + } + + _ = os.RemoveAll(localDirPath) // 删除本地临时目录 + sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 + return nil +} + +// NeConfigNeToLocal 网元备份文件网元端复制到本地 +func (r *NeConfigBackup) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) { + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return "", fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return "", fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + + neTypeLower := strings.ToLower(neInfo.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_export", omcPath, neTypeLower, neInfo.NeId) + + // 网元配置文件先复制到临时目录 + sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") + neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) + if neTypeLower == "ims" { + // ims目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/ims", neDirTemp)) + imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} + for _, v := range imsDirArr { + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf /usr/local/etc/ims/%s %s/ims", v, neDirTemp)) + } + // mf目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/mf && sudo cp -rf /usr/local/etc/mf %s", neDirTemp, neDirTemp)) + // rtproxy目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/rtproxy && sudo cp -rf /usr/local/etc/rtproxy/rtproxy.conf %s/rtproxy", neDirTemp, neDirTemp)) + // iwf目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/iwf && sudo cp -rf /usr/local/etc/iwf/*.yaml %s/iwf", neDirTemp, neDirTemp)) + } else if neTypeLower == "omc" { + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf /usr/local/omc/etc/*.{yaml,conf} %s", neDirTemp, neDirTemp)) + } else { + nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", neTypeLower) + if neTypeLower == "mme" { + nePath = fmt.Sprintf("/usr/local/etc/%s/*.{yaml,conf}", neTypeLower) + } + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", neDirTemp, nePath, neDirTemp)) + } + + // 网元端复制到本地 + if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirPath); err != nil { + return "", fmt.Errorf("copy config err") + } + + // 压缩zip文件名 + zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeId, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) + zipFilePath := fmt.Sprintf("%s/%s/%s/backup/%s", omcPath, neTypeLower, neInfo.NeId, zipFileName) + if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil { + return "", fmt.Errorf("compress zip err") + } + + _ = os.RemoveAll(localDirPath) // 删除本地临时目录 + sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 + return zipFilePath, nil } diff --git a/src/modules/network_element/service/ne_config_backup.impl.go b/src/modules/network_element/service/ne_config_backup.impl.go deleted file mode 100644 index f1eee5cb..00000000 --- a/src/modules/network_element/service/ne_config_backup.impl.go +++ /dev/null @@ -1,202 +0,0 @@ -package service - -import ( - "fmt" - "os" - "runtime" - "strings" - "time" - - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/file" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// NewNeConfigBackupImpl 网元配置文件备份记录 实例化服务层 -var NewNeConfigBackupImpl = &NeConfigBackupImpl{ - neConfigBackupRepository: repository.NewNeConfigBackupImpl, -} - -// NeConfigBackupImpl 网元配置文件备份记录 服务层处理 -type NeConfigBackupImpl struct { - // 网元配置文件备份记录 - neConfigBackupRepository repository.INeConfigBackup -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeConfigBackupImpl) SelectPage(query map[string]any) map[string]any { - return r.neConfigBackupRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeConfigBackupImpl) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { - return r.neConfigBackupRepository.SelectList(item) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigBackupImpl) SelectById(id string) model.NeConfigBackup { - if id == "" { - return model.NeConfigBackup{} - } - arr := r.neConfigBackupRepository.SelectByIds([]string{id}) - if len(arr) > 0 { - return arr[0] - } - return model.NeConfigBackup{} -} - -// Insert 新增信息 -func (r *NeConfigBackupImpl) Insert(item model.NeConfigBackup) string { - return r.neConfigBackupRepository.Insert(item) -} - -// Update 修改信息 -func (r *NeConfigBackupImpl) Update(item model.NeConfigBackup) int64 { - return r.neConfigBackupRepository.Update(item) -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigBackupImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.neConfigBackupRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("neConfigBackup.noData") - } - - if len(data) == len(ids) { - rows := r.neConfigBackupRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// NeConfigLocalToNe 网元配置文件复制到网元端覆盖 -func (r *NeConfigBackupImpl) NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error { - neTypeLower := strings.ToLower(neInfo.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeId) - if err := file.UnZip(localFile, localDirPath); err != nil { - return fmt.Errorf("unzip err") - } - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - - // 网元配置端上的临时目录 - neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) - sshClient.RunCMD(fmt.Sprintf("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp)) - // 复制到网元端 - if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil { - return fmt.Errorf("copy config to ne err") - } - - // 配置复制到网元内 - if neTypeLower == "ims" { - // ims目录 - imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} - for _, v := range imsDirArr { - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/ims && sudo cp -rf %s/ims/%s /usr/local/etc/ims/%v && sudo chmod 755 -R /usr/local/etc/ims/%s", neDirTemp, v, v, v)) - } - // mf目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/mf && sudo cp -rf %s/mf/* /usr/local/etc/mf && sudo chmod 755 -R /usr/local/etc/mf", neDirTemp)) - // rtproxy目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/rtproxy && sudo cp -rf %s/rtproxy/* /usr/local/etc/rtproxy && sudo chmod 755 /usr/local/etc/rtproxy/rtproxy.conf", neDirTemp)) - // iwf目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/iwf && sudo cp -rf %s/iwf/* /usr/local/etc/iwf && sudo chmod 755 /usr/local/etc/iwf/*.yaml", neDirTemp)) - } else if neTypeLower == "omc" { - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/omc/etc && sudo cp -rf %s/* /usr/local/omc/etc && sudo chmod 755 /usr/local/omc/etc/*.{yaml,conf}", neDirTemp)) - } else { - neEtcPath := fmt.Sprintf("/usr/local/etc/%s", neTypeLower) - chmodFile := fmt.Sprintf("sudo chmod 755 %s/*.yaml", neEtcPath) - if neTypeLower == "mme" { - chmodFile = fmt.Sprintf("sudo chmod 755 %s/*.{yaml,conf}", neEtcPath) - } - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/* %s && %s", neDirTemp, neEtcPath, chmodFile)) - } - - _ = os.RemoveAll(localDirPath) // 删除本地临时目录 - sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 - return nil -} - -// NeConfigNeToLocal 网元备份文件网元端复制到本地 -func (r *NeConfigBackupImpl) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) { - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return "", fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - - neTypeLower := strings.ToLower(neInfo.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_export", omcPath, neTypeLower, neInfo.NeId) - - // 网元配置文件先复制到临时目录 - sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") - neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) - if neTypeLower == "ims" { - // ims目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/ims", neDirTemp)) - imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} - for _, v := range imsDirArr { - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf /usr/local/etc/ims/%s %s/ims", v, neDirTemp)) - } - // mf目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/mf && sudo cp -rf /usr/local/etc/mf %s", neDirTemp, neDirTemp)) - // rtproxy目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/rtproxy && sudo cp -rf /usr/local/etc/rtproxy/rtproxy.conf %s/rtproxy", neDirTemp, neDirTemp)) - // iwf目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/iwf && sudo cp -rf /usr/local/etc/iwf/*.yaml %s/iwf", neDirTemp, neDirTemp)) - } else if neTypeLower == "omc" { - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf /usr/local/omc/etc/*.{yaml,conf} %s", neDirTemp, neDirTemp)) - } else { - nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", neTypeLower) - if neTypeLower == "mme" { - nePath = fmt.Sprintf("/usr/local/etc/%s/*.{yaml,conf}", neTypeLower) - } - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", neDirTemp, nePath, neDirTemp)) - } - - // 网元端复制到本地 - if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirPath); err != nil { - return "", fmt.Errorf("copy config err") - } - - // 压缩zip文件名 - zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeId, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) - zipFilePath := fmt.Sprintf("%s/%s/%s/backup/%s", omcPath, neTypeLower, neInfo.NeId, zipFileName) - if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil { - return "", fmt.Errorf("compress zip err") - } - - _ = os.RemoveAll(localDirPath) // 删除本地临时目录 - sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 - return zipFilePath, nil -} diff --git a/src/modules/network_element/service/ne_host.go b/src/modules/network_element/service/ne_host.go index 08f54432..c8ee1c29 100644 --- a/src/modules/network_element/service/ne_host.go +++ b/src/modules/network_element/service/ne_host.go @@ -1,30 +1,171 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" -// INeHost 网元主机连接 服务层接口 -type INeHost interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/crypto" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neHost model.NeHost) []model.NeHost - - // SelectById 通过ID查询 - SelectById(hostId string) model.NeHost - - // CheckUniqueHostTitle 校验分组组和主机名称是否唯一 - CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool - - // Insert 新增信息 - Insert(neHost model.NeHost) string - - // Update 修改信息 - Update(neHost model.NeHost) int64 - - // Insert 批量添加 - Inserts(neHosts []model.NeHost) int64 - - // DeleteByIds 批量删除网元主机连接信息 - DeleteByIds(hostIds []string) (int64, error) +// 实例化服务层 NeHost 结构体 +var NewNeHost = &NeHost{ + neHostRepository: repository.NewNeHost, +} + +// NeHost 网元主机连接 服务层处理 +type NeHost struct { + neHostRepository *repository.NeHost // 网元主机连接表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeHost) SelectPage(query map[string]any) map[string]any { + return r.neHostRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost { + return r.neHostRepository.SelectList(neHost) +} + +// SelectByIds 通过ID查询 +func (r *NeHost) SelectById(hostId string) model.NeHost { + neHost := model.NeHost{} + if hostId == "" { + return neHost + } + neHosts := r.neHostRepository.SelectByIds([]string{hostId}) + if len(neHosts) > 0 { + neHost := neHosts[0] + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordDe, err := crypto.AESDecryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.Password = passwordDe + } + if neHost.PrivateKey != "" { + privateKeyDe, err := crypto.AESDecryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.PrivateKey = privateKeyDe + } + if neHost.PassPhrase != "" { + passPhraseDe, err := crypto.AESDecryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.PassPhrase = passPhraseDe + } + return neHost + } + return model.NeHost{} +} + +// Insert 批量添加 +func (r *NeHost) Inserts(neHosts []model.NeHost) int64 { + var num int64 = 0 + for _, v := range neHosts { + hostId := r.neHostRepository.Insert(v) + if hostId != "" { + num += 1 + } + } + return num +} + +// Insert 新增信息 +func (r *NeHost) Insert(neHost model.NeHost) string { + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.Password = passwordEn + } + if neHost.PrivateKey != "" { + privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.PrivateKey = privateKeyEn + } + if neHost.PassPhrase != "" { + passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.PassPhrase = passPhraseEn + } + return r.neHostRepository.Insert(neHost) +} + +// Update 修改信息 +func (r *NeHost) Update(neHost model.NeHost) int64 { + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("update password encrypt: %v", err.Error()) + return 0 + } + neHost.Password = passwordEn + } + if neHost.PrivateKey != "" { + privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("update private key encrypt: %v", err.Error()) + return 0 + } + neHost.PrivateKey = privateKeyEn + } + if neHost.PassPhrase != "" { + passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("update pass phrase encrypt: %v", err.Error()) + return 0 + } + neHost.PassPhrase = passPhraseEn + } + return r.neHostRepository.Update(neHost) +} + +// DeleteByIds 批量删除网元主机连接信息 +func (r *NeHost) DeleteByIds(hostIds []string) (int64, error) { + // 检查是否存在 + ids := r.neHostRepository.SelectByIds(hostIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("neHost.noData") + } + + if len(ids) == len(hostIds) { + rows := r.neHostRepository.DeleteByIds(hostIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueHostTitle 校验分组组和主机名称是否唯一 +func (r *NeHost) CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool { + uniqueId := r.neHostRepository.CheckUniqueNeHost(model.NeHost{ + HostType: hostType, + GroupID: groupId, + Title: title, + }) + if uniqueId == hostId { + return true + } + return uniqueId == "" } diff --git a/src/modules/network_element/service/ne_host.impl.go b/src/modules/network_element/service/ne_host.impl.go deleted file mode 100644 index fa5fee26..00000000 --- a/src/modules/network_element/service/ne_host.impl.go +++ /dev/null @@ -1,172 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/framework/config" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/crypto" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeHostImpl 结构体 -var NewNeHostImpl = &NeHostImpl{ - neHostRepository: repository.NewNeHostImpl, -} - -// NeHostImpl 网元主机连接 服务层处理 -type NeHostImpl struct { - // 网元主机连接表 - neHostRepository repository.INeHost -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeHostImpl) SelectPage(query map[string]any) map[string]any { - return r.neHostRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeHostImpl) SelectList(neHost model.NeHost) []model.NeHost { - return r.neHostRepository.SelectList(neHost) -} - -// SelectByIds 通过ID查询 -func (r *NeHostImpl) SelectById(hostId string) model.NeHost { - neHost := model.NeHost{} - if hostId == "" { - return neHost - } - neHosts := r.neHostRepository.SelectByIds([]string{hostId}) - if len(neHosts) > 0 { - neHost := neHosts[0] - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordDe, err := crypto.AESDecryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.Password = passwordDe - } - if neHost.PrivateKey != "" { - privateKeyDe, err := crypto.AESDecryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.PrivateKey = privateKeyDe - } - if neHost.PassPhrase != "" { - passPhraseDe, err := crypto.AESDecryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.PassPhrase = passPhraseDe - } - return neHost - } - return model.NeHost{} -} - -// Insert 批量添加 -func (r *NeHostImpl) Inserts(neHosts []model.NeHost) int64 { - var num int64 = 0 - for _, v := range neHosts { - hostId := r.neHostRepository.Insert(v) - if hostId != "" { - num += 1 - } - } - return num -} - -// Insert 新增信息 -func (r *NeHostImpl) Insert(neHost model.NeHost) string { - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.Password = passwordEn - } - if neHost.PrivateKey != "" { - privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.PrivateKey = privateKeyEn - } - if neHost.PassPhrase != "" { - passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.PassPhrase = passPhraseEn - } - return r.neHostRepository.Insert(neHost) -} - -// Update 修改信息 -func (r *NeHostImpl) Update(neHost model.NeHost) int64 { - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("update password encrypt: %v", err.Error()) - return 0 - } - neHost.Password = passwordEn - } - if neHost.PrivateKey != "" { - privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("update private key encrypt: %v", err.Error()) - return 0 - } - neHost.PrivateKey = privateKeyEn - } - if neHost.PassPhrase != "" { - passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("update pass phrase encrypt: %v", err.Error()) - return 0 - } - neHost.PassPhrase = passPhraseEn - } - return r.neHostRepository.Update(neHost) -} - -// DeleteByIds 批量删除网元主机连接信息 -func (r *NeHostImpl) DeleteByIds(hostIds []string) (int64, error) { - // 检查是否存在 - ids := r.neHostRepository.SelectByIds(hostIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("neHost.noData") - } - - if len(ids) == len(hostIds) { - rows := r.neHostRepository.DeleteByIds(hostIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueHostTitle 校验分组组和主机名称是否唯一 -func (r *NeHostImpl) CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool { - uniqueId := r.neHostRepository.CheckUniqueNeHost(model.NeHost{ - HostType: hostType, - GroupID: groupId, - Title: title, - }) - if uniqueId == hostId { - return true - } - return uniqueId == "" -} diff --git a/src/modules/network_element/service/ne_host_cmd.go b/src/modules/network_element/service/ne_host_cmd.go index eaea5a35..1936848d 100644 --- a/src/modules/network_element/service/ne_host_cmd.go +++ b/src/modules/network_element/service/ne_host_cmd.go @@ -1,27 +1,79 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" -// INeHostCmd 网元主机命令 服务层接口 -type INeHostCmd interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd - - // SelectByIds 通过ID查询 - SelectById(cmdId string) model.NeHostCmd - - // Insert 新增信息 - Insert(neHostCmd model.NeHostCmd) string - - // Update 修改信息 - Update(neHostCmd model.NeHostCmd) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(cmdIds []string) (int64, error) - - // CheckUniqueGroupTitle 校验同类型组内是否唯一 - CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool +// 实例化服务层 NeHostCmd 结构体 +var NewNeHostCmd = &NeHostCmd{ + neHostCmdRepository: repository.NewNeHostCmd, +} + +// NeHostCmd 网元主机命令 服务层处理 +type NeHostCmd struct { + neHostCmdRepository *repository.NeHostCmd // 网元主机命令表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any { + return r.neHostCmdRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeHostCmd) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { + return r.neHostCmdRepository.SelectList(neHostCmd) +} + +// SelectByIds 通过ID查询 +func (r *NeHostCmd) SelectById(cmdId string) model.NeHostCmd { + if cmdId == "" { + return model.NeHostCmd{} + } + neHosts := r.neHostCmdRepository.SelectByIds([]string{cmdId}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeHostCmd{} +} + +// Insert 新增信息 +func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) string { + return r.neHostCmdRepository.Insert(neHostCmd) +} + +// Update 修改信息 +func (r *NeHostCmd) Update(neHostCmd model.NeHostCmd) int64 { + return r.neHostCmdRepository.Update(neHostCmd) +} + +// DeleteByIds 批量删除信息 +func (r *NeHostCmd) DeleteByIds(cmdIds []string) (int64, error) { + // 检查是否存在 + ids := r.neHostCmdRepository.SelectByIds(cmdIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("neHostCmd.noData") + } + + if len(ids) == len(cmdIds) { + rows := r.neHostCmdRepository.DeleteByIds(cmdIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueGroupTitle 校验同类型组内是否唯一 +func (r *NeHostCmd) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool { + uniqueId := r.neHostCmdRepository.CheckUniqueGroupTitle(model.NeHostCmd{ + CmdType: cmdType, + GroupID: groupId, + Title: title, + }) + if uniqueId == cmdId { + return true + } + return uniqueId == "" } diff --git a/src/modules/network_element/service/ne_host_cmd.impl.go b/src/modules/network_element/service/ne_host_cmd.impl.go deleted file mode 100644 index a38c9ba7..00000000 --- a/src/modules/network_element/service/ne_host_cmd.impl.go +++ /dev/null @@ -1,80 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeHostCmdImpl 结构体 -var NewNeHostCmdImpl = &NeHostCmdImpl{ - neHostCmdRepository: repository.NewNeHostCmdImpl, -} - -// NeHostCmdImpl 网元主机命令 服务层处理 -type NeHostCmdImpl struct { - // 网元主机命令表 - neHostCmdRepository repository.INeHostCmd -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeHostCmdImpl) SelectPage(query map[string]any) map[string]any { - return r.neHostCmdRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeHostCmdImpl) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { - return r.neHostCmdRepository.SelectList(neHostCmd) -} - -// SelectByIds 通过ID查询 -func (r *NeHostCmdImpl) SelectById(cmdId string) model.NeHostCmd { - if cmdId == "" { - return model.NeHostCmd{} - } - neHosts := r.neHostCmdRepository.SelectByIds([]string{cmdId}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeHostCmd{} -} - -// Insert 新增信息 -func (r *NeHostCmdImpl) Insert(neHostCmd model.NeHostCmd) string { - return r.neHostCmdRepository.Insert(neHostCmd) -} - -// Update 修改信息 -func (r *NeHostCmdImpl) Update(neHostCmd model.NeHostCmd) int64 { - return r.neHostCmdRepository.Update(neHostCmd) -} - -// DeleteByIds 批量删除信息 -func (r *NeHostCmdImpl) DeleteByIds(cmdIds []string) (int64, error) { - // 检查是否存在 - ids := r.neHostCmdRepository.SelectByIds(cmdIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("neHostCmd.noData") - } - - if len(ids) == len(cmdIds) { - rows := r.neHostCmdRepository.DeleteByIds(cmdIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueGroupTitle 校验同类型组内是否唯一 -func (r *NeHostCmdImpl) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool { - uniqueId := r.neHostCmdRepository.CheckUniqueGroupTitle(model.NeHostCmd{ - CmdType: cmdType, - GroupID: groupId, - Title: title, - }) - if uniqueId == cmdId { - return true - } - return uniqueId == "" -} diff --git a/src/modules/network_element/service/ne_info.go b/src/modules/network_element/service/ne_info.go index 94e08e63..2c70a697 100644 --- a/src/modules/network_element/service/ne_info.go +++ b/src/modules/network_element/service/ne_info.go @@ -1,72 +1,918 @@ package service import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/logger" + "be.ems/src/framework/redis" "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/parse" "be.ems/src/framework/utils/ssh" + neFetchlink "be.ems/src/modules/network_element/fetch_link" "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" ) -// 网元信息 服务层接口 -type INeInfo interface { - // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 - SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo - - // RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 - RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo - - // ClearNeCacheByNeType 清除网元类型缓存 - ClearNeCacheByNeType(neType string) bool - - // SelectNeInfoByRmuid 通过rmUID查询网元信息 - SelectNeInfoByRmuid(rmUid string) model.NeInfo - - // SelectPage 根据条件分页查询 - // - // bandStatus 带状态信息 - SelectPage(query map[string]any, bandStatus bool) map[string]any - - // SelectList 查询列表 - // - // bandStatus 带状态信息 - // bandHost 带主机信息 - SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo - - // SelectByIds 通过ID查询 - // - // bandStatus 带主机信息 - SelectById(infoId string, bandHost bool) model.NeInfo - - // Insert 新增信息 - Insert(neInfo model.NeInfo) string - - // Update 修改信息 - Update(neInfo model.NeInfo) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(infoIds []string) (int64, error) - - // CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 - CheckUniqueNeTypeAndNeId(neType, neId, id string) bool - - // NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() - NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) - - // NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 - NeRunSSHCmd(neType, neId, cmd string) (string, error) - - // NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() - // num 是网元主机telnet 1:4100 2:5200 - NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) - - // NeConfOAMReadSync 网元OAM配置文件读取 - NeConfOAMReadSync(neType, neId string) (map[string]any, error) - - // NeConfOAMWirteSync 网元OAM配置文件生成并同步 - NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error - - // NeConfPara5GRead 网元公共配置文件读取 - NeConfPara5GRead() (map[string]any, error) - - // NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId - NeConfPara5GWirte(content map[string]any, syncNE []string) error +// 实例化服务层 NeInfo 结构体 +var NewNeInfo = &NeInfo{ + neInfoRepository: repository.NewNeInfo, + Para5GData: map[string]string{}, +} + +// 网元信息 服务层处理 +type NeInfo struct { + // 网元信息数据信息 + neInfoRepository *repository.NeInfo + Para5GData map[string]string +} + +// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 +func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { + var neInfo model.NeInfo + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + err := json.Unmarshal([]byte(jsonStr), &neInfo) + if err != nil { + neInfo = model.NeInfo{} + } + } else { + neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) + if neInfo.ID != "" && neInfo.NeId == neID { + redis.Del("", key) + values, _ := json.Marshal(neInfo) + redis.Set("", key, string(values)) + } + } + return neInfo +} + +// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 +func (r *NeInfo) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { + var neInfo model.NeInfo + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) + redis.Del("", key) + neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) + if neInfo.ID != "" && neInfo.NeId == neID { + values, _ := json.Marshal(neInfo) + redis.Set("", key, string(values)) + } + return neInfo +} + +// ClearNeCacheByNeType 清除网元类型缓存 +func (r *NeInfo) ClearNeCacheByNeType(neType string) bool { + key := fmt.Sprintf("%s*", cachekey.NE_KEY) + if neType != "*" { + key = fmt.Sprintf("%s%s*", cachekey.NE_KEY, neType) + } + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + delOk, _ := redis.DelKeys("", keys) + return delOk +} + +// SelectNeInfoByRmuid 通过rmUID查询网元信息 +func (r *NeInfo) SelectNeInfoByRmuid(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 带状态信息 +func (r *NeInfo) SelectPage(query map[string]any, bandStatus bool) map[string]any { + data := r.neInfoRepository.SelectPage(query) + + // 网元直连读取网元服务状态 + if bandStatus { + rows := data["rows"].([]model.NeInfo) + r.bandNeStatus(&rows) + } + + return data +} + +// SelectList 查询列表 +// +// bandStatus 带状态信息 +// bandHost 带主机信息 +func (r *NeInfo) SelectList(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 { + v := (*arr)[i] + result, err := neFetchlink.NeState(v) + if err != nil { + (*arr)[i].ServerState = map[string]any{ + "online": false, + } + // 网元状态设置为离线 + if v.Status != "0" { + v.Status = "0" + (*arr)[i].Status = v.Status + r.neInfoRepository.Update(v) + } + continue + } + result["online"] = true + (*arr)[i].ServerState = result + // 网元状态设置为在线 + if v.Status != "1" { + // 下发网管配置信息给网元 + _, err = neFetchlink.NeConfigOMC(v) + if err == nil { + v.Status = "1" + } else { + v.Status = "2" + } + (*arr)[i].Status = v.Status + r.neInfoRepository.Update(v) + } + } +} + +// bandNeHosts 网元列表项数据带网元主机信息 +func (r *NeInfo) bandNeHosts(arr *[]model.NeInfo) { + for i := range *arr { + v := (*arr)[i] + if v.HostIDs != "" { + hostIds := strings.Split(v.HostIDs, ",") + if len(hostIds) <= 1 { + continue + } + for _, hostId := range hostIds { + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + continue + } + (*arr)[i].Hosts = append((*arr)[i].Hosts, neHost) + } + } + } +} + +// SelectByIds 通过ID查询 +// +// bandHost 带主机信息 +func (r *NeInfo) SelectById(infoId string, bandHost bool) model.NeInfo { + if infoId == "" { + return model.NeInfo{} + } + neInfos := r.neInfoRepository.SelectByIds([]string{infoId}) + if len(neInfos) > 0 { + // 带主机信息 + if neInfos[0].HostIDs != "" && bandHost { + r.bandNeHosts(&neInfos) + } + return neInfos[0] + } + return model.NeInfo{} +} + +// Insert 新增信息 +func (r *NeInfo) Insert(neInfo model.NeInfo) string { + // 主机信息新增 + if neInfo.Hosts != nil { + var hostIDs []string + for _, host := range neInfo.Hosts { + host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) + host.GroupID = "1" + hostId := NewNeHost.Insert(host) + if hostId != "" { + hostIDs = append(hostIDs, hostId) + } + } + neInfo.HostIDs = strings.Join(hostIDs, ",") + } + + insertId := r.neInfoRepository.Insert(neInfo) + if insertId != "" { + // 刷新缓存 + r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + } + return insertId +} + +// Update 修改信息 +func (r *NeInfo) Update(neInfo model.NeInfo) int64 { + // 主机信息更新 + if neInfo.Hosts != nil { + for _, host := range neInfo.Hosts { + if host.HostID != "" { + host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) + host.GroupID = "1" + NewNeHost.Update(host) + } + } + } + + num := r.neInfoRepository.Update(neInfo) + if num > 0 { + // 刷新缓存 + r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + } + return num +} + +// DeleteByIds 批量删除信息 +func (r *NeInfo) DeleteByIds(infoIds []string) (int64, error) { + // 检查是否存在 + infos := r.neInfoRepository.SelectByIds(infoIds) + if len(infos) <= 0 { + return 0, fmt.Errorf("neHostCmd.noData") + } + + if len(infos) == len(infoIds) { + for _, v := range infos { + // 主机信息删除 + if v.HostIDs != "" { + NewNeHost.DeleteByIds(strings.Split(v.HostIDs, ",")) + } + // 删除License + neLicense := NewNeLicense.SelectByNeTypeAndNeID(v.NeType, v.NeId) + if neLicense.NeId == v.NeId { + NewNeLicense.DeleteByIds([]string{neLicense.ID}) + } + // 删除Version + neVersion := NewNeVersion.SelectByNeTypeAndNeID(v.NeType, v.NeId) + if neVersion.NeId == v.NeId { + NewNeVersion.DeleteByIds([]string{neVersion.ID}) + } + // 缓存信息删除 + redis.Del("", fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, v.NeType, v.NeId)) + } + rows := r.neInfoRepository.DeleteByIds(infoIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 +func (r *NeInfo) CheckUniqueNeTypeAndNeId(neType, neId, id string) bool { + uniqueId := r.neInfoRepository.CheckUniqueNeTypeAndNeId(model.NeInfo{ + NeType: neType, + NeId: neId, + }) + if uniqueId == id { + return true + } + return uniqueId == "" +} + +// NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() +func (r *NeInfo) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { + neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId { + logger.Errorf("NeRunSSHClient NeType:%s NeID:%s not found", neType, neId) + return nil, fmt.Errorf("neinfo not found") + } + // 取主机信息 + if neInfo.HostIDs == "" { + logger.Errorf("NeRunSSHClient NeType:%s NeID:%s hostId not found", neType, neId) + return nil, fmt.Errorf("neinfo hostId not found") + } + hostIds := strings.Split(neInfo.HostIDs, ",") + if len(hostIds) <= 1 { + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host id not found") + } + hostId := hostIds[0] // 网元主机ssh 0:22 + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host not found") + } + if neHost.HostType != "ssh" { + logger.Errorf("NeRunSSHClient Hosts first HostType %s not ssh", neHost.HostType) + return nil, fmt.Errorf("neinfo host type not ssh") + } + + var connSSH ssh.ConnSSH + neHost.CopyTo(&connSSH) + var client *ssh.ConnSSH + var err error + if neHost.AuthMode == "2" { + client, err = connSSH.NewClientByLocalPrivate() + } else { + client, err = connSSH.NewClient() + } + if err != nil { + logger.Errorf("NeRunSSHClient NewClient err => %s", err.Error()) + return nil, fmt.Errorf("neinfo ssh client new err") + } + return client, nil +} + +// NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 +func (r *NeInfo) NeRunSSHCmd(neType, neId, cmd string) (string, error) { + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return "", err + } + defer sshClient.Close() + + // 执行命令 + output, err := sshClient.RunCMD(cmd) + if err != nil { + logger.Errorf("NeRunSSHCmd RunCMD %s err => %s", output, err.Error()) + return "", fmt.Errorf("neinfo ssh run cmd err") + } + return output, nil +} + +// NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() +// num 是网元主机telnet 1:4100 2:5200 +func (r *NeInfo) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { + neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId { + logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s not found", neType, neId) + return nil, fmt.Errorf("neinfo not found") + } + // 取主机信息 + if neInfo.HostIDs == "" { + logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s hostId not found", neType, neId) + return nil, fmt.Errorf("neinfo hostId not found") + } + hostIds := strings.Split(neInfo.HostIDs, ",") + if len(hostIds) <= 1 { + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host id not found") + } + hostId := hostIds[num] // 网元主机telnet 1:4100 2:5200 + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host not found") + } + + // 创建链接Telnet客户端 + var connTelnet telnet.ConnTelnet + neHost.CopyTo(&connTelnet) + telnetClient, err := connTelnet.NewClient() + if err != nil { + logger.Errorf("NeRunTelnetClient NewClient err => %s", err.Error()) + return nil, fmt.Errorf("neinfo telnet client new err") + } + return telnetClient, nil +} + +// NeConfOAMReadSync 网元OAM配置文件读取 +func (r *NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { + oamData, err := r.neConfOAMRead(neType, neId, true) + if err != nil { + return nil, err + } + + // UPF和SMF 全小写的key + if _, ok := oamData["httpmanagecfg"]; ok { + content := map[string]any{} + // 网元HTTP服务 + // if v, ok := oamData["httpmanagecfg"]; ok { + // item := v.(map[string]any) + // } + // 对网管HTTP配置 + if v, ok := oamData["oamconfig"]; ok { + item := v.(map[string]any) + if v, ok := item["iptype"]; ok && v != "" && v != nil { + ipType := v.(string) + if ipType == "ipv6" { + content["omcIP"] = item["ipv6"] + } + if ipType == "ipv4" { + content["omcIP"] = item["ipv4"] + } + } + content["oamEnable"] = item["enable"] + content["oamPort"] = item["port"] + } + // 对网管SNMP配置 + if v, ok := oamData["snmpconfig"]; ok { + item := v.(map[string]any) + content["snmpEnable"] = item["enable"] + content["snmpPort"] = item["port"] + } + // 对网管KPI上报配置 + if v, ok := oamData["kpiconfig"]; ok { + item := v.(map[string]any) + content["kpiEnable"] = item["enable"] + content["kpiTimer"] = item["timer"] + } + + oamData := r.neConfOAMData() + r.neConfOAMWirte(neType, neId, oamData, false) + r.NeConfOAMWirteSync(model.NeInfo{ + NeType: neType, + NeId: neId, + }, content, false) + return r.neConfOAMRead(neType, neId, false) + } + + // NSSF和MME 配置KPIconfig名不一致时 + if v, ok := oamData["KPIconfig"]; ok && v != nil { + item := v.(map[string]any) + oamData["kpiConfig"] = item + delete(oamData, "KPIconfig") + r.neConfOAMWirte(neType, neId, oamData, false) + } + + return oamData, nil +} + +// neConfOAMData 网元OAM配置文件默认格式数据 +func (r *NeInfo) neConfOAMData() map[string]any { + return map[string]any{ + "httpManageCfg": map[string]any{ + "ipType": "ipv4", + "ipv4": "172.16.5.1", // 必改 + "ipv6": "", + "port": 33030, + "scheme": "http", + }, + "oamConfig": map[string]any{ + "enable": true, + "ipType": "ipv4", + "ipv4": "172.16.5.100", // 必改 + "ipv6": "", + "port": 33030, + "scheme": "http", + // 必改 + "neConfig": map[string]any{ + "neId": "001", + "rmUid": "4400HX1XXX001", + "neName": "XXX_001", + "dn": "-", + "vendorName": "GD", + "province": "-", + "pvFlag": "PNF", + }, + }, + "snmpConfig": map[string]any{ + "enable": false, + "ipType": "ipv4", + "ipv4": "172.16.5.1", // 必改 + "ipv6": "", + "port": 4957, + }, + "kpiConfig": map[string]any{ + "enable": true, + "timer": 60, // 必改 + }, + // "pubConfigPath": "/usr/local/etc/conf/para5G.yaml", // 网元只会读一次后续会置空,建议不放 + } +} + +// neConfOAMRead 网元OAM配置文件读取 sync从网元端同步到本地 +func (r *NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) { + neTypeLower := strings.ToLower(neType) + fileName := "oam_manager.yaml" + // 网管本地路径 + localFilePath := fmt.Sprintf("/usr/local/etc/omc/ne_config/%s/%s/%s", neTypeLower, neId, fileName) + if runtime.GOOS == "windows" { + localFilePath = fmt.Sprintf("C:%s", localFilePath) + } + + // 从网元端同步到本地 + if sync { + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return nil, fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return nil, fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + // 网元端文件路径 + neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo touch %s && sudo chmod o+rw %s", neFilePath, neFilePath)) + // 网元端复制到本地 + if err = sftpClient.CopyFileRemoteToLocal(neFilePath, localFilePath); err != nil { + return nil, fmt.Errorf("copy oam config err") + } + } + + // 读取文件内容 + bytes, err := os.ReadFile(localFilePath) + if err != nil { + // logger.Warnf("NeConfOAMRead ReadFile => %s", err.Error()) + // return nil, fmt.Errorf("read file error") + // 无保留文件时返回默认文件数据 + oamData := r.neConfOAMData() + r.neConfOAMWirte(neType, neId, oamData, false) + return oamData, nil + } + content := string(bytes) + + // 序列化Map + mapData, err := parse.ConvertConfigToMap("yaml", content) + if err != nil { + logger.Warnf("NeConfOAMRead ConvertConfigToMap => %s", err.Error()) + return nil, fmt.Errorf("content convert type error") + } + return mapData, nil +} + +// neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端 +func (r *NeInfo) neConfOAMWirte(neType, neId string, content any, sync bool) error { + neTypeLower := strings.ToLower(neType) + fileName := "oam_manager.yaml" + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neId, fileName) + + // 写入文件 + if err := parse.ConvertConfigToFile("yaml", localFilePath, content); err != nil { + return fmt.Errorf("please check if the file exists or write permissions") + } + + // 同步到网元端 + if sync { + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return err + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return err + } + defer sftpClient.Close() + + // 网元端配置路径 + neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) + neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) + // 复制到网元进行覆盖 + if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { + return fmt.Errorf("please check if scp remote copy is allowed") + } + } + + return nil +} + +// NeConfOAMWirteSync 网元OAM配置文件生成并同步 +func (r *NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error { + oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId, false) + if oamData == nil || err != nil { + return fmt.Errorf("error read OAM file info") + } + // 网元HTTP服务 + if v, ok := oamData["httpManageCfg"]; ok { + item := v.(map[string]any) + item["port"] = neInfo.Port + if strings.Contains(neInfo.IP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = neInfo.IP + } + if strings.Contains(neInfo.IP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = neInfo.IP + } + + oamData["httpManageCfg"] = item + } + // 对网管HTTP配置 + if v, ok := oamData["oamConfig"]; ok { + item := v.(map[string]any) + item["neConfig"] = map[string]string{ + "neId": neInfo.NeId, + "rmUid": neInfo.RmUID, + "neName": neInfo.NeName, + "dn": neInfo.Dn, + "vendorName": neInfo.VendorName, + "province": neInfo.Province, + "pvFlag": neInfo.PvFlag, + } + + // 公共参数指定的OMC + if omcIP, ok := r.Para5GData["OMC_IP"]; ok && omcIP != "" { + if strings.Contains(omcIP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = omcIP + } + if strings.Contains(omcIP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = omcIP + } + } + + if v, ok := content["omcIP"]; ok && v != "" && v != nil { + omcIP := v.(string) + if strings.Contains(omcIP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = omcIP + } + if strings.Contains(omcIP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = omcIP + } + } + if oamEnable, ok := content["oamEnable"]; ok && oamEnable != nil { + item["enable"] = parse.Boolean(oamEnable) + } + if oamPort, ok := content["oamPort"]; ok && oamPort != nil { + item["port"] = parse.Number(oamPort) + } + oamData["oamConfig"] = item + } + // 对网管SNMP配置 + if v, ok := oamData["snmpConfig"]; ok { + item := v.(map[string]any) + if strings.Contains(neInfo.IP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = neInfo.IP + } + if strings.Contains(neInfo.IP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = neInfo.IP + } + + if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil { + item["enable"] = parse.Boolean(snmpEnable) + } + if snmpPort, ok := content["snmpPort"]; ok && snmpPort != nil { + item["port"] = parse.Number(snmpPort) + } + oamData["snmpConfig"] = item + } + // 对网管KPI上报配置 + if v, ok := oamData["kpiConfig"]; ok { + item := v.(map[string]any) + if neInfo.NeType == "UPF" { + item["timer"] = 5 + } else { + item["timer"] = 60 + } + + if kpiEnable, ok := content["kpiEnable"]; ok && kpiEnable != nil { + item["enable"] = parse.Boolean(kpiEnable) + } + if kpiTimer, ok := content["kpiTimer"]; ok && kpiTimer != nil { + item["timer"] = parse.Number(kpiTimer) + } + oamData["kpiConfig"] = item + } + if err := r.neConfOAMWirte(neInfo.NeType, neInfo.NeId, oamData, sync); err != nil { + return fmt.Errorf("error wirte OAM file info") + } + return nil +} + +// NeConfPara5GRead 网元公共配置文件读取 +func (r *NeInfo) NeConfPara5GRead() (map[string]any, error) { + // 网管本地路径 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + // 读取文件内容 + bytes, err := os.ReadFile(omcFilePath) + if err != nil { + logger.Warnf("NeConfPara5GRead ReadFile => %s", err.Error()) + return nil, fmt.Errorf("read file error") + } + content := string(bytes) + + // 序列化Map + mapData, err := parse.ConvertConfigToMap("yaml", content) + if err != nil { + logger.Warnf("NeConfPara5GRead ConvertConfigToMap => %s", err.Error()) + return nil, fmt.Errorf("content convert type error") + } + return mapData, nil +} + +// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId +func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) error { + // 网管本地路径 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + + if err := parse.ConvertConfigToFile("yaml", omcFilePath, content); err != nil { + return fmt.Errorf("please check if the file exists or write permissions") + } + + // 同步到网元端 + if len(syncNE) > 0 { + errMsg := []string{} + for _, neTI := range syncNE { + ti := strings.SplitN(neTI, "@", 2) + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(ti[0], ti[1]) + if err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) + continue + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) + continue + } + defer sftpClient.Close() + + // 网元端配置路径 + neFilePath := "/usr/local/etc/conf/para5G.yaml" + neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) + // 复制到网元进行覆盖 + if err = sftpClient.CopyFileLocalToRemote(omcFilePath, neFilePath); err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : please check if scp remote copy is allowed", ti)) + continue + } + } + if len(errMsg) > 0 { + return fmt.Errorf("%s", strings.Join(errMsg, "\r\n")) + } + } + + // 转换一份数据到全局 + r.Para5GData = r.neConfPara5GDataConvert(content) + return nil +} + +// NeConfPara5GConvert 网元公共配置数据转化 content网元公共配置文件读取内容 +func (r *NeInfo) neConfPara5GDataConvert(content map[string]any) map[string]string { + defer func() { + if err := recover(); err != nil { + logger.Errorf("NeConfPara5GDataConvert panic: %v", err) + // 文件异常就删除配置 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + os.Remove(omcFilePath) + } + }() + + basic := content["basic"].(map[string]any) + external := content["external"].(map[string]any) + sbi := content["sbi"].(map[string]any) + + mcc := "460" + mnc := "01" + mncDomain := "001" + if plmnId, plmnIdOk := basic["plmnId"].(map[string]any); plmnIdOk { + mcc = plmnId["mcc"].(string) + mnc = plmnId["mnc"].(string) + // If a user input two digit MNC, add a leading zero + if len(mnc) == 2 { + mncDomain = fmt.Sprintf("0%s", mnc) + } else { + mncDomain = mnc + } + } + + sst := "1" + sd := "000001" + if plmnId, plmnIdOk := basic["snssai"].(map[string]any); plmnIdOk { + sst = plmnId["sst"].(string) + sd = plmnId["sd"].(string) + } + + n3IPAmdMask := external["upfn3_ip"].(string) + n3Arr := strings.SplitN(n3IPAmdMask, "/", 2) + n3IP := n3Arr[0] + n3Mask := "255.255.255.0" + if len(n3Arr) > 1 { + n3Mask = parse.ConvertIPMask(parse.Number(n3Arr[1])) + } + + n6IPAmdMask := external["upfn6_ip"].(string) + n6Arr := strings.SplitN(n6IPAmdMask, "/", 2) + n6IP := n6Arr[0] + n6Mask := "255.255.255.0" + if len(n6Arr) > 1 { + n6Mask = parse.ConvertIPMask(parse.Number(n6Arr[1])) + } + + ueIPAmdMask := external["ue_pool"].(string) + ueArr := strings.SplitN(ueIPAmdMask, "/", 2) + ueIP := ueArr[0] + ueCicr := "24" + ueMask := "255.255.255.0" + if len(ueArr) > 1 { + ueCicr = ueArr[1] + ueMask = parse.ConvertIPMask(parse.Number(ueArr[1])) + } + + return map[string]string{ + // basic + "TAC": basic["tac"].(string), + "MCC": mcc, + "MNC": mnc, + "MNC_DOMAIN": mncDomain, + "SST": sst, + "SD": sd, + "DNN_DATA": basic["dnn_data"].(string), + "DNN_IMS": basic["dnn_ims"].(string), + + // external + "N2_IP": external["amfn2_ip"].(string), + "UE_POOL": external["ue_pool"].(string), + "UE_IP": ueIP, + "UE_MASK": ueMask, + "UE_CIDR": ueCicr, + "UPF_TYPE": external["upf_type"].(string), // StandardUPF LightUPF + "N3_IP": n3IP, + "N3_MASK": n3Mask, + "N3_GW": external["upfn3_gw"].(string), + "N3_PCI": external["upfn3_pci"].(string), + "N3_MAC": external["upfn3_mac"].(string), + "N6_IP": n6IP, + "N6_MASK": n6Mask, + "N6_GW": external["upfn6_gw"].(string), + "N6_PCI": external["upfn6_pci"].(string), + "N6_MAC": external["upfn6_mac"].(string), + + "SIP_IP": external["ims_sip_ip"].(string), + + "S1_MMEIP": external["mmes1_ip"].(string), + "S11_MMEIP": external["mmes11_ip"].(string), + "S10_MMEIP": external["mmes10_ip"].(string), + + // sbi + "OMC_IP": sbi["omc_ip"].(string), + "IMS_IP": sbi["ims_ip"].(string), + "AMF_IP": sbi["amf_ip"].(string), + "AUSF_IP": sbi["ausf_ip"].(string), + "UDM_IP": sbi["udm_ip"].(string), + "SMF_IP": sbi["smf_ip"].(string), + "PCF_IP": sbi["pcf_ip"].(string), + "NSSF_IP": sbi["nssf_ip"].(string), + "NRF_IP": sbi["nrf_ip"].(string), + "UPF_IP": sbi["upf_ip"].(string), + "LMF_IP": sbi["lmf_ip"].(string), + "NEF_IP": sbi["nef_ip"].(string), + "MME_IP": sbi["mme_ip"].(string), + "N3IWF_IP": sbi["n3iwf_ip"].(string), + "SMSC_IP": sbi["smsc_ip"].(string), + + "DB_IP": sbi["db_ip"].(string), + } } diff --git a/src/modules/network_element/service/ne_info.impl.go b/src/modules/network_element/service/ne_info.impl.go deleted file mode 100644 index 9a12e47c..00000000 --- a/src/modules/network_element/service/ne_info.impl.go +++ /dev/null @@ -1,918 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/logger" - "be.ems/src/framework/redis" - "be.ems/src/framework/telnet" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/ssh" - neFetchlink "be.ems/src/modules/network_element/fetch_link" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeInfoImpl 结构体 -var NewNeInfoImpl = &NeInfoImpl{ - neInfoRepository: repository.NewNeInfoImpl, - Para5GData: map[string]string{}, -} - -// 网元信息 服务层处理 -type NeInfoImpl struct { - // 网元信息数据信息 - neInfoRepository repository.INeInfo - Para5GData map[string]string -} - -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { - var neInfo model.NeInfo - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &neInfo) - if err != nil { - neInfo = model.NeInfo{} - } - } else { - neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) - if neInfo.ID != "" && neInfo.NeId == neID { - redis.Del("", key) - values, _ := json.Marshal(neInfo) - redis.Set("", key, string(values)) - } - } - return neInfo -} - -// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 -func (r *NeInfoImpl) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { - var neInfo model.NeInfo - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) - redis.Del("", key) - neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) - if neInfo.ID != "" && neInfo.NeId == neID { - values, _ := json.Marshal(neInfo) - redis.Set("", key, string(values)) - } - return neInfo -} - -// ClearNeCacheByNeType 清除网元类型缓存 -func (r *NeInfoImpl) ClearNeCacheByNeType(neType string) bool { - key := fmt.Sprintf("%s*", cachekey.NE_KEY) - if neType != "*" { - key = fmt.Sprintf("%s%s*", cachekey.NE_KEY, neType) - } - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// SelectNeInfoByRmuid 通过rmUID查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByRmuid(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 带状态信息 -func (r *NeInfoImpl) SelectPage(query map[string]any, bandStatus bool) map[string]any { - data := r.neInfoRepository.SelectPage(query) - - // 网元直连读取网元服务状态 - if bandStatus { - rows := data["rows"].([]model.NeInfo) - r.bandNeStatus(&rows) - } - - return data -} - -// SelectList 查询列表 -// -// bandStatus 带状态信息 -// bandHost 带主机信息 -func (r *NeInfoImpl) SelectList(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 *NeInfoImpl) bandNeStatus(arr *[]model.NeInfo) { - for i := range *arr { - v := (*arr)[i] - result, err := neFetchlink.NeState(v) - if err != nil { - (*arr)[i].ServerState = map[string]any{ - "online": false, - } - // 网元状态设置为离线 - if v.Status != "0" { - v.Status = "0" - (*arr)[i].Status = v.Status - r.neInfoRepository.Update(v) - } - continue - } - result["online"] = true - (*arr)[i].ServerState = result - // 网元状态设置为在线 - if v.Status != "1" { - // 下发网管配置信息给网元 - _, err = neFetchlink.NeConfigOMC(v) - if err == nil { - v.Status = "1" - } else { - v.Status = "2" - } - (*arr)[i].Status = v.Status - r.neInfoRepository.Update(v) - } - } -} - -// bandNeHosts 网元列表项数据带网元主机信息 -func (r *NeInfoImpl) bandNeHosts(arr *[]model.NeInfo) { - for i := range *arr { - v := (*arr)[i] - if v.HostIDs != "" { - hostIds := strings.Split(v.HostIDs, ",") - if len(hostIds) <= 1 { - continue - } - for _, hostId := range hostIds { - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - continue - } - (*arr)[i].Hosts = append((*arr)[i].Hosts, neHost) - } - } - } -} - -// SelectByIds 通过ID查询 -// -// bandHost 带主机信息 -func (r *NeInfoImpl) SelectById(infoId string, bandHost bool) model.NeInfo { - if infoId == "" { - return model.NeInfo{} - } - neInfos := r.neInfoRepository.SelectByIds([]string{infoId}) - if len(neInfos) > 0 { - // 带主机信息 - if neInfos[0].HostIDs != "" && bandHost { - r.bandNeHosts(&neInfos) - } - return neInfos[0] - } - return model.NeInfo{} -} - -// Insert 新增信息 -func (r *NeInfoImpl) Insert(neInfo model.NeInfo) string { - // 主机信息新增 - if neInfo.Hosts != nil { - var hostIDs []string - for _, host := range neInfo.Hosts { - host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) - host.GroupID = "1" - hostId := NewNeHostImpl.Insert(host) - if hostId != "" { - hostIDs = append(hostIDs, hostId) - } - } - neInfo.HostIDs = strings.Join(hostIDs, ",") - } - - insertId := r.neInfoRepository.Insert(neInfo) - if insertId != "" { - // 刷新缓存 - r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - } - return insertId -} - -// Update 修改信息 -func (r *NeInfoImpl) Update(neInfo model.NeInfo) int64 { - // 主机信息更新 - if neInfo.Hosts != nil { - for _, host := range neInfo.Hosts { - if host.HostID != "" { - host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) - host.GroupID = "1" - NewNeHostImpl.Update(host) - } - } - } - - num := r.neInfoRepository.Update(neInfo) - if num > 0 { - // 刷新缓存 - r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - } - return num -} - -// DeleteByIds 批量删除信息 -func (r *NeInfoImpl) DeleteByIds(infoIds []string) (int64, error) { - // 检查是否存在 - infos := r.neInfoRepository.SelectByIds(infoIds) - if len(infos) <= 0 { - return 0, fmt.Errorf("neHostCmd.noData") - } - - if len(infos) == len(infoIds) { - for _, v := range infos { - // 主机信息删除 - if v.HostIDs != "" { - NewNeHostImpl.DeleteByIds(strings.Split(v.HostIDs, ",")) - } - // 删除License - neLicense := NewNeLicenseImpl.SelectByNeTypeAndNeID(v.NeType, v.NeId) - if neLicense.NeId == v.NeId { - NewNeLicenseImpl.DeleteByIds([]string{neLicense.ID}) - } - // 删除Version - neVersion := NewNeVersion.SelectByNeTypeAndNeID(v.NeType, v.NeId) - if neVersion.NeId == v.NeId { - NewNeVersion.DeleteByIds([]string{neVersion.ID}) - } - // 缓存信息删除 - redis.Del("", fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, v.NeType, v.NeId)) - } - rows := r.neInfoRepository.DeleteByIds(infoIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 -func (r *NeInfoImpl) CheckUniqueNeTypeAndNeId(neType, neId, id string) bool { - uniqueId := r.neInfoRepository.CheckUniqueNeTypeAndNeId(model.NeInfo{ - NeType: neType, - NeId: neId, - }) - if uniqueId == id { - return true - } - return uniqueId == "" -} - -// NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() -func (r *NeInfoImpl) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { - logger.Errorf("NeRunSSHClient NeType:%s NeID:%s not found", neType, neId) - return nil, fmt.Errorf("neinfo not found") - } - // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunSSHClient NeType:%s NeID:%s hostId not found", neType, neId) - return nil, fmt.Errorf("neinfo hostId not found") - } - hostIds := strings.Split(neInfo.HostIDs, ",") - if len(hostIds) <= 1 { - logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host id not found") - } - hostId := hostIds[0] // 网元主机ssh 0:22 - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host not found") - } - if neHost.HostType != "ssh" { - logger.Errorf("NeRunSSHClient Hosts first HostType %s not ssh", neHost.HostType) - return nil, fmt.Errorf("neinfo host type not ssh") - } - - var connSSH ssh.ConnSSH - neHost.CopyTo(&connSSH) - var client *ssh.ConnSSH - var err error - if neHost.AuthMode == "2" { - client, err = connSSH.NewClientByLocalPrivate() - } else { - client, err = connSSH.NewClient() - } - if err != nil { - logger.Errorf("NeRunSSHClient NewClient err => %s", err.Error()) - return nil, fmt.Errorf("neinfo ssh client new err") - } - return client, nil -} - -// NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 -func (r *NeInfoImpl) NeRunSSHCmd(neType, neId, cmd string) (string, error) { - sshClient, err := r.NeRunSSHClient(neType, neId) - if err != nil { - return "", err - } - defer sshClient.Close() - - // 执行命令 - output, err := sshClient.RunCMD(cmd) - if err != nil { - logger.Errorf("NeRunSSHCmd RunCMD %s err => %s", output, err.Error()) - return "", fmt.Errorf("neinfo ssh run cmd err") - } - return output, nil -} - -// NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() -// num 是网元主机telnet 1:4100 2:5200 -func (r *NeInfoImpl) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { - logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s not found", neType, neId) - return nil, fmt.Errorf("neinfo not found") - } - // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s hostId not found", neType, neId) - return nil, fmt.Errorf("neinfo hostId not found") - } - hostIds := strings.Split(neInfo.HostIDs, ",") - if len(hostIds) <= 1 { - logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host id not found") - } - hostId := hostIds[num] // 网元主机telnet 1:4100 2:5200 - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host not found") - } - - // 创建链接Telnet客户端 - var connTelnet telnet.ConnTelnet - neHost.CopyTo(&connTelnet) - telnetClient, err := connTelnet.NewClient() - if err != nil { - logger.Errorf("NeRunTelnetClient NewClient err => %s", err.Error()) - return nil, fmt.Errorf("neinfo telnet client new err") - } - return telnetClient, nil -} - -// NeConfOAMReadSync 网元OAM配置文件读取 -func (r *NeInfoImpl) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { - oamData, err := r.neConfOAMRead(neType, neId, true) - if err != nil { - return nil, err - } - - // UPF和SMF 全小写的key - if _, ok := oamData["httpmanagecfg"]; ok { - content := map[string]any{} - // 网元HTTP服务 - // if v, ok := oamData["httpmanagecfg"]; ok { - // item := v.(map[string]any) - // } - // 对网管HTTP配置 - if v, ok := oamData["oamconfig"]; ok { - item := v.(map[string]any) - if v, ok := item["iptype"]; ok && v != "" && v != nil { - ipType := v.(string) - if ipType == "ipv6" { - content["omcIP"] = item["ipv6"] - } - if ipType == "ipv4" { - content["omcIP"] = item["ipv4"] - } - } - content["oamEnable"] = item["enable"] - content["oamPort"] = item["port"] - } - // 对网管SNMP配置 - if v, ok := oamData["snmpconfig"]; ok { - item := v.(map[string]any) - content["snmpEnable"] = item["enable"] - content["snmpPort"] = item["port"] - } - // 对网管KPI上报配置 - if v, ok := oamData["kpiconfig"]; ok { - item := v.(map[string]any) - content["kpiEnable"] = item["enable"] - content["kpiTimer"] = item["timer"] - } - - oamData := r.neConfOAMData() - r.neConfOAMWirte(neType, neId, oamData, false) - r.NeConfOAMWirteSync(model.NeInfo{ - NeType: neType, - NeId: neId, - }, content, false) - return r.neConfOAMRead(neType, neId, false) - } - - // NSSF和MME 配置KPIconfig名不一致时 - if v, ok := oamData["KPIconfig"]; ok && v != nil { - item := v.(map[string]any) - oamData["kpiConfig"] = item - delete(oamData, "KPIconfig") - r.neConfOAMWirte(neType, neId, oamData, false) - } - - return oamData, nil -} - -// neConfOAMData 网元OAM配置文件默认格式数据 -func (r *NeInfoImpl) neConfOAMData() map[string]any { - return map[string]any{ - "httpManageCfg": map[string]any{ - "ipType": "ipv4", - "ipv4": "172.16.5.1", // 必改 - "ipv6": "", - "port": 33030, - "scheme": "http", - }, - "oamConfig": map[string]any{ - "enable": true, - "ipType": "ipv4", - "ipv4": "172.16.5.100", // 必改 - "ipv6": "", - "port": 33030, - "scheme": "http", - // 必改 - "neConfig": map[string]any{ - "neId": "001", - "rmUid": "4400HX1XXX001", - "neName": "XXX_001", - "dn": "-", - "vendorName": "GD", - "province": "-", - "pvFlag": "PNF", - }, - }, - "snmpConfig": map[string]any{ - "enable": false, - "ipType": "ipv4", - "ipv4": "172.16.5.1", // 必改 - "ipv6": "", - "port": 4957, - }, - "kpiConfig": map[string]any{ - "enable": true, - "timer": 60, // 必改 - }, - // "pubConfigPath": "/usr/local/etc/conf/para5G.yaml", // 网元只会读一次后续会置空,建议不放 - } -} - -// neConfOAMRead 网元OAM配置文件读取 sync从网元端同步到本地 -func (r *NeInfoImpl) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) { - neTypeLower := strings.ToLower(neType) - fileName := "oam_manager.yaml" - // 网管本地路径 - localFilePath := fmt.Sprintf("/usr/local/etc/omc/ne_config/%s/%s/%s", neTypeLower, neId, fileName) - if runtime.GOOS == "windows" { - localFilePath = fmt.Sprintf("C:%s", localFilePath) - } - - // 从网元端同步到本地 - if sync { - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neType, neId) - if err != nil { - return nil, fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return nil, fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - // 网元端文件路径 - neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo touch %s && sudo chmod o+rw %s", neFilePath, neFilePath)) - // 网元端复制到本地 - if err = sftpClient.CopyFileRemoteToLocal(neFilePath, localFilePath); err != nil { - return nil, fmt.Errorf("copy oam config err") - } - } - - // 读取文件内容 - bytes, err := os.ReadFile(localFilePath) - if err != nil { - // logger.Warnf("NeConfOAMRead ReadFile => %s", err.Error()) - // return nil, fmt.Errorf("read file error") - // 无保留文件时返回默认文件数据 - oamData := r.neConfOAMData() - r.neConfOAMWirte(neType, neId, oamData, false) - return oamData, nil - } - content := string(bytes) - - // 序列化Map - mapData, err := parse.ConvertConfigToMap("yaml", content) - if err != nil { - logger.Warnf("NeConfOAMRead ConvertConfigToMap => %s", err.Error()) - return nil, fmt.Errorf("content convert type error") - } - return mapData, nil -} - -// neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端 -func (r *NeInfoImpl) neConfOAMWirte(neType, neId string, content any, sync bool) error { - neTypeLower := strings.ToLower(neType) - fileName := "oam_manager.yaml" - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neId, fileName) - - // 写入文件 - if err := parse.ConvertConfigToFile("yaml", localFilePath, content); err != nil { - return fmt.Errorf("please check if the file exists or write permissions") - } - - // 同步到网元端 - if sync { - // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(neType, neId) - if err != nil { - return err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return err - } - defer sftpClient.Close() - - // 网元端配置路径 - neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) - neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) - // 复制到网元进行覆盖 - if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { - return fmt.Errorf("please check if scp remote copy is allowed") - } - } - - return nil -} - -// NeConfOAMWirteSync 网元OAM配置文件生成并同步 -func (r *NeInfoImpl) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error { - oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId, false) - if oamData == nil || err != nil { - return fmt.Errorf("error read OAM file info") - } - // 网元HTTP服务 - if v, ok := oamData["httpManageCfg"]; ok { - item := v.(map[string]any) - item["port"] = neInfo.Port - if strings.Contains(neInfo.IP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = neInfo.IP - } - if strings.Contains(neInfo.IP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = neInfo.IP - } - - oamData["httpManageCfg"] = item - } - // 对网管HTTP配置 - if v, ok := oamData["oamConfig"]; ok { - item := v.(map[string]any) - item["neConfig"] = map[string]string{ - "neId": neInfo.NeId, - "rmUid": neInfo.RmUID, - "neName": neInfo.NeName, - "dn": neInfo.Dn, - "vendorName": neInfo.VendorName, - "province": neInfo.Province, - "pvFlag": neInfo.PvFlag, - } - - // 公共参数指定的OMC - if omcIP, ok := r.Para5GData["OMC_IP"]; ok && omcIP != "" { - if strings.Contains(omcIP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = omcIP - } - if strings.Contains(omcIP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = omcIP - } - } - - if v, ok := content["omcIP"]; ok && v != "" && v != nil { - omcIP := v.(string) - if strings.Contains(omcIP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = omcIP - } - if strings.Contains(omcIP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = omcIP - } - } - if oamEnable, ok := content["oamEnable"]; ok && oamEnable != nil { - item["enable"] = parse.Boolean(oamEnable) - } - if oamPort, ok := content["oamPort"]; ok && oamPort != nil { - item["port"] = parse.Number(oamPort) - } - oamData["oamConfig"] = item - } - // 对网管SNMP配置 - if v, ok := oamData["snmpConfig"]; ok { - item := v.(map[string]any) - if strings.Contains(neInfo.IP, ":") { - item["ipType"] = "ipv6" - item["ipv6"] = neInfo.IP - } - if strings.Contains(neInfo.IP, ".") { - item["ipType"] = "ipv4" - item["ipv4"] = neInfo.IP - } - - if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil { - item["enable"] = parse.Boolean(snmpEnable) - } - if snmpPort, ok := content["snmpPort"]; ok && snmpPort != nil { - item["port"] = parse.Number(snmpPort) - } - oamData["snmpConfig"] = item - } - // 对网管KPI上报配置 - if v, ok := oamData["kpiConfig"]; ok { - item := v.(map[string]any) - if neInfo.NeType == "UPF" { - item["timer"] = 5 - } else { - item["timer"] = 60 - } - - if kpiEnable, ok := content["kpiEnable"]; ok && kpiEnable != nil { - item["enable"] = parse.Boolean(kpiEnable) - } - if kpiTimer, ok := content["kpiTimer"]; ok && kpiTimer != nil { - item["timer"] = parse.Number(kpiTimer) - } - oamData["kpiConfig"] = item - } - if err := NewNeInfoImpl.neConfOAMWirte(neInfo.NeType, neInfo.NeId, oamData, sync); err != nil { - return fmt.Errorf("error wirte OAM file info") - } - return nil -} - -// NeConfPara5GRead 网元公共配置文件读取 -func (r *NeInfoImpl) NeConfPara5GRead() (map[string]any, error) { - // 网管本地路径 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - // 读取文件内容 - bytes, err := os.ReadFile(omcFilePath) - if err != nil { - logger.Warnf("NeConfPara5GRead ReadFile => %s", err.Error()) - return nil, fmt.Errorf("read file error") - } - content := string(bytes) - - // 序列化Map - mapData, err := parse.ConvertConfigToMap("yaml", content) - if err != nil { - logger.Warnf("NeConfPara5GRead ConvertConfigToMap => %s", err.Error()) - return nil, fmt.Errorf("content convert type error") - } - return mapData, nil -} - -// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId -func (r *NeInfoImpl) NeConfPara5GWirte(content map[string]any, syncNE []string) error { - // 网管本地路径 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - - if err := parse.ConvertConfigToFile("yaml", omcFilePath, content); err != nil { - return fmt.Errorf("please check if the file exists or write permissions") - } - - // 同步到网元端 - if len(syncNE) > 0 { - errMsg := []string{} - for _, neTI := range syncNE { - ti := strings.SplitN(neTI, "@", 2) - // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(ti[0], ti[1]) - if err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) - continue - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) - continue - } - defer sftpClient.Close() - - // 网元端配置路径 - neFilePath := "/usr/local/etc/conf/para5G.yaml" - neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) - // 复制到网元进行覆盖 - if err = sftpClient.CopyFileLocalToRemote(omcFilePath, neFilePath); err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : please check if scp remote copy is allowed", ti)) - continue - } - } - if len(errMsg) > 0 { - return fmt.Errorf(strings.Join(errMsg, "\r\n")) - } - } - - // 转换一份数据到全局 - r.Para5GData = r.neConfPara5GDataConvert(content) - return nil -} - -// NeConfPara5GConvert 网元公共配置数据转化 content网元公共配置文件读取内容 -func (r *NeInfoImpl) neConfPara5GDataConvert(content map[string]any) map[string]string { - defer func() { - if err := recover(); err != nil { - logger.Errorf("NeConfPara5GDataConvert panic: %v", err) - // 文件异常就删除配置 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - os.Remove(omcFilePath) - } - }() - - basic := content["basic"].(map[string]any) - external := content["external"].(map[string]any) - sbi := content["sbi"].(map[string]any) - - mcc := "460" - mnc := "01" - mncDomain := "001" - if plmnId, plmnIdOk := basic["plmnId"].(map[string]any); plmnIdOk { - mcc = plmnId["mcc"].(string) - mnc = plmnId["mnc"].(string) - // If a user input two digit MNC, add a leading zero - if len(mnc) == 2 { - mncDomain = fmt.Sprintf("0%s", mnc) - } else { - mncDomain = mnc - } - } - - sst := "1" - sd := "000001" - if plmnId, plmnIdOk := basic["snssai"].(map[string]any); plmnIdOk { - sst = plmnId["sst"].(string) - sd = plmnId["sd"].(string) - } - - n3IPAmdMask := external["upfn3_ip"].(string) - n3Arr := strings.SplitN(n3IPAmdMask, "/", 2) - n3IP := n3Arr[0] - n3Mask := "255.255.255.0" - if len(n3Arr) > 1 { - n3Mask = parse.ConvertIPMask(parse.Number(n3Arr[1])) - } - - n6IPAmdMask := external["upfn6_ip"].(string) - n6Arr := strings.SplitN(n6IPAmdMask, "/", 2) - n6IP := n6Arr[0] - n6Mask := "255.255.255.0" - if len(n6Arr) > 1 { - n6Mask = parse.ConvertIPMask(parse.Number(n6Arr[1])) - } - - ueIPAmdMask := external["ue_pool"].(string) - ueArr := strings.SplitN(ueIPAmdMask, "/", 2) - ueIP := ueArr[0] - ueCicr := "24" - ueMask := "255.255.255.0" - if len(ueArr) > 1 { - ueCicr = ueArr[1] - ueMask = parse.ConvertIPMask(parse.Number(ueArr[1])) - } - - return map[string]string{ - // basic - "TAC": basic["tac"].(string), - "MCC": mcc, - "MNC": mnc, - "MNC_DOMAIN": mncDomain, - "SST": sst, - "SD": sd, - "DNN_DATA": basic["dnn_data"].(string), - "DNN_IMS": basic["dnn_ims"].(string), - - // external - "N2_IP": external["amfn2_ip"].(string), - "UE_POOL": external["ue_pool"].(string), - "UE_IP": ueIP, - "UE_MASK": ueMask, - "UE_CIDR": ueCicr, - "UPF_TYPE": external["upf_type"].(string), // StandardUPF LightUPF - "N3_IP": n3IP, - "N3_MASK": n3Mask, - "N3_GW": external["upfn3_gw"].(string), - "N3_PCI": external["upfn3_pci"].(string), - "N3_MAC": external["upfn3_mac"].(string), - "N6_IP": n6IP, - "N6_MASK": n6Mask, - "N6_GW": external["upfn6_gw"].(string), - "N6_PCI": external["upfn6_pci"].(string), - "N6_MAC": external["upfn6_mac"].(string), - - "SIP_IP": external["ims_sip_ip"].(string), - - "S1_MMEIP": external["mmes1_ip"].(string), - "S11_MMEIP": external["mmes11_ip"].(string), - "S10_MMEIP": external["mmes10_ip"].(string), - - // sbi - "OMC_IP": sbi["omc_ip"].(string), - "IMS_IP": sbi["ims_ip"].(string), - "AMF_IP": sbi["amf_ip"].(string), - "AUSF_IP": sbi["ausf_ip"].(string), - "UDM_IP": sbi["udm_ip"].(string), - "SMF_IP": sbi["smf_ip"].(string), - "PCF_IP": sbi["pcf_ip"].(string), - "NSSF_IP": sbi["nssf_ip"].(string), - "NRF_IP": sbi["nrf_ip"].(string), - "UPF_IP": sbi["upf_ip"].(string), - "LMF_IP": sbi["lmf_ip"].(string), - "NEF_IP": sbi["nef_ip"].(string), - "MME_IP": sbi["mme_ip"].(string), - "N3IWF_IP": sbi["n3iwf_ip"].(string), - "SMSC_IP": sbi["smsc_ip"].(string), - - "DB_IP": sbi["db_ip"].(string), - } -} diff --git a/src/modules/network_element/service/ne_license.go b/src/modules/network_element/service/ne_license.go index ace554d1..fa84b155 100644 --- a/src/modules/network_element/service/ne_license.go +++ b/src/modules/network_element/service/ne_license.go @@ -1,34 +1,190 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + "time" -// INeLicense 网元授权激活信息 服务层接口 -type INeLicense interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neLicense model.NeLicense) []model.NeLicense - - // SelectById 通过ID查询 - SelectById(id string) model.NeLicense - - // Insert 新增信息 - Insert(neLicense model.NeLicense) string - - // Update 修改信息 - Update(neLicense model.NeLicense) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 - SelectByNeTypeAndNeID(neType, neId string) model.NeLicense - - // ReadLicenseInfo 读取授权文件信息 - // 返回激活申请码, 激活文件 - ReadLicenseInfo(neLicense model.NeLicense) (string, string) - - // UploadLicense 授权文件上传到网元主机 - UploadLicense(neLicense model.NeLicense) error +// 实例化服务层 NeLicense 结构体 +var NewNeLicense = &NeLicense{ + neLicenseRepository: repository.NewNeLicense, +} + +// NeLicense 网元授权激活信息 服务层处理 +type NeLicense struct { + neLicenseRepository *repository.NeLicense // 网元授权激活信息表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeLicense) SelectPage(query map[string]any) map[string]any { + return r.neLicenseRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense { + return r.neLicenseRepository.SelectList(neLicense) +} + +// SelectByIds 通过ID查询 +func (r *NeLicense) SelectById(id string) model.NeLicense { + if id == "" { + return model.NeLicense{} + } + neLicenses := r.neLicenseRepository.SelectByIds([]string{id}) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// Insert 新增信息 +func (r *NeLicense) Insert(neLicense model.NeLicense) string { + return r.neLicenseRepository.Insert(neLicense) +} + +// Update 修改信息 +func (r *NeLicense) Update(neLicense model.NeLicense) int64 { + return r.neLicenseRepository.Update(neLicense) +} + +// DeleteByIds 批量删除信息 +func (r *NeLicense) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rowIds := r.neLicenseRepository.SelectByIds(ids) + if len(rowIds) <= 0 { + return 0, fmt.Errorf("neLicense.noData") + } + + if len(rowIds) == len(ids) { + rows := r.neLicenseRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// SelectByTypeAndID 通过网元类型和网元ID查询 +func (r *NeLicense) SelectByTypeAndID(neType, neId string) model.NeLicense { + neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ + NeType: neType, + NeId: neId, + }) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 +func (r *NeLicense) SelectByNeTypeAndNeID(neType, neId string) model.NeLicense { + neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ + NeType: neType, + NeId: neId, + }) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// ReadLicenseInfo 读取授权文件信息 +// 返回激活申请码, 激活文件 +func (r *NeLicense) ReadLicenseInfo(neLicense model.NeLicense) (string, string) { + neTypeLower := strings.ToLower(neLicense.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_license" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeId) + // 网元端授权文件路径 + nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower) + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.NeType, neLicense.NeId) + if err != nil { + return "", "" + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return "", "" + } + defer sftpClient.Close() + + // 复制授权申请码到本地 + if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil { + return "", "" + } + // 读取文件内容 + bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt") + if err != nil { + return "", "" + } + + // 复制激活文件到本地 + licensePath := "" + if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil { + licensePath = omcPath + "/system.ini" + } + return strings.TrimSpace(string(bytes)), licensePath +} + +// UploadLicense 授权文件上传到网元主机 +func (r *NeLicense) UploadLicense(neLicense model.NeLicense) error { + // 检查文件是否存在 + omcLicensePath := file.ParseUploadFilePath(neLicense.LicensePath) + if _, err := os.Stat(omcLicensePath); err != nil { + return fmt.Errorf("file read failure") + } + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.NeType, neLicense.NeId) + if err != nil { + return err + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return err + } + defer sftpClient.Close() + + // 网元端授权文件路径 + neTypeLower := strings.ToLower(neLicense.NeType) + neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower) + neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath)) + + // 尝试备份授权文件 + neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405")) + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack)) + + // 上传授权文件去覆盖 + if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil { + return fmt.Errorf("please check if scp remote copy is allowed") + } + + // 重启服务 + if neLicense.Reload { + cmdStr := fmt.Sprintf("sudo service %s restart", neTypeLower) + if neTypeLower == "ims" { + cmdStr = "ims-stop || true && ims-start" + } else if neTypeLower == "omc" { + cmdStr = "sudo systemctl restart restagent" + } + sshClient.RunCMD(cmdStr) + } + return nil } diff --git a/src/modules/network_element/service/ne_license.impl.go b/src/modules/network_element/service/ne_license.impl.go deleted file mode 100644 index 9d11804d..00000000 --- a/src/modules/network_element/service/ne_license.impl.go +++ /dev/null @@ -1,191 +0,0 @@ -package service - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - "time" - - "be.ems/src/framework/utils/file" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeLicenseImpl 结构体 -var NewNeLicenseImpl = &NeLicenseImpl{ - neLicenseRepository: repository.NewNeLicenseImpl, -} - -// NeLicenseImpl 网元授权激活信息 服务层处理 -type NeLicenseImpl struct { - // 网元授权激活信息表 - neLicenseRepository repository.INeLicense -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeLicenseImpl) SelectPage(query map[string]any) map[string]any { - return r.neLicenseRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeLicenseImpl) SelectList(neLicense model.NeLicense) []model.NeLicense { - return r.neLicenseRepository.SelectList(neLicense) -} - -// SelectByIds 通过ID查询 -func (r *NeLicenseImpl) SelectById(id string) model.NeLicense { - if id == "" { - return model.NeLicense{} - } - neLicenses := r.neLicenseRepository.SelectByIds([]string{id}) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// Insert 新增信息 -func (r *NeLicenseImpl) Insert(neLicense model.NeLicense) string { - return r.neLicenseRepository.Insert(neLicense) -} - -// Update 修改信息 -func (r *NeLicenseImpl) Update(neLicense model.NeLicense) int64 { - return r.neLicenseRepository.Update(neLicense) -} - -// DeleteByIds 批量删除信息 -func (r *NeLicenseImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - rowIds := r.neLicenseRepository.SelectByIds(ids) - if len(rowIds) <= 0 { - return 0, fmt.Errorf("neLicense.noData") - } - - if len(rowIds) == len(ids) { - rows := r.neLicenseRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// SelectByTypeAndID 通过网元类型和网元ID查询 -func (r *NeLicenseImpl) SelectByTypeAndID(neType, neId string) model.NeLicense { - neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ - NeType: neType, - NeId: neId, - }) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 -func (r *NeLicenseImpl) SelectByNeTypeAndNeID(neType, neId string) model.NeLicense { - neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ - NeType: neType, - NeId: neId, - }) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// ReadLicenseInfo 读取授权文件信息 -// 返回激活申请码, 激活文件 -func (r *NeLicenseImpl) ReadLicenseInfo(neLicense model.NeLicense) (string, string) { - neTypeLower := strings.ToLower(neLicense.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_license" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeId) - // 网元端授权文件路径 - nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower) - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neLicense.NeType, neLicense.NeId) - if err != nil { - return "", "" - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", "" - } - defer sftpClient.Close() - - // 复制授权申请码到本地 - if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil { - return "", "" - } - // 读取文件内容 - bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt") - if err != nil { - return "", "" - } - - // 复制激活文件到本地 - licensePath := "" - if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil { - licensePath = omcPath + "/system.ini" - } - return strings.TrimSpace(string(bytes)), licensePath -} - -// UploadLicense 授权文件上传到网元主机 -func (r *NeLicenseImpl) UploadLicense(neLicense model.NeLicense) error { - // 检查文件是否存在 - omcLicensePath := file.ParseUploadFilePath(neLicense.LicensePath) - if _, err := os.Stat(omcLicensePath); err != nil { - return fmt.Errorf("file read failure") - } - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neLicense.NeType, neLicense.NeId) - if err != nil { - return err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return err - } - defer sftpClient.Close() - - // 网元端授权文件路径 - neTypeLower := strings.ToLower(neLicense.NeType) - neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower) - neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath)) - - // 尝试备份授权文件 - neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405")) - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack)) - - // 上传授权文件去覆盖 - if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil { - return fmt.Errorf("please check if scp remote copy is allowed") - } - - // 重启服务 - if neLicense.Reload { - cmdStr := fmt.Sprintf("sudo service %s restart", neTypeLower) - if neTypeLower == "ims" { - cmdStr = "ims-stop || true && ims-start" - } else if neTypeLower == "omc" { - cmdStr = "sudo systemctl restart restagent" - } - sshClient.RunCMD(cmdStr) - } - return nil -} diff --git a/src/modules/network_element/service/ne_software.go b/src/modules/network_element/service/ne_software.go index 37e9ad4a..c4910f05 100644 --- a/src/modules/network_element/service/ne_software.go +++ b/src/modules/network_element/service/ne_software.go @@ -1,30 +1,142 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "os" -// INeSoftware 网元软件包信息 服务层接口 -type INeSoftware interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neSoftware model.NeSoftware) []model.NeSoftware - - // SelectById 通过ID查询 - SelectById(id string) model.NeSoftware - - // Insert 新增信息 - Insert(neSoftware model.NeSoftware) string - - // Update 修改信息 - Update(neSoftware model.NeSoftware) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 - CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool - - // UpdateVersions 更新软件包对应网元的新版本 - UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 +// 实例化服务层 NeSoftware 结构体 +var NewNeSoftware = &NeSoftware{ + neSoftwareRepository: repository.NewNeSoftware, +} + +// NeSoftware 网元软件包信息 服务层处理 +type NeSoftware struct { + neSoftwareRepository *repository.NeSoftware // 网元软件包信息 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeSoftware) SelectPage(query map[string]any) map[string]any { + return r.neSoftwareRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { + return r.neSoftwareRepository.SelectList(neSoftware) +} + +// SelectByIds 通过ID查询 +func (r *NeSoftware) SelectById(id string) model.NeSoftware { + if id == "" { + return model.NeSoftware{} + } + neHosts := r.neSoftwareRepository.SelectByIds([]string{id}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeSoftware{} +} + +// Insert 新增信息 +func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { + inserId := r.neSoftwareRepository.Insert(neSoftware) + if inserId != "" { + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(model.NeVersion{NeType: neSoftware.NeType}, false) + if len(neVersions) > 0 { + for _, neVersion := range neVersions { + neVersion.NewName = neSoftware.Name + neVersion.NewVersion = neSoftware.Version + neVersion.NewPath = neSoftware.Path + neVersion.Status = "3" + neVersion.UpdateBy = neSoftware.CreateBy + NewNeVersion.Update(neVersion) + } + } + } + return inserId +} + +// Update 修改信息 +func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { + rows := r.neSoftwareRepository.Update(neSoftware) + if rows > 0 { + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(model.NeVersion{ + NeType: neSoftware.NeType, + Status: "3", + }, false) + if len(neVersions) > 0 { + for _, neVersion := range neVersions { + neVersion.NewName = neSoftware.Name + neVersion.NewVersion = neSoftware.Version + neVersion.NewPath = neSoftware.Path + neVersion.Status = "3" + neVersion.UpdateBy = neSoftware.UpdateBy + NewNeVersion.Update(neVersion) + } + } + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeSoftware) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rows := r.neSoftwareRepository.SelectByIds(ids) + if len(rows) <= 0 { + return 0, fmt.Errorf("neSoftware.noData") + } + + if len(rows) == len(ids) { + // 遍历软件包列表进行文件删除 + for _, row := range rows { + // 检查文件是否存在 + filePath := file.ParseUploadFilePath(row.Path) + if _, err := os.Stat(filePath); err != nil { + continue + } + os.Remove(filePath) + } + rows := r.neSoftwareRepository.DeleteByIds(ids) + return rows, nil + } + + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 +func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool { + uniqueId := r.neSoftwareRepository.CheckUniqueTypeAndNameAndVersion(model.NeSoftware{ + NeType: neType, + Name: name, + Version: version, + }) + if uniqueId == id { + return true + } + return uniqueId == "" +} + +// UpdateVersions 更新软件包对应网元的新版本 +func (r *NeSoftware) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { + var rows int64 = 0 + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(neVersion, false) + if len(neVersions) > 0 { + for _, v := range neVersions { + v.NewName = neSoftware.Name + v.NewVersion = neSoftware.Version + v.NewPath = neSoftware.Path + v.Status = "3" + v.UpdateBy = neVersion.UpdateBy + rows += NewNeVersion.Update(v) + } + } + return rows } diff --git a/src/modules/network_element/service/ne_software.impl.go b/src/modules/network_element/service/ne_software.impl.go deleted file mode 100644 index 326ae339..00000000 --- a/src/modules/network_element/service/ne_software.impl.go +++ /dev/null @@ -1,143 +0,0 @@ -package service - -import ( - "fmt" - "os" - - "be.ems/src/framework/utils/file" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeSoftwareImpl 结构体 -var NewNeSoftwareImpl = &NeSoftwareImpl{ - neSoftwareRepository: repository.NewNeSoftwareImpl, -} - -// NeSoftwareImpl 网元软件包信息 服务层处理 -type NeSoftwareImpl struct { - // 网元软件包信息 - neSoftwareRepository repository.INeSoftware -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeSoftwareImpl) SelectPage(query map[string]any) map[string]any { - return r.neSoftwareRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeSoftwareImpl) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { - return r.neSoftwareRepository.SelectList(neSoftware) -} - -// SelectByIds 通过ID查询 -func (r *NeSoftwareImpl) SelectById(id string) model.NeSoftware { - if id == "" { - return model.NeSoftware{} - } - neHosts := r.neSoftwareRepository.SelectByIds([]string{id}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeSoftware{} -} - -// Insert 新增信息 -func (r *NeSoftwareImpl) Insert(neSoftware model.NeSoftware) string { - inserId := r.neSoftwareRepository.Insert(neSoftware) - if inserId != "" { - // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(model.NeVersion{NeType: neSoftware.NeType}, false) - if len(neVersions) > 0 { - for _, neVersion := range neVersions { - neVersion.NewName = neSoftware.Name - neVersion.NewVersion = neSoftware.Version - neVersion.NewPath = neSoftware.Path - neVersion.Status = "3" - neVersion.UpdateBy = neSoftware.CreateBy - NewNeVersion.Update(neVersion) - } - } - } - return inserId -} - -// Update 修改信息 -func (r *NeSoftwareImpl) Update(neSoftware model.NeSoftware) int64 { - rows := r.neSoftwareRepository.Update(neSoftware) - if rows > 0 { - // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(model.NeVersion{ - NeType: neSoftware.NeType, - Status: "3", - }, false) - if len(neVersions) > 0 { - for _, neVersion := range neVersions { - neVersion.NewName = neSoftware.Name - neVersion.NewVersion = neSoftware.Version - neVersion.NewPath = neSoftware.Path - neVersion.Status = "3" - neVersion.UpdateBy = neSoftware.UpdateBy - NewNeVersion.Update(neVersion) - } - } - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeSoftwareImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - rows := r.neSoftwareRepository.SelectByIds(ids) - if len(rows) <= 0 { - return 0, fmt.Errorf("neSoftware.noData") - } - - if len(rows) == len(ids) { - // 遍历软件包列表进行文件删除 - for _, row := range rows { - // 检查文件是否存在 - filePath := file.ParseUploadFilePath(row.Path) - if _, err := os.Stat(filePath); err != nil { - continue - } - os.Remove(filePath) - } - rows := r.neSoftwareRepository.DeleteByIds(ids) - return rows, nil - } - - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 -func (r *NeSoftwareImpl) CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool { - uniqueId := r.neSoftwareRepository.CheckUniqueTypeAndNameAndVersion(model.NeSoftware{ - NeType: neType, - Name: name, - Version: version, - }) - if uniqueId == id { - return true - } - return uniqueId == "" -} - -// UpdateVersions 更新软件包对应网元的新版本 -func (r *NeSoftwareImpl) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { - var rows int64 = 0 - // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(neVersion, false) - if len(neVersions) > 0 { - for _, v := range neVersions { - v.NewName = neSoftware.Name - v.NewVersion = neSoftware.Version - v.NewPath = neSoftware.Path - v.Status = "3" - v.UpdateBy = neVersion.UpdateBy - rows += NewNeVersion.Update(v) - } - } - return rows -} diff --git a/src/modules/network_element/service/ne_version.go b/src/modules/network_element/service/ne_version.go index e064c70c..4b6f21d6 100644 --- a/src/modules/network_element/service/ne_version.go +++ b/src/modules/network_element/service/ne_version.go @@ -21,8 +21,7 @@ var NewNeVersion = &NeVersion{ // NeVersion 网元版本信息 服务层处理 type NeVersion struct { - // 网元版本信息表 - neVersionRepository *repository.NeVersion + neVersionRepository *repository.NeVersion // 网元版本信息表 } // SelectNeHostPage 分页查询列表数据 @@ -55,7 +54,7 @@ func (r *NeVersion) checkNeVersion(arr *[]model.NeVersion) { for i := range *arr { item := (*arr)[i] // 查询网元获取IP - neInfo := NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(item.NeType, item.NeId) + neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(item.NeType, item.NeId) if neInfo.NeId != item.NeId || neInfo.IP == "" { continue } @@ -136,7 +135,7 @@ func (r *NeVersion) SelectByNeTypeAndNeID(neType, neId string) model.NeVersion { // action 安装行为:install upgrade rollback func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) { // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neVersion.NeType, neVersion.NeId) + sshClient, err := NewNeInfo.NeRunSSHClient(neVersion.NeType, neVersion.NeId) if err != nil { return "", err } @@ -158,11 +157,11 @@ func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput m // ========= 安装时设置 ========= if action == "install" { // 网元公共配置文件 - para5GMap, err := NewNeInfoImpl.NeConfPara5GRead() + para5GMap, err := NewNeInfo.NeConfPara5GRead() if para5GMap == nil || err != nil { return "", fmt.Errorf("error read para5G file info") } - if err := NewNeInfoImpl.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.NeType, neVersion.NeId)}); err != nil { + if err := NewNeInfo.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.NeType, neVersion.NeId)}); err != nil { return "", fmt.Errorf("error wirte para5G file info") } } @@ -271,7 +270,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) return okFlagStr, cmdStrArr, nil } else if neType == "IMS" { if action == "install" { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") // 公网 PLMN地址 @@ -313,7 +312,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) } } else { if action == "install" { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") // AMF配置修改 @@ -538,14 +537,14 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) if action == "install" && (neTypeLower == "ims" || neTypeLower == "udm") { // adb if strings.Contains(pkgCmdStr, "adb") { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/adb/default/adb.conf /usr/local/etc/adb/adb.conf \n") cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind 127.0.0.1 %s/g\" /usr/local/etc/adb/adb.conf \n", para5GData["DB_IP"])) cmdStrArr = append(cmdStrArr, "sudo service adb restart \n") } // kvdb if strings.Contains(pkgCmdStr, "kvdb") { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/kvdb/default/kvdb.conf /usr/local/etc/kvdb/kvdb.conf \n") cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind 127.0.0.1 %s/g\" /usr/local/etc/kvdb/kvdb.conf \n", para5GData["DB_IP"])) cmdStrArr = append(cmdStrArr, "sudo service kvdb restart \n") @@ -654,12 +653,12 @@ func (r *NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]strin func (r *NeVersion) operateDome(action string, neVersion model.NeVersion) error { if action == "install" { // 网元信息 - neInfo := NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) + neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) if neInfo.NeId != neVersion.NeId { return fmt.Errorf("error found neinfo") } // ========= 网元OAM配置文件 start ========== - if err := NewNeInfoImpl.NeConfOAMWirteSync(neInfo, nil, true); err != nil { + if err := NewNeInfo.NeConfOAMWirteSync(neInfo, nil, true); err != nil { return fmt.Errorf("error wirte OAM file info") } // ========= 网元OAM配置文件 end =========== diff --git a/src/modules/tool/controller/iperf.go b/src/modules/tool/controller/iperf.go index c908d584..71413d6b 100644 --- a/src/modules/tool/controller/iperf.go +++ b/src/modules/tool/controller/iperf.go @@ -99,7 +99,7 @@ func (s *IPerfController) Run(c *gin.Context) { } // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/tool/controller/ping.go b/src/modules/tool/controller/ping.go index 7af020de..3f3f5b44 100644 --- a/src/modules/tool/controller/ping.go +++ b/src/modules/tool/controller/ping.go @@ -105,7 +105,7 @@ func (s *PingController) Run(c *gin.Context) { } // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/tool/service/iperf.go b/src/modules/tool/service/iperf.go index ae204513..84ec00b6 100644 --- a/src/modules/tool/service/iperf.go +++ b/src/modules/tool/service/iperf.go @@ -16,20 +16,15 @@ import ( ) // 实例化服务层 IPerf 结构体 -var NewIPerf = &IPerf{ - neInfoService: neService.NewNeInfoImpl, -} +var NewIPerf = &IPerf{} // IPerf 网络性能测试工具 服务层处理 -type IPerf struct { - // 网元信息服务 - neInfoService neService.INeInfo -} +type IPerf struct{} // Version 查询版本信息 func (s *IPerf) Version(meType, neId string) (string, error) { // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(meType, neId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId) if err != nil { return "", err } @@ -46,7 +41,7 @@ func (s *IPerf) Version(meType, neId string) (string, error) { // Install 安装iperf3 func (s *IPerf) Install(meType, neId string) error { // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(meType, neId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId) if err != nil { return err } diff --git a/src/modules/tool/service/ping.go b/src/modules/tool/service/ping.go index 100ef9db..1ce9b016 100644 --- a/src/modules/tool/service/ping.go +++ b/src/modules/tool/service/ping.go @@ -10,22 +10,16 @@ import ( "be.ems/src/framework/logger" "be.ems/src/framework/utils/ssh" "be.ems/src/framework/vo/result" - neService "be.ems/src/modules/network_element/service" "be.ems/src/modules/tool/model" wsModel "be.ems/src/modules/ws/model" probing "github.com/prometheus-community/pro-bing" ) // 实例化服务层 Ping 结构体 -var NewPing = &Ping{ - neInfoService: neService.NewNeInfoImpl, -} +var NewPing = &Ping{} // Ping 网络性能测试工具 服务层处理 -type Ping struct { - // 网元信息服务 - neInfoService neService.INeInfo -} +type Ping struct{} // Statistics ping基本信息 func (s *Ping) Statistics(ping model.Ping) (map[string]any, error) { diff --git a/src/modules/trace/controller/tcpdump.go b/src/modules/trace/controller/tcpdump.go index 9ef6fa60..03ace4da 100644 --- a/src/modules/trace/controller/tcpdump.go +++ b/src/modules/trace/controller/tcpdump.go @@ -16,7 +16,7 @@ import ( // 实例化控制层 TCPdumpController 结构体 var NewTCPdump = &TCPdumpController{ tcpdumpService: traceService.NewTCPdump, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // 信令抓包 @@ -24,7 +24,7 @@ var NewTCPdump = &TCPdumpController{ // PATH /tcpdump type TCPdumpController struct { tcpdumpService *traceService.TCPdump // 信令抓包服务 - neInfoService neService.INeInfo // 网元信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元抓包PACP 开始 diff --git a/src/modules/trace/controller/trace_task_hlr.go b/src/modules/trace/controller/trace_task_hlr.go index 4b659015..07acc5ba 100644 --- a/src/modules/trace/controller/trace_task_hlr.go +++ b/src/modules/trace/controller/trace_task_hlr.go @@ -21,7 +21,7 @@ import ( // 实例化控制层 TraceTaskHlrController 结构体 var NewTraceTaskHlr = &TraceTaskHlrController{ - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, traceTaskHlrService: traceService.NewTraceTaskHlr, } @@ -29,10 +29,8 @@ var NewTraceTaskHlr = &TraceTaskHlrController{ // // PATH /task/hlr type TraceTaskHlrController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 跟踪_任务给HRL网元信息服务 - traceTaskHlrService *traceService.TraceTaskHlr + neInfoService *neService.NeInfo // 网元信息服务 + traceTaskHlrService *traceService.TraceTaskHlr // 跟踪_任务给HRL网元信息服务 } // 跟踪任务列表 diff --git a/src/modules/trace/service/tcpdump.go b/src/modules/trace/service/tcpdump.go index 2511736d..72c8553d 100644 --- a/src/modules/trace/service/tcpdump.go +++ b/src/modules/trace/service/tcpdump.go @@ -18,13 +18,12 @@ import ( // 实例化服务层 TCPdump 结构体 var NewTCPdump = &TCPdump{ - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // 信令抓包 服务层处理 type TCPdump struct { - // 网元信息服务 - neInfoService neService.INeInfo + neInfoService *neService.NeInfo // 网元信息服务 } // 抓包进程PID diff --git a/src/modules/trace/service/trace_task.go b/src/modules/trace/service/trace_task.go index bc1682c7..98e8d7c0 100644 --- a/src/modules/trace/service/trace_task.go +++ b/src/modules/trace/service/trace_task.go @@ -189,7 +189,7 @@ func (r *TraceTask) Insert(task model.TraceTask) error { task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) if neInfo.NeId != task.NeId || neInfo.IP == "" { return fmt.Errorf("app.common.noNEInfo") } @@ -254,7 +254,7 @@ func (r *TraceTask) Update(task model.TraceTask) error { task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) if neInfo.NeId != task.NeId || neInfo.IP == "" { return fmt.Errorf("app.common.noNEInfo") } @@ -309,7 +309,7 @@ func (r *TraceTask) DeleteByIds(ids []string) (int64, error) { if len(rows) == len(ids) { // 停止任务 for _, v := range rows { - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(v.NeType, v.NeId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(v.NeType, v.NeId) if neInfo.NeId != v.NeId || neInfo.IP == "" { continue } diff --git a/src/modules/trace/service/trace_task_hlr.go b/src/modules/trace/service/trace_task_hlr.go index 835f1c11..9eee3843 100644 --- a/src/modules/trace/service/trace_task_hlr.go +++ b/src/modules/trace/service/trace_task_hlr.go @@ -17,15 +17,13 @@ import ( // 实例化数据层 TraceTaskHlr 结构体 var NewTraceTaskHlr = &TraceTaskHlr{ traceTaskHlrRepository: repository.NewTraceTaskHlr, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // TraceTaskHlr 跟踪_任务给HRL网元 服务层处理 type TraceTaskHlr struct { - // 跟踪_任务给HRL网元数据信息 - traceTaskHlrRepository *repository.TraceTaskHlr - // 网元信息服务 - neInfoService neService.INeInfo + traceTaskHlrRepository *repository.TraceTaskHlr // 跟踪_任务给HRL网元数据信息 + neInfoService *neService.NeInfo // 网元信息服务 } // SelectPage 根据条件分页查询 diff --git a/src/modules/ws/controller/ws_ssh.go b/src/modules/ws/controller/ws_ssh.go index d5444c44..db33b6bd 100644 --- a/src/modules/ws/controller/ws_ssh.go +++ b/src/modules/ws/controller/ws_ssh.go @@ -43,7 +43,7 @@ func (s *WSController) SSH(c *gin.Context) { return } - neHost := neService.NewNeHostImpl.SelectById(query.HostId) + neHost := neService.NewNeHost.SelectById(query.HostId) if neHost.HostID != query.HostId || neHost.HostType != "ssh" { // 没有可访问主机信息数据! c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) diff --git a/src/modules/ws/controller/ws_telnet.go b/src/modules/ws/controller/ws_telnet.go index 668d0ec4..34f52240 100644 --- a/src/modules/ws/controller/ws_telnet.go +++ b/src/modules/ws/controller/ws_telnet.go @@ -43,7 +43,7 @@ func (s *WSController) Telnet(c *gin.Context) { return } - neHost := neService.NewNeHostImpl.SelectById(query.HostId) + neHost := neService.NewNeHost.SelectById(query.HostId) if neHost.HostID != query.HostId || neHost.HostType != "telnet" { // 没有可访问主机信息数据! c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) diff --git a/src/modules/ws/controller/ws_view.go b/src/modules/ws/controller/ws_view.go index 56c77f89..2b2594d2 100644 --- a/src/modules/ws/controller/ws_view.go +++ b/src/modules/ws/controller/ws_view.go @@ -44,7 +44,7 @@ func (s *WSController) ShellView(c *gin.Context) { } // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/ws/processor/cdr_connect.go b/src/modules/ws/processor/cdr_connect.go index f7d1efff..5cfc7776 100644 --- a/src/modules/ws/processor/cdr_connect.go +++ b/src/modules/ws/processor/cdr_connect.go @@ -22,13 +22,13 @@ func GetCDRConnectByIMS(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventIMSImpl.SelectPage(query) + dataMap := neDataService.NewCDREventIMS.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -47,13 +47,13 @@ func GetCDRConnectBySMF(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventSMFImpl.SelectPage(query) + dataMap := neDataService.NewCDREventSMF.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -72,13 +72,13 @@ func GetCDRConnectBySMSC(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventSMSCImpl.SelectPage(query) + dataMap := neDataService.NewCDREventSMSC.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, diff --git a/src/modules/ws/processor/ne_state.go b/src/modules/ws/processor/ne_state.go index 64e76e72..bd4b1446 100644 --- a/src/modules/ws/processor/ne_state.go +++ b/src/modules/ws/processor/ne_state.go @@ -28,7 +28,7 @@ func GetNeState(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { return nil, fmt.Errorf("no matching network element information found") } diff --git a/src/modules/ws/processor/ue_connect.go b/src/modules/ws/processor/ue_connect.go index bb0f6492..f6903819 100644 --- a/src/modules/ws/processor/ue_connect.go +++ b/src/modules/ws/processor/ue_connect.go @@ -20,7 +20,7 @@ func GetUEConnectByAMF(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } - dataMap := neDataService.NewUEEventAMFImpl.SelectPage(query) + dataMap := neDataService.NewUEEventAMF.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -38,7 +38,7 @@ func GetUEConnectByMME(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } - dataMap := neDataService.NewUEEventMMEImpl.SelectPage(query) + dataMap := neDataService.NewUEEventMME.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, diff --git a/src/modules/ws/processor/upf_total_flow.go b/src/modules/ws/processor/upf_total_flow.go index 9a86786a..0186dcd3 100644 --- a/src/modules/ws/processor/upf_total_flow.go +++ b/src/modules/ws/processor/upf_total_flow.go @@ -29,12 +29,12 @@ func GetUPFTotalFlow(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { return nil, fmt.Errorf("no matching network element information found") } - dataMap := neDataService.NewPerfKPIImpl.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) + dataMap := neDataService.NewPerfKPI.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID,