diff --git a/src/modules/network_data/controller/all_alarm.go b/src/modules/network_data/controller/all_alarm.go index 2372de98..b6ba8de0 100644 --- a/src/modules/network_data/controller/all_alarm.go +++ b/src/modules/network_data/controller/all_alarm.go @@ -48,8 +48,8 @@ func (s *AlarmController) List(c *gin.Context) { querys.RmUID = neInfo.RmUID // 查询数据 - data := s.alarmService.SelectPage(querys) - c.JSON(200, result.Ok(data)) + rows, total := s.alarmService.SelectPage(querys) + c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) } // 告警删除 diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 13d1fb9f..207ba191 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -57,8 +57,8 @@ func (s *IMSController) CDRList(c *gin.Context) { querys.RmUID = neInfo.RmUID // 查询数据 - data := s.cdrEventService.SelectPage(querys) - c.JSON(200, result.Ok(data)) + rows, total := s.cdrEventService.SelectPage(querys) + c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) } // CDR会话删除 @@ -109,13 +109,12 @@ func (s *IMSController) CDRExport(c *gin.Context) { return } querys.RmUID = neInfo.RmUID - data := s.cdrEventService.SelectPage(querys) - if parse.Number(data["total"]) == 0 { + rows, total := s.cdrEventService.SelectPage(querys) + if total == 0 { // 导出数据记录为空 c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } - rows := data["rows"].([]model.CDREventIMS) // 导出文件名称 fileName := fmt.Sprintf("ims_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) @@ -150,16 +149,6 @@ func (s *IMSController) CDRExport(c *gin.Context) { if v, ok := cdrJSON["recordType"]; ok && v != nil { recordType = v.(string) } - // 被叫 - called := "" - if v, ok := cdrJSON["calledParty"]; ok && v != nil { - called = v.(string) - } - // 主叫 - caller := "" - if v, ok := cdrJSON["callerParty"]; ok && v != nil { - caller = v.(string) - } // 呼叫类型 callType := "sms" callTypeLable := "SMS" @@ -172,6 +161,16 @@ func (s *IMSController) CDRExport(c *gin.Context) { } } } + // 被叫 + called := "" + if v, ok := cdrJSON["calledParty"]; ok && v != nil { + called = v.(string) + } + // 主叫 + caller := "" + if v, ok := cdrJSON["callerParty"]; ok && v != nil { + caller = v.(string) + } // 时长 duration := "-" if v, ok := cdrJSON["callDuration"]; ok && v != nil && callType != "sms" { @@ -191,8 +190,11 @@ func (s *IMSController) CDRExport(c *gin.Context) { // 取时间 timeStr := "" if v, ok := cdrJSON["releaseTime"]; ok && v != nil { - releaseTime := parse.Number(v) - timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) + if releaseTime := parse.Number(v); releaseTime > 0 { + timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) + } else { + timeStr = v.(string) + } } dataCells = append(dataCells, map[string]any{ diff --git a/src/modules/network_data/controller/sgwc.go b/src/modules/network_data/controller/sgwc.go index 48c2b9ab..5089ebbf 100644 --- a/src/modules/network_data/controller/sgwc.go +++ b/src/modules/network_data/controller/sgwc.go @@ -17,7 +17,6 @@ import ( neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SGWCController 结构体 @@ -57,10 +56,7 @@ func (s *SGWCController) CDRList(c *gin.Context) { // 查询数据 rows, total := s.cdrEventService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{ - "total": total, - "rows": rows, - })) + c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) } // CDR会话删除 @@ -96,7 +92,7 @@ func (s *SGWCController) CDRExport(c *gin.Context) { language := ctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.CDREventSGWCQuery - if err := c.ShouldBindBodyWith(&querys, binding.JSON); err != nil { + if err := c.ShouldBindBodyWithJSON(&querys); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -119,35 +115,33 @@ func (s *SGWCController) CDRExport(c *gin.Context) { } // 导出文件名称 - fileName := fmt.Sprintf("SGWC_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) + fileName := fmt.Sprintf("sgwc_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) // 第一行表头标题 headerCells := map[string]string{ "A1": "ID", - "B1": "Charging ID", - "C1": "NE Name", - "D1": "Resource Unique ID", - "E1": "Subscriber ID Data", - "F1": "Subscriber ID Type", - "G1": "Data Volume Uplink", - "H1": "Data Volume Downlink", - "I1": "Data Total Volume", - "J1": "Duration", - "K1": "Invocation Time", - "L1": "User Identifier", - "M1": "SSC Mode", - "N1": "DNN ID", - "O1": "PDU Type", - "P1": "RAT Type", - "Q1": "PDU IPv4 Address", - "R1": "Network Function IPv4", - "S1": "PDU IPv6 Address Swith Prefix", - "T1": "Record Network Function ID", - "U1": "Record Type", - "V1": "Record Opening Time", + "B1": "NE Name", + "C1": "Resource Unique ID", + "D1": "Charging ID", + "E1": "IMSI", + "F1": "MSISDN", + "G1": "GPRS Uplink", + "H1": "GPRS Downlink", + "I1": "Duration", + "J1": "Invocation Time", + "K1": "PGW Address Used", + "L1": "SGW Address", + "M1": "RAT Type", + "N1": "PDPPDN Type", + "O1": "PDPPDN Address", + "P1": "Node Address", + "Q1": "Node Type", + "R1": "Record Access Point Name NI", + "S1": "Record Cause For Rec Closing", + "T1": "Record Sequence Number", + "U1": "Local Record Sequence Number", } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) - for i, row := range rows { idx := strconv.Itoa(i + 2) // 解析 JSON 字符串为 map @@ -162,51 +156,91 @@ func (s *SGWCController) CDRExport(c *gin.Context) { if v, ok := cdrJSON["chargingID"]; ok && v != nil { chargingID = fmt.Sprint(parse.Number(v)) } - // 订阅 ID 类型 - subscriptionIDType := "-" - // 订阅 ID 数据 - subscriptionIDData := "-" - if v, ok := cdrJSON["subscriberIdentifier"]; ok && v != nil { - if sub, subOk := v.(map[string]any); subOk && sub != nil { - subscriptionIDType = sub["subscriptionIDType"].(string) - subscriptionIDData = sub["subscriptionIDData"].(string) + // IMSI + servedIMSI := "" + if v, ok := cdrJSON["servedIMSI"]; ok && v != nil { + servedIMSI = fmt.Sprint(v) + } + // MSISDN + servedMSISDN := "" + if v, ok := cdrJSON["servedMSISDN"]; ok && v != nil { + servedMSISDN = fmt.Sprint(v) + } + // pGWAddressUsed + pGWAddressUsed := "" + if v, ok := cdrJSON["pGWAddressUsed"]; ok && v != nil { + pGWAddressUsed = fmt.Sprint(v) + } + // sGWAddress + sGWAddress := "" + if v, ok := cdrJSON["sGWAddress"]; ok && v != nil { + sGWAddress = fmt.Sprint(v) + } + // rATType + rATType := "" + if v, ok := cdrJSON["rATType"]; ok && v != nil { + rATType = fmt.Sprint(v) + } + // pdpPDNType + pdpPDNType := "" + if v, ok := cdrJSON["pdpPDNType"]; ok && v != nil { + pdpPDNType = fmt.Sprint(v) + } + // servedPDPPDNAddress + servedPDPPDNAddress := "" + if v, ok := cdrJSON["servedPDPPDNAddress"]; ok && v != nil { + servedPDPPDNAddress = fmt.Sprint(v) + } + // servedPDPPDNAddress + servingNodeAddress := []string{} + if v, ok := cdrJSON["servingNodeAddress"]; ok && v != nil { + for _, v := range v.([]any) { + servingNodeAddress = append(servingNodeAddress, fmt.Sprint(v)) } } - - // 网络功能 IPv4 地址 - networkFunctionIPv4Address := "" - if v, ok := cdrJSON["nFunctionConsumerInformation"]; ok && v != nil { - if conInfo, conInfoOk := v.(map[string]any); conInfoOk && conInfo != nil { - networkFunctionIPv4Address = conInfo["networkFunctionIPv4Address"].(string) + // servingNodeType + servingNodeType := []string{} + if v, ok := cdrJSON["servingNodeType"]; ok && v != nil { + for _, v := range v.([]any) { + if v, ok := v.(map[string]any)["servingNodeType"]; ok && v != nil { + servingNodeType = append(servingNodeType, fmt.Sprint(v)) + } } } - + // accessPointNameNI + accessPointNameNI := "" + if v, ok := cdrJSON["accessPointNameNI"]; ok && v != nil { + accessPointNameNI = fmt.Sprint(v) + } + // causeForRecClosing + causeForRecClosing := "" + if v, ok := cdrJSON["causeForRecClosing"]; ok && v != nil { + causeForRecClosing = fmt.Sprint(v) + } + // recordSequenceNumber + recordSequenceNumber := "" + if v, ok := cdrJSON["recordSequenceNumber"]; ok && v != nil { + recordSequenceNumber = fmt.Sprint(v) + } + // localRecordSequenceNumber + localRecordSequenceNumber := "" + if v, ok := cdrJSON["localRecordSequenceNumber"]; ok && v != nil { + localRecordSequenceNumber = fmt.Sprint(v) + } // 数据量上行链路 - dataVolumeUplink := []string{} + dataVolumeGPRSUplink := []string{} // 数据量下行链路 - dataVolumeDownlink := []string{} - // 数据总量 - dataTotalVolume := []string{} - - if v, ok := cdrJSON["listOfMultipleUnitUsage"]; ok && v != nil { + dataVolumeGPRSDownlink := []string{} + if v, ok := cdrJSON["listOfTrafficVolumes"]; ok && v != nil { usageList := v.([]any) if len(usageList) > 0 { for _, used := range usageList { usedUnit := used.(map[string]any) - usedUnitList := usedUnit["usedUnitContainer"].([]any) - if len(usedUnitList) > 0 { - for _, data := range usedUnitList { - udata := data.(map[string]any) - if dup, dupOk := udata["dataVolumeUplink"]; dupOk { - dataVolumeUplink = append(dataVolumeUplink, fmt.Sprint(parse.Number(dup))) - } - if ddown, ddownOk := udata["dataVolumeDownlink"]; ddownOk { - dataVolumeDownlink = append(dataVolumeDownlink, fmt.Sprint(parse.Number(ddown))) - } - if dt, dtOk := udata["dataTotalVolume"]; dtOk { - dataTotalVolume = append(dataTotalVolume, fmt.Sprint(parse.Number(dt))) - } - } + if dup, dupOk := usedUnit["dataVolumeGPRSUplink"]; dupOk { + dataVolumeGPRSUplink = append(dataVolumeGPRSUplink, fmt.Sprint(parse.Number(dup))) + } + if ddown, ddownOk := usedUnit["dataVolumeGPRSDownlink"]; ddownOk { + dataVolumeGPRSDownlink = append(dataVolumeGPRSDownlink, fmt.Sprint(parse.Number(ddown))) } } } @@ -218,93 +252,32 @@ func (s *SGWCController) CDRExport(c *gin.Context) { } // 调用时间 invocationTimestamp := "" - if v, ok := cdrJSON["invocationTimestamp"]; ok && v != nil { - invocationTimestamp = v.(string) - } - // 记录打开时间 - User_Identifier := "" - SSC_Mode := "" - RAT_Type := "" - DNN_ID := "" - PDU_Type := "" - PDU_IPv4 := "" - PDU_IPv6 := "" - if v, ok := cdrJSON["pDUSessionChargingInformation"]; ok && v != nil { - pduInfo := v.(map[string]any) - - if v, ok := pduInfo["userIdentifier"]; ok && v != nil { - User_Identifier = v.(string) - } - if v, ok := pduInfo["sSCMode"]; ok && v != nil { - SSC_Mode = v.(string) - } - if v, ok := pduInfo["rATType"]; ok && v != nil { - RAT_Type = v.(string) - } - if v, ok := pduInfo["dNNID"]; ok && v != nil { - DNN_ID = v.(string) - } - if v, ok := pduInfo["pDUType"]; ok && v != nil { - PDU_Type = v.(string) - } - if v, ok := pduInfo["pDUAddress"]; ok && v != nil { - pDUAddress := v.(map[string]any) - if addr, ok := pDUAddress["pDUIPv4Address"]; ok && addr != nil { - PDU_IPv4 = addr.(string) - } - if addr, ok := pDUAddress["pDUIPv6AddresswithPrefix"]; ok && addr != nil { - PDU_IPv6 = addr.(string) - } - } - - // pduSessionChargingInformation = fmt.Sprintf(`User Identifier: %s - // SSC Mode: %s RAT Type: %s DNN ID: %s - // PDU Type: %s - // PDU IPv4 Address: %s - // PDU IPv6 Addres Swith Prefix: %s`, User_Identifier, SSC_Mode, RAT_Type, DNN_ID, PDU_Type, PDU_IPv4, PDU_IPv6) - } - - // 记录网络参数ID - recordNFID := "" - if v, ok := cdrJSON["recordingNetworkFunctionID"]; ok && v != nil { - recordNFID = v.(string) - } - - //记录开始时间 - recordOpeningTime := "" if v, ok := cdrJSON["recordOpeningTime"]; ok && v != nil { - recordOpeningTime = v.(string) - } - - //记录类型 - recordType := "" - if v, ok := cdrJSON["recordType"]; ok && v != nil { - recordType = v.(string) + invocationTimestamp = v.(string) } dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, - "B" + idx: chargingID, - "C" + idx: row.NeName, - "D" + idx: row.RmUID, - "E" + idx: subscriptionIDData, - "F" + idx: subscriptionIDType, - "G" + idx: strings.Join(dataVolumeUplink, ","), - "H" + idx: strings.Join(dataVolumeDownlink, ","), - "I" + idx: strings.Join(dataTotalVolume, ","), - "J" + idx: duration, - "K" + idx: invocationTimestamp, - "L" + idx: User_Identifier, - "M" + idx: SSC_Mode, - "N" + idx: DNN_ID, - "O" + idx: PDU_Type, - "P" + idx: RAT_Type, - "Q" + idx: PDU_IPv4, - "R" + idx: networkFunctionIPv4Address, - "S" + idx: PDU_IPv6, - "T" + idx: recordNFID, - "U" + idx: recordType, - "V" + idx: recordOpeningTime, + "B" + idx: row.NeName, + "C" + idx: row.RmUID, + "D" + idx: chargingID, + "E" + idx: servedIMSI, + "F" + idx: servedMSISDN, + "G" + idx: strings.Join(dataVolumeGPRSUplink, ","), + "H" + idx: strings.Join(dataVolumeGPRSDownlink, ","), + "I" + idx: duration, + "J" + idx: invocationTimestamp, + "K" + idx: pGWAddressUsed, + "L" + idx: sGWAddress, + "M" + idx: rATType, + "N" + idx: pdpPDNType, + "O" + idx: servedPDPPDNAddress, + "P" + idx: strings.Join(servingNodeAddress, ","), + "Q" + idx: strings.Join(servingNodeType, ","), + "R" + idx: accessPointNameNI, + "S" + idx: causeForRecClosing, + "T" + idx: recordSequenceNumber, + "U" + idx: localRecordSequenceNumber, }) } diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index 527dd52e..8519a051 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -57,8 +57,8 @@ func (s *SMFController) CDRList(c *gin.Context) { querys.RmUID = neInfo.RmUID // 查询数据 - data := s.cdrEventService.SelectPage(querys) - c.JSON(200, result.Ok(data)) + rows, total := s.cdrEventService.SelectPage(querys) + c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) } // CDR会话删除 @@ -109,13 +109,12 @@ func (s *SMFController) CDRExport(c *gin.Context) { return } querys.RmUID = neInfo.RmUID - data := s.cdrEventService.SelectPage(querys) - if parse.Number(data["total"]) == 0 { + rows, total := s.cdrEventService.SelectPage(querys) + if total == 0 { // 导出数据记录为空 c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } - rows := data["rows"].([]model.CDREventSMF) // 导出文件名称 fileName := fmt.Sprintf("smf_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) diff --git a/src/modules/network_data/controller/smsc.go b/src/modules/network_data/controller/smsc.go index 167d097a..11ef32ec 100644 --- a/src/modules/network_data/controller/smsc.go +++ b/src/modules/network_data/controller/smsc.go @@ -17,6 +17,7 @@ import ( "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" + sysService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) @@ -55,8 +56,8 @@ func (s *SMSCController) CDRList(c *gin.Context) { querys.RmUID = neInfo.RmUID // 查询数据 - data := s.cdrEventService.SelectPage(querys) - c.JSON(200, result.Ok(data)) + rows, total := s.cdrEventService.SelectPage(querys) + c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) } // CDR会话删除 @@ -107,13 +108,12 @@ func (s *SMSCController) CDRExport(c *gin.Context) { return } querys.RmUID = neInfo.RmUID - data := s.cdrEventService.SelectPage(querys) - if parse.Number(data["total"]) == 0 { + rows, total := s.cdrEventService.SelectPage(querys) + if total == 0 { // 导出数据记录为空 c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } - rows := data["rows"].([]model.CDREventSMSC) // 导出文件名称 fileName := fmt.Sprintf("smsc_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) @@ -127,6 +127,8 @@ func (s *SMSCController) CDRExport(c *gin.Context) { "F1": "Result", "G1": "Time", } + // 读取字典数据 CDR 原因码 + dictCDRCauseCode := sysService.NewSysDictData.SelectDictDataByType("cdr_cause_code") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { @@ -166,11 +168,24 @@ func (s *SMSCController) CDRExport(c *gin.Context) { callResult = "Success" } } + // 结果原因 + if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" { + cause := fmt.Sprint(v) + for _, v := range dictCDRCauseCode { + if cause == v.DictValue { + callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DictLabel)) + break + } + } + } // 取时间 timeStr := "" if v, ok := cdrJSON["updateTime"]; ok && v != nil { - releaseTime := parse.Number(v) - timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) + if releaseTime := parse.Number(v); releaseTime > 0 { + timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) + } else { + timeStr = v.(string) + } } dataCells = append(dataCells, map[string]any{ diff --git a/src/modules/network_data/model/alarm.go b/src/modules/network_data/model/alarm.go index 4e4bc9a9..3c898ed8 100644 --- a/src/modules/network_data/model/alarm.go +++ b/src/modules/network_data/model/alarm.go @@ -4,37 +4,37 @@ import "time" // Alarm 告警数据对象 alarm type Alarm struct { - ID string `json:"id" gorm:"id"` - AlarmSeq string `json:"alarmSeq" gorm:"alarm_seq"` - AlarmId string `json:"alarmId" gorm:"alarm_id"` - AlarmTitle string `json:"alarmTitle" gorm:"alarm_title"` - NeType string `json:"neType" gorm:"ne_type"` - NeId string `json:"neId" gorm:"ne_id"` - AlarmCode string `json:"alarmCode" gorm:"alarm_code"` - EventTime time.Time `json:"eventTime" gorm:"event_time"` - AlarmType string `json:"alarmType" gorm:"alarm_type"` - OrigSeverity string `json:"origSeverity" gorm:"orig_severity"` // 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) - PerceivedSeverity string `json:"perceivedSeverity" gorm:"perceived_severity"` // 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) - PvFlag string `json:"pvFlag" gorm:"pv_flag"` - NeName string `json:"neName" gorm:"ne_name"` - ObjectUid string `json:"objectUid" gorm:"object_uid"` - ObjectName string `json:"objectName" gorm:"object_name"` - ObjectType string `json:"objectType" gorm:"object_type"` - LocationInfo string `json:"locationInfo" gorm:"location_info"` - Province string `json:"province" gorm:"province"` - AlarmStatus string `json:"alarmStatus" gorm:"alarm_status"` // 0:clear, 1:active - SpecificProblem string `json:"specificProblem" gorm:"specific_problem"` - SpecificProblemId string `json:"specificProblemId" gorm:"specific_problem_id"` - AddInfo string `json:"addInfo" gorm:"add_info"` - Counter string `json:"counter" gorm:"counter"` - LatestEventTime time.Time `json:"latestEventTime" gorm:"latest_event_time"` - AckState string `json:"ackState" gorm:"ack_state"` // 0: Unacked, 1: Acked - AckTime time.Time `json:"ackTime" gorm:"ack_time"` - AckUser string `json:"ackUser" gorm:"ack_user"` - ClearType string `json:"clearType" gorm:"clear_type"` // 0: Unclear, 1: AutoClear, 2: ManualClear - ClearTime time.Time `json:"clearTime" gorm:"clear_time"` - ClearUser string `json:"clearUser" gorm:"clear_user"` - Timestamp time.Time `json:"timestamp" gorm:"timestamp"` + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + AlarmSeq string `json:"alarmSeq" gorm:"column:alarm_seq"` + AlarmId string `json:"alarmId" gorm:"column:alarm_id"` + AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeId string `json:"neId" gorm:"column:ne_id"` + AlarmCode string `json:"alarmCode" gorm:"column:alarm_code"` + EventTime time.Time `json:"eventTime" gorm:"column:event_time"` + AlarmType string `json:"alarmType" gorm:"column:alarm_type"` + OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + PerceivedSeverity string `json:"perceivedSeverity" gorm:"column:perceived_severity"` // 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + PvFlag string `json:"pvFlag" gorm:"column:pv_flag"` + NeName string `json:"neName" gorm:"column:ne_name"` + ObjectUid string `json:"objectUid" gorm:"column:object_uid"` + ObjectName string `json:"objectName" gorm:"column:object_name"` + ObjectType string `json:"objectType" gorm:"column:object_type"` + LocationInfo string `json:"locationInfo" gorm:"column:location_info"` + Province string `json:"province" gorm:"column:province"` + AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 0:clear, 1:active + SpecificProblem string `json:"specificProblem" gorm:"column:specific_problem"` + SpecificProblemId string `json:"specificProblemId" gorm:"column:specific_problem_id"` + AddInfo string `json:"addInfo" gorm:"column:add_info"` + Counter string `json:"counter" gorm:"column:counter"` + LatestEventTime time.Time `json:"latestEventTime" gorm:"column:latest_event_time"` + AckState string `json:"ackState" gorm:"column:ack_state"` // 0: Unacked, 1: Acked + AckTime time.Time `json:"ackTime" gorm:"column:ack_time"` + AckUser string `json:"ackUser" gorm:"column:ack_user"` + ClearType string `json:"clearType" gorm:"column:clear_type"` // 0: Unclear, 1: AutoClear, 2: ManualClear + ClearTime time.Time `json:"clearTime" gorm:"column:clear_time"` + ClearUser string `json:"clearUser" gorm:"column:clear_user"` + Timestamp time.Time `json:"timestamp" gorm:"column:timestamp"` } // TableName 表名称 diff --git a/src/modules/network_data/model/cdr_event_ims.go b/src/modules/network_data/model/cdr_event_ims.go index 60973fa3..c6e463bf 100644 --- a/src/modules/network_data/model/cdr_event_ims.go +++ b/src/modules/network_data/model/cdr_event_ims.go @@ -13,6 +13,11 @@ type CDREventIMS struct { CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` } +// TableName 表名称 +func (*CDREventIMS) TableName() string { + return "cdr_event_ims" +} + // CDREventIMSQuery CDR会话对象IMS查询参数结构体 type CDREventIMSQuery struct { NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型IMS diff --git a/src/modules/network_data/model/cdr_event_sgwc.go b/src/modules/network_data/model/cdr_event_sgwc.go index 17a0e819..fedf6a4d 100644 --- a/src/modules/network_data/model/cdr_event_sgwc.go +++ b/src/modules/network_data/model/cdr_event_sgwc.go @@ -22,15 +22,15 @@ func (*CDREventSGWC) TableName() string { // CDREventSGWCQuery CDR会话对象SGWC查询参数结构体 type CDREventSGWCQuery struct { - NeType string `json:"neType" form:"neType" binding:"required,oneof=SGWC"` // SGWC - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - RecordType string `json:"recordType" form:"recordType"` // 暂时没用到 - SubscriberID string `json:"subscriberID" form:"subscriberID"` - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` - PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` + NeType string `json:"neType" form:"neType" binding:"required,oneof=SGWC"` // SGWC + NeID string `json:"neId" form:"neId" binding:"required"` + RmUID string `json:"rmUID" form:"rmUID"` + IMSI string `json:"imsi" form:"imsi"` + MSISDN string `json:"msisdn" form:"msisdn"` + StartTime string `json:"startTime" form:"startTime"` + EndTime string `json:"endTime" form:"endTime"` + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc + PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` + PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` } diff --git a/src/modules/network_data/model/cdr_event_smf.go b/src/modules/network_data/model/cdr_event_smf.go index c076da16..69e6a067 100644 --- a/src/modules/network_data/model/cdr_event_smf.go +++ b/src/modules/network_data/model/cdr_event_smf.go @@ -15,6 +15,11 @@ type CDREventSMF struct { // ====== 非数据库字段属性 ====== } +// TableName 表名称 +func (*CDREventSMF) TableName() string { + return "cdr_event_smf" +} + // CDREventSMFQuery CDR会话对象SMF查询参数结构体 type CDREventSMFQuery struct { NeType string `json:"neType" form:"neType" binding:"required"` // SMF diff --git a/src/modules/network_data/model/cdr_event_smsc.go b/src/modules/network_data/model/cdr_event_smsc.go index 6a50e597..a851a9b1 100644 --- a/src/modules/network_data/model/cdr_event_smsc.go +++ b/src/modules/network_data/model/cdr_event_smsc.go @@ -13,6 +13,11 @@ type CDREventSMSC struct { CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` } +// TableName 表名称 +func (*CDREventSMSC) TableName() string { + return "cdr_event_smsc" +} + // CDREventSMSCQuery CDR会话对象SMSC查询参数结构体 type CDREventSMSCQuery struct { NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型SMSC diff --git a/src/modules/network_data/repository/alarm.go b/src/modules/network_data/repository/alarm.go index 41d50325..754c0cb0 100644 --- a/src/modules/network_data/repository/alarm.go +++ b/src/modules/network_data/repository/alarm.go @@ -1,194 +1,103 @@ package repository import ( - "fmt" "strings" "be.ems/src/framework/datasource" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_data/model" ) // 实例化数据层 Alarm 结构体 -var NewAlarm = &Alarm{ - selectSql: `select - id, alarm_seq, alarm_id, alarm_title, ne_type, ne_id, alarm_code, event_time, - alarm_type, orig_severity, perceived_severity, pv_flag, ne_name, object_uid, object_name, - object_type, location_info, province, alarm_status, specific_problem, specific_problem_id, - add_info, counter, latest_event_time, ack_state, ack_time, ack_user, clear_type, - clear_time, clear_user, timestamp - from alarm`, - - resultMap: map[string]string{ - "id": "ID", - "alarm_seq": "AlarmSeq", - "alarm_id": "AlarmId", - "alarm_title": "AlarmTitle", - "ne_type": "NeType", - "ne_id": "NeId", - "alarm_code": "AlarmCode", - "event_time": "EventTime", - "alarm_type": "AlarmType", - "orig_severity": "OrigSeverity", - "perceived_severity": "PerceivedSeverity", - "pv_flag": "PvFlag", - "ne_name": "NeName", - "object_uid": "ObjectUid", - "object_name": "ObjectName", - "object_type": "ObjectType", - "location_info": "LocationInfo", - "province": "Province", - "alarm_status": "AlarmStatus", - "specific_problem": "SpecificProblem", - "specific_problem_id": "SpecificProblemId", - "add_info": "AddInfo", - "counter": "Counter", - "latest_event_time": "LatestEventTime", - "ack_state": "AckState", - "ack_time": "AckTime", - "ack_user": "AckUser", - "clear_type": "ClearType", - "clear_time": "ClearTime", - "clear_user": "ClearUser", - "timestamp": "Timestamp", - }, -} +var NewAlarm = &Alarm{} // Alarm 告警 数据层处理 -type Alarm struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type Alarm struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *Alarm) convertResultRows(rows []map[string]any) []model.Alarm { - arr := make([]model.Alarm, 0) - for _, row := range rows { - item := model.Alarm{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *Alarm) SelectPage(querys model.AlarmQuery) map[string]any { +// SelectByPage 分页查询集合 +func (r Alarm) SelectByPage(querys model.AlarmQuery) ([]model.Alarm, int64) { + tx := datasource.DB("").Model(&model.Alarm{}) // 查询条件拼接 - var conditions []string - var params []any if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) + tx = tx.Where("ne_type = ?", querys.NeType) } if querys.RmUID != "" { - conditions = append(conditions, "object_uid = ?") - params = append(params, querys.RmUID) + tx = tx.Where("rm_uid = ?", querys.RmUID) } if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - params = append(params, querys.StartTime) + startTime := querys.StartTime + if len(startTime) == 13 { + startTime = startTime[:10] + } + tx = tx.Where("timestamp >= ?", startTime) } if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - params = append(params, querys.EndTime) + endTime := querys.EndTime + if len(endTime) == 13 { + endTime = endTime[:10] + } + tx = tx.Where("timestamp <= ?", endTime) } if querys.OrigSeverity != "" { eventTypes := strings.Split(querys.OrigSeverity, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("orig_severity in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } + tx = tx.Where("orig_severity in (%s)", eventTypes) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } + // 查询结果 + var total int64 = 0 + rows := []model.Alarm{} - result := map[string]any{ - "total": 0, - "rows": []model.Alarm{}, + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from alarm" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - // 排序 - orderSql := "" if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } + sortField := querys.SortField + if querys.SortOrder == "desc" { + sortField = sortField + " desc" } - orderSql = fmt.Sprintf(" order by %s ", sortSql) + tx = tx.Order(sortField) } - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) + // 查询数据分页 + pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Find(&rows).Error if err != nil { - logger.Errorf("query err => %v", err) + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result + return rows, total } // SelectByIds 通过ID查询 func (r *Alarm) SelectByIds(ids []string) []model.Alarm { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.Alarm{} + rows := []model.Alarm{} + if len(ids) <= 0 { + return rows } - // 转换实体 - return r.convertResultRows(results) + tx := datasource.DB("").Model(&model.Alarm{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows } // DeleteByIds 批量删除信息 func (r *Alarm) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from alarm where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) + if len(ids) <= 0 { return 0 } - return results + tx := datasource.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.Alarm{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/network_data/repository/cdr_event_ims.go b/src/modules/network_data/repository/cdr_event_ims.go index 598e848c..31dc7293 100644 --- a/src/modules/network_data/repository/cdr_event_ims.go +++ b/src/modules/network_data/repository/cdr_event_ims.go @@ -6,184 +6,110 @@ import ( "be.ems/src/framework/datasource" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_data/model" ) // 实例化数据层 CDREventIMS 结构体 -var NewCDREventIMS = &CDREventIMS{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`, +var NewCDREventIMS = &CDREventIMS{} - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} +// CDREventIMS CDR会话事件 数据层处理 +type CDREventIMS struct{} -// CDREventIMS CDR会话事件IMS 数据层处理 -type CDREventIMS struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventIMS) convertResultRows(rows []map[string]any) []model.CDREventIMS { - arr := make([]model.CDREventIMS, 0) - for _, row := range rows { - item := model.CDREventIMS{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { +// SelectByPage 分页查询集合 +func (r CDREventIMS) SelectByPage(querys model.CDREventIMSQuery) ([]model.CDREventIMS, int64) { + tx := datasource.DB("").Model(&model.CDREventIMS{}) // 查询条件拼接 - var conditions []string - var params []any if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) + tx = tx.Where("ne_type = ?", querys.NeType) } if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) + tx = tx.Where("rm_uid = ?", querys.RmUID) } if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] + startTime := querys.StartTime + if len(startTime) == 13 { + startTime = startTime[:10] } - params = append(params, querys.StartTime) + tx = tx.Where("timestamp >= ?", startTime) } if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] + endTime := querys.EndTime + if len(endTime) == 13 { + endTime = endTime[:10] } - params = append(params, querys.EndTime) + tx = tx.Where("timestamp <= ?", endTime) } if querys.CallerParty != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.callerParty') = ?") - params = append(params, querys.CallerParty) + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') = ?", querys.CallerParty) } if querys.CalledParty != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.calledParty') = ?") - params = append(params, querys.CalledParty) + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.calledParty') = ?", querys.CalledParty) } - // MySQL8支持的 - // if querys.RecordType != "" { - // recordTypes := strings.Split(querys.RecordType, ",") - // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) - // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) - // for _, recordType := range recordTypes { - // params = append(params, recordType) - // } - // } - // Mariadb不支持json in查询改or + if querys.RecordType != "" { recordTypes := strings.Split(querys.RecordType, ",") var queryStrArr []string for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, recordType) + queryStrArr = append(queryStrArr, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') = '%s'", recordType)) } - conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + tx = tx.Where(fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } + // 查询结果 + var total int64 = 0 + rows := []model.CDREventIMS{} - result := map[string]any{ - "total": 0, - "rows": []model.CDREventIMS{}, + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_ims" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - // 排序 - orderSql := "" if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } + sortField := querys.SortField + if querys.SortOrder == "desc" { + sortField = sortField + " desc" } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + tx = tx.Order(sortField) } - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) + // 查询数据分页 + pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Find(&rows).Error if err != nil { - logger.Errorf("query err => %v", err) + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result + return rows, total } // SelectByIds 通过ID查询 -func (r *CDREventIMS) SelectByIds(cdrIds []string) []model.CDREventIMS { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventIMS{} +func (r *CDREventIMS) SelectByIds(ids []string) []model.CDREventIMS { + rows := []model.CDREventIMS{} + if len(ids) <= 0 { + return rows } - // 转换实体 - return r.convertResultRows(results) + tx := datasource.DB("").Model(&model.CDREventIMS{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows } // DeleteByIds 批量删除信息 -func (r *CDREventIMS) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_ims where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +func (r *CDREventIMS) DeleteByIds(ids []string) int64 { + if len(ids) <= 0 { return 0 } - return results + tx := datasource.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.CDREventIMS{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/network_data/repository/cdr_event_sgwc.go b/src/modules/network_data/repository/cdr_event_sgwc.go index 49829631..cf87e9db 100644 --- a/src/modules/network_data/repository/cdr_event_sgwc.go +++ b/src/modules/network_data/repository/cdr_event_sgwc.go @@ -36,11 +36,11 @@ func (r CDREventSGWC) SelectByPage(querys model.CDREventSGWCQuery) ([]model.CDRE } tx = tx.Where("timestamp <= ?", endTime) } - if querys.RecordType != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.recordType') = ?", querys.RecordType) + if querys.IMSI != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedIMSI') = ?", querys.IMSI) } - if querys.SubscriberID != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?", querys.SubscriberID) + if querys.MSISDN != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedMSISDN') = ?", querys.MSISDN) } // 查询结果 @@ -52,6 +52,15 @@ func (r CDREventSGWC) SelectByPage(querys model.CDREventSGWCQuery) ([]model.CDRE return rows, total } + // 排序 + if querys.SortField != "" { + sortField := querys.SortField + if querys.SortOrder == "desc" { + sortField = sortField + " desc" + } + tx = tx.Order(sortField) + } + // 查询数据分页 pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) diff --git a/src/modules/network_data/repository/cdr_event_smf.go b/src/modules/network_data/repository/cdr_event_smf.go index 14f49cfc..57341f43 100644 --- a/src/modules/network_data/repository/cdr_event_smf.go +++ b/src/modules/network_data/repository/cdr_event_smf.go @@ -1,170 +1,103 @@ package repository import ( - "fmt" - "strings" - "be.ems/src/framework/datasource" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_data/model" ) // 实例化数据层 CDREventSMF 结构体 -var NewCDREventSMF = &CDREventSMF{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} +var NewCDREventSMF = &CDREventSMF{} // CDREventSMF CDR会话事件 数据层处理 -type CDREventSMF struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type CDREventSMF struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventSMF) convertResultRows(rows []map[string]any) []model.CDREventSMF { - arr := make([]model.CDREventSMF, 0) - for _, row := range rows { - item := model.CDREventSMF{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { +// SelectByPage 分页查询集合 +func (r CDREventSMF) SelectByPage(querys model.CDREventSMFQuery) ([]model.CDREventSMF, int64) { + tx := datasource.DB("").Model(&model.CDREventSMF{}) // 查询条件拼接 - var conditions []string - var params []any if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) + tx = tx.Where("ne_type = ?", querys.NeType) } if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) + tx = tx.Where("rm_uid = ?", querys.RmUID) } if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] + startTime := querys.StartTime + if len(startTime) == 13 { + startTime = startTime[:10] } - params = append(params, querys.StartTime) + tx = tx.Where("timestamp >= ?", startTime) } if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] + endTime := querys.EndTime + if len(endTime) == 13 { + endTime = endTime[:10] } - params = append(params, querys.EndTime) + tx = tx.Where("timestamp <= ?", endTime) } if querys.RecordType != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, querys.RecordType) + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.recordType') = ?", querys.RecordType) } if querys.SubscriberID != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?") - params = append(params, querys.SubscriberID) + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?", querys.SubscriberID) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } + // 查询结果 + var total int64 = 0 + rows := []model.CDREventSMF{} - result := map[string]any{ - "total": 0, - "rows": []model.CDREventSMF{}, + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smf" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - // 排序 - orderSql := "" if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } + sortField := querys.SortField + if querys.SortOrder == "desc" { + sortField = sortField + " desc" } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + tx = tx.Order(sortField) } - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) + // 查询数据分页 + pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Find(&rows).Error if err != nil { - logger.Errorf("query err => %v", err) + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result + return rows, total } // SelectByIds 通过ID查询 -func (r *CDREventSMF) SelectByIds(cdrIds []string) []model.CDREventSMF { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventSMF{} +func (r *CDREventSMF) SelectByIds(ids []string) []model.CDREventSMF { + rows := []model.CDREventSMF{} + if len(ids) <= 0 { + return rows } - // 转换实体 - return r.convertResultRows(results) + tx := datasource.DB("").Model(&model.CDREventSMF{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows } // DeleteByIds 批量删除信息 -func (r *CDREventSMF) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_smf where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +func (r *CDREventSMF) DeleteByIds(ids []string) int64 { + if len(ids) <= 0 { return 0 } - return results + tx := datasource.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.CDREventSMF{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/network_data/repository/cdr_event_smsc.go b/src/modules/network_data/repository/cdr_event_smsc.go index 7673e7bf..3b6542ce 100644 --- a/src/modules/network_data/repository/cdr_event_smsc.go +++ b/src/modules/network_data/repository/cdr_event_smsc.go @@ -6,176 +6,110 @@ import ( "be.ems/src/framework/datasource" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_data/model" ) // 实例化数据层 CDREventSMSC 结构体 -var NewCDREventSMSC = &CDREventSMSC{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smsc`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} +var NewCDREventSMSC = &CDREventSMSC{} // CDREventSMSC CDR会话事件 数据层处理 -type CDREventSMSC struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type CDREventSMSC struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventSMSC) convertResultRows(rows []map[string]any) []model.CDREventSMSC { - arr := make([]model.CDREventSMSC, 0) - for _, row := range rows { - item := model.CDREventSMSC{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any { +// SelectByPage 分页查询集合 +func (r CDREventSMSC) SelectByPage(querys model.CDREventSMSCQuery) ([]model.CDREventSMSC, int64) { + tx := datasource.DB("").Model(&model.CDREventSMSC{}) // 查询条件拼接 - var conditions []string - var params []any if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) + tx = tx.Where("ne_type = ?", querys.NeType) } if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) + tx = tx.Where("rm_uid = ?", querys.RmUID) } if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] + startTime := querys.StartTime + if len(startTime) == 13 { + startTime = startTime[:10] } - params = append(params, querys.StartTime) + tx = tx.Where("timestamp >= ?", startTime) } if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] + endTime := querys.EndTime + if len(endTime) == 13 { + endTime = endTime[:10] } - params = append(params, querys.EndTime) + tx = tx.Where("timestamp <= ?", endTime) } - // MySQL8支持的 - // if querys.RecordType != "" { - // recordTypes := strings.Split(querys.RecordType, ",") - // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) - // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) - // for _, recordType := range recordTypes { - // params = append(params, recordType) - // } - // } - // Mariadb不支持json in查询改or + if querys.CallerParty != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') = ?", querys.CallerParty) + } + if querys.CalledParty != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.calledParty') = ?", querys.CalledParty) + } + if querys.RecordType != "" { recordTypes := strings.Split(querys.RecordType, ",") var queryStrArr []string for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, recordType) + queryStrArr = append(queryStrArr, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') = '%s'", recordType)) } - conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + tx = tx.Where(fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } + // 查询结果 + var total int64 = 0 + rows := []model.CDREventSMSC{} - result := map[string]any{ - "total": 0, - "rows": []model.CDREventSMSC{}, + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smsc" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - // 排序 - orderSql := "" if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } + sortField := querys.SortField + if querys.SortOrder == "desc" { + sortField = sortField + " desc" } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + tx = tx.Order(sortField) } - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) + // 查询数据分页 + pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Find(&rows).Error if err != nil { - logger.Errorf("query err => %v", err) + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result + return rows, total } // SelectByIds 通过ID查询 -func (r *CDREventSMSC) SelectByIds(cdrIds []string) []model.CDREventSMSC { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventSMSC{} +func (r *CDREventSMSC) SelectByIds(ids []string) []model.CDREventSMSC { + rows := []model.CDREventSMSC{} + if len(ids) <= 0 { + return rows } - // 转换实体 - return r.convertResultRows(results) + tx := datasource.DB("").Model(&model.CDREventSMSC{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows } // DeleteByIds 批量删除信息 -func (r *CDREventSMSC) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_smsc where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +func (r *CDREventSMSC) DeleteByIds(ids []string) int64 { + if len(ids) <= 0 { return 0 } - return results + tx := datasource.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.CDREventSMSC{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/network_data/service/alarm.go b/src/modules/network_data/service/alarm.go index 3df04ead..2729e674 100644 --- a/src/modules/network_data/service/alarm.go +++ b/src/modules/network_data/service/alarm.go @@ -18,8 +18,8 @@ type Alarm struct { } // SelectPage 根据条件分页查询 -func (r *Alarm) SelectPage(querys model.AlarmQuery) map[string]any { - return r.alarmRepository.SelectPage(querys) +func (r *Alarm) SelectPage(querys model.AlarmQuery) ([]model.Alarm, int64) { + return r.alarmRepository.SelectByPage(querys) } // DeleteByIds 批量删除信息 diff --git a/src/modules/network_data/service/cdr_event_ims.go b/src/modules/network_data/service/cdr_event_ims.go index 922fb024..4ce3c3a0 100644 --- a/src/modules/network_data/service/cdr_event_ims.go +++ b/src/modules/network_data/service/cdr_event_ims.go @@ -18,8 +18,8 @@ type CDREventIMS struct { } // SelectPage 根据条件分页查询 -func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { - return r.cdrEventIMSRepository.SelectPage(querys) +func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) ([]model.CDREventIMS, int64) { + return r.cdrEventIMSRepository.SelectByPage(querys) } // DeleteByIds 批量删除信息 diff --git a/src/modules/network_data/service/cdr_event_smf.go b/src/modules/network_data/service/cdr_event_smf.go index abd30a85..02fb8f4b 100644 --- a/src/modules/network_data/service/cdr_event_smf.go +++ b/src/modules/network_data/service/cdr_event_smf.go @@ -18,8 +18,8 @@ type CDREventSMF struct { } // SelectPage 根据条件分页查询 -func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { - return r.cdrEventRepository.SelectPage(querys) +func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) ([]model.CDREventSMF, int64) { + return r.cdrEventRepository.SelectByPage(querys) } // DeleteByIds 批量删除信息 diff --git a/src/modules/network_data/service/cdr_event_smsc.go b/src/modules/network_data/service/cdr_event_smsc.go index 39448874..27173df3 100644 --- a/src/modules/network_data/service/cdr_event_smsc.go +++ b/src/modules/network_data/service/cdr_event_smsc.go @@ -18,8 +18,8 @@ type CDREventSMSC struct { } // SelectPage 根据条件分页查询 -func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any { - return r.cdrEventRepository.SelectPage(querys) +func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) ([]model.CDREventSMSC, int64) { + return r.cdrEventRepository.SelectByPage(querys) } // DeleteByIds 批量删除信息