package repository import ( "strconv" "strings" "be.ems/src/framework/datasource" "be.ems/src/framework/logger" "be.ems/src/framework/utils/parse" "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_element/model" ) // 实例化数据层 UDMSubImpl 结构体 var NewUDMSubImpl = &UDMSubImpl{ selectSql: `select id, msisdn, imsi, ambr, nssai, rat, arfb, sar, cn, sm_data, smf_sel, eps_dat, ne_id, eps_flag, eps_odb, hplmn_odb, ard, epstpl, context_id, apn_context, static_ip, tenant_name from u_sub_user`, resultMap: map[string]string{ "id": "ID", "msisdn": "Msisdn", "imsi": "Imsi", "ambr": "Ambr", "nssai": "Nssai", "rat": "Rat", "arfb": "Arfb", "sar": "Sar", "cn": "Cn", "sm_data": "SmData", "smf_sel": "SmfSel", "eps_dat": "EpsDat", "ne_id": "NeID", "eps_flag": "EpsFlag", "eps_odb": "EpsOdb", "hplmn_odb": "HplmnOdb", "ard": "Ard", "epstpl": "Epstpl", "context_id": "ContextId", "apn_context": "ApnContext", "static_ip": "StaticIp", "tenant_name": "TenantName", // Tenant ID for multi-tenancy }, } // UDMSubImpl UDM签约信息表 数据层处理 type UDMSubImpl struct { // 查询视图对象SQL selectSql string // 结果字段与实体映射 resultMap map[string]string } // convertResultRows 将结果记录转实体结果组 func (r *UDMSubImpl) convertResultRows(rows []map[string]any) []model.UDMSub { arr := make([]model.UDMSub, 0) for _, row := range rows { item := model.UDMSub{} for key, value := range row { if keyMapper, ok := r.resultMap[key]; ok { repo.SetFieldValue(&item, keyMapper, value) } } arr = append(arr, item) } return arr } // ClearAndInsert 清空ne_id后新增实体 func (r *UDMSubImpl) ClearAndInsert(neID string, subArr []model.UDMSub) int64 { // 清空指定ne_id _, err := datasource.ExecDB("", "TRUNCATE TABLE u_sub_user", nil) if err != nil { logger.Errorf("TRUNCATE err => %v", err) } return r.Inserts(subArr) } // SelectPage 根据条件分页查询字典类型 func (r *UDMSubImpl) SelectPage(query map[string]any) map[string]any { // 查询条件拼接 var conditions []string var params []any if v, ok := query["msisdn"]; ok && v != "" { conditions = append(conditions, "msisdn like concat(concat('%', ?), '%')") params = append(params, strings.Trim(v.(string), " ")) } if v, ok := query["imsi"]; ok && v != "" { conditions = append(conditions, "imsi like concat(concat('%', ?), '%')") params = append(params, strings.Trim(v.(string), " ")) } if v, ok := query["neId"]; ok && v != "" { conditions = append(conditions, "ne_id = ?") params = append(params, v) } // for multi-tenancy solution if v, ok := query["tenantName"]; ok && v != "" { conditions = append(conditions, "tenant_name = '?'") params = append(params, v) } // 构建查询条件语句 whereSql := "" if len(conditions) > 0 { whereSql += " where " + strings.Join(conditions, " and ") } result := map[string]any{ "total": 0, "rows": []model.UDMSub{}, } // 查询数量 长度为0直接返回 totalSql := "select count(1) as 'total' from u_sub_user" totalRows, err := datasource.RawDB("", totalSql+whereSql, params) if err != nil { logger.Errorf("total err => %v", err) return result } total := parse.Number(totalRows[0]["total"]) if total == 0 { return result } else { result["total"] = total } // 分页 pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) pageSql := " limit ?,? " params = append(params, pageNum*pageSize) params = append(params, pageSize) // 排序 sortSql := "" if v, ok := query["sortField"]; ok && v != "" { if v == "imsi" { sortSql += " order by imsi " } if v == "msisdn" { sortSql += " order by msisdn " } if o, ok := query["sortOrder"]; ok && o != nil && v != "" { if o == "desc" { sortSql += " desc " } else { sortSql += " asc " } } } // 查询数据 querySql := r.selectSql + whereSql + sortSql + pageSql results, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err => %v", err) return result } // 转换实体 result["rows"] = r.convertResultRows(results) return result } // SelectList 根据实体查询 func (r *UDMSubImpl) SelectList(subUser model.UDMSub) []model.UDMSub { // 查询条件拼接 var conditions []string var params []any if subUser.Imsi != "" { conditions = append(conditions, "imsi = ?") params = append(params, subUser.Imsi) } if subUser.NeID != "" { conditions = append(conditions, "ne_id = ?") params = append(params, subUser.NeID) } // 构建查询条件语句 whereSql := "" if len(conditions) > 0 { whereSql += " where " + strings.Join(conditions, " and ") } // 查询数据 querySql := r.selectSql + whereSql + " order by imsi asc " results, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err => %v", err) } // 转换实体 return r.convertResultRows(results) } // Insert 新增实体 func (r *UDMSubImpl) Insert(subUser model.UDMSub) string { err := datasource.DefaultDB().Create(&subUser).Error if err != nil { logger.Errorf("Create err => %v", err) } return subUser.ID } // Insert 批量添加 func (r *UDMSubImpl) Inserts(subUser []model.UDMSub) int64 { tx := datasource.DefaultDB().CreateInBatches(subUser, 2000) if err := tx.Error; err != nil { logger.Errorf("CreateInBatches err => %v", err) } return tx.RowsAffected } // Update 修改更新 func (r *UDMSubImpl) Update(neID string, subUser model.UDMSub) int64 { // 查询先 var user model.UDMSub err := datasource.DefaultDB().Where("imsi = ? and ne_id = ?", subUser.Imsi, neID).First(&user).Error if err != nil { logger.Errorf("Update First err => %v", err) } if user.Msisdn != subUser.Msisdn { user.Msisdn = subUser.Msisdn } if user.Ambr != subUser.Ambr { user.Ambr = subUser.Ambr } if user.Arfb != subUser.Arfb { user.Arfb = subUser.Arfb } if user.Sar != subUser.Sar { user.Sar = subUser.Sar } if user.Rat != subUser.Rat { user.Rat = subUser.Rat } if user.Cn != subUser.Cn { user.Cn = subUser.Cn } if user.SmfSel != subUser.SmfSel { user.SmfSel = subUser.SmfSel } if user.SmData != subUser.SmData { user.SmData = subUser.SmData } if user.EpsDat != subUser.EpsDat { user.EpsDat = subUser.EpsDat } if user.EpsFlag != subUser.EpsFlag { user.EpsFlag = subUser.EpsFlag } if user.EpsDat != subUser.EpsDat { user.EpsOdb = subUser.EpsOdb } if user.HplmnOdb != subUser.HplmnOdb { user.HplmnOdb = subUser.HplmnOdb } if user.Epstpl != subUser.Epstpl { user.Epstpl = subUser.Epstpl } if user.Ard != subUser.Ard { user.Ard = subUser.Ard } if user.ContextId != subUser.ContextId { user.ContextId = subUser.ContextId } if user.ApnContext != subUser.ApnContext { user.ApnContext = subUser.ApnContext } if user.StaticIp != subUser.StaticIp { user.StaticIp = subUser.StaticIp } tx := datasource.DefaultDB().Save(user) if err := tx.Error; err != nil { logger.Errorf("Update Save err => %v", err) return 0 } return tx.RowsAffected } // Delete 删除实体 func (r *UDMSubImpl) Delete(neID, imsi string) int64 { tx := datasource.DefaultDB().Where("imsi = ? and ne_id = ?", imsi, neID).Delete(&model.UDMSub{}) if err := tx.Error; err != nil { logger.Errorf("Delete err => %v", err) } return tx.RowsAffected } // DeletePrefixImsi 删除前缀匹配的实体 func (r *UDMSubImpl) DeletePrefixImsi(neID, imsi string) int64 { tx := datasource.DefaultDB().Where("imsi like concat(?, '%') and ne_id = ?", imsi, neID).Delete(&model.UDMSub{}) if err := tx.Error; err != nil { logger.Errorf("DeletePrefixImsi err => %v", err) } return tx.RowsAffected } // Delete 删除范围实体 func (r *UDMSubImpl) Deletes(neID, imsi, num string) int64 { imsiV, err := strconv.Atoi(imsi) if err != nil { return 0 } numV, err := strconv.Atoi(num) if err != nil { return 0 } tx := datasource.DefaultDB().Where("imsi >= ? and imsi < ? and ne_id = ?", imsiV, imsiV+numV, neID).Delete(&model.UDMSub{}) if err := tx.Error; err != nil { logger.Errorf("Deletes err => %v", err) } return tx.RowsAffected }