feat: 添加moc/cct统计
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"be.ems/src/framework/i18n"
|
||||
"be.ems/src/framework/logger"
|
||||
@@ -63,8 +64,10 @@ func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language str
|
||||
"F1": "Duration",
|
||||
"G1": "Result Code",
|
||||
"H1": "Result Cause",
|
||||
"I1": "Call Start Time",
|
||||
"J1": "Hangup Time",
|
||||
"I1": "MOS Average",
|
||||
"J1": "Call Connection Time",
|
||||
"K1": "Call Start Time",
|
||||
"L1": "Hangup Time",
|
||||
}
|
||||
// 读取字典数据 CDR SIP响应代码类别类型
|
||||
dictCDRSipCode := sysService.NewSysDictData.SelectDictDataByType("cdr_sip_code")
|
||||
@@ -156,6 +159,16 @@ func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language str
|
||||
releaseTimeStr = v.(string)
|
||||
}
|
||||
}
|
||||
// 通话质量
|
||||
var mosAverage int64 = 0
|
||||
if v, ok := cdrJSON["mosAverage"]; ok && v != nil && callType != "sms" {
|
||||
mosAverage = parse.Number(v)
|
||||
}
|
||||
// 通话连接时间
|
||||
callConnectionTime := "-"
|
||||
if v, ok := cdrJSON["callConnectionTime"]; ok && v != nil && callType != "sms" {
|
||||
callConnectionTime = fmt.Sprintf("%ds", parse.Number(v))
|
||||
}
|
||||
|
||||
dataCells = append(dataCells, map[string]any{
|
||||
"A" + idx: row.ID,
|
||||
@@ -166,11 +179,157 @@ func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language str
|
||||
"F" + idx: duration,
|
||||
"G" + idx: callResult,
|
||||
"H" + idx: callCause,
|
||||
"I" + idx: seizureTimeStr,
|
||||
"J" + idx: releaseTimeStr,
|
||||
"I" + idx: mosAverage,
|
||||
"J" + idx: callConnectionTime,
|
||||
"K" + idx: seizureTimeStr,
|
||||
"L" + idx: releaseTimeStr,
|
||||
})
|
||||
}
|
||||
|
||||
// 导出数据表格
|
||||
return file.WriteSheet(headerCells, dataCells, fileName, "")
|
||||
}
|
||||
|
||||
// CDRMOSHour CDR MOS 统计
|
||||
func (r CDREventIMS) CDRMOSHour(rmUID string, timestamp int64) []map[string]any {
|
||||
t := time.UnixMilli(timestamp)
|
||||
beginTime := t
|
||||
endTime := t
|
||||
// 检查时分秒是否都为零
|
||||
if t.Hour() == 0 && t.Minute() == 0 && t.Second() == 0 {
|
||||
// 获取当天起始时间(00:00:00)
|
||||
beginTime = t.Truncate(time.Hour)
|
||||
// 计算当天结束时间(23:59:59)
|
||||
endTime = beginTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
|
||||
} else {
|
||||
// 起始时间:当前小时的 00 分 00 秒
|
||||
beginTime = t.Truncate(time.Hour)
|
||||
// 结束时间:当前小时的 59 分 59 秒 999 毫秒
|
||||
endTime = beginTime.Add(time.Hour - time.Millisecond)
|
||||
}
|
||||
|
||||
querys := model.CDREventIMSQuery{
|
||||
RmUID: rmUID,
|
||||
RecordType: "MOC",
|
||||
StartTime: beginTime.Unix(),
|
||||
EndTime: endTime.Unix(),
|
||||
}
|
||||
rows := r.cdrEventIMSRepository.Select(querys)
|
||||
// 创建一个map来存储按时间段合并后的数据
|
||||
timeGroup := make(map[int64]map[string]float64)
|
||||
// 遍历每个数据项
|
||||
for _, row := range rows {
|
||||
// 将毫秒时间戳转换为小时级时间戳(保留到小时的起始毫秒)
|
||||
timeHour := row.Timestamp / 3600 * 3600 // 1小时 = 3600000毫秒
|
||||
|
||||
// 解析 JSON 字符串为 map
|
||||
var cdrJSON map[string]interface{}
|
||||
err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON)
|
||||
if err != nil {
|
||||
logger.Warnf("Unmarshal JSON: %s", err.Error())
|
||||
continue
|
||||
}
|
||||
|
||||
// 记录类型
|
||||
var mosAverage float64 = 0
|
||||
if v, ok := cdrJSON["mosAverage"]; ok && v != nil {
|
||||
mosAverage = v.(float64)
|
||||
} else {
|
||||
continue
|
||||
}
|
||||
|
||||
// 合并到对应的小时段
|
||||
if _, exists := timeGroup[timeHour]; !exists {
|
||||
timeGroup[timeHour] = map[string]float64{
|
||||
"total": 0,
|
||||
"mosSum": 0,
|
||||
}
|
||||
}
|
||||
timeGroup[timeHour]["total"] += 1
|
||||
timeGroup[timeHour]["mosSum"] += mosAverage
|
||||
}
|
||||
|
||||
// 时间组合输出
|
||||
data := make([]map[string]any, 0, len(timeGroup))
|
||||
for hour, sums := range timeGroup {
|
||||
data = append(data, map[string]any{
|
||||
"timeGroup": fmt.Sprintf("%d", hour),
|
||||
"total": sums["total"],
|
||||
"mosSum": sums["mosSum"],
|
||||
"mosAvg": sums["mosAvg"] / sums["total"],
|
||||
})
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
// CDRCCTHour CDR CCT 统计
|
||||
func (r CDREventIMS) CDRCCTHour(rmUID string, timestamp int64) []map[string]any {
|
||||
t := time.UnixMilli(timestamp)
|
||||
beginTime := t
|
||||
endTime := t
|
||||
// 检查时分秒是否都为零
|
||||
if t.Hour() == 0 && t.Minute() == 0 && t.Second() == 0 {
|
||||
// 获取当天起始时间(00:00:00)
|
||||
beginTime = t.Truncate(time.Hour)
|
||||
// 计算当天结束时间(23:59:59)
|
||||
endTime = beginTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
|
||||
} else {
|
||||
// 起始时间:当前小时的 00 分 00 秒
|
||||
beginTime = t.Truncate(time.Hour)
|
||||
// 结束时间:当前小时的 59 分 59 秒 999 毫秒
|
||||
endTime = beginTime.Add(time.Hour - time.Millisecond)
|
||||
}
|
||||
|
||||
querys := model.CDREventIMSQuery{
|
||||
RmUID: rmUID,
|
||||
RecordType: "MOC",
|
||||
StartTime: beginTime.Unix(),
|
||||
EndTime: endTime.Unix(),
|
||||
}
|
||||
rows := r.cdrEventIMSRepository.Select(querys)
|
||||
// 创建一个map来存储按时间段合并后的数据
|
||||
timeGroup := make(map[int64]map[string]float64)
|
||||
// 遍历每个数据项
|
||||
for _, row := range rows {
|
||||
// 将毫秒时间戳转换为小时级时间戳(保留到小时的起始毫秒)
|
||||
timeHour := row.Timestamp / 3600 * 3600 // 1小时 = 3600000毫秒
|
||||
|
||||
// 解析 JSON 字符串为 map
|
||||
var cdrJSON map[string]interface{}
|
||||
err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON)
|
||||
if err != nil {
|
||||
logger.Warnf("Unmarshal JSON: %s", err.Error())
|
||||
continue
|
||||
}
|
||||
|
||||
// 记录类型
|
||||
var callConnectionTime float64 = 0
|
||||
if v, ok := cdrJSON["callConnectionTime"]; ok && v != nil {
|
||||
callConnectionTime = v.(float64)
|
||||
} else {
|
||||
continue
|
||||
}
|
||||
|
||||
// 合并到对应的小时段
|
||||
if _, exists := timeGroup[timeHour]; !exists {
|
||||
timeGroup[timeHour] = map[string]float64{
|
||||
"total": 0,
|
||||
"cctSum": 0,
|
||||
}
|
||||
}
|
||||
timeGroup[timeHour]["total"] += 1
|
||||
timeGroup[timeHour]["cctSum"] += callConnectionTime
|
||||
}
|
||||
|
||||
// 时间组合输出
|
||||
data := make([]map[string]any, 0, len(timeGroup))
|
||||
for hour, sums := range timeGroup {
|
||||
data = append(data, map[string]any{
|
||||
"timeGroup": fmt.Sprintf("%d", hour),
|
||||
"total": sums["total"],
|
||||
"cctSum": sums["cctSum"],
|
||||
"cctAvg": sums["cctSum"] / sums["total"],
|
||||
})
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user