diff --git a/features/ue/controller/ims_user.go b/features/ue/controller/ims_user.go index dc794ade..4c748c92 100644 --- a/features/ue/controller/ims_user.go +++ b/features/ue/controller/ims_user.go @@ -10,6 +10,7 @@ import ( "be.ems/features/ue/service" "be.ems/src/framework/constants/uploadsubpath" "be.ems/src/framework/i18n" + "be.ems/src/framework/resp" "be.ems/src/framework/telnet" "be.ems/src/framework/utils/ctx" "be.ems/src/framework/utils/file" @@ -135,8 +136,7 @@ func (s *IMSUserController) Add(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("add imsuser:imsi=%s,", body.IMSI) - cmd += s.imsUserService.ParseCommandParams(body) + cmd := fmt.Sprintf("add imsuser:imsi=%s,msisdn=%s,volte=%s,vni=%s", body.IMSI, body.MSISDN, body.Tag, body.VNI) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -185,8 +185,7 @@ func (s *IMSUserController) Adds(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("baa imsuser:start_imsi=%s,start_msisdn=%s,sub_num=%s,", body.IMSI, body.MSISDN, num) - cmd += s.imsUserService.ParseCommandParams(body) + cmd := fmt.Sprintf("baa imsuser:sub_num=%s,start_imsi=%s,start_msisdn=%s,volte=%s,vni=%s", num, body.IMSI, body.MSISDN, body.Tag, body.VNI) // 去除msisdn参数,避免重复 omemsisdn := fmt.Sprintf(",msisdn=%s,", body.MSISDN) cmd = strings.Replace(cmd, omemsisdn, ",", 1) @@ -255,17 +254,14 @@ func (s *IMSUserController) Edit(c *gin.Context) { func (s *IMSUserController) Remove(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") - imsi := c.Param("imsi") - if neId == "" || imsi == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + imsi_msisdn := c.Param("imsi") + volte := c.Query("volte") + if neId == "" || imsi_msisdn == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } - - // 处理字符转id数组后去重 - imsiArr := strings.Split(imsi, ",") - uniqueIDs := parse.RemoveDuplicates(imsiArr) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) + if volte == "" || !(volte == "0" || volte == "1") { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: volte is required")) return } @@ -283,20 +279,32 @@ func (s *IMSUserController) Remove(c *gin.Context) { } defer telnetClient.Close() + imsiArr := strings.Split(imsi_msisdn, ",") + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicates(imsiArr) + if len(uniqueIDs) <= 0 { + c.JSON(200, resp.Err(nil)) + return + } resultData := map[string]string{} - for _, imsi := range uniqueIDs { + for _, im := range uniqueIDs { + imArr := strings.SplitN(im, "_", 2) + if len(imArr) != 2 { + resultData[im] = "format should be imsi_msisdn" + continue + } // 发送MML - cmd := fmt.Sprintf("del imsuser:imsi=%s", imsi) + cmd := fmt.Sprintf("del imsuser:imsi=%s,msisdn=%s,volte=%s", imArr[0], imArr[1], volte) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - resultData[imsi] = err.Error() + resultData[im] = err.Error() continue } // 命令ok时 if strings.Contains(data, "ok") { - s.imsUserService.Delete(neId, imsi) + s.imsUserService.Delete(neId, imArr[0]) } - resultData[imsi] = data + resultData[im] = data } c.JSON(200, result.OkData(resultData)) @@ -305,10 +313,15 @@ func (s *IMSUserController) Remove(c *gin.Context) { func (s *IMSUserController) Removes(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") - imsi := c.Param("imsi") + imsi_msisdn := c.Param("imsi") num := c.Param("num") - if neId == "" || imsi == "" || num == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + volte := c.Query("volte") + if neId == "" || imsi_msisdn == "" || num == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neId/imsi/num is empty")) + return + } + if volte == "" || !(volte == "0" || volte == "1") { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: volte is required")) return } @@ -326,8 +339,22 @@ func (s *IMSUserController) Removes(c *gin.Context) { } defer telnetClient.Close() + imArr := strings.SplitN(imsi_msisdn, "_", 2) + if len(imArr) != 2 { + c.JSON(200, resp.ErrMsg("format should be imsi_msisdn")) + return + } + imsi := imArr[0] + msisdn := imArr[1] + // 发送MML - cmd := fmt.Sprintf("bde imsuser:start_imsi=%s,sub_num=%s", imsi, num) + cmd := "" + if volte == "0" { + cmd = fmt.Sprintf("bde imsuser:start_msisdn=%s,sub_num=%s,volte=0", msisdn, num) + } + if volte == "1" { + cmd = fmt.Sprintf("bde imsuser:start_imsi=%s,start_msisdn=%s,sub_num=%s,volte=1", imsi, msisdn, num) + } data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) diff --git a/features/ue/ims_user/controller.go b/features/ue/ims_user/controller.go index de038d09..7aadaee1 100644 --- a/features/ue/ims_user/controller.go +++ b/features/ue/ims_user/controller.go @@ -8,6 +8,7 @@ import ( "be.ems/src/framework/constants/uploadsubpath" "be.ems/src/framework/i18n" + "be.ems/src/framework/resp" "be.ems/src/framework/telnet" "be.ems/src/framework/utils/ctx" "be.ems/src/framework/utils/file" @@ -65,8 +66,18 @@ func (s *Controller) Info(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") imsi := c.Param("imsi") + msisdn := c.Query("msisdn") + volte := c.Query("volte") if neId == "" || imsi == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neId or imsi is empty")) + return + } + if msisdn == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: msisdn is required")) + return + } + if volte == "" || !(volte == "0" || volte == "1") { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: volte is required")) return } @@ -85,7 +96,7 @@ func (s *Controller) Info(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("dsp imsuser:imsi=%s", imsi) + cmd := fmt.Sprintf("dsp imsuser:imsi=%s,msisdn=%s,volte=%s", imsi, msisdn, volte) data, err := telnet.ConvertToMap(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -243,17 +254,14 @@ func (s *Controller) Edit(c *gin.Context) { func (s *Controller) Remove(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") - imsi := c.Param("imsi") - if neId == "" || imsi == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + imsi_msisdn := c.Param("imsi") + volte := c.Query("volte") + if neId == "" || imsi_msisdn == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } - - // 处理字符转id数组后去重 - imsiArr := strings.Split(imsi, ",") - uniqueIDs := parse.RemoveDuplicates(imsiArr) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) + if volte == "" || !(volte == "0" || volte == "1") { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: volte is required")) return } @@ -271,20 +279,32 @@ func (s *Controller) Remove(c *gin.Context) { } defer telnetClient.Close() + imsiArr := strings.Split(imsi_msisdn, ",") + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicates(imsiArr) + if len(uniqueIDs) <= 0 { + c.JSON(200, resp.Err(nil)) + return + } resultData := map[string]string{} - for _, imsi := range uniqueIDs { + for _, im := range uniqueIDs { + imArr := strings.SplitN(im, "_", 2) + if len(imArr) != 2 { + resultData[im] = "format should be imsi_msisdn" + continue + } // 发送MML - cmd := fmt.Sprintf("del imsuser:imsi=%s", imsi) + cmd := fmt.Sprintf("del imsuser:imsi=%s,msisdn=%s,volte=%s", imArr[0], imArr[1], volte) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - resultData[imsi] = err.Error() + resultData[im] = err.Error() continue } // 命令ok时 if strings.Contains(data, "ok") { - s.imsUserService.Delete(neId, imsi) + s.imsUserService.Delete(neId, imArr[0]) } - resultData[imsi] = data + resultData[im] = data } c.JSON(200, result.OkData(resultData)) @@ -295,8 +315,13 @@ func (s *Controller) Removes(c *gin.Context) { neId := c.Param("neId") imsi := c.Param("imsi") num := c.Param("num") + volte := c.Query("volte") if neId == "" || imsi == "" || num == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neId/imsi/num is empty")) + return + } + if volte == "" || !(volte == "0" || volte == "1") { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: volte is required")) return } @@ -315,7 +340,13 @@ func (s *Controller) Removes(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("bde imsuser:start_imsi=%s,sub_num=%s", imsi, num) + cmd := "" + if volte == "0" { + cmd = fmt.Sprintf("bde imsuser:start_msisdn=%s,sub_num=%s,volte=0", imsi, num) + } + if volte == "1" { + cmd = fmt.Sprintf("bde imsuser:start_imsi=%s,sub_num=%s,volte=1", imsi, num) + } data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) diff --git a/features/ue/ims_user/service.go b/features/ue/ims_user/service.go index 62f5406d..311037bb 100644 --- a/features/ue/ims_user/service.go +++ b/features/ue/ims_user/service.go @@ -175,12 +175,15 @@ func (r *Service) Delete(neId, imsi string) int64 { } // LoadData 重新加载从imsi开始num的数据 -func (r *Service) LoadData(neId, imsi, num string) { - startIMSI, _ := strconv.ParseInt(imsi, 10, 64) +func (r *Service) LoadData(neId, imsiOrMsisdn, num string) { + startIMSIOrMsisdn, _ := strconv.ParseInt(imsiOrMsisdn, 10, 64) subNum, _ := strconv.ParseInt(num, 10, 64) var i int64 for i = 0; i < subNum; i++ { - keyIMSI := fmt.Sprintf("%015d", startIMSI+i) + keyIMSI := fmt.Sprintf("%015d", startIMSIOrMsisdn+i) + if !strings.HasPrefix(imsiOrMsisdn, "0") { + keyIMSI = fmt.Sprintf("%d", startIMSIOrMsisdn+i) + } // 删除原数据 r.volteRepository.Delete(keyIMSI, neId) arr := r.dataByRedis(keyIMSI, neId) diff --git a/features/ue/service/ims_user.go b/features/ue/service/ims_user.go index c4c9a76c..d8bf8035 100644 --- a/features/ue/service/ims_user.go +++ b/features/ue/service/ims_user.go @@ -48,35 +48,23 @@ func (r *IMSUserService) dataByRedis(imsi, neId string) []model.IMSUser { } for k, m := range mkv { - var imsi, msisdn string - KeyParts := strings.Split(k, ":") - switch len(KeyParts) { - case 0, 1: - // 处理单个部分的情况 + // volte:360000100000130:8612300000130 + keys := strings.Split(k, ":") + if len(keys) != 3 { continue - case 2: - // 处理两个部分的情况 - imsi = KeyParts[1] - msisdn = "-" - case 3: - // 处理三个部分的情况 - imsi = KeyParts[1] - msisdn = KeyParts[2] - default: - // 处理更多部分的情况 - imsi = KeyParts[1] - msisdn = KeyParts[2] } - var vni string = "-" + // "110011200004217@ims.mnc001.mcc110.3gppnetwork.org" + vni := "" impiParts := strings.Split(m["impi"], "@") if len(impiParts) > 1 { - vni = impiParts[1] // 输出: ims.mnc001.mcc110.3gppnetwork.org + vni = impiParts[1] } + a := model.IMSUser{ NeId: neId, - IMSI: imsi, // volte:360000100000130:8612300000130 - MSISDN: msisdn, // 8612300000130 + IMSI: keys[1], // volte:360000100000130:8612300000130 + MSISDN: keys[2], // 8612300000130 Tag: model.ParseCallTag(m["tag"]), // volte = tag VNI: vni, // ims.mnc001.mcc110.3gppnetwork.org } @@ -182,19 +170,15 @@ func (r *IMSUserService) Delete(neId, imsi string) int64 { } // LoadData 重新加载从imsi开始num的数据 -func (r *IMSUserService) LoadData(neId, imsi, num string) { - startIMSI, _ := strconv.ParseInt(imsi, 10, 64) +func (r *IMSUserService) LoadData(neId, imsiOrMsisdn, num string) { + startIMSIOrMsisdn, _ := strconv.ParseInt(imsiOrMsisdn, 10, 64) subNum, _ := strconv.ParseInt(num, 10, 64) var i int64 for i = 0; i < subNum; i++ { - var keyIMSI string - if len(imsi) == model.IMSI_MAX_LENGTH { - keyIMSI = fmt.Sprintf("%015d", startIMSI+i) - } else { - // 处理不满15位的IMSI, tag=TAG_VoIP - keyIMSI = fmt.Sprintf("%d", startIMSI+i) + keyIMSI := fmt.Sprintf("%015d", startIMSIOrMsisdn+i) + if !strings.HasPrefix(imsiOrMsisdn, "0") { + keyIMSI = fmt.Sprintf("%d", startIMSIOrMsisdn+i) } - // 删除原数据 r.imsUserRepository.Delete(keyIMSI, neId) arr := r.dataByRedis(keyIMSI+":*", neId) diff --git a/src/modules/network_data/controller/udm_volte_ims.go b/src/modules/network_data/controller/udm_volte_ims.go index 1eb3913d..f6a3d6f3 100644 --- a/src/modules/network_data/controller/udm_volte_ims.go +++ b/src/modules/network_data/controller/udm_volte_ims.go @@ -100,6 +100,7 @@ func (s *UDMVolteIMSController) Info(c *gin.Context) { neId := c.Param("neId") imsi := c.Param("imsi") msisdn := c.Query("msisdn") + volte := c.Query("volte") if neId == "" || imsi == "" { c.JSON(422, resp.CodeMsg(422002, "bind err: neId or imsi is empty")) return @@ -108,6 +109,10 @@ func (s *UDMVolteIMSController) Info(c *gin.Context) { c.JSON(422, resp.CodeMsg(422002, "bind err: msisdn is required")) return } + if volte == "" || !(volte == "0" || volte == "1") { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: volte is required")) + return + } // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) @@ -124,7 +129,7 @@ func (s *UDMVolteIMSController) Info(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("dsp imsuser:imsi=%s,msisdn=%s", imsi, msisdn) + cmd := fmt.Sprintf("dsp imsuser:imsi=%s,msisdn=%s,volte=%s", imsi, msisdn, volte) data, err := telnet.ConvertToMap(telnetClient, cmd) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) @@ -297,13 +302,16 @@ func (s *UDMVolteIMSController) Adds(c *gin.Context) { func (s *UDMVolteIMSController) Remove(c *gin.Context) { language := reqctx.AcceptLanguage(c) neId := c.Param("neId") - imsi := c.Param("imsi") - msisdn := c.Query("msisdn") - if neId == "" || imsi == "" { + imsi_msisdn := c.Param("imsi") + volte := c.Query("volte") + if neId == "" || imsi_msisdn == "" { c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } - imsiArr := strings.Split(imsi, ",") + if volte == "" || !(volte == "0" || volte == "1") { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: volte is required")) + return + } // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) @@ -319,46 +327,34 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) { } defer telnetClient.Close() - // 精确msisdn删除 - if msisdn != "" { + imsiArr := strings.Split(imsi_msisdn, ",") + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicates(imsiArr) + if len(uniqueIDs) <= 0 { + c.JSON(200, resp.Err(nil)) + return + } + resultData := map[string]string{} + for _, im := range uniqueIDs { + imArr := strings.SplitN(im, "_", 2) + if len(imArr) != 2 { + resultData[im] = "format should be imsi_msisdn" + continue + } // 发送MML - cmd := fmt.Sprintf("del imsuser:imsi=%s,msisdn=%s", imsiArr[0], msisdn) + cmd := fmt.Sprintf("del imsuser:imsi=%s,msisdn=%s,volte=%s", imArr[0], imArr[1], volte) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - c.JSON(200, resp.ErrMsg(err.Error())) - return + resultData[im] = err.Error() + continue } // 命令ok时 if strings.Contains(data, "ok") { - s.udmVolteIMSService.Delete(imsi, neId) + s.udmVolteIMSService.Delete(imArr[0], neId) } - c.JSON(200, resp.OkData(data)) - return - } else { - // 处理字符转id数组后去重 - uniqueIDs := parse.RemoveDuplicates(imsiArr) - if len(uniqueIDs) <= 0 { - c.JSON(200, resp.Err(nil)) - return - } - resultData := map[string]string{} - for _, imsi := range uniqueIDs { - // 发送MML - cmd := fmt.Sprintf("del imsuser:imsi=%s", imsi) - data, err := telnet.ConvertToStr(telnetClient, cmd) - if err != nil { - resultData[imsi] = err.Error() - continue - } - // 命令ok时 - if strings.Contains(data, "ok") { - s.udmVolteIMSService.Delete(imsi, neId) - } - resultData[imsi] = data - } - c.JSON(200, resp.OkData(resultData)) - return + resultData[im] = data } + c.JSON(200, resp.OkData(resultData)) } // UDMVolteIMS用户批量删除 @@ -381,8 +377,13 @@ func (s *UDMVolteIMSController) Removes(c *gin.Context) { neId := c.Param("neId") imsi := c.Param("imsi") num := c.Param("num") + volte := c.Query("volte") if neId == "" || imsi == "" || num == "" { - c.JSON(422, resp.CodeMsg(422002, "bind err: neId/imsi/num is empty")) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neId/imsi/num is empty")) + return + } + if volte == "" || !(volte == "0" || volte == "1") { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: volte is required")) return } @@ -401,7 +402,13 @@ func (s *UDMVolteIMSController) Removes(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("bde imsuser:start_imsi=%s,sub_num=%s", imsi, num) + cmd := "" + if volte == "0" { + cmd = fmt.Sprintf("bde imsuser:start_msisdn=%s,sub_num=%s,volte=0", imsi, num) + } + if volte == "1" { + cmd = fmt.Sprintf("bde imsuser:start_imsi=%s,sub_num=%s,volte=1", imsi, num) + } data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) diff --git a/src/modules/network_data/service/udm_volte_ims.go b/src/modules/network_data/service/udm_volte_ims.go index dbdb6146..a489933e 100644 --- a/src/modules/network_data/service/udm_volte_ims.go +++ b/src/modules/network_data/service/udm_volte_ims.go @@ -181,7 +181,10 @@ func (r UDMVolteIMSUser) LoadData(neId, imsiOrMsisdn, num string) { subNum, _ := strconv.ParseInt(num, 10, 64) var i int64 for i = 0; i < subNum; i++ { - keyIMSI := fmt.Sprintf("%d", startIMSIOrMsisdn+i) + keyIMSI := fmt.Sprintf("%015d", startIMSIOrMsisdn+i) + if !strings.HasPrefix(imsiOrMsisdn, "0") { + keyIMSI = fmt.Sprintf("%d", startIMSIOrMsisdn+i) + } // 删除原数据 r.udmVolteIMSRepository.Delete(keyIMSI, neId) // 加载数据