284 lines
8.3 KiB
Go
284 lines
8.3 KiB
Go
package controller
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
"time"
|
||
|
||
"be.ems/src/framework/i18n"
|
||
"be.ems/src/framework/reqctx"
|
||
"be.ems/src/framework/resp"
|
||
"be.ems/src/framework/utils/parse"
|
||
neService "be.ems/src/modules/ne/service"
|
||
neFetchlink "be.ems/src/modules/ne_data_nf/fetch_link"
|
||
"be.ems/src/modules/ne_data_nf/service"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// 实例化控制层 SMFController 结构体
|
||
var NewSMF = &SMFController{
|
||
neInfoService: neService.NewNeInfo,
|
||
cdrEventService: service.NewCDREvent,
|
||
UDMExtendService: service.NewUDMExtend,
|
||
}
|
||
|
||
// 网元SMF
|
||
//
|
||
// PATH /smf
|
||
type SMFController struct {
|
||
neInfoService *neService.NeInfo // 网元信息服务
|
||
cdrEventService *service.CDREvent // CDR会话事件服务
|
||
UDMExtendService *service.UDMExtend // UDM用户信息服务
|
||
}
|
||
|
||
// CDR会话列表
|
||
//
|
||
// GET /cdr/list
|
||
//
|
||
// @Tags ne_data/smf
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Param neType query string true "NE Type only SMF" Enums(SMF)
|
||
// @Param neId query string true "NE ID" default(001)
|
||
// @Param subscriberID query string false "subscriberID is IMSI"
|
||
// @Param pageNum query number true "pageNum" default(1)
|
||
// @Param pageSize query number true "pageSize" default(10)
|
||
// @Success 200 {object} object "Response Results"
|
||
// @Security TokenAuth
|
||
// @Summary CDR Session List
|
||
// @Description CDR Session List
|
||
// @Router /nf/smf/cdr/list [get]
|
||
func (s *SMFController) CDRList(c *gin.Context) {
|
||
language := reqctx.AcceptLanguage(c)
|
||
query := reqctx.QueryMap(c)
|
||
// 限制导出数据集
|
||
pageSize := parse.Number(query["pageSize"])
|
||
if pageSize > 10000 {
|
||
query["pageSize"] = "10000"
|
||
}
|
||
coreUid := c.DefaultQuery("coreUid", "")
|
||
neUid := c.DefaultQuery("neUid", "")
|
||
if coreUid == "" || neUid == "" {
|
||
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
|
||
return
|
||
}
|
||
|
||
// 查询网元获取IP
|
||
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
|
||
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
|
||
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||
return
|
||
}
|
||
rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query)
|
||
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
|
||
}
|
||
|
||
// CDR会话删除
|
||
//
|
||
// DELETE /cdr/:id
|
||
//
|
||
// @Tags ne_data/smf
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Param id path string true "list data id, multiple separated by a , sign"
|
||
// @Success 200 {object} object "Response Results"
|
||
// @Security TokenAuth
|
||
// @Summary CDR Session Delete
|
||
// @Description CDR Session Delete
|
||
// @Router /nf/smf/cdr/{id} [delete]
|
||
func (s *SMFController) CDRRemove(c *gin.Context) {
|
||
language := reqctx.AcceptLanguage(c)
|
||
id := c.Param("id")
|
||
if id == "" {
|
||
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id is empty"))
|
||
return
|
||
}
|
||
|
||
// 处理字符转id数组后去重
|
||
uniqueIDs := parse.RemoveDuplicatesToArray(id, ",")
|
||
// 转换成int64数组类型
|
||
ids := make([]int64, 0)
|
||
for _, v := range uniqueIDs {
|
||
ids = append(ids, parse.Number(v))
|
||
}
|
||
|
||
rows, err := s.cdrEventService.DeleteByIds("SMF", ids)
|
||
if err != nil {
|
||
c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error())))
|
||
return
|
||
}
|
||
msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows})
|
||
c.JSON(200, resp.OkMsg(msg))
|
||
}
|
||
|
||
// CDR会话列表导出
|
||
//
|
||
// GET /cdr/export
|
||
//
|
||
// @Tags ne_data/smf
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Param data body object true "Request Param"
|
||
// @Success 200 {object} object "Response Results"
|
||
// @Security TokenAuth
|
||
// @Summary CDR Session List Export
|
||
// @Description CDR Session List Export
|
||
// @Router /nf/smf/cdr/export [get]
|
||
func (s *SMFController) CDRExport(c *gin.Context) {
|
||
language := reqctx.AcceptLanguage(c)
|
||
query := reqctx.QueryMap(c)
|
||
// 限制导出数据集
|
||
pageSize := parse.Number(query["pageSize"])
|
||
if pageSize > 10000 {
|
||
query["pageSize"] = "10000"
|
||
}
|
||
coreUid := c.DefaultQuery("coreUid", "")
|
||
neUid := c.DefaultQuery("neUid", "")
|
||
if coreUid == "" || neUid == "" {
|
||
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
|
||
return
|
||
}
|
||
|
||
// 查询网元获取IP
|
||
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
|
||
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
|
||
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||
return
|
||
}
|
||
rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query)
|
||
if total == 0 {
|
||
// 导出数据记录为空
|
||
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty")))
|
||
return
|
||
}
|
||
|
||
// 导出文件名称
|
||
fileName := fmt.Sprintf("smf_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli())
|
||
// 导出数据表格
|
||
saveFilePath, err := s.cdrEventService.ExportSMF(rows, fileName)
|
||
if err != nil {
|
||
c.JSON(200, resp.ErrMsg(err.Error()))
|
||
return
|
||
}
|
||
|
||
c.FileAttachment(saveFilePath, fileName)
|
||
}
|
||
|
||
// 在线订阅用户数量
|
||
//
|
||
// GET /sub/num
|
||
//
|
||
// @Tags ne_data/smf
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Param neId query string true "NE ID" default(001)
|
||
// @Success 200 {object} object "Response Results"
|
||
// @Security TokenAuth
|
||
// @Summary Number of online session users
|
||
// @Description Number of online session users
|
||
// @Router /nf/smf/sub/num [get]
|
||
func (s *SMFController) SubUserNum(c *gin.Context) {
|
||
language := reqctx.AcceptLanguage(c)
|
||
var query struct {
|
||
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
|
||
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
|
||
}
|
||
if err := c.ShouldBindQuery(&query); err != nil {
|
||
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
|
||
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
|
||
return
|
||
}
|
||
|
||
// 查询网元信息
|
||
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
|
||
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
|
||
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||
return
|
||
}
|
||
|
||
// 网元直连
|
||
num, err := neFetchlink.SMFSubNum(neInfo)
|
||
if err != nil {
|
||
c.JSON(200, resp.ErrMsg(err.Error()))
|
||
return
|
||
}
|
||
|
||
c.JSON(200, resp.OkData(num))
|
||
}
|
||
|
||
// 在线订阅用户列表信息
|
||
//
|
||
// GET /sub/list
|
||
//
|
||
// @Tags ne_data/smf
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Param neId query string true "NE ID" default(001)
|
||
// @Param imsi query string false "imsi"
|
||
// @Param msisdn query string false "msisdn"
|
||
// @Param upstate query string false "upstate"
|
||
// @Param pageNum query string true "pageNum" default(50)
|
||
// @Success 200 {object} object "Response Results"
|
||
// @Security TokenAuth
|
||
// @Summary Online session user list information
|
||
// @Description Online session user list information
|
||
// @Router /nf/smf/sub/list [get]
|
||
func (s *SMFController) SubUserList(c *gin.Context) {
|
||
language := reqctx.AcceptLanguage(c)
|
||
var query struct {
|
||
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
|
||
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
|
||
IMSI string `form:"imsi"`
|
||
MSISDN string `form:"msisdn"`
|
||
Upstate string `form:"upstate"`
|
||
PageNum string `form:"pageNum"`
|
||
}
|
||
if err := c.ShouldBindQuery(&query); err != nil {
|
||
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
|
||
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
|
||
return
|
||
}
|
||
|
||
// 查询网元信息
|
||
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
|
||
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
|
||
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
|
||
return
|
||
}
|
||
|
||
// 网元直连
|
||
data, err := neFetchlink.SMFSubInfoList(neInfo, map[string]string{
|
||
"imsi": query.IMSI,
|
||
"msisdn": query.MSISDN,
|
||
"upstate": query.Upstate,
|
||
"pageNum": query.PageNum,
|
||
})
|
||
if err != nil {
|
||
c.JSON(200, resp.ErrMsg(err.Error()))
|
||
return
|
||
}
|
||
|
||
// 对数据进行处理,去掉前缀,并加入imsi拓展信息
|
||
rows := data["rows"].([]any)
|
||
if len(rows) > 0 {
|
||
arr := &rows
|
||
for i := range *arr {
|
||
item := (*arr)[i].(map[string]any)
|
||
if v, ok := item["imsi"]; ok && v != nil {
|
||
imsiStr := v.(string)
|
||
imsiStr = strings.TrimPrefix(imsiStr, "imsi-")
|
||
item["imsi"] = imsiStr
|
||
// 查UDM拓展信息
|
||
info := s.UDMExtendService.FindByIMSIAndNeID(neInfo.CoreUID, "%", imsiStr)
|
||
item["remark"] = info.Remark
|
||
}
|
||
if v, ok := item["msisdn"]; ok && v != nil {
|
||
item["msisdn"] = strings.TrimPrefix(v.(string), "msisdn-")
|
||
}
|
||
}
|
||
}
|
||
|
||
c.JSON(200, resp.OkData(data))
|
||
}
|