ref: v3变更,,表结构变更coreId/neId

This commit is contained in:
TsMask
2025-09-15 11:00:34 +08:00
parent 60004ded55
commit 38d2e2372a
193 changed files with 3255 additions and 3878 deletions

View File

@@ -65,23 +65,23 @@ func (s *BackupExportCDRProcessor) Execute(data any) (any, error) {
switch v {
case "ims":
neList := s.neInfoService.Find(neModel.NeInfo{NeType: "IMS"}, false, false)
for _, ne := range neList {
result[ne.NeName] = s.exportIMS(ne.CoreUID, ne.NeUID, params.Hour, params.FileType)
for _, neinfo := range neList {
result[neinfo.NeUid] = s.exportIMS(neinfo.ID, neinfo.NeUid, params.Hour, params.FileType)
}
case "smsc":
neList := s.neInfoService.Find(neModel.NeInfo{NeType: "SMSC"}, false, false)
for _, ne := range neList {
result[ne.NeName] = s.exportSMSC(ne.CoreUID, ne.NeUID, params.Hour, params.FileType)
for _, neinfo := range neList {
result[neinfo.NeUid] = s.exportSMSC(neinfo.ID, neinfo.NeUid, params.Hour, params.FileType)
}
case "smf":
neList := s.neInfoService.Find(neModel.NeInfo{NeType: "SMF"}, false, false)
for _, ne := range neList {
result[ne.NeName] = s.exportSMF(ne.CoreUID, ne.NeUID, params.Hour, params.FileType)
for _, neinfo := range neList {
result[neinfo.NeUid] = s.exportSMF(neinfo.ID, neinfo.NeUid, params.Hour, params.FileType)
}
case "sgwc":
neList := s.neInfoService.Find(neModel.NeInfo{NeType: "SGWC"}, false, false)
for _, ne := range neList {
result[ne.NeName] = s.exportSGWC(ne.CoreUID, ne.NeUID, params.Hour, params.FileType)
for _, neinfo := range neList {
result[neinfo.NeUid] = s.exportSGWC(neinfo.ID, neinfo.NeUid, params.Hour, params.FileType)
}
}
}
@@ -91,7 +91,7 @@ func (s *BackupExportCDRProcessor) Execute(data any) (any, error) {
}
// exportIMS 导出IMS-CDR会话事件数据
func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fileType string) string {
func (s BackupExportCDRProcessor) exportIMS(neId int64, neUid string, hour int, fileType string) string {
// 前 hour 小时
now := time.Now()
end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location())
@@ -99,14 +99,9 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil
language := "en"
query := map[string]string{
"sortField": "timestamp",
"sortOrder": "asc",
"coreUid": coreUid,
"neUid": neUid,
"neId": fmt.Sprint(neId),
"beginTime": fmt.Sprint(start.UnixMilli()),
"endTime": fmt.Sprint(end.UnixMilli()),
"pageNum": fmt.Sprint(1),
"pageSize": fmt.Sprint(1000_0000),
}
rows, total := s.cdrEventService.FindByPage("IMS", query)
if total == 0 {
@@ -115,7 +110,7 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil
// 导出文件名称
fileName := fmt.Sprintf("ims_cdr_event_export_%d_%s.%s", len(rows), date.ParseDateToStr(end, date.YYYYMMDDHHMMSS), fileType)
filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/ims_cdr_event", coreUid, neUid, fileName)
filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/ims_cdr_event", neUid, fileName)
if runtime.GOOS == "windows" {
filePath = fmt.Sprintf("C:%s", filePath)
}
@@ -125,7 +120,6 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil
data := [][]string{
{
"ID",
"NE Name",
"Record Behavior",
"Type",
"Caller",
@@ -227,7 +221,6 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil
data = append(data, []string{
fmt.Sprint(row.ID),
row.NeUID,
recordType,
callTypeLable,
caller,
@@ -250,16 +243,15 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil
// 第一行表头标题
headerCells := map[string]string{
"A1": "ID",
"B1": "NE Name",
"C1": "Record Behavior",
"D1": "Type",
"E1": "Caller",
"F1": "Called",
"G1": "Duration",
"H1": "Result Code",
"I1": "Result Cause",
"J1": "Call Start Time",
"K1": "Hangup Time",
"B1": "Record Behavior",
"C1": "Type",
"D1": "Caller",
"E1": "Called",
"F1": "Duration",
"G1": "Result Code",
"H1": "Result Cause",
"I1": "Call Start Time",
"J1": "Hangup Time",
}
// 读取字典数据 CDR SIP响应代码类别类型
dictCDRSipCode := s.sysDictService.FindByType("cdr_sip_code")
@@ -354,16 +346,15 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,
"B" + idx: row.NeUID,
"C" + idx: recordType,
"D" + idx: callTypeLable,
"E" + idx: caller,
"F" + idx: called,
"G" + idx: duration,
"H" + idx: callResult,
"I" + idx: callCause,
"J" + idx: seizureTimeStr,
"K" + idx: releaseTimeStr,
"B" + idx: recordType,
"C" + idx: callTypeLable,
"D" + idx: caller,
"E" + idx: called,
"F" + idx: duration,
"G" + idx: callResult,
"H" + idx: callCause,
"I" + idx: seizureTimeStr,
"J" + idx: releaseTimeStr,
})
}
// 导出数据表格
@@ -381,7 +372,7 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil
}
// exportSMSC 导出SMSC-CDR会话事件数据
func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fileType string) string {
func (s BackupExportCDRProcessor) exportSMSC(neId int64, neUid string, hour int, fileType string) string {
// 前 hour 小时
now := time.Now()
end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location())
@@ -389,14 +380,9 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi
language := "en"
query := map[string]string{
"sortField": "timestamp",
"sortOrder": "asc",
"coreUid": coreUid,
"neUid": neUid,
"neId": fmt.Sprint(neId),
"beginTime": fmt.Sprint(start.UnixMilli()),
"endTime": fmt.Sprint(end.UnixMilli()),
"pageNum": fmt.Sprint(1),
"pageSize": fmt.Sprint(1000_0000),
}
rows, total := s.cdrEventService.FindByPage("SMSC", query)
if total == 0 {
@@ -405,7 +391,7 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi
// 导出文件名称
fileName := fmt.Sprintf("smsc_cdr_event_export_%d_%s.%s", len(rows), date.ParseDateToStr(end, date.YYYYMMDDHHMMSS), fileType)
filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/smsc_cdr_event", coreUid, neUid, fileName)
filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/smsc_cdr_event", neUid, fileName)
if runtime.GOOS == "windows" {
filePath = fmt.Sprintf("C:%s", filePath)
}
@@ -415,7 +401,6 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi
data := [][]string{
{
"ID",
"NE Name",
"Record Behavior",
"Service Type",
"Caller",
@@ -484,7 +469,6 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi
data = append(data, []string{
fmt.Sprint(row.ID),
row.NeUID,
recordType,
serviceType,
caller,
@@ -504,13 +488,12 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi
// 第一行表头标题
headerCells := map[string]string{
"A1": "ID",
"B1": "NE Name",
"C1": "Record Behavior",
"D1": "Service Type",
"E1": "Caller",
"F1": "Called",
"G1": "Result",
"H1": "Time",
"B1": "Record Behavior",
"C1": "Service Type",
"D1": "Caller",
"E1": "Called",
"F1": "Result",
"G1": "Time",
}
// 读取字典数据 CDR 原因码
dictCDRCauseCode := s.sysDictService.FindByType("cdr_cause_code")
@@ -575,13 +558,12 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,
"B" + idx: row.NeUID,
"C" + idx: recordType,
"D" + idx: serviceType,
"E" + idx: caller,
"F" + idx: called,
"G" + idx: callResult,
"H" + idx: timeStr,
"B" + idx: recordType,
"C" + idx: serviceType,
"D" + idx: caller,
"E" + idx: called,
"F" + idx: callResult,
"G" + idx: timeStr,
})
}
// 导出数据表格
@@ -599,21 +581,16 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi
}
// exportSMF 导出SMF-CDR会话事件数据
func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fileType string) string {
func (s BackupExportCDRProcessor) exportSMF(neId int64, neUid string, hour int, fileType string) string {
// 前 hour 小时
now := time.Now()
end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location())
start := end.Add(-time.Duration(hour) * time.Hour)
query := map[string]string{
"sortField": "timestamp",
"sortOrder": "asc",
"coreUid": coreUid,
"neUid": neUid,
"neId": fmt.Sprint(neId),
"beginTime": fmt.Sprint(start.UnixMilli()),
"endTime": fmt.Sprint(end.UnixMilli()),
"pageNum": fmt.Sprint(1),
"pageSize": fmt.Sprint(1000_0000),
}
rows, total := s.cdrEventService.FindByPage("SMF", query)
if total == 0 {
@@ -622,7 +599,7 @@ func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fil
// 导出文件名称
fileName := fmt.Sprintf("smf_cdr_event_export_%d_%s.%s", len(rows), date.ParseDateToStr(end, date.YYYYMMDDHHMMSS), fileType)
filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/smf_cdr_event", coreUid, neUid, fileName)
filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/smf_cdr_event", neUid, fileName)
if runtime.GOOS == "windows" {
filePath = fmt.Sprintf("C:%s", filePath)
}
@@ -784,8 +761,6 @@ func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fil
data = append(data, []string{
fmt.Sprint(row.ID),
chargingID,
row.NeType,
row.NeUID,
subscriptionIDData,
subscriptionIDType,
fmt.Sprint(dataVolumeUplink),
@@ -818,26 +793,24 @@ func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fil
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",
"C1": "Subscriber ID Data",
"D1": "Subscriber ID Type",
"E1": "Data Volume Uplink",
"F1": "Data Volume Downlink",
"G1": "Data Total Volume",
"H1": "Duration",
"I1": "Invocation Time",
"J1": "User Identifier",
"K1": "SSC Mode",
"L1": "DNN ID",
"M1": "PDU Type",
"N1": "RAT Type",
"O1": "PDU IPv4 Address",
"P1": "Network Function IPv4",
"Q1": "PDU IPv6 Address Swith Prefix",
"R1": "Record Network Function ID",
"S1": "Record Type",
"T1": "Record Opening Time",
}
// 从第二行开始的数据
dataCells := make([]map[string]any, 0)
@@ -971,26 +944,24 @@ func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fil
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,
"B" + idx: chargingID,
"C" + idx: row.NeType,
"D" + idx: row.NeUID,
"E" + idx: subscriptionIDData,
"F" + idx: subscriptionIDType,
"G" + idx: dataVolumeUplink,
"H" + idx: dataVolumeDownlink,
"I" + idx: 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,
"C" + idx: subscriptionIDData,
"D" + idx: subscriptionIDType,
"E" + idx: dataVolumeUplink,
"F" + idx: dataVolumeDownlink,
"G" + idx: dataTotalVolume,
"H" + idx: duration,
"I" + idx: invocationTimestamp,
"J" + idx: User_Identifier,
"K" + idx: SSC_Mode,
"L" + idx: DNN_ID,
"M" + idx: PDU_Type,
"N" + idx: RAT_Type,
"O" + idx: PDU_IPv4,
"P" + idx: networkFunctionIPv4Address,
"Q" + idx: PDU_IPv6,
"R" + idx: recordNFID,
"S" + idx: recordType,
"T" + idx: recordOpeningTime,
})
}
// 导出数据表格
@@ -1008,21 +979,16 @@ func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fil
}
// exportSGWC 导出SGWC-CDR会话事件数据
func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fileType string) string {
func (s BackupExportCDRProcessor) exportSGWC(neId int64, neUid string, hour int, fileType string) string {
// 前 hour 小时
now := time.Now()
end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location())
start := end.Add(-time.Duration(hour) * time.Hour)
query := map[string]string{
"sortField": "timestamp",
"sortOrder": "asc",
"coreUid": coreUid,
"neUid": neUid,
"neId": fmt.Sprint(neId),
"beginTime": fmt.Sprint(start.UnixMilli()),
"endTime": fmt.Sprint(end.UnixMilli()),
"pageNum": fmt.Sprint(1),
"pageSize": fmt.Sprint(1000_0000),
}
rows, total := s.cdrEventService.FindByPage("SGWC", query)
if total == 0 {
@@ -1031,7 +997,7 @@ func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fi
// 导出文件名称
fileName := fmt.Sprintf("sgwc_cdr_event_export_%d_%s.%s", len(rows), date.ParseDateToStr(end, date.YYYYMMDDHHMMSS), fileType)
filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/sgwc_cdr_event", coreUid, neUid, fileName)
filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/sgwc_cdr_event", neUid, fileName)
if runtime.GOOS == "windows" {
filePath = fmt.Sprintf("C:%s", filePath)
}
@@ -1041,8 +1007,6 @@ func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fi
data := [][]string{
{
"ID",
"NE Name",
"Resource Unique ID",
"Charging ID",
"IMSI",
"MSISDN",
@@ -1195,8 +1159,6 @@ func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fi
data = append(data, []string{
fmt.Sprint(row.ID),
row.NeType,
row.NeUID,
chargingID,
servedIMSI,
servedMSISDN,
@@ -1230,28 +1192,26 @@ func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fi
// 第一行表头标题
headerCells := map[string]string{
"A1": "ID",
"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",
"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",
"V1": "Record Type",
"W1": "Record Opening Time",
"B1": "Charging ID",
"C1": "IMSI",
"D1": "MSISDN",
"E1": "GPRS Uplink",
"F1": "GPRS Downlink",
"G1": "Duration",
"H1": "Invocation Time",
"I1": "PGW Address",
"J1": "SGW Address",
"K1": "RAT Type",
"L1": "PDPPDN Type",
"M1": "PDPPDN Address",
"N1": "Node Address",
"O1": "Node Type",
"P1": "Record Access Point Name NI",
"Q1": "Record Cause For Rec Closing",
"R1": "Record Sequence Number",
"S1": "Local Record Sequence Number",
"T1": "Record Type",
"U1": "Record Opening Time",
}
// 从第二行开始的数据
dataCells := make([]map[string]any, 0)
@@ -1386,28 +1346,26 @@ func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fi
dataCells = append(dataCells, map[string]any{
"A" + idx: row.ID,
"B" + idx: row.NeType,
"C" + idx: row.NeUID,
"D" + idx: chargingID,
"E" + idx: servedIMSI,
"F" + idx: servedMSISDN,
"G" + idx: dataVolumeGPRSUplink,
"H" + idx: 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,
"V" + idx: recordType,
"W" + idx: invocationTimestamp,
"B" + idx: chargingID,
"C" + idx: servedIMSI,
"D" + idx: servedMSISDN,
"E" + idx: dataVolumeGPRSUplink,
"F" + idx: dataVolumeGPRSDownlink,
"G" + idx: duration,
"H" + idx: invocationTimestamp,
"I" + idx: pGWAddressUsed,
"J" + idx: sGWAddress,
"K" + idx: rATType,
"L" + idx: pdpPDNType,
"M" + idx: servedPDPPDNAddress,
"N" + idx: strings.Join(servingNodeAddress, ","),
"O" + idx: strings.Join(servingNodeType, ","),
"P" + idx: accessPointNameNI,
"Q" + idx: causeForRecClosing,
"R" + idx: recordSequenceNumber,
"S" + idx: localRecordSequenceNumber,
"T" + idx: recordType,
"U" + idx: invocationTimestamp,
})
}
// 导出数据表格

View File

@@ -344,9 +344,6 @@ func (s BackupExportTableProcessor) exportSMF(hour int, columns []string, filePa
if col == "id" {
arr[i] = fmt.Sprintf("%d", row.ID)
}
if col == "neType" || col == "ne_type" {
arr[i] = fmt.Sprintf("%v", row.NeType)
}
// 单层json
if strings.HasPrefix("json", col) {
key := strings.TrimPrefix(col, "json")
@@ -463,9 +460,6 @@ func (s BackupExportTableProcessor) exportIMS(hour int, columns []string, filePa
if col == "id" {
arr[i] = fmt.Sprintf("%d", row.ID)
}
if col == "neType" || col == "ne_type" {
arr[i] = fmt.Sprintf("%v", row.NeType)
}
// 单层json
if strings.HasPrefix("json", col) {
key := strings.TrimPrefix(col, "json")
@@ -653,9 +647,6 @@ func (s BackupExportTableProcessor) exportSMSC(hour int, columns []string, fileP
if v == "id" {
arr[i] = fmt.Sprintf("%d", row.ID)
}
if v == "neType" || v == "ne_type" {
arr[i] = fmt.Sprintf("%v", row.NeType)
}
// 单层json
if strings.HasPrefix("json", v) {
key := strings.TrimPrefix(v, "json")
@@ -842,9 +833,6 @@ func (s BackupExportTableProcessor) exportSGWC(hour int, columns []string, fileP
if v == "id" {
arr[i] = fmt.Sprintf("%d", row.ID)
}
if v == "neType" || v == "ne_type" {
arr[i] = fmt.Sprintf("%v", row.NeType)
}
// 单层json
if strings.HasPrefix("json", v) {
key := strings.TrimPrefix(v, "json")

View File

@@ -64,13 +64,13 @@ func (s *BackupExportUDMProcessor) Execute(data any) (any, error) {
for _, v := range params.DataType {
switch v {
case "auth":
result[fmt.Sprintf("%s-%s", neInfo.NeUID, v)] = s.exportAuth(neInfo.CoreUID, neInfo.NeUID, params.FileType)
result[fmt.Sprintf("%s-%s", v, neInfo.NeUid)] = s.exportAuth(neInfo.ID, neInfo.NeUid, params.FileType)
case "sub":
result[fmt.Sprintf("%s-%s", neInfo.NeUID, v)] = s.exportSub(neInfo.CoreUID, neInfo.NeUID, params.FileType)
result[fmt.Sprintf("%s-%s", v, neInfo.NeUid)] = s.exportSub(neInfo.ID, neInfo.NeUid, params.FileType)
case "voip":
result[fmt.Sprintf("%s-%s", neInfo.NeUID, v)] = s.exportVOIP(neInfo.CoreUID, neInfo.NeUID, params.FileType)
result[fmt.Sprintf("%s-%s", v, neInfo.NeUid)] = s.exportVOIP(neInfo.ID, neInfo.NeUid, params.FileType)
case "volte":
result[fmt.Sprintf("%s-%s", neInfo.NeUID, v)] = s.exportVolte(neInfo.CoreUID, neInfo.NeUID, params.FileType)
result[fmt.Sprintf("%s-%s", v, neInfo.NeUid)] = s.exportVolte(neInfo.ID, neInfo.NeUid, params.FileType)
}
}
}
@@ -80,8 +80,8 @@ func (s *BackupExportUDMProcessor) Execute(data any) (any, error) {
}
// exportAuth 导出鉴权用户数据
func (s BackupExportUDMProcessor) exportAuth(coreUid, neUid, fileType string) string {
rows := s.udmAuthService.Find(neDataNfModel.UDMAuthUser{CoreUID: coreUid, NeUID: neUid})
func (s BackupExportUDMProcessor) exportAuth(neId int64, neUid, fileType string) string {
rows := s.udmAuthService.Find(neDataNfModel.UDMAuthUser{NeID: neId})
if len(rows) <= 0 {
return "no data"
}
@@ -134,8 +134,8 @@ func (s BackupExportUDMProcessor) exportAuth(coreUid, neUid, fileType string) st
}
// exportSub 导出签约用户数据
func (s BackupExportUDMProcessor) exportSub(coreUid, neUid, fileType string) string {
rows := s.udmSubService.Find(neDataNfModel.UDMSubUser{CoreUID: coreUid, NeUID: neUid})
func (s BackupExportUDMProcessor) exportSub(neId int64, neUid, fileType string) string {
rows := s.udmSubService.Find(neDataNfModel.UDMSubUser{NeID: neId})
if len(rows) <= 0 {
return "no data"
}
@@ -182,8 +182,8 @@ func (s BackupExportUDMProcessor) exportSub(coreUid, neUid, fileType string) str
}
// exportVOIP 导出VOIP用户数据
func (s BackupExportUDMProcessor) exportVOIP(coreUid, neUid, fileType string) string {
rows := s.udmVOIPService.Find(neDataNfModel.UDMVOIPUser{CoreUID: coreUid, NeUID: neUid})
func (s BackupExportUDMProcessor) exportVOIP(neId int64, neUid, fileType string) string {
rows := s.udmVOIPService.Find(neDataNfModel.UDMVOIPUser{NeID: neId})
if len(rows) <= 0 {
return "no data"
}
@@ -228,8 +228,8 @@ func (s BackupExportUDMProcessor) exportVOIP(coreUid, neUid, fileType string) st
}
// exportVolte 导出Volte用户数据
func (s BackupExportUDMProcessor) exportVolte(coreUid, neUid, fileType string) string {
rows := s.udmVolteIMSService.Find(neDataNfModel.UDMVolteIMSUser{CoreUID: coreUid, NeUID: neUid})
func (s BackupExportUDMProcessor) exportVolte(neId int64, neUid, fileType string) string {
rows := s.udmVolteIMSService.Find(neDataNfModel.UDMVolteIMSUser{NeID: neId})
if len(rows) <= 0 {
return "no data"
}

View File

@@ -56,16 +56,16 @@ func (s *DeleteNeConfigBackupProcessor) Execute(data any) (any, error) {
neList := s.neInfoService.Find(neModel.NeInfo{}, false, false)
for _, neInfo := range neList {
tx := db.DB("").Model(&neModel.NeConfigBackup{})
tx = tx.Where("core_uid = ? and ne_uid = ?", neInfo.CoreUID, neInfo.NeUID)
tx = tx.Where("ne_id = ?", neInfo.ID)
// 查询数量为0直接返回
var total int64 = 0
if err := tx.Count(&total).Error; err != nil {
result[neInfo.NeUID] = err.Error()
result[neInfo.NeUid] = err.Error()
continue
}
if total <= int64(params.StoreNum) {
result[neInfo.NeUID] = "less than storeNum"
result[neInfo.NeUid] = "less than storeNum"
continue
}
@@ -73,11 +73,11 @@ func (s *DeleteNeConfigBackupProcessor) Execute(data any) (any, error) {
var lastCreateTime int64 = 0
lastTx := tx.Select("create_time").Order("create_time DESC").Limit(1)
if err := lastTx.Find(&lastCreateTime).Error; err != nil {
result[neInfo.NeUID] = err.Error()
result[neInfo.NeUid] = err.Error()
continue
}
if lastCreateTime <= 1e12 {
result[neInfo.NeUID] = "no data"
result[neInfo.NeUid] = "no data"
continue
}
@@ -88,13 +88,13 @@ func (s *DeleteNeConfigBackupProcessor) Execute(data any) (any, error) {
// 删除小于最后时间的数据
delTx := tx.Delete("create_time < ?", ltTime.UnixMilli())
if err := delTx.Error; err != nil {
result[neInfo.NeUID] = err.Error()
result[neInfo.NeUid] = err.Error()
continue
}
result[neInfo.NeUID] = tx.RowsAffected
result[neInfo.NeUid] = tx.RowsAffected
// 删除本地文件
s.deleteFile(neInfo.CoreUID, neInfo.NeUID, ltTime)
s.deleteFile(neInfo.NeType, neInfo.NeUid, ltTime)
}
return result, nil

View File

@@ -75,7 +75,7 @@ func (s *NeAlarmStateCheckProcessor) Execute(data any) (any, error) {
}
// 创建告警
alarm := oam.Alarm{
NeUid: neInfo.NeUID, // 网元唯一标识
NeUid: neInfo.NeUid, // 网元唯一标识
AlarmTime: time.Now().UnixMilli(), // 事件产生时间
AlarmId: params.AlarmId, // 告警ID 唯一,清除时对应
AlarmCode: constants.ALARM_STATE_CHECK, // 告警状态码
@@ -89,7 +89,7 @@ func (s *NeAlarmStateCheckProcessor) Execute(data any) (any, error) {
LocationInfo: "NE State: Heartbeat", // 告警定位信息
}
if err = oamService.NewAlarm.Resolve(alarm); err == nil {
result[neInfo.NeUID] = "state alarm"
result[neInfo.NeUid] = "state alarm"
}
}

View File

@@ -118,7 +118,7 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) {
if len(warnMsg) > 0 {
currentTime := time.Now()
validTimes := []time.Time{}
if v, ok := triggerCount.Load(neInfo.NeUID); ok {
if v, ok := triggerCount.Load(neInfo.NeUid); ok {
times := v.([]time.Time)
// 清理过期的记录10秒前的触发记录不再计入
for _, t := range times {
@@ -127,11 +127,11 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) {
}
}
validTimes = append(validTimes, currentTime)
triggerCount.Store(neInfo.NeUID, validTimes)
triggerCount.Store(neInfo.NeUid, validTimes)
} else {
// 事件第一次触发,初始化记录
validTimes = append(validTimes, currentTime)
triggerCount.Store(neInfo.NeUID, validTimes)
triggerCount.Store(neInfo.NeUid, validTimes)
}
if int64(len(validTimes)) >= triggerMax {
err = fmt.Errorf("greater than %s", strings.Join(warnMsg, ", "))
@@ -149,14 +149,12 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) {
addInfo = err.Error()
}
// 事件产生时间
alarmTime := time.Now().UnixMilli()
// 告警ID
params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_CMD_CHECK, alarmTime)
params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_LICENSE_CHECK, neInfo.CreateTime)
// 创建告警
alarm := oam.Alarm{
NeUid: neInfo.NeUID, // 网元唯一标识
AlarmTime: alarmTime, // 事件产生时间
NeUid: neInfo.NeUid, // 网元唯一标识
AlarmTime: time.Now().UnixMilli(), // 事件产生时间
AlarmId: params.AlarmId, // 告警ID 唯一,清除时对应
AlarmCode: constants.ALARM_CMD_CHECK, // 告警状态码
AlarmType: params.AlarmType, // 告警类型
@@ -169,9 +167,9 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) {
LocationInfo: "NE CPU/Menory/Disk: Heartbeat", // 告警定位信息
}
if err = oamService.NewAlarm.Resolve(alarm); err == nil {
result[neInfo.NeUID] = "cmd alarm"
result[neInfo.NeUid] = "cmd alarm"
}
triggerCount.Delete(neInfo.NeUID)
triggerCount.Delete(neInfo.NeUid)
}
// 返回结果,用于记录执行结果
@@ -221,27 +219,20 @@ func (s NeAlarmStateCheckCMDProcessor) serverState(state map[string]any) (float6
}
// 插入网元状态记录
neState := neDataModel.NEState{
CoreUID: fmt.Sprint(state["coreUid"]),
NeUID: fmt.Sprint(state["neUid"]),
NeType: fmt.Sprint(state["neType"]),
Version: fmt.Sprint(state["version"]),
Capability: parse.Number(state["capability"]),
SerialNum: fmt.Sprint(state["sn"]),
ExpiryDate: fmt.Sprint(state["expire"]),
neState := neDataModel.NeState{
NeID: parse.Number(state["neId"]),
SysCpuUsage: sysCpuUsage,
SysMemUsage: sysMemUsage,
SysDiskUsage: sysDiskUsage,
NfCpuUsage: nfCpuUsage,
NfMemUsed: nfMemUsed,
CreateTime: parse.Number(state["refreshTime"]),
}
s.neStateService.Insert(neState)
// 删除网元状态记录7天前
ltTime := time.Now().AddDate(0, 0, -7).UnixMilli()
s.neStateService.DeleteByTime(ltTime)
// 推送ws消息
groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_NE_STATE, neState.CoreUID, neState.NeUID)
groupID := fmt.Sprintf("%s_%s", wsService.GROUP_NE_STATE, state["neUid"])
s.wsSendService.ByGroupID(groupID, neState)
return sysCpuUsage, sysMemUsage, sysDiskUsage

View File

@@ -91,7 +91,7 @@ func (s *NeAlarmStateCheckLicenseProcessor) Execute(data any) (any, error) {
params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_LICENSE_CHECK, neInfo.CreateTime)
// 创建告警
alarm := oam.Alarm{
NeUid: neInfo.NeUID, // 网元唯一标识
NeUid: neInfo.NeUid, // 网元唯一标识
AlarmTime: time.Now().UnixMilli(), // 事件产生时间
AlarmId: params.AlarmId, // 告警ID 唯一,清除时对应
AlarmCode: constants.ALARM_LICENSE_CHECK, // 告警状态码
@@ -105,7 +105,7 @@ func (s *NeAlarmStateCheckLicenseProcessor) Execute(data any) (any, error) {
LocationInfo: "NE License: Heartbeat", // 告警定位信息
}
if err = oamService.NewAlarm.Resolve(alarm); err == nil {
result[neInfo.NeUID] = "license alarm"
result[neInfo.NeUid] = "license alarm"
}
}

View File

@@ -40,31 +40,29 @@ func (s *NeConfigBackupProcessor) Execute(data any) (any, error) {
// 将网元文件备份到本地
zipFilePath, err := s.neConfigBackupService.FileNeToLocal(neInfo)
if err != nil {
result[neInfo.NeUID] = err.Error()
result[neInfo.NeUid] = err.Error()
continue
}
// 新增备份记录
item := neModel.NeConfigBackup{
CoreUID: neInfo.CoreUID,
NeUID: neInfo.NeUID,
NeType: neInfo.NeType,
NeID: neInfo.ID,
Name: filepath.Base(zipFilePath),
Path: zipFilePath,
CreateBy: "system",
}
rows := s.neConfigBackupService.Insert(item)
if rows <= 0 {
result[neInfo.NeUID] = "failed"
result[neInfo.NeUid] = "failed"
continue
}
msg := "ok"
// 上传到FTP服务器
if err := s.backupService.FTPPushFile(zipFilePath, ""); err != nil {
result[neInfo.NeUID] = msg + ", ftp err:" + err.Error()
result[neInfo.NeUid] = msg + ", ftp err:" + err.Error()
}
result[neInfo.NeUID] = msg
result[neInfo.NeUid] = msg
}
return result, nil

View File

@@ -41,10 +41,10 @@ func (s *NeDataUDM) Execute(data any) (any, error) {
neList := s.neInfoService.Find(neModel.NeInfo{NeType: "UDM"}, false, false)
for _, neInfo := range neList {
result[fmt.Sprintf("AuthNumber_%s", neInfo.NeUID)] = s.udmAuthService.ResetData(neInfo.CoreUID, neInfo.NeUID)
result[fmt.Sprintf("SubNumber_%s", neInfo.NeUID)] = s.udmSubService.ResetData(neInfo.CoreUID, neInfo.NeUID)
result[fmt.Sprintf("VOIPNumber_%s", neInfo.NeUID)] = s.udmVOIPService.ResetData(neInfo.CoreUID, neInfo.NeUID)
result[fmt.Sprintf("VolteIMSNumber_%s", neInfo.NeUID)] = s.udmVolteIMSService.ResetData(neInfo.CoreUID, neInfo.NeUID)
result[fmt.Sprintf("auth_%s", neInfo.NeUid)] = s.udmAuthService.ResetData(neInfo.ID)
result[fmt.Sprintf("sub_%s", neInfo.NeUid)] = s.udmSubService.ResetData(neInfo.ID)
result[fmt.Sprintf("voip_%s", neInfo.NeUid)] = s.udmVOIPService.ResetData(neInfo.ID)
result[fmt.Sprintf("volte_%s", neInfo.NeUid)] = s.udmVolteIMSService.ResetData(neInfo.ID)
}
return result, nil

View File

@@ -46,8 +46,7 @@ type NeActionController struct {
func (s *NeActionController) FilePush(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
NeUID string `json:"neUid" binding:"required"` // 网唯一标识
UploadPath string `json:"uploadPath" binding:"required"`
DelTemp bool `json:"delTemp"` // 删除本地临时文件
}
@@ -58,14 +57,14 @@ func (s *NeActionController) FilePush(c *gin.Context) {
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -105,9 +104,7 @@ func (s *NeActionController) FilePush(c *gin.Context) {
// @Tags network_element/action
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(8I73Y01Z)
// @Param neUid query string true "NeUID" default(5AKF59BZ)
// @Param path query string true "dir path" default(/var/log)
// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Param path query string true "dir path" default(/var/log)
// @Param fileName query string true "file name"
// @Param delTemp query boolean false "Delete Temp File" default(false)
// @Success 200 {object} object "Response Results"
@@ -118,8 +115,7 @@ func (s *NeActionController) FilePush(c *gin.Context) {
func (s *NeActionController) FilePull(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
Path string `form:"path" binding:"required"`
FileName string `form:"fileName" binding:"required"`
DelTemp bool `form:"delTemp"` // 删除本地临时文件
@@ -131,14 +127,14 @@ func (s *NeActionController) FilePull(c *gin.Context) {
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -179,9 +175,7 @@ func (s *NeActionController) FilePull(c *gin.Context) {
// @Tags network_element/action
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(8I73Y01Z)
// @Param neUid query string true "NeUID" default(5AKF59BZ)
// @Param path query string true "dir path" default(/var/log)
// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Param path query string true "dir path" default(/var/log)
// @Param delTemp query boolean false "Delete Temp File" default(false)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
@@ -190,27 +184,26 @@ func (s *NeActionController) FilePull(c *gin.Context) {
// @Router /ne/action/file/pull/dirzip [get]
func (s *NeActionController) FilePullDirZip(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
var query struct {
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
Path string `form:"path" binding:"required"`
DelTemp bool `form:"delTemp"` // 删除本地临时文件
}
if err := c.ShouldBindQuery(&querys); err != nil {
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -224,7 +217,7 @@ func (s *NeActionController) FilePullDirZip(c *gin.Context) {
}
defer sftpClient.Close()
nePath := querys.Path
nePath := query.Path
dirName := generate.Code(6)
localFilePath := filepath.Join("/tmp/omc/pull/", dirName)
if runtime.GOOS == "windows" {
@@ -238,7 +231,7 @@ func (s *NeActionController) FilePullDirZip(c *gin.Context) {
}
// 压缩zip文件名
zipFileName := fmt.Sprintf("%s-%s-%s.zip", neInfo.NeType, neInfo.NeUID, dirName)
zipFileName := fmt.Sprintf("%s-%s-%s.zip", neInfo.NeType, neInfo.NeUid, dirName)
zipFilePath := filepath.Join(localFilePath, zipFileName)
if err := file.CompressZipByDir(zipFilePath, localDirFilePath); err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
@@ -246,7 +239,7 @@ func (s *NeActionController) FilePullDirZip(c *gin.Context) {
}
defer func() {
if querys.DelTemp {
if query.DelTemp {
_ = os.RemoveAll(localFilePath)
}
}()
@@ -271,27 +264,26 @@ func (s *NeActionController) FilePullDirZip(c *gin.Context) {
// @Router /ne/action/file/view [get]
func (s *NeActionController) FileView(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
var query struct {
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
Path string `form:"path" binding:"required"`
FileName string `form:"fileName" binding:"required"`
}
if err := c.ShouldBindQuery(&querys); err != nil {
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -299,7 +291,7 @@ func (s *NeActionController) FileView(c *gin.Context) {
defer sshClient.Close()
// 网元端文件
nePath := filepath.ToSlash(filepath.Join(querys.Path, querys.FileName))
nePath := filepath.ToSlash(filepath.Join(query.Path, query.FileName))
// 网元端临时目录
output, err := sshClient.RunCMD(fmt.Sprintf("cat %s", nePath))
output = strings.TrimSpace(output)
@@ -330,29 +322,28 @@ func (s *NeActionController) FileView(c *gin.Context) {
// @Router /ne/action/file/list [get]
func (s *NeActionController) FileList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
var query struct {
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
Path string `form:"path" binding:"required"`
PageNum int64 `form:"pageNum" binding:"required"`
PageSize int64 `form:"pageSize" binding:"required"`
Search string `form:"search"`
}
if err := c.ShouldBindQuery(&querys); err != nil {
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -360,10 +351,10 @@ func (s *NeActionController) FileList(c *gin.Context) {
defer sshClient.Close()
// 获取文件列表
rows, err := ssh.FileList(sshClient, querys.Path, querys.Search)
rows, err := ssh.FileList(sshClient, query.Path, query.Search)
if err != nil {
c.JSON(200, resp.OkData(map[string]any{
"path": querys.Path,
"path": query.Path,
"total": len(rows),
"rows": []ssh.FileListRow{},
}))
@@ -372,8 +363,8 @@ func (s *NeActionController) FileList(c *gin.Context) {
// 对数组进行切片分页
lenNum := int64(len(rows))
start := (querys.PageNum - 1) * querys.PageSize
end := start + querys.PageSize
start := (query.PageNum - 1) * query.PageSize
end := start + query.PageSize
var splitRows []ssh.FileListRow
if start >= lenNum {
splitRows = []ssh.FileListRow{}
@@ -384,7 +375,7 @@ func (s *NeActionController) FileList(c *gin.Context) {
}
c.JSON(200, resp.OkData(map[string]any{
"path": querys.Path,
"path": query.Path,
"total": lenNum,
"rows": splitRows,
}))
@@ -406,9 +397,8 @@ func (s *NeActionController) FileList(c *gin.Context) {
func (s *NeActionController) Service(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
Action string `json:"action" binding:"required,oneof=start restart stop reboot poweroff"` // 操作行为
NeUID string `json:"neUid" binding:"required"` // 网唯一标识
Action string `json:"action" binding:"required,oneof=start restart stop reboot poweroff"` // 操作行为
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -417,8 +407,8 @@ func (s *NeActionController) Service(c *gin.Context) {
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -443,7 +433,7 @@ func (s *NeActionController) Service(c *gin.Context) {
cmdStr = "sudo shutdown -h now"
}
_, err := s.neInfoService.NeRunSSHCmd(neInfo.CoreUID, neInfo.NeUID, cmdStr)
_, err := s.neInfoService.NeRunSSHCmd(neInfo.ID, cmdStr)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return

View File

@@ -197,7 +197,6 @@ func (s NeConfigController) ListByNeType(c *gin.Context) {
func (s NeConfigController) DataInfo(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
ParamName string `form:"paramName" binding:"required"` // 可用属性
}
@@ -207,8 +206,8 @@ func (s NeConfigController) DataInfo(c *gin.Context) {
return
}
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -245,8 +244,7 @@ func (s NeConfigController) DataInfo(c *gin.Context) {
func (s NeConfigController) DataEdit(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
NeUID string `json:"neUid" binding:"required"` // 网唯一标识
ParamName string `json:"paramName" binding:"required"`
ParamData map[string]any `json:"paramData" binding:"required"`
Loc string `json:"loc"` // 仅array使用与数据对象内index一致,有多层时划分嵌套层(index/subParamName/index)
@@ -257,8 +255,8 @@ func (s NeConfigController) DataEdit(c *gin.Context) {
return
}
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -301,7 +299,6 @@ func (s NeConfigController) DataEdit(c *gin.Context) {
func (s NeConfigController) DataAdd(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
ParamName string `json:"paramName" binding:"required"` // 根据配置可选值
ParamData map[string]any `json:"paramData" binding:"required"` // 数据对象
@@ -313,8 +310,8 @@ func (s NeConfigController) DataAdd(c *gin.Context) {
return
}
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -360,8 +357,7 @@ func (s NeConfigController) DataAdd(c *gin.Context) {
func (s NeConfigController) DataRemove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
ParamName string `form:"paramName" binding:"required"`
Loc string `form:"loc" binding:"required"` // 与数据对象内index一致,有多层时划分嵌套层(index/subParamName/index)
}
@@ -371,8 +367,8 @@ func (s NeConfigController) DataRemove(c *gin.Context) {
return
}
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}

View File

@@ -10,6 +10,7 @@ import (
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
"be.ems/src/framework/utils/file"
"be.ems/src/framework/utils/parse"
"be.ems/src/modules/ne/model"
neService "be.ems/src/modules/ne/service"
@@ -35,11 +36,6 @@ type NeConfigBackupController struct {
// GET /list
func (s NeConfigBackupController) List(c *gin.Context) {
query := reqctx.QueryMap(c)
coreUid, coreUidOk := query["coreUid"]
if !coreUidOk || coreUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty"))
return
}
rows, total := s.neConfigBackupService.FindByPage(query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}
@@ -50,9 +46,7 @@ func (s NeConfigBackupController) List(c *gin.Context) {
func (s NeConfigBackupController) Download(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
ID int64 `form:"id" binding:"required"` // 记录ID
ID int64 `form:"id" binding:"required"` // 记录ID
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -62,9 +56,7 @@ func (s NeConfigBackupController) Download(c *gin.Context) {
// 检查是否存在
rows := s.neConfigBackupService.Find(model.NeConfigBackup{
CoreUID: query.CoreUID,
NeUID: query.NeUID,
ID: query.ID,
ID: query.ID,
})
if len(rows) <= 0 {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neConfigBackup.noData")))
@@ -85,11 +77,9 @@ func (s NeConfigBackupController) Download(c *gin.Context) {
func (s NeConfigBackupController) Edit(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
ID int64 `json:"id" binding:"required"` // 记录ID
Name string `json:"name" binding:"required"` // 名称
Remark string `json:"remark" binding:"required"` // 备注
ID int64 `json:"id" binding:"required"` // 记录ID
Name string `json:"name" binding:"required"` // 名称
Remark string `json:"remark" binding:"required"` // 备注
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -99,9 +89,7 @@ func (s NeConfigBackupController) Edit(c *gin.Context) {
// 检查是否存在
rows := s.neConfigBackupService.Find(model.NeConfigBackup{
CoreUID: body.CoreUID,
NeUID: body.NeUID,
ID: body.ID,
ID: body.ID,
})
if len(rows) <= 0 {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neConfigBackup.noData")))
@@ -125,9 +113,7 @@ func (s NeConfigBackupController) Edit(c *gin.Context) {
func (s NeConfigBackupController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
ID int64 `form:"id" binding:"required"` // 记录ID
ID string `form:"id" binding:"required"` // 记录ID 批量多个逗号分隔
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -135,7 +121,15 @@ func (s NeConfigBackupController) Remove(c *gin.Context) {
return
}
rows, err := s.neConfigBackupService.DeleteByIds(query.ID, query.CoreUID, query.NeUID)
// 处理字符转id数组后去重
uniqueIDs := parse.RemoveDuplicatesToArray(query.ID, ",")
// 转换成int64数组类型
ids := make([]int64, 0)
for _, v := range uniqueIDs {
ids = append(ids, parse.Number(v))
}
rows, err := s.neConfigBackupService.DeleteByIds(ids)
if err != nil {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error())))
return
@@ -150,10 +144,9 @@ func (s NeConfigBackupController) Remove(c *gin.Context) {
func (s NeConfigBackupController) Import(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
Type string `json:"type" binding:"required,oneof=backup upload"` // 导入类型 backup upload
Path string `json:"path" binding:"required"` // 备份文件zip文件路径
NeUID string `json:"neUid" binding:"required"` // 网唯一标识
Type string `json:"type" binding:"required,oneof=backup upload"` // 导入类型 backup upload
Path string `json:"path" binding:"required"` // 备份文件zip文件路径
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -166,8 +159,8 @@ func (s NeConfigBackupController) Import(c *gin.Context) {
}
// 查网元
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -189,8 +182,7 @@ func (s NeConfigBackupController) Import(c *gin.Context) {
func (s NeConfigBackupController) Export(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
NeUID string `json:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -198,8 +190,8 @@ func (s NeConfigBackupController) Export(c *gin.Context) {
return
}
// 查网元
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -211,9 +203,7 @@ func (s NeConfigBackupController) Export(c *gin.Context) {
}
// 新增备份记录
item := model.NeConfigBackup{
CoreUID: neInfo.CoreUID,
NeUID: neInfo.NeUID,
NeType: neInfo.NeType,
NeID: neInfo.ID,
Name: filepath.Base(zipFilePath),
Path: zipFilePath,
CreateBy: reqctx.LoginUserToUserName(c),

View File

@@ -38,9 +38,7 @@ var mutex sync.Mutex
// @Tags network_element/info
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(8I73Y01Z)
// @Param neUid query string true "NeUID" default(5AKF59BZ)
// @Success 200 {object} object "Response Results"
// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Network element information state
// @Description Network element information state
@@ -48,8 +46,7 @@ var mutex sync.Mutex
func (s NeInfoController) State(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -57,12 +54,12 @@ func (s NeInfoController) State(c *gin.Context) {
return
}
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
neKey := fmt.Sprintf("%s_%s", neInfo.CoreUID, neInfo.NeUID)
neKey := fmt.Sprintf("%s_%s", neInfo.NeUid, neInfo.NeType)
// 网元直连
resData, err := neFetchlink.NeState(neInfo)
@@ -74,12 +71,13 @@ func (s NeInfoController) State(c *gin.Context) {
resDataCache.(map[string]any)["online"] = false
} else {
resDataCache = map[string]any{
"online": false,
"coreUid": neInfo.CoreUID,
"neUid": neInfo.NeUID,
"neType": neInfo.NeType,
"neName": neInfo.NeName,
"ipAddr": neInfo.IPAddr,
"online": false,
"coreId": neInfo.CoreId,
"neId": neInfo.ID,
"neUid": neInfo.NeUid,
"neType": neInfo.NeType,
"neName": neInfo.NeName,
"ipAddr": neInfo.IpAddr,
}
}
neStateCacheMap.Store(neKey, resDataCache)
@@ -103,9 +101,7 @@ func (s NeInfoController) State(c *gin.Context) {
// @Tags network_element/info
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(8I73Y01Z)
// @Param neUid query string true "NeUID" default(5AKF59BZ)
// @Success 200 {object} object "Response Results"
// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Network element neType and neID queries
// @Description Network element neType and neID queries
@@ -113,8 +109,7 @@ func (s NeInfoController) State(c *gin.Context) {
func (s NeInfoController) Nf(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -122,8 +117,8 @@ func (s NeInfoController) Nf(c *gin.Context) {
return
}
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -137,9 +132,7 @@ func (s NeInfoController) Nf(c *gin.Context) {
// @Tags network_element/info
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(8I73Y01Z)
// @Param neUid query string true "NeUID" default(5AKF59BZ)
// @Param neType query string true "NE Type"
// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Param neType query string true "NE Type"
// @Param bandStatus query boolean true "With status information"
// @Param bandHost query boolean true "With host information"
// @Success 200 {object} object "Response Results"
@@ -150,8 +143,8 @@ func (s NeInfoController) Nf(c *gin.Context) {
func (s NeInfoController) ListAll(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid"` // 网元唯一标识
CoreId int64 `form:"coreId"` // 核心网唯一标识
NeUid string `form:"neUid"` // 网元唯一标识
NeType string `form:"neType"`
BandStatus bool `form:"bandStatus"`
BandHost bool `form:"bandHost"`
@@ -164,11 +157,11 @@ func (s NeInfoController) ListAll(c *gin.Context) {
// 查询实体参数
ne := model.NeInfo{}
if querys.CoreUID != "" {
ne.CoreUID = querys.CoreUID
if querys.CoreId != 0 {
ne.CoreId = querys.CoreId
}
if querys.NeUID != "" {
ne.NeUID = querys.NeUID
if querys.NeUid != "" {
ne.NeUid = querys.NeUid
}
if querys.NeType != "" {
ne.NeType = querys.NeType
@@ -178,9 +171,121 @@ func (s NeInfoController) ListAll(c *gin.Context) {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 过滤屏蔽授权文件
arr := &neList
for i := range *arr {
(*arr)[i].ActivationRequestCode = "-"
(*arr)[i].LicensePath = "-"
}
c.JSON(200, resp.OkData(neList))
}
// 网元授权激活授权申请码
//
// GET /license/code
//
// @Tags network_element/license
// @Accept json
// @Produce json
// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC)
// @Param neId query string true "NE ID" default(001)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Network Element License Activation License Application Code
// @Description Network Element License Activation License Application Code
// @Router /ne/info/license/code [get]
func (s NeInfoController) LicenseCode(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 读取授权码
code, licensePath := s.neInfoService.NeConfLicenseRead(neInfo)
// 更新授权码
if code != "" && licensePath != "" && neInfo.ActivationRequestCode != code {
// 检查是否存在
neInfo = s.neInfoService.FindById(neInfo.ID, false)
if neInfo.ID == 0 || neInfo.NeUid == "" {
// 没有可访问网元信息数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neInfo.noData")))
return
}
neInfo.ActivationRequestCode = code
neInfo.LicensePath = licensePath
neInfo.UpdateBy = reqctx.LoginUserToUserName(c)
s.neInfoService.Update(neInfo)
}
c.JSON(200, resp.OkData(code))
}
// 网元授权激活授权文件替换
//
// POST /license/update
//
// @Tags network_element/license
// @Accept json
// @Produce json
// @Param data body object true "Request Param"
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Network element authorization activation status
// @Description Network element authorization activation status
// @Router /ne/license/update [post]
func (s NeInfoController) LicenseUpdate(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
LicensePath string `json:"licensePath"` // 上传的文件路径
Reload bool `json:"reload"` // 刷新重启网元
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 进行上传替换
neInfo.LicensePath = body.LicensePath
err := s.neInfoService.NeConfLicenseUpload(neInfo, body.Reload)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
// 检查是否存在
neInfo = s.neInfoService.FindById(neInfo.ID, false)
if neInfo.ID == 0 || neInfo.NeUid == "" {
// 没有可访问网元信息数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neInfo.noData")))
return
}
neInfo.LicensePath = body.LicensePath
neInfo.UpdateBy = reqctx.LoginUserToUserName(c)
s.neInfoService.Update(neInfo)
c.JSON(200, resp.Ok(nil))
}
// 网元端Para5G配置文件读取
//
// GET /file/para5g
@@ -199,7 +304,7 @@ func (s NeInfoController) Para5GFileRead(c *gin.Context) {
func (s NeInfoController) Para5GFileWrite(c *gin.Context) {
var body struct {
Content map[string]any `json:"content" binding:"required"` // 内容
SyncNE []string `json:"syncNe"` // 同步到网元
SyncNE []string `json:"syncNe"` // 同步到网元neUid,neUid网元唯一标识
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -219,17 +324,24 @@ func (s NeInfoController) Para5GFileWrite(c *gin.Context) {
//
// GET /file/oam
func (s NeInfoController) OAMFileRead(c *gin.Context) {
var querys struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
language := reqctx.AcceptLanguage(c)
var query struct {
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
}
if err := c.ShouldBindQuery(&querys); err != nil {
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
data, err := s.neInfoService.NeConfOAMReadSync(querys.CoreUID, querys.NeUID)
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
data, err := s.neInfoService.NeConfOAMReadSync(neInfo)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -243,8 +355,7 @@ func (s NeInfoController) OAMFileRead(c *gin.Context) {
func (s NeInfoController) OAMFileWrite(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
Content map[string]any `json:"content" binding:"required"` // 内容
Sync bool `json:"sync"` // 同步到网元
}
@@ -255,8 +366,8 @@ func (s NeInfoController) OAMFileWrite(c *gin.Context) {
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -288,16 +399,19 @@ func (s NeInfoController) OAMFileWrite(c *gin.Context) {
// @Router /ne/info/list [get]
func (s NeInfoController) List(c *gin.Context) {
query := reqctx.QueryMap(c)
coreUid, coreUidOk := query["coreUid"]
if !coreUidOk || coreUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty"))
return
}
bandStatus := false
if v, ok := query["bandStatus"]; ok {
bandStatus = parse.Boolean(v)
}
rows, total := s.neInfoService.FindByPage(query, bandStatus)
// 过滤屏蔽授权文件
arr := &rows
for i := range *arr {
(*arr)[i].ActivationRequestCode = "-"
(*arr)[i].LicensePath = "-"
}
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}
@@ -317,8 +431,7 @@ func (s NeInfoController) List(c *gin.Context) {
func (s NeInfoController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
ID int64 `form:"id" binding:"required"` // ID
ID int64 `form:"id" binding:"required"` // ID
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -327,7 +440,7 @@ func (s NeInfoController) Info(c *gin.Context) {
}
info := s.neInfoService.FindById(query.ID, true)
if info.ID != query.ID || info.CoreUID != query.CoreUID {
if info.ID != query.ID {
// 没有可访问网元信息数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neInfo.noData")))
return
@@ -361,10 +474,6 @@ func (s NeInfoController) Add(c *gin.Context) {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id not is empty"))
return
}
if body.CoreUID == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty"))
return
}
body.CreateBy = reqctx.LoginUserToUserName(c)
insertId := s.neInfoService.Insert(body)
@@ -410,8 +519,6 @@ func (s NeInfoController) Edit(c *gin.Context) {
return
}
body.CoreUID = neInfo.CoreUID
body.NeUID = neInfo.NeUID
body.UpdateBy = reqctx.LoginUserToUserName(c)
rows := s.neInfoService.Update(body)
if rows > 0 {
@@ -423,7 +530,7 @@ func (s NeInfoController) Edit(c *gin.Context) {
// 网元信息删除
//
// DELETE /:id
// DELETE /
//
// @Tags network_element/info
// @Accept json
@@ -437,9 +544,7 @@ func (s NeInfoController) Edit(c *gin.Context) {
func (s NeInfoController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
ID string `form:"id" binding:"required"` // 记录ID 批量多个逗号分隔
ID string `form:"id" binding:"required"` // 记录ID 批量多个逗号分隔
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -455,7 +560,7 @@ func (s NeInfoController) Remove(c *gin.Context) {
ids = append(ids, parse.Number(v))
}
rows, err := s.neInfoService.DeleteByIds(ids, query.CoreUID, query.NeUID)
rows, err := s.neInfoService.DeleteByIds(ids)
if err != nil {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error())))
return

View File

@@ -1,302 +0,0 @@
package controller
import (
"fmt"
"strings"
"github.com/gin-gonic/gin"
"be.ems/src/framework/i18n"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
"be.ems/src/framework/utils/parse"
"be.ems/src/modules/ne/model"
"be.ems/src/modules/ne/service"
neFetchlink "be.ems/src/modules/ne_data_nf/fetch_link"
)
// 实例化控制层 NeLicenseController 结构体
var NewNeLicense = &NeLicenseController{
neLicenseService: service.NewNeLicense,
neInfoService: service.NewNeInfo,
}
// 网元授权激活请求
//
// PATH /license
type NeLicenseController struct {
neLicenseService *service.NeLicense // 网元授权激活服务
neInfoService *service.NeInfo // 网元信息服务
}
// 网元授权激活列表
//
// GET /list
//
// @Tags network_element/license
// @Accept json
// @Produce json
// @Param neType query string false "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC)
// @Param neId query string false "NE ID"
// @Param expiryDate query string false "ExpiryDate"
// @Param pageNum query number true "pageNum" default(1)
// @Param pageSize query number true "pageSize" default(10)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Net Element License Activation List
// @Description Net Element License Activation List
// @Router /ne/license/list [get]
func (s *NeLicenseController) List(c *gin.Context) {
query := reqctx.QueryMap(c)
coreUid, coreUidOk := query["coreUid"]
if !coreUidOk || coreUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty"))
return
}
rows, total := s.neLicenseService.FindByPage(query)
// 过滤屏蔽授权文件
arr := &rows
for i := range *arr {
(*arr)[i].ActivationRequestCode = "-"
(*arr)[i].LicensePath = "-"
}
c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows}))
}
// 网元授权激活信息
//
// GET /
func (s *NeLicenseController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
ID int64 `form:"id" binding:"required"` // ID
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
neLicense := s.neLicenseService.FindById(query.ID)
if neLicense.ID != query.ID || neLicense.CoreUID != query.CoreUID {
// 没有可访问网元授权激活数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData")))
return
}
c.JSON(200, resp.OkData(neLicense))
}
// 网元信息查询
//
// GET /nf
//
// @Tags network_element/license
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(8I73Y01Z)
// @Param neUid query string true "NeUID" default(5AKF59BZ)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Network element neType and neID queries
// @Description Network element neType and neID queries
// @Router /ne/license/nf [get]
func (s *NeLicenseController) Nf(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
neLicense := s.neLicenseService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neLicense.CoreUID != querys.CoreUID || neLicense.NeUID != querys.NeUID {
// 没有可访问网元授权激活数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData")))
return
}
c.JSON(200, resp.OkData(neLicense))
}
// 网元授权激活授权申请码
//
// GET /code
//
// @Tags network_element/license
// @Accept json
// @Produce json
// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC)
// @Param neId query string true "NE ID" default(001)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Network Element License Activation License Application Code
// @Description Network Element License Activation License Application Code
// @Router /ne/license/code [get]
func (s *NeLicenseController) Code(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
}
if err := c.ShouldBindQuery(&querys); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 检查是否存在授权记录
neLicense := s.neLicenseService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neLicense.CoreUID != querys.CoreUID || neLicense.NeUID != querys.NeUID {
// 没有可访问网元授权激活数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData")))
return
}
// 更新授权码
code, licensePath := s.neLicenseService.ReadLicenseInfo(neLicense)
neLicense.ActivationRequestCode = code
if licensePath != "" {
neLicense.LicensePath = licensePath
} else {
neLicense.SerialNum = ""
neLicense.ExpiryDate = ""
neLicense.UeNumber = 0
neLicense.NbNumber = 0
neLicense.Status = "0"
}
neLicense.UpdateBy = reqctx.LoginUserToUserName(c)
s.neLicenseService.Update(neLicense)
c.JSON(200, resp.OkData(code))
}
// 网元授权激活授权文件替换
//
// POST /change
//
// @Tags network_element/license
// @Accept json
// @Produce json
// @Param data body object true "Request Param"
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Network element authorization activation status
// @Description Network element authorization activation status
// @Router /ne/license/change [post]
func (s *NeLicenseController) Change(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body model.NeLicense
err := c.ShouldBindBodyWithJSON(&body)
if err != nil || body.LicensePath == "" {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 检查是否存在授权记录
neLicense := s.neLicenseService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neLicense.CoreUID != body.CoreUID || neLicense.NeUID != body.NeUID {
// 没有可访问网元授权激活数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData")))
return
}
// 更新授权记录
if body.Remark != "" {
neLicense.Remark = body.Remark
}
neLicense.LicensePath = body.LicensePath
neLicense.Status = "0"
neLicense.UpdateBy = reqctx.LoginUserToUserName(c)
upRows := s.neLicenseService.Update(neLicense)
if upRows > 0 {
// 进行上传替换
err = s.neLicenseService.UploadLicense(body)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
c.JSON(200, resp.Ok(nil))
return
}
c.JSON(200, resp.Err(nil))
}
// 网元授权激活状态
//
// GET /state
//
// @Tags network_element/license
// @Accept json
// @Produce json
// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC)
// @Param neId query string true "NE ID" default(001)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary Network element authorization activation status
// @Description Network element authorization activation status
// @Router /ne/license/state [get]
func (s *NeLicenseController) State(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
}
if err := c.ShouldBindQuery(&querys); err != nil {
c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
// 检查是否存在授权记录
neLicense := s.neLicenseService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neLicense.CoreUID != querys.CoreUID || neLicense.NeUID != querys.NeUID {
// 没有可访问网元授权激活数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData")))
return
}
// 查询网元获取IP获取网元状态
neInfo := s.neInfoService.FindByCoreUidAndNeUid(neLicense.CoreUID, neLicense.NeUID)
if neInfo.CoreUID != neLicense.CoreUID || neInfo.NeUID != neLicense.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
if neState, err := neFetchlink.NeState(neInfo); err == nil && neState["sn"] != nil {
neLicense.Status = "1"
neLicense.SerialNum = fmt.Sprint(neState["sn"])
neLicense.ExpiryDate = fmt.Sprint(neState["expire"])
neLicense.UeNumber = parse.Number(neState["ueNumber"])
neLicense.NbNumber = parse.Number(neState["nbNumber"])
} else {
neLicense.Status = "0"
}
// 更新授权码
if neLicense.ActivationRequestCode == "" || strings.HasPrefix(neLicense.ActivationRequestCode, "SN") || neLicense.Status == "0" {
code, licensePath := s.neLicenseService.ReadLicenseInfo(neLicense)
neLicense.ActivationRequestCode = code
neLicense.LicensePath = licensePath
}
// 更新授权信息
neLicense.UpdateBy = reqctx.LoginUserToUserName(c)
s.neLicenseService.Update(neLicense)
if neLicense.Status == "1" {
c.JSON(200, resp.OkData(map[string]any{
"sn": neLicense.SerialNum,
"expire": neLicense.ExpiryDate,
"ueNumber": neLicense.UeNumber,
"nbNumber": neLicense.NbNumber,
}))
return
}
c.JSON(200, resp.ErrMsg(fmt.Sprintf("%s service status exception", neLicense.NeType)))
}

View File

@@ -221,10 +221,8 @@ func (s NeSoftwareController) NewNeVersion(c *gin.Context) {
})
if len(neSoftwares) > 0 {
neSoftware := neSoftwares[0]
s.neSoftwareService.UpdateVersions(neSoftware, model.NeVersion{
NeType: neSoftware.NeType,
UpdateBy: reqctx.LoginUserToUserName(c),
})
neSoftware.UpdateBy = reqctx.LoginUserToUserName(c)
s.neSoftwareService.UpdateVersion(neSoftware)
c.JSON(200, resp.Ok(nil))
return
}

View File

@@ -29,11 +29,6 @@ type NeVersionController struct {
// GET /list
func (s *NeVersionController) List(c *gin.Context) {
query := reqctx.QueryMap(c)
coreUid, coreUidOk := query["coreUid"]
if !coreUidOk || coreUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty"))
return
}
checkVersion := true
if v, ok := query["checkVersion"]; ok {
checkVersion = parse.Boolean(v)
@@ -48,8 +43,7 @@ func (s *NeVersionController) List(c *gin.Context) {
func (s *NeVersionController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
ID int64 `form:"id" binding:"required"` // 记录ID
ID int64 `form:"id" binding:"required"` // 记录ID
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -58,7 +52,7 @@ func (s *NeVersionController) Info(c *gin.Context) {
}
neVersion := s.neVersionService.FindById(query.ID)
if neVersion.ID != query.ID || neVersion.CoreUID != query.CoreUID {
if neVersion.ID != query.ID {
// 没有可访问网元版本数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neVersion.noData")))
return
@@ -72,18 +66,17 @@ func (s *NeVersionController) Info(c *gin.Context) {
// GET /nf
func (s *NeVersionController) Nf(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
var query struct {
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&querys); err != nil {
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
neVersion := s.neVersionService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neVersion.CoreUID != querys.CoreUID || neVersion.NeUID != querys.NeUID {
neVersion := s.neVersionService.FindByNeUid(query.NeUID)
if neVersion.ID <= 0 {
// 没有可访问网元授权激活数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData")))
return
@@ -108,8 +101,7 @@ func (s *NeVersionController) Nf(c *gin.Context) {
func (s *NeVersionController) Operate(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
NeID int64 `json:"neId" binding:"required"` // 网唯一标识
Action string `json:"action" binding:"required,oneof=install upgrade rollback"` // 操作行为
Preinput map[string]string `json:"preinput" ` // 预先输入参数
}
@@ -119,8 +111,8 @@ func (s *NeVersionController) Operate(c *gin.Context) {
return
}
neVersion := s.neVersionService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neVersion.CoreUID != body.CoreUID || neVersion.NeUID != body.NeUID {
neVersion := s.neVersionService.FindByNeId(body.NeID)
if neVersion.NeID != body.NeID {
// 没有可访问网元版本数据!
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neVersion.noData")))
return

View File

@@ -3,16 +3,14 @@ package model
// NeConfigBackup 网元配置文件备份记录 ne_config_backup
type NeConfigBackup struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型
Name string `json:"name" gorm:"column:name"` // 压缩包名称
Path string `json:"path" gorm:"column:path"` // 压缩包位置
Remark string `json:"remark" gorm:"column:remark"` // 备注
CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者
UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
Name string `json:"name" gorm:"column:name"` // 压缩包名称
Path string `json:"path" gorm:"column:path"` // 压缩包位置
Remark string `json:"remark" gorm:"column:remark"` // 备注
CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新
UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间
// ====== 非数据库字段属性 ======

View File

@@ -1,34 +1,37 @@
package model
// NeInfo 网元信息对象 ne_info
// NeInfo 网元_基础信息表 关联创建版本、主机
type NeInfo struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 网元ID
CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型
NeName string `json:"neName" gorm:"column:ne_name"` // 网元名称
IPAddr string `json:"ipAddr" gorm:"column:ip_addr" binding:"required"` // 网元服务IP
Port int64 `json:"port" gorm:"column:port" binding:"required,number,max=65535,min=1"` // 端口
PvFlag string `json:"pvFlag" gorm:"column:pv_flag" binding:"omitempty,oneof=PNF VNF"` // 网元虚拟化标识 物理PNF 虚拟VNF
Province string `json:"province" gorm:"column:province"` // 省份地域
VendorName string `json:"vendorName" gorm:"column:vendor_name"` // 厂商名称
Dn string `json:"dn" gorm:"column:dn"` // 网络标识
MacAddr string `json:"macAddr" gorm:"column:mac_addr"` // MAC地址
HostIDs string `json:"hostIds" gorm:"column:host_ids"` // 网元主机ID组 数据格式(ssh,telnet) UDM(ssh,telnet,redis) UPF(ssh,telnet,telnet)
Status int64 `json:"status" gorm:"column:status"` // 网元状态 0离线 1在线 2配置待下发 3备用模式
Remark string `json:"remark" gorm:"column:remark"` // 备注
CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者
UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 网元ID
CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者
UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间
Remark string `json:"remark" gorm:"column:remark"` // 备注
CoreId int64 `json:"coreId" gorm:"column:core_id"` // 核心网ID 1为全局默认
NeUid string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型
NeName string `json:"neName" gorm:"column:ne_name"` // 网元名称
IpAddr string `json:"ipAddr" gorm:"column:ip_addr" binding:"required"` // 网元服务IP
Port int64 `json:"port" gorm:"column:port"` // 端口
PvFlag string `json:"pvFlag" gorm:"column:pv_flag" binding:"omitempty,oneof=PNF VNF"` // 网元虚拟化标识 物理PNF 虚拟VNF
Province string `json:"province" gorm:"column:province"` // 省份地域
VendorName string `json:"vendorName" gorm:"column:vendor_name"` // 厂商名称
Dn string `json:"dn" gorm:"column:dn"` // 网络标识
MacAddr string `json:"macAddr" gorm:"column:mac_addr"` // MAC地址
ActivationRequestCode string `json:"activationRequestCode" gorm:"column:activation_request_code"` // 激活申请代码
LicensePath string `json:"licensePath" gorm:"column:license_path"` // 激活授权文件
SerialNum string `json:"serialNum" gorm:"column:serial_num"` // 序列号
ExpiryDate string `json:"expiryDate" gorm:"column:expiry_date"` // 许可证到期日期
UeNumber int64 `json:"ueNumber" gorm:"column:ue_number"` // 用户容量
NbNumber int64 `json:"nbNumber" gorm:"column:nb_number"` // 基站容量
HostIds string `json:"hostIds" gorm:"column:host_ids"` // 网元主机ID组 数据格式(ssh,telnet) UDM(ssh,telnet,redis) UPF(ssh,telnet,telnet)
Status int64 `json:"status" gorm:"column:status"` // 网元状态 0离线 1在线 2配置待下发 3备用模式 4授权无效
// ====== 非数据库字段属性 ======
// 服务状态
ServerState map[string]any `json:"serverState,omitempty" gorm:"-"`
// 主机对象组
Hosts []NeHost `json:"hosts,omitempty" gorm:"-"`
ServerState map[string]any `json:"serverState,omitempty" gorm:"-"` // 服务状态
Hosts []NeHost `json:"hosts,omitempty" gorm:"-"` // 主机对象组
}
// TableName 表名称

View File

@@ -1,30 +0,0 @@
package model
// NeLicense 网元授权激活信息 ne_license
type NeLicense struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型
ActivationRequestCode string `json:"activationRequestCode" gorm:"column:activation_request_code"` // 激活申请代码
LicensePath string `json:"licensePath" gorm:"column:license_path"` // 激活授权文件
SerialNum string `json:"serialNum" gorm:"column:serial_num"` // 序列号
ExpiryDate string `json:"expiryDate" gorm:"column:expiry_date"` // 许可证到期日期
UeNumber int64 `json:"ueNumber" gorm:"ue_number"` // 用户容量
NbNumber int64 `json:"nbNumber" gorm:"nb_number"` // 基站容量
Status string `json:"status" gorm:"column:status"` // 状态 0无效 1有效
Remark string `json:"remark" gorm:"column:remark"` // 备注
CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者
UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间
// ====== 非数据库字段属性 ======
Reload bool `json:"reload,omitempty" gorm:"-"` // 刷新重启网元
}
// TableName 表名称
func (*NeLicense) TableName() string {
return "ne_license"
}

View File

@@ -3,23 +3,27 @@ package model
// NeVersion 网元版本信息 ne_version
type NeVersion struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型
Name string `json:"name" gorm:"column:name"` // 当前包
Version string `json:"version" gorm:"column:version" binding:"required"` // 当前版本
Path string `json:"path" gorm:"column:path" binding:"required"` // 当前软件包
PreName string `json:"preName" gorm:"column:pre_name"` // 上一版本包
PreVersion string `json:"preVersion" gorm:"column:pre_version"` // 上一版本
PrePath string `json:"prePath" gorm:"column:pre_path"` // 上一版本软件包
NewName string `json:"newName" gorm:"column:new_name"` // 新版本包
NewVersion string `json:"newVersion" gorm:"column:new_version"` // 新版本
NewPath string `json:"newPath" gorm:"column:new_path"` // 新版本软件包
Status string `json:"status" gorm:"column:status"` // 当前状态 1当前版本 2上一版本 3有新版本
CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者
UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
Name string `json:"name" gorm:"column:name"` // 当前包名
Version string `json:"version" gorm:"column:version" binding:"required"` // 当前版本
Path string `json:"path" gorm:"column:path" binding:"required"` // 当前软件
PreName string `json:"preName" gorm:"column:pre_name"` // 上一版本包名
PreVersion string `json:"preVersion" gorm:"column:pre_version"` // 上一版本
PrePath string `json:"prePath" gorm:"column:pre_path"` // 上一版本软件
NewName string `json:"newName" gorm:"column:new_name"` // 新版本包名
NewVersion string `json:"newVersion" gorm:"column:new_version"` // 新版本
NewPath string `json:"newPath" gorm:"column:new_path"` // 新版本软件
Status string `json:"status" gorm:"column:status"` // 当前状态 1当前版本 2上一版本 3有新版本
CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新
UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间
// ====== 非数据库字段属性 ======
NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识
NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称
NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型
}
// TableName 表名称

View File

@@ -63,6 +63,14 @@ func Setup(router *gin.Engine) {
middleware.AuthorizeUser(nil),
controller.NewNeInfo.ListAll,
)
neInfoGroup.GET("/license/code",
middleware.AuthorizeUser(nil),
controller.NewNeInfo.LicenseCode,
)
neInfoGroup.POST("/license/update",
middleware.AuthorizeUser(nil),
controller.NewNeInfo.LicenseUpdate,
)
neInfoGroup.GET("/file/para5g",
middleware.AuthorizeUser(nil),
controller.NewNeInfo.Para5GFileRead,
@@ -241,36 +249,6 @@ func Setup(router *gin.Engine) {
)
}
// 网元授权激活信息
neLicenseGroup := router.Group("/ne/license")
{
neLicenseGroup.GET("/list",
middleware.AuthorizeUser(nil),
controller.NewNeLicense.List,
)
neLicenseGroup.GET("",
middleware.AuthorizeUser(nil),
controller.NewNeLicense.Info,
)
neLicenseGroup.GET("/nf",
middleware.AuthorizeUser(nil),
controller.NewNeLicense.Nf,
)
neLicenseGroup.GET("/code",
middleware.AuthorizeUser(nil),
controller.NewNeLicense.Code,
)
neLicenseGroup.POST("/change",
middleware.AuthorizeUser(nil),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neLicense", collectlogs.BUSINESS_TYPE_OTHER)),
controller.NewNeLicense.Change,
)
neLicenseGroup.GET("/state",
middleware.AuthorizeUser(nil),
controller.NewNeLicense.State,
)
}
// 网元参数配置
neConfigGroup := router.Group("/ne/config")
{
@@ -361,13 +339,13 @@ func Setup(router *gin.Engine) {
// InitLoad 初始参数
func InitLoad() {
// 启动时,清除缓存-网元类型
service.NewNeInfo.ClearNeCacheByCoreUid("*")
service.NewNeInfo.RefreshNeCacheByCoreUid("*")
service.NewNeInfo.ClearNeCacheByNeId(0)
service.NewNeInfo.RefreshNeCacheByNeId(0)
// 启动时,网元公共参数数据记录到全局变量
if para5GMap, err := service.NewNeInfo.NeConfPara5GRead(); para5GMap != nil && err == nil {
service.NewNeInfo.NeConfPara5GWirte(para5GMap, nil)
}
// 启动时,清除缓存-网元参数配置可用属性值
service.NewNeConfig.ClearNeCacheByNeType("*")
service.NewNeConfig.RefreshByNeTypeAndNeID("*")
service.NewNeConfig.ClearByNeType("*")
service.NewNeConfig.RefreshByNeType("*")
}

View File

@@ -22,12 +22,6 @@ func (r NeConfigBackup) SelectByPage(query map[string]string) ([]model.NeConfigB
if v, ok := query["neType"]; ok && v != "" {
tx = tx.Where("ne_type = ?", v)
}
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
}
if v, ok := query["name"]; ok && v != "" {
tx = tx.Where("name like ?", fmt.Sprintf("%%%s%%", v))
}
@@ -56,14 +50,8 @@ func (r NeConfigBackup) SelectByPage(query map[string]string) ([]model.NeConfigB
func (r NeConfigBackup) Select(param model.NeConfigBackup) []model.NeConfigBackup {
tx := db.DB("").Model(&model.NeConfigBackup{})
// 查询条件拼接
if param.CoreUID != "" {
tx = tx.Where("core_uid = ?", param.CoreUID)
}
if param.NeUID != "" {
tx = tx.Where("ne_uid = ?", param.NeUID)
}
if param.NeType != "" {
tx = tx.Where("ne_type = ?", param.NeType)
if param.NeID != 0 {
tx = tx.Where("ne_id = ?", param.NeID)
}
if param.CreateBy != "" {
tx = tx.Where("create_by like ?", fmt.Sprintf("%s%%", param.CreateBy))

View File

@@ -74,11 +74,11 @@ func (r NeInfo) SelectByPage(query map[string]string) ([]model.NeInfo, int64) {
if v, ok := query["neType"]; ok && v != "" {
tx = tx.Where("ne_type = ?", v)
}
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
if v, ok := query["coreId"]; ok && v != "" {
tx = tx.Where("core_id = ?", v)
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid like ?", fmt.Sprintf("%s%%", v))
if v, ok := query["neName"]; ok && v != "" {
tx = tx.Where("ne_name like ?", fmt.Sprintf("%s%%", v))
}
// 查询结果
@@ -109,7 +109,11 @@ func (r NeInfo) SelectByIds(ids []int64) []model.NeInfo {
}
tx := db.DB("").Model(&model.NeInfo{})
// 构建查询条件
tx = tx.Where("id in ?", ids)
if len(ids) == 1 {
tx = tx.Where("id = ?", ids[0])
} else {
tx = tx.Where("id in ?", ids)
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())
@@ -174,11 +178,11 @@ func (r NeInfo) SelectList(neInfo model.NeInfo) []model.NeInfo {
if neInfo.NeType != "" {
tx = tx.Where("ne_type = ?", neInfo.NeType)
}
if neInfo.CoreUID != "" {
tx = tx.Where("core_uid = ?", neInfo.CoreUID)
if neInfo.CoreId != 0 {
tx = tx.Where("core_id = ?", neInfo.CoreId)
}
if neInfo.NeUID != "" {
tx = tx.Where("ne_uid = ?", neInfo.NeUID)
if neInfo.NeUid != "" {
tx = tx.Where("ne_uid = ?", neInfo.NeUid)
}
// 查询数据
@@ -190,16 +194,14 @@ func (r NeInfo) SelectList(neInfo model.NeInfo) []model.NeInfo {
return r.neListSort(rows)
}
// SelectNeInfoByCoreUidAndNeUid 通过core_uid和ne_uid查询网元信息
// coreUid 为*或空字符时根据neUid查询
func (r NeInfo) SelectNeInfoByCoreUidAndNeUid(coreUid, neUid string) model.NeInfo {
// SelectNeInfoByNeUid 通过ne_uid查询网元信息
func (r NeInfo) SelectNeInfoByNeUid(neUid string) model.NeInfo {
if neUid == "" {
return model.NeInfo{}
}
tx := db.DB("").Model(&model.NeInfo{})
// 构建查询条件
if coreUid == "*" || coreUid == "" {
tx = tx.Where("ne_uid = ?", neUid)
} else {
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
}
tx = tx.Where("ne_uid = ?", neUid)
// 查询数据
row := model.NeInfo{}
if err := tx.Limit(1).Find(&row).Error; err != nil {
@@ -210,15 +212,20 @@ func (r NeInfo) SelectNeInfoByCoreUidAndNeUid(coreUid, neUid string) model.NeInf
}
// UpdateState 修改状态
func (r NeInfo) UpdateState(id int64, status int64) int64 {
if id <= 0 {
func (r NeInfo) UpdateState(neInfo model.NeInfo) int64 {
if neInfo.ID <= 0 {
return 0
}
tx := db.DB("").Model(&model.NeInfo{})
// 构建查询条件
tx = tx.Where("id = ?", id)
tx = tx.Where("id = ?", neInfo.ID)
tx.Updates(map[string]any{
"status": status,
"status": neInfo.Status,
"ne_type": neInfo.NeType,
"serial_num": neInfo.SerialNum,
"expiry_date": neInfo.ExpiryDate,
"ue_number": neInfo.UeNumber,
"nb_number": neInfo.NbNumber,
"update_time": time.Now().UnixMilli(),
})
// 执行更新

View File

@@ -1,158 +0,0 @@
package repository
import (
"fmt"
"time"
"be.ems/src/framework/database/db"
"be.ems/src/framework/logger"
"be.ems/src/modules/ne/model"
)
// 实例化数据层 NeLicense 结构体
var NewNeLicense = &NeLicense{}
// NeLicense 网元授权激活信息 数据层处理
type NeLicense struct{}
// SelectByPage 分页查询集合
func (r NeLicense) SelectByPage(query map[string]string) ([]model.NeLicense, int64) {
tx := db.DB("").Model(&model.NeLicense{})
// 查询条件拼接
if v, ok := query["neType"]; ok && v != "" {
tx = tx.Where("ne_type = ?", v)
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
}
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
}
if v, ok := query["expiryDate"]; ok && v != "" {
tx = tx.Where("expiry_date like ?", fmt.Sprintf("%s%%", v))
}
if v, ok := query["serialNum"]; ok && v != "" {
tx = tx.Where("serial_num like ?", fmt.Sprintf("%s%%", v))
}
if v, ok := query["createBy"]; ok && v != "" {
tx = tx.Where("create_by like ?", fmt.Sprintf("%s%%", v))
}
// 查询结果
var total int64 = 0
rows := []model.NeLicense{}
// 查询数量为0直接返回
if err := tx.Count(&total).Error; err != nil || total <= 0 {
return rows, total
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
tx = tx.Order("id desc")
err := tx.Find(&rows).Error
if err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows, total
}
return rows, total
}
// Select 查询集合
func (r NeLicense) Select(param model.NeLicense) []model.NeLicense {
tx := db.DB("").Model(&model.NeLicense{})
// 查询条件拼接
if param.CoreUID != "" {
tx = tx.Where("core_uid = ?", param.CoreUID)
}
if param.NeUID != "" {
tx = tx.Where("ne_uid = ?", param.NeUID)
}
if param.NeType != "" {
tx = tx.Where("ne_type = ?", param.NeType)
}
if param.ExpiryDate != "" {
tx = tx.Where("expiry_date = ?", param.ExpiryDate)
}
if param.SerialNum != "" {
tx = tx.Where("serial_num = ?", param.SerialNum)
}
if param.CreateBy != "" {
tx = tx.Where("create_by like ?", fmt.Sprintf("%s%%", param.CreateBy))
}
// 查询数据
rows := []model.NeLicense{}
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows
}
return rows
}
// SelectByIds 通过ID查询
func (r NeLicense) SelectByIds(ids []int64) []model.NeLicense {
rows := []model.NeLicense{}
if len(ids) <= 0 {
return rows
}
tx := db.DB("").Model(&model.NeLicense{})
// 构建查询条件
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
}
// Insert 新增信息
func (r NeLicense) Insert(neInfo model.NeLicense) int64 {
if neInfo.CreateBy != "" {
ms := time.Now().UnixMilli()
neInfo.CreateTime = ms
neInfo.UpdateTime = ms
neInfo.UpdateBy = neInfo.CreateBy
}
tx := db.DB("").Create(&neInfo)
if err := tx.Error; err != nil {
logger.Errorf("CreateInBatches err => %v", err)
}
return neInfo.ID
}
// Update 修改信息
func (r NeLicense) Update(param model.NeLicense) int64 {
if param.ID <= 0 {
return 0
}
if param.UpdateBy != "" {
param.UpdateTime = time.Now().UnixMilli()
}
param.UpdateTime = time.Now().UnixMilli()
tx := db.DB("").Model(&model.NeLicense{})
// 构建查询条件
tx = tx.Where("id = ?", param.ID)
tx = tx.Omit("id", "create_by", "create_time")
// 执行更新
if err := tx.Updates(param).Error; err != nil {
logger.Errorf("update err => %v", err.Error())
return 0
}
return tx.RowsAffected
}
// DeleteByIds 批量删除信息
func (r NeLicense) DeleteByIds(ids []int64) int64 {
if len(ids) <= 0 {
return 0
}
tx := db.DB("").Where("id in ?", ids)
if err := tx.Delete(&model.NeLicense{}).Error; err != nil {
logger.Errorf("delete err => %v", err.Error())
return 0
}
return tx.RowsAffected
}

View File

@@ -19,14 +19,8 @@ type NeVersion struct{}
func (r NeVersion) SelectByPage(query map[string]string) ([]model.NeVersion, int64) {
tx := db.DB("").Model(&model.NeVersion{})
// 查询条件拼接
if v, ok := query["neType"]; ok && v != "" {
tx = tx.Where("ne_type = ?", v)
}
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
if v, ok := query["neId"]; ok && v != "" {
tx = tx.Where("ne_id = ?", v)
}
if v, ok := query["version"]; ok && v != "" {
tx = tx.Where("version like ?", fmt.Sprintf("%s%%", v))
@@ -47,6 +41,10 @@ func (r NeVersion) SelectByPage(query map[string]string) ([]model.NeVersion, int
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
// 关联查询
tx = tx.Joins("left join ne_info on ne_info.id = ne_version.ne_id")
tx = tx.Select("ne_version.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid")
tx = tx.Order("update_time desc")
err := tx.Find(&rows).Error
if err != nil {
@@ -60,14 +58,8 @@ func (r NeVersion) SelectByPage(query map[string]string) ([]model.NeVersion, int
func (r NeVersion) Select(param model.NeVersion) []model.NeVersion {
tx := db.DB("").Model(&model.NeVersion{})
// 查询条件拼接
if param.CoreUID != "" {
tx = tx.Where("core_uid = ?", param.CoreUID)
}
if param.NeUID != "" {
tx = tx.Where("ne_uid = ?", param.NeUID)
}
if param.NeType != "" {
tx = tx.Where("ne_type = ?", param.NeType)
if param.NeID != 0 {
tx = tx.Where("ne_id = ?", param.NeID)
}
if param.Version != "" {
tx = tx.Where("version like ?", fmt.Sprintf("%s%%", param.Version))

View File

@@ -22,7 +22,7 @@ type NeConfig struct {
}
// RefreshByNeType 通过ne_type刷新redis中的缓存
func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig {
func (r *NeConfig) RefreshByNeType(neType string) []model.NeConfig {
// 多个
if neType == "" || neType == "*" {
neConfigList := r.neConfigRepository.Select(model.NeConfig{})
@@ -40,7 +40,8 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig {
redis.Del("", key)
if len(v) > 0 {
for i, item := range v {
if err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData); err != nil {
err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData)
if err != nil {
continue
}
v[i] = item
@@ -60,7 +61,8 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig {
})
if len(neConfigList) > 0 {
for i, v := range neConfigList {
if err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData); err != nil {
err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData)
if err != nil {
continue
}
neConfigList[i] = v
@@ -71,8 +73,8 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig {
return neConfigList
}
// ClearNeCacheByNeType 清除网元类型参数配置缓存
func (r *NeConfig) ClearNeCacheByNeType(neType string) bool {
// ClearByNeType 清除网元类型参数配置缓存
func (r *NeConfig) ClearByNeType(neType string) bool {
key := fmt.Sprintf("%s:NeConfig:%s", constants.CACHE_NE_DATA, neType)
if neType == "*" {
key = fmt.Sprintf("%s:NeConfig:*", constants.CACHE_NE_DATA)
@@ -95,7 +97,7 @@ func (r *NeConfig) FindByNeType(neType string) []model.NeConfig {
neConfigList = []model.NeConfig{}
}
} else {
neConfigList = r.RefreshByNeTypeAndNeID(neType)
neConfigList = r.RefreshByNeType(neType)
}
return neConfigList
}

View File

@@ -56,20 +56,13 @@ func (s NeConfigBackup) Update(item model.NeConfigBackup) int64 {
}
// DeleteByIds 批量删除信息
func (s NeConfigBackup) DeleteByIds(id int64, coreUid string, neUid string) (int64, error) {
func (s NeConfigBackup) DeleteByIds(ids []int64) (int64, error) {
// 检查是否存在
data := s.neConfigBackupRepository.SelectByIds([]int64{id})
data := s.neConfigBackupRepository.SelectByIds(ids)
if len(data) != 1 {
return 0, fmt.Errorf("neConfigBackup.noData")
}
for _, v := range data {
if v.CoreUID != coreUid || v.NeUID != neUid {
return 0, fmt.Errorf("data not match, id: %d", v.ID)
}
}
rows := s.neConfigBackupRepository.DeleteByIds([]int64{id})
return rows, nil
return s.neConfigBackupRepository.DeleteByIds(ids), nil
}
// FileLocalToNe 网元配置文件复制到网元端覆盖
@@ -80,13 +73,13 @@ func (s NeConfigBackup) FileLocalToNe(neInfo model.NeInfo, localFile string) err
if runtime.GOOS == "windows" {
omcPath = fmt.Sprintf("C:%s", omcPath)
}
localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeUID)
localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeUid)
if err := file.UnZip(localFile, localDirPath); err != nil {
return fmt.Errorf("unzip err")
}
// 网元主机的SSH客户端
sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.ID)
if err != nil {
return fmt.Errorf("ne info ssh client err")
}
@@ -99,7 +92,7 @@ func (s NeConfigBackup) FileLocalToNe(neInfo model.NeInfo, localFile string) err
defer sftpClient.Close()
// 网元配置端上的临时目录
neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeUID)
neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeUid)
sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /tmp/omc/ne_config && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp))
// 复制到网元端
if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil {
@@ -149,7 +142,7 @@ func (s NeConfigBackup) FileLocalToNe(neInfo model.NeInfo, localFile string) err
// FileNeToLocal 网元备份文件网元端复制到本地
func (s NeConfigBackup) FileNeToLocal(neInfo model.NeInfo) (string, error) {
// 网元主机的SSH客户端
sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.ID)
if err != nil {
return "", fmt.Errorf("ne info ssh client err")
}
@@ -167,11 +160,11 @@ func (s NeConfigBackup) FileNeToLocal(neInfo model.NeInfo) (string, error) {
if runtime.GOOS == "windows" {
omcPath = fmt.Sprintf("C:%s", omcPath)
}
localDirPath := fmt.Sprintf("%s/%s/%s/from_ne_tmp", omcPath, neTypeLower, neInfo.NeUID)
localDirPath := fmt.Sprintf("%s/%s/%s/from_ne_tmp", omcPath, neTypeLower, neInfo.NeUid)
// 网元配置文件先复制到临时目录
sshClient.RunCMD("sudo mkdir -p /tmp/omc/ne_config && sudo chmod 777 -R /tmp/omc")
neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeUID)
neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeUid)
switch neTypeLower {
case "ims":
// ims目录
@@ -212,8 +205,8 @@ func (s NeConfigBackup) FileNeToLocal(neInfo model.NeInfo) (string, error) {
}
// 压缩zip文件名
zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeUID, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS))
zipFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neInfo.NeUID, zipFileName)
zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeUid, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS))
zipFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neInfo.NeUid, zipFileName)
if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil {
return "", fmt.Errorf("compress zip err")
}

View File

@@ -14,6 +14,7 @@ import (
"be.ems/src/framework/logger"
"be.ems/src/framework/ssh"
"be.ems/src/framework/telnet"
"be.ems/src/framework/utils/file"
"be.ems/src/framework/utils/generate"
"be.ems/src/framework/utils/parse"
"be.ems/src/modules/ne/model"
@@ -35,78 +36,93 @@ type NeInfo struct {
Para5GData map[string]string
}
// FindByCoreUidAndNeUid 通过core_uid和ne_uid查询网元信息
// coreUid 为*时根据neUid查询
func (r NeInfo) FindByCoreUidAndNeUid(coreUid string, neUid string) model.NeInfo {
var neInfo model.NeInfo
key := fmt.Sprintf("%s:%s:*:%s", constants.CACHE_NE_INFO, coreUid, neUid)
jsonStr, _ := redis.Get("", key)
if len(jsonStr) > 7 {
err := json.Unmarshal([]byte(jsonStr), &neInfo)
if err != nil {
neInfo = model.NeInfo{}
// FindByNeId 通过id查询网元信息
func (r NeInfo) FindByNeId(neId int64) model.NeInfo {
neInfo := model.NeInfo{}
key := fmt.Sprintf("%s:*:%d:*", constants.CACHE_NE_INFO, neId)
jsonStr, err := redis.Get("", key)
if err == nil && len(jsonStr) > 7 {
if err := json.Unmarshal([]byte(jsonStr), &neInfo); err != nil {
return neInfo
}
} else {
neInfo = r.neInfoRepository.SelectNeInfoByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID == coreUid && neInfo.NeUID == neUid {
neInfos := r.neInfoRepository.SelectByIds([]int64{neId})
if len(neInfos) == 1 {
neInfo = neInfos[0]
redis.Del("", key)
values, _ := json.Marshal(neInfo)
redis.Set("", key, string(values), 0)
dataByte, err := json.Marshal(neInfo)
if err != nil {
return neInfo
}
key = fmt.Sprintf("%s:%s:%d:%s", constants.CACHE_NE_INFO, neInfo.NeType, neInfo.ID, neInfo.NeUid)
redis.Set("", key, string(dataByte), 0)
}
}
return neInfo
}
// RefreshByCoreUidAndNeUid 通过core_id和ne_uid刷新缓存
func (r NeInfo) RefreshByCoreUidAndNeUid(coreuid string, neUid string) model.NeInfo {
var neInfo model.NeInfo
if coreuid == "*" || coreuid == "" {
return neInfo
}
key := fmt.Sprintf("%s:%s:*:%s", constants.CACHE_NE_INFO, coreuid, neUid)
redis.Del("", key)
neInfo = r.neInfoRepository.SelectNeInfoByCoreUidAndNeUid(coreuid, neUid)
if neInfo.CoreUID == coreuid && neInfo.NeUID == neUid {
values, _ := json.Marshal(neInfo)
redis.Set("", key, string(values), 0)
// FindByCoreUidAndNeUid 通过ne_uid查询网元信息
func (r NeInfo) FindByNeUid(neUid string) model.NeInfo {
neInfo := model.NeInfo{}
key := fmt.Sprintf("%s:*:*:%s", constants.CACHE_NE_INFO, neUid)
jsonStr, err := redis.Get("", key)
if err == nil && len(jsonStr) > 7 {
if err := json.Unmarshal([]byte(jsonStr), &neInfo); err != nil {
return neInfo
}
} else {
neInfo = r.neInfoRepository.SelectNeInfoByNeUid(neUid)
if neInfo.NeUid == neUid {
redis.Del("", key)
dataByte, err := json.Marshal(neInfo)
if err != nil {
return neInfo
}
key = fmt.Sprintf("%s:%s:%d:%s", constants.CACHE_NE_INFO, neInfo.NeType, neInfo.ID, neInfo.NeUid)
redis.Set("", key, string(dataByte), 0)
}
}
return neInfo
}
// FindByCoreUidAndNeType 通过core_uid和ne_type查询网元信息
// coreUid 为*时根据neType查询
func (r NeInfo) FindByCoreUidAndNeType(coreUid string, neType string) []model.NeInfo {
neInfo := make([]model.NeInfo, 0)
key := fmt.Sprintf("%s:%s:%s:*", constants.CACHE_NE_INFO, coreUid, neType)
// FindByNeType 通过ne_type查询网元信息
func (r NeInfo) FindByNeType(neType string) []model.NeInfo {
neInfos := make([]model.NeInfo, 0)
key := fmt.Sprintf("%s:%s:*", constants.CACHE_NE_INFO, neType)
cacheKeys, _ := redis.GetKeys("", key)
if len(cacheKeys) > 0 {
for _, key := range cacheKeys {
var v model.NeInfo
jsonStr, _ := redis.Get("", key)
if len(jsonStr) > 7 {
json.Unmarshal([]byte(jsonStr), &v)
jsonStr, err := redis.Get("", key)
if err != nil || len(jsonStr) < 7 {
continue
}
neInfo = append(neInfo, v)
var v model.NeInfo
if err = json.Unmarshal([]byte(jsonStr), &v); err != nil {
continue
}
neInfos = append(neInfos, v)
}
return neInfo
return neInfos
} else {
neInfo = r.neInfoRepository.SelectList(model.NeInfo{CoreUID: coreUid, NeType: neType})
for _, v := range neInfo {
key := fmt.Sprintf("%s:%s:%s:%s", constants.CACHE_NE_INFO, v.CoreUID, v.NeType, v.NeUID)
neInfos = r.neInfoRepository.SelectList(model.NeInfo{NeType: neType})
for _, v := range neInfos {
key := fmt.Sprintf("%s:%s:%d:%s", constants.CACHE_NE_INFO, v.NeType, v.ID, v.NeUid)
redis.Del("", key)
values, _ := json.Marshal(v)
redis.Set("", key, string(values), 0)
dataByte, err := json.Marshal(v)
if err != nil {
continue
}
redis.Set("", key, string(dataByte), 0)
}
}
return neInfo
return neInfos
}
// ClearNeCacheByCoreUidOrNeUid 清除核心网下网元信息缓存
// coreUid 核心网唯一标识 *表示清除所有
func (r NeInfo) ClearNeCacheByCoreUid(coreUid string) bool {
key := fmt.Sprintf("%s:*", constants.CACHE_NE_INFO)
if coreUid != "*" {
key = fmt.Sprintf("%s:%s:*", constants.CACHE_NE_INFO, coreUid)
// ClearNeCacheByNeId 清除网元信息缓存 0表示所有
func (r NeInfo) ClearNeCacheByNeId(neId int64) bool {
key := fmt.Sprintf("%s:*:%d:*", constants.CACHE_NE_INFO, neId)
if neId == 0 {
key = fmt.Sprintf("%s:*", constants.CACHE_NE_INFO)
}
keys, err := redis.GetKeys("", key)
if err != nil {
@@ -115,17 +131,19 @@ func (r NeInfo) ClearNeCacheByCoreUid(coreUid string) bool {
return redis.DelKeys("", keys) == nil
}
// RefreshNeCacheByCoreUid 刷新核心网下网元信息缓存
// coreUid 核心网唯一标识 *表示所有
func (r NeInfo) RefreshNeCacheByCoreUid(coreUid string) {
if coreUid == "*" {
coreUid = ""
// RefreshNeCacheByNeId 刷新网元信息缓存 0表示所有
func (r NeInfo) RefreshNeCacheByNeId(neId int64) {
if neId == 0 {
neId = 0
}
neInfos := r.Find(model.NeInfo{CoreUID: coreUid}, false, false)
neInfos := r.Find(model.NeInfo{ID: neId}, false, false)
for _, v := range neInfos {
key := fmt.Sprintf("%s:%s:%s:%s", constants.CACHE_NE_INFO, v.CoreUID, v.NeType, v.NeUID)
key := fmt.Sprintf("%s:%d:%s:%s", constants.CACHE_NE_INFO, v.ID, v.NeType, v.NeUid)
redis.Del("", key)
values, _ := json.Marshal(v)
values, err := json.Marshal(v)
if err != nil {
continue
}
redis.Set("", key, string(values), 0)
}
}
@@ -174,11 +192,10 @@ func (r NeInfo) bandNeStatus(arr *[]model.NeInfo) {
"online": false,
}
// 网元状态设置为离线
(*arr)[i].Status = 0
if v.Status != 0 {
v.Status = 0
(*arr)[i].Status = v.Status
(*arr)[i].UpdateTime = time.Now().UnixMilli()
r.neInfoRepository.UpdateState(v.ID, v.Status)
r.neInfoRepository.UpdateState(v)
}
continue
}
@@ -193,10 +210,23 @@ func (r NeInfo) bandNeStatus(arr *[]model.NeInfo) {
if _, err = neFetchlink.NeConfigOMC(v); err != nil {
status = 2
}
(*arr)[i].Status = status
if v.Status != status {
(*arr)[i].UpdateTime = time.Now().UnixMilli()
r.neInfoRepository.UpdateState(v.ID, status)
v.Status = status
if n, ok := result["sn"]; ok && n != nil {
v.SerialNum = fmt.Sprint(n)
}
if n, ok := result["expire"]; ok && n != nil {
v.ExpiryDate = fmt.Sprint(n)
}
if n, ok := result["ueNumber"]; ok && n != nil {
v.UeNumber = parse.Number(n)
}
if n, ok := result["nbNumber"]; ok && n != nil {
v.NbNumber = parse.Number(n)
}
r.neInfoRepository.UpdateState(v)
}
}
}
@@ -205,8 +235,8 @@ func (r NeInfo) bandNeStatus(arr *[]model.NeInfo) {
func (r NeInfo) bandNeHosts(arr *[]model.NeInfo) {
for i := range *arr {
v := (*arr)[i]
if v.HostIDs != "" {
hostIds := strings.Split(v.HostIDs, ",")
if v.HostIds != "" {
hostIds := strings.Split(v.HostIds, ",")
if len(hostIds) <= 1 {
continue
}
@@ -232,7 +262,7 @@ func (r NeInfo) FindById(id int64, bandHost bool) model.NeInfo {
neInfos := r.neInfoRepository.SelectByIds([]int64{id})
if len(neInfos) > 0 {
// 带主机信息
if neInfos[0].HostIDs != "" && bandHost {
if neInfos[0].HostIds != "" && bandHost {
r.bandNeHosts(&neInfos)
}
return neInfos[0]
@@ -242,10 +272,10 @@ func (r NeInfo) FindById(id int64, bandHost bool) model.NeInfo {
// Insert 新增信息
func (r NeInfo) Insert(neInfo model.NeInfo) int64 {
if neInfo.CoreUID == "" {
return 0
if len(neInfo.NeUid) < 8 {
neInfo.NeUid = strings.ToUpper(generate.Code(8))
}
neInfo.NeUID = strings.ToUpper(generate.Code(8))
neInfo.NeType = strings.ToUpper(neInfo.NeType)
// 获取网元状态是否正常
serverState, err := neFetchlink.NeState(neInfo)
@@ -265,59 +295,49 @@ func (r NeInfo) Insert(neInfo model.NeInfo) int64 {
// 主机信息新增
if neInfo.Hosts != nil {
uuid := generate.Code(4)
var hostIDs []string
var hostIds []string
for _, host := range neInfo.Hosts {
uuid := generate.Code(4)
host.Title = fmt.Sprintf("%s_%d_%s", neInfo.NeName, host.Port, uuid)
host.GroupID = "1"
host.CreateBy = neInfo.CreateBy
hostId := r.neHostService.Insert(host)
if hostId > 0 {
hostIDs = append(hostIDs, fmt.Sprint(hostId))
hostIds = append(hostIds, fmt.Sprint(hostId))
}
}
neInfo.HostIDs = strings.Join(hostIDs, ",")
neInfo.HostIds = strings.Join(hostIds, ",")
}
insertId := r.neInfoRepository.Insert(neInfo)
if insertId > 0 {
neInfo.ID = insertId
// 新增Version信息
neVersion := model.NeVersion{
CoreUID: neInfo.CoreUID,
NeUID: neInfo.NeUID,
NeType: neInfo.NeType,
NeID: neInfo.ID,
CreateBy: neInfo.CreateBy,
}
if v, ok := serverState["version"]; ok && v != nil {
// neVersion.Name = "-"
// neVersion.Path = "-"
neVersion.Version = fmt.Sprint(v)
}
NewNeVersion.Insert(neVersion)
// 新License信息
neLicense := model.NeLicense{
CoreUID: neInfo.CoreUID,
NeUID: neInfo.NeUID,
NeType: neInfo.NeType,
CreateBy: neInfo.CreateBy,
}
// 新License信息
if v, ok := serverState["sn"]; ok && v != nil {
neLicense.SerialNum = fmt.Sprint(v)
neInfo.SerialNum = fmt.Sprint(v)
}
if v, ok := serverState["expire"]; ok && v != nil {
neLicense.ExpiryDate = fmt.Sprint(v)
neLicense.Status = "1"
neInfo.ExpiryDate = fmt.Sprint(v)
}
if v, ok := serverState["ueNumber"]; ok && v != nil {
neLicense.UeNumber = parse.Number(v)
neInfo.UeNumber = parse.Number(v)
}
if v, ok := serverState["nbNumber"]; ok && v != nil {
neLicense.NbNumber = parse.Number(v)
neInfo.NbNumber = parse.Number(v)
}
NewNeLicense.Insert(neLicense)
r.RefreshByCoreUidAndNeUid(neInfo.CoreUID, neInfo.NeUID) // 刷新缓存
r.Update(neInfo)
// 刷新缓存
r.ClearNeCacheByNeId(neInfo.ID)
}
return insertId
}
@@ -341,14 +361,14 @@ func (r NeInfo) Update(neInfo model.NeInfo) int64 {
}
// 主机信息更新
if neInfo.HostIDs != "" && len(neInfo.Hosts) > 0 {
hostIDs := strings.Split(neInfo.HostIDs, ",")
for index, id := range hostIDs {
if neInfo.HostIds != "" && len(neInfo.Hosts) > 0 {
hostIds := strings.Split(neInfo.HostIds, ",")
for index, id := range hostIds {
neInfo.Hosts[index].ID = parse.Number(id)
}
uuid := generate.Code(4)
for _, host := range neInfo.Hosts {
if host.ID != 0 {
uuid := generate.Code(4)
host.Title = fmt.Sprintf("%s_%d_%s", neInfo.NeType, host.Port, uuid)
host.GroupID = "1"
host.UpdateBy = neInfo.UpdateBy
@@ -357,112 +377,90 @@ func (r NeInfo) Update(neInfo model.NeInfo) int64 {
}
}
num := r.neInfoRepository.Update(neInfo)
if num > 0 {
// 信息更新
if v, ok := serverState["version"]; ok && v != nil {
// 版本信息更新
neVersion := NewNeVersion.FindByCoreUidAndNeUid(neInfo.CoreUID, neInfo.NeUID)
if neVersion.ID != 0 {
if neVersion.NeType != neInfo.NeType {
neVersion.NeType = neInfo.NeType
}
if v, ok := serverState["version"]; ok && v != neVersion.Version {
// neVersion.Name = "-"
// neVersion.Path = "-"
neVersion.Version = fmt.Sprint(v)
}
neVersion := NewNeVersion.FindById(neInfo.ID)
if neVersion.ID != 0 && neVersion.Version == fmt.Sprint(v) {
// neVersion.Name = "-"
// neVersion.Path = "-"
neVersion.Version = fmt.Sprint(v)
neVersion.UpdateBy = neInfo.UpdateBy
NewNeVersion.Update(neVersion)
}
}
if v, ok := serverState["sn"]; ok && v != nil {
neInfo.SerialNum = fmt.Sprint(v)
}
if v, ok := serverState["expire"]; ok && v != nil {
neInfo.ExpiryDate = fmt.Sprint(v)
}
if v, ok := serverState["ueNumber"]; ok && v != nil {
neInfo.UeNumber = parse.Number(v)
}
if v, ok := serverState["nbNumber"]; ok && v != nil {
neInfo.NbNumber = parse.Number(v)
}
// License信息更新
neLicense := NewNeLicense.FindByCoreUidAndNeUid(neInfo.CoreUID, neInfo.NeUID)
if neLicense.ID != 0 {
if neLicense.NeType != neInfo.NeType {
neLicense.NeType = neInfo.NeType
}
if v, ok := serverState["sn"]; ok && v != nil {
neLicense.SerialNum = fmt.Sprint(v)
}
if v, ok := serverState["expire"]; ok && v != nil {
neLicense.ExpiryDate = fmt.Sprint(v)
neLicense.Status = "1"
}
if v, ok := serverState["ueNumber"]; ok && v != nil {
neLicense.UeNumber = parse.Number(v)
}
if v, ok := serverState["nbNumber"]; ok && v != nil {
neLicense.NbNumber = parse.Number(v)
}
neLicense.UpdateBy = neInfo.UpdateBy
NewNeLicense.Update(neLicense)
}
r.RefreshByCoreUidAndNeUid(neInfo.CoreUID, neInfo.NeUID) // 刷新缓存
num := r.neInfoRepository.Update(neInfo)
if num > 0 {
// 刷新缓存
r.RefreshNeCacheByNeId(neInfo.ID)
}
return num
}
// DeleteByIds 批量删除信息
func (r NeInfo) DeleteByIds(ids []int64, coreUid, neUid string) (int64, error) {
func (r NeInfo) DeleteByIds(ids []int64) (int64, error) {
// 检查是否存在
arr := r.neInfoRepository.SelectByIds(ids)
if len(arr) != len(ids) {
return 0, fmt.Errorf("not match id")
}
for _, v := range arr {
if v.CoreUID != coreUid || v.NeUID != neUid {
return 0, fmt.Errorf("data not match, id: %d", v.ID)
}
}
for _, v := range arr {
// 主机信息删除
if v.HostIDs != "" {
if v.HostIds != "" {
hostIds := make([]int64, 0)
arr := strings.Split(v.HostIDs, ",")
arr := strings.Split(v.HostIds, ",")
for _, hostId := range arr {
hostIds = append(hostIds, parse.Number(hostId))
}
r.neHostService.DeleteByIds(hostIds, false)
}
// 删除License
neLicense := NewNeLicense.FindByCoreUidAndNeUid(v.CoreUID, v.NeUID)
if neLicense.CoreUID == v.CoreUID && neLicense.NeUID == v.NeUID {
NewNeLicense.DeleteByIds([]int64{neLicense.ID})
}
// 删除Version
neVersion := NewNeVersion.FindByCoreUidAndNeUid(v.CoreUID, v.NeUID)
if neVersion.CoreUID == v.CoreUID && neVersion.NeUID == v.NeUID {
neVersion := NewNeVersion.FindByNeId(v.ID)
if neVersion.ID != 0 {
NewNeVersion.DeleteByIds([]int64{neVersion.ID})
}
// 缓存信息删除
redis.Del("", fmt.Sprintf("%s:%s:%s:%s", constants.CACHE_NE_INFO, v.CoreUID, v.NeType, v.NeUID))
r.ClearNeCacheByNeId(v.ID)
}
rows := r.neInfoRepository.DeleteByIds(ids)
return rows, nil
}
// NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close()
func (r NeInfo) NeRunSSHClient(coreUid, neUid string) (*ssh.ConnSSH, error) {
neInfo := r.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
logger.Errorf("NeRunSSHClient CoreUID:%s or NeUID:%s not found", coreUid, neUid)
func (r NeInfo) NeRunSSHClient(neId int64) (*ssh.ConnSSH, error) {
neInfo := r.FindByNeId(neId)
if neInfo.ID != neId {
logger.Errorf("NeRunSSHClient NeId:%d not found", neId)
return nil, fmt.Errorf("neinfo not found")
}
// 取主机信息
if neInfo.HostIDs == "" {
logger.Errorf("NeRunSSHClient CoreUID:%s or NeUID:%s hostId not found", coreUid, neUid)
if neInfo.HostIds == "" {
logger.Errorf("NeRunSSHClient NeId:%d hostId not found", neId)
return nil, fmt.Errorf("neinfo hostId not found")
}
hostIds := strings.Split(neInfo.HostIDs, ",")
hostIds := strings.Split(neInfo.HostIds, ",")
if len(hostIds) <= 1 {
logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs)
logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIds)
return nil, fmt.Errorf("neinfo host id not found")
}
hostId := parse.Number(hostIds[0]) // 网元主机ssh 022
neHost := r.neHostService.FindById(hostId)
if neHost.ID == 0 || neHost.ID != hostId {
logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs)
logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIds)
return nil, fmt.Errorf("neinfo host not found")
}
if neHost.HostType != "ssh" {
@@ -487,8 +485,8 @@ func (r NeInfo) NeRunSSHClient(coreUid, neUid string) (*ssh.ConnSSH, error) {
}
// NeRunSSHCmd 网元主机的SSH客户端发送cmd命令
func (r NeInfo) NeRunSSHCmd(coreUid, neUid string, cmdStr string) (string, error) {
sshClient, err := r.NeRunSSHClient(coreUid, neUid)
func (r NeInfo) NeRunSSHCmd(neId int64, cmdStr string) (string, error) {
sshClient, err := r.NeRunSSHClient(neId)
if err != nil {
return "", err
}
@@ -505,26 +503,26 @@ func (r NeInfo) NeRunSSHCmd(coreUid, neUid string, cmdStr string) (string, error
// NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close()
// num 是网元主机telnet 14100 25200UPF标准版
func (r NeInfo) NeRunTelnetClient(coreUid, neUid string, num int) (*telnet.ConnTelnet, error) {
neInfo := r.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
logger.Errorf("NeRunSSHClient CoreUID:%s or NeUID:%s not found", coreUid, neUid)
func (r NeInfo) NeRunTelnetClient(neId int64, num int) (*telnet.ConnTelnet, error) {
neInfo := r.FindByNeId(neId)
if neInfo.ID != neId {
logger.Errorf("NeRunSSHClient NeId:%d not found", neId)
return nil, fmt.Errorf("neinfo not found")
}
// 取主机信息
if neInfo.HostIDs == "" {
logger.Errorf("NeRunTelnetClient CoreUID:%s or NeUID:%s hostId not found", coreUid, neUid)
if neInfo.HostIds == "" {
logger.Errorf("NeRunSSHClient NeId:%d hostId not found", neId)
return nil, fmt.Errorf("neinfo hostId not found")
}
hostIds := strings.Split(neInfo.HostIDs, ",")
hostIds := strings.Split(neInfo.HostIds, ",")
if len(hostIds) <= 1 {
logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs)
logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIds)
return nil, fmt.Errorf("neinfo host id not found")
}
hostId := parse.Number(hostIds[num]) // 网元主机telnet 14100 25200
neHost := r.neHostService.FindById(hostId)
if neHost.ID == 0 || neHost.ID != hostId {
logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs)
logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIds)
return nil, fmt.Errorf("neinfo host not found")
}
@@ -541,26 +539,26 @@ func (r NeInfo) NeRunTelnetClient(coreUid, neUid string, num int) (*telnet.ConnT
// NeRunRedisClient 网元主机的Redis客户端-为创建相关连接,注意结束后 Close()
// 暂时只有UDM有Redis配置项
func (r NeInfo) NeRunRedisClient(coreUid, neUid string) (*redis.ConnRedis, error) {
neInfo := r.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
logger.Errorf("NeRunRedisClient CoreUid:%s NeUid:%s not found", coreUid, neUid)
func (r NeInfo) NeRunRedisClient(neId int64) (*redis.ConnRedis, error) {
neInfo := r.FindByNeId(neId)
if neInfo.ID != neId {
logger.Errorf("NeRunRedisClient NeId:%d not found", neId)
return nil, fmt.Errorf("neinfo not found")
}
// 取主机信息
if neInfo.HostIDs == "" {
logger.Errorf("NeRunRedisClient CoreUid:%s NeUid:%s hostId not found", coreUid, neUid)
if neInfo.HostIds == "" {
logger.Errorf("NeRunSSHClient NeId:%d hostId not found", neId)
return nil, fmt.Errorf("neinfo hostId not found")
}
hostIds := strings.Split(neInfo.HostIDs, ",")
if len(hostIds) <= 2 {
logger.Errorf("NeRunRedisClient hosts id %s not found", neInfo.HostIDs)
hostIds := strings.Split(neInfo.HostIds, ",")
if len(hostIds) <= 1 {
logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIds)
return nil, fmt.Errorf("neinfo host id not found")
}
hostId := parse.Number(hostIds[2])
neHost := r.neHostService.FindById(hostId)
if neHost.ID == 0 || neHost.ID != hostId {
logger.Errorf("NeRunRedisClient Hosts %s not found", neInfo.HostIDs)
logger.Errorf("NeRunRedisClient Hosts %s not found", neInfo.HostIds)
return nil, fmt.Errorf("neinfo host not found")
}
@@ -575,14 +573,109 @@ func (r NeInfo) NeRunRedisClient(coreUid, neUid string) (*redis.ConnRedis, error
return redisClient, nil
}
// NeConfOAMReadSync 网元OAM配置文件读取
func (r NeInfo) NeConfOAMReadSync(coreUid, neUid string) (map[string]any, error) {
neInfo := r.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
logger.Errorf("NeRunRedisClient CoreUid:%s NeUid:%s not found", coreUid, neUid)
return nil, fmt.Errorf("neinfo not found")
// NeConfLicenseRead 读取授权文件信息
// 返回激活申请码, 激活文件绝对地址
func (r NeInfo) NeConfLicenseRead(neInfo model.NeInfo) (string, string) {
neTypeLower := strings.ToLower(neInfo.NeType)
// 网管本地路径
omcPath := "/usr/local/omc/backup/ne_license"
if runtime.GOOS == "windows" {
omcPath = fmt.Sprintf("C:%s", omcPath)
}
omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neInfo.NeUid)
// 网元端授权文件路径
nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower)
// 网元主机的SSH客户端
sshClient, err := r.NeRunSSHClient(neInfo.ID)
if err != nil {
return "", ""
}
defer sshClient.Close()
// 网元主机的SSH客户端进行文件传输
sftpClient, err := sshClient.NewClientSFTP()
if err != nil {
return "", ""
}
defer sftpClient.Close()
// 复制授权申请码到本地
if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil {
return "", ""
}
// 读取文件内容
bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt")
if err != nil {
return "", ""
}
// 复制激活文件到本地
licensePath := ""
if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil {
licensePath = omcPath + "/system.ini"
}
activationRequestCode := string(bytes)
parts := strings.Split(activationRequestCode, "\n")
if len(parts) > 1 && strings.HasPrefix(parts[0], "SN") {
activationRequestCode = parts[1] // 获取第二行内容
}
return strings.TrimSpace(activationRequestCode), licensePath
}
// NeConfLicenseUpload 授权文件上传到网元主机
func (r NeInfo) NeConfLicenseUpload(neInfo model.NeInfo, reload bool) error {
// 检查文件是否存在
omcLicensePath := file.ParseUploadFileAbsPath(neInfo.LicensePath)
if _, err := os.Stat(omcLicensePath); err != nil {
return fmt.Errorf("file read failure")
}
// 网元主机的SSH客户端
sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.ID)
if err != nil {
return err
}
defer sshClient.Close()
// 网元主机的SSH客户端进行文件传输
sftpClient, err := sshClient.NewClientSFTP()
if err != nil {
return err
}
defer sftpClient.Close()
// 网元端授权文件路径
neTypeLower := strings.ToLower(neInfo.NeType)
neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower)
neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath))
// 修改网元文件权限
sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath))
// 尝试备份授权文件
neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405"))
sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack))
// 上传授权文件去覆盖
if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil {
return fmt.Errorf("please check if scp remote copy is allowed")
}
// 重启服务
if reload {
cmdStr := fmt.Sprintf("sudo systemctl restart %s", neTypeLower)
switch neTypeLower {
case "ims":
cmdStr = "ims-stop || true && ims-start"
case "omc":
cmdStr = "sudo systemctl restart omc"
}
sshClient.RunCMD(cmdStr)
}
return nil
}
// NeConfOAMReadSync 网元OAM配置文件读取
func (r NeInfo) NeConfOAMReadSync(neInfo model.NeInfo) (map[string]any, error) {
oamData, err := r.neConfOAMRead(neInfo, true)
if err != nil {
return nil, err
@@ -693,7 +786,7 @@ func (r NeInfo) neConfOAMRead(neInfo model.NeInfo, sync bool) (map[string]any, e
neTypeLower := strings.ToLower(neInfo.NeType)
fileName := "oam_manager.yaml"
// 网管本地路径
localFilePath := fmt.Sprintf("/usr/local/omc/backup/ne_config/%s/%s/%s", neTypeLower, neInfo.NeUID, fileName)
localFilePath := fmt.Sprintf("/usr/local/omc/backup/ne_config/%s/%d/%s", neTypeLower, neInfo.ID, fileName)
if runtime.GOOS == "windows" {
localFilePath = fmt.Sprintf("C:%s", localFilePath)
}
@@ -701,7 +794,7 @@ func (r NeInfo) neConfOAMRead(neInfo model.NeInfo, sync bool) (map[string]any, e
// 从网元端同步到本地
if sync {
// 网元主机的SSH客户端
sshClient, err := r.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := r.NeRunSSHClient(neInfo.ID)
if err != nil {
return nil, fmt.Errorf("ne info ssh client err")
}
@@ -752,7 +845,7 @@ func (r NeInfo) neConfOAMWirte(neInfo model.NeInfo, content any, sync bool) erro
if runtime.GOOS == "windows" {
omcPath = fmt.Sprintf("C:%s", omcPath)
}
localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neInfo.NeUID, fileName)
localFilePath := fmt.Sprintf("%s/%s/%d/%s", omcPath, neTypeLower, neInfo.ID, fileName)
// 写入文件
if err := parse.ConvertConfigToFile("yaml", localFilePath, content); err != nil {
@@ -762,7 +855,7 @@ func (r NeInfo) neConfOAMWirte(neInfo model.NeInfo, content any, sync bool) erro
// 同步到网元端
if sync {
// 网元主机的SSH客户端
sshClient, err := r.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := r.NeRunSSHClient(neInfo.ID)
if err != nil {
return err
}
@@ -801,13 +894,13 @@ func (r NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any,
httpManageCfg = neConfOAMData["httpManageCfg"].(map[string]any)
}
httpManageCfg["port"] = neInfo.Port
if strings.Contains(neInfo.IPAddr, ":") {
if strings.Contains(neInfo.IpAddr, ":") {
httpManageCfg["ipType"] = "ipv6"
httpManageCfg["ipv6"] = neInfo.IPAddr
httpManageCfg["ipv6"] = neInfo.IpAddr
}
if strings.Contains(neInfo.IPAddr, ".") {
if strings.Contains(neInfo.IpAddr, ".") {
httpManageCfg["ipType"] = "ipv4"
httpManageCfg["ipv4"] = neInfo.IPAddr
httpManageCfg["ipv4"] = neInfo.IpAddr
}
delete(httpManageCfg, "iptype")
delete(oamData, "httpmanagecfg")
@@ -821,8 +914,7 @@ func (r NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any,
}
delete(oamConfig, "neconfig")
oamConfig["neConfig"] = map[string]string{
"coreId": neInfo.CoreUID,
"neUid": neInfo.NeUID,
"rmUid": neInfo.NeUid,
"neName": neInfo.NeName,
"dn": neInfo.Dn,
"vendorName": neInfo.VendorName,
@@ -868,13 +960,13 @@ func (r NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any,
neConfOAMData := r.neConfOAMData()
snmpConfig = neConfOAMData["snmpConfig"].(map[string]any)
}
if strings.Contains(neInfo.IPAddr, ":") {
if strings.Contains(neInfo.IpAddr, ":") {
snmpConfig["ipType"] = "ipv6"
snmpConfig["ipv6"] = neInfo.IPAddr
snmpConfig["ipv6"] = neInfo.IpAddr
}
if strings.Contains(neInfo.IPAddr, ".") {
if strings.Contains(neInfo.IpAddr, ".") {
snmpConfig["ipType"] = "ipv4"
snmpConfig["ipv4"] = neInfo.IPAddr
snmpConfig["ipv4"] = neInfo.IpAddr
}
delete(snmpConfig, "iptype")
if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil {
@@ -936,7 +1028,7 @@ func (r NeInfo) NeConfPara5GRead() (map[string]any, error) {
return mapData, nil
}
// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId
// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元列表neUid
func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) error {
// 网管本地路径
omcFilePath := "/usr/local/etc/omc/para5G.yaml"
@@ -951,19 +1043,23 @@ func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) erro
// 同步到网元端
if len(syncNE) > 0 {
errMsg := []string{}
for _, neTI := range syncNE {
ti := strings.SplitN(neTI, "@", 2)
for _, neUid := range syncNE {
neInfo := r.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
errMsg = append(errMsg, fmt.Sprintf("neinfo %s : not found", neUid))
continue
}
// 网元主机的SSH客户端
sshClient, err := r.NeRunSSHClient(ti[0], ti[1])
sshClient, err := r.NeRunSSHClient(neInfo.ID)
if err != nil {
errMsg = append(errMsg, fmt.Sprintf("core_ne %s : %s", ti, err.Error()))
errMsg = append(errMsg, fmt.Sprintf("neinfo %s : %s", neInfo.NeUid, err.Error()))
continue
}
defer sshClient.Close()
// 网元主机的SSH客户端进行文件传输
sftpClient, err := sshClient.NewClientSFTP()
if err != nil {
errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error()))
errMsg = append(errMsg, fmt.Sprintf("neinfo %s : %s", neInfo.NeUid, err.Error()))
continue
}
defer sftpClient.Close()
@@ -975,7 +1071,7 @@ func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) erro
sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath))
// 复制到网元进行覆盖
if err = sftpClient.CopyFileLocalToRemote(omcFilePath, neFilePath); err != nil {
errMsg = append(errMsg, fmt.Sprintf("%s : please check if scp remote copy is allowed", ti))
errMsg = append(errMsg, fmt.Sprintf("neinfo %s : please check if scp remote copy is allowed", neInfo.NeUid))
continue
}
}

View File

@@ -1,185 +0,0 @@
package service
import (
"fmt"
"os"
"path/filepath"
"runtime"
"strings"
"time"
"be.ems/src/framework/utils/file"
"be.ems/src/modules/ne/model"
"be.ems/src/modules/ne/repository"
)
// 实例化服务层 NeLicense 结构体
var NewNeLicense = &NeLicense{
neLicenseRepository: repository.NewNeLicense,
}
// NeLicense 网元授权激活信息 服务层处理
type NeLicense struct {
neLicenseRepository *repository.NeLicense // 网元授权激活信息表
}
// FindByPage 分页查询列表数据
func (r *NeLicense) FindByPage(query map[string]string) ([]model.NeLicense, int64) {
return r.neLicenseRepository.SelectByPage(query)
}
// Find 查询列表
func (r *NeLicense) Find(neLicense model.NeLicense) []model.NeLicense {
return r.neLicenseRepository.Select(neLicense)
}
// FindById 通过ID查询
func (r *NeLicense) FindById(id int64) model.NeLicense {
if id <= 0 {
return model.NeLicense{}
}
neLicenses := r.neLicenseRepository.SelectByIds([]int64{id})
if len(neLicenses) > 0 {
return neLicenses[0]
}
return model.NeLicense{}
}
// Insert 新增信息
func (r *NeLicense) Insert(neLicense model.NeLicense) int64 {
return r.neLicenseRepository.Insert(neLicense)
}
// Update 修改信息
func (r *NeLicense) Update(neLicense model.NeLicense) int64 {
return r.neLicenseRepository.Update(neLicense)
}
// DeleteByIds 批量删除信息
func (r *NeLicense) DeleteByIds(ids []int64) (int64, error) {
// 检查是否存在
rowIds := r.neLicenseRepository.SelectByIds(ids)
if len(rowIds) <= 0 {
return 0, fmt.Errorf("neLicense.noData")
}
if len(rowIds) == len(ids) {
rows := r.neLicenseRepository.DeleteByIds(ids)
return rows, nil
}
// 删除信息失败!
return 0, fmt.Errorf("delete fail")
}
// FindByCoreUidAndNeUid 通过核心网和网元唯一标识查询
func (r *NeLicense) FindByCoreUidAndNeUid(coreUid, neUid string) model.NeLicense {
neLicenses := r.neLicenseRepository.Select(model.NeLicense{
CoreUID: coreUid,
NeUID: neUid,
})
if len(neLicenses) > 0 {
return neLicenses[0]
}
return model.NeLicense{}
}
// ReadLicenseInfo 读取授权文件信息
// 返回激活申请码, 激活文件
func (r *NeLicense) ReadLicenseInfo(neLicense model.NeLicense) (string, string) {
neTypeLower := strings.ToLower(neLicense.NeType)
// 网管本地路径
omcPath := "/usr/local/omc/backup/ne_license"
if runtime.GOOS == "windows" {
omcPath = fmt.Sprintf("C:%s", omcPath)
}
omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeUID)
// 网元端授权文件路径
nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower)
// 网元主机的SSH客户端
sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.CoreUID, neLicense.NeUID)
if err != nil {
return "", ""
}
defer sshClient.Close()
// 网元主机的SSH客户端进行文件传输
sftpClient, err := sshClient.NewClientSFTP()
if err != nil {
return "", ""
}
defer sftpClient.Close()
// 复制授权申请码到本地
if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil {
return "", ""
}
// 读取文件内容
bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt")
if err != nil {
return "", ""
}
// 复制激活文件到本地
licensePath := ""
if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil {
licensePath = omcPath + "/system.ini"
}
activationRequestCode := string(bytes)
parts := strings.Split(activationRequestCode, "\n")
if len(parts) > 1 && strings.HasPrefix(parts[0], "SN") {
activationRequestCode = parts[1] // 获取第二行内容
}
return strings.TrimSpace(activationRequestCode), licensePath
}
// UploadLicense 授权文件上传到网元主机
func (r *NeLicense) UploadLicense(neLicense model.NeLicense) error {
// 检查文件是否存在
omcLicensePath := file.ParseUploadFileAbsPath(neLicense.LicensePath)
if _, err := os.Stat(omcLicensePath); err != nil {
return fmt.Errorf("file read failure")
}
// 网元主机的SSH客户端
sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.CoreUID, neLicense.NeUID)
if err != nil {
return err
}
defer sshClient.Close()
// 网元主机的SSH客户端进行文件传输
sftpClient, err := sshClient.NewClientSFTP()
if err != nil {
return err
}
defer sftpClient.Close()
// 网元端授权文件路径
neTypeLower := strings.ToLower(neLicense.NeType)
neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower)
neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath))
// 修改网元文件权限
sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath))
// 尝试备份授权文件
neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405"))
sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack))
// 上传授权文件去覆盖
if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil {
return fmt.Errorf("please check if scp remote copy is allowed")
}
// 重启服务
if neLicense.Reload {
cmdStr := fmt.Sprintf("sudo systemctl restart %s", neTypeLower)
switch neTypeLower {
case "ims":
cmdStr = "ims-stop || true && ims-start"
case "omc":
cmdStr = "sudo systemctl restart omc"
}
sshClient.RunCMD(cmdStr)
}
return nil
}

View File

@@ -48,7 +48,7 @@ func (r NeSoftware) Insert(neSoftware model.NeSoftware) int64 {
inserId := r.neSoftwareRepository.Insert(neSoftware)
if inserId > 0 {
// 更新同类型的新包版本
neVersions := r.neVersionService.Find(model.NeVersion{NeType: neSoftware.NeType}, false)
neVersions := r.neVersionService.FindByNeType(neSoftware.NeType)
if len(neVersions) > 0 {
for _, neVersion := range neVersions {
neVersion.NewName = neSoftware.Name
@@ -68,12 +68,12 @@ func (r NeSoftware) Update(neSoftware model.NeSoftware) int64 {
rows := r.neSoftwareRepository.Update(neSoftware)
if rows > 0 {
// 更新同类型的新包版本
neVersions := r.neVersionService.Find(model.NeVersion{
NeType: neSoftware.NeType,
Status: "3",
}, false)
neVersions := r.neVersionService.FindByNeType(neSoftware.NeType)
if len(neVersions) > 0 {
for _, neVersion := range neVersions {
if neVersion.Status != "3" {
continue
}
neVersion.NewName = neSoftware.Name
neVersion.NewVersion = neSoftware.Version
neVersion.NewPath = neSoftware.Path
@@ -127,18 +127,18 @@ func (r NeSoftware) CheckUniqueTypeAndNameAndVersion(neType, name, version strin
return uniqueId == 0
}
// UpdateVersions 更新软件包对应网元的新版本
func (r NeSoftware) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 {
// UpdateVersion 更新软件包对应网元的新版本
func (r NeSoftware) UpdateVersion(neSoftware model.NeSoftware) int64 {
var rows int64 = 0
// 更新同类型的新包版本
neVersions := r.neVersionService.Find(neVersion, false)
neVersions := r.neVersionService.FindByNeType(neSoftware.NeType)
if len(neVersions) > 0 {
for _, v := range neVersions {
v.NewName = neSoftware.Name
v.NewVersion = neSoftware.Version
v.NewPath = neSoftware.Path
v.Status = "3"
v.UpdateBy = neVersion.UpdateBy
v.UpdateBy = neSoftware.UpdateBy
rows += r.neVersionService.Update(v)
}
}

View File

@@ -55,8 +55,8 @@ func (r NeVersion) checkNeVersion(arr *[]model.NeVersion) {
for i := range *arr {
item := (*arr)[i]
// 查询网元获取IP
neInfo := r.neInfoService.FindByCoreUidAndNeUid(item.CoreUID, item.NeUID)
if neInfo.CoreUID != item.CoreUID || neInfo.NeUID != item.NeUID {
neInfo := r.neInfoService.FindById(item.NeID, false)
if neInfo.ID != item.NeID {
continue
}
result, err := neFetchlink.NeState(neInfo)
@@ -72,9 +72,6 @@ func (r NeVersion) checkNeVersion(arr *[]model.NeVersion) {
// item.Path = "-"
item.Version = ver
}
if item.NeType != neInfo.NeType {
item.NeType = neInfo.NeType
}
r.Update(item)
(*arr)[i] = item
}
@@ -118,11 +115,10 @@ func (r NeVersion) DeleteByIds(ids []int64) (int64, error) {
return 0, fmt.Errorf("delete fail")
}
// FindByCoreUidAndNeUid 通过核心网和网元唯一标识查询
func (r NeVersion) FindByCoreUidAndNeUid(coreUid, neUid string) model.NeVersion {
// FindByNeId 通过网元ID查询
func (r NeVersion) FindByNeId(neId int64) model.NeVersion {
neVersions := r.neVersionRepository.Select(model.NeVersion{
CoreUID: coreUid,
NeUID: neUid,
NeID: neId,
})
if len(neVersions) > 0 {
return neVersions[0]
@@ -130,12 +126,45 @@ func (r NeVersion) FindByCoreUidAndNeUid(coreUid, neUid string) model.NeVersion
return model.NeVersion{}
}
// FindByNeUid 通过网元类型查询
func (r NeVersion) FindByNeUid(neUid string) model.NeVersion {
neInfo := r.neInfoService.FindByNeUid(neUid)
if neInfo.ID <= 0 {
return model.NeVersion{}
}
neVersion := r.FindByNeId(neInfo.ID)
if neVersion.ID > 0 {
return neVersion
}
return model.NeVersion{}
}
// FindByNeType 通过网元类型查询
func (r NeVersion) FindByNeType(neType string) []model.NeVersion {
neVersions := make([]model.NeVersion, 0)
neInfos := r.neInfoService.FindByNeType(neType)
if len(neInfos) <= 0 {
return neVersions
}
for _, neInfo := range neInfos {
neVersion := r.FindByNeId(neInfo.ID)
if neVersion.ID > 0 {
neVersions = append(neVersions, neVersion)
}
}
return neVersions
}
// Operate 操作版本上传到网元主机执行命令
//
// action 安装行为install upgrade rollback
func (r NeVersion) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) {
neInfo := r.neInfoService.FindByNeId(neVersion.NeID)
if neInfo.ID != neVersion.NeID {
return "", fmt.Errorf("neinfo not found")
}
// 网元主机的SSH客户端
sshClient, err := r.neInfoService.NeRunSSHClient(neVersion.CoreUID, neVersion.NeUID)
sshClient, err := r.neInfoService.NeRunSSHClient(neVersion.NeID)
if err != nil {
return "", err
}
@@ -161,19 +190,19 @@ func (r NeVersion) Operate(action string, neVersion model.NeVersion, preinput ma
if para5GMap == nil || err != nil {
return "", fmt.Errorf("error read para5G file info")
}
if err := r.neInfoService.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.CoreUID, neVersion.NeUID)}); err != nil {
if err := r.neInfoService.NeConfPara5GWirte(para5GMap, []string{neInfo.NeUid}); err != nil {
return "", fmt.Errorf("error wirte para5G file info")
}
}
// ========= 命令生成阶段 =========
okFlagStr, cmdStrArr, err := r.operateCommand(action, neVersion.NeType, neFilePaths)
okFlagStr, cmdStrArr, err := r.operateCommand(action, neInfo.NeType, neFilePaths)
if err != nil {
return "", err
}
// ========= 执行阶段 =========
commandLine, err := r.operateRun(sshClient, preinput, cmdStrArr, neVersion.NeType, okFlagStr)
commandLine, err := r.operateRun(sshClient, preinput, cmdStrArr, neInfo.NeType, okFlagStr)
if err != nil {
return "", err
}
@@ -693,8 +722,8 @@ func (r NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]string
func (r NeVersion) operateDome(action string, neVersion model.NeVersion) error {
if action == "install" {
// 网元信息
neInfo := r.neInfoService.FindByCoreUidAndNeUid(neVersion.CoreUID, neVersion.NeUID)
if neInfo.CoreUID != neVersion.CoreUID || neInfo.NeUID != neVersion.NeUID {
neInfo := r.neInfoService.FindByNeId(neVersion.NeID)
if neInfo.ID != neVersion.NeID {
return fmt.Errorf("error found neinfo")
}
@@ -714,31 +743,31 @@ func (r NeVersion) operateDome(action string, neVersion model.NeVersion) error {
smsHost := fmt.Sprintf("sudo sed -i '/^%s smsc.*smsc$/c\\' /etc/hosts", para5GData["SIP_IP"])
// IMS 配置
imsNEs := r.neInfoService.Find(model.NeInfo{NeType: "IMS"}, false, false)
imsNEs := r.neInfoService.FindByNeType("IMS")
for _, v := range imsNEs {
r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscIPCMD)
r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscHostCMD)
r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smsHost)
r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, "sudo sed -i '/^#!define WITH_SMS/ s/^/#/' /usr/local/etc/ims/vars.cfg")
r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, "ims-stop || true && ims-start")
r.neInfoService.NeRunSSHCmd(v.ID, smscIPCMD)
r.neInfoService.NeRunSSHCmd(v.ID, smscHostCMD)
r.neInfoService.NeRunSSHCmd(v.ID, smsHost)
r.neInfoService.NeRunSSHCmd(v.ID, "sudo sed -i '/^#!define WITH_SMS/ s/^/#/' /usr/local/etc/ims/vars.cfg")
r.neInfoService.NeRunSSHCmd(v.ID, "ims-stop || true && ims-start")
}
// UDM 配置
smscASName := fmt.Sprintf("sudo sed -i \"/- name: 'sms_as'/{n;s|serverName: .*|serverName: 'sip:%s:5060'|}\" /usr/local/etc/udm/as.yaml", para5GData["SMSC_IP"])
smscASAddress := fmt.Sprintf("sudo sed -i \"/- name: 'sms_as'/{n;n;n;s|diameterAddress: .*|diameterAddress: 'smsc.ims.%s.3gppnetwork.org'|}\" /usr/local/etc/udm/as.yaml", mnc_mcc)
udmNEs := r.neInfoService.Find(model.NeInfo{NeType: "UDM"}, false, false)
udmNEs := r.neInfoService.FindByNeType("UDM")
for _, v := range udmNEs {
r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscIPCMD)
r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscHostCMD)
r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscASName)
r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscASAddress)
r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, "sudo service udm restart")
r.neInfoService.NeRunSSHCmd(v.ID, smscIPCMD)
r.neInfoService.NeRunSSHCmd(v.ID, smscHostCMD)
r.neInfoService.NeRunSSHCmd(v.ID, smscASName)
r.neInfoService.NeRunSSHCmd(v.ID, smscASAddress)
r.neInfoService.NeRunSSHCmd(v.ID, "sudo service udm restart")
}
}
}
// 更新Version
verInfo := r.FindByCoreUidAndNeUid(neVersion.CoreUID, neVersion.NeUID)
if verInfo.CoreUID == neVersion.CoreUID && verInfo.NeUID == neVersion.NeUID {
verInfo := r.FindById(neVersion.NeID)
if verInfo.NeID == neVersion.NeID {
curName := verInfo.Name
curVersion := verInfo.Version
curPath := verInfo.Path

View File

@@ -61,6 +61,17 @@ func (s AlarmController) List(c *gin.Context) {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
if query.NeUID != "" {
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg("neInfo not found"))
return
}
query.NeID = neInfo.ID
}
// 查询数据
rows, total := s.alarmService.FindByPage(query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
@@ -99,8 +110,7 @@ func (s AlarmController) Remove(c *gin.Context) {
// PUT /clear
func (s AlarmController) Clear(c *gin.Context) {
var body struct {
CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识
Id int64 `json:"id" binding:"required"`
ID string `form:"id" json:"id" binding:"required"` // 记录ID 批量多个逗号分隔
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -108,10 +118,17 @@ func (s AlarmController) Clear(c *gin.Context) {
return
}
// 处理字符转id数组后去重
uniqueIDs := parse.RemoveDuplicatesToArray(body.ID, ",")
// 转换成int64数组类型
ids := make([]int64, 0)
for _, v := range uniqueIDs {
ids = append(ids, parse.Number(v))
}
clearUser := reqctx.LoginUserToUserName(c)
rows, err := s.alarmService.ClearById(
body.Id,
body.CoreUID,
rows, err := s.alarmService.ClearByIds(
ids,
clearUser,
constants.ALARM_CLEAR_TYPE_MANUAL_CLEAR,
)
@@ -127,9 +144,7 @@ func (s AlarmController) Clear(c *gin.Context) {
// PUT /ack
func (s AlarmController) Ack(c *gin.Context) {
var body struct {
CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识
Id int64 `json:"id" binding:"required"`
AckState bool `json:"ackState" binding:"omitempty"`
ID string `form:"id" json:"id" binding:"required"` // 记录ID 批量多个逗号分隔
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -137,10 +152,17 @@ func (s AlarmController) Ack(c *gin.Context) {
return
}
// 处理字符转id数组后去重
uniqueIDs := parse.RemoveDuplicatesToArray(body.ID, ",")
// 转换成int64数组类型
ids := make([]int64, 0)
for _, v := range uniqueIDs {
ids = append(ids, parse.Number(v))
}
ackUser := reqctx.LoginUserToUserName(c)
rows, err := s.alarmService.AckById(
body.Id,
body.CoreUID,
rows, err := s.alarmService.AckByIds(
ids,
ackUser,
constants.ALARM_ACK_STATE_ACK,
)
@@ -156,7 +178,6 @@ func (s AlarmController) Ack(c *gin.Context) {
// GET /count/severity
func (s AlarmController) CountSeverity(c *gin.Context) {
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态
}
if err := c.ShouldBindQuery(&query); err != nil {
@@ -165,7 +186,7 @@ func (s AlarmController) CountSeverity(c *gin.Context) {
return
}
data := s.alarmService.CountSeverity(query.CoreUID, query.AlarmStatus)
data := s.alarmService.CountSeverity(query.AlarmStatus)
c.JSON(200, resp.OkData(data))
}
@@ -174,7 +195,6 @@ func (s AlarmController) CountSeverity(c *gin.Context) {
// GET /count/type
func (s AlarmController) CountType(c *gin.Context) {
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态
}
if err := c.ShouldBindQuery(&query); err != nil {
@@ -183,7 +203,7 @@ func (s AlarmController) CountType(c *gin.Context) {
return
}
data := s.alarmService.CountType(query.CoreUID, query.AlarmStatus)
data := s.alarmService.CountType(query.AlarmStatus)
c.JSON(200, resp.OkData(data))
}
@@ -192,7 +212,6 @@ func (s AlarmController) CountType(c *gin.Context) {
// GET /count/top
func (s AlarmController) CountTop(c *gin.Context) {
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态
Top int `json:"top" form:"top" binding:"required"` // 前几
}
@@ -202,7 +221,7 @@ func (s AlarmController) CountTop(c *gin.Context) {
return
}
data := s.alarmService.CountNe(query.CoreUID, query.AlarmStatus, query.Top)
data := s.alarmService.CountNe(query.AlarmStatus, query.Top)
c.JSON(200, resp.OkData(data))
}
@@ -239,10 +258,17 @@ func (s AlarmController) Export(c *gin.Context) {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 限制导出数据集
if query.PageSize > 10000 {
query.PageSize = 10000
if query.NeUID != "" {
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg("neInfo not found"))
return
}
query.NeID = neInfo.ID
}
// 查询数据
rows, total := s.alarmService.FindByPage(query)
if total == 0 {

View File

@@ -66,9 +66,9 @@ func (s BackupController) FTPInfo(c *gin.Context) {
// POST /ftp
func (s BackupController) FTPPush(c *gin.Context) {
var body struct {
Path string `form:"path" binding:"required"` // 路径必须是 BACKUP_DIR 开头的路径
Filename string `form:"fileName" binding:"required"`
Tag string `form:"tag" binding:"required"` // 标签,用于区分不同的备份文件
Path string `json:"path" binding:"required"` // 路径必须是 BACKUP_DIR 开头的路径
Filename string `json:"fileName" binding:"required"`
Tag string `json:"tag" binding:"required"` // 标签,用于区分不同的备份文件
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))

View File

@@ -47,22 +47,22 @@ type KPIController struct {
// @Router /ne/data/kpi/data [get]
func (s KPIController) KPIData(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys model.KPIQuery
if err := c.ShouldBindQuery(&querys); err != nil {
var query model.KPIQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 查询数据
kpiData := s.kpiReportService.FindData(querys)
kpiData := s.kpiReportService.FindData(neInfo.NeType, neInfo.ID, query)
c.JSON(200, resp.OkData(kpiData))
}

View File

@@ -49,22 +49,22 @@ type KPICController struct {
// @Router /ne/data/kpic/data [get]
func (s KPICController) KPIData(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys model.KPICQuery
if err := c.ShouldBindQuery(&querys); err != nil {
var query model.KPICQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 查询数据
kpiData := s.kpicReportService.FindData(querys)
kpiData := s.kpicReportService.FindData(neInfo.NeType, neInfo.ID, query)
c.JSON(200, resp.OkData(kpiData))
}

View File

@@ -49,7 +49,6 @@ type NBStateController struct {
// @Description Base Station Status List
// @Router /nb-state/list [get]
func (s NBStateController) List(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query model.NBStateQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -57,12 +56,13 @@ func (s NBStateController) List(c *gin.Context) {
return
}
// 查询网元信息 rmUID
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg("neInfo not found"))
return
}
query.NeID = neInfo.ID
// 查询数据
rows, total := s.nbStateService.FindByPage(query)
@@ -85,24 +85,23 @@ func (s NBStateController) List(c *gin.Context) {
func (s NBStateController) Export(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
// 查询结果,根据查询条件结果,单页最大值限制
var querys model.NBStateQuery
if err := c.ShouldBindBodyWithJSON(&querys); err != nil {
var query model.NBStateQuery
if err := c.ShouldBindBodyWithJSON(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 限制导出数据集
if querys.PageSize > 10000 {
querys.PageSize = 10000
}
// 查询网元信息 rmUID
neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg("neInfo not found"))
return
}
query.NeID = neInfo.ID
rows, total := s.nbStateService.FindByPage(querys)
// 查询数据
rows, total := s.nbStateService.FindByPage(query)
if total == 0 {
// 导出数据记录为空
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty")))

View File

@@ -46,13 +46,21 @@ type NEStateController struct {
// @Description NE Status Record - Memory/CPU/Disk List
// @Router /ne-state/list [get]
func (s NEStateController) List(c *gin.Context) {
var query model.NEStateQuery
var query model.NeStateQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg("neInfo not found"))
return
}
query.NeID = neInfo.ID
// 查询数据
rows, total := s.neStateService.FindByPage(query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))

View File

@@ -3,14 +3,13 @@ package model
// Alarm 告警记录
type Alarm struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间
AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 同网元类型连续递增
AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID
AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题
AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码
EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间
EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 产生时间
AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型
OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度
PerceivedSeverity string `json:"perceivedSeverity" gorm:"column:perceived_severity"` // 告警级别
@@ -28,7 +27,12 @@ type Alarm struct {
ClearType string `json:"clearType" gorm:"column:clear_type"` // 清除状态
ClearTime int64 `json:"clearTime" gorm:"column:clear_time"` // 清除时间
ClearUser string `json:"clearUser" gorm:"column:clear_user"` // 清除用户
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒
// ====== 非数据库字段属性 ======
NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识
NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称
NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型
}
// TableName 表名称
@@ -38,17 +42,16 @@ func (*Alarm) TableName() string {
// AlarmQuery 告警数据查询参数结构体
type AlarmQuery struct {
CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识
NeType string `json:"neType" form:"neType"` // 网元类型
NeUID string `json:"neUid" form:"neUid"` // 网唯一标识
NeID int64 `json:"neId" form:"neId"` // 网元ID
AlarmCode string `json:"alarmCode" form:"alarmCode"`
AlarmType string `json:"alarmType" form:"alarmType"`
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=Clear Active"` // 告警状态
OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型
BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time
BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查created_time
EndTime int64 `json:"endTime" form:"endTime"`
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段
SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序asc desc
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=createdTime id"` // 排序字段,填写结果字段
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"`
}

View File

@@ -3,14 +3,13 @@ package model
// AlarmEvent 告警_事件记录表
type AlarmEvent struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间
AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增
AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID
AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题
AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码
EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间
EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 产生时间
ObjectUid string `json:"objectUid" gorm:"column:object_uid"` // 对象ID
ObjectName string `json:"objectName" gorm:"column:object_name"` // 对象名称
ObjectType string `json:"objectType" gorm:"column:object_type"` // 对象类型
@@ -22,7 +21,12 @@ type AlarmEvent struct {
ClearType string `json:"clearType" gorm:"column:clear_type"` // 清除状态
ClearTime int64 `json:"clearTime" gorm:"column:clear_time"` // 清除时间
ClearUser string `json:"clearUser" gorm:"column:clear_user"` // 清除用户
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒
// ====== 非数据库字段属性 ======
NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识
NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称
NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型
}
// TableName 表名称
@@ -32,15 +36,14 @@ func (*AlarmEvent) TableName() string {
// AlarmEventQuery 告警事件数据查询参数结构体
type AlarmEventQuery struct {
CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识
NeType string `json:"neType" form:"neType"` // 网元类型
NeUID string `json:"neUid" form:"neUid"` // 网唯一标识
NeID int64 `json:"neId" form:"neId"` // 网元ID
AlarmCode string `json:"alarmCode" form:"alarmCode"`
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=Clear Active"` // 告警状态
BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time
BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查created_time
EndTime int64 `json:"endTime" form:"endTime"`
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段
SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序asc desc
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=createdTime eventTime id"` // 排序字段,填写结果字段
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"`
}

View File

@@ -3,21 +3,25 @@ package model
// AlarmForwardLog 告警_转发日志记录
type AlarmForwardLog struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增
AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID
AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码
AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题
AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态
AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型
OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度
EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间
Type string `json:"type" gorm:"column:type"` // 转发方式 SMS/EMAIL/SMSC
Target string `json:"target" gorm:"column:target"` // 发送目标用户
Result string `json:"result" gorm:"column:result"` // 发送结果
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间
AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增
AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID
AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码
AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题
AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态
AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型
OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度
EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 产生时间
Type string `json:"type" gorm:"column:type"` // 转发方式 SMS/EMAIL/SMSC
Target string `json:"target" gorm:"column:target"` // 发送目标用户
Result string `json:"result" gorm:"column:result"` // 发送结果
// ====== 非数据库字段属性 ======
NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识
NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称
NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型
}
// TableName 表名称
@@ -27,13 +31,12 @@ func (*AlarmForwardLog) TableName() string {
// AlarmForwardLogQuery 告警转发日志数据查询参数结构体
type AlarmForwardLogQuery struct {
CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识
NeType string `json:"neType" form:"neType"` // 网元类型
BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间
NeUID string `json:"neUid" form:"neUid"` // 网唯一标识
NeID int64 `json:"neId" form:"neId"` // 网元ID
BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查created_time
EndTime int64 `json:"endTime" form:"endTime"`
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段
SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序asc desc
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=createdTime eventTime id"` // 排序字段,填写结果字段
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"`
}

View File

@@ -3,18 +3,22 @@ package model
// AlarmLog 告警_日志记录
type AlarmLog struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增
AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID
AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码
AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题
AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态
AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型
OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度
EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间
AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增
AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID
AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码
AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题
AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态
AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型
OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度
EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 产生时间
// ====== 非数据库字段属性 ======
NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识
NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称
NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型
}
// TableName 表名称
@@ -24,15 +28,14 @@ func (*AlarmLog) TableName() string {
// AlarmLogQuery 告警日志数据查询参数结构体
type AlarmLogQuery struct {
CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识
NeType string `json:"neType" form:"neType"` // 网元类型
NeID int64 `json:"neId" form:"neId"` // 网元ID
AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=Clear Active"` // 告警状态
OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型
BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time
BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查created_time
EndTime int64 `json:"endTime" form:"endTime"`
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段
SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序asc desc
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=createdTime eventTime id"` // 排序字段,填写结果字段
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"`
}

View File

@@ -22,16 +22,12 @@ func (*KpiCTitle) TableName() string {
// KpiCReport 自定义指标报表信息对象
type KpiCReport struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
Date string `json:"date" gorm:"column:date"` // Date of the report yyyy-mm-dd hh:mi:ss
StartTime string `json:"startTime" gorm:"column:start_time"` // Start time of the report hh:mi:ss
EndTime string `json:"endTime" gorm:"column:end_time"` // End time of the report hh:mi:ss
Index int64 `json:"index" gorm:"column:index"` // Index of the report
Granularity int64 `json:"granularity" gorm:"column:granularity"` // Time granualarity: 5/10/.../60/300 (second)
KpiValues string `json:"kpiValues" gorm:"column:kpi_values"` // KPI values JSON String
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // Creation time
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间
RecordTime int64 `json:"recordTime" gorm:"column:record_time"` // 记录时间
Index int64 `json:"index" gorm:"column:index"` // Index of the report
Granularity int64 `json:"granularity" gorm:"column:granularity"` // Time granualarity: 5/10/.../60/300 (second)
KpiValues string `json:"kpiValues" gorm:"column:kpi_values"` // KPI values JSON String
}
// TableName 表名称
@@ -41,11 +37,9 @@ func (*KpiCReport) TableName() string {
// KPICQuery 指标查询参数结构体
type KPICQuery struct {
CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型
BeginTime int64 `form:"beginTime" binding:"required"` // 开始时间戳毫秒1739361200999
EndTime int64 `form:"endTime" binding:"required"` // 结束时间戳毫秒1739361210088
NeUID string `json:"neUid" form:"neUid"` // 网唯一标识
BeginTime int64 `form:"beginTime" binding:"required"` // 开始时间戳毫秒1739361200999
EndTime int64 `form:"endTime" binding:"required"` // 结束时间戳毫秒1739361210088
Interval int64 `form:"interval" binding:"required,oneof=5 60 300 900 1800 3600"`
RmUID string `form:"rmUID"`
SortField string `form:"sortField" binding:"omitempty,oneof=timeGroup"`

View File

@@ -19,16 +19,12 @@ func (*KpiTitle) TableName() string {
// KpiReport 指标报表信息对象
type KpiReport struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
Date string `json:"date" gorm:"column:date"` // Date of the report yyyy-mm-dd hh:mi:ss
StartTime string `json:"startTime" gorm:"column:start_time"` // Start time of the report hh:mi:ss
EndTime string `json:"endTime" gorm:"column:end_time"` // End time of the report hh:mi:ss
Index int64 `json:"index" gorm:"column:index"` // Index of the report
Granularity int64 `json:"granularity" gorm:"column:granularity"` // Time granualarity: 5/10/.../60/300 (second)
KpiValues string `json:"kpiValues" gorm:"column:kpi_values"` // KPI values JSON String
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // Creation time 接收到的timestamp秒级存储毫秒时间戳
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间
RecordTime int64 `json:"recordTime" gorm:"column:record_time"` // 记录时间
Index int64 `json:"index" gorm:"column:index"` // Index of the report
Granularity int64 `json:"granularity" gorm:"column:granularity"` // Time granualarity: 5/10/.../60/300 (second)
KpiValues string `json:"kpiValues" gorm:"column:kpi_values"` // KPI values JSON String
}
// TableName 表名称
@@ -38,11 +34,9 @@ func (*KpiReport) TableName() string {
// KPIQuery 指标查询参数结构体
type KPIQuery struct {
CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型
BeginTime int64 `form:"beginTime" binding:"required"` // 开始时间戳毫秒1739361200999
EndTime int64 `form:"endTime" binding:"required"` // 结束时间戳毫秒1739361210088
NeUID string `json:"neUid" form:"neUid"` // 网唯一标识
BeginTime int64 `form:"beginTime" binding:"required"` // 开始时间戳毫秒1739361200999
EndTime int64 `form:"endTime" binding:"required"` // 结束时间戳毫秒1739361210088
Interval int64 `form:"interval" binding:"required,oneof=5 60 300 900 1800 3600"`
SortField string `form:"sortField" binding:"omitempty,oneof=timeGroup"`
SortOrder string `form:"sortOrder" binding:"omitempty,oneof=asc desc"`

View File

@@ -3,16 +3,14 @@ package model
// NBState 基站状态记录表 nb_state
type NBState struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
Address string `json:"address" gorm:"column:address"` // 基站IP地址
NbName string `json:"nbName" gorm:"column:nb_name"` // 基站设备名称
Name string `json:"name" gorm:"column:name"` // 基站名称
Position string `json:"position" gorm:"column:position"` // 基站位置
State string `json:"state" gorm:"column:state"` // 基站状态 OFF ON
Time string `json:"time" gorm:"column:time"` // 状态时间
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
Address string `json:"address" gorm:"column:address"` // 基站IP地址
NbName string `json:"nbName" gorm:"column:nb_name"` // 基站设备名称
Name string `json:"name" gorm:"column:name"` // 基站名称
Position string `json:"position" gorm:"column:position"` // 基站位置
State string `json:"state" gorm:"column:state"` // 基站状态 OFF ON
Time string `json:"time" gorm:"column:time"` // 状态时间
}
// TableName 表名称
@@ -22,14 +20,13 @@ func (*NBState) TableName() string {
// NBStateQuery 查询参数结构体
type NBStateQuery struct {
CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" form:"neType"` // 网元类型
NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网唯一标识
NeID int64 `json:"neId" form:"neId"` // 网元ID
PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"`
PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"`
Status string `json:"status" form:"status"`
StartTime string `json:"startTime" form:"startTime"`
EndTime string `json:"endTime" form:"endTime"`
StartTime int64 `json:"startTime" form:"startTime"`
EndTime int64 `json:"endTime" form:"endTime"`
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=id create_time"` // 排序字段,填写结果字段
SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序asc desc
}

View File

@@ -1,37 +1,30 @@
package model
// NEState 网元状态记录表 ne_state
type NEState struct {
// NeState 网元_状态记录内存/CPU/磁盘
type NeState struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
Version string `json:"version" gorm:"column:version"` // 版本
Capability int64 `json:"capability" gorm:"column:capability"` // 用户容量
SerialNum string `json:"serialNum" gorm:"column:serial_num"` // 序列号
ExpiryDate string `json:"expiryDate" gorm:"column:expiry_date"` // 许可证到期日期
SysCpuUsage float64 `json:"sysCpuUsage" gorm:"column:sys_cpu_usage"` // cpu使用率-sys
SysMemUsage float64 `json:"sysMemUsage" gorm:"column:sys_mem_usage"` // 内存使用率-sys
SysDiskUsage float64 `json:"sysDiskUsage" gorm:"column:sys_disk_usage"` // 磁盘使用率-sys
NfCpuUsage float64 `json:"nfCpuUsage" gorm:"column:nf_cpu_usage"` // cpu使用率-nf
NfMemUsed int64 `json:"nfMemUsed" gorm:"column:nf_mem_used"` // 内存使用KB-nf
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
SysCpuUsage float64 `json:"sysCpuUsage" gorm:"column:sys_cpu_usage"` // cpu使用率-sys
SysMemUsage float64 `json:"sysMemUsage" gorm:"column:sys_mem_usage"` // 内存使用率-sys
SysDiskUsage float64 `json:"sysDiskUsage" gorm:"column:sys_disk_usage"` // 磁盘使用率-sys
NfCpuUsage float64 `json:"nfCpuUsage" gorm:"column:nf_cpu_usage"` // cpu使用率-nf
NfMemUsed int64 `json:"nfMemUsed" gorm:"column:nf_mem_used"` // 内存使用KB-nf
}
// TableName 表名称
func (*NEState) TableName() string {
func (*NeState) TableName() string {
return "ne_state"
}
// NEStateQuery 查询参数结构体
type NEStateQuery struct {
CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" form:"neType"` // 网元类型
type NeStateQuery struct {
NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网唯一标识
NeID int64 `json:"neId" form:"neId"` // 网元ID
PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"`
PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"`
BeginTime string `json:"beginTime" form:"beginTime"`
EndTime string `json:"endTime" form:"endTime"`
BeginTime int64 `json:"beginTime" form:"beginTime"`
EndTime int64 `json:"endTime" form:"endTime"`
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=id create_time"` // 排序字段,填写结果字段
SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序asc desc
}

View File

@@ -1,6 +1,7 @@
package repository
import (
"sort"
"strings"
"time"
@@ -19,14 +20,8 @@ type Alarm struct{}
func (r Alarm) SelectByPage(query model.AlarmQuery) ([]model.Alarm, int64) {
tx := db.DB("").Model(&model.Alarm{})
// 查询条件拼接
if query.NeType != "" {
tx = tx.Where("ne_type = ?", query.NeType)
}
if query.NeUID != "" {
tx = tx.Where("ne_uid = ?", query.NeUID)
}
if query.CoreUID != "" {
tx = tx.Where("core_uid = ?", query.CoreUID)
if query.NeID != 0 {
tx = tx.Where("ne_id = ?", query.NeID)
}
if query.AlarmCode != "" {
tx = tx.Where("alarm_code = ?", query.AlarmCode)
@@ -40,12 +35,11 @@ func (r Alarm) SelectByPage(query model.AlarmQuery) ([]model.Alarm, int64) {
if query.OrigSeverity != "" {
tx = tx.Where("orig_severity in (?)", strings.Split(query.OrigSeverity, ","))
}
if query.BeginTime != 0 {
tx = tx.Where("event_time >= ?", query.BeginTime)
tx = tx.Where("created_time >= ?", query.BeginTime)
}
if query.EndTime != 0 {
tx = tx.Where("event_time <= ?", query.EndTime)
tx = tx.Where("created_time <= ?", query.EndTime)
}
// 查询结果
@@ -57,38 +51,75 @@ func (r Alarm) SelectByPage(query model.AlarmQuery) ([]model.Alarm, int64) {
return rows, total
}
// 排序
if query.SortField != "" {
sortField := query.SortField
if query.SortOrder == "desc" {
sortField = sortField + " desc"
}
tx = tx.Order(sortField)
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize)
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
// 关联查询
tx = tx.Joins("left join ne_info on ne_info.id = alarm.ne_id")
tx = tx.Select("alarm.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid")
err := tx.Find(&rows).Error
if err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows, total
}
// 排序
r.sortRows(query.SortField, query.SortOrder, rows)
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id createdTime eventTime
// sortOrder 排序顺序 升序asc 降序desc
func (r Alarm) sortRows(sortField, sortOrder string, rows []model.Alarm) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.Alarm) any{
"id": func(row *model.Alarm) any { return row.ID },
"eventTime": func(row *model.Alarm) any { return row.EventTime },
"createdTime": func(row *model.Alarm) any { return row.CreatedTime },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// Select 查询集合
func (r Alarm) Select(param model.Alarm) []model.Alarm {
tx := db.DB("").Model(&model.Alarm{})
// 查询条件拼接
if param.NeType != "" {
tx = tx.Where("ne_type = ?", param.NeType)
}
if param.NeUID != "" {
tx = tx.Where("ne_uid = ?", param.NeUID)
}
if param.CoreUID != "" {
tx = tx.Where("core_uid = ?", param.CoreUID)
if param.NeID != 0 {
tx = tx.Where("ne_id = ?", param.NeID)
}
if param.AlarmCode > 0 {
tx = tx.Where("alarm_code = ?", param.AlarmCode)
@@ -132,8 +163,8 @@ func (r Alarm) SelectByIds(ids []int64) []model.Alarm {
// Insert 新增信息 返回新增数据ID
func (r Alarm) Insert(param model.Alarm) int64 {
if param.CreatedAt == 0 {
param.CreatedAt = time.Now().UnixMilli()
if param.CreatedTime == 0 {
param.CreatedTime = time.Now().UnixMilli()
}
// 执行插入
if err := db.DB("").Create(&param).Error; err != nil {
@@ -151,7 +182,7 @@ func (r Alarm) Update(param model.Alarm) int64 {
tx := db.DB("").Model(&model.Alarm{})
// 构建查询条件
tx = tx.Where("id = ?", param.ID)
tx = tx.Omit("id", "created_at")
tx = tx.Omit("id", "created_time")
// 执行更新
if err := tx.Updates(param).Error; err != nil {
logger.Errorf("update err => %v", err.Error())
@@ -174,9 +205,9 @@ func (r Alarm) DeleteByIds(ids []int64) int64 {
}
// SelectAlarmSeqLast 查询网元告警最后一条序号
func (r Alarm) SelectAlarmSeqLast(coreUid, neUid string) int64 {
func (r Alarm) SelectAlarmSeqLast(neId int64) int64 {
tx := db.DB("").Model(&model.Alarm{})
tx = tx.Where("core_uid=? and ne_uid=?", coreUid, neUid)
tx = tx.Where("ne_id=?", neId)
tx = tx.Select("alarm_seq").Order("alarm_seq DESC")
// 查询数据
var alarmSeq int64 = 0
@@ -188,10 +219,10 @@ func (r Alarm) SelectAlarmSeqLast(coreUid, neUid string) int64 {
}
// GroupTotal 分组统计
func (r Alarm) GroupTotal(coreUid, alarmStatus string, group string, limit int) []map[string]any {
func (r Alarm) GroupTotal(alarmStatus string, group string, limit int) []map[string]any {
tx := db.DB("").Model(&model.Alarm{})
tx = tx.Select("count(*) as total", group)
tx = tx.Where("core_uid=? and alarm_status=? ", coreUid, alarmStatus)
tx = tx.Where("alarm_status=? ", alarmStatus)
tx = tx.Group(group).Order("total DESC")
// 查询数据
var rows []map[string]any = make([]map[string]any, 0)

View File

@@ -2,6 +2,7 @@ package repository
import (
"fmt"
"sort"
"time"
"be.ems/src/framework/database/db"
@@ -19,14 +20,8 @@ type AlarmEvent struct{}
func (r AlarmEvent) SelectByPage(query model.AlarmEventQuery) ([]model.AlarmEvent, int64) {
tx := db.DB("").Model(&model.AlarmEvent{})
// 查询条件拼接
if query.NeType != "" {
tx = tx.Where("ne_type = ?", query.NeType)
}
if query.NeUID != "" {
tx = tx.Where("ne_uid = ?", query.NeUID)
}
if query.CoreUID != "" {
tx = tx.Where("core_uid = ?", query.CoreUID)
if query.NeID != 0 {
tx = tx.Where("ne_id = ?", query.NeID)
}
if query.AlarmCode != "" {
tx = tx.Where("alarm_code like ?", fmt.Sprintf("%s%%", query.AlarmCode))
@@ -50,38 +45,75 @@ func (r AlarmEvent) SelectByPage(query model.AlarmEventQuery) ([]model.AlarmEven
return rows, total
}
// 排序
if query.SortField != "" {
sortField := query.SortField
if query.SortOrder == "desc" {
sortField = sortField + " desc"
}
tx = tx.Order(sortField)
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize)
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
// 关联查询
tx = tx.Joins("left join ne_info on ne_info.id = alarm_event.ne_id")
tx = tx.Select("alarm_event.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid")
err := tx.Find(&rows).Error
if err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows, total
}
// 排序
r.sortRows(query.SortField, query.SortOrder, rows)
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id createdTime eventTime
// sortOrder 排序顺序 升序asc 降序desc
func (r AlarmEvent) sortRows(sortField, sortOrder string, rows []model.AlarmEvent) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.AlarmEvent) any{
"id": func(row *model.AlarmEvent) any { return row.ID },
"eventTime": func(row *model.AlarmEvent) any { return row.EventTime },
"createdTime": func(row *model.AlarmEvent) any { return row.CreatedTime },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// Select 查询集合
func (r AlarmEvent) Select(param model.AlarmEvent) []model.AlarmEvent {
tx := db.DB("").Model(&model.AlarmEvent{})
// 查询条件拼接
if param.NeType != "" {
tx = tx.Where("ne_type = ?", param.NeType)
}
if param.NeUID != "" {
tx = tx.Where("ne_uid = ?", param.NeUID)
}
if param.CoreUID != "" {
tx = tx.Where("core_uid = ?", param.CoreUID)
if param.NeID != 0 {
tx = tx.Where("ne_id = ?", param.NeID)
}
if param.AlarmId != "" {
tx = tx.Where("alarm_id = ?", param.AlarmId)
@@ -120,8 +152,8 @@ func (r AlarmEvent) SelectByIds(ids []int64) []model.AlarmEvent {
// Insert 新增信息 返回新增数据ID
func (r AlarmEvent) Insert(param model.AlarmEvent) int64 {
if param.CreatedAt == 0 {
param.CreatedAt = time.Now().UnixMilli()
if param.CreatedTime == 0 {
param.CreatedTime = time.Now().UnixMilli()
}
// 执行插入
if err := db.DB("").Create(&param).Error; err != nil {
@@ -139,7 +171,7 @@ func (r AlarmEvent) Update(param model.AlarmEvent) int64 {
tx := db.DB("").Model(&model.AlarmEvent{})
// 构建查询条件
tx = tx.Where("id = ?", param.ID)
tx = tx.Omit("id", "created_at")
tx = tx.Omit("id", "created_time")
// 执行更新
if err := tx.Updates(param).Error; err != nil {
logger.Errorf("update err => %v", err.Error())
@@ -162,9 +194,9 @@ func (r AlarmEvent) DeleteByIds(ids []int64) int64 {
}
// SelectAlarmEventSeqLast 查询网元告警最后一条序号
func (r AlarmEvent) SelectAlarmEventSeqLast(coreUid, neUid string) int64 {
func (r AlarmEvent) SelectAlarmEventSeqLast(neID int64) int64 {
tx := db.DB("").Model(&model.AlarmEvent{})
tx = tx.Where("core_uid=? and ne_uid=?", coreUid, neUid)
tx = tx.Where("ne_id=?", neID)
tx = tx.Select("alarm_seq").Order("alarm_seq DESC")
// 查询数据
var AlarmEventSeq int64 = 0

View File

@@ -1,6 +1,7 @@
package repository
import (
"sort"
"time"
"be.ems/src/framework/database/db"
@@ -18,20 +19,14 @@ type AlarmForwardLog struct{}
func (r AlarmForwardLog) SelectByPage(query model.AlarmForwardLogQuery) ([]model.AlarmForwardLog, int64) {
tx := db.DB("").Model(&model.AlarmForwardLog{})
// 查询条件拼接
if query.NeType != "" {
tx = tx.Where("ne_type = ?", query.NeType)
}
if query.NeUID != "" {
tx = tx.Where("ne_uid = ?", query.NeUID)
}
if query.CoreUID != "" {
tx = tx.Where("core_uid = ?", query.CoreUID)
if query.NeID != 0 {
tx = tx.Where("ne_id = ?", query.NeID)
}
if query.BeginTime != 0 {
tx = tx.Where("created_at >= ?", query.BeginTime)
tx = tx.Where("created_time >= ?", query.BeginTime)
}
if query.EndTime != 0 {
tx = tx.Where("created_at <= ?", query.EndTime)
tx = tx.Where("created_time <= ?", query.EndTime)
}
// 查询结果
@@ -43,26 +38,69 @@ func (r AlarmForwardLog) SelectByPage(query model.AlarmForwardLogQuery) ([]model
return rows, total
}
// 排序
if query.SortField != "" {
sortField := query.SortField
if query.SortOrder == "desc" {
sortField = sortField + " desc"
}
tx = tx.Order(sortField)
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize)
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
// 关联查询
tx = tx.Joins("left join ne_info on ne_info.id = alarm_forward_log.ne_id")
tx = tx.Select("alarm_forward_log.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid")
err := tx.Find(&rows).Error
if err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows, total
}
// 排序
r.sortRows(query.SortField, query.SortOrder, rows)
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id createdTime eventTime
// sortOrder 排序顺序 升序asc 降序desc
func (r AlarmForwardLog) sortRows(sortField, sortOrder string, rows []model.AlarmForwardLog) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.AlarmForwardLog) any{
"id": func(row *model.AlarmForwardLog) any { return row.ID },
"eventTime": func(row *model.AlarmForwardLog) any { return row.EventTime },
"createdTime": func(row *model.AlarmForwardLog) any { return row.CreatedTime },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// SelectByIds 通过ID查询
func (r AlarmForwardLog) SelectByIds(ids []int64) []model.AlarmForwardLog {
rows := []model.AlarmForwardLog{}
@@ -95,8 +133,8 @@ func (r AlarmForwardLog) DeleteByIds(ids []int64) int64 {
// Insert 新增信息
func (r AlarmForwardLog) Insert(param model.AlarmForwardLog) int64 {
if param.CreatedAt == 0 {
param.CreatedAt = time.Now().UnixMilli()
if param.CreatedTime == 0 {
param.CreatedTime = time.Now().UnixMilli()
}
// 执行插入
if err := db.DB("").Create(&param).Error; err != nil {

View File

@@ -1,6 +1,7 @@
package repository
import (
"sort"
"time"
"be.ems/src/framework/database/db"
@@ -18,23 +19,17 @@ type AlarmLog struct{}
func (r AlarmLog) SelectByPage(query model.AlarmLogQuery) ([]model.AlarmLog, int64) {
tx := db.DB("").Model(&model.AlarmLog{})
// 查询条件拼接
if query.NeType != "" {
tx = tx.Where("ne_type = ?", query.NeType)
}
if query.NeUID != "" {
tx = tx.Where("ne_uid = ?", query.NeUID)
}
if query.CoreUID != "" {
tx = tx.Where("core_uid = ?", query.CoreUID)
if query.NeID != 0 {
tx = tx.Where("ne_id = ?", query.NeID)
}
if query.AlarmStatus != "" {
tx = tx.Where("alarm_status = ?", query.AlarmStatus)
}
if query.BeginTime != 0 {
tx = tx.Where("created_at >= ?", query.BeginTime)
tx = tx.Where("created_time >= ?", query.BeginTime)
}
if query.EndTime != 0 {
tx = tx.Where("created_at <= ?", query.EndTime)
tx = tx.Where("created_time <= ?", query.EndTime)
}
// 查询结果
@@ -46,26 +41,69 @@ func (r AlarmLog) SelectByPage(query model.AlarmLogQuery) ([]model.AlarmLog, int
return rows, total
}
// 排序
if query.SortField != "" {
sortField := query.SortField
if query.SortOrder == "desc" {
sortField = sortField + " desc"
}
tx = tx.Order(sortField)
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize)
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
// 关联查询
tx = tx.Joins("left join ne_info on ne_info.id = alarm_log.ne_id")
tx = tx.Select("alarm_log.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid")
err := tx.Find(&rows).Error
if err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows, total
}
// 排序
r.sortRows(query.SortField, query.SortOrder, rows)
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id createdTime eventTime
// sortOrder 排序顺序 升序asc 降序desc
func (r AlarmLog) sortRows(sortField, sortOrder string, rows []model.AlarmLog) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.AlarmLog) any{
"id": func(row *model.AlarmLog) any { return row.ID },
"eventTime": func(row *model.AlarmLog) any { return row.EventTime },
"createdTime": func(row *model.AlarmLog) any { return row.CreatedTime },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// SelectByIds 通过ID查询
func (r AlarmLog) SelectByIds(ids []int64) []model.AlarmLog {
rows := []model.AlarmLog{}
@@ -98,8 +136,8 @@ func (r AlarmLog) DeleteByIds(ids []int64) int64 {
// Insert 新增信息
func (r AlarmLog) Insert(param model.AlarmLog) int64 {
if param.CreatedAt == 0 {
param.CreatedAt = time.Now().UnixMilli()
if param.CreatedTime == 0 {
param.CreatedTime = time.Now().UnixMilli()
}
// 执行插入
if err := db.DB("").Create(&param).Error; err != nil {

View File

@@ -18,28 +18,25 @@ var NewKpiCReport = &KpiCReport{}
type KpiCReport struct{}
// SelectGoldKPI 通过网元指标数据信息
func (r KpiCReport) SelectKPI(query model.KPICQuery) []model.KpiCReport {
func (r KpiCReport) SelectKPI(neType string, neId int64, query model.KPICQuery) []model.KpiCReport {
rows := []model.KpiCReport{}
if query.NeType == "" {
if neType == "" {
return rows
}
tx := db.DB("").Model(&model.KpiCReport{})
// 表名
tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(query.NeType))
tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(neType))
tx.Table(tableName)
// 构建查询条件
if query.NeUID != "" {
tx = tx.Where("ne_uid = ?", query.NeUID)
}
if query.CoreUID != "" {
tx = tx.Where("core_uid = ?", query.CoreUID)
if neId != 0 {
tx = tx.Where("ne_id = ?", neId)
}
if query.BeginTime != 0 {
tx = tx.Where("created_at >= ?", query.BeginTime)
tx = tx.Where("created_time >= ?", query.BeginTime)
}
if query.EndTime != 0 {
tx = tx.Where("created_at <= ?", query.EndTime)
tx = tx.Where("created_time <= ?", query.EndTime)
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
@@ -47,59 +44,65 @@ func (r KpiCReport) SelectKPI(query model.KPICQuery) []model.KpiCReport {
return rows
}
// 排序
if query.SortField != "" {
sortField := query.SortField
sortOrder := query.SortOrder
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.KpiCReport) any{
"id": func(row *model.KpiCReport) any { return row.ID },
"timeGroup": func(row *model.KpiCReport) any { return row.CreatedAt },
"createdAt": func(row *model.KpiCReport) any { return row.CreatedAt },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
r.sortRows(query.SortField, query.SortOrder, rows)
return rows
}
// sortRows 排序数据集合
// sortField 排序字段 支持id timeGroup createdAt
// sortOrder 排序顺序 升序asc 降序desc
func (r KpiCReport) sortRows(sortField, sortOrder string, rows []model.KpiCReport) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.KpiCReport) any{
"id": func(row *model.KpiCReport) any { return row.ID },
"timeGroup": func(row *model.KpiCReport) any { return row.CreatedTime },
"createdTime": func(row *model.KpiCReport) any { return row.CreatedTime },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// Insert 新增信息 返回新增数据ID
func (r KpiCReport) Insert(param model.KpiCReport) int64 {
if param.NeType == "" {
func (r KpiCReport) Insert(neType string, param model.KpiCReport) int64 {
if neType == "" {
return 0
}
if param.CreatedAt == 0 {
param.CreatedAt = time.Now().UnixMilli()
if param.CreatedTime == 0 {
param.CreatedTime = time.Now().UnixMilli()
}
// 表名
tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(param.NeType))
tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(neType))
// 执行插入
if err := db.DB("").Table(tableName).Create(&param).Error; err != nil {
logger.Errorf("insert err => %v", err.Error())

View File

@@ -18,28 +18,25 @@ var NewKpiReport = &KpiReport{}
type KpiReport struct{}
// SelectGoldKPI 通过网元指标数据信息
func (r KpiReport) SelectKPI(query model.KPIQuery) []model.KpiReport {
func (r KpiReport) SelectKPI(neType string, neId int64, query model.KPIQuery) []model.KpiReport {
rows := []model.KpiReport{}
if query.NeType == "" {
if neType == "" {
return rows
}
tx := db.DB("").Model(&model.KpiReport{})
// 表名
tableName := fmt.Sprintf("kpi_report_%s", strings.ToLower(query.NeType))
tableName := fmt.Sprintf("kpi_report_%s", strings.ToLower(neType))
tx = tx.Table(tableName)
// 构建查询条件
if query.NeUID != "" {
tx = tx.Where("ne_uid = ?", query.NeUID)
}
if query.CoreUID != "" {
tx = tx.Where("core_uid = ?", query.CoreUID)
if neId != 0 {
tx = tx.Where("ne_id = ?", neId)
}
if query.BeginTime != 0 {
tx = tx.Where("created_at >= ?", query.BeginTime)
tx = tx.Where("created_time >= ?", query.BeginTime)
}
if query.EndTime != 0 {
tx = tx.Where("created_at <= ?", query.EndTime)
tx = tx.Where("created_time <= ?", query.EndTime)
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
@@ -47,59 +44,65 @@ func (r KpiReport) SelectKPI(query model.KPIQuery) []model.KpiReport {
return rows
}
// 排序
if query.SortField != "" {
sortField := query.SortField
sortOrder := query.SortOrder
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.KpiReport) any{
"id": func(row *model.KpiReport) any { return row.ID },
"timeGroup": func(row *model.KpiReport) any { return row.CreatedAt },
"createdAt": func(row *model.KpiReport) any { return row.CreatedAt },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
r.sortRows(query.SortField, query.SortOrder, rows)
return rows
}
// sortRows 排序数据集合
// sortField 排序字段 支持id timeGroup createdAt
// sortOrder 排序顺序 升序asc 降序desc
func (r KpiReport) sortRows(sortField, sortOrder string, rows []model.KpiReport) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.KpiReport) any{
"id": func(row *model.KpiReport) any { return row.ID },
"timeGroup": func(row *model.KpiReport) any { return row.CreatedTime },
"createdTime": func(row *model.KpiReport) any { return row.CreatedTime },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// Insert 新增信息 返回新增数据ID
func (r KpiReport) Insert(param model.KpiReport) int64 {
if param.CoreUID == "" || param.NeUID == "" || param.NeType == "" {
func (r KpiReport) Insert(neType string, param model.KpiReport) int64 {
if neType == "" {
return 0
}
if param.CreatedAt == 0 {
param.CreatedAt = time.Now().UnixMilli()
if param.CreatedTime == 0 {
param.CreatedTime = time.Now().UnixMilli()
}
// 表名
tableName := fmt.Sprintf("kpi_report_%s", strings.ToLower(param.NeType))
tableName := fmt.Sprintf("kpi_report_%s", strings.ToLower(neType))
// 执行插入
if err := db.DB("").Table(tableName).Create(&param).Error; err != nil {
logger.Errorf("insert err => %v", err.Error())
@@ -108,34 +111,19 @@ func (r KpiReport) Insert(param model.KpiReport) int64 {
return param.ID
}
// SelectUPF 查询UPF数据 N3上行,N6下行
func (r KpiReport) SelectUPF(coreUid, neUid string, beginTime, endTime int64) []model.KpiReport {
tx := db.DB("").Model(&model.KpiReport{})
// 表名
tx = tx.Table("kpi_report_upf")
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("created_at >= ?", beginTime)
tx = tx.Where("created_at <= ?", endTime)
// 查询数据
// Select 查询数据
func (r KpiReport) Select(neType string, neId int64, beginTime, endTime int64) []model.KpiReport {
rows := []model.KpiReport{}
if err := tx.Select("kpi_values", "created_at").Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())
if neType == "" {
return rows
}
return rows
}
// SelectIMS 查询IMS数据
func (r KpiReport) SelectIMS(coreUid, neUid string, beginTime, endTime int64) []model.KpiReport {
tx := db.DB("").Model(&model.KpiReport{})
// 表名
tx = tx.Table("kpi_report_ims")
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("created_at >= ?", beginTime)
tx = tx.Where("created_at <= ?", endTime)
tx = tx.Table(fmt.Sprintf("kpi_report_%s", strings.ToLower(neType)))
tx = tx.Where("ne_id = ?", neId)
tx = tx.Where("created_time >= ? and created_time <= ?", beginTime, endTime)
// 查询数据
rows := []model.KpiReport{}
if err := tx.Select("kpi_values", "created_at").Find(&rows).Error; err != nil {
if err := tx.Select("kpi_values", "created_time").Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows
}

View File

@@ -18,31 +18,17 @@ type NBState struct{}
func (r NBState) SelectByPage(query model.NBStateQuery) ([]model.NBState, int64) {
tx := db.DB("").Model(&model.NBState{})
// 查询条件拼接
if query.NeType != "" {
tx = tx.Where("ne_type = ?", query.NeType)
}
if query.NeUID != "" {
tx = tx.Where("ne_uid = ?", query.NeUID)
}
if query.CoreUID != "" {
tx = tx.Where("core_uid = ?", query.CoreUID)
if query.NeID != 0 {
tx = tx.Where("ne_id = ?", query.NeID)
}
if query.Status != "" {
tx = tx.Where("state = ?", query.Status)
}
if query.StartTime != "" {
startTime := query.StartTime
if len(startTime) == 10 {
startTime = startTime + "000"
}
tx = tx.Where("create_time >= ?", startTime)
if query.StartTime != 0 {
tx = tx.Where("create_time >= ?", query.StartTime)
}
if query.EndTime != "" {
endTime := query.EndTime
if len(endTime) == 10 {
endTime = endTime + "999"
}
tx = tx.Where("create_time <= ?", endTime)
if query.EndTime != 0 {
tx = tx.Where("create_time <= ?", query.EndTime)
}
// 查询结果
@@ -54,15 +40,6 @@ func (r NBState) SelectByPage(query model.NBStateQuery) ([]model.NBState, int64)
return rows, total
}
// 排序
if query.SortField != "" {
sortField := query.SortField
if query.SortOrder == "desc" {
sortField = sortField + " desc"
}
tx = tx.Order(sortField)
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize)
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
@@ -82,7 +59,11 @@ func (r NBState) SelectByIds(ids []string) []model.NBState {
}
tx := db.DB("").Model(&model.NBState{})
// 构建查询条件
tx = tx.Where("id in ?", ids)
if len(ids) == 1 {
tx = tx.Where("id = ?", ids[0])
} else {
tx = tx.Where("id in ?", ids)
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())

View File

@@ -8,58 +8,35 @@ import (
"be.ems/src/modules/ne_data/model"
)
// 实例化数据层 NEState 结构体
var NewNEState = &NEState{}
// 实例化数据层 NeState 结构体
var NewNeState = &NeState{}
// NEState 网元状态记录表 数据层处理
type NEState struct{}
// NeState 网元状态记录表 数据层处理
type NeState struct{}
// SelectByPage 分页查询集合
func (r NEState) SelectByPage(query model.NEStateQuery) ([]model.NEState, int64) {
tx := db.DB("").Model(&model.NEState{})
func (r NeState) SelectByPage(query model.NeStateQuery) ([]model.NeState, int64) {
tx := db.DB("").Model(&model.NeState{})
// 查询条件拼接
if query.NeType != "" {
tx = tx.Where("ne_type = ?", query.NeType)
if query.NeID != 0 {
tx = tx.Where("ne_id = ?", query.NeID)
}
if query.NeUID != "" {
tx = tx.Where("ne_uid = ?", query.NeUID)
if query.BeginTime != 0 {
tx = tx.Where("create_time >= ?", query.BeginTime)
}
if query.CoreUID != "" {
tx = tx.Where("core_uid = ?", query.CoreUID)
}
if query.BeginTime != "" {
startTime := query.BeginTime
if len(startTime) == 10 {
startTime = startTime + "000"
}
tx = tx.Where("create_time >= ?", startTime)
}
if query.EndTime != "" {
endTime := query.EndTime
if len(endTime) == 10 {
endTime = endTime + "999"
}
tx = tx.Where("create_time <= ?", endTime)
if query.EndTime != 0 {
tx = tx.Where("create_time <= ?", query.EndTime)
}
// 查询结果
var total int64 = 0
rows := []model.NEState{}
rows := []model.NeState{}
// 查询数量为0直接返回
if err := tx.Count(&total).Error; err != nil || total <= 0 {
return rows, total
}
// 排序
if query.SortField != "" {
sortField := query.SortField
if query.SortOrder == "desc" {
sortField = sortField + " desc"
}
tx = tx.Order(sortField)
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize)
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
@@ -72,14 +49,18 @@ func (r NEState) SelectByPage(query model.NEStateQuery) ([]model.NEState, int64)
}
// SelectByIds 通过ID查询
func (r NEState) SelectByIds(ids []string) []model.NEState {
rows := []model.NEState{}
func (r NeState) SelectByIds(ids []string) []model.NeState {
rows := []model.NeState{}
if len(ids) <= 0 {
return rows
}
tx := db.DB("").Model(&model.NEState{})
tx := db.DB("").Model(&model.NeState{})
// 构建查询条件
tx = tx.Where("id in ?", ids)
if len(ids) == 1 {
tx = tx.Where("id = ?", ids[0])
} else {
tx = tx.Where("id in ?", ids)
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())
@@ -89,12 +70,12 @@ func (r NEState) SelectByIds(ids []string) []model.NEState {
}
// DeleteByTime 删除信息
func (r NEState) DeleteByTime(ltTime int64) int64 {
func (r NeState) DeleteByTime(ltTime int64) int64 {
if ltTime <= 0 {
return 0
}
tx := db.DB("").Where("create_time < ?", ltTime)
if err := tx.Delete(&model.NEState{}).Error; err != nil {
if err := tx.Delete(&model.NeState{}).Error; err != nil {
logger.Errorf("delete err => %v", err.Error())
return 0
}
@@ -102,7 +83,7 @@ func (r NEState) DeleteByTime(ltTime int64) int64 {
}
// Insert 新增信息
func (r NEState) Insert(param model.NEState) int64 {
func (r NeState) Insert(param model.NeState) int64 {
param.CreateTime = time.Now().UnixMilli()
// 执行插入
if err := db.DB("").Create(&param).Error; err != nil {

View File

@@ -12,6 +12,7 @@ import (
"be.ems/src/framework/i18n"
"be.ems/src/framework/utils/date"
"be.ems/src/framework/utils/file"
neService "be.ems/src/modules/ne/service"
"be.ems/src/modules/ne_data/model"
"be.ems/src/modules/ne_data/repository"
sysService "be.ems/src/modules/system/service"
@@ -64,24 +65,18 @@ func (r Alarm) DeleteByIds(ids []int64) (int64, error) {
}
// FindAlarmSeqLast 查询网元告警最后一条序号
func (s Alarm) FindAlarmSeqLast(coreUid, neUid string) int64 {
return s.alarmRepository.SelectAlarmSeqLast(coreUid, neUid)
func (s Alarm) FindAlarmSeqLast(neId int64) int64 {
return s.alarmRepository.SelectAlarmSeqLast(neId)
}
// ClearById 清除告警信息
func (r Alarm) ClearById(id int64, coreUid, clearUser, clearType string) (int64, error) {
func (r Alarm) ClearByIds(ids []int64, clearUser, clearType string) (int64, error) {
// 检查是否存在
arr := r.alarmRepository.SelectByIds([]int64{id})
if len(arr) != 1 {
arr := r.alarmRepository.SelectByIds(ids)
if len(arr) != len(ids) {
return 0, fmt.Errorf("not match id")
}
for _, v := range arr {
if v.CoreUID != coreUid {
return 0, fmt.Errorf("data not match, id: %d", v.ID)
}
}
var rows int64 = 0
for _, v := range arr {
// 状态检查AlarmCode变更告警ID
@@ -99,19 +94,13 @@ func (r Alarm) ClearById(id int64, coreUid, clearUser, clearType string) (int64,
}
// AckById 确认清除告警信息
func (r Alarm) AckById(id int64, coreUid, ackUser, ackState string) (int64, error) {
func (r Alarm) AckByIds(ids []int64, ackUser, ackState string) (int64, error) {
// 检查是否存在
arr := r.alarmRepository.SelectByIds([]int64{id})
if len(arr) != 1 {
arr := r.alarmRepository.SelectByIds(ids)
if len(arr) != len(ids) {
return 0, fmt.Errorf("not match id")
}
for _, v := range arr {
if v.CoreUID != coreUid {
return 0, fmt.Errorf("data not match, id: %d", v.ID)
}
}
var rows int64 = 0
for _, v := range arr {
v.AckState = ackState
@@ -123,7 +112,7 @@ func (r Alarm) AckById(id int64, coreUid, ackUser, ackState string) (int64, erro
}
// CountType 告警类别数量
func (s Alarm) CountType(coreUid, alarmStatus string) []map[string]any {
func (s Alarm) CountType(alarmStatus string) []map[string]any {
data := []map[string]any{}
alarmTypeArr := []string{
oam.ALARM_TYPE_COMMUNICATION_ALARM,
@@ -140,7 +129,7 @@ func (s Alarm) CountType(coreUid, alarmStatus string) []map[string]any {
}
// 告警类别数量
rows := s.alarmRepository.GroupTotal(coreUid, alarmStatus, "alarm_type", -1)
rows := s.alarmRepository.GroupTotal(alarmStatus, "alarm_type", -1)
for _, item := range data {
for _, v := range rows {
str := fmt.Sprint(v["alarm_type"])
@@ -154,7 +143,7 @@ func (s Alarm) CountType(coreUid, alarmStatus string) []map[string]any {
}
// CountSeverity 告警级别数量
func (s Alarm) CountSeverity(coreUid, alarmStatus string) []map[string]any {
func (s Alarm) CountSeverity(alarmStatus string) []map[string]any {
data := []map[string]any{}
alarmTypeArr := []string{
oam.ALARM_SEVERITY_CRITICAL,
@@ -170,7 +159,7 @@ func (s Alarm) CountSeverity(coreUid, alarmStatus string) []map[string]any {
}
// 数量
rows := s.alarmRepository.GroupTotal(coreUid, alarmStatus, "perceived_severity", -1)
rows := s.alarmRepository.GroupTotal(alarmStatus, "perceived_severity", -1)
for _, item := range data {
for _, v := range rows {
str := fmt.Sprint(v["perceived_severity"])
@@ -184,8 +173,8 @@ func (s Alarm) CountSeverity(coreUid, alarmStatus string) []map[string]any {
}
// CountNe 告警状态前几排名
func (s Alarm) CountNe(coreUid, alarmStatus string, top int) []map[string]any {
data := s.alarmRepository.GroupTotal(coreUid, alarmStatus, "ne_type", top)
func (s Alarm) CountNe(alarmStatus string, top int) []map[string]any {
data := s.alarmRepository.GroupTotal(alarmStatus, "ne_type", top)
for _, v := range data {
v["neType"] = fmt.Sprint(v["ne_type"])
v["total"] = parse.Number(v["total"])
@@ -206,19 +195,21 @@ func (r Alarm) ExportXlsx(rows []model.Alarm, fileName, language, alarmStatus st
"F1": i18n.TKey(language, "alarm.export.alarmCode"),
"G1": i18n.TKey(language, "ne.common.neType"),
"H1": i18n.TKey(language, "ne.common.neName"),
"I1": i18n.TKey(language, "ne.common.neId"),
"I1": i18n.TKey(language, "ne.common.neUid"),
}
if alarmStatus == "0" {
headerCells["J1"] = i18n.TKey(language, "alarm.export.clearUser")
headerCells["K1"] = i18n.TKey(language, "alarm.export.clearTime")
headerCells["L1"] = i18n.TKey(language, "alarm.export.clearType")
}
neInfoService := neService.NewNeInfo
dictDataService := sysService.NewSysDictData
// 读取字典数据 告警原始严重程度
dictActiveAlarmType := sysService.NewSysDictData.FindByType("active_alarm_type")
dictActiveAlarmType := dictDataService.FindByType("active_alarm_type")
// 读取字典数据 告警类型
dictActiveClearType := sysService.NewSysDictData.FindByType("active_clear_type")
dictActiveClearType := dictDataService.FindByType("active_clear_type")
// 读取字典数据 告警确认类型
dictActiveAlarmSeverity := sysService.NewSysDictData.FindByType("active_alarm_severity")
dictActiveAlarmSeverity := dictDataService.FindByType("active_alarm_severity")
// 从第二行开始的数据
dataCells := make([]map[string]any, 0)
for i, row := range rows {
@@ -250,6 +241,7 @@ func (r Alarm) ExportXlsx(rows []model.Alarm, fileName, language, alarmStatus st
}
eventTimeStr := date.ParseDateToStr(row.EventTime, date.YYYY_MM_DDTHH_MM_SSZ)
neInfo := neInfoService.FindByNeId(row.NeID)
cells := map[string]any{
"A" + idx: alarmType,
"B" + idx: origSeverity,
@@ -257,9 +249,9 @@ func (r Alarm) ExportXlsx(rows []model.Alarm, fileName, language, alarmStatus st
"D" + idx: eventTimeStr,
"E" + idx: row.AlarmId,
"F" + idx: row.AlarmCode,
"G" + idx: row.NeType,
"H" + idx: row.NeUID,
"I" + idx: row.CoreUID,
"G" + idx: neInfo.NeType,
"H" + idx: neInfo.NeName,
"I" + idx: neInfo.NeUid,
}
if alarmStatus == "0" {
clearTimeStr := date.ParseDateToStr(row.ClearTime, date.YYYY_MM_DDTHH_MM_SSZ)

View File

@@ -57,24 +57,18 @@ func (r AlarmEvent) DeleteByIds(ids []int64) (int64, error) {
}
// FindAlarmEventSeqLast 查询网元告警最后一条序号
func (s AlarmEvent) FindAlarmEventSeqLast(coreUid, neUid string) int64 {
return s.alarmEventRepository.SelectAlarmEventSeqLast(coreUid, neUid)
func (s AlarmEvent) FindAlarmEventSeqLast(neid int64) int64 {
return s.alarmEventRepository.SelectAlarmEventSeqLast(neid)
}
// ClearById 清除告警信息
func (r AlarmEvent) ClearById(id int64, coreUid, clearUser, clearType string) (int64, error) {
func (r AlarmEvent) ClearByIds(ids []int64, clearUser, clearType string) (int64, error) {
// 检查是否存在
arr := r.alarmEventRepository.SelectByIds([]int64{id})
if len(arr) != 1 {
arr := r.alarmEventRepository.SelectByIds(ids)
if len(arr) != len(ids) {
return 0, fmt.Errorf("not match id")
}
for _, v := range arr {
if v.CoreUID != coreUid {
return 0, fmt.Errorf("data not match, id: %d", v.ID)
}
}
var rows int64 = 0
for _, v := range arr {
v.AlarmStatus = oam.ALARM_STATUS_CLEAR

View File

@@ -21,15 +21,15 @@ type KpiCReport struct {
}
// FindKPI 通过网元指标数据信息
func (s KpiCReport) FindData(query model.KPICQuery) []map[string]any {
func (s KpiCReport) FindData(neType string, neId int64, query model.KPICQuery) []map[string]any {
// 标题单位映射
kpicTitles := s.kpiCReportRepository.SelectKPITitle(query.NeType)
kpicTitles := s.kpiCReportRepository.SelectKPITitle(neType)
kpicTitleUnitMap := map[string]string{}
for _, v := range kpicTitles {
kpicTitleUnitMap[v.KpiId] = v.Unit
}
// 原始数据
rows := s.kpiCReportRepository.SelectKPI(query)
rows := s.kpiCReportRepository.SelectKPI(neType, neId, query)
if len(rows) <= 0 {
return []map[string]any{}
}
@@ -47,11 +47,10 @@ func (s KpiCReport) FindData(query model.KPICQuery) []map[string]any {
}
item := map[string]any{
"neType": row.NeType,
"neUid": row.NeUID,
"coreUID": row.CoreUID,
"neType": neType,
"neId": row.NeID,
"startIndex": row.Index,
"timeGroup": row.CreatedAt,
"timeGroup": row.CreatedTime,
}
// 遍历 kpiValues 数组
@@ -141,8 +140,8 @@ func (s KpiCReport) FindData(query model.KPICQuery) []map[string]any {
}
// Insert 新增信息
func (s KpiCReport) Insert(param model.KpiCReport) int64 {
return s.kpiCReportRepository.Insert(param)
func (s KpiCReport) Insert(neType string, param model.KpiCReport) int64 {
return s.kpiCReportRepository.Insert(neType, param)
}
// FindKPITitle 网元对应的指标名称

View File

@@ -25,9 +25,9 @@ type KpiReport struct {
}
// FindData 通过网元指标数据信息
func (s KpiReport) FindData(query model.KPIQuery) []map[string]any {
func (s KpiReport) FindData(neType string, neId int64, query model.KPIQuery) []map[string]any {
// 原始数据
rows := s.kpiReportRepository.SelectKPI(query)
rows := s.kpiReportRepository.SelectKPI(neType, neId, query)
if len(rows) <= 0 {
return []map[string]any{}
}
@@ -45,11 +45,10 @@ func (s KpiReport) FindData(query model.KPIQuery) []map[string]any {
}
item := map[string]any{
"neType": row.NeType,
"neUid": row.NeUID,
"coreUID": row.CoreUID,
"neType": neType,
"neId": row.NeID,
"startIndex": row.Index,
"timeGroup": row.CreatedAt,
"timeGroup": row.CreatedTime,
}
// 遍历 kpiValues 数组
@@ -132,8 +131,8 @@ func (s KpiReport) FindData(query model.KPIQuery) []map[string]any {
}
// Insert 新增信息
func (s KpiReport) Insert(param model.KpiReport) int64 {
return s.kpiReportRepository.Insert(param)
func (s KpiReport) Insert(neType string, param model.KpiReport) int64 {
return s.kpiReportRepository.Insert(neType, param)
}
// FindTitle 网元对应的指标名称
@@ -174,7 +173,7 @@ func (r KpiReport) TitleInsert(param model.KpiTitle) int64 {
// UPFTodayFlowFind 查询UPF总流量 N3上行 N6下行
// day 统计天数
// down / 1000 / 1000 单位M
func (r KpiReport) UPFTodayFlowFind(neUid string, day int) (int64, int64) {
func (r KpiReport) UPFTodayFlowFind(neId int64, day int) (int64, int64) {
// 获取当前日期
now := time.Now()
var upTotal, downTotal int64
@@ -182,7 +181,7 @@ func (r KpiReport) UPFTodayFlowFind(neUid string, day int) (int64, int64) {
// 查询最近day天的数据
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, neUid, dateKey)
key := fmt.Sprintf("%s:UPF_FLOW:%d:%s", constants.CACHE_NE_DATA, neId, dateKey)
// 读取缓存数据
up, err := redis.GetHash("", key, "up")
@@ -202,10 +201,10 @@ func (r KpiReport) UPFTodayFlowFind(neUid string, day int) (int64, int64) {
}
// UPFTodayFlow UPF流量今日统计
func (r KpiReport) UPFTodayFlowUpdate(neUid string, upValue, downValue int64) error {
func (r KpiReport) UPFTodayFlowUpdate(neId int64, upValue, downValue int64) error {
// 按日期存储统计数据
dateKey := time.Now().Format("2006-01-02")
key := fmt.Sprintf("%s:UPF_FLOW:%s:%s", constants.CACHE_NE_DATA, neUid, dateKey)
key := fmt.Sprintf("%s:UPF_FLOW:%d:%s", constants.CACHE_NE_DATA, neId, dateKey)
// 使用HIncrBy实时累加统计值
if err := redis.IncrBy("", key, "up", upValue); err != nil {
@@ -220,7 +219,7 @@ func (r KpiReport) UPFTodayFlowUpdate(neUid string, upValue, downValue int64) er
// UPFTodayFlowLoad UPF上下行数据到redis
// day 统计天数
func (r KpiReport) UPFTodayFlowLoad(day int) {
cacheKeys, _ := redis.GetKeys("", constants.CACHE_NE_INFO+":UPF:*")
cacheKeys, _ := redis.GetKeys("", constants.CACHE_NE_DATA+":UPF:*")
if len(cacheKeys) == 0 {
return
}
@@ -232,16 +231,16 @@ func (r KpiReport) UPFTodayFlowLoad(day int) {
if len(jsonStr) > 7 {
json.Unmarshal([]byte(jsonStr), &v)
}
if v.NeType == "UPF" && v.NeUID != "" {
if v.NeType == "UPF" && v.NeUid != "" {
// 查询最近day天的数据
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, v.NeUID, dateKey)
key := fmt.Sprintf("%s:UPF_FLOW:%s:%s", constants.CACHE_NE_DATA, v.NeUid, dateKey)
// 根据传入天数计算时间范围
beginTime := now.AddDate(0, 0, -i).Truncate(24 * time.Hour).UnixMilli()
endTime := beginTime + 24*60*60*1000 - 1
// 查询历史数据
rows := r.kpiReportRepository.SelectUPF(v.CoreUID, v.NeUID, beginTime, endTime)
rows := r.kpiReportRepository.Select(v.NeType, v.ID, beginTime, endTime)
var upTotal, downTotal int64
// 处理历史数据
@@ -283,7 +282,7 @@ func (r KpiReport) UPFTodayFlowLoad(day int) {
// IMSBusyHour IMS忙时流量统计
// SCSCF.06呼叫尝试次数 SCSCF.09呼叫成功次数
func (r KpiReport) IMSBusyHour(coreUid string, neUid string, timestamp int64) []map[string]any {
func (r KpiReport) IMSBusyHour(neType string, neId int64, timestamp int64) []map[string]any {
t := time.UnixMilli(timestamp)
beginTime := t
endTime := t
@@ -300,14 +299,14 @@ func (r KpiReport) IMSBusyHour(coreUid string, neUid string, timestamp int64) []
endTime = beginTime.Add(time.Hour - time.Millisecond)
}
// 转换为毫秒级时间戳
rows := r.kpiReportRepository.SelectIMS(coreUid, neUid, beginTime.UnixMilli(), endTime.UnixMilli())
rows := r.kpiReportRepository.Select(neType, neId, beginTime.UnixMilli(), endTime.UnixMilli())
// 创建一个map来存储按时间段合并后的数据
timeGroup := make(map[int64]map[string]int64)
// 遍历每个数据项
for _, row := range rows {
// 将毫秒时间戳转换为小时级时间戳(保留到小时的起始毫秒)
timeHour := row.CreatedAt / 3600000 * 3600000 // 1小时 = 3600000毫秒
timeHour := row.CreatedTime / 3600000 * 3600000 // 1小时 = 3600000毫秒
// 解析 JSON 字符串为 map
var kpiValues []map[string]any
@@ -357,20 +356,20 @@ type TrafficData struct {
}
// IMSBusyWeek IMS忙时流量统计 周
func (r KpiReport) IMSBusyWeek(coreUid string, neUid string, weekStart, weekEnd int64) map[string]any {
func (r KpiReport) IMSBusyWeek(neType string, neId int64, weekStart, weekEnd int64) map[string]any {
weekStartTime := time.UnixMilli(weekStart)
weekEndTime := time.UnixMilli(weekEnd)
// 1. 获取一周内每小时的呼叫数据
// 转换为毫秒级时间戳
rows := r.kpiReportRepository.SelectIMS(coreUid, neUid, weekStartTime.UnixMilli(), weekEndTime.UnixMilli())
rows := r.kpiReportRepository.Select(neType, neId, weekStartTime.UnixMilli(), weekEndTime.UnixMilli())
// 创建一个map来存储按时间段合并后的数据
timeGroup := make(map[int64]map[string]int64)
// 遍历每个数据项
for _, row := range rows {
// 将毫秒时间戳转换为小时级时间戳(保留到小时的起始毫秒)
timeHour := row.CreatedAt / 3600000 * 3600000 // 1小时 = 3600000毫秒
timeHour := row.CreatedTime / 3600000 * 3600000 // 1小时 = 3600000毫秒
// 解析 JSON 字符串为 map
var kpiValues []map[string]any

View File

@@ -7,21 +7,21 @@ import (
// 实例化数据层 NEState 结构体
var NewNEState = &NEState{
neStateRepository: repository.NewNEState,
neStateRepository: repository.NewNeState,
}
// NEState 网元状态记录表 服务层处理
type NEState struct {
neStateRepository *repository.NEState // 网元状态记录信息
neStateRepository *repository.NeState // 网元状态记录信息
}
// FindByPage 根据条件分页查询
func (r NEState) FindByPage(query model.NEStateQuery) ([]model.NEState, int64) {
func (r NEState) FindByPage(query model.NeStateQuery) ([]model.NeState, int64) {
return r.neStateRepository.SelectByPage(query)
}
// Insert 插入数据
func (r NEState) Insert(item model.NEState) int64 {
func (r NEState) Insert(item model.NeState) int64 {
return r.neStateRepository.Insert(item)
}

View File

@@ -49,24 +49,20 @@ type AMFController struct {
func (s *AMFController) UEList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.ueEventService.FindByPage(neInfo.NeType, query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}
@@ -125,24 +121,20 @@ func (s *AMFController) UERemove(c *gin.Context) {
func (s *AMFController) UEExport(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.ueEventService.FindByPage(neInfo.NeType, query)
if total == 0 {
// 导出数据记录为空
@@ -179,9 +171,8 @@ func (s *AMFController) UEExport(c *gin.Context) {
func (s *AMFController) NbInfoList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NbId string `form:"id"`
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
NbId string `form:"id"`
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -190,8 +181,8 @@ func (s *AMFController) NbInfoList(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -224,8 +215,7 @@ func (s *AMFController) NbInfoList(c *gin.Context) {
func (s *AMFController) NbStateList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -234,8 +224,8 @@ func (s *AMFController) NbStateList(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}

View File

@@ -288,10 +288,7 @@ func (m *CBCController) Export(c *gin.Context) {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
// 限制导出数据集
if query.PageSize > 10000 {
query.PageSize = 10000
}
// 查询数据
rows, total, err := m.cbcMessageService.SelectByPage(query)
if err != nil {

View File

@@ -53,24 +53,20 @@ type IMSController struct {
func (s *IMSController) CDRList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}
@@ -129,24 +125,19 @@ func (s *IMSController) CDRRemove(c *gin.Context) {
func (s *IMSController) CDRExport(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query)
if total == 0 {
// 导出数据记录为空
@@ -182,8 +173,7 @@ func (s *IMSController) CDRExport(c *gin.Context) {
func (s *IMSController) UeSessionNum(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -192,8 +182,8 @@ func (s *IMSController) UeSessionNum(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -226,10 +216,9 @@ func (s *IMSController) UeSessionNum(c *gin.Context) {
func (s *IMSController) UeSessionList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
IMSI string `form:"imsi"`
MSISDN string `form:"msisdn"`
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi"`
MSISDN string `form:"msisdn"`
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -238,8 +227,8 @@ func (s *IMSController) UeSessionList(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -274,7 +263,6 @@ func (s *IMSController) UeSessionList(c *gin.Context) {
func (s IMSController) KPIBusyHour(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
Timestamp int64 `form:"timestamp" binding:"required"` // 时间戳毫秒 年月日返回每小时的总和 年月日时返回该小时的总和
}
@@ -289,13 +277,13 @@ func (s IMSController) KPIBusyHour(c *gin.Context) {
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
data := s.kpiReportService.IMSBusyHour(neInfo.CoreUID, neInfo.NeUID, query.Timestamp)
data := s.kpiReportService.IMSBusyHour(neInfo.NeType, neInfo.ID, query.Timestamp)
c.JSON(200, resp.OkData(data))
}
@@ -316,7 +304,6 @@ func (s IMSController) KPIBusyHour(c *gin.Context) {
func (s IMSController) KPIBusyWeek(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
WeekStart int64 `form:"weekStart" binding:"required"` // 时间戳毫秒 年月日
WeekEnd int64 `form:"weekEnd" binding:"required"` // 时间戳毫秒 年月日
@@ -347,12 +334,12 @@ func (s IMSController) KPIBusyWeek(c *gin.Context) {
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
data := s.kpiReportService.IMSBusyWeek(neInfo.CoreUID, neInfo.NeUID, query.WeekStart, query.WeekEnd)
data := s.kpiReportService.IMSBusyWeek(neInfo.NeType, neInfo.ID, query.WeekStart, query.WeekEnd)
c.JSON(200, resp.OkData(data))
}

View File

@@ -49,24 +49,20 @@ type MMEController struct {
func (s *MMEController) UEList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.ueEventService.FindByPage(neInfo.NeType, query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}
@@ -125,24 +121,20 @@ func (s *MMEController) UERemove(c *gin.Context) {
func (s *MMEController) UEExport(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.ueEventService.FindByPage(neInfo.NeType, query)
if total == 0 {
// 导出数据记录为空
@@ -179,9 +171,8 @@ func (s *MMEController) UEExport(c *gin.Context) {
func (s *MMEController) NbInfoList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NbId string `form:"id"`
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
NbId string `form:"id"`
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -190,8 +181,8 @@ func (s *MMEController) NbInfoList(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -224,8 +215,7 @@ func (s *MMEController) NbInfoList(c *gin.Context) {
func (s *MMEController) NbStateList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -234,8 +224,8 @@ func (s *MMEController) NbStateList(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}

View File

@@ -41,9 +41,8 @@ type N3IWFController struct {
func (s N3IWFController) SubUserList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
IMSI string `form:"imsi"`
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi"`
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -52,8 +51,8 @@ func (s N3IWFController) SubUserList(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}

View File

@@ -40,8 +40,7 @@ type NSSFController struct {
func (s NSSFController) SubUserList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -50,8 +49,8 @@ func (s NSSFController) SubUserList(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -82,8 +81,7 @@ func (s NSSFController) SubUserList(c *gin.Context) {
func (s NSSFController) AvailableList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -92,8 +90,8 @@ func (s NSSFController) AvailableList(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}

View File

@@ -42,10 +42,9 @@ type PCFController struct {
func (s PCFController) RuleInfoList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
IMSI string `form:"imsi"`
MSISDN string `form:"msisdn"`
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi"`
MSISDN string `form:"msisdn"`
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -54,8 +53,8 @@ func (s PCFController) RuleInfoList(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -89,7 +88,6 @@ func (s PCFController) RuleInfoList(c *gin.Context) {
func (s PCFController) RuleInfoAdd(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
Num int64 `json:"num"` // 批量添加 大于1时imsi/msisdn会累加数值
ParamData map[string]any `json:"paramData" binding:"required"` // 参数数据
@@ -111,8 +109,8 @@ func (s PCFController) RuleInfoAdd(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -147,7 +145,6 @@ func (s PCFController) RuleInfoAdd(c *gin.Context) {
func (s PCFController) RuleInfoEdit(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
Num int64 `json:"num"` // 更新数量
ParamData map[string]any `json:"paramData" binding:"required"` // 参数数据
@@ -169,8 +166,8 @@ func (s PCFController) RuleInfoEdit(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -207,10 +204,9 @@ func (s PCFController) RuleInfoEdit(c *gin.Context) {
func (s PCFController) RuleInfoRemove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
IMSI string `form:"imsi" binding:"required"` // IMSi, 带数量时为批量删除
Num int64 `form:"num"` // 删除数量
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi" binding:"required"` // IMSi, 带数量时为批量删除
Num int64 `form:"num"` // 删除数量
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -219,8 +215,8 @@ func (s PCFController) RuleInfoRemove(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -256,7 +252,6 @@ func (s PCFController) RuleInfoRemove(c *gin.Context) {
func (s PCFController) RuleInfoExport(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
FileType string `form:"fileType" binding:"required,oneof=txt"` // 文件类型
}
@@ -267,8 +262,8 @@ func (s PCFController) RuleInfoExport(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -303,7 +298,6 @@ func (s PCFController) RuleInfoExport(c *gin.Context) {
func (s PCFController) RuleInfoImport(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
FileType string `json:"fileType" binding:"required,oneof=txt"` // 文件类型
FilePath string `json:"filePath" binding:"required"` // 网元端文件所在绝对路径
@@ -315,8 +309,8 @@ func (s PCFController) RuleInfoImport(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}

View File

@@ -51,24 +51,19 @@ type SGWCController struct {
func (s *SGWCController) CDRList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}
@@ -127,24 +122,19 @@ func (s *SGWCController) CDRRemove(c *gin.Context) {
func (s *SGWCController) CDRExport(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query)
if total == 0 {
// 导出数据记录为空

View File

@@ -52,24 +52,20 @@ type SMFController struct {
func (s *SMFController) CDRList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}
@@ -128,24 +124,19 @@ func (s *SMFController) CDRRemove(c *gin.Context) {
func (s *SMFController) CDRExport(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query)
if total == 0 {
// 导出数据记录为空
@@ -181,8 +172,7 @@ func (s *SMFController) CDRExport(c *gin.Context) {
func (s *SMFController) SubUserNum(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -191,8 +181,8 @@ func (s *SMFController) SubUserNum(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -227,8 +217,7 @@ func (s *SMFController) SubUserNum(c *gin.Context) {
func (s *SMFController) SubUserList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi"`
MSISDN string `form:"msisdn"`
Upstate string `form:"upstate"`
@@ -241,8 +230,8 @@ func (s *SMFController) SubUserList(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
@@ -270,7 +259,7 @@ func (s *SMFController) SubUserList(c *gin.Context) {
imsiStr = strings.TrimPrefix(imsiStr, "imsi-")
item["imsi"] = imsiStr
// 查UDM拓展信息
info := s.UDMExtendService.FindByIMSIAndNeID(neInfo.CoreUID, "%", imsiStr)
info := s.UDMExtendService.FindByIMSIAndNeID(neInfo.ID, imsiStr)
item["remark"] = info.Remark
}
if v, ok := item["msisdn"]; ok && v != nil {

View File

@@ -49,24 +49,19 @@ type SMSCController struct {
func (s *SMSCController) CDRList(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}
@@ -125,24 +120,19 @@ func (s *SMSCController) CDRRemove(c *gin.Context) {
func (s *SMSCController) CDRExport(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
query := reqctx.QueryMap(c)
// 限制导出数据集
pageSize := parse.Number(query["pageSize"])
if pageSize > 10000 {
query["pageSize"] = "10000"
}
coreUid := c.DefaultQuery("coreUid", "")
neUid := c.DefaultQuery("neUid", "")
if coreUid == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid)
if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid {
neInfo := s.neInfoService.FindByNeUid(neUid)
if neInfo.NeUid != neUid {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
query["neId"] = fmt.Sprint(neInfo.ID)
rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query)
if total == 0 {
// 导出数据记录为空

View File

@@ -50,8 +50,7 @@ type UDMAuthController struct {
// @Router /nf/udm/auth/reset [put]
func (s *UDMAuthController) ResetData(c *gin.Context) {
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -59,7 +58,14 @@ func (s *UDMAuthController) ResetData(c *gin.Context) {
return
}
data := s.udmAuthService.ResetData(query.CoreUID, query.NeUID)
// 查询网元信息
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg("neinfo not found"))
return
}
data := s.udmAuthService.ResetData(neInfo.ID)
c.JSON(200, resp.OkData(data))
}
@@ -92,8 +98,7 @@ func (s *UDMAuthController) List(c *gin.Context) {
// @Tags network_data/udm/auth
// @Accept json
// @Produce json
// @Param coreUid query string true "NE ID" default(001)
// @Param neUid query string true "NE ID" default(001)
// @Param neUid query string true "NE UID" default(8I73Y01Z)
// @Param imsi query string true "IMSI"
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
@@ -103,9 +108,8 @@ func (s *UDMAuthController) List(c *gin.Context) {
func (s *UDMAuthController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
IMSI string `form:"imsi" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi" binding:"required"` // 网元唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -114,13 +118,13 @@ func (s *UDMAuthController) Info(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -139,10 +143,14 @@ func (s *UDMAuthController) Info(c *gin.Context) {
c.JSON(200, resp.ErrMsg("No Auth Data"))
return
}
if _, ok := data["COMMAND NOT FOUND, opr"]; ok {
c.JSON(200, resp.ErrMsg("command not found"))
return
}
// 解析返回的数据
u := s.udmAuthService.ParseInfo(neInfo.CoreUID, neInfo.NeUID, query.IMSI, data)
s.udmAuthService.Insert(neInfo.CoreUID, neInfo.NeUID, u)
u := s.udmAuthService.ParseInfo(neInfo.ID, query.IMSI, data)
s.udmAuthService.Insert(neInfo.ID, u)
c.JSON(200, resp.OkData(u))
}
@@ -181,13 +189,13 @@ func (s *UDMAuthController) Add(c *gin.Context) {
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeId(body.NeID)
if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -207,7 +215,7 @@ func (s *UDMAuthController) Add(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmAuthService.LoadData(neInfo.CoreUID, neInfo.NeUID, body.IMSI, num)
s.udmAuthService.LoadData(neInfo.ID, body.IMSI, num)
}
c.JSON(200, resp.OkData(data))
return
@@ -224,7 +232,7 @@ func (s *UDMAuthController) Add(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmAuthService.Insert(neInfo.CoreUID, neInfo.NeUID, body)
s.udmAuthService.Insert(neInfo.ID, body)
}
c.JSON(200, resp.OkData(data))
}
@@ -257,13 +265,13 @@ func (s *UDMAuthController) Edit(c *gin.Context) {
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeId(body.NeID)
if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -281,7 +289,7 @@ func (s *UDMAuthController) Edit(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmAuthService.Insert(neInfo.CoreUID, neInfo.NeUID, body)
s.udmAuthService.Insert(neInfo.ID, body)
}
c.JSON(200, resp.OkData(data))
}
@@ -303,10 +311,9 @@ func (s *UDMAuthController) Edit(c *gin.Context) {
func (s *UDMAuthController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
IMSI string `form:"imsi" binding:"required"` // IMSi
Num int64 `form:"num"` // 数量 0可拼接imsi多删除 大于1为批量
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi" binding:"required"` // IMSi
Num int64 `form:"num"` // 数量 0可拼接imsi多删除 大于1为批量
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -315,13 +322,13 @@ func (s *UDMAuthController) Remove(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -339,7 +346,7 @@ func (s *UDMAuthController) Remove(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmAuthService.LoadData(neInfo.CoreUID, neInfo.NeUID, query.IMSI, query.Num)
s.udmAuthService.LoadData(neInfo.ID, query.IMSI, query.Num)
}
c.JSON(200, resp.OkData(data))
return
@@ -363,7 +370,7 @@ func (s *UDMAuthController) Remove(c *gin.Context) {
}
// 命令ok时
if strings.Contains(data, "ok") {
s.udmAuthService.Delete(neInfo.CoreUID, neInfo.NeUID, imsi)
s.udmAuthService.Delete(neInfo.ID, imsi)
}
resultData[imsi] = data
}
@@ -391,8 +398,8 @@ func (s *UDMAuthController) Remove(c *gin.Context) {
func (s *UDMAuthController) Export(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neUid := c.Query("neUid")
if c.Query("coreUid") == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neUid is empty"))
return
}
fileType := c.Query("type")
@@ -472,7 +479,6 @@ func (s *UDMAuthController) Export(c *gin.Context) {
func (s *UDMAuthController) Import(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
UploadPath string `json:"uploadPath" binding:"required"` // 上传文件路径
TypeVal string `json:"typeVal" binding:"required,oneof=default k4"` // default: 默认导入方式, k4: k4类型导入方式
@@ -491,13 +497,13 @@ func (s *UDMAuthController) Import(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -521,7 +527,7 @@ func (s *UDMAuthController) Import(c *gin.Context) {
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -540,7 +546,7 @@ func (s *UDMAuthController) Import(c *gin.Context) {
// K4类型发特定请求
if body.TypeVal == "k4" {
resultMsg, resultErr = neFetchlink.UDMImportAuth(neInfo.IPAddr, map[string]any{
resultMsg, resultErr = neFetchlink.UDMImportAuth(neInfo.IpAddr, map[string]any{
"path": neFilePath, "k4": body.TypeData,
})
}
@@ -554,11 +560,11 @@ func (s *UDMAuthController) Import(c *gin.Context) {
if strings.Contains(resultMsg, "ok") {
if strings.HasSuffix(body.UploadPath, ".csv") {
data := file.ReadFileCSV(localFilePath)
go s.udmAuthService.InsertData(neInfo.CoreUID, neInfo.NeUID, "csv", data)
go s.udmAuthService.InsertData(neInfo.ID, "csv", data)
}
if strings.HasSuffix(body.UploadPath, ".txt") {
data := file.ReadFileTXTLine(",", localFilePath)
go s.udmAuthService.InsertData(neInfo.CoreUID, neInfo.NeUID, "txt", data)
go s.udmAuthService.InsertData(neInfo.ID, "txt", data)
}
}
c.JSON(200, resp.OkMsg(resultMsg))

View File

@@ -49,8 +49,7 @@ type UDMSubController struct {
// @Router /nf/udm/sub/reset [put]
func (s *UDMSubController) ResetData(c *gin.Context) {
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -58,7 +57,14 @@ func (s *UDMSubController) ResetData(c *gin.Context) {
return
}
data := s.udmSubService.ResetData(query.CoreUID, query.NeUID)
// 查询网元信息
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg("neinfo not found"))
return
}
data := s.udmSubService.ResetData(neInfo.ID)
c.JSON(200, resp.OkData(data))
}
@@ -102,9 +108,8 @@ func (s *UDMSubController) List(c *gin.Context) {
func (s *UDMSubController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
IMSI string `form:"imsi" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi" binding:"required"` // 网元唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -113,13 +118,13 @@ func (s *UDMSubController) Info(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -138,10 +143,14 @@ func (s *UDMSubController) Info(c *gin.Context) {
c.JSON(200, resp.ErrMsg("No Subs Data"))
return
}
if _, ok := data["COMMAND NOT FOUND, opr"]; ok {
c.JSON(200, resp.ErrMsg("command not found"))
return
}
// 解析返回的数据
u := s.udmSubService.ParseInfo(neInfo.CoreUID, neInfo.NeUID, query.IMSI, data)
s.udmSubService.Insert(neInfo.CoreUID, neInfo.NeUID, u)
u := s.udmSubService.ParseInfo(neInfo.ID, query.IMSI, data)
s.udmSubService.Insert(neInfo.ID, u)
c.JSON(200, resp.OkData(u))
}
@@ -180,13 +189,13 @@ func (s *UDMSubController) Add(c *gin.Context) {
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeId(body.NeID)
if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -209,7 +218,7 @@ func (s *UDMSubController) Add(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmSubService.LoadData(neInfo.CoreUID, neInfo.NeUID, body.IMSI, num, body.Remark)
s.udmSubService.LoadData(neInfo.ID, body.IMSI, num, body.Remark)
}
c.JSON(200, resp.OkData(data))
return
@@ -226,7 +235,7 @@ func (s *UDMSubController) Add(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmSubService.Insert(neInfo.CoreUID, neInfo.NeUID, body)
s.udmSubService.Insert(neInfo.ID, body)
}
c.JSON(200, resp.OkData(data))
}
@@ -259,13 +268,13 @@ func (s *UDMSubController) Edit(c *gin.Context) {
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeId(body.NeID)
if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -283,7 +292,7 @@ func (s *UDMSubController) Edit(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmSubService.Insert(neInfo.CoreUID, neInfo.NeUID, body)
s.udmSubService.Insert(neInfo.ID, body)
}
c.JSON(200, resp.OkData(data))
}
@@ -305,10 +314,9 @@ func (s *UDMSubController) Edit(c *gin.Context) {
func (s *UDMSubController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
IMSI string `form:"imsi" binding:"required"` // IMSi
Num int64 `form:"num"` // 批量数量
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi" binding:"required"` // IMSi
Num int64 `form:"num"` // 批量数量
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -317,13 +325,13 @@ func (s *UDMSubController) Remove(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -341,7 +349,7 @@ func (s *UDMSubController) Remove(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmSubService.LoadData(neInfo.CoreUID, neInfo.NeUID, query.IMSI, query.Num, "-(Deleted)-")
s.udmSubService.LoadData(neInfo.ID, query.IMSI, query.Num, "-(Deleted)-")
}
c.JSON(200, resp.OkData(data))
return
@@ -365,7 +373,7 @@ func (s *UDMSubController) Remove(c *gin.Context) {
}
// 命令ok时
if strings.Contains(data, "ok") {
s.udmSubService.Delete(neInfo.CoreUID, neInfo.NeUID, imsi)
s.udmSubService.Delete(neInfo.ID, imsi)
}
resultData[imsi] = data
}
@@ -394,8 +402,8 @@ func (s *UDMSubController) Remove(c *gin.Context) {
func (s *UDMSubController) Export(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neUid := c.Query("neUid")
if c.Query("coreUid") == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neUid is empty"))
return
}
fileType := c.Query("type")
@@ -469,8 +477,7 @@ func (s *UDMSubController) Export(c *gin.Context) {
func (s *UDMSubController) Import(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
NeUID string `json:"neUid" binding:"required"` // 网唯一标识
UploadPath string `json:"uploadPath" binding:"required"`
}
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
@@ -486,13 +493,13 @@ func (s *UDMSubController) Import(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -516,7 +523,7 @@ func (s *UDMSubController) Import(c *gin.Context) {
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -535,11 +542,11 @@ func (s *UDMSubController) Import(c *gin.Context) {
if strings.Contains(data, "ok") {
if strings.HasSuffix(body.UploadPath, ".csv") {
data := file.ReadFileCSV(localFilePath)
go s.udmSubService.InsertData(neInfo.CoreUID, neInfo.NeUID, "csv", data)
go s.udmSubService.InsertData(neInfo.ID, "csv", data)
}
if strings.HasSuffix(body.UploadPath, ".txt") {
data := file.ReadFileTXTLine(",", localFilePath)
go s.udmSubService.InsertData(neInfo.CoreUID, neInfo.NeUID, "txt", data)
go s.udmSubService.InsertData(neInfo.ID, "txt", data)
}
}
c.JSON(200, resp.OkMsg(data))

View File

@@ -41,17 +41,14 @@ type UDMVOIPController struct {
// @Tags network_data/udm/voip
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(001)
// @Param neUid query string true "NeUID" default(001)
// @Success 200 {object} object "Response Results"
// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary UDM VOIP User Data Refresh
// @Description UDM VOIP User Data List Refresh Synchronization Latest
// @Router /nf/udm/voip/reset [put]
func (s *UDMVOIPController) ResetData(c *gin.Context) {
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -59,7 +56,14 @@ func (s *UDMVOIPController) ResetData(c *gin.Context) {
return
}
data := s.udmVOIPService.ResetData(query.CoreUID, query.NeUID)
// 查询网元信息
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg("neinfo not found"))
return
}
data := s.udmVOIPService.ResetData(neInfo.ID)
c.JSON(200, resp.OkData(data))
}
@@ -70,9 +74,7 @@ func (s *UDMVOIPController) ResetData(c *gin.Context) {
// @Tags network_data/udm/voip
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(001)
// @Param neUid query string true "NeUID" default(001)
// @Param username query string false "User Name"
// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Param username query string false "User Name"
// @Param pageNum query number true "pageNum" default(1)
// @Param pageSize query number true "pageSize" default(10)
// @Success 200 {object} object "Response Results"
@@ -103,7 +105,6 @@ func (s *UDMVOIPController) List(c *gin.Context) {
func (s *UDMVOIPController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
UserName string `form:"username" binding:"required"` // 用户名
}
@@ -114,13 +115,13 @@ func (s *UDMVOIPController) Info(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -139,11 +140,15 @@ func (s *UDMVOIPController) Info(c *gin.Context) {
c.JSON(200, resp.ErrMsg("No VOIP Data"))
return
}
if _, ok := data["COMMAND NOT FOUND, opr"]; ok {
c.JSON(200, resp.ErrMsg("command not found"))
return
}
// 解析返回的数据
u := s.udmVOIPService.ParseInfo(neInfo.CoreUID, neInfo.NeUID, data)
u := s.udmVOIPService.ParseInfo(neInfo.ID, data)
if u.ID > 0 {
s.udmVOIPService.Insert(neInfo.CoreUID, neInfo.NeUID, u.UserName)
s.udmVOIPService.Insert(neInfo.ID, u.UserName)
c.JSON(200, resp.OkData(u))
return
}
@@ -185,13 +190,13 @@ func (s *UDMVOIPController) Add(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeId(body.NeID)
if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -210,7 +215,7 @@ func (s *UDMVOIPController) Add(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmVOIPService.LoadData(neInfo.CoreUID, neInfo.NeUID, body.UserName, num)
s.udmVOIPService.LoadData(neInfo.ID, body.UserName, num)
}
c.JSON(200, resp.OkData(data))
return
@@ -226,7 +231,7 @@ func (s *UDMVOIPController) Add(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmVOIPService.Insert(neInfo.CoreUID, neInfo.NeUID, body.UserName)
s.udmVOIPService.Insert(neInfo.ID, body.UserName)
}
c.JSON(200, resp.OkData(data))
}
@@ -248,7 +253,6 @@ func (s *UDMVOIPController) Add(c *gin.Context) {
func (s *UDMVOIPController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
UserName string `form:"username" binding:"required"` // 用户名
Num int64 `form:"num"` // 批量数量
@@ -260,13 +264,13 @@ func (s *UDMVOIPController) Remove(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -284,7 +288,7 @@ func (s *UDMVOIPController) Remove(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmVOIPService.LoadData(neInfo.CoreUID, neInfo.NeUID, query.UserName, query.Num)
s.udmVOIPService.LoadData(neInfo.ID, query.UserName, query.Num)
}
c.JSON(200, resp.OkData(data))
return
@@ -308,7 +312,7 @@ func (s *UDMVOIPController) Remove(c *gin.Context) {
}
// 命令ok时
if strings.Contains(data, "ok") {
s.udmVOIPService.Delete(neInfo.CoreUID, neInfo.NeUID, v)
s.udmVOIPService.Delete(neInfo.ID, v)
}
resultData[v] = data
}
@@ -337,8 +341,8 @@ func (s *UDMVOIPController) Export(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
// 查询结果,根据查询条件结果,单页最大值限制
neUid := c.Query("neUid")
if c.Query("coreUid") == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neUid is empty"))
return
}
fileType := c.Query("type")
@@ -412,7 +416,6 @@ func (s *UDMVOIPController) Export(c *gin.Context) {
func (s *UDMVOIPController) Import(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
UploadPath string `json:"uploadPath" binding:"required"` // 上传文件路径
}
@@ -429,13 +432,13 @@ func (s *UDMVOIPController) Import(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -459,7 +462,7 @@ func (s *UDMVOIPController) Import(c *gin.Context) {
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -482,11 +485,11 @@ func (s *UDMVOIPController) Import(c *gin.Context) {
if strings.Contains(resultMsg, "ok") {
if strings.HasSuffix(body.UploadPath, ".csv") {
data := file.ReadFileCSV(localFilePath)
go s.udmVOIPService.InsertData(neInfo.CoreUID, neInfo.NeUID, "csv", data)
go s.udmVOIPService.InsertData(neInfo.ID, "csv", data)
}
if strings.HasSuffix(body.UploadPath, ".txt") {
data := file.ReadFileTXTLine(",", localFilePath)
go s.udmVOIPService.InsertData(neInfo.CoreUID, neInfo.NeUID, "txt", data)
go s.udmVOIPService.InsertData(neInfo.ID, "txt", data)
}
}
c.JSON(200, resp.OkMsg(resultMsg))

View File

@@ -41,17 +41,14 @@ type UDMVolteIMSController struct {
// @Tags network_data/udm/volte-ims
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(001)
// @Param neUid query string true "NeUID" default(001)
// @Success 200 {object} object "Response Results"
// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary UDM VolteIMS User Data Refresh
// @Description UDM Authenticated User Data List Refresh Synchronization Latest
// @Router /nf/udm/volte-ims/reset [put]
func (s *UDMVolteIMSController) ResetData(c *gin.Context) {
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -59,7 +56,14 @@ func (s *UDMVolteIMSController) ResetData(c *gin.Context) {
return
}
data := s.udmVolteIMSService.ResetData(query.CoreUID, query.NeUID)
// 查询网元信息
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID {
c.JSON(200, resp.ErrMsg("neinfo not found"))
return
}
data := s.udmVolteIMSService.ResetData(neInfo.ID)
c.JSON(200, resp.OkData(data))
}
@@ -103,11 +107,10 @@ func (s *UDMVolteIMSController) List(c *gin.Context) {
func (s *UDMVolteIMSController) Info(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
IMSI string `form:"imsi" binding:"required"` // IMSi
MSISDN string `form:"msisdn" binding:"required"` // MSISDN
Volte string `form:"volte" binding:"required,oneof=0 1"` // Volte
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi" binding:"required"` // IMSi
MSISDN string `form:"msisdn" binding:"required"` // MSISDN
Volte string `form:"volte" binding:"required,oneof=0 1"` // Volte
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -116,13 +119,13 @@ func (s *UDMVolteIMSController) Info(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -141,11 +144,15 @@ func (s *UDMVolteIMSController) Info(c *gin.Context) {
c.JSON(200, resp.ErrMsg("No Volte IMS Data"))
return
}
if _, ok := data["COMMAND NOT FOUND, opr"]; ok {
c.JSON(200, resp.ErrMsg("command not found"))
return
}
// 解析返回的数据
u := s.udmVolteIMSService.ParseInfo(neInfo.CoreUID, neInfo.NeUID, data)
u := s.udmVolteIMSService.ParseInfo(neInfo.ID, data)
if u.ID > 0 {
s.udmVolteIMSService.InsertByIMSI(neInfo.CoreUID, neInfo.NeUID, query.IMSI)
s.udmVolteIMSService.InsertByIMSI(neInfo.ID, query.IMSI)
c.JSON(200, resp.OkData(u))
return
}
@@ -187,13 +194,13 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeId(body.NeID)
if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -212,14 +219,14 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmVolteIMSService.LoadData(neInfo.CoreUID, neInfo.NeUID, body.IMSI, num)
s.udmVolteIMSService.LoadData(neInfo.ID, body.IMSI, num)
}
c.JSON(200, resp.OkData(data))
return
}
// 检查同IMSI下msisdn是否存在
hasMsisdns := s.udmVolteIMSService.Find(model.UDMVolteIMSUser{IMSI: body.IMSI, MSISDN: body.MSISDN, NeUID: neInfo.NeUID})
hasMsisdns := s.udmVolteIMSService.Find(model.UDMVolteIMSUser{IMSI: body.IMSI, MSISDN: body.MSISDN, NeID: neInfo.ID})
if len(hasMsisdns) > 0 {
c.JSON(200, resp.ErrMsg("IMSI and MSISDN already exist"))
return
@@ -235,7 +242,7 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmVolteIMSService.InsertByIMSI(neInfo.CoreUID, neInfo.NeUID, body.IMSI)
s.udmVolteIMSService.InsertByIMSI(neInfo.ID, body.IMSI)
}
c.JSON(200, resp.OkData(data))
}
@@ -247,9 +254,7 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) {
// @Tags network_data/udm/volte-ims
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(001)
// @Param neUid query string true "NeUID" default(001)
// @Param imsi query string true "IMSI"
// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Param imsi query string true "IMSI"
// @Param num query number true "Number of releases, value includes start imsi"
// @Param msisdn query string false "MSISDN"
// @Success 200 {object} object "Response Results"
@@ -260,12 +265,11 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) {
func (s *UDMVolteIMSController) Remove(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
IMSI string `form:"imsi" binding:"required"` // IMSi, 带数量时为批量
MSISDN string `form:"msisdn" binding:"required"` // MSISDN, 带数量时为批量
Tag string `form:"tag" binding:"required,oneof=0 1"` // tag
Num int64 `form:"num"` // 批量数量
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
IMSI string `form:"imsi" binding:"required"` // IMSi, 带数量时为批量
MSISDN string `form:"msisdn" binding:"required"` // MSISDN, 带数量时为批量
Tag string `form:"tag" binding:"required,oneof=0 1"` // tag
Num int64 `form:"num"` // 批量数量
}
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -274,13 +278,13 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID)
if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -305,7 +309,7 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
s.udmVolteIMSService.LoadData(neInfo.CoreUID, neInfo.NeUID, query.IMSI, query.Num)
s.udmVolteIMSService.LoadData(neInfo.ID, query.IMSI, query.Num)
}
c.JSON(200, resp.OkData(data))
return
@@ -320,7 +324,7 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) {
}
// 命令ok时
if strings.Contains(data, "ok") {
s.udmVolteIMSService.Delete(neInfo.CoreUID, neInfo.NeUID, query.IMSI)
s.udmVolteIMSService.Delete(neInfo.ID, query.IMSI)
}
c.JSON(200, resp.OkData(data))
}
@@ -332,9 +336,7 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) {
// @Tags network_data/udm/volte-ims
// @Accept json
// @Produce json
// @Param coreUid query string true "CoreUID" default(001)
// @Param neUid query string true "NeUID" default(001)
// @Param type query string true "File Type" Enums(csv,txt) default(txt)
// @Param neUid query string true "NE UID" default(8I73Y01Z)/ @Param type query string true "File Type" Enums(csv,txt) default(txt)
// @Param imsi query string false "IMSI"
// @Param pageNum query number true "pageNum" default(1)
// @Param pageSize query number true "pageSize" default(10)
@@ -346,8 +348,8 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) {
func (s *UDMVolteIMSController) Export(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
neUid := c.Query("neUid")
if c.Query("coreUid") == "" || neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid or neUid is empty"))
if neUid == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neUid is empty"))
return
}
fileType := c.Query("type")
@@ -419,7 +421,6 @@ func (s *UDMVolteIMSController) Export(c *gin.Context) {
func (s *UDMVolteIMSController) Import(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var body struct {
CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" binding:"required"` // 网元唯一标识
UploadPath string `json:"uploadPath" binding:"required"` // 上传文件路径
}
@@ -436,13 +437,13 @@ func (s *UDMVolteIMSController) Import(c *gin.Context) {
}
// 查询网元信息
neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID)
if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" {
neInfo := s.neInfoService.FindByNeUid(body.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != body.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID)
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -466,7 +467,7 @@ func (s *UDMVolteIMSController) Import(c *gin.Context) {
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1)
telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
@@ -489,11 +490,11 @@ func (s *UDMVolteIMSController) Import(c *gin.Context) {
if strings.Contains(resultMsg, "ok") {
if strings.HasSuffix(body.UploadPath, ".csv") {
data := file.ReadFileCSV(localFilePath)
go s.udmVolteIMSService.InsertData(neInfo.CoreUID, neInfo.NeUID, "csv", data)
go s.udmVolteIMSService.InsertData(neInfo.ID, "csv", data)
}
if strings.HasSuffix(body.UploadPath, ".txt") {
data := file.ReadFileTXTLine(",", localFilePath)
go s.udmVolteIMSService.InsertData(neInfo.CoreUID, neInfo.NeUID, "txt", data)
go s.udmVolteIMSService.InsertData(neInfo.ID, "txt", data)
}
}
c.JSON(200, resp.OkMsg(resultMsg))

View File

@@ -43,29 +43,28 @@ type UPFController struct {
// @Router /nf/upf/kpi/flow-total [get]
func (s UPFController) KPIFlowTotal(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var querys struct {
CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识
NeUID string `form:"neUid" binding:"required"` // 网元唯一标识
Day int `form:"day"`
var query struct {
NeUID string `form:"neUid" binding:"required"` // 网唯一标识
Day int `form:"day"`
}
if err := c.ShouldBindQuery(&querys); err != nil {
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
return
}
if querys.Day < 0 || querys.Day > 30 {
if query.Day < 0 || query.Day > 30 {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "day must be between 0 and 30"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID)
if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID {
// 查询网元信息
neInfo := s.neInfoService.FindByNeUid(query.NeUID)
if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
up, down := s.kpiReportService.UPFTodayFlowFind(neInfo.NeUID, querys.Day)
up, down := s.kpiReportService.UPFTodayFlowFind(neInfo.ID, query.Day)
c.JSON(200, resp.OkData(map[string]int64{"up": up, "down": down}))
}

View File

@@ -13,7 +13,7 @@ import (
// AlarmHistory 告警历史记录
func AlarmHistory(neInfo model.NeInfo) ([]map[string]any, error) {
// 网元参数配置信息
neUrl := fmt.Sprintf("http://%s:%d/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType))
neUrl := fmt.Sprintf("http://%s:%d/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType))
resBytes, err := fetch.Get(neUrl, nil, 60_000)
var resData []map[string]any
if err != nil {

View File

@@ -16,7 +16,7 @@ import (
//
// 返回结果 []
func AMFNbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbInfo", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbInfo", neInfo.IpAddr, neInfo.Port)
// 查询参数拼接
query := []string{}
if v, ok := data["id"]; ok && v != "" {
@@ -59,7 +59,7 @@ func AMFNbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]an
//
// 返回结果 []
func AMFGnbStateList(neInfo model.NeInfo) ([]map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbState", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbState", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.Get(neUrl, nil, 60_000)
if err != nil {
errStr := err.Error()

View File

@@ -18,7 +18,7 @@ import (
// data参数 {traceID:"跟踪任务ID", imsi:"IMSI和MSISDN必填一个都带的话以IMSI为准", msisdn:""}
func HLRTraceStart(neInfo model.NeInfo, data map[string]any) (string, error) {
// 网元参数配置新增array
neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/add-task", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/add-task", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.PostJSON(neUrl, data, nil)
var resData map[string]string
if err != nil {
@@ -45,7 +45,7 @@ func HLRTraceStart(neInfo model.NeInfo, data map[string]any) (string, error) {
// data参数 {traceIDArray: ["跟踪任务ID数组"]}
func HLRTraceStop(neInfo model.NeInfo, data map[string]any) (string, error) {
// 网元参数配置新增array
neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/delete-task", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/delete-task", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.PostJSON(neUrl, data, nil)
var resData map[string]string
if err != nil {

View File

@@ -15,7 +15,7 @@ import (
//
// 返回结果 0
func IMSUeSessionNum(neInfo model.NeInfo) (int64, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/ims/objectType/ueNum", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/ims/objectType/ueNum", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.Get(neUrl, nil, 60_000)
if err != nil {
errStr := err.Error()
@@ -47,7 +47,7 @@ func IMSUeSessionNum(neInfo model.NeInfo) (int64, error) {
//
// 返回结果 []
func IMSUeSessionList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/ims/objectType/ueInfo", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/ims/objectType/ueInfo", neInfo.IpAddr, neInfo.Port)
// 查询参数拼接
query := []string{}
if v, ok := data["imsi"]; ok && v != "" {

View File

@@ -16,7 +16,7 @@ import (
//
// 返回结果 []
func MMENbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbInfo", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbInfo", neInfo.IpAddr, neInfo.Port)
// 查询参数拼接
query := []string{}
if v, ok := data["id"]; ok && v != "" {
@@ -59,7 +59,7 @@ func MMENbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]an
//
// 返回结果 []
func MMEEnbStateList(neInfo model.NeInfo) ([]map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbState", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbState", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.Get(neUrl, nil, 60_000)
if err != nil {
errStr := err.Error()

View File

@@ -16,7 +16,7 @@ import (
//
// 返回结果 {"rows":[],"total":0}
func N3IWFSubInfoList(neInfo model.NeInfo, data map[string]string) (map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/n3iwf/objectType/ueInfo", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/n3iwf/objectType/ueInfo", neInfo.IpAddr, neInfo.Port)
// 查询参数拼接
query := []string{}
if v, ok := data["imsi"]; ok && v != "" {

View File

@@ -13,11 +13,11 @@ import (
// NeConfigOMC 网元配置对端网管信息
func NeConfigOMC(neInfo model.NeInfo) (map[string]any, error) {
// 网元配置对端网管信息
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType))
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType))
resBytes, err := fetch.PutJSON(neUrl, map[string]any{
"rmUID": neInfo.CoreUID,
"neId": neInfo.NeName,
"neName": neInfo.NeUID,
"rmUID": neInfo.NeUid,
"neId": fmt.Sprintf("%d", neInfo.ID),
"neName": neInfo.NeName,
"port": neInfo.Port,
"province": neInfo.Province,
"pvFlag": neInfo.PvFlag,
@@ -53,7 +53,7 @@ func NeConfigOMC(neInfo model.NeInfo) (map[string]any, error) {
// NeConfigInfo 网元配置信息
func NeConfigInfo(neInfo model.NeInfo, paramName string) (map[string]any, error) {
// 网元参数配置信息
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName)
resBytes, err := fetch.Get(neUrl, nil, 30_000)
if err != nil {
logger.Warnf("NeConfigInfo Get \"%s\"", neUrl)
@@ -82,7 +82,7 @@ func NeConfigUpdate(neInfo model.NeInfo, paramName, loc string, data map[string]
loc = fmt.Sprintf("?loc=%v", loc)
}
// 网元参数配置新增array
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s%s", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s%s", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc)
resBytes, err := fetch.PutJSON(neUrl, data, nil)
var resData map[string]any
if err != nil {
@@ -112,7 +112,7 @@ func NeConfigUpdate(neInfo model.NeInfo, paramName, loc string, data map[string]
// NeConfigAdd 网元配置新增 array
func NeConfigAdd(neInfo model.NeInfo, paramName, loc string, data map[string]any) (map[string]any, error) {
// 网元参数配置新增array
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s?loc=%v", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s?loc=%v", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc)
resBytes, err := fetch.PostJSON(neUrl, data, nil)
var resData map[string]any
if err != nil {
@@ -142,7 +142,7 @@ func NeConfigAdd(neInfo model.NeInfo, paramName, loc string, data map[string]any
// NeConfigDelete 网元配置删除 array
func NeConfigDelete(neInfo model.NeInfo, paramName, loc string) (map[string]any, error) {
// 网元参数配置删除array
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s?loc=%v", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s?loc=%v", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc)
resBytes, err := fetch.Delete(neUrl, nil)
var resData map[string]any
if err != nil {

View File

@@ -15,7 +15,7 @@ import (
// NeState 获取网元端服务状态
func NeState(neInfo model.NeInfo) (map[string]any, error) {
// 网元状态
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType))
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType))
resBytes, err := fetch.Get(neUrl, nil, 1000)
if err != nil {
logger.Errorf("NeState %s", err.Error())
@@ -41,11 +41,12 @@ func NeState(neInfo model.NeInfo) (map[string]any, error) {
}
info := map[string]any{
"coreUid": neInfo.CoreUID,
"neUid": neInfo.NeUID,
"coreId": neInfo.CoreId,
"neId": neInfo.ID,
"neUid": neInfo.NeUid,
"neType": neInfo.NeType,
"neName": neInfo.NeName,
"ipAddr": neInfo.IPAddr,
"ipAddr": neInfo.IpAddr,
"refreshTime": time.Now().UnixMilli(), // 获取时间
"standby": resData["standby"], // 是否备用服务
"version": resData["version"],

View File

@@ -13,7 +13,7 @@ import (
// NeTraceAdd 网元跟踪任务新增
func NeTraceAdd(neInfo model.NeInfo, data any) (map[string]any, error) {
// 跟踪任务创建
neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v2/%s/subscriptions", neInfo.IPAddr, neInfo.Port, neInfo.NeType)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v2/%s/subscriptions", neInfo.IpAddr, neInfo.Port, neInfo.NeType)
resBytes, err := fetch.PostJSON(neUrl, data, nil)
var resData map[string]any
if err != nil {
@@ -41,7 +41,7 @@ func NeTraceAdd(neInfo model.NeInfo, data any) (map[string]any, error) {
// NeTraceDelete 网元跟踪任务删除
func NeTraceDelete(neInfo model.NeInfo, traceId string) (map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v2/%s/subscriptions?id=%s", neInfo.IPAddr, neInfo.Port, neInfo.NeType, traceId)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v2/%s/subscriptions?id=%s", neInfo.IpAddr, neInfo.Port, neInfo.NeType, traceId)
resBytes, err := fetch.Delete(neUrl, nil)
var resData map[string]any
if err != nil {

View File

@@ -13,7 +13,7 @@ import (
//
// 返回结果 {"rows":[],"total":0}
func NSSFSubInfoList(neInfo model.NeInfo) (map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/nssf/objectType/subscriptions", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/nssf/objectType/subscriptions", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.Get(neUrl, nil, 60_000)
if err != nil {
logger.Warnf("NSSFSubInfo Get \"%s\"", neUrl)
@@ -54,7 +54,7 @@ func NSSFSubInfoList(neInfo model.NeInfo) (map[string]any, error) {
//
// 返回结果 {"rows":[],"total":0}
func NSSFAvailableAMFList(neInfo model.NeInfo) (map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/nssf/objectType/availableAMFs", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/nssf/objectType/availableAMFs", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.Get(neUrl, nil, 60_000)
if err != nil {
logger.Warnf("NSSFAvailableAMFList Get \"%s\"", neUrl)

View File

@@ -12,7 +12,7 @@ import (
// PCFRuleInfo PCF策略配置查询信息
func PCFRuleInfo(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IpAddr, neInfo.Port)
// 查询参数拼接
query := []string{}
if v, ok := data["imsi"]; ok && v != "" {
@@ -56,7 +56,7 @@ func PCFRuleInfo(neInfo model.NeInfo, data map[string]string) ([]map[string]any,
// PCFRuleAdd PCF策略配置添加
func PCFRuleAdd(neInfo model.NeInfo, data any) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.PostJSON(neUrl, data, nil)
if err != nil {
errStr := err.Error()
@@ -85,7 +85,7 @@ func PCFRuleAdd(neInfo model.NeInfo, data any) error {
// PCFRuleAddBatch PCF策略配置批量添加
func PCFRuleAddBatch(neInfo model.NeInfo, data map[string]any, num int64) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d", neInfo.IPAddr, neInfo.Port, num)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d", neInfo.IpAddr, neInfo.Port, num)
resBytes, err := fetch.PostJSON(neUrl, data, nil)
if err != nil {
errStr := err.Error()
@@ -114,7 +114,7 @@ func PCFRuleAddBatch(neInfo model.NeInfo, data map[string]any, num int64) error
// PCFRuleUpdate PCF策略配置修改
func PCFRuleUpdate(neInfo model.NeInfo, data map[string]any) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.PutJSON(neUrl, data, nil)
if err != nil {
errStr := err.Error()
@@ -139,7 +139,7 @@ func PCFRuleUpdate(neInfo model.NeInfo, data map[string]any) error {
// PCFRuleUpdateBatch PCF策略配置批量修改
func PCFRuleUpdateBatch(neInfo model.NeInfo, data map[string]any, num int64) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d", neInfo.IPAddr, neInfo.Port, num)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d", neInfo.IpAddr, neInfo.Port, num)
resBytes, err := fetch.PutJSON(neUrl, data, nil)
if err != nil {
errStr := err.Error()
@@ -164,7 +164,7 @@ func PCFRuleUpdateBatch(neInfo model.NeInfo, data map[string]any, num int64) err
// PCFRuleDelete PCF策略配置删除
func PCFRuleDelete(neInfo model.NeInfo, imsi string) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?imsi=%s", neInfo.IPAddr, neInfo.Port, imsi)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?imsi=%s", neInfo.IpAddr, neInfo.Port, imsi)
resBytes, err := fetch.Delete(neUrl, nil)
if err != nil {
errStr := err.Error()
@@ -193,7 +193,7 @@ func PCFRuleDelete(neInfo model.NeInfo, imsi string) error {
// PCFRuleDeleteBatch PCF策略配置批量删除
func PCFRuleDeleteBatch(neInfo model.NeInfo, imsi string, num int64) error {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d?imsi=%s", neInfo.IPAddr, neInfo.Port, num, imsi)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d?imsi=%s", neInfo.IpAddr, neInfo.Port, num, imsi)
resBytes, err := fetch.Delete(neUrl, nil)
if err != nil {
errStr := err.Error()
@@ -222,7 +222,7 @@ func PCFRuleDeleteBatch(neInfo model.NeInfo, imsi string, num int64) error {
// PCFRuleExport PCF策略配置导出
func PCFRuleExport(neInfo model.NeInfo, data map[string]string) ([]byte, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/export", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/export", neInfo.IpAddr, neInfo.Port)
// 查询参数拼接
query := []string{}
if v, ok := data["fileType"]; ok && v != "" {
@@ -243,7 +243,7 @@ func PCFRuleExport(neInfo model.NeInfo, data map[string]string) ([]byte, error)
// PCFRuleImport PCF策略配置导入
func PCFRuleImport(neInfo model.NeInfo, data map[string]any) (string, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/import", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/import", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.PutJSON(neUrl, data, nil)
var resData map[string]any
if err != nil {

View File

@@ -15,7 +15,7 @@ import (
//
// 返回结果 0
func SMFSubNum(neInfo model.NeInfo) (int64, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/smf/objectType/ueNum", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/smf/objectType/ueNum", neInfo.IpAddr, neInfo.Port)
resBytes, err := fetch.Get(neUrl, nil, 60_000)
if err != nil {
errStr := err.Error()
@@ -47,7 +47,7 @@ func SMFSubNum(neInfo model.NeInfo) (int64, error) {
//
// 返回结果 {"rows":[],"total":0}
func SMFSubInfoList(neInfo model.NeInfo, data map[string]string) (map[string]any, error) {
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/smf/objectType/ueInfo", neInfo.IPAddr, neInfo.Port)
neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/smf/objectType/ueInfo", neInfo.IpAddr, neInfo.Port)
// 查询参数拼接
query := []string{}
if v, ok := data["imsi"]; ok && v != "" {

View File

@@ -2,13 +2,11 @@ package model
// CDREvent CDR会话对象 cdr_event
type CDREvent struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳
CdrJson string `json:"cdrJSON" gorm:"column:cdr_json"` // data JSON String
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 记录创建存储毫秒
RecordTime int64 `json:"recordTime" gorm:"column:record_time"` // 记录时间
CdrJson string `json:"cdrJson" gorm:"column:cdr_json"` // data JSON String
}
// TableName 表名称

View File

@@ -2,16 +2,14 @@ package model
// UDMAuthUser UDM鉴权用户 udm_auth
type UDMAuthUser struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type" binding:"required,oneof=UDM"` // 网元类型
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
Amf string `json:"amf" gorm:"column:amf"` // AMF
Ki string `json:"ki" gorm:"column:ki"` // ki
AlgoIndex string `json:"algoIndex" gorm:"column:algo_index"` // algoIndex
Opc string `json:"opc" gorm:"column:opc"` // OPC
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
Amf string `json:"amf" gorm:"column:amf"` // AMF
Ki string `json:"ki" gorm:"column:ki"` // ki
AlgoIndex string `json:"algoIndex" gorm:"column:algo_index"` // algoIndex
Opc string `json:"opc" gorm:"column:opc"` // OPC
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
}
// TableName 表名称

View File

@@ -2,12 +2,10 @@ package model
// UDMExtend UDM用户IMSI扩展信息 udm_extend
type UDMExtend struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码
Remark string `json:"remark" gorm:"column:remark"` // 备注
}

View File

@@ -2,12 +2,10 @@ package model
// UDMSubUser UDM签约用户 udm_sub
type UDMSubUser struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type" binding:"required,oneof=UDM"` // 网元类型
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码
AmDat string `json:"amDat" gorm:"column:am_dat"` // AmData
UeAmbrTpl string `json:"ambr" gorm:"column:ambr"` // AmData SubUeAMBRTemp

View File

@@ -2,10 +2,8 @@ package model
// UDMVOIPUser UDMVOIP用户 udm_voip
type UDMVOIPUser struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type" binding:"required,oneof=UDM"` // 网元类型
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
UserName string `json:"username" gorm:"column:username"` // 用户名
Password string `json:"password" gorm:"column:password"` // 密码

View File

@@ -2,12 +2,10 @@ package model
// UDMVolteIMSUser UDMVolteIMS用户 udm_volte_ims
type UDMVolteIMSUser struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type" binding:"required,oneof=UDM"` // 网元类型
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码
Tag string `json:"tag" gorm:"column:tag"` // 0=VoIP, 1=VoLTE
VNI string `json:"vni" gorm:"column:vni"` // VNI

View File

@@ -2,14 +2,12 @@ package model
// UEEvent UE会话对象 ue_event
type UEEvent struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识
NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识
NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型
Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到时间
EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型
EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String
CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID
CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 记录创建存储毫秒
RecordTime int64 `json:"recordTime" gorm:"column:record_time"` // 记录时间
EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型
EventJson string `json:"eventJson" gorm:"column:event_json"` // data JSON String
}
// TableName 表名称

View File

@@ -8,6 +8,7 @@ import (
"be.ems/src/framework/database/db"
"be.ems/src/framework/logger"
"be.ems/src/framework/utils/parse"
"be.ems/src/modules/ne_data_nf/model"
)
@@ -19,27 +20,25 @@ type CDREvent struct{}
// SelectByPage 分页查询集合
func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model.CDREvent, int64) {
// 查询结果
var total int64 = 0
rows := []model.CDREvent{}
if neType == "" {
return rows, total
}
// 表名
tableName := fmt.Sprintf("cdr_event_%s", strings.ToLower(neType))
tx := db.DB("").Table(tableName).Model(&model.CDREvent{})
// 查询条件拼接
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
if v, ok := query["neId"]; ok && v != "" {
tx = tx.Where("ne_id = ?", v)
}
if v, ok := query["beginTime"]; ok && v != "" {
if len(v) == 10 {
v = v + "000"
}
tx = tx.Where("created_at >= ?", v)
tx = tx.Where("created_time >= ?", parse.Number(v))
}
if v, ok := query["endTime"]; ok && v != "" {
if len(v) == 10 {
v = v + "000"
}
tx = tx.Where("created_at <= ?", v)
tx = tx.Where("created_time <= ?", parse.Number(v))
}
// 各个网元特殊查询条件
@@ -85,20 +84,16 @@ func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model.
}
}
var total int64 = 0
rows := []model.CDREvent{}
// 查询数量 长度为0直接返回
if err := tx.Count(&total).Error; err != nil || total <= 0 {
return rows, total
}
// 分页
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
if pageNum == 0 && pageSize > int(total) {
pageSize = int(total)
if query["pageNum"] != "" && query["pageSize"] != "" {
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
}
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
@@ -106,60 +101,60 @@ func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model.
}
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortField := v
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortOrder = "desc"
} else {
sortOrder = "asc"
}
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.CDREvent) any{
"id": func(row *model.CDREvent) any { return row.ID },
"timestamp": func(row *model.CDREvent) any { return row.Timestamp },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
if query["sortField"] != "" && query["sortOrder"] != "" {
r.sortRows(query["sortField"], query["sortOrder"], rows)
}
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id timeGroup createdAt
// sortOrder 排序顺序 升序asc 降序desc
func (r CDREvent) sortRows(sortField, sortOrder string, rows []model.CDREvent) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.CDREvent) any{
"id": func(row *model.CDREvent) any { return row.ID },
"createdTime": func(row *model.CDREvent) any { return row.CreatedTime },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// SelectByIds 通过ID查询
func (r CDREvent) SelectByIds(neType string, ids []int64) []model.CDREvent {
rows := []model.CDREvent{}
if len(ids) <= 0 {
if len(ids) <= 0 || neType == "" {
return rows
}
// 表名
@@ -177,7 +172,7 @@ func (r CDREvent) SelectByIds(neType string, ids []int64) []model.CDREvent {
// DeleteByIds 批量删除信息
func (r CDREvent) DeleteByIds(neType string, ids []int64) int64 {
if len(ids) <= 0 {
if len(ids) <= 0 || neType == "" {
return 0
}
// 表名
@@ -191,15 +186,15 @@ func (r CDREvent) DeleteByIds(neType string, ids []int64) int64 {
}
// Insert 新增信息 返回新增数据ID
func (r CDREvent) Insert(param model.CDREvent) int64 {
if param.NeType == "" {
func (r CDREvent) Insert(neType string, param model.CDREvent) int64 {
if neType == "" {
return 0
}
if param.CreatedAt == 0 {
param.CreatedAt = time.Now().UnixMilli()
if param.CreatedTime == 0 {
param.CreatedTime = time.Now().UnixMilli()
}
// 表名
tableName := fmt.Sprintf("cdr_event_%s", strings.ToLower(param.NeType))
tableName := fmt.Sprintf("cdr_event_%s", strings.ToLower(neType))
// 执行插入
if err := db.DB("").Table(tableName).Create(&param).Error; err != nil {
logger.Errorf("insert err => %v", err.Error())

View File

@@ -2,6 +2,7 @@ package repository
import (
"fmt"
"sort"
"strings"
"be.ems/src/framework/database/db"
@@ -16,10 +17,10 @@ var NewUDMAuthUser = &UDMAuthUser{}
type UDMAuthUser struct{}
// ClearAndInsert 清空ne_id后新增实体
func (r *UDMAuthUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMAuthUser) int64 {
func (r *UDMAuthUser) ClearAndInsert(neid int64, uArr []model.UDMAuthUser) int64 {
// 不指定neID时用 TRUNCATE 清空表快
// _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_auth", nil)
result := db.DB("").Where("core_uid = ? and ne_uid = ?", coreUid, neUid).Unscoped().Delete(&model.UDMAuthUser{})
result := db.DB("").Where("ne_id = ?", neid).Unscoped().Delete(&model.UDMAuthUser{})
if result.Error != nil {
logger.Errorf("Delete err => %v", result.Error)
}
@@ -30,15 +31,12 @@ func (r *UDMAuthUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMAuth
func (r *UDMAuthUser) SelectPage(query map[string]string) ([]model.UDMAuthUser, int64) {
tx := db.DB("").Model(&model.UDMAuthUser{})
// 查询条件拼接
if v, ok := query["neId"]; ok && v != "" {
tx = tx.Where("ne_id = ?", v)
}
if v, ok := query["imsi"]; ok && v != "" {
tx = tx.Where("imsi like ?", fmt.Sprintf("%%%s%%", v))
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
}
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
}
if v, ok := query["imsis"]; ok && v != "" {
arr := strings.Split(v, ",")
tx = tx.Where("imsi in ?", arr)
@@ -58,58 +56,90 @@ func (r *UDMAuthUser) SelectPage(query map[string]string) ([]model.UDMAuthUser,
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortSql := v
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
}
}
tx = tx.Order(sortSql)
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
}
// 排序
if query["sortField"] != "" && query["sortOrder"] != "" {
r.sortRows(query["sortField"], query["sortOrder"], rows)
}
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id imsi
// sortOrder 排序顺序 升序asc 降序desc
func (r UDMAuthUser) sortRows(sortField, sortOrder string, rows []model.UDMAuthUser) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.UDMAuthUser) any{
"id": func(row *model.UDMAuthUser) any { return row.ID },
"imsi": func(row *model.UDMAuthUser) any { return row.IMSI },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// SelectList 根据实体查询
func (r *UDMAuthUser) SelectList(u model.UDMAuthUser) []model.UDMAuthUser {
tx := db.DB("").Model(&model.UDMAuthUser{})
// 查询条件拼接
if u.NeID != 0 {
tx = tx.Where("ne_id = ?", u.NeID)
}
if u.IMSI != "" {
tx = tx.Where("imsi = ?", u.IMSI)
}
if u.NeUID != "" {
tx = tx.Where("ne_uid = ?", u.NeUID)
}
if u.CoreUID != "" {
tx = tx.Where("core_uid = ?", u.CoreUID)
}
// 查询数据
arr := []model.UDMAuthUser{}
if err := tx.Order("imsi asc").Find(&arr).Error; err != nil {
if err := tx.Find(&arr).Error; err != nil {
logger.Errorf("query err => %v", err)
}
return arr
}
// SelectByIMSI 通过imsi查询
func (r *UDMAuthUser) SelectByIMSI(coreUid, neUid, imsi string) model.UDMAuthUser {
func (r *UDMAuthUser) SelectByIMSI(neid int64, imsi string) model.UDMAuthUser {
tx := db.DB("").Model(&model.UDMAuthUser{})
item := model.UDMAuthUser{}
// 查询条件拼接
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neid)
tx = tx.Where("imsi = ?", imsi)
// 查询数据
if err := tx.Order("imsi asc").Limit(1).Find(&item).Error; err != nil {
if err := tx.Limit(1).Find(&item).Error; err != nil {
logger.Errorf("query err => %v", err)
}
return item
@@ -125,9 +155,9 @@ func (r *UDMAuthUser) Inserts(uArr []model.UDMAuthUser) int64 {
}
// Delete 删除实体
func (r *UDMAuthUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 {
func (r *UDMAuthUser) DeleteByIMSI(neid int64, imsi string) int64 {
tx := db.DB("")
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neid)
tx = tx.Where("imsi = ?", imsi)
tx.Delete(&model.UDMAuthUser{})
if err := tx.Error; err != nil {
@@ -137,9 +167,9 @@ func (r *UDMAuthUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 {
}
// DeletePrefixByIMSI 删除前缀匹配的实体
func (r *UDMAuthUser) DeletePrefixByIMSI(coreUid, neUid, imsiPrefix string) int64 {
func (r *UDMAuthUser) DeletePrefixByIMSI(neid int64, imsiPrefix string) int64 {
tx := db.DB("")
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neid)
tx = tx.Where("imsi like ?", fmt.Sprintf("%s%%", imsiPrefix))
tx.Delete(&model.UDMAuthUser{})
if err := tx.Error; err != nil {

View File

@@ -2,6 +2,7 @@ package repository
import (
"fmt"
"sort"
"be.ems/src/framework/database/db"
"be.ems/src/framework/logger"
@@ -18,15 +19,12 @@ type UDMExtend struct{}
func (r UDMExtend) SelectByPage(query map[string]string) ([]model.UDMExtend, int64) {
tx := db.DB("").Model(&model.UDMExtend{})
// 查询条件拼接
if v, ok := query["neId"]; ok && v != "" {
tx = tx.Where("ne_id = ?", v)
}
if v, ok := query["imsi"]; ok && v != "" {
tx = tx.Where("imsi like ?", fmt.Sprintf("%%%s%%", v))
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
}
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
}
// 查询结果
var total int64 = 0
@@ -37,40 +35,77 @@ func (r UDMExtend) SelectByPage(query map[string]string) ([]model.UDMExtend, int
return rows, total
}
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortField := v
if o, ok := query["sortOrder"]; ok && o != "" {
sortField = sortField + " desc"
}
tx = tx.Order(sortField)
// 分页
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
err := tx.Find(&rows).Error
if err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows, total
// 排序
if query["sortField"] != "" && query["sortOrder"] != "" {
r.sortRows(query["sortField"], query["sortOrder"], rows)
}
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id imsi
// sortOrder 排序顺序 升序asc 降序desc
func (r UDMExtend) sortRows(sortField, sortOrder string, rows []model.UDMExtend) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.UDMExtend) any{
"id": func(row *model.UDMExtend) any { return row.ID },
"imsi": func(row *model.UDMExtend) any { return row.IMSI },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// SelectList 根据实体查询
func (r *UDMExtend) SelectList(u model.UDMExtend) []model.UDMExtend {
tx := db.DB("").Model(&model.UDMExtend{})
// 构建查询条件
if u.NeID != 0 {
tx = tx.Where("ne_id = ?", u.NeID)
}
if u.IMSI != "" {
tx = tx.Where("imsi = ?", u.IMSI)
}
if u.NeUID != "" {
tx = tx.Where("ne_uid = ?", u.NeUID)
}
if u.CoreUID != "" {
tx = tx.Where("core_uid = ?", u.CoreUID)
}
tx = tx.Order("imsi asc")
// 查询数据
rows := []model.UDMExtend{}
if err := tx.Find(&rows).Error; err != nil {
@@ -80,15 +115,14 @@ func (r *UDMExtend) SelectList(u model.UDMExtend) []model.UDMExtend {
return rows
}
// SelectByIMSI 通过imsi查询 neUid为%时模糊imsi查询
func (r *UDMExtend) SelectByIMSI(coreUid, neUid, imsi string) model.UDMExtend {
// SelectByIMSI 通过imsi查询 neId为0时模糊imsi查询
func (r *UDMExtend) SelectByIMSI(neid int64, imsi string) model.UDMExtend {
tx := db.DB("").Model(&model.UDMExtend{})
// 查询条件拼接
if neUid == "%" {
tx = tx.Where("core_uid = ?", coreUid)
if neid == 0 {
tx = tx.Where("imsi like ?", fmt.Sprintf("%s%%", imsi))
} else {
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neid)
tx = tx.Where("imsi = ?", imsi)
}
// 查询数据
@@ -111,15 +145,14 @@ func (r *UDMExtend) Inserts(uArr []model.UDMExtend) int64 {
return tx.RowsAffected
}
// Delete 删除实体 neUid为%时模糊imsi前缀
func (r *UDMExtend) DeleteByIMSI(coreUid, neUid, imsi string) int64 {
// Delete 删除实体 neId为0时模糊imsi前缀
func (r *UDMExtend) DeleteByIMSI(neid int64, imsi string) int64 {
tx := db.DB("")
// 查询条件拼接
if neUid == "%" {
tx = tx.Where("core_uid = ?", coreUid)
if neid == 0 {
tx = tx.Where("imsi like ?", fmt.Sprintf("%s%%", imsi))
} else {
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neid)
tx = tx.Where("imsi = ?", imsi)
}
tx = tx.Delete(&model.UDMExtend{})

View File

@@ -2,6 +2,7 @@ package repository
import (
"fmt"
"sort"
"strings"
"be.ems/src/framework/database/db"
@@ -16,10 +17,10 @@ var NewUDMSub = &UDMSubUser{}
type UDMSubUser struct{}
// ClearAndInsert 清空ne_id后新增实体
func (r *UDMSubUser) ClearAndInsert(coreUid, neUid string, u []model.UDMSubUser) int64 {
func (r *UDMSubUser) ClearAndInsert(neid int64, u []model.UDMSubUser) int64 {
// 不指定neID时用 TRUNCATE 清空表快
// _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_sub", nil)
result := db.DB("").Where("core_uid = ? and ne_uid = ?", neUid).Unscoped().Delete(&model.UDMSubUser{})
result := db.DB("").Where("ne_id = ?", neid).Unscoped().Delete(&model.UDMSubUser{})
if result.Error != nil {
logger.Errorf("Delete err => %v", result.Error)
}
@@ -30,18 +31,15 @@ func (r *UDMSubUser) ClearAndInsert(coreUid, neUid string, u []model.UDMSubUser)
func (r *UDMSubUser) SelectPage(query map[string]string) ([]model.UDMSubUser, int64) {
tx := db.DB("").Model(&model.UDMSubUser{})
// 查询条件拼接
if v, ok := query["neId"]; ok && v != "" {
tx = tx.Where("ne_id = ?", v)
}
if v, ok := query["imsi"]; ok && v != "" {
tx = tx.Where("imsi like ?", fmt.Sprintf("%%%s%%", v))
}
if v, ok := query["msisdn"]; ok && v != "" {
tx = tx.Where("msisdn like ?", fmt.Sprintf("%%%s%%", v))
}
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
}
if v, ok := query["imsis"]; ok && v != "" {
arr := strings.Split(v, ",")
tx = tx.Where("imsi in ?", arr)
@@ -61,57 +59,90 @@ func (r *UDMSubUser) SelectPage(query map[string]string) ([]model.UDMSubUser, in
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortSql := v
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
}
}
tx = tx.Order(sortSql)
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
}
// 排序
if query["sortField"] != "" && query["sortOrder"] != "" {
r.sortRows(query["sortField"], query["sortOrder"], rows)
}
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id imsi
// sortOrder 排序顺序 升序asc 降序desc
func (r UDMSubUser) sortRows(sortField, sortOrder string, rows []model.UDMSubUser) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.UDMSubUser) any{
"id": func(row *model.UDMSubUser) any { return row.ID },
"imsi": func(row *model.UDMSubUser) any { return row.IMSI },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// SelectList 根据实体查询
func (r *UDMSubUser) SelectList(u model.UDMSubUser) []model.UDMSubUser {
tx := db.DB("").Model(&model.UDMSubUser{})
// 查询条件拼接
if u.NeID != 0 {
tx = tx.Where("ne_id = ?", u.NeID)
}
if u.IMSI != "" {
tx = tx.Where("imsi = ?", u.IMSI)
}
if u.NeUID != "" {
tx = tx.Where("ne_uid = ?", u.NeUID)
}
if u.CoreUID != "" {
tx = tx.Where("core_uid = ?", u.CoreUID)
}
// 查询数据
arr := []model.UDMSubUser{}
if err := tx.Order("imsi asc").Find(&arr).Error; err != nil {
if err := tx.Find(&arr).Error; err != nil {
logger.Errorf("query err => %v", err)
}
return arr
}
// SelectByIMSIAndNeID 通过imsi查询
func (r *UDMSubUser) SelectByIMSI(coreUid, neUid, imsi string) model.UDMSubUser {
func (r *UDMSubUser) SelectByIMSI(neId int64, imsi string) model.UDMSubUser {
tx := db.DB("").Model(&model.UDMSubUser{})
item := model.UDMSubUser{}
// 查询条件拼接
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neId)
tx = tx.Where("imsi = ?", imsi)
// 查询数据
if err := tx.Order("imsi asc").Limit(1).Find(&item).Error; err != nil {
if err := tx.Limit(1).Find(&item).Error; err != nil {
logger.Errorf("query err => %v", err)
}
return item
@@ -127,9 +158,9 @@ func (r *UDMSubUser) Inserts(uArr []model.UDMSubUser) int64 {
}
// DeleteByIMSI 删除实体
func (r *UDMSubUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 {
func (r *UDMSubUser) DeleteByIMSI(neId int64, imsi string) int64 {
tx := db.DB("")
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neId)
tx = tx.Where("imsi = ?", imsi)
tx.Delete(&model.UDMSubUser{})
if err := tx.Error; err != nil {
@@ -139,9 +170,9 @@ func (r *UDMSubUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 {
}
// DeletePrefixByIMSI 删除前缀匹配的实体
func (r *UDMSubUser) DeletePrefixByIMSI(coreUid, neUid, imsiPrefix string) int64 {
func (r *UDMSubUser) DeletePrefixByIMSI(neId int64, imsiPrefix string) int64 {
tx := db.DB("")
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neId)
tx = tx.Where("imsi like ?", fmt.Sprintf("%s%%", imsiPrefix))
tx.Delete(&model.UDMSubUser{})
if err := tx.Error; err != nil {

View File

@@ -2,6 +2,7 @@ package repository
import (
"fmt"
"sort"
"strings"
"be.ems/src/framework/database/db"
@@ -16,10 +17,10 @@ var NewUDMVOIPUser = &UDMVOIPUser{}
type UDMVOIPUser struct{}
// ClearAndInsert 清空ne_id后新增实体
func (r UDMVOIPUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMVOIPUser) int64 {
func (r UDMVOIPUser) ClearAndInsert(neId int64, uArr []model.UDMVOIPUser) int64 {
// 不指定neID时用 TRUNCATE 清空表快
// _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_voip", nil)
result := db.DB("").Where("core_uid = ? and ne_uid = ?", coreUid, neUid).Unscoped().Delete(&model.UDMVOIPUser{})
result := db.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMVOIPUser{})
if result.Error != nil {
logger.Errorf("Delete err => %v", result.Error)
}
@@ -30,15 +31,12 @@ func (r UDMVOIPUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMVOIPU
func (r UDMVOIPUser) SelectPage(query map[string]string) ([]model.UDMVOIPUser, int64) {
tx := db.DB("").Model(&model.UDMVOIPUser{})
// 查询条件拼接
if v, ok := query["neId"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
}
if v, ok := query["username"]; ok && v != "" {
tx = tx.Where("username like ?", fmt.Sprintf("%%%s%%", v))
}
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
}
if v, ok := query["usernames"]; ok && v != "" {
arr := strings.Split(v, ",")
tx = tx.Where("username in ?", arr)
@@ -58,60 +56,90 @@ func (r UDMVOIPUser) SelectPage(query map[string]string) ([]model.UDMVOIPUser, i
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortSql := v
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
}
}
tx = tx.Order(sortSql)
} else {
tx = tx.Order("username asc")
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
}
// 排序
if query["sortField"] != "" && query["sortOrder"] != "" {
r.sortRows(query["sortField"], query["sortOrder"], rows)
}
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id imsi
// sortOrder 排序顺序 升序asc 降序desc
func (r UDMVOIPUser) sortRows(sortField, sortOrder string, rows []model.UDMVOIPUser) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.UDMVOIPUser) any{
"id": func(row *model.UDMVOIPUser) any { return row.ID },
"username": func(row *model.UDMVOIPUser) any { return row.UserName },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// SelectList 根据实体查询
func (r UDMVOIPUser) SelectList(u model.UDMVOIPUser) []model.UDMVOIPUser {
tx := db.DB("").Model(&model.UDMVOIPUser{})
// 查询条件拼接
if u.NeID != 0 {
tx = tx.Where("ne_id = ?", u.NeID)
}
if u.UserName != "" {
tx = tx.Where("username = ?", u.UserName)
}
if u.NeUID != "" {
tx = tx.Where("ne_uid = ?", u.NeUID)
}
if u.CoreUID != "" {
tx = tx.Where("core_uid = ?", u.CoreUID)
}
// 查询数据
arr := []model.UDMVOIPUser{}
if err := tx.Order("username asc").Find(&arr).Error; err != nil {
if err := tx.Find(&arr).Error; err != nil {
logger.Errorf("query err => %v", err)
}
return arr
}
// SelectByUserName 通过username查询
func (r UDMVOIPUser) SelectByUserName(coreUid, neUid, username string) model.UDMVOIPUser {
func (r UDMVOIPUser) SelectByUserName(neId int64, username string) model.UDMVOIPUser {
tx := db.DB("").Model(&model.UDMVOIPUser{})
item := model.UDMVOIPUser{}
// 查询条件拼接
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neId)
tx = tx.Where("username = ?", username)
// 查询数据
if err := tx.Order("username asc").Limit(1).Find(&item).Error; err != nil {
if err := tx.Limit(1).Find(&item).Error; err != nil {
logger.Errorf("query err => %v", err)
}
return item
@@ -127,9 +155,9 @@ func (r UDMVOIPUser) Inserts(uArr []model.UDMVOIPUser) int64 {
}
// DeleteByUserName 删除实体
func (r UDMVOIPUser) DeleteByUserName(coreUid, neUid, username string) int64 {
func (r UDMVOIPUser) DeleteByUserName(neId int64, username string) int64 {
tx := db.DB("")
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neId)
tx = tx.Where("username = ?", username)
tx.Delete(&model.UDMVOIPUser{})
if err := tx.Error; err != nil {
@@ -139,9 +167,9 @@ func (r UDMVOIPUser) DeleteByUserName(coreUid, neUid, username string) int64 {
}
// DeletePrefixByUserName 删除前缀匹配的实体
func (r UDMVOIPUser) DeletePrefixByUserName(coreUid, neUid, usernamePrefix string) int64 {
func (r UDMVOIPUser) DeletePrefixByUserName(neId int64, usernamePrefix string) int64 {
tx := db.DB("")
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neId)
tx = tx.Where("username like ?", fmt.Sprintf("%s%%", usernamePrefix))
tx.Delete(&model.UDMVOIPUser{})
if err := tx.Error; err != nil {

View File

@@ -2,6 +2,7 @@ package repository
import (
"fmt"
"sort"
"strings"
"be.ems/src/framework/database/db"
@@ -16,10 +17,10 @@ var NewUDMVolteIMSUser = &UDMVolteIMSUser{}
type UDMVolteIMSUser struct{}
// ClearAndInsert 清空ne_id后新增实体
func (r UDMVolteIMSUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMVolteIMSUser) int64 {
func (r UDMVolteIMSUser) ClearAndInsert(neId int64, uArr []model.UDMVolteIMSUser) int64 {
// 不指定neID时用 TRUNCATE 清空表快
// _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_volte_ims", nil)
result := db.DB("").Where("core_uid = ? and ne_uid = ?", coreUid, neUid).Unscoped().Delete(&model.UDMVolteIMSUser{})
result := db.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMVolteIMSUser{})
if result.Error != nil {
logger.Errorf("Delete err => %v", result.Error)
}
@@ -30,18 +31,15 @@ func (r UDMVolteIMSUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMV
func (r UDMVolteIMSUser) SelectPage(query map[string]string) ([]model.UDMVolteIMSUser, int64) {
tx := db.DB("").Model(&model.UDMVolteIMSUser{})
// 查询条件拼接
if v, ok := query["neId"]; ok && v != "" {
tx = tx.Where("ne_id = ?", v)
}
if v, ok := query["imsi"]; ok && v != "" {
tx = tx.Where("imsi like ?", fmt.Sprintf("%%%s%%", v))
}
if v, ok := query["msisdn"]; ok && v != "" {
tx = tx.Where("msisdn like ?", fmt.Sprintf("%%%s%%", v))
}
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
}
if v, ok := query["tag"]; ok && v != "" {
tx = tx.Where("tag = ?", v)
}
@@ -67,38 +65,69 @@ func (r UDMVolteIMSUser) SelectPage(query map[string]string) ([]model.UDMVolteIM
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortSql := v
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortSql += " desc "
} else {
sortSql += " asc "
}
}
tx = tx.Order(sortSql)
} else {
tx = tx.Order("imsi asc")
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query err => %v", err)
}
// 排序
if query["sortField"] != "" && query["sortOrder"] != "" {
r.sortRows(query["sortField"], query["sortOrder"], rows)
}
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id imsi
// sortOrder 排序顺序 升序asc 降序desc
func (r UDMVolteIMSUser) sortRows(sortField, sortOrder string, rows []model.UDMVolteIMSUser) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.UDMVolteIMSUser) any{
"id": func(row *model.UDMVolteIMSUser) any { return row.ID },
"imsi": func(row *model.UDMVolteIMSUser) any { return row.IMSI },
"msisdn": func(row *model.UDMVolteIMSUser) any { return row.MSISDN },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// SelectList 根据实体查询
func (r UDMVolteIMSUser) SelectList(u model.UDMVolteIMSUser) []model.UDMVolteIMSUser {
tx := db.DB("").Model(&model.UDMVolteIMSUser{})
// 查询条件拼接
if u.NeUID != "" {
tx = tx.Where("ne_uid = ?", u.NeUID)
}
if u.CoreUID != "" {
tx = tx.Where("core_uid = ?", u.CoreUID)
if u.NeID != 0 {
tx = tx.Where("ne_id = ?", u.NeID)
}
if u.IMSI != "" {
tx = tx.Where("imsi = ?", u.IMSI)
@@ -116,11 +145,11 @@ func (r UDMVolteIMSUser) SelectList(u model.UDMVolteIMSUser) []model.UDMVolteIMS
}
// SelectByIMSIAndMSISDN 通过imsi,msisdn查询
func (r UDMVolteIMSUser) SelectByIMSIAndMSISDN(coreUid, neUid, imsi, msisdn string) model.UDMVolteIMSUser {
func (r UDMVolteIMSUser) SelectByIMSIAndMSISDN(neId int64, imsi, msisdn string) model.UDMVolteIMSUser {
tx := db.DB("").Model(&model.UDMVolteIMSUser{})
item := model.UDMVolteIMSUser{}
// 查询条件拼接
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neId)
tx = tx.Where("imsi = ? and msisdn = ?", imsi, msisdn)
// 查询数据
if err := tx.Order("imsi asc").Limit(1).Find(&item).Error; err != nil {
@@ -139,9 +168,9 @@ func (r UDMVolteIMSUser) Inserts(uArr []model.UDMVolteIMSUser) int64 {
}
// Delete 删除实体
func (r UDMVolteIMSUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 {
func (r UDMVolteIMSUser) DeleteByIMSI(neId int64, imsi string) int64 {
tx := db.DB("")
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neId)
tx = tx.Where("imsi = ?", imsi)
tx.Delete(&model.UDMVolteIMSUser{})
if err := tx.Error; err != nil {
@@ -151,9 +180,9 @@ func (r UDMVolteIMSUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 {
}
// DeletePrefixByIMSI 删除前缀匹配的实体
func (r UDMVolteIMSUser) DeletePrefixByIMSI(coreUid, neUid, imsiPrefix string) int64 {
func (r UDMVolteIMSUser) DeletePrefixByIMSI(neId int64, imsiPrefix string) int64 {
tx := db.DB("")
tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid)
tx = tx.Where("ne_id = ?", neId)
tx = tx.Where("imsi like ?", fmt.Sprintf("%s%%", imsiPrefix))
tx.Delete(&model.UDMVolteIMSUser{})
if err := tx.Error; err != nil {

View File

@@ -19,27 +19,24 @@ type UEEvent struct{}
// SelectByPage 分页查询集合
func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.UEEvent, int64) {
// 查询结果
var total int64 = 0
rows := []model.UEEvent{}
if neType == "" {
return rows, total
}
// 表名
tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType))
tx := db.DB("").Table(tableName).Model(&model.CDREvent{})
// 查询条件拼接
if v, ok := query["coreUid"]; ok && v != "" {
tx = tx.Where("core_uid = ?", v)
}
if v, ok := query["neUid"]; ok && v != "" {
tx = tx.Where("ne_uid = ?", v)
if v, ok := query["neId"]; ok && v != "" {
tx = tx.Where("ne_id = ?", v)
}
if v, ok := query["beginTime"]; ok && v != "" {
if len(v) == 10 {
v = v + "000"
}
tx = tx.Where("created_at >= ?", v)
tx = tx.Where("created_time >= ?", v)
}
if v, ok := query["endTime"]; ok && v != "" {
if len(v) == 10 {
v = v + "000"
}
tx = tx.Where("created_at <= ?", v)
tx = tx.Where("created_time <= ?", v)
}
if v, ok := query["eventType"]; ok && v != "" {
eventTypes := strings.Split(v, ",")
@@ -49,18 +46,16 @@ func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.U
tx = tx.Where("JSON_EXTRACT(event_json, '$.imsi') like ?", fmt.Sprintf("%%%s%%", v))
}
// 查询结果
var total int64 = 0
rows := []model.UEEvent{}
// 查询数量 长度为0直接返回
if err := tx.Count(&total).Error; err != nil || total <= 0 {
return rows, total
}
// 分页
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
if query["pageNum"] != "" && query["pageSize"] != "" {
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
}
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
@@ -68,60 +63,60 @@ func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.U
}
// 排序
if v, ok := query["sortField"]; ok && v != "" {
sortField := v
sortOrder := "asc"
if o, ok := query["sortOrder"]; ok && o != "" {
if o == "desc" {
sortOrder = "desc"
} else {
sortOrder = "asc"
}
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.UEEvent) any{
"id": func(row *model.UEEvent) any { return row.ID },
"timestamp": func(row *model.UEEvent) any { return row.CreatedAt },
"createdAt": func(row *model.UEEvent) any { return row.CreatedAt },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
if query["sortField"] != "" && query["sortOrder"] != "" {
r.sortRows(query["sortField"], query["sortOrder"], rows)
}
return rows, total
}
// sortRows 排序数据集合
// sortField 排序字段 支持id timeGroup createdAt
// sortOrder 排序顺序 升序asc 降序desc
func (r UEEvent) sortRows(sortField, sortOrder string, rows []model.UEEvent) {
if sortField == "" {
return
}
sort.SliceStable(rows, func(i, j int) bool {
// 支持的排序字段映射
fieldGetters := map[string]func(*model.UEEvent) any{
"id": func(row *model.UEEvent) any { return row.ID },
"createdTime": func(row *model.UEEvent) any { return row.CreatedTime },
// 可添加更多支持的字段
}
// 获取字段 getter 函数
getter, ok := fieldGetters[sortField]
if !ok {
// 非法字段使用默认排序id升序
return rows[i].ID < rows[j].ID
}
// 获取比较值
valI, valJ := getter(&rows[i]), getter(&rows[j])
// 根据字段类型进行比较
switch v := valI.(type) {
case int64:
if sortOrder == "desc" {
return v > valJ.(int64)
}
return v < valJ.(int64)
case string:
if sortOrder == "desc" {
return v > valJ.(string)
}
return v < valJ.(string)
default:
// 不支持的字段类型,使用默认排序
return rows[i].ID < rows[j].ID
}
})
}
// SelectByIds 通过ID查询
func (r UEEvent) SelectByIds(neType string, ids []int64) []model.UEEvent {
rows := []model.UEEvent{}
if len(ids) <= 0 {
if len(ids) <= 0 || neType == "" {
return rows
}
// 表名
@@ -139,7 +134,7 @@ func (r UEEvent) SelectByIds(neType string, ids []int64) []model.UEEvent {
// DeleteByIds 批量删除信息
func (r UEEvent) DeleteByIds(neType string, ids []int64) int64 {
if len(ids) <= 0 {
if len(ids) <= 0 || neType == "" {
return 0
}
// 表名
@@ -153,15 +148,15 @@ func (r UEEvent) DeleteByIds(neType string, ids []int64) int64 {
}
// Insert 新增信息 返回新增数据ID
func (r UEEvent) Insert(param model.UEEvent) int64 {
if param.NeType == "" {
func (r UEEvent) Insert(neType string, param model.UEEvent) int64 {
if neType == "" {
return 0
}
if param.CreatedAt == 0 {
param.CreatedAt = time.Now().UnixMilli()
if param.CreatedTime == 0 {
param.CreatedTime = time.Now().UnixMilli()
}
// 表名
tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(param.NeType))
tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType))
// 执行插入
if err := db.DB("").Table(tableName).Create(&param).Error; err != nil {
logger.Errorf("insert err => %v", err.Error())

View File

@@ -322,11 +322,11 @@ func (s *CBCMessage) handleStatusChange(msg model.CBCMessage, oldStatus, newStat
// 这个方法需要根据你的实际网元管理系统来实现
func (s *CBCMessage) getCBCNetworkElement(neId string) (string, int64, error) {
// 查询网元信息
neInfo := neService.NewNeInfo.FindByCoreUidAndNeUid("CBC", neId)
if neInfo.IPAddr == "" {
neInfo := neService.NewNeInfo.FindByNeUid(neId)
if neInfo.IpAddr == "" {
return "", 0, fmt.Errorf("CBC network element not found for neId: %s", neId)
}
return neInfo.IPAddr, neInfo.Port, nil
return neInfo.IpAddr, neInfo.Port, nil
}
// CBCHTTPClient CBC网元HTTP客户端

Some files were not shown because too many files have changed in this diff Show More