From 3a5c3edc70250e107ad34072464a682bf29c0b74 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 27 Jan 2024 18:00:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BD=91=E5=85=83=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/{ue_event.go => amf.go} | 14 ++--- .../controller/{cdr_event.go => ims.go} | 14 ++--- .../network_data/controller/perf_kpi.go | 2 +- src/modules/network_data/controller/upf.go | 52 +++++++++++++++++++ src/modules/network_data/network_data.go | 26 +++++++--- .../network_data/repository/perf_kpi.go | 7 ++- .../network_data/repository/perf_kpi.impl.go | 44 ++++++++++++++-- src/modules/network_data/service/perf_kpi.go | 7 ++- .../network_data/service/perf_kpi.impl.go | 20 +++++-- 9 files changed, 152 insertions(+), 34 deletions(-) rename src/modules/network_data/controller/{ue_event.go => amf.go} (83%) rename src/modules/network_data/controller/{cdr_event.go => ims.go} (83%) create mode 100644 src/modules/network_data/controller/upf.go diff --git a/src/modules/network_data/controller/ue_event.go b/src/modules/network_data/controller/amf.go similarity index 83% rename from src/modules/network_data/controller/ue_event.go rename to src/modules/network_data/controller/amf.go index 4527461e..1c92fb44 100644 --- a/src/modules/network_data/controller/ue_event.go +++ b/src/modules/network_data/controller/amf.go @@ -10,16 +10,16 @@ import ( "github.com/gin-gonic/gin" ) -// 实例化控制层 UEEventController 结构体 -var NewUEEventController = &UEEventController{ +// 实例化控制层 AMFController 结构体 +var NewAMFController = &AMFController{ neInfoService: neService.NewNeInfoImpl, ueEventService: neDataService.NewUEEventImpl, } -// UE会话事件 +// 网元AMF // -// PATH /ue -type UEEventController struct { +// PATH /amf +type AMFController struct { // 网元信息服务 neInfoService neService.INeInfo // CDR会话事件服务 @@ -28,8 +28,8 @@ type UEEventController struct { // UE会话列表 // -// GET /list -func (s *UEEventController) List(c *gin.Context) { +// GET /ues +func (s *AMFController) UEs(c *gin.Context) { language := ctx.AcceptLanguage(c) var querys model.UEEventQuery if err := c.ShouldBindQuery(&querys); err != nil { diff --git a/src/modules/network_data/controller/cdr_event.go b/src/modules/network_data/controller/ims.go similarity index 83% rename from src/modules/network_data/controller/cdr_event.go rename to src/modules/network_data/controller/ims.go index 638340ce..dfd49885 100644 --- a/src/modules/network_data/controller/cdr_event.go +++ b/src/modules/network_data/controller/ims.go @@ -10,16 +10,16 @@ import ( "github.com/gin-gonic/gin" ) -// 实例化控制层 CDREventController 结构体 -var NewCDREventController = &CDREventController{ +// 实例化控制层 IMSController 结构体 +var NewIMSController = &IMSController{ neInfoService: neService.NewNeInfoImpl, cdrEventService: neDataService.NewCDREventImpl, } -// CDR会话事件 +// 网元IMS // -// PATH /cdr -type CDREventController struct { +// PATH /ims +type IMSController struct { // 网元信息服务 neInfoService neService.INeInfo // CDR会话事件服务 @@ -28,8 +28,8 @@ type CDREventController struct { // CDR会话列表 // -// GET /list -func (s *CDREventController) List(c *gin.Context) { +// GET /cdrs +func (s *IMSController) CDRs(c *gin.Context) { language := ctx.AcceptLanguage(c) var querys model.CDREventQuery if err := c.ShouldBindQuery(&querys); err != nil { diff --git a/src/modules/network_data/controller/perf_kpi.go b/src/modules/network_data/controller/perf_kpi.go index 996c51e2..e163d75d 100644 --- a/src/modules/network_data/controller/perf_kpi.go +++ b/src/modules/network_data/controller/perf_kpi.go @@ -5,8 +5,8 @@ import ( "ems.agt/src/framework/i18n" "ems.agt/src/framework/utils/ctx" "ems.agt/src/framework/vo/result" + "ems.agt/src/modules/network_data/model" neDataService "ems.agt/src/modules/network_data/service" - "ems.agt/src/modules/network_element/model" neService "ems.agt/src/modules/network_element/service" "github.com/gin-gonic/gin" ) diff --git a/src/modules/network_data/controller/upf.go b/src/modules/network_data/controller/upf.go new file mode 100644 index 00000000..864be14b --- /dev/null +++ b/src/modules/network_data/controller/upf.go @@ -0,0 +1,52 @@ +package controller + +import ( + "ems.agt/src/framework/i18n" + "ems.agt/src/framework/utils/ctx" + "ems.agt/src/framework/vo/result" + neDataService "ems.agt/src/modules/network_data/service" + neService "ems.agt/src/modules/network_element/service" + "github.com/gin-gonic/gin" +) + +// 实例化控制层 UPFController 结构体 +var NewUPFController = &UPFController{ + neInfoService: neService.NewNeInfoImpl, + perfKPIService: neDataService.NewPerfKPIImpl, +} + +// 网元UPF +// +// PATH /upf +type UPFController struct { + // 网元信息服务 + neInfoService neService.INeInfo + // 统计信息服务 + perfKPIService neDataService.IPerfKPI +} + +// 总流量数 N3上行 N6下行 +// +// GET /totalFlow +func (s *UPFController) TotalFlow(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var querys struct { + NeID string `form:"neId" binding:"required"` + Day int `form:"day" binding:"required"` + } + if err := c.ShouldBindQuery(&querys); querys.Day <= 0 || err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UPF", querys.NeID) + if neInfo.NeId != querys.NeID || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + data := s.perfKPIService.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) + + c.JSON(200, result.OkData(data)) +} diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index eed10ee4..41f83b0d 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -27,21 +27,31 @@ func Setup(router *gin.Engine) { ) } - // CDR会话事件信息 - cdrGroup := neDataGroup.Group("/cdr") + // 网元IMS + imsGroup := neDataGroup.Group("/ims") { - cdrGroup.GET("/list", + // CDR会话事件信息 + imsGroup.GET("/cdrs", middleware.PreAuthorize(nil), - controller.NewCDREventController.List, + controller.NewIMSController.CDRs, ) } - // UE会话事件信息 - ueGroup := neDataGroup.Group("/ue") + // 网元AMF + amfGroup := neDataGroup.Group("/amf") { - ueGroup.GET("/list", + amfGroup.GET("/ues", middleware.PreAuthorize(nil), - controller.NewUEEventController.List, + controller.NewAMFController.UEs, + ) + } + + // 网元UPF + upfGroup := neDataGroup.Group("/upf") + { + upfGroup.GET("/totalFlow", + middleware.PreAuthorize(nil), + controller.NewUPFController.TotalFlow, ) } diff --git a/src/modules/network_data/repository/perf_kpi.go b/src/modules/network_data/repository/perf_kpi.go index 2c21acdf..476eb2d0 100644 --- a/src/modules/network_data/repository/perf_kpi.go +++ b/src/modules/network_data/repository/perf_kpi.go @@ -1,12 +1,15 @@ package repository -import "ems.agt/src/modules/network_element/model" +import "ems.agt/src/modules/network_data/model" // 性能统计 数据层接口 type IPerfKPI interface { // SelectGoldKPI 通过网元指标数据信息 SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any - // SelectGoldKPITitle + // SelectGoldKPITitle 网元对应的指标名称 SelectGoldKPITitle(neType string) []model.GoldKPITitle + + // SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 + SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) []map[string]any } diff --git a/src/modules/network_data/repository/perf_kpi.impl.go b/src/modules/network_data/repository/perf_kpi.impl.go index 0b13abab..1ac6b8c6 100644 --- a/src/modules/network_data/repository/perf_kpi.impl.go +++ b/src/modules/network_data/repository/perf_kpi.impl.go @@ -6,7 +6,7 @@ import ( "ems.agt/src/framework/datasource" "ems.agt/src/framework/logger" - "ems.agt/src/modules/network_element/model" + "ems.agt/src/modules/network_data/model" ) // 实例化数据层 PerfKPIImpl 结构体 @@ -44,7 +44,7 @@ func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) [ // 查询字段列 timeFormat := "DATE_FORMAT(gk.start_time, '%Y-%m-%d %H:')" - minuteGroup := fmt.Sprintf("LPAD(FLOOR(MINUTE(gk.start_time) / %d) * %d, 2, '0')", query.Interval, query.Interval) + minuteGroup := fmt.Sprintf("LPAD(FLOOR(SECOND(gk.start_time) / %d) * %d, 2, '0')", query.Interval, query.Interval) groupByField := fmt.Sprintf("CONCAT( %s, %s ) AS timeGroup", timeFormat, minuteGroup) var fields = []string{ groupByField, @@ -79,12 +79,48 @@ func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) [ return results } -// SelectGoldKPITitle 通过网元指标数据信息 +// 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("Delete err => %v", err) + 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, "gk.ne_type = ?") + params = append(params, neType) + } + if rmUID != "" { + conditions = append(conditions, "gk.rm_uid = ?") + params = append(params, rmUID) + } + if startDate != "" { + conditions = append(conditions, "gk.date >= ?") + params = append(params, startDate) + } + if endDate != "" { + conditions = append(conditions, "gk.date <= ?") + params = append(params, endDate) + } + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := fmt.Sprintf("SELECT sum( CASE WHEN gk.kpi_id = 'UPF.03' THEN gk.VALUE ELSE 0 END ) AS 'up', sum( CASE WHEN gk.kpi_id = 'UPF.06' THEN gk.VALUE ELSE 0 END ) AS 'down' FROM gold_kpi gk %s", whereSql) + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + return results +} diff --git a/src/modules/network_data/service/perf_kpi.go b/src/modules/network_data/service/perf_kpi.go index 3deba4f5..b6056c42 100644 --- a/src/modules/network_data/service/perf_kpi.go +++ b/src/modules/network_data/service/perf_kpi.go @@ -1,12 +1,15 @@ package service -import "ems.agt/src/modules/network_element/model" +import "ems.agt/src/modules/network_data/model" // 性能统计 服务层接口 type IPerfKPI interface { // SelectGoldKPI 通过网元指标数据信息 SelectGoldKPI(query model.GoldKPIQuery) []map[string]any - // SelectGoldKPITitle + // SelectGoldKPITitle 网元对应的指标名称 SelectGoldKPITitle(neType string) []model.GoldKPITitle + + // SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 + SelectUPFTotalFlow(neType, rmUID string, day int) []map[string]any } diff --git a/src/modules/network_data/service/perf_kpi.impl.go b/src/modules/network_data/service/perf_kpi.impl.go index 91cf51d7..f8ce8689 100644 --- a/src/modules/network_data/service/perf_kpi.impl.go +++ b/src/modules/network_data/service/perf_kpi.impl.go @@ -1,8 +1,10 @@ package service import ( - "ems.agt/src/modules/network_element/model" - "ems.agt/src/modules/network_element/repository" + "time" + + "ems.agt/src/modules/network_data/model" + "ems.agt/src/modules/network_data/repository" ) // 实例化数据层 PerfKPIImpl 结构体 @@ -32,7 +34,19 @@ func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any { return data } -// SelectGoldKPITitle 通过网元指标数据信息 +// 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 := now.Format("2006-01-02") + // 将当前日期加天数 + afterDays := now.AddDate(0, 0, -day) + startDate := afterDays.Format("2006-01-02") + + return r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) +}