Merge remote-tracking branch 'origin/lichang' into lite
This commit is contained in:
@@ -14,8 +14,7 @@ CREATE TABLE `sys_dict_type` (
|
|||||||
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
|
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
|
||||||
`update_time` bigint NULL DEFAULT 0 COMMENT '更新时间',
|
`update_time` bigint NULL DEFAULT 0 COMMENT '更新时间',
|
||||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
|
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
|
||||||
PRIMARY KEY (`dict_id`) USING BTREE,
|
PRIMARY KEY (`dict_id`) USING BTREE
|
||||||
UNIQUE INDEX `dict_type`(`dict_type` ASC) USING BTREE
|
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统_字典类型表' ROW_FORMAT = Dynamic;
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统_字典类型表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ CREATE TABLE `sys_job` (
|
|||||||
INSERT INTO `sys_job` VALUES (1, 'job.monitor_sys_resource', 'SYSTEM', 'monitor_sys_resource', '{\"interval\":5}', '0 0/5 * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.monitor_sys_resource_remark');
|
INSERT INTO `sys_job` VALUES (1, 'job.monitor_sys_resource', 'SYSTEM', 'monitor_sys_resource', '{\"interval\":5}', '0 0/5 * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.monitor_sys_resource_remark');
|
||||||
INSERT INTO `sys_job` VALUES (2, 'job.ne_config_backup', 'SYSTEM', 'ne_config_backup', '', '0 30 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_config_backup_remark');
|
INSERT INTO `sys_job` VALUES (2, 'job.ne_config_backup', 'SYSTEM', 'ne_config_backup', '', '0 30 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_config_backup_remark');
|
||||||
INSERT INTO `sys_job` VALUES (3, 'job.ne_data_udm', 'SYSTEM', 'ne_data_udm', '', '0 0 0/12 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, '');
|
INSERT INTO `sys_job` VALUES (3, 'job.ne_data_udm', 'SYSTEM', 'ne_data_udm', '', '0 0 0/12 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, '');
|
||||||
INSERT INTO `sys_job` VALUES (4, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{\"alarmTitle\":\"NE State Check Alarm\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"alarm cause: the system state of target NE has not been received\",\"specificProblemId\":\"AC10000\",\"addInfo\":\"\"}', '0/10 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark');
|
INSERT INTO `sys_job` VALUES (4, 'job.ne_alarm_state_check', 'SYSTEM', 'ne_alarm_state_check', '{\"alarmTitle\":\"NE State Check Alarm\",\"alarmType\":\"2\",\"origSeverity\":\"2\",\"specificProblem\":\"alarm cause: the system state of target NE has not been received\",\"specificProblemId\":\"AC10000\",\"addInfo\":\"\"}', '0/30 * * * * ?', '3', '0', '1', '0', 'system', 1698478134839, 'system', 1698478134839, 'job.ne_alarm_state_check_remark');
|
||||||
INSERT INTO `sys_job` VALUES (5, 'job.delete_alarm_record', 'SYSTEM', 'delete_alarm_record', '{\"storeDays\":7}', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_alarm_record_remark');
|
INSERT INTO `sys_job` VALUES (5, 'job.delete_alarm_record', 'SYSTEM', 'delete_alarm_record', '{\"storeDays\":7}', '0 10 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_alarm_record_remark');
|
||||||
INSERT INTO `sys_job` VALUES (6, 'job.delete_kpi_record', 'SYSTEM', 'delete_kpi_record', '{\"storeDays\":7,\"neList\":[\"IMS\",\"AMF\",\"UDM\",\"UPF\",\"MME\",\"SMSC\",\"SMF\",\"MME\"]}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_kpi_record_remark');
|
INSERT INTO `sys_job` VALUES (6, 'job.delete_kpi_record', 'SYSTEM', 'delete_kpi_record', '{\"storeDays\":7,\"neList\":[\"IMS\",\"AMF\",\"UDM\",\"UPF\",\"MME\",\"SMSC\",\"SMF\",\"MME\"]}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_kpi_record_remark');
|
||||||
INSERT INTO `sys_job` VALUES (7, 'job.delete_ne_config_backup', 'SYSTEM', 'delete_ne_config_backup', '{\"storeDays\":7}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_ne_config_backup_remark');
|
INSERT INTO `sys_job` VALUES (7, 'job.delete_ne_config_backup', 'SYSTEM', 'delete_ne_config_backup', '{\"storeDays\":7}', '0 20 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'system', 1698478134839, 'job.delete_ne_config_backup_remark');
|
||||||
|
|||||||
@@ -88,14 +88,14 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
|
|||||||
switch neInfo.NeType {
|
switch neInfo.NeType {
|
||||||
case "IMS":
|
case "IMS":
|
||||||
if v, ok := body.CDR["recordType"]; ok && (v == "MOC" || v == "MTSM") {
|
if v, ok := body.CDR["recordType"]; ok && (v == "MOC" || v == "MTSM") {
|
||||||
wsService.NewWSSend.ByGroupID(wsService.GROUP_IMS_CDR+neInfo.NeId, data)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_IMS_CDR, neInfo.NeId), data)
|
||||||
}
|
}
|
||||||
case "SMF":
|
case "SMF":
|
||||||
wsService.NewWSSend.ByGroupID(wsService.GROUP_SMF_CDR+neInfo.NeId, data)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SMF_CDR, neInfo.NeId), data)
|
||||||
case "SMSC":
|
case "SMSC":
|
||||||
wsService.NewWSSend.ByGroupID(wsService.GROUP_SMSC_CDR+neInfo.NeId, data)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SMSC_CDR, neInfo.NeId), data)
|
||||||
case "SGWC":
|
case "SGWC":
|
||||||
wsService.NewWSSend.ByGroupID(wsService.GROUP_SGWC_CDR+neInfo.NeId, data)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SGWC_CDR, neInfo.NeId), data)
|
||||||
}
|
}
|
||||||
|
|
||||||
services.ResponseStatusOK204NoContent(w)
|
services.ResponseStatusOK204NoContent(w)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
|
|
||||||
"be.ems/lib/config"
|
"be.ems/lib/config"
|
||||||
"be.ems/lib/log"
|
"be.ems/lib/log"
|
||||||
|
systemService "be.ems/src/modules/system/service"
|
||||||
|
|
||||||
"gopkg.in/gomail.v2"
|
"gopkg.in/gomail.v2"
|
||||||
)
|
)
|
||||||
@@ -14,16 +15,35 @@ import (
|
|||||||
func AlarmEmailForward(alarmData *Alarm) error {
|
func AlarmEmailForward(alarmData *Alarm) error {
|
||||||
log.Info("AlarmEmailForward processing... ")
|
log.Info("AlarmEmailForward processing... ")
|
||||||
|
|
||||||
|
alarmStatus := "Clear"
|
||||||
|
if alarmData.AlarmStatus == 1 {
|
||||||
|
alarmStatus = "Active"
|
||||||
|
}
|
||||||
|
severity := origSeverityValue(alarmData.OrigSeverity)
|
||||||
|
dictAlarmSeverity := systemService.NewSysDictData.FindByType("active_alarm_severity")
|
||||||
|
for _, v := range dictAlarmSeverity {
|
||||||
|
if v.DataValue == severity {
|
||||||
|
severity = v.DataLabel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
subjectTime := fmt.Sprintf("%s-%s-%s", severity, alarmData.NeName, alarmData.AlarmTitle)
|
||||||
message := fmt.Sprintf(`
|
message := fmt.Sprintf(`
|
||||||
<p>Alarm information</p>
|
<p>Alarm information</p>
|
||||||
<p style="text-indent:2.5em">Sequence: %d</p>
|
<p style="text-indent:2.5em">Sequence: %d</p>
|
||||||
<p style="text-indent:3em">NE name: %s</p>
|
<p style="text-indent:3em">NE Name: %s</p>
|
||||||
<p style="text-indent:4em">Title: %s</p>
|
<p style="text-indent:4em">Title: %s</p>
|
||||||
<p style="text-indent:2.5em">Severity: %s</p>
|
<p style="text-indent:2.5em">Severity: %s</p>
|
||||||
<p style="text-indent:1.5em">Event Time: %s</p>
|
<p style="text-indent:1.5em">Event Time: %s</p>
|
||||||
<p style="text-indent:0.5em">Alarm Status: %d</p>
|
<p style="text-indent:0.5em">Alarm Status: %s</p>
|
||||||
<p>Automatic sent by OMC, please do not reply!</p>
|
<p>Automatic sent by OMC, please do not reply!</p>
|
||||||
`, alarmData.AlarmSeq, alarmData.NeName, alarmData.AlarmTitle, alarmData.OrigSeverity, alarmData.EventTime, alarmData.AlarmStatus)
|
`,
|
||||||
|
alarmData.AlarmSeq,
|
||||||
|
alarmData.NeName,
|
||||||
|
alarmData.AlarmTitle,
|
||||||
|
severity,
|
||||||
|
alarmData.EventTime,
|
||||||
|
alarmStatus,
|
||||||
|
)
|
||||||
|
|
||||||
// message := fmt.Sprintf(`
|
// message := fmt.Sprintf(`
|
||||||
// Alarm information
|
// Alarm information
|
||||||
@@ -70,7 +90,7 @@ func AlarmEmailForward(alarmData *Alarm) error {
|
|||||||
//m.SetHeader("To", "zhangshuzhong@agrandtech.com", "simonzhangsz@outlook.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接
|
//m.SetHeader("To", "zhangshuzhong@agrandtech.com", "simonzhangsz@outlook.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接
|
||||||
//m.SetHeader("Cc", "******@qq.com") // 抄送,可以多个
|
//m.SetHeader("Cc", "******@qq.com") // 抄送,可以多个
|
||||||
//m.SetHeader("Bcc", "******@qq.com") // 暗送,可以多个
|
//m.SetHeader("Bcc", "******@qq.com") // 暗送,可以多个
|
||||||
m.SetHeader("Subject", "Alarm from OMC!") // 邮件主题
|
m.SetHeader("Subject", subjectTime) // 邮件主题
|
||||||
|
|
||||||
// text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。
|
// text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。
|
||||||
// 可以通过 text/html 处理文本格式进行特殊处理,如换行、缩进、加粗等等
|
// 可以通过 text/html 处理文本格式进行特殊处理,如换行、缩进、加粗等等
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ func (k *KpiCReport) GetReport2FE(c *gin.Context) {
|
|||||||
dbg := db.DB("").Model(&KpiCReport{}).Table(tableName)
|
dbg := db.DB("").Model(&KpiCReport{}).Table(tableName)
|
||||||
|
|
||||||
if querys.NeID != "" {
|
if querys.NeID != "" {
|
||||||
conditions = append(conditions, "rm_uid = (select n.rm_uid from ne_info n where n.ne_type=? and n.ne_id=? and n.status=1)")
|
conditions = append(conditions, "rm_uid = (select n.rm_uid from ne_info n where n.ne_type=? and n.ne_id=?)")
|
||||||
params = append(params, querys.NeType, querys.NeID)
|
params = append(params, querys.NeType, querys.NeID)
|
||||||
} else {
|
} else {
|
||||||
c.JSON(http.StatusBadRequest, services.ErrResp("Not found required parameter NE ID"))
|
c.JSON(http.StatusBadRequest, services.ErrResp("Not found required parameter NE ID"))
|
||||||
|
|||||||
@@ -199,7 +199,10 @@ func saveKPIData(kpiReport KpiReport, index int64) int64 {
|
|||||||
// 推送到ws订阅组
|
// 推送到ws订阅组
|
||||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent)
|
||||||
if neInfo.NeType == "UPF" {
|
if neInfo.NeType == "UPF" {
|
||||||
wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF+neInfo.NeId, kpiEvent)
|
// 更新UPF总流量
|
||||||
|
upValue := parse.Number(kpiEvent["UPF.03"])
|
||||||
|
downValue := parse.Number(kpiEvent["UPF.06"])
|
||||||
|
neDataService.NewKpiReport.UPFTodayFlowUpdate(neInfo.RmUID, upValue, downValue, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -274,7 +277,7 @@ func saveKPIDataC(kpiReport KpiReport, index int64) int64 {
|
|||||||
neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid)
|
neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid)
|
||||||
if neInfo.RmUID == kpiData.RmUid {
|
if neInfo.RmUID == kpiData.RmUid {
|
||||||
// 推送自定义KPI到ws订阅组
|
// 推送自定义KPI到ws订阅组
|
||||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiEvent)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiEvent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return insertId
|
return insertId
|
||||||
@@ -412,12 +415,9 @@ func PostKPIReportFromNFOld(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
if neInfo.RmUID == kpiData.RmUid {
|
if neInfo.RmUID == kpiData.RmUid {
|
||||||
// 推送到ws订阅组
|
// 推送到ws订阅组
|
||||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent)
|
||||||
// 推送自定义KPI到ws订阅组
|
// 推送自定义KPI到ws订阅组
|
||||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiCEvent)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiCEvent)
|
||||||
if neInfo.NeType == "UPF" {
|
|
||||||
wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF+neInfo.NeId, kpiEvent)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
services.ResponseStatusOK204NoContent(w)
|
services.ResponseStatusOK204NoContent(w)
|
||||||
@@ -465,7 +465,7 @@ type Task struct {
|
|||||||
}
|
}
|
||||||
type KpiSetJ struct {
|
type KpiSetJ struct {
|
||||||
Code string `json:"Code"` // 统计编码 如:SMFHA01
|
Code string `json:"Code"` // 统计编码 如:SMFHA01
|
||||||
KPIs []string `json:"KPIs` // 指标项集合 ["SMF.AttCreatePduSession", "SMF.AttCreatePduSession._Dnn"]
|
KPIs []string `json:"KPIs"` // 指标项集合 ["SMF.AttCreatePduSession", "SMF.AttCreatePduSession._Dnn"]
|
||||||
}
|
}
|
||||||
|
|
||||||
type MeasureTask struct {
|
type MeasureTask struct {
|
||||||
@@ -475,7 +475,7 @@ type MeasureTask struct {
|
|||||||
KpiSet []KpiSetJ `json:"KPISet" xorm:"kpi_set"`
|
KpiSet []KpiSetJ `json:"KPISet" xorm:"kpi_set"`
|
||||||
StartTime string `json:"startTime" xorm:"start_time"`
|
StartTime string `json:"startTime" xorm:"start_time"`
|
||||||
EndTime string `json:"endTime" xorm:"end_time"`
|
EndTime string `json:"endTime" xorm:"end_time"`
|
||||||
Periods []Period `json:"Periods" xorm:"periods`
|
Periods []Period `json:"Periods" xorm:"periods"`
|
||||||
Schedule []ScheduleJ `json:"Schedule" xorm:"schedule"`
|
Schedule []ScheduleJ `json:"Schedule" xorm:"schedule"`
|
||||||
GranulOption string `json:"granulOption" xorm:"granul_option"`
|
GranulOption string `json:"granulOption" xorm:"granul_option"`
|
||||||
Status string `json:"status" xorm:"status"`
|
Status string `json:"status" xorm:"status"`
|
||||||
@@ -483,7 +483,7 @@ type MeasureTask struct {
|
|||||||
Comment string `json:"comment" xorm:"comment"`
|
Comment string `json:"comment" xorm:"comment"`
|
||||||
CreateTime string `json:"createTime" xorm:"create_time"`
|
CreateTime string `json:"createTime" xorm:"create_time"`
|
||||||
UpdateTime string `json:"updateTime" xorm:"update_time"`
|
UpdateTime string `json:"updateTime" xorm:"update_time"`
|
||||||
DeleteTime string `json:"deleteTime xorm:"delete_time"`
|
DeleteTime string `json:"deleteTime" xorm:"delete_time"`
|
||||||
|
|
||||||
Tasks []Task `json:"Tasks"`
|
Tasks []Task `json:"Tasks"`
|
||||||
NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */
|
NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"be.ems/src/framework/logger"
|
"be.ems/src/framework/logger"
|
||||||
"github.com/redis/go-redis/v9"
|
"github.com/redis/go-redis/v9"
|
||||||
@@ -137,3 +138,38 @@ func SetHash(source, key string, value map[string]any) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IncrBy 累加统计数据
|
||||||
|
func IncrBy(source, key, field string, value int64) error {
|
||||||
|
// 数据源
|
||||||
|
rdb := RDB(source)
|
||||||
|
if rdb == nil {
|
||||||
|
return fmt.Errorf("redis not client")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用HINCRBY命令进行累加统计
|
||||||
|
ctx := context.Background()
|
||||||
|
err := rdb.HIncrBy(ctx, key, field, value).Err()
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("redis HIncrBy err %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expire 过期时间设置
|
||||||
|
func Expire(source, key string, expiration time.Duration) error {
|
||||||
|
// 数据源
|
||||||
|
rdb := RDB(source)
|
||||||
|
if rdb == nil {
|
||||||
|
return fmt.Errorf("redis not client")
|
||||||
|
}
|
||||||
|
// 过期时间设置
|
||||||
|
ctx := context.Background()
|
||||||
|
err := rdb.Expire(ctx, key, expiration).Err()
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("redis HIncrBy err %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -57,6 +57,6 @@ func (s UPFController) TotalFlow(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
data := s.kpiReportService.FindUPFTotalFlow(neInfo.RmUID, querys.Day)
|
up, down := s.kpiReportService.UPFTodayFlowFind(neInfo.RmUID, querys.Day)
|
||||||
c.JSON(200, resp.OkData(data))
|
c.JSON(200, resp.OkData(map[string]int64{"up": up, "down": down}))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"be.ems/src/framework/middleware/collectlogs"
|
"be.ems/src/framework/middleware/collectlogs"
|
||||||
"be.ems/src/framework/middleware/repeat"
|
"be.ems/src/framework/middleware/repeat"
|
||||||
"be.ems/src/modules/network_data/controller"
|
"be.ems/src/modules/network_data/controller"
|
||||||
|
"be.ems/src/modules/network_data/service"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
@@ -14,6 +15,9 @@ import (
|
|||||||
func Setup(router *gin.Engine) {
|
func Setup(router *gin.Engine) {
|
||||||
logger.Infof("开始加载 ====> network_data 模块路由")
|
logger.Infof("开始加载 ====> network_data 模块路由")
|
||||||
|
|
||||||
|
// 启动时需要的初始参数
|
||||||
|
InitLoad()
|
||||||
|
|
||||||
neDataGroup := router.Group("/neData")
|
neDataGroup := router.Group("/neData")
|
||||||
|
|
||||||
// 性能统计信息
|
// 性能统计信息
|
||||||
@@ -349,3 +353,9 @@ func Setup(router *gin.Engine) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InitLoad 初始参数
|
||||||
|
func InitLoad() {
|
||||||
|
// 启动时,加载UPF上下行流量
|
||||||
|
go service.NewKpiReport.UPFTodayFlowLoad()
|
||||||
|
}
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ func (r *UDMAuthUser) SelectPage(query map[string]string) (int64, []model.UDMAut
|
|||||||
|
|
||||||
// 查询数量 长度为0直接返回
|
// 查询数量 长度为0直接返回
|
||||||
if err := tx.Count(&total).Error; err != nil || total <= 0 {
|
if err := tx.Count(&total).Error; err != nil || total <= 0 {
|
||||||
logger.Errorf("total err => %v", err)
|
|
||||||
return total, rows
|
return total, rows
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ func (r *UDMSubUser) SelectPage(query map[string]string) (int64, []model.UDMSubU
|
|||||||
|
|
||||||
// 查询数量 长度为0直接返回
|
// 查询数量 长度为0直接返回
|
||||||
if err := tx.Count(&total).Error; err != nil || total <= 0 {
|
if err := tx.Count(&total).Error; err != nil || total <= 0 {
|
||||||
logger.Errorf("total err => %v", err)
|
|
||||||
return total, rows
|
return total, rows
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"be.ems/src/framework/utils/parse"
|
"be.ems/src/framework/utils/parse"
|
||||||
"be.ems/src/modules/network_data/model"
|
"be.ems/src/modules/network_data/model"
|
||||||
"be.ems/src/modules/network_data/repository"
|
"be.ems/src/modules/network_data/repository"
|
||||||
|
neModel "be.ems/src/modules/network_element/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 实例化数据层 KpiReport 结构体
|
// 实例化数据层 KpiReport 结构体
|
||||||
@@ -140,55 +141,111 @@ func (r KpiReport) FindTitle(neType string) []model.KpiTitle {
|
|||||||
return r.kpiReportRepository.SelectKPITitle(neType)
|
return r.kpiReportRepository.SelectKPITitle(neType)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FindUPFTotalFlow 查询UPF总流量 N3上行 N6下行
|
// UPFTodayFlowFind 查询UPF总流量 N3上行 N6下行
|
||||||
func (r KpiReport) FindUPFTotalFlow(rmUID string, day int) map[string]int64 {
|
// down * 8 / 1000 / 1000 单位M
|
||||||
now := time.Now()
|
func (r KpiReport) UPFTodayFlowFind(rmUID string, day int) (int64, int64) {
|
||||||
// 获取当前日期
|
// 获取当前日期
|
||||||
endTime := now.UnixMilli()
|
now := time.Now()
|
||||||
// 将当前日期前几天数
|
var upTotal, downTotal int64
|
||||||
beginTime := now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()
|
|
||||||
|
|
||||||
data := map[string]int64{
|
// 查询最近7天的数据
|
||||||
"up": 0,
|
for i := 0; i <= day; i++ {
|
||||||
"down": 0,
|
dateKey := now.AddDate(0, 0, -i).Format("2006-01-02")
|
||||||
}
|
key := fmt.Sprintf("%s:UPF_FLOW:%s:%s", constants.CACHE_NE_DATA, rmUID, dateKey)
|
||||||
|
|
||||||
// 读取缓存数据 小于2分钟重新缓存
|
// 读取缓存数据
|
||||||
key := fmt.Sprintf("%s:UPF_FLOW:%s_%d", constants.CACHE_NE_DATA, rmUID, day)
|
up, err := redis.GetHash("", key, "up")
|
||||||
if infoStr, err := redis.Get("", key); err == nil && infoStr != "" {
|
if err != nil || up == "" {
|
||||||
json.Unmarshal([]byte(infoStr), &data)
|
up = "0"
|
||||||
if expireSecond, _ := redis.GetExpire("", key); expireSecond > 120 {
|
|
||||||
return data
|
|
||||||
}
|
}
|
||||||
|
down, err := redis.GetHash("", key, "down")
|
||||||
|
if err != nil || down == "" {
|
||||||
|
down = "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
upTotal += parse.Number(up)
|
||||||
|
downTotal += parse.Number(down)
|
||||||
}
|
}
|
||||||
|
|
||||||
// down * 8 / 1000 / 1000 单位M
|
return upTotal, downTotal
|
||||||
rows := r.kpiReportRepository.SelectUPF(rmUID, beginTime, endTime)
|
}
|
||||||
for _, row := range rows {
|
|
||||||
// 解析 JSON 字符串为 map
|
// UPFTodayFlow UPF流量今日统计
|
||||||
var kpiValues []map[string]any
|
func (r KpiReport) UPFTodayFlowUpdate(rmUID string, upValue, downValue int64, rest bool) error {
|
||||||
err := json.Unmarshal([]byte(row.KpiValues), &kpiValues)
|
// 按日期存储统计数据
|
||||||
|
dateKey := time.Now().Format("2006-01-02")
|
||||||
|
key := fmt.Sprintf("%s:UPF_FLOW:%s:%s", constants.CACHE_NE_DATA, rmUID, dateKey)
|
||||||
|
|
||||||
|
// 重置数据
|
||||||
|
if rest {
|
||||||
|
err := redis.SetHash("", key, map[string]any{
|
||||||
|
"up": upValue,
|
||||||
|
"down": downValue,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
return err
|
||||||
}
|
}
|
||||||
|
// 设置key的过期时间为30天,自动清理旧数据
|
||||||
|
err = redis.Expire("", key, 30*24*time.Hour)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 遍历 kpiValues 数组
|
// 使用HIncrBy实时累加统计值
|
||||||
for _, v := range kpiValues {
|
if err := redis.IncrBy("", key, "up", upValue); err != nil {
|
||||||
if k, ok := v["kpiId"]; ok {
|
return err
|
||||||
if k == "UPF.03" {
|
}
|
||||||
data["up"] = data["up"] + parse.Number(v["value"])
|
if err := redis.IncrBy("", key, "down", downValue); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UPFTodayFlowLoad UPF上下行数据到redis
|
||||||
|
func (r KpiReport) UPFTodayFlowLoad() {
|
||||||
|
cacheKeys, _ := redis.GetKeys("", constants.CACHE_NE_INFO+":UPF:*")
|
||||||
|
if len(cacheKeys) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 今日流量
|
||||||
|
now := time.Now()
|
||||||
|
beginTime := now.Truncate(24 * time.Hour).UnixMilli()
|
||||||
|
endTime := beginTime + 24*60*60*1000 - 1
|
||||||
|
|
||||||
|
for _, key := range cacheKeys {
|
||||||
|
var v neModel.NeInfo
|
||||||
|
jsonStr, _ := redis.Get("", key)
|
||||||
|
if len(jsonStr) > 7 {
|
||||||
|
json.Unmarshal([]byte(jsonStr), &v)
|
||||||
|
}
|
||||||
|
if v.NeType == "UPF" && v.RmUID != "" {
|
||||||
|
// 查询历史数据
|
||||||
|
rows := r.kpiReportRepository.SelectUPF(v.RmUID, beginTime, endTime)
|
||||||
|
var upTotal, downTotal int64
|
||||||
|
|
||||||
|
// 处理历史数据
|
||||||
|
for _, row := range rows {
|
||||||
|
var kpiValues []map[string]any
|
||||||
|
if err := json.Unmarshal([]byte(row.KpiValues), &kpiValues); err != nil {
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if k == "UPF.06" {
|
|
||||||
data["down"] = data["down"] + parse.Number(v["value"])
|
for _, v := range kpiValues {
|
||||||
|
if k, ok := v["kpiId"]; ok {
|
||||||
|
if k == "UPF.03" {
|
||||||
|
upTotal += parse.Number(v["value"])
|
||||||
|
}
|
||||||
|
if k == "UPF.06" {
|
||||||
|
downTotal += parse.Number(v["value"])
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 将历史数据添加到Redis
|
||||||
|
r.UPFTodayFlowUpdate(v.RmUID, upTotal, downTotal, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 保存到缓存
|
|
||||||
if infoJSON, err := json.Marshal(data); err == nil {
|
|
||||||
redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute)
|
|
||||||
}
|
|
||||||
|
|
||||||
return data
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,12 +86,17 @@ func (r NeInfo) ClearNeCacheByNeType(neType string) bool {
|
|||||||
func (r NeInfo) FindByNeType(neType string) []model.NeInfo {
|
func (r NeInfo) FindByNeType(neType string) []model.NeInfo {
|
||||||
neInfo := make([]model.NeInfo, 0)
|
neInfo := make([]model.NeInfo, 0)
|
||||||
key := fmt.Sprintf("%s:%s:*", constants.CACHE_NE_INFO, strings.ToUpper(neType))
|
key := fmt.Sprintf("%s:%s:*", constants.CACHE_NE_INFO, strings.ToUpper(neType))
|
||||||
jsonStr, _ := redis.Get("", key)
|
cacheKeys, _ := redis.GetKeys("", key)
|
||||||
if len(jsonStr) > 7 {
|
if len(cacheKeys) > 0 {
|
||||||
err := json.Unmarshal([]byte(jsonStr), &neInfo)
|
for _, key := range cacheKeys {
|
||||||
if err != nil {
|
var v model.NeInfo
|
||||||
return neInfo
|
jsonStr, _ := redis.Get("", key)
|
||||||
|
if len(jsonStr) > 7 {
|
||||||
|
json.Unmarshal([]byte(jsonStr), &v)
|
||||||
|
}
|
||||||
|
neInfo = append(neInfo, v)
|
||||||
}
|
}
|
||||||
|
return neInfo
|
||||||
} else {
|
} else {
|
||||||
neInfo = r.neInfoRepository.SelectList(model.NeInfo{NeType: neType})
|
neInfo = r.neInfoRepository.SelectList(model.NeInfo{NeType: neType})
|
||||||
for _, v := range neInfo {
|
for _, v := range neInfo {
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ func (r SysMenu) SelectByIds(menuIds []int64) []model.SysMenu {
|
|||||||
// Insert 新增信息
|
// Insert 新增信息
|
||||||
func (r SysMenu) Insert(sysMenu model.SysMenu) int64 {
|
func (r SysMenu) Insert(sysMenu model.SysMenu) int64 {
|
||||||
sysMenu.DelFlag = "0"
|
sysMenu.DelFlag = "0"
|
||||||
if sysMenu.MenuId <= 0 {
|
if sysMenu.MenuId > 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
if sysMenu.Icon == "" {
|
if sysMenu.Icon == "" {
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ func capturePacketSource(taskInfo *task) {
|
|||||||
frameMeta := parsePacketFrame(frameNumber, frameTime, packet)
|
frameMeta := parsePacketFrame(frameNumber, frameTime, packet)
|
||||||
|
|
||||||
// 推送到ws订阅组
|
// 推送到ws订阅组
|
||||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s", wsService.GROUP_TRACE_PACKET, taskInfo.TaskNo), frameMeta)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_TRACE_PACKET, taskInfo.TaskNo), frameMeta)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ func (r *TraceTask) CreateUDP() error {
|
|||||||
// 推送文件
|
// 推送文件
|
||||||
if v, ok := mData["pcapFile"]; ok && v != "" {
|
if v, ok := mData["pcapFile"]; ok && v != "" {
|
||||||
logger.Infof("pcapFile: %s", v)
|
logger.Infof("pcapFile: %s", v)
|
||||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%d", wsService.GROUP_TRACE_NE, taskId), taskId)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%d", wsService.GROUP_TRACE_NE, taskId), taskId)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送响应
|
// 发送响应
|
||||||
@@ -160,7 +160,7 @@ func (r *TraceTask) CreateUDP() error {
|
|||||||
// 推送文件
|
// 推送文件
|
||||||
if v, ok := mData["pcapFile"]; ok && v != "" {
|
if v, ok := mData["pcapFile"]; ok && v != "" {
|
||||||
logger.Infof("pcapFile: %s", v)
|
logger.Infof("pcapFile: %s", v)
|
||||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%d", wsService.GROUP_TRACE_NE, taskId), taskId)
|
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%d", wsService.GROUP_TRACE_NE, taskId), taskId)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送响应
|
// 发送响应
|
||||||
|
|||||||
@@ -34,11 +34,11 @@ func GetUPFTotalFlow(requestID string, data any) ([]byte, error) {
|
|||||||
return nil, fmt.Errorf("no matching network element information found")
|
return nil, fmt.Errorf("no matching network element information found")
|
||||||
}
|
}
|
||||||
|
|
||||||
dataMap := neDataService.NewKpiReport.FindUPFTotalFlow(neInfo.RmUID, querys.Day)
|
up, down := neDataService.NewKpiReport.UPFTodayFlowFind(neInfo.RmUID, querys.Day)
|
||||||
|
|
||||||
resultByte, err := json.Marshal(resp.Ok(map[string]any{
|
resultByte, err := json.Marshal(resp.Ok(map[string]any{
|
||||||
"requestId": requestID,
|
"requestId": requestID,
|
||||||
"data": dataMap,
|
"data": map[string]int64{"up": up, "down": down},
|
||||||
}))
|
}))
|
||||||
return resultByte, err
|
return resultByte, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,23 +13,21 @@ const (
|
|||||||
// 组号-其他
|
// 组号-其他
|
||||||
GROUP_OTHER = "0"
|
GROUP_OTHER = "0"
|
||||||
// 组号-跟踪任务网元数据变更 2_traceId
|
// 组号-跟踪任务网元数据变更 2_traceId
|
||||||
GROUP_TRACE_NE = "2_"
|
GROUP_TRACE_NE = "2"
|
||||||
// 组号-信令跟踪Packet 4_taskNo
|
// 组号-信令跟踪Packet 4_taskNo
|
||||||
GROUP_TRACE_PACKET = "4_"
|
GROUP_TRACE_PACKET = "4"
|
||||||
// 组号-指标通用 10_neType_neId
|
// 组号-指标通用 10_neType_neId
|
||||||
GROUP_KPI = "10_"
|
GROUP_KPI = "10"
|
||||||
// 组号-指标UPF 12_neId
|
|
||||||
GROUP_KPI_UPF = "12_"
|
|
||||||
// 组号-自定义KPI指标 20_neType_neId
|
// 组号-自定义KPI指标 20_neType_neId
|
||||||
GROUP_KPI_C = "20_"
|
GROUP_KPI_C = "20"
|
||||||
// 组号-IMS_CDR会话事件 1005_neId
|
// 组号-IMS_CDR会话事件 1005_neId
|
||||||
GROUP_IMS_CDR = "1005_"
|
GROUP_IMS_CDR = "1005"
|
||||||
// 组号-SMF_CDR会话事件 1006_neId
|
// 组号-SMF_CDR会话事件 1006_neId
|
||||||
GROUP_SMF_CDR = "1006_"
|
GROUP_SMF_CDR = "1006"
|
||||||
// 组号-SMSC_CDR会话事件 1007_neId
|
// 组号-SMSC_CDR会话事件 1007_neId
|
||||||
GROUP_SMSC_CDR = "1007_"
|
GROUP_SMSC_CDR = "1007"
|
||||||
// 组号-SGWC_CDR会话事件 1008_neId
|
// 组号-SGWC_CDR会话事件 1008_neId
|
||||||
GROUP_SGWC_CDR = "1008_"
|
GROUP_SGWC_CDR = "1008"
|
||||||
// 组号-AMF_UE会话事件 1010_neId
|
// 组号-AMF_UE会话事件 1010_neId
|
||||||
GROUP_AMF_UE = "1010"
|
GROUP_AMF_UE = "1010"
|
||||||
// 组号-MME_UE会话事件 1011_neId
|
// 组号-MME_UE会话事件 1011_neId
|
||||||
|
|||||||
Reference in New Issue
Block a user