From fc8f63fca65b0ce80e1260f17cb2c4a316168848 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 12 Sep 2023 11:11:27 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E7=AD=BE=E7=BA=A6=E7=94=A8=E6=88=B74G?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/udm_user/api_udm_user.go | 130 +++++++++++++++++- features/udm_user/model/udm_sub_user.go | 2 + features/udm_user/repo/repo_udm_sub_user.go | 107 ++++++++++++++ .../udm_user/service/service_udm_sub_user.go | 15 ++ 4 files changed, 253 insertions(+), 1 deletion(-) diff --git a/features/udm_user/api_udm_user.go b/features/udm_user/api_udm_user.go index 3e6c253c..a7e13481 100644 --- a/features/udm_user/api_udm_user.go +++ b/features/udm_user/api_udm_user.go @@ -123,7 +123,19 @@ func Routers() []services.RouterItem { { Method: "PUT", Pattern: "/sub/{neId}", - Handler: apis.UdmAuthUserEdit, + Handler: apis.UdmSubUserEdit, + Middleware: nil, //midware.Authorize(nil), + }, + { + Method: "PUT", + Pattern: "/sub4gIP/{neId}", + Handler: apis.UdmSubUser4GIP, + Middleware: nil, //midware.Authorize(nil), + }, + { + Method: "PUT", + Pattern: "/subSmData/{neId}", + Handler: apis.UdmSubUserSmData, Middleware: nil, //midware.Authorize(nil), }, { @@ -706,6 +718,45 @@ func (s *UdmUserApi) UdmSubUserAdds(w http.ResponseWriter, r *http.Request) { ctx.JSON(w, 200, result.OkData(data)) } +// UDM签约用户-批量添加4G用户 +// +// POST /sub4G/{neId} +func (s *UdmUserApi) UdmSubUserAdd4G(w http.ResponseWriter, r *http.Request) { + neId := ctx.Param(r, "neId") + if neId == "" { + ctx.JSON(w, 400, result.CodeMsg(400, "参数错误")) + return + } + + var body model.UdmSubUser + err := ctx.ShouldBindJSON(r, &body) + if err != nil || body.Imsi == "" || body.SubNum == "" { + ctx.JSON(w, 400, result.CodeMsg(400, "参数错误")) + return + } + + neInfo, err := NeInfoByUDM(neId) + if err != nil { + ctx.JSON(w, 200, result.ErrMsg(err.Error())) + return + } + + msg := fmt.Sprintf("bmd udmuser:start_imsi=%s,sub_num=%s,eps_flag=%s", body.Imsi, body.SubNum, body.EpsFlag) + + // 发送MML + data, err := mmlclient.MMLSendMsgToString(neInfo.Ip, msg) + if err != nil { + ctx.JSON(w, 200, result.ErrMsg(err.Error())) + return + } + + // 命令ok时 + if strings.Contains(data, "ok") { + s.subUser.Insert4G(neInfo.NeId, body) + } + ctx.JSON(w, 200, result.OkData(data)) +} + // UDM签约用户-修改 // // PUT /{neId} @@ -773,6 +824,83 @@ func (s *UdmUserApi) UdmSubUserEdit(w http.ResponseWriter, r *http.Request) { ctx.JSON(w, 200, result.OkData(data)) } +// UDM签约用户-批量修改4G IP +// +// PUT /sub4gIP/{neId} +func (s *UdmUserApi) UdmSubUser4GIP(w http.ResponseWriter, r *http.Request) { + neId := ctx.Param(r, "neId") + if neId == "" { + ctx.JSON(w, 400, result.CodeMsg(400, "参数错误")) + return + } + + var body model.UdmSubUser + err := ctx.ShouldBindJSON(r, &body) + if err != nil || body.Imsi == "" || body.SubNum == "" || body.StaticIp == "" { + ctx.JSON(w, 400, result.CodeMsg(400, "参数错误")) + return + } + + neInfo, err := NeInfoByUDM(neId) + if err != nil { + ctx.JSON(w, 200, result.ErrMsg(err.Error())) + return + } + + msg := fmt.Sprintf("bmd udmuser:start_imsi=%s,sub_num=%s,static_ip=%s", body.Imsi, body.SubNum, body.StaticIp) + + // 发送MML + data, err := mmlclient.MMLSendMsgToString(neInfo.Ip, msg) + if err != nil { + ctx.JSON(w, 200, result.ErrMsg(err.Error())) + return + } + // 命令ok时 + if strings.Contains(data, "ok") { + s.subUser.Update4GIP(neId, body) + } + ctx.JSON(w, 200, result.OkData(data)) +} + +// UDM签约用户-批量修改sm-data +// +// PUT /subSmData/{neId} +func (s *UdmUserApi) UdmSubUserSmData(w http.ResponseWriter, r *http.Request) { + neId := ctx.Param(r, "neId") + if neId == "" { + ctx.JSON(w, 400, result.CodeMsg(400, "参数错误")) + return + } + + var body model.UdmSubUser + err := ctx.ShouldBindJSON(r, &body) + if err != nil || body.Imsi == "" || body.SubNum == "" || body.SmData == "" { + ctx.JSON(w, 400, result.CodeMsg(400, "参数错误")) + return + } + + neInfo, err := NeInfoByUDM(neId) + if err != nil { + ctx.JSON(w, 200, result.ErrMsg(err.Error())) + return + } + + // 3-000003&internet-10.10.1.1&ims-10.11.1.1 + msg := fmt.Sprintf("bmd udmuser:start_imsi=%s,sub_num=%s,sm_data=%s", body.Imsi, body.SubNum, body.SmData) + + // 发送MML + data, err := mmlclient.MMLSendMsgToString(neInfo.Ip, msg) + if err != nil { + ctx.JSON(w, 200, result.ErrMsg(err.Error())) + return + } + // 命令ok时 + if strings.Contains(data, "ok") { + s.subUser.UpdateSmData(neId, body) + } + ctx.JSON(w, 200, result.OkData(data)) +} + // UDM签约用户-删除 // // DELETE /{neId}/{imsi} diff --git a/features/udm_user/model/udm_sub_user.go b/features/udm_user/model/udm_sub_user.go index d7daf90a..84078ce3 100644 --- a/features/udm_user/model/udm_sub_user.go +++ b/features/udm_user/model/udm_sub_user.go @@ -24,4 +24,6 @@ type UdmSubUser struct { ContextId string `json:"contextId" xorm:"context_id"` ApnContext string `json:"apnContext" xorm:"apn_context"` StaticIp string `json:"staticIp" xorm:"static_ip"` + + SubNum string `json:"subNum" xorm:"-"` // 批量数 } diff --git a/features/udm_user/repo/repo_udm_sub_user.go b/features/udm_user/repo/repo_udm_sub_user.go index 2be6c6a5..abfce460 100644 --- a/features/udm_user/repo/repo_udm_sub_user.go +++ b/features/udm_user/repo/repo_udm_sub_user.go @@ -209,6 +209,41 @@ func (r *RepoUdmSubUser) Inserts(neID string, subUser model.UdmSubUser, num stri for i := 0; i < numV; i++ { subUser.Imsi = fmt.Sprint(imsiV + i) subUser.Msisdn = fmt.Sprint(msisdnV + i) + // IP会自动递增 + parts := strings.Split(subUser.StaticIp, ".") + lastPart := parts[3] + lastNum, _ := strconv.Atoi(lastPart) + lastNum += i + newLastPart := strconv.Itoa(lastNum) + parts[3] = newLastPart + newIP := strings.Join(parts, ".") + subUser.StaticIp = newIP + results, err := datasource.DefaultDB().Table("u_sub_user").Insert(subUser) + if err == nil { + insertNum += results + } + } + + return insertNum +} + +// Insert4G 批量添加4G用户 +func (r *RepoUdmSubUser) Insert4G(neID string, subUser model.UdmSubUser) int64 { + var insertNum int64 + + imsiV, err := strconv.Atoi(subUser.Imsi) + if err != nil { + return 0 + } + numV, err := strconv.Atoi(subUser.SubNum) + if err != nil { + return 0 + } + + subUser.NeID = neID + for i := 0; i < numV; i++ { + subUser.Imsi = fmt.Sprint(imsiV + i) + results, err := datasource.DefaultDB().Table("u_sub_user").Insert(subUser) if err == nil { insertNum += results @@ -262,6 +297,78 @@ func (r *RepoUdmSubUser) Update(neID string, authUser model.UdmSubUser) int64 { return results } +// Update4GIP 批量修改4G IP +func (r *RepoUdmSubUser) Update4GIP(neID string, subUser model.UdmSubUser) int64 { + var insertNum int64 + + imsiV, err := strconv.Atoi(subUser.Imsi) + if err != nil || subUser.StaticIp == "" { + return insertNum + } + numV, err := strconv.Atoi(subUser.SubNum) + if err != nil { + return insertNum + } + + for i := 0; i < numV; i++ { + subUser.Imsi = fmt.Sprint(imsiV + i) + + // 查询先 + var user model.UdmSubUser + err := datasource.DefaultDB().Table("u_sub_user").Where("imsi = ? and ne_id = ?", subUser.Imsi, neID).Find(&user) + if err == nil { + // IP会自动递增 + parts := strings.Split(subUser.StaticIp, ".") + lastPart := parts[3] + lastNum, _ := strconv.Atoi(lastPart) + lastNum += i + newLastPart := strconv.Itoa(lastNum) + parts[3] = newLastPart + newIP := strings.Join(parts, ".") + user.StaticIp = newIP + // 更新 + results, err := datasource.DefaultDB().Table("u_sub_user").Update(user) + if err == nil { + insertNum += results + } + } + } + return insertNum +} + +// UpdateSmData 批量修改sm-data +func (r *RepoUdmSubUser) UpdateSmData(neID string, subUser model.UdmSubUser) int64 { + var insertNum int64 + + imsiV, err := strconv.Atoi(subUser.Imsi) + if err != nil || subUser.StaticIp == "" { + return insertNum + } + numV, err := strconv.Atoi(subUser.SubNum) + if err != nil { + return insertNum + } + + for i := 0; i < numV; i++ { + subUser.Imsi = fmt.Sprint(imsiV + i) + + // 查询先 + var user model.UdmSubUser + err := datasource.DefaultDB().Table("u_sub_user").Where("imsi = ? and ne_id = ?", subUser.Imsi, neID).Find(&user) + if err == nil { + // IP会自动递增,需提前规划好DNN对应的IP;如dnn不需要绑定IP则不带此字段名 + // parts := strings.Split(subUser.SmData, "&") + user.SmData = subUser.SmData + // 更新 + results, err := datasource.DefaultDB().Table("u_sub_user").Update(user) + if err == nil { + insertNum += results + } + } + } + return insertNum +} + // Delete 删除实体 func (r *RepoUdmSubUser) Delete(neID, imsi string) int64 { results, err := datasource.DefaultDB().Table("u_sub_user").Where("imsi = ? and ne_id = ?", imsi, neID).Delete() diff --git a/features/udm_user/service/service_udm_sub_user.go b/features/udm_user/service/service_udm_sub_user.go index d2d0ceeb..2e8839a2 100644 --- a/features/udm_user/service/service_udm_sub_user.go +++ b/features/udm_user/service/service_udm_sub_user.go @@ -91,11 +91,26 @@ func (r *ServiceUdmSubUser) InsertCSV(neID string, data []map[string]string) int return num } +// Insert UDM签约用户-批量添加4G用户 +func (r *ServiceUdmSubUser) Insert4G(neID string, subUser model.UdmSubUser) int64 { + return r.repoSunUser.Insert4G(neID, subUser) +} + // Insert UDM签约用户-修改更新 func (r *ServiceUdmSubUser) Update(neID string, subUser model.UdmSubUser) int64 { return r.repoSunUser.Update(neID, subUser) } +// Update4GIP UDM签约用户-批量修改4G IP +func (r *ServiceUdmSubUser) Update4GIP(neID string, subUser model.UdmSubUser) int64 { + return r.repoSunUser.Update4GIP(neID, subUser) +} + +// Update4GIP UDM签约用户-批量修改sm-data +func (r *ServiceUdmSubUser) UpdateSmData(neID string, subUser model.UdmSubUser) int64 { + return r.repoSunUser.UpdateSmData(neID, subUser) +} + // Insert UDM签约用户-删除单个 func (r *ServiceUdmSubUser) Delete(neID, imsi string) int64 { return r.repoSunUser.Delete(neID, imsi)