This commit is contained in:
2023-09-15 19:57:24 +08:00
8 changed files with 279 additions and 61 deletions

View File

@@ -80,10 +80,10 @@ func Routers() []services.RouterItem {
Middleware: midware.Authorize(nil),
},
{
Method: "POST",
Pattern: "/authExport/{neId}",
Handler: apis.UdmAuthUserExport,
Middleware: midware.Authorize(nil),
Method: "POST",
Pattern: "/authExport",
Handler: apis.UdmAuthUserExport,
// Middleware: midware.Authorize(nil),
},
{
Method: "POST",
@@ -154,7 +154,7 @@ func Routers() []services.RouterItem {
},
{
Method: "POST",
Pattern: "/subExport/{neId}",
Pattern: "/subExport",
Handler: apis.UdmSubUserExport,
Middleware: midware.Authorize(nil),
},
@@ -477,30 +477,58 @@ func (s *UdmUserApi) UdmAuthUserRemoves(w http.ResponseWriter, r *http.Request)
// UDM鉴权用户-导出
//
// POST /authExport/{neId}
// POST /authExport
func (s *UdmUserApi) UdmAuthUserExport(w http.ResponseWriter, r *http.Request) {
neId := ctx.Param(r, "neId")
if neId == "" {
var body struct {
NeId string `json:"neId"`
Type string `json:"type"`
}
err := ctx.ShouldBindJSON(r, &body)
if err != nil || body.NeId == "" || body.Type == "" {
ctx.JSON(w, 400, result.CodeMsg(400, "参数错误"))
return
}
neId = "-"
list := s.authUser.List(model.UdmAuthUser{NeID: neId})
// 文件名
fileName := fmt.Sprintf("OMC_AUTH_USER_EXPORT_%s_%d.csv", neId, time.Now().UnixMilli())
filePath := fmt.Sprintf("%s/upload/mml/%s", conf.Get("ne.omcdir"), fileName)
// 转换数据
data := [][]string{}
data = append(data, []string{"imsi", "ki", "amf", "algo", "opc"})
for _, v := range list {
data = append(data, []string{v.Imsi, v.Ki, v.Amf, v.AlgoIndex, v.Opc})
}
// 输出到文件
err := file.WriterCSVFile(data, filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
if !(body.Type == "csv" || body.Type == "txt") {
ctx.JSON(w, 200, result.ErrMsg("导出文件类型支持csv、txt"))
return
}
neId := "-"
list := s.authUser.List(model.UdmAuthUser{NeID: neId})
// 文件名
fileName := fmt.Sprintf("OMC_AUTH_USER_EXPORT_%s_%d.%s", neId, time.Now().UnixMilli(), body.Type)
filePath := fmt.Sprintf("%s/upload/mml/%s", conf.Get("ne.omcdir"), fileName)
if body.Type == "csv" {
// 转换数据
data := [][]string{}
data = append(data, []string{"imsi", "ki", "amf", "algo", "opc"})
for _, v := range list {
data = append(data, []string{v.Imsi, v.Ki, v.Amf, v.AlgoIndex, v.Opc})
}
// 输出到文件
err := file.WriterCSVFile(data, filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
}
if body.Type == "txt" {
// 转换数据
data := [][]string{}
for _, v := range list {
data = append(data, []string{v.Imsi, v.Ki, v.Amf, v.AlgoIndex, v.Opc})
}
// 输出到文件
err = file.WriterTxtFile(data, filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
}
ctx.FileAttachment(w, r, filePath, fileName)
}
@@ -520,8 +548,8 @@ func (s *UdmUserApi) UdmAuthUserImport(w http.ResponseWriter, r *http.Request) {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
if !strings.HasSuffix(fileHeader.Filename, ".csv") {
ctx.JSON(w, 200, result.ErrMsg("请上传CSV格式文件内容字段imsi, ki, algo, amf, opc"))
if !(strings.HasSuffix(fileHeader.Filename, ".csv") || strings.HasSuffix(fileHeader.Filename, ".txt")) {
ctx.JSON(w, 200, result.ErrMsg("请上传.csv、.txt格式文件内容字段imsi,ki,algo,amf,opc"))
return
}
@@ -557,11 +585,19 @@ func (s *UdmUserApi) UdmAuthUserImport(w http.ResponseWriter, r *http.Request) {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
// 命令ok时
if strings.Contains(data, "ok") {
data := file.ReadCSVFile(filePath)
neId = "-"
s.authUser.InsertCSV(neId, data)
if strings.HasSuffix(fileHeader.Filename, ".csv") {
data := file.ReadCSVFile(filePath)
neId = "-"
s.authUser.InsertCSV(neId, data)
}
if strings.HasSuffix(fileHeader.Filename, ".txt") {
data := file.ReadTxtFile(filePath)
neId = "-"
s.authUser.InsertTxt(neId, data)
}
}
ctx.JSON(w, 200, result.OkData(data))
}
@@ -1005,30 +1041,58 @@ func (s *UdmUserApi) UdmSubUserRemoves(w http.ResponseWriter, r *http.Request) {
// UDM签约用户-导出
//
// POST /subExport/{neId}
// POST /subExport
func (s *UdmUserApi) UdmSubUserExport(w http.ResponseWriter, r *http.Request) {
neId := ctx.Param(r, "neId")
if neId == "" {
var body struct {
NeId string `json:"neId"`
Type string `json:"type"`
}
err := ctx.ShouldBindJSON(r, &body)
if err != nil || body.NeId == "" || body.Type == "" {
ctx.JSON(w, 400, result.CodeMsg(400, "参数错误"))
return
}
neId = "-"
list := s.subUser.List(model.UdmSubUser{NeID: neId})
// 文件名
fileName := fmt.Sprintf("OMC_AUTH_USER_EXPORT_%s_%d.csv", neId, time.Now().UnixMilli())
filePath := fmt.Sprintf("%s/upload/mml/%s", conf.Get("ne.omcdir"), fileName)
// 转换数据
data := [][]string{}
data = append(data, []string{"imsi", "msisdn", "ambr", "arfb", "sar", "rat", "cn", "smf_sel", "sm_dat", "eps_dat"})
for _, v := range list {
data = append(data, []string{v.Imsi, v.Msisdn, v.Ambr, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, v.EpsDat})
}
// 输出到文件
err := file.WriterCSVFile(data, filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
if !(body.Type == "csv" || body.Type == "txt") {
ctx.JSON(w, 200, result.ErrMsg("导出文件类型支持csv、txt"))
return
}
neId := "-"
list := s.subUser.List(model.UdmSubUser{NeID: neId})
// 文件名
fileName := fmt.Sprintf("OMC_AUTH_USER_EXPORT_%s_%d.%s", neId, time.Now().UnixMilli(), body.Type)
filePath := fmt.Sprintf("%s/upload/mml/%s", conf.Get("ne.omcdir"), fileName)
if body.Type == "csv" {
// 转换数据
data := [][]string{}
data = append(data, []string{"imsi", "msisdn", "ambr", "arfb", "sar", "rat", "cn", "smf_sel", "sm_dat", "eps_dat"})
for _, v := range list {
data = append(data, []string{v.Imsi, v.Msisdn, v.Ambr, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, v.EpsDat})
}
// 输出到文件
err = file.WriterCSVFile(data, filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
}
if body.Type == "txt" {
// 转换数据
data := [][]string{}
for _, v := range list {
data = append(data, []string{v.Imsi, v.Msisdn, v.Ambr, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, v.EpsDat})
}
// 输出到文件
err = file.WriterTxtFile(data, filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
}
ctx.FileAttachment(w, r, filePath, fileName)
}
@@ -1048,8 +1112,8 @@ func (s *UdmUserApi) UdmSubUserImport(w http.ResponseWriter, r *http.Request) {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
if !strings.HasSuffix(fileHeader.Filename, ".csv") {
ctx.JSON(w, 200, result.ErrMsg("请上传CSV格式文件内容字段imsi, msisdn, ambr, nssai, arfb, sar,rat, cn, smf_sel, sm_dat,eps_dat"))
if !(strings.HasSuffix(fileHeader.Filename, ".csv") || strings.HasSuffix(fileHeader.Filename, ".txt")) {
ctx.JSON(w, 200, result.ErrMsg("请上传.csv、.txt格式文件内容字段imsi,msisdn,ambr,nssai,arfb,sar,rat,cn,smf_sel,sm_dat,eps_dat"))
return
}
@@ -1087,9 +1151,16 @@ func (s *UdmUserApi) UdmSubUserImport(w http.ResponseWriter, r *http.Request) {
}
// 命令ok时
if strings.Contains(data, "ok") {
data := file.ReadCSVFile(filePath)
neId = "-"
s.subUser.InsertCSV(neId, data)
if strings.HasSuffix(fileHeader.Filename, ".csv") {
data := file.ReadCSVFile(filePath)
neId = "-"
s.subUser.InsertCSV(neId, data)
}
if strings.HasSuffix(fileHeader.Filename, ".txt") {
data := file.ReadTxtFile(filePath)
neId = "-"
s.subUser.InsertTxt(neId, data)
}
}
ctx.JSON(w, 200, result.OkData(data))
}

View File

@@ -195,6 +195,7 @@ func (r *RepoUdmAuthUser) Insert(neID string, authUser model.UdmAuthUser) int64
func (r *RepoUdmAuthUser) Inserts(neID string, authUser model.UdmAuthUser, num string) int64 {
var insertNum int64
imsiVlen := len(authUser.Imsi)
imsiV, err := strconv.Atoi(authUser.Imsi)
if err != nil {
return 0
@@ -208,7 +209,11 @@ func (r *RepoUdmAuthUser) Inserts(neID string, authUser model.UdmAuthUser, num s
authUser.NeID = neID
authUser.Status = "1"
for i := 0; i < numV; i++ {
authUser.Imsi = fmt.Sprint(imsiV + i)
imsi := fmt.Sprint(imsiV + i)
if len(imsi) < imsiVlen {
imsi = fmt.Sprintf("%0*s", imsiVlen, imsi)
}
authUser.Imsi = imsi
results, err := datasource.DefaultDB().Table("u_auth_user").Insert(authUser)
if err == nil {
insertNum += results

View File

@@ -210,10 +210,12 @@ func (r *RepoUdmSubUser) Insert(neID string, subUser model.UdmSubUser) int64 {
func (r *RepoUdmSubUser) Inserts(neID string, subUser model.UdmSubUser, num string) int64 {
var insertNum int64
imsiVlen := len(subUser.Imsi)
imsiV, err := strconv.Atoi(subUser.Imsi)
if err != nil {
return 0
}
msisdnVlen := len(subUser.Msisdn)
msisdnV, err := strconv.Atoi(subUser.Msisdn)
if err != nil {
return 0
@@ -226,8 +228,18 @@ func (r *RepoUdmSubUser) Inserts(neID string, subUser model.UdmSubUser, num stri
subUser.NeID = neID
for i := 0; i < numV; i++ {
subUser.Imsi = fmt.Sprint(imsiV + i)
subUser.Msisdn = fmt.Sprint(msisdnV + i)
msisdn := fmt.Sprint(msisdnV + i)
if len(msisdn) < msisdnVlen {
msisdn = fmt.Sprintf("%0*s", msisdnVlen, msisdn)
}
subUser.Msisdn = msisdn
imsi := fmt.Sprint(imsiV + i)
if len(imsi) < imsiVlen {
imsi = fmt.Sprintf("%0*s", imsiVlen, imsi)
}
subUser.Imsi = imsi
// IP会自动递增
if subUser.StaticIp != "" {
parts := strings.Split(subUser.StaticIp, ".")

View File

@@ -47,7 +47,7 @@ func (r *ServiceUdmAuthUser) Inserts(neID string, authUser model.UdmAuthUser, nu
return r.repoAuthUser.Inserts(neID, authUser, num)
}
// Insert UDM鉴权用户-批量添加
// InsertCSV UDM鉴权用户-批量添加
func (r *ServiceUdmAuthUser) InsertCSV(neID string, data []map[string]string) int64 {
var num int64
for _, v := range data {
@@ -74,6 +74,28 @@ func (r *ServiceUdmAuthUser) InsertCSV(neID string, data []map[string]string) in
return num
}
// InsertTxt UDM鉴权用户-批量添加
func (r *ServiceUdmAuthUser) InsertTxt(neID string, data [][]string) int64 {
var num int64
for _, v := range data {
if len(v) < 4 {
continue
}
var authUser model.UdmAuthUser
authUser.NeID = neID
authUser.Status = "1"
authUser.Imsi = v[0]
authUser.Ki = v[1]
authUser.AlgoIndex = v[2]
authUser.Amf = v[3]
if len(v) == 5 {
authUser.Opc = v[4]
}
num += r.repoAuthUser.Insert(neID, authUser)
}
return num
}
// Insert UDM鉴权用户-修改更新
func (r *ServiceUdmAuthUser) Update(neID string, authUser model.UdmAuthUser) int64 {
return r.repoAuthUser.Update(neID, authUser)

View File

@@ -47,7 +47,7 @@ func (r *ServiceUdmSubUser) Inserts(neID string, subUser model.UdmSubUser, num s
return r.repoSunUser.Inserts(neID, subUser, num)
}
// Insert UDM签约用户-批量添加
// InsertCSV UDM签约用户-批量添加
func (r *ServiceUdmSubUser) InsertCSV(neID string, data []map[string]string) int64 {
var num int64
for _, v := range data {
@@ -91,6 +91,33 @@ func (r *ServiceUdmSubUser) InsertCSV(neID string, data []map[string]string) int
return num
}
// InsertTxt UDM签约用户-批量添加
func (r *ServiceUdmSubUser) InsertTxt(neID string, data [][]string) int64 {
var num int64
for _, v := range data {
if len(v) < 10 {
continue
}
var subUser model.UdmSubUser
subUser.NeID = neID
subUser.Imsi = v[0]
subUser.Msisdn = v[1]
subUser.Ambr = v[2]
subUser.Nssai = v[3]
subUser.Arfb = v[4]
subUser.Sar = v[5]
subUser.Rat = v[6]
subUser.Cn = v[7]
subUser.SmfSel = v[8]
subUser.SmData = v[9]
if len(v) == 11 {
subUser.EpsDat = v[10]
}
num += r.repoSunUser.Insert(neID, subUser)
}
return num
}
// Insert UDM签约用户-批量添加4G用户
func (r *ServiceUdmSubUser) Insert4G(neID string, subUser model.UdmSubUser) int64 {
return r.repoSunUser.Insert4G(neID, subUser)

View File

@@ -45,10 +45,14 @@ func WriterCSVFile(data [][]string, filePath string) error {
// 读取CSV文件转换map数据
func ReadCSVFile(filePath string) []map[string]string {
// 创建 map 存储 CSV 数据
arr := make([]map[string]string, 0)
// 打开 CSV 文件
file, err := os.Open(filePath)
if err != nil {
log.Fatal("无法打开 CSV 文件:", err)
return arr
}
defer file.Close()
@@ -59,11 +63,9 @@ func ReadCSVFile(filePath string) []map[string]string {
header, err := reader.Read()
if err != nil {
log.Fatal("无法读取 CSV 头部行:", err)
return arr
}
// 创建 map 存储 CSV 数据
arr := make([]map[string]string, 0)
// 遍历 CSV 数据行
for {
// 读取一行数据

79
lib/core/file/txt.go Normal file
View File

@@ -0,0 +1,79 @@
package file
import (
"bufio"
"fmt"
"os"
"path/filepath"
"strings"
"ems.agt/lib/log"
)
// 写入Txt文件用,号分割 需要转换数据
// 例如:
// data := [][]string{}
// data = append(data, []string{"姓名", "年龄", "城市"})
// data = append(data, []string{"1", "2", "3"})
// err := file.WriterCSVFile(data, filePath)
func WriterTxtFile(data [][]string, filePath string) error {
// 获取文件所在的目录路径
dirPath := filepath.Dir(filePath)
// 确保文件夹路径存在
err := os.MkdirAll(dirPath, os.ModePerm)
if err != nil {
log.Errorf("创建文件夹失败 CreateFile %v", err)
}
// 创建或打开文件
file, err := os.Create(filePath)
if err != nil {
return err
}
defer file.Close()
// 创建一个 Writer 对象,用于将数据写入文件
writer := bufio.NewWriter(file)
for _, row := range data {
line := strings.Join(row, ",")
fmt.Fprintln(writer, line)
}
// 将缓冲区中的数据刷新到文件中
err = writer.Flush()
if err != nil {
log.Errorf("刷新缓冲区时发生错误:", err)
return err
}
return nil
}
// 读取Txt文件用,号分割 转换数组数据
func ReadTxtFile(filePath string) [][]string {
// 创建 map 存储 CSV 数据
arr := make([][]string, 0)
// 打开文本文件
file, err := os.Open(filePath)
if err != nil {
log.Fatal("无法打开文件:", err)
return arr
}
defer file.Close()
// 创建一个 Scanner 对象,用于逐行读取文件内容
scanner := bufio.NewScanner(file)
if scanner.Err() != nil {
log.Fatal("读取文件时出错:", scanner.Err())
return arr
}
for scanner.Scan() {
line := scanner.Text()
fields := strings.Split(line, ",")
arr = append(arr, fields)
}
return arr
}

View File

@@ -42,14 +42,14 @@ func MMLSendMsgToString(ip, msg string) (string, error) {
}
// 截断
index := strings.Index(str, "\nUDM>")
index := strings.Index(str, "\n")
if index != -1 {
str = str[:index]
str = strings.ToLower(str)
}
// 命令成功
if strings.Contains(str, "ok") {
if strings.Contains(str, "ok") || strings.Contains(str, "OK") {
return str, nil
}