fix: 网元数据模块接口调整

This commit is contained in:
TsMask
2024-01-27 18:00:45 +08:00
parent 8ab5d1a2b7
commit 3a5c3edc70
9 changed files with 152 additions and 34 deletions

View File

@@ -10,16 +10,16 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
// 实例化控制层 UEEventController 结构体 // 实例化控制层 AMFController 结构体
var NewUEEventController = &UEEventController{ var NewAMFController = &AMFController{
neInfoService: neService.NewNeInfoImpl, neInfoService: neService.NewNeInfoImpl,
ueEventService: neDataService.NewUEEventImpl, ueEventService: neDataService.NewUEEventImpl,
} }
// UE会话事件 // 网元AMF
// //
// PATH /ue // PATH /amf
type UEEventController struct { type AMFController struct {
// 网元信息服务 // 网元信息服务
neInfoService neService.INeInfo neInfoService neService.INeInfo
// CDR会话事件服务 // CDR会话事件服务
@@ -28,8 +28,8 @@ type UEEventController struct {
// UE会话列表 // UE会话列表
// //
// GET /list // GET /ues
func (s *UEEventController) List(c *gin.Context) { func (s *AMFController) UEs(c *gin.Context) {
language := ctx.AcceptLanguage(c) language := ctx.AcceptLanguage(c)
var querys model.UEEventQuery var querys model.UEEventQuery
if err := c.ShouldBindQuery(&querys); err != nil { if err := c.ShouldBindQuery(&querys); err != nil {

View File

@@ -10,16 +10,16 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
// 实例化控制层 CDREventController 结构体 // 实例化控制层 IMSController 结构体
var NewCDREventController = &CDREventController{ var NewIMSController = &IMSController{
neInfoService: neService.NewNeInfoImpl, neInfoService: neService.NewNeInfoImpl,
cdrEventService: neDataService.NewCDREventImpl, cdrEventService: neDataService.NewCDREventImpl,
} }
// CDR会话事件 // 网元IMS
// //
// PATH /cdr // PATH /ims
type CDREventController struct { type IMSController struct {
// 网元信息服务 // 网元信息服务
neInfoService neService.INeInfo neInfoService neService.INeInfo
// CDR会话事件服务 // CDR会话事件服务
@@ -28,8 +28,8 @@ type CDREventController struct {
// CDR会话列表 // CDR会话列表
// //
// GET /list // GET /cdrs
func (s *CDREventController) List(c *gin.Context) { func (s *IMSController) CDRs(c *gin.Context) {
language := ctx.AcceptLanguage(c) language := ctx.AcceptLanguage(c)
var querys model.CDREventQuery var querys model.CDREventQuery
if err := c.ShouldBindQuery(&querys); err != nil { if err := c.ShouldBindQuery(&querys); err != nil {

View File

@@ -5,8 +5,8 @@ import (
"ems.agt/src/framework/i18n" "ems.agt/src/framework/i18n"
"ems.agt/src/framework/utils/ctx" "ems.agt/src/framework/utils/ctx"
"ems.agt/src/framework/vo/result" "ems.agt/src/framework/vo/result"
"ems.agt/src/modules/network_data/model"
neDataService "ems.agt/src/modules/network_data/service" neDataService "ems.agt/src/modules/network_data/service"
"ems.agt/src/modules/network_element/model"
neService "ems.agt/src/modules/network_element/service" neService "ems.agt/src/modules/network_element/service"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )

View File

@@ -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))
}

View File

@@ -27,21 +27,31 @@ func Setup(router *gin.Engine) {
) )
} }
// CDR会话事件信息 // 网元IMS
cdrGroup := neDataGroup.Group("/cdr") imsGroup := neDataGroup.Group("/ims")
{ {
cdrGroup.GET("/list", // CDR会话事件信息
imsGroup.GET("/cdrs",
middleware.PreAuthorize(nil), middleware.PreAuthorize(nil),
controller.NewCDREventController.List, controller.NewIMSController.CDRs,
) )
} }
// UE会话事件信息 // 网元AMF
ueGroup := neDataGroup.Group("/ue") amfGroup := neDataGroup.Group("/amf")
{ {
ueGroup.GET("/list", amfGroup.GET("/ues",
middleware.PreAuthorize(nil), middleware.PreAuthorize(nil),
controller.NewUEEventController.List, controller.NewAMFController.UEs,
)
}
// 网元UPF
upfGroup := neDataGroup.Group("/upf")
{
upfGroup.GET("/totalFlow",
middleware.PreAuthorize(nil),
controller.NewUPFController.TotalFlow,
) )
} }

View File

@@ -1,12 +1,15 @@
package repository package repository
import "ems.agt/src/modules/network_element/model" import "ems.agt/src/modules/network_data/model"
// 性能统计 数据层接口 // 性能统计 数据层接口
type IPerfKPI interface { type IPerfKPI interface {
// SelectGoldKPI 通过网元指标数据信息 // SelectGoldKPI 通过网元指标数据信息
SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any
// SelectGoldKPITitle // SelectGoldKPITitle 网元对应的指标名称
SelectGoldKPITitle(neType string) []model.GoldKPITitle SelectGoldKPITitle(neType string) []model.GoldKPITitle
// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行
SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) []map[string]any
} }

View File

@@ -6,7 +6,7 @@ import (
"ems.agt/src/framework/datasource" "ems.agt/src/framework/datasource"
"ems.agt/src/framework/logger" "ems.agt/src/framework/logger"
"ems.agt/src/modules/network_element/model" "ems.agt/src/modules/network_data/model"
) )
// 实例化数据层 PerfKPIImpl 结构体 // 实例化数据层 PerfKPIImpl 结构体
@@ -44,7 +44,7 @@ func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) [
// 查询字段列 // 查询字段列
timeFormat := "DATE_FORMAT(gk.start_time, '%Y-%m-%d %H:')" 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) groupByField := fmt.Sprintf("CONCAT( %s, %s ) AS timeGroup", timeFormat, minuteGroup)
var fields = []string{ var fields = []string{
groupByField, groupByField,
@@ -79,12 +79,48 @@ func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) [
return results return results
} }
// SelectGoldKPITitle 通过网元指标数据信息 // SelectGoldKPITitle 网元对应的指标名称
func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle { func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle {
result := []model.GoldKPITitle{} result := []model.GoldKPITitle{}
tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result) tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result)
if err := tx.Error; err != nil { if err := tx.Error; err != nil {
logger.Errorf("Delete err => %v", err) logger.Errorf("Find err => %v", err)
} }
return result 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
}

View File

@@ -1,12 +1,15 @@
package service package service
import "ems.agt/src/modules/network_element/model" import "ems.agt/src/modules/network_data/model"
// 性能统计 服务层接口 // 性能统计 服务层接口
type IPerfKPI interface { type IPerfKPI interface {
// SelectGoldKPI 通过网元指标数据信息 // SelectGoldKPI 通过网元指标数据信息
SelectGoldKPI(query model.GoldKPIQuery) []map[string]any SelectGoldKPI(query model.GoldKPIQuery) []map[string]any
// SelectGoldKPITitle // SelectGoldKPITitle 网元对应的指标名称
SelectGoldKPITitle(neType string) []model.GoldKPITitle SelectGoldKPITitle(neType string) []model.GoldKPITitle
// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行
SelectUPFTotalFlow(neType, rmUID string, day int) []map[string]any
} }

View File

@@ -1,8 +1,10 @@
package service package service
import ( import (
"ems.agt/src/modules/network_element/model" "time"
"ems.agt/src/modules/network_element/repository"
"ems.agt/src/modules/network_data/model"
"ems.agt/src/modules/network_data/repository"
) )
// 实例化数据层 PerfKPIImpl 结构体 // 实例化数据层 PerfKPIImpl 结构体
@@ -32,7 +34,19 @@ func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any {
return data return data
} }
// SelectGoldKPITitle 通过网元指标数据信息 // SelectGoldKPITitle 网元对应的指标名称
func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle { func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle {
return r.perfKPIRepository.SelectGoldKPITitle(neType) 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)
}