feat: 优化UPF流量统计逻辑
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
||||
"be.ems/src/framework/utils/parse"
|
||||
"be.ems/src/modules/network_data/model"
|
||||
"be.ems/src/modules/network_data/repository"
|
||||
neModel "be.ems/src/modules/network_element/model"
|
||||
)
|
||||
|
||||
// 实例化数据层 KpiReport 结构体
|
||||
@@ -140,55 +141,111 @@ func (r KpiReport) FindTitle(neType string) []model.KpiTitle {
|
||||
return r.kpiReportRepository.SelectKPITitle(neType)
|
||||
}
|
||||
|
||||
// FindUPFTotalFlow 查询UPF总流量 N3上行 N6下行
|
||||
func (r KpiReport) FindUPFTotalFlow(rmUID string, day int) map[string]int64 {
|
||||
now := time.Now()
|
||||
// UPFTodayFlowFind 查询UPF总流量 N3上行 N6下行
|
||||
// down * 8 / 1000 / 1000 单位M
|
||||
func (r KpiReport) UPFTodayFlowFind(rmUID string, day int) (int64, int64) {
|
||||
// 获取当前日期
|
||||
endTime := now.UnixMilli()
|
||||
// 将当前日期前几天数
|
||||
beginTime := now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()
|
||||
now := time.Now()
|
||||
var upTotal, downTotal int64
|
||||
|
||||
data := map[string]int64{
|
||||
"up": 0,
|
||||
"down": 0,
|
||||
}
|
||||
// 查询最近7天的数据
|
||||
for i := 0; i <= day; i++ {
|
||||
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)
|
||||
if infoStr, err := redis.Get("", key); err == nil && infoStr != "" {
|
||||
json.Unmarshal([]byte(infoStr), &data)
|
||||
if expireSecond, _ := redis.GetExpire("", key); expireSecond > 120 {
|
||||
return data
|
||||
// 读取缓存数据
|
||||
up, err := redis.GetHash("", key, "up")
|
||||
if err != nil || up == "" {
|
||||
up = "0"
|
||||
}
|
||||
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
|
||||
rows := r.kpiReportRepository.SelectUPF(rmUID, beginTime, endTime)
|
||||
for _, row := range rows {
|
||||
// 解析 JSON 字符串为 map
|
||||
var kpiValues []map[string]any
|
||||
err := json.Unmarshal([]byte(row.KpiValues), &kpiValues)
|
||||
return upTotal, downTotal
|
||||
}
|
||||
|
||||
// UPFTodayFlow UPF流量今日统计
|
||||
func (r KpiReport) UPFTodayFlowUpdate(rmUID string, upValue, downValue int64, rest bool) error {
|
||||
// 按日期存储统计数据
|
||||
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 {
|
||||
continue
|
||||
return err
|
||||
}
|
||||
// 设置key的过期时间为30天,自动清理旧数据
|
||||
err = redis.Expire("", key, 30*24*time.Hour)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// 遍历 kpiValues 数组
|
||||
for _, v := range kpiValues {
|
||||
if k, ok := v["kpiId"]; ok {
|
||||
if k == "UPF.03" {
|
||||
data["up"] = data["up"] + parse.Number(v["value"])
|
||||
// 使用HIncrBy实时累加统计值
|
||||
if err := redis.IncrBy("", key, "up", upValue); err != nil {
|
||||
return err
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user