diff --git a/src/assets/ip2region.xdb b/src/assets/ip2region.xdb new file mode 100644 index 00000000..c78b7928 Binary files /dev/null and b/src/assets/ip2region.xdb differ diff --git a/src/config/config.default.yaml b/src/config/config.default.yaml index 45a323f6..7fe26ab7 100644 --- a/src/config/config.default.yaml +++ b/src/config/config.default.yaml @@ -155,6 +155,11 @@ gorm: password: "" database: "" logging: false + # 内置轻量级数据库 + lite: + type: "sqlite" + database: "" + logging: false # 多个数据源时可以用这个指定默认的数据源 defaultDataSourceName: "default" @@ -190,9 +195,9 @@ user: maxRetryCount: 5 # 密码锁定时间,单位分钟(默认10分钟) lockTime: 10 - # 管理员列表 - adminList: - - "1" + # 设定为系统管理员的用户ID + system: + - 1 # char 字符验证码配置 charCaptcha: diff --git a/src/configuration.go b/src/configuration.go index d24f7b28..9cd57054 100644 --- a/src/configuration.go +++ b/src/configuration.go @@ -5,9 +5,9 @@ import ( "be.ems/src/framework/config" "be.ems/src/framework/cron" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" + "be.ems/src/framework/database/redis" "be.ems/src/framework/logger" - "be.ems/src/framework/redis" ) //go:embed config/*.yaml @@ -19,11 +19,12 @@ var assetsDir embed.FS // 配置中心初始加载 func ConfigurationInit() { // 初始配置参数 - config.InitConfig(configDir, assetsDir) + config.InitConfig(&configDir) + config.SetAssetsDirFS(&assetsDir) // 初始程序日志 logger.InitLogger() // 连接数据库实例 - datasource.Connect() + db.Connect() // 连接Redis实例 redis.Connect() // 启动调度任务实例 @@ -37,7 +38,7 @@ func ConfigurationClose() { // 关闭Redis实例 redis.Close() // 关闭数据库实例 - datasource.Close() + db.Close() // 关闭程序日志 logger.Close() } diff --git a/src/modules/chart/controller/chart_graph.go b/src/modules/chart/controller/chart_graph.go index fbb01084..30f70e03 100644 --- a/src/modules/chart/controller/chart_graph.go +++ b/src/modules/chart/controller/chart_graph.go @@ -1,12 +1,14 @@ package controller import ( + "fmt" + "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/modules/chart/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 ChartGraphController 结构体 @@ -36,7 +38,7 @@ type ChartGraphController struct { // @Router /chart/graph/groups [get] func (s *ChartGraphController) GroupNames(c *gin.Context) { data := s.chartGraphService.SelectGroup() - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // 获取关系图数据 @@ -47,25 +49,25 @@ func (s *ChartGraphController) GroupNames(c *gin.Context) { // @Accept json // @Produce json // @Param group query string true "Group" -// @Param type query string true "Type" Enums(node, edge, combo) +// @Param type query string false "Type" Enums(node, edge, combo) // @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary Getting Relationship Map Data // @Description Getting Relationship Map Data // @Router /chart/graph [get] func (s *ChartGraphController) Load(c *gin.Context) { - language := ctx.AcceptLanguage(c) var querys struct { Group string `form:"group" binding:"required"` Type string `form:"type" binding:"omitempty,oneof=node edge combo"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } data := s.chartGraphService.LoadData(querys.Group, querys.Type) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // 保存关系图数据 @@ -80,9 +82,8 @@ func (s *ChartGraphController) Load(c *gin.Context) { // @Security TokenAuth // @Summary Saving Relationship Diagram Data // @Description Saving Relationship Diagram Data -// @Router /chart/graph/ [post] +// @Router /chart/graph [post] func (s *ChartGraphController) Save(c *gin.Context) { - language := ctx.AcceptLanguage(c) var body struct { Group string `json:"group" binding:"required"` Data struct { @@ -91,9 +92,9 @@ func (s *ChartGraphController) Save(c *gin.Context) { Combos []map[string]any `json:"combos" binding:"required"` } `json:"data" binding:"required"` } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } @@ -104,10 +105,10 @@ func (s *ChartGraphController) Save(c *gin.Context) { } saveNum := s.chartGraphService.SaveData(body.Group, data) if saveNum > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 删除关系图数据 @@ -124,17 +125,17 @@ func (s *ChartGraphController) Save(c *gin.Context) { // @Description Deleting Relationship Diagram Data // @Router /chart/graph/{group} [delete] func (s *ChartGraphController) Delete(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) group := c.Param("group") if group == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } deleteNum := s.chartGraphService.DeleteGroup(group) if deleteNum > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } diff --git a/src/modules/chart/model/chart_graph.go b/src/modules/chart/model/chart_graph.go index c087d3e2..ea729d25 100644 --- a/src/modules/chart/model/chart_graph.go +++ b/src/modules/chart/model/chart_graph.go @@ -2,28 +2,28 @@ package model // ChartGraph 图表-G6关系图数据对象 chart_graph type ChartGraph struct { - RowID int64 `json:"rowId,omitempty" gorm:"column:row_id;primaryKey;autoIncrement"` // 记录ID - RowType string `json:"rowType" gorm:"row_type"` // 记录类型 - RowGroup string `json:"rowGroup" gorm:"row_group"` // 记录组名 - ID string `json:"id" gorm:"id"` // 元素ID - Type string `json:"type" gorm:"type"` // node/combo 类型 - Depth int64 `json:"depth" gorm:"depth"` // node/combo 深度 - X float64 `json:"x" gorm:"x"` // node/combo 横向坐标 - Y float64 `json:"y" gorm:"y"` // node/combo 纵向坐标 - Size string `json:"size" gorm:"size"` // node/combo 大小-JSON数组 - Icon string `json:"icon" gorm:"icon"` // node-部分类型支持图标JSON配置 - Img string `json:"img" gorm:"img"` // node-img 图片 - ClipCfg string `json:"clipCfg" gorm:"clip_cfg"` // node-img 图片裁剪JSON配置 - Direction string `json:"direction" gorm:"direction"` // node-triangle 三角形的方向 - Source string `json:"source" gorm:"source"` // edge-边起始 - Target string `json:"target" gorm:"target"` // edge-边目标 - ComboId string `json:"comboId" gorm:"combo_id"` // combo-分组 - Padding string `json:"padding" gorm:"padding"` // combo-JSON分组内边距 - ParentId string `json:"parentId" gorm:"parent_id"` // combo-父级分组 - Children string `json:"children" gorm:"children"` // combo-JSON分组内含元素 - Style string `json:"style" gorm:"style"` // 元素样式-JONS配置 - Label string `json:"label" gorm:"label"` // 标签文本 - LabelCfg string `json:"labelCfg" gorm:"label_cfg"` // 标签文本-JSON配置 + RowId int64 `json:"rowId" gorm:"column:row_id;primaryKey;autoIncrement"` // 记录ID + RowType string `json:"rowType" gorm:"column:row_type"` // 记录类型 + RowGroup string `json:"rowGroup" gorm:"column:row_group"` // 记录组名 + ID string `json:"id" gorm:"column:id"` // 元素ID + Type string `json:"type" gorm:"column:type"` // node/combo 类型 + Depth int64 `json:"depth" gorm:"column:depth"` // node/combo 深度 + X float64 `json:"x" gorm:"column:x"` // node/combo 横向坐标 + Y float64 `json:"y" gorm:"column:y"` // node/combo 纵向坐标 + Size string `json:"size" gorm:"column:size"` // node/combo 大小-JSON数组 + Icon string `json:"icon" gorm:"column:icon"` // node-部分类型支持图标JSON配置 + Img string `json:"img" gorm:"column:img"` // node-img 图片 + ClipCfg string `json:"clipCfg" gorm:"column:clip_cfg"` // node-img 图片裁剪JSON配置 + Direction string `json:"direction" gorm:"column:direction"` // node-triangle 三角形的方向 + Source string `json:"source" gorm:"column:source"` // edge-边起始 + Target string `json:"target" gorm:"column:target"` // edge-边目标 + ComboId string `json:"comboId" gorm:"column:combo_id"` // combo-分组 + Padding string `json:"padding" gorm:"column:padding"` // combo-JSON分组内边距 + ParentId string `json:"parentId" gorm:"column:parent_id"` // combo-父级分组 + Children string `json:"children" gorm:"column:children"` // combo-JSON分组内含元素 + Style string `json:"style" gorm:"column:style"` // 元素样式-JONS配置 + Label string `json:"label" gorm:"column:label"` // 标签文本 + LabelCfg string `json:"labelCfg" gorm:"column:label_cfg"` // 标签文本-JSON配置 } // TableName 表名称 diff --git a/src/modules/chart/repository/chart_graph.go b/src/modules/chart/repository/chart_graph.go index 4d917e3c..6b9a99fa 100644 --- a/src/modules/chart/repository/chart_graph.go +++ b/src/modules/chart/repository/chart_graph.go @@ -1,183 +1,83 @@ package repository import ( - "strings" - - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/chart/model" ) // 实例化数据层 ChartGraph 结构体 -var NewChartGraph = &ChartGraph{ - selectSql: `select - row_id, row_type, row_group, - id, type, depth, x, y, size, icon, img, - clip_cfg, direction, - source, target, combo_id, - padding, parent_id, children, - style, label, label_cfg - from chart_graph`, - - resultMap: map[string]string{ - "row_id": "RowID", - "row_type": "RowType", - "row_group": "RowGroup", - "id": "ID", - "type": "Type", - "depth": "Depth", - "x": "X", - "y": "Y", - "size": "Size", - "icon": "Icon", - "img": "Img", - "clip_cfg": "ClipCfg", - "direction": "Direction", - "source": "Source", - "target": "Target", - "combo_id": "ComboID", - "padding": "Padding", - "parent_id": "ParentID", - "children": "Children", - "style": "Style", - "label": "Label", - "label_cfg": "LabelCfg", - }, -} +var NewChartGraph = &ChartGraph{} // ChartGraph G6关系图数据表 数据层处理 -type ChartGraph struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type ChartGraph struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *ChartGraph) convertResultRows(rows []map[string]any) []model.ChartGraph { - arr := make([]model.ChartGraph, 0) - for _, row := range rows { - item := model.ChartGraph{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *ChartGraph) SelectPage(query map[string]any) map[string]any { +// SelectByPage 分页查询集合 +func (r ChartGraph) SelectByPage(query map[string]string) ([]model.ChartGraph, int64) { + tx := db.DB("").Model(&model.ChartGraph{}) // 查询条件拼接 - var conditions []string - var params []any if v, ok := query["rowType"]; ok && v != "" { - conditions = append(conditions, "row_type = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("row_type = ?", v) } if v, ok := query["rowGroup"]; ok && v != "" { - conditions = append(conditions, "row_group = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("row_group = ?", v) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + // 查询结果 + var total int64 = 0 + rows := []model.ChartGraph{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - result := map[string]any{ - "total": 0, - "rows": []model.ChartGraph{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from chart_graph" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + // 查询数据分页 + 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("total err => %v", err) - return result + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - 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) - - // 查询数据 - querySql := r.selectSql + whereSql + 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 + return rows, total } -// SelectList 根据实体查询 -func (r *ChartGraph) SelectList(graph model.ChartGraph) []model.ChartGraph { +// Select 查询集合 +func (r ChartGraph) Select(param model.ChartGraph) []model.ChartGraph { + tx := db.DB("").Model(&model.ChartGraph{}) // 查询条件拼接 - var conditions []string - var params []any - if graph.RowType != "" { - conditions = append(conditions, "row_type = ?") - params = append(params, graph.RowType) + if param.RowType != "" { + tx = tx.Where("row_type = ?", param.RowType) } - if graph.RowGroup != "" { - conditions = append(conditions, "row_group = ?") - params = append(params, graph.RowGroup) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + if param.RowGroup != "" { + tx = tx.Where("row_group = ?", param.RowGroup) } // 查询数据 - querySql := r.selectSql + whereSql + " order by depth asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) + rows := []model.ChartGraph{} + if err := tx.Order("depth asc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows } - - // 转换实体 - return r.convertResultRows(results) + return rows } // SelectGroup 查询组名 -func (r *ChartGraph) SelectGroup() []string { +func (r ChartGraph) SelectGroup() []string { + tx := db.DB("").Model(&model.ChartGraph{}) + // 查询数据 rows := []string{} - // 查询数量 长度为0直接返回 - querySql := "select row_group as 'str' from chart_graph GROUP BY row_group" - strRows, err := datasource.RawDB("", querySql, nil) - if err != nil { - logger.Errorf("Query err => %v", err) + if err := tx.Select("row_group").Group("row_group").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) return rows } - for _, v := range strRows { - rows = append(rows, v["str"].(string)) - } return rows } // Insert 批量添加 -func (r *ChartGraph) Inserts(graphs []model.ChartGraph) int64 { - tx := datasource.DefaultDB().CreateInBatches(graphs, 2000) +func (r ChartGraph) Inserts(graphs []model.ChartGraph) int64 { + tx := db.DB("").CreateInBatches(graphs, 2000) if err := tx.Error; err != nil { logger.Errorf("CreateInBatches err => %v", err) } @@ -185,8 +85,8 @@ func (r *ChartGraph) Inserts(graphs []model.ChartGraph) int64 { } // Delete 删除组数据 -func (r *ChartGraph) DeleteGroup(rowGroup string) int64 { - tx := datasource.DefaultDB().Where("row_group = ?", rowGroup).Delete(&model.ChartGraph{}) +func (r ChartGraph) DeleteGroup(rowGroup string) int64 { + tx := db.DB("").Where("row_group = ?", rowGroup).Delete(&model.ChartGraph{}) if err := tx.Error; err != nil { logger.Errorf("Delete err => %v", err) } diff --git a/src/modules/chart/service/chart_graph.go b/src/modules/chart/service/chart_graph.go index 6eaf3cbd..9cd8a36b 100644 --- a/src/modules/chart/service/chart_graph.go +++ b/src/modules/chart/service/chart_graph.go @@ -34,7 +34,7 @@ func (s *ChartGraph) LoadData(rowGroup, rowType string) map[string]any { if rowType != "" { graph.RowType = rowType } - data := s.graphRepository.SelectList(graph) + data := s.graphRepository.Select(graph) // 数据项 nodes := []map[string]any{} diff --git a/src/modules/common/common.go b/src/modules/common/common.go index 3bbbd97a..a8d937a3 100644 --- a/src/modules/common/common.go +++ b/src/modules/common/common.go @@ -13,18 +13,17 @@ func Setup(router *gin.Engine) { logger.Infof("开始加载 ====> common 模块路由") // 路由主页 - indexGroup := router.Group("/") - indexGroup.GET("", - // middleware.RateLimit(middleware.LimitOption{ - // Time: 300, - // Count: 10, - // Type: middleware.LIMIT_IP, - // }), + router.GET("/", + middleware.RateLimit(middleware.LimitOption{ + Time: 300, + Count: 10, + Type: middleware.LIMIT_IP, + }), controller.NewIndex.Handler, ) // 系统可暴露的配置信息 - indexGroup.GET("/sys-conf", controller.NewCommont.SysConfig) + router.GET("/sys-conf", controller.NewCommon.SysConfig) // 系统引导初始化 guideGroup := router.Group("/bootloader") { @@ -34,47 +33,47 @@ func Setup(router *gin.Engine) { guideGroup.PUT("/account", middleware.PreAuthorize(nil), controller.NewBootloader.Account) } - // 验证码操作处理 - indexGroup.GET("/captchaImage", - // middleware.RateLimit(middleware.LimitOption{ - // Time: 300, - // Count: 60, - // Type: middleware.LIMIT_IP, - // }), + // 验证码操作 + router.GET("/captcha-image", + middleware.RateLimit(middleware.LimitOption{ + Time: 300, + Count: 60, + Type: middleware.LIMIT_IP, + }), controller.NewCaptcha.Image, ) // 账号身份操作处理 { - indexGroup.POST("/login", - // middleware.RateLimit(middleware.LimitOption{ - // Time: 300, - // Count: 10, - // Type: middleware.LIMIT_IP, - // }), + router.POST("/login", + middleware.RateLimit(middleware.LimitOption{ + Time: 180, + Count: 15, + Type: middleware.LIMIT_IP, + }), middleware.CryptoApi(true, true), controller.NewAccount.Login, ) - indexGroup.GET("/getInfo", middleware.PreAuthorize(nil), controller.NewAccount.Info) - indexGroup.GET("/getRouters", middleware.PreAuthorize(nil), controller.NewAccount.Router) - indexGroup.POST("/logout", + router.GET("/me", middleware.PreAuthorize(nil), controller.NewAccount.Me) + router.GET("/router", middleware.PreAuthorize(nil), controller.NewAccount.Router) + router.POST("/logout", middleware.RateLimit(middleware.LimitOption{ - Time: 300, - Count: 5, + Time: 120, + Count: 15, Type: middleware.LIMIT_IP, }), controller.NewAccount.Logout, ) } - // 账号注册操作处理 + // 账号注册操作 { - indexGroup.POST("/register", - // middleware.RateLimit(middleware.LimitOption{ - // Time: 300, - // Count: 10, - // Type: middleware.LIMIT_IP, - // }), + router.POST("/register", + middleware.RateLimit(middleware.LimitOption{ + Time: 300, + Count: 10, + Type: middleware.LIMIT_IP, + }), middleware.CryptoApi(true, true), controller.NewRegister.Register, ) @@ -83,8 +82,8 @@ func Setup(router *gin.Engine) { // 通用请求 commonGroup := router.Group("/common") { - commonGroup.POST("/hash", middleware.PreAuthorize(nil), controller.NewCommont.Hash) - commonGroup.GET("/i18n", controller.NewCommont.I18n) + commonGroup.POST("/hash", middleware.PreAuthorize(nil), controller.NewCommon.Hash) + commonGroup.GET("/i18n", controller.NewCommon.I18n) } // 文件操作处理 @@ -95,6 +94,6 @@ func Setup(router *gin.Engine) { fileGroup.POST("/chunkCheck", middleware.PreAuthorize(nil), controller.NewFile.ChunkCheck) fileGroup.POST("/chunkUpload", middleware.PreAuthorize(nil), controller.NewFile.ChunkUpload) fileGroup.POST("/chunkMerge", middleware.PreAuthorize(nil), controller.NewFile.ChunkMerge) - fileGroup.POST("/transferStaticFile", middleware.PreAuthorize(nil), controller.NewCommont.TransferStaticFile) + fileGroup.POST("/transferStaticFile", middleware.PreAuthorize(nil), controller.NewFile.TransferStaticFile) } } diff --git a/src/modules/common/controller/account.go b/src/modules/common/controller/account.go index 694132bb..2e018dd6 100644 --- a/src/modules/common/controller/account.go +++ b/src/modules/common/controller/account.go @@ -1,36 +1,38 @@ package controller import ( + "fmt" + "strings" + "be.ems/src/framework/config" - commonConstants "be.ems/src/framework/constants/common" - tokenConstants "be.ems/src/framework/constants/token" + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - tokenUtils "be.ems/src/framework/utils/token" - "be.ems/src/framework/vo" - "be.ems/src/framework/vo/result" - commonModel "be.ems/src/modules/common/model" - commonService "be.ems/src/modules/common/service" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" + "be.ems/src/modules/common/model" + "be.ems/src/modules/common/service" + systemModelVO "be.ems/src/modules/system/model/vo" systemService "be.ems/src/modules/system/service" + "github.com/gin-gonic/gin" ) // 实例化控制层 AccountController 结构体 var NewAccount = &AccountController{ - accountService: commonService.NewAccount, - sysLogLoginService: systemService.NewSysLogLoginImpl, + accountService: service.NewAccount, + sysLogLoginService: systemService.NewSysLogLogin, } // 账号身份操作处理 // // PATH / type AccountController struct { - accountService *commonService.Account // 账号身份操作服务 - // 系统登录访问 - sysLogLoginService systemService.ISysLogLogin + accountService *service.Account // 账号身份操作服务 + sysLogLoginService *systemService.SysLogLogin // 系统登录访问 } -// 系统登录 +// Login 系统登录 // // POST /login // @@ -42,62 +44,62 @@ type AccountController struct { // @Summary System Login // @Description System Login // @Router /login [post] -func (s *AccountController) Login(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var loginBody commonModel.LoginBody - if err := c.ShouldBindJSON(&loginBody); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +func (s AccountController) Login(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body model.LoginBody + if err := c.ShouldBindJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 当前请求信息 - ipaddr, location := ctx.IPAddrLocation(c) - os, browser := ctx.UaOsBrowser(c) + ipaddr, location := reqctx.IPAddrLocation(c) + os, browser := reqctx.UaOsBrowser(c) - // 校验验证码 - err := s.accountService.ValidateCaptcha( - loginBody.Code, - loginBody.UUID, - ) - // 根据错误信息,创建系统访问记录 - if err != nil { - s.sysLogLoginService.CreateSysLogLogin( - loginBody.Username, commonConstants.STATUS_NO, err.Error(), - ipaddr, location, os, browser, + // 校验验证码 根据错误信息,创建系统访问记录 + if err := s.accountService.ValidateCaptcha(body.Code, body.UUID); err != nil { + msg := fmt.Sprintf("%s code: %s", err.Error(), body.Code) + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_NO, msg, + [4]string{ipaddr, location, os, browser}, ) - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(400, resp.CodeMsg(40012, i18n.TKey(language, err.Error()))) return } // 登录用户信息 - loginUser, err := s.accountService.LoginByUsername(loginBody.Username, loginBody.Password) + loginUser, err := s.accountService.ByUsername(body.Username, body.Password) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } // 生成令牌,创建系统访问记录 - tokenStr := tokenUtils.Create(&loginUser, ipaddr, location, os, browser) + tokenStr := token.Create(&loginUser, [4]string{ipaddr, location, os, browser}) if tokenStr == "" { - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) return } else { - s.accountService.UpdateLoginDateAndIP(&loginUser) + s.accountService.UpdateLoginDateAndIP(loginUser) // 登录成功 - s.sysLogLoginService.CreateSysLogLogin( - loginBody.Username, commonConstants.STATUS_YES, "app.common.loginSuccess", - ipaddr, location, os, browser, + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_YES, "app.common.loginSuccess", + [4]string{ipaddr, location, os, browser}, ) } - c.JSON(200, result.OkData(map[string]any{ - tokenConstants.RESPONSE_FIELD: tokenStr, + c.JSON(200, resp.OkData(map[string]any{ + "accessToken": tokenStr, + "tokenType": strings.TrimRight(constants.HEADER_PREFIX, " "), + "expiresIn": (loginUser.ExpireTime - loginUser.LoginTime) / 1000, + "userId": loginUser.UserId, })) } -// 登录用户信息 +// Me 登录用户信息 // -// GET /getInfo +// GET /me // // @Tags common/authorization // @Accept json @@ -106,35 +108,35 @@ func (s *AccountController) Login(c *gin.Context) { // @Security TokenAuth // @Summary Login User Information // @Description Login User Information -// @Router /getInfo [get] -func (s *AccountController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - loginUser, err := ctx.LoginUser(c) +// @Router /me [get] +func (s AccountController) Me(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + info, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(40003, err.Error())) return } - // 角色权限集合,管理员拥有所有权限 - isAdmin := config.IsAdmin(loginUser.UserID) - roles, perms := s.accountService.RoleAndMenuPerms(loginUser.UserID, isAdmin) + // 角色权限集合,系统管理员拥有所有权限 + isSystemUser := config.IsSystemUser(info.UserId) + roles, perms := s.accountService.RoleAndMenuPerms(info.UserId, isSystemUser) - loginUser.User.NickName = i18n.TKey(language, loginUser.User.NickName) - loginUser.User.Remark = i18n.TKey(language, loginUser.User.Remark) - loginUser.User.Dept.DeptName = i18n.TKey(language, loginUser.User.Dept.DeptName) - for ri := range loginUser.User.Roles { - loginUser.User.Roles[ri].RoleName = i18n.TKey(language, loginUser.User.Roles[ri].RoleName) + info.User.NickName = i18n.TKey(language, info.User.NickName) + info.User.Remark = i18n.TKey(language, info.User.Remark) + info.User.Dept.DeptName = i18n.TKey(language, info.User.Dept.DeptName) + for ri := range info.User.Roles { + info.User.Roles[ri].RoleName = i18n.TKey(language, info.User.Roles[ri].RoleName) } - c.JSON(200, result.OkData(map[string]any{ - "user": loginUser.User, + c.JSON(200, resp.OkData(map[string]any{ + "user": info.User, "roles": roles, "permissions": perms, })) } -// 登录用户路由信息 +// Router 登录用户路由信息 // -// GET /getRouters +// GET /router // // @Tags common/authorization // @Accept json @@ -143,18 +145,18 @@ func (s *AccountController) Info(c *gin.Context) { // @Security TokenAuth // @Summary Login User Routing Information // @Description Login User Routing Information -// @Router /getRouters [get] -func (s *AccountController) Router(c *gin.Context) { - userID := ctx.LoginUserToUserID(c) +// @Router /router [get] +func (s AccountController) Router(c *gin.Context) { + userId := reqctx.LoginUserToUserID(c) - // 前端路由,管理员拥有所有 - isAdmin := config.IsAdmin(userID) - buildMenus := s.accountService.RouteMenus(userID, isAdmin) + // 前端路由,系统管理员拥有所有 + isSystemUser := config.IsSystemUser(userId) + buildMenus := s.accountService.RouteMenus(userId, isSystemUser) // 闭包函数处理多语言 - language := ctx.AcceptLanguage(c) - var converI18n func(language string, arr *[]vo.Router) - converI18n = func(language string, arr *[]vo.Router) { + language := reqctx.AcceptLanguage(c) + var converI18n func(language string, arr *[]systemModelVO.Router) + converI18n = func(language string, arr *[]systemModelVO.Router) { for i := range *arr { (*arr)[i].Meta.Title = i18n.TKey(language, (*arr)[i].Meta.Title) if len((*arr)[i].Children) > 0 { @@ -164,10 +166,10 @@ func (s *AccountController) Router(c *gin.Context) { } converI18n(language, &buildMenus) - c.JSON(200, result.OkData(buildMenus)) + c.JSON(200, resp.OkData(buildMenus)) } -// 系统登出 +// Logout 系统登出 // // POST /logout // @@ -179,25 +181,23 @@ func (s *AccountController) Router(c *gin.Context) { // @Summary System Logout // @Description System Logout // @Router /logout [post] -func (s *AccountController) Logout(c *gin.Context) { - language := ctx.AcceptLanguage(c) - tokenStr := ctx.Authorization(c) +func (s AccountController) Logout(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + tokenStr := reqctx.Authorization(c) if tokenStr != "" { // 存在token时记录退出信息 - userName := tokenUtils.Remove(tokenStr) + userName := token.Remove(tokenStr) if userName != "" { // 当前请求信息 - ipaddr, location := ctx.IPAddrLocation(c) - os, browser := ctx.UaOsBrowser(c) - - // 创建系统访问记录 退出成功 - - s.sysLogLoginService.CreateSysLogLogin( - userName, commonConstants.STATUS_YES, "app.common.logoutSuccess", - ipaddr, location, os, browser, + ipaddr, location := reqctx.IPAddrLocation(c) + os, browser := reqctx.UaOsBrowser(c) + // 创建系统访问记录 + s.sysLogLoginService.Insert( + userName, constants.STATUS_YES, "app.common.logoutSuccess", + [4]string{ipaddr, location, os, browser}, ) } } - c.JSON(200, result.OkMsg(i18n.TKey(language, "app.common.logoutSuccess"))) + c.JSON(200, resp.OkMsg(i18n.TKey(language, "app.common.logoutSuccess"))) } diff --git a/src/modules/common/controller/bootloader.go b/src/modules/common/controller/bootloader.go index 0c9f5205..9ce9f64a 100644 --- a/src/modules/common/controller/bootloader.go +++ b/src/modules/common/controller/bootloader.go @@ -1,34 +1,33 @@ package controller import ( - adminConstants "be.ems/src/framework/constants/admin" - "be.ems/src/framework/constants/common" - tokenConstants "be.ems/src/framework/constants/token" + "strings" + + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" "be.ems/src/framework/utils/machine" "be.ems/src/framework/utils/regular" - tokenUtils "be.ems/src/framework/utils/token" - "be.ems/src/framework/vo" - "be.ems/src/framework/vo/result" - commonService "be.ems/src/modules/common/service" + "be.ems/src/modules/common/service" systemService "be.ems/src/modules/system/service" + "github.com/gin-gonic/gin" ) // 实例化控制层 BootloaderController 结构体 var NewBootloader = &BootloaderController{ - accountService: commonService.NewAccount, - sysUserService: systemService.NewSysUserImpl, + accountService: service.NewAccount, + sysUserService: systemService.NewSysUser, } // 系统引导初始化 // // PATH /bootloader type BootloaderController struct { - accountService *commonService.Account // 账号身份操作服务 - // 用户信息服务 - sysUserService systemService.ISysUser + accountService *service.Account // 账号身份操作服务 + sysUserService *systemService.SysUser // 用户信息服务 } // 首次引导开始 @@ -38,44 +37,47 @@ func (s *BootloaderController) Start(c *gin.Context) { // 是否完成引导 launchInfo := machine.LaunchInfo if launchInfo == nil { - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) return } - if v, ok := launchInfo[common.LAUNCH_BOOTLOADER]; ok && !v.(bool) { - c.JSON(200, result.ErrMsg("bootloader done")) + if v, ok := launchInfo[constants.LAUNCH_BOOTLOADER]; ok && !v.(bool) { + c.JSON(200, resp.ErrMsg("bootloader done")) return } // 查询用户登录账号 - sysUser := s.sysUserService.SelectUserById("1") - if sysUser.UserID != "1" { - c.JSON(200, result.ErrMsg("not found user data")) + sysUser := s.sysUserService.FindById(1) + if sysUser.UserId != 1 { + c.JSON(200, resp.ErrMsg("not found user data")) return } // 登录用户信息 - loginUser := vo.LoginUser{ - UserID: sysUser.UserID, - DeptID: sysUser.DeptID, + loginUser := token.TokenInfo{ + UserId: sysUser.UserId, + DeptId: sysUser.DeptId, User: sysUser, - Permissions: []string{adminConstants.PERMISSION}, + Permissions: []string{constants.SYS_PERMISSION_SYSTEM}, } // 当前请求信息 - ipaddr, location := ctx.IPAddrLocation(c) - os, browser := ctx.UaOsBrowser(c) + ipaddr, location := reqctx.IPAddrLocation(c) + os, browser := reqctx.UaOsBrowser(c) // 生成令牌,创建系统访问记录 - tokenStr := tokenUtils.Create(&loginUser, ipaddr, location, os, browser) + tokenStr := token.Create(&loginUser, [4]string{ipaddr, location, os, browser}) if tokenStr == "" { - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) return } else { - s.accountService.UpdateLoginDateAndIP(&loginUser) + s.accountService.UpdateLoginDateAndIP(loginUser) } - c.JSON(200, result.OkData(map[string]any{ - tokenConstants.RESPONSE_FIELD: tokenStr, + c.JSON(200, resp.OkData(map[string]any{ + "accessToken": tokenStr, + "tokenType": strings.TrimRight(constants.HEADER_PREFIX, " "), + "expiresIn": (loginUser.ExpireTime - loginUser.LoginTime) / 1000, + "userId": loginUser.UserId, })) } @@ -86,23 +88,23 @@ func (s *BootloaderController) Done(c *gin.Context) { // 是否完成引导 launchInfo := machine.LaunchInfo if launchInfo == nil { - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) return } - if v, ok := launchInfo[common.LAUNCH_BOOTLOADER]; ok && !v.(bool) { - c.JSON(200, result.ErrMsg("bootloader done")) + if v, ok := launchInfo[constants.LAUNCH_BOOTLOADER]; ok && !v.(bool) { + c.JSON(200, resp.ErrMsg("bootloader done")) return } // 标记引导完成 if err := machine.Bootloader(false); err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } // 清除授权信息 - tokenUtils.Remove(ctx.Authorization(c)) - c.JSON(200, result.Ok(nil)) + token.Remove(reqctx.Authorization(c)) + c.JSON(200, resp.Ok(nil)) } // 引导系统数据重置 @@ -112,69 +114,69 @@ func (s *BootloaderController) Reset(c *gin.Context) { // 是否完成引导 launchInfo := machine.LaunchInfo if launchInfo == nil { - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) return } - if v, ok := launchInfo[common.LAUNCH_BOOTLOADER]; ok && v.(bool) { - c.JSON(200, result.ErrMsg("bootloader not done")) + if v, ok := launchInfo[constants.LAUNCH_BOOTLOADER]; ok && v.(bool) { + c.JSON(200, resp.ErrMsg("bootloader not done")) return } if err := machine.Reset(); err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } // 清除授权信息 - tokenUtils.Remove(ctx.Authorization(c)) - c.JSON(200, result.Ok(nil)) + token.Remove(reqctx.Authorization(c)) + c.JSON(200, resp.Ok(nil)) } // 账号变更 // // PUT /account func (s *BootloaderController) Account(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { UserName string `json:"username" binding:"required"` Password string `json:"password" binding:"required"` } if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } if !regular.ValidPassword(body.Password) { // 登录密码至少包含大小写字母、数字、特殊符号,且不少于6位 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.errPasswd"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "user.errPasswd"))) return } // 是否完成引导 launchInfo := machine.LaunchInfo if launchInfo == nil { - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) return } - if v, ok := launchInfo[common.LAUNCH_BOOTLOADER]; ok && !v.(bool) { - c.JSON(200, result.ErrMsg("bootloader done")) + if v, ok := launchInfo[constants.LAUNCH_BOOTLOADER]; ok && !v.(bool) { + c.JSON(200, resp.ErrMsg("bootloader done")) return } // 查询用户登录账号 - sysUser := s.sysUserService.SelectUserById("2") - if sysUser.UserID != "2" { - c.JSON(200, result.ErrMsg("not found user data")) + sysUser := s.sysUserService.FindById(2) + if sysUser.UserId != 2 { + c.JSON(200, resp.ErrMsg("not found user data")) return } sysUser.UserName = body.UserName sysUser.NickName = body.UserName sysUser.Password = body.Password - sysUser.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysUserService.UpdateUser(sysUser) + sysUser.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysUserService.Update(sysUser) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } diff --git a/src/modules/common/controller/captcha.go b/src/modules/common/controller/captcha.go index c39a6430..03180113 100644 --- a/src/modules/common/controller/captcha.go +++ b/src/modules/common/controller/captcha.go @@ -4,12 +4,11 @@ import ( "time" "be.ems/src/framework/config" - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/constants/captcha" + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" "be.ems/src/framework/logger" - "be.ems/src/framework/redis" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" @@ -18,15 +17,14 @@ import ( // 实例化控制层 CaptchaController 结构体 var NewCaptcha = &CaptchaController{ - sysConfigService: systemService.NewSysConfigImpl, + sysConfigService: systemService.NewSysConfig, } // 验证码操作处理 // // PATH / type CaptchaController struct { - // 参数配置服务 - sysConfigService systemService.ISysConfig + sysConfigService *systemService.SysConfig // 参数配置服务 } // 获取验证码 @@ -43,10 +41,10 @@ type CaptchaController struct { // @Router /captchaImage [get] func (s *CaptchaController) Image(c *gin.Context) { // 从数据库配置获取验证码开关 true开启,false关闭 - captchaEnabledStr := s.sysConfigService.SelectConfigValueByKey("sys.account.captchaEnabled") + captchaEnabledStr := s.sysConfigService.FindValueByKey("sys.account.captchaEnabled") captchaEnabled := parse.Boolean(captchaEnabledStr) if !captchaEnabled { - c.JSON(200, result.Ok(map[string]any{ + c.JSON(200, resp.Ok(map[string]any{ "captchaEnabled": captchaEnabled, })) return @@ -61,8 +59,8 @@ func (s *CaptchaController) Image(c *gin.Context) { } // 从数据库配置获取验证码类型 math 数值计算 char 字符验证 - captchaType := s.sysConfigService.SelectConfigValueByKey("sys.account.captchaType") - if captchaType == captcha.TYPE_MATH { + captchaType := s.sysConfigService.FindValueByKey("sys.account.captchaType") + if captchaType == constants.CAPTCHA_TYPE_MATH { math := config.Get("mathCaptcha").(map[string]any) driverCaptcha := &base64Captcha.DriverMath{ //Height png height in pixel. @@ -87,12 +85,12 @@ func (s *CaptchaController) Image(c *gin.Context) { } else { data["uuid"] = id data["img"] = item.EncodeB64string() - expiration := captcha.EXPIRATION * time.Second - verifyKey = cachekey.CAPTCHA_CODE_KEY + id + expiration := constants.CAPTCHA_EXPIRATION * time.Second + verifyKey = constants.CACHE_CAPTCHA_CODE + ":" + id redis.SetByExpire("", verifyKey, answer, expiration) } } - if captchaType == captcha.TYPE_CHAR { + if captchaType == constants.CAPTCHA_TYPE_CHAR { char := config.Get("charCaptcha").(map[string]any) driverCaptcha := &base64Captcha.DriverString{ //Height png height in pixel. @@ -121,8 +119,8 @@ func (s *CaptchaController) Image(c *gin.Context) { } else { data["uuid"] = id data["img"] = item.EncodeB64string() - expiration := captcha.EXPIRATION * time.Second - verifyKey = cachekey.CAPTCHA_CODE_KEY + id + expiration := constants.CAPTCHA_EXPIRATION * time.Second + verifyKey = constants.CACHE_CAPTCHA_CODE + ":" + id redis.SetByExpire("", verifyKey, answer, expiration) } } @@ -131,8 +129,8 @@ func (s *CaptchaController) Image(c *gin.Context) { if config.Env() == "local" { text, _ := redis.Get("", verifyKey) data["text"] = text - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.Ok(data)) return } - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.Ok(data)) } diff --git a/src/modules/common/controller/common.go b/src/modules/common/controller/common.go index 5d899152..5d7d4745 100644 --- a/src/modules/common/controller/common.go +++ b/src/modules/common/controller/common.go @@ -1,37 +1,92 @@ package controller import ( + "crypto/md5" + "crypto/sha1" + "crypto/sha256" + "crypto/sha512" + "encoding/hex" + "fmt" + "hash" + "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" commonService "be.ems/src/modules/common/service" "github.com/gin-gonic/gin" ) -// 实例化控制层 CommontController 结构体 -var NewCommont = &CommontController{ +// 实例化控制层 CommonController 结构体 +var NewCommon = &CommonController{ commontService: commonService.NewCommont, } // 通用请求 // // PATH / -type CommontController struct { +type CommonController struct { commontService *commonService.Commont // 通用请求服务 } -// 哈希加密 +// Hash 哈希编码 // // POST /hash -func (s *CommontController) Hash(c *gin.Context) { - c.String(200, "commont Hash") +func (s CommonController) Hash(c *gin.Context) { + var body struct { + Type string `json:"type" binding:"required,oneof=sha1 sha256 sha512 md5"` + Str string `json:"str" binding:"required"` + } + if err := c.ShouldBindJSON(&body); err != nil { + c.JSON(200, gin.H{ + "code": 400, + "msg": "参数错误", + }) + return + } + + var h hash.Hash + var err error + switch body.Type { + case "sha1": + h = sha1.New() + case "sha256": + h = sha256.New() + case "sha512": + h = sha512.New() + case "md5": + h = md5.New() + default: + c.JSON(200, gin.H{ + "code": 400, + "msg": fmt.Sprintf("不支持的哈希算法: %s", body.Type), + }) + return + } + + // 写入需要哈希的数据 + if _, err = h.Write([]byte(body.Str)); err != nil { + c.JSON(500, gin.H{ + "code": 500, + "msg": "哈希写入错误", + }) + return + } + + // 计算哈希值的16进制表示 + hashed := h.Sum(nil) + text := hex.EncodeToString(hashed) + c.JSON(200, gin.H{ + "code": 200, + "msg": "success", + "data": text, + }) } // 多语言处理 // // GET /i18n -func (s *CommontController) I18n(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s *CommonController) I18n(c *gin.Context) { + language := reqctx.AcceptLanguage(c) i18nLang := i18n.TKey(language, "i18n") hello := i18n.TKey(language, "hello") @@ -57,11 +112,11 @@ func (s *CommontController) I18n(c *gin.Context) { // @Summary Configuration information for the system // @Description Configuration information for the system // @Router /sys-conf [get] -func (s *CommontController) SysConfig(c *gin.Context) { +func (s CommonController) SysConfig(c *gin.Context) { data := s.commontService.SystemConfigInfo() // 闭包函数处理多语言 - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) converI18n := func(language string, arr *map[string]string) { for k, v := range *arr { (*arr)[k] = i18n.TKey(language, v) @@ -69,5 +124,5 @@ func (s *CommontController) SysConfig(c *gin.Context) { } converI18n(language, &data) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } diff --git a/src/modules/common/controller/file.go b/src/modules/common/controller/file.go index c09ead28..eb919334 100644 --- a/src/modules/common/controller/file.go +++ b/src/modules/common/controller/file.go @@ -8,14 +8,13 @@ import ( "strings" "be.ems/src/framework/config" - "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/file" - "be.ems/src/framework/vo/result" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 FileController 结构体 @@ -30,16 +29,16 @@ type FileController struct{} // // GET /download/:filePath func (s *FileController) Download(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) filePath := c.Param("filePath") if len(filePath) < 8 { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // base64解析出地址 decodedBytes, err := base64.StdEncoding.DecodeString(filePath) if err != nil { - c.JSON(400, result.CodeMsg(400, err.Error())) + c.JSON(400, resp.CodeMsg(400, err.Error())) return } routerPath := string(decodedBytes) @@ -48,7 +47,7 @@ func (s *FileController) Download(c *gin.Context) { headerRange := c.GetHeader("Range") resultMap, err := file.ReadUploadFileStream(routerPath, headerRange) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -83,29 +82,29 @@ func (s *FileController) Download(c *gin.Context) { // @Description Upload a file, interface param use // @Router /file/upload [post] func (s *FileController) Upload(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 上传的文件 formFile, err := c.FormFile("file") if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 子路径 subPath := c.PostForm("subPath") - if _, ok := uploadsubpath.UploadSubpath[subPath]; !ok { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if _, ok := constants.UPLOAD_SUB_PATH[subPath]; !ok { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 上传文件转存 upFilePath, err := file.TransferUploadFile(formFile, subPath, nil) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } newFileName := upFilePath[strings.LastIndex(upFilePath, "/")+1:] - c.JSON(200, result.OkData(map[string]string{ + c.JSON(200, resp.OkData(map[string]string{ "url": "//" + c.Request.Host + upFilePath, "fileName": upFilePath, "newFileName": newFileName, @@ -127,7 +126,7 @@ func (s *FileController) Upload(c *gin.Context) { // @Description Slice file checking // @Router /file/chunkCheck [post] func (s *FileController) ChunkCheck(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { // 唯一标识 Identifier string `json:"identifier" binding:"required"` @@ -136,17 +135,17 @@ func (s *FileController) ChunkCheck(c *gin.Context) { } err := c.ShouldBindJSON(&body) if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 读取标识目录 chunks, err := file.ChunkCheckFile(body.Identifier, body.FileName) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(chunks)) + c.JSON(200, resp.OkData(chunks)) } // 切片文件合并 @@ -163,7 +162,7 @@ func (s *FileController) ChunkCheck(c *gin.Context) { // @Description Slice file merge // @Router /file/chunkMerge [post] func (s *FileController) ChunkMerge(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { // 唯一标识 Identifier string `json:"identifier" binding:"required"` @@ -174,23 +173,23 @@ func (s *FileController) ChunkMerge(c *gin.Context) { } err := c.ShouldBindJSON(&body) if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } - if _, ok := uploadsubpath.UploadSubpath[body.SubPath]; !ok { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if _, ok := constants.UPLOAD_SUB_PATH[body.SubPath]; !ok { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 切片文件合并 mergeFilePath, err := file.ChunkMergeFile(body.Identifier, body.FileName, body.SubPath) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } newFileName := mergeFilePath[strings.LastIndex(mergeFilePath, "/")+1:] - c.JSON(200, result.OkData(map[string]string{ + c.JSON(200, resp.OkData(map[string]string{ "url": "//" + c.Request.Host + mergeFilePath, "fileName": mergeFilePath, "newFileName": newFileName, @@ -214,7 +213,7 @@ func (s *FileController) ChunkMerge(c *gin.Context) { // @Description Sliced file upload // @Router /file/chunkUpload [post] func (s *FileController) ChunkUpload(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 切片编号 index := c.PostForm("index") // 切片唯一标识 @@ -222,31 +221,31 @@ func (s *FileController) ChunkUpload(c *gin.Context) { // 上传的文件 formFile, err := c.FormFile("file") if index == "" || identifier == "" || err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 上传文件转存 chunkFilePath, err := file.TransferChunkUploadFile(formFile, index, identifier) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(206, result.OkData(chunkFilePath)) + c.JSON(206, resp.OkData(chunkFilePath)) } // 转存指定对应文件到静态目录 // // POST /transferStaticFile -func (s *CommontController) TransferStaticFile(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s *FileController) TransferStaticFile(c *gin.Context) { var body struct { UploadPath string `json:"uploadPath" binding:"required"` StaticPath string `json:"staticPath" binding:"required"` Language string `json:"language" binding:"required"` } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } @@ -257,7 +256,7 @@ func (s *CommontController) TransferStaticFile(c *gin.Context) { static := config.Get("staticFile.default").(map[string]any) dir, err := filepath.Abs(static["dir"].(string)) if err != nil { - c.JSON(400, result.CodeMsg(400, err.Error())) + c.JSON(400, resp.CodeMsg(400, err.Error())) return } @@ -267,10 +266,10 @@ func (s *CommontController) TransferStaticFile(c *gin.Context) { err = file.CopyUploadFile(body.UploadPath, newFile) if err != nil { - c.JSON(400, result.CodeMsg(400, err.Error())) + c.JSON(400, resp.CodeMsg(400, err.Error())) return } urlPath := strings.Replace(newFile, dir, static["prefix"].(string), 1) - c.JSON(200, result.OkData(filepath.ToSlash(urlPath))) + c.JSON(200, resp.OkData(filepath.ToSlash(urlPath))) } diff --git a/src/modules/common/controller/index.go b/src/modules/common/controller/index.go index 226dc7bb..7ea17976 100644 --- a/src/modules/common/controller/index.go +++ b/src/modules/common/controller/index.go @@ -4,7 +4,7 @@ import ( "fmt" libGlobal "be.ems/lib/global" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" "github.com/gin-gonic/gin" ) @@ -32,6 +32,6 @@ func (s *IndexController) Handler(c *gin.Context) { name := "OMC" version := libGlobal.Version // str := "欢迎使用%s核心网管理平台,当前版本:%s,请通过前台地址访问。" - str := "Welcome to the %s Core Network Management Platform, current version: %s, please access via the frontend address." - c.JSON(200, result.OkMsg(fmt.Sprintf(str, name, version))) + str := "%s Core Network Management, current version: %s" + c.JSON(200, resp.OkMsg(fmt.Sprintf(str, name, version))) } diff --git a/src/modules/common/controller/register.go b/src/modules/common/controller/register.go index 7b5f344b..1280e457 100644 --- a/src/modules/common/controller/register.go +++ b/src/modules/common/controller/register.go @@ -1,13 +1,15 @@ package controller import ( - commonConstants "be.ems/src/framework/constants/common" + "fmt" + + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/regular" - "be.ems/src/framework/vo/result" - commonModel "be.ems/src/modules/common/model" - commonService "be.ems/src/modules/common/service" + "be.ems/src/modules/common/model" + "be.ems/src/modules/common/service" systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" @@ -15,77 +17,77 @@ import ( // 实例化控制层 RegisterController 结构体 var NewRegister = &RegisterController{ - registerService: commonService.NewRegisterImpl, - sysLogLoginService: systemService.NewSysLogLoginImpl, + registerService: service.NewRegister, + sysLogLoginService: systemService.NewSysLogLogin, } // 账号注册操作处理 // // PATH / type RegisterController struct { - // 账号注册操作服务 - registerService commonService.IRegister - // 系统登录访问 - sysLogLoginService systemService.ISysLogLogin + registerService *service.Register // 账号注册操作服务 + sysLogLoginService *systemService.SysLogLogin // 系统登录访问服务 } // 账号注册 // // GET /register func (s *RegisterController) Register(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var registerBody commonModel.RegisterBody - if err := c.ShouldBindJSON(®isterBody); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + var body model.RegisterBody + if err := c.ShouldBindJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 判断必传参数 - if !regular.ValidUsername(registerBody.Username) { + if !regular.ValidUsername(body.Username) { // 账号不能以数字开头,可包含大写小写字母,数字,且不少于5位 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "register.errUsername"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "register.errUsername"))) return } - if !regular.ValidPassword(registerBody.Password) { + if !regular.ValidPassword(body.Password) { // 登录密码至少包含大小写字母、数字、特殊符号,且不少于6位 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "register.errPasswd"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "register.errPasswd"))) return } - if registerBody.Password != registerBody.ConfirmPassword { + if body.Password != body.ConfirmPassword { // 用户确认输入密码不一致 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "register.errPasswdNotEq"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "register.errPasswdNotEq"))) return } // 当前请求信息 - ipaddr, location := ctx.IPAddrLocation(c) - os, browser := ctx.UaOsBrowser(c) + ipaddr, location := reqctx.IPAddrLocation(c) + os, browser := reqctx.UaOsBrowser(c) // 校验验证码 err := s.registerService.ValidateCaptcha( - registerBody.Code, - registerBody.UUID, + body.Code, + body.UUID, ) // 根据错误信息,创建系统访问记录 if err != nil { - s.sysLogLoginService.CreateSysLogLogin( - registerBody.Username, commonConstants.STATUS_NO, err.Error(), - ipaddr, location, os, browser, + msg := err.Error() + " code: " + body.Code + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_NO, msg, + [4]string{ipaddr, location, os, browser}, ) - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - userID, err := s.registerService.ByUserName(registerBody.Username, registerBody.Password, registerBody.UserType) + userId, err := s.registerService.ByUserName(body.Username, body.Password) if err == nil { - msg := i18n.TTemplate(language, "register.successMsg", map[string]any{"name": registerBody.Username, "id": userID}) - s.sysLogLoginService.CreateSysLogLogin( - registerBody.Username, commonConstants.STATUS_YES, msg, - ipaddr, location, os, browser, + msg := i18n.TTemplate(language, "register.successMsg", map[string]any{"name": body.Username, "id": userId}) + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_YES, msg, + [4]string{ipaddr, location, os, browser}, ) // 注册成功 - c.JSON(200, result.OkMsg(i18n.TKey(language, "register.success"))) + c.JSON(200, resp.OkMsg(i18n.TKey(language, "register.success"))) return } - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) } diff --git a/src/modules/common/service/account.go b/src/modules/common/service/account.go index dce06a02..102bad66 100644 --- a/src/modules/common/service/account.go +++ b/src/modules/common/service/account.go @@ -5,41 +5,35 @@ import ( "time" "be.ems/src/framework/config" - adminConstants "be.ems/src/framework/constants/admin" - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/constants/common" - "be.ems/src/framework/redis" + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" + "be.ems/src/framework/token" "be.ems/src/framework/utils/crypto" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo" - "be.ems/src/modules/system/model" + systemModelVO "be.ems/src/modules/system/model/vo" systemService "be.ems/src/modules/system/service" ) // 实例化服务层 Account 结构体 var NewAccount = &Account{ - sysUserService: systemService.NewSysUserImpl, - sysConfigService: systemService.NewSysConfigImpl, - sysRoleService: systemService.NewSysRoleImpl, - sysMenuService: systemService.NewSysMenuImpl, + sysUserService: systemService.NewSysUser, + sysConfigService: systemService.NewSysConfig, + sysRoleService: systemService.NewSysRole, + sysMenuService: systemService.NewSysMenu, } // 账号身份操作服务 服务层处理 type Account struct { - // 用户信息服务 - sysUserService systemService.ISysUser - // 参数配置服务 - sysConfigService systemService.ISysConfig - // 角色服务 - sysRoleService systemService.ISysRole - // 菜单服务 - sysMenuService systemService.ISysMenu + sysUserService *systemService.SysUser // 用户信息服务 + sysConfigService *systemService.SysConfig // 参数配置服务 + sysRoleService *systemService.SysRole // 角色服务 + sysMenuService *systemService.SysMenu // 菜单服务 } // ValidateCaptcha 校验验证码 func (s *Account) ValidateCaptcha(code, uuid string) error { // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 - captchaEnabledStr := s.sysConfigService.SelectConfigValueByKey("sys.account.captchaEnabled") + captchaEnabledStr := s.sysConfigService.FindValueByKey("sys.account.captchaEnabled") if !parse.Boolean(captchaEnabledStr) { return nil } @@ -47,13 +41,13 @@ func (s *Account) ValidateCaptcha(code, uuid string) error { // 验证码信息错误 return fmt.Errorf("captcha.err") } - verifyKey := cachekey.CAPTCHA_CODE_KEY + uuid + verifyKey := constants.CACHE_CAPTCHA_CODE + ":" + uuid captcha, _ := redis.Get("", verifyKey) if captcha == "" { // 验证码已失效 return fmt.Errorf("captcha.errValid") } - redis.Del("", verifyKey) + _ = redis.Del("", verifyKey) if captcha != code { // 验证码错误 return fmt.Errorf("captcha.err") @@ -61,133 +55,122 @@ func (s *Account) ValidateCaptcha(code, uuid string) error { return nil } -// LoginByUsername 登录创建用户信息 -func (s *Account) LoginByUsername(username, password string) (vo.LoginUser, error) { - loginUser := vo.LoginUser{} +// ByUsername 登录创建用户信息 +func (s Account) ByUsername(username, password string) (token.TokenInfo, error) { + tokenInfo := token.TokenInfo{} // 检查密码重试次数 - retrykey, retryCount, lockTime, err := s.passwordRetryCount(username) + retryKey, retryCount, lockTime, err := s.passwordRetryCount(username) if err != nil { - return loginUser, err + return tokenInfo, err } // 查询用户登录账号 - sysUser := s.sysUserService.SelectUserByUserName(username) + sysUser := s.sysUserService.FindByUserName(username) if sysUser.UserName != username { - return loginUser, fmt.Errorf("login.errNameOrPasswd") + return tokenInfo, fmt.Errorf("login.errNameOrPasswd") } - if sysUser.DelFlag == common.STATUS_YES { - // 对不起,您的账号已被删除 - return loginUser, fmt.Errorf("login.errDelFlag") + if sysUser.DelFlag == constants.STATUS_YES { + return tokenInfo, fmt.Errorf("login.errDelFlag") } - if sysUser.Status == common.STATUS_NO { - return loginUser, fmt.Errorf("login.errStatus") + if sysUser.StatusFlag == constants.STATUS_NO { + return tokenInfo, fmt.Errorf("login.errStatus") } // 检验用户密码 compareBool := crypto.BcryptCompare(password, sysUser.Password) - if !compareBool { - redis.SetByExpire("", retrykey, retryCount+1, lockTime) - // 用户不存在或密码错误 - return loginUser, fmt.Errorf("login.errNameOrPasswd") + if compareBool { + s.CleanLoginRecordCache(sysUser.UserName) // 清除错误记录次数 } else { - // 清除错误记录次数 - s.ClearLoginRecordCache(username) + _ = redis.SetByExpire("", retryKey, retryCount+1, lockTime) + return tokenInfo, fmt.Errorf("login.errNameOrPasswd") } // 登录用户信息 - loginUser.UserID = sysUser.UserID - loginUser.DeptID = sysUser.DeptID - loginUser.User = sysUser + tokenInfo.UserId = sysUser.UserId + tokenInfo.DeptId = sysUser.DeptId + tokenInfo.User = sysUser // 用户权限组标识 - isAdmin := config.IsAdmin(sysUser.UserID) - if isAdmin { - loginUser.Permissions = []string{adminConstants.PERMISSION} + if config.IsSystemUser(sysUser.UserId) { + tokenInfo.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} } else { - perms := s.sysMenuService.SelectMenuPermsByUserId(sysUser.UserID) - loginUser.Permissions = parse.RemoveDuplicates(perms) + perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) + tokenInfo.Permissions = parse.RemoveDuplicates(perms) } - return loginUser, nil + return tokenInfo, nil } // UpdateLoginDateAndIP 更新登录时间和IP -func (s *Account) UpdateLoginDateAndIP(loginUser *vo.LoginUser) bool { - sysUser := loginUser.User - userInfo := model.SysUser{ - UserID: sysUser.UserID, - LoginIP: sysUser.LoginIP, - LoginDate: sysUser.LoginDate, - UpdateBy: sysUser.UserName, - Sex: sysUser.Sex, - PhoneNumber: sysUser.PhoneNumber, - Email: sysUser.Email, - Remark: sysUser.Remark, - } - rows := s.sysUserService.UpdateUser(userInfo) - return rows > 0 +func (s Account) UpdateLoginDateAndIP(tokenInfo token.TokenInfo) bool { + user := s.sysUserService.FindById(tokenInfo.UserId) + user.Password = "" // 密码不更新 + user.LoginIp = tokenInfo.LoginIp + user.LoginTime = tokenInfo.LoginTime + return s.sysUserService.Update(user) > 0 } -// ClearLoginRecordCache 清除错误记录次数 -func (s *Account) ClearLoginRecordCache(username string) bool { - cacheKey := cachekey.PWD_ERR_CNT_KEY + username - hasKey, _ := redis.Has("", cacheKey) - if hasKey { - delOk, _ := redis.Del("", cacheKey) - return delOk +// CleanLoginRecordCache 清除错误记录次数 +func (s Account) CleanLoginRecordCache(userName string) bool { + cacheKey := fmt.Sprintf("%s:%s", constants.CACHE_PWD_ERR_COUNT, userName) + hasKey, err := redis.Has("", cacheKey) + if hasKey > 0 && err == nil { + return redis.Del("", cacheKey) == nil } return false } // passwordRetryCount 密码重试次数 -func (s *Account) passwordRetryCount(username string) (string, int64, time.Duration, error) { +func (s Account) passwordRetryCount(userName string) (string, int64, time.Duration, error) { // 从数据库配置获取登录次数和错误锁定时间 - maxRetryCountStr := s.sysConfigService.SelectConfigValueByKey("sys.user.maxRetryCount") - lockTimeStr := s.sysConfigService.SelectConfigValueByKey("sys.user.lockTime") - + maxRetryCountStr := s.sysConfigService.FindValueByKey("sys.user.maxRetryCount") + lockTimeStr := s.sysConfigService.FindValueByKey("sys.user.lockTime") // 验证登录次数和错误锁定时间 maxRetryCount := parse.Number(maxRetryCountStr) lockTime := parse.Number(lockTimeStr) + // 验证登录次数和错误锁定时间 + // maxRetryCount := config.Get("user.password.maxRetryCount").(int) + // lockTime := config.Get("user.password.lockTime").(int) + // 验证缓存记录次数 - retrykey := cachekey.PWD_ERR_CNT_KEY + username - retryCount, err := redis.Get("", retrykey) + retryKey := fmt.Sprintf("%s:%s", constants.CACHE_PWD_ERR_COUNT, userName) + retryCount, err := redis.Get("", retryKey) if retryCount == "" || err != nil { retryCount = "0" } // 是否超过错误值 retryCountInt64 := parse.Number(retryCount) - if retryCountInt64 >= maxRetryCount { - // 密码输入错误多次,帐户已被锁定 - errorMsg := fmt.Errorf("login.errRetryPasswd") - return retrykey, retryCountInt64, time.Duration(lockTime) * time.Minute, errorMsg + if retryCountInt64 >= int64(maxRetryCount) { + // msg := fmt.Sprintf("密码输入错误 %d 次,帐户锁定 %d 分钟", maxRetryCount, lockTime) + msg := fmt.Errorf("login.errRetryPasswd") // 密码输入错误多次,帐户已被锁定 + return retryKey, retryCountInt64, time.Duration(lockTime) * time.Minute, fmt.Errorf("%s", msg) } - return retrykey, retryCountInt64, time.Duration(lockTime) * time.Minute, nil + return retryKey, retryCountInt64, time.Duration(lockTime) * time.Minute, nil } // RoleAndMenuPerms 角色和菜单数据权限 -func (s *Account) RoleAndMenuPerms(userId string, isAdmin bool) ([]string, []string) { - if isAdmin { - return []string{adminConstants.ROLE_KEY}, []string{adminConstants.PERMISSION} - } else { - // 角色key - roleGroup := []string{} - roles := s.sysRoleService.SelectRoleListByUserId(userId) - for _, role := range roles { - roleGroup = append(roleGroup, role.RoleKey) - } - // 菜单权限key - perms := s.sysMenuService.SelectMenuPermsByUserId(userId) - return parse.RemoveDuplicates(roleGroup), parse.RemoveDuplicates(perms) +func (s Account) RoleAndMenuPerms(userId int64, isSystemUser bool) ([]string, []string) { + if isSystemUser { + return []string{constants.SYS_ROLE_SYSTEM_KEY}, []string{constants.SYS_PERMISSION_SYSTEM} } + // 角色key + var roleGroup []string + roles := s.sysRoleService.FindByUserId(userId) + for _, role := range roles { + roleGroup = append(roleGroup, role.RoleKey) + } + // 菜单权限key + perms := s.sysMenuService.FindPermsByUserId(userId) + return parse.RemoveDuplicates(roleGroup), parse.RemoveDuplicates(perms) } // RouteMenus 前端路由所需要的菜单 -func (s *Account) RouteMenus(userId string, isAdmin bool) []vo.Router { - var buildMenus []vo.Router - if isAdmin { - menus := s.sysMenuService.SelectMenuTreeByUserId("*") +func (s Account) RouteMenus(userId int64, isSystemUser bool) []systemModelVO.Router { + var buildMenus []systemModelVO.Router + if isSystemUser { + menus := s.sysMenuService.BuildTreeMenusByUserId(0) buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") } else { - menus := s.sysMenuService.SelectMenuTreeByUserId(userId) + menus := s.sysMenuService.BuildTreeMenusByUserId(userId) buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") } return buildMenus diff --git a/src/modules/common/service/commont.go b/src/modules/common/service/commont.go index c38ec17f..e9d7d101 100644 --- a/src/modules/common/service/commont.go +++ b/src/modules/common/service/commont.go @@ -5,23 +5,21 @@ import ( "be.ems/lib/global" "be.ems/src/framework/config" - "be.ems/src/framework/constants/common" + "be.ems/src/framework/constants" "be.ems/src/framework/utils/machine" systemService "be.ems/src/modules/system/service" ) // 实例化服务层 Commont 结构体 var NewCommont = &Commont{ - sysUserService: systemService.NewSysUserImpl, - sysConfigService: systemService.NewSysConfigImpl, + sysUserService: systemService.NewSysUser, + sysConfigService: systemService.NewSysConfig, } // 通用请求 服务层处理 type Commont struct { - // 用户信息服务 - sysUserService systemService.ISysUser - // 参数配置服务 - sysConfigService systemService.ISysConfig + sysUserService *systemService.SysUser // 用户信息服务 + sysConfigService *systemService.SysConfig // 参数配置服务 } // SystemConfigInfo 系统配置信息 @@ -33,13 +31,13 @@ func (s *Commont) SystemConfigInfo() map[string]string { // 系统首次使用标记 launchInfo := machine.LaunchInfo if launchInfo != nil { - if v, ok := launchInfo[common.LAUNCH_BOOTLOADER]; ok { - infoMap[common.LAUNCH_BOOTLOADER] = fmt.Sprint(v) + if v, ok := launchInfo[constants.LAUNCH_BOOTLOADER]; ok { + infoMap[constants.LAUNCH_BOOTLOADER] = fmt.Sprint(v) } else { - infoMap[common.LAUNCH_BOOTLOADER] = "true" + infoMap[constants.LAUNCH_BOOTLOADER] = "true" } } else { - infoMap[common.LAUNCH_BOOTLOADER] = "true" + infoMap[constants.LAUNCH_BOOTLOADER] = "true" } // 用户登录认证 infoMap["loginAuth"] = fmt.Sprint(config.Get("user.loginAuth")) @@ -48,36 +46,36 @@ func (s *Commont) SystemConfigInfo() map[string]string { // 序列号 infoMap["serialNum"] = fmt.Sprint(config.Get("omc.sn")) // 获取LOGO类型 - logoType := s.sysConfigService.SelectConfigValueByKey("sys.logo.type") + logoType := s.sysConfigService.FindValueByKey("sys.logo.type") infoMap["logoType"] = logoType // 获取LOGO文件 - filePathIcon := s.sysConfigService.SelectConfigValueByKey("sys.logo.filePathIcon") + filePathIcon := s.sysConfigService.FindValueByKey("sys.logo.filePathIcon") infoMap["filePathIcon"] = filePathIcon - filePathBrand := s.sysConfigService.SelectConfigValueByKey("sys.logo.filePathBrand") + filePathBrand := s.sysConfigService.FindValueByKey("sys.logo.filePathBrand") infoMap["filePathBrand"] = filePathBrand // 获取系统名称 - title := s.sysConfigService.SelectConfigValueByKey("sys.title") + title := s.sysConfigService.FindValueByKey("sys.title") infoMap["title"] = title // 获取版权声明 - copyright := s.sysConfigService.SelectConfigValueByKey("sys.copyright") + copyright := s.sysConfigService.FindValueByKey("sys.copyright") infoMap["copyright"] = copyright // 获取是否开启用户注册功能 - registerUser := s.sysConfigService.SelectConfigValueByKey("sys.account.registerUser") + registerUser := s.sysConfigService.FindValueByKey("sys.account.registerUser") infoMap["registerUser"] = registerUser // 获取登录界面背景 - loginBackground := s.sysConfigService.SelectConfigValueByKey("sys.loginBackground") + loginBackground := s.sysConfigService.FindValueByKey("sys.loginBackground") infoMap["loginBackground"] = loginBackground // 系统设置-官网网址 - officialUrl := s.sysConfigService.SelectConfigValueByKey("sys.officialUrl") + officialUrl := s.sysConfigService.FindValueByKey("sys.officialUrl") infoMap["officialUrl"] = officialUrl // 系统设置-系统使用文档 - helpDoc := s.sysConfigService.SelectConfigValueByKey("sys.helpDoc") + helpDoc := s.sysConfigService.FindValueByKey("sys.helpDoc") infoMap["helpDoc"] = helpDoc // 国际化切换 - i18nOpen := s.sysConfigService.SelectConfigValueByKey("sys.i18n.open") + i18nOpen := s.sysConfigService.FindValueByKey("sys.i18n.open") infoMap["i18nOpen"] = i18nOpen // 国际化默认语言 - i18nDefault := s.sysConfigService.SelectConfigValueByKey("sys.i18n.default") + i18nDefault := s.sysConfigService.FindValueByKey("sys.i18n.default") infoMap["i18nDefault"] = i18nDefault return infoMap } diff --git a/src/modules/common/service/register.go b/src/modules/common/service/register.go index dc986835..7cea853a 100644 --- a/src/modules/common/service/register.go +++ b/src/modules/common/service/register.go @@ -1,10 +1,92 @@ package service -// 账号注册操作处理 服务层接口 -type IRegister interface { - // ValidateCaptcha 校验验证码 - ValidateCaptcha(code, uuid string) error +import ( + "fmt" - // ByUserName 账号注册 - ByUserName(username, password, userType string) (string, error) + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" + "be.ems/src/framework/utils/parse" + systemModel "be.ems/src/modules/system/model" + systemService "be.ems/src/modules/system/service" +) + +// 实例化服务层 Register 结构体 +var NewRegister = &Register{ + sysUserService: systemService.NewSysUser, + sysConfigService: systemService.NewSysConfig, +} + +// 账号注册操作处理 服务层处理 +type Register struct { + sysUserService *systemService.SysUser // 用户信息服务 + sysConfigService *systemService.SysConfig // 参数配置服务 +} + +// ValidateCaptcha 校验验证码 +func (s Register) ValidateCaptcha(code, uuid string) error { + // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 + captchaEnabledStr := s.sysConfigService.FindValueByKey("sys.account.captchaEnabled") + if !parse.Boolean(captchaEnabledStr) { + return nil + } + if code == "" || uuid == "" { + return fmt.Errorf("verification code information error") + } + verifyKey := constants.CACHE_CAPTCHA_CODE + ":" + uuid + captcha, err := redis.Get("", verifyKey) + if err != nil { + return fmt.Errorf("the verification code has expired") + } + redis.Del("", verifyKey) + if captcha != code { + return fmt.Errorf("verification code error") + } + return nil +} + +// ByUserName 账号注册 +func (s Register) ByUserName(username, password string) (int64, error) { + // 是否开启用户注册功能 true开启,false关闭 + registerUserStr := s.sysConfigService.FindValueByKey("sys.account.registerUser") + captchaEnabled := parse.Boolean(registerUserStr) + if !captchaEnabled { + return 0, fmt.Errorf("failed to register user [%s]. Sorry, the system has closed the external user registration channel", username) + } + + // 检查用户登录账号是否唯一 + uniqueUserName := s.sysUserService.CheckUniqueByUserName(username, 0) + if !uniqueUserName { + return 0, fmt.Errorf("failed to register user [%s], registered account already exists", username) + } + + sysUser := systemModel.SysUser{ + UserName: username, + NickName: username, // 昵称使用名称账号 + Password: password, // 原始密码 + Sex: "0", // 性别未选择 + StatusFlag: constants.STATUS_YES, // 账号状态激活 + DeptId: 100, // 归属部门为根节点 + CreateBy: "register", // 创建来源 + } + + // 新增用户的角色管理 + sysUser.RoleIds = s.registerRoleInit() + // 新增用户的岗位管理 + sysUser.PostIds = s.registerPostInit() + + insertId := s.sysUserService.Insert(sysUser) + if insertId > 0 { + return insertId, nil + } + return 0, fmt.Errorf("failed to register user [%s]. Please contact the system administrator", username) +} + +// registerRoleInit 注册初始角色 +func (s Register) registerRoleInit() []int64 { + return []int64{} +} + +// registerPostInit 注册初始岗位 +func (s Register) registerPostInit() []int64 { + return []int64{} } diff --git a/src/modules/common/service/register.impl.go b/src/modules/common/service/register.impl.go deleted file mode 100644 index 5f43d0ac..00000000 --- a/src/modules/common/service/register.impl.go +++ /dev/null @@ -1,106 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/constants/common" - "be.ems/src/framework/redis" - "be.ems/src/framework/utils/parse" - systemModel "be.ems/src/modules/system/model" - systemService "be.ems/src/modules/system/service" -) - -// 实例化服务层 RegisterImpl 结构体 -var NewRegisterImpl = &RegisterImpl{ - sysUserService: systemService.NewSysUserImpl, - sysConfigService: systemService.NewSysConfigImpl, - sysRoleService: systemService.NewSysRoleImpl, -} - -// 账号注册操作处理 服务层处理 -type RegisterImpl struct { - // 用户信息服务 - sysUserService systemService.ISysUser - // 参数配置服务 - sysConfigService systemService.ISysConfig - // 角色服务 - sysRoleService systemService.ISysRole -} - -// ValidateCaptcha 校验验证码 -func (s *RegisterImpl) ValidateCaptcha(code, uuid string) error { - // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 - captchaEnabledStr := s.sysConfigService.SelectConfigValueByKey("sys.account.captchaEnabled") - if !parse.Boolean(captchaEnabledStr) { - return nil - } - if code == "" || uuid == "" { - return fmt.Errorf("verification code information error") - } - verifyKey := cachekey.CAPTCHA_CODE_KEY + uuid - captcha, err := redis.Get("", verifyKey) - if err != nil { - return fmt.Errorf("the verification code has expired") - } - redis.Del("", verifyKey) - if captcha != code { - return fmt.Errorf("verification code error") - } - return nil -} - -// ByUserName 账号注册 -func (s *RegisterImpl) ByUserName(username, password, userType string) (string, error) { - // 是否开启用户注册功能 true开启,false关闭 - registerUserStr := s.sysConfigService.SelectConfigValueByKey("sys.account.registerUser") - captchaEnabled := parse.Boolean(registerUserStr) - if !captchaEnabled { - return "", fmt.Errorf("failed to register user [%s]. Sorry, the system has closed the external user registration channel", username) - } - - // 检查用户登录账号是否唯一 - uniqueUserName := s.sysUserService.CheckUniqueUserName(username, "") - if !uniqueUserName { - return "", fmt.Errorf("failed to register user [%s], registered account already exists", username) - } - - sysUser := systemModel.SysUser{ - UserName: username, - NickName: username, // 昵称使用名称账号 - Password: password, // 原始密码 - Status: common.STATUS_YES, // 账号状态激活 - DeptID: "100", // 归属部门为根节点 - CreateBy: "register", // 创建来源 - } - // 标记用户类型 - if userType == "" { - sysUser.UserType = "sys" - } - // 新增用户的角色管理 - sysUser.RoleIDs = s.registerRoleInit(userType) - // 新增用户的岗位管理 - sysUser.PostIDs = s.registerPostInit(userType) - - insertId := s.sysUserService.InsertUser(sysUser) - if insertId != "" { - return insertId, nil - } - return "", fmt.Errorf("failed to register user [%s]. Please contact the system administrator", username) -} - -// registerRoleInit 注册初始角色 -func (s *RegisterImpl) registerRoleInit(userType string) []string { - if userType == "sys" { - return []string{} - } - return []string{} -} - -// registerPostInit 注册初始岗位 -func (s *RegisterImpl) registerPostInit(userType string) []string { - if userType == "sys" { - return []string{} - } - return []string{} -} diff --git a/src/modules/crontask/processor/backupEtcFromNE/backupEtcFromNE.go b/src/modules/crontask/processor/backupEtcFromNE/backupEtcFromNE.go index bc889b90..5cb1ca0c 100644 --- a/src/modules/crontask/processor/backupEtcFromNE/backupEtcFromNE.go +++ b/src/modules/crontask/processor/backupEtcFromNE/backupEtcFromNE.go @@ -46,7 +46,7 @@ func (s *BarProcessor) Execute(data any) (any, error) { // return nil, err // } - log.Infof("Repeat %v Job ID %s", options.Repeat, sysJob.JobID) + log.Infof("Repeat %v Job ID %d", options.Repeat, sysJob.JobId) var nes []dborm.NeInfo _, err := dborm.XormGetAllNeInfo(&nes) diff --git a/src/modules/crontask/processor/delExpiredNeBackup/delExpiredNeBackup.go b/src/modules/crontask/processor/delExpiredNeBackup/delExpiredNeBackup.go index c4b9c552..86d2ea7a 100644 --- a/src/modules/crontask/processor/delExpiredNeBackup/delExpiredNeBackup.go +++ b/src/modules/crontask/processor/delExpiredNeBackup/delExpiredNeBackup.go @@ -39,7 +39,7 @@ func (s *BarProcessor) Execute(data any) (any, error) { if err == nil { duration = params.Duration } - log.Infof("重复 %v 任务ID %s", options.Repeat, sysJob.JobID) + log.Infof("重复 %v 任务ID %d", options.Repeat, sysJob.JobId) // // 实现任务处理逻辑 // i := 0 diff --git a/src/modules/crontask/processor/deleteExpiredRecord/deleteExpiredRecord.go b/src/modules/crontask/processor/deleteExpiredRecord/deleteExpiredRecord.go index e9cd27ac..8ffaccb8 100644 --- a/src/modules/crontask/processor/deleteExpiredRecord/deleteExpiredRecord.go +++ b/src/modules/crontask/processor/deleteExpiredRecord/deleteExpiredRecord.go @@ -44,7 +44,7 @@ func (s *BarProcessor) Execute(data any) (any, error) { } //duration = params.Duration - log.Infof("重复 %v 任务ID %s", options.Repeat, sysJob.JobID) + log.Infof("重复 %v 任务ID %d", options.Repeat, sysJob.JobId) // // 实现任务处理逻辑 // i := 0 diff --git a/src/modules/crontask/processor/exportTable/exportTable.go b/src/modules/crontask/processor/exportTable/exportTable.go index 9f407c61..0085e3bc 100644 --- a/src/modules/crontask/processor/exportTable/exportTable.go +++ b/src/modules/crontask/processor/exportTable/exportTable.go @@ -15,10 +15,9 @@ import ( "be.ems/src/framework/config" "be.ems/src/framework/cron" "be.ems/src/framework/logger" + "be.ems/src/framework/ssh" "be.ems/src/framework/utils/crypto" - "be.ems/src/framework/utils/ssh" systemService "be.ems/src/modules/system/service" - "github.com/jlaffaye/ftp" ) var NewProcessor = &BarProcessor{ @@ -177,11 +176,11 @@ func (s BarProcessor) putFTP(filePath, fileName string) { Username string `json:"username" binding:"required"` ToIp string `json:"toIp" binding:"required"` ToPort int64 `json:"toPort" binding:"required"` - Protocol string `json:"protocol" binding:"required,oneof=ssh ftp"` + Enable bool `json:"enable"` Dir string `json:"dir" binding:"required"` } - cfg := systemService.NewSysConfigImpl.SelectConfigByKey("sys.exportTable") - if cfg.ConfigID != "" { + cfg := systemService.NewSysConfig.FindByKey("sys.exportTable") + if cfg.ConfigId > 0 { // 解密body appKey := config.Get("aes.appKey").(string) bodyDe, err := crypto.AESDecryptBase64(cfg.ConfigValue, appKey) @@ -195,68 +194,37 @@ func (s BarProcessor) putFTP(filePath, fileName string) { return } } + if !cfgData.Enable { + return + } localFilePath := filepath.Join(filePath, fileName) - if cfgData.Protocol == "ssh" { - connSSH := ssh.ConnSSH{ - User: cfgData.Username, - Password: cfgData.Password, - Addr: cfgData.ToIp, - Port: cfgData.ToPort, - AuthMode: "0", - } - sshClient, err := connSSH.NewClient() - if err != nil { - logger.Errorf("putFTP ssh error: %v", err) - return - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - logger.Errorf("putFTP sftp error: %v", err) - return - } - defer sftpClient.Close() - // 远程文件 - remotePath := filepath.Join(cfgData.Dir, path.Base(filePath), fileName) - // 复制到远程 - if err = sftpClient.CopyFileLocalToRemote(localFilePath, remotePath); err != nil { - logger.Errorf("putFTP uploading error: %v", err) - return - } + connSSH := ssh.ConnSSH{ + User: cfgData.Username, + Password: cfgData.Password, + Addr: cfgData.ToIp, + Port: cfgData.ToPort, + AuthMode: "0", } - - if cfgData.Protocol == "ftp" { - // 连接到 FTP 服务器 - addr := fmt.Sprintf("%s:%d", cfgData.ToIp, cfgData.ToPort) - ftpComm, err := ftp.Dial(addr, ftp.DialWithTimeout(15*time.Second)) - if err != nil { - logger.Errorf("putFTP ftp error: %v", err) - return - } - // 登录到 FTP 服务器 - err = ftpComm.Login(cfgData.Username, cfgData.Password) - if err != nil { - logger.Errorf("putFTP login error: %v", err) - return - } - defer ftpComm.Quit() - // 打开本地文件 - file, err := os.Open(localFilePath) - if err != nil { - logger.Errorf("putFTP open error: %v", err) - return - } - defer file.Close() - // 远程文件 - remotePath := filepath.Join(cfgData.Dir, path.Base(filePath), fileName) - // 上传文件到 FTP 服务器 - err = ftpComm.Stor(remotePath, file) - if err != nil { - logger.Errorf("putFTP uploading error: %v", err) - return - } + sshClient, err := connSSH.NewClient() + if err != nil { + logger.Errorf("putFTP ssh error: %v", err) + return + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + logger.Errorf("putFTP sftp error: %v", err) + return + } + defer sftpClient.Close() + // 远程文件 + remotePath := filepath.Join(cfgData.Dir, path.Base(filePath), fileName) + // 复制到远程 + if err = sftpClient.CopyFileLocalToRemote(localFilePath, remotePath); err != nil { + logger.Errorf("putFTP uploading error: %v", err) + return } } diff --git a/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go b/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go index c24bcd94..780b5c4f 100644 --- a/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go +++ b/src/modules/crontask/processor/genNeStateAlarm/genNeStateAlarm.go @@ -10,20 +10,27 @@ import ( "be.ems/features/fm" "be.ems/lib/config" - "be.ems/lib/dborm" "be.ems/lib/global" "be.ems/lib/log" "be.ems/src/framework/cron" + "be.ems/src/framework/database/db" + "be.ems/src/framework/utils/date" + neDataModel "be.ems/src/modules/network_data/model" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" + "github.com/go-resty/resty/v2" ) var NewProcessor = &BarProcessor{ - progress: 0, - count: 0, + neInfoService: neService.NewNeInfo, + progress: 0, + count: 0, } // bar 队列任务处理 type BarProcessor struct { + neInfoService *neService.NeInfo // 网元信息服务 // 任务进度 progress int // 执行次数 @@ -31,7 +38,7 @@ type BarProcessor struct { } type BarParams struct { AlarmID string `json:"alarmID"` - AlarmCode int `json:"alarmCode"` + AlarmCode int64 `json:"alarmCode"` AlarmTitle string `json:"alarmTitle"` AlarmType string `json:"alarmType"` OrigSeverity string `json:"origSeverity"` @@ -44,38 +51,6 @@ type BarParams struct { Threshold int64 `json:"threshold"` } -// type BarParams struct { -// Duration int `json:"duration"` -// } - -type Alarm struct { - Id int `json:"-" xorm:"pk 'id' autoincr"` - AlarmSeq int `json:"alarmSeq"` - AlarmId string `json:"alarmId" xorm:"alarm_id"` - NeId string `json:"neId"` - AlarmCode int `json:"alarmCode"` - AlarmTitle string `json:"alarmTitle"` - EventTime string `json:"eventTime"` - AlarmType string `json:"alarmType"` - OrigSeverity string `json:"origSeverity"` - PerceivedSeverity string `json:"perceivedSeverity"` - PVFlag string `json:"pvFlag" xorm:"pv_flag"` - NeName string `json:"neName"` - NeType string `json:"neType"` - ObjectUid string `json:"objectUid" xorm:"object_uid"` - ObjectName string `json:"objectName" xorm:"object_name"` - ObjectType string `json:"objectType" xorm:"object_type"` - LocationInfo string `json:"locationInfo"` - Province string `json:"province"` - AlarmStatus int `json:"alarmStatus" xorm:"alarm_status"` - SpecificProblem string `json:"specificProblem"` - SpecificProblemID string `json:"specificProblemID" xorm:"specific_problem_id"` - AddInfo string `json:"addInfo"` - - // ClearType int `json:"-" xorm:"clear_type"` // 0: Unclear, 1: Auto clear, 2: Manual clear - // ClearTime sql.NullTime `json:"-" xorm:"clear_time"` -} - var client = resty.New() func init() { @@ -97,29 +72,23 @@ func (s *BarProcessor) Execute(data any) (any, error) { return nil, err } - var nes []dborm.NeInfo - _, err = dborm.XormGetAllNeInfo(&nes) - if err != nil { - log.Error("Failed to get all ne info:", err) - return nil, err - } - succActiveAlarmNum := 0 failActiveAlarmNum := 0 succClearAlarmNum := 0 failClearAlarmNum := 0 - for _, ne := range nes { + neList := s.neInfoService.Find(neModel.NeInfo{}, false, false) + for _, neInfo := range neList { //log.Debug("ne:", ne) - sql := fmt.Sprintf("select * from ne_state where ne_type='%s' and ne_id='%s' order by `timestamp` desc limit 1", ne.NeType, ne.NeId) + sql := fmt.Sprintf("select * from ne_state where ne_type='%s' and ne_id='%s' order by `timestamp` desc limit 1", neInfo.NeType, neInfo.NeId) log.Debug("SQL:", sql) - neState, err := dborm.XormGetDataBySQL(sql) + neState, err := db.RawDB("", sql, nil) if err != nil { log.Error("Failed to get ne_state:", err) continue } - if len(*neState) == 0 { + if len(neState) == 0 { log.Warn("Not found record in ne_state:") //continue } @@ -139,8 +108,8 @@ func (s *BarProcessor) Execute(data any) (any, error) { // log.Debug("alarmDefine:", alarmDefine) sql = fmt.Sprintf("select * from alarm where alarm_id = '%s' and ne_type='%s' and ne_id = '%s' order by event_time desc limit 1", - alarmDefine.AlarmID, ne.NeType, ne.RmUID) - alarm, err := dborm.XormGetDataBySQL(sql) + alarmDefine.AlarmID, neInfo.NeType, neInfo.RmUID) + alarm, err := db.RawDB("", sql, nil) if err != nil { log.Error("Failed to get alarm:", err) continue @@ -148,11 +117,11 @@ func (s *BarProcessor) Execute(data any) (any, error) { //log.Debug("alarm:", *alarm) var timestamp string - if len(*neState) == 0 { - log.Infof("Not found ne_state neType:%s, neId:%s", ne.NeType, ne.NeId) - timestamp = ne.UpdateTime.Format(time.DateTime) + if len(neState) == 0 { + log.Infof("Not found ne_state neType:%s, neId:%s", neInfo.NeType, neInfo.NeId) + timestamp = date.ParseDateToStr(neInfo.UpdateTime, date.YYYYMMDDHHMMSS) } else { - timestamp = (*neState)[0]["timestamp"] + timestamp = fmt.Sprint(neState[0]["timestamp"]) } // 解析日期时间字符串为时间对象 @@ -164,44 +133,44 @@ func (s *BarProcessor) Execute(data any) (any, error) { log.Debugf("timestamp:%s seconds:%d", timestamp, seconds) if seconds <= alarmDefine.Threshold { - if len(*alarm) == 0 || (*alarm)[0]["alarm_status"] == fm.AlarmStatusClearString { + if len(alarm) == 0 || alarm[0]["alarm_status"] == fm.AlarmStatusClearString { continue } // clear alarm, todo - var alarmSeq int = 1 + var alarmSeq int64 = 1 threshold := strconv.FormatInt(alarmDefine.Threshold, 10) SpecificProblem := strings.ReplaceAll(alarmDefine.SpecificProblem, "{threshold}", threshold) locationInfo := fmt.Sprintf("SystemManagement.State: NE heartbeat timestamp=%s,threshold=%v", timestamp, alarmDefine.Threshold) - alarmData := &Alarm{ + alarmData := &neDataModel.Alarm{ AlarmSeq: alarmSeq, AlarmId: alarmDefine.AlarmID, - NeId: ne.RmUID, - NeType: ne.NeType, - NeName: ne.NeName, - Province: ne.Province, - PVFlag: ne.PvFlag, + NeId: neInfo.RmUID, + NeType: neInfo.NeType, + NeName: neInfo.NeName, + Province: neInfo.Province, + PvFlag: neInfo.PvFlag, AlarmCode: alarmDefine.AlarmCode, AlarmTitle: alarmDefine.AlarmTitle, AlarmType: alarmDefine.AlarmType, - AlarmStatus: fm.AlarmStatusClear, + AlarmStatus: "0", OrigSeverity: alarmDefine.OrigSeverity, ObjectUid: alarmDefine.ObjectUID, ObjectName: alarmDefine.ObjectName, ObjectType: alarmDefine.ObjectType, LocationInfo: locationInfo, SpecificProblem: SpecificProblem, - SpecificProblemID: alarmDefine.SpecificProblemID, + SpecificProblemId: alarmDefine.SpecificProblemID, AddInfo: alarmDefine.AddInfo, - EventTime: time.Now().Local().Format(time.RFC3339), + EventTime: time.Now().UnixMilli(), } - alarmArray := &[]Alarm{*alarmData} + alarmArray := &[]neDataModel.Alarm{*alarmData} body, _ := json.Marshal(alarmArray) //log.Debug("body: ", string(body)) var response *resty.Response - requestURI := fmt.Sprintf("/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", ne.NeType) + requestURI := fmt.Sprintf("/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", neInfo.NeType) //restHost := fmt.Sprintf("http://127.0.0.1:%d", config.GetYamlConfig().Rest[0].Port) restHost := config.GetOMCHostUrl() requestURL := fmt.Sprintf("%s%s", restHost, requestURI) @@ -233,8 +202,8 @@ func (s *BarProcessor) Execute(data any) (any, error) { failClearAlarmNum++ } } else { - var alarmSeq int = 1 - if len(*alarm) > 0 && (*alarm)[0]["alarm_status"] == fm.AlarmStatusActiveString { + var alarmSeq int64 = 1 + if len(alarm) > 0 && alarm[0]["alarm_status"] == fm.AlarmStatusActiveString { log.Info("System state alarm has exist") continue } @@ -242,35 +211,35 @@ func (s *BarProcessor) Execute(data any) (any, error) { threshold := strconv.FormatInt(alarmDefine.Threshold, 10) SpecificProblem := strings.ReplaceAll(alarmDefine.SpecificProblem, "{threshold}", threshold) locationInfo := fmt.Sprintf("SystemManagement.State: NE heartbeat timestamp=%s,threshold=%v", timestamp, alarmDefine.Threshold) - alarmData := &Alarm{ + alarmData := &neDataModel.Alarm{ AlarmSeq: alarmSeq, AlarmId: alarmDefine.AlarmID, - NeId: ne.RmUID, - NeType: ne.NeType, - NeName: ne.NeName, - Province: ne.Province, - PVFlag: ne.PvFlag, + NeId: neInfo.RmUID, + NeType: neInfo.NeType, + NeName: neInfo.NeName, + Province: neInfo.Province, + PvFlag: neInfo.PvFlag, AlarmCode: alarmDefine.AlarmCode, AlarmTitle: alarmDefine.AlarmTitle, AlarmType: alarmDefine.AlarmType, - AlarmStatus: fm.AlarmStatusActive, + AlarmStatus: "1", OrigSeverity: alarmDefine.OrigSeverity, ObjectUid: alarmDefine.ObjectUID, ObjectName: alarmDefine.ObjectName, ObjectType: alarmDefine.ObjectType, LocationInfo: locationInfo, SpecificProblem: SpecificProblem, - SpecificProblemID: alarmDefine.SpecificProblemID, + SpecificProblemId: alarmDefine.SpecificProblemID, AddInfo: alarmDefine.AddInfo, - EventTime: time.Now().Local().Format(time.RFC3339), + EventTime: time.Now().UnixMilli(), } - alarmArray := &[]Alarm{*alarmData} + alarmArray := &[]neDataModel.Alarm{*alarmData} body, _ := json.Marshal(alarmArray) //log.Debug("body: ", string(body)) var response *resty.Response - requestURI := fmt.Sprintf("/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", ne.NeType) + requestURI := fmt.Sprintf("/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", neInfo.NeType) //restHost := fmt.Sprintf("http://127.0.0.1:%d", config.GetYamlConfig().Rest[0].Port) restHost := config.GetOMCHostUrl() requestURL := fmt.Sprintf("%s%s", restHost, requestURI) diff --git a/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go b/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go index 401d0233..33a7845e 100644 --- a/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go +++ b/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go @@ -29,7 +29,7 @@ func (s *MonitorSysResourceProcessor) Execute(data any) (any, error) { s.count++ // 执行次数加一 options := data.(cron.JobData) sysJob := options.SysJob - logger.Infof("重复 %v 任务ID %s", options.Repeat, sysJob.JobID) + logger.Infof("重复 %v 任务ID %d", options.Repeat, sysJob.JobId) // 读取参数值 var params struct { diff --git a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go index bb36135c..4d4371da 100644 --- a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go +++ b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go @@ -27,17 +27,17 @@ func (s *NeConfigBackupProcessor) Execute(data any) (any, error) { s.count++ // 执行次数加一 options := data.(cron.JobData) sysJob := options.SysJob - logger.Infof("重复 %v 任务ID %s", options.Repeat, sysJob.JobID) + logger.Infof("重复 %v 任务ID %d", options.Repeat, sysJob.JobId) // 返回结果,用于记录执行结果 result := map[string]any{ "count": s.count, } - neList := s.neInfoService.SelectList(neModel.NeInfo{}, false, false) + neList := s.neInfoService.Find(neModel.NeInfo{}, false, false) for _, neInfo := range neList { neTypeAndId := fmt.Sprintf("%s_%s", neInfo.NeType, neInfo.NeId) // 将网元文件备份到本地 - zipFilePath, err := s.neConfigBackupService.NeConfigNeToLocal(neInfo) + zipFilePath, err := s.neConfigBackupService.FileNeToLocal(neInfo) if err != nil { result[neTypeAndId] = err.Error() continue diff --git a/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go b/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go index ae583ae9..a53ea560 100644 --- a/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go +++ b/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go @@ -29,13 +29,13 @@ func (s *NeDataUDM) Execute(data any) (any, error) { s.count++ // 执行次数加一 options := data.(cron.JobData) sysJob := options.SysJob - logger.Infof("重复 %v 任务ID %s", options.Repeat, sysJob.JobID) + logger.Infof("重复 %v 任务ID %d", options.Repeat, sysJob.JobId) // 返回结果,用于记录执行结果 result := map[string]any{ "count": s.count, } - neList := s.neInfoService.SelectList(neModel.NeInfo{NeType: "UDM"}, false, false) + neList := s.neInfoService.Find(neModel.NeInfo{NeType: "UDM"}, false, false) for _, neInfo := range neList { result[fmt.Sprintf("AuthNumber_%s", neInfo.NeId)] = s.udmAuthService.ResetData(neInfo.NeId) result[fmt.Sprintf("SubNumber_%s", neInfo.NeId)] = s.udmSubService.ResetData(neInfo.NeId) diff --git a/src/modules/monitor/controller/monitor.go b/src/modules/monitor/controller/monitor.go index bc18a66a..a4653995 100644 --- a/src/modules/monitor/controller/monitor.go +++ b/src/modules/monitor/controller/monitor.go @@ -1,9 +1,9 @@ package controller import ( - "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "fmt" + + "be.ems/src/framework/resp" "be.ems/src/modules/monitor/service" "github.com/gin-gonic/gin" @@ -29,39 +29,39 @@ type MonitorController struct { // @Accept json // @Produce json // @Param type query string true "Data Type" Enums(all,load,cpu,memory,io,network) default(all) -// @Param startTime query number true "StartTime, timestamp milliseconds" default(1738771200000) +// @Param beginTime query number true "BeginTime, timestamp milliseconds" default(1738771200000) // @Param endTime query number true "EndTime, timestamp milliseconds" default(1738810051253) // @Param neType query string false "NE Type, Currently none Default #" default(#) // @Param neId query string false "NE ID, Currently none Default #" default(#) // @Param name query string false "Name, Data Type valid for networ and io" // @Success 200 {object} object "Response Results" // @Security TokenAuth -// @Summary Resource monitoring information loading -// @Description Resource monitoring information loading +// @Summary Load Resource Utilization Information +// @Description Load Resource Utilization Information // @Router /monitor/load [get] func (s *MonitorController) Load(c *gin.Context) { - language := ctx.AcceptLanguage(c) var querys struct { Type string `form:"type" binding:"required,oneof=all load cpu memory io network"` // 数据类型all/load/cpu/memory/io/network - StartTime int64 `form:"startTime" binding:"required"` // 开始时间 + BeginTime int64 `form:"beginTime" binding:"required"` // 开始时间 EndTime int64 `form:"endTime" binding:"required"` // 结束时间 NeType string `form:"neType"` // 网元类型 NeID string `form:"neId"` // 网元ID Name string `form:"name"` // 名称,networ和io时有效 } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询数据 - data := s.monitorService.SelectMonitorInfo(map[string]any{ + data := s.monitorService.FindInfo(map[string]any{ "type": querys.Type, - "startTime": querys.StartTime, + "beginTime": querys.BeginTime, "endTime": querys.EndTime, "neType": querys.NeType, "neId": querys.NeID, "name": querys.Name, }) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } diff --git a/src/modules/monitor/controller/sys_cache.go b/src/modules/monitor/controller/sys_cache.go index 06c4c897..e7ca18ba 100644 --- a/src/modules/monitor/controller/sys_cache.go +++ b/src/modules/monitor/controller/sys_cache.go @@ -1,11 +1,13 @@ package controller import ( - "be.ems/src/framework/constants/cachekey" + "fmt" + + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" "be.ems/src/framework/i18n" - "be.ems/src/framework/redis" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/modules/monitor/model" "github.com/gin-gonic/gin" @@ -32,138 +34,148 @@ type SysCacheController struct{} // @Description Cache Service Information // @Router /monitor/cache [get] func (s *SysCacheController) Info(c *gin.Context) { - c.JSON(200, result.OkData(map[string]any{ + c.JSON(200, resp.OkData(map[string]any{ "info": redis.Info(""), "dbSize": redis.KeySize(""), "commandStats": redis.CommandStats(""), })) } -// 缓存名称列表 +// Names 缓存名称列表 // -// GET /getNames -func (s *SysCacheController) Names(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// GET /names +func (s SysCacheController) Names(c *gin.Context) { + language := reqctx.AcceptLanguage(c) caches := []model.SysCache{ - model.NewSysCacheNames(i18n.TKey(language, "cache.name.user"), cachekey.LOGIN_TOKEN_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.sys_config"), cachekey.SYS_CONFIG_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.sys_dict"), cachekey.SYS_DICT_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.captcha_codes"), cachekey.CAPTCHA_CODE_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.repeat_submit"), cachekey.REPEAT_SUBMIT_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.rate_limit"), cachekey.RATE_LIMIT_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.pwd_err_cnt"), cachekey.PWD_ERR_CNT_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.ne_info"), cachekey.NE_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.ne_data"), cachekey.NE_DATA_KEY), + model.NewNames(i18n.TKey(language, "cache.name.user"), constants.CACHE_LOGIN_TOKEN), + model.NewNames(i18n.TKey(language, "cache.name.sys_config"), constants.CACHE_SYS_CONFIG), + model.NewNames(i18n.TKey(language, "cache.name.sys_dict"), constants.CACHE_SYS_DICT), + model.NewNames(i18n.TKey(language, "cache.name.captcha_codes"), constants.CACHE_CAPTCHA_CODE), + model.NewNames(i18n.TKey(language, "cache.name.repeat_submit"), constants.CACHE_REPEAT_SUBMIT), + model.NewNames(i18n.TKey(language, "cache.name.rate_limit"), constants.CACHE_RATE_LIMIT), + model.NewNames(i18n.TKey(language, "cache.name.pwd_err_cnt"), constants.CACHE_PWD_ERR_COUNT), + model.NewNames(i18n.TKey(language, "cache.name.ne_info"), constants.CACHE_NE_INFO), + model.NewNames(i18n.TKey(language, "cache.name.ne_data"), constants.CACHE_NE_DATA), } - c.JSON(200, result.OkData(caches)) + c.JSON(200, resp.OkData(caches)) } -// 缓存名称下键名列表 +// Keys 缓存名称下键名列表 // -// GET /getKeys/:cacheName -func (s *SysCacheController) Keys(c *gin.Context) { - language := ctx.AcceptLanguage(c) - cacheName := c.Param("cacheName") - if cacheName == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// GET /keys?cacheName=xxx +func (s SysCacheController) Keys(c *gin.Context) { + var query struct { + CacheName string `form:"cacheName" binding:"required"` // 键名列表中得到的缓存名称 + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } + caches := []model.SysCache{} - - // 遍历组装 - cacheKeys, _ := redis.GetKeys("", cacheName+":*") + cacheKeys, _ := redis.GetKeys("", query.CacheName+":*") for _, key := range cacheKeys { - caches = append(caches, model.NewSysCacheKeys(cacheName, key)) + caches = append(caches, model.NewKeys(query.CacheName, key)) } - c.JSON(200, result.OkData(caches)) + c.JSON(200, resp.OkData(caches)) } -// 缓存内容 +// Value 缓存内容信息 // -// GET /getValue/:cacheName/:cacheKey -func (s *SysCacheController) Value(c *gin.Context) { - language := ctx.AcceptLanguage(c) - cacheName := c.Param("cacheName") - cacheKey := c.Param("cacheKey") - if cacheName == "" || cacheKey == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// GET /value?cacheName=xxx&cacheKey=xxx +func (s SysCacheController) Value(c *gin.Context) { + var query struct { + CacheName string `form:"cacheName" binding:"required"` // 键名列表中得到的缓存名称 + CacheKey string `form:"cacheKey" binding:"required"` // 键名列表中得到的缓存键名 + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - cacheValue, err := redis.Get("", cacheName+":"+cacheKey) + cacheValue, err := redis.Get("", query.CacheName+":"+query.CacheKey) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - sysCache := model.NewSysCacheValue(cacheName, cacheKey, cacheValue) - c.JSON(200, result.OkData(sysCache)) + sysCache := model.NewValue(query.CacheName, query.CacheKey, cacheValue) + c.JSON(200, resp.OkData(sysCache)) } -// 删除缓存名称下键名列表 +// CleanNames 缓存名称列表安全删除 // -// DELETE /clearCacheName/:cacheName -func (s *SysCacheController) ClearCacheName(c *gin.Context) { - language := ctx.AcceptLanguage(c) - cacheName := c.Param("cacheName") - if cacheName == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - cacheKeys, err := redis.GetKeys("", cacheName+":*") - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) - return - } - ok, _ := redis.DelKeys("", cacheKeys) - if ok { - c.JSON(200, result.Ok(nil)) - return - } - c.JSON(200, result.Err(nil)) -} - -// 删除缓存键名 -// -// DELETE /clearCacheKey/:cacheName/:cacheKey -func (s *SysCacheController) ClearCacheKey(c *gin.Context) { - language := ctx.AcceptLanguage(c) - cacheName := c.Param("cacheName") - cacheKey := c.Param("cacheKey") - if cacheName == "" || cacheKey == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - ok, _ := redis.Del("", cacheName+":"+cacheKey) - if ok { - c.JSON(200, result.Ok(nil)) - return - } - c.JSON(200, result.Err(nil)) -} - -// 安全清理缓存名称 -// -// DELETE /clearCacheSafe -func (s *SysCacheController) ClearCacheSafe(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// DELETE /names +func (s SysCacheController) CleanNames(c *gin.Context) { + language := reqctx.AcceptLanguage(c) caches := []model.SysCache{ - model.NewSysCacheNames(i18n.TKey(language, "cache.name.sys_config"), cachekey.SYS_CONFIG_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.sys_dict"), cachekey.SYS_DICT_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.repeat_submit"), cachekey.REPEAT_SUBMIT_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.rate_limit"), cachekey.RATE_LIMIT_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.pwd_err_cnt"), cachekey.PWD_ERR_CNT_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.ne_info"), cachekey.NE_KEY), - model.NewSysCacheNames(i18n.TKey(language, "cache.name.ne_data"), cachekey.NE_DATA_KEY), + model.NewNames(i18n.TKey(language, "cache.name.sys_config"), constants.CACHE_SYS_CONFIG), + model.NewNames(i18n.TKey(language, "cache.name.sys_dict"), constants.CACHE_SYS_DICT), + model.NewNames(i18n.TKey(language, "cache.name.repeat_submit"), constants.CACHE_REPEAT_SUBMIT), + model.NewNames(i18n.TKey(language, "cache.name.rate_limit"), constants.CACHE_RATE_LIMIT), + model.NewNames(i18n.TKey(language, "cache.name.pwd_err_cnt"), constants.CACHE_PWD_ERR_COUNT), + model.NewNames(i18n.TKey(language, "cache.name.ne_info"), constants.CACHE_NE_INFO), + model.NewNames(i18n.TKey(language, "cache.name.ne_data"), constants.CACHE_NE_DATA), } for _, v := range caches { cacheKeys, err := redis.GetKeys("", v.CacheName+":*") if err != nil { continue } - redis.DelKeys("", cacheKeys) + _ = redis.DelKeys("", cacheKeys) } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) +} + +// CleanKeys 缓存名称下键名删除 +// +// DELETE /keys?cacheName=xxx +func (s SysCacheController) CleanKeys(c *gin.Context) { + var query struct { + CacheName string `form:"cacheName" binding:"required"` // 键名列表中得到的缓存名称 + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if constants.CACHE_LOGIN_TOKEN == query.CacheName { + c.JSON(200, resp.ErrMsg("Cannot delete user information cache")) + return + } + + cacheKeys, err := redis.GetKeys("", query.CacheName+":*") + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + if err = redis.DelKeys("", cacheKeys); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + c.JSON(200, resp.Ok(nil)) +} + +// CleanValue 缓存内容删除 +// +// DELETE /value?cacheName=xxx&cacheKey=xxx +func (s SysCacheController) CleanValue(c *gin.Context) { + var query struct { + CacheName string `form:"cacheName" binding:"required"` // 键名列表中得到的缓存名称 + CacheKey string `form:"cacheKey" binding:"required"` // 键名列表中得到的缓存键名 + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + + if err := redis.Del("", query.CacheName+":"+query.CacheKey); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + c.JSON(200, resp.Ok(nil)) } diff --git a/src/modules/monitor/controller/sys_job.go b/src/modules/monitor/controller/sys_job.go index 07868c8b..0fe3253c 100644 --- a/src/modules/monitor/controller/sys_job.go +++ b/src/modules/monitor/controller/sys_job.go @@ -4,20 +4,18 @@ import ( "encoding/json" "fmt" "strconv" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "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/framework/vo/result" "be.ems/src/modules/monitor/model" "be.ems/src/modules/monitor/service" systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SysJobLogController 结构体 @@ -38,15 +36,14 @@ type SysJobController struct { // // GET /list func (s *SysJobController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - querys := ctx.QueryMap(c) + language := reqctx.AcceptLanguage(c) + query := reqctx.QueryMap(c) // 多语言值转key查询 - if v, ok := querys["jobName"]; ok && v != "" { - querys["jobName"] = i18n.TFindKeyPrefix(language, "job", v.(string)) + if v, ok := query["jobName"]; ok && v != "" { + query["jobName"] = i18n.TFindKeyPrefix(language, "job", v) } - data := s.sysJobService.SelectJobPage(querys) - rows := data["rows"].([]model.SysJob) + rows, total := s.sysJobService.FindByPage(query) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysJob) { @@ -57,40 +54,44 @@ func (s *SysJobController) List(c *gin.Context) { } converI18n(language, &rows) - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 调度任务信息 // // GET /:jobId func (s *SysJobController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - jobId := c.Param("jobId") - if jobId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + jobId := parse.Number(c.Param("jobId")) + if jobId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: jobId is empty")) return } - data := s.sysJobService.SelectJobById(jobId) - if data.JobID == jobId { + data := s.sysJobService.FindById(jobId) + if data.JobId == jobId { // 处理多语言 data.JobName = i18n.TKey(language, data.JobName) data.Remark = i18n.TKey(language, data.Remark) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 调度任务新增 // // POST / func (s *SysJobController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysJob - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.JobID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.JobId > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: jobId not is empty")) return } @@ -98,7 +99,7 @@ func (s *SysJobController) Add(c *gin.Context) { if parse.CronExpression(body.CronExpression) == 0 { // 调度任务新增【%s】失败,Cron表达式不正确 msg := i18n.TTemplate(language, "job.errCronExpression", map[string]any{"name": body.JobName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } @@ -107,42 +108,46 @@ func (s *SysJobController) Add(c *gin.Context) { // 调度任务新增【%s】失败,任务传入参数json字符串不正确 msg := i18n.TTemplate(language, "job.errTargetParams", map[string]any{"name": body.JobName}) if len(body.TargetParams) < 7 { - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } if !json.Valid([]byte(body.TargetParams)) { - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } // 检查属性值唯一 - uniqueJob := s.sysJobService.CheckUniqueJobName(body.JobName, body.JobGroup, "") + uniqueJob := s.sysJobService.CheckUniqueByJobName(body.JobName, body.JobGroup, 0) if !uniqueJob { // 调度任务新增【%s】失败,同任务组内有相同任务名称 msg := i18n.TTemplate(language, "job.errJobExists", map[string]any{"name": body.JobName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - body.CreateBy = ctx.LoginUserToUserName(c) - insertId := s.sysJobService.InsertJob(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + body.CreateBy = reqctx.LoginUserToUserName(c) + insertId := s.sysJobService.Insert(body) + if insertId > 0 { + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 调度任务修改 // // PUT / func (s *SysJobController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysJob - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.JobID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.JobId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: jobId is empty")) return } @@ -150,7 +155,7 @@ func (s *SysJobController) Edit(c *gin.Context) { if parse.CronExpression(body.CronExpression) == 0 { // 调度任务修改【%s】失败,Cron表达式不正确 msg := i18n.TTemplate(language, "job.errCronExpression", map[string]any{"name": body.JobName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } @@ -159,179 +164,188 @@ func (s *SysJobController) Edit(c *gin.Context) { // 调度任务修改【%s】失败,任务传入参数json字符串不正确 msg := i18n.TTemplate(language, "job.errTargetParams", map[string]any{"name": body.JobName}) if len(body.TargetParams) < 7 { - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } if !json.Valid([]byte(body.TargetParams)) { - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } // 检查是否存在 - job := s.sysJobService.SelectJobById(body.JobID) - if job.JobID != body.JobID { + jobInfo := s.sysJobService.FindById(body.JobId) + if jobInfo.JobId != body.JobId { // 没有可访问调度任务数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "job.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "job.noData"))) return } // 检查属性值唯一 - uniqueJob := s.sysJobService.CheckUniqueJobName(body.JobName, body.JobGroup, body.JobID) + uniqueJob := s.sysJobService.CheckUniqueByJobName(body.JobName, body.JobGroup, body.JobId) if !uniqueJob { // 调度任务修改【%s】失败,同任务组内有相同任务名称 msg := i18n.TTemplate(language, "job.errJobExists", map[string]any{"name": body.JobName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 多语言非原始值 - i18nValue := i18n.TKey(language, job.JobName) - if i18nValue != job.JobName { - i18n.UpdateKeyValue(language, job.JobName, body.JobName) - body.JobName = job.JobName + i18nValue := i18n.TKey(language, jobInfo.JobName) + if i18nValue != jobInfo.JobName { + systemService.NewSysI18n.UpdateKeyValue(language, jobInfo.JobName, body.JobName) + body.JobName = jobInfo.JobName } // 多语言非原始值 - i18nValue2 := i18n.TKey(language, job.Remark) - if i18nValue2 != job.Remark { - i18n.UpdateKeyValue(language, job.Remark, body.Remark) - body.Remark = job.Remark + i18nValue2 := i18n.TKey(language, jobInfo.Remark) + if i18nValue2 != jobInfo.Remark { + systemService.NewSysI18n.UpdateKeyValue(language, jobInfo.Remark, body.Remark) + body.Remark = jobInfo.Remark } - body.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysJobService.UpdateJob(body) + jobInfo.JobName = body.JobName + jobInfo.JobGroup = body.JobGroup + jobInfo.InvokeTarget = body.InvokeTarget + jobInfo.TargetParams = body.TargetParams + jobInfo.CronExpression = body.CronExpression + jobInfo.MisfirePolicy = body.MisfirePolicy + jobInfo.Concurrent = body.Concurrent + jobInfo.StatusFlag = body.StatusFlag + jobInfo.SaveLog = body.SaveLog + jobInfo.Remark = body.Remark + jobInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysJobService.Update(jobInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 调度任务删除 // -// DELETE /:jobIds +// DELETE /:jobId func (s *SysJobController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - jobIds := c.Param("jobIds") - if jobIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + jobId := c.Param("jobId") + if jobId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: jobId is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(jobIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(jobId, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.sysJobService.DeleteJobByIds(uniqueIDs) + + rows, err := s.sysJobService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // 调度任务修改状态 // // PUT /changeStatus func (s *SysJobController) Status(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { - // 任务ID - JobId string `json:"jobId" binding:"required"` - // 状态 - Status string `json:"status" binding:"required"` + JobId int64 `json:"jobId" binding:"required"` + StatusFlag string `json:"statusFlag" binding:"required,oneof=0 1 2"` } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 检查是否存在 - job := s.sysJobService.SelectJobById(body.JobId) - if job.JobID != body.JobId { + // 检查是否存在 + jobInfo := s.sysJobService.FindById(body.JobId) + if jobInfo.JobId != body.JobId { // 没有可访问调度任务数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "job.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "job.noData"))) return } // 与旧值相等不变更 - if job.Status == body.Status { + if jobInfo.StatusFlag == body.StatusFlag { // 变更状态与旧值相等! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "job.statusEq"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "job.statusEq"))) return } // 更新状态 - job.Status = body.Status - job.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysJobService.UpdateJob(job) + jobInfo.StatusFlag = body.StatusFlag + jobInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysJobService.Update(jobInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 调度任务立即执行一次 // // PUT /run/:jobId func (s *SysJobController) Run(c *gin.Context) { - language := ctx.AcceptLanguage(c) - jobId := c.Param("jobId") - if jobId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + jobId := parse.Number(c.Param("jobId")) + if jobId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: jobId is empty")) return } // 检查是否存在 - job := s.sysJobService.SelectJobById(jobId) - if job.JobID != jobId { + job := s.sysJobService.FindById(jobId) + if job.JobId != jobId { // 没有可访问调度任务数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "job.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "job.noData"))) return } - ok := s.sysJobService.RunQueueJob(job) + ok := s.sysJobService.Run(job) if ok { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 调度任务重置刷新队列 // // PUT /resetQueueJob func (s *SysJobController) ResetQueueJob(c *gin.Context) { - s.sysJobService.ResetQueueJob() - c.JSON(200, result.Ok(nil)) + s.sysJobService.Reset() + c.JSON(200, resp.Ok(nil)) } -// 导出调度任务信息 +// Export 导出调度任务信息 // -// POST /export +// GET /export func (s *SysJobController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - data := s.sysJobService.SelectJobPage(querys) - if parse.Number(data["total"]) == 0 { + query := reqctx.QueryMap(c) + rows, total := s.sysJobService.FindByPage(query) + if total == 0 { + // c.JSON(200, resp.CodeMsg(40016, "export data record as empty")) // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } - rows := data["rows"].([]model.SysJob) // rows := s.sysJobService.SelectJobList(model.SysJob{}) if len(rows) <= 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -358,7 +372,7 @@ func (s *SysJobController) Export(c *gin.Context) { // "E1": i18n.TKey(language, "job.export.targetParams"), } // 读取任务组名字典数据 - dictSysJobGroup := s.sysDictDataService.SelectDictDataByType("sys_job_group") + dictSysJobGroup := s.sysDictDataService.FindByType("sys_job_group") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { @@ -366,19 +380,19 @@ func (s *SysJobController) Export(c *gin.Context) { // 任务组名 sysJobGroup := "" for _, v := range dictSysJobGroup { - if row.JobGroup == v.DictValue { - sysJobGroup = i18n.TKey(language, v.DictLabel) + if row.JobGroup == v.DataValue { + sysJobGroup = i18n.TKey(language, v.DataLabel) break } } // 状态 statusValue := i18n.TKey(language, "dictData.fail") - if row.Status == "1" { + if row.StatusFlag == "1" { statusValue = i18n.TKey(language, "dictData.success") } dataCells = append(dataCells, map[string]any{ - "A" + idx: row.JobID, + "A" + idx: row.JobId, "B" + idx: row.JobName, "C" + idx: sysJobGroup, "D" + idx: row.InvokeTarget, @@ -392,7 +406,7 @@ func (s *SysJobController) Export(c *gin.Context) { // 导出数据表格 saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/monitor/controller/sys_job_log.go b/src/modules/monitor/controller/sys_job_log.go index 9401a28d..4b4281b0 100644 --- a/src/modules/monitor/controller/sys_job_log.go +++ b/src/modules/monitor/controller/sys_job_log.go @@ -3,15 +3,14 @@ package controller import ( "fmt" "strconv" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/monitor/model" "be.ems/src/modules/monitor/service" systemService "be.ems/src/modules/system/service" @@ -21,6 +20,7 @@ import ( // 实例化控制层 SysJobLogController 结构体 var NewSysJobLog = &SysJobLogController{ + sysJobService: service.NewSysJob, sysJobLogService: service.NewSysJobLog, sysDictDataService: systemService.NewSysDictData, } @@ -29,6 +29,7 @@ var NewSysJobLog = &SysJobLogController{ // // PATH /monitor/jobLog type SysJobLogController struct { + sysJobService *service.SysJob // 调度任务服务 sysJobLogService *service.SysJobLog // 调度任务日志服务 sysDictDataService *systemService.SysDictData // 字典数据服务 } @@ -37,22 +38,23 @@ type SysJobLogController struct { // // GET /list func (s *SysJobLogController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询参数转换map - querys := ctx.QueryMap(c) + query := reqctx.QueryMap(c) // 任务ID优先级更高 - if v, ok := querys["jobId"]; ok && v != nil { - jobInfo := service.NewSysJob.SelectJobById(v.(string)) - querys["jobName"] = jobInfo.JobName - querys["jobGroup"] = jobInfo.JobGroup + if jobIdStr := c.Query("jobId"); jobIdStr != "" { + if jobId := parse.Number(jobIdStr); jobId > 0 { + job := s.sysJobService.FindById(jobId) + query["jobName"] = job.JobName + query["jobGroup"] = job.JobGroup + } } // 多语言值转key查询 - if v, ok := querys["jobName"]; ok && v != "" { - querys["jobName"] = i18n.TFindKeyPrefix(language, "job", v.(string)) + if v, ok := query["jobName"]; ok && v != "" { + query["jobName"] = i18n.TFindKeyPrefix(language, "job", v) } - data := s.sysJobLogService.SelectJobLogPage(querys) - rows := data["rows"].([]model.SysJobLog) + rows, total := s.sysJobLogService.FindByPage(query) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysJobLog) { @@ -62,88 +64,89 @@ func (s *SysJobLogController) List(c *gin.Context) { } converI18n(language, &rows) - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 调度任务日志信息 // -// GET /:jobLogId +// GET /:logId func (s *SysJobLogController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - jobLogId := c.Param("jobLogId") - if jobLogId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + logId := parse.Number(c.Param("logId")) + if logId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: logId is empty")) return } - data := s.sysJobLogService.SelectJobLogById(jobLogId) - if data.JobLogID == jobLogId { - c.JSON(200, result.OkData(data)) + + jobLogInfo := s.sysJobLogService.FindById(logId) + if jobLogInfo.LogId == logId { + c.JSON(200, resp.OkData(jobLogInfo)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 调度任务日志删除 // -// DELETE /:jobLogIds +// DELETE /:logId func (s *SysJobLogController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - jobLogIds := c.Param("jobLogIds") - if jobLogIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + logId := c.Param("logId") + if logId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: logId is empty")) return } // 处理字符转id数组后去重 - ids := strings.Split(jobLogIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(logId, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows := s.sysJobLogService.DeleteJobLogByIds(uniqueIDs) + + rows := s.sysJobLogService.DeleteByIds(ids) if rows > 0 { // 删除成功:%d msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 调度任务日志清空 // // DELETE /clean func (s *SysJobLogController) Clean(c *gin.Context) { - err := s.sysJobLogService.CleanJobLog() - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) - return - } - c.JSON(200, result.Ok(nil)) + rows := s.sysJobLogService.Clean() + c.JSON(200, resp.OkData(rows)) } -// 导出调度任务日志信息 +// Export 导出调度任务日志信息 // -// POST /export +// GET /export func (s *SysJobLogController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - data := s.sysJobLogService.SelectJobLogPage(querys) - if parse.Number(data["total"]) == 0 { + query := reqctx.QueryMap(c) + if jobIdStr := c.Query("jobId"); jobIdStr != "" { + if jobId := parse.Number(jobIdStr); jobId > 0 { + job := s.sysJobService.FindById(jobId) + query["jobName"] = job.JobName + query["jobGroup"] = job.JobGroup + } + } + rows, total := s.sysJobLogService.FindByPage(query) + if total == 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } - rows := data["rows"].([]model.SysJobLog) // rows := s.sysJobLogService.SelectJobLogList(model.SysJobLog{}) if len(rows) <= 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -170,7 +173,7 @@ func (s *SysJobLogController) Export(c *gin.Context) { "G1": i18n.TKey(language, "log.operate.export.costTime"), } // 读取任务组名字典数据 - dictSysJobGroup := s.sysDictDataService.SelectDictDataByType("sys_job_group") + dictSysJobGroup := s.sysDictDataService.FindByType("sys_job_group") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { @@ -178,18 +181,18 @@ func (s *SysJobLogController) Export(c *gin.Context) { // 任务组名 sysJobGroup := "" for _, v := range dictSysJobGroup { - if row.JobGroup == v.DictValue { - sysJobGroup = i18n.TKey(language, v.DictLabel) + if row.JobGroup == v.DataValue { + sysJobGroup = i18n.TKey(language, v.DataLabel) break } } // 状态 statusValue := i18n.TKey(language, "dictData.fail") - if row.Status == "1" { + if row.StatusFlag == "1" { statusValue = i18n.TKey(language, "dictData.success") } dataCells = append(dataCells, map[string]any{ - "A" + idx: row.JobLogID, + "A" + idx: row.LogId, "B" + idx: row.JobName, "C" + idx: sysJobGroup, "D" + idx: row.InvokeTarget, @@ -204,7 +207,7 @@ func (s *SysJobLogController) Export(c *gin.Context) { // 导出数据表格 saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/monitor/controller/sys_user_online.go b/src/modules/monitor/controller/sys_user_online.go index 09b0edec..8a8dac97 100644 --- a/src/modules/monitor/controller/sys_user_online.go +++ b/src/modules/monitor/controller/sys_user_online.go @@ -2,15 +2,15 @@ package controller import ( "encoding/json" + "fmt" "sort" "strings" - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/i18n" - "be.ems/src/framework/redis" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" + "be.ems/src/framework/utils/parse" "be.ems/src/modules/monitor/model" "be.ems/src/modules/monitor/service" @@ -42,12 +42,11 @@ type SysUserOnlineController struct { // @Description System Online User List // @Router /monitor/online/list [get] func (s *SysUserOnlineController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - ipaddr := c.Query("ipaddr") + loginIp := c.Query("loginIp") userName := c.Query("userName") // 获取所有在线用户key - keys, _ := redis.GetKeys("", cachekey.LOGIN_TOKEN_KEY+"*") + keys, _ := redis.GetKeys("", constants.CACHE_LOGIN_TOKEN+":*") // 分批获取 arr := make([]string, 0) @@ -59,81 +58,84 @@ func (s *SysUserOnlineController) List(c *gin.Context) { chunk := keys[i:end] values, _ := redis.GetBatch("", chunk) for _, v := range values { - arr = append(arr, v.(string)) + arr = append(arr, fmt.Sprint(v)) } } // 遍历字符串信息解析组合可用对象 - userOnlines := make([]model.SysUserOnline, 0) + var userOnlines []model.SysUserOnline for _, str := range arr { if str == "" { continue } - var loginUser vo.LoginUser - err := json.Unmarshal([]byte(str), &loginUser) + var tokenInfo token.TokenInfo + err := json.Unmarshal([]byte(str), &tokenInfo) if err != nil { continue } - onlineUser := s.sysUserOnlineService.LoginUserToUserOnline(loginUser) + onlineUser := s.sysUserOnlineService.TokenInfoToUserOnline(tokenInfo) if onlineUser.TokenID != "" { - onlineUser.LoginLocation = i18n.TKey(language, onlineUser.LoginLocation) userOnlines = append(userOnlines, onlineUser) } } // 根据查询条件过滤 - filteredUserOnlines := make([]model.SysUserOnline, 0) - if ipaddr != "" && userName != "" { + filteredUserOnline := make([]model.SysUserOnline, 0) + if loginIp != "" && userName != "" { for _, o := range userOnlines { - if strings.Contains(o.IPAddr, ipaddr) && strings.Contains(o.UserName, userName) { - filteredUserOnlines = append(filteredUserOnlines, o) + if strings.Contains(o.LoginIp, loginIp) && strings.Contains(o.UserName, userName) { + filteredUserOnline = append(filteredUserOnline, o) } } - } else if ipaddr != "" { + } else if loginIp != "" { for _, o := range userOnlines { - if strings.Contains(o.IPAddr, ipaddr) { - filteredUserOnlines = append(filteredUserOnlines, o) + if strings.Contains(o.LoginIp, loginIp) { + filteredUserOnline = append(filteredUserOnline, o) } } } else if userName != "" { for _, o := range userOnlines { if strings.Contains(o.UserName, userName) { - filteredUserOnlines = append(filteredUserOnlines, o) + filteredUserOnline = append(filteredUserOnline, o) } } } else { - filteredUserOnlines = userOnlines + filteredUserOnline = userOnlines } // 按登录时间排序 - sort.Slice(filteredUserOnlines, func(i, j int) bool { - return filteredUserOnlines[j].LoginTime > filteredUserOnlines[i].LoginTime + sort.Slice(filteredUserOnline, func(i, j int) bool { + return filteredUserOnline[j].LoginTime > filteredUserOnline[i].LoginTime }) - c.JSON(200, result.Ok(map[string]any{ - "total": len(filteredUserOnlines), - "rows": filteredUserOnlines, + c.JSON(200, resp.OkData(map[string]any{ + "total": len(filteredUserOnline), + "rows": filteredUserOnline, })) } -// 在线用户强制退出 +// Logout 在线用户强制退出 // -// DELETE /:tokenId -func (s *SysUserOnlineController) ForceLogout(c *gin.Context) { - language := ctx.AcceptLanguage(c) - tokenId := c.Param("tokenId") - if tokenId == "" || tokenId == "*" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// DELETE /logout/:tokenId +func (s SysUserOnlineController) Logout(c *gin.Context) { + tokenIdStr := c.Param("tokenId") + if tokenIdStr == "" || strings.Contains(tokenIdStr, "*") { + c.JSON(400, resp.CodeMsg(40010, "bind err: tokenId is empty")) return } - // 删除token - ok, _ := redis.Del("", cachekey.LOGIN_TOKEN_KEY+tokenId) - if ok { - c.JSON(200, result.Ok(nil)) - return + // 处理字符转id数组后去重 + ids := strings.Split(tokenIdStr, ",") + uniqueIDs := parse.RemoveDuplicates(ids) + for _, v := range uniqueIDs { + key := constants.CACHE_LOGIN_TOKEN + ":" + v + if err := redis.Del("", key); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } } - c.JSON(200, result.Err(nil)) + + c.JSON(200, resp.Ok(nil)) } diff --git a/src/modules/monitor/controller/system_info.go b/src/modules/monitor/controller/system_info.go index 382b8425..8ef20413 100644 --- a/src/modules/monitor/controller/system_info.go +++ b/src/modules/monitor/controller/system_info.go @@ -1,22 +1,23 @@ package controller import ( - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" "be.ems/src/modules/monitor/service" "github.com/gin-gonic/gin" ) -// 实例化控制层 SystemInfoController 结构体 -var NewSystemInfo = &SystemInfoController{ - systemInfogService: service.NewSystemInfo, +// NewSystem 实例化控制层 +var NewSystem = &SystemController{ + systemInfoService: service.NewSystemInfo, } -// 服务器监控信息 +// SystemController 服务器监控信息 控制层处理 // -// PATH /monitor/system-info -type SystemInfoController struct { - systemInfogService *service.SystemInfo // 服务器系统相关信息服务 +// PATH /monitor/system +type SystemController struct { + // 服务器系统相关信息服务 + systemInfoService *service.SystemInfo } // 服务器信息 @@ -28,17 +29,17 @@ type SystemInfoController struct { // @Produce json // @Success 200 {object} object "Response Results" // @Security TokenAuth -// @Summary Server Information -// @Description Server Information +// @Summary System Server Information +// @Description System Server Information // @Router /monitor/system-info [get] -func (s *SystemInfoController) Info(c *gin.Context) { +func (s SystemController) Info(c *gin.Context) { data := map[string]any{ - "cpu": s.systemInfogService.CPUInfo(), - "memory": s.systemInfogService.MemoryInfo(), - "network": s.systemInfogService.NetworkInfo(), - "time": s.systemInfogService.TimeInfo(), - "system": s.systemInfogService.SystemInfo(), - "disk": s.systemInfogService.DiskInfo(), + "cpu": s.systemInfoService.CPUInfo(), + "memory": s.systemInfoService.MemoryInfo(), + "network": s.systemInfoService.NetworkInfo(), + "time": s.systemInfoService.TimeInfo(), + "system": s.systemInfoService.SystemInfo(), + "disk": s.systemInfoService.DiskInfo(), } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } diff --git a/src/modules/monitor/model/monitor_base.go b/src/modules/monitor/model/monitor_base.go index 34e056fa..ecbbe18e 100644 --- a/src/modules/monitor/model/monitor_base.go +++ b/src/modules/monitor/model/monitor_base.go @@ -3,15 +3,15 @@ package model // MonitorBase 监控_基本信息 monitor_base type MonitorBase struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 - CPU float64 `json:"cpu" gorm:"cpu"` // cpu使用率 - LoadUsage float64 `json:"loadUsage" gorm:"load_usage"` // cpu平均使用率 - CPULoad1 float64 `json:"cpuLoad1" gorm:"cpu_load1"` // cpu使用1分钟 - CPULoad5 float64 `json:"cpuLoad5" gorm:"cpu_load5"` // cpu使用5分钟 - CPULoad15 float64 `json:"cpuLoad15" gorm:"cpu_load15"` // cpu使用15分钟 - Memory float64 `json:"memory" gorm:"memory"` // 内存使用率 - NeType string `json:"neType" gorm:"ne_type"` // 网元类型 - NeID string `json:"neId" gorm:"ne_id"` // 网元ID + CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 + CPU float64 `json:"cpu" gorm:"column:cpu"` // cpu使用率 + LoadUsage float64 `json:"loadUsage" gorm:"column:load_usage"` // cpu平均使用率 + CPULoad1 float64 `json:"cpuLoad1" gorm:"column:cpu_load1"` // cpu使用1分钟 + CPULoad5 float64 `json:"cpuLoad5" gorm:"column:cpu_load5"` // cpu使用5分钟 + CPULoad15 float64 `json:"cpuLoad15" gorm:"column:cpu_load15"` // cpu使用15分钟 + Memory float64 `json:"memory" gorm:"column:memory"` // 内存使用率 + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + NeID string `json:"neId" gorm:"column:ne_id"` // 网元ID } // TableName 表名称 diff --git a/src/modules/monitor/model/monitor_io.go b/src/modules/monitor/model/monitor_io.go index 962bfc86..5543371f 100644 --- a/src/modules/monitor/model/monitor_io.go +++ b/src/modules/monitor/model/monitor_io.go @@ -3,14 +3,14 @@ package model // MonitorIO 监控_磁盘IO monitor_io type MonitorIO struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 - Name string `json:"name" gorm:"name"` // 磁盘名 - Read int64 `json:"read" gorm:"read"` // 读取K - Write int64 `json:"write" gorm:"write"` // 写入K - Count int64 `json:"count" gorm:"count"` // 读写次数 - Time int64 `json:"time" gorm:"time"` // 读写延迟 - NeType string `json:"neType" gorm:"ne_type"` // 网元类型 - NeID string `json:"neId" gorm:"ne_id"` // 网元ID + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + Name string `json:"name" gorm:"column:name"` // 磁盘名 + Read int64 `json:"read" gorm:"column:read"` // 读取K + Write int64 `json:"write" gorm:"column:write"` // 写入K + Count int64 `json:"count" gorm:"column:count"` // 读写次数 + Time int64 `json:"time" gorm:"column:time"` // 读写延迟 + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + NeID string `json:"neId" gorm:"column:ne_id"` // 网元ID } // TableName 表名称 diff --git a/src/modules/monitor/model/monitor_network.go b/src/modules/monitor/model/monitor_network.go index feed747e..e42f2bef 100644 --- a/src/modules/monitor/model/monitor_network.go +++ b/src/modules/monitor/model/monitor_network.go @@ -3,12 +3,12 @@ package model // MonitorNetwork 监控_网络IO monitor_network type MonitorNetwork struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 - Name string `json:"name" gorm:"name"` // 网卡名 - Up float64 `json:"up" gorm:"up"` // 上行 - Down float64 `json:"down" gorm:"down"` // 下行 - NeType string `json:"neType" gorm:"ne_type"` // 网元类型 - NeID string `json:"neId" gorm:"ne_id"` // 网元ID + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + Name string `json:"name" gorm:"column:name"` // 网卡名 + Up float64 `json:"up" gorm:"column:up"` // 上行 + Down float64 `json:"down" gorm:"column:down"` // 下行 + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + NeID string `json:"neId" gorm:"column:ne_id"` // 网元ID } // TableName 表名称 diff --git a/src/modules/monitor/model/sys_cache.go b/src/modules/monitor/model/sys_cache.go index 29e79bca..42980bbd 100644 --- a/src/modules/monitor/model/sys_cache.go +++ b/src/modules/monitor/model/sys_cache.go @@ -10,18 +10,18 @@ type SysCache struct { Remark string `json:"remark"` // 备注 } -// NewSysCacheNames 创建新的缓存名称列表项实例 -func NewSysCacheNames(cacheName string, cacheKey string) SysCache { +// NewNames 创建新的缓存名称列表项实例 +func NewNames(cacheName string, cacheKey string) SysCache { return SysCache{ - CacheName: cacheKey[:len(cacheKey)-1], + CacheName: cacheKey, CacheKey: "", CacheValue: "", Remark: cacheName, } } -// NewSysCacheKeys 创建新的缓存键名列表项实例 -func NewSysCacheKeys(cacheName string, cacheKey string) SysCache { +// NewKeys 创建新的缓存键名列表项实例 +func NewKeys(cacheName string, cacheKey string) SysCache { return SysCache{ CacheName: cacheName, CacheKey: strings.Replace(cacheKey, cacheName+":", "", 1), @@ -30,8 +30,8 @@ func NewSysCacheKeys(cacheName string, cacheKey string) SysCache { } } -// NewSysCacheValue 创建新的缓存键名内容项实例 -func NewSysCacheValue(cacheName string, cacheKey string, cacheValue string) SysCache { +// NewValue 创建新的缓存键名内容项实例 +func NewValue(cacheName string, cacheKey string, cacheValue string) SysCache { return SysCache{ CacheName: cacheName, CacheKey: cacheKey, diff --git a/src/modules/monitor/model/sys_job.go b/src/modules/monitor/model/sys_job.go index a7f910f4..146bacb2 100644 --- a/src/modules/monitor/model/sys_job.go +++ b/src/modules/monitor/model/sys_job.go @@ -1,35 +1,25 @@ package model -// SysJob 调度任务信息表 sys_job +// SysJob 调度任务调度表 type SysJob struct { - // 任务ID - JobID string `json:"jobId"` - // 任务名称 - JobName string `json:"jobName" binding:"required"` - // 任务组名 - JobGroup string `json:"jobGroup" binding:"required"` - // 调用目标字符串 - InvokeTarget string `json:"invokeTarget" binding:"required"` - // 调用目标传入参数 - TargetParams string `json:"targetParams"` - // cron执行表达式 - CronExpression string `json:"cronExpression" binding:"required"` - // 计划执行错误策略(1立即执行 2执行一次 3放弃执行) - MisfirePolicy string `json:"misfirePolicy"` - // 是否并发执行(0禁止 1允许) - Concurrent string `json:"concurrent"` - // 任务状态(0暂停 1正常) - Status string `json:"status"` - // 是否记录任务日志 - SaveLog string `json:"saveLog"` - // 创建者 - CreateBy string `json:"createBy"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 更新者 - UpdateBy string `json:"updateBy"` - // 更新时间 - UpdateTime int64 `json:"updateTime"` - // 备注 - Remark string `json:"remark"` + JobId int64 `json:"jobId" gorm:"column:job_id;primaryKey;autoIncrement"` // 任务ID + JobName string `json:"jobName" gorm:"column:job_name" binding:"required"` // 任务名称 + JobGroup string `json:"jobGroup" gorm:"column:job_group" binding:"required"` // 任务组名 + InvokeTarget string `json:"invokeTarget" gorm:"column:invoke_target" binding:"required"` // 调用目标字符串 + TargetParams string `json:"targetParams" gorm:"column:target_params"` // 调用目标传入参数 + CronExpression string `json:"cronExpression" gorm:"column:cron_expression" binding:"required"` // cron执行表达式 + MisfirePolicy string `json:"misfirePolicy" gorm:"column:misfire_policy"` // 计划执行错误策略(1立即执行 2执行一次 3放弃执行) + Concurrent string `json:"concurrent" gorm:"column:concurrent"` // 是否并发执行(0禁止 1允许) + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 任务状态(0暂停 1正常) + SaveLog string `json:"saveLog" gorm:"column:save_log"` // 是否记录任务日志(0不记录 1记录) + 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"` // 备注 +} + +// TableName 表名称 +func (*SysJob) TableName() string { + return "sys_job" } diff --git a/src/modules/monitor/model/sys_job_log.go b/src/modules/monitor/model/sys_job_log.go index c9a27bcd..0c63b3a4 100644 --- a/src/modules/monitor/model/sys_job_log.go +++ b/src/modules/monitor/model/sys_job_log.go @@ -1,23 +1,19 @@ package model -// SysJobLog 定时任务调度日志表 sys_job_log +// SysJobLog 调度任务调度日志表 type SysJobLog struct { - // 日志序号 - JobLogID string `json:"jobLogId"` - // 任务名称 - JobName string `json:"jobName"` - // 任务组名 - JobGroup string `json:"jobGroup"` - // 调用目标字符串 - InvokeTarget string `json:"invokeTarget"` - // 调用目标传入参数 - TargetParams string `json:"targetParams"` - // 日志信息 - JobMsg string `json:"jobMsg"` - // 执行状态(0失败 1正常) - Status string `json:"status"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 消耗时间(毫秒) - CostTime int64 `json:"costTime"` + LogId int64 `json:"logId" gorm:"column:log_id;primaryKey;autoIncrement"` // 任务日志ID + JobName string `json:"jobName" gorm:"column:job_name"` // 任务名称 + JobGroup string `json:"jobGroup" gorm:"column:job_group"` // 任务组名 + InvokeTarget string `json:"invokeTarget" gorm:"column:invoke_target"` // 调用目标字符串 + TargetParams string `json:"targetParams" gorm:"column:target_params"` // 调用目标传入参数 + JobMsg string `json:"jobMsg" gorm:"column:job_msg"` // 日志信息 + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 执行状态(0失败 1正常) + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + CostTime int64 `json:"costTime" gorm:"column:cost_time"` // 消耗时间(毫秒) +} + +// TableName 表名称 +func (*SysJobLog) TableName() string { + return "sys_job_log" } diff --git a/src/modules/monitor/model/sys_user_online.go b/src/modules/monitor/model/sys_user_online.go index 2c8a1b2f..123b8677 100644 --- a/src/modules/monitor/model/sys_user_online.go +++ b/src/modules/monitor/model/sys_user_online.go @@ -2,20 +2,12 @@ package model // SysUserOnline 当前在线会话对象 type SysUserOnline struct { - // 会话编号 - TokenID string `json:"tokenId"` - // 部门名称 - DeptName string `json:"deptName"` - // 用户名称 - UserName string `json:"userName"` - // 登录IP地址 - IPAddr string `json:"ipaddr"` - // 登录地址 - LoginLocation string `json:"loginLocation"` - // 浏览器类型 - Browser string `json:"browser"` - // 操作系统 - OS string `json:"os"` - // 登录时间 - LoginTime int64 `json:"loginTime"` + TokenID string `json:"tokenId"` // 会话编号 + DeptName string `json:"deptName"` // 部门名称 + UserName string `json:"userName"` // 用户名称 + LoginIp string `json:"loginIp"` // 登录IP地址 + LoginLocation string `json:"loginLocation"` // 登录地址 + Browser string `json:"browser"` // 浏览器类型 + OS string `json:"os"` // 操作系统 + LoginTime int64 `json:"loginTime"` // 登录时间 } diff --git a/src/modules/monitor/monitor.go b/src/modules/monitor/monitor.go index 751716a9..736f63ba 100644 --- a/src/modules/monitor/monitor.go +++ b/src/modules/monitor/monitor.go @@ -28,13 +28,26 @@ func Setup(router *gin.Engine) { ) } - // 服务器服务信息 - router.GET("/monitor/system-info", + // 服务器信息 + router.GET("/monitor/system", // middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:system:info"}}), middleware.PreAuthorize(nil), - controller.NewSystemInfo.Info, + controller.NewSystem.Info, ) + // 在线用户监控 + sysUserOnlineGroup := router.Group("/monitor/user-online") + { + sysUserOnlineGroup.GET("/list", + middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:online:list"}}), + controller.NewSysUserOnline.List, + ) + sysUserOnlineGroup.DELETE("/logout/:tokenId", + middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:online:logout"}}), + controller.NewSysUserOnline.Logout, + ) + } + // 缓存服务信息 sysCacheGroup := router.Group("/monitor/cache") { @@ -43,29 +56,29 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewSysCache.Info, ) - sysCacheGroup.GET("/getNames", + sysCacheGroup.GET("/names", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:list"}}), controller.NewSysCache.Names, ) - sysCacheGroup.GET("/getKeys/:cacheName", + sysCacheGroup.GET("/keys", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:list"}}), controller.NewSysCache.Keys, ) - sysCacheGroup.GET("/getValue/:cacheName/:cacheKey", + sysCacheGroup.GET("/value", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:query"}}), controller.NewSysCache.Value, ) - sysCacheGroup.DELETE("/clearCacheName/:cacheName", + sysCacheGroup.DELETE("/names", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:remove"}}), - controller.NewSysCache.ClearCacheName, + controller.NewSysCache.CleanNames, ) - sysCacheGroup.DELETE("/clearCacheKey/:cacheName/:cacheKey", + sysCacheGroup.DELETE("/keys", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:remove"}}), - controller.NewSysCache.ClearCacheKey, + controller.NewSysCache.CleanKeys, ) - sysCacheGroup.DELETE("/clearCacheSafe", + sysCacheGroup.DELETE("/value", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:cache:remove"}}), - controller.NewSysCache.ClearCacheSafe, + controller.NewSysCache.CleanValue, ) } @@ -76,11 +89,11 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:list"}}), controller.NewSysJobLog.List, ) - sysJobLogGroup.GET("/:jobLogId", + sysJobLogGroup.GET("/:logId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:query"}}), controller.NewSysJobLog.Info, ) - sysJobLogGroup.DELETE("/:jobLogIds", + sysJobLogGroup.DELETE("/:logId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:remove"}}), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJobLog", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewSysJobLog.Remove, @@ -91,7 +104,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJobLog", collectlogs.BUSINESS_TYPE_CLEAN)), controller.NewSysJobLog.Clean, ) - sysJobLogGroup.POST("/export", + sysJobLogGroup.GET("/export", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:export"}}), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJobLog", collectlogs.BUSINESS_TYPE_EXPORT)), controller.NewSysJobLog.Export, @@ -119,12 +132,12 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_UPDATE)), controller.NewSysJob.Edit, ) - sysJobGroup.DELETE("/:jobIds", + sysJobGroup.DELETE("/:jobId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:remove"}}), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewSysJob.Remove, ) - sysJobGroup.PUT("/changeStatus", + sysJobGroup.PUT("/status", repeat.RepeatSubmit(5), middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:changeStatus"}}), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_UPDATE)), @@ -136,30 +149,17 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_UPDATE)), controller.NewSysJob.Run, ) - sysJobGroup.PUT("/resetQueueJob", + sysJobGroup.PUT("/reset", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:changeStatus"}}), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_CLEAN)), controller.NewSysJob.ResetQueueJob, ) - sysJobGroup.POST("/export", + sysJobGroup.GET("/export", middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:job:export"}}), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysJob", collectlogs.BUSINESS_TYPE_EXPORT)), controller.NewSysJob.Export, ) } - - // 在线用户监控 - sysUserOnlineGroup := router.Group("/monitor/online") - { - sysUserOnlineGroup.GET("/list", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:online:list"}}), - controller.NewSysUserOnline.List, - ) - sysUserOnlineGroup.DELETE("/:tokenId", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:online:forceLogout"}}), - controller.NewSysUserOnline.ForceLogout, - ) - } } // InitLoad 初始参数 @@ -167,5 +167,5 @@ func InitLoad() { // 初始化定时任务处理 processor.InitCronQueue() // 启动时,初始化调度任务 - service.NewSysJob.ResetQueueJob() + service.NewSysJob.Reset() } diff --git a/src/modules/monitor/processor/bar/bar.go b/src/modules/monitor/processor/bar/bar.go index ce58cfe5..7b8a8e58 100644 --- a/src/modules/monitor/processor/bar/bar.go +++ b/src/modules/monitor/processor/bar/bar.go @@ -26,7 +26,7 @@ func (s *BarProcessor) Execute(data any) (any, error) { options := data.(cron.JobData) sysJob := options.SysJob - logger.Infof("重复 %v 任务ID %s", options.Repeat, sysJob.JobID) + logger.Infof("重复 %v 任务ID %d", options.Repeat, sysJob.JobId) // 实现任务处理逻辑 i := 0 @@ -34,7 +34,7 @@ func (s *BarProcessor) Execute(data any) (any, error) { for i < 5 { // 获取任务进度 progress := s.progress - logger.Infof("jonId: %s => 任务进度:%d", sysJob.JobID, progress) + logger.Infof("jonId: %d => 任务进度:%d", sysJob.JobId, progress) // 延迟响应 time.Sleep(time.Second * 2) // 程序中途执行错误 diff --git a/src/modules/monitor/processor/foo/foo.go b/src/modules/monitor/processor/foo/foo.go index 21380d4c..7d227cdc 100644 --- a/src/modules/monitor/processor/foo/foo.go +++ b/src/modules/monitor/processor/foo/foo.go @@ -26,7 +26,7 @@ func (s *FooProcessor) Execute(data any) (any, error) { options := data.(cron.JobData) sysJob := options.SysJob - logger.Infof("重复 %v 任务ID %s", options.Repeat, sysJob.JobID) + logger.Infof("重复 %v 任务ID %d", options.Repeat, sysJob.JobId) // 实现任务处理逻辑 i := 0 @@ -34,7 +34,7 @@ func (s *FooProcessor) Execute(data any) (any, error) { for i < 20 { // 获取任务进度 progress := s.progress - logger.Infof("jonId: %s => 任务进度:%d", sysJob.JobID, progress) + logger.Infof("jonId: %d => 任务进度:%d", sysJob.JobId, progress) // 延迟响应 time.Sleep(time.Second * 2) i++ diff --git a/src/modules/monitor/processor/simple/simple.go b/src/modules/monitor/processor/simple/simple.go index 4c2c08d8..03ba159e 100644 --- a/src/modules/monitor/processor/simple/simple.go +++ b/src/modules/monitor/processor/simple/simple.go @@ -14,7 +14,7 @@ func (s *simpleProcessor) Execute(data any) (any, error) { options := data.(cron.JobData) sysJob := options.SysJob - logger.Infof("重复 %v 任务ID %s", options.Repeat, sysJob.JobID) + logger.Infof("重复 %v 任务ID %d", options.Repeat, sysJob.JobId) // 返回结果,用于记录执行结果 result := map[string]any{ diff --git a/src/modules/monitor/repository/monitor.go b/src/modules/monitor/repository/monitor.go index 8a843df3..a474962f 100644 --- a/src/modules/monitor/repository/monitor.go +++ b/src/modules/monitor/repository/monitor.go @@ -1,33 +1,114 @@ package repository -import "be.ems/src/modules/monitor/model" +import ( + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/monitor/model" +) -// IMonitor 监控服务资源相关信息 数据接口 -type IMonitor interface { - // CreateMonitorBase 创建监控_基本信息 - CreateMonitorBase(m model.MonitorBase) error +// 实例化数据层 Monitor 结构体 +var NewMonitor = &Monitor{} - // DelMonitorBase 删除监控_基本信息 - DelMonitorBase(ltTime int64) error +// Monitor 监控服务资源相关信息 数据层处理 +type Monitor struct{} - // SelectMonitorBase 查询监控_基本信息 - SelectMonitorBase(query map[string]any) []model.MonitorBase +// SelectByBase 查询监控_基本信息 +func (r Monitor) SelectByBase(query map[string]any) []model.MonitorBase { + tx := db.DB("").Model(&model.MonitorBase{}) + // 查询条件拼接 + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("ne_type = ?", v) + } + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) + } + tx.Where("create_time >= ? and create_time <= ?", query["beginTime"], query["endTime"]) - // BatchCreateMonitorIO 批量创建监控_IO - BatchCreateMonitorIO(ioList []model.MonitorIO) error - - // DelMonitorIO 删除监控_IO - DelMonitorIO(ltTime int64) error - - // SelectMonitorIO 查询监控_IO - SelectMonitorIO(query map[string]any) []model.MonitorIO - - // BatchCreateMonitorNet 批量创建监控_网络 - BatchCreateMonitorNet(netList []model.MonitorNetwork) error - - // DelMonitorNet 删除监控_网络 - DelMonitorNet(ltTime int64) error - - // SelectMonitorNetwork 查询监控_网络 - SelectMonitorNetwork(query map[string]any) []model.MonitorNetwork + // 查询数据 + rows := []model.MonitorBase{} + if err := tx.Order("create_time asc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// InsertByBase 创建监控_基本信息 +func (r Monitor) InsertByBase(param model.MonitorBase) error { + return db.DB("").Create(¶m).Error +} + +// DeleteByBase 删除监控_基本信息 +func (r Monitor) DeleteByBase(ltTime int64) error { + return db.DB("").Where("create_time < ?", ltTime).Delete(&model.MonitorBase{}).Error +} + +// SelectByIO 查询监控_IO +func (r Monitor) SelectByIO(query map[string]any) []model.MonitorIO { + tx := db.DB("").Model(&model.MonitorIO{}) + // 查询条件拼接 + if v, ok := query["name"]; ok && v != "" { + tx = tx.Where("name = ?", v) + } + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("ne_type = ?", v) + } + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) + } + tx.Where("create_time >= ? and create_time <= ?", query["beginTime"], query["endTime"]) + + // 查询数据 + rows := []model.MonitorIO{} + if err := tx.Order("create_time asc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// BatchInsertByIO 批量创建监控_IO +func (r Monitor) BatchInsertByIO(arr []model.MonitorIO) error { + return db.DB("").CreateInBatches(arr, 100).Error +} + +// DeleteByIO 删除监控_IO +func (r Monitor) DeleteByIO(ltTime int64) error { + return db.DB("").Where("create_time < ?", ltTime).Delete(&model.MonitorIO{}).Error +} + +// SelectByNetwork 查询监控_网络 +func (r Monitor) SelectByNetwork(query map[string]any) []model.MonitorNetwork { + tx := db.DB("").Model(&model.MonitorNetwork{}) + // 查询条件拼接 + if v, ok := query["name"]; ok && v != "" { + tx = tx.Where("name = ?", v) + } else { + tx = tx.Where("name = 'all'") + } + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("ne_type = ?", v) + } + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) + } + tx.Where("create_time >= ? and create_time <= ?", query["beginTime"], query["endTime"]) + + // 查询数据 + rows := []model.MonitorNetwork{} + if err := tx.Order("create_time asc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// BatchInsertByNetwork 批量创建监控_网络 +func (r Monitor) BatchInsertByNetwork(arr []model.MonitorNetwork) error { + return db.DB("").CreateInBatches(arr, 100).Error +} + +// DeleteByNetwork 删除监控_网络 +func (r Monitor) DeleteByNetwork(ltTime int64) error { + return db.DB("").Where("create_time < ?", ltTime).Delete(&model.MonitorNetwork{}).Error } diff --git a/src/modules/monitor/repository/monitor.impl.go b/src/modules/monitor/repository/monitor.impl.go deleted file mode 100644 index 9a47e58c..00000000 --- a/src/modules/monitor/repository/monitor.impl.go +++ /dev/null @@ -1,105 +0,0 @@ -package repository - -import ( - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/modules/monitor/model" - "gorm.io/gorm" -) - -// 实例化数据层 MonitorImpl 结构体 -var NewMonitorImpl = &MonitorImpl{ - db: datasource.DefaultDB, -} - -// MonitorImpl 监控服务资源相关信息 数据层处理 -type MonitorImpl struct { - // 数据库实例 - db func() *gorm.DB -} - -// CreateMonitorBase 创建监控_基本信息 -func (r *MonitorImpl) CreateMonitorBase(m model.MonitorBase) error { - return r.db().Create(&m).Error -} - -// DelMonitorBase 删除监控_基本信息 -func (r *MonitorImpl) DelMonitorBase(ltTime int64) error { - return r.db().Where("create_time < ?", ltTime).Delete(&model.MonitorBase{}).Error -} - -// SelectMonitorBase 查询监控_基本信息 -func (r *MonitorImpl) SelectMonitorBase(query map[string]any) []model.MonitorBase { - var bases []model.MonitorBase - dbConn := r.db() - if query["neType"] != "" && query["neId"] != "" { - dbConn = dbConn.Where("ne_type = ? and ne_id = ?", query["neType"], query["neId"]) - } - dbConn = dbConn.Where("create_time >= ? and create_time <= ?", query["startTime"], query["endTime"]) - err := dbConn.Order("create_time asc").Find(&bases).Error - if err != nil { - logger.Errorf("SelectMonitorBase %v", err) - return bases - } - return bases -} - -// BatchCreateMonitorIO 批量创建监控_IO -func (r *MonitorImpl) BatchCreateMonitorIO(ioList []model.MonitorIO) error { - return r.db().CreateInBatches(ioList, len(ioList)).Error -} - -// DelMonitorIO 删除监控_IO -func (r *MonitorImpl) DelMonitorIO(ltTime int64) error { - return r.db().Where("create_time < ?", ltTime).Delete(&model.MonitorIO{}).Error -} - -// SelectMonitorIO 查询监控_IO -func (r *MonitorImpl) SelectMonitorIO(query map[string]any) []model.MonitorIO { - var ios []model.MonitorIO - dbConn := r.db() - if query["name"] != "" { - dbConn = dbConn.Where("name = ?", query["name"]) - } - if query["neType"] != "" && query["neId"] != "" { - dbConn = dbConn.Where("ne_type = ? and ne_id = ?", query["neType"], query["neId"]) - } - dbConn = dbConn.Where("create_time >= ? and create_time <= ?", query["startTime"], query["endTime"]) - err := dbConn.Order("create_time asc").Find(&ios).Error - if err != nil { - logger.Errorf("SelectMonitorIO %v", err) - return ios - } - return ios -} - -// BatchCreateMonitorNet 批量创建监控_网络 -func (r *MonitorImpl) BatchCreateMonitorNet(netList []model.MonitorNetwork) error { - return r.db().CreateInBatches(netList, len(netList)).Error -} - -// DelMonitorNet 删除监控_网络 -func (r *MonitorImpl) DelMonitorNet(ltTime int64) error { - return r.db().Where("create_time < ?", ltTime).Delete(&model.MonitorNetwork{}).Error -} - -// SelectMonitorNetwork 查询监控_网络 -func (r *MonitorImpl) SelectMonitorNetwork(query map[string]any) []model.MonitorNetwork { - var networks []model.MonitorNetwork - dbConn := r.db() - if query["name"] != "" { - dbConn = dbConn.Where("name = ?", query["name"]) - } else { - dbConn = dbConn.Where("name = ?", "all") - } - if query["neType"] != "" && query["neId"] != "" { - dbConn = dbConn.Where("ne_type = ? and ne_id = ?", query["neType"], query["neId"]) - } - dbConn = dbConn.Where("create_time >= ? and create_time <= ?", query["startTime"], query["endTime"]) - err := dbConn.Order("create_time asc").Find(&networks).Error - if err != nil { - logger.Errorf("SelectMonitorNetwork %v", err) - return networks - } - return networks -} diff --git a/src/modules/monitor/repository/sys_job.go b/src/modules/monitor/repository/sys_job.go index 89d50b08..57e35db8 100644 --- a/src/modules/monitor/repository/sys_job.go +++ b/src/modules/monitor/repository/sys_job.go @@ -1,29 +1,164 @@ package repository import ( + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" "be.ems/src/modules/monitor/model" ) -// ISysJob 调度任务表 数据层接口 -type ISysJob interface { - // SelectJobPage 分页查询调度任务集合 - SelectJobPage(query map[string]any) map[string]any +// NewSysJob 实例化数据层 +var NewSysJob = &SysJob{} - // SelectJobList 查询调度任务集合 - SelectJobList(sysJob model.SysJob) []model.SysJob +// SysJob 调度任务 数据层处理 +type SysJob struct{} - // SelectJobByIds 通过调度ID查询调度任务信息 - SelectJobByIds(jobIds []string) []model.SysJob +// SelectByPage 分页查询集合 +func (r SysJob) SelectByPage(query map[string]string) ([]model.SysJob, int64) { + tx := db.DB("").Model(&model.SysJob{}) + // 查询条件拼接 + if v, ok := query["jobName"]; ok && v != "" { + tx = tx.Where("job_name like concat(?, '%')", v) + } + if v, ok := query["jobGroup"]; ok && v != "" { + tx = tx.Where("job_group = ?", v) + } + if v, ok := query["invokeTarget"]; ok && v != "" { + tx = tx.Where("invoke_target like concat(?, '%')", v) + } + if v, ok := query["statusFlag"]; ok && v != "" { + tx = tx.Where("status_flag = ?", v) + } - // CheckUniqueJob 校验调度任务是否唯一 - CheckUniqueJob(sysJob model.SysJob) string + // 查询结果 + var total int64 = 0 + rows := []model.SysJob{} - // InsertJob 新增调度任务信息 - InsertJob(sysJob model.SysJob) string + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } - // UpdateJob 修改调度任务信息 - UpdateJob(sysJob model.SysJob) int64 - - // DeleteJobByIds 批量删除调度任务信息 - DeleteJobByIds(jobIds []string) int64 + // 查询数据分页 + 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 + } + return rows, total +} + +// Select 查询集合 +func (r SysJob) Select(sysJob model.SysJob) []model.SysJob { + tx := db.DB("").Model(&model.SysJob{}) + // 查询条件拼接 + if sysJob.JobName != "" { + tx = tx.Where("job_name like concat(?, '%')", sysJob.JobName) + } + if sysJob.JobGroup != "" { + tx = tx.Where("job_group = ?", sysJob.JobGroup) + } + if sysJob.InvokeTarget != "" { + tx = tx.Where("invoke_target like concat(?, '%')", sysJob.InvokeTarget) + } + if sysJob.StatusFlag != "" { + tx = tx.Where("status_flag = ?", sysJob.StatusFlag) + } + + // 查询数据 + rows := []model.SysJob{} + if err := tx.Order("job_id asc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询信息 +func (r SysJob) SelectByIds(jobIds []int64) []model.SysJob { + rows := []model.SysJob{} + if len(jobIds) <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysJob{}) + // 构建查询条件 + tx = tx.Where("job_id in ?", jobIds) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 返回新增数据ID +func (r SysJob) Insert(sysJob model.SysJob) int64 { + if sysJob.CreateBy != "" { + ms := time.Now().UnixMilli() + sysJob.UpdateBy = sysJob.CreateBy + sysJob.UpdateTime = ms + sysJob.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(&sysJob).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysJob.JobId +} + +// Update 修改信息 +func (r SysJob) Update(sysJob model.SysJob) int64 { + if sysJob.JobId <= 0 { + return 0 + } + if sysJob.UpdateBy != "" { + sysJob.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.SysJob{}) + // 构建查询条件 + tx = tx.Where("job_id = ?", sysJob.JobId) + tx = tx.Omit("config_id", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(sysJob).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 +func (r SysJob) DeleteByIds(jobIds []int64) int64 { + if len(jobIds) <= 0 { + return 0 + } + tx := db.DB("").Where("job_id in ?", jobIds) + if err := tx.Delete(&model.SysJob{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 校验信息是否唯一 +func (r SysJob) CheckUnique(sysJob model.SysJob) int64 { + tx := db.DB("").Model(&model.SysJob{}) + // 查询条件拼接 + if sysJob.JobName != "" { + tx = tx.Where("job_name = ?", sysJob.JobName) + } + if sysJob.JobGroup != "" { + tx = tx.Where("job_group = ?", sysJob.JobGroup) + } + + // 查询数据 + var id int64 = 0 + if err := tx.Select("job_id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id } diff --git a/src/modules/monitor/repository/sys_job.impl.go b/src/modules/monitor/repository/sys_job.impl.go deleted file mode 100644 index 0f88a57f..00000000 --- a/src/modules/monitor/repository/sys_job.impl.go +++ /dev/null @@ -1,343 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "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/monitor/model" -) - -// 实例化数据层 SysJobImpl 结构体 -var NewSysJobImpl = &SysJobImpl{ - selectSql: `select job_id, job_name, job_group, invoke_target, target_params, cron_expression, - misfire_policy, concurrent, status, save_log, create_by, create_time, remark from sys_job`, - - resultMap: map[string]string{ - "job_id": "JobID", - "job_name": "JobName", - "job_group": "JobGroup", - "invoke_target": "InvokeTarget", - "target_params": "TargetParams", - "cron_expression": "CronExpression", - "misfire_policy": "MisfirePolicy", - "concurrent": "Concurrent", - "status": "Status", - "save_log": "SaveLog", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - "remark": "Remark", - }, -} - -// SysJobImpl 调度任务表 数据层处理 -type SysJobImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysJobImpl) convertResultRows(rows []map[string]any) []model.SysJob { - arr := make([]model.SysJob, 0) - for _, row := range rows { - sysJob := model.SysJob{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&sysJob, keyMapper, value) - } - } - arr = append(arr, sysJob) - } - return arr -} - -// SelectJobPage 分页查询调度任务集合 -func (r *SysJobImpl) SelectJobPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["jobName"]; ok && v != "" { - conditions = append(conditions, "job_name like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["jobGroup"]; ok && v != "" { - conditions = append(conditions, "job_group = ?") - params = append(params, v) - } - if v, ok := query["invokeTarget"]; ok && v != "" { - conditions = append(conditions, "invoke_target like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "status = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysJob{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from sys_job" - 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) - - // 查询数据 - querySql := r.selectSql + whereSql + 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 -} - -// SelectJobList 查询调度任务集合 -func (r *SysJobImpl) SelectJobList(sysJob model.SysJob) []model.SysJob { - // 查询条件拼接 - var conditions []string - var params []any - if sysJob.JobName != "" { - conditions = append(conditions, "job_name like concat(?, '%')") - params = append(params, sysJob.JobName) - } - if sysJob.JobGroup != "" { - conditions = append(conditions, "job_group = ?") - params = append(params, sysJob.JobGroup) - } - if sysJob.InvokeTarget != "" { - conditions = append(conditions, "invoke_target like concat(?, '%')") - params = append(params, sysJob.InvokeTarget) - } - if sysJob.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, sysJob.Status) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysJob{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectJobByIds 通过调度ID查询调度任务信息 -func (r *SysJobImpl) SelectJobByIds(jobIds []string) []model.SysJob { - placeholder := repo.KeyPlaceholderByQuery(len(jobIds)) - querySql := r.selectSql + " where job_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(jobIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysJob{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueJob 校验调度任务是否唯一 -func (r *SysJobImpl) CheckUniqueJob(sysJob model.SysJob) string { - // 查询条件拼接 - var conditions []string - var params []any - if sysJob.JobName != "" { - conditions = append(conditions, "job_name = ?") - params = append(params, sysJob.JobName) - } - if sysJob.JobGroup != "" { - conditions = append(conditions, "job_group = ?") - params = append(params, sysJob.JobGroup) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select job_id as 'str' from sys_job " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// InsertJob 新增调度任务信息 -func (r *SysJobImpl) InsertJob(sysJob model.SysJob) string { - // 参数拼接 - params := make(map[string]any) - if sysJob.JobID != "" { - params["job_id"] = sysJob.JobID - } - if sysJob.JobName != "" { - params["job_name"] = sysJob.JobName - } - if sysJob.JobGroup != "" { - params["job_group"] = sysJob.JobGroup - } - if sysJob.InvokeTarget != "" { - params["invoke_target"] = sysJob.InvokeTarget - } - params["target_params"] = sysJob.TargetParams - if sysJob.CronExpression != "" { - params["cron_expression"] = sysJob.CronExpression - } - if sysJob.MisfirePolicy != "" { - params["misfire_policy"] = sysJob.MisfirePolicy - } - if sysJob.Concurrent != "" { - params["concurrent"] = sysJob.Concurrent - } - if sysJob.Status != "" { - params["status"] = sysJob.Status - } - if sysJob.SaveLog != "" { - params["save_log"] = sysJob.SaveLog - } - params["remark"] = sysJob.Remark - if sysJob.CreateBy != "" { - params["create_by"] = sysJob.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_job (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// UpdateJob 修改调度任务信息 -func (r *SysJobImpl) UpdateJob(sysJob model.SysJob) int64 { - // 参数拼接 - params := make(map[string]any) - if sysJob.JobName != "" { - params["job_name"] = sysJob.JobName - } - if sysJob.JobGroup != "" { - params["job_group"] = sysJob.JobGroup - } - if sysJob.InvokeTarget != "" { - params["invoke_target"] = sysJob.InvokeTarget - } - params["target_params"] = sysJob.TargetParams - if sysJob.CronExpression != "" { - params["cron_expression"] = sysJob.CronExpression - } - if sysJob.MisfirePolicy != "" { - params["misfire_policy"] = sysJob.MisfirePolicy - } - if sysJob.Concurrent != "" { - params["concurrent"] = sysJob.Concurrent - } - if sysJob.Status != "" { - params["status"] = sysJob.Status - } - if sysJob.SaveLog != "" { - params["save_log"] = sysJob.SaveLog - } - params["remark"] = sysJob.Remark - if sysJob.UpdateBy != "" { - params["update_by"] = sysJob.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update sys_job set " + strings.Join(keys, ",") + " where job_id = ?" - - // 执行更新 - values = append(values, sysJob.JobID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteJobByIds 批量删除调度任务信息 -func (r *SysJobImpl) DeleteJobByIds(jobIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(jobIds)) - sql := "delete from sys_job where job_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(jobIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/monitor/repository/sys_job_log.go b/src/modules/monitor/repository/sys_job_log.go index 61375c11..2152bfb0 100644 --- a/src/modules/monitor/repository/sys_job_log.go +++ b/src/modules/monitor/repository/sys_job_log.go @@ -1,26 +1,144 @@ package repository import ( + "fmt" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" "be.ems/src/modules/monitor/model" ) -// 调度任务日志表 数据层接口 -type ISysJobLog interface { - // 分页查询调度任务日志集合 - SelectJobLogPage(query map[string]any) map[string]any +// NewSysJobLog 实例化数据层 +var NewSysJobLog = &SysJobLog{} - // 查询调度任务日志集合 - SelectJobLogList(sysJobLog model.SysJobLog) []model.SysJobLog +// SysJobLog 调度任务日志表 数据层处理 +type SysJobLog struct{} - // 通过调度ID查询调度任务日志信息 - SelectJobLogById(jobLogId string) model.SysJobLog +// SelectByPage 分页查询集合 +func (r SysJobLog) SelectByPage(query map[string]string) ([]model.SysJobLog, int64) { + tx := db.DB("").Model(&model.SysJobLog{}) + // 查询条件拼接 + if v, ok := query["jobName"]; ok && v != "" { + tx = tx.Where("job_name = ?", v) + } + if v, ok := query["jobGroup"]; ok && v != "" { + tx = tx.Where("job_group = ?", v) + } + if v, ok := query["statusFlag"]; ok && v != "" { + tx = tx.Where("status_flag = ?", v) + } + if v, ok := query["invokeTarget"]; ok && v != "" { + tx = tx.Where("invoke_target like concat(?, '%')", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s000", v) + tx = tx.Where("create_time >= ?", v) + } else if len(v) == 13 { + tx = tx.Where("create_time >= ?", v) + } + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s999", v) + tx = tx.Where("create_time <= ?", v) + } else if len(v) == 13 { + tx = tx.Where("create_time <= ?", v) + } + } - // 新增调度任务日志信息 - InsertJobLog(sysJobLog model.SysJobLog) string + // 查询结果 + var total int64 = 0 + rows := []model.SysJobLog{} - // 批量删除调度任务日志信息 - DeleteJobLogByIds(jobLogId []string) int64 + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } - // 清空调度任务日志 - CleanJobLog() error + // 查询数据分页 + 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 + } + return rows, total +} + +// Select 查询集合 +func (r SysJobLog) Select(sysJobLog model.SysJobLog) []model.SysJobLog { + tx := db.DB("").Model(&model.SysJobLog{}) + // 查询条件拼接 + if sysJobLog.JobName != "" { + tx = tx.Where("job_name like concat(?, '%')", sysJobLog.JobName) + } + if sysJobLog.JobGroup != "" { + tx = tx.Where("job_group = ?", sysJobLog.JobGroup) + } + if sysJobLog.StatusFlag != "" { + tx = tx.Where("status_flag = ?", sysJobLog.StatusFlag) + } + if sysJobLog.InvokeTarget != "" { + tx = tx.Where("invoke_target like concat(?, '%')", sysJobLog.InvokeTarget) + } + + // 查询数据 + rows := []model.SysJobLog{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectById 通过ID查询信息 +func (r SysJobLog) SelectById(logId int64) model.SysJobLog { + item := model.SysJobLog{} + if logId <= 0 { + return item + } + tx := db.DB("").Model(&model.SysJobLog{}) + // 构建查询条件 + tx = tx.Where("log_id = ?", logId) + // 查询数据 + if err := tx.Limit(1).Find(&item).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return item + } + return item +} + +// Insert 新增信息 +func (r SysJobLog) Insert(sysJobLog model.SysJobLog) int64 { + // 执行插入 + if err := db.DB("").Create(&sysJobLog).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysJobLog.LogId +} + +// DeleteByIds 批量删除信息 +func (r SysJobLog) DeleteByIds(logIds []int64) int64 { + if len(logIds) <= 0 { + return 0 + } + tx := db.DB("").Where("log_id in ?", logIds) + if err := tx.Delete(&model.SysJobLog{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// Clean 清空集合数据 +func (r SysJobLog) Clean() int64 { + tx := db.DB("").Delete(&model.SysJobLog{}) + if err := tx.Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/monitor/repository/sys_job_log.impl.go b/src/modules/monitor/repository/sys_job_log.impl.go deleted file mode 100644 index 1f8a0d95..00000000 --- a/src/modules/monitor/repository/sys_job_log.impl.go +++ /dev/null @@ -1,269 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "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/monitor/model" -) - -// 实例化数据层 SysJobLogImpl 结构体 -var NewSysJobLogImpl = &SysJobLogImpl{ - selectSql: `select job_log_id, job_name, job_group, invoke_target, - target_params, job_msg, status, create_time, cost_time from sys_job_log`, - - resultMap: map[string]string{ - "job_log_id": "JobLogID", - "job_name": "JobName", - "job_group": "JobGroup", - "invoke_target": "InvokeTarget", - "target_params": "TargetParams", - "job_msg": "JobMsg", - "status": "Status", - "create_time": "CreateTime", - "cost_time": "CostTime", - }, -} - -// SysJobLogImpl 调度任务日志表 数据层处理 -type SysJobLogImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysJobLogImpl) convertResultRows(rows []map[string]any) []model.SysJobLog { - arr := make([]model.SysJobLog, 0) - for _, row := range rows { - sysJobLog := model.SysJobLog{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&sysJobLog, keyMapper, value) - } - } - arr = append(arr, sysJobLog) - } - return arr -} - -// 分页查询调度任务日志集合 -func (r *SysJobLogImpl) SelectJobLogPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["jobName"]; ok && v != "" { - conditions = append(conditions, "job_name = ?") - params = append(params, v) - } - if v, ok := query["jobGroup"]; ok && v != "" { - conditions = append(conditions, "job_group = ?") - params = append(params, v) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "status = ?") - params = append(params, v) - } - if v, ok := query["invokeTarget"]; ok && v != "" { - conditions = append(conditions, "invoke_target like concat(?, '%')") - params = append(params, v) - } - beginTime, ok := query["beginTime"] - if !ok { - beginTime, ok = query["params[beginTime]"] - } - if ok && beginTime != "" { - conditions = append(conditions, "create_time >= ?") - params = append(params, parse.Number(beginTime.(string))) - } - endTime, ok := query["endTime"] - if !ok { - endTime, ok = query["params[endTime]"] - } - if ok && endTime != "" { - conditions = append(conditions, "create_time <= ?") - params = append(params, parse.Number(endTime.(string))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysJobLog{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from sys_job_log" - 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 := " order by job_log_id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + 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 -} - -// 查询调度任务日志集合 -func (r *SysJobLogImpl) SelectJobLogList(sysJobLog model.SysJobLog) []model.SysJobLog { - // 查询条件拼接 - var conditions []string - var params []any - if sysJobLog.JobName != "" { - conditions = append(conditions, "job_name like concat(?, '%')") - params = append(params, sysJobLog.JobName) - } - if sysJobLog.JobGroup != "" { - conditions = append(conditions, "job_group = ?") - params = append(params, sysJobLog.JobGroup) - } - if sysJobLog.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, sysJobLog.Status) - } - if sysJobLog.InvokeTarget != "" { - conditions = append(conditions, "invoke_target like concat(?, '%')") - params = append(params, sysJobLog.InvokeTarget) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysJobLog{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// 通过调度ID查询调度任务日志信息 -func (r *SysJobLogImpl) SelectJobLogById(jobLogId string) model.SysJobLog { - querySql := r.selectSql + " where job_log_id = ?" - results, err := datasource.RawDB("", querySql, []any{jobLogId}) - if err != nil { - logger.Errorf("query err => %v", err) - return model.SysJobLog{} - } - // 转换实体 - rows := r.convertResultRows(results) - if len(rows) > 0 { - return rows[0] - } - return model.SysJobLog{} -} - -// 新增调度任务日志信息 -func (r *SysJobLogImpl) InsertJobLog(sysJobLog model.SysJobLog) string { - // 参数拼接 - params := make(map[string]any) - params["create_time"] = time.Now().UnixMilli() - if sysJobLog.JobLogID != "" { - params["job_log_id"] = sysJobLog.JobLogID - } - if sysJobLog.JobName != "" { - params["job_name"] = sysJobLog.JobName - } - if sysJobLog.JobGroup != "" { - params["job_group"] = sysJobLog.JobGroup - } - if sysJobLog.InvokeTarget != "" { - params["invoke_target"] = sysJobLog.InvokeTarget - } - if sysJobLog.TargetParams != "" { - params["target_params"] = sysJobLog.TargetParams - } - if sysJobLog.JobMsg != "" { - params["job_msg"] = sysJobLog.JobMsg - } - if sysJobLog.Status != "" { - params["status"] = sysJobLog.Status - } - if sysJobLog.CostTime > 0 { - params["cost_time"] = sysJobLog.CostTime - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_job_log (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// 批量删除调度任务日志信息 -func (r *SysJobLogImpl) DeleteJobLogByIds(jobLogIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(jobLogIds)) - sql := "delete from sys_job_log where job_log_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(jobLogIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// 清空调度任务日志 -func (r *SysJobLogImpl) CleanJobLog() error { - sql := "truncate table sys_job_log" - _, err := datasource.ExecDB("", sql, []any{}) - return err -} diff --git a/src/modules/monitor/service/monitor.go b/src/modules/monitor/service/monitor.go index 285a265b..d42ab70b 100644 --- a/src/modules/monitor/service/monitor.go +++ b/src/modules/monitor/service/monitor.go @@ -9,6 +9,7 @@ import ( "be.ems/src/modules/monitor/model" "be.ems/src/modules/monitor/repository" systemService "be.ems/src/modules/system/service" + "github.com/shirou/gopsutil/v4/cpu" "github.com/shirou/gopsutil/v4/disk" "github.com/shirou/gopsutil/v4/load" @@ -18,18 +19,16 @@ import ( // 实例化服务层 Monitor 结构体 var NewMonitor = &Monitor{ - sysConfigService: systemService.NewSysConfigImpl, - monitorRepository: repository.NewMonitorImpl, + sysConfigService: systemService.NewSysConfig, + monitorRepository: repository.NewMonitor, diskIO: make(chan []disk.IOCountersStat, 2), netIO: make(chan []net.IOCountersStat, 2), } // Monitor 服务器系统相关信息 服务层处理 type Monitor struct { - // 参数配置服务 - sysConfigService systemService.ISysConfig - // 监控服务资源数据信息 - monitorRepository repository.IMonitor + sysConfigService *systemService.SysConfig // 参数配置服务 + monitorRepository *repository.Monitor // 监控服务资源数据信息 // 磁盘网络IO 数据通道 diskIO chan ([]disk.IOCountersStat) netIO chan ([]net.IOCountersStat) @@ -59,8 +58,8 @@ func (s *Monitor) RunMonitor() { memoryInfo, _ := mem.VirtualMemory() itemBase.Memory = memoryInfo.UsedPercent - if err := s.monitorRepository.CreateMonitorBase(itemBase); err != nil { - logger.Errorf("CreateMonitorBase err: %v", err) + if err := s.monitorRepository.InsertByBase(itemBase); err != nil { + logger.Errorf("InsertByBase err: %v", err) } // 将当前资源发送到chan中处理保存 @@ -68,13 +67,13 @@ func (s *Monitor) RunMonitor() { s.loadNetIO() // 监控系统资源-保留天数 - storeDays := s.sysConfigService.SelectConfigValueByKey("monitor.sysResource.storeDays") + storeDays := s.sysConfigService.FindValueByKey("monitor.sysResource.storeDays") if storeDays != "" { storeDays, _ := strconv.Atoi(storeDays) ltTime := time.Now().AddDate(0, 0, -storeDays).UnixMilli() - _ = s.monitorRepository.DelMonitorBase(ltTime) - _ = s.monitorRepository.DelMonitorIO(ltTime) - _ = s.monitorRepository.DelMonitorNet(ltTime) + _ = s.monitorRepository.DeleteByBase(ltTime) + _ = s.monitorRepository.DeleteByIO(ltTime) + _ = s.monitorRepository.DeleteByNetwork(ltTime) } } @@ -171,8 +170,8 @@ func (s *Monitor) saveIODataToDB(ctx context.Context, interval float64) { } } } - if err := s.monitorRepository.BatchCreateMonitorIO(ioList); err != nil { - logger.Errorf("BatchCreateMonitorIO err: %v", err) + if err := s.monitorRepository.BatchInsertByIO(ioList); err != nil { + logger.Errorf("BatchInsertByIO err: %v", err) } s.diskIO <- ioStat2 } @@ -214,8 +213,8 @@ func (s *Monitor) saveNetDataToDB(ctx context.Context, interval float64) { } } - if err := s.monitorRepository.BatchCreateMonitorNet(netList); err != nil { - logger.Errorf("BatchCreateMonitorNet err: %v", err) + if err := s.monitorRepository.BatchInsertByNetwork(netList); err != nil { + logger.Errorf("BatchInsertByNetwork err: %v", err) } s.netIO <- netStat2 } @@ -223,10 +222,10 @@ func (s *Monitor) saveNetDataToDB(ctx context.Context, interval float64) { } } -// SelectMonitorInfo 查询监控资源信息 -func (s *Monitor) SelectMonitorInfo(query map[string]any) map[string]any { +// FindInfo 查询监控资源信息 +func (s *Monitor) FindInfo(query map[string]any) map[string]any { infoType := query["type"] - startTimeMilli := query["startTime"] + beginTimeMilli := query["beginTime"] endTimeMilli := query["endTime"] neType := query["neType"] neId := query["neId"] @@ -237,8 +236,8 @@ func (s *Monitor) SelectMonitorInfo(query map[string]any) map[string]any { // 基本信息 if infoType == "all" || infoType == "load" || infoType == "cpu" || infoType == "memory" { - rows := s.monitorRepository.SelectMonitorBase(map[string]any{ - "startTime": startTimeMilli, + rows := s.monitorRepository.SelectByBase(map[string]any{ + "beginTime": beginTimeMilli, "endTime": endTimeMilli, "neType": neType, "neId": neId, @@ -248,8 +247,8 @@ func (s *Monitor) SelectMonitorInfo(query map[string]any) map[string]any { // 磁盘IO if infoType == "all" || infoType == "io" { - rows := s.monitorRepository.SelectMonitorIO(map[string]any{ - "startTime": startTimeMilli, + rows := s.monitorRepository.SelectByIO(map[string]any{ + "beginTime": beginTimeMilli, "endTime": endTimeMilli, "neType": neType, "neId": neId, @@ -260,8 +259,8 @@ func (s *Monitor) SelectMonitorInfo(query map[string]any) map[string]any { // 网络 if infoType == "all" || infoType == "network" { - rows := s.monitorRepository.SelectMonitorNetwork(map[string]any{ - "startTime": startTimeMilli, + rows := s.monitorRepository.SelectByNetwork(map[string]any{ + "beginTime": beginTimeMilli, "endTime": endTimeMilli, "neType": neType, "neId": neId, diff --git a/src/modules/monitor/service/sys_job.go b/src/modules/monitor/service/sys_job.go index af1ca91e..7f69db85 100644 --- a/src/modules/monitor/service/sys_job.go +++ b/src/modules/monitor/service/sys_job.go @@ -2,131 +2,112 @@ package service import ( "fmt" + "strconv" - "be.ems/src/framework/constants/common" + "be.ems/src/framework/constants" "be.ems/src/framework/cron" + "be.ems/src/framework/utils/file" "be.ems/src/modules/monitor/model" "be.ems/src/modules/monitor/repository" + systemService "be.ems/src/modules/system/service" ) -// 实例化服务层 SysJob 结构体 +// NewSysJob 服务层实例化 var NewSysJob = &SysJob{ - sysJobRepository: repository.NewSysJobImpl, + sysJobRepository: repository.NewSysJob, + sysDictTypeService: systemService.NewSysDictType, } // SysJob 调度任务 服务层处理 type SysJob struct { - // 调度任务数据信息 - sysJobRepository repository.ISysJob + sysJobRepository *repository.SysJob // 调度任务数据信息 + sysDictTypeService *systemService.SysDictType // 字典类型服务 } -// SelectJobPage 分页查询调度任务集合 -func (r *SysJob) SelectJobPage(query map[string]any) map[string]any { - return r.sysJobRepository.SelectJobPage(query) +// FindByPage 分页查询 +func (s SysJob) FindByPage(query map[string]string) ([]model.SysJob, int64) { + return s.sysJobRepository.SelectByPage(query) } -// SelectJobList 查询调度任务集合 -func (r *SysJob) SelectJobList(sysJob model.SysJob) []model.SysJob { - return r.sysJobRepository.SelectJobList(sysJob) +// Find 查询 +func (s SysJob) Find(sysJob model.SysJob) []model.SysJob { + return s.sysJobRepository.Select(sysJob) } -// SelectJobById 通过调度ID查询调度任务信息 -func (r *SysJob) SelectJobById(jobId string) model.SysJob { - if jobId == "" { +// FindById 通过ID查询 +func (s SysJob) FindById(jobId int64) model.SysJob { + if jobId <= 0 { return model.SysJob{} } - jobs := r.sysJobRepository.SelectJobByIds([]string{jobId}) + jobs := s.sysJobRepository.SelectByIds([]int64{jobId}) if len(jobs) > 0 { return jobs[0] } return model.SysJob{} } -// CheckUniqueJobName 校验调度任务名称和组是否唯一 -func (r *SysJob) CheckUniqueJobName(jobName, jobGroup, jobId string) bool { - uniqueId := r.sysJobRepository.CheckUniqueJob(model.SysJob{ +// Insert 新增 +func (s SysJob) Insert(sysJob model.SysJob) int64 { + insertId := s.sysJobRepository.Insert(sysJob) + if insertId > 0 && sysJob.StatusFlag == constants.STATUS_YES { + sysJob.JobId = insertId + s.insertQueueJob(sysJob, true) + } + return insertId +} + +// Update 修改 +func (s SysJob) Update(sysJob model.SysJob) int64 { + rows := s.sysJobRepository.Update(sysJob) + if rows > 0 { + //状态正常添加队列任务 + if sysJob.StatusFlag == constants.STATUS_YES { + s.insertQueueJob(sysJob, true) + } + // 状态禁用删除队列任务 + if sysJob.StatusFlag == constants.STATUS_NO { + s.deleteQueueJob(sysJob) + } + } + return rows +} + +// DeleteByIds 批量删除 +func (s SysJob) DeleteByIds(jobIds []int64) (int64, error) { + // 检查是否存在 + jobs := s.sysJobRepository.SelectByIds(jobIds) + if len(jobs) <= 0 { + return 0, fmt.Errorf("没有权限访问调度任务数据!") + } + if len(jobs) == len(jobIds) { + // 清除任务 + for _, job := range jobs { + s.deleteQueueJob(job) + } + return s.sysJobRepository.DeleteByIds(jobIds), nil + } + return 0, fmt.Errorf("删除调度任务信息失败!") +} + +// CheckUniqueByJobName 校验调度任务名称和组是否唯一 +func (s SysJob) CheckUniqueByJobName(jobName, jobGroup string, jobId int64) bool { + uniqueId := s.sysJobRepository.CheckUnique(model.SysJob{ JobName: jobName, JobGroup: jobGroup, }) if uniqueId == jobId { return true } - return uniqueId == "" + return uniqueId == 0 } -// InsertJob 新增调度任务信息 -func (r *SysJob) InsertJob(sysJob model.SysJob) string { - insertId := r.sysJobRepository.InsertJob(sysJob) - if insertId == "" && sysJob.Status == common.STATUS_YES { - sysJob.JobID = insertId - r.insertQueueJob(sysJob, true) - } - return insertId -} - -// UpdateJob 修改调度任务信息 -func (r *SysJob) UpdateJob(sysJob model.SysJob) int64 { - rows := r.sysJobRepository.UpdateJob(sysJob) - if rows > 0 { - //状态正常添加队列任务 - if sysJob.Status == common.STATUS_YES { - r.insertQueueJob(sysJob, true) - } - // 状态禁用删除队列任务 - if sysJob.Status == common.STATUS_NO { - r.deleteQueueJob(sysJob) - } - } - return rows -} - -// DeleteJobByIds 批量删除调度任务信息 -func (r *SysJob) DeleteJobByIds(jobIds []string) (int64, error) { - // 检查是否存在 - jobs := r.sysJobRepository.SelectJobByIds(jobIds) - if len(jobs) <= 0 { - // 没有可访问调度任务数据! - return 0, fmt.Errorf("there is no accessible scheduling task data") - } - if len(jobs) == len(jobIds) { - // 清除任务 - for _, job := range jobs { - r.deleteQueueJob(job) - } - rows := r.sysJobRepository.DeleteJobByIds(jobIds) - return rows, nil - } - // 删除调度任务信息失败! - return 0, fmt.Errorf("failed to delete scheduling task information") -} - -// ResetQueueJob 重置初始调度任务 -func (r *SysJob) ResetQueueJob() { - // 获取注册的队列名称 - queueNames := cron.QueueNames() - if len(queueNames) == 0 { - return - } - // 查询系统中定义状态为正常启用的任务 - sysJobs := r.sysJobRepository.SelectJobList(model.SysJob{ - Status: common.STATUS_YES, - }) - for _, sysJob := range sysJobs { - for _, name := range queueNames { - if name == sysJob.InvokeTarget { - r.insertQueueJob(sysJob, true) - } - } - } -} - -// RunQueueJob 立即运行一次调度任务 -func (r *SysJob) RunQueueJob(sysJob model.SysJob) bool { - return r.insertQueueJob(sysJob, false) +// Run 立即运行一次调度任务 +func (s SysJob) Run(sysJob model.SysJob) bool { + return s.insertQueueJob(sysJob, false) } // insertQueueJob 添加调度任务 -func (r *SysJob) insertQueueJob(sysJob model.SysJob, repeat bool) bool { +func (s SysJob) insertQueueJob(sysJob model.SysJob, repeat bool) bool { // 获取队列 Processor queue := cron.GetQueue(sysJob.InvokeTarget) if queue.Name != sysJob.InvokeTarget { @@ -143,7 +124,7 @@ func (r *SysJob) insertQueueJob(sysJob model.SysJob, repeat bool) bool { if !repeat { // 执行单次任务 status := queue.RunJob(options, cron.JobOptions{ - JobId: sysJob.JobID, + JobId: fmt.Sprint(sysJob.JobId), }) // 执行中或等待中的都返回正常 return status == cron.Active || status == cron.Waiting @@ -151,19 +132,101 @@ func (r *SysJob) insertQueueJob(sysJob model.SysJob, repeat bool) bool { // 执行重复任务 queue.RunJob(options, cron.JobOptions{ - JobId: sysJob.JobID, + JobId: fmt.Sprint(sysJob.JobId), Cron: sysJob.CronExpression, }) - return true } // deleteQueueJob 删除调度任务 -func (r *SysJob) deleteQueueJob(sysJob model.SysJob) bool { +func (s SysJob) deleteQueueJob(sysJob model.SysJob) bool { // 获取队列 Processor queue := cron.GetQueue(sysJob.InvokeTarget) if queue.Name != sysJob.InvokeTarget { return false } - return queue.RemoveJob(sysJob.JobID) + return queue.RemoveJob(fmt.Sprint(sysJob.JobId)) +} + +// Reset 重置初始调度任务 +func (s SysJob) Reset() { + // 获取注册的队列名称 + queueNames := cron.QueueNames() + if len(queueNames) == 0 { + return + } + // 查询系统中定义状态为正常启用的任务 + sysJobs := s.sysJobRepository.Select(model.SysJob{ + StatusFlag: constants.STATUS_YES, + }) + for _, sysJob := range sysJobs { + for _, name := range queueNames { + if name == sysJob.InvokeTarget { + s.deleteQueueJob(sysJob) + s.insertQueueJob(sysJob, true) + } + } + } +} + +// ExportData 导出数据表格 +func (s SysJob) ExportData(rows []model.SysJob, fileName string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "任务编号", + "B1": "任务名称", + "C1": "任务组名", + "D1": "调用目标", + "E1": "传入参数", + "F1": "执行表达式", + "G1": "出错策略", + "H1": "并发执行", + "I1": "任务状态", + "J1": "备注说明", + } + // 读取任务组名字典数据 + dictSysJobGroup := s.sysDictTypeService.FindDataByType("sys_job_group") + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 任务组名 + sysJobGroup := "" + for _, v := range dictSysJobGroup { + if row.JobGroup == v.DataValue { + sysJobGroup = v.DataLabel + break + } + } + misfirePolicy := "放弃执行" + if row.MisfirePolicy == "1" { + misfirePolicy = "立即执行" + } else if row.MisfirePolicy == "2" { + misfirePolicy = "执行一次" + } + concurrent := "禁止" + if row.Concurrent == "1" { + concurrent = "允许" + } + // 状态 + statusValue := "失败" + if row.StatusFlag == constants.STATUS_YES { + statusValue = "成功" + } + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.JobId, + "B" + idx: row.JobName, + "C" + idx: sysJobGroup, + "D" + idx: row.InvokeTarget, + "E" + idx: row.TargetParams, + "F" + idx: row.CronExpression, + "G" + idx: misfirePolicy, + "H" + idx: concurrent, + "I" + idx: statusValue, + "J" + idx: row.Remark, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") } diff --git a/src/modules/monitor/service/sys_job_log.go b/src/modules/monitor/service/sys_job_log.go index 185c17a0..3f5914c7 100644 --- a/src/modules/monitor/service/sys_job_log.go +++ b/src/modules/monitor/service/sys_job_log.go @@ -1,42 +1,97 @@ package service import ( + "strconv" + + "be.ems/src/framework/constants" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" "be.ems/src/modules/monitor/model" "be.ems/src/modules/monitor/repository" + systemService "be.ems/src/modules/system/service" ) -// 实例化服务层 SysJobLog 结构体 +// NewSysJobLog 服务层实例化 var NewSysJobLog = &SysJobLog{ - sysJobLogRepository: repository.NewSysJobLogImpl, + sysJobLogRepository: repository.NewSysJobLog, + sysDictTypeService: systemService.NewSysDictType, } // SysJobLog 调度任务日志 服务层处理 type SysJobLog struct { - // 调度任务日志数据信息 - sysJobLogRepository repository.ISysJobLog + sysJobLogRepository *repository.SysJobLog // 调度任务日志数据信息 + sysDictTypeService *systemService.SysDictType // 字典类型服务 } -// SelectJobLogPage 分页查询调度任务日志集合 -func (s *SysJobLog) SelectJobLogPage(query map[string]any) map[string]any { - return s.sysJobLogRepository.SelectJobLogPage(query) +// FindByPage 分页查询 +func (s SysJobLog) FindByPage(query map[string]string) ([]model.SysJobLog, int64) { + return s.sysJobLogRepository.SelectByPage(query) } -// SelectJobLogList 查询调度任务日志集合 -func (s *SysJobLog) SelectJobLogList(sysJobLog model.SysJobLog) []model.SysJobLog { - return s.sysJobLogRepository.SelectJobLogList(sysJobLog) +// Find 查询 +func (s SysJobLog) Find(sysJobLog model.SysJobLog) []model.SysJobLog { + return s.sysJobLogRepository.Select(sysJobLog) } -// SelectJobLogById 通过调度ID查询调度任务日志信息 -func (s *SysJobLog) SelectJobLogById(jobLogId string) model.SysJobLog { - return s.sysJobLogRepository.SelectJobLogById(jobLogId) +// FindById 通过ID查询 +func (s SysJobLog) FindById(logId int64) model.SysJobLog { + return s.sysJobLogRepository.SelectById(logId) } -// DeleteJobLogByIds 批量删除调度任务日志信息 -func (s *SysJobLog) DeleteJobLogByIds(jobLogIds []string) int64 { - return s.sysJobLogRepository.DeleteJobLogByIds(jobLogIds) +// RemoveByIds 批量删除 +func (s SysJobLog) DeleteByIds(logIds []int64) int64 { + return s.sysJobLogRepository.DeleteByIds(logIds) } -// CleanJobLog 清空调度任务日志 -func (s *SysJobLog) CleanJobLog() error { - return s.sysJobLogRepository.CleanJobLog() +// Clean 清空 +func (s SysJobLog) Clean() int64 { + return s.sysJobLogRepository.Clean() +} + +// ExportData 导出数据表格 +func (s SysJobLog) ExportData(rows []model.SysJobLog, fileName string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "日志序号", + "B1": "任务名称", + "C1": "任务组名", + "D1": "调用目标", + "E1": "传入参数", + "F1": "日志信息", + "G1": "执行状态", + "H1": "记录时间", + } + // 读取任务组名字典数据 + dictSysJobGroup := s.sysDictTypeService.FindDataByType("sys_job_group") + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 任务组名 + sysJobGroup := "" + for _, v := range dictSysJobGroup { + if row.JobGroup == v.DataValue { + sysJobGroup = v.DataLabel + break + } + } + // 状态 + statusValue := "失败" + if row.StatusFlag == constants.STATUS_YES { + statusValue = "成功" + } + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.LogId, + "B" + idx: row.JobName, + "C" + idx: sysJobGroup, + "D" + idx: row.InvokeTarget, + "E" + idx: row.TargetParams, + "F" + idx: row.JobMsg, + "G" + idx: statusValue, + "H" + idx: date.ParseDateToStr(row.CreateTime, date.YYYY_MM_DD_HH_MM_SS), + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") } diff --git a/src/modules/monitor/service/sys_user_online.go b/src/modules/monitor/service/sys_user_online.go index 1d7115d8..d48368b5 100644 --- a/src/modules/monitor/service/sys_user_online.go +++ b/src/modules/monitor/service/sys_user_online.go @@ -1,7 +1,7 @@ package service import ( - "be.ems/src/framework/vo" + "be.ems/src/framework/token" "be.ems/src/modules/monitor/model" ) @@ -11,23 +11,23 @@ var NewSysUserOnline = &SysUserOnline{} // SysUserOnline 在线用户 服务层处理 type SysUserOnline struct{} -// LoginUserToUserOnline 设置在线用户信息 -func (r *SysUserOnline) LoginUserToUserOnline(loginUser vo.LoginUser) model.SysUserOnline { - if loginUser.UserID == "" { +// TokenInfoToUserOnline 在线用户信息 +func (s SysUserOnline) TokenInfoToUserOnline(tokenInfo token.TokenInfo) model.SysUserOnline { + if tokenInfo.UserId <= 0 { return model.SysUserOnline{} } sysUserOnline := model.SysUserOnline{ - TokenID: loginUser.UUID, - UserName: loginUser.User.UserName, - IPAddr: loginUser.IPAddr, - LoginLocation: loginUser.LoginLocation, - Browser: loginUser.Browser, - OS: loginUser.OS, - LoginTime: loginUser.LoginTime, + TokenID: tokenInfo.UUID, + UserName: tokenInfo.User.UserName, + LoginIp: tokenInfo.LoginIp, + LoginLocation: tokenInfo.LoginLocation, + Browser: tokenInfo.Browser, + OS: tokenInfo.OS, + LoginTime: tokenInfo.LoginTime, } - if loginUser.User.DeptID != "" { - sysUserOnline.DeptName = loginUser.User.Dept.DeptName + if tokenInfo.User.DeptId > 0 { + sysUserOnline.DeptName = tokenInfo.User.Dept.DeptName } return sysUserOnline } diff --git a/src/modules/monitor/service/system_info.go b/src/modules/monitor/service/system_info.go index 3fda7b7b..9b1ac3a5 100644 --- a/src/modules/monitor/service/system_info.go +++ b/src/modules/monitor/service/system_info.go @@ -91,9 +91,9 @@ func (s *SystemInfo) MemoryInfo() map[string]any { // CPUInfo CPU信息 func (s *SystemInfo) CPUInfo() map[string]any { - var core int = 0 - var speed string = "未知" - var model string = "未知" + var core = 0 + var speed = "-" + var model = "-" cpuInfo, err := cpu.Info() if err == nil { core = runtime.NumCPU() @@ -101,11 +101,11 @@ func (s *SystemInfo) CPUInfo() map[string]any { model = strings.TrimSpace(cpuInfo[0].ModelName) } - useds := []string{} + var used []string cpuPercent, err := cpu.Percent(0, true) if err == nil { for _, v := range cpuPercent { - useds = append(useds, fmt.Sprintf("%.2f", v)) + used = append(used, fmt.Sprintf("%.2f", v)) } } @@ -113,39 +113,39 @@ func (s *SystemInfo) CPUInfo() map[string]any { "model": model, "speed": speed, "core": core, - "coreUsed": useds, + "coreUsed": used, } } // NetworkInfo 网络信息 func (s *SystemInfo) NetworkInfo() map[string]string { - ipAddrs := make(map[string]string) + ipAdders := make(map[string]string) interfaces, err := net.Interfaces() if err == nil { - for _, iface := range interfaces { - name := iface.Name + for _, v := range interfaces { + name := v.Name if name[len(name)-1] == '0' { name = name[0 : len(name)-1] name = strings.Trim(name, "") } // ignore localhost - if name == "lo" { + if strings.HasPrefix(name, "lo") || strings.HasPrefix(name, "veth") || strings.HasPrefix(name, "Loopback") { continue } - var addrs []string - for _, v := range iface.Addrs { + var adders []string + for _, v := range v.Addrs { prefix := strings.Split(v.Addr, "/")[0] if strings.Contains(prefix, "::") { - addrs = append(addrs, fmt.Sprintf("IPv6 %s", prefix)) + adders = append(adders, fmt.Sprintf("IPv6 %s", prefix)) } if strings.Contains(prefix, ".") { - addrs = append(addrs, fmt.Sprintf("IPv4 %s", prefix)) + adders = append(adders, fmt.Sprintf("IPv4 %s", prefix)) } } - ipAddrs[name] = strings.Join(addrs, " / ") + ipAdders[name] = strings.Join(adders, " / ") } } - return ipAddrs + return ipAdders } // DiskInfo 磁盘信息 @@ -166,11 +166,11 @@ func (s *SystemInfo) DiskInfo() []map[string]string { continue } disks = append(disks, map[string]string{ - "size": parse.Bit(float64(usage.Total)), - "used": parse.Bit(float64(usage.Used)), - "avail": parse.Bit(float64(usage.Free)), - "pcent": fmt.Sprintf("%.1f%%", usage.UsedPercent), - "target": partition.Device, + "size": parse.Bit(float64(usage.Total)), + "used": parse.Bit(float64(usage.Used)), + "avail": parse.Bit(float64(usage.Free)), + "percent": fmt.Sprintf("%.1f%%", usage.UsedPercent), + "target": partition.Device, }) } return disks diff --git a/src/modules/network_data/controller/all_alarm.go b/src/modules/network_data/controller/all_alarm.go index b6ba8de0..498b5461 100644 --- a/src/modules/network_data/controller/all_alarm.go +++ b/src/modules/network_data/controller/all_alarm.go @@ -1,12 +1,12 @@ package controller import ( - "strings" + "fmt" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" @@ -31,49 +31,63 @@ type AlarmController struct { // 告警列表 // // GET /list +// +// @Tags network_data/alarm +// @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 The actual record is the network element RmUid" +// @Param neName query string false "NE Name" +// @Param pvFlag query string false "PV Flag" Enums(PNF,VNF) +// @Param alarmCode query string false "alarm status code" +// @Param alarmType query string false "Alarm type Communication alarms=1, Equipment alarms=2, Processing faults=3, Environmental alarms=4, Quality of service alarms=5" Enums(1,2,3,4,5) +// @Param alarmStatus query string false "Alarm status 0:clear, 1:active" Enums(0,1) +// @Param origSeverity query string false "Alarm Type 1: Critical, 2: Major, 3: Minor, 4: Warning" Enums(1,2,3,4) +// @Param sortField query string false "Sort fields, fill in result fields" default(event_time) +// @Param sortOrder query string false "Sort by ascending or descending order, asc desc" default(asc) +// @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 Alarm List +// @Description Alarm List +// @Router /neData/alarm/list [get] func (s *AlarmController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var querys model.AlarmQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + var query model.AlarmQuery + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - - // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) - if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) - return - } - querys.RmUID = neInfo.RmUID - // 查询数据 - rows, total := s.alarmService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) + rows, total := s.alarmService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 告警删除 // -// DELETE /:alarmIds +// DELETE /:id func (s *AlarmController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - alarmIds := c.Param("alarmIds") - if alarmIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(alarmIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.alarmService.DeleteByIds(uniqueIDs) + + rows, err := s.alarmService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } diff --git a/src/modules/network_data/controller/all_alarm_log.go b/src/modules/network_data/controller/all_alarm_log.go new file mode 100644 index 00000000..09d2bef2 --- /dev/null +++ b/src/modules/network_data/controller/all_alarm_log.go @@ -0,0 +1,93 @@ +package controller + +import ( + "fmt" + + "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/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// 实例化控制层 AlarmLogController 结构体 +var NewAlarmLog = &AlarmLogController{ + neInfoService: neService.NewNeInfo, + alarmLogService: neDataService.NewAlarmLog, +} + +// 告警数据 +// +// PATH /alarm/log +type AlarmLogController struct { + neInfoService *neService.NeInfo // 网元信息服务 + alarmLogService *neDataService.AlarmLog // 告警信息服务 +} + +// 告警日志列表 +// +// GET /list +// +// @Tags network_data/alarm_log +// @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 The actual record is the network element RmUid" +// @Param neName query string false "NE Name" +// @Param pvFlag query string false "PV Flag" Enums(PNF,VNF) +// @Param alarmLogCode query string false "AlarmLog status code" +// @Param alarmLogType query string false "AlarmLog type Communication AlarmLogs=1, Equipment AlarmLogs=2, Processing faults=3, Environmental AlarmLogs=4, Quality of service AlarmLogs=5" Enums(1,2,3,4,5) +// @Param alarmLogStatus query string false "AlarmLog status 0:clear, 1:active" Enums(0,1) +// @Param origSeverity query string false "AlarmLog Type 1: Critical, 2: Major, 3: Minor, 4: Warning" Enums(1,2,3,4) +// @Param sortField query string false "Sort fields, fill in result fields" default(event_time) +// @Param sortOrder query string false "Sort by ascending or descending order, asc desc" default(asc) +// @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 AlarmLog List +// @Description AlarmLog List +// @Router /neData/alarm/log/list [get] +func (s *AlarmLogController) List(c *gin.Context) { + var query model.AlarmLogQuery + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + // 查询数据 + rows, total := s.alarmLogService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) +} + +// 告警删除 +// +// DELETE /:id +func (s AlarmLogController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) + return + } + + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) + } + + rows, err := s.alarmLogService.DeleteByIds(ids) + if err != nil { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) + c.JSON(200, resp.OkMsg(msg)) +} diff --git a/src/modules/network_data/controller/all_perf_kpi.go b/src/modules/network_data/controller/all_kpi.go similarity index 50% rename from src/modules/network_data/controller/all_perf_kpi.go rename to src/modules/network_data/controller/all_kpi.go index b1a12ccf..15128b53 100644 --- a/src/modules/network_data/controller/all_perf_kpi.go +++ b/src/modules/network_data/controller/all_kpi.go @@ -1,27 +1,30 @@ package controller import ( + "fmt" + "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" ) -// 实例化控制层 PerfKPIController 结构体 -var NewPerfKPI = &PerfKPIController{ - neInfoService: neService.NewNeInfo, - perfKPIService: neDataService.NewPerfKPI, +// 实例化控制层 KPIController 结构体 +var NewKPI = &KPIController{ + neInfoService: neService.NewNeInfo, + kpiReportService: neDataService.NewKpiReport, } // 性能统计 // // PATH /kpi -type PerfKPIController struct { - neInfoService *neService.NeInfo // 网元信息服务 - perfKPIService *neDataService.PerfKPI // 统计信息服务 +type KPIController struct { + neInfoService *neService.NeInfo // 网元信息服务 + kpiReportService *neDataService.KpiReport // 指标统计服务 } // 获取统计数据 @@ -31,39 +34,36 @@ type PerfKPIController struct { // @Tags network_data/kpi // @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) default(AMF) +// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) default(AMF) // @Param neId query string true "NE ID" default(001) -// @Param startTime query number true "Start time (timestamped milliseconds)" default(1729162507596) -// @Param endTime query number true "End time (timestamped milliseconds)" default(1729164187611) +// @Param beginTime query number true "begin time (timestamped milliseconds)" default(1729162507596) +// @Param endTime query number true "end time (timestamped milliseconds)" default(1729164187611) // @Param interval query number true "interval" Enums(5,10,15,30,60,300,600,900,1800,3600) default(60) // @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary Access to statistical data // @Description Access to statistical data // @Router /neData/kpi/data [get] -func (s *PerfKPIController) GoldKPI(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var querys model.GoldKPIQuery +func (s KPIController) KPIData(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var querys model.KPIQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - if querys.Interval < 5 || querys.Interval > 3600 { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID // 查询数据 - kpiData := s.perfKPIService.SelectGoldKPI(querys) - c.JSON(200, result.OkData(kpiData)) + kpiData := s.kpiReportService.FindData(querys) + c.JSON(200, resp.OkData(kpiData)) } // 获取统计标题 @@ -73,21 +73,18 @@ func (s *PerfKPIController) GoldKPI(c *gin.Context) { // @Tags network_data/kpi // @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) default(AMF) +// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) default(AMF) // @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary Get Statistical Headings // @Description Get Statistical Headings // @Router /neData/kpi/title [get] -func (s *PerfKPIController) Title(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s KPIController) KPITitle(c *gin.Context) { neType := c.Query("neType") if neType == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(40010, "bind err: neType is empty")) return } - - kpiTitles := s.perfKPIService.SelectGoldKPITitle(neType) - - c.JSON(200, result.OkData(kpiTitles)) + kpiTitles := s.kpiReportService.FindTitle(neType) + c.JSON(200, resp.OkData(kpiTitles)) } diff --git a/src/modules/network_data/controller/all_nb_state.go b/src/modules/network_data/controller/all_nb_state.go index ff7bf3ca..bc48b380 100644 --- a/src/modules/network_data/controller/all_nb_state.go +++ b/src/modules/network_data/controller/all_nb_state.go @@ -7,8 +7,8 @@ import ( "github.com/gin-gonic/gin" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" @@ -35,38 +35,39 @@ type NBStateController struct { // @Tags network_data/amf,network_data/mme // @Accept json // @Produce json -// @Param neType query string true "NE Type only AMF/MME" Enums(AMF,MME) default(AMF) -// @Param neId query string true "NE ID" default(001) -// @Param pageNum query number true "pageNum" default(1) -// @Param pageSize query number true "pageSize" default(10) +// @Param neType query string true "NE Type only AMF/MME" Enums(AMF,MME) default(AMF) +// @Param neId query string true "NE ID" default(001) +// @Param pageNum query number true "pageNum" default(1) +// @Param pageSize query number true "pageSize" default(10) // @Param startTime query number false "Start time (timestamped milliseconds)" default(1729162507596) // @Param endTime query number false "End time (timestamped milliseconds)" default(1729164187611) -// @Param sortField query string false "Sort fields, fill in result fields" Enums(id,create_time) default(id) -// @Param sortOrder query string false "Sort by ascending or descending order" Enums(asc,desc) default(asc) +// @Param sortField query string false "Sort fields, fill in result fields" Enums(id,create_time) default(id) +// @Param sortOrder query string false "Sort by ascending or descending order" Enums(asc,desc) default(asc) // @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary Base Station Status List // @Description Base Station Status List // @Router /nb-state/list [get] func (s NBStateController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query model.NBStateQuery if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元信息 rmUID - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } query.RmUID = neInfo.RmUID // 查询数据 - rows, total := s.nbStateService.SelectPage(query) - c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) + rows, total := s.nbStateService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 历史记录列表导出 @@ -83,11 +84,12 @@ func (s NBStateController) List(c *gin.Context) { // @Description Base Station Status List Export // @Router /nb-state/export [post] func (s NBStateController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.NBStateQuery if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 限制导出数据集 @@ -95,16 +97,16 @@ func (s NBStateController) Export(c *gin.Context) { querys.PageSize = 10000 } // 查询网元信息 rmUID - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID - rows, total := s.nbStateService.SelectPage(querys) + rows, total := s.nbStateService.FindByPage(querys) if total == 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -113,7 +115,7 @@ func (s NBStateController) Export(c *gin.Context) { // 导出数据表格 saveFilePath, err := s.nbStateService.ExportXlsx(rows, fileName, language) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index cb7dac1a..8c3f0153 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -2,13 +2,12 @@ package controller import ( "fmt" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" @@ -49,60 +48,63 @@ type AMFController struct { // @Description UE Session List // @Router /neData/amf/ue/list [get] func (s *AMFController) UEList(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys model.UEEventAMFQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("AMF", querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID("AMF", querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID // 查询数据 - rows, total := s.ueEventService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) + rows, total := s.ueEventService.FindByPage(querys) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // UE会话删除 // -// DELETE /ue/:ueIds +// DELETE /ue/:id // // @Tags network_data/amf // @Accept json // @Produce json -// @Param ueIds path string true "list data id, multiple separated by a , sign" -// @Success 200 {object} object "Response Results" +// @Param id path string true "list data id, multiple separated by a , sign" +// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary UE Session Deletion // @Description UE Session Deletion -// @Router /neData/amf/ue/{ueIds} [delete] +// @Router /neData/amf/ue/{id} [delete] func (s *AMFController) UERemove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - ueIds := c.Param("ueIds") - if ueIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(ueIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.ueEventService.DeleteByIds(uniqueIDs) + + rows, err := s.ueEventService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // UE会话列表导出 @@ -119,11 +121,12 @@ func (s *AMFController) UERemove(c *gin.Context) { // @Description UE Session List Export // @Router /neData/amf/ue/export [post] func (s *AMFController) UEExport(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.UEEventAMFQuery if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 限制导出数据集 @@ -131,16 +134,16 @@ func (s *AMFController) UEExport(c *gin.Context) { querys.PageSize = 10000 } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("AMF", querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID("AMF", querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID - rows, total := s.ueEventService.SelectPage(querys) + rows, total := s.ueEventService.FindByPage(querys) if total == 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -149,7 +152,7 @@ func (s *AMFController) UEExport(c *gin.Context) { // 导出数据表格 saveFilePath, err := s.ueEventService.ExportXlsx(rows, fileName, language) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -171,20 +174,21 @@ func (s *AMFController) UEExport(c *gin.Context) { // @Description Access Base Station Information List // @Router /neData/amf/nb/list [get] func (s *AMFController) NbInfoList(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { NeId string `form:"neId" binding:"required"` NbId string `form:"id"` } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元信息 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("AMF", query.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("AMF", query.NeId) if neInfo.NeId != query.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -193,11 +197,11 @@ func (s *AMFController) NbInfoList(c *gin.Context) { "id": query.NbId, }) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // 接入基站状态信息列表 @@ -214,28 +218,26 @@ func (s *AMFController) NbInfoList(c *gin.Context) { // @Description Access to the base station status information list // @Router /neData/amf/nb/list-cfg [get] func (s *AMFController) NbStateList(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - NeId string `form:"neId" binding:"required"` - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + neId := c.Query("neId") + if neId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: neId is empty")) return } // 查询网元信息 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("AMF", query.NeId) - if neInfo.NeId != query.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + neInfo := s.neInfoService.FindByNeTypeAndNeID("AMF", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元直连 data, err := neFetchlink.AMFGnbStateList(neInfo) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 5952e20b..a9c9fc55 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -2,13 +2,12 @@ package controller import ( "fmt" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" @@ -50,60 +49,63 @@ type IMSController struct { // @Description CDR Session List // @Router /neData/ims/cdr/list [get] func (s *IMSController) CDRList(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys model.CDREventIMSQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元信息 rmUID - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID // 查询数据 - rows, total := s.cdrEventService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) + rows, total := s.cdrEventService.FindByPage(querys) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // CDR会话删除 // -// DELETE /cdr/:cdrIds +// DELETE /cdr/:id // // @Tags network_data/ims // @Accept json // @Produce json -// @Param cdrIds path string true "list data id, multiple separated by a , sign" -// @Success 200 {object} object "Response Results" +// @Param id path string true "list data id, multiple separated by a , sign" +// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary CDR Session Delete // @Description CDR Session Delete -// @Router /neData/ims/cdr/{cdrIds} [delete] +// @Router /neData/ims/cdr/{id} [delete] func (s *IMSController) CDRRemove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - cdrIds := c.Param("cdrIds") - if cdrIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(cdrIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.cdrEventService.DeleteByIds(uniqueIDs) + + rows, err := s.cdrEventService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // CDR会话列表导出 @@ -120,11 +122,12 @@ func (s *IMSController) CDRRemove(c *gin.Context) { // @Description CDR Session List Export // @Router /neData/ims/cdr/export [post] func (s *IMSController) CDRExport(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.CDREventIMSQuery if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 限制导出数据集 @@ -132,16 +135,16 @@ func (s *IMSController) CDRExport(c *gin.Context) { querys.PageSize = 10000 } // 查询网元信息 rmUID - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID - rows, total := s.cdrEventService.SelectPage(querys) + rows, total := s.cdrEventService.FindByPage(querys) if total == 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -150,7 +153,7 @@ func (s *IMSController) CDRExport(c *gin.Context) { // 导出数据表格 saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName, language) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -171,30 +174,28 @@ func (s *IMSController) CDRExport(c *gin.Context) { // @Description Number of online session users // @Router /neData/ims/session/num [get] func (s *IMSController) UeSessionNum(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - NeId string `form:"neId" binding:"required"` - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + neId := c.Query("neId") + if neId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: neId is empty")) return } // 查询网元信息 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("IMS", query.NeId) - if neInfo.NeId != query.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + neInfo := s.neInfoService.FindByNeTypeAndNeID("IMS", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元直连 num, err := neFetchlink.IMSUeSessionNum(neInfo) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(num)) + c.JSON(200, resp.OkData(num)) } // 在线会话用户列表信息 @@ -213,21 +214,22 @@ func (s *IMSController) UeSessionNum(c *gin.Context) { // @Description Online session user list information // @Router /neData/ims/session/list [get] func (s *IMSController) UeSessionList(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { NeId string `form:"neId" binding:"required"` IMSI string `form:"imsi"` MSISDN string `form:"msisdn"` } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元信息 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("IMS", query.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("IMS", query.NeId) if neInfo.NeId != query.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -237,9 +239,9 @@ func (s *IMSController) UeSessionList(c *gin.Context) { "msisdn": query.MSISDN, }) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } diff --git a/src/modules/network_data/controller/mme.go b/src/modules/network_data/controller/mme.go index 1e2c4880..4efbcafb 100644 --- a/src/modules/network_data/controller/mme.go +++ b/src/modules/network_data/controller/mme.go @@ -2,19 +2,18 @@ package controller import ( "fmt" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 MMEController 结构体 @@ -49,60 +48,63 @@ type MMEController struct { // @Description UE Session List // @Router /neData/mme/ue/list [get] func (s *MMEController) UEList(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys model.UEEventMMEQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("MME", querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID("MME", querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID // 查询数据 - rows, total := s.ueEventService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) + rows, total := s.ueEventService.FindByPage(querys) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // UE会话删除 // -// DELETE /ue/:ueIds +// DELETE /ue/:id // // @Tags network_data/mme // @Accept json // @Produce json -// @Param ueIds path string true "list data id, multiple separated by a , sign" -// @Success 200 {object} object "Response Results" +// @Param id path string true "list data id, multiple separated by a , sign" +// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary UE Session Deletion // @Description UE Session Deletion -// @Router /neData/mme/ue/{ueIds} [delete] +// @Router /neData/mme/ue/{id} [delete] func (s *MMEController) UERemove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - ueIds := c.Param("ueIds") - if ueIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(ueIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.ueEventService.DeleteByIds(uniqueIDs) + + rows, err := s.ueEventService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // UE会话列表导出 @@ -119,11 +121,12 @@ func (s *MMEController) UERemove(c *gin.Context) { // @Description UE Session List Export // @Router /neData/mme/ue/export [post] func (s *MMEController) UEExport(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.UEEventMMEQuery - if err := c.ShouldBindBodyWith(&querys, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&querys); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 限制导出数据集 @@ -131,16 +134,16 @@ func (s *MMEController) UEExport(c *gin.Context) { querys.PageSize = 10000 } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("MME", querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID("MME", querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID - rows, total := s.ueEventService.SelectPage(querys) + rows, total := s.ueEventService.FindByPage(querys) if total == 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -149,7 +152,7 @@ func (s *MMEController) UEExport(c *gin.Context) { // 导出数据表格 saveFilePath, err := s.ueEventService.ExportXlsx(rows, fileName, language) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -171,20 +174,21 @@ func (s *MMEController) UEExport(c *gin.Context) { // @Description Access Base Station Information List // @Router /neData/mme/nb/list [get] func (s *MMEController) NbInfoList(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { NeId string `form:"neId" binding:"required"` NbId string `form:"id"` } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元信息 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("MME", query.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("MME", query.NeId) if neInfo.NeId != query.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -193,11 +197,11 @@ func (s *MMEController) NbInfoList(c *gin.Context) { "id": query.NbId, }) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // 接入基站状态信息列表 @@ -214,28 +218,26 @@ func (s *MMEController) NbInfoList(c *gin.Context) { // @Description Access to the base station status information list // @Router /neData/mme/nb/list-cfg [get] func (s *MMEController) NbStateList(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - NeId string `form:"neId" binding:"required"` - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + neId := c.Query("neId") + if neId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: neId is empty")) return } // 查询网元信息 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("MME", query.NeId) - if neInfo.NeId != query.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + neInfo := s.neInfoService.FindByNeTypeAndNeID("MME", neId) + if neInfo.NeId != neId || neInfo.IP == "" { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元直连 data, err := neFetchlink.MMEEnbStateList(neInfo) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } diff --git a/src/modules/network_data/controller/sgwc.go b/src/modules/network_data/controller/sgwc.go index e6e3f230..9b400bc7 100644 --- a/src/modules/network_data/controller/sgwc.go +++ b/src/modules/network_data/controller/sgwc.go @@ -2,13 +2,12 @@ package controller import ( "fmt" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" @@ -17,18 +16,18 @@ import ( // 实例化控制层 SGWCController 结构体 var NewSGWC = &SGWCController{ - neInfoService: neService.NewNeInfo, - cdrEventService: neDataService.NewCDREventSGWC, - udmUserInfoService: neDataService.NewUDMUserInfo, + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventSGWC, + UDMExtendService: neDataService.NewUDMExtend, } // 网元SGWC // // PATH /sgwc type SGWCController struct { - neInfoService *neService.NeInfo // 网元信息服务 - cdrEventService *neDataService.CDREventSGWC // CDR会话事件服务 - udmUserInfoService *neDataService.UDMUserInfo // UDM用户信息服务 + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventSGWC // CDR会话事件服务 + UDMExtendService *neDataService.UDMExtend // UDM用户信息服务 } // CDR会话列表 @@ -50,60 +49,63 @@ type SGWCController struct { // @Description CDR Session List // @Router /neData/sgwc/cdr/list [get] func (s *SGWCController) CDRList(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys model.CDREventSGWCQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元信息 rmUID - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID // 查询数据 - rows, total := s.cdrEventService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) + rows, total := s.cdrEventService.FindByPage(querys) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // CDR会话删除 // -// DELETE /cdr/:cdrIds +// DELETE /cdr/:id // // @Tags network_data/sgwc // @Accept json // @Produce json -// @Param cdrIds path string true "list data id, multiple separated by a , sign" -// @Success 200 {object} object "Response Results" +// @Param id path string true "list data id, multiple separated by a , sign" +// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary CDR Session Delete // @Description CDR Session Delete -// @Router /neData/sgwc/cdr/{cdrIds} [delete] +// @Router /neData/sgwc/cdr/{id} [delete] func (s *SGWCController) CDRRemove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - cdrIds := c.Param("cdrIds") - if cdrIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(cdrIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.cdrEventService.DeleteByIds(uniqueIDs) + + rows, err := s.cdrEventService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // CDR会话列表导出 @@ -120,11 +122,12 @@ func (s *SGWCController) CDRRemove(c *gin.Context) { // @Description CDR Session List Export // @Router /neData/sgwc/cdr/export [post] func (s *SGWCController) CDRExport(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.CDREventSGWCQuery if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 限制导出数据集 @@ -132,16 +135,16 @@ func (s *SGWCController) CDRExport(c *gin.Context) { querys.PageSize = 10000 } // 查询网元信息 rmUID - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID - rows, total := s.cdrEventService.SelectPage(querys) + rows, total := s.cdrEventService.FindByPage(querys) if total == 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -150,7 +153,7 @@ func (s *SGWCController) CDRExport(c *gin.Context) { // 导出数据表格 saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index b943b736..cd627b14 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -6,31 +6,31 @@ import ( "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SMFController 结构体 var NewSMF = &SMFController{ - neInfoService: neService.NewNeInfo, - cdrEventService: neDataService.NewCDREventSMF, - udmUserInfoService: neDataService.NewUDMUserInfo, + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventSMF, + UDMExtendService: neDataService.NewUDMExtend, } // 网元SMF // // PATH /smf type SMFController struct { - neInfoService *neService.NeInfo // 网元信息服务 - cdrEventService *neDataService.CDREventSMF // CDR会话事件服务 - udmUserInfoService *neDataService.UDMUserInfo // UDM用户信息服务 + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventSMF // CDR会话事件服务 + UDMExtendService *neDataService.UDMExtend // UDM用户信息服务 } // CDR会话列表 @@ -51,60 +51,63 @@ type SMFController struct { // @Description CDR Session List // @Router /neData/smf/cdr/list [get] func (s *SMFController) CDRList(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys model.CDREventSMFQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元信息 rmUID - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID // 查询数据 - rows, total := s.cdrEventService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) + rows, total := s.cdrEventService.FindByPage(querys) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // CDR会话删除 // -// DELETE /cdr/:cdrIds +// DELETE /cdr/:id // // @Tags network_data/smf // @Accept json // @Produce json -// @Param cdrIds path string true "list data id, multiple separated by a , sign" -// @Success 200 {object} object "Response Results" +// @Param id path string true "list data id, multiple separated by a , sign" +// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary CDR Session Delete // @Description CDR Session Delete -// @Router /neData/smf/cdr/{cdrIds} [delete] +// @Router /neData/smf/cdr/{id} [delete] func (s *SMFController) CDRRemove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - cdrIds := c.Param("cdrIds") - if cdrIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(cdrIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.cdrEventService.DeleteByIds(uniqueIDs) + + rows, err := s.cdrEventService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // CDR会话列表导出 @@ -121,11 +124,12 @@ func (s *SMFController) CDRRemove(c *gin.Context) { // @Description CDR Session List Export // @Router /neData/smf/cdr/export [post] func (s *SMFController) CDRExport(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.CDREventSMFQuery - if err := c.ShouldBindBodyWith(&querys, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&querys); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 限制导出数据集 @@ -133,16 +137,16 @@ func (s *SMFController) CDRExport(c *gin.Context) { querys.PageSize = 10000 } // 查询网元信息 rmUID - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID - rows, total := s.cdrEventService.SelectPage(querys) + rows, total := s.cdrEventService.FindByPage(querys) if total == 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -151,7 +155,7 @@ func (s *SMFController) CDRExport(c *gin.Context) { // 导出数据表格 saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -172,30 +176,30 @@ func (s *SMFController) CDRExport(c *gin.Context) { // @Description Number of online session users // @Router /neData/smf/sub/num [get] func (s *SMFController) SubUserNum(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { NeId string `form:"neId" binding:"required"` } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元信息 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("SMF", query.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("SMF", query.NeId) if neInfo.NeId != query.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元直连 num, err := neFetchlink.SMFSubNum(neInfo) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(num)) + c.JSON(200, resp.OkData(num)) } // 在线订阅用户列表信息 @@ -216,7 +220,7 @@ func (s *SMFController) SubUserNum(c *gin.Context) { // @Description Online session user list information // @Router /neData/smf/session/list [get] func (s *SMFController) SubUserList(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { NeId string `form:"neId" binding:"required"` IMSI string `form:"imsi"` @@ -225,14 +229,14 @@ func (s *SMFController) SubUserList(c *gin.Context) { PageNum string `form:"pageNum"` } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元信息 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("SMF", query.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("SMF", query.NeId) if neInfo.NeId != query.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -244,7 +248,7 @@ func (s *SMFController) SubUserList(c *gin.Context) { "pageNum": query.PageNum, }) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -259,7 +263,7 @@ func (s *SMFController) SubUserList(c *gin.Context) { imsiStr = strings.TrimPrefix(imsiStr, "imsi-") item["imsi"] = imsiStr // 查UDM拓展信息 - info := s.udmUserInfoService.SelectByIMSIAndNeID(imsiStr, "%") + info := s.UDMExtendService.FindByIMSIAndNeID(imsiStr, "%") item["remark"] = info.Remark } if v, ok := item["msisdn"]; ok && v != nil { @@ -268,5 +272,5 @@ func (s *SMFController) SubUserList(c *gin.Context) { } } - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(data)) } diff --git a/src/modules/network_data/controller/smsc.go b/src/modules/network_data/controller/smsc.go index 8548620b..5c52ca67 100644 --- a/src/modules/network_data/controller/smsc.go +++ b/src/modules/network_data/controller/smsc.go @@ -2,13 +2,12 @@ package controller import ( "fmt" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" @@ -49,60 +48,63 @@ type SMSCController struct { // @Description CDR Session List // @Router /neData/smsc/cdr/list [get] func (s *SMSCController) CDRList(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys model.CDREventSMSCQuery if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元信息 rmUID - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID // 查询数据 - rows, total := s.cdrEventService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) + rows, total := s.cdrEventService.FindByPage(querys) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // CDR会话删除 // -// DELETE /cdr/:cdrIds +// DELETE /cdr/:id // // @Tags network_data/smsc // @Accept json // @Produce json -// @Param cdrIds path string true "list data id, multiple separated by a , sign" -// @Success 200 {object} object "Response Results" +// @Param id path string true "list data id, multiple separated by a , sign" +// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary CDR Session Delete // @Description CDR Session Delete -// @Router /neData/smsc/cdr/{cdrIds} [delete] +// @Router /neData/smsc/cdr/{id} [delete] func (s *SMSCController) CDRRemove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - cdrIds := c.Param("cdrIds") - if cdrIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(cdrIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.cdrEventService.DeleteByIds(uniqueIDs) + + rows, err := s.cdrEventService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // CDR会话列表导出 @@ -119,11 +121,12 @@ func (s *SMSCController) CDRRemove(c *gin.Context) { // @Description CDR Session List Export // @Router /neData/smsc/cdr/export [post] func (s *SMSCController) CDRExport(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.CDREventSMSCQuery if err := c.ShouldBindBodyWithJSON(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 限制导出数据集 @@ -131,16 +134,16 @@ func (s *SMSCController) CDRExport(c *gin.Context) { querys.PageSize = 10000 } // 查询网元信息 rmUID - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } querys.RmUID = neInfo.RmUID - rows, total := s.cdrEventService.SelectPage(querys) + rows, total := s.cdrEventService.FindByPage(querys) if total == 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -149,7 +152,7 @@ func (s *SMSCController) CDRExport(c *gin.Context) { // 导出数据表格 saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName, language) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index cd8c2505..5677adb9 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -6,19 +6,19 @@ import ( "strings" "time" - "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/telnet" - "be.ems/src/framework/utils/ctx" "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 UDMAuthController 结构体 @@ -45,19 +45,19 @@ type UDMAuthController struct { // @Param neId path string true "NE ID" default(001) // @Success 200 {object} object "Response Results" // @Security TokenAuth -// @Summary UDM Authentication User Reload Data -// @Description UDM Authentication User Reload Data +// @Summary UDM Authentication User Data Refresh +// @Description UDM Authenticated User Data List Refresh Synchronization Latest // @Router /neData/udm/auth/resetData/{neId} [put] func (s *UDMAuthController) ResetData(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") if neId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } data := s.udmAuthService.ResetData(neId) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // UDM鉴权用户列表 @@ -77,9 +77,9 @@ func (s *UDMAuthController) ResetData(c *gin.Context) { // @Description UDM Authentication User List // @Router /neData/udm/auth/list [get] func (s *UDMAuthController) List(c *gin.Context) { - querys := ctx.QueryMap(c) - total, rows := s.udmAuthService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{"total": total, "rows": rows})) + query := reqctx.QueryMap(c) + total, rows := s.udmAuthService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) } // UDM鉴权用户信息 @@ -97,24 +97,24 @@ func (s *UDMAuthController) List(c *gin.Context) { // @Description UDM Authentication User Information // @Router /neData/udm/auth/{neId}/{value} [get] func (s *UDMAuthController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.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"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -123,19 +123,19 @@ func (s *UDMAuthController) Info(c *gin.Context) { cmd := fmt.Sprintf("dsp authdat:imsi=%s", imsi) data, err := telnet.ConvertToMap(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } if len(data) == 0 { - c.JSON(200, result.ErrMsg("No Auth Data")) + c.JSON(200, resp.ErrMsg("No Auth Data")) return } // 解析返回的数据 u := s.udmAuthService.ParseInfo(imsi, neId, data) s.udmAuthService.Insert(neId, u) - c.JSON(200, result.OkData(u)) + c.JSON(200, resp.OkData(u)) } // UDM鉴权用户新增 @@ -153,30 +153,30 @@ func (s *UDMAuthController) Info(c *gin.Context) { // @Description UDM Authentication User Added // @Router /neData/udm/auth/{neId} [post] func (s *UDMAuthController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") if neId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } var body model.UDMAuthUser - err := c.ShouldBindBodyWith(&body, binding.JSON) + err := c.ShouldBindBodyWithJSON(&body) if err != nil || body.IMSI == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -186,7 +186,7 @@ func (s *UDMAuthController) Add(c *gin.Context) { cmd += s.udmAuthService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -194,7 +194,7 @@ func (s *UDMAuthController) Add(c *gin.Context) { if strings.Contains(data, "ok") { s.udmAuthService.Insert(neId, body) } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // UDM鉴权用户批量新增 @@ -213,31 +213,31 @@ func (s *UDMAuthController) Add(c *gin.Context) { // @Description UDM Authentication User Batch Add // @Router /neData/udm/auth/{neId}/{value} [post] func (s *UDMAuthController) Adds(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") num := c.Param("num") if neId == "" || num == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } var body model.UDMAuthUser - err := c.ShouldBindBodyWith(&body, binding.JSON) + err := c.ShouldBindBodyWithJSON(&body) if err != nil || body.IMSI == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -247,7 +247,7 @@ func (s *UDMAuthController) Adds(c *gin.Context) { cmd += s.udmAuthService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -255,7 +255,7 @@ func (s *UDMAuthController) Adds(c *gin.Context) { if strings.Contains(data, "ok") { s.udmAuthService.LoadData(neId, body.IMSI, num) } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // UDM鉴权用户修改 @@ -273,30 +273,30 @@ func (s *UDMAuthController) Adds(c *gin.Context) { // @Description UDM Authenticated User Modification // @Router /neData/udm/auth/{neId} [put] func (s *UDMAuthController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") if neId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } var body model.UDMAuthUser - err := c.ShouldBindBodyWith(&body, binding.JSON) + err := c.ShouldBindBodyWithJSON(&body) if err != nil || body.IMSI == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -306,7 +306,7 @@ func (s *UDMAuthController) Edit(c *gin.Context) { cmd += s.udmAuthService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -314,7 +314,7 @@ func (s *UDMAuthController) Edit(c *gin.Context) { if strings.Contains(data, "ok") { s.udmAuthService.Insert(neId, body) } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // UDM鉴权用户删除 @@ -332,11 +332,11 @@ func (s *UDMAuthController) Edit(c *gin.Context) { // @Description UDM Authenticated User Deletion // @Router /neData/udm/auth/{neId}/{value} [delete] func (s *UDMAuthController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.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"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -344,20 +344,20 @@ func (s *UDMAuthController) Remove(c *gin.Context) { imsiArr := strings.Split(imsi, ",") uniqueIDs := parse.RemoveDuplicates(imsiArr) if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -378,7 +378,7 @@ func (s *UDMAuthController) Remove(c *gin.Context) { resultData[imsi] = data } - c.JSON(200, result.OkData(resultData)) + c.JSON(200, resp.OkData(resultData)) } // UDM鉴权用户批量删除 @@ -397,25 +397,25 @@ func (s *UDMAuthController) Remove(c *gin.Context) { // @Description UDM Authentication User Batch Deletion // @Router /neData/udm/auth/{neId}/{imsi}/{num} [delete] func (s *UDMAuthController) Removes(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") imsi := c.Param("imsi") num := c.Param("num") if neId == "" || imsi == "" || num == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -424,7 +424,7 @@ func (s *UDMAuthController) Removes(c *gin.Context) { cmd := fmt.Sprintf("bde authdat:start_imsi=%s,sub_num=%s", imsi, num) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -432,56 +432,58 @@ func (s *UDMAuthController) Removes(c *gin.Context) { if strings.Contains(data, "ok") { s.udmAuthService.LoadData(neId, imsi, num) } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // UDM鉴权用户导出 // -// POST /export +// GET /export // // @Tags network_data/udm/auth // @Accept json // @Produce json -// @Param data body object true "Request Param" -// @Success 200 {object} object "Response Results" +// @Param neId query string true "NE ID" default(001) +// @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) +// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary UDM Authenticated User Export // @Description UDM Authenticated User Export -// @Router /neData/udm/auth/export [post] +// @Router /neData/udm/auth/export [get] func (s *UDMAuthController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - neId := querys["neId"].(string) - fileType := querys["type"].(string) - if neId == "" || fileType == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + neId := c.Query("neId") + fileType := c.Query("type") + if neId == "" { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } if !(fileType == "csv" || fileType == "txt") { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) return } - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - total, rows := s.udmAuthService.SelectPage(querys) + query := reqctx.QueryMap(c) + total, rows := s.udmAuthService.FindByPage(query) if total == 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } // rows := s.udmAuthService.SelectList(model.UDMAuthUser{NeId: neId}) if len(rows) <= 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } // 文件名 fileName := fmt.Sprintf("udm_auth_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), fileType) - filePath := filepath.Join(file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + filePath := filepath.Join(file.ParseUploadFileDir(constants.UPLOAD_EXPORT), fileName) if fileType == "csv" { // 转换数据 @@ -497,7 +499,7 @@ func (s *UDMAuthController) Export(c *gin.Context) { // 输出到文件 err := file.WriterFileCSV(data, filePath) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } } @@ -515,7 +517,7 @@ func (s *UDMAuthController) Export(c *gin.Context) { // 输出到文件 if err := file.WriterFileTXT(data, ",", filePath); err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } } @@ -537,59 +539,60 @@ func (s *UDMAuthController) Export(c *gin.Context) { // @Description UDM Authenticated User Import // @Router /neData/udm/auth/import [post] func (s *UDMAuthController) Import(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { NeId string `json:"neId" binding:"required"` // 网元ID UploadPath string `json:"uploadPath" binding:"required"` // 上传文件路径 TypeVal string `json:"typeVal" binding:"required,oneof=default k4"` // default: 默认导入方式, k4: k4类型导入方式 TypeData any `json:"typeData"` // k4类型的数据密钥 } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 判断文件名 if !(strings.HasSuffix(body.UploadPath, ".csv") || strings.HasSuffix(body.UploadPath, ".txt")) { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserAuthFileFormat"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserAuthFileFormat"))) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", body.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", body.NeId) if neInfo.NeId != body.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sftpClient.Close() // 本地文件 - localFilePath := file.ParseUploadFilePath(body.UploadPath) + localFilePath := file.ParseUploadFileAbsPath(body.UploadPath) neFilePath := fmt.Sprintf("/tmp/%s", filepath.Base(localFilePath)) // 复制到远程 if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { - c.JSON(200, result.ErrMsg("error uploading file")) + c.JSON(200, resp.ErrMsg("error uploading file")) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.NeType, neInfo.NeId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -612,7 +615,7 @@ func (s *UDMAuthController) Import(c *gin.Context) { } if resultErr != nil { - c.JSON(200, result.ErrMsg(resultErr.Error())) + c.JSON(200, resp.ErrMsg(resultErr.Error())) return } @@ -627,5 +630,5 @@ func (s *UDMAuthController) Import(c *gin.Context) { go s.udmAuthService.InsertData(neInfo.NeId, "txt", data) } } - c.JSON(200, result.OkMsg(resultMsg)) + c.JSON(200, resp.OkMsg(resultMsg)) } diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index d8b5d6e2..25496d6b 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -6,18 +6,18 @@ import ( "strings" "time" - "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/telnet" - "be.ems/src/framework/utils/ctx" "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 UDMSubController 结构体 @@ -48,15 +48,15 @@ type UDMSubController struct { // @Description UDM Subscriber User Reload Data // @Router /neData/udm/sub/resetData/{neId} [put] func (s *UDMSubController) ResetData(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") if neId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } data := s.udmSubService.ResetData(neId) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // UDM签约用户列表 @@ -77,9 +77,9 @@ func (s *UDMSubController) ResetData(c *gin.Context) { // @Description UDM Subscriber User List // @Router /neData/udm/sub/list [get] func (s *UDMSubController) List(c *gin.Context) { - querys := ctx.QueryMap(c) - total, rows := s.udmSubService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{"total": total, "rows": rows})) + query := reqctx.QueryMap(c) + total, rows := s.udmSubService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) } // UDM签约用户信息 @@ -97,24 +97,24 @@ func (s *UDMSubController) List(c *gin.Context) { // @Description UDM Subscriber User Information // @Router /neData/udm/sub/{neId}/{value} [get] func (s *UDMSubController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.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"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -123,19 +123,19 @@ func (s *UDMSubController) Info(c *gin.Context) { cmd := fmt.Sprintf("dsp udmuser:imsi=%s", imsi) data, err := telnet.ConvertToMap(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } if len(data) == 0 { - c.JSON(200, result.ErrMsg("No Subs Data")) + c.JSON(200, resp.ErrMsg("No Subs Data")) return } // 解析返回的数据 u := s.udmSubService.ParseInfo(imsi, neId, data) s.udmSubService.Insert(neId, u) - c.JSON(200, result.OkData(u)) + c.JSON(200, resp.OkData(u)) } // UDM签约用户新增 @@ -153,30 +153,34 @@ func (s *UDMSubController) Info(c *gin.Context) { // @Description UDM Subscriber User Added // @Router /neData/udm/sub/{neId} [post] func (s *UDMSubController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") if neId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } var body model.UDMSubUser - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || len(body.IMSI) < 15 { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if len(body.IMSI) != 15 { + c.JSON(400, resp.CodeMsg(40010, "bind err: IMSI length is not 15 bits")) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -186,7 +190,7 @@ func (s *UDMSubController) Add(c *gin.Context) { cmd += s.udmSubService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -195,7 +199,7 @@ func (s *UDMSubController) Add(c *gin.Context) { body.NeId = neId s.udmSubService.Insert(neId, body) } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // UDM签约用户批量新增 @@ -214,31 +218,35 @@ func (s *UDMSubController) Add(c *gin.Context) { // @Description UDM Subscriber User Batch Add // @Router /neData/udm/sub/{neId}/{value} [post] func (s *UDMSubController) Adds(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") num := c.Param("num") if neId == "" || num == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } var body model.UDMSubUser - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || len(body.IMSI) < 15 { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if len(body.IMSI) != 15 { + c.JSON(400, resp.CodeMsg(40010, "bind err: IMSI length is not 15 bits")) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -251,7 +259,7 @@ func (s *UDMSubController) Adds(c *gin.Context) { cmd = strings.Replace(cmd, omemsisdn, ",", 1) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -259,7 +267,7 @@ func (s *UDMSubController) Adds(c *gin.Context) { if strings.Contains(data, "ok") { s.udmSubService.LoadData(neId, body.IMSI, num, body.Remark) } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // UDM签约用户修改 @@ -277,30 +285,34 @@ func (s *UDMSubController) Adds(c *gin.Context) { // @Description UDM Subscriber User Modification // @Router /neData/udm/sub/{neId} [put] func (s *UDMSubController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") if neId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } var body model.UDMSubUser - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || len(body.IMSI) < 15 { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if len(body.IMSI) != 15 { + c.JSON(400, resp.CodeMsg(40010, "bind err: IMSI length is not 15 bits")) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -310,7 +322,7 @@ func (s *UDMSubController) Edit(c *gin.Context) { cmd += s.udmSubService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -319,7 +331,7 @@ func (s *UDMSubController) Edit(c *gin.Context) { body.NeId = neId s.udmSubService.Insert(neId, body) } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // UDM签约用户删除 @@ -337,11 +349,11 @@ func (s *UDMSubController) Edit(c *gin.Context) { // @Description UDM Subscriber User Deletion // @Router /neData/udm/sub/{neId}/{value} [delete] func (s *UDMSubController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") imsi := c.Param("imsi") if neId == "" || len(imsi) < 15 { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -349,20 +361,20 @@ func (s *UDMSubController) Remove(c *gin.Context) { imsiArr := strings.Split(imsi, ",") uniqueIDs := parse.RemoveDuplicates(imsiArr) if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -383,7 +395,7 @@ func (s *UDMSubController) Remove(c *gin.Context) { resultData[imsi] = data } - c.JSON(200, result.OkData(resultData)) + c.JSON(200, resp.OkData(resultData)) } // UDM签约用户批量删除 @@ -402,25 +414,25 @@ func (s *UDMSubController) Remove(c *gin.Context) { // @Description UDM Subscriber User Batch Deletion // @Router /neData/udm/sub/{neId}/{imsi}/{num} [delete] func (s *UDMSubController) Removes(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) neId := c.Param("neId") imsi := c.Param("imsi") num := c.Param("num") if neId == "" || len(imsi) < 15 || num == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -429,7 +441,7 @@ func (s *UDMSubController) Removes(c *gin.Context) { cmd := fmt.Sprintf("bde udmuser:start_imsi=%s,sub_num=%s", imsi, num) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -437,56 +449,59 @@ func (s *UDMSubController) Removes(c *gin.Context) { if strings.Contains(data, "ok") { s.udmSubService.LoadData(neId, imsi, num, "-(Deleted)-") } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // UDM签约用户导出 // -// POST /export +// GET /export // // @Tags network_data/udm/sub // @Accept json // @Produce json -// @Param data body object true "Request Param" -// @Success 200 {object} object "Response Results" +// @Param neId query string true "NE ID" default(001) +// @Param type query string true "File Type" Enums(csv,txt) default(txt) +// @Param imsi query string false "IMSI" +// @Param msisdn query string false "Msisdn" +// @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 UDM Subscriber User Export // @Description UDM Subscriber User Export // @Router /neData/udm/sub/export [post] func (s *UDMSubController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - neId := querys["neId"].(string) - fileType := querys["type"].(string) + neId := c.Query("neId") + fileType := c.Query("type") if neId == "" || fileType == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } if !(fileType == "csv" || fileType == "txt") { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) return } - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - total, rows := s.udmSubService.SelectPage(querys) + query := reqctx.QueryMap(c) + total, rows := s.udmSubService.FindByPage(query) if total == 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } // rows := s.udmSubService.SelectList(model.UDMSubUser{NeId: neId}) if len(rows) <= 0 { // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } // 文件名 fileName := fmt.Sprintf("udm_sub_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), fileType) - filePath := filepath.Join(file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) + filePath := filepath.Join(file.ParseUploadFileDir(constants.UPLOAD_EXPORT), fileName) if fileType == "csv" { // 转换数据 @@ -498,7 +513,7 @@ func (s *UDMSubController) Export(c *gin.Context) { } // 输出到文件 if err := file.WriterFileCSV(data, filePath); err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } } @@ -512,7 +527,7 @@ func (s *UDMSubController) Export(c *gin.Context) { } // 输出到文件 if err := file.WriterFileTXT(data, ",", filePath); err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } } @@ -534,57 +549,58 @@ func (s *UDMSubController) Export(c *gin.Context) { // @Description UDM Subscriber User Import // @Router /neData/udm/sub/import [post] func (s *UDMSubController) Import(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { NeId string `json:"neId" binding:"required"` UploadPath string `json:"uploadPath" binding:"required"` } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 判断文件名 if !(strings.HasSuffix(body.UploadPath, ".csv") || strings.HasSuffix(body.UploadPath, ".txt")) { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", body.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UDM", body.NeId) if neInfo.NeId != body.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sftpClient.Close() // 本地文件 - localFilePath := file.ParseUploadFilePath(body.UploadPath) + localFilePath := file.ParseUploadFileAbsPath(body.UploadPath) neFilePath := fmt.Sprintf("/tmp/%s", filepath.Base(localFilePath)) // 复制到远程 if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { - c.JSON(200, result.ErrMsg("error uploading file")) + c.JSON(200, resp.ErrMsg("error uploading file")) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.NeType, neInfo.NeId, 1) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer telnetClient.Close() @@ -593,7 +609,7 @@ func (s *UDMSubController) Import(c *gin.Context) { cmd := fmt.Sprintf("import udmuser:path=%s", neFilePath) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -608,5 +624,5 @@ func (s *UDMSubController) Import(c *gin.Context) { go s.udmSubService.InsertData(neInfo.NeId, "txt", data) } } - c.JSON(200, result.OkMsg(data)) + c.JSON(200, resp.OkMsg(data)) } diff --git a/src/modules/network_data/controller/upf.go b/src/modules/network_data/controller/upf.go index fcd48f3b..7cd329b2 100644 --- a/src/modules/network_data/controller/upf.go +++ b/src/modules/network_data/controller/upf.go @@ -2,25 +2,26 @@ package controller import ( "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" ) // 实例化控制层 UPFController 结构体 var NewUPF = &UPFController{ - neInfoService: neService.NewNeInfo, - perfKPIService: neDataService.NewPerfKPI, + neInfoService: neService.NewNeInfo, + kpiReportService: neDataService.NewKpiReport, } // 网元UPF // // PATH /upf type UPFController struct { - neInfoService *neService.NeInfo // 网元信息服务 - perfKPIService *neDataService.PerfKPI // 统计信息服务 + neInfoService *neService.NeInfo // 网元信息服务 + kpiReportService *neDataService.KpiReport // 统计信息服务 } // 总流量数 N3上行 N6下行 @@ -38,25 +39,24 @@ type UPFController struct { // @Summary Total number of flows N3 upstream N6 downstream // @Description Total number of flows N3 upstream N6 downstream // @Router /neData/upf/totalFlow [get] -func (s *UPFController) TotalFlow(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s UPFController) TotalFlow(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var querys struct { NeID string `form:"neId" binding:"required"` Day int `form:"day"` } if err := c.ShouldBindQuery(&querys); querys.Day < 0 || err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UPF", querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID("UPF", querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - data := s.perfKPIService.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) - - c.JSON(200, result.OkData(data)) + data := s.kpiReportService.FindUPFTotalFlow(neInfo.RmUID, querys.Day) + c.JSON(200, resp.OkData(data)) } diff --git a/src/modules/network_data/model/alarm.go b/src/modules/network_data/model/alarm.go index 3c898ed8..61abd550 100644 --- a/src/modules/network_data/model/alarm.go +++ b/src/modules/network_data/model/alarm.go @@ -1,40 +1,36 @@ package model -import "time" - -// Alarm 告警数据对象 alarm +// Alarm 告警记录 type Alarm struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - AlarmSeq string `json:"alarmSeq" gorm:"column:alarm_seq"` - AlarmId string `json:"alarmId" gorm:"column:alarm_id"` - AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeId string `json:"neId" gorm:"column:ne_id"` - AlarmCode string `json:"alarmCode" gorm:"column:alarm_code"` - EventTime time.Time `json:"eventTime" gorm:"column:event_time"` - AlarmType string `json:"alarmType" gorm:"column:alarm_type"` - OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) - PerceivedSeverity string `json:"perceivedSeverity" gorm:"column:perceived_severity"` // 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) - PvFlag string `json:"pvFlag" gorm:"column:pv_flag"` - NeName string `json:"neName" gorm:"column:ne_name"` - ObjectUid string `json:"objectUid" gorm:"column:object_uid"` - ObjectName string `json:"objectName" gorm:"column:object_name"` - ObjectType string `json:"objectType" gorm:"column:object_type"` - LocationInfo string `json:"locationInfo" gorm:"column:location_info"` - Province string `json:"province" gorm:"column:province"` - AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 0:clear, 1:active - SpecificProblem string `json:"specificProblem" gorm:"column:specific_problem"` - SpecificProblemId string `json:"specificProblemId" gorm:"column:specific_problem_id"` - AddInfo string `json:"addInfo" gorm:"column:add_info"` - Counter string `json:"counter" gorm:"column:counter"` - LatestEventTime time.Time `json:"latestEventTime" gorm:"column:latest_event_time"` - AckState string `json:"ackState" gorm:"column:ack_state"` // 0: Unacked, 1: Acked - AckTime time.Time `json:"ackTime" gorm:"column:ack_time"` - AckUser string `json:"ackUser" gorm:"column:ack_user"` - ClearType string `json:"clearType" gorm:"column:clear_type"` // 0: Unclear, 1: AutoClear, 2: ManualClear - ClearTime time.Time `json:"clearTime" gorm:"column:clear_time"` - ClearUser string `json:"clearUser" gorm:"column:clear_user"` - Timestamp time.Time `json:"timestamp" gorm:"column:timestamp"` + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + NeId string `json:"neId" gorm:"column:ne_id"` // 网元ID + NeName string `json:"neName" gorm:"column:ne_name"` // 网元名称 + Province string `json:"province" gorm:"column:province"` // 网元省份地域 + PvFlag string `json:"pvFlag" gorm:"column:pv_flag"` // 网元标识虚拟化标识 + 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"` // 事件产生时间 秒级 + AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 CommunicationAlarm=1,EquipmentAlarm=2,ProcessingFailure=3,EnvironmentalAlarm=4,QualityOfServiceAlarm=5 + OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + PerceivedSeverity string `json:"perceivedSeverity" gorm:"column:perceived_severity"` // 告警级别 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + 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"` // 对象类型 + LocationInfo string `json:"locationInfo" gorm:"column:location_info"` // 告警定位信息 + AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 0:clear, 1:active + SpecificProblem string `json:"specificProblem" gorm:"column:specific_problem"` // 告警问题原因 + SpecificProblemId string `json:"specificProblemId" gorm:"column:specific_problem_id"` // 告警问题原因ID + AddInfo string `json:"addInfo" gorm:"column:add_info"` // 告警辅助信息 + AckState int64 `json:"ackState" gorm:"column:ack_state"` // 确认状态 0: Unacked, 1: Acked + AckTime int64 `json:"ackTime" gorm:"column:ack_time"` // 确认时间 秒级 + AckUser string `json:"ackUser" gorm:"column:ack_user"` // 确认用户 + ClearType int64 `json:"clearType" gorm:"column:clear_type"` // 清除状态 0: Unclear, 1: AutoClear, 2: ManualClear + ClearTime int64 `json:"clearTime" gorm:"column:clear_time"` // 清除时间 + ClearUser string `json:"clearUser" gorm:"column:clear_user"` // 清除用户 + Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 创建时间 } // TableName 表名称 @@ -44,14 +40,18 @@ func (*Alarm) TableName() string { // AlarmQuery 告警数据查询参数结构体 type AlarmQuery struct { - NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型 - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc + NeType string `json:"neType" form:"neType"` // 网元类型 + NeID string `json:"neId" form:"neId"` // 网元ID + NeName string `json:"neName" form:"neName"` + PvFlag string `json:"pvFlag" form:"pvFlag"` + AlarmCode string `json:"alarmCode" form:"alarmCode"` + AlarmType string `json:"alarmType" form:"alarmType"` + AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=0 1"` // 告警状态 0:clear, 1:active + OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_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 PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` } diff --git a/src/modules/network_data/model/alarm_event.go b/src/modules/network_data/model/alarm_event.go new file mode 100644 index 00000000..e1190720 --- /dev/null +++ b/src/modules/network_data/model/alarm_event.go @@ -0,0 +1,44 @@ +package model + +// AlarmEvent 告警_事件记录表 +type AlarmEvent struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + NeId string `json:"neId" gorm:"column:ne_id"` // 网元ID + 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"` // 事件产生时间 秒级 + 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"` // 对象类型 + LocationInfo string `json:"locationInfo" gorm:"column:location_info"` // 告警定位信息 + AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 0:clear, 1:active + SpecificProblem string `json:"specificProblem" gorm:"column:specific_problem"` // 告警问题原因 + SpecificProblemId string `json:"specificProblemId" gorm:"column:specific_problem_id"` // 告警问题原因ID + AddInfo string `json:"addInfo" gorm:"column:add_info"` // 告警辅助信息 + ClearType int64 `json:"clearType" gorm:"column:clear_type"` // 清除状态 0: Unclear, 1: AutoClear, 2: ManualClear + ClearTime int64 `json:"clearTime" gorm:"column:clear_time"` // 清除时间 + ClearUser string `json:"clearUser" gorm:"column:clear_user"` // 清除用户 + Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 创建时间 +} + +// TableName 表名称 +func (*AlarmEvent) TableName() string { + return "alarm_event" +} + +// AlarmEventQuery 告警事件数据查询参数结构体 +type AlarmEventQuery struct { + NeType string `json:"neType" form:"neType"` // 网元类型 + NeID string `json:"neId" form:"neId"` // 网元ID + AlarmCode string `json:"alarmCode" form:"alarmCode"` + AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=0 1"` // 告警状态 0:clear, 1:active + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_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 + PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` + PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` +} diff --git a/src/modules/network_data/model/alarm_forward_log.go b/src/modules/network_data/model/alarm_forward_log.go new file mode 100644 index 00000000..eace7bc1 --- /dev/null +++ b/src/modules/network_data/model/alarm_forward_log.go @@ -0,0 +1,38 @@ +package model + +// AlarmForwardLog 告警_转发日志记录 +type AlarmForwardLog struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeId string `json:"neId" gorm:"column:ne_id"` + 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"` // 告警状态 0:clear, 1:active + OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + 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 + Target string `json:"target" gorm:"column:target"` // 发送目标用户 + Result string `json:"result" gorm:"column:result"` // 发送结果 +} + +// TableName 表名称 +func (*AlarmForwardLog) TableName() string { + return "alarm_forward_log" +} + +// AlarmForwardLogQuery 告警转发日志数据查询参数结构体 +type AlarmForwardLogQuery struct { + NeType string `json:"neType" form:"neType"` // 网元类型 + NeID string `json:"neId" form:"neId"` // 网元ID + NeName string `json:"neName" form:"neName"` + AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=0 1"` // 告警状态 0:clear, 1:active + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_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 + PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` + PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` +} diff --git a/src/modules/network_data/model/alarm_log.go b/src/modules/network_data/model/alarm_log.go new file mode 100644 index 00000000..be884c95 --- /dev/null +++ b/src/modules/network_data/model/alarm_log.go @@ -0,0 +1,35 @@ +package model + +// AlarmLog 告警_日志记录 +type AlarmLog struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeId string `json:"neId" gorm:"column:ne_id"` + 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"` // 告警状态 0:clear, 1:active + OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 1: Critical, 2: Major, 3: Minor, 4: Warning, 5: Event(Only VNF) + EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 秒级 + CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间 +} + +// TableName 表名称 +func (*AlarmLog) TableName() string { + return "alarm_log" +} + +// AlarmLogQuery 告警日志数据查询参数结构体 +type AlarmLogQuery struct { + NeType string `json:"neType" form:"neType"` // 网元类型 + NeID string `json:"neId" form:"neId"` // 网元ID + NeName string `json:"neName" form:"neName"` + AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=0 1"` // 告警状态 0:clear, 1:active + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_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 + PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` + PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` +} diff --git a/src/modules/network_data/model/cdr_event_ims.go b/src/modules/network_data/model/cdr_event_ims.go index e6f9e77d..8c383ad2 100644 --- a/src/modules/network_data/model/cdr_event_ims.go +++ b/src/modules/network_data/model/cdr_event_ims.go @@ -1,16 +1,14 @@ package model -import "time" - // CDREventIMS CDR会话对象IMS cdr_event_ims type CDREventIMS struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` - CDRJSONStr string `json:"cdrJSON" gorm:"column:cdr_json"` - CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeName string `json:"neName" gorm:"column:ne_name"` + RmUid string `json:"rmUid" gorm:"column:rm_uid"` + 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"` // 记录创建存储毫秒 } // TableName 表名称 @@ -26,8 +24,8 @@ type CDREventIMSQuery struct { RecordType string `json:"recordType" form:"recordType"` // 记录行为 MOC MTC CallerParty string `json:"callerParty" form:"callerParty"` // 主叫号码 CalledParty string `json:"calledParty" form:"calledParty"` // 被叫号码 - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp + EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` diff --git a/src/modules/network_data/model/cdr_event_sgwc.go b/src/modules/network_data/model/cdr_event_sgwc.go index fedf6a4d..26562065 100644 --- a/src/modules/network_data/model/cdr_event_sgwc.go +++ b/src/modules/network_data/model/cdr_event_sgwc.go @@ -1,18 +1,14 @@ package model -import "time" - // CDREventSGWC CDR会话对象SGWC cdr_event_sgwc type CDREventSGWC struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` - CDRJSONStr string `json:"cdrJSON" gorm:"column:cdr_json"` - CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` - - // ====== 非数据库字段属性 ====== + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeName string `json:"neName" gorm:"column:ne_name"` + RmUid string `json:"rmUid" gorm:"column:rm_uid"` + 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"` // 记录创建存储毫秒 } // TableName 表名称 @@ -27,8 +23,8 @@ type CDREventSGWCQuery struct { RmUID string `json:"rmUID" form:"rmUID"` IMSI string `json:"imsi" form:"imsi"` MSISDN string `json:"msisdn" form:"msisdn"` - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp + EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` diff --git a/src/modules/network_data/model/cdr_event_smf.go b/src/modules/network_data/model/cdr_event_smf.go index b5926b25..a6df3ced 100644 --- a/src/modules/network_data/model/cdr_event_smf.go +++ b/src/modules/network_data/model/cdr_event_smf.go @@ -1,18 +1,14 @@ package model -import "time" - // CDREventSMF CDR会话对象SMF cdr_event_smf type CDREventSMF struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` - CDRJSONStr string `json:"cdrJSON" gorm:"column:cdr_json"` - CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` - - // ====== 非数据库字段属性 ====== + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeName string `json:"neName" gorm:"column:ne_name"` + RmUid string `json:"rmUid" gorm:"column:rm_uid"` + 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"` // 记录创建存储毫秒 } // TableName 表名称 @@ -28,8 +24,8 @@ type CDREventSMFQuery struct { RecordType string `json:"recordType" form:"recordType"` // 暂时没用到 SubscriberID string `json:"subscriberID" form:"subscriberID"` DNN string `json:"dnn" form:"dnn"` - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp + EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` diff --git a/src/modules/network_data/model/cdr_event_smsc.go b/src/modules/network_data/model/cdr_event_smsc.go index a27074f1..753e694a 100644 --- a/src/modules/network_data/model/cdr_event_smsc.go +++ b/src/modules/network_data/model/cdr_event_smsc.go @@ -1,16 +1,14 @@ package model -import "time" - // CDREventSMSC CDR会话对象SMSC cdr_event_smsc type CDREventSMSC struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` - CDRJSONStr string `json:"cdrJSON" gorm:"column:cdr_json"` - CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeName string `json:"neName" gorm:"column:ne_name"` + RmUid string `json:"rmUid" gorm:"column:rm_uid"` // 可能没有 + 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"` // 记录创建存储毫秒 } // TableName 表名称 @@ -26,8 +24,8 @@ type CDREventSMSCQuery struct { RecordType string `json:"recordType" form:"recordType"` // 记录行为 MOSM MTSM CallerParty string `json:"callerParty" form:"callerParty"` // 主叫号码 CalledParty string `json:"calledParty" form:"calledParty"` // 被叫号码 - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp + EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` diff --git a/src/modules/network_data/model/kpi_c_report.go b/src/modules/network_data/model/kpi_c_report.go new file mode 100644 index 00000000..9cd6aedf --- /dev/null +++ b/src/modules/network_data/model/kpi_c_report.go @@ -0,0 +1,52 @@ +package model + +// KpiCTitle 自定义指标标题信息对象 kpi_title +type KpiCTitle struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + KpiId string `json:"kpiId" gorm:"column:kpi_id"` + Title string `json:"title" gorm:"column:title"` + Expression string `json:"expression" gorm:"column:expression"` + Unit string `json:"unit" gorm:"column:unit"` + Status string `json:"status" gorm:"column:status"` // 0-Inactive/1-Active/2-Deleted + Description string `json:"description" gorm:"column:description"` + CreatedBy string `json:"createdBy" gorm:"column:created_by"` + UpdatedAt int64 `json:"updatedAt" gorm:"column:updated_at"` +} + +// TableName 表名称 +func (*KpiCTitle) TableName() string { + return "kpi_c_title" +} + +// KpiCReport 自定义指标报表信息对象 +type KpiCReport struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeName string `json:"neName" gorm:"column:ne_name"` + RmUid string `json:"rmUid" gorm:"column:rm_uid"` + 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 +} + +// TableName 表名称 +func (*KpiCReport) TableName() string { + return "kpi_c_report" +} + +// KPICQuery 指标查询参数结构体 +type KPICQuery struct { + NeType string `form:"neType" binding:"required"` + NeID string `form:"neId" binding:"required"` + 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"` + SortOrder string `form:"sortOrder" binding:"omitempty,oneof=asc desc"` +} diff --git a/src/modules/network_data/model/kpi_report.go b/src/modules/network_data/model/kpi_report.go new file mode 100644 index 00000000..7b71b65d --- /dev/null +++ b/src/modules/network_data/model/kpi_report.go @@ -0,0 +1,48 @@ +package model + +// KpiTitle 指标标题信息对象 kpi_title +type KpiTitle struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + KpiId string `json:"kpiId" gorm:"column:kpi_id"` // KPI标识 + TitleJson string `json:"titleJson" gorm:"column:title_json"` + CnTitle string `json:"cnTitle" gorm:"column:cn_title"` // 中文名 + EnTitle string `json:"enTitle" gorm:"column:en_title"` // 英文名 +} + +// TableName 表名称 +func (*KpiTitle) TableName() string { + return "kpi_title" +} + +// KpiReport 指标报表信息对象 +type KpiReport struct { + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeName string `json:"neName" gorm:"column:ne_name"` + RmUid string `json:"rmUid" gorm:"column:rm_uid"` + 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秒级存储毫秒时间戳 +} + +// TableName 表名称 +func (*KpiReport) TableName() string { + return "kpi_report" +} + +// KPIQuery 指标查询参数结构体 +type KPIQuery struct { + NeType string `form:"neType" binding:"required"` + NeID string `form:"neId" binding:"required"` + 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"` + SortOrder string `form:"sortOrder" binding:"omitempty,oneof=asc desc"` +} diff --git a/src/modules/network_data/model/perf_kpi.go b/src/modules/network_data/model/perf_kpi.go deleted file mode 100644 index be88a063..00000000 --- a/src/modules/network_data/model/perf_kpi.go +++ /dev/null @@ -1,23 +0,0 @@ -package model - -// GoldKPITitle 黄金指标标题信息对象 kpi_title -type GoldKPITitle struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - KPIID string `json:"kpiId" gorm:"column:kpi_id"` - TitleJson string `json:"titleJson" gorm:"column:title_json"` - CnTitle string `json:"cnTitle" gorm:"column:cn_title"` - EnTitle string `json:"enTitle" gorm:"column:en_title"` -} - -// GoldKPIQuery 黄金指标查询参数结构体 -type GoldKPIQuery struct { - NeType string `form:"neType" binding:"required"` - NeID string `form:"neId" binding:"required"` - StartTime string `form:"startTime" binding:"required"` - EndTime string `form:"endTime" binding:"required"` - 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"` - SortOrder string `form:"sortOrder" binding:"omitempty,oneof=asc desc"` -} diff --git a/src/modules/network_data/model/udm_auth.go b/src/modules/network_data/model/udm_auth.go index 8d233c50..fed24077 100644 --- a/src/modules/network_data/model/udm_auth.go +++ b/src/modules/network_data/model/udm_auth.go @@ -1,6 +1,6 @@ package model -// UDMAuthUser UDM鉴权用户 u_auth_user +// UDMAuthUser UDM鉴权用户 udm_auth type UDMAuthUser struct { ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 默认ID IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID @@ -13,5 +13,5 @@ type UDMAuthUser struct { // TableName 表名称 func (*UDMAuthUser) TableName() string { - return "u_auth_user" + return "udm_auth" } diff --git a/src/modules/network_data/model/udm_user_info.go b/src/modules/network_data/model/udm_extend.go similarity index 77% rename from src/modules/network_data/model/udm_user_info.go rename to src/modules/network_data/model/udm_extend.go index 3f3ea4f9..f4aac39b 100644 --- a/src/modules/network_data/model/udm_user_info.go +++ b/src/modules/network_data/model/udm_extend.go @@ -1,7 +1,7 @@ package model -// UDMUserInfo UDM用户IMSI扩展信息 u_user_info -type UDMUserInfo struct { +// UDMExtend UDM用户IMSI扩展信息 udm_extend +type UDMExtend struct { ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 默认ID IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 @@ -10,6 +10,6 @@ type UDMUserInfo struct { } // TableName 表名称 -func (*UDMUserInfo) TableName() string { - return "u_user_info" +func (*UDMExtend) TableName() string { + return "udm_extend" } diff --git a/src/modules/network_data/model/udm_sub.go b/src/modules/network_data/model/udm_sub.go index 96342f9b..9ff03c5f 100644 --- a/src/modules/network_data/model/udm_sub.go +++ b/src/modules/network_data/model/udm_sub.go @@ -1,6 +1,6 @@ package model -// UDMSubUser UDM签约用户 u_sub_user +// UDMSubUser UDM签约用户 udm_sub type UDMSubUser struct { ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID @@ -44,5 +44,5 @@ type UDMSubUser struct { // TableName 表名称 func (*UDMSubUser) TableName() string { - return "u_sub_user" + return "udm_sub" } diff --git a/src/modules/network_data/model/ue_event_amf.go b/src/modules/network_data/model/ue_event_amf.go index 7ba8944f..23340324 100644 --- a/src/modules/network_data/model/ue_event_amf.go +++ b/src/modules/network_data/model/ue_event_amf.go @@ -1,17 +1,15 @@ package model -import "time" - // UEEventAMF UE会话对象AMF ue_event_amf type UEEventAMF struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` - EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state - EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` - CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeName string `json:"neName" gorm:"column:ne_name"` + RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 + Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 + EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state + EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String + CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 } // TableName 表名称 @@ -26,8 +24,8 @@ type UEEventAMFQuery struct { RmUID string `json:"rmUID" form:"rmUID"` EventType string `json:"eventType" form:"eventType"` // 事件类型 auth-result detach cm-state IMSI string `json:"imsi" form:"imsi"` // imsi - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp + EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` diff --git a/src/modules/network_data/model/ue_event_mme.go b/src/modules/network_data/model/ue_event_mme.go index 28100786..5c43eb79 100644 --- a/src/modules/network_data/model/ue_event_mme.go +++ b/src/modules/network_data/model/ue_event_mme.go @@ -1,17 +1,15 @@ package model -import "time" - // UEEventMME UE会话对象MME ue_event_mme type UEEventMME struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` - EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state - EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` - CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` + NeName string `json:"neName" gorm:"column:ne_name"` + RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 + Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 + EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state + EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String + CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 } // TableName 表名称 @@ -26,8 +24,8 @@ type UEEventMMEQuery struct { RmUID string `json:"rmUID" form:"rmUID"` EventType string `json:"eventType" form:"eventType"` // 事件类型 auth-result detach cm-state IMSI string `json:"imsi" form:"imsi"` // imsi - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查timestamp + EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index 6f7cf295..9b034a99 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -21,11 +21,11 @@ func Setup(router *gin.Engine) { { kpiGroup.GET("/title", middleware.PreAuthorize(nil), - controller.NewPerfKPI.Title, + controller.NewKPI.KPITitle, ) kpiGroup.GET("/data", middleware.PreAuthorize(nil), - controller.NewPerfKPI.GoldKPI, + controller.NewKPI.KPIData, ) } @@ -36,7 +36,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewAlarm.List, ) - alarmGroup.DELETE("/:alarmIds", + alarmGroup.DELETE("/:id", middleware.PreAuthorize(nil), controller.NewAlarm.Remove, ) @@ -62,7 +62,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewIMS.CDRList, ) - imsGroup.DELETE("/cdr/:cdrIds", + imsGroup.DELETE("/cdr/:id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewIMS.CDRRemove, @@ -89,7 +89,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewSMSC.CDRList, ) - smscGroup.DELETE("/cdr/:cdrIds", + smscGroup.DELETE("/cdr/:id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewSMSC.CDRRemove, @@ -108,7 +108,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewSMF.CDRList, ) - smfGroup.DELETE("/cdr/:cdrIds", + smfGroup.DELETE("/cdr/:id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewSMF.CDRRemove, @@ -135,7 +135,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewAMF.UEList, ) - amfGroup.DELETE("/ue/:ueIds", + amfGroup.DELETE("/ue/:id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewAMF.UERemove, @@ -206,7 +206,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewUDMAuth.Removes, ) - udmAuthGroup.POST("/export", + udmAuthGroup.GET("/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_EXPORT)), controller.NewUDMAuth.Export, @@ -260,7 +260,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmSub", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewUDMSub.Removes, ) - udmSubGroup.POST("/export", + udmSubGroup.GET("/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmSub", collectlogs.BUSINESS_TYPE_EXPORT)), controller.NewUDMSub.Export, @@ -279,7 +279,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewMME.UEList, ) - mmeGroup.DELETE("/ue/:ueIds", + mmeGroup.DELETE("/ue/:id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewMME.UERemove, @@ -306,7 +306,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewSGWC.CDRList, ) - sgwcGroup.DELETE("/cdr/:cdrIds", + sgwcGroup.DELETE("/cdr/:id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sgwcCDR", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewSGWC.CDRRemove, diff --git a/src/modules/network_data/repository/alarm.go b/src/modules/network_data/repository/alarm.go new file mode 100644 index 00000000..9cbbea1c --- /dev/null +++ b/src/modules/network_data/repository/alarm.go @@ -0,0 +1,194 @@ +package repository + +import ( + "strings" + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 Alarm 结构体 +var NewAlarm = &Alarm{} + +// Alarm 告警 数据层处理 +type Alarm struct{} + +// SelectByPage 分页查询集合 +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.NeID != "" { + tx = tx.Where("ne_id = ?", query.NeID) + } + if query.NeName != "" { + tx = tx.Where("ne_name = ?", query.NeName) + } + if query.PvFlag != "" { + tx = tx.Where("pv_flag = ?", query.PvFlag) + } + if query.AlarmCode != "" { + tx = tx.Where("alarm_code = ?", query.AlarmCode) + } + if query.AlarmType != "" { + tx = tx.Where("alarm_type in (?)", strings.Split(query.AlarmType, ",")) + } + if query.AlarmStatus != "" { + tx = tx.Where("alarm_status = ?", query.AlarmStatus) + } + if query.OrigSeverity != "" { + tx = tx.Where("orig_severity in (?)", strings.Split(query.OrigSeverity, ",")) + } + + if query.BeginTime != 0 { + tx = tx.Where("event_time >= ?", query.BeginTime) + } + if query.EndTime != 0 { + tx = tx.Where("event_time <= ?", query.EndTime) + } + + // 查询结果 + var total int64 = 0 + rows := []model.Alarm{} + + // 查询数量为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) + 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 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.NeId != "" { + tx = tx.Where("ne_id = ?", param.NeId) + } + if param.NeName != "" { + tx = tx.Where("ne_name = ?", param.NeName) + } + if param.AlarmCode > 0 { + tx = tx.Where("alarm_code = ?", param.AlarmCode) + } + if param.AlarmType != "" { + tx = tx.Where("alarm_type = ?", param.AlarmType) + } + if param.AlarmId != "" { + tx = tx.Where("alarm_id = ?", param.AlarmId) + } + if param.OrigSeverity != "" { + eventTypes := strings.Split(param.OrigSeverity, ",") + tx = tx.Where("orig_severity in (%s)", eventTypes) + } + if param.PvFlag != "" { + tx = tx.Where("pv_flag = ?", param.PvFlag) + } + + // 查询数据 + rows := []model.Alarm{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询 +func (r Alarm) SelectByIds(ids []int64) []model.Alarm { + rows := []model.Alarm{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.Alarm{}) + // 构建查询条件 + 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 新增信息 返回新增数据ID +func (r Alarm) Insert(param model.Alarm) int64 { + if param.Timestamp == 0 { + param.Timestamp = time.Now().UnixMilli() + } + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} + +// Update 修改信息 返回受影响的行数 +func (r Alarm) Update(param model.Alarm) int64 { + if param.ID <= 0 { + return 0 + } + tx := db.DB("").Model(&model.Alarm{}) + // 构建查询条件 + tx = tx.Where("id = ?", param.ID) + tx = tx.Omit("id", "timestamp") + // 执行更新 + if err := tx.Updates(param).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 +func (r Alarm) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.Alarm{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// SelectAlarmSeqLast 查询网元告警最后一条序号 +func (r Alarm) SelectAlarmSeqLast(neType, neId string) int64 { + tx := db.DB("").Model(&model.Alarm{}) + tx = tx.Where("ne_type=? and ne_id=?", neType, neId) + tx = tx.Select("alarm_seq").Order("alarm_seq DESC") + // 查询数据 + var alarmSeq int64 = 0 + if err := tx.Limit(1).Find(&alarmSeq).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return alarmSeq + } + return alarmSeq +} diff --git a/src/modules/network_data/repository/alarm_event.go b/src/modules/network_data/repository/alarm_event.go new file mode 100644 index 00000000..c5d84358 --- /dev/null +++ b/src/modules/network_data/repository/alarm_event.go @@ -0,0 +1,169 @@ +package repository + +import ( + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 AlarmEvent 结构体 +var NewAlarmEvent = &AlarmEvent{} + +// AlarmEvent 告警 数据层处理 +type AlarmEvent struct{} + +// SelectByPage 分页查询集合 +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.NeID != "" { + tx = tx.Where("ne_id = ?", query.NeID) + } + if query.AlarmCode != "" { + tx = tx.Where("alarm_code = ?", query.AlarmCode) + } + if query.AlarmStatus != "" { + tx = tx.Where("alarm_status = ?", query.AlarmStatus) + } + if query.BeginTime != 0 { + tx = tx.Where("event_time >= ?", query.BeginTime) + } + if query.EndTime != 0 { + tx = tx.Where("event_time <= ?", query.EndTime) + } + + // 查询结果 + var total int64 = 0 + rows := []model.AlarmEvent{} + + // 查询数量为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) + 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 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.NeId != "" { + tx = tx.Where("ne_id = ?", param.NeId) + } + if param.AlarmId != "" { + tx = tx.Where("alarm_id = ?", param.AlarmId) + } + if param.AlarmCode != 0 { + tx = tx.Where("alarm_code = ?", param.AlarmCode) + } + if param.AlarmStatus != "" { + tx = tx.Where("alarm_status = ?", param.AlarmStatus) + } + // 查询数据 + rows := []model.AlarmEvent{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询 +func (r AlarmEvent) SelectByIds(ids []int64) []model.AlarmEvent { + rows := []model.AlarmEvent{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.AlarmEvent{}) + // 构建查询条件 + 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 新增信息 返回新增数据ID +func (r AlarmEvent) Insert(param model.AlarmEvent) int64 { + if param.Timestamp == 0 { + param.Timestamp = time.Now().UnixMilli() + } + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} + +// Update 修改信息 返回受影响的行数 +func (r AlarmEvent) Update(param model.AlarmEvent) int64 { + if param.ID <= 0 { + return 0 + } + tx := db.DB("").Model(&model.AlarmEvent{}) + // 构建查询条件 + tx = tx.Where("id = ?", param.ID) + tx = tx.Omit("id", "timestamp") + // 执行更新 + if err := tx.Updates(param).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 +func (r AlarmEvent) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.AlarmEvent{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// SelectAlarmEventSeqLast 查询网元告警最后一条序号 +func (r AlarmEvent) SelectAlarmEventSeqLast(neType, neId string) int64 { + tx := db.DB("").Model(&model.AlarmEvent{}) + tx = tx.Where("ne_type=? and ne_id=?", neType, neId) + tx = tx.Select("alarm_seq").Order("alarm_seq DESC") + // 查询数据 + var AlarmEventSeq int64 = 0 + if err := tx.Limit(1).Find(&AlarmEventSeq).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return AlarmEventSeq + } + return AlarmEventSeq +} diff --git a/src/modules/network_data/repository/alarm_forward_log.go b/src/modules/network_data/repository/alarm_forward_log.go new file mode 100644 index 00000000..a855bfd4 --- /dev/null +++ b/src/modules/network_data/repository/alarm_forward_log.go @@ -0,0 +1,104 @@ +package repository + +import ( + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 AlarmForwardLog 结构体 +var NewAlarmForwardLog = &AlarmForwardLog{} + +// AlarmForwardLog 基站状态记录表 数据层处理 +type AlarmForwardLog struct{} + +// SelectByPage 分页查询集合 +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.NeID != "" { + tx = tx.Where("ne_id = ?", query.NeID) + } + if query.BeginTime != 0 { + tx = tx.Where("create_time >= ?", query.BeginTime) + } + if query.EndTime != 0 { + tx = tx.Where("create_time <= ?", query.EndTime) + } + + // 查询结果 + var total int64 = 0 + rows := []model.AlarmForwardLog{} + + // 查询数量为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) + err := tx.Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// SelectByIds 通过ID查询 +func (r AlarmForwardLog) SelectByIds(ids []int64) []model.AlarmForwardLog { + rows := []model.AlarmForwardLog{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.AlarmForwardLog{}) + // 构建查询条件 + 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 +} + +// DeleteByIds 批量删除信息 +func (r AlarmForwardLog) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.AlarmForwardLog{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// Insert 新增信息 +func (r AlarmForwardLog) Insert(param model.AlarmForwardLog) int64 { + if param.CreatedAt == 0 { + param.CreatedAt = time.Now().UnixMilli() + } + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} diff --git a/src/modules/network_data/repository/alarm_log.go b/src/modules/network_data/repository/alarm_log.go new file mode 100644 index 00000000..391ded70 --- /dev/null +++ b/src/modules/network_data/repository/alarm_log.go @@ -0,0 +1,104 @@ +package repository + +import ( + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 AlarmLog 结构体 +var NewAlarmLog = &AlarmLog{} + +// AlarmLog 基站状态记录表 数据层处理 +type AlarmLog struct{} + +// SelectByPage 分页查询集合 +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.NeID != "" { + tx = tx.Where("ne_id = ?", query.NeID) + } + if query.BeginTime != 0 { + tx = tx.Where("create_time >= ?", query.BeginTime) + } + if query.EndTime != 0 { + tx = tx.Where("create_time <= ?", query.EndTime) + } + + // 查询结果 + var total int64 = 0 + rows := []model.AlarmLog{} + + // 查询数量为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) + err := tx.Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// SelectByIds 通过ID查询 +func (r AlarmLog) SelectByIds(ids []int64) []model.AlarmLog { + rows := []model.AlarmLog{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.AlarmLog{}) + // 构建查询条件 + 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 +} + +// DeleteByIds 批量删除信息 +func (r AlarmLog) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.AlarmLog{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// Insert 新增信息 +func (r AlarmLog) Insert(param model.AlarmLog) int64 { + if param.CreatedAt == 0 { + param.CreatedAt = time.Now().UnixMilli() + } + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} diff --git a/src/modules/network_data/repository/all_alarm.go b/src/modules/network_data/repository/all_alarm.go deleted file mode 100644 index 754c0cb0..00000000 --- a/src/modules/network_data/repository/all_alarm.go +++ /dev/null @@ -1,103 +0,0 @@ -package repository - -import ( - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 Alarm 结构体 -var NewAlarm = &Alarm{} - -// Alarm 告警 数据层处理 -type Alarm struct{} - -// SelectByPage 分页查询集合 -func (r Alarm) SelectByPage(querys model.AlarmQuery) ([]model.Alarm, int64) { - tx := datasource.DB("").Model(&model.Alarm{}) - // 查询条件拼接 - if querys.NeType != "" { - tx = tx.Where("ne_type = ?", querys.NeType) - } - if querys.RmUID != "" { - tx = tx.Where("rm_uid = ?", querys.RmUID) - } - if querys.StartTime != "" { - startTime := querys.StartTime - if len(startTime) == 13 { - startTime = startTime[:10] - } - tx = tx.Where("timestamp >= ?", startTime) - } - if querys.EndTime != "" { - endTime := querys.EndTime - if len(endTime) == 13 { - endTime = endTime[:10] - } - tx = tx.Where("timestamp <= ?", endTime) - } - if querys.OrigSeverity != "" { - eventTypes := strings.Split(querys.OrigSeverity, ",") - tx = tx.Where("orig_severity in (%s)", eventTypes) - } - - // 查询结果 - var total int64 = 0 - rows := []model.Alarm{} - - // 查询数量为0直接返回 - if err := tx.Count(&total).Error; err != nil || total <= 0 { - return rows, total - } - - // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - - // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.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 - } - return rows, total -} - -// SelectByIds 通过ID查询 -func (r *Alarm) SelectByIds(ids []string) []model.Alarm { - rows := []model.Alarm{} - if len(ids) <= 0 { - return rows - } - tx := datasource.DB("").Model(&model.Alarm{}) - // 构建查询条件 - 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 -} - -// DeleteByIds 批量删除信息 -func (r *Alarm) DeleteByIds(ids []string) int64 { - if len(ids) <= 0 { - return 0 - } - tx := datasource.DB("").Where("id in ?", ids) - if err := tx.Delete(&model.Alarm{}).Error; err != nil { - logger.Errorf("delete err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} diff --git a/src/modules/network_data/repository/all_perf_kpi.go b/src/modules/network_data/repository/all_perf_kpi.go deleted file mode 100644 index e757fe01..00000000 --- a/src/modules/network_data/repository/all_perf_kpi.go +++ /dev/null @@ -1,131 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 PerfKPI 结构体 -var NewPerfKPI = &PerfKPI{} - -// PerfKPI 性能统计 数据层处理 -type PerfKPI struct{} - -// SelectGoldKPI 通过网元指标数据信息 -func (r *PerfKPI) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - var tableName string = "kpi_report_" - if query.RmUID != "" { - conditions = append(conditions, "gk.rm_uid = ?") - params = append(params, query.RmUID) - } - if query.NeType != "" { - //conditions = append(conditions, "gk.ne_type = ?") - // params = append(params, query.NeType) - tableName += strings.ToLower(query.NeType) - } - if query.StartTime != "" { - conditions = append(conditions, "gk.created_at >= ?") - params = append(params, query.StartTime) - } - if query.EndTime != "" { - conditions = append(conditions, "gk.created_at <= ?") - params = append(params, query.EndTime) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询字段列 - var fields = []string{ - // fmt.Sprintf("FROM_UNIXTIME(FLOOR(gk.created_at / (%d * 1000)) * %d) AS timeGroup", query.Interval, query.Interval), - fmt.Sprintf("CONCAT(FLOOR(gk.created_at / (%d * 1000)) * (%d * 1000)) AS timeGroup", query.Interval, query.Interval), // 时间戳毫秒 - "min(CASE WHEN gk.index != '' THEN gk.index ELSE 0 END) AS startIndex", - "min(CASE WHEN gk.ne_type != '' THEN gk.ne_type ELSE 0 END) AS neType", - "min(CASE WHEN gk.ne_name != '' THEN gk.ne_name ELSE 0 END) AS neName", - } - for i, kid := range kpiIds { - // 特殊字段,只取最后一次收到的非0值 - if kid == "AMF.01" || kid == "UDM.01" || kid == "UDM.02" || kid == "UDM.03" || kid == "SMF.01" { - str := fmt.Sprintf("IFNULL(SUBSTRING_INDEX(GROUP_CONCAT( CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') END ), ',', 1), 0) AS '%s'", i, kid, i, kid) - fields = append(fields, str) - } else { - str := fmt.Sprintf("sum(CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') ELSE 0 END) AS '%s'", i, kid, i, kid) - fields = append(fields, str) - } - } - fieldsSql := strings.Join(fields, ",") - - // 查询数据 - if query.SortField == "" { - query.SortField = "timeGroup" - } - if query.SortOrder == "" { - query.SortOrder = "desc" - } - orderSql := fmt.Sprintf(" order by %s %s", query.SortField, query.SortOrder) - querySql := fmt.Sprintf("SELECT %s FROM %s gk %s GROUP BY timeGroup %s", fieldsSql, tableName, whereSql, orderSql) - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results -} - -// SelectGoldKPITitle 网元对应的指标名称 -func (r *PerfKPI) SelectGoldKPITitle(neType string) []model.GoldKPITitle { - result := []model.GoldKPITitle{} - tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result) - if err := tx.Error; err != nil { - logger.Errorf("Find err => %v", err) - } - return result -} - -// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 -func (r *PerfKPI) SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if neType != "" { - conditions = append(conditions, "kupf.ne_type = ?") - params = append(params, neType) - } - if rmUID != "" { - conditions = append(conditions, "kupf.rm_uid = ?") - params = append(params, rmUID) - } - if startDate != "" { - conditions = append(conditions, "kupf.created_at >= ?") - params = append(params, startDate) - } - if endDate != "" { - conditions = append(conditions, "kupf.created_at <= ?") - params = append(params, endDate) - } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := `SELECT - sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[2].kpi_id') = 'UPF.03' THEN JSON_EXTRACT(kupf.kpi_values, '$[2].value') ELSE 0 END ) AS 'up', - sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[5].kpi_id') = 'UPF.06' THEN JSON_EXTRACT(kupf.kpi_values, '$[5].value') ELSE 0 END ) AS 'down' - FROM kpi_report_upf kupf` - results, err := datasource.RawDB("", querySql+whereSql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results[0] -} diff --git a/src/modules/network_data/repository/cdr_event_ims.go b/src/modules/network_data/repository/cdr_event_ims.go index 31dc7293..de14e4a6 100644 --- a/src/modules/network_data/repository/cdr_event_ims.go +++ b/src/modules/network_data/repository/cdr_event_ims.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" "be.ems/src/modules/network_data/model" ) @@ -16,43 +16,35 @@ var NewCDREventIMS = &CDREventIMS{} type CDREventIMS struct{} // SelectByPage 分页查询集合 -func (r CDREventIMS) SelectByPage(querys model.CDREventIMSQuery) ([]model.CDREventIMS, int64) { - tx := datasource.DB("").Model(&model.CDREventIMS{}) +func (r CDREventIMS) SelectByPage(query model.CDREventIMSQuery) ([]model.CDREventIMS, int64) { + tx := db.DB("").Model(&model.CDREventIMS{}) // 查询条件拼接 - if querys.NeType != "" { - tx = tx.Where("ne_type = ?", querys.NeType) + if query.NeType != "" { + tx = tx.Where("ne_type = ?", query.NeType) } - if querys.RmUID != "" { - tx = tx.Where("rm_uid = ?", querys.RmUID) + if query.RmUID != "" { + tx = tx.Where("rm_uid = ?", query.RmUID) } - if querys.StartTime != "" { - startTime := querys.StartTime - if len(startTime) == 13 { - startTime = startTime[:10] - } - tx = tx.Where("timestamp >= ?", startTime) + if query.BeginTime != 0 { + tx = tx.Where("timestamp >= ?", query.BeginTime) } - if querys.EndTime != "" { - endTime := querys.EndTime - if len(endTime) == 13 { - endTime = endTime[:10] - } - tx = tx.Where("timestamp <= ?", endTime) + if query.EndTime != 0 { + tx = tx.Where("timestamp <= ?", query.EndTime) } - if querys.CallerParty != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') = ?", querys.CallerParty) + if query.CallerParty != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') = ?", query.CallerParty) } - if querys.CalledParty != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.calledParty') = ?", querys.CalledParty) + if query.CalledParty != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.calledParty') = ?", query.CalledParty) } - if querys.RecordType != "" { - recordTypes := strings.Split(querys.RecordType, ",") - var queryStrArr []string + if query.RecordType != "" { + recordTypes := strings.Split(query.RecordType, ",") + var querytrArr []string for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') = '%s'", recordType)) + querytrArr = append(querytrArr, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') = '%s'", recordType)) } - tx = tx.Where(fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + tx = tx.Where(fmt.Sprintf("( %s )", strings.Join(querytrArr, " OR "))) } // 查询结果 @@ -65,16 +57,16 @@ func (r CDREventIMS) SelectByPage(querys model.CDREventIMSQuery) ([]model.CDREve } // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { + if query.SortField != "" { + sortField := query.SortField + if query.SortOrder == "desc" { sortField = sortField + " desc" } tx = tx.Order(sortField) } // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) + pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) err := tx.Find(&rows).Error if err != nil { @@ -85,12 +77,12 @@ func (r CDREventIMS) SelectByPage(querys model.CDREventIMSQuery) ([]model.CDREve } // SelectByIds 通过ID查询 -func (r *CDREventIMS) SelectByIds(ids []string) []model.CDREventIMS { +func (r *CDREventIMS) SelectByIds(ids []int64) []model.CDREventIMS { rows := []model.CDREventIMS{} if len(ids) <= 0 { return rows } - tx := datasource.DB("").Model(&model.CDREventIMS{}) + tx := db.DB("").Model(&model.CDREventIMS{}) // 构建查询条件 tx = tx.Where("id in ?", ids) // 查询数据 @@ -102,11 +94,11 @@ func (r *CDREventIMS) SelectByIds(ids []string) []model.CDREventIMS { } // DeleteByIds 批量删除信息 -func (r *CDREventIMS) DeleteByIds(ids []string) int64 { +func (r *CDREventIMS) DeleteByIds(ids []int64) int64 { if len(ids) <= 0 { return 0 } - tx := datasource.DB("").Where("id in ?", ids) + tx := db.DB("").Where("id in ?", ids) if err := tx.Delete(&model.CDREventIMS{}).Error; err != nil { logger.Errorf("delete err => %v", err.Error()) return 0 diff --git a/src/modules/network_data/repository/cdr_event_sgwc.go b/src/modules/network_data/repository/cdr_event_sgwc.go index cf87e9db..6410120f 100644 --- a/src/modules/network_data/repository/cdr_event_sgwc.go +++ b/src/modules/network_data/repository/cdr_event_sgwc.go @@ -1,7 +1,7 @@ package repository import ( - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" "be.ems/src/modules/network_data/model" ) @@ -13,34 +13,26 @@ var NewCDREventSGWC = &CDREventSGWC{} type CDREventSGWC struct{} // SelectByPage 分页查询集合 -func (r CDREventSGWC) SelectByPage(querys model.CDREventSGWCQuery) ([]model.CDREventSGWC, int64) { - tx := datasource.DB("").Model(&model.CDREventSGWC{}) +func (r CDREventSGWC) SelectByPage(query model.CDREventSGWCQuery) ([]model.CDREventSGWC, int64) { + tx := db.DB("").Model(&model.CDREventSGWC{}) // 查询条件拼接 - if querys.NeType != "" { - tx = tx.Where("ne_type = ?", querys.NeType) + if query.NeType != "" { + tx = tx.Where("ne_type = ?", query.NeType) } - if querys.RmUID != "" { - tx = tx.Where("rm_uid = ?", querys.RmUID) + if query.RmUID != "" { + tx = tx.Where("rm_uid = ?", query.RmUID) } - if querys.StartTime != "" { - startTime := querys.StartTime - if len(startTime) == 13 { - startTime = startTime[:10] - } - tx = tx.Where("timestamp >= ?", startTime) + if query.BeginTime != 0 { + tx = tx.Where("timestamp >= ?", query.BeginTime) } - if querys.EndTime != "" { - endTime := querys.EndTime - if len(endTime) == 13 { - endTime = endTime[:10] - } - tx = tx.Where("timestamp <= ?", endTime) + if query.EndTime != 0 { + tx = tx.Where("timestamp <= ?", query.EndTime) } - if querys.IMSI != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedIMSI') = ?", querys.IMSI) + if query.IMSI != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedIMSI') = ?", query.IMSI) } - if querys.MSISDN != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedMSISDN') = ?", querys.MSISDN) + if query.MSISDN != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedMSISDN') = ?", query.MSISDN) } // 查询结果 @@ -53,16 +45,16 @@ func (r CDREventSGWC) SelectByPage(querys model.CDREventSGWCQuery) ([]model.CDRE } // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { + if query.SortField != "" { + sortField := query.SortField + if query.SortOrder == "desc" { sortField = sortField + " desc" } tx = tx.Order(sortField) } // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) + pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) err := tx.Find(&rows).Error if err != nil { @@ -73,12 +65,12 @@ func (r CDREventSGWC) SelectByPage(querys model.CDREventSGWCQuery) ([]model.CDRE } // SelectByIds 通过ID查询 -func (r *CDREventSGWC) SelectByIds(ids []string) []model.CDREventSGWC { +func (r *CDREventSGWC) SelectByIds(ids []int64) []model.CDREventSGWC { rows := []model.CDREventSGWC{} if len(ids) <= 0 { return rows } - tx := datasource.DB("").Model(&model.CDREventSGWC{}) + tx := db.DB("").Model(&model.CDREventSGWC{}) // 构建查询条件 tx = tx.Where("id in ?", ids) // 查询数据 @@ -90,11 +82,11 @@ func (r *CDREventSGWC) SelectByIds(ids []string) []model.CDREventSGWC { } // DeleteByIds 批量删除信息 -func (r *CDREventSGWC) DeleteByIds(ids []string) int64 { +func (r *CDREventSGWC) DeleteByIds(ids []int64) int64 { if len(ids) <= 0 { return 0 } - tx := datasource.DB("").Where("id in ?", ids) + tx := db.DB("").Where("id in ?", ids) if err := tx.Delete(&model.CDREventSGWC{}).Error; err != nil { logger.Errorf("delete err => %v", err.Error()) return 0 diff --git a/src/modules/network_data/repository/cdr_event_smf.go b/src/modules/network_data/repository/cdr_event_smf.go index 5b46e5ff..6892e19d 100644 --- a/src/modules/network_data/repository/cdr_event_smf.go +++ b/src/modules/network_data/repository/cdr_event_smf.go @@ -1,7 +1,7 @@ package repository import ( - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" "be.ems/src/modules/network_data/model" ) @@ -13,37 +13,29 @@ var NewCDREventSMF = &CDREventSMF{} type CDREventSMF struct{} // SelectByPage 分页查询集合 -func (r CDREventSMF) SelectByPage(querys model.CDREventSMFQuery) ([]model.CDREventSMF, int64) { - tx := datasource.DB("").Model(&model.CDREventSMF{}) +func (r CDREventSMF) SelectByPage(query model.CDREventSMFQuery) ([]model.CDREventSMF, int64) { + tx := db.DB("").Model(&model.CDREventSMF{}) // 查询条件拼接 - if querys.NeType != "" { - tx = tx.Where("ne_type = ?", querys.NeType) + if query.NeType != "" { + tx = tx.Where("ne_type = ?", query.NeType) } - if querys.RmUID != "" { - tx = tx.Where("rm_uid = ?", querys.RmUID) + if query.RmUID != "" { + tx = tx.Where("rm_uid = ?", query.RmUID) } - if querys.StartTime != "" { - startTime := querys.StartTime - if len(startTime) == 13 { - startTime = startTime[:10] - } - tx = tx.Where("timestamp >= ?", startTime) + if query.BeginTime != 0 { + tx = tx.Where("timestamp >= ?", query.BeginTime) } - if querys.EndTime != "" { - endTime := querys.EndTime - if len(endTime) == 13 { - endTime = endTime[:10] - } - tx = tx.Where("timestamp <= ?", endTime) + if query.EndTime != 0 { + tx = tx.Where("timestamp <= ?", query.EndTime) } - if querys.RecordType != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.recordType') = ?", querys.RecordType) + if query.RecordType != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.recordType') = ?", query.RecordType) } - if querys.SubscriberID != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?", querys.SubscriberID) + if query.SubscriberID != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?", query.SubscriberID) } - if querys.DNN != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.pDUSessionChargingInformation.dNNID') = ?", querys.DNN) + if query.DNN != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.pDUSessionChargingInformation.dNNID') = ?", query.DNN) } // 查询结果 @@ -56,16 +48,16 @@ func (r CDREventSMF) SelectByPage(querys model.CDREventSMFQuery) ([]model.CDREve } // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { + if query.SortField != "" { + sortField := query.SortField + if query.SortOrder == "desc" { sortField = sortField + " desc" } tx = tx.Order(sortField) } // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) + pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) err := tx.Find(&rows).Error if err != nil { @@ -76,12 +68,12 @@ func (r CDREventSMF) SelectByPage(querys model.CDREventSMFQuery) ([]model.CDREve } // SelectByIds 通过ID查询 -func (r *CDREventSMF) SelectByIds(ids []string) []model.CDREventSMF { +func (r *CDREventSMF) SelectByIds(ids []int64) []model.CDREventSMF { rows := []model.CDREventSMF{} if len(ids) <= 0 { return rows } - tx := datasource.DB("").Model(&model.CDREventSMF{}) + tx := db.DB("").Model(&model.CDREventSMF{}) // 构建查询条件 tx = tx.Where("id in ?", ids) // 查询数据 @@ -93,11 +85,11 @@ func (r *CDREventSMF) SelectByIds(ids []string) []model.CDREventSMF { } // DeleteByIds 批量删除信息 -func (r *CDREventSMF) DeleteByIds(ids []string) int64 { +func (r *CDREventSMF) DeleteByIds(ids []int64) int64 { if len(ids) <= 0 { return 0 } - tx := datasource.DB("").Where("id in ?", ids) + tx := db.DB("").Where("id in ?", ids) if err := tx.Delete(&model.CDREventSMF{}).Error; err != nil { logger.Errorf("delete err => %v", err.Error()) return 0 diff --git a/src/modules/network_data/repository/cdr_event_smsc.go b/src/modules/network_data/repository/cdr_event_smsc.go index 3b6542ce..928e5063 100644 --- a/src/modules/network_data/repository/cdr_event_smsc.go +++ b/src/modules/network_data/repository/cdr_event_smsc.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" "be.ems/src/modules/network_data/model" ) @@ -16,43 +16,35 @@ var NewCDREventSMSC = &CDREventSMSC{} type CDREventSMSC struct{} // SelectByPage 分页查询集合 -func (r CDREventSMSC) SelectByPage(querys model.CDREventSMSCQuery) ([]model.CDREventSMSC, int64) { - tx := datasource.DB("").Model(&model.CDREventSMSC{}) +func (r CDREventSMSC) SelectByPage(query model.CDREventSMSCQuery) ([]model.CDREventSMSC, int64) { + tx := db.DB("").Model(&model.CDREventSMSC{}) // 查询条件拼接 - if querys.NeType != "" { - tx = tx.Where("ne_type = ?", querys.NeType) + if query.NeType != "" { + tx = tx.Where("ne_type = ?", query.NeType) } - if querys.RmUID != "" { - tx = tx.Where("rm_uid = ?", querys.RmUID) + if query.RmUID != "" { + tx = tx.Where("rm_uid = ?", query.RmUID) } - if querys.StartTime != "" { - startTime := querys.StartTime - if len(startTime) == 13 { - startTime = startTime[:10] - } - tx = tx.Where("timestamp >= ?", startTime) + if query.BeginTime != 0 { + tx = tx.Where("timestamp >= ?", query.BeginTime) } - if querys.EndTime != "" { - endTime := querys.EndTime - if len(endTime) == 13 { - endTime = endTime[:10] - } - tx = tx.Where("timestamp <= ?", endTime) + if query.EndTime != 0 { + tx = tx.Where("timestamp <= ?", query.EndTime) } - if querys.CallerParty != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') = ?", querys.CallerParty) + if query.CallerParty != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') = ?", query.CallerParty) } - if querys.CalledParty != "" { - tx = tx.Where("JSON_EXTRACT(cdr_json, '$.calledParty') = ?", querys.CalledParty) + if query.CalledParty != "" { + tx = tx.Where("JSON_EXTRACT(cdr_json, '$.calledParty') = ?", query.CalledParty) } - if querys.RecordType != "" { - recordTypes := strings.Split(querys.RecordType, ",") - var queryStrArr []string + if query.RecordType != "" { + recordTypes := strings.Split(query.RecordType, ",") + var querytrArr []string for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') = '%s'", recordType)) + querytrArr = append(querytrArr, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') = '%s'", recordType)) } - tx = tx.Where(fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + tx = tx.Where(fmt.Sprintf("( %s )", strings.Join(querytrArr, " OR "))) } // 查询结果 @@ -65,16 +57,16 @@ func (r CDREventSMSC) SelectByPage(querys model.CDREventSMSCQuery) ([]model.CDRE } // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { + if query.SortField != "" { + sortField := query.SortField + if query.SortOrder == "desc" { sortField = sortField + " desc" } tx = tx.Order(sortField) } // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) + pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) err := tx.Find(&rows).Error if err != nil { @@ -85,12 +77,12 @@ func (r CDREventSMSC) SelectByPage(querys model.CDREventSMSCQuery) ([]model.CDRE } // SelectByIds 通过ID查询 -func (r *CDREventSMSC) SelectByIds(ids []string) []model.CDREventSMSC { +func (r *CDREventSMSC) SelectByIds(ids []int64) []model.CDREventSMSC { rows := []model.CDREventSMSC{} if len(ids) <= 0 { return rows } - tx := datasource.DB("").Model(&model.CDREventSMSC{}) + tx := db.DB("").Model(&model.CDREventSMSC{}) // 构建查询条件 tx = tx.Where("id in ?", ids) // 查询数据 @@ -102,11 +94,11 @@ func (r *CDREventSMSC) SelectByIds(ids []string) []model.CDREventSMSC { } // DeleteByIds 批量删除信息 -func (r *CDREventSMSC) DeleteByIds(ids []string) int64 { +func (r *CDREventSMSC) DeleteByIds(ids []int64) int64 { if len(ids) <= 0 { return 0 } - tx := datasource.DB("").Where("id in ?", ids) + tx := db.DB("").Where("id in ?", ids) if err := tx.Delete(&model.CDREventSMSC{}).Error; err != nil { logger.Errorf("delete err => %v", err.Error()) return 0 diff --git a/src/modules/network_data/repository/kpi_c_report.go b/src/modules/network_data/repository/kpi_c_report.go new file mode 100644 index 00000000..44a8ee28 --- /dev/null +++ b/src/modules/network_data/repository/kpi_c_report.go @@ -0,0 +1,89 @@ +package repository + +import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 KpiCReport 结构体 +var NewKpiCReport = &KpiCReport{} + +// KpiCReport 性能统计 数据层处理 +type KpiCReport struct{} + +// SelectGoldKPI 通过网元指标数据信息 +func (r KpiCReport) SelectKPI(query model.KPIQuery) []model.KpiCReport { + rows := []model.KpiCReport{} + if query.NeType == "" { + return rows + } + + tx := db.DB("").Model(&model.KpiCReport{}) + // 表名 + tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(query.NeType)) + tx.Table(tableName) + // 构建查询条件 + if query.RmUID != "" { + tx = tx.Where("rm_uid = ?", query.RmUID) + } + if query.BeginTime != 0 { + tx = tx.Where("created_at >= ?", query.BeginTime) + } + if query.EndTime != 0 { + tx = tx.Where("created_at <= ?", query.EndTime) + } + // 排序 + if query.SortField == "" || query.SortField == "timeGroup" { + query.SortField = "created_at" + } + if query.SortOrder == "" { + query.SortOrder = "desc" + } + tx = tx.Order(fmt.Sprintf("%s %s", query.SortField, query.SortOrder)) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 返回新增数据ID +func (r KpiCReport) Insert(param model.KpiCReport) int64 { + if param.NeType == "" { + return 0 + } + if param.CreatedAt == 0 { + param.CreatedAt = time.Now().UnixMilli() + } + // 表名 + tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(param.NeType)) + // 执行插入 + if err := db.DB("").Table(tableName).Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} + +// SelectKPITitle 网元对应的指标名称 +func (r KpiCReport) SelectKPITitle(neType string) []model.KpiCTitle { + rows := []model.KpiCTitle{} + if neType == "" { + return rows + } + tx := db.DB("").Model(&model.KpiCTitle{}) + // 构建查询条件 + tx = tx.Where("ne_type =?", neType) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} diff --git a/src/modules/network_data/repository/kpi_report.go b/src/modules/network_data/repository/kpi_report.go new file mode 100644 index 00000000..202b395f --- /dev/null +++ b/src/modules/network_data/repository/kpi_report.go @@ -0,0 +1,106 @@ +package repository + +import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) + +// 实例化数据层 KpiReport 结构体 +var NewKpiReport = &KpiReport{} + +// KpiReport 性能统计 数据层处理 +type KpiReport struct{} + +// SelectGoldKPI 通过网元指标数据信息 +func (r KpiReport) SelectKPI(query model.KPIQuery) []model.KpiReport { + rows := []model.KpiReport{} + if query.NeType == "" { + return rows + } + + tx := db.DB("").Model(&model.KpiReport{}) + // 表名 + tableName := fmt.Sprintf("kpi_report_%s", strings.ToLower(query.NeType)) + tx = tx.Table(tableName) + // 构建查询条件 + if query.RmUID != "" { + tx = tx.Where("rm_uid = ?", query.RmUID) + } + if query.BeginTime != 0 { + tx = tx.Where("created_at >= ?", query.BeginTime) + } + if query.EndTime != 0 { + tx = tx.Where("created_at <= ?", query.EndTime) + } + // 排序 + if query.SortField == "" || query.SortField == "timeGroup" { + query.SortField = "created_at" + } + if query.SortOrder == "" { + query.SortOrder = "desc" + } + tx = tx.Order(fmt.Sprintf("%s %s", query.SortField, query.SortOrder)) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 返回新增数据ID +func (r KpiReport) Insert(param model.KpiReport) int64 { + if param.NeType == "" { + return 0 + } + if param.CreatedAt == 0 { + param.CreatedAt = time.Now().UnixMilli() + } + // 表名 + tableName := fmt.Sprintf("kpi_report_%s", strings.ToLower(param.NeType)) + // 执行插入 + if err := db.DB("").Table(tableName).Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} + +// SelectKPITitle 网元对应的指标名称 +func (r KpiReport) SelectKPITitle(neType string) []model.KpiTitle { + rows := []model.KpiTitle{} + if neType == "" { + return rows + } + tx := db.DB("").Model(&model.KpiTitle{}) + // 构建查询条件 + tx = tx.Where("ne_type =?", neType) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectUPF 查询UPF数据 N3上行,N6下行 +func (r KpiReport) SelectUPF(rmUID string, beginTime, endTime int64) []model.KpiReport { + tx := db.DB("").Model(&model.KpiReport{}) + // 表名 + tx = tx.Table("kpi_report_upf") + tx = tx.Where("rm_uid = ?", rmUID) + tx = tx.Where("created_at >= ?", beginTime) + tx = tx.Where("created_at <= ?", endTime) + // 查询数据 + rows := []model.KpiReport{} + if err := tx.Select("kpi_values").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} diff --git a/src/modules/network_data/repository/all_nb_state.go b/src/modules/network_data/repository/nb_state.go similarity index 88% rename from src/modules/network_data/repository/all_nb_state.go rename to src/modules/network_data/repository/nb_state.go index c4ef3a66..0c3fa1ed 100644 --- a/src/modules/network_data/repository/all_nb_state.go +++ b/src/modules/network_data/repository/nb_state.go @@ -3,7 +3,7 @@ package repository import ( "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" "be.ems/src/modules/network_data/model" ) @@ -16,7 +16,7 @@ type NBState struct{} // SelectByPage 分页查询集合 func (r NBState) SelectByPage(query model.NBStateQuery) ([]model.NBState, int64) { - tx := datasource.DB("").Model(&model.NBState{}) + tx := db.DB("").Model(&model.NBState{}) // 查询条件拼接 if query.NeType != "" { tx = tx.Where("ne_type = ?", query.NeType) @@ -64,7 +64,7 @@ func (r NBState) SelectByPage(query model.NBStateQuery) ([]model.NBState, int64) } // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(query.PageNum, query.PageSize) + pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) err := tx.Find(&rows).Error if err != nil { @@ -80,7 +80,7 @@ func (r NBState) SelectByIds(ids []string) []model.NBState { if len(ids) <= 0 { return rows } - tx := datasource.DB("").Model(&model.NBState{}) + tx := db.DB("").Model(&model.NBState{}) // 构建查询条件 tx = tx.Where("id in ?", ids) // 查询数据 @@ -96,7 +96,7 @@ func (r NBState) DeleteByIds(ids []string) int64 { if len(ids) <= 0 { return 0 } - tx := datasource.DB("").Where("id in ?", ids) + tx := db.DB("").Where("id in ?", ids) if err := tx.Delete(&model.NBState{}).Error; err != nil { logger.Errorf("delete err => %v", err.Error()) return 0 @@ -108,7 +108,7 @@ func (r NBState) DeleteByIds(ids []string) int64 { func (r NBState) Insert(param model.NBState) int64 { param.CreateTime = time.Now().UnixMilli() // 执行插入 - if err := datasource.DB("").Create(¶m).Error; err != nil { + if err := db.DB("").Create(¶m).Error; err != nil { logger.Errorf("insert err => %v", err.Error()) return 0 } diff --git a/src/modules/network_data/repository/udm_auth.go b/src/modules/network_data/repository/udm_auth.go index 980ef003..93694628 100644 --- a/src/modules/network_data/repository/udm_auth.go +++ b/src/modules/network_data/repository/udm_auth.go @@ -1,9 +1,8 @@ package repository import ( - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_data/model" ) @@ -17,7 +16,7 @@ type UDMAuthUser struct{} func (r *UDMAuthUser) ClearAndInsert(neId string, uArr []model.UDMAuthUser) int64 { // 不指定neID时,用 TRUNCATE 清空表快 // _, err := datasource.ExecDB("", "TRUNCATE TABLE u_auth_user", nil) - result := datasource.DB("").Where("ne_id = ?", neId).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) } @@ -25,8 +24,8 @@ func (r *UDMAuthUser) ClearAndInsert(neId string, uArr []model.UDMAuthUser) int6 } // SelectPage 根据条件分页查询 -func (r *UDMAuthUser) SelectPage(query map[string]any) (int64, []model.UDMAuthUser) { - tx := datasource.DB("").Model(&model.UDMAuthUser{}) +func (r *UDMAuthUser) SelectPage(query map[string]string) (int64, []model.UDMAuthUser) { + tx := db.DB("").Model(&model.UDMAuthUser{}) // 查询条件拼接 if v, ok := query["imsi"]; ok && v != "" { tx = tx.Where("imsi like concat(concat('%',?), '%')", v) @@ -48,13 +47,13 @@ func (r *UDMAuthUser) SelectPage(query map[string]any) (int64, []model.UDMAuthUs } // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + 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.(string) - if o, ok := query["sortOrder"]; ok && o != nil && v != "" { + sortSql := v + if o, ok := query["sortOrder"]; ok && o != "" { if o == "desc" { sortSql += " desc " } else { @@ -74,7 +73,7 @@ func (r *UDMAuthUser) SelectPage(query map[string]any) (int64, []model.UDMAuthUs // SelectList 根据实体查询 func (r *UDMAuthUser) SelectList(u model.UDMAuthUser) []model.UDMAuthUser { - tx := datasource.DB("").Model(&model.UDMAuthUser{}) + tx := db.DB("").Model(&model.UDMAuthUser{}) // 查询条件拼接 if u.IMSI != "" { tx = tx.Where("imsi = ?", u.IMSI) @@ -93,7 +92,7 @@ func (r *UDMAuthUser) SelectList(u model.UDMAuthUser) []model.UDMAuthUser { // SelectByIMSIAndNeID 通过imsi和ne_id查询 func (r *UDMAuthUser) SelectByIMSIAndNeID(imsi, neId string) model.UDMAuthUser { - tx := datasource.DB("").Model(&model.UDMAuthUser{}) + tx := db.DB("").Model(&model.UDMAuthUser{}) item := model.UDMAuthUser{} // 查询条件拼接 tx = tx.Where("imsi = ? and ne_id = ?", imsi, neId) @@ -106,7 +105,7 @@ func (r *UDMAuthUser) SelectByIMSIAndNeID(imsi, neId string) model.UDMAuthUser { // Insert 批量添加 func (r *UDMAuthUser) Inserts(uArr []model.UDMAuthUser) int64 { - tx := datasource.DB("").CreateInBatches(uArr, 3000) + tx := db.DB("").CreateInBatches(uArr, 3000) if err := tx.Error; err != nil { logger.Errorf("CreateInBatches err => %v", err) } @@ -115,7 +114,7 @@ func (r *UDMAuthUser) Inserts(uArr []model.UDMAuthUser) int64 { // Delete 删除实体 func (r *UDMAuthUser) Delete(imsi, neId string) int64 { - tx := datasource.DefaultDB().Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMAuthUser{}) + tx := db.DB("").Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMAuthUser{}) if err := tx.Error; err != nil { logger.Errorf("Delete err => %v", err) } @@ -124,7 +123,7 @@ func (r *UDMAuthUser) Delete(imsi, neId string) int64 { // DeletePrefixByIMSI 删除前缀匹配的实体 func (r *UDMAuthUser) DeletePrefixByIMSI(neId, imsi string) int64 { - tx := datasource.DefaultDB().Where("imsi like concat(?, '%') and ne_id = ?", imsi, neId).Delete(&model.UDMAuthUser{}) + tx := db.DB("").Where("imsi like concat(?, '%') and ne_id = ?", imsi, neId).Delete(&model.UDMAuthUser{}) if err := tx.Error; err != nil { logger.Errorf("DeletePrefixByIMSI err => %v", err) } diff --git a/src/modules/network_data/repository/udm_user_info.go b/src/modules/network_data/repository/udm_extend.go similarity index 66% rename from src/modules/network_data/repository/udm_user_info.go rename to src/modules/network_data/repository/udm_extend.go index 259dd0ba..b05ec141 100644 --- a/src/modules/network_data/repository/udm_user_info.go +++ b/src/modules/network_data/repository/udm_extend.go @@ -1,20 +1,20 @@ package repository import ( - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" "be.ems/src/modules/network_data/model" ) -// 实例化数据层 UDMUserInfo 结构体 -var NewUDMUserInfo = &UDMUserInfo{} +// 实例化数据层 UDMExtend 结构体 +var NewUDMExtend = &UDMExtend{} -// UDMUserInfo UDM鉴权信息表 数据层处理 -type UDMUserInfo struct{} +// UDMExtend UDM鉴权信息表 数据层处理 +type UDMExtend struct{} // SelectByPage 分页查询集合 -func (r UDMUserInfo) SelectByPage(query map[string]string) ([]model.UDMUserInfo, int64) { - tx := datasource.DB("").Model(&model.UDMUserInfo{}) +func (r UDMExtend) SelectByPage(query map[string]string) ([]model.UDMExtend, int64) { + tx := db.DB("").Model(&model.UDMExtend{}) // 查询条件拼接 if v, ok := query["imsi"]; ok && v != "" { tx = tx.Where("imsi like concat(concat('%', ?), '%')", v) @@ -25,7 +25,7 @@ func (r UDMUserInfo) SelectByPage(query map[string]string) ([]model.UDMUserInfo, // 查询结果 var total int64 = 0 - rows := []model.UDMUserInfo{} + rows := []model.UDMExtend{} // 查询数量为0直接返回 if err := tx.Count(&total).Error; err != nil || total <= 0 { @@ -42,7 +42,7 @@ func (r UDMUserInfo) SelectByPage(query map[string]string) ([]model.UDMUserInfo, } // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(query["pageNum"], query["pageSize"]) + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) err := tx.Find(&rows).Error if err != nil { @@ -53,8 +53,8 @@ func (r UDMUserInfo) SelectByPage(query map[string]string) ([]model.UDMUserInfo, } // SelectList 根据实体查询 -func (r *UDMUserInfo) SelectList(u model.UDMUserInfo) []model.UDMUserInfo { - tx := datasource.DB("").Model(&model.UDMUserInfo{}) +func (r *UDMExtend) SelectList(u model.UDMExtend) []model.UDMExtend { + tx := db.DB("").Model(&model.UDMExtend{}) // 构建查询条件 if u.IMSI != "" { tx = tx.Where("imsi = ?", u.IMSI) @@ -64,7 +64,7 @@ func (r *UDMUserInfo) SelectList(u model.UDMUserInfo) []model.UDMUserInfo { } tx = tx.Order("imsi asc") // 查询数据 - rows := []model.UDMUserInfo{} + rows := []model.UDMExtend{} if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) return rows @@ -73,8 +73,8 @@ func (r *UDMUserInfo) SelectList(u model.UDMUserInfo) []model.UDMUserInfo { } // SelectByIMSIAndNeID 通过imsi和ne_id查询 neId为%时模糊imsi查询 -func (r *UDMUserInfo) SelectByIMSIAndNeID(imsi, neId string) model.UDMUserInfo { - tx := datasource.DB("").Model(&model.UDMUserInfo{}) +func (r *UDMExtend) SelectByIMSIAndNeID(imsi, neId string) model.UDMExtend { + tx := db.DB("").Model(&model.UDMExtend{}) // 构建查询条件 if neId == "%" { tx = tx.Where("imsi like concat(?, '%')", imsi) @@ -82,19 +82,19 @@ func (r *UDMUserInfo) SelectByIMSIAndNeID(imsi, neId string) model.UDMUserInfo { tx = tx.Where(" imsi = ? and ne_id = ?", imsi, neId) } // 查询数据 - rows := []model.UDMUserInfo{} + rows := []model.UDMExtend{} if err := tx.Limit(1).Find(&rows).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) } if len(rows) > 0 { return rows[0] } - return model.UDMUserInfo{} + return model.UDMExtend{} } // Insert 批量添加 -func (r *UDMUserInfo) Inserts(uArr []model.UDMUserInfo) int64 { - tx := datasource.DefaultDB().CreateInBatches(uArr, 3000) +func (r *UDMExtend) Inserts(uArr []model.UDMExtend) int64 { + tx := db.DB("").CreateInBatches(uArr, 3000) if err := tx.Error; err != nil { logger.Errorf("CreateInBatches err => %v", err) } @@ -102,14 +102,14 @@ func (r *UDMUserInfo) Inserts(uArr []model.UDMUserInfo) int64 { } // Delete 删除实体 neId为%时模糊imsi前缀 -func (r *UDMUserInfo) Delete(imsi, neId string) int64 { - tx := datasource.DefaultDB() +func (r *UDMExtend) Delete(imsi, neId string) int64 { + tx := db.DB("") if neId == "%" { tx = tx.Where("imsi like concat(?, '%')", imsi) } else { tx = tx.Where(" imsi = ? and ne_id = ?", imsi, neId) } - tx = tx.Delete(&model.UDMUserInfo{}) + tx = tx.Delete(&model.UDMExtend{}) if err := tx.Error; err != nil { logger.Errorf("Delete err => %v", err) } diff --git a/src/modules/network_data/repository/udm_sub.go b/src/modules/network_data/repository/udm_sub.go index 7f57dc50..8b56a87d 100644 --- a/src/modules/network_data/repository/udm_sub.go +++ b/src/modules/network_data/repository/udm_sub.go @@ -1,9 +1,8 @@ package repository import ( - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_data/model" ) @@ -17,7 +16,7 @@ type UDMSubUser struct{} func (r *UDMSubUser) ClearAndInsert(neId string, u []model.UDMSubUser) int64 { // 不指定neID时,用 TRUNCATE 清空表快 // _, err := datasource.ExecDB("", "TRUNCATE TABLE u_sub_user", nil) - result := datasource.DB("").Where("ne_id = ?", neId).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) } @@ -25,8 +24,8 @@ func (r *UDMSubUser) ClearAndInsert(neId string, u []model.UDMSubUser) int64 { } // SelectPage 根据条件分页查询字典类型 -func (r *UDMSubUser) SelectPage(query map[string]any) (int64, []model.UDMSubUser) { - tx := datasource.DB("").Model(&model.UDMSubUser{}) +func (r *UDMSubUser) SelectPage(query map[string]string) (int64, []model.UDMSubUser) { + tx := db.DB("").Model(&model.UDMSubUser{}) // 查询条件拼接 if v, ok := query["imsi"]; ok && v != "" { tx = tx.Where("imsi like concat(concat('%', ?), '%')", v) @@ -51,13 +50,13 @@ func (r *UDMSubUser) SelectPage(query map[string]any) (int64, []model.UDMSubUser } // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + 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.(string) - if o, ok := query["sortOrder"]; ok && o != nil && v != "" { + sortSql := v + if o, ok := query["sortOrder"]; ok && o != "" { if o == "desc" { sortSql += " desc " } else { @@ -77,7 +76,7 @@ func (r *UDMSubUser) SelectPage(query map[string]any) (int64, []model.UDMSubUser // SelectList 根据实体查询 func (r *UDMSubUser) SelectList(u model.UDMSubUser) []model.UDMSubUser { - tx := datasource.DB("").Model(&model.UDMSubUser{}) + tx := db.DB("").Model(&model.UDMSubUser{}) // 查询条件拼接 if u.IMSI != "" { tx = tx.Where("imsi = ?", u.IMSI) @@ -96,7 +95,7 @@ func (r *UDMSubUser) SelectList(u model.UDMSubUser) []model.UDMSubUser { // SelectByIMSIAndNeID 通过imsi和ne_id查询 func (r *UDMSubUser) SelectByIMSIAndNeID(imsi, neId string) model.UDMSubUser { - tx := datasource.DB("").Model(&model.UDMSubUser{}) + tx := db.DB("").Model(&model.UDMSubUser{}) item := model.UDMSubUser{} // 查询条件拼接 tx = tx.Where("imsi = ? and ne_id = ?", imsi, neId) @@ -109,7 +108,7 @@ func (r *UDMSubUser) SelectByIMSIAndNeID(imsi, neId string) model.UDMSubUser { // Insert 批量添加 func (r *UDMSubUser) Inserts(uArr []model.UDMSubUser) int64 { - tx := datasource.DB("").CreateInBatches(uArr, 2000) + tx := db.DB("").CreateInBatches(uArr, 2000) if err := tx.Error; err != nil { logger.Errorf("CreateInBatches err => %v", err) } @@ -118,7 +117,7 @@ func (r *UDMSubUser) Inserts(uArr []model.UDMSubUser) int64 { // Delete 删除实体 func (r *UDMSubUser) Delete(imsi, neId string) int64 { - tx := datasource.DefaultDB().Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMSubUser{}) + tx := db.DB("").Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMSubUser{}) if err := tx.Error; err != nil { logger.Errorf("Delete err => %v", err) } @@ -127,7 +126,7 @@ func (r *UDMSubUser) Delete(imsi, neId string) int64 { // DeletePrefixByIMSI 删除前缀匹配的实体 func (r *UDMSubUser) DeletePrefixByIMSI(imsiPrefix, neId string) int64 { - tx := datasource.DefaultDB().Where("imsi like concat(?, '%') and ne_id = ?", imsiPrefix, neId).Delete(&model.UDMSubUser{}) + tx := db.DB("").Where("imsi like concat(?, '%') and ne_id = ?", imsiPrefix, neId).Delete(&model.UDMSubUser{}) if err := tx.Error; err != nil { logger.Errorf("DeletePrefixByIMSI err => %v", err) } diff --git a/src/modules/network_data/repository/ue_event_amf.go b/src/modules/network_data/repository/ue_event_amf.go index 9542a6c7..60c109cc 100644 --- a/src/modules/network_data/repository/ue_event_amf.go +++ b/src/modules/network_data/repository/ue_event_amf.go @@ -3,7 +3,7 @@ package repository import ( "strings" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" "be.ems/src/modules/network_data/model" ) @@ -15,35 +15,27 @@ var NewUEEventAMF = &UEEventAMF{} type UEEventAMF struct{} // SelectByPage 分页查询集合 -func (r UEEventAMF) SelectByPage(querys model.UEEventAMFQuery) ([]model.UEEventAMF, int64) { - tx := datasource.DB("").Model(&model.UEEventAMF{}) +func (r UEEventAMF) SelectByPage(query model.UEEventAMFQuery) ([]model.UEEventAMF, int64) { + tx := db.DB("").Model(&model.UEEventAMF{}) // 查询条件拼接 - if querys.NeType != "" { - tx = tx.Where("ne_type = ?", querys.NeType) + if query.NeType != "" { + tx = tx.Where("ne_type = ?", query.NeType) } - if querys.RmUID != "" { - tx = tx.Where("rm_uid = ?", querys.RmUID) + if query.RmUID != "" { + tx = tx.Where("rm_uid = ?", query.RmUID) } - if querys.StartTime != "" { - startTime := querys.StartTime - if len(startTime) == 13 { - startTime = startTime[:10] - } - tx = tx.Where("timestamp >= ?", startTime) + if query.BeginTime != 0 { + tx = tx.Where("timestamp >= ?", query.BeginTime) } - if querys.EndTime != "" { - endTime := querys.EndTime - if len(endTime) == 13 { - endTime = endTime[:10] - } - tx = tx.Where("timestamp <= ?", endTime) + if query.EndTime != 0 { + tx = tx.Where("timestamp <= ?", query.EndTime) } - if querys.EventType != "" { - eventTypes := strings.Split(querys.EventType, ",") + if query.EventType != "" { + eventTypes := strings.Split(query.EventType, ",") tx = tx.Where("event_type in ?", eventTypes) } - if querys.IMSI != "" { - tx = tx.Where("JSON_EXTRACT(event_json, '$.imsi') = ?", querys.IMSI) + if query.IMSI != "" { + tx = tx.Where("JSON_EXTRACT(event_json, '$.imsi') = ?", query.IMSI) } // 查询结果 @@ -56,16 +48,16 @@ func (r UEEventAMF) SelectByPage(querys model.UEEventAMFQuery) ([]model.UEEventA } // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { + if query.SortField != "" { + sortField := query.SortField + if query.SortOrder == "desc" { sortField = sortField + " desc" } tx = tx.Order(sortField) } // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) + pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) err := tx.Find(&rows).Error if err != nil { @@ -76,12 +68,12 @@ func (r UEEventAMF) SelectByPage(querys model.UEEventAMFQuery) ([]model.UEEventA } // SelectByIds 通过ID查询 -func (r UEEventAMF) SelectByIds(ids []string) []model.UEEventAMF { +func (r UEEventAMF) SelectByIds(ids []int64) []model.UEEventAMF { rows := []model.UEEventAMF{} if len(ids) <= 0 { return rows } - tx := datasource.DB("").Model(&model.UEEventAMF{}) + tx := db.DB("").Model(&model.UEEventAMF{}) // 构建查询条件 tx = tx.Where("id in ?", ids) // 查询数据 @@ -93,11 +85,11 @@ func (r UEEventAMF) SelectByIds(ids []string) []model.UEEventAMF { } // DeleteByIds 批量删除信息 -func (r UEEventAMF) DeleteByIds(ids []string) int64 { +func (r UEEventAMF) DeleteByIds(ids []int64) int64 { if len(ids) <= 0 { return 0 } - tx := datasource.DB("").Where("id in ?", ids) + tx := db.DB("").Where("id in ?", ids) if err := tx.Delete(&model.UEEventAMF{}).Error; err != nil { logger.Errorf("delete err => %v", err.Error()) return 0 diff --git a/src/modules/network_data/repository/ue_event_mme.go b/src/modules/network_data/repository/ue_event_mme.go index 7da121d6..ffcb6262 100644 --- a/src/modules/network_data/repository/ue_event_mme.go +++ b/src/modules/network_data/repository/ue_event_mme.go @@ -3,7 +3,7 @@ package repository import ( "strings" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" "be.ems/src/modules/network_data/model" ) @@ -15,35 +15,27 @@ var NewUEEventMME = &UEEventMME{} type UEEventMME struct{} // SelectByPage 分页查询集合 -func (r UEEventMME) SelectByPage(querys model.UEEventMMEQuery) ([]model.UEEventMME, int64) { - tx := datasource.DB("").Model(&model.UEEventMME{}) +func (r UEEventMME) SelectByPage(query model.UEEventMMEQuery) ([]model.UEEventMME, int64) { + tx := db.DB("").Model(&model.UEEventMME{}) // 查询条件拼接 - if querys.NeType != "" { - tx = tx.Where("ne_type = ?", querys.NeType) + if query.NeType != "" { + tx = tx.Where("ne_type = ?", query.NeType) } - if querys.RmUID != "" { - tx = tx.Where("rm_uid = ?", querys.RmUID) + if query.RmUID != "" { + tx = tx.Where("rm_uid = ?", query.RmUID) } - if querys.StartTime != "" { - startTime := querys.StartTime - if len(startTime) == 13 { - startTime = startTime[:10] - } - tx = tx.Where("timestamp >= ?", startTime) + if query.BeginTime != 0 { + tx = tx.Where("timestamp >= ?", query.BeginTime) } - if querys.EndTime != "" { - endTime := querys.EndTime - if len(endTime) == 13 { - endTime = endTime[:10] - } - tx = tx.Where("timestamp <= ?", endTime) + if query.EndTime != 0 { + tx = tx.Where("timestamp <= ?", query.EndTime) } - if querys.EventType != "" { - eventTypes := strings.Split(querys.EventType, ",") + if query.EventType != "" { + eventTypes := strings.Split(query.EventType, ",") tx = tx.Where("event_type in ?", eventTypes) } - if querys.IMSI != "" { - tx = tx.Where("JSON_EXTRACT(event_json, '$.imsi') = ?", querys.IMSI) + if query.IMSI != "" { + tx = tx.Where("JSON_EXTRACT(event_json, '$.imsi') = ?", query.IMSI) } // 查询结果 @@ -56,16 +48,16 @@ func (r UEEventMME) SelectByPage(querys model.UEEventMMEQuery) ([]model.UEEventM } // 排序 - if querys.SortField != "" { - sortField := querys.SortField - if querys.SortOrder == "desc" { + if query.SortField != "" { + sortField := query.SortField + if query.SortOrder == "desc" { sortField = sortField + " desc" } tx = tx.Order(sortField) } // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(querys.PageNum, querys.PageSize) + pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) err := tx.Find(&rows).Error if err != nil { @@ -76,12 +68,12 @@ func (r UEEventMME) SelectByPage(querys model.UEEventMMEQuery) ([]model.UEEventM } // SelectByIds 通过ID查询 -func (r UEEventMME) SelectByIds(ids []string) []model.UEEventMME { +func (r UEEventMME) SelectByIds(ids []int64) []model.UEEventMME { rows := []model.UEEventMME{} if len(ids) <= 0 { return rows } - tx := datasource.DB("").Model(&model.UEEventMME{}) + tx := db.DB("").Model(&model.UEEventMME{}) // 构建查询条件 tx = tx.Where("id in ?", ids) // 查询数据 @@ -93,11 +85,11 @@ func (r UEEventMME) SelectByIds(ids []string) []model.UEEventMME { } // DeleteByIds 批量删除信息 -func (r UEEventMME) DeleteByIds(ids []string) int64 { +func (r UEEventMME) DeleteByIds(ids []int64) int64 { if len(ids) <= 0 { return 0 } - tx := datasource.DB("").Where("id in ?", ids) + tx := db.DB("").Where("id in ?", ids) if err := tx.Delete(&model.UEEventMME{}).Error; err != nil { logger.Errorf("delete err => %v", err.Error()) return 0 diff --git a/src/modules/network_data/service/alarm.go b/src/modules/network_data/service/alarm.go new file mode 100644 index 00000000..838eb738 --- /dev/null +++ b/src/modules/network_data/service/alarm.go @@ -0,0 +1,59 @@ +package service + +import ( + "fmt" + + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) + +// 实例化数据层 Alarm 结构体 +var NewAlarm = &Alarm{ + alarmRepository: repository.NewAlarm, +} + +// Alarm 告警 服务层处理 +type Alarm struct { + alarmRepository *repository.Alarm // 告警数据信息 +} + +// FindByPage 根据条件分页查询 +func (r Alarm) FindByPage(query model.AlarmQuery) ([]model.Alarm, int64) { + return r.alarmRepository.SelectByPage(query) +} + +// Find 查询 +func (r Alarm) Find(param model.Alarm) []model.Alarm { + return r.alarmRepository.Select(param) +} + +// Insert 新增信息 +func (s Alarm) Insert(param model.Alarm) int64 { + return s.alarmRepository.Insert(param) +} + +// Update 修改信息 +func (s Alarm) Update(param model.Alarm) int64 { + return s.alarmRepository.Update(param) +} + +// DeleteByIds 批量删除信息 +func (r Alarm) DeleteByIds(ids []int64) (int64, error) { + // 检查是否存在 + data := r.alarmRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(data) == len(ids) { + rows := r.alarmRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// FindAlarmSeqLast 查询网元告警最后一条序号 +func (s Alarm) FindAlarmSeqLast(neType, neId string) int64 { + return s.alarmRepository.SelectAlarmSeqLast(neType, neId) +} diff --git a/src/modules/network_data/service/alarm_event.go b/src/modules/network_data/service/alarm_event.go new file mode 100644 index 00000000..e3413d81 --- /dev/null +++ b/src/modules/network_data/service/alarm_event.go @@ -0,0 +1,59 @@ +package service + +import ( + "fmt" + + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) + +// 实例化数据层 AlarmEvent 结构体 +var NewAlarmEvent = &AlarmEvent{ + AlarmEventRepository: repository.NewAlarmEvent, +} + +// AlarmEvent 告警 服务层处理 +type AlarmEvent struct { + AlarmEventRepository *repository.AlarmEvent // 告警数据信息 +} + +// FindByPage 根据条件分页查询 +func (r AlarmEvent) FindByPage(query model.AlarmEventQuery) ([]model.AlarmEvent, int64) { + return r.AlarmEventRepository.SelectByPage(query) +} + +// Find 查询 +func (r AlarmEvent) Find(param model.AlarmEvent) []model.AlarmEvent { + return r.AlarmEventRepository.Select(param) +} + +// Insert 新增信息 +func (s AlarmEvent) Insert(param model.AlarmEvent) int64 { + return s.AlarmEventRepository.Insert(param) +} + +// Update 修改信息 +func (s AlarmEvent) Update(param model.AlarmEvent) int64 { + return s.AlarmEventRepository.Update(param) +} + +// DeleteByIds 批量删除信息 +func (r AlarmEvent) DeleteByIds(ids []int64) (int64, error) { + // 检查是否存在 + data := r.AlarmEventRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(data) == len(ids) { + rows := r.AlarmEventRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// FindAlarmEventSeqLast 查询网元告警最后一条序号 +func (s AlarmEvent) FindAlarmEventSeqLast(neType, neId string) int64 { + return s.AlarmEventRepository.SelectAlarmEventSeqLast(neType, neId) +} diff --git a/src/modules/network_data/service/alarm_forward_log.go b/src/modules/network_data/service/alarm_forward_log.go new file mode 100644 index 00000000..dfa543bb --- /dev/null +++ b/src/modules/network_data/service/alarm_forward_log.go @@ -0,0 +1,73 @@ +package service + +import ( + "fmt" + "strconv" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) + +// 实例化数据层 AlarmForwardLog 结构体 +var NewAlarmForwardLog = &AlarmForwardLog{ + alarmForwardLogRepository: repository.NewAlarmForwardLog, +} + +// AlarmForwardLog 基站状态记录表 服务层处理 +type AlarmForwardLog struct { + alarmForwardLogRepository *repository.AlarmForwardLog // 基站状态记录信息 +} + +// FindByPage 根据条件分页查询 +func (r AlarmForwardLog) FindByPage(query model.AlarmForwardLogQuery) ([]model.AlarmForwardLog, int64) { + return r.alarmForwardLogRepository.SelectByPage(query) +} + +// Insert 插入数据 +func (r AlarmForwardLog) Insert(item model.AlarmForwardLog) int64 { + return r.alarmForwardLogRepository.Insert(item) +} + +// DeleteByIds 批量删除信息 +func (r AlarmForwardLog) DeleteByIds(ids []int64) (int64, error) { + // 检查是否存在 + arr := r.alarmForwardLogRepository.SelectByIds(ids) + if len(arr) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(arr) == len(ids) { + rows := r.alarmForwardLogRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// ExportXlsx 导出数据到 xlsx 文件 +func (r AlarmForwardLog) ExportXlsx(rows []model.AlarmForwardLog, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": i18n.TKey(language, "AlarmForwardLog.export.id"), + "B1": i18n.TKey(language, "AlarmForwardLog.export.alarmCode"), + "C1": i18n.TKey(language, "AlarmForwardLog.export.alarmSeq"), + "D1": i18n.TKey(language, "AlarmForwardLog.export.eventTime"), + } + + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: row.AlarmCode, + "C" + idx: row.AlarmSeq, + "D" + idx: row.EventTime, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "Sheet1") +} diff --git a/src/modules/network_data/service/alarm_log.go b/src/modules/network_data/service/alarm_log.go new file mode 100644 index 00000000..2ce43df8 --- /dev/null +++ b/src/modules/network_data/service/alarm_log.go @@ -0,0 +1,73 @@ +package service + +import ( + "fmt" + "strconv" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) + +// 实例化数据层 AlarmLog 结构体 +var NewAlarmLog = &AlarmLog{ + alarmLogRepository: repository.NewAlarmLog, +} + +// AlarmLog 基站状态记录表 服务层处理 +type AlarmLog struct { + alarmLogRepository *repository.AlarmLog // 基站状态记录信息 +} + +// FindByPage 根据条件分页查询 +func (r AlarmLog) FindByPage(query model.AlarmLogQuery) ([]model.AlarmLog, int64) { + return r.alarmLogRepository.SelectByPage(query) +} + +// Insert 插入数据 +func (r AlarmLog) Insert(item model.AlarmLog) int64 { + return r.alarmLogRepository.Insert(item) +} + +// DeleteByIds 批量删除信息 +func (r AlarmLog) DeleteByIds(ids []int64) (int64, error) { + // 检查是否存在 + arr := r.alarmLogRepository.SelectByIds(ids) + if len(arr) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(arr) == len(ids) { + rows := r.alarmLogRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// ExportXlsx 导出数据到 xlsx 文件 +func (r AlarmLog) ExportXlsx(rows []model.AlarmLog, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": i18n.TKey(language, "alarmLog.export.id"), + "B1": i18n.TKey(language, "alarmLog.export.alarmCode"), + "C1": i18n.TKey(language, "alarmLog.export.alarmSeq"), + "D1": i18n.TKey(language, "alarmLog.export.eventTime"), + } + + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: row.AlarmCode, + "C" + idx: row.AlarmSeq, + "D" + idx: row.EventTime, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "Sheet1") +} diff --git a/src/modules/network_data/service/all_alarm.go b/src/modules/network_data/service/all_alarm.go deleted file mode 100644 index 2729e674..00000000 --- a/src/modules/network_data/service/all_alarm.go +++ /dev/null @@ -1,39 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 Alarm 结构体 -var NewAlarm = &Alarm{ - alarmRepository: repository.NewAlarm, -} - -// Alarm 告警 服务层处理 -type Alarm struct { - alarmRepository *repository.Alarm // 告警数据信息 -} - -// SelectPage 根据条件分页查询 -func (r *Alarm) SelectPage(querys model.AlarmQuery) ([]model.Alarm, int64) { - return r.alarmRepository.SelectByPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *Alarm) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.alarmRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(data) == len(ids) { - rows := r.alarmRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/all_perf_kpi.go b/src/modules/network_data/service/all_perf_kpi.go deleted file mode 100644 index b4aef0c4..00000000 --- a/src/modules/network_data/service/all_perf_kpi.go +++ /dev/null @@ -1,79 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "time" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/redis" - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 PerfKPI 结构体 -var NewPerfKPI = &PerfKPI{ - perfKPIRepository: repository.NewPerfKPI, -} - -// PerfKPI 性能统计 服务层处理 -type PerfKPI struct { - perfKPIRepository *repository.PerfKPI // 性能统计数据信息 -} - -// SelectGoldKPI 通过网元指标数据信息 -func (r *PerfKPI) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any { - // 获取数据指标id - var kpiIds []string - kpiTitles := r.perfKPIRepository.SelectGoldKPITitle(query.NeType) - for _, kpiId := range kpiTitles { - kpiIds = append(kpiIds, kpiId.KPIID) - } - - data := r.perfKPIRepository.SelectGoldKPI(query, kpiIds) - if data == nil { - return []map[string]any{} - } - return data -} - -// SelectGoldKPITitle 网元对应的指标名称 -func (r *PerfKPI) SelectGoldKPITitle(neType string) []model.GoldKPITitle { - return r.perfKPIRepository.SelectGoldKPITitle(neType) -} - -// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 -func (r *PerfKPI) SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any { - now := time.Now() - // 获取当前日期 - endDate := fmt.Sprint(now.UnixMilli()) - // 将当前日期前几天数 - startDate := fmt.Sprint(now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()) - - var info map[string]any - - // 读取缓存数据 小于2分钟重新缓存 - key := fmt.Sprintf("%sUPF:totalFlow:%s_%d", cachekey.NE_DATA_KEY, rmUID, day) - infoStr, _ := redis.Get("", key) - if infoStr != "" { - json.Unmarshal([]byte(infoStr), &info) - expireSecond, _ := redis.GetExpire("", key) - if expireSecond > 120 { - return info - } - } - // down * 8 / 1000 / 1000 单位M - info = r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) - if v, ok := info["up"]; ok && v == nil { - info["up"] = 0 - } - if v, ok := info["down"]; ok && v == nil { - info["down"] = 0 - } - - // 保存到缓存 - infoJSON, _ := json.Marshal(info) - redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute) - - return info -} diff --git a/src/modules/network_data/service/cdr_event_ims.go b/src/modules/network_data/service/cdr_event_ims.go index c63c19df..972f4caa 100644 --- a/src/modules/network_data/service/cdr_event_ims.go +++ b/src/modules/network_data/service/cdr_event_ims.go @@ -25,21 +25,21 @@ type CDREventIMS struct { cdrEventIMSRepository *repository.CDREventIMS // CDR会话事件数据信息 } -// SelectPage 根据条件分页查询 -func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) ([]model.CDREventIMS, int64) { - return r.cdrEventIMSRepository.SelectByPage(querys) +// FindByPage 根据条件分页查询 +func (r *CDREventIMS) FindByPage(query model.CDREventIMSQuery) ([]model.CDREventIMS, int64) { + return r.cdrEventIMSRepository.SelectByPage(query) } // DeleteByIds 批量删除信息 -func (r *CDREventIMS) DeleteByIds(cdrIds []string) (int64, error) { +func (r *CDREventIMS) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - ids := r.cdrEventIMSRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { + rows := r.cdrEventIMSRepository.SelectByIds(ids) + if len(rows) <= 0 { return 0, fmt.Errorf("not data") } - if len(ids) == len(cdrIds) { - rows := r.cdrEventIMSRepository.DeleteByIds(cdrIds) + if len(rows) == len(ids) { + rows := r.cdrEventIMSRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! @@ -61,16 +61,16 @@ func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language str "I1": "Hangup Time", } // 读取字典数据 CDR SIP响应代码类别类型 - dictCDRSipCode := sysService.NewSysDictData.SelectDictDataByType("cdr_sip_code") + dictCDRSipCode := sysService.NewSysDictData.FindByType("cdr_sip_code") // 读取字典数据 CDR 呼叫类型 - dictCDRCallType := sysService.NewSysDictData.SelectDictDataByType("cdr_call_type") + dictCDRCallType := sysService.NewSysDictData.FindByType("cdr_call_type") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { idx := strconv.Itoa(i + 2) // 解析 JSON 字符串为 map - var cdrJSON map[string]interface{} - err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON) + var cdrJSON map[string]any + err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) if err != nil { logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) continue @@ -86,8 +86,8 @@ func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language str if v, ok := cdrJSON["callType"]; ok && v != nil { callType = v.(string) for _, v := range dictCDRCallType { - if callType == v.DictValue { - callTypeLable = i18n.TKey(language, v.DictLabel) + if callType == v.DataValue { + callTypeLable = i18n.TKey(language, v.DataLabel) break } } @@ -112,8 +112,8 @@ func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language str if v, ok := cdrJSON["cause"]; ok && v != nil && callType != "sms" { cause := fmt.Sprint(v) for _, v := range dictCDRSipCode { - if cause == v.DictValue { - callResult = i18n.TKey(language, v.DictLabel) + if cause == v.DataValue { + callResult = i18n.TKey(language, v.DataLabel) break } } diff --git a/src/modules/network_data/service/cdr_event_sgwc.go b/src/modules/network_data/service/cdr_event_sgwc.go index 316024ea..5f70168c 100644 --- a/src/modules/network_data/service/cdr_event_sgwc.go +++ b/src/modules/network_data/service/cdr_event_sgwc.go @@ -23,21 +23,21 @@ type CDREventSGWC struct { cdrEventRepository *repository.CDREventSGWC // CDR会话事件数据信息 } -// SelectPage 根据条件分页查询 -func (r *CDREventSGWC) SelectPage(querys model.CDREventSGWCQuery) ([]model.CDREventSGWC, int64) { - return r.cdrEventRepository.SelectByPage(querys) +// FindByPage 根据条件分页查询 +func (r *CDREventSGWC) FindByPage(query model.CDREventSGWCQuery) ([]model.CDREventSGWC, int64) { + return r.cdrEventRepository.SelectByPage(query) } // DeleteByIds 批量删除信息 -func (r *CDREventSGWC) DeleteByIds(cdrIds []string) (int64, error) { +func (r *CDREventSGWC) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { + rows := r.cdrEventRepository.SelectByIds(ids) + if len(rows) <= 0 { return 0, fmt.Errorf("not data") } - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) + if len(rows) == len(ids) { + rows := r.cdrEventRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! @@ -69,6 +69,8 @@ func (r CDREventSGWC) ExportXlsx(rows []model.CDREventSGWC, fileName string) (st "S1": "Record Cause For Rec Closing", "T1": "Record Sequence Number", "U1": "Local Record Sequence Number", + "V1": "Record Type", + "W1": "Record Opening Time", } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) @@ -76,7 +78,7 @@ func (r CDREventSGWC) ExportXlsx(rows []model.CDREventSGWC, fileName string) (st idx := strconv.Itoa(i + 2) // 解析 JSON 字符串为 map var cdrJSON map[string]interface{} - err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON) + err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) if err != nil { logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) continue @@ -101,11 +103,22 @@ func (r CDREventSGWC) ExportXlsx(rows []model.CDREventSGWC, fileName string) (st if v, ok := cdrJSON["pGWAddressUsed"]; ok && v != nil { pGWAddressUsed = fmt.Sprint(v) } + if v, ok := cdrJSON["GGSNAddress"]; ok && v != nil { + pGWAddressUsed = fmt.Sprint(v) + } // sGWAddress sGWAddress := "" if v, ok := cdrJSON["sGWAddress"]; ok && v != nil { sGWAddress = fmt.Sprint(v) } + if v, ok := cdrJSON["SGSNAddress"]; ok && v != nil { + sGWAddress = fmt.Sprint(v) + } + // recordType + recordType := "" + if v, ok := cdrJSON["recordType"]; ok && v != nil { + recordType = fmt.Sprint(v) + } // rATType rATType := "" if v, ok := cdrJSON["rATType"]; ok && v != nil { @@ -189,7 +202,7 @@ func (r CDREventSGWC) ExportXlsx(rows []model.CDREventSGWC, fileName string) (st dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, "B" + idx: row.NeName, - "C" + idx: row.RmUID, + "C" + idx: row.RmUid, "D" + idx: chargingID, "E" + idx: servedIMSI, "F" + idx: servedMSISDN, @@ -208,6 +221,8 @@ func (r CDREventSGWC) ExportXlsx(rows []model.CDREventSGWC, fileName string) (st "S" + idx: causeForRecClosing, "T" + idx: recordSequenceNumber, "U" + idx: localRecordSequenceNumber, + "V" + idx: recordType, + "W" + idx: invocationTimestamp, }) } diff --git a/src/modules/network_data/service/cdr_event_smf.go b/src/modules/network_data/service/cdr_event_smf.go index cbc20769..14b229a3 100644 --- a/src/modules/network_data/service/cdr_event_smf.go +++ b/src/modules/network_data/service/cdr_event_smf.go @@ -22,21 +22,21 @@ type CDREventSMF struct { cdrEventRepository *repository.CDREventSMF // CDR会话事件数据信息 } -// SelectPage 根据条件分页查询 -func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) ([]model.CDREventSMF, int64) { +// FindByPage 根据条件分页查询 +func (r *CDREventSMF) FindByPage(querys model.CDREventSMFQuery) ([]model.CDREventSMF, int64) { return r.cdrEventRepository.SelectByPage(querys) } // DeleteByIds 批量删除信息 -func (r *CDREventSMF) DeleteByIds(cdrIds []string) (int64, error) { +func (r *CDREventSMF) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { + rows := r.cdrEventRepository.SelectByIds(ids) + if len(rows) <= 0 { return 0, fmt.Errorf("not data") } - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) + if len(rows) == len(ids) { + rows := r.cdrEventRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! @@ -77,7 +77,7 @@ func (r CDREventSMF) ExportXlsx(rows []model.CDREventSMF, fileName string) (stri idx := strconv.Itoa(i + 2) // 解析 JSON 字符串为 map var cdrJSON map[string]interface{} - err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON) + err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) if err != nil { logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) continue @@ -204,7 +204,7 @@ func (r CDREventSMF) ExportXlsx(rows []model.CDREventSMF, fileName string) (stri "A" + idx: row.ID, "B" + idx: chargingID, "C" + idx: row.NeName, - "D" + idx: row.RmUID, + "D" + idx: row.RmUid, "E" + idx: subscriptionIDData, "F" + idx: subscriptionIDType, "G" + idx: dataVolumeUplink, diff --git a/src/modules/network_data/service/cdr_event_smsc.go b/src/modules/network_data/service/cdr_event_smsc.go index 04b6837d..01ed2bac 100644 --- a/src/modules/network_data/service/cdr_event_smsc.go +++ b/src/modules/network_data/service/cdr_event_smsc.go @@ -25,21 +25,21 @@ type CDREventSMSC struct { cdrEventRepository *repository.CDREventSMSC // CDR会话事件数据信息 } -// SelectPage 根据条件分页查询 -func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) ([]model.CDREventSMSC, int64) { - return r.cdrEventRepository.SelectByPage(querys) +// FindByPage 根据条件分页查询 +func (r *CDREventSMSC) FindByPage(query model.CDREventSMSCQuery) ([]model.CDREventSMSC, int64) { + return r.cdrEventRepository.SelectByPage(query) } // DeleteByIds 批量删除信息 -func (r *CDREventSMSC) DeleteByIds(cdrIds []string) (int64, error) { +func (r *CDREventSMSC) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { + rows := r.cdrEventRepository.SelectByIds(ids) + if len(rows) <= 0 { return 0, fmt.Errorf("not data") } - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) + if len(rows) == len(ids) { + rows := r.cdrEventRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! @@ -59,14 +59,14 @@ func (r CDREventSMSC) ExportXlsx(rows []model.CDREventSMSC, fileName, language s "G1": "Time", } // 读取字典数据 CDR 原因码 - dictCDRCauseCode := sysService.NewSysDictData.SelectDictDataByType("cdr_cause_code") + dictCDRCauseCode := sysService.NewSysDictData.FindByType("cdr_cause_code") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { idx := strconv.Itoa(i + 2) // 解析 JSON 字符串为 map var cdrJSON map[string]interface{} - err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON) + err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON) if err != nil { logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) continue @@ -103,8 +103,8 @@ func (r CDREventSMSC) ExportXlsx(rows []model.CDREventSMSC, fileName, language s if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" { cause := fmt.Sprint(v) for _, v := range dictCDRCauseCode { - if cause == v.DictValue { - callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DictLabel)) + if cause == v.DataValue { + callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DataLabel)) break } } diff --git a/src/modules/network_data/service/kpi_c_report.go b/src/modules/network_data/service/kpi_c_report.go new file mode 100644 index 00000000..1c70a507 --- /dev/null +++ b/src/modules/network_data/service/kpi_c_report.go @@ -0,0 +1,138 @@ +package service + +import ( + "encoding/json" + "fmt" + "sort" + + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) + +// 实例化数据层 KpiCReport 结构体 +var NewKpiCReport = &KpiCReport{ + kpiCReportRepository: repository.NewKpiCReport, +} + +// KpiCReport 自定义性能统计 服务层处理 +type KpiCReport struct { + kpiCReportRepository *repository.KpiCReport // 自定义KPI数据信息 +} + +// FindKPI 通过网元指标数据信息 +func (s KpiCReport) FindData(query model.KPIQuery) []map[string]any { + // 原始数据 + rows := s.kpiCReportRepository.SelectKPI(query) + if len(rows) <= 0 { + return []map[string]any{} + } + + kpiIdsHas := false + kpiIds := []string{} + // 处理数据 + arr := []map[string]any{} + for _, row := range rows { + // 解析 JSON 字符串为 map + var kpiValues []map[string]any + err := json.Unmarshal([]byte(row.KpiValues), &kpiValues) + if err != nil { + continue + } + + item := map[string]any{ + "neType": row.NeType, + "neName": row.NeName, + "rmUID": row.RmUid, + "startIndex": row.Index, + "timeGroup": row.CreatedAt, + } + + // 遍历 kpiValues 数组 + for _, v := range kpiValues { + kpiId := "-" + if k, ok := v["kpiId"]; ok { + kpiId = fmt.Sprint(k) + } + item[kpiId] = v["value"] + } + + arr = append(arr, item) + + // 添加指标ID + if !kpiIdsHas { + for _, v := range kpiValues { + kpiId := "-" + if k, ok := v["kpiId"]; ok { + kpiId = fmt.Sprint(k) + } + kpiIds = append(kpiIds, kpiId) + } + kpiIdsHas = true + } + } + + // 时间密度分钟 数值单位秒 5分钟的传入300秒 + timeInterval := query.Interval + // 创建一个map来存储按时间段合并后的数据 + timeGroup := make(map[int64][]map[string]any) + // 遍历每个数据项 + for _, v := range arr { + itemTime := parse.Number(v["timeGroup"]) + // 计算时间戳的x分钟时间段(使用秒并除以x分钟) + timeMinute := itemTime / 1000 / timeInterval * timeInterval + // 合并到对应的时间段 + timeGroup[timeMinute] = append(timeGroup[timeMinute], v) + } + // 时间组合输出 + data := []map[string]any{} + for _, records := range timeGroup { + if len(records) <= 0 { + continue + } + // 转换为具体时间显示(根据需要可以格式化显示) + // timeStr := time.Unix(k, 0).Format("2006-01-02 15:04:05") + // fmt.Printf("Time Group: %s records: %d\n", timeStr, len(records)) + startItem := records[len(records)-1] // 取最后一条数据也是最开始startIndex + if len(records) >= 2 { // 最后一条数据不参与计算 + for _, record := range records[:len(records)-1] { + // fmt.Printf(" - startIndex: %v, Value: %v\n", record["startIndex"], record["timeGroup"]) + // 遍历kpiIds数组对lastRecord赋值 + for _, kpiId := range kpiIds { + if v, ok := record[kpiId]; ok { + // 特殊字段,只取一次收到的非0值 + if kpiId == "AMF.01" || kpiId == "UDM.01" || kpiId == "UDM.02" || kpiId == "UDM.03" || kpiId == "SMF.01" { + // startItem[kpiId] = parse.Number(v) + continue // startIndex的值不累加不取最后 + } else { + value := parse.Number(startItem[kpiId]) + startItem[kpiId] = value + parse.Number(v) + } + } + } + } + } + data = append(data, startItem) + } + + // 按时间排序 + sort.SliceStable(data, func(i, j int) bool { + vi := parse.Number(data[i]["timeGroup"]) + vj := parse.Number(data[j]["timeGroup"]) + if query.SortOrder == "asc" { + return vi < vj // asc + } + return vi > vj // desc + }) + return data +} + +// Insert 新增信息 +func (s KpiCReport) Insert(param model.KpiCReport) int64 { + return s.kpiCReportRepository.Insert(param) +} + +// FindKPITitle 网元对应的指标名称 +func (r KpiCReport) FindTitle(neType string) []model.KpiCTitle { + return r.kpiCReportRepository.SelectKPITitle(neType) +} diff --git a/src/modules/network_data/service/kpi_report.go b/src/modules/network_data/service/kpi_report.go new file mode 100644 index 00000000..2bd3f922 --- /dev/null +++ b/src/modules/network_data/service/kpi_report.go @@ -0,0 +1,194 @@ +package service + +import ( + "encoding/json" + "fmt" + "sort" + "time" + + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) + +// 实例化数据层 KpiReport 结构体 +var NewKpiReport = &KpiReport{ + kpiReportRepository: repository.NewKpiReport, +} + +// KpiReport 指标统计 服务层处理 +type KpiReport struct { + kpiReportRepository *repository.KpiReport // 指标数据信息 +} + +// FindData 通过网元指标数据信息 +func (s KpiReport) FindData(query model.KPIQuery) []map[string]any { + // 原始数据 + rows := s.kpiReportRepository.SelectKPI(query) + if len(rows) <= 0 { + return []map[string]any{} + } + + kpiIdsHas := false + kpiIds := []string{} + // 处理数据 + arr := []map[string]any{} + for _, row := range rows { + // 解析 JSON 字符串为 map + var kpiValues []map[string]any + err := json.Unmarshal([]byte(row.KpiValues), &kpiValues) + if err != nil { + continue + } + + item := map[string]any{ + "neType": row.NeType, + "neName": row.NeName, + "rmUID": row.RmUid, + "startIndex": row.Index, + "timeGroup": row.CreatedAt, + } + + // 遍历 kpiValues 数组 + for _, v := range kpiValues { + kpiId := "-" + if k, ok := v["kpiId"]; ok { + kpiId = fmt.Sprint(k) + } + item[kpiId] = v["value"] + } + + arr = append(arr, item) + + // 添加指标ID + if !kpiIdsHas { + for _, v := range kpiValues { + kpiId := "-" + if k, ok := v["kpiId"]; ok { + kpiId = fmt.Sprint(k) + } + kpiIds = append(kpiIds, kpiId) + } + kpiIdsHas = true + } + } + + // 时间密度分钟 数值单位秒 5分钟的传入300秒 + timeInterval := query.Interval + // 创建一个map来存储按时间段合并后的数据 + timeGroup := make(map[int64][]map[string]any) + // 遍历每个数据项 + for _, v := range arr { + itemTime := parse.Number(v["timeGroup"]) + // 计算时间戳的x分钟时间段(使用秒并除以x分钟) + timeMinute := itemTime / 1000 / timeInterval * timeInterval + // 合并到对应的时间段 + timeGroup[timeMinute] = append(timeGroup[timeMinute], v) + } + // 时间组合输出 + data := []map[string]any{} + for _, records := range timeGroup { + if len(records) <= 0 { + continue + } + // 转换为具体时间显示(根据需要可以格式化显示) + // timeStr := time.Unix(k, 0).Format("2006-01-02 15:04:05") + // fmt.Printf("Time Group: %s records: %d\n", timeStr, len(records)) + startItem := records[len(records)-1] // 取最后一条数据也是最开始startIndex + if len(records) >= 2 { // 最后一条数据不参与计算 + for _, record := range records[:len(records)-1] { + // fmt.Printf(" - startIndex: %v, Value: %v\n", record["startIndex"], record["timeGroup"]) + // 遍历kpiIds数组对lastRecord赋值 + for _, kpiId := range kpiIds { + if v, ok := record[kpiId]; ok { + // 特殊字段,只取一次收到的非0值 + if kpiId == "AMF.01" || kpiId == "UDM.01" || kpiId == "UDM.02" || kpiId == "UDM.03" || kpiId == "SMF.01" { + // startItem[kpiId] = parse.Number(v) + continue // startIndex的值不累加不取最后 + } else { + value := parse.Number(startItem[kpiId]) + startItem[kpiId] = value + parse.Number(v) + } + } + } + } + } + data = append(data, startItem) + } + + // 按时间排序 + sort.SliceStable(data, func(i, j int) bool { + vi := parse.Number(data[i]["timeGroup"]) + vj := parse.Number(data[j]["timeGroup"]) + if query.SortOrder == "asc" { + return vi < vj // asc + } + return vi > vj // desc + }) + return data +} + +// Insert 新增信息 +func (s KpiReport) Insert(param model.KpiReport) int64 { + return s.kpiReportRepository.Insert(param) +} + +// FindTitle 网元对应的指标名称 +func (r KpiReport) FindTitle(neType string) []model.KpiTitle { + return r.kpiReportRepository.SelectKPITitle(neType) +} + +// FindUPFTotalFlow 查询UPF总流量 N3上行 N6下行 +func (r KpiReport) FindUPFTotalFlow(rmUID string, day int) map[string]int64 { + now := time.Now() + // 获取当前日期 + endTime := now.UnixMilli() + // 将当前日期前几天数 + beginTime := now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli() + + data := map[string]int64{ + "up": 0, + "down": 0, + } + + // 读取缓存数据 小于2分钟重新缓存 + key := fmt.Sprintf("%s:UPF_FLOW:%s_%d", constants.CACHE_NE_DATA, rmUID, day) + if infoStr, err := redis.Get("", key); err == nil && infoStr != "" { + json.Unmarshal([]byte(infoStr), &data) + if expireSecond, _ := redis.GetExpire("", key); expireSecond > 120 { + return data + } + } + + // down * 8 / 1000 / 1000 单位M + rows := r.kpiReportRepository.SelectUPF(rmUID, beginTime, endTime) + for _, row := range rows { + // 解析 JSON 字符串为 map + var kpiValues []map[string]any + err := json.Unmarshal([]byte(row.KpiValues), &kpiValues) + if err != nil { + continue + } + + // 遍历 kpiValues 数组 + for _, v := range kpiValues { + if k, ok := v["kpiId"]; ok { + if k == "UPF.03" { + data["up"] = data["up"] + parse.Number(v["value"]) + } + if k == "UPF.06" { + data["down"] = data["down"] + parse.Number(v["value"]) + } + } + } + } + + // 保存到缓存 + if infoJSON, err := json.Marshal(data); err == nil { + redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute) + } + + return data +} diff --git a/src/modules/network_data/service/all_nb_state.go b/src/modules/network_data/service/nb_state.go similarity index 95% rename from src/modules/network_data/service/all_nb_state.go rename to src/modules/network_data/service/nb_state.go index 0b06a4bd..372ef9b6 100644 --- a/src/modules/network_data/service/all_nb_state.go +++ b/src/modules/network_data/service/nb_state.go @@ -20,8 +20,8 @@ type NBState struct { nbStateRepository *repository.NBState // 基站状态记录信息 } -// SelectPage 根据条件分页查询 -func (r NBState) SelectPage(query model.NBStateQuery) ([]model.NBState, int64) { +// FindByPage 根据条件分页查询 +func (r NBState) FindByPage(query model.NBStateQuery) ([]model.NBState, int64) { return r.nbStateRepository.SelectByPage(query) } diff --git a/src/modules/network_data/service/udm_auth.go b/src/modules/network_data/service/udm_auth.go index cc291a3e..17a045d1 100644 --- a/src/modules/network_data/service/udm_auth.go +++ b/src/modules/network_data/service/udm_auth.go @@ -5,7 +5,7 @@ import ( "strconv" "strings" - "be.ems/src/framework/redis" + "be.ems/src/framework/database/redis" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" neService "be.ems/src/modules/network_element/service" @@ -98,13 +98,13 @@ func (r *UDMAuthUser) ParseInfo(imsi, neId string, data map[string]string) model return u } -// SelectPage 分页查询数据库 -func (r *UDMAuthUser) SelectPage(query map[string]any) (int64, []model.UDMAuthUser) { +// FindByPage 分页查询数据库 +func (r *UDMAuthUser) FindByPage(query map[string]string) (int64, []model.UDMAuthUser) { return r.udmAuthRepository.SelectPage(query) } -// SelectList 查询数据库 -func (r *UDMAuthUser) SelectList(u model.UDMAuthUser) []model.UDMAuthUser { +// Find 查询数据库 +func (r *UDMAuthUser) Find(u model.UDMAuthUser) []model.UDMAuthUser { return r.udmAuthRepository.SelectList(u) } diff --git a/src/modules/network_data/service/udm_extend.go b/src/modules/network_data/service/udm_extend.go new file mode 100644 index 00000000..07068279 --- /dev/null +++ b/src/modules/network_data/service/udm_extend.go @@ -0,0 +1,33 @@ +package service + +import ( + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) + +// 实例化服务层 UDMExtend 结构体 +var NewUDMExtend = &UDMExtend{ + UDMExtendRepository: repository.NewUDMExtend, +} + +// UDM用户IMSI拓展信息 服务层处理 +type UDMExtend struct { + // UDM用户IMSI信息数据信息 + UDMExtendRepository *repository.UDMExtend +} + +// FindByIMSIAndNeID 通过IMSI和网元标识查询信息 neId为%时模糊imsi查询 +func (r UDMExtend) FindByIMSIAndNeID(imsi, neId string) model.UDMExtend { + return r.UDMExtendRepository.SelectByIMSIAndNeID(imsi, neId) +} + +// Save 新增或修改信息 +func (r UDMExtend) Save(u model.UDMExtend) bool { + r.UDMExtendRepository.Delete(u.IMSI, u.NeId) + return r.UDMExtendRepository.Inserts([]model.UDMExtend{u}) > 0 +} + +// Delete 删除信息 neId为%时模糊imsi查询 +func (r UDMExtend) Delete(imsi, neId string) int64 { + return r.UDMExtendRepository.Delete(imsi, neId) +} diff --git a/src/modules/network_data/service/udm_sub.go b/src/modules/network_data/service/udm_sub.go index 28c78fff..b5955ee8 100644 --- a/src/modules/network_data/service/udm_sub.go +++ b/src/modules/network_data/service/udm_sub.go @@ -5,7 +5,7 @@ import ( "strconv" "strings" - "be.ems/src/framework/redis" + "be.ems/src/framework/database/redis" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" neService "be.ems/src/modules/network_element/service" @@ -13,14 +13,14 @@ import ( // 实例化服务层 UDMSubUser 结构体 var NewUDMSubUser = &UDMSubUser{ - udmSubRepository: repository.NewUDMSub, - udmUserInfoRepository: repository.NewUDMUserInfo, + udmSubRepository: repository.NewUDMSub, + UDMExtendRepository: repository.NewUDMExtend, } // UDM签约信息 服务层处理 type UDMSubUser struct { - udmSubRepository *repository.UDMSubUser // UDM签约信息数据信息 - udmUserInfoRepository *repository.UDMUserInfo // UDM用户IMSI信息数据信息 + udmSubRepository *repository.UDMSubUser // UDM签约信息数据信息 + UDMExtendRepository *repository.UDMExtend // UDM用户IMSI信息数据信息 } // dataByRedis UDM签约用户 db:0 中 udm-sd:* @@ -172,20 +172,20 @@ func (r *UDMSubUser) ParseInfo(imsi, neId string, data map[string]string) model. } // 补充用户拓展信息 - info := r.udmUserInfoRepository.SelectByIMSIAndNeID(imsi, neId) + info := r.UDMExtendRepository.SelectByIMSIAndNeID(imsi, neId) if info.IMSI == imsi { u.Remark = info.Remark } return u } -// SelectPage 分页查询数据库 -func (r *UDMSubUser) SelectPage(query map[string]any) (int64, []model.UDMSubUser) { +// FindByPage 分页查询数据库 +func (r *UDMSubUser) FindByPage(query map[string]string) (int64, []model.UDMSubUser) { return r.udmSubRepository.SelectPage(query) } -// SelectList 查询数据库 -func (r *UDMSubUser) SelectList(u model.UDMSubUser) []model.UDMSubUser { +// Find 查询数据库 +func (r *UDMSubUser) Find(u model.UDMSubUser) []model.UDMSubUser { return r.udmSubRepository.SelectList(u) } @@ -197,8 +197,8 @@ func (r *UDMSubUser) Insert(neId string, u model.UDMSubUser) int64 { r.udmSubRepository.Delete(u.IMSI, neId) // 新增到拓展信息 if u.Remark != "" { - r.udmUserInfoRepository.Delete(u.IMSI, "%") - r.udmUserInfoRepository.Inserts([]model.UDMUserInfo{{ + r.UDMExtendRepository.Delete(u.IMSI, "%") + r.UDMExtendRepository.Inserts([]model.UDMExtend{{ IMSI: u.IMSI, MSISDN: u.MSISDN, NeId: u.NeId, @@ -252,7 +252,7 @@ func (r *UDMSubUser) InsertData(neId, dataType string, data any) int64 { // Delete 删除单个不重新加载 func (r *UDMSubUser) Delete(neId, imsi string) int64 { // 删除拓展信息 - r.udmUserInfoRepository.Delete(imsi, neId) + r.UDMExtendRepository.Delete(imsi, neId) return r.udmSubRepository.Delete(imsi, neId) } @@ -267,7 +267,7 @@ func (r *UDMSubUser) LoadData(neId, imsi, num, remark string) { // 删除原数据 r.udmSubRepository.Delete(keyIMSI, neId) if remark == "-(Deleted)-" { - r.udmUserInfoRepository.Delete(keyIMSI, "%") + r.UDMExtendRepository.Delete(keyIMSI, "%") } // 加载数据,删除标记为-(Deleted)-加载为空不插入 arr := r.dataByRedis(keyIMSI, neId) @@ -277,17 +277,17 @@ func (r *UDMSubUser) LoadData(neId, imsi, num, remark string) { r.udmSubRepository.Inserts(arr) // 拓展信息 if remark != "" { - uarr := make([]model.UDMUserInfo, 0, len(arr)) + uarr := make([]model.UDMExtend, 0, len(arr)) for _, v := range arr { - uarr = append(uarr, model.UDMUserInfo{ + uarr = append(uarr, model.UDMExtend{ IMSI: v.IMSI, MSISDN: v.MSISDN, NeId: v.NeId, Remark: remark, }) } - r.udmUserInfoRepository.Delete(keyIMSI, neId) - r.udmUserInfoRepository.Inserts(uarr) + r.UDMExtendRepository.Delete(keyIMSI, neId) + r.UDMExtendRepository.Inserts(uarr) } } } diff --git a/src/modules/network_data/service/udm_user_info.go b/src/modules/network_data/service/udm_user_info.go deleted file mode 100644 index 0c53a7df..00000000 --- a/src/modules/network_data/service/udm_user_info.go +++ /dev/null @@ -1,33 +0,0 @@ -package service - -import ( - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化服务层 UDMUserInfo 结构体 -var NewUDMUserInfo = &UDMUserInfo{ - udmUserInfoRepository: repository.NewUDMUserInfo, -} - -// UDM用户IMSI拓展信息 服务层处理 -type UDMUserInfo struct { - // UDM用户IMSI信息数据信息 - udmUserInfoRepository *repository.UDMUserInfo -} - -// SelectByIMSIAndNeID 通过IMSI和网元标识查询信息 neId为%时模糊imsi查询 -func (r *UDMUserInfo) SelectByIMSIAndNeID(imsi, neId string) model.UDMUserInfo { - return r.udmUserInfoRepository.SelectByIMSIAndNeID(imsi, neId) -} - -// Save 新增或修改信息 -func (r *UDMUserInfo) Save(u model.UDMUserInfo) bool { - r.udmUserInfoRepository.Delete(u.IMSI, u.NeId) - return r.udmUserInfoRepository.Inserts([]model.UDMUserInfo{u}) > 0 -} - -// Delete 删除信息 neId为%时模糊imsi查询 -func (r *UDMUserInfo) Delete(imsi, neId string) int64 { - return r.udmUserInfoRepository.Delete(imsi, neId) -} diff --git a/src/modules/network_data/service/ue_event_amf.go b/src/modules/network_data/service/ue_event_amf.go index 63234e6c..4ff49c8a 100644 --- a/src/modules/network_data/service/ue_event_amf.go +++ b/src/modules/network_data/service/ue_event_amf.go @@ -23,21 +23,21 @@ type UEEventAMF struct { ueEventRepository *repository.UEEventAMF // UE会话事件数据信息 } -// SelectPage 根据条件分页查询 -func (r *UEEventAMF) SelectPage(querys model.UEEventAMFQuery) ([]model.UEEventAMF, int64) { +// FindByPage 根据条件分页查询 +func (r *UEEventAMF) FindByPage(querys model.UEEventAMFQuery) ([]model.UEEventAMF, int64) { return r.ueEventRepository.SelectByPage(querys) } // DeleteByIds 批量删除信息 -func (r *UEEventAMF) DeleteByIds(ueIds []string) (int64, error) { +func (r *UEEventAMF) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - ids := r.ueEventRepository.SelectByIds(ueIds) - if len(ids) <= 0 { + rows := r.ueEventRepository.SelectByIds(ids) + if len(rows) <= 0 { return 0, fmt.Errorf("no data") } - if len(ids) == len(ueIds) { - rows := r.ueEventRepository.DeleteByIds(ueIds) + if len(rows) == len(ids) { + rows := r.ueEventRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! @@ -55,11 +55,11 @@ func (r UEEventAMF) ExportXlsx(rows []model.UEEventAMF, fileName, language strin "E1": "Time", } // 读取字典数据 UE 事件类型 - dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type") + dictUEEventType := sysService.NewSysDictData.FindByType("ue_event_type") // 读取字典数据 UE 事件认证代码类型 - dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code") + dictUEAauthCode := sysService.NewSysDictData.FindByType("ue_auth_code") // 读取字典数据 UE 事件CM状态 - dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state") + dictUEEventCmState := sysService.NewSysDictData.FindByType("ue_event_cm_state") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { @@ -80,8 +80,8 @@ func (r UEEventAMF) ExportXlsx(rows []model.UEEventAMF, fileName, language strin // 取类型 eventType := "" for _, v := range dictUEEventType { - if row.EventType == v.DictValue { - eventType = i18n.TKey(language, v.DictLabel) + if row.EventType == v.DataValue { + eventType = i18n.TKey(language, v.DataLabel) break } } @@ -96,8 +96,8 @@ func (r UEEventAMF) ExportXlsx(rows []model.UEEventAMF, fileName, language strin if v, ok := eventJSON["authCode"]; ok && v != nil { eventResult = v.(string) for _, v := range dictUEAauthCode { - if eventResult == v.DictValue { - eventResult = i18n.TKey(language, v.DictLabel) + if eventResult == v.DataValue { + eventResult = i18n.TKey(language, v.DataLabel) break } } @@ -116,8 +116,8 @@ func (r UEEventAMF) ExportXlsx(rows []model.UEEventAMF, fileName, language strin if v, ok := eventJSON["status"]; ok && v != nil { eventResult = fmt.Sprint(v) for _, v := range dictUEEventCmState { - if eventResult == v.DictValue { - eventResult = i18n.TKey(language, v.DictLabel) + if eventResult == v.DataValue { + eventResult = i18n.TKey(language, v.DataLabel) break } } diff --git a/src/modules/network_data/service/ue_event_mme.go b/src/modules/network_data/service/ue_event_mme.go index 7f35a19b..87cf9c25 100644 --- a/src/modules/network_data/service/ue_event_mme.go +++ b/src/modules/network_data/service/ue_event_mme.go @@ -25,21 +25,21 @@ type UEEventMME struct { ueEventRepository *repository.UEEventMME // UE会话事件数据信息 } -// SelectPage 根据条件分页查询 -func (r *UEEventMME) SelectPage(querys model.UEEventMMEQuery) ([]model.UEEventMME, int64) { +// FindByPage 根据条件分页查询 +func (r *UEEventMME) FindByPage(querys model.UEEventMMEQuery) ([]model.UEEventMME, int64) { return r.ueEventRepository.SelectByPage(querys) } // DeleteByIds 批量删除信息 -func (r *UEEventMME) DeleteByIds(ueIds []string) (int64, error) { +func (r *UEEventMME) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - ids := r.ueEventRepository.SelectByIds(ueIds) - if len(ids) <= 0 { + rows := r.ueEventRepository.SelectByIds(ids) + if len(rows) <= 0 { return 0, fmt.Errorf("no data") } - if len(ids) == len(ueIds) { - rows := r.ueEventRepository.DeleteByIds(ueIds) + if len(rows) == len(ids) { + rows := r.ueEventRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! @@ -57,11 +57,11 @@ func (r UEEventMME) ExportXlsx(rows []model.UEEventMME, fileName, language strin "E1": "Time", } // 读取字典数据 UE 事件类型 - dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type") + dictUEEventType := sysService.NewSysDictData.FindByType("ue_event_type") // 读取字典数据 UE 事件认证代码类型 - dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code") + dictUEAauthCode := sysService.NewSysDictData.FindByType("ue_auth_code") // 读取字典数据 UE 事件CM状态 - dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state") + dictUEEventCmState := sysService.NewSysDictData.FindByType("ue_event_cm_state") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { @@ -82,8 +82,8 @@ func (r UEEventMME) ExportXlsx(rows []model.UEEventMME, fileName, language strin // 取类型 eventType := row.EventType for _, v := range dictUEEventType { - if row.EventType == v.DictValue { - eventType = i18n.TKey(language, v.DictLabel) + if row.EventType == v.DataValue { + eventType = i18n.TKey(language, v.DataLabel) break } } @@ -93,16 +93,16 @@ func (r UEEventMME) ExportXlsx(rows []model.UEEventMME, fileName, language strin eventResult = v.(string) if row.EventType == "auth-result" { for _, v := range dictUEAauthCode { - if eventResult == v.DictValue { - eventResult = i18n.TKey(language, v.DictLabel) + if eventResult == v.DataValue { + eventResult = i18n.TKey(language, v.DataLabel) break } } } if row.EventType == "cm-state" { for _, v := range dictUEEventCmState { - if eventResult == v.DictValue { - eventResult = i18n.TKey(language, v.DictLabel) + if eventResult == v.DataValue { + eventResult = i18n.TKey(language, v.DataLabel) break } } diff --git a/src/modules/network_element/controller/action.go b/src/modules/network_element/controller/action.go index d1c7dc02..b7f86347 100644 --- a/src/modules/network_element/controller/action.go +++ b/src/modules/network_element/controller/action.go @@ -10,11 +10,11 @@ import ( "github.com/gin-gonic/gin" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/ssh" "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/generate" - "be.ems/src/framework/utils/ssh" - "be.ems/src/framework/vo/result" neService "be.ems/src/modules/network_element/service" ) @@ -45,7 +45,7 @@ type NeActionController struct { // @Description Sending files from local to network elements // @Router /ne/action/pushFile [post] func (s *NeActionController) PushFile(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` NeID string `json:"neId" binding:"required"` @@ -53,40 +53,41 @@ func (s *NeActionController) PushFile(c *gin.Context) { DelTemp bool `json:"delTemp"` // 删除本地临时文件 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(body.NeType, body.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(body.NeType, body.NeID) if neInfo.NeId != body.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sftpClient.Close() // 本地文件 - localFilePath := file.ParseUploadFilePath(body.UploadPath) + localFilePath := file.ParseUploadFileAbsPath(body.UploadPath) // 网元端临时目录 sshClient.RunCMD("mkdir -p /tmp/omc/push && sudo chmod 777 -R /tmp/omc") neFilePath := filepath.ToSlash(filepath.Join("/tmp/omc/push", filepath.Base(localFilePath))) // 复制到远程 if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { - c.JSON(200, result.ErrMsg("Please check if the file exists or if scp is allowed to copy remotely")) + c.JSON(200, resp.ErrMsg("Please check if the file exists or if scp is allowed to copy remotely")) return } @@ -95,7 +96,7 @@ func (s *NeActionController) PushFile(c *gin.Context) { _ = os.Remove(localFilePath) } }() - c.JSON(200, result.OkData(filepath.ToSlash(neFilePath))) + c.JSON(200, resp.OkData(filepath.ToSlash(neFilePath))) } // 从网元到本地获取文件 @@ -105,7 +106,7 @@ func (s *NeActionController) PushFile(c *gin.Context) { // @Tags network_element/action // @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) default(UPF) +// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) default(UPF) // @Param neId query string true "NE ID" default(001) // @Param path query string true "dir path" default(/var/log) // @Param fileName query string true "file name" @@ -116,7 +117,7 @@ func (s *NeActionController) PushFile(c *gin.Context) { // @Description Getting files from the network element to the local // @Router /ne/action/pullFile [get] func (s *NeActionController) PullFile(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` NeID string `form:"neId" binding:"required"` @@ -125,28 +126,29 @@ func (s *NeActionController) PullFile(c *gin.Context) { DelTemp bool `form:"delTemp"` // 删除本地临时文件 } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sftpClient.Close() @@ -159,7 +161,7 @@ func (s *NeActionController) PullFile(c *gin.Context) { } // 复制到本地 if err = sftpClient.CopyFileRemoteToLocal(nePath, localFilePath); err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -178,7 +180,7 @@ func (s *NeActionController) PullFile(c *gin.Context) { // @Tags network_element/action // @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) default(UPF) +// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) default(UPF) // @Param neId query string true "NE ID" default(001) // @Param path query string true "dir path" default(/var/log) // @Param delTemp query boolean false "Delete Temp File" default(false) @@ -188,7 +190,7 @@ func (s *NeActionController) PullFile(c *gin.Context) { // @Description Get directories compressed to ZIP from the network element to the local area // @Router /ne/action/pullDirZip [get] func (s *NeActionController) PullDirZip(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` NeID string `form:"neId" binding:"required"` @@ -196,28 +198,29 @@ func (s *NeActionController) PullDirZip(c *gin.Context) { DelTemp bool `form:"delTemp"` // 删除本地临时文件 } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sftpClient.Close() @@ -231,7 +234,7 @@ func (s *NeActionController) PullDirZip(c *gin.Context) { // 复制到本地 localDirFilePath := filepath.Join(localFilePath, "zip") if err = sftpClient.CopyDirRemoteToLocal(nePath, localDirFilePath); err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -239,7 +242,7 @@ func (s *NeActionController) PullDirZip(c *gin.Context) { zipFileName := fmt.Sprintf("%s-%s-%s.zip", neInfo.NeType, neInfo.NeId, dirName) zipFilePath := filepath.Join(localFilePath, zipFileName) if err := file.CompressZipByDir(zipFilePath, localDirFilePath); err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -258,7 +261,7 @@ func (s *NeActionController) PullDirZip(c *gin.Context) { // @Tags network_element/action // @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) default(UPF) +// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) default(UPF) // @Param neId query string true "NE ID" default(001) // @Param path query string true "file path" default(/var/log) // @Param fileName query string true "file name" @@ -268,7 +271,7 @@ func (s *NeActionController) PullDirZip(c *gin.Context) { // @Description Viewing the contents of a file on the network element side // @Router /ne/action/viewFile [get] func (s *NeActionController) ViewFile(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` NeID string `form:"neId" binding:"required"` @@ -276,21 +279,22 @@ func (s *NeActionController) ViewFile(c *gin.Context) { FileName string `form:"fileName" binding:"required"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() @@ -301,10 +305,10 @@ func (s *NeActionController) ViewFile(c *gin.Context) { output, err := sshClient.RunCMD(fmt.Sprintf("cat %s", nePath)) output = strings.TrimSpace(output) if err != nil || strings.HasPrefix(output, "ls: ") { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "file view cat error"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "file view cat error"))) return } - c.JSON(200, result.OkData(output)) + c.JSON(200, resp.OkData(output)) } // 网元端文件列表 @@ -314,7 +318,7 @@ func (s *NeActionController) ViewFile(c *gin.Context) { // @Tags network_element/action // @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) default(UPF) +// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) default(UPF) // @Param neId query string true "NE ID" default(001) // @Param path query string true "file path" default(/var/log) // @Param pageNum query number true "pageNum" default(1) @@ -326,7 +330,7 @@ func (s *NeActionController) ViewFile(c *gin.Context) { // @Description List of files on the network element side // @Router /ne/action/files [get] func (s *NeActionController) Files(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` NeID string `form:"neId" binding:"required"` @@ -336,21 +340,22 @@ func (s *NeActionController) Files(c *gin.Context) { Search string `form:"search"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() @@ -358,7 +363,7 @@ func (s *NeActionController) Files(c *gin.Context) { // 获取文件列表 rows, err := ssh.FileList(sshClient, querys.Path, querys.Search) if err != nil { - c.JSON(200, result.Ok(map[string]any{ + c.JSON(200, resp.OkData(map[string]any{ "path": querys.Path, "total": len(rows), "rows": []ssh.FileListRow{}, @@ -379,7 +384,7 @@ func (s *NeActionController) Files(c *gin.Context) { splitRows = rows[start:end] } - c.JSON(200, result.Ok(map[string]any{ + c.JSON(200, resp.OkData(map[string]any{ "path": querys.Path, "total": lenNum, "rows": splitRows, @@ -400,21 +405,22 @@ func (s *NeActionController) Files(c *gin.Context) { // @Description Network element service operation // @Router /ne/action/service [put] func (s *NeActionController) Service(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` NeID string `json:"neId" binding:"required"` Action string `json:"action" binding:"required,oneof=start restart stop reboot poweroff"` // 操作行为 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(body.NeType, body.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(body.NeType, body.NeID) if neInfo.NeId != body.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -439,8 +445,8 @@ func (s *NeActionController) Service(c *gin.Context) { _, err := s.neInfoService.NeRunSSHCmd(body.NeType, body.NeID, cmdStr) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } diff --git a/src/modules/network_element/controller/ne_config.go b/src/modules/network_element/controller/ne_config.go index 1badb9f0..c0b85e06 100644 --- a/src/modules/network_element/controller/ne_config.go +++ b/src/modules/network_element/controller/ne_config.go @@ -2,18 +2,18 @@ package controller import ( "encoding/json" - "strings" + "fmt" cm_omc "be.ems/features/cm/omc" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" neFetchlink "be.ems/src/modules/network_element/fetch_link" "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // NewNeConfig 网元参数配置 实例化控制层 @@ -33,125 +33,127 @@ type NeConfigController struct { // 网元参数配置可用属性值列表 // // GET /list -func (s *NeConfigController) List(c *gin.Context) { - querys := ctx.QueryMapString(c) - rows, total := s.neConfigService.SelectPage(querys) - c.JSON(200, result.Ok(map[string]any{"total": total, "rows": rows})) +func (s NeConfigController) List(c *gin.Context) { + query := reqctx.QueryMap(c) + rows, total := s.neConfigService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) } // 网元参数配置可用属性值信息 // // GET /info/:id -func (s *NeConfigController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - id := c.Param("id") - if id == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +func (s NeConfigController) Info(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := parse.Number(c.Query("id")) + if id <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } - data := s.neConfigService.SelectById(id) + data := s.neConfigService.FindById(id) if data.ID != id { // 没有可访问参数配置数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neConfig.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neConfig.noData"))) return } // 将字符串转json数据 if err := json.Unmarshal([]byte(data.ParamJson), &data.ParamData); err != nil { - c.JSON(400, result.CodeMsg(400, err.Error())) + c.JSON(400, resp.CodeMsg(400, err.Error())) return } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // 网元参数配置可用属性值新增 // // POST / -func (s *NeConfigController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeConfigController) Add(c *gin.Context) { var body model.NeConfig - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 将json数据转字符串存储 paramDataByte, err := json.Marshal(body.ParamData) if err != nil { - c.JSON(400, result.CodeMsg(400, err.Error())) + c.JSON(400, resp.CodeMsg(400, err.Error())) return } body.ParamJson = string(paramDataByte) insertId := s.neConfigService.Insert(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + if insertId > 0 { + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元参数配置可用属性值修改 // // PUT / -func (s *NeConfigController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeConfigController) Edit(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeConfig - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.ID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 检查是否存在 - data := s.neConfigService.SelectById(body.ID) + data := s.neConfigService.FindById(body.ID) if data.ID != body.ID { // 没有可访问主机命令数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neConfig.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neConfig.noData"))) return } // 将json数据转字符串存储 paramDataByte, err := json.Marshal(body.ParamData) if err != nil { - c.JSON(400, result.CodeMsg(400, err.Error())) + c.JSON(400, resp.CodeMsg(400, err.Error())) return } body.ParamJson = string(paramDataByte) rows := s.neConfigService.Update(body) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元参数配置可用属性值删除 // // DELETE / -func (s *NeConfigController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - id, okId := c.GetQuery("id") - if id == "" || !okId { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +func (s NeConfigController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := c.Query("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - idsArr := strings.Split(id, ",") - uniqueIDs := parse.RemoveDuplicates(idsArr) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.neConfigService.DeleteByIds(uniqueIDs) + + rows, err := s.neConfigService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // 网元参数配置可用属性值列表指定网元类型全部无分页 @@ -161,21 +163,21 @@ func (s *NeConfigController) Remove(c *gin.Context) { // @Tags network_element/config // @Accept json // @Produce json -// @Param neType path string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC) +// @Param neType path string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) // @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary Network Element Parameter Configuration Available Attribute Values List Specify Network Element Type All Unpaged // @Description Network Element Parameter Configuration Available Attribute Values List Specify Network Element Type All Unpaged // @Router /ne/config/list/{neType} [get] -func (s *NeConfigController) ListByNeType(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeConfigController) ListByNeType(c *gin.Context) { + language := reqctx.AcceptLanguage(c) neType := c.Param("neType") if neType == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } - data := s.neConfigService.SelectNeConfigByNeType(neType) - c.JSON(200, result.OkData(data)) + data := s.neConfigService.FindByNeType(neType) + c.JSON(200, resp.OkData(data)) } // 网元参数配置数据信息 @@ -185,7 +187,7 @@ func (s *NeConfigController) ListByNeType(c *gin.Context) { // @Tags network_element/config // @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) +// @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) // @Param paramName query string true "Available attributes, based on querying the list of attributes" // @Success 200 {object} object "Response Results" @@ -193,21 +195,22 @@ func (s *NeConfigController) ListByNeType(c *gin.Context) { // @Summary Network Element Parameter Configuration Data Information // @Description Network Element Parameter Configuration Data Information // @Router /ne/config/data [get] -func (s *NeConfigController) DataInfo(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeConfigController) DataInfo(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var query struct { NeType string `form:"neType" binding:"required"` // 网元类型 NeId string `form:"neId" binding:"required"` // 网元ID ParamName string `form:"paramName" binding:"required"` // 可用属性 } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(query.NeType, query.NeId) if neInfo.NeId != query.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -215,21 +218,21 @@ func (s *NeConfigController) DataInfo(c *gin.Context) { var o *cm_omc.ConfigOMC resData, err := o.Query(query.ParamName) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(resData)) + c.JSON(200, resp.OkData(resData)) return } // 网元直连 resData, err := neFetchlink.NeConfigInfo(neInfo, query.ParamName) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.Ok(resData)) + c.JSON(200, resp.Ok(resData)) } // 网元参数配置数据修改 @@ -245,8 +248,8 @@ func (s *NeConfigController) DataInfo(c *gin.Context) { // @Summary Network element parameter configuration data modification // @Description Network element parameter configuration data modification // @Router /ne/config/data [put] -func (s *NeConfigController) DataEdit(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeConfigController) DataEdit(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` // 网元类型 NeId string `json:"neId" binding:"required"` // 网元ID @@ -254,34 +257,35 @@ func (s *NeConfigController) DataEdit(c *gin.Context) { ParamData map[string]any `json:"paramData" binding:"required"` Loc string `json:"loc"` // 仅array使用与数据对象内index一致,有多层时划分嵌套层(index/subParamName/index) } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(body.NeType, body.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(body.NeType, body.NeId) if neInfo.NeId != body.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } if body.NeType == "OMC" { var o *cm_omc.ConfigOMC resData, err := o.Modify(body.ParamName, body.ParamData) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(resData)) + c.JSON(200, resp.OkData(resData)) return } // 网元直连 resData, err := neFetchlink.NeConfigUpdate(neInfo, body.ParamName, body.Loc, body.ParamData) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(resData)) + c.JSON(200, resp.OkData(resData)) } // 网元参数配置数据新增(array) @@ -297,8 +301,8 @@ func (s *NeConfigController) DataEdit(c *gin.Context) { // @Summary Network element parameter configuration data added (array) // @Description Network element parameter configuration data added (array) // @Router /ne/config/data [post] -func (s *NeConfigController) DataAdd(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeConfigController) DataAdd(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` // 网元类型 NeId string `json:"neId" binding:"required"` // 网元ID @@ -306,37 +310,38 @@ func (s *NeConfigController) DataAdd(c *gin.Context) { ParamData map[string]any `json:"paramData" binding:"required"` // 数据对象 Loc string `json:"loc" binding:"required"` // 与数据对象内index一致,有多层时划分嵌套层(index/subParamName/index) } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 检查是否array - info := s.neConfigService.SelectNeConfigByNeTypeAndParamName(body.NeType, body.ParamName) + info := s.neConfigService.FindByNeTypeAndParamName(body.NeType, body.ParamName) if info.ParamType != "array" { - c.JSON(400, result.CodeMsg(400, "this attribute does not support adding")) + c.JSON(400, resp.CodeMsg(400, "this attribute does not support adding")) return } // 必须含有index _, idxOk := body.ParamData["index"] if info.ParamType == "array" && !idxOk { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(body.NeType, body.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(body.NeType, body.NeId) if neInfo.NeId != body.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元直连 resData, err := neFetchlink.NeConfigInstall(neInfo, body.ParamName, body.Loc, body.ParamData) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(resData)) + c.JSON(200, resp.OkData(resData)) } // 网元参数配置数据删除(array) @@ -346,7 +351,7 @@ func (s *NeConfigController) DataAdd(c *gin.Context) { // @Tags network_element/config // @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) +// @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) // @Param paramName query string true "Available attributes, based on querying the list of attributes" // @Param loc query string true "Array index" @@ -355,8 +360,8 @@ func (s *NeConfigController) DataAdd(c *gin.Context) { // @Summary Network element parameter configuration data deletion (array) // @Description Network element parameter configuration data deletion (array) // @Router /ne/config/data [delete] -func (s *NeConfigController) DataRemove(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeConfigController) DataRemove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var query struct { NeType string `form:"neType" binding:"required"` // 网元类型 NeId string `form:"neId" binding:"required"` // 网元ID @@ -364,28 +369,28 @@ func (s *NeConfigController) DataRemove(c *gin.Context) { Loc string `form:"loc" binding:"required"` // 与数据对象内index一致,有多层时划分嵌套层(index/subParamName/index) } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 检查是否array - info := s.neConfigService.SelectNeConfigByNeTypeAndParamName(query.NeType, query.ParamName) + info := s.neConfigService.FindByNeTypeAndParamName(query.NeType, query.ParamName) if info.ParamType != "array" { - c.JSON(400, result.CodeMsg(400, "this attribute does not support adding")) + c.JSON(400, resp.CodeMsg(400, "this attribute does not support adding")) return } - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(query.NeType, query.NeId) if neInfo.NeId != query.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元直连 resData, err := neFetchlink.NeConfigDelete(neInfo, query.ParamName, query.Loc) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(resData)) + c.JSON(200, resp.OkData(resData)) } diff --git a/src/modules/network_element/controller/ne_config_backup.go b/src/modules/network_element/controller/ne_config_backup.go index 90937dc3..be1577cc 100644 --- a/src/modules/network_element/controller/ne_config_backup.go +++ b/src/modules/network_element/controller/ne_config_backup.go @@ -1,19 +1,20 @@ package controller import ( + "fmt" "os" "path/filepath" "strings" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "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/framework/vo/result" "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // NewNeConfigBackup 实例化控制层 NeConfigBackupController 结构体 @@ -33,33 +34,32 @@ type NeConfigBackupController struct { // 网元配置文件备份记录列表 // // GET /list -func (s *NeConfigBackupController) List(c *gin.Context) { - querys := ctx.QueryMap(c) - data := s.neConfigBackupService.SelectPage(querys) - - c.JSON(200, result.Ok(data)) +func (s NeConfigBackupController) List(c *gin.Context) { + query := reqctx.QueryMap(c) + rows, total := s.neConfigBackupService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 网元配置文件备份记录信息 // // GET /download?id=xx -func (s *NeConfigBackupController) Download(c *gin.Context) { - language := ctx.AcceptLanguage(c) - id, ok := c.GetQuery("id") - if !ok || id == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +func (s NeConfigBackupController) Download(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := parse.Number(c.Query("id")) + if id <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } - item := s.neConfigBackupService.SelectById(id) + item := s.neConfigBackupService.FindById(id) if item.ID != id { // 没有可访问主机命令数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neConfigBackup.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neConfigBackup.noData"))) return } if _, err := os.Stat(item.Path); err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neConfigBackup.notFoundFile"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neConfigBackup.notFoundFile"))) return } c.FileAttachment(item.Path, item.Name) @@ -68,125 +68,129 @@ func (s *NeConfigBackupController) Download(c *gin.Context) { // 网元配置文件备份记录修改 // // PUT / -func (s *NeConfigBackupController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeConfigBackupController) Edit(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { - ID string `json:"id" binding:"required"` // 记录ID + ID int64 `json:"id" binding:"required"` // 记录ID Name string `json:"name" binding:"required"` // 名称 Remark string `json:"remark" binding:"required"` // 备注 } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.ID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 检查是否存在 - data := s.neConfigBackupService.SelectById(body.ID) + data := s.neConfigBackupService.FindById(body.ID) if data.ID != body.ID { // 没有可访问主机命令数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neConfig.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neConfig.noData"))) return } data.Name = body.Name data.Remark = body.Remark - data.UpdateBy = ctx.LoginUserToUserName(c) + data.UpdateBy = reqctx.LoginUserToUserName(c) rows := s.neConfigBackupService.Update(data) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元配置文件备份记录删除 // // DELETE /?id=xx -func (s *NeConfigBackupController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - id, ok := c.GetQuery("id") - if !ok || id == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +func (s NeConfigBackupController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := c.Query("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(id, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.neConfigBackupService.DeleteByIds(uniqueIDs) + + rows, err := s.neConfigBackupService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // 网元配置文件备份导入 // // POST /import -func (s *NeConfigBackupController) Import(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeConfigBackupController) Import(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` NeId string `json:"neId" binding:"required"` Type string `json:"type" binding:"required,oneof=backup upload"` // 导入类型 Path string `json:"path" binding:"required"` // 文件路径 } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } if !strings.HasSuffix(body.Path, ".zip") { - c.JSON(200, result.ErrMsg("Only supports decompression of zip files")) + c.JSON(200, resp.ErrMsg("Only supports decompression of zip files")) return } // 查网元 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(body.NeType, body.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(body.NeType, body.NeId) if neInfo.NeId != body.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 将zip文件解压到本地后复制到网元端 localFilePath := body.Path if body.Type == "upload" { - localFilePath = file.ParseUploadFilePath(body.Path) + localFilePath = file.ParseUploadFileAbsPath(body.Path) } - if err := s.neConfigBackupService.NeConfigLocalToNe(neInfo, localFilePath); err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + if err := s.neConfigBackupService.FileLocalToNe(neInfo, localFilePath); err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } // 网元配置文件备份导出 // // POST /export -func (s *NeConfigBackupController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeConfigBackupController) Export(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` NeId string `json:"neId" binding:"required"` } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查网元 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(body.NeType, body.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(body.NeType, body.NeId) if neInfo.NeId != body.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 将网元文件备份到本地 - zipFilePath, err := s.neConfigBackupService.NeConfigNeToLocal(neInfo) + zipFilePath, err := s.neConfigBackupService.FileNeToLocal(neInfo) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } // 新增备份记录 @@ -195,7 +199,7 @@ func (s *NeConfigBackupController) Export(c *gin.Context) { NeId: neInfo.NeId, Name: filepath.Base(zipFilePath), Path: zipFilePath, - CreateBy: ctx.LoginUserToUserName(c), + CreateBy: reqctx.LoginUserToUserName(c), } s.neConfigBackupService.Insert(item) c.FileAttachment(item.Path, item.Name) diff --git a/src/modules/network_element/controller/ne_host.go b/src/modules/network_element/controller/ne_host.go index 64fd3069..2135e455 100644 --- a/src/modules/network_element/controller/ne_host.go +++ b/src/modules/network_element/controller/ne_host.go @@ -1,19 +1,20 @@ package controller import ( + "fmt" "strings" + "be.ems/src/framework/database/redis" "be.ems/src/framework/i18n" - "be.ems/src/framework/redis" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/ssh" "be.ems/src/framework/telnet" - "be.ems/src/framework/utils/ctx" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/ssh" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeHostController 结构体 @@ -31,11 +32,10 @@ type NeHostController struct { // 网元主机列表 // // GET /list -func (s *NeHostController) List(c *gin.Context) { - querys := ctx.QueryMap(c) - data := s.neHostService.SelectPage(querys) +func (s NeHostController) List(c *gin.Context) { + query := reqctx.QueryMap(c) + rows, total := s.neHostService.FindByPage(query) - rows := data["rows"].([]model.NeHost) arr := &rows for i := range *arr { (*arr)[i].Password = "-" @@ -43,129 +43,139 @@ func (s *NeHostController) List(c *gin.Context) { (*arr)[i].PassPhrase = "-" } - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) } // 网元主机信息 // -// GET /:hostId -func (s *NeHostController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - hostId := c.Param("hostId") - if hostId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// GET /:id +func (s NeHostController) Info(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := parse.Number(c.Param("id")) + if id <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } - neHost := s.neHostService.SelectById(hostId) - if neHost.HostID != hostId { + neHost := s.neHostService.FindById(id) + if neHost.ID != id { // 没有可访问主机信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.noData"))) return } - c.JSON(200, result.OkData(neHost)) + c.JSON(200, resp.OkData(neHost)) } // 网元主机新增 // // POST / -func (s *NeHostController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeHostController) Add(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeHost - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.HostID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.ID == 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id not is empty")) return } if body.GroupID == "1" { // 主机信息操作【%s】失败,禁止操作网元 msg := i18n.TKey(language, "neHost.banNE") - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查属性值唯一 - uniqueHost := s.neHostService.CheckUniqueHostTitle(body.GroupID, body.Title, body.HostType, "") + uniqueHost := s.neHostService.CheckUniqueHostTitle(body.GroupID, body.Title, body.HostType, 0) if !uniqueHost { // 主机信息操作【%s】失败,同组内名称已存在 msg := i18n.TTemplate(language, "neHost.errKeyExists", map[string]any{"name": body.Title}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - body.CreateBy = ctx.LoginUserToUserName(c) + body.CreateBy = reqctx.LoginUserToUserName(c) insertId := s.neHostService.Insert(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + if insertId > 0 { + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元主机修改 // // PUT / -func (s *NeHostController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeHostController) Edit(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeHost - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.HostID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.ID <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } // 检查属性值唯一 - uniqueHost := s.neHostService.CheckUniqueHostTitle(body.GroupID, body.Title, body.HostType, body.HostID) + uniqueHost := s.neHostService.CheckUniqueHostTitle(body.GroupID, body.Title, body.HostType, body.ID) if !uniqueHost { // 主机信息操作【%s】失败,同组内名称已存在 msg := i18n.TTemplate(language, "neHost.errKeyExists", map[string]any{"name": body.Title}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查是否存在 - neHost := s.neHostService.SelectById(body.HostID) - if neHost.HostID != body.HostID { + neHost := s.neHostService.FindById(body.ID) + if neHost.ID != body.ID { // 没有可访问主机信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.noData"))) return } - body.UpdateBy = ctx.LoginUserToUserName(c) + body.UpdateBy = reqctx.LoginUserToUserName(c) rows := s.neHostService.Update(body) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元主机删除 // -// DELETE /:hostIds -func (s *NeHostController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - hostIds := c.Param("hostIds") - if hostIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// DELETE /:id +func (s NeHostController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(hostIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.neHostService.DeleteByIds(uniqueIDs) + + rows, err := s.neHostService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // 网元主机测试连接 @@ -181,11 +191,12 @@ func (s *NeHostController) Remove(c *gin.Context) { // @Summary Network element host test connection // @Description Network element host test connection // @Router /ne/host/test [post] -func (s *NeHostController) Test(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeHostController) Test(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeHost - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } @@ -201,11 +212,11 @@ func (s *NeHostController) Test(c *gin.Context) { } if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer client.Close() - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } @@ -216,16 +227,16 @@ func (s *NeHostController) Test(c *gin.Context) { client, err := connTelnet.NewClient() if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer client.Close() // 是否有终止符 if strings.HasSuffix(client.LastResult, ">") || strings.HasSuffix(client.LastResult, "> ") || strings.HasSuffix(client.LastResult, "# ") { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } else { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) } return } @@ -237,11 +248,11 @@ func (s *NeHostController) Test(c *gin.Context) { client, err := connRedis.NewClient() if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer client.Close() - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } } @@ -259,22 +270,23 @@ func (s *NeHostController) Test(c *gin.Context) { // @Summary The network element host sends the command // @Description The network element host sends the command // @Router /ne/host/cmd [post] -func (s *NeHostController) Cmd(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeHostController) Cmd(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { - HostID string `json:"hostId" binding:"required"` // 主机ID - Cmd string `json:"cmd" binding:"required"` // 执行命令 + ID int64 `json:"id" binding:"required"` // 主机ID + Cmd string `json:"cmd" binding:"required"` // 执行命令 } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 检查是否存在 - neHost := s.neHostService.SelectById(body.HostID) - if neHost.HostID != body.HostID { + neHost := s.neHostService.FindById(body.ID) + if neHost.ID != body.ID { // 没有可访问主机信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.noData"))) return } @@ -290,7 +302,7 @@ func (s *NeHostController) Cmd(c *gin.Context) { } if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer client.Close() @@ -298,10 +310,10 @@ func (s *NeHostController) Cmd(c *gin.Context) { // 执行命令 output, err := client.RunCMD(body.Cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(output)) + c.JSON(200, resp.OkData(output)) return } @@ -312,7 +324,7 @@ func (s *NeHostController) Cmd(c *gin.Context) { client, err := connTelnet.NewClient() if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer client.Close() @@ -320,10 +332,10 @@ func (s *NeHostController) Cmd(c *gin.Context) { // 执行命令 output, err := client.RunCMD(body.Cmd) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(output)) + c.JSON(200, resp.OkData(output)) return } } @@ -341,11 +353,12 @@ func (s *NeHostController) Cmd(c *gin.Context) { // @Summary Checking the server environment by SSH method of Net Element Hosting // @Description Checking the server environment by SSH method of Net Element Hosting // @Router /ne/host/checkBySSH [post] -func (s *NeHostController) CheckBySSH(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeHostController) CheckBySSH(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeHost - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } @@ -361,7 +374,7 @@ func (s *NeHostController) CheckBySSH(c *gin.Context) { } if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer client.Close() @@ -381,7 +394,7 @@ func (s *NeHostController) CheckBySSH(c *gin.Context) { // 执行命令 检查系统环境 output, err := client.RunCMD("uname -snrm && cat /etc/os-release | grep PRETTY_NAME") if err != nil { - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) return } output = strings.TrimSuffix(output, "\n") @@ -426,7 +439,7 @@ func (s *NeHostController) CheckBySSH(c *gin.Context) { } } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // 网元主机SSH方式授权免密发送 @@ -442,11 +455,16 @@ func (s *NeHostController) CheckBySSH(c *gin.Context) { // @Summary Network element host SSH method of authorization for password-free sending // @Description Network element host SSH method of authorization for password-free sending // @Router /ne/host/authorizedBySSH [post] -func (s *NeHostController) AuthorizedBySSH(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeHostController) AuthorizedBySSH(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeHost - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil || body.AuthMode == "2" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.AuthMode == "2" { + c.JSON(400, resp.CodeMsg(40010, "bind err: auth mode not equals 2")) return } @@ -464,7 +482,7 @@ func (s *NeHostController) AuthorizedBySSH(c *gin.Context) { } if sshLink { // 连接主机成功,无需重复免密授权认证 - c.JSON(200, result.OkMsg(i18n.TKey(language, "neHost.okBySSHLink"))) + c.JSON(200, resp.OkMsg(i18n.TKey(language, "neHost.okBySSHLink"))) return } @@ -474,7 +492,7 @@ func (s *NeHostController) AuthorizedBySSH(c *gin.Context) { client, err := connSSH.NewClient() if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer client.Close() @@ -482,8 +500,8 @@ func (s *NeHostController) AuthorizedBySSH(c *gin.Context) { // 发送密钥 err = client.SendToAuthorizedKeys() if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } diff --git a/src/modules/network_element/controller/ne_host_cmd.go b/src/modules/network_element/controller/ne_host_cmd.go index 31031da5..088796d5 100644 --- a/src/modules/network_element/controller/ne_host_cmd.go +++ b/src/modules/network_element/controller/ne_host_cmd.go @@ -1,16 +1,16 @@ package controller import ( - "strings" + "fmt" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeHostCmdController 结构体 @@ -28,124 +28,125 @@ type NeHostCmdController struct { // 网元主机命令列表 // // GET /list -func (s *NeHostCmdController) List(c *gin.Context) { - querys := ctx.QueryMap(c) - data := s.neHostCmdService.SelectPage(querys) - - c.JSON(200, result.Ok(data)) +func (s NeHostCmdController) List(c *gin.Context) { + query := reqctx.QueryMap(c) + rows, total := s.neHostCmdService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) } // 网元主机命令信息 // -// GET /:cmdId -func (s *NeHostCmdController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - cmdId := c.Param("cmdId") - if cmdId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// GET /:id +func (s NeHostCmdController) Info(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := parse.Number(c.Param("id")) + if id <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } - neHost := s.neHostCmdService.SelectById(cmdId) - if neHost.CmdID != cmdId { + neHost := s.neHostCmdService.FindById(id) + if neHost.ID != id { // 没有可访问主机命令数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHostCmd.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHostCmd.noData"))) return } - c.JSON(200, result.OkData(neHost)) + c.JSON(200, resp.OkData(neHost)) } // 网元主机命令新增 // // POST / -func (s *NeHostCmdController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeHostCmdController) Add(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeHostCmd - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.CmdID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 检查属性值唯一 - uniqueHostCmd := s.neHostCmdService.CheckUniqueGroupTitle(body.GroupID, body.Title, body.CmdType, "") + uniqueHostCmd := s.neHostCmdService.CheckUniqueGroupTitle(body.GroupID, body.Title, body.CmdType, 0) if !uniqueHostCmd { // 主机命令操作【%s】失败,同组内名称已存在 msg := i18n.TTemplate(language, "neHostCmd.errKeyExists", map[string]any{"name": body.Title}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - body.CreateBy = ctx.LoginUserToUserName(c) + body.CreateBy = reqctx.LoginUserToUserName(c) insertId := s.neHostCmdService.Insert(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + if insertId > 0 { + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元主机命令修改 // // PUT / -func (s *NeHostCmdController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeHostCmdController) Edit(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeHostCmd - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.CmdID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 检查属性值唯一 - uniqueHostCmd := s.neHostCmdService.CheckUniqueGroupTitle(body.GroupID, body.Title, body.CmdType, body.CmdID) + uniqueHostCmd := s.neHostCmdService.CheckUniqueGroupTitle(body.GroupID, body.Title, body.CmdType, body.ID) if !uniqueHostCmd { // 主机命令操作【%s】失败,同组内名称已存在 msg := i18n.TTemplate(language, "neHostCmd.errKeyExists", map[string]any{"name": body.Title}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查是否存在 - neHost := s.neHostCmdService.SelectById(body.CmdID) - if neHost.CmdID != body.CmdID { + neHost := s.neHostCmdService.FindById(body.ID) + if neHost.ID != body.ID { // 没有可访问主机命令数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHostCmd.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHostCmd.noData"))) return } - body.UpdateBy = ctx.LoginUserToUserName(c) + body.UpdateBy = reqctx.LoginUserToUserName(c) rows := s.neHostCmdService.Update(body) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元主机命令删除 // -// DELETE /:cmdIds -func (s *NeHostCmdController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - cmdIds := c.Param("cmdIds") - if cmdIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// DELETE /:id +func (s NeHostCmdController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(cmdIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.neHostCmdService.DeleteByIds(uniqueIDs) + + rows, err := s.neHostCmdService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } diff --git a/src/modules/network_element/controller/ne_info.go b/src/modules/network_element/controller/ne_info.go index eda83f76..9412d807 100644 --- a/src/modules/network_element/controller/ne_info.go +++ b/src/modules/network_element/controller/ne_info.go @@ -6,9 +6,9 @@ import ( "sync" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" neFetchlink "be.ems/src/modules/network_element/fetch_link" "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" @@ -43,27 +43,28 @@ var mutex sync.Mutex // @Tags network_element/info // @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) +// @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 information state // @Description Network element information state // @Router /ne/info/state [get] -func (s *NeInfoController) State(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeInfoController) State(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` NeId string `form:"neId" binding:"required"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeId) if neInfo.NeId != querys.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } neKey := fmt.Sprintf("%s_%s", neInfo.NeType, neInfo.NeId) @@ -87,7 +88,7 @@ func (s *NeInfoController) State(c *gin.Context) { } neStateCacheMap.Store(neKey, resDataCache) mutex.Unlock() - c.JSON(200, result.OkData(resDataCache)) + c.JSON(200, resp.OkData(resDataCache)) return } @@ -96,7 +97,7 @@ func (s *NeInfoController) State(c *gin.Context) { mutex.Lock() neStateCacheMap.Store(neKey, resData) mutex.Unlock() - c.JSON(200, result.OkData(resData)) + c.JSON(200, resp.OkData(resData)) } // 网元neType和neID查询 @@ -106,30 +107,31 @@ func (s *NeInfoController) State(c *gin.Context) { // @Tags network_element/info // @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) +// @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 neType and neID queries // @Description Network element neType and neID queries // @Router /ne/info/byTypeAndID [get] -func (s *NeInfoController) NeTypeAndID(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeInfoController) NeTypeAndID(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` NeID string `form:"neId" binding:"required"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - c.JSON(200, result.OkData(neInfo)) + c.JSON(200, resp.OkData(neInfo)) } // 网元信息列表全部无分页 @@ -148,8 +150,8 @@ func (s *NeInfoController) NeTypeAndID(c *gin.Context) { // @Summary The list of network element information is all unpaginated // @Description The list of network element information is all unpaginated // @Router /ne/info/listAll [get] -func (s *NeInfoController) ListAll(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeInfoController) ListAll(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType"` NeId string `form:"neId"` @@ -157,7 +159,8 @@ func (s *NeInfoController) ListAll(c *gin.Context) { BandHost bool `form:"bandHost"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } @@ -169,75 +172,75 @@ func (s *NeInfoController) ListAll(c *gin.Context) { if querys.NeId != "" { ne.NeId = querys.NeId } - neList := s.neInfoService.SelectList(ne, querys.BandStatus, querys.BandHost) + neList := s.neInfoService.Find(ne, querys.BandStatus, querys.BandHost) if len(neList) == 0 { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - c.JSON(200, result.OkData(neList)) + c.JSON(200, resp.OkData(neList)) } // 网元端Para5G配置文件读取 // // GET /para5GFile -func (s *NeInfoController) Para5GFileRead(c *gin.Context) { +func (s NeInfoController) Para5GFileRead(c *gin.Context) { data, err := s.neInfoService.NeConfPara5GRead() if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // 网元端Para5G配置文件写入 // // PUT /para5GFile -func (s *NeInfoController) Para5GFileWrite(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeInfoController) Para5GFileWrite(c *gin.Context) { var body struct { Content map[string]any `json:"content" binding:"required"` // 内容 SyncNE []string `json:"syncNe"` // 同步到网元 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } err := s.neInfoService.NeConfPara5GWirte(body.Content, body.SyncNE) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } // 网元端OAM配置文件读取 // // GET /oamFile -func (s *NeInfoController) OAMFileRead(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeInfoController) OAMFileRead(c *gin.Context) { var querys struct { NeType string `form:"neType" binding:"required"` NeID string `form:"neId" binding:"required"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } data, err := s.neInfoService.NeConfOAMReadSync(querys.NeType, querys.NeID) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // 网元端OAM配置文件写入 // // PUT /oamFile -func (s *NeInfoController) OAMFileWrite(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeInfoController) OAMFileWrite(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` NeID string `json:"neId" binding:"required"` @@ -245,23 +248,24 @@ func (s *NeInfoController) OAMFileWrite(c *gin.Context) { Sync bool `json:"sync"` // 同步到网元 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(body.NeType, body.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(body.NeType, body.NeID) if neInfo.NeId != body.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } err := s.neInfoService.NeConfOAMWirteSync(neInfo, body.Content, body.Sync) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } // 网元信息列表 @@ -281,19 +285,19 @@ func (s *NeInfoController) OAMFileWrite(c *gin.Context) { // @Summary Network element information list // @Description Network element information list // @Router /ne/info/list [get] -func (s *NeInfoController) List(c *gin.Context) { - query := ctx.QueryMapString(c) +func (s NeInfoController) List(c *gin.Context) { + query := reqctx.QueryMap(c) bandStatus := false if v, ok := query["bandStatus"]; ok { bandStatus = parse.Boolean(v) } - rows, total := s.neInfoService.SelectPage(query, bandStatus) - c.JSON(200, result.Ok(map[string]any{"rows": rows, "total": total})) + rows, total := s.neInfoService.FindByPage(query, bandStatus) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 网元信息 // -// GET /:infoId +// GET /:id // // @Tags network_element/info // @Accept json @@ -304,22 +308,22 @@ func (s *NeInfoController) List(c *gin.Context) { // @Summary Network element information // @Description Network element information // @Router /ne/info/{value} [get] -func (s *NeInfoController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - infoId := c.Param("infoId") - if infoId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +func (s NeInfoController) Info(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := parse.Number(c.Param("id")) + if id <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } - neHost := s.neInfoService.SelectById(infoId, true) - if neHost.ID != infoId { + neHost := s.neInfoService.FindById(id, true) + if neHost.ID != id { // 没有可访问网元信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neInfo.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neInfo.noData"))) return } - c.JSON(200, result.OkData(neHost)) + c.JSON(200, resp.OkData(neHost)) } // 网元信息新增 @@ -335,41 +339,46 @@ func (s *NeInfoController) Info(c *gin.Context) { // @Summary Network element information addition // @Description Network element information addition // @Router /ne/info [post] -func (s *NeInfoController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeInfoController) Add(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeInfo err := c.ShouldBindBodyWithJSON(&body) - if err != nil || body.ID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.ID != 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id not is empty")) return } // 检查属性值唯一 - uniqueInfo := s.neInfoService.CheckUniqueNeTypeAndNeId(body.NeType, body.NeId, "") + uniqueInfo := s.neInfoService.CheckUniqueNeTypeAndNeId(body.NeType, body.NeId, 0) if !uniqueInfo { // 网元信息操作【%s】失败,同类型下标识已存在 msg := i18n.TTemplate(language, "neInfo.errKeyExists", map[string]any{"key": body.NeId}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 获取网元状态是否正常 body.ServerState, err = neFetchlink.NeState(body) if err != nil { - body.Status = "0" + body.Status = 0 } else { // 网元状态设置为在线 - body.Status = "1" + body.Status = 1 if parse.Boolean(body.ServerState["standby"]) { - body.Status = "3" + body.Status = 3 } // 下发网管配置信息给网元 if _, err = neFetchlink.NeConfigOMC(body); err != nil { - body.Status = "2" + body.Status = 2 } } - loginUserName := ctx.LoginUserToUserName(c) + loginUserName := reqctx.LoginUserToUserName(c) // 新增Version信息 neVersion := model.NeVersion{ NeType: body.NeType, @@ -403,11 +412,11 @@ func (s *NeInfoController) Add(c *gin.Context) { s.neLicenseService.Insert(neLicense) body.CreateBy = loginUserName insertId := s.neInfoService.Insert(body) - if insertId != "" { - c.JSON(200, result.OkData(insertId)) + if insertId > 0 { + c.JSON(200, resp.OkData(insertId)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元信息修改 @@ -423,12 +432,17 @@ func (s *NeInfoController) Add(c *gin.Context) { // @Summary Network element information modification // @Description Network element information modification // @Router /ne/info [put] -func (s *NeInfoController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeInfoController) Edit(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeInfo err := c.ShouldBindBodyWithJSON(&body) - if err != nil || body.ID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.ID <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } @@ -437,44 +451,44 @@ func (s *NeInfoController) Edit(c *gin.Context) { if !uniqueInfo { // 网元信息操作【%s】失败,同类型下标识已存在 msg := i18n.TTemplate(language, "neInfo.errKeyExists", map[string]any{"key": body.NeId}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查是否存在 - neInfo := s.neInfoService.SelectById(body.ID, false) + neInfo := s.neInfoService.FindById(body.ID, false) if neInfo.ID != body.ID { // 没有可访问网元信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neInfo.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neInfo.noData"))) return } // 赋予主机ID if neInfo.HostIDs != "" && len(body.Hosts) > 0 { hostIDs := strings.Split(neInfo.HostIDs, ",") for index, id := range hostIDs { - body.Hosts[index].HostID = id + body.Hosts[index].ID = parse.Number(id) } } // 获取网元状态是否正常 - body.ServerState, err = neFetchlink.NeState(body) + body.ServerState, err = neFetchlink.NeState(neInfo) if err != nil { - body.Status = "0" + body.Status = 0 } else { // 网元状态设置为在线 - body.Status = "1" + body.Status = 1 if parse.Boolean(body.ServerState["standby"]) { - body.Status = "3" + body.Status = 3 } // 下发网管配置信息给网元 if _, err = neFetchlink.NeConfigOMC(body); err != nil { - body.Status = "2" + body.Status = 2 } } - loginUserName := ctx.LoginUserToUserName(c) - neLicense := s.neLicenseService.SelectByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - neVersion := s.neVersionService.SelectByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + loginUserName := reqctx.LoginUserToUserName(c) + neLicense := s.neLicenseService.FindByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neVersion := s.neVersionService.FindByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) // 已有网元可获取的信息 if body.ServerState != nil { @@ -494,14 +508,14 @@ func (s *NeInfoController) Edit(c *gin.Context) { } } - if neVersion.ID != "" { + if neVersion.ID <= 0 { if neVersion.NeType != body.NeType || neVersion.NeId != body.NeId { neVersion.NeType = body.NeType neVersion.NeId = body.NeId } s.neVersionService.Update(neVersion) } - if neLicense.ID != "" { + if neLicense.ID <= 0 { if neLicense.NeType != body.NeType || neLicense.NeId != body.NeId { neLicense.NeType = body.NeType neLicense.NeId = body.NeId @@ -512,44 +526,46 @@ func (s *NeInfoController) Edit(c *gin.Context) { body.UpdateBy = loginUserName rows := s.neInfoService.Update(body) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元信息删除 // -// DELETE /:infoIds +// DELETE /:id // // @Tags network_element/info // @Accept json // @Produce json -// @Param value path string true "Row ID, multiple separated by a , sign" +// @Param value path string true "Row ID" // @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary Network element information deletion // @Description Network element information deletion -// @Router /ne/info/{value} [delete] -func (s *NeInfoController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - infoIds := c.Param("infoIds") - if infoIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// @Router /ne/info [delete] +func (s NeInfoController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(infoIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.neInfoService.DeleteByIds(uniqueIDs) + + rows, err := s.neInfoService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } diff --git a/src/modules/network_element/controller/ne_license.go b/src/modules/network_element/controller/ne_license.go index 22900c0d..7cc4a173 100644 --- a/src/modules/network_element/controller/ne_license.go +++ b/src/modules/network_element/controller/ne_license.go @@ -6,8 +6,9 @@ import ( "github.com/gin-gonic/gin" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/utils/parse" neFetchlink "be.ems/src/modules/network_element/fetch_link" "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" @@ -34,47 +35,49 @@ type NeLicenseController struct { // @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) -// @Param neId query string true "NE ID" default(001) -// @Success 200 {object} object "Response Results" +// @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) { - querys := ctx.QueryMap(c) - data := s.neLicenseService.SelectPage(querys) + query := reqctx.QueryMap(c) + rows, total := s.neLicenseService.FindByPage(query) // 过滤屏蔽授权文件 - rows := data["rows"].([]model.NeLicense) arr := &rows for i := range *arr { (*arr)[i].ActivationRequestCode = "-" (*arr)[i].LicensePath = "-" } - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) } // 网元授权激活信息 // -// GET /:licenseId +// GET /:id func (s *NeLicenseController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - licenseId := c.Param("licenseId") - if licenseId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := parse.Number(c.Param("id")) + if id <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } - neLicense := s.neLicenseService.SelectById(licenseId) - if neLicense.ID != licenseId { + neLicense := s.neLicenseService.FindById(id) + if neLicense.ID != id { // 没有可访问网元授权激活数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neLicense.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) return } - c.JSON(200, result.OkData(neLicense)) + c.JSON(200, resp.OkData(neLicense)) } // 网元neType和neID查询 @@ -84,7 +87,7 @@ func (s *NeLicenseController) Info(c *gin.Context) { // @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) +// @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 @@ -92,24 +95,25 @@ func (s *NeLicenseController) Info(c *gin.Context) { // @Description Network element neType and neID queries // @Router /ne/license/byTypeAndID [get] func (s *NeLicenseController) NeTypeAndID(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` NeId string `form:"neId" binding:"required"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - neLicense := s.neLicenseService.SelectByNeTypeAndNeID(querys.NeType, querys.NeId) + neLicense := s.neLicenseService.FindByNeTypeAndNeID(querys.NeType, querys.NeId) if neLicense.NeId != querys.NeId { // 没有可访问网元授权激活数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neLicense.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) return } - c.JSON(200, result.OkData(neLicense)) + c.JSON(200, resp.OkData(neLicense)) } // 网元授权激活授权申请码 @@ -119,7 +123,7 @@ func (s *NeLicenseController) NeTypeAndID(c *gin.Context) { // @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) +// @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 @@ -127,21 +131,21 @@ func (s *NeLicenseController) NeTypeAndID(c *gin.Context) { // @Description Network Element License Activation License Application Code // @Router /ne/license/code [get] func (s *NeLicenseController) Code(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` NeId string `form:"neId" binding:"required"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 检查是否存在授权记录 - neLicense := s.neLicenseService.SelectByNeTypeAndNeID(querys.NeType, querys.NeId) + neLicense := s.neLicenseService.FindByNeTypeAndNeID(querys.NeType, querys.NeId) if neLicense.NeId != querys.NeId { // 没有可访问网元授权激活数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neLicense.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) return } @@ -155,10 +159,10 @@ func (s *NeLicenseController) Code(c *gin.Context) { neLicense.ExpiryDate = "" neLicense.Status = "0" } - neLicense.UpdateBy = ctx.LoginUserToUserName(c) + neLicense.UpdateBy = reqctx.LoginUserToUserName(c) s.neLicenseService.Update(neLicense) - c.JSON(200, result.OkData(code)) + c.JSON(200, resp.OkData(code)) } // 网元授权激活授权文件替换 @@ -175,19 +179,19 @@ func (s *NeLicenseController) Code(c *gin.Context) { // @Description Network element authorization activation status // @Router /ne/license/change [post] func (s *NeLicenseController) Change(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.NeLicense err := c.ShouldBindBodyWithJSON(&body) if err != nil || body.LicensePath == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 检查是否存在授权记录 - neLicense := s.neLicenseService.SelectByNeTypeAndNeID(body.NeType, body.NeId) + neLicense := s.neLicenseService.FindByNeTypeAndNeID(body.NeType, body.NeId) if neLicense.NeId != body.NeId { // 没有可访问网元授权激活数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neLicense.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) return } @@ -197,19 +201,19 @@ func (s *NeLicenseController) Change(c *gin.Context) { } neLicense.LicensePath = body.LicensePath neLicense.Status = "0" - neLicense.UpdateBy = ctx.LoginUserToUserName(c) + neLicense.UpdateBy = reqctx.LoginUserToUserName(c) upRows := s.neLicenseService.Update(neLicense) if upRows > 0 { // 进行上传替换 err = s.neLicenseService.UploadLicense(body) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元授权激活状态 @@ -219,7 +223,7 @@ func (s *NeLicenseController) Change(c *gin.Context) { // @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) +// @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 @@ -227,28 +231,28 @@ func (s *NeLicenseController) Change(c *gin.Context) { // @Description Network element authorization activation status // @Router /ne/license/state [get] func (s *NeLicenseController) State(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` NeId string `form:"neId" binding:"required"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 检查是否存在授权记录 - neLicense := s.neLicenseService.SelectByNeTypeAndNeID(querys.NeType, querys.NeId) + neLicense := s.neLicenseService.FindByNeTypeAndNeID(querys.NeType, querys.NeId) if neLicense.NeId != querys.NeId { // 没有可访问网元授权激活数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neLicense.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) return } // 查询网元获取IP获取网元状态 - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neLicense.NeType, neLicense.NeId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(neLicense.NeType, neLicense.NeId) if neInfo.NeId != neLicense.NeId || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } if neState, err := neFetchlink.NeState(neInfo); err == nil && neState["sn"] != nil { @@ -263,15 +267,15 @@ func (s *NeLicenseController) State(c *gin.Context) { } // 更新授权信息 - neLicense.UpdateBy = ctx.LoginUserToUserName(c) + neLicense.UpdateBy = reqctx.LoginUserToUserName(c) s.neLicenseService.Update(neLicense) if neLicense.Status == "1" { - c.JSON(200, result.OkData(map[string]string{ + c.JSON(200, resp.OkData(map[string]string{ "sn": neLicense.SerialNum, "expire": neLicense.ExpiryDate, })) return } - c.JSON(200, result.ErrMsg(fmt.Sprintf("%s service status exception", neLicense.NeType))) + c.JSON(200, resp.ErrMsg(fmt.Sprintf("%s service status exception", neLicense.NeType))) } diff --git a/src/modules/network_element/controller/ne_software.go b/src/modules/network_element/controller/ne_software.go index 95ed5177..841d02cb 100644 --- a/src/modules/network_element/controller/ne_software.go +++ b/src/modules/network_element/controller/ne_software.go @@ -1,16 +1,16 @@ package controller import ( - "strings" + "fmt" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeSoftwareController 结构体 @@ -32,62 +32,76 @@ type NeSoftwareController struct { // @Tags network_element/software // @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) -// @Param neId query string true "NE ID" default(001) -// @Success 200 {object} object "Response Results" +// @Param neType query string false "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) +// @Param name query string false "Name" +// @Param version query string false "Version" +// @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 List of Network Element Software Packages // @Description List of Network Element Software Packages // @Router /ne/software/list [get] -func (s *NeSoftwareController) List(c *gin.Context) { - querys := ctx.QueryMap(c) - data := s.neSoftwareService.SelectPage(querys) - - c.JSON(200, result.Ok(data)) +func (s NeSoftwareController) List(c *gin.Context) { + query := reqctx.QueryMap(c) + rows, total := s.neSoftwareService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) } // 网元软件包信息 // -// GET /:softwareId -func (s *NeSoftwareController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - softwareId := c.Param("softwareId") - if softwareId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// GET /:id +func (s NeSoftwareController) Info(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := parse.Number(c.Param("id")) + if id <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } - neSoftware := s.neSoftwareService.SelectById(softwareId) - if neSoftware.ID != softwareId { + neSoftware := s.neSoftwareService.FindById(id) + if neSoftware.ID != id { // 没有可访问网元包信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neSoftware.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neSoftware.noData"))) return } - c.JSON(200, result.OkData(neSoftware)) + c.JSON(200, resp.OkData(neSoftware)) } // 网元软件包新增 // // POST / -func (s *NeSoftwareController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// +// @Tags network_element/software +// @Accept json +// @Produce json +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Additions to the Net Element package +// @Description Additions to the Net Element package +// @Router /ne/software [post] +func (s NeSoftwareController) Add(c *gin.Context) { var body model.NeSoftware - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.Path == "" || body.ID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.Path == "" || body.ID > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: path is empty or id is not empty")) return } - // 找到已存在的删除后重新添加 - neSoftwares := s.neSoftwareService.SelectList(model.NeSoftware{ + neSoftwares := s.neSoftwareService.Find(model.NeSoftware{ NeType: body.NeType, Name: body.Name, Version: body.Version, }) if len(neSoftwares) > 0 { neSoftware := neSoftwares[0] - s.neSoftwareService.DeleteByIds([]string{neSoftware.ID}) + s.neSoftwareService.DeleteByIds([]int64{neSoftware.ID}) } // 检查属性值唯一 @@ -95,28 +109,32 @@ func (s *NeSoftwareController) Add(c *gin.Context) { // if !uniqueSoftware { // // 网元软件包操作【%s】失败,网元类型与文件名版本已存在 // msg := i18n.TTemplate(language, "neSoftware.errKeyExists", map[string]any{"name": body.Name}) - // c.JSON(200, result.ErrMsg(msg)) + // c.JSON(200, resp.ErrMsg(msg)) // return // } - body.CreateBy = ctx.LoginUserToUserName(c) + body.CreateBy = reqctx.LoginUserToUserName(c) insertId := s.neSoftwareService.Insert(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + if insertId > 0 { + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元软件包修改 // // PUT / -func (s *NeSoftwareController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeSoftwareController) Edit(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.NeSoftware - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.Path == "" || body.ID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.Path == "" || body.ID == 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: path or id is empty")) return } @@ -125,51 +143,53 @@ func (s *NeSoftwareController) Edit(c *gin.Context) { if !uniqueSoftware { // 网元软件包操作【%s】失败,网元类型与文件名版本已存在 msg := i18n.TTemplate(language, "neSoftware.errKeyExists", map[string]any{"name": body.Name}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查是否存在 - neSoftware := s.neSoftwareService.SelectById(body.ID) + neSoftware := s.neSoftwareService.FindById(body.ID) if neSoftware.ID != body.ID { // 没有可访问网元包信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neSoftware.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neSoftware.noData"))) return } - body.UpdateBy = ctx.LoginUserToUserName(c) + body.UpdateBy = reqctx.LoginUserToUserName(c) rows := s.neSoftwareService.Update(body) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 网元软件包删除 // -// DELETE /:softwareIds -func (s *NeSoftwareController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - softwareIds := c.Param("softwareIds") - if softwareIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// DELETE /:id +func (s NeSoftwareController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(softwareIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.neSoftwareService.DeleteByIds(uniqueIDs) + + rows, err := s.neSoftwareService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // 网元软件包设为网元新版本 @@ -185,17 +205,16 @@ func (s *NeSoftwareController) Remove(c *gin.Context) { // @Summary Net Element package set to Net Element new version // @Description Net Element package set to Net Element new version // @Router /ne/software/newNeVersion [post] -func (s *NeSoftwareController) NewNeVersion(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s NeSoftwareController) NewNeVersion(c *gin.Context) { var body model.NeSoftware - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 找到已存在的软件包信息 - neSoftwares := s.neSoftwareService.SelectList(model.NeSoftware{ + neSoftwares := s.neSoftwareService.Find(model.NeSoftware{ NeType: body.NeType, Name: body.Name, Version: body.Version, @@ -204,10 +223,10 @@ func (s *NeSoftwareController) NewNeVersion(c *gin.Context) { neSoftware := neSoftwares[0] s.neSoftwareService.UpdateVersions(neSoftware, model.NeVersion{ NeType: neSoftware.NeType, - UpdateBy: ctx.LoginUserToUserName(c), + UpdateBy: reqctx.LoginUserToUserName(c), }) - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } diff --git a/src/modules/network_element/controller/ne_version.go b/src/modules/network_element/controller/ne_version.go index 4a8b5a0d..ff6a947c 100644 --- a/src/modules/network_element/controller/ne_version.go +++ b/src/modules/network_element/controller/ne_version.go @@ -1,12 +1,15 @@ package controller import ( + "fmt" + "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/utils/parse" neService "be.ems/src/modules/network_element/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 NeVersionController 结构体 @@ -25,31 +28,30 @@ type NeVersionController struct { // // GET /list func (s *NeVersionController) List(c *gin.Context) { - querys := ctx.QueryMap(c) - data := s.neVersionService.SelectPage(querys, true) - - c.JSON(200, result.Ok(data)) + query := reqctx.QueryMap(c) + rows, total := s.neVersionService.FindByPage(query, true) + c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) } // 网元版本信息 // -// GET /:versionId +// GET /:id func (s *NeVersionController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - versionId := c.Param("versionId") - if versionId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := parse.Number(c.Param("id")) + if id <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } - neVersion := s.neVersionService.SelectById(versionId) - if neVersion.ID != versionId { + neVersion := s.neVersionService.FindById(id) + if neVersion.ID != id { // 没有可访问网元版本数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neVersion.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neVersion.noData"))) return } - c.JSON(200, result.OkData(neVersion)) + c.JSON(200, resp.OkData(neVersion)) } // 网元版本操作 @@ -66,30 +68,31 @@ func (s *NeVersionController) Info(c *gin.Context) { // @Description Network element version operation // @Router /ne/version/operate [post] func (s *NeVersionController) Operate(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { Action string `json:"action" binding:"required,oneof=install upgrade rollback"` // 操作行为 NeType string `json:"neType" gorm:"ne_type" binding:"required"` // 网元类型 NeId string `json:"neId" gorm:"ne_id" binding:"required"` // 网元ID Preinput map[string]string `json:"preinput" ` // 预先输入参数 } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - neVersion := s.neVersionService.SelectByNeTypeAndNeID(body.NeType, body.NeId) + neVersion := s.neVersionService.FindByNeTypeAndNeID(body.NeType, body.NeId) if neVersion.NeId != body.NeId { // 没有可访问网元版本数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neVersion.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neVersion.noData"))) return } // 进行相关命令操作 output, err := s.neVersionService.Operate(body.Action, neVersion, body.Preinput) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.OkData(output)) + c.JSON(200, resp.OkData(output)) } diff --git a/src/modules/network_element/fetch_link/alarm.go b/src/modules/network_element/fetch_link/alarm.go new file mode 100644 index 00000000..4f6fbad9 --- /dev/null +++ b/src/modules/network_element/fetch_link/alarm.go @@ -0,0 +1,35 @@ +package fetchlink + +import ( + "encoding/json" + "fmt" + "strings" + + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" +) + +// 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.IP, neInfo.Port, strings.ToLower(neInfo.NeType)) + resBytes, err := fetch.Get(neUrl, nil, 60_000) + if err != nil { + errStr := err.Error() + logger.Warnf("AlarmHistory Get \"%s\"", neUrl) + if !(strings.HasPrefix(errStr, "201") || strings.HasPrefix(errStr, "202") || strings.HasPrefix(errStr, "204")) { + logger.Errorf("AlarmHistory %s", err.Error()) + return nil, fmt.Errorf("NeService Alarm History Info API Error") + } + } + + // 序列化结果 + var resData []map[string]any + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("AlarmHistory Unmarshal %s", err.Error()) + return nil, err + } + return resData, nil +} diff --git a/src/modules/network_element/model/ne_config.go b/src/modules/network_element/model/ne_config.go index 13e22258..fff9b778 100644 --- a/src/modules/network_element/model/ne_config.go +++ b/src/modules/network_element/model/ne_config.go @@ -2,7 +2,7 @@ package model // NeConfig 网元_参数配置可用属性值 type NeConfig struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` NeType string `json:"neType" binding:"required" gorm:"column:ne_type"` // 网元类型 ParamName string `json:"paramName" binding:"required" gorm:"column:param_name"` // 参数名 ParamDisplay string `json:"paramDisplay" binding:"required" gorm:"column:param_display"` // 参数显示名 diff --git a/src/modules/network_element/model/ne_config_backup.go b/src/modules/network_element/model/ne_config_backup.go index d8d57872..978e06c3 100644 --- a/src/modules/network_element/model/ne_config_backup.go +++ b/src/modules/network_element/model/ne_config_backup.go @@ -2,16 +2,16 @@ package model // NeConfigBackup 网元配置文件备份记录 ne_config_backup type NeConfigBackup struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"ne_type"` // 网元类型 - NeId string `json:"neId" gorm:"ne_id"` // 网元ID - Name string `json:"name" gorm:"name"` // 压缩包名称 - Path string `json:"path" gorm:"path"` // 压缩包位置 - Remark string `json:"remark" gorm:"remark"` // 备注 - CreateBy string `json:"createBy" gorm:"create_by"` // 创建者 - CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 - UpdateBy string `json:"updateBy" gorm:"update_by"` // 更新者 - UpdateTime int64 `json:"updateTime" gorm:"update_time"` // 更新时间 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + NeId string `json:"neId" gorm:"column:ne_id"` // 网元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"` // 更新时间 // ====== 非数据库字段属性 ====== diff --git a/src/modules/network_element/model/ne_host.go b/src/modules/network_element/model/ne_host.go index 1ff3db06..9f4f2027 100644 --- a/src/modules/network_element/model/ne_host.go +++ b/src/modules/network_element/model/ne_host.go @@ -4,7 +4,7 @@ import "encoding/json" // NeHost 网元主机表 ne_host type NeHost struct { - HostID string `json:"hostId" gorm:"column:host_id"` // 主机主键 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` HostType string `json:"hostType" gorm:"column:host_type" binding:"oneof=ssh telnet redis"` // 连接类型 ssh telnet redis GroupID string `json:"groupId" gorm:"column:group_id"` // 分组(0默认 1网元 2系统) Title string `json:"title" gorm:"column:title"` // 标题名称 diff --git a/src/modules/network_element/model/ne_host_cmd.go b/src/modules/network_element/model/ne_host_cmd.go index 82aad319..d041bcff 100644 --- a/src/modules/network_element/model/ne_host_cmd.go +++ b/src/modules/network_element/model/ne_host_cmd.go @@ -2,7 +2,7 @@ package model // NeHostCmd 网元主机命令表 ne_host_cmd type NeHostCmd struct { - CmdID string `json:"cmdId" gorm:"column:cmd_id"` // 命令主键 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` CmdType string `json:"cmdType" gorm:"column:cmd_type"` // 命令类型 GroupID string `json:"groupId" gorm:"column:group_id"` // 分组(0默认 1快速命令) Title string `json:"title" gorm:"column:title" binding:"required"` // 标题名称 diff --git a/src/modules/network_element/model/ne_info.go b/src/modules/network_element/model/ne_info.go index 164814e3..d17862df 100644 --- a/src/modules/network_element/model/ne_info.go +++ b/src/modules/network_element/model/ne_info.go @@ -2,25 +2,25 @@ package model // NeInfo 网元信息对象 ne_info type NeInfo struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` - NeId string `json:"neId" gorm:"column:ne_id" binding:"required"` - RmUID string `json:"rmUid" gorm:"column:rm_uid"` - NeName string `json:"neName" gorm:"column:ne_name"` - IP string `json:"ip" gorm:"column:ip" binding:"required"` - Port int64 `json:"port" gorm:"column:port" binding:"required,number,max=65535,min=1"` - PvFlag string `json:"pvFlag" gorm:"column:pv_flag" binding:"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"` - NeAddress string `json:"neAddress" gorm:"column:ne_address"` // MAC地址 - HostIDs string `json:"hostIds" gorm:"column:host_ids"` // 网元主机ID组 数据格式(ssh,telnet) UDM(ssh,telnet,redis) UPF(ssh,telnet,telnet) - Status string `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"` + NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型 + NeId string `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + RmUID string `json:"rmUid" gorm:"column:rm_uid"` // 网元资源唯一标识 + NeName string `json:"neName" gorm:"column:ne_name"` // 网元名称 + IP string `json:"ip" gorm:"column:ip" 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"` // 网络标识 + NeAddress string `json:"neAddress" gorm:"column:ne_address"` // 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"` // 更新时间 // ====== 非数据库字段属性 ====== diff --git a/src/modules/network_element/model/ne_license.go b/src/modules/network_element/model/ne_license.go index 0a08802c..9b98c39f 100644 --- a/src/modules/network_element/model/ne_license.go +++ b/src/modules/network_element/model/ne_license.go @@ -2,19 +2,19 @@ package model // NeLicense 网元授权激活信息 ne_license type NeLicense struct { - ID string `json:"id" gorm:"id"` - NeType string `json:"neType" gorm:"ne_type" binding:"required"` // 网元类型 - NeId string `json:"neId" gorm:"ne_id" binding:"required"` // 网元ID - ActivationRequestCode string `json:"activationRequestCode" gorm:"activation_request_code"` // 激活申请代码 - LicensePath string `json:"licensePath" gorm:"license_path"` // 激活授权文件 - SerialNum string `json:"serialNum" gorm:"serial_num"` // 序列号 - ExpiryDate string `json:"expiryDate" gorm:"expiry_date"` // 许可证到期日期 - Status string `json:"status" gorm:"status"` // 状态 0无效 1有效 - Remark string `json:"remark" gorm:"remark"` // 备注 - CreateBy string `json:"createBy" gorm:"create_by"` // 创建者 - CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 - UpdateBy string `json:"updateBy" gorm:"update_by"` // 更新者 - UpdateTime int64 `json:"updateTime" gorm:"update_time"` // 更新时间 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型 + NeId string `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + 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"` // 许可证到期日期 + 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"` // 更新时间 // ====== 非数据库字段属性 ====== diff --git a/src/modules/network_element/model/ne_software.go b/src/modules/network_element/model/ne_software.go index 53a5321d..452795c8 100644 --- a/src/modules/network_element/model/ne_software.go +++ b/src/modules/network_element/model/ne_software.go @@ -2,16 +2,16 @@ package model // NeSoftware 网元软件包 ne_software type NeSoftware struct { - ID string `json:"id" gorm:"id"` - NeType string `json:"neType" gorm:"ne_type" binding:"required"` // 网元类型 - Name string `json:"name" gorm:"name" binding:"required"` // 包名称 - Path string `json:"path" gorm:"path"` // 包路径 - Version string `json:"version" gorm:"version" binding:"required"` // 包版本 - Description string `json:"description" gorm:"description"` // 包说明 - 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"` + NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型 + Name string `json:"name" gorm:"column:name" binding:"required"` // 包名称 + Path string `json:"path" gorm:"column:path"` // 包路径 + Version string `json:"version" gorm:"column:version" binding:"required"` // 包版本 + Description string `json:"description" gorm:"column:description"` // 包说明 + 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"` // 更新时间 // ====== 非数据库字段属性 ====== diff --git a/src/modules/network_element/model/ne_version.go b/src/modules/network_element/model/ne_version.go index ddde0af0..9bd651ad 100644 --- a/src/modules/network_element/model/ne_version.go +++ b/src/modules/network_element/model/ne_version.go @@ -2,23 +2,23 @@ package model // NeVersion 网元版本信息 ne_version type NeVersion struct { - ID string `json:"id" gorm:"id"` - NeType string `json:"neType" gorm:"ne_type" binding:"required"` // 网元类型 - NeId string `json:"neId" gorm:"ne_id" binding:"required"` // 网元ID - Name string `json:"name" gorm:"name"` // 当前包名 - Version string `json:"version" gorm:"version" binding:"required"` // 当前版本 - Path string `json:"path" gorm:"path" binding:"required"` // 当前软件包 - PreName string `json:"preName" gorm:"pre_name"` // 上一版本包名 - PreVersion string `json:"preVersion" gorm:"pre_version"` // 上一版本 - PrePath string `json:"prePath" gorm:"pre_path"` // 上一版本软件包 - NewName string `json:"newName" gorm:"new_name"` // 新版本包名 - NewVersion string `json:"newVersion" gorm:"new_version"` // 新版本 - NewPath string `json:"newPath" gorm:"new_path"` // 新版本软件包 - Status string `json:"status" gorm:"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"` // 更新时间 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型 + NeId string `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"` // 更新时间 } // TableName 表名称 diff --git a/src/modules/network_element/ne_config_test.go b/src/modules/network_element/ne_config_test.go index 1a601365..1d809703 100644 --- a/src/modules/network_element/ne_config_test.go +++ b/src/modules/network_element/ne_config_test.go @@ -153,14 +153,14 @@ func connDB() *gorm.DB { } // saveDB 表插入或更新 -func saveDB(s model.NeConfig) string { +func saveDB(s model.NeConfig) int64 { db := connDB() // 检查是否存在 - var id string + var id int64 db.Raw("SELECT id FROM ne_config WHERE ne_type = ? AND param_name = ?", s.NeType, s.ParamName).Scan(&id) // 更新时间 s.UpdateTime = time.Now().UnixMilli() - if id != "" { + if id > 0 { s.ID = id db.Save(&s) } else { diff --git a/src/modules/network_element/network_element.go b/src/modules/network_element/network_element.go index 88e28069..78a9787a 100644 --- a/src/modules/network_element/network_element.go +++ b/src/modules/network_element/network_element.go @@ -85,7 +85,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewNeInfo.List, ) - neInfoGroup.GET("/:infoId", + neInfoGroup.GET("/:id", middleware.CryptoApi(false, true), middleware.PreAuthorize(nil), controller.NewNeInfo.Info, @@ -102,7 +102,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_UPDATE)), controller.NewNeInfo.Edit, ) - neInfoGroup.DELETE("/:infoIds", + neInfoGroup.DELETE(":id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewNeInfo.Remove, @@ -116,7 +116,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewNeHost.List, ) - neHostGroup.GET("/:hostId", + neHostGroup.GET("/:id", middleware.CryptoApi(false, true), middleware.PreAuthorize(nil), controller.NewNeHost.Info, @@ -131,7 +131,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_UPDATE)), controller.NewNeHost.Edit, ) - neHostGroup.DELETE("/:hostIds", + neHostGroup.DELETE("/:id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewNeHost.Remove, @@ -165,7 +165,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewNeHostCmd.List, ) - neHostCmdGroup.GET("/:cmdId", + neHostCmdGroup.GET("/:id", middleware.PreAuthorize(nil), controller.NewNeHostCmd.Info, ) @@ -179,7 +179,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHostCmd", collectlogs.BUSINESS_TYPE_UPDATE)), controller.NewNeHostCmd.Edit, ) - neHostCmdGroup.DELETE("/:cmdIds", + neHostCmdGroup.DELETE(":id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHostCmd", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewNeHostCmd.Remove, @@ -193,7 +193,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewNeVersion.List, ) - neVersionGroup.GET("/:versionId", + neVersionGroup.GET("/:id", middleware.PreAuthorize(nil), controller.NewNeVersion.Info, ) @@ -211,7 +211,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewNeSoftware.List, ) - neSoftwareGroup.GET("/:softwareId", + neSoftwareGroup.GET("/:id", middleware.PreAuthorize(nil), controller.NewNeSoftware.Info, ) @@ -225,7 +225,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neSoftware", collectlogs.BUSINESS_TYPE_UPDATE)), controller.NewNeSoftware.Edit, ) - neSoftwareGroup.DELETE("/:softwareIds", + neSoftwareGroup.DELETE(":id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neSoftware", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewNeSoftware.Remove, @@ -244,7 +244,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewNeLicense.List, ) - neLicenseGroup.GET("/:licenseId", + neLicenseGroup.GET("/:id", middleware.PreAuthorize(nil), controller.NewNeLicense.Info, ) @@ -358,7 +358,7 @@ func Setup(router *gin.Engine) { func InitLoad() { // 启动时,清除缓存-网元类型 service.NewNeInfo.ClearNeCacheByNeType("*") - service.NewNeInfo.SelectNeInfoByRmuid("") + service.NewNeInfo.FindByRmuid("") // 启动时,网元公共参数数据记录到全局变量 if para5GMap, err := service.NewNeInfo.NeConfPara5GRead(); para5GMap != nil && err == nil { service.NewNeInfo.NeConfPara5GWirte(para5GMap, nil) diff --git a/src/modules/network_element/repository/ne_config.go b/src/modules/network_element/repository/ne_config.go index 2ec25cf2..9f4791c5 100644 --- a/src/modules/network_element/repository/ne_config.go +++ b/src/modules/network_element/repository/ne_config.go @@ -3,7 +3,7 @@ package repository import ( "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" "be.ems/src/modules/network_element/model" ) @@ -16,7 +16,7 @@ type NeConfig struct{} // SelectByPage 分页查询集合 func (r NeConfig) SelectByPage(query map[string]string) ([]model.NeConfig, int64) { - tx := datasource.DB("").Model(&model.NeConfig{}) + tx := db.DB("").Model(&model.NeConfig{}) // 查询条件拼接 if v, ok := query["neType"]; ok && v != "" { tx = tx.Where("ne_type = ?", v) @@ -35,7 +35,7 @@ func (r NeConfig) SelectByPage(query map[string]string) ([]model.NeConfig, int64 } // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(query["pageNum"], query["pageSize"]) + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) err := tx.Find(&rows).Error if err != nil { @@ -45,9 +45,9 @@ func (r NeConfig) SelectByPage(query map[string]string) ([]model.NeConfig, int64 return rows, total } -// SelectList 根据实体查询 -func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { - tx := datasource.DB("").Model(&model.NeConfig{}) +// Select 查询集合 +func (r NeConfig) Select(param model.NeConfig) []model.NeConfig { + tx := db.DB("").Model(&model.NeConfig{}) // 查询条件拼接 if param.NeType != "" { tx = tx.Where("ne_type = ?", param.NeType) @@ -66,12 +66,12 @@ func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { } // SelectByIds 通过ID查询 -func (r *NeConfig) SelectByIds(ids []string) []model.NeConfig { +func (r NeConfig) SelectByIds(ids []int64) []model.NeConfig { rows := []model.NeConfig{} if len(ids) <= 0 { return rows } - tx := datasource.DB("").Model(&model.NeConfig{}) + tx := db.DB("").Model(&model.NeConfig{}) // 构建查询条件 tx = tx.Where("id in ?", ids) // 查询数据 @@ -83,23 +83,23 @@ func (r *NeConfig) SelectByIds(ids []string) []model.NeConfig { } // Insert 新增信息 -func (r *NeConfig) Insert(param model.NeConfig) string { +func (r NeConfig) Insert(param model.NeConfig) int64 { param.UpdateTime = time.Now().UnixMilli() // 执行插入 - if err := datasource.DB("").Create(¶m).Error; err != nil { + if err := db.DB("").Create(¶m).Error; err != nil { logger.Errorf("insert err => %v", err.Error()) - return "" + return 0 } return param.ID } // Update 修改信息 -func (r *NeConfig) Update(param model.NeConfig) int64 { - if param.ID == "" { +func (r NeConfig) Update(param model.NeConfig) int64 { + if param.ID == 0 { return 0 } param.UpdateTime = time.Now().UnixMilli() - tx := datasource.DB("").Model(&model.NeConfig{}) + tx := db.DB("").Model(&model.NeConfig{}) // 构建查询条件 tx = tx.Where("id = ?", param.ID) tx = tx.Omit("id") @@ -112,11 +112,11 @@ func (r *NeConfig) Update(param model.NeConfig) int64 { } // DeleteByIds 批量删除信息 -func (r *NeConfig) DeleteByIds(ids []string) int64 { +func (r NeConfig) DeleteByIds(ids []int64) int64 { if len(ids) <= 0 { return 0 } - tx := datasource.DB("").Where("id in ?", ids) + tx := db.DB("").Where("id in ?", ids) if err := tx.Delete(&model.NeConfig{}).Error; err != nil { logger.Errorf("delete err => %v", err.Error()) return 0 diff --git a/src/modules/network_element/repository/ne_config_backup.go b/src/modules/network_element/repository/ne_config_backup.go index 3354034d..e56a635f 100644 --- a/src/modules/network_element/repository/ne_config_backup.go +++ b/src/modules/network_element/repository/ne_config_backup.go @@ -1,262 +1,118 @@ package repository import ( - "strings" "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_element/model" ) // 实例化数据层 NeConfigBackup 结构体 -var NewNeConfigBackup = &NeConfigBackup{ - selectSql: `select - id, ne_type, ne_id, name, path, remark, create_by, create_time, update_by, update_time - from ne_config_backup`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "name": "Name", - "path": "Path", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} +var NewNeConfigBackup = &NeConfigBackup{} // NeConfigBackup 网元配置文件备份记录 数据层处理 -type NeConfigBackup struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type NeConfigBackup struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *NeConfigBackup) convertResultRows(rows []map[string]any) []model.NeConfigBackup { - arr := make([]model.NeConfigBackup, 0) - for _, row := range rows { - item := model.NeConfigBackup{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any { +// SelectByPage 分页查询集合 +func (r NeConfigBackup) SelectByPage(query map[string]string) ([]model.NeConfigBackup, int64) { + tx := db.DB("").Model(&model.NeConfigBackup{}) // 查询条件拼接 - var conditions []string - var params []any if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("ne_type = ?", v) } if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("neId = ?", v) } if v, ok := query["name"]; ok && v != "" { - conditions = append(conditions, "name like concat(concat('%', ?), '%')") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("name like concat(concat('%', ?), '%')", v) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + // 查询结果 + var total int64 = 0 + rows := []model.NeConfigBackup{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_config_backup" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Order("id desc").Find(&rows).Error if err != nil { - logger.Errorf("total err => %v", err) - return result + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total + return rows, total +} + +// SelectByIds 通过ID查询信息 +func (r NeConfigBackup) SelectByIds(ids []int64) []model.NeConfigBackup { + rows := []model.NeConfigBackup{} + if len(ids) <= 0 { + return rows } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - + tx := db.DB("").Model(&model.NeConfigBackup{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) // 查询数据 - querySql := r.selectSql + whereSql + 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 *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { - // 查询条件拼接 - var conditions []string - var params []any - if item.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, item.NeType) - } - if item.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, item.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigBackup) SelectByIds(cmdIds []string) []model.NeConfigBackup { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeConfigBackup{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeConfigBackup) Insert(item model.NeConfigBackup) string { - // 参数拼接 - params := make(map[string]any) - if item.NeType != "" { - params["ne_type"] = item.NeType - } - if item.NeId != "" { - params["ne_id"] = item.NeId - } - if item.Name != "" { - params["name"] = item.Name - } - if item.Path != "" { - params["path"] = item.Path - } - if item.Remark != "" { - params["remark"] = item.Remark - } - if item.CreateBy != "" { - params["create_by"] = item.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_config_backup (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeConfigBackup) Update(item model.NeConfigBackup) int64 { - // 参数拼接 - params := make(map[string]any) - if item.NeType != "" { - params["ne_type"] = item.NeType - } - if item.NeId != "" { - params["ne_id"] = item.NeId - } - if item.Name != "" { - params["name"] = item.Name - } - if item.Path != "" { - params["path"] = item.Path - } - params["remark"] = item.Remark - if item.UpdateBy != "" { - params["update_by"] = item.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_config_backup set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, item.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows } return rows } -// DeleteByIds 批量删除信息 -func (r *NeConfigBackup) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from ne_config_backup where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +// Insert 新增信息 返回新增数据ID +func (r NeConfigBackup) Insert(item model.NeConfigBackup) int64 { + if item.CreateBy != "" { + ms := time.Now().UnixMilli() + item.UpdateBy = item.CreateBy + item.UpdateTime = ms + item.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(&item).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) return 0 } - return results + return item.ID +} + +// Update 修改信息 返回受影响行数 +func (r NeConfigBackup) Update(item model.NeConfigBackup) int64 { + if item.ID <= 0 { + return 0 + } + if item.UpdateBy != "" { + item.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.NeConfigBackup{}) + // 构建查询条件 + tx = tx.Where("id = ?", item.ID) + tx = tx.Omit("id", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(item).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 返回受影响行数 +func (r NeConfigBackup) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.NeConfigBackup{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/network_element/repository/ne_host.go b/src/modules/network_element/repository/ne_host.go index 70794663..01ba4676 100644 --- a/src/modules/network_element/repository/ne_host.go +++ b/src/modules/network_element/repository/ne_host.go @@ -2,117 +2,47 @@ package repository import ( "fmt" - "strings" "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_element/model" ) // 实例化数据层 NeHost 结构体 -var NewNeHost = &NeHost{ - selectSql: `select - host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, db_name, remark, create_by, create_time, update_by, update_time - from ne_host`, - - resultMap: map[string]string{ - "host_id": "HostID", - "host_type": "HostType", - "group_id": "GroupID", - "title": "Title", - "addr": "Addr", - "port": "Port", - "user": "User", - "auth_mode": "AuthMode", - "password": "Password", - "private_key": "PrivateKey", - "private_password": "PassPhrase", - "db_name": "DBName", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} +var NewNeHost = &NeHost{} // NeHost 网元主机连接 数据层处理 -type NeHost struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type NeHost struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *NeHost) convertResultRows(rows []map[string]any) []model.NeHost { - arr := make([]model.NeHost, 0) - for _, row := range rows { - item := model.NeHost{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeHost) SelectPage(query map[string]any) map[string]any { +// SelectByPage 分页查询集合 +func (r NeHost) SelectByPage(query map[string]string) ([]model.NeHost, int64) { + tx := db.DB("").Model(&model.NeHost{}) // 查询条件拼接 - var conditions []string - var params []any if v, ok := query["hostType"]; ok && v != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("host_type = ?", v) } if v, ok := query["groupId"]; ok && v != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("group_id = ?", v) } if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("title like concat(?, '%')", v) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + // 查询结果 + var total int64 = 0 + rows := []model.NeHost{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_host" - 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) + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) // 排序 - orderSql := "" if sv, ok := query["sortField"]; ok && sv != "" { sortSql := fmt.Sprint(sv) if sortSql == "updateTime" { @@ -128,276 +58,120 @@ func (r *NeHost) SelectPage(query map[string]any) map[string]any { sortSql += " asc " } } - orderSql = fmt.Sprintf(" order by %s ", sortSql) + tx = tx.Order(sortSql) } - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) + err := tx.Find(&rows).Error if err != nil { - logger.Errorf("query err => %v", err) - return result + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost { - // 查询条件拼接 - var conditions []string - var params []any - if neHost.HostType != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, neHost.HostType) - } - if neHost.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHost.GroupID) - } - if neHost.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, neHost.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by update_time asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) + return rows, total } // SelectByIds 通过ID查询 -func (r *NeHost) SelectByIds(hostIds []string) []model.NeHost { - placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) - querySql := r.selectSql + " where host_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(hostIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeHost{} +func (r NeHost) SelectByIds(ids []int64) []model.NeHost { + rows := []model.NeHost{} + if len(ids) <= 0 { + return rows } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueNeHost 校验主机是否唯一 -func (r *NeHost) CheckUniqueNeHost(neHost model.NeHost) string { - // 查询条件拼接 - var conditions []string - var params []any - if neHost.HostType != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, neHost.HostType) - } - if neHost.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHost.GroupID) - } - if neHost.Title != "" { - conditions = append(conditions, "title = ?") - params = append(params, neHost.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - + tx := db.DB("").Model(&model.NeHost{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) // 查询数据 - querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeHost) Insert(neHost model.NeHost) string { - // 参数拼接 - params := make(map[string]any) - if neHost.HostType != "" { - params["host_type"] = neHost.HostType - } - if neHost.GroupID != "" { - params["group_id"] = neHost.GroupID - } - if neHost.Title != "" { - params["title"] = neHost.Title - } - if neHost.Addr != "" { - params["addr"] = neHost.Addr - } - if neHost.Port > 0 { - params["port"] = neHost.Port - } - if neHost.User != "" { - params["user"] = neHost.User - } - if neHost.AuthMode != "" { - params["auth_mode"] = neHost.AuthMode - } - if neHost.Password != "" { - params["password"] = neHost.Password - } - if neHost.PrivateKey != "" { - params["private_key"] = neHost.PrivateKey - } - if neHost.PassPhrase != "" { - params["pass_phrase"] = neHost.PassPhrase - } - if neHost.DBName != "" { - params["db_name"] = neHost.DBName - } - if neHost.Remark != "" { - params["remark"] = neHost.Remark - } - if neHost.CreateBy != "" { - params["create_by"] = neHost.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 根据认证模式清除不必要的信息 - if neHost.AuthMode == "0" { - params["private_key"] = "" - params["pass_phrase"] = "" - } - if neHost.AuthMode == "1" { - params["password"] = "" - } - if neHost.AuthMode == "2" { - params["password"] = "" - params["private_key"] = "" - params["pass_phrase"] = "" - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_host (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeHost) Update(neHost model.NeHost) int64 { - // 参数拼接 - params := make(map[string]any) - if neHost.HostType != "" { - params["host_type"] = neHost.HostType - } - if neHost.GroupID != "" { - params["group_id"] = neHost.GroupID - } - if neHost.Title != "" { - params["title"] = neHost.Title - } - if neHost.Addr != "" { - params["addr"] = neHost.Addr - } - if neHost.Port > 0 { - params["port"] = neHost.Port - } - if neHost.User != "" { - params["user"] = neHost.User - } - if neHost.AuthMode != "" { - params["auth_mode"] = neHost.AuthMode - } - if neHost.Password != "" { - params["password"] = neHost.Password - } - if neHost.PrivateKey != "" { - params["private_key"] = neHost.PrivateKey - } - if neHost.PassPhrase != "" { - params["pass_phrase"] = neHost.PassPhrase - } - if neHost.DBName != "" { - params["db_name"] = neHost.DBName - } - params["remark"] = neHost.Remark - if neHost.UpdateBy != "" { - params["update_by"] = neHost.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 根据认证模式清除不必要的信息 - if neHost.AuthMode == "0" { - params["private_key"] = "" - params["pass_phrase"] = "" - } - if neHost.AuthMode == "1" { - params["password"] = "" - } - if neHost.AuthMode == "2" { - params["password"] = "" - params["private_key"] = "" - params["pass_phrase"] = "" - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_host set " + strings.Join(keys, ",") + " where host_id = ?" - - // 执行更新 - values = append(values, neHost.HostID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows } return rows } -// DeleteByIds 批量删除网元主机连接信息 -func (r *NeHost) DeleteByIds(hostIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) - sql := "delete from ne_host where host_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(hostIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +// Insert 新增信息 +func (r NeHost) Insert(param model.NeHost) int64 { + param.UpdateTime = time.Now().UnixMilli() + // 根据认证模式清除不必要的信息 + if param.AuthMode == "0" { + param.PrivateKey = "" + param.PassPhrase = "" + } + if param.AuthMode == "1" { + param.Password = "" + } + if param.AuthMode == "2" { + param.Password = "" + param.PrivateKey = "" + param.PassPhrase = "" + } + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) return 0 } - return results + return param.ID +} + +// Update 修改信息 +func (r NeHost) Update(param model.NeHost) int64 { + if param.ID == 0 { + return 0 + } + // 根据认证模式清除不必要的信息 + if param.AuthMode == "0" { + param.PrivateKey = "" + param.PassPhrase = "" + } + if param.AuthMode == "1" { + param.Password = "" + } + if param.AuthMode == "2" { + param.Password = "" + param.PrivateKey = "" + param.PassPhrase = "" + } + param.UpdateTime = time.Now().UnixMilli() + tx := db.DB("").Model(&model.NeHost{}) + // 构建查询条件 + tx = tx.Where("id = ?", param.ID) + tx = tx.Omit("id") + // 执行更新 + if err := tx.Updates(param).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 +func (r NeHost) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.NeHost{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 返回数据ID +func (r NeHost) CheckUnique(param model.NeHost) int64 { + tx := db.DB("").Model(&model.NeHost{}) + // 查询条件拼接 + if param.HostType != "" { + tx = tx.Where("host_type = ?", param.HostType) + } + if param.GroupID != "" { + tx = tx.Where("group_id = ?", param.GroupID) + } + if param.Title != "" { + tx = tx.Where("title = ?", param.Title) + } + // 查询数据 + var id int64 = 0 + if err := tx.Select("id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id } diff --git a/src/modules/network_element/repository/ne_host_cmd.go b/src/modules/network_element/repository/ne_host_cmd.go index 4ef57073..745f3b68 100644 --- a/src/modules/network_element/repository/ne_host_cmd.go +++ b/src/modules/network_element/repository/ne_host_cmd.go @@ -1,306 +1,130 @@ package repository import ( - "fmt" - "strings" "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_element/model" ) // 实例化数据层 NeHostCmd 结构体 -var NewNeHostCmd = &NeHostCmd{ - selectSql: `select - cmd_id, cmd_type, group_id, title, command, remark, create_by, create_time, update_by, update_time - from ne_host_cmd`, - - resultMap: map[string]string{ - "cmd_id": "CmdID", - "cmd_type": "CmdType", - "group_id": "GroupID", - "title": "Title", - "command": "Command", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} +var NewNeHostCmd = &NeHostCmd{} // NeHostCmd 网元主机连接 数据层处理 -type NeHostCmd struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type NeHostCmd struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *NeHostCmd) convertResultRows(rows []map[string]any) []model.NeHostCmd { - arr := make([]model.NeHostCmd, 0) - for _, row := range rows { - item := model.NeHostCmd{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any { +// SelectByPage 分页查询集合 +func (r NeHostCmd) SelectByPage(query map[string]string) ([]model.NeHostCmd, int64) { + tx := db.DB("").Model(&model.NeHostCmd{}) // 查询条件拼接 - var conditions []string - var params []any if v, ok := query["cmdType"]; ok && v != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("cmd_type = ?", v) } if v, ok := query["groupId"]; ok && v != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("group_id = ?", v) } if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("title like concat(?, '%')", v) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + // 查询结果 + var total int64 = 0 + rows := []model.NeHostCmd{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_host_cmd" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + // 查询数据分页 + 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("total err => %v", err) - return result + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - 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) - - // 查询数据 - querySql := r.selectSql + whereSql + 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 *NeHostCmd) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { - // 查询条件拼接 - var conditions []string - var params []any - if neHostCmd.CmdType != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, neHostCmd.CmdType) - } - if neHostCmd.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHostCmd.GroupID) - } - if neHostCmd.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, neHostCmd.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by update_time asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) + return rows, total } // SelectByIds 通过ID查询 -func (r *NeHostCmd) SelectByIds(cmdIds []string) []model.NeHostCmd { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where cmd_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeHostCmd{} +func (r NeHostCmd) SelectByIds(ids []int64) []model.NeHostCmd { + rows := []model.NeHostCmd{} + if len(ids) <= 0 { + return rows } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueGroupTitle 校验同类型组内是否唯一 -func (r *NeHostCmd) CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string { - // 查询条件拼接 - var conditions []string - var params []any - if neHostCmd.CmdType != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, neHostCmd.CmdType) - } - if neHostCmd.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHostCmd.GroupID) - } - if neHostCmd.Title != "" { - conditions = append(conditions, "title = ?") - params = append(params, neHostCmd.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - + tx := db.DB("").Model(&model.NeHostCmd{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) // 查询数据 - querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) string { - // 参数拼接 - params := make(map[string]any) - if neHostCmd.CmdType != "" { - params["cmd_type"] = neHostCmd.CmdType - } - if neHostCmd.GroupID != "" { - params["group_id"] = neHostCmd.GroupID - } - if neHostCmd.Title != "" { - params["title"] = neHostCmd.Title - } - if neHostCmd.Command != "" { - params["command"] = neHostCmd.Command - } - if neHostCmd.Remark != "" { - params["remark"] = neHostCmd.Remark - } - if neHostCmd.CreateBy != "" { - params["create_by"] = neHostCmd.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_host_cmd (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeHostCmd) Update(neHostCmd model.NeHostCmd) int64 { - // 参数拼接 - params := make(map[string]any) - if neHostCmd.CmdType != "" { - params["cmd_type"] = neHostCmd.CmdType - } - if neHostCmd.GroupID != "" { - params["group_id"] = neHostCmd.GroupID - } - if neHostCmd.Title != "" { - params["title"] = neHostCmd.Title - } - if neHostCmd.Command != "" { - params["command"] = neHostCmd.Command - } - params["remark"] = neHostCmd.Remark - if neHostCmd.UpdateBy != "" { - params["update_by"] = neHostCmd.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_host_cmd set " + strings.Join(keys, ",") + " where cmd_id = ?" - - // 执行更新 - values = append(values, neHostCmd.CmdID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows } return rows } -// DeleteByIds 批量删除信息 -func (r *NeHostCmd) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_host_cmd where cmd_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +// Insert 新增信息 +func (r NeHostCmd) Insert(param model.NeHostCmd) int64 { + param.UpdateTime = time.Now().UnixMilli() + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) return 0 } - return results + return param.ID +} + +// Update 修改信息 +func (r NeHostCmd) Update(param model.NeHostCmd) int64 { + if param.ID == 0 { + return 0 + } + param.UpdateTime = time.Now().UnixMilli() + tx := db.DB("").Model(&model.NeHostCmd{}) + // 构建查询条件 + tx = tx.Where("id = ?", param.ID) + tx = tx.Omit("id") + // 执行更新 + if err := tx.Updates(param).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 +func (r NeHostCmd) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.NeHostCmd{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 返回数据ID +func (r NeHostCmd) CheckUnique(param model.NeHostCmd) int64 { + tx := db.DB("").Model(&model.NeHostCmd{}) + // 查询条件拼接 + if param.CmdType != "" { + tx = tx.Where("cmd_type = ?", param.CmdType) + } + if param.GroupID != "" { + tx = tx.Where("group_id = ?", param.GroupID) + } + if param.Title != "" { + tx = tx.Where("title = ?", param.Title) + } + // 查询数据 + var id int64 = 0 + if err := tx.Select("id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id } diff --git a/src/modules/network_element/repository/ne_info.go b/src/modules/network_element/repository/ne_info.go index 97588aa6..0e707a6b 100644 --- a/src/modules/network_element/repository/ne_info.go +++ b/src/modules/network_element/repository/ne_info.go @@ -3,7 +3,7 @@ package repository import ( "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" "be.ems/src/modules/network_element/model" ) @@ -62,7 +62,7 @@ func (r NeInfo) neListSort(arr []model.NeInfo) []model.NeInfo { // SelectByPage 分页查询集合 func (r NeInfo) SelectByPage(query map[string]string) ([]model.NeInfo, int64) { - tx := datasource.DB("").Model(&model.NeInfo{}) + tx := db.DB("").Model(&model.NeInfo{}) // 查询条件拼接 if v, ok := query["neType"]; ok && v != "" { tx = tx.Where("ne_type = ?", v) @@ -84,7 +84,7 @@ func (r NeInfo) SelectByPage(query map[string]string) ([]model.NeInfo, int64) { } // 查询数据分页 - pageNum, pageSize := datasource.PageNumSize(query["pageNum"], query["pageSize"]) + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) err := tx.Order("ne_type asc, ne_id asc").Find(&rows).Error if err != nil { @@ -94,23 +94,75 @@ func (r NeInfo) SelectByPage(query map[string]string) ([]model.NeInfo, int64) { return r.neListSort(rows), total } -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { - tx := datasource.DB("").Model(&model.NeInfo{}) - // 构建查询条件 - tx = tx.Where("ne_type = ? and ne_id = ?", neType, neID) - // 查询数据 - row := model.NeInfo{} - if err := tx.Limit(1).Find(&row).Error; err != nil { - logger.Errorf("query find err => %v", err.Error()) - return row +// SelectByIds 通过ID查询 +func (r NeInfo) SelectByIds(ids []int64) []model.NeInfo { + rows := []model.NeInfo{} + if len(ids) <= 0 { + return rows } - return row + tx := db.DB("").Model(&model.NeInfo{}) + // 构建查询条件 + 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 NeInfo) Insert(neInfo model.NeInfo) 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 NeInfo) Update(neInfo model.NeInfo) int64 { + if neInfo.ID <= 0 { + return 0 + } + if neInfo.UpdateBy != "" { + neInfo.UpdateTime = time.Now().UnixMilli() + } + neInfo.UpdateTime = time.Now().UnixMilli() + tx := db.DB("").Model(&model.NeInfo{}) + // 构建查询条件 + tx = tx.Where("id = ?", neInfo.ID) + tx = tx.Omit("id", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(neInfo).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 +func (r NeInfo) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.NeInfo{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } // SelectList 查询列表 func (r NeInfo) SelectList(neInfo model.NeInfo) []model.NeInfo { - tx := datasource.DB("").Model(&model.NeInfo{}) + tx := db.DB("").Model(&model.NeInfo{}) // 构建查询条件 if neInfo.NeType != "" { tx = tx.Where("ne_type = ?", neInfo.NeType) @@ -128,26 +180,23 @@ func (r NeInfo) SelectList(neInfo model.NeInfo) []model.NeInfo { return r.neListSort(rows) } -// SelectByIds 通过ID查询 -func (r NeInfo) SelectByIds(ids []string) []model.NeInfo { - rows := []model.NeInfo{} - if len(ids) <= 0 { - return rows - } - tx := datasource.DB("").Model(&model.NeInfo{}) +// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 +func (r NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { + tx := db.DB("").Model(&model.NeInfo{}) // 构建查询条件 - tx = tx.Where("id in ?", ids) + tx = tx.Where("ne_type = ? and ne_id = ?", neType, neID) // 查询数据 - if err := tx.Find(&rows).Error; err != nil { + row := model.NeInfo{} + if err := tx.Limit(1).Find(&row).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) - return rows + return row } - return rows + return row } // CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 -func (r NeInfo) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { - tx := datasource.DB("").Model(&model.NeInfo{}) +func (r NeInfo) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) int64 { + tx := db.DB("").Model(&model.NeInfo{}) // 查询条件拼接 if neInfo.NeType != "" { tx = tx.Where("ne_type = ?", neInfo.NeType) @@ -156,7 +205,7 @@ func (r NeInfo) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { tx = tx.Where("ne_id = ?", neInfo.NeType) } // 查询数据 - id := "" + var id int64 = 0 if err := tx.Limit(1).Select("id").Find(&id).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) return id @@ -164,48 +213,12 @@ func (r NeInfo) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { return id } -// Insert 新增信息 -func (r *NeInfo) Insert(neInfo model.NeInfo) string { - if neInfo.CreateBy != "" { - ms := time.Now().UnixMilli() - neInfo.CreateTime = ms - neInfo.UpdateTime = ms - neInfo.UpdateBy = neInfo.CreateBy - } - tx := datasource.DefaultDB().Create(&neInfo) - if err := tx.Error; err != nil { - logger.Errorf("CreateInBatches err => %v", err) - } - return neInfo.ID -} - -// Update 修改信息 -func (r *NeInfo) Update(neInfo model.NeInfo) int64 { - if neInfo.ID == "" { +// UpdateState 修改状态 +func (r NeInfo) UpdateState(id int64, status int64) int64 { + if id <= 0 { return 0 } - if neInfo.UpdateBy != "" { - neInfo.UpdateTime = time.Now().UnixMilli() - } - neInfo.UpdateTime = time.Now().UnixMilli() - tx := datasource.DB("").Model(&model.NeInfo{}) - // 构建查询条件 - tx = tx.Where("id = ?", neInfo.ID) - tx = tx.Omit("id") - // 执行更新 - if err := tx.Updates(neInfo).Error; err != nil { - logger.Errorf("update err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} - -// Update 修改信息 -func (r *NeInfo) UpdateState(id, status string) int64 { - if id == "" { - return 0 - } - tx := datasource.DB("").Model(&model.NeInfo{}) + tx := db.DB("").Model(&model.NeInfo{}) // 构建查询条件 tx = tx.Where("id = ?", id) // 执行更新 @@ -215,16 +228,3 @@ func (r *NeInfo) UpdateState(id, status string) int64 { } return tx.RowsAffected } - -// DeleteByIds 批量删除网元信息 -func (r NeInfo) DeleteByIds(ids []string) int64 { - if len(ids) <= 0 { - return 0 - } - tx := datasource.DB("").Where("id in ?", ids) - if err := tx.Delete(&model.NeInfo{}).Error; err != nil { - logger.Errorf("delete err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} diff --git a/src/modules/network_element/repository/ne_license.go b/src/modules/network_element/repository/ne_license.go index 5aad6b32..b42ee84b 100644 --- a/src/modules/network_element/repository/ne_license.go +++ b/src/modules/network_element/repository/ne_license.go @@ -1,297 +1,148 @@ package repository import ( - "strings" "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_element/model" ) // 实例化数据层 NeLicense 结构体 -var NewNeLicense = &NeLicense{ - selectSql: `select - id, ne_type, ne_id, activation_request_code, license_path, serial_num, expiry_date, status, remark, create_by, create_time, update_by, update_time - from ne_license`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "activation_request_code": "ActivationRequestCode", - "license_path": "LicensePath", - "serial_num": "SerialNum", - "expiry_date": "ExpiryDate", - "status": "Status", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} +var NewNeLicense = &NeLicense{} // NeLicense 网元授权激活信息 数据层处理 -type NeLicense struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type NeLicense struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *NeLicense) convertResultRows(rows []map[string]any) []model.NeLicense { - arr := make([]model.NeLicense, 0) - for _, row := range rows { - item := model.NeLicense{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeLicense) SelectPage(query map[string]any) map[string]any { +// SelectByPage 分页查询集合 +func (r NeLicense) SelectByPage(query map[string]string) ([]model.NeLicense, int64) { + tx := db.DB("").Model(&model.NeLicense{}) // 查询条件拼接 - var conditions []string - var params []any if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("ne_type = ?", v) } if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("ne_id = ?", v) } if v, ok := query["expiryDate"]; ok && v != "" { - conditions = append(conditions, "expiry_date = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("expiry_date = ?", v) + } + if v, ok := query["serialNum"]; ok && v != "" { + tx = tx.Where("serial_num = ?", v) } if v, ok := query["createBy"]; ok && v != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("create_by like concat(?, '%')", v) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + // 查询结果 + var total int64 = 0 + rows := []model.NeLicense{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_license" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + // 查询数据分页 + 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("total err => %v", err) - return result + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - 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) - - // 查询数据 - querySql := r.selectSql + whereSql + 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 + return rows, total } -// SelectList 根据实体查询 -func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense { +// Select 查询集合 +func (r NeLicense) Select(param model.NeLicense) []model.NeLicense { + tx := db.DB("").Model(&model.NeLicense{}) // 查询条件拼接 - var conditions []string - var params []any - if neLicense.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neLicense.NeType) + if param.NeType != "" { + tx = tx.Where("ne_type = ?", param.NeType) } - if neLicense.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neLicense.NeId) + if param.NeId != "" { + tx = tx.Where("ne_id = ?", param.NeId) } - if neLicense.ExpiryDate != "" { - conditions = append(conditions, "expiry_date = ?") - params = append(params, neLicense.ExpiryDate) + if param.ExpiryDate != "" { + tx = tx.Where("expiry_date = ?", param.ExpiryDate) } - if neLicense.CreateBy != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, neLicense.CreateBy) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + if param.CreateBy != "" { + tx = tx.Where("create_by like concat(?, '%')", param.CreateBy) } // 查询数据 - querySql := r.selectSql + whereSql + " order by id asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeLicense) SelectByIds(cmdIds []string) []model.NeLicense { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeLicense{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeLicense) Insert(neLicense model.NeLicense) string { - // 参数拼接 - params := make(map[string]any) - if neLicense.NeType != "" { - params["ne_type"] = neLicense.NeType - } - if neLicense.NeId != "" { - params["ne_id"] = neLicense.NeId - } - if neLicense.ActivationRequestCode != "" { - params["activation_request_code"] = neLicense.ActivationRequestCode - } - if neLicense.LicensePath != "" { - params["license_path"] = neLicense.LicensePath - } - if neLicense.SerialNum != "" { - params["serial_num"] = neLicense.SerialNum - } - if neLicense.ExpiryDate != "" { - params["expiry_date"] = neLicense.ExpiryDate - } - if neLicense.Status != "" { - params["status"] = neLicense.Status - } - if neLicense.Remark != "" { - params["remark"] = neLicense.Remark - } - if neLicense.CreateBy != "" { - params["create_by"] = neLicense.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_license (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeLicense) Update(neLicense model.NeLicense) int64 { - // 参数拼接 - params := make(map[string]any) - if neLicense.NeType != "" { - params["ne_type"] = neLicense.NeType - } - if neLicense.NeId != "" { - params["ne_id"] = neLicense.NeId - } - if neLicense.ActivationRequestCode != "" { - params["activation_request_code"] = neLicense.ActivationRequestCode - } - if neLicense.LicensePath != "" { - params["license_path"] = neLicense.LicensePath - } - if neLicense.SerialNum != "" { - params["serial_num"] = neLicense.SerialNum - } - if neLicense.ExpiryDate != "" { - params["expiry_date"] = neLicense.ExpiryDate - } - if neLicense.Status != "" { - params["status"] = neLicense.Status - } - if neLicense.Remark != "" { - params["remark"] = neLicense.Remark - } - if neLicense.UpdateBy != "" { - params["update_by"] = neLicense.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_license set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neLicense.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 + rows := []model.NeLicense{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows } return rows } -// DeleteByIds 批量删除信息 -func (r *NeLicense) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_license where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +// 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 } - return results + 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 } diff --git a/src/modules/network_element/repository/ne_software.go b/src/modules/network_element/repository/ne_software.go index d039ec6d..4921fecd 100644 --- a/src/modules/network_element/repository/ne_software.go +++ b/src/modules/network_element/repository/ne_software.go @@ -1,317 +1,170 @@ package repository import ( - "fmt" "strings" "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_element/model" ) // 实例化数据层 NeSoftware 结构体 -var NewNeSoftware = &NeSoftware{ - selectSql: `select - id, ne_type, name, path, version, description, create_by, create_time, update_by, update_time - from ne_software`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "name": "Name", - "path": "Path", - "version": "Version", - "description": "Description", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} +var NewNeSoftware = &NeSoftware{} // NeSoftware 网元软件包信息 数据层处理 -type NeSoftware struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type NeSoftware struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *NeSoftware) convertResultRows(rows []map[string]any) []model.NeSoftware { - arr := make([]model.NeSoftware, 0) - for _, row := range rows { - item := model.NeSoftware{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeSoftware) SelectPage(query map[string]any) map[string]any { +// SelectByPage 分页查询集合 +func (r NeSoftware) SelectByPage(query map[string]string) ([]model.NeSoftware, int64) { + tx := db.DB("").Model(&model.NeSoftware{}) // 查询条件拼接 - var conditions []string - var params []any if v, ok := query["neType"]; ok && v != "" { - softwareType := v.(string) - if strings.Contains(softwareType, ",") { - softwareTypeArr := strings.Split(softwareType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(softwareTypeArr)) - conditions = append(conditions, "ne_type in ("+placeholder+")") - parameters := repo.ConvertIdsSlice(softwareTypeArr) - params = append(params, parameters...) + if strings.Contains(v, ",") { + softwareTypeArr := strings.Split(v, ",") + tx = tx.Where("ne_type in ?", softwareTypeArr) } else { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(softwareType, " ")) + tx = tx.Where("ne_type = ?", v) } } if v, ok := query["name"]; ok && v != "" { - conditions = append(conditions, "name like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("name like concat(?, '%')", v) } if v, ok := query["version"]; ok && v != "" { - conditions = append(conditions, "version like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("version like concat(?, '%')", v) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + // 查询结果 + var total int64 = 0 + rows := []model.NeSoftware{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_software" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + // 查询数据分页 + 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("total err => %v", err) - return result + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + 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 + return rows, total } -// SelectList 根据实体查询 -func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { +// Select 查询集合 +func (r NeSoftware) Select(param model.NeSoftware) []model.NeSoftware { + tx := db.DB("").Model(&model.NeSoftware{}) // 查询条件拼接 - var conditions []string - var params []any - if neSoftware.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neSoftware.NeType) + if param.NeType != "" { + tx = tx.Where("ne_type = ?", param.NeType) } - if neSoftware.Path != "" { - conditions = append(conditions, "path = ?") - params = append(params, neSoftware.Path) + if param.Path != "" { + tx = tx.Where("path = ?", param.Path) } - if neSoftware.Version != "" { - conditions = append(conditions, "version = ?") - params = append(params, neSoftware.Version) + if param.Version != "" { + tx = tx.Where("version = ?", param.Version) } - if neSoftware.Name != "" { - conditions = append(conditions, "name like concat(?, '%')") - params = append(params, neSoftware.Name) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + if param.Name != "" { + tx = tx.Where("name like concat(?, '%')", param.Name) } // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeSoftware) SelectByIds(cmdIds []string) []model.NeSoftware { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeSoftware{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 -func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string { - // 查询条件拼接 - var conditions []string - var params []any - if neSoftware.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neSoftware.NeType) - } - if neSoftware.Version != "" { - conditions = append(conditions, "version = ?") - params = append(params, neSoftware.Version) - } - if neSoftware.Name != "" { - conditions = append(conditions, "name = ?") - params = append(params, neSoftware.Name) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select id as 'str' from ne_software " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { - // 参数拼接 - params := make(map[string]any) - if neSoftware.NeType != "" { - params["ne_type"] = neSoftware.NeType - } - if neSoftware.Name != "" { - params["name"] = neSoftware.Name - } - if neSoftware.Path != "" { - params["path"] = neSoftware.Path - } - if neSoftware.Version != "" { - params["version"] = neSoftware.Version - } - params["description"] = neSoftware.Description - if neSoftware.CreateBy != "" { - params["create_by"] = neSoftware.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_software (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { - // 参数拼接 - params := make(map[string]any) - if neSoftware.NeType != "" { - params["ne_type"] = neSoftware.NeType - } - if neSoftware.Name != "" { - params["name"] = neSoftware.Name - } - if neSoftware.Path != "" { - params["path"] = neSoftware.Path - } - if neSoftware.Version != "" { - params["version"] = neSoftware.Version - } - params["description"] = neSoftware.Description - if neSoftware.UpdateBy != "" { - params["update_by"] = neSoftware.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_software set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neSoftware.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 + rows := []model.NeSoftware{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows } return rows } -// DeleteByIds 批量删除信息 -func (r *NeSoftware) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_software where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +// SelectByIds 通过ID查询 +func (r NeSoftware) SelectByIds(ids []int64) []model.NeSoftware { + rows := []model.NeSoftware{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.NeSoftware{}) + // 构建查询条件 + 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 NeSoftware) Insert(param model.NeSoftware) int64 { + if param.CreateBy != "" { + ms := time.Now().UnixMilli() + param.CreateTime = ms + param.UpdateTime = ms + param.UpdateBy = param.CreateBy + } + tx := db.DB("").Create(¶m) + if err := tx.Error; err != nil { + logger.Errorf("CreateInBatches err => %v", err) + } + return param.ID +} + +// Update 修改信息 +func (r NeSoftware) Update(param model.NeSoftware) int64 { + if param.ID <= 0 { return 0 } - return results + if param.UpdateBy != "" { + param.UpdateTime = time.Now().UnixMilli() + } + param.UpdateTime = time.Now().UnixMilli() + tx := db.DB("").Model(&model.NeSoftware{}) + // 构建查询条件 + 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 NeSoftware) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.NeSoftware{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 返回数据ID +func (r NeSoftware) CheckUnique(param model.NeSoftware) int64 { + tx := db.DB("").Model(&model.NeSoftware{}) + // 查询条件拼接 + if param.NeType != "" { + tx = tx.Where("ne_type = ?", param.NeType) + } + if param.Path != "" { + tx = tx.Where("path = ?", param.Path) + } + if param.Version != "" { + tx = tx.Where("version = ?", param.Version) + } + // 查询数据 + var id int64 = 0 + if err := tx.Select("id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id } diff --git a/src/modules/network_element/repository/ne_version.go b/src/modules/network_element/repository/ne_version.go index e02466b2..3eb5f5f0 100644 --- a/src/modules/network_element/repository/ne_version.go +++ b/src/modules/network_element/repository/ne_version.go @@ -1,329 +1,148 @@ package repository import ( - "strings" "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_element/model" ) // 实例化数据层 NeVersion 结构体 -var NewNeVersion = &NeVersion{ - selectSql: `select - id, ne_type, ne_id, name, version, path, pre_name, pre_version, pre_path, new_name, new_version, new_path, status, create_by, create_time, update_by, update_time - from ne_version`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "name": "name", - "version": "Version", - "path": "Path", - "pre_name": "preName", - "pre_version": "PreVersion", - "pre_path": "PrePath", - "new_name": "NewName", - "new_version": "NewVersion", - "new_path": "NewPath", - "status": "Status", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} +var NewNeVersion = &NeVersion{} // NeVersion 网元版本信息 数据层处理 -type NeVersion struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type NeVersion struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *NeVersion) convertResultRows(rows []map[string]any) []model.NeVersion { - arr := make([]model.NeVersion, 0) - for _, row := range rows { - item := model.NeVersion{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeVersion) SelectPage(query map[string]any) map[string]any { +// SelectByPage 分页查询集合 +func (r NeVersion) SelectByPage(query map[string]string) ([]model.NeVersion, int64) { + tx := db.DB("").Model(&model.NeVersion{}) // 查询条件拼接 - var conditions []string - var params []any if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("ne_type = ?", v) } if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("ne_id = ?", v) } if v, ok := query["version"]; ok && v != "" { - conditions = append(conditions, "version like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("version like concat(?, '%')", v) } if v, ok := query["path"]; ok && v != "" { - conditions = append(conditions, "path like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) + tx = tx.Where("path like concat(?, '%')", v) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + // 查询结果 + var total int64 = 0 + rows := []model.NeVersion{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_version" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + tx = tx.Order("update_time desc") + err := tx.Find(&rows).Error if err != nil { - logger.Errorf("total err => %v", err) - return result + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by update_time desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + 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 + return rows, total } -// SelectList 根据实体查询 -func (r *NeVersion) SelectList(neVersion model.NeVersion) []model.NeVersion { +// Select 查询集合 +func (r NeVersion) Select(param model.NeVersion) []model.NeVersion { + tx := db.DB("").Model(&model.NeSoftware{}) // 查询条件拼接 - var conditions []string - var params []any - if neVersion.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neVersion.NeType) + if param.NeType != "" { + tx = tx.Where("ne_type = ?", param.NeType) } - if neVersion.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neVersion.NeId) + if param.NeId != "" { + tx = tx.Where("ne_id = ?", param.NeId) } - if neVersion.Version != "" { - conditions = append(conditions, "version like concat(?, '%')") - params = append(params, neVersion.Version) + if param.Version != "" { + tx = tx.Where("version like concat(?, '%')", param.Version) } - if neVersion.Path != "" { - conditions = append(conditions, "path like concat(?, '%')") - params = append(params, neVersion.Path) + if param.Path != "" { + tx = tx.Where("path like concat(?, '%')", param.Path) } - if neVersion.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, neVersion.Status) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + if param.Status != "" { + tx = tx.Where("status = ?", param.Status) } // 查询数据 - querySql := r.selectSql + whereSql + " order by id asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeVersion) SelectByIds(cmdIds []string) []model.NeVersion { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeVersion{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeVersion) Insert(neVersion model.NeVersion) string { - // 参数拼接 - params := make(map[string]any) - if neVersion.NeType != "" { - params["ne_type"] = neVersion.NeType - } - if neVersion.NeId != "" { - params["ne_id"] = neVersion.NeId - } - if neVersion.Name != "" { - params["name"] = neVersion.Name - } - if neVersion.Version != "" { - params["version"] = neVersion.Version - } - if neVersion.Path != "" { - params["path"] = neVersion.Path - } - if neVersion.PreName != "" { - params["pre_name"] = neVersion.PreName - } - if neVersion.PreVersion != "" { - params["pre_version"] = neVersion.PreVersion - } - if neVersion.PrePath != "" { - params["pre_path"] = neVersion.PrePath - } - if neVersion.NewName != "" { - params["new_name"] = neVersion.NewName - } - if neVersion.NewVersion != "" { - params["new_version"] = neVersion.NewVersion - } - if neVersion.NewPath != "" { - params["new_path"] = neVersion.NewPath - } - if neVersion.Status != "" { - params["status"] = neVersion.Status - } - if neVersion.CreateBy != "" { - params["create_by"] = neVersion.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_version (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeVersion) Update(neVersion model.NeVersion) int64 { - // 参数拼接 - params := make(map[string]any) - if neVersion.NeType != "" { - params["ne_type"] = neVersion.NeType - } - if neVersion.NeId != "" { - params["ne_id"] = neVersion.NeId - } - if neVersion.Name != "" { - params["name"] = neVersion.Name - } - if neVersion.Version != "" { - params["version"] = neVersion.Version - } - if neVersion.Path != "" { - params["path"] = neVersion.Path - } - if neVersion.PreName != "" { - params["pre_name"] = neVersion.PreName - } - if neVersion.PreVersion != "" { - params["pre_version"] = neVersion.PreVersion - } - if neVersion.PrePath != "" { - params["pre_path"] = neVersion.PrePath - } - if neVersion.NewName != "" { - params["new_name"] = neVersion.NewName - } - if neVersion.NewVersion != "" { - params["new_version"] = neVersion.NewVersion - } - if neVersion.NewPath != "" { - params["new_path"] = neVersion.NewPath - } - if neVersion.Status != "" { - params["status"] = neVersion.Status - } - if neVersion.UpdateBy != "" { - params["update_by"] = neVersion.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_version set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neVersion.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 + rows := []model.NeVersion{} + if err := tx.Order("id asc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows } return rows } -// DeleteByIds 批量删除信息 -func (r *NeVersion) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_version where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +// SelectByIds 通过ID查询 +func (r NeVersion) SelectByIds(ids []int64) []model.NeVersion { + rows := []model.NeVersion{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.NeVersion{}) + // 构建查询条件 + 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 NeVersion) Insert(param model.NeVersion) int64 { + if param.CreateBy != "" { + ms := time.Now().UnixMilli() + param.CreateTime = ms + param.UpdateTime = ms + param.UpdateBy = param.CreateBy + } + tx := db.DB("").Create(¶m) + if err := tx.Error; err != nil { + logger.Errorf("CreateInBatches err => %v", err) + } + return param.ID +} + +// Update 修改信息 +func (r NeVersion) Update(param model.NeVersion) int64 { + if param.ID <= 0 { return 0 } - return results + if param.UpdateBy != "" { + param.UpdateTime = time.Now().UnixMilli() + } + param.UpdateTime = time.Now().UnixMilli() + tx := db.DB("").Model(&model.NeVersion{}) + // 构建查询条件 + 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 NeVersion) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.NeVersion{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/network_element/service/ne_config.go b/src/modules/network_element/service/ne_config.go index 7981d0e1..f96b4fbf 100644 --- a/src/modules/network_element/service/ne_config.go +++ b/src/modules/network_element/service/ne_config.go @@ -5,8 +5,8 @@ import ( "fmt" "strings" - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/redis" + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" "be.ems/src/modules/network_element/model" "be.ems/src/modules/network_element/repository" ) @@ -25,7 +25,7 @@ type NeConfig struct { func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { // 多个 if neType == "" || neType == "*" { - neConfigList := r.neConfigRepository.SelectList(model.NeConfig{}) + neConfigList := r.neConfigRepository.Select(model.NeConfig{}) if len(neConfigList) > 0 { neConfigGroup := map[string][]model.NeConfig{} for _, v := range neConfigList { @@ -36,7 +36,7 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { } } for k, v := range neConfigGroup { - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(k)) + key := fmt.Sprintf("%s:NeConfig:%s", constants.CACHE_NE_DATA, strings.ToUpper(k)) redis.Del("", key) if len(v) > 0 { for i, item := range v { @@ -53,9 +53,9 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { return neConfigList } // 单个 - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) + key := fmt.Sprintf("%s:NeConfig:%s", constants.CACHE_NE_DATA, strings.ToUpper(neType)) redis.Del("", key) - neConfigList := r.neConfigRepository.SelectList(model.NeConfig{ + neConfigList := r.neConfigRepository.Select(model.NeConfig{ NeType: neType, }) if len(neConfigList) > 0 { @@ -73,22 +73,21 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { // ClearNeCacheByNeType 清除网元类型参数配置缓存 func (r *NeConfig) ClearNeCacheByNeType(neType string) bool { - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, neType) + key := fmt.Sprintf("%s:NeConfig:%s", constants.CACHE_NE_DATA, neType) if neType == "*" { - key = fmt.Sprintf("%sNeConfig:*", cachekey.NE_DATA_KEY) + key = fmt.Sprintf("%s:NeConfig:*", constants.CACHE_NE_DATA) } keys, err := redis.GetKeys("", key) if err != nil { return false } - delOk, _ := redis.DelKeys("", keys) - return delOk + return redis.DelKeys("", keys) == nil } -// SelectNeConfigByNeType 查询网元类型参数配置 -func (r *NeConfig) SelectNeConfigByNeType(neType string) []model.NeConfig { +// FindByNeType 查询网元类型参数配置 +func (r *NeConfig) FindByNeType(neType string) []model.NeConfig { var neConfigList []model.NeConfig - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) + key := fmt.Sprintf("%s:NeConfig:%s", constants.CACHE_NE_DATA, strings.ToUpper(neType)) jsonStr, _ := redis.Get("", key) if len(jsonStr) > 7 { err := json.Unmarshal([]byte(jsonStr), &neConfigList) @@ -101,9 +100,9 @@ func (r *NeConfig) SelectNeConfigByNeType(neType string) []model.NeConfig { return neConfigList } -// SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 -func (r *NeConfig) SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig { - neConfigList := r.SelectNeConfigByNeType(neType) +// FindByNeTypeAndParamName 查询网元类型参数配置By参数名 +func (r *NeConfig) FindByNeTypeAndParamName(neType, paramName string) model.NeConfig { + neConfigList := r.FindByNeType(neType) var neConfig model.NeConfig for _, v := range neConfigList { if v.ParamName == paramName { @@ -114,22 +113,22 @@ func (r *NeConfig) SelectNeConfigByNeTypeAndParamName(neType, paramName string) return neConfig } -// SelectNeHostPage 分页查询列表数据 -func (r *NeConfig) SelectPage(query map[string]string) ([]model.NeConfig, int64) { +// FindByPage 分页查询列表数据 +func (r *NeConfig) FindByPage(query map[string]string) ([]model.NeConfig, int64) { return r.neConfigRepository.SelectByPage(query) } -// SelectConfigList 查询列表 -func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { - return r.neConfigRepository.SelectList(param) +// Find 查询列表 +func (r *NeConfig) Find(param model.NeConfig) []model.NeConfig { + return r.neConfigRepository.Select(param) } -// SelectByIds 通过ID查询 -func (r *NeConfig) SelectById(id string) model.NeConfig { - if id == "" { +// FindById 通过ID查询 +func (r *NeConfig) FindById(id int64) model.NeConfig { + if id <= 0 { return model.NeConfig{} } - neHosts := r.neConfigRepository.SelectByIds([]string{id}) + neHosts := r.neConfigRepository.SelectByIds([]int64{id}) if len(neHosts) > 0 { return neHosts[0] } @@ -137,7 +136,7 @@ func (r *NeConfig) SelectById(id string) model.NeConfig { } // Insert 新增信息 -func (r *NeConfig) Insert(param model.NeConfig) string { +func (r *NeConfig) Insert(param model.NeConfig) int64 { return r.neConfigRepository.Insert(param) } @@ -147,7 +146,7 @@ func (r *NeConfig) Update(param model.NeConfig) int64 { } // DeleteByIds 批量删除信息 -func (r *NeConfig) DeleteByIds(ids []string) (int64, error) { +func (r *NeConfig) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 data := r.neConfigRepository.SelectByIds(ids) if len(data) <= 0 { diff --git a/src/modules/network_element/service/ne_config_backup.go b/src/modules/network_element/service/ne_config_backup.go index 80cfffb9..5de58c38 100644 --- a/src/modules/network_element/service/ne_config_backup.go +++ b/src/modules/network_element/service/ne_config_backup.go @@ -23,22 +23,17 @@ type NeConfigBackup struct { neConfigBackupRepository *repository.NeConfigBackup // 网元配置文件备份记录 } -// SelectNeHostPage 分页查询列表数据 -func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any { - return r.neConfigBackupRepository.SelectPage(query) +// FindByPage 分页查询列表数据 +func (s NeConfigBackup) FindByPage(query map[string]string) ([]model.NeConfigBackup, int64) { + return s.neConfigBackupRepository.SelectByPage(query) } -// SelectConfigList 查询列表 -func (r *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { - return r.neConfigBackupRepository.SelectList(item) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigBackup) SelectById(id string) model.NeConfigBackup { - if id == "" { +// FindById 通过ID查询 +func (s NeConfigBackup) FindById(id int64) model.NeConfigBackup { + if id <= 0 { return model.NeConfigBackup{} } - arr := r.neConfigBackupRepository.SelectByIds([]string{id}) + arr := s.neConfigBackupRepository.SelectByIds([]int64{id}) if len(arr) > 0 { return arr[0] } @@ -46,33 +41,33 @@ func (r *NeConfigBackup) SelectById(id string) model.NeConfigBackup { } // Insert 新增信息 -func (r *NeConfigBackup) Insert(item model.NeConfigBackup) string { - return r.neConfigBackupRepository.Insert(item) +func (s NeConfigBackup) Insert(item model.NeConfigBackup) int64 { + return s.neConfigBackupRepository.Insert(item) } // Update 修改信息 -func (r *NeConfigBackup) Update(item model.NeConfigBackup) int64 { - return r.neConfigBackupRepository.Update(item) +func (s NeConfigBackup) Update(item model.NeConfigBackup) int64 { + return s.neConfigBackupRepository.Update(item) } // DeleteByIds 批量删除信息 -func (r *NeConfigBackup) DeleteByIds(ids []string) (int64, error) { +func (s NeConfigBackup) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - data := r.neConfigBackupRepository.SelectByIds(ids) + data := s.neConfigBackupRepository.SelectByIds(ids) if len(data) <= 0 { return 0, fmt.Errorf("neConfigBackup.noData") } if len(data) == len(ids) { - rows := r.neConfigBackupRepository.DeleteByIds(ids) + rows := s.neConfigBackupRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! return 0, fmt.Errorf("delete fail") } -// NeConfigLocalToNe 网元配置文件复制到网元端覆盖 -func (r *NeConfigBackup) NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error { +// FileLocalToNe 网元配置文件复制到网元端覆盖 +func (s NeConfigBackup) FileLocalToNe(neInfo model.NeInfo, localFile string) error { neTypeLower := strings.ToLower(neInfo.NeType) // 网管本地路径 omcPath := "/usr/local/etc/omc/ne_config" @@ -108,7 +103,7 @@ func (r *NeConfigBackup) NeConfigLocalToNe(neInfo model.NeInfo, localFile string // 配置复制到网元内 if neTypeLower == "ims" { // ims目录 - imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} + imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manages.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} for _, v := range imsDirArr { sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/ims && sudo cp -rf %s/ims/%s /usr/local/etc/ims/%v && sudo chmod 755 -R /usr/local/etc/ims/%s", neDirTemp, v, v, v)) } @@ -137,8 +132,8 @@ func (r *NeConfigBackup) NeConfigLocalToNe(neInfo model.NeInfo, localFile string return nil } -// NeConfigNeToLocal 网元备份文件网元端复制到本地 -func (r *NeConfigBackup) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) { +// FileNeToLocal 网元备份文件网元端复制到本地 +func (s NeConfigBackup) FileNeToLocal(neInfo model.NeInfo) (string, error) { // 网元主机的SSH客户端 sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { @@ -166,7 +161,7 @@ func (r *NeConfigBackup) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) if neTypeLower == "ims" { // ims目录 sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/ims", neDirTemp)) - imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} + imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manages.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} for _, v := range imsDirArr { sshClient.RunCMD(fmt.Sprintf("sudo cp -rf /usr/local/etc/ims/%s %s/ims", v, neDirTemp)) } diff --git a/src/modules/network_element/service/ne_host.go b/src/modules/network_element/service/ne_host.go index fbedaa15..ca18359b 100644 --- a/src/modules/network_element/service/ne_host.go +++ b/src/modules/network_element/service/ne_host.go @@ -20,23 +20,18 @@ type NeHost struct { neHostRepository *repository.NeHost // 网元主机连接表 } -// SelectNeHostPage 分页查询列表数据 -func (r *NeHost) SelectPage(query map[string]any) map[string]any { - return r.neHostRepository.SelectPage(query) +// FindByPage 分页查询列表数据 +func (r NeHost) FindByPage(query map[string]string) ([]model.NeHost, int64) { + return r.neHostRepository.SelectByPage(query) } -// SelectConfigList 查询列表 -func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost { - return r.neHostRepository.SelectList(neHost) -} - -// SelectByIds 通过ID查询 -func (r *NeHost) SelectById(hostId string) model.NeHost { +// FindById 通过ID查询 +func (r NeHost) FindById(hostId int64) model.NeHost { neHost := model.NeHost{} - if hostId == "" { + if hostId <= 0 { return neHost } - neHosts := r.neHostRepository.SelectByIds([]string{hostId}) + neHosts := r.neHostRepository.SelectByIds([]int64{hostId}) if len(neHosts) > 0 { neHost := neHosts[0] hostKey := config.Get("aes.hostKey").(string) @@ -70,11 +65,11 @@ func (r *NeHost) SelectById(hostId string) model.NeHost { } // Insert 批量添加 -func (r *NeHost) Inserts(neHosts []model.NeHost) int64 { +func (r NeHost) Inserts(neHosts []model.NeHost) int64 { var num int64 = 0 for _, v := range neHosts { hostId := r.neHostRepository.Insert(v) - if hostId != "" { + if hostId > 0 { num += 1 } } @@ -82,13 +77,13 @@ func (r *NeHost) Inserts(neHosts []model.NeHost) int64 { } // Insert 新增信息 -func (r *NeHost) Insert(neHost model.NeHost) string { +func (r NeHost) Insert(neHost model.NeHost) int64 { hostKey := config.Get("aes.hostKey").(string) if neHost.Password != "" { passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) if err != nil { logger.Errorf("insert encrypt: %v", err.Error()) - return "" + return 0 } neHost.Password = passwordEn } @@ -96,7 +91,7 @@ func (r *NeHost) Insert(neHost model.NeHost) string { privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) if err != nil { logger.Errorf("insert encrypt: %v", err.Error()) - return "" + return 0 } neHost.PrivateKey = privateKeyEn } @@ -104,7 +99,7 @@ func (r *NeHost) Insert(neHost model.NeHost) string { passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) if err != nil { logger.Errorf("insert encrypt: %v", err.Error()) - return "" + return 0 } neHost.PassPhrase = passPhraseEn } @@ -112,7 +107,7 @@ func (r *NeHost) Insert(neHost model.NeHost) string { } // Update 修改信息 -func (r *NeHost) Update(neHost model.NeHost) int64 { +func (r NeHost) Update(neHost model.NeHost) int64 { hostKey := config.Get("aes.hostKey").(string) if neHost.Password != "" { passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) @@ -142,7 +137,7 @@ func (r *NeHost) Update(neHost model.NeHost) int64 { } // DeleteByIds 批量删除网元主机连接信息 -func (r *NeHost) DeleteByIds(hostIds []string) (int64, error) { +func (r NeHost) DeleteByIds(hostIds []int64) (int64, error) { // 检查是否存在 ids := r.neHostRepository.SelectByIds(hostIds) if len(ids) <= 0 { @@ -165,8 +160,8 @@ func (r *NeHost) DeleteByIds(hostIds []string) (int64, error) { } // CheckUniqueHostTitle 校验分组组和主机名称是否唯一 -func (r *NeHost) CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool { - uniqueId := r.neHostRepository.CheckUniqueNeHost(model.NeHost{ +func (r NeHost) CheckUniqueHostTitle(groupId, title, hostType string, hostId int64) bool { + uniqueId := r.neHostRepository.CheckUnique(model.NeHost{ HostType: hostType, GroupID: groupId, Title: title, @@ -174,5 +169,5 @@ func (r *NeHost) CheckUniqueHostTitle(groupId, title, hostType, hostId string) b if uniqueId == hostId { return true } - return uniqueId == "" + return uniqueId == 0 } diff --git a/src/modules/network_element/service/ne_host_cmd.go b/src/modules/network_element/service/ne_host_cmd.go index 1936848d..5f439eaf 100644 --- a/src/modules/network_element/service/ne_host_cmd.go +++ b/src/modules/network_element/service/ne_host_cmd.go @@ -17,22 +17,17 @@ type NeHostCmd struct { neHostCmdRepository *repository.NeHostCmd // 网元主机命令表 } -// SelectNeHostPage 分页查询列表数据 -func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any { - return r.neHostCmdRepository.SelectPage(query) +// FindByPage 分页查询列表数据 +func (r *NeHostCmd) FindByPage(query map[string]string) ([]model.NeHostCmd, int64) { + return r.neHostCmdRepository.SelectByPage(query) } -// SelectConfigList 查询列表 -func (r *NeHostCmd) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { - return r.neHostCmdRepository.SelectList(neHostCmd) -} - -// SelectByIds 通过ID查询 -func (r *NeHostCmd) SelectById(cmdId string) model.NeHostCmd { - if cmdId == "" { +// FindById 通过ID查询 +func (r *NeHostCmd) FindById(id int64) model.NeHostCmd { + if id <= 0 { return model.NeHostCmd{} } - neHosts := r.neHostCmdRepository.SelectByIds([]string{cmdId}) + neHosts := r.neHostCmdRepository.SelectByIds([]int64{id}) if len(neHosts) > 0 { return neHosts[0] } @@ -40,7 +35,7 @@ func (r *NeHostCmd) SelectById(cmdId string) model.NeHostCmd { } // Insert 新增信息 -func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) string { +func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) int64 { return r.neHostCmdRepository.Insert(neHostCmd) } @@ -50,15 +45,15 @@ func (r *NeHostCmd) Update(neHostCmd model.NeHostCmd) int64 { } // DeleteByIds 批量删除信息 -func (r *NeHostCmd) DeleteByIds(cmdIds []string) (int64, error) { +func (r *NeHostCmd) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - ids := r.neHostCmdRepository.SelectByIds(cmdIds) - if len(ids) <= 0 { + rows := r.neHostCmdRepository.SelectByIds(ids) + if len(rows) <= 0 { return 0, fmt.Errorf("neHostCmd.noData") } - if len(ids) == len(cmdIds) { - rows := r.neHostCmdRepository.DeleteByIds(cmdIds) + if len(rows) == len(ids) { + rows := r.neHostCmdRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! @@ -66,8 +61,8 @@ func (r *NeHostCmd) DeleteByIds(cmdIds []string) (int64, error) { } // CheckUniqueGroupTitle 校验同类型组内是否唯一 -func (r *NeHostCmd) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool { - uniqueId := r.neHostCmdRepository.CheckUniqueGroupTitle(model.NeHostCmd{ +func (r *NeHostCmd) CheckUniqueGroupTitle(groupId, title, cmdType string, cmdId int64) bool { + uniqueId := r.neHostCmdRepository.CheckUnique(model.NeHostCmd{ CmdType: cmdType, GroupID: groupId, Title: title, @@ -75,5 +70,5 @@ func (r *NeHostCmd) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) if uniqueId == cmdId { return true } - return uniqueId == "" + return uniqueId == 0 } diff --git a/src/modules/network_element/service/ne_info.go b/src/modules/network_element/service/ne_info.go index e3626a0e..3313aaec 100644 --- a/src/modules/network_element/service/ne_info.go +++ b/src/modules/network_element/service/ne_info.go @@ -8,13 +8,13 @@ import ( "runtime" "strings" - "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" "be.ems/src/framework/logger" - "be.ems/src/framework/redis" + "be.ems/src/framework/ssh" "be.ems/src/framework/telnet" "be.ems/src/framework/utils/generate" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/ssh" neFetchlink "be.ems/src/modules/network_element/fetch_link" "be.ems/src/modules/network_element/model" "be.ems/src/modules/network_element/repository" @@ -23,19 +23,21 @@ import ( // 实例化服务层 NeInfo 结构体 var NewNeInfo = &NeInfo{ neInfoRepository: repository.NewNeInfo, + neHostService: NewNeHost, Para5GData: map[string]string{}, } // 网元信息 服务层处理 type NeInfo struct { neInfoRepository *repository.NeInfo // 网元信息数据信息 + neHostService *NeHost // 网元主机连接服务 Para5GData map[string]string } -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { +// FindByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 +func (r NeInfo) FindByNeTypeAndNeID(neType, neID string) model.NeInfo { var neInfo model.NeInfo - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) + key := fmt.Sprintf("%s:%s:%s", constants.CACHE_NE_INFO, strings.ToUpper(neType), neID) jsonStr, _ := redis.Get("", key) if len(jsonStr) > 7 { err := json.Unmarshal([]byte(jsonStr), &neInfo) @@ -44,7 +46,7 @@ func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { } } else { neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) - if neInfo.ID != "" && neInfo.NeId == neID { + if neInfo.ID != 0 && neInfo.NeId == neID { redis.Del("", key) values, _ := json.Marshal(neInfo) redis.Set("", key, string(values)) @@ -54,12 +56,12 @@ func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { } // RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 -func (r *NeInfo) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { +func (r NeInfo) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { var neInfo model.NeInfo - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) + key := fmt.Sprintf("%s:%s:%s", constants.CACHE_NE_INFO, strings.ToUpper(neType), neID) redis.Del("", key) neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) - if neInfo.ID != "" && neInfo.NeId == neID { + if neInfo.ID != 0 && neInfo.NeId == neID { values, _ := json.Marshal(neInfo) redis.Set("", key, string(values)) } @@ -67,23 +69,22 @@ func (r *NeInfo) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { } // ClearNeCacheByNeType 清除网元类型缓存 -func (r *NeInfo) ClearNeCacheByNeType(neType string) bool { - key := fmt.Sprintf("%s*", cachekey.NE_KEY) +func (r NeInfo) ClearNeCacheByNeType(neType string) bool { + key := fmt.Sprintf("%s:*", constants.CACHE_NE_INFO) if neType != "*" { - key = fmt.Sprintf("%s%s*", cachekey.NE_KEY, neType) + key = fmt.Sprintf("%s:%s*", constants.CACHE_NE_INFO, neType) } keys, err := redis.GetKeys("", key) if err != nil { return false } - delOk, _ := redis.DelKeys("", keys) - return delOk + return redis.DelKeys("", keys) == nil } -// SelectNeInfoByNeType 通过ne_type查询网元信息 -func (r *NeInfo) SelectNeInfoByNeType(neType string) []model.NeInfo { +// FindByNeType 通过ne_type查询网元信息 +func (r NeInfo) FindByNeType(neType string) []model.NeInfo { neInfo := make([]model.NeInfo, 0) - key := fmt.Sprintf("%s%s:*", cachekey.NE_KEY, strings.ToUpper(neType)) + key := fmt.Sprintf("%s:%s:*", constants.CACHE_NE_INFO, strings.ToUpper(neType)) jsonStr, _ := redis.Get("", key) if len(jsonStr) > 7 { err := json.Unmarshal([]byte(jsonStr), &neInfo) @@ -93,7 +94,7 @@ func (r *NeInfo) SelectNeInfoByNeType(neType string) []model.NeInfo { } else { neInfo = r.neInfoRepository.SelectList(model.NeInfo{NeType: neType}) for _, v := range neInfo { - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(v.NeType), v.NeId) + key := fmt.Sprintf("%s:%s:%s", constants.CACHE_NE_INFO, strings.ToUpper(v.NeType), v.NeId) redis.Del("", key) values, _ := json.Marshal(v) redis.Set("", key, string(values)) @@ -102,10 +103,10 @@ func (r *NeInfo) SelectNeInfoByNeType(neType string) []model.NeInfo { return neInfo } -// SelectNeInfoByRmuid 通过rmUID查询网元信息 -func (r *NeInfo) SelectNeInfoByRmuid(rmUid string) model.NeInfo { +// FindByRmuid 通过rmUID查询网元信息 +func (r NeInfo) FindByRmuid(rmUid string) model.NeInfo { var neInfo model.NeInfo - cacheKeys, _ := redis.GetKeys("", cachekey.NE_KEY+"*") + cacheKeys, _ := redis.GetKeys("", constants.CACHE_NE_INFO+":*") if len(cacheKeys) > 0 { for _, key := range cacheKeys { var v model.NeInfo @@ -119,9 +120,9 @@ func (r *NeInfo) SelectNeInfoByRmuid(rmUid string) model.NeInfo { } } } else { - neInfos := r.SelectList(neInfo, false, false) + neInfos := r.Find(neInfo, false, false) for _, v := range neInfos { - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(v.NeType), v.NeId) + key := fmt.Sprintf("%s:%s:%s", constants.CACHE_NE_INFO, strings.ToUpper(v.NeType), v.NeId) redis.Del("", key) values, _ := json.Marshal(v) redis.Set("", key, string(values)) @@ -133,10 +134,10 @@ func (r *NeInfo) SelectNeInfoByRmuid(rmUid string) model.NeInfo { return neInfo } -// SelectPage 根据条件分页查询 +// FindByPage 根据条件分页查询 // // bandStatus 带状态信息 -func (r *NeInfo) SelectPage(query map[string]string, bandStatus bool) ([]model.NeInfo, int64) { +func (r NeInfo) FindByPage(query map[string]string, bandStatus bool) ([]model.NeInfo, int64) { rows, total := r.neInfoRepository.SelectByPage(query) // 网元直连读取网元服务状态 @@ -147,11 +148,11 @@ func (r *NeInfo) SelectPage(query map[string]string, bandStatus bool) ([]model.N return rows, total } -// SelectList 查询列表 +// Find 查询列表 // // bandStatus 带状态信息 // bandHost 带主机信息 -func (r *NeInfo) SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo { +func (r NeInfo) Find(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo { list := r.neInfoRepository.SelectList(ne) // 网元直连读取网元服务状态 @@ -168,7 +169,7 @@ func (r *NeInfo) SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []m } // bandNeStatus 网元列表项数据带网元服务状态 -func (r *NeInfo) bandNeStatus(arr *[]model.NeInfo) { +func (r NeInfo) bandNeStatus(arr *[]model.NeInfo) { for i := range *arr { v := (*arr)[i] result, err := neFetchlink.NeState(v) @@ -177,8 +178,8 @@ func (r *NeInfo) bandNeStatus(arr *[]model.NeInfo) { "online": false, } // 网元状态设置为离线 - if v.Status != "0" { - v.Status = "0" + if v.Status != 0 { + v.Status = 0 (*arr)[i].Status = v.Status r.neInfoRepository.UpdateState(v.ID, v.Status) } @@ -187,13 +188,13 @@ func (r *NeInfo) bandNeStatus(arr *[]model.NeInfo) { result["online"] = true (*arr)[i].ServerState = result // 网元状态设置为在线 - status := "1" + var status int64 = 1 if parse.Boolean(result["standby"]) { - status = "3" + status = 3 } // 下发网管配置信息给网元 if _, err = neFetchlink.NeConfigOMC(v); err != nil { - status = "2" + status = 2 } (*arr)[i].Status = status if v.Status != status { @@ -203,7 +204,7 @@ func (r *NeInfo) bandNeStatus(arr *[]model.NeInfo) { } // bandNeHosts 网元列表项数据带网元主机信息 -func (r *NeInfo) bandNeHosts(arr *[]model.NeInfo) { +func (r NeInfo) bandNeHosts(arr *[]model.NeInfo) { for i := range *arr { v := (*arr)[i] if v.HostIDs != "" { @@ -211,9 +212,10 @@ func (r *NeInfo) bandNeHosts(arr *[]model.NeInfo) { if len(hostIds) <= 1 { continue } - for _, hostId := range hostIds { - neHost := NewNeHost.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { + for _, v := range hostIds { + hostId := parse.Number(v) + neHost := r.neHostService.FindById(hostId) + if neHost.ID == 0 || neHost.ID != hostId { continue } (*arr)[i].Hosts = append((*arr)[i].Hosts, neHost) @@ -222,14 +224,14 @@ func (r *NeInfo) bandNeHosts(arr *[]model.NeInfo) { } } -// SelectByIds 通过ID查询 +// FindById 通过ID查询 // // bandHost 带主机信息 -func (r *NeInfo) SelectById(infoId string, bandHost bool) model.NeInfo { - if infoId == "" { +func (r NeInfo) FindById(id int64, bandHost bool) model.NeInfo { + if id <= 0 { return model.NeInfo{} } - neInfos := r.neInfoRepository.SelectByIds([]string{infoId}) + neInfos := r.neInfoRepository.SelectByIds([]int64{id}) if len(neInfos) > 0 { // 带主机信息 if neInfos[0].HostIDs != "" && bandHost { @@ -241,7 +243,7 @@ func (r *NeInfo) SelectById(infoId string, bandHost bool) model.NeInfo { } // Insert 新增信息 -func (r *NeInfo) Insert(neInfo model.NeInfo) string { +func (r NeInfo) Insert(neInfo model.NeInfo) int64 { // 主机信息新增 if neInfo.Hosts != nil { uuid := generate.Code(4) @@ -250,16 +252,16 @@ func (r *NeInfo) Insert(neInfo model.NeInfo) string { host.Title = neInfo.NeName + "_" + uuid host.GroupID = "1" host.CreateBy = neInfo.CreateBy - hostId := NewNeHost.Insert(host) - if hostId != "" { - hostIDs = append(hostIDs, hostId) + hostId := r.neHostService.Insert(host) + if hostId > 0 { + hostIDs = append(hostIDs, fmt.Sprint(hostId)) } } neInfo.HostIDs = strings.Join(hostIDs, ",") } insertId := r.neInfoRepository.Insert(neInfo) - if insertId != "" { + if insertId > 0 { // 刷新缓存 r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) } @@ -267,16 +269,16 @@ func (r *NeInfo) Insert(neInfo model.NeInfo) string { } // Update 修改信息 -func (r *NeInfo) Update(neInfo model.NeInfo) int64 { +func (r NeInfo) Update(neInfo model.NeInfo) int64 { // 主机信息更新 if neInfo.Hosts != nil { uuid := generate.Code(4) for _, host := range neInfo.Hosts { - if host.HostID != "" { + if host.ID != 0 { host.Title = neInfo.NeName + "_" + uuid host.GroupID = "1" host.UpdateBy = neInfo.UpdateBy - NewNeHost.Update(host) + r.neHostService.Update(host) } } } @@ -290,33 +292,38 @@ func (r *NeInfo) Update(neInfo model.NeInfo) int64 { } // DeleteByIds 批量删除信息 -func (r *NeInfo) DeleteByIds(infoIds []string) (int64, error) { +func (r NeInfo) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - infos := r.neInfoRepository.SelectByIds(infoIds) + infos := r.neInfoRepository.SelectByIds(ids) if len(infos) <= 0 { return 0, fmt.Errorf("neHostCmd.noData") } - if len(infos) == len(infoIds) { + if len(infos) == len(ids) { for _, v := range infos { // 主机信息删除 if v.HostIDs != "" { - NewNeHost.DeleteByIds(strings.Split(v.HostIDs, ",")) + hostIds := make([]int64, 0) + arr := strings.Split(v.HostIDs, ",") + for _, hostId := range arr { + hostIds = append(hostIds, parse.Number(hostId)) + } + r.neHostService.DeleteByIds(hostIds) } // 删除License - neLicense := NewNeLicense.SelectByNeTypeAndNeID(v.NeType, v.NeId) + neLicense := NewNeLicense.FindByNeTypeAndNeID(v.NeType, v.NeId) if neLicense.NeId == v.NeId { - NewNeLicense.DeleteByIds([]string{neLicense.ID}) + NewNeLicense.DeleteByIds([]int64{neLicense.ID}) } // 删除Version - neVersion := NewNeVersion.SelectByNeTypeAndNeID(v.NeType, v.NeId) + neVersion := NewNeVersion.FindByNeTypeAndNeID(v.NeType, v.NeId) if neVersion.NeId == v.NeId { - NewNeVersion.DeleteByIds([]string{neVersion.ID}) + NewNeVersion.DeleteByIds([]int64{neVersion.ID}) } // 缓存信息删除 - redis.Del("", fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, v.NeType, v.NeId)) + redis.Del("", fmt.Sprintf("%s:%s:%s", constants.CACHE_NE_INFO, v.NeType, v.NeId)) } - rows := r.neInfoRepository.DeleteByIds(infoIds) + rows := r.neInfoRepository.DeleteByIds(ids) return rows, nil } // 删除信息失败! @@ -324,7 +331,7 @@ func (r *NeInfo) DeleteByIds(infoIds []string) (int64, error) { } // CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 -func (r *NeInfo) CheckUniqueNeTypeAndNeId(neType, neId, id string) bool { +func (r NeInfo) CheckUniqueNeTypeAndNeId(neType, neId string, id int64) bool { uniqueId := r.neInfoRepository.CheckUniqueNeTypeAndNeId(model.NeInfo{ NeType: neType, NeId: neId, @@ -332,12 +339,12 @@ func (r *NeInfo) CheckUniqueNeTypeAndNeId(neType, neId, id string) bool { if uniqueId == id { return true } - return uniqueId == "" + return uniqueId == 0 } // NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() -func (r *NeInfo) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) +func (r NeInfo) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { + neInfo := r.FindByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId { logger.Errorf("NeRunSSHClient NeType:%s NeID:%s not found", neType, neId) return nil, fmt.Errorf("neinfo not found") @@ -352,9 +359,9 @@ func (r *NeInfo) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) return nil, fmt.Errorf("neinfo host id not found") } - hostId := hostIds[0] // 网元主机ssh 0:22 - neHost := NewNeHost.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { + hostId := parse.Number(hostIds[0]) // 网元主机ssh 0:22 + neHost := r.neHostService.FindById(hostId) + if neHost.ID == 0 || neHost.ID != hostId { logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) return nil, fmt.Errorf("neinfo host not found") } @@ -380,7 +387,7 @@ func (r *NeInfo) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { } // NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 -func (r *NeInfo) NeRunSSHCmd(neType, neId, cmd string) (string, error) { +func (r NeInfo) NeRunSSHCmd(neType, neId, cmd string) (string, error) { sshClient, err := r.NeRunSSHClient(neType, neId) if err != nil { return "", err @@ -398,8 +405,8 @@ func (r *NeInfo) NeRunSSHCmd(neType, neId, cmd string) (string, error) { // NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() // num 是网元主机telnet 1:4100 2:5200(UPF标准版) -func (r *NeInfo) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) +func (r NeInfo) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { + neInfo := r.FindByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId { logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s not found", neType, neId) return nil, fmt.Errorf("neinfo not found") @@ -414,9 +421,9 @@ func (r *NeInfo) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTe logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) return nil, fmt.Errorf("neinfo host id not found") } - hostId := hostIds[num] // 网元主机telnet 1:4100 2:5200 - neHost := NewNeHost.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { + hostId := parse.Number(hostIds[num]) // 网元主机telnet 1:4100 2:5200 + neHost := r.neHostService.FindById(hostId) + if neHost.ID == 0 || neHost.ID != hostId { logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) return nil, fmt.Errorf("neinfo host not found") } @@ -434,8 +441,8 @@ func (r *NeInfo) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTe // NeRunRedisClient 网元主机的Redis客户端-为创建相关连接,注意结束后 Close() // 暂时只有UDM有Redis配置项 -func (r *NeInfo) NeRunRedisClient(neType, neId string) (*redis.ConnRedis, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) +func (r NeInfo) NeRunRedisClient(neType, neId string) (*redis.ConnRedis, error) { + neInfo := r.FindByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId { logger.Errorf("NeRunRedisClient NeType:%s NeID:%s not found", neType, neId) return nil, fmt.Errorf("neinfo not found") @@ -450,9 +457,9 @@ func (r *NeInfo) NeRunRedisClient(neType, neId string) (*redis.ConnRedis, error) logger.Errorf("NeRunRedisClient hosts id %s not found", neInfo.HostIDs) return nil, fmt.Errorf("neinfo host id not found") } - hostId := hostIds[2] - neHost := NewNeHost.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { + 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) return nil, fmt.Errorf("neinfo host not found") } @@ -469,7 +476,7 @@ func (r *NeInfo) NeRunRedisClient(neType, neId string) (*redis.ConnRedis, error) } // NeConfOAMReadSync 网元OAM配置文件读取 -func (r *NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { +func (r NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { oamData, err := r.neConfOAMRead(neType, neId, true) if err != nil { return nil, err @@ -531,7 +538,7 @@ func (r *NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error) } // neConfOAMData 网元OAM配置文件默认格式数据 -func (r *NeInfo) neConfOAMData() map[string]any { +func (r NeInfo) neConfOAMData() map[string]any { return map[string]any{ "httpManageCfg": map[string]any{ "ipType": "ipv4", @@ -574,7 +581,7 @@ func (r *NeInfo) neConfOAMData() map[string]any { } // neConfOAMRead 网元OAM配置文件读取 sync从网元端同步到本地 -func (r *NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) { +func (r NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) { neTypeLower := strings.ToLower(neType) fileName := "oam_manager.yaml" // 网管本地路径 @@ -629,7 +636,7 @@ func (r *NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any, } // neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端 -func (r *NeInfo) neConfOAMWirte(neType, neId string, content any, sync bool) error { +func (r NeInfo) neConfOAMWirte(neType, neId string, content any, sync bool) error { neTypeLower := strings.ToLower(neType) fileName := "oam_manager.yaml" // 网管本地路径 @@ -674,7 +681,7 @@ func (r *NeInfo) neConfOAMWirte(neType, neId string, content any, sync bool) err } // NeConfOAMWirteSync 网元OAM配置文件生成并同步 -func (r *NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error { +func (r NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error { oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId, false) if oamData == nil || err != nil { return fmt.Errorf("error read OAM file info") @@ -782,7 +789,7 @@ func (r *NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, } // NeConfPara5GRead 网元公共配置文件读取 -func (r *NeInfo) NeConfPara5GRead() (map[string]any, error) { +func (r NeInfo) NeConfPara5GRead() (map[string]any, error) { // 网管本地路径 omcFilePath := "/usr/local/etc/omc/para5G.yaml" if runtime.GOOS == "windows" { @@ -806,7 +813,7 @@ func (r *NeInfo) NeConfPara5GRead() (map[string]any, error) { } // NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId -func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) error { +func (r NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) error { // 网管本地路径 omcFilePath := "/usr/local/etc/omc/para5G.yaml" if runtime.GOOS == "windows" { @@ -859,7 +866,7 @@ func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) erro } // NeConfPara5GConvert 网元公共配置数据转化 content网元公共配置文件读取内容 -func (r *NeInfo) neConfPara5GDataConvert(content map[string]any) map[string]string { +func (r NeInfo) neConfPara5GDataConvert(content map[string]any) map[string]string { defer func() { if err := recover(); err != nil { logger.Errorf("NeConfPara5GDataConvert panic: %v", err) diff --git a/src/modules/network_element/service/ne_license.go b/src/modules/network_element/service/ne_license.go index fa84b155..6a7452db 100644 --- a/src/modules/network_element/service/ne_license.go +++ b/src/modules/network_element/service/ne_license.go @@ -23,22 +23,22 @@ type NeLicense struct { neLicenseRepository *repository.NeLicense // 网元授权激活信息表 } -// SelectNeHostPage 分页查询列表数据 -func (r *NeLicense) SelectPage(query map[string]any) map[string]any { - return r.neLicenseRepository.SelectPage(query) +// FindByPage 分页查询列表数据 +func (r *NeLicense) FindByPage(query map[string]string) ([]model.NeLicense, int64) { + return r.neLicenseRepository.SelectByPage(query) } -// SelectConfigList 查询列表 -func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense { - return r.neLicenseRepository.SelectList(neLicense) +// Find 查询列表 +func (r *NeLicense) Find(neLicense model.NeLicense) []model.NeLicense { + return r.neLicenseRepository.Select(neLicense) } -// SelectByIds 通过ID查询 -func (r *NeLicense) SelectById(id string) model.NeLicense { - if id == "" { +// FindById 通过ID查询 +func (r *NeLicense) FindById(id int64) model.NeLicense { + if id <= 0 { return model.NeLicense{} } - neLicenses := r.neLicenseRepository.SelectByIds([]string{id}) + neLicenses := r.neLicenseRepository.SelectByIds([]int64{id}) if len(neLicenses) > 0 { return neLicenses[0] } @@ -46,7 +46,7 @@ func (r *NeLicense) SelectById(id string) model.NeLicense { } // Insert 新增信息 -func (r *NeLicense) Insert(neLicense model.NeLicense) string { +func (r *NeLicense) Insert(neLicense model.NeLicense) int64 { return r.neLicenseRepository.Insert(neLicense) } @@ -56,7 +56,7 @@ func (r *NeLicense) Update(neLicense model.NeLicense) int64 { } // DeleteByIds 批量删除信息 -func (r *NeLicense) DeleteByIds(ids []string) (int64, error) { +func (r *NeLicense) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 rowIds := r.neLicenseRepository.SelectByIds(ids) if len(rowIds) <= 0 { @@ -71,9 +71,9 @@ func (r *NeLicense) DeleteByIds(ids []string) (int64, error) { return 0, fmt.Errorf("delete fail") } -// SelectByTypeAndID 通过网元类型和网元ID查询 -func (r *NeLicense) SelectByTypeAndID(neType, neId string) model.NeLicense { - neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ +// FindByTypeAndID 通过网元类型和网元ID查询 +func (r *NeLicense) FindByTypeAndID(neType, neId string) model.NeLicense { + neLicenses := r.neLicenseRepository.Select(model.NeLicense{ NeType: neType, NeId: neId, }) @@ -83,9 +83,9 @@ func (r *NeLicense) SelectByTypeAndID(neType, neId string) model.NeLicense { return model.NeLicense{} } -// SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 -func (r *NeLicense) SelectByNeTypeAndNeID(neType, neId string) model.NeLicense { - neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ +// FindByNeTypeAndNeID 通过ne_type和ne_id查询信息 +func (r *NeLicense) FindByNeTypeAndNeID(neType, neId string) model.NeLicense { + neLicenses := r.neLicenseRepository.Select(model.NeLicense{ NeType: neType, NeId: neId, }) @@ -142,7 +142,7 @@ func (r *NeLicense) ReadLicenseInfo(neLicense model.NeLicense) (string, string) // UploadLicense 授权文件上传到网元主机 func (r *NeLicense) UploadLicense(neLicense model.NeLicense) error { // 检查文件是否存在 - omcLicensePath := file.ParseUploadFilePath(neLicense.LicensePath) + omcLicensePath := file.ParseUploadFileAbsPath(neLicense.LicensePath) if _, err := os.Stat(omcLicensePath); err != nil { return fmt.Errorf("file read failure") } diff --git a/src/modules/network_element/service/ne_software.go b/src/modules/network_element/service/ne_software.go index c4910f05..39b9aa5f 100644 --- a/src/modules/network_element/service/ne_software.go +++ b/src/modules/network_element/service/ne_software.go @@ -12,29 +12,31 @@ import ( // 实例化服务层 NeSoftware 结构体 var NewNeSoftware = &NeSoftware{ neSoftwareRepository: repository.NewNeSoftware, + neVersionService: NewNeVersion, } // NeSoftware 网元软件包信息 服务层处理 type NeSoftware struct { neSoftwareRepository *repository.NeSoftware // 网元软件包信息 + neVersionService *NeVersion // 网元版本信息服务 } -// SelectNeHostPage 分页查询列表数据 -func (r *NeSoftware) SelectPage(query map[string]any) map[string]any { - return r.neSoftwareRepository.SelectPage(query) +// FindByPage 分页查询列表数据 +func (r NeSoftware) FindByPage(query map[string]string) ([]model.NeSoftware, int64) { + return r.neSoftwareRepository.SelectByPage(query) } -// SelectConfigList 查询列表 -func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { - return r.neSoftwareRepository.SelectList(neSoftware) +// Find 查询列表 +func (r NeSoftware) Find(neSoftware model.NeSoftware) []model.NeSoftware { + return r.neSoftwareRepository.Select(neSoftware) } -// SelectByIds 通过ID查询 -func (r *NeSoftware) SelectById(id string) model.NeSoftware { - if id == "" { +// FindById 通过ID查询 +func (r NeSoftware) FindById(id int64) model.NeSoftware { + if id <= 0 { return model.NeSoftware{} } - neHosts := r.neSoftwareRepository.SelectByIds([]string{id}) + neHosts := r.neSoftwareRepository.SelectByIds([]int64{id}) if len(neHosts) > 0 { return neHosts[0] } @@ -42,11 +44,11 @@ func (r *NeSoftware) SelectById(id string) model.NeSoftware { } // Insert 新增信息 -func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { +func (r NeSoftware) Insert(neSoftware model.NeSoftware) int64 { inserId := r.neSoftwareRepository.Insert(neSoftware) - if inserId != "" { + if inserId > 0 { // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(model.NeVersion{NeType: neSoftware.NeType}, false) + neVersions := r.neVersionService.Find(model.NeVersion{NeType: neSoftware.NeType}, false) if len(neVersions) > 0 { for _, neVersion := range neVersions { neVersion.NewName = neSoftware.Name @@ -54,7 +56,7 @@ func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { neVersion.NewPath = neSoftware.Path neVersion.Status = "3" neVersion.UpdateBy = neSoftware.CreateBy - NewNeVersion.Update(neVersion) + r.neVersionService.Update(neVersion) } } } @@ -62,11 +64,11 @@ func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { } // Update 修改信息 -func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { +func (r NeSoftware) Update(neSoftware model.NeSoftware) int64 { rows := r.neSoftwareRepository.Update(neSoftware) if rows > 0 { // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(model.NeVersion{ + neVersions := r.neVersionService.Find(model.NeVersion{ NeType: neSoftware.NeType, Status: "3", }, false) @@ -77,7 +79,7 @@ func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { neVersion.NewPath = neSoftware.Path neVersion.Status = "3" neVersion.UpdateBy = neSoftware.UpdateBy - NewNeVersion.Update(neVersion) + r.neVersionService.Update(neVersion) } } } @@ -85,7 +87,7 @@ func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { } // DeleteByIds 批量删除信息 -func (r *NeSoftware) DeleteByIds(ids []string) (int64, error) { +func (r NeSoftware) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 rows := r.neSoftwareRepository.SelectByIds(ids) if len(rows) <= 0 { @@ -96,7 +98,7 @@ func (r *NeSoftware) DeleteByIds(ids []string) (int64, error) { // 遍历软件包列表进行文件删除 for _, row := range rows { // 检查文件是否存在 - filePath := file.ParseUploadFilePath(row.Path) + filePath := file.ParseUploadFileAbsPath(row.Path) if _, err := os.Stat(filePath); err != nil { continue } @@ -111,8 +113,8 @@ func (r *NeSoftware) DeleteByIds(ids []string) (int64, error) { } // CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 -func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool { - uniqueId := r.neSoftwareRepository.CheckUniqueTypeAndNameAndVersion(model.NeSoftware{ +func (r NeSoftware) CheckUniqueTypeAndNameAndVersion(neType, name, version string, id int64) bool { + uniqueId := r.neSoftwareRepository.CheckUnique(model.NeSoftware{ NeType: neType, Name: name, Version: version, @@ -120,14 +122,14 @@ func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neType, name, version, id if uniqueId == id { return true } - return uniqueId == "" + return uniqueId == 0 } // UpdateVersions 更新软件包对应网元的新版本 -func (r *NeSoftware) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { +func (r NeSoftware) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { var rows int64 = 0 // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(neVersion, false) + neVersions := r.neVersionService.Find(neVersion, false) if len(neVersions) > 0 { for _, v := range neVersions { v.NewName = neSoftware.Name @@ -135,7 +137,7 @@ func (r *NeSoftware) UpdateVersions(neSoftware model.NeSoftware, neVersion model v.NewPath = neSoftware.Path v.Status = "3" v.UpdateBy = neVersion.UpdateBy - rows += NewNeVersion.Update(v) + rows += r.neVersionService.Update(v) } } return rows diff --git a/src/modules/network_element/service/ne_version.go b/src/modules/network_element/service/ne_version.go index 97a04f23..6ce1ba13 100644 --- a/src/modules/network_element/service/ne_version.go +++ b/src/modules/network_element/service/ne_version.go @@ -7,8 +7,8 @@ import ( "strings" "time" + "be.ems/src/framework/ssh" "be.ems/src/framework/utils/file" - "be.ems/src/framework/utils/ssh" neFetchlink "be.ems/src/modules/network_element/fetch_link" "be.ems/src/modules/network_element/model" "be.ems/src/modules/network_element/repository" @@ -17,29 +17,30 @@ import ( // 实例化服务层 NeVersion 结构体 var NewNeVersion = &NeVersion{ neVersionRepository: repository.NewNeVersion, + neInfoService: NewNeInfo, } // NeVersion 网元版本信息 服务层处理 type NeVersion struct { neVersionRepository *repository.NeVersion // 网元版本信息表 + neInfoService *NeInfo // 网元信息数据信息 } -// SelectNeHostPage 分页查询列表数据 -func (r *NeVersion) SelectPage(query map[string]any, checkVersion bool) map[string]any { - data := r.neVersionRepository.SelectPage(query) +// FindByPage 分页查询列表数据 +func (r NeVersion) FindByPage(query map[string]string, checkVersion bool) ([]model.NeVersion, int64) { + rows, total := r.neVersionRepository.SelectByPage(query) // 网元直连检查更新网元服务版本 if checkVersion { - rows := data["rows"].([]model.NeVersion) r.checkNeVersion(&rows) } - return data + return rows, total } -// SelectConfigList 查询列表 -func (r *NeVersion) SelectList(neVersion model.NeVersion, checkVersion bool) []model.NeVersion { - list := r.neVersionRepository.SelectList(neVersion) +// Find 查询列表 +func (r NeVersion) Find(neVersion model.NeVersion, checkVersion bool) []model.NeVersion { + list := r.neVersionRepository.Select(neVersion) // 网元直连检查更新网元服务版本 if checkVersion { @@ -50,11 +51,11 @@ func (r *NeVersion) SelectList(neVersion model.NeVersion, checkVersion bool) []m } // checkNeVersion 网元列表检查更新网元版本 -func (r *NeVersion) checkNeVersion(arr *[]model.NeVersion) { +func (r NeVersion) checkNeVersion(arr *[]model.NeVersion) { for i := range *arr { item := (*arr)[i] // 查询网元获取IP - neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(item.NeType, item.NeId) + neInfo := r.neInfoService.FindByNeTypeAndNeID(item.NeType, item.NeId) if neInfo.NeId != item.NeId || neInfo.IP == "" { continue } @@ -80,12 +81,12 @@ func (r *NeVersion) checkNeVersion(arr *[]model.NeVersion) { } } -// SelectByIds 通过ID查询 -func (r *NeVersion) SelectById(id string) model.NeVersion { - if id == "" { +// FindById 通过ID查询 +func (r NeVersion) FindById(id int64) model.NeVersion { + if id <= 0 { return model.NeVersion{} } - neVersions := r.neVersionRepository.SelectByIds([]string{id}) + neVersions := r.neVersionRepository.SelectByIds([]int64{id}) if len(neVersions) > 0 { return neVersions[0] } @@ -93,17 +94,17 @@ func (r *NeVersion) SelectById(id string) model.NeVersion { } // Insert 新增信息 -func (r *NeVersion) Insert(neVersion model.NeVersion) string { +func (r NeVersion) Insert(neVersion model.NeVersion) int64 { return r.neVersionRepository.Insert(neVersion) } // Update 修改信息 -func (r *NeVersion) Update(neVersion model.NeVersion) int64 { +func (r NeVersion) Update(neVersion model.NeVersion) int64 { return r.neVersionRepository.Update(neVersion) } // DeleteByIds 批量删除信息 -func (r *NeVersion) DeleteByIds(ids []string) (int64, error) { +func (r NeVersion) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 rowIds := r.neVersionRepository.SelectByIds(ids) if len(rowIds) <= 0 { @@ -118,9 +119,9 @@ func (r *NeVersion) DeleteByIds(ids []string) (int64, error) { return 0, fmt.Errorf("delete fail") } -// SelectByNeTypeAndNeID 通过网元类型和网元ID查询 -func (r *NeVersion) SelectByNeTypeAndNeID(neType, neId string) model.NeVersion { - neVersions := r.neVersionRepository.SelectList(model.NeVersion{ +// FindByNeTypeAndNeID 通过网元类型和网元ID查询 +func (r NeVersion) FindByNeTypeAndNeID(neType, neId string) model.NeVersion { + neVersions := r.neVersionRepository.Select(model.NeVersion{ NeType: neType, NeId: neId, }) @@ -133,9 +134,9 @@ func (r *NeVersion) SelectByNeTypeAndNeID(neType, neId string) model.NeVersion { // Operate 操作版本上传到网元主机执行命令 // // action 安装行为:install upgrade rollback -func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) { +func (r NeVersion) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) { // 网元主机的SSH客户端 - sshClient, err := NewNeInfo.NeRunSSHClient(neVersion.NeType, neVersion.NeId) + sshClient, err := r.neInfoService.NeRunSSHClient(neVersion.NeType, neVersion.NeId) if err != nil { return "", err } @@ -157,11 +158,11 @@ func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput m // ========= 安装时设置 ========= if action == "install" { // 网元公共配置文件 - para5GMap, err := NewNeInfo.NeConfPara5GRead() + para5GMap, err := r.neInfoService.NeConfPara5GRead() if para5GMap == nil || err != nil { return "", fmt.Errorf("error read para5G file info") } - if err := NewNeInfo.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.NeType, neVersion.NeId)}); err != nil { + if err := r.neInfoService.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.NeType, neVersion.NeId)}); err != nil { return "", fmt.Errorf("error wirte para5G file info") } } @@ -188,7 +189,7 @@ func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput m } // operateFile 操作版本-文件传输阶段 -func (r *NeVersion) operateFile(sshClient *ssh.ConnSSH, softwarePath string) ([]string, error) { +func (r NeVersion) operateFile(sshClient *ssh.ConnSSH, softwarePath string) ([]string, error) { // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { @@ -209,7 +210,7 @@ func (r *NeVersion) operateFile(sshClient *ssh.ConnSSH, softwarePath string) ([] for _, path := range softwarePaths { // 检查文件是否存在 - localFilePath := file.ParseUploadFilePath(path) + localFilePath := file.ParseUploadFileAbsPath(path) if _, err := os.Stat(localFilePath); err != nil { return nil, fmt.Errorf("file read failure") } @@ -231,7 +232,7 @@ func (r *NeVersion) operateFile(sshClient *ssh.ConnSSH, softwarePath string) ([] } // operateCommand 操作版本-命令生成阶段 -func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) (string, []string, error) { +func (r NeVersion) operateCommand(action, neType string, neFilePaths []string) (string, []string, error) { neTypeLower := strings.ToLower(neType) // 命令终止结束标记 okFlagStr := fmt.Sprintf("%s version %s successful!", neTypeLower, action) @@ -271,7 +272,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) return okFlagStr, cmdStrArr, nil } else if neType == "IMS" { if action == "install" { - para5GData := NewNeInfo.Para5GData + para5GData := r.neInfoService.Para5GData cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") // 公网 PLMN地址 @@ -313,7 +314,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) } } else { if action == "install" { - para5GData := NewNeInfo.Para5GData + para5GData := r.neInfoService.Para5GData cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") // AMF配置修改 @@ -560,14 +561,14 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) if action == "install" && (neTypeLower == "ims" || neTypeLower == "udm") { // adb if strings.Contains(pkgCmdStr, "adb") { - para5GData := NewNeInfo.Para5GData + para5GData := r.neInfoService.Para5GData cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/adb/default/adb.conf /usr/local/etc/adb/adb.conf \n") cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind %s/g\" /usr/local/etc/adb/adb.conf \n", para5GData["DB_IP"])) cmdStrArr = append(cmdStrArr, "sudo service adb restart \n") } // kvdb if strings.Contains(pkgCmdStr, "kvdb") { - para5GData := NewNeInfo.Para5GData + para5GData := r.neInfoService.Para5GData cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/kvdb/default/kvdb.conf /usr/local/etc/kvdb/kvdb.conf \n") cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind %s/g\" /usr/local/etc/kvdb/kvdb.conf \n", para5GData["DB_IP"])) cmdStrArr = append(cmdStrArr, "sudo service kvdb restart \n") @@ -583,7 +584,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) } // operateRun 操作版本-执行阶段 -func (r *NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]string, cmdStrArr []string, neType string, okFlagStr string) (string, error) { +func (r NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]string, cmdStrArr []string, neType string, okFlagStr string) (string, error) { // ssh连接会话 clientSession, err := sshClient.NewClientSession(127, 42) if err != nil { @@ -673,23 +674,23 @@ func (r *NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]strin } // operateDome 操作版本-完成阶段 -func (r *NeVersion) operateDome(action string, neVersion model.NeVersion) error { +func (r NeVersion) operateDome(action string, neVersion model.NeVersion) error { if action == "install" { // 网元信息 - neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) + neInfo := r.neInfoService.FindByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) if neInfo.NeId != neVersion.NeId { return fmt.Errorf("error found neinfo") } // ========= 网元OAM配置文件 start ========== - if err := NewNeInfo.NeConfOAMWirteSync(neInfo, nil, true); err != nil { + if err := r.neInfoService.NeConfOAMWirteSync(neInfo, nil, true); err != nil { return fmt.Errorf("error wirte OAM file info") } // ========= 网元OAM配置文件 end =========== // SMSC配置修改 IMS/UDM 配置 if neInfo.NeType == "SMSC" { - para5GData := NewNeInfo.Para5GData + para5GData := r.neInfoService.Para5GData mnc_mcc := fmt.Sprintf("mnc%s.mcc%s", para5GData["MNC_DOMAIN"], para5GData["MCC"]) smscHost := fmt.Sprintf("%s smsc.ims.%s.3gppnetwork.org", para5GData["SMSC_IP"], mnc_mcc) smscHostCMD := fmt.Sprintf("grep -qxF '%s' /etc/hosts || echo '%s' | sudo tee -a /etc/hosts \n", smscHost, smscHost) @@ -697,30 +698,30 @@ 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 := NewNeInfo.SelectList(model.NeInfo{NeType: "IMS"}, false, false) + imsNEs := r.neInfoService.Find(model.NeInfo{NeType: "IMS"}, false, false) for _, v := range imsNEs { - NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscIPCMD) - NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscHostCMD) - NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smsHost) - NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, "sudo sed -i '/^#!define WITH_SMS/ s/^/#/' /usr/local/etc/ims/vars.cfg") - NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, "ims-stop || true && ims-start") + r.neInfoService.NeRunSSHCmd(v.NeType, v.NeId, smscIPCMD) + r.neInfoService.NeRunSSHCmd(v.NeType, v.NeId, smscHostCMD) + r.neInfoService.NeRunSSHCmd(v.NeType, v.NeId, smsHost) + r.neInfoService.NeRunSSHCmd(v.NeType, v.NeId, "sudo sed -i '/^#!define WITH_SMS/ s/^/#/' /usr/local/etc/ims/vars.cfg") + r.neInfoService.NeRunSSHCmd(v.NeType, v.NeId, "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 := NewNeInfo.SelectList(model.NeInfo{NeType: "UDM"}, false, false) + udmNEs := r.neInfoService.Find(model.NeInfo{NeType: "UDM"}, false, false) for _, v := range udmNEs { - NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscIPCMD) - NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscHostCMD) - NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscASName) - NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, smscASAddress) - NewNeInfo.NeRunSSHCmd(v.NeType, v.NeId, "sudo service udm restart") + r.neInfoService.NeRunSSHCmd(v.NeType, v.NeId, smscIPCMD) + r.neInfoService.NeRunSSHCmd(v.NeType, v.NeId, smscHostCMD) + r.neInfoService.NeRunSSHCmd(v.NeType, v.NeId, smscASName) + r.neInfoService.NeRunSSHCmd(v.NeType, v.NeId, smscASAddress) + r.neInfoService.NeRunSSHCmd(v.NeType, v.NeId, "sudo service udm restart") } } } // 更新Version - verInfo := r.SelectByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) + verInfo := r.FindByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) if verInfo.NeId == neVersion.NeId { curName := verInfo.Name curVersion := verInfo.Version diff --git a/src/modules/system/controller/sys_config.go b/src/modules/system/controller/sys_config.go index 3b1ab116..75d3fb95 100644 --- a/src/modules/system/controller/sys_config.go +++ b/src/modules/system/controller/sys_config.go @@ -3,24 +3,22 @@ package controller import ( "fmt" "strconv" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "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/framework/vo/result" "be.ems/src/modules/system/model" "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SysConfigController 结构体 var NewSysConfig = &SysConfigController{ - sysConfigService: service.NewSysConfigImpl, + sysConfigService: service.NewSysConfig, } // 参数配置信息 @@ -28,7 +26,7 @@ var NewSysConfig = &SysConfigController{ // PATH /system/config type SysConfigController struct { // 参数配置服务 - sysConfigService service.ISysConfig + sysConfigService *service.SysConfig // 参数配置服务 } // 参数配置列表 @@ -47,15 +45,14 @@ type SysConfigController struct { // @Description Config Information List // @Router /system/config/list [get] func (s *SysConfigController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - querys := ctx.QueryMap(c) + language := reqctx.AcceptLanguage(c) + query := reqctx.QueryMap(c) // 多语言值转key查询 - if v, ok := querys["configName"]; ok && v != "" { - querys["configName"] = i18n.TFindKeyPrefix(language, "config", v.(string)) + if v, ok := query["configName"]; ok && v != "" { + query["configName"] = i18n.TFindKeyPrefix(language, "config", v) } - data := s.sysConfigService.SelectConfigPage(querys) - rows := data["rows"].([]model.SysConfig) + rows, total := s.sysConfigService.FindByPage(query) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysConfig) { @@ -67,187 +64,200 @@ func (s *SysConfigController) List(c *gin.Context) { } converI18n(language, &rows) - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 参数配置信息 // // GET /:configId func (s *SysConfigController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - configId := c.Param("configId") - if configId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + configId := parse.Number(c.Param("configId")) + if configId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: configId is empty")) return } - data := s.sysConfigService.SelectConfigById(configId) - if data.ConfigID == configId { + data := s.sysConfigService.FindById(configId) + if data.ConfigId == configId { // 处理多语言 data.ConfigName = i18n.TKey(language, data.ConfigName) data.ConfigValue = i18n.TKey(language, data.ConfigValue) data.Remark = i18n.TKey(language, data.Remark) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 参数配置新增 // // POST / func (s *SysConfigController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysConfig - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.ConfigID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.ConfigId > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: configId not is empty")) return } // 检查属性值唯一 - uniqueConfigKey := s.sysConfigService.CheckUniqueConfigKey(body.ConfigKey, "") + uniqueConfigKey := s.sysConfigService.CheckUniqueByKey(body.ConfigKey, 0) if !uniqueConfigKey { - // 参数配置新增【%s】失败,参数键名已存在 + // msg := fmt.Sprintf("参数配置新增【%s】失败,参数键名已存在", body.ConfigKey) msg := i18n.TTemplate(language, "config.errKeyExists", map[string]any{"name": body.ConfigKey}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - body.CreateBy = ctx.LoginUserToUserName(c) - insertId := s.sysConfigService.InsertConfig(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + body.CreateBy = reqctx.LoginUserToUserName(c) + insertId := s.sysConfigService.Insert(body) + if insertId > 0 { + c.JSON(200, resp.OkData(insertId)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 参数配置修改 // // PUT / func (s *SysConfigController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysConfig - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.ConfigID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - - // 检查属性值唯一 - uniqueConfigKey := s.sysConfigService.CheckUniqueConfigKey(body.ConfigKey, body.ConfigID) - if !uniqueConfigKey { - // 参数配置修改【%s】失败,参数键名已存在 - msg := i18n.TTemplate(language, "config.errKeyExists", map[string]any{"name": body.ConfigKey}) - c.JSON(200, result.ErrMsg(msg)) + if body.ConfigId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: configId is empty")) return } // 检查是否存在 - configInfo := s.sysConfigService.SelectConfigById(body.ConfigID) - if configInfo.ConfigID != body.ConfigID { - // 没有可访问参数配置数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "config.noData"))) + configInfo := s.sysConfigService.FindById(body.ConfigId) + if configInfo.ConfigId != body.ConfigId { + // c.JSON(200, resp.ErrMsg("没有权限访问参数配置数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "config.noData"))) + return + } + + // 检查属性值唯一 + uniqueConfigKey := s.sysConfigService.CheckUniqueByKey(body.ConfigKey, body.ConfigId) + if !uniqueConfigKey { + // msg := fmt.Sprintf("参数配置修改【%s】失败,参数键名已存在", body.ConfigKey) + msg := i18n.TTemplate(language, "config.errKeyExists", map[string]any{"name": body.ConfigKey}) + c.JSON(200, resp.ErrMsg(msg)) return } // 多语言非原始值 i18nValue := i18n.TKey(language, configInfo.ConfigName) if i18nValue != configInfo.ConfigName { - i18n.UpdateKeyValue(language, configInfo.ConfigName, body.ConfigName) + service.NewSysI18n.UpdateKeyValue(language, configInfo.ConfigName, body.ConfigName) body.ConfigName = configInfo.ConfigName } // 多语言非原始值 i18nValue2 := i18n.TKey(language, configInfo.ConfigValue) if i18nValue2 != configInfo.ConfigValue { - i18n.UpdateKeyValue(language, configInfo.ConfigValue, body.ConfigValue) + service.NewSysI18n.UpdateKeyValue(language, configInfo.ConfigValue, body.ConfigValue) body.ConfigValue = configInfo.ConfigValue } // 多语言非原始值 i18nValue3 := i18n.TKey(language, configInfo.Remark) if i18nValue3 != configInfo.Remark { - i18n.UpdateKeyValue(language, configInfo.Remark, body.Remark) + service.NewSysI18n.UpdateKeyValue(language, configInfo.Remark, body.Remark) body.Remark = configInfo.Remark } - body.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysConfigService.UpdateConfig(body) + configInfo.ConfigType = body.ConfigType + configInfo.ConfigName = body.ConfigName + configInfo.ConfigKey = body.ConfigKey + configInfo.ConfigValue = body.ConfigValue + configInfo.Remark = body.Remark + configInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysConfigService.Update(configInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 参数配置删除 +// Remove 参数配置删除 // -// DELETE /:configIds -func (s *SysConfigController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - configIds := c.Param("configIds") - if configIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// DELETE /:configId +func (s SysConfigController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + configId := c.Param("configId") + if configId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: configId is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(configIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(configId, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.sysConfigService.DeleteConfigByIds(uniqueIDs) + + rows, err := s.sysConfigService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(err.Error())) return } + // msg := fmt.Sprintf("删除成功:%d", rows) msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } -// 参数配置刷新缓存 +// Refresh 参数配置刷新缓存 // -// PUT /refreshCache -func (s *SysConfigController) RefreshCache(c *gin.Context) { - s.sysConfigService.ResetConfigCache() - c.JSON(200, result.Ok(nil)) +// PUT /refresh +func (s SysConfigController) Refresh(c *gin.Context) { + s.sysConfigService.CacheClean("*") + s.sysConfigService.CacheLoad("*") + c.JSON(200, resp.Ok(nil)) } -// 参数配置根据参数键名 +// ConfigKey 参数配置根据参数键名 // -// GET /configKey/:configKey -func (s *SysConfigController) ConfigKey(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// GET /config-key/:configKey +func (s SysConfigController) ConfigKey(c *gin.Context) { configKey := c.Param("configKey") if configKey == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(40010, "bind err: configKey is empty")) return } - key := s.sysConfigService.SelectConfigValueByKey(configKey) + key := s.sysConfigService.FindValueByKey(configKey) if key != "" { - c.JSON(200, result.OkData(i18n.TKey(language, key))) + c.JSON(200, resp.OkData(key)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 导出参数配置信息 +// Export 导出参数配置信息 // -// POST /export -func (s *SysConfigController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// GET /export +func (s SysConfigController) Export(c *gin.Context) { + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - data := s.sysConfigService.SelectConfigPage(querys) - if parse.Number(data["total"]) == 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + query := reqctx.QueryMap(c) + rows, total := s.sysConfigService.FindByPage(query) + if total == 0 { + // c.JSON(200, resp.CodeMsg(40016, "export data record as empty")) + c.JSON(200, resp.CodeMsg(40016, i18n.TKey(language, "app.common.exportEmpty"))) return } - rows := data["rows"].([]model.SysConfig) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysConfig) { @@ -279,7 +289,7 @@ func (s *SysConfigController) Export(c *gin.Context) { typeValue = i18n.TKey(language, "dictData.yes") } dataCells = append(dataCells, map[string]any{ - "A" + idx: row.ConfigID, + "A" + idx: row.ConfigId, "B" + idx: row.ConfigName, "C" + idx: row.ConfigKey, "D" + idx: row.ConfigValue, @@ -291,7 +301,7 @@ func (s *SysConfigController) Export(c *gin.Context) { // 导出数据表格 saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } @@ -302,21 +312,22 @@ func (s *SysConfigController) Export(c *gin.Context) { // // PUT /changeValue func (s *SysConfigController) ConfigValue(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { Key string `json:"key" binding:"required"` Value string `json:"value" binding:"required"` } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 检查是否存在 - info := s.sysConfigService.SelectConfigByKey(body.Key) + info := s.sysConfigService.FindByKey(body.Key) if info.ConfigKey != body.Key { // 无效 key - c.JSON(200, result.ErrMsg(i18n.TKey(language, "config.errKey"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "config.errKey"))) return } @@ -324,22 +335,22 @@ func (s *SysConfigController) ConfigValue(c *gin.Context) { i18nValue := i18n.TKey(language, info.ConfigValue) if i18nValue == body.Value { // 变更状态与旧值相等! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "config.errValueEq"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "config.errValueEq"))) return } // 多语言非原始值 if i18nValue != info.ConfigValue { - i18n.UpdateKeyValue(language, info.ConfigValue, body.Value) + service.NewSysI18n.UpdateKeyValue(language, info.ConfigValue, body.Value) } else { info.ConfigValue = body.Value } - info.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysConfigService.UpdateConfig(info) + info.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysConfigService.Update(info) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } diff --git a/src/modules/system/controller/sys_dept.go b/src/modules/system/controller/sys_dept.go index 693a85af..9fe5c83d 100644 --- a/src/modules/system/controller/sys_dept.go +++ b/src/modules/system/controller/sys_dept.go @@ -1,31 +1,31 @@ package controller import ( + "fmt" "strings" - "be.ems/src/framework/constants/common" + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/utils/parse" "be.ems/src/modules/system/model" + "be.ems/src/modules/system/model/vo" "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SysDeptController 结构体 var NewSysDept = &SysDeptController{ - sysDeptService: service.NewSysDeptImpl, + sysDeptService: service.NewSysDept, } // 部门信息 // // PATH /system/dept type SysDeptController struct { - // 部门服务 - sysDeptService service.ISysDept + sysDeptService *service.SysDept // 部门服务 } // 部门列表 @@ -45,36 +45,32 @@ type SysDeptController struct { // @Description Dept Information List // @Router /system/dept/list [get] func (s *SysDeptController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var querys struct { - // 部门ID - DeptID string `form:"deptId"` - // 父部门ID - ParentID string `form:"parentId" ` - // 部门名称 - DeptName string `form:"deptName" ` - // 部门状态(0正常 1停用) - Status string `form:"status"` + language := reqctx.AcceptLanguage(c) + var query struct { + DeptId int64 `form:"deptId"` // 部门ID + ParentId int64 `form:"parentId"` // 父部门ID + DeptName string `form:"deptName"` // 部门名称 + Status string `form:"status"` // 部门状态(0正常 1停用) } - err := c.ShouldBindQuery(&querys) - if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 多语言值转key查询 - if querys.DeptName != "" { - querys.DeptName = i18n.TFindKeyPrefix(language, "dept", querys.DeptName) + if query.DeptName != "" { + query.DeptName = i18n.TFindKeyPrefix(language, "dept", query.DeptName) } - SysDeptController := model.SysDept{ - DeptID: querys.DeptID, - ParentID: querys.ParentID, - DeptName: querys.DeptName, - Status: querys.Status, + sysDept := model.SysDept{ + DeptId: query.DeptId, + ParentId: query.ParentId, + DeptName: query.DeptName, + StatusFlag: query.Status, } - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "") - data := s.sysDeptService.SelectDeptList(SysDeptController, dataScopeSQL) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_dept", "") + data := s.sysDeptService.Find(sysDept, dataScopeSQL) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysDept) { @@ -84,137 +80,145 @@ func (s *SysDeptController) List(c *gin.Context) { } converI18n(language, &data) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } -// 部门信息 +// Info 部门信息 // // GET /:deptId -func (s *SysDeptController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - deptId := c.Param("deptId") - if deptId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +func (s SysDeptController) Info(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + deptId := parse.Number(c.Param("deptId")) + if deptId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: deptId is empty")) return } - data := s.sysDeptService.SelectDeptById(deptId) - if data.DeptID == deptId { + data := s.sysDeptService.FindById(deptId) + if data.DeptId == deptId { // 处理多语言 data.DeptName = i18n.TKey(language, data.DeptName) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 部门新增 +// Add 部门新增 // // POST / -func (s *SysDeptController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s SysDeptController) Add(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.SysDept - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.DeptID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.DeptId > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: deptId not is empty")) return } // 父级ID不为0是要检查 - if body.ParentID != "0" { - deptParent := s.sysDeptService.SelectDeptById(body.ParentID) - if deptParent.DeptID != body.ParentID { - // 没有可访问部门数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "dept.noData"))) + if body.ParentId > 0 { + deptParent := s.sysDeptService.FindById(body.ParentId) + if deptParent.DeptId != body.ParentId { + c.JSON(200, resp.ErrMsg("没有权限访问部门数据!")) return } - if deptParent.Status == common.STATUS_NO { - // 上级部门【%s】停用,不允许新增 + if deptParent.StatusFlag == constants.STATUS_NO { + // msg := fmt.Sprintf("上级部门【%s】停用,不允许新增", deptParent.DeptName) msg := i18n.TTemplate(language, "dept.errParentStatus", map[string]any{"name": deptParent.DeptName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - if deptParent.DelFlag == common.STATUS_YES { - // 上级部门【%s】已删除,不允许新增 + if deptParent.DelFlag == constants.STATUS_YES { + // msg := fmt.Sprintf("上级部门【%s】已删除,不允许新增", deptParent.DeptName) msg := i18n.TTemplate(language, "dept.errParentDelFlag", map[string]any{"name": deptParent.DeptName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - body.Ancestors = deptParent.Ancestors + "," + body.ParentID + body.Ancestors = fmt.Sprintf("%s,%d", deptParent.Ancestors, body.ParentId) } else { body.Ancestors = "0" } // 检查同级下名称唯一 - uniqueDeptName := s.sysDeptService.CheckUniqueDeptName(body.DeptName, body.ParentID, "") - if !uniqueDeptName { - // 部门新增【%s】失败,部门名称已存在 + uniqueName := s.sysDeptService.CheckUniqueParentIdByDeptName(body.ParentId, body.DeptName, 0) + if !uniqueName { + // msg := fmt.Sprintf("部门新增【%s】失败,部门名称已存在", body.DeptName) msg := i18n.TTemplate(language, "dept.errNameExists", map[string]any{"name": body.DeptName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - body.CreateBy = ctx.LoginUserToUserName(c) - insertId := s.sysDeptService.InsertDept(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + body.CreateBy = reqctx.LoginUserToUserName(c) + insertId := s.sysDeptService.Insert(body) + if insertId > 0 { + c.JSON(200, resp.OkData(insertId)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 部门修改 +// Edit 部门修改 // // PUT / -func (s *SysDeptController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s SysDeptController) Edit(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.SysDept - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.DeptID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.DeptId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: deptId is empty")) return } // 上级部门不能选自己 - if body.DeptID == body.ParentID { - // 部门修改【%s】失败,上级部门不能是自己 + if body.DeptId == body.ParentId { + // msg := fmt.Sprintf("部门修改【%s】失败,上级部门不能是自己", body.DeptName) msg := i18n.TTemplate(language, "dept.errParentID", map[string]any{"name": body.DeptName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查数据是否存在 - deptInfo := s.sysDeptService.SelectDeptById(body.DeptID) - if deptInfo.DeptID != body.DeptID { - // 没有可访问部门数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "dept.noData"))) + deptInfo := s.sysDeptService.FindById(body.DeptId) + if deptInfo.DeptId != body.DeptId { + // c.JSON(200, resp.ErrMsg("没有权限访问部门数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "dept.noData"))) return } + // 父级ID不为0是要检查 - if body.ParentID != "0" { - deptParent := s.sysDeptService.SelectDeptById(body.ParentID) - if deptParent.DeptID != body.ParentID { - // 没有可访问部门数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "dept.noData"))) + if body.ParentId > 0 { + deptParent := s.sysDeptService.FindById(body.ParentId) + if deptParent.DeptId != body.ParentId { + // c.JSON(200, resp.ErrMsg("没有权限访问部门数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "dept.noData"))) return } } // 检查同级下名称唯一 - uniqueDeptName := s.sysDeptService.CheckUniqueDeptName(body.DeptName, body.ParentID, body.DeptID) + uniqueDeptName := s.sysDeptService.CheckUniqueParentIdByDeptName(body.ParentId, body.DeptName, body.DeptId) if !uniqueDeptName { - // 部门修改【%s】失败,部门名称已存在 + // msg := fmt.Sprintf("部门修改【%s】失败,部门名称已存在", body.DeptName) msg := i18n.TTemplate(language, "dept.errNameExists", map[string]any{"name": body.DeptName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 上级停用需要检查下级是否有在使用 - if body.Status == common.STATUS_NO { - hasChild := s.sysDeptService.HasChildByDeptId(body.DeptID) + if body.StatusFlag == constants.STATUS_NO { + hasChild := s.sysDeptService.ExistChildrenByDeptId(body.DeptId) if hasChild > 0 { - // 该部门包含未停用的子部门数量:%d + // msg := fmt.Sprintf("该部门包含未停用的子部门数量:%d", hasChild) msg := i18n.TTemplate(language, "dept.errHasChildUse", map[string]any{"num": hasChild}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } @@ -222,128 +226,124 @@ func (s *SysDeptController) Edit(c *gin.Context) { // 多语言非原始值 i18nValue := i18n.TKey(language, deptInfo.DeptName) if i18nValue != deptInfo.DeptName { - i18n.UpdateKeyValue(language, deptInfo.DeptName, body.DeptName) + service.NewSysI18n.UpdateKeyValue(language, deptInfo.DeptName, body.DeptName) body.DeptName = deptInfo.DeptName } - body.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysDeptService.UpdateDept(body) + deptInfo.DeptName = body.DeptName + deptInfo.ParentId = body.ParentId + deptInfo.DeptSort = body.DeptSort + deptInfo.Leader = body.Leader + deptInfo.Phone = body.Phone + deptInfo.Email = body.Email + deptInfo.StatusFlag = body.StatusFlag + deptInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysDeptService.Update(deptInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 部门删除 +// Remove 部门删除 // // DELETE /:deptId -func (s *SysDeptController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - deptId := c.Param("deptId") - if deptId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +func (s SysDeptController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + deptId := parse.Number(c.Param("deptId")) + if deptId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: deptId is empty")) return } // 检查数据是否存在 - dept := s.sysDeptService.SelectDeptById(deptId) - if dept.DeptID != deptId { - // 没有可访问部门数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "dept.noData"))) + dept := s.sysDeptService.FindById(deptId) + if dept.DeptId != deptId { + // c.JSON(200, resp.ErrMsg("没有权限访问部门数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "dept.noData"))) return } // 检查是否存在子部门 - hasChild := s.sysDeptService.HasChildByDeptId(deptId) + hasChild := s.sysDeptService.ExistChildrenByDeptId(deptId) if hasChild > 0 { - // 不允许删除,存在子部门数:%d + // msg := fmt.Sprintf("不允许删除,存在子部门数:%d", hasChild) msg := i18n.TTemplate(language, "dept.errHasChildUse", map[string]any{"num": hasChild}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查是否分配给用户 - existUser := s.sysDeptService.CheckDeptExistUser(deptId) + existUser := s.sysDeptService.ExistUserByDeptId(deptId) if existUser > 0 { - // 不允许删除,部门已分配给用户数:%d + // msg := fmt.Sprintf("不允许删除,部门已分配给用户数:%d", existUser) msg := i18n.TTemplate(language, "dept.errHasUserUse", map[string]any{"num": existUser}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - rows := s.sysDeptService.DeleteDeptById(deptId) + rows := s.sysDeptService.DeleteById(deptId) if rows > 0 { - // 删除成功:%d + // msg := fmt.Sprintf("删除成功:%d", rows) msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 部门列表(排除节点) // // GET /list/exclude/:deptId func (s *SysDeptController) ExcludeChild(c *gin.Context) { - language := ctx.AcceptLanguage(c) - deptId := c.Param("deptId") - if deptId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + deptIdStr := c.Param("deptId") + if deptIdStr == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: deptId is empty")) return } - - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "") - data := s.sysDeptService.SelectDeptList(model.SysDept{}, dataScopeSQL) + deptId := parse.Number(deptIdStr) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_dept", "") + data := s.sysDeptService.Find(model.SysDept{}, dataScopeSQL) // 过滤排除节点 filtered := make([]model.SysDept, 0) for _, dept := range data { - hasAncestor := false - ancestorList := strings.Split(dept.Ancestors, ",") - for _, ancestor := range ancestorList { - if ancestor == deptId { - hasAncestor = true - break - } + if dept.DeptId == deptId { + continue } - if !(dept.DeptID == deptId || hasAncestor) { - dept.DeptName = i18n.TKey(language, dept.DeptName) + // 如果当前部门的ancestors不包含要排除的deptId,则添加到filtered中 + if !strings.Contains(dept.Ancestors, deptIdStr) { filtered = append(filtered, dept) } } - c.JSON(200, result.OkData(filtered)) + c.JSON(200, resp.OkData(filtered)) } // 部门树结构列表 // -// GET /treeSelect -func (s *SysDeptController) TreeSelect(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var querys struct { - // 部门ID - DeptID string `json:"deptId"` - // 父部门ID - ParentID string `json:"parentId" ` - // 部门名称 - DeptName string `json:"deptName" ` - // 部门状态(0正常 1停用) - Status string `json:"status"` +// GET /tree +func (s *SysDeptController) Tree(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var query struct { + DeptId int64 `form:"deptId"` // 部门ID + ParentId int64 `form:"parentId"` // 父部门ID + DeptName string `form:"deptName"` // 部门名称 + StatusFlag string `form:"statusFlag"` // 部门状态(0正常 1停用) } - err := c.ShouldBindQuery(&querys) - if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - - SysDeptController := model.SysDept{ - DeptID: querys.DeptID, - ParentID: querys.ParentID, - DeptName: querys.DeptName, - Status: querys.Status, + sysDept := model.SysDept{ + DeptId: query.DeptId, + ParentId: query.ParentId, + DeptName: query.DeptName, + StatusFlag: query.StatusFlag, } - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "") - deptTreeSelect := s.sysDeptService.SelectDeptTreeSelect(SysDeptController, dataScopeSQL) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_dept", "") + data := s.sysDeptService.BuildTreeSelect(sysDept, dataScopeSQL) // 闭包函数处理多语言 var converI18n func(language string, arr *[]vo.TreeSelect) @@ -355,25 +355,25 @@ func (s *SysDeptController) TreeSelect(c *gin.Context) { } } } - converI18n(language, &deptTreeSelect) + converI18n(language, &data) - c.JSON(200, result.OkData(deptTreeSelect)) + c.JSON(200, resp.OkData(data)) } // 部门树结构列表(指定角色) // -// GET /roleDeptTreeSelect/:roleId -func (s *SysDeptController) RoleDeptTreeSelect(c *gin.Context) { - language := ctx.AcceptLanguage(c) - roleId := c.Param("roleId") - if roleId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// GET /tree/role/:roleId +func (s *SysDeptController) TreeRole(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + roleId := parse.Number(c.Param("roleId")) + if roleId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: roleId is empty")) return } - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "") - deptTreeSelect := s.sysDeptService.SelectDeptTreeSelect(model.SysDept{}, dataScopeSQL) - checkedKeys := s.sysDeptService.SelectDeptListByRoleId(roleId) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_dept", "") + deptTreeSelect := s.sysDeptService.BuildTreeSelect(model.SysDept{}, dataScopeSQL) + checkedKeys := s.sysDeptService.FindDeptIdsByRoleId(roleId) // 闭包函数处理多语言 var converI18n func(language string, arr *[]vo.TreeSelect) @@ -387,7 +387,7 @@ func (s *SysDeptController) RoleDeptTreeSelect(c *gin.Context) { } converI18n(language, &deptTreeSelect) - c.JSON(200, result.OkData(map[string]any{ + c.JSON(200, resp.OkData(map[string]any{ "depts": deptTreeSelect, "checkedKeys": checkedKeys, })) diff --git a/src/modules/system/controller/sys_dict_data.go b/src/modules/system/controller/sys_dict_data.go index 0a8cb6d4..0fc194dd 100644 --- a/src/modules/system/controller/sys_dict_data.go +++ b/src/modules/system/controller/sys_dict_data.go @@ -7,15 +7,14 @@ import ( "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "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/framework/vo/result" "be.ems/src/modules/system/model" "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SysDictDataController 结构体 @@ -48,15 +47,14 @@ type SysDictDataController struct { // @Description Dictionary Data List // @Router /system/dict/data/list [get] func (s *SysDictDataController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - querys := ctx.QueryMap(c) + language := reqctx.AcceptLanguage(c) + query := reqctx.QueryMap(c) // 多语言值转key查询 - if v, ok := querys["dictLabel"]; ok && v != "" { - querys["dictLabel"] = i18n.TFindKeyPrefix(language, "dictData", v.(string)) + if v, ok := query["dataLabel"]; ok && v != "" { + query["dataLabel"] = i18n.TFindKeyPrefix(language, "dictData", v) } - data := s.sysDictDataService.SelectDictDataPage(querys) - rows := data["rows"].([]model.SysDictData) + rows, total := s.sysDictDataService.FindByPage(query) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysDictData) { @@ -64,208 +62,234 @@ func (s *SysDictDataController) List(c *gin.Context) { if strings.Contains((*arr)[i].DictType, "i18n") { continue } - (*arr)[i].DictLabel = i18n.TKey(language, (*arr)[i].DictLabel) + (*arr)[i].DataLabel = i18n.TKey(language, (*arr)[i].DataLabel) (*arr)[i].Remark = i18n.TKey(language, (*arr)[i].Remark) } } converI18n(language, &rows) - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } -// 字典数据详情 +// Info 字典数据详情 // -// GET /:dictCode -func (s *SysDictDataController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - dictCode := c.Param("dictCode") - if dictCode == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// GET /:dataId +func (s SysDictDataController) Info(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + dataId := parse.Number(c.Param("dataId")) + if dataId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: deptId is empty")) return } - data := s.sysDictDataService.SelectDictDataByCode(dictCode) - if data.DictCode == dictCode { + data := s.sysDictDataService.FindById(dataId) + if data.DataId == dataId { // 处理多语言 if !strings.Contains(data.DictType, "i18n") { - data.DictLabel = i18n.TKey(language, data.DictLabel) + data.DataLabel = i18n.TKey(language, data.DataLabel) data.Remark = i18n.TKey(language, data.Remark) } - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 字典数据新增 +// Add 字典数据新增 // // POST / -func (s *SysDictDataController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s SysDictDataController) Add(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.SysDictData - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.DictCode != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.DataId > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: dataId not is empty")) return } // 检查字典类型是否存在 - sysDictType := s.sysDictTypeService.SelectDictTypeByType(body.DictType) - if sysDictType.DictType != body.DictType { - // 没有可访问字典类型数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "dictType.noData"))) + dictType := s.sysDictTypeService.FindByType(body.DictType) + if dictType.DictType != body.DictType { + // c.JSON(200, resp.ErrMsg("没有权限访问字典类型数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "dictType.noData"))) return } // 检查字典标签唯一 - uniqueDictLabel := s.sysDictDataService.CheckUniqueDictLabel(body.DictType, body.DictLabel, "") - if !uniqueDictLabel { - // 数据新增【%s】失败,该字典类型下标签名已存在 - msg := i18n.TTemplate(language, "dictType.errLabelExists", map[string]any{"name": body.DictLabel}) - c.JSON(200, result.ErrMsg(msg)) + uniqueLabel := s.sysDictDataService.CheckUniqueTypeByLabel(body.DictType, body.DataLabel, 0) + if !uniqueLabel { + // msg := fmt.Sprintf("数据新增【%s】失败,该字典类型下标签名已存在", body.DataLabel) + msg := i18n.TTemplate(language, "dictType.errLabelExists", map[string]any{"name": body.DataLabel}) + c.JSON(200, resp.ErrMsg(msg)) return } - body.CreateBy = ctx.LoginUserToUserName(c) - insertId := s.sysDictDataService.InsertDictData(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + // 检查字典键值唯一 + uniqueValue := s.sysDictDataService.CheckUniqueTypeByValue(body.DictType, body.DataValue, 0) + if !uniqueValue { + // msg := fmt.Sprintf("数据新增【%s】失败,该字典类型下标签值已存在", body.DataValue) + msg := i18n.TTemplate(language, "dictType.errLabelExists", map[string]any{"name": body.DataLabel}) + c.JSON(200, resp.ErrMsg(msg)) return } - c.JSON(200, result.Err(nil)) + + body.CreateBy = reqctx.LoginUserToUserName(c) + insertId := s.sysDictDataService.Insert(body) + if insertId > 0 { + c.JSON(200, resp.OkData(insertId)) + return + } + c.JSON(200, resp.Err(nil)) } -// 字典类型修改 +// Edit 字典类型修改 // // PUT / -func (s *SysDictDataController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s SysDictDataController) Edit(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body model.SysDictData - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.DictCode == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.DataId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: dataId is empty")) return } // 检查字典类型是否存在 - sysDictType := s.sysDictTypeService.SelectDictTypeByType(body.DictType) - if sysDictType.DictType != body.DictType { - // 没有可访问字典类型数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "dictType.noData"))) + dictType := s.sysDictTypeService.FindByType(body.DictType) + if dictType.DictType != body.DictType { + // c.JSON(200, resp.ErrMsg("没有权限访问字典类型数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "dictType.noData"))) return } // 检查字典编码是否存在 - sysDictData := s.sysDictDataService.SelectDictDataByCode(body.DictCode) - if sysDictData.DictCode != body.DictCode { - // 没有可访问字典编码数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "dictData.noData"))) + dictData := s.sysDictDataService.FindById(body.DataId) + if dictData.DataId != body.DataId { + // c.JSON(200, resp.ErrMsg("没有权限访问字典编码数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "dictData.noData"))) return } // 检查字典标签唯一 - uniqueDictLabel := s.sysDictDataService.CheckUniqueDictLabel(body.DictType, body.DictLabel, body.DictCode) - if !uniqueDictLabel { - // 数据修改【%s】失败,该字典类型下标签名已存在 - msg := i18n.TTemplate(language, "dictType.errLabelExists", map[string]any{"name": body.DictLabel}) - c.JSON(200, result.ErrMsg(msg)) + uniqueLabel := s.sysDictDataService.CheckUniqueTypeByLabel(body.DictType, body.DataLabel, body.DataId) + if !uniqueLabel { + // msg := fmt.Sprintf("数据修改【%s】失败,该字典类型下标签名已存在", body.DataLabel) + msg := i18n.TTemplate(language, "dictType.errLabelExists", map[string]any{"name": body.DataLabel}) + c.JSON(200, resp.ErrMsg(msg)) + return + } + + // 检查字典键值唯一 + uniqueValue := s.sysDictDataService.CheckUniqueTypeByValue(body.DictType, body.DataValue, body.DataId) + if !uniqueValue { + // msg := fmt.Sprintf("数据修改【%s】失败,该字典类型下标签值已存在", body.DataLabel) + msg := i18n.TTemplate(language, "dictType.errLabelExists", map[string]any{"name": body.DataLabel}) + c.JSON(200, resp.ErrMsg(msg)) return } // 多语言非原始值 - i18nValue := i18n.TKey(language, sysDictData.DictLabel) - if i18nValue != sysDictData.DictLabel { - i18n.UpdateKeyValue(language, sysDictData.DictLabel, body.DictLabel) - body.DictLabel = sysDictData.DictLabel + i18nValue := i18n.TKey(language, dictData.DataLabel) + if i18nValue != dictData.DataLabel { + service.NewSysI18n.UpdateKeyValue(language, dictData.DataLabel, body.DataLabel) + body.DataLabel = dictData.DataLabel } // 多语言非原始值 - i18nValue2 := i18n.TKey(language, sysDictData.Remark) - if i18nValue2 != sysDictData.Remark { - i18n.UpdateKeyValue(language, sysDictData.Remark, body.Remark) - body.Remark = sysDictData.Remark + i18nValue2 := i18n.TKey(language, dictData.Remark) + if i18nValue2 != dictData.Remark { + service.NewSysI18n.UpdateKeyValue(language, dictData.Remark, body.Remark) + body.Remark = dictData.Remark } - body.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysDictDataService.UpdateDictData(body) + dictData.DictType = body.DictType + dictData.DataLabel = body.DataLabel + dictData.DataValue = body.DataValue + dictData.DataSort = body.DataSort + dictData.TagClass = body.TagClass + dictData.TagType = body.TagType + dictData.StatusFlag = body.StatusFlag + dictData.Remark = body.Remark + dictData.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysDictDataService.Update(dictData) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 字典数据删除 +// Remove 字典数据删除 // -// DELETE /:dictCodes -func (s *SysDictDataController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - dictCodes := c.Param("dictCodes") - if dictCodes == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// DELETE /:dataId +func (s SysDictDataController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + dataId := c.Param("dataId") + if dataId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: dataId is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(dictCodes, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(dataId, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.sysDictDataService.DeleteDictDataByCodes(uniqueIDs) + + rows, err := s.sysDictDataService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - // 删除成功:%d + // msg := fmt.Sprintf("删除成功:%d", rows) msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } -// 字典数据列表(指定字典类型) +// DictType 字典数据列表(指定字典类型) // // GET /type/:dictType -func (s *SysDictDataController) DictType(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s SysDictDataController) DictType(c *gin.Context) { + language := reqctx.AcceptLanguage(c) dictType := c.Param("dictType") if dictType == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(40010, "bind err: dictType is empty")) return } - data := s.sysDictDataService.SelectDictDataByType(dictType) + data := s.sysDictDataService.FindByType(dictType) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysDictData) { for i := range *arr { - (*arr)[i].DictLabel = i18n.TKey(language, (*arr)[i].DictLabel) + (*arr)[i].DataLabel = i18n.TKey(language, (*arr)[i].DataLabel) (*arr)[i].Remark = i18n.TKey(language, (*arr)[i].Remark) } } converI18n(language, &data) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } -// 字典数据列表导出 +// Export 字典数据列表导出 // -// POST /export -func (s *SysDictDataController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// GET /export +func (s SysDictDataController) Export(c *gin.Context) { + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - data := s.sysDictDataService.SelectDictDataPage(querys) - if parse.Number(data["total"]) == 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) - return - } - rows := data["rows"].([]model.SysDictData) - - // rows := s.sysDictDataService.SelectDictDataList(model.SysDictData{}) - if len(rows) <= 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + query := reqctx.QueryMap(c) + rows, total := s.sysDictDataService.FindByPage(query) + if total == 0 { + // c.JSON(200, resp.CodeMsg(40016, "export data record as empty")) + c.JSON(200, resp.CodeMsg(40016, i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -275,7 +299,7 @@ func (s *SysDictDataController) Export(c *gin.Context) { if strings.Contains((*arr)[i].DictType, "i18n") { continue } - (*arr)[i].DictLabel = i18n.TKey(language, (*arr)[i].DictLabel) + (*arr)[i].DataLabel = i18n.TKey(language, (*arr)[i].DataLabel) (*arr)[i].Remark = i18n.TKey(language, (*arr)[i].Remark) } } @@ -296,14 +320,14 @@ func (s *SysDictDataController) Export(c *gin.Context) { for i, row := range rows { idx := strconv.Itoa(i + 2) statusValue := i18n.TKey(language, "dictData.disable") - if row.Status == "1" { + if row.StatusFlag == "1" { statusValue = i18n.TKey(language, "dictData.normal") } dataCells = append(dataCells, map[string]any{ - "A" + idx: row.DictCode, - "B" + idx: row.DictLabel, - "C" + idx: row.DictValue, - "D" + idx: row.DictSort, + "A" + idx: row.DataId, + "B" + idx: row.DataLabel, + "C" + idx: row.DataValue, + "D" + idx: row.DataSort, "E" + idx: statusValue, }) } @@ -311,7 +335,7 @@ func (s *SysDictDataController) Export(c *gin.Context) { // 导出数据表格 saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/system/controller/sys_dict_type.go b/src/modules/system/controller/sys_dict_type.go index 5d0158a4..7494653c 100644 --- a/src/modules/system/controller/sys_dict_type.go +++ b/src/modules/system/controller/sys_dict_type.go @@ -3,20 +3,17 @@ package controller import ( "fmt" "strconv" - "strings" "time" - "be.ems/src/framework/constants/common" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "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/framework/vo/result" "be.ems/src/modules/system/model" "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SysDictTypeController 结构体 @@ -47,15 +44,15 @@ type SysDictTypeController struct { // @Description Dictionary Type List // @Router /system/dict/type/list [get] func (s *SysDictTypeController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - querys := ctx.QueryMap(c) + language := reqctx.AcceptLanguage(c) + query := reqctx.QueryMap(c) + // 多语言值转key查询 - if v, ok := querys["dictName"]; ok && v != "" { - querys["dictName"] = i18n.TFindKeyPrefix(language, "dictType", v.(string)) + if v, ok := query["dictName"]; ok && v != "" { + query["dictName"] = i18n.TFindKeyPrefix(language, "dictType", v) } - data := s.sysDictTypeService.SelectDictTypePage(querys) - rows := data["rows"].([]model.SysDictType) + rows, total := s.sysDictTypeService.FindByPage(query) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysDictType) { @@ -66,210 +63,213 @@ func (s *SysDictTypeController) List(c *gin.Context) { } converI18n(language, &rows) - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 字典类型信息 // // GET /:dictId func (s *SysDictTypeController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - dictId := c.Param("dictId") - if dictId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + dictId := parse.Number(c.Param("dictId")) + if dictId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: dictId is empty")) return } - data := s.sysDictTypeService.SelectDictTypeByID(dictId) - if data.DictID == dictId { + data := s.sysDictTypeService.FindById(dictId) + if data.DictId == dictId { // 处理多语言 data.DictName = i18n.TKey(language, data.DictName) data.Remark = i18n.TKey(language, data.Remark) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 字典类型新增 // // POST / func (s *SysDictTypeController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysDictType - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.DictID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.DictId > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: dictId not is empty")) return } // 检查字典名称唯一 - uniqueDictName := s.sysDictTypeService.CheckUniqueDictName(body.DictName, "") - if !uniqueDictName { - // 字典新增【%s】失败,字典名称已存在 + uniqueName := s.sysDictTypeService.CheckUniqueByName(body.DictName, 0) + if !uniqueName { + // msg := fmt.Sprintf("字典新增【%s】失败,字典名称已存在", body.DictName) msg := i18n.TTemplate(language, "dictType.errNameExists", map[string]any{"name": body.DictName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查字典类型唯一 - uniqueDictType := s.sysDictTypeService.CheckUniqueDictType(body.DictType, "") - if !uniqueDictType { - // 字典新增【%s】失败,字典类型已存在 + uniqueType := s.sysDictTypeService.CheckUniqueByType(body.DictType, 0) + if !uniqueType { + // msg := fmt.Sprintf("字典新增【%s】失败,字典类型已存在", body.DictName) msg := i18n.TTemplate(language, "dictType.errTypeExists", map[string]any{"name": body.DictName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - body.CreateBy = ctx.LoginUserToUserName(c) - insertId := s.sysDictTypeService.InsertDictType(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + body.CreateBy = reqctx.LoginUserToUserName(c) + insertId := s.sysDictTypeService.Insert(body) + if insertId > 0 { + c.JSON(200, resp.OkData(insertId)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 字典类型修改 // // PUT / func (s *SysDictTypeController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysDictType - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.DictID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.DictId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: dictId is empty")) return } // 检查数据是否存在 - dictInfo := s.sysDictTypeService.SelectDictTypeByID(body.DictID) - if dictInfo.DictID != body.DictID { - // 没有可访问字典类型数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "dictType.noData"))) + dictTypeInfo := s.sysDictTypeService.FindById(body.DictId) + if dictTypeInfo.DictId != body.DictId { + // c.JSON(200, resp.ErrMsg("没有权限访问字典类型数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "dictType.noData"))) return } // 检查字典名称唯一 - uniqueDictName := s.sysDictTypeService.CheckUniqueDictName(body.DictName, body.DictID) - if !uniqueDictName { - // 字典修改【%s】失败,字典名称已存在 + uniqueName := s.sysDictTypeService.CheckUniqueByName(body.DictName, body.DictId) + if !uniqueName { + // msg := fmt.Sprintf("字典修改【%s】失败,字典名称已存在", body.DictName) msg := i18n.TTemplate(language, "dictType.errNameExists", map[string]any{"name": body.DictName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查字典类型唯一 - uniqueDictType := s.sysDictTypeService.CheckUniqueDictType(body.DictType, body.DictID) - if !uniqueDictType { - // 字典修改【%s】失败,字典类型已存在 + uniqueType := s.sysDictTypeService.CheckUniqueByType(body.DictType, body.DictId) + if !uniqueType { + // msg := fmt.Sprintf("字典修改【%s】失败,字典类型已存在", body.DictName) msg := i18n.TTemplate(language, "dictType.errTypeExists", map[string]any{"name": body.DictName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 多语言非原始值 - i18nValue := i18n.TKey(language, dictInfo.DictName) - if i18nValue != dictInfo.DictName { - i18n.UpdateKeyValue(language, dictInfo.DictName, body.DictName) - body.DictName = dictInfo.DictName + i18nValue := i18n.TKey(language, dictTypeInfo.DictName) + if i18nValue != dictTypeInfo.DictName { + service.NewSysI18n.UpdateKeyValue(language, dictTypeInfo.DictName, body.DictName) + body.DictName = dictTypeInfo.DictName } // 多语言非原始值 - i18nValue2 := i18n.TKey(language, dictInfo.Remark) - if i18nValue2 != dictInfo.Remark { - i18n.UpdateKeyValue(language, dictInfo.Remark, body.Remark) - body.Remark = dictInfo.Remark + i18nValue2 := i18n.TKey(language, dictTypeInfo.Remark) + if i18nValue2 != dictTypeInfo.Remark { + service.NewSysI18n.UpdateKeyValue(language, dictTypeInfo.Remark, body.Remark) + body.Remark = dictTypeInfo.Remark } - body.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysDictTypeService.UpdateDictType(body) + dictTypeInfo.DictName = body.DictName + dictTypeInfo.DictType = body.DictType + dictTypeInfo.StatusFlag = body.StatusFlag + dictTypeInfo.Remark = body.Remark + dictTypeInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysDictTypeService.Update(dictTypeInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 字典类型删除 +// Remove 字典类型删除 // -// DELETE /:dictIds -func (s *SysDictTypeController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - dictIds := c.Param("dictIds") - if dictIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// DELETE /:dictId +func (s SysDictTypeController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + dictId := c.Param("dictId") + if dictId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: dictId is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(dictIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(dictId, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.sysDictTypeService.DeleteDictTypeByIDs(uniqueIDs) + + rows, err := s.sysDictTypeService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } + // msg := fmt.Sprintf("删除成功:%d", rows) msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } -// 字典类型刷新缓存 +// Refresh 字典类型刷新缓存 // -// PUT /refreshCache -func (s *SysDictTypeController) RefreshCache(c *gin.Context) { - s.sysDictTypeService.ResetDictCache() - i18n.ClearLocaleData() // 清空国际化数据 - c.JSON(200, result.Ok(nil)) +// PUT /refresh +func (s SysDictTypeController) Refresh(c *gin.Context) { + s.sysDictTypeService.CacheClean("*") + s.sysDictTypeService.CacheLoad("*") + c.JSON(200, resp.Ok(nil)) } // 字典类型选择框列表 // -// GET /getDictOptionselect -func (s *SysDictTypeController) DictOptionselect(c *gin.Context) { - data := s.sysDictTypeService.SelectDictTypeList(model.SysDictType{ - Status: common.STATUS_YES, - }) +// GET /options +func (s *SysDictTypeController) Options(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + data := s.sysDictTypeService.Find(model.SysDictType{}) type labelValue struct { Label string `json:"label"` Value string `json:"value"` } - language := ctx.AcceptLanguage(c) // 数据组 - arr := []labelValue{} + arr := make([]labelValue, 0) for _, v := range data { arr = append(arr, labelValue{ Label: i18n.TKey(language, v.DictName), Value: v.DictType, }) } - c.JSON(200, result.OkData(arr)) + c.JSON(200, resp.OkData(arr)) } -// 字典类型列表导出 +// Export 字典类型列表导出 // -// POST /export -func (s *SysDictTypeController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// GET /export +func (s SysDictTypeController) Export(c *gin.Context) { + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - data := s.sysDictTypeService.SelectDictTypePage(querys) - if parse.Number(data["total"]) == 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) - return - } - rows := data["rows"].([]model.SysDictType) - - // rows := s.sysDictTypeService.SelectDictTypeList(model.SysDictType{}) - if len(rows) <= 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + query := reqctx.QueryMap(c) + rows, total := s.sysDictTypeService.FindByPage(query) + if total == 0 { + // c.JSON(200, resp.CodeMsg(40016, "export data record as empty")) + c.JSON(200, resp.CodeMsg(40016, i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -296,11 +296,11 @@ func (s *SysDictTypeController) Export(c *gin.Context) { for i, row := range rows { idx := strconv.Itoa(i + 2) statusValue := i18n.TKey(language, "dictData.disable") - if row.Status == "1" { + if row.StatusFlag == "1" { statusValue = i18n.TKey(language, "dictData.normal") } dataCells = append(dataCells, map[string]any{ - "A" + idx: row.DictID, + "A" + idx: row.DictId, "B" + idx: row.DictName, "C" + idx: row.DictType, "D" + idx: statusValue, @@ -310,7 +310,7 @@ func (s *SysDictTypeController) Export(c *gin.Context) { // 导出数据表格 saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/system/controller/sys_log_login.go b/src/modules/system/controller/sys_log_login.go index f7b5883d..229d85ea 100644 --- a/src/modules/system/controller/sys_log_login.go +++ b/src/modules/system/controller/sys_log_login.go @@ -3,15 +3,13 @@ package controller import ( "fmt" "strconv" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" commonService "be.ems/src/modules/common/service" "be.ems/src/modules/system/model" "be.ems/src/modules/system/service" @@ -21,7 +19,7 @@ import ( // 实例化控制层 SysLogLoginController 结构体 var NewSysLogLogin = &SysLogLoginController{ - sysLogLoginService: service.NewSysLogLoginImpl, + sysLogLoginService: service.NewSysLogLogin, accountService: commonService.NewAccount, } @@ -29,8 +27,7 @@ var NewSysLogLogin = &SysLogLoginController{ // // PATH /system/log/login type SysLogLoginController struct { - // 系统登录日志服务 - sysLogLoginService service.ISysLogLogin + sysLogLoginService *service.SysLogLogin // 系统登录日志服务 accountService *commonService.Account // 账号身份操作服务 } @@ -50,13 +47,12 @@ type SysLogLoginController struct { // @Description System Login Log List // @Router /system/log/login/list [get] func (s *SysLogLoginController) List(c *gin.Context) { - querys := ctx.QueryMap(c) - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "u") - data := s.sysLogLoginService.SelectSysLogLoginPage(querys, dataScopeSQL) + query := reqctx.QueryMap(c) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_user", "sys_user") + rows, total := s.sysLogLoginService.FindByPage(query, dataScopeSQL) - rows := data["rows"].([]model.SysLogLogin) // 闭包函数处理多语言 - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) converI18n := func(language string, arr *[]model.SysLogLogin) { for i := range *arr { (*arr)[i].LoginLocation = i18n.TKey(language, (*arr)[i].LoginLocation) @@ -67,88 +63,47 @@ func (s *SysLogLoginController) List(c *gin.Context) { } converI18n(language, &rows) - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } -// 系统登录日志删除 -// -// DELETE /:loginIds -func (s *SysLogLoginController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - loginIds := c.Param("loginIds") - if loginIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - // 处理字符转id数组后去重 - ids := strings.Split(loginIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return - } - rows := s.sysLogLoginService.DeleteSysLogLoginByIds(uniqueIDs) - if rows > 0 { - msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) - return - } - c.JSON(200, result.Err(nil)) -} - -// 系统登录日志清空 +// Clean 系统登录日志清空 // // DELETE /clean -func (s *SysLogLoginController) Clean(c *gin.Context) { - err := s.sysLogLoginService.CleanSysLogLogin() - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) - return - } - c.JSON(200, result.Ok(nil)) +func (s SysLogLoginController) Clean(c *gin.Context) { + rows := s.sysLogLoginService.Clean() + c.JSON(200, resp.OkData(rows)) } -// 系统登录日志账户解锁 +// Unlock 系统登录日志账户解锁 // // PUT /unlock/:userName -func (s *SysLogLoginController) Unlock(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s SysLogLoginController) Unlock(c *gin.Context) { + language := reqctx.AcceptLanguage(c) userName := c.Param("userName") if userName == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(40010, "bind err: userName is empty")) return } - ok := s.accountService.ClearLoginRecordCache(userName) + ok := s.accountService.CleanLoginRecordCache(userName) if ok { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errUnlock"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.errUnlock"))) } -// 导出系统登录日志信息 +// Export 导出系统登录日志信息 // -// POST /export -func (s *SysLogLoginController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// GET /export +func (s SysLogLoginController) Export(c *gin.Context) { + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "u") - data := s.sysLogLoginService.SelectSysLogLoginPage(querys, dataScopeSQL) - if parse.Number(data["total"]) == 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) - return - } - rows := data["rows"].([]model.SysLogLogin) - - // rows := s.sysLogLoginService.SelectSysLogLoginList(model.SysLogLogin{}) - if len(rows) <= 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + query := reqctx.QueryMap(c) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_user", "sys_user") + rows, total := s.sysLogLoginService.FindByPage(query, dataScopeSQL) + if total == 0 { + // c.JSON(200, resp.CodeMsg(40016, "export data record as empty")) + c.JSON(200, resp.CodeMsg(40016, i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -183,13 +138,13 @@ func (s *SysLogLoginController) Export(c *gin.Context) { idx := strconv.Itoa(i + 2) // 状态 statusValue := i18n.TKey(language, "dictData.fail") - if row.Status == "1" { + if row.StatusFlag == "1" { statusValue = i18n.TKey(language, "dictData.success") } dataCells = append(dataCells, map[string]any{ - "A" + idx: row.LoginID, + "A" + idx: row.ID, "B" + idx: row.UserName, - "C" + idx: row.IPAddr, + "C" + idx: row.LoginIp, "D" + idx: row.LoginLocation, "E" + idx: row.OS, "F" + idx: row.Browser, @@ -202,7 +157,7 @@ func (s *SysLogLoginController) Export(c *gin.Context) { // 导出数据表格 saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/system/controller/sys_log_operate.go b/src/modules/system/controller/sys_log_operate.go index 962451e4..0da88284 100644 --- a/src/modules/system/controller/sys_log_operate.go +++ b/src/modules/system/controller/sys_log_operate.go @@ -3,15 +3,13 @@ package controller import ( "fmt" "strconv" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/system/model" "be.ems/src/modules/system/service" @@ -20,15 +18,14 @@ import ( // 实例化控制层 SysLogOperateController 结构体 var NewSysLogOperate = &SysLogOperateController{ - SysLogOperateService: service.NewSysLogOperateImpl, + sysLogOperateService: service.NewSysLogOperate, } // 操作日志记录信息 // // PATH /system/log/operate type SysLogOperateController struct { - // 操作日志服务 - SysLogOperateService service.ISysLogOperate + sysLogOperateService *service.SysLogOperate // 操作日志服务 } // 操作日志列表 @@ -47,90 +44,48 @@ type SysLogOperateController struct { // @Description System Operation Log List // @Router /system/log/operate/list [get] func (s *SysLogOperateController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - querys := ctx.QueryMap(c) + language := reqctx.AcceptLanguage(c) + query := reqctx.QueryMap(c) // 多语言值转key查询 - if v, ok := querys["title"]; ok && v != "" { - querys["title"] = i18n.TFindKeyPrefix(language, "log.operate.title", v.(string)) + if v, ok := query["title"]; ok && v != "" { + query["title"] = i18n.TFindKeyPrefix(language, "log.operate.title", v) } - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "u") - data := s.SysLogOperateService.SelectSysLogOperatePage(querys, dataScopeSQL) - rows := data["rows"].([]model.SysLogOperate) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_user", "sys_user") + rows, total := s.sysLogOperateService.FindByPage(query, dataScopeSQL) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysLogOperate) { for i := range *arr { (*arr)[i].Title = i18n.TKey(language, (*arr)[i].Title) - (*arr)[i].OperLocation = i18n.TKey(language, (*arr)[i].OperLocation) + (*arr)[i].OperaLocation = i18n.TKey(language, (*arr)[i].OperaLocation) } } converI18n(language, &rows) - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } -// 操作日志删除 -// -// DELETE /:operIds -func (s *SysLogOperateController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - operIds := c.Param("operIds") - if operIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - // 处理字符转id数组后去重 - ids := strings.Split(operIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return - } - rows := s.SysLogOperateService.DeleteSysLogOperateByIds(uniqueIDs) - if rows > 0 { - msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) - return - } - c.JSON(200, result.Err(nil)) -} - -// 操作日志清空 +// Clean 操作日志清空 // // DELETE /clean -func (s *SysLogOperateController) Clean(c *gin.Context) { - err := s.SysLogOperateService.CleanSysLogOperate() - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) - return - } - c.JSON(200, result.Ok(nil)) +func (s SysLogOperateController) Clean(c *gin.Context) { + rows := s.sysLogOperateService.Clean() + c.JSON(200, resp.OkData(rows)) } -// 导出操作日志 +// Export 导出操作日志 // -// POST /export -func (s *SysLogOperateController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// GET /export +func (s SysLogOperateController) Export(c *gin.Context) { + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "u") - data := s.SysLogOperateService.SelectSysLogOperatePage(querys, dataScopeSQL) - if parse.Number(data["total"]) == 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) - return - } - rows := data["rows"].([]model.SysLogOperate) - - // rows := s.SysLogOperateService.SelectSysLogOperateList(model.SysLogOperate{}) - if len(rows) <= 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + query := reqctx.QueryMap(c) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_user", "sys_user") + rows, total := s.sysLogOperateService.FindByPage(query, dataScopeSQL) + if total == 0 { + // c.JSON(200, resp.CodeMsg(40016, "export data record as empty")) + c.JSON(200, resp.CodeMsg(40016, i18n.TKey(language, "app.common.exportEmpty"))) return } @@ -138,7 +93,7 @@ func (s *SysLogOperateController) Export(c *gin.Context) { converI18n := func(language string, arr *[]model.SysLogOperate) { for i := range *arr { (*arr)[i].Title = i18n.TKey(language, (*arr)[i].Title) - (*arr)[i].OperLocation = i18n.TKey(language, (*arr)[i].OperLocation) + (*arr)[i].OperaLocation = i18n.TKey(language, (*arr)[i].OperaLocation) } } converI18n(language, &rows) @@ -195,18 +150,18 @@ func (s *SysLogOperateController) Export(c *gin.Context) { // 状态 statusValue := i18n.TKey(language, "dictData.fail") - if row.Status == "1" { + if row.StatusFlag == "1" { statusValue = i18n.TKey(language, "dictData.success") } dataCells = append(dataCells, map[string]any{ - "A" + idx: row.OperID, + "A" + idx: row.ID, "B" + idx: row.Title, "C" + idx: businessType, - "D" + idx: row.OperName, - "E" + idx: row.RequestMethod, - "F" + idx: row.OperIP, + "D" + idx: row.OperaBy, + "E" + idx: row.OperaUrlMethod, + "F" + idx: row.OperaIp, "G" + idx: statusValue, - "H" + idx: date.ParseDateToStr(row.OperTime, date.YYYY_MM_DDTHH_MM_SSZ), + "H" + idx: date.ParseDateToStr(row.OperaTime, date.YYYY_MM_DDTHH_MM_SSZ), "I" + idx: row.CostTime, }) } @@ -214,7 +169,7 @@ func (s *SysLogOperateController) Export(c *gin.Context) { // 导出数据表格 saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/system/controller/sys_menu.go b/src/modules/system/controller/sys_menu.go index 314e84c8..a641cceb 100644 --- a/src/modules/system/controller/sys_menu.go +++ b/src/modules/system/controller/sys_menu.go @@ -1,32 +1,32 @@ package controller import ( + "fmt" + "be.ems/src/framework/config" - "be.ems/src/framework/constants/common" - "be.ems/src/framework/constants/menu" + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/utils/parse" "be.ems/src/framework/utils/regular" - "be.ems/src/framework/vo" - "be.ems/src/framework/vo/result" "be.ems/src/modules/system/model" + "be.ems/src/modules/system/model/vo" "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SysMenuController 结构体 var NewSysMenu = &SysMenuController{ - sysMenuService: service.NewSysMenuImpl, + sysMenuService: service.NewSysMenu, } // 菜单信息 // // PATH /system/menu type SysMenuController struct { - // 菜单服务 - sysMenuService service.ISysMenu + sysMenuService *service.SysMenu // 菜单服务 } // 菜单列表 @@ -44,20 +44,20 @@ type SysMenuController struct { // @Description Menu Information List // @Router /system/menu/list [get] func (s *SysMenuController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) query := model.SysMenu{} - if v, ok := c.GetQuery("menuName"); ok && v != "" { + if v, ok := c.GetQuery("menuName"); ok { query.MenuName = i18n.TFindKeyPrefix(language, "menu", v) } - if v, ok := c.GetQuery("status"); ok && v != "" { - query.Status = v + if v, ok := c.GetQuery("statusFlag"); ok { + query.StatusFlag = v } - userId := ctx.LoginUserToUserID(c) - if config.IsAdmin(userId) { - userId = "*" + userId := reqctx.LoginUserToUserID(c) + if config.IsSystemUser(userId) { + userId = 0 } - data := s.sysMenuService.SelectMenuList(query, userId) + data := s.sysMenuService.Find(query, userId) // 闭包函数处理多语言 var converI18n func(language string, arr *[]model.SysMenu) @@ -72,157 +72,166 @@ func (s *SysMenuController) List(c *gin.Context) { } converI18n(language, &data) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // 菜单信息 // // GET /:menuId func (s *SysMenuController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - menuId := c.Param("menuId") - if menuId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + menuId := parse.Number(c.Param("menuId")) + if menuId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: menuId is empty")) return } - data := s.sysMenuService.SelectMenuById(menuId) - if data.MenuID == menuId { + + data := s.sysMenuService.FindById(menuId) + if data.MenuId == menuId { // 处理多语言 data.MenuName = i18n.TKey(language, data.MenuName) data.Remark = i18n.TKey(language, data.Remark) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 菜单新增 // // POST / func (s *SysMenuController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysMenu - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.MenuID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.MenuId > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: menuId not is empty")) return } // 目录和菜单检查地址唯一 - if menu.TYPE_DIR == body.MenuType || menu.TYPE_MENU == body.MenuType { - uniqueNenuPath := s.sysMenuService.CheckUniqueMenuPath(body.Path, body.ParentID, "") - if !uniqueNenuPath { - // 菜单新增【%s】失败,菜单路由地址已存在 + if constants.MENU_TYPE_DIR == body.MenuType || constants.MENU_TYPE_MENU == body.MenuType { + uniqueMenuPath := s.sysMenuService.CheckUniqueParentIdByMenuPath(body.ParentId, body.MenuPath, 0) + if !uniqueMenuPath { + // msg := fmt.Sprintf("菜单新增【%s】失败,菜单路由地址已存在", body.MenuName) msg := i18n.TTemplate(language, "menu.errPathExists", map[string]any{"name": body.MenuName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } // 检查名称唯一 - uniqueNenuName := s.sysMenuService.CheckUniqueMenuName(body.MenuName, body.ParentID, "") - if !uniqueNenuName { - // 菜单新增【%s】失败,菜单名称已存在 + uniqueMenuName := s.sysMenuService.CheckUniqueParentIdByMenuName(body.ParentId, body.MenuName, 0) + if !uniqueMenuName { + // msg := fmt.Sprintf("菜单新增【%s】失败,菜单名称已存在", body.MenuName) msg := i18n.TTemplate(language, "menu.errNameExists", map[string]any{"name": body.MenuName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 外链菜单需要符合网站http(s)开头 - if body.IsFrame == common.STATUS_NO && !regular.ValidHttp(body.Path) { - // 操作菜单【{name}】失败,非内部地址请以http(s)://开头 + if body.FrameFlag == constants.STATUS_NO && !regular.ValidHttp(body.MenuPath) { + // msg := fmt.Sprintf("菜单新增【%s】失败,非内部地址必须以http(s)://开头", body.MenuName) msg := i18n.TTemplate(language, "menu.errFramePath", map[string]any{"name": body.MenuName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - body.CreateBy = ctx.LoginUserToUserName(c) - insertId := s.sysMenuService.InsertMenu(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + body.CreateBy = reqctx.LoginUserToUserName(c) + insertId := s.sysMenuService.Insert(body) + if insertId > 0 { + c.JSON(200, resp.OkData(insertId)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 菜单修改 // // PUT / func (s *SysMenuController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysMenu - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.MenuID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.MenuId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: menuId is empty")) return } // 上级菜单不能选自己 - if body.MenuID == body.ParentID { - // 菜单修改【%s】失败,上级菜单不能选择自己 + if body.MenuId == body.ParentId { + // msg := fmt.Sprintf("菜单修改【%s】失败,上级菜单不能选择自己", body.MenuName) msg := i18n.TTemplate(language, "menu.errPathExists", map[string]any{"name": body.MenuName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查数据是否存在 - menuInfo := s.sysMenuService.SelectMenuById(body.MenuID) - if menuInfo.MenuID != body.MenuID { - // 没有可访问菜单数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "menu.noData"))) + menuInfo := s.sysMenuService.FindById(body.MenuId) + if menuInfo.MenuId != body.MenuId { + // c.JSON(200, resp.ErrMsg("没有权限访问菜单数据")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "menu.noData"))) return } // 父级ID不为0是要检查 - if body.ParentID != "0" { - menuParent := s.sysMenuService.SelectMenuById(body.ParentID) - if menuParent.MenuID != body.ParentID { - // 没有可访问菜单数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "menu.noData"))) + if body.ParentId > 0 { + menuParent := s.sysMenuService.FindById(body.ParentId) + if menuParent.MenuId != body.ParentId { + // c.JSON(200, resp.ErrMsg("没有权限访问菜单数据")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "menu.noData"))) return } // 禁用菜单时检查父菜单是否使用 - if body.Status == common.STATUS_YES && menuParent.Status == common.STATUS_NO { - // 上级菜单未启用! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "menu.errParentStatus"))) + if body.StatusFlag == constants.STATUS_YES && menuParent.StatusFlag == constants.STATUS_NO { + // c.JSON(200, resp.ErrMsg("上级菜单未启用!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "menu.errParentStatus"))) return } } // 目录和菜单检查地址唯一 - if menu.TYPE_DIR == body.MenuType || menu.TYPE_MENU == body.MenuType { - uniqueNenuPath := s.sysMenuService.CheckUniqueMenuPath(body.Path, body.ParentID, body.MenuID) - if !uniqueNenuPath { - // 菜单修改【%s】失败,菜单路由地址已存在 + if constants.MENU_TYPE_DIR == body.MenuType || constants.MENU_TYPE_MENU == body.MenuType { + uniqueMenuPath := s.sysMenuService.CheckUniqueParentIdByMenuPath(body.ParentId, body.MenuPath, body.MenuId) + if !uniqueMenuPath { + // msg := fmt.Sprintf("菜单修改【%s】失败,菜单路由地址已存在", body.MenuName) msg := i18n.TTemplate(language, "menu.errPathExists", map[string]any{"name": body.MenuName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } // 检查名称唯一 - uniqueNenuName := s.sysMenuService.CheckUniqueMenuName(body.MenuName, body.ParentID, body.MenuID) - if !uniqueNenuName { - // 菜单修改【%s】失败,菜单名称已存在 + uniqueMenuName := s.sysMenuService.CheckUniqueParentIdByMenuName(body.ParentId, body.MenuName, body.MenuId) + if !uniqueMenuName { + // msg := fmt.Sprintf("菜单修改【%s】失败,菜单名称已存在", body.MenuName) msg := i18n.TTemplate(language, "menu.errNameExists", map[string]any{"name": body.MenuName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 外链菜单需要符合网站http(s)开头 - if body.IsFrame == common.STATUS_NO && !regular.ValidHttp(body.Path) { - // 菜单修改【%s】失败,非内部地址必须以http(s)://开头 + if body.FrameFlag == constants.STATUS_NO && !regular.ValidHttp(body.MenuPath) { + // msg := fmt.Sprintf("菜单修改【%s】失败,非内部地址必须以http(s)://开头", body.MenuName) msg := i18n.TTemplate(language, "menu.errFramePath", map[string]any{"name": body.MenuName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 禁用菜单时检查子菜单是否使用 - if body.Status == common.STATUS_NO { - hasStatus := s.sysMenuService.HasChildByMenuIdAndStatus(body.MenuID, common.STATUS_YES) + if body.StatusFlag == constants.STATUS_NO { + hasStatus := s.sysMenuService.ExistChildrenByMenuIdAndStatus(body.MenuId, constants.STATUS_YES) if hasStatus > 0 { - // 操作菜单【%s】失败,存在使用子菜单数:%d + // msg := fmt.Sprintf("不允许禁用,存在使用子菜单数:%d", hasStatus) msg := i18n.TTemplate(language, "menu.errHasChildUse", map[string]any{"name": body.MenuName, "num": hasStatus}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } @@ -230,91 +239,104 @@ func (s *SysMenuController) Edit(c *gin.Context) { // 多语言非原始值 i18nValue := i18n.TKey(language, menuInfo.MenuName) if i18nValue != menuInfo.MenuName { - i18n.UpdateKeyValue(language, menuInfo.MenuName, body.MenuName) + service.NewSysI18n.UpdateKeyValue(language, menuInfo.MenuName, body.MenuName) body.MenuName = menuInfo.MenuName } // 多语言非原始值 i18nValue2 := i18n.TKey(language, menuInfo.Remark) if i18nValue2 != menuInfo.Remark { - i18n.UpdateKeyValue(language, menuInfo.Remark, body.Remark) + service.NewSysI18n.UpdateKeyValue(language, menuInfo.Remark, body.Remark) body.Remark = menuInfo.Remark } - body.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysMenuService.UpdateMenu(body) + menuInfo.ParentId = body.ParentId + menuInfo.MenuName = body.MenuName + menuInfo.MenuType = body.MenuType + menuInfo.MenuSort = body.MenuSort + menuInfo.MenuPath = body.MenuPath + menuInfo.Component = body.Component + menuInfo.FrameFlag = body.FrameFlag + menuInfo.CacheFlag = body.CacheFlag + menuInfo.VisibleFlag = body.VisibleFlag + menuInfo.StatusFlag = body.StatusFlag + menuInfo.Perms = body.Perms + menuInfo.Icon = body.Icon + menuInfo.Remark = body.Remark + menuInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysMenuService.Update(menuInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 菜单删除 +// Remove 菜单删除 // // DELETE /:menuId -func (s *SysMenuController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - menuId := c.Param("menuId") - if menuId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +func (s SysMenuController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + menuId := parse.Number(c.Param("menuId")) + if menuId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: menuId is empty")) return } // 检查数据是否存在 - menu := s.sysMenuService.SelectMenuById(menuId) - if menu.MenuID != menuId { - // 没有可访问菜单数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "menu.noData"))) + menu := s.sysMenuService.FindById(menuId) + if menu.MenuId != menuId { + // c.JSON(200, resp.ErrMsg("没有权限访问菜单数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "menu.noData"))) return } // 检查是否存在子菜单 - hasChild := s.sysMenuService.HasChildByMenuIdAndStatus(menuId, "") + hasChild := s.sysMenuService.ExistChildrenByMenuIdAndStatus(menuId, "") if hasChild > 0 { - // 不允许删除,存在子菜单数:%d + // msg := fmt.Sprintf("不允许删除,存在子菜单数:%d", hasChild) msg := i18n.TTemplate(language, "menu.errHasChildUse", map[string]any{"name": menu.MenuName, "num": hasChild}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查是否分配给角色 - existRole := s.sysMenuService.CheckMenuExistRole(menuId) + existRole := s.sysMenuService.ExistRoleByMenuId(menuId) if existRole > 0 { - // 不允许删除,菜单已分配给角色数:%d + // msg := fmt.Sprintf("不允许删除,菜单已分配给角色数:%d", existRole) msg := i18n.TTemplate(language, "menu.errHasRoleUse", map[string]any{"name": menu.MenuName, "num": existRole}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - rows := s.sysMenuService.DeleteMenuById(menuId) + rows := s.sysMenuService.DeleteById(menuId) if rows > 0 { + // msg := fmt.Sprintf("删除成功:%d", rows) msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 菜单树结构列表 // -// GET /treeSelect -func (s *SysMenuController) TreeSelect(c *gin.Context) { +// GET /tree +func (s *SysMenuController) Tree(c *gin.Context) { query := model.SysMenu{} - if v, ok := c.GetQuery("menuName"); ok && v != "" { + if v, ok := c.GetQuery("menuName"); ok { query.MenuName = v } - if v, ok := c.GetQuery("status"); ok && v != "" { - query.Status = v + if v, ok := c.GetQuery("statusFlag"); ok { + query.StatusFlag = v } - - userId := ctx.LoginUserToUserID(c) - if config.IsAdmin(userId) { - userId = "*" + userId := reqctx.LoginUserToUserID(c) + if config.IsSystemUser(userId) { + userId = 0 } - data := s.sysMenuService.SelectMenuTreeSelectByUserId(query, userId) + trees := s.sysMenuService.BuildTreeSelectByUserId(query, userId) // 闭包函数处理多语言 - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var converI18n func(language string, arr *[]vo.TreeSelect) converI18n = func(language string, arr *[]vo.TreeSelect) { for i := range *arr { @@ -324,37 +346,37 @@ func (s *SysMenuController) TreeSelect(c *gin.Context) { } } } - converI18n(language, &data) + converI18n(language, &trees) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(trees)) } // 菜单树结构列表(指定角色) // -// GET /roleMenuTreeSelect/:roleId -func (s *SysMenuController) RoleMenuTreeSelect(c *gin.Context) { - language := ctx.AcceptLanguage(c) - roleId := c.Param("roleId") - if roleId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// GET /tree/role/:roleId +func (s *SysMenuController) TreeRole(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + roleId := parse.Number(c.Param("roleId")) + if roleId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: roleId is empty")) return } - query := model.SysMenu{} - if v, ok := c.GetQuery("menuName"); ok && v != "" { - query.MenuName = v + sysMenu := model.SysMenu{} + if v, ok := c.GetQuery("menuName"); ok { + sysMenu.MenuName = v } - if v, ok := c.GetQuery("status"); ok && v != "" { - query.Status = v + if v, ok := c.GetQuery("statusFlag"); ok { + sysMenu.StatusFlag = v } - userId := ctx.LoginUserToUserID(c) - if config.IsAdmin(userId) { - userId = "*" + userId := reqctx.LoginUserToUserID(c) + if config.IsSystemUser(userId) { + userId = 0 } - menuTreeSelect := s.sysMenuService.SelectMenuTreeSelectByUserId(query, userId) - checkedKeys := s.sysMenuService.SelectMenuListByRoleId(roleId) + menuTreeSelect := s.sysMenuService.BuildTreeSelectByUserId(sysMenu, userId) + checkedKeys := s.sysMenuService.FindByRoleId(roleId) // 闭包函数处理多语言 var converI18n func(language string, arr *[]vo.TreeSelect) @@ -368,7 +390,7 @@ func (s *SysMenuController) RoleMenuTreeSelect(c *gin.Context) { } converI18n(language, &menuTreeSelect) - c.JSON(200, result.OkData(map[string]any{ + c.JSON(200, resp.OkData(map[string]any{ "menus": menuTreeSelect, "checkedKeys": checkedKeys, })) diff --git a/src/modules/system/controller/sys_post.go b/src/modules/system/controller/sys_post.go index e767c315..5a41e3a8 100644 --- a/src/modules/system/controller/sys_post.go +++ b/src/modules/system/controller/sys_post.go @@ -3,33 +3,30 @@ package controller import ( "fmt" "strconv" - "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/system/model" "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SysPostController 结构体 var NewSysPost = &SysPostController{ - sysPostService: service.NewSysPostImpl, + sysPostService: service.NewSysPost, } // 岗位信息 // // PATH /system/post type SysPostController struct { - // 岗位服务 - sysPostService service.ISysPost + sysPostService *service.SysPost // 岗位服务 } // 岗位列表 @@ -48,15 +45,14 @@ type SysPostController struct { // @Description Post Information List // @Router /system/post/list [get] func (s *SysPostController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - querys := ctx.QueryMap(c) + language := reqctx.AcceptLanguage(c) + query := reqctx.QueryMap(c) // 多语言值转key查询 - if v, ok := querys["postName"]; ok && v != "" { - querys["postName"] = i18n.TFindKeyPrefix(language, "post", v.(string)) + if v, ok := query["postName"]; ok && v != "" { + query["postName"] = i18n.TFindKeyPrefix(language, "post", v) } - data := s.sysPostService.SelectPostPage(querys) - rows := data["rows"].([]model.SysPost) + rows, total := s.sysPostService.FindByPage(query) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysPost) { @@ -67,171 +63,184 @@ func (s *SysPostController) List(c *gin.Context) { } converI18n(language, &rows) - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } -// 岗位信息 +// Info 岗位信息 // // GET /:postId func (s *SysPostController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - postId := c.Param("postId") - if postId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + postId := parse.Number(c.Param("postId")) + if postId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: postId is empty")) return } - data := s.sysPostService.SelectPostById(postId) - if data.PostID == postId { + data := s.sysPostService.FindById(postId) + if data.PostId == postId { // 处理多语言 data.PostName = i18n.TKey(language, data.PostName) data.Remark = i18n.TKey(language, data.Remark) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 岗位新增 +// Add 岗位新增 // // POST / func (s *SysPostController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysPost - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.PostID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.PostId > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: postId not is empty")) return } // 检查名称唯一 - uniqueuPostName := s.sysPostService.CheckUniquePostName(body.PostName, "") - if !uniqueuPostName { - // 岗位新增【%s】失败,岗位名称已存在 + uniqueuName := s.sysPostService.CheckUniqueByName(body.PostName, 0) + if !uniqueuName { + // msg := fmt.Sprintf("岗位新增【%s】失败,岗位名称已存在", body.PostName) msg := i18n.TTemplate(language, "post.errNameExists", map[string]any{"name": body.PostName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查编码属性值唯一 - uniquePostCode := s.sysPostService.CheckUniquePostCode(body.PostCode, "") - if !uniquePostCode { - // 岗位新增【%s】失败,岗位编码已存在 + uniqueCode := s.sysPostService.CheckUniqueByCode(body.PostCode, 0) + if !uniqueCode { + // msg := fmt.Sprintf("岗位新增【%s】失败,岗位编码已存在", body.PostCode) msg := i18n.TTemplate(language, "post.errCodeExists", map[string]any{"name": body.PostCode}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - body.CreateBy = ctx.LoginUserToUserName(c) - insertId := s.sysPostService.InsertPost(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + body.CreateBy = reqctx.LoginUserToUserName(c) + insertId := s.sysPostService.Insert(body) + if insertId > 0 { + c.JSON(200, resp.OkData(insertId)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 岗位修改 // // PUT / func (s *SysPostController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysPost - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.PostID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.PostId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: postId is empty")) return } // 检查是否存在 - postInfo := s.sysPostService.SelectPostById(body.PostID) - if postInfo.PostID != body.PostID { - // 没有可访问岗位数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "post.noData"))) + postInfo := s.sysPostService.FindById(body.PostId) + if postInfo.PostId != body.PostId { + // c.JSON(200, resp.ErrMsg("没有权限访问岗位数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "post.noData"))) return } // 检查名称唯一 - uniqueuPostName := s.sysPostService.CheckUniquePostName(body.PostName, body.PostID) - if !uniqueuPostName { - // 岗位修改【%s】失败,岗位名称已存在 + uniquePostName := s.sysPostService.CheckUniqueByName(body.PostName, body.PostId) + if !uniquePostName { + // msg := fmt.Sprintf("岗位修改【%s】失败,岗位名称已存在", body.PostName) msg := i18n.TTemplate(language, "post.errNameExists", map[string]any{"name": body.PostName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查编码属性值唯一 - uniquePostCode := s.sysPostService.CheckUniquePostCode(body.PostCode, body.PostID) + uniquePostCode := s.sysPostService.CheckUniqueByCode(body.PostCode, body.PostId) if !uniquePostCode { - // 岗位修改【%s】失败,岗位编码已存在 + // msg := fmt.Sprintf("岗位修改【%s】失败,岗位编码已存在", body.PostCode) msg := i18n.TTemplate(language, "post.errCodeExists", map[string]any{"name": body.PostCode}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 多语言非原始值 i18nValue := i18n.TKey(language, postInfo.PostName) if i18nValue != postInfo.PostName { - i18n.UpdateKeyValue(language, postInfo.PostName, body.PostName) + service.NewSysI18n.UpdateKeyValue(language, postInfo.PostName, body.PostName) body.PostName = postInfo.PostName } // 多语言非原始值 i18nValue2 := i18n.TKey(language, postInfo.Remark) if i18nValue2 != postInfo.Remark { - i18n.UpdateKeyValue(language, postInfo.Remark, body.Remark) + service.NewSysI18n.UpdateKeyValue(language, postInfo.Remark, body.Remark) body.Remark = postInfo.Remark } - body.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysPostService.UpdatePost(body) + postInfo.PostCode = body.PostCode + postInfo.PostName = body.PostName + postInfo.PostSort = body.PostSort + postInfo.StatusFlag = body.StatusFlag + postInfo.Remark = body.Remark + postInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysPostService.Update(postInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 岗位删除 +// Remove 岗位删除 // -// DELETE /:postIds -func (s *SysPostController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - postIds := c.Param("postIds") - if postIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// DELETE /:postId +func (s SysPostController) Remove(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + postId := c.Param("postId") + if postId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: postId is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(postIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(postId, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.sysPostService.DeletePostByIds(uniqueIDs) + + rows, err := s.sysPostService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } + // msg := fmt.Sprintf("删除成功:%d", rows) msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // 导出岗位信息 // // POST /export func (s *SysPostController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - data := s.sysPostService.SelectPostPage(querys) - if parse.Number(data["total"]) == 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + query := reqctx.QueryMap(c) + rows, total := s.sysPostService.FindByPage(query) + if total == 0 { + // c.JSON(200, resp.CodeMsg(40016, "export data record as empty")) + c.JSON(200, resp.CodeMsg(40016, i18n.TKey(language, "app.common.exportEmpty"))) return } - rows := data["rows"].([]model.SysPost) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysPost) { @@ -258,11 +267,11 @@ func (s *SysPostController) Export(c *gin.Context) { for i, row := range rows { idx := strconv.Itoa(i + 2) statusValue := i18n.TKey(language, "dictData.disable") - if row.Status == "1" { + if row.StatusFlag == "1" { statusValue = i18n.TKey(language, "dictData.normal") } dataCells = append(dataCells, map[string]any{ - "A" + idx: row.PostID, + "A" + idx: row.PostId, "B" + idx: row.PostName, "C" + idx: row.PostCode, "D" + idx: row.PostSort, @@ -274,7 +283,7 @@ func (s *SysPostController) Export(c *gin.Context) { // 导出数据表格 saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/system/controller/sys_profile.go b/src/modules/system/controller/sys_profile.go index 5c414e52..28b3c812 100644 --- a/src/modules/system/controller/sys_profile.go +++ b/src/modules/system/controller/sys_profile.go @@ -1,44 +1,36 @@ package controller import ( - "be.ems/src/framework/config" - "be.ems/src/framework/constants/admin" - "be.ems/src/framework/constants/uploadsubpath" + "fmt" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" "be.ems/src/framework/utils/crypto" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" "be.ems/src/framework/utils/regular" - "be.ems/src/framework/utils/token" - "be.ems/src/framework/vo/result" - "be.ems/src/modules/system/model" "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SysProfileController 结构体 var NewSysProfile = &SysProfileController{ - sysUserService: service.NewSysUserImpl, - sysRoleService: service.NewSysRoleImpl, - sysPostService: service.NewSysPostImpl, - sysMenuService: service.NewSysMenuImpl, + sysUserService: service.NewSysUser, + sysRoleService: service.NewSysRole, + sysPostService: service.NewSysPost, + sysMenuService: service.NewSysMenu, } // 个人信息 // // PATH /system/user/profile type SysProfileController struct { - // 用户服务 - sysUserService service.ISysUser - // 角色服务 - sysRoleService service.ISysRole - // 岗位服务 - sysPostService service.ISysPost - // 菜单服务 - sysMenuService service.ISysMenu + sysUserService *service.SysUser // 用户服务 + sysRoleService *service.SysRole // 角色服务 + sysPostService *service.SysPost // 岗位服务 + sysMenuService *service.SysMenu // 菜单服务 } // 个人信息 @@ -54,27 +46,23 @@ type SysProfileController struct { // @Description Personal Information // @Router /system/user/profile [get] func (s *SysProfileController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - loginUser, err := ctx.LoginUser(c) + language := reqctx.AcceptLanguage(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } // 查询用户所属角色组 roleGroup := []string{} - roles := s.sysRoleService.SelectRoleListByUserId(loginUser.UserID) + roles := s.sysRoleService.FindByUserId(loginUser.User.UserId) for _, role := range roles { roleGroup = append(roleGroup, i18n.TKey(language, role.RoleName)) } - isAdmin := config.IsAdmin(loginUser.UserID) - if isAdmin { - roleGroup = append(roleGroup, i18n.TKey(language, "role.system")) - } // 查询用户所属岗位组 postGroup := []string{} - posts := s.sysPostService.SelectPostListByUserId(loginUser.UserID) + posts := s.sysPostService.FindByUserId(loginUser.User.UserId) for _, post := range posts { postGroup = append(postGroup, i18n.TKey(language, post.PostName)) } @@ -85,7 +73,7 @@ func (s *SysProfileController) Info(c *gin.Context) { for ri := range loginUser.User.Roles { loginUser.User.Roles[ri].RoleName = i18n.TKey(language, loginUser.User.Roles[ri].RoleName) } - c.JSON(200, result.OkData(map[string]any{ + c.JSON(200, resp.OkData(map[string]any{ "user": loginUser.User, "roleGroup": parse.RemoveDuplicates(roleGroup), "postGroup": parse.RemoveDuplicates(postGroup), @@ -106,46 +94,43 @@ func (s *SysProfileController) Info(c *gin.Context) { // @Description Personal Information Modification // @Router /system/user/profile [put] func (s *SysProfileController) UpdateProfile(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { - // 昵称 - NickName string `json:"nickName" binding:"required"` - // 性别 - Sex string `json:"sex" binding:"required"` - // 手机号 - PhoneNumber string `json:"phonenumber"` - // 邮箱 - Email string `json:"email"` + NickName string `json:"nickName" binding:"required"` // 昵称 + Sex string `json:"sex" binding:"required,oneof=0 1 2"` // 性别 + Phone string `json:"phone"` // 手机号 + Email string `json:"email"` // 邮箱 + Avatar string `json:"avatar"` // 头像地址 } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.Sex == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } - userId := loginUser.UserID + userId := loginUser.UserId userName := loginUser.User.UserName // 检查手机号码格式并判断是否唯一 - if body.PhoneNumber != "" { - if regular.ValidMobile(body.PhoneNumber) { - uniquePhone := s.sysUserService.CheckUniquePhone(body.PhoneNumber, userId) + if body.Phone != "" { + if regular.ValidMobile(body.Phone) { + uniquePhone := s.sysUserService.CheckUniqueByPhone(body.Phone, userId) if !uniquePhone { - // 修改用户【%s】失败,手机号码已存在 + // c.JSON(200, resp.CodeMsg(40018, "抱歉,手机号码已存在")) msg := i18n.TTemplate(language, "user.errPhoneExists", map[string]any{"name": userName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } else { - // 修改用户【%s】失败,手机号码格式错误 + // c.JSON(200, resp.CodeMsg(40018, "抱歉,手机号码格式错误")) msg := i18n.TTemplate(language, "user.errPhoneFormat", map[string]any{"name": userName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } @@ -153,55 +138,53 @@ func (s *SysProfileController) UpdateProfile(c *gin.Context) { // 检查邮箱格式并判断是否唯一 if body.Email != "" { if regular.ValidEmail(body.Email) { - uniqueEmail := s.sysUserService.CheckUniqueEmail(body.Email, userId) + uniqueEmail := s.sysUserService.CheckUniqueByEmail(body.Email, userId) if !uniqueEmail { - // 修改用户【%s】失败,邮箱已存在 + // c.JSON(200, resp.CodeMsg(40019, "抱歉,邮箱已存在")) msg := i18n.TTemplate(language, "user.errEmailExists", map[string]any{"name": userName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } else { - // 修改用户【%s】失败,邮箱格式错误 + // c.JSON(200, resp.CodeMsg(40019, "抱歉,邮箱格式错误")) msg := i18n.TTemplate(language, "user.errEmailFormat", map[string]any{"name": userName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } - // 用户基本资料 - sysUser := model.SysUser{ - UserID: userId, - UpdateBy: userName, - NickName: body.NickName, - PhoneNumber: body.PhoneNumber, - Email: body.Email, - Sex: body.Sex, - Remark: loginUser.User.Remark, + // 查询当前登录用户信息 + userInfo := s.sysUserService.FindById(userId) + if userInfo.UserId != userId { + // c.JSON(200, resp.ErrMsg("没有权限访问用户数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "user.noData"))) + return } - rows := s.sysUserService.UpdateUser(sysUser) + + // 用户基本资料 + userInfo.NickName = body.NickName + userInfo.Phone = body.Phone + userInfo.Email = body.Email + userInfo.Sex = body.Sex + userInfo.Avatar = body.Avatar + userInfo.Password = "" // 密码不更新 + userInfo.UpdateBy = userInfo.UserName + rows := s.sysUserService.Update(userInfo) if rows > 0 { // 更新缓存用户信息 - loginUser.User = s.sysUserService.SelectUserByUserName(userName) - // 用户权限组标识 - isAdmin := config.IsAdmin(sysUser.UserID) - if isAdmin { - loginUser.Permissions = []string{admin.PERMISSION} - } else { - perms := s.sysMenuService.SelectMenuPermsByUserId(sysUser.UserID) - loginUser.Permissions = parse.RemoveDuplicates(perms) - } + loginUser.User = userInfo // 刷新令牌信息 token.Cache(&loginUser) - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.ErrMsg("Modification of personal information exception")) } // 个人重置密码 // -// PUT /updatePwd +// PUT /password // // @Tags system/user/profile // @Accept json @@ -212,131 +195,55 @@ func (s *SysProfileController) UpdateProfile(c *gin.Context) { // @Summary Personal Reset Password // @Description Personal Reset Password // @Router /system/user/profile/updatePwd [put] -func (s *SysProfileController) UpdatePwd(c *gin.Context) { - language := ctx.AcceptLanguage(c) +func (s *SysProfileController) UpdatePassword(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { - // 旧密码 - OldPassword string `json:"oldPassword" binding:"required"` - // 新密码 - NewPassword string `json:"newPassword" binding:"required"` + OldPassword string `json:"oldPassword" binding:"required"` // 旧密码 + NewPassword string `json:"newPassword" binding:"required"` // 新密码 } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } - userId := loginUser.UserID - userName := loginUser.User.UserName + userId := loginUser.UserId // 查询当前登录用户信息得到密码值 - user := s.sysUserService.SelectUserById(userId) - if user.UserID != userId { - // 没有可访问用户数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.noData"))) + userInfo := s.sysUserService.FindById(userId) + if userInfo.UserId != userId { + // c.JSON(200, resp.ErrMsg("没有权限访问用户数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "user.noData"))) return } // 检查匹配用户密码 - oldCompare := crypto.BcryptCompare(body.OldPassword, user.Password) + oldCompare := crypto.BcryptCompare(body.OldPassword, userInfo.Password) if !oldCompare { - // 修改密码失败,旧密码错误 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.errPasswdOld"))) + // c.JSON(200, resp.ErrMsg("修改密码失败,旧密码错误")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "user.errPasswdOld"))) return } - newCompare := crypto.BcryptCompare(body.NewPassword, user.Password) + newCompare := crypto.BcryptCompare(body.NewPassword, userInfo.Password) if newCompare { - // 新密码不能与旧密码相同 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.errPasswdEqOld"))) + // c.JSON(200, resp.ErrMsg("新密码不能与旧密码相同")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "user.errPasswdEqOld"))) return } // 修改新密码 - sysUser := model.SysUser{ - UserID: userId, - UpdateBy: userName, - Password: body.NewPassword, - Sex: user.Sex, - PhoneNumber: user.PhoneNumber, - Email: user.Email, - Remark: user.Remark, - } - rows := s.sysUserService.UpdateUser(sysUser) + userInfo.Password = body.NewPassword + userInfo.UpdateBy = userInfo.UserName + rows := s.sysUserService.Update(userInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) -} - -// 个人头像上传 -// -// POST /avatar -// -// @Tags system/user/profile -// @Accept multipart/form-data -// @Produce json -// @Param file formData file true "The file to upload." -// @Success 200 {object} object "Response Results" -// @Security TokenAuth -// @Summary Personal avatar upload -// @Description Personal avatar upload -// @Router /system/user/profile/avatar [post] -func (s *SysProfileController) Avatar(c *gin.Context) { - language := ctx.AcceptLanguage(c) - formFile, err := c.FormFile("file") - if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - // 上传文件转存 - filePath, err := file.TransferUploadFile(formFile, uploadsubpath.AVATART, []string{".jpg", ".jpeg", ".png"}) - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) - return - } - - // 登录用户信息 - loginUser, err := ctx.LoginUser(c) - if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) - return - } - - // 更新头像地址 - sysUser := model.SysUser{ - UserID: loginUser.UserID, - UpdateBy: loginUser.User.UserName, - Avatar: filePath, - Sex: loginUser.User.Sex, - PhoneNumber: loginUser.User.PhoneNumber, - Email: loginUser.User.Email, - Remark: loginUser.User.Remark, - } - rows := s.sysUserService.UpdateUser(sysUser) - if rows > 0 { - // 更新缓存用户信息 - loginUser.User = s.sysUserService.SelectUserByUserName(loginUser.User.UserName) - // 用户权限组标识 - isAdmin := config.IsAdmin(sysUser.UserID) - if isAdmin { - loginUser.Permissions = []string{admin.PERMISSION} - } else { - perms := s.sysMenuService.SelectMenuPermsByUserId(sysUser.UserID) - loginUser.Permissions = parse.RemoveDuplicates(perms) - } - // 刷新令牌信息 - token.Cache(&loginUser) - - c.JSON(200, result.OkData(filePath)) - return - } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } diff --git a/src/modules/system/controller/sys_role.go b/src/modules/system/controller/sys_role.go index bceb943b..1d602f93 100644 --- a/src/modules/system/controller/sys_role.go +++ b/src/modules/system/controller/sys_role.go @@ -3,39 +3,33 @@ package controller import ( "fmt" "strconv" - "strings" "time" - "be.ems/src/framework/constants/admin" + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/system/model" "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SysRoleController 结构体 var NewSysRole = &SysRoleController{ - sysRoleService: service.NewSysRoleImpl, - sysUserService: service.NewSysUserImpl, - sysDictDataService: service.NewSysDictData, + sysRoleService: service.NewSysRole, + sysUserService: service.NewSysUser, } // 角色信息 // // PATH /system/role type SysRoleController struct { - // 角色服务 - sysRoleService service.ISysRole - // 用户服务 - sysUserService service.ISysUser - sysDictDataService *service.SysDictData // 字典数据服务 + sysRoleService *service.SysRole // 角色服务 + sysUserService *service.SysUser // 用户服务 } // 角色列表 @@ -54,16 +48,13 @@ type SysRoleController struct { // @Description Role Information List // @Router /system/role/list [get] func (s *SysRoleController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - querys := ctx.QueryMap(c) + language := reqctx.AcceptLanguage(c) + query := reqctx.QueryMap(c) // 多语言值转key查询 - if v, ok := querys["roleName"]; ok && v != "" { - querys["roleName"] = i18n.TFindKeyPrefix(language, "role", v.(string)) + if v, ok := query["roleName"]; ok && v != "" { + query["roleName"] = i18n.TFindKeyPrefix(language, "role", v) } - - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "") - data := s.sysRoleService.SelectRolePage(querys, dataScopeSQL) - rows := data["rows"].([]model.SysRole) + rows, total := s.sysRoleService.FindByPage(query) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysRole) { @@ -74,367 +65,363 @@ func (s *SysRoleController) List(c *gin.Context) { } converI18n(language, &rows) - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 角色信息详情 // // GET /:roleId func (s *SysRoleController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - roleId := c.Param("roleId") - if roleId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + roleId := parse.Number(c.Param("roleId")) + if roleId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: roleId is empty")) return } - data := s.sysRoleService.SelectRoleById(roleId) - if data.RoleID == roleId { + data := s.sysRoleService.FindById(roleId) + if data.RoleId == roleId { data.RoleName = i18n.TKey(language, data.RoleName) data.Remark = i18n.TKey(language, data.Remark) - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 角色信息新增 // // POST / func (s *SysRoleController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysRole - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.RoleID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.RoleId > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: roleId not is empty")) return } // 判断角色名称是否唯一 - uniqueRoleName := s.sysRoleService.CheckUniqueRoleName(body.RoleName, "") - if !uniqueRoleName { - // 角色新增【%s】失败,角色名称已存在 + uniqueName := s.sysRoleService.CheckUniqueByName(body.RoleName, 0) + if !uniqueName { + // msg := fmt.Sprintf("角色新增【%s】失败,角色名称已存在", body.RoleName) msg := i18n.TTemplate(language, "role.errNameExists", map[string]any{"name": body.RoleName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 判断角色键值是否唯一 - uniqueRoleKey := s.sysRoleService.CheckUniqueRoleKey(body.RoleKey, "") - if !uniqueRoleKey { - // 角色新增【%s】失败,角色键值已存在 + uniqueKey := s.sysRoleService.CheckUniqueByKey(body.RoleKey, 0) + if !uniqueKey { + // msg := fmt.Sprintf("角色新增【%s】失败,角色键值已存在", body.RoleName) msg := i18n.TTemplate(language, "role.errKeyExists", map[string]any{"name": body.RoleName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } - body.CreateBy = ctx.LoginUserToUserName(c) - insertId := s.sysRoleService.InsertRole(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + body.CreateBy = reqctx.LoginUserToUserName(c) + insertId := s.sysRoleService.Insert(body) + if insertId > 0 { + c.JSON(200, resp.OkData(insertId)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 角色信息修改 // // PUT / func (s *SysRoleController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysRole - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.RoleID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.RoleId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: roleId is empty")) return } - // 检查是否管理员角色 - if body.RoleID == admin.ROLE_ID { - // 不允许操作管理员角色 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errOperateRole"))) + // 检查是否系统管理员角色 + if body.RoleId == constants.SYS_ROLE_SYSTEM_ID { + // c.JSON(200, resp.ErrMsg("不允许操作系统管理员角色")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.errOperateRole"))) return } // 检查是否存在 - roleInfo := s.sysRoleService.SelectRoleById(body.RoleID) - if roleInfo.RoleID != body.RoleID { - // 没有可访问角色数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "role.noData"))) + roleInfo := s.sysRoleService.FindById(body.RoleId) + if roleInfo.RoleId != body.RoleId { + // c.JSON(200, resp.ErrMsg("没有权限访问角色数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "role.noData"))) return } // 判断角色名称是否唯一 - uniqueRoleName := s.sysRoleService.CheckUniqueRoleName(body.RoleName, body.RoleID) - if !uniqueRoleName { - // 操作角色【%s】失败,角色名称已存在 - // msg := fmt.Sprintf("Character modification [%s] failed, character name already exists", body.RoleName) + uniqueName := s.sysRoleService.CheckUniqueByName(body.RoleName, body.RoleId) + if !uniqueName { + // msg := fmt.Sprintf("角色修改【%s】失败,角色名称已存在", body.RoleName) msg := i18n.TTemplate(language, "role.errNameExists", map[string]any{"name": body.RoleName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 判断角色键值是否唯一 - uniqueRoleKey := s.sysRoleService.CheckUniqueRoleKey(body.RoleKey, body.RoleID) - if !uniqueRoleKey { - // 角色修改【%s】失败,角色键值已存在 - // msg := fmt.Sprintf("Character modification [%s] failed, character key already exists", body.RoleName) + uniqueKey := s.sysRoleService.CheckUniqueByKey(body.RoleKey, body.RoleId) + if !uniqueKey { + // msg := fmt.Sprintf("角色修改【%s】失败,角色键值已存在", body.RoleName) msg := i18n.TTemplate(language, "role.errKeyExists", map[string]any{"name": body.RoleName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 多语言非原始值 i18nValue := i18n.TKey(language, roleInfo.RoleName) if i18nValue != roleInfo.RoleName { - i18n.UpdateKeyValue(language, roleInfo.RoleName, body.RoleName) + service.NewSysI18n.UpdateKeyValue(language, roleInfo.RoleName, body.RoleName) body.RoleName = roleInfo.RoleName } // 多语言非原始值 i18nValue2 := i18n.TKey(language, roleInfo.Remark) if i18nValue2 != roleInfo.Remark { - i18n.UpdateKeyValue(language, roleInfo.Remark, body.Remark) + service.NewSysI18n.UpdateKeyValue(language, roleInfo.Remark, body.Remark) body.Remark = roleInfo.Remark } - body.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysRoleService.UpdateRole(body) + roleInfo.Remark = body.Remark + roleInfo.RoleName = body.RoleName + roleInfo.RoleKey = body.RoleKey + roleInfo.RoleSort = body.RoleSort + roleInfo.DataScope = body.DataScope + roleInfo.MenuCheckStrictly = body.MenuCheckStrictly + roleInfo.DeptCheckStrictly = body.DeptCheckStrictly + roleInfo.StatusFlag = body.StatusFlag + roleInfo.UpdateBy = reqctx.LoginUserToUserName(c) + roleInfo.MenuIds = body.MenuIds + roleInfo.DeptIds = body.DeptIds + rows := s.sysRoleService.Update(roleInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 角色信息删除 +// Remove 角色信息删除 // -// DELETE /:roleIds +// DELETE /:roleId func (s *SysRoleController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - roleIds := c.Param("roleIds") - if roleIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + roleId := c.Param("roleId") + if roleId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: roleId is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(roleIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(roleId, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - // 检查是否管理员角色 - for _, id := range uniqueIDs { - if id == admin.ROLE_ID { - // 不允许操作管理员角色 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errOperateRole"))) + + // 检查是否系统管理员角色 + for _, id := range ids { + if id == constants.SYS_ROLE_SYSTEM_ID { + // c.JSON(200, resp.ErrMsg("不允许操作系统管理员角色")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.errOperateRole"))) return } } - rows, err := s.sysRoleService.DeleteRoleByIds(uniqueIDs) + + rows, err := s.sysRoleService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } + // msg := fmt.Sprintf("删除成功:%d", rows) msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } -// 角色状态变更 +// Status 角色状态变更 // -// PUT /changeStatus -func (s *SysRoleController) Status(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// PUT /status +func (s SysRoleController) Status(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { - // 角色ID - RoleID string `json:"roleId" binding:"required"` - // 状态 - Status string `json:"status" binding:"required"` + RoleID int64 `json:"roleId" binding:"required"` // 角色ID + StatusFlag string `json:"statusFlag" binding:"required,oneof=0 1"` // 状态 } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - // 检查是否管理员角色 - if body.RoleID == admin.ROLE_ID { - // 不允许操作管理员角色 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errOperateRole"))) + // 检查是否系统管理员角色 + if body.RoleID == constants.SYS_ROLE_SYSTEM_ID { + // c.JSON(200, resp.ErrMsg("不允许操作系统管理员角色")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.errOperateRole"))) return } // 检查是否存在 - role := s.sysRoleService.SelectRoleById(body.RoleID) - if role.RoleID != body.RoleID { - // 没有可访问角色数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "role.noData"))) + role := s.sysRoleService.FindById(body.RoleID) + if role.RoleId != body.RoleID { + // c.JSON(200, resp.ErrMsg("没有权限访问角色数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "role.noData"))) return } // 与旧值相等不变更 - if role.Status == body.Status { - // 变更状态与旧值相等! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "role.statusEq"))) + if role.StatusFlag == body.StatusFlag { + // c.JSON(200, resp.ErrMsg("变更状态与旧值相等!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "role.statusEq"))) return } // 更新状态不刷新缓存 - userName := ctx.LoginUserToUserName(c) - SysRoleController := model.SysRole{ - RoleID: body.RoleID, - Status: body.Status, - UpdateBy: userName, - } - rows := s.sysRoleService.UpdateRole(SysRoleController) + role.StatusFlag = body.StatusFlag + role.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysRoleService.Update(role) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 角色数据权限修改 +// DataScope 角色数据权限修改 // -// PUT /dataScope +// PUT /data-scope func (s *SysRoleController) DataScope(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { - // 角色ID - RoleID string `json:"roleId"` - // 部门组(数据权限) - DeptIds []string `json:"deptIds"` - // 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限) - DataScope string `json:"dataScope"` - // 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示) - DeptCheckStrictly string `json:"deptCheckStrictly"` + RoleId int64 `json:"roleId" binding:"required"` // 角色ID + DeptIds []int64 `json:"deptIds"` // 部门组(数据权限) + DataScope string `json:"dataScope" binding:"required,oneof=1 2 3 4 5"` // 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限) + DeptCheckStrictly string `json:"deptCheckStrictly" binding:"required,oneof=0 1"` // 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示) } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - // 检查是否管理员角色 - if body.RoleID == admin.ROLE_ID { - // 不允许操作管理员角色 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errOperateRole"))) + // 检查是否系统管理员角色 + if body.RoleId == constants.SYS_ROLE_SYSTEM_ID { + // c.JSON(200, resp.ErrMsg("不允许操作系统管理员角色")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.errOperateRole"))) return } // 检查是否存在 - role := s.sysRoleService.SelectRoleById(body.RoleID) - if role.RoleID != body.RoleID { - // 没有可访问角色数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "role.noData"))) + roleInfo := s.sysRoleService.FindById(body.RoleId) + if roleInfo.RoleId != body.RoleId { + // c.JSON(200, resp.ErrMsg("没有权限访问角色数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "role.noData"))) return } // 更新数据权限 - userName := ctx.LoginUserToUserName(c) - SysRoleController := model.SysRole{ - RoleID: body.RoleID, - DeptIds: body.DeptIds, - DataScope: body.DataScope, - DeptCheckStrictly: body.DeptCheckStrictly, - UpdateBy: userName, - } - rows := s.sysRoleService.AuthDataScope(SysRoleController) + roleInfo.DeptIds = body.DeptIds + roleInfo.DataScope = body.DataScope + roleInfo.DeptCheckStrictly = body.DeptCheckStrictly + roleInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysRoleService.UpdateAndDataScope(roleInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 角色分配用户列表 +// UserAuthList 角色分配用户列表 // -// GET /authUser/allocatedList -func (s *SysRoleController) AuthUserAllocatedList(c *gin.Context) { - language := ctx.AcceptLanguage(c) - querys := ctx.QueryMap(c) - roleId, ok := querys["roleId"] - if !ok || roleId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) +// GET /user/list +func (s SysRoleController) UserAuthList(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + roleId := parse.Number(c.Query("roleId")) + if roleId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: roleId is empty")) return } // 检查是否存在 - role := s.sysRoleService.SelectRoleById(roleId.(string)) - if role.RoleID != roleId { - // 没有可访问角色数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "role.noData"))) + role := s.sysRoleService.FindById(roleId) + if role.RoleId != roleId { + // c.JSON(200, resp.ErrMsg("没有权限访问角色数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "role.noData"))) return } - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "u") - data := s.sysUserService.SelectAllocatedPage(querys, dataScopeSQL) - c.JSON(200, result.Ok(data)) + query := reqctx.QueryMap(c) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_user", "sys_user") + rows, total := s.sysUserService.FindAuthUsersPage(query, dataScopeSQL) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } -// 角色分配选择授权 +// UserAuthChecked 角色分配选择授权 // -// PUT /authUser/checked -func (s *SysRoleController) AuthUserChecked(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// PUT /user/auth +func (s SysRoleController) UserAuthChecked(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { - // 角色ID - RoleID string `json:"roleId" binding:"required"` - // 用户ID组 - UserIDs string `json:"userIds" binding:"required"` - // 选择操作 添加true 取消false - Checked bool `json:"checked"` + RoleId int64 `json:"roleId" binding:"required"` // 角色ID + UserIds []int64 `json:"userIds" binding:"required"` // 用户ID组 + Auth bool `json:"auth" binding:"required"` // 选择操作 添加true 取消false } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - - // 处理字符转id数组后去重 - ids := strings.Split(body.UserIDs, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) + if len(body.UserIds) <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: userIds is empty")) return } // 检查是否存在 - role := s.sysRoleService.SelectRoleById(body.RoleID) - if role.RoleID != body.RoleID { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "role.noData"))) + role := s.sysRoleService.FindById(body.RoleId) + if role.RoleId != body.RoleId { + // c.JSON(200, resp.ErrMsg("没有权限访问角色数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "role.noData"))) return } var rows int64 - if body.Checked { - rows = s.sysRoleService.InsertAuthUsers(body.RoleID, uniqueIDs) + if body.Auth { + rows = s.sysRoleService.InsertAuthUsers(body.RoleId, body.UserIds) } else { - rows = s.sysRoleService.DeleteAuthUsers(body.RoleID, uniqueIDs) + rows = s.sysRoleService.DeleteAuthUsers(body.RoleId, body.UserIds) } if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 导出角色信息 // // POST /export func (s *SysRoleController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "") - data := s.sysRoleService.SelectRolePage(querys, dataScopeSQL) - if parse.Number(data["total"]) == 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + query := reqctx.QueryMap(c) + rows, total := s.sysRoleService.FindByPage(query) + if total == 0 { + // c.JSON(200, resp.CodeMsg(40016, "export data record as empty")) + c.JSON(200, resp.CodeMsg(40016, i18n.TKey(language, "app.common.exportEmpty"))) return } - rows := data["rows"].([]model.SysRole) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysRole) { @@ -473,11 +460,11 @@ func (s *SysRoleController) Export(c *gin.Context) { // } // 角色状态 statusValue := i18n.TKey(language, "dictData.disable") - if row.Status == "1" { + if row.StatusFlag == "1" { statusValue = i18n.TKey(language, "dictData.normal") } dataCells = append(dataCells, map[string]any{ - "A" + idx: row.RoleID, + "A" + idx: row.RoleId, "B" + idx: row.RoleName, "C" + idx: row.RoleKey, "D" + idx: row.RoleSort, @@ -490,7 +477,7 @@ func (s *SysRoleController) Export(c *gin.Context) { // 导出数据表格 saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/system/controller/sys_user.go b/src/modules/system/controller/sys_user.go index b546bb38..8275d13d 100644 --- a/src/modules/system/controller/sys_user.go +++ b/src/modules/system/controller/sys_user.go @@ -7,44 +7,34 @@ import ( "time" "be.ems/src/framework/config" - "be.ems/src/framework/constants/admin" - "be.ems/src/framework/constants/common" + "be.ems/src/framework/constants" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" "be.ems/src/framework/utils/regular" - "be.ems/src/framework/vo/result" "be.ems/src/modules/system/model" "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SysUserController 结构体 var NewSysUser = &SysUserController{ - sysUserService: service.NewSysUserImpl, - sysRoleService: service.NewSysRoleImpl, - sysPostService: service.NewSysPostImpl, - sysDictDataService: service.NewSysDictData, - sysConfigService: service.NewSysConfigImpl, + sysUserService: service.NewSysUser, + sysRoleService: service.NewSysRole, + sysPostService: service.NewSysPost, } // 用户信息 // // PATH /system/user type SysUserController struct { - // 用户服务 - sysUserService service.ISysUser - // 角色服务 - sysRoleService service.ISysRole - // 岗位服务 - sysPostService service.ISysPost - sysDictDataService *service.SysDictData // 字典数据服务 - // 参数配置服务 - sysConfigService service.ISysConfig + sysUserService *service.SysUser // 用户服务 + sysRoleService *service.SysRole // 角色服务 + sysPostService *service.SysPost // 岗位服务 } // 用户信息列表 @@ -63,13 +53,12 @@ type SysUserController struct { // @Description User Information List // @Router /system/user/list [get] func (s *SysUserController) List(c *gin.Context) { - querys := ctx.QueryMap(c) - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "u") - data := s.sysUserService.SelectUserPage(querys, dataScopeSQL) + queryMap := reqctx.QueryMap(c) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_user", "sys_user") + rows, total := s.sysUserService.FindByPage(queryMap, dataScopeSQL) - rows := data["rows"].([]model.SysUser) // 闭包函数处理多语言 - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) converI18n := func(language string, arr *[]model.SysUser) { for i := range *arr { (*arr)[i].NickName = i18n.TKey(language, (*arr)[i].NickName) @@ -82,34 +71,24 @@ func (s *SysUserController) List(c *gin.Context) { } converI18n(language, &rows) - c.JSON(200, result.Ok(data)) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 用户信息详情 // // GET /:userId func (s *SysUserController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - userId := c.Param("userId") - if userId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + userId := parse.Number(c.Param("userId")) + if userId < 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: userId is empty")) return } // 查询系统角色列表 - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "") - roles := s.sysRoleService.SelectRoleList(model.SysRole{}, dataScopeSQL) - - // 不是系统指定管理员需要排除其角色 - if !config.IsAdmin(userId) { - rolesFilter := make([]model.SysRole, 0) - for _, r := range roles { - if r.RoleID != admin.ROLE_ID { - rolesFilter = append(rolesFilter, r) - } - } - roles = rolesFilter - } + roles := s.sysRoleService.Find(model.SysRole{}) + // 查询系统岗位列表 + posts := s.sysPostService.Find(model.SysPost{}) // 闭包函数处理多语言 converI18nRoles := func(language string, arr *[]model.SysRole) { @@ -120,9 +99,6 @@ func (s *SysUserController) Info(c *gin.Context) { } converI18nRoles(language, &roles) - // 查询系统岗位列表 - posts := s.sysPostService.SelectPostList(model.SysPost{}) - // 闭包函数处理多语言 converI18nPosts := func(language string, arr *[]model.SysPost) { for i := range *arr { @@ -133,8 +109,8 @@ func (s *SysUserController) Info(c *gin.Context) { converI18nPosts(language, &posts) // 新增用户时,用户ID为0 - if userId == "0" { - c.JSON(200, result.OkData(map[string]any{ + if userId == 0 { + c.JSON(200, resp.OkData(map[string]any{ "user": map[string]any{}, "roleIds": []string{}, "postIds": []string{}, @@ -145,35 +121,35 @@ func (s *SysUserController) Info(c *gin.Context) { } // 检查用户是否存在 - user := s.sysUserService.SelectUserById(userId) - if user.UserID != userId { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.noData"))) + userInfo := s.sysUserService.FindById(userId) + if userInfo.UserId != userId { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "user.noData"))) return } // 处理多语言 - user.NickName = i18n.TKey(language, user.NickName) - user.Remark = i18n.TKey(language, user.Remark) - user.Dept.DeptName = i18n.TKey(language, user.Dept.DeptName) - for ri := range user.Roles { - user.Roles[ri].RoleName = i18n.TKey(language, user.Roles[ri].RoleName) + userInfo.NickName = i18n.TKey(language, userInfo.NickName) + userInfo.Remark = i18n.TKey(language, userInfo.Remark) + userInfo.Dept.DeptName = i18n.TKey(language, userInfo.Dept.DeptName) + for ri := range userInfo.Roles { + userInfo.Roles[ri].RoleName = i18n.TKey(language, userInfo.Roles[ri].RoleName) } // 角色ID组 - roleIds := make([]string, 0) - for _, r := range user.Roles { - roleIds = append(roleIds, r.RoleID) + roleIds := make([]int64, 0) + for _, r := range userInfo.Roles { + roleIds = append(roleIds, r.RoleId) } // 岗位ID组 - postIds := make([]string, 0) - userPosts := s.sysPostService.SelectPostListByUserId(userId) + postIds := make([]int64, 0) + userPosts := s.sysPostService.FindByUserId(userId) for _, p := range userPosts { - postIds = append(postIds, p.PostID) + postIds = append(postIds, p.PostId) } - c.JSON(200, result.OkData(map[string]any{ - "user": user, + c.JSON(200, resp.OkData(map[string]any{ + "user": userInfo, "roleIds": roleIds, "postIds": postIds, "roles": roles, @@ -185,11 +161,10 @@ func (s *SysUserController) Info(c *gin.Context) { // // POST / func (s *SysUserController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysUser - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.UserID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + c.JSON(400, resp.ErrMsg(resp.FormatBindError(err))) return } @@ -197,38 +172,53 @@ func (s *SysUserController) Add(c *gin.Context) { var bodyPassword struct { Password string `json:"password" binding:"required"` } - if err := c.ShouldBindBodyWith(&bodyPassword, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&bodyPassword); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } body.Password = bodyPassword.Password + if body.UserId > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: userId not is empty")) + return + } + if !regular.ValidUsername(body.UserName) { + // msg := fmt.Sprintf("新增用户【%s】失败,登录账号用户账号只能包含大写小写字母,数字,且不少于4位", body.UserName) + msg := fmt.Sprintf("Add a new user [%s] failed to log in the account user account can only contain upper and lower case letters, numbers, and not less than 4 digits", body.UserName) + c.JSON(400, resp.ErrMsg(msg)) + return + } + if !regular.ValidPassword(body.Password) { + // msg := fmt.Sprintf("新增用户【%s】失败,登录密码至少包含大小写字母、数字、特殊符号,且不少于6位", body.UserName) + msg := fmt.Sprintf("New user [%s] failed, the login password contains at least upper and lower case letters, numbers, special symbols, and not less than 6 bits", body.UserName) + c.JSON(400, resp.ErrMsg(msg)) + return + } + // 检查用户登录账号是否唯一 - uniqueUserName := s.sysUserService.CheckUniqueUserName(body.UserName, "") + uniqueUserName := s.sysUserService.CheckUniqueByUserName(body.UserName, 0) if !uniqueUserName { - // 新增用户【%s】失败,登录账号已存在 - // msg := fmt.Sprintf("Failed to add user [%s], login account already exists", body.UserName) + // msg := fmt.Sprintf("新增用户【%s】失败,登录账号已存在", body.UserName) msg := i18n.TTemplate(language, "user.errNameExists", map[string]any{"name": body.UserName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } // 检查手机号码格式并判断是否唯一 - if body.PhoneNumber != "" { - if regular.ValidMobile(body.PhoneNumber) { - uniquePhone := s.sysUserService.CheckUniquePhone(body.PhoneNumber, "") + if body.Phone != "" { + if regular.ValidMobile(body.Phone) { + uniquePhone := s.sysUserService.CheckUniqueByPhone(body.Phone, 0) if !uniquePhone { - // 新增用户【%s】失败,手机号码已存在 - // msg := fmt.Sprintf("Failed to add user [%s], cell phone number already exists", body.UserName) + // msg := fmt.Sprintf("新增用户【%s】失败,手机号码已存在", body.UserName) msg := i18n.TTemplate(language, "user.errPhoneExists", map[string]any{"name": body.UserName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } else { - // 新增用户【%s】失败,手机号码格式错误 - // msg := fmt.Sprintf("Failed to add user [%s], wrong format of cell phone number", body.UserName) + // msg := fmt.Sprintf("新增用户【%s】失败,手机号码格式错误", body.UserName) msg := i18n.TTemplate(language, "user.errPhoneFormat", map[string]any{"name": body.UserName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } @@ -236,84 +226,101 @@ func (s *SysUserController) Add(c *gin.Context) { // 检查邮箱格式并判断是否唯一 if body.Email != "" { if regular.ValidEmail(body.Email) { - uniqueEmail := s.sysUserService.CheckUniqueEmail(body.Email, "") + uniqueEmail := s.sysUserService.CheckUniqueByEmail(body.Email, 0) if !uniqueEmail { - // 新增用户【%s】失败,邮箱已存在 - // msg := fmt.Sprintf("Failed to add user [%s], mailbox already exists", body.UserName) + // msg := fmt.Sprintf("新增用户【%s】失败,邮箱已存在", body.UserName) msg := i18n.TTemplate(language, "user.errEmailExists", map[string]any{"name": body.UserName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } else { - // 新增用户【%s】失败,邮箱格式错误 - // msg := fmt.Sprintf("Failed to add user [%s], mailbox format error", body.UserName) + // msg := fmt.Sprintf("新增用户【%s】失败,邮箱格式错误", body.UserName) msg := i18n.TTemplate(language, "user.errEmailFormat", map[string]any{"name": body.UserName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } - body.CreateBy = ctx.LoginUserToUserName(c) - insertId := s.sysUserService.InsertUser(body) - if insertId != "" { - c.JSON(200, result.Ok(nil)) + userInfo := model.SysUser{ + UserName: body.UserName, + Password: body.Password, + NickName: body.NickName, + Email: body.Email, + Phone: body.Phone, + Sex: body.Sex, + StatusFlag: body.StatusFlag, + Remark: body.Remark, + DeptId: body.DeptId, // 部门ID + RoleIds: body.RoleIds, // 角色ID组 + PostIds: body.PostIds, // 岗位ID组 + Avatar: body.Avatar, + CreateBy: reqctx.LoginUserToUserName(c), + } + insertId := s.sysUserService.Insert(userInfo) + if insertId > 0 { + c.JSON(200, resp.OkData(insertId)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 用户信息修改 // // POST / func (s *SysUserController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.SysUser - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.UserID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.UserId <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: userId is empty")) return } - // 检查是否管理员用户 - if config.IsAdmin(body.UserID) { - // 不允许操作管理员用户 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errOperateAdmin"))) - return - } - - user := s.sysUserService.SelectUserById(body.UserID) - if user.UserID != body.UserID { - // 没有可访问用户数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.noData"))) + // 检查是否系统管理员用户 + if config.IsSystemUser(body.UserId) { + // c.JSON(200, resp.ErrMsg("不允许操作系统管理员用户")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.errOperateAdmin"))) return } // 检查用户登录账号是否唯一 - uniqueUserName := s.sysUserService.CheckUniqueUserName(body.UserName, body.UserID) + uniqueUserName := s.sysUserService.CheckUniqueByUserName( + body.UserName, + body.UserId, + ) if !uniqueUserName { - // 修改用户【%s】失败,登录账号已存在 - // msg := fmt.Sprintf("Failed to modify user [%s], login account already exists", body.UserName) + // msg := fmt.Sprintf("修改用户【%s】失败,登录账号已存在", body.UserName) msg := i18n.TTemplate(language, "user.errNameExists", map[string]any{"name": body.UserName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) + return + } + + // 检查是否存在 + userInfo := s.sysUserService.FindById(body.UserId) + if userInfo.UserId != body.UserId { + // c.JSON(200, resp.ErrMsg("没有权限访问用户数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "user.noData"))) return } // 检查手机号码格式并判断是否唯一 - if body.PhoneNumber != "" { - if regular.ValidMobile(body.PhoneNumber) { - uniquePhone := s.sysUserService.CheckUniquePhone(body.PhoneNumber, body.UserID) + if body.Phone != "" { + if regular.ValidMobile(body.Phone) { + uniquePhone := s.sysUserService.CheckUniqueByPhone(body.Phone, body.UserId) if !uniquePhone { - // 修改用户【%s】失败,手机号码已存在 - // msg := fmt.Sprintf("Failed to modify user [%s], cell phone number already exists", body.UserName) + // msg := fmt.Sprintf("修改用户【%s】失败,手机号码已存在", body.UserName) msg := i18n.TTemplate(language, "user.errPhoneExists", map[string]any{"name": body.UserName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } else { - // 修改用户【%s】失败,手机号码格式错误 - // msg := fmt.Sprintf("Failed to modify user [%s], wrong format of cell phone number", body.UserName) + // msg := fmt.Sprintf("修改用户【%s】失败,手机号码格式错误", body.UserName) msg := i18n.TTemplate(language, "user.errPhoneFormat", map[string]any{"name": body.UserName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } @@ -321,188 +328,194 @@ func (s *SysUserController) Edit(c *gin.Context) { // 检查邮箱格式并判断是否唯一 if body.Email != "" { if regular.ValidEmail(body.Email) { - uniqueEmail := s.sysUserService.CheckUniqueEmail(body.Email, body.UserID) + uniqueEmail := s.sysUserService.CheckUniqueByEmail(body.Email, body.UserId) if !uniqueEmail { - // 修改用户【%s】失败,邮箱已存在 - // msg := fmt.Sprintf("Failed to modify user [%s], mailbox already exists", body.UserName) + // msg := fmt.Sprintf("修改用户【%s】失败,邮箱已存在", body.UserName) msg := i18n.TTemplate(language, "user.errEmailExists", map[string]any{"name": body.UserName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } else { - // 修改用户【%s】失败,邮箱格式错误 - // msg := fmt.Sprintf("Failed to modify user [%s], mailbox format error", body.UserName) + // msg := fmt.Sprintf("修改用户【%s】失败,邮箱格式错误", body.UserName) msg := i18n.TTemplate(language, "user.errEmailFormat", map[string]any{"name": body.UserName}) - c.JSON(200, result.ErrMsg(msg)) + c.JSON(200, resp.ErrMsg(msg)) return } } - body.UserName = "" // 忽略修改登录用户名称 - body.Password = "" // 忽略修改密码 - body.LoginIP = "" // 忽略登录IP - body.LoginDate = 0 // 忽略登录时间 - body.UpdateBy = ctx.LoginUserToUserName(c) - rows := s.sysUserService.UpdateUserAndRolePost(body) + if body.Avatar != "" { + userInfo.Avatar = body.Avatar + } + + userInfo.Phone = body.Phone + userInfo.Email = body.Email + userInfo.Sex = body.Sex + userInfo.StatusFlag = body.StatusFlag + userInfo.Remark = body.Remark + userInfo.DeptId = body.DeptId + userInfo.RoleIds = body.RoleIds + userInfo.PostIds = body.PostIds + userInfo.Password = "" // 忽略修改密码 + userInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysUserService.UpdateUserAndRolePost(userInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 用户信息删除 // -// DELETE /:userIds +// DELETE /:userId func (s *SysUserController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - userIds := c.Param("userIds") - if userIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - // 处理字符转id数组后去重 - ids := strings.Split(userIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) + language := reqctx.AcceptLanguage(c) + userId := c.Param("userId") + if userId == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: userId is empty")) return } - // 检查是否管理员用户 - for _, id := range uniqueIDs { - if config.IsAdmin(id) { - // 不允许操作管理员用户 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errOperateAdmin"))) + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicatesToArray(userId, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) + } + + loginUserID := reqctx.LoginUserToUserID(c) + for _, id := range ids { + // 不能删除自己 + if id == loginUserID { + c.JSON(200, resp.ErrMsg("Current user cannot be deleted")) + return + } + // 检查是否管理员用户 + if config.IsSystemUser(id) { + // c.JSON(200, resp.ErrMsg("不允许操作系统管理员用户")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.errOperateAdmin"))) return } } - rows, err := s.sysUserService.DeleteUserByIds(uniqueIDs) + rows, err := s.sysUserService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - // 删除成功:%d + // msg := fmt.Sprintf("删除成功:%d", rows) msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // 用户重置密码 // -// PUT /resetPwd -func (s *SysUserController) ResetPwd(c *gin.Context) { - language := ctx.AcceptLanguage(c) +// PUT /password +func (s *SysUserController) Password(c *gin.Context) { + language := reqctx.AcceptLanguage(c) var body struct { - UserID string `json:"userId" binding:"required"` + UserId int64 `json:"userId" binding:"required"` Password string `json:"password" binding:"required"` } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - // 检查是否管理员用户 - if config.IsAdmin(body.UserID) { - // 不允许操作内置用户 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errOperateAdmin"))) + // 检查是否系统管理员用户 + if config.IsSystemUser(body.UserId) { + // c.JSON(200, resp.ErrMsg("不允许操作系统管理员用户")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.errOperateAdmin"))) return } - user := s.sysUserService.SelectUserById(body.UserID) - if user.UserID != body.UserID { - // 没有可访问用户数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.noData"))) - return - } if !regular.ValidPassword(body.Password) { - // 登录密码至少包含大小写字母、数字、特殊符号,且不少于6位 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.errPasswd"))) - return - } - - userName := ctx.LoginUserToUserName(c) - info := model.SysUser{ - UserID: body.UserID, - Password: body.Password, - UpdateBy: userName, - Sex: user.Sex, - PhoneNumber: user.PhoneNumber, - Email: user.Email, - Remark: user.Remark, - } - rows := s.sysUserService.UpdateUser(info) - if rows > 0 { - c.JSON(200, result.Ok(nil)) - return - } - c.JSON(200, result.Err(nil)) -} - -// 用户状态修改 -// -// PUT /changeStatus -func (s *SysUserController) Status(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var body struct { - UserID string `json:"userId" binding:"required"` - Status string `json:"status" binding:"required"` - } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(200, resp.ErrMsg("Login password contains at least upper and lower case letters, numbers, special symbols, and not less than 6 digits")) return } // 检查是否存在 - user := s.sysUserService.SelectUserById(body.UserID) - if user.UserID != body.UserID { - // 没有可访问用户数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.noData"))) + userInfo := s.sysUserService.FindById(body.UserId) + if userInfo.UserId != body.UserId { + // c.JSON(200, resp.ErrMsg("没有权限访问用户数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "user.noData"))) + return + } + + userInfo.Password = body.Password + userInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysUserService.Update(userInfo) + if rows > 0 { + c.JSON(200, resp.Ok(nil)) + return + } + c.JSON(200, resp.Err(nil)) +} + +// Status 用户状态修改 +// +// PUT /status +func (s *SysUserController) Status(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body struct { + UserId int64 `json:"userId" binding:"required"` + StatusFlag string `json:"statusFlag" binding:"required,oneof=0 1"` + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + + // 检查是否系统管理员用户 + if config.IsSystemUser(body.UserId) { + // c.JSON(200, resp.ErrMsg("不允许操作系统管理员用户")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.errOperateAdmin"))) + return + } + + // 检查是否存在 + userInfo := s.sysUserService.FindById(body.UserId) + if userInfo.UserId != body.UserId { + // c.JSON(200, resp.ErrMsg("没有权限访问用户数据!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "user.noData"))) return } // 与旧值相等不变更 - if user.Status == body.Status { - // 变更状态与旧值相等! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.statusEq"))) + if userInfo.StatusFlag == body.StatusFlag { + // c.JSON(200, resp.ErrMsg("变更状态与旧值相等!")) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "user.statusEq"))) return } - userName := ctx.LoginUserToUserName(c) - info := model.SysUser{ - UserID: body.UserID, - Status: body.Status, - UpdateBy: userName, - Sex: user.Sex, - PhoneNumber: user.PhoneNumber, - Email: user.Email, - Remark: user.Remark, - } - rows := s.sysUserService.UpdateUser(info) + userInfo.StatusFlag = body.StatusFlag + userInfo.Password = "" // 密码不更新 + userInfo.UpdateBy = reqctx.LoginUserToUserName(c) + rows := s.sysUserService.Update(userInfo) if rows > 0 { - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } -// 用户信息列表导出 +// Export 用户信息列表导出 // -// POST /export +// GET /export func (s *SysUserController) Export(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - querys := ctx.BodyJSONMap(c) - querys["pageNum"] = 1 - querys["pageSize"] = 10000 - dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "u") - data := s.sysUserService.SelectUserPage(querys, dataScopeSQL) - if parse.Number(data["total"]) == 0 { - // 导出数据记录为空 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + queryMap := reqctx.QueryMap(c) + dataScopeSQL := reqctx.LoginUserToDataScopeSQL(c, "sys_user", "sys_user") + rows, total := s.sysUserService.FindByPage(queryMap, dataScopeSQL) + if total == 0 { + // c.JSON(200, resp.CodeMsg(40016, "export data record as empty")) + c.JSON(200, resp.CodeMsg(40016, i18n.TKey(language, "app.common.exportEmpty"))) return } - rows := data["rows"].([]model.SysUser) // 闭包函数处理多语言 converI18n := func(language string, arr *[]model.SysUser) { @@ -517,8 +530,6 @@ func (s *SysUserController) Export(c *gin.Context) { } converI18n(language, &rows) - // 导出文件名称 - fileName := fmt.Sprintf("user_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) // 第一行表头标题 headerCells := map[string]string{ "A1": i18n.TKey(language, "user.export.id"), @@ -551,7 +562,7 @@ func (s *SysUserController) Export(c *gin.Context) { // } // 帐号状态 statusValue := i18n.TKey(language, "dictData.disable") - if row.Status == "1" { + if row.StatusFlag == "1" { statusValue = i18n.TKey(language, "dictData.normal") } // 用户角色, 默认导出首个 @@ -560,13 +571,13 @@ func (s *SysUserController) Export(c *gin.Context) { userRole = i18n.TKey(language, row.Roles[0].RoleName) } dataCells = append(dataCells, map[string]any{ - "A" + idx: row.UserID, + "A" + idx: row.UserId, "B" + idx: row.UserName, "C" + idx: row.NickName, "D" + idx: userRole, "E" + idx: row.Dept.DeptName, - "F" + idx: row.LoginIP, - "G" + idx: date.ParseDateToStr(row.LoginDate, date.YYYY_MM_DD_HH_MM_SS), + "F" + idx: row.LoginIp, + "G" + idx: date.ParseDateToStr(row.LoginTime, date.YYYY_MM_DDTHH_MM_SSZ), "H" + idx: statusValue, // "E" + idx: row.PhoneNumber, // "F" + idx: sysUserSex, @@ -576,34 +587,34 @@ func (s *SysUserController) Export(c *gin.Context) { }) } + // 导出文件名称 + fileName := fmt.Sprintf("user_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) // 导出数据表格 saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } c.FileAttachment(saveFilePath, fileName) } -// 用户信息列表导入模板下载 +// Template 用户信息列表导入模板下载 // -// GET /importTemplate +// GET /import/template func (s *SysUserController) Template(c *gin.Context) { - fileName := fmt.Sprintf("user_import_template_%d.xlsx", time.Now().UnixMilli()) - // 多语言处理 - language := ctx.AcceptLanguage(c) - asserPath := fmt.Sprintf("assets/template/excel/user_import_template_%s.xlsx", language) + language := reqctx.AcceptLanguage(c) + asserPath := fmt.Sprintf("src/assets/template/excel/user_import_template_%s.xlsx", language) - // 从 embed.FS 中读取默认配置文件内容 + // 从 embed.FS 中读取内嵌文件 assetsDir := config.GetAssetsDirFS() - // 读取内嵌文件 fileData, err := assetsDir.ReadFile(asserPath) if err != nil { - c.String(500, "Failed to read file") + c.String(400, "failed to read file") return } + fileName := fmt.Sprintf("user_import_template_%d.xlsx", time.Now().UnixMilli()) // 设置响应头 c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName)) @@ -613,48 +624,47 @@ func (s *SysUserController) Template(c *gin.Context) { c.Data(200, "application/octet-stream", fileData) } -// 用户信息列表导入 +// Import 用户信息列表导入 // -// POST /importData -func (s *SysUserController) ImportData(c *gin.Context) { - language := ctx.AcceptLanguage(c) - // 允许进行更新 - updateSupport := c.PostForm("updateSupport") - // 上传的文件 - formFile, err := c.FormFile("file") - if err != nil || updateSupport == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - // 保存表格文件 - filePath, err := file.TransferExeclUploadFile(formFile) - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) +// POST /import +func (s *SysUserController) Import(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body struct { + FilePath string `json:"filePath" binding:"required"` // 上传的文件地址 + Update bool `json:"update"` // 允许进行更新 + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } + // 表格文件绝对地址 + filePath := file.ParseUploadFileAbsPath(body.FilePath) // 读取表格数据 rows, err := file.ReadSheet(filePath, "") if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + if len(rows) <= 0 { + c.JSON(200, resp.ErrMsg("Imported user data cannot be empty!")) return } // 获取操作人名称 - operName := ctx.LoginUserToUserName(c) - isUpdateSupport := parse.Boolean(updateSupport) + operaName := reqctx.LoginUserToUserName(c) // 读取默认初始密码 - initPassword := s.sysConfigService.SelectConfigValueByKey("sys.user.initPassword") + initPassword := service.NewSysConfig.FindValueByKey("sys.user.initPassword") // 读取用户性别字典数据 - dictSysUserSex := s.sysDictDataService.SelectDictDataByType("sys_user_sex") + dictSysUserSex := service.NewSysDictType.FindDataByType("sys_user_sex") // 导入记录 successNum := 0 failureNum := 0 - successMsgArr := []string{} - failureMsgArr := []string{} + var successMsgArr []string + var failureMsgArr []string mustItemArr := []string{"B", "C"} for _, row := range rows { // 检查必填列 @@ -668,7 +678,7 @@ func (s *SysUserController) ImportData(c *gin.Context) { if !ownItem { mustItemArrStr := strings.Join(mustItemArr, "、") failureNum++ - // 表格中必填列表项, + // msg := fmt.Sprintf("表格中必填列表项,%s", mustItemArrStr) msg := i18n.TTemplate(language, "user.import.mustItem", map[string]any{"text": mustItemArrStr}) failureMsgArr = append(failureMsgArr, msg) continue @@ -677,16 +687,16 @@ func (s *SysUserController) ImportData(c *gin.Context) { // 用户性别转值 sysUserSex := "0" for _, v := range dictSysUserSex { - label := i18n.TKey(language, v.DictLabel) + label := i18n.TKey(language, v.DataLabel) if row["F"] == label { - sysUserSex = v.DictValue + sysUserSex = v.DataValue break } } // 用户状态 - sysUserStatus := common.STATUS_NO + sysUserStatus := constants.STATUS_NO if row["G"] == "正常" || row["G"] == "Normal" { - sysUserStatus = common.STATUS_YES + sysUserStatus = constants.STATUS_YES } // 用户角色 拿编号 sysUserRole := "" @@ -696,35 +706,39 @@ func (s *SysUserController) ImportData(c *gin.Context) { sysUserRole = "" } } - - // 构建用户实体信息 - newSysUser := model.SysUser{ - UserType: "sys", - Password: initPassword, - DeptID: row["I"], - UserName: row["B"], - NickName: row["C"], - PhoneNumber: row["E"], - Email: row["D"], - Status: sysUserStatus, - Sex: sysUserSex, - RoleIDs: []string{sysUserRole}, + var sysUserDeptId int64 = 101 + if row["I"] != "" { + sysUserDeptId = parse.Number(row["I"]) } + // 验证是否存在这个用户 + newSysUser := s.sysUserService.FindByUserName(row["B"]) + newSysUser.Password = initPassword + newSysUser.UserName = row["B"] + newSysUser.NickName = row["C"] + newSysUser.Phone = row["E"] + newSysUser.Email = row["D"] + newSysUser.StatusFlag = sysUserStatus + newSysUser.Sex = sysUserSex + newSysUser.DeptId = sysUserDeptId + + // 行用户编号 + rowNo := row["A"] + // 检查手机号码格式并判断是否唯一 - if newSysUser.PhoneNumber != "" { - if regular.ValidMobile(newSysUser.PhoneNumber) { - uniquePhone := s.sysUserService.CheckUniquePhone(newSysUser.PhoneNumber, "") + if newSysUser.Phone != "" { + if regular.ValidMobile(newSysUser.Phone) { + uniquePhone := s.sysUserService.CheckUniqueByPhone(newSysUser.Phone, newSysUser.UserId) if !uniquePhone { - // 用户编号:%s 手机号码 %s 已存在 - msg := i18n.TTemplate(language, "user.import.phoneExist", map[string]any{"id": row["A"], "phone": newSysUser.PhoneNumber}) + // msg := fmt.Sprintf("用户编号:%s 手机号码:%s 已存在", rowNo, newSysUser.Phone) + msg := i18n.TTemplate(language, "user.import.phoneExist", map[string]any{"id": rowNo, "phone": newSysUser.Phone}) failureNum++ failureMsgArr = append(failureMsgArr, msg) continue } } else { - // 用户编号:%s 手机号码 %s 格式错误 - msg := i18n.TTemplate(language, "user.import.phoneFormat", map[string]any{"id": row["A"], "phone": newSysUser.PhoneNumber}) + // msg := fmt.Sprintf("用户编号:%s 手机号码:%s 格式错误", rowNo, newSysUser.Phone) + msg := i18n.TTemplate(language, "user.import.phoneFormat", map[string]any{"id": rowNo, "phone": newSysUser.Phone}) failureNum++ failureMsgArr = append(failureMsgArr, msg) continue @@ -734,36 +748,33 @@ func (s *SysUserController) ImportData(c *gin.Context) { // 检查邮箱格式并判断是否唯一 if newSysUser.Email != "" { if regular.ValidEmail(newSysUser.Email) { - uniqueEmail := s.sysUserService.CheckUniqueEmail(newSysUser.Email, "") + uniqueEmail := s.sysUserService.CheckUniqueByEmail(newSysUser.Email, newSysUser.UserId) if !uniqueEmail { - // 用户编号:%s 用户邮箱 %s 已存在 - msg := i18n.TTemplate(language, "user.import.emailExist", map[string]any{"id": row["A"], "email": newSysUser.Email}) + // msg := fmt.Sprintf("用户编号:%s 用户邮箱:%s 已存在", rowNo, newSysUser.Email) + msg := i18n.TTemplate(language, "user.import.emailExist", map[string]any{"id": rowNo, "email": newSysUser.Email}) failureNum++ failureMsgArr = append(failureMsgArr, msg) continue } } else { - // 用户编号:%s 用户邮箱 %s 格式错误 - msg := i18n.TTemplate(language, "user.import.emailFormat", map[string]any{"id": row["A"], "email": newSysUser.Email}) + // msg := fmt.Sprintf("用户编号:%s 用户邮箱:%s 格式错误", rowNo, newSysUser.Email) + msg := i18n.TTemplate(language, "user.import.emailFormat", map[string]any{"id": rowNo, "email": newSysUser.Email}) failureNum++ failureMsgArr = append(failureMsgArr, msg) continue } } - // 验证是否存在这个用户 - userInfo := s.sysUserService.SelectUserByUserName(newSysUser.UserName) - if userInfo.UserName != newSysUser.UserName { - newSysUser.CreateBy = operName - insertId := s.sysUserService.InsertUser(newSysUser) - if insertId != "" { - // 用户编号:%s 登录名称 %s 导入成功 - msg := i18n.TTemplate(language, "user.import.success", map[string]any{"id": row["A"], "name": newSysUser.UserName}) + if newSysUser.UserId <= 0 { + newSysUser.CreateBy = operaName + if s.sysUserService.Insert(newSysUser) > 0 { + // msg := fmt.Sprintf("用户编号:%s 登录名称:%s 导入成功", rowNo, newSysUser.UserName) + msg := i18n.TTemplate(language, "user.import.success", map[string]any{"id": rowNo, "name": newSysUser.UserName}) successNum++ successMsgArr = append(successMsgArr, msg) } else { - // 用户编号:%s 登录名称 %s 导入失败 - msg := i18n.TTemplate(language, "user.import.fail", map[string]any{"id": row["A"], "name": newSysUser.UserName}) + // msg := fmt.Sprintf("用户编号:%s 登录名称:%s 导入失败", rowNo, newSysUser.UserName) + msg := i18n.TTemplate(language, "user.import.fail", map[string]any{"id": rowNo, "name": newSysUser.UserName}) failureNum++ failureMsgArr = append(failureMsgArr, msg) } @@ -771,18 +782,18 @@ func (s *SysUserController) ImportData(c *gin.Context) { } // 如果用户已存在 同时 是否更新支持 - if userInfo.UserName == newSysUser.UserName && isUpdateSupport { - newSysUser.UserID = userInfo.UserID - newSysUser.UpdateBy = operName - rows := s.sysUserService.UpdateUser(newSysUser) + if newSysUser.UserId > 0 && body.Update { + newSysUser.Password = "" // 密码不更新 + newSysUser.UpdateBy = operaName + rows := s.sysUserService.Update(newSysUser) if rows > 0 { - // 用户编号:%s 登录名称 %s 更新成功 - msg := i18n.TTemplate(language, "user.import.successUpdate", map[string]any{"id": row["A"], "name": newSysUser.UserName}) + // msg := fmt.Sprintf("用户编号:%s 登录名称:%s 更新成功", rowNo, newSysUser.UserName) + msg := i18n.TTemplate(language, "user.import.successUpdate", map[string]any{"id": rowNo, "name": newSysUser.UserName}) successNum++ successMsgArr = append(successMsgArr, msg) } else { - // 用户编号:%s 登录名称 %s 更新失败 - msg := i18n.TTemplate(language, "user.import.failUpdate", map[string]any{"id": row["A"], "name": newSysUser.UserName}) + // msg := fmt.Sprintf("用户编号:%s 登录名称:%s 更新失败", rowNo, newSysUser.UserName) + msg := i18n.TTemplate(language, "user.import.failUpdate", map[string]any{"id": rowNo, "name": newSysUser.UserName}) failureNum++ failureMsgArr = append(failureMsgArr, msg) } @@ -792,14 +803,13 @@ func (s *SysUserController) ImportData(c *gin.Context) { message := "" if failureNum > 0 { - // 很抱歉,导入失败!共 %d 条数据格式不正确,错误如下: + // msg := fmt.Sprintf("很抱歉,导入失败!共 %d 条数据格式不正确,错误如下:", failureNum) msg := i18n.TTemplate(language, "user.import.failTip", map[string]any{"num": failureNum}) message = strings.Join(append([]string{msg}, failureMsgArr...), "
") } else { - // 恭喜您,数据已全部导入成功!共 %d 条,数据如下: + // msg := fmt.Sprintf("恭喜您,数据已全部导入成功!共 %d 条,数据如下:", successNum) msg := i18n.TTemplate(language, "user.import.successTip", map[string]any{"num": successNum}) message = strings.Join(append([]string{msg}, successMsgArr...), "
") } - - c.JSON(200, result.OkMsg(message)) + c.JSON(200, resp.OkMsg(message)) } diff --git a/src/modules/system/model/sys_config.go b/src/modules/system/model/sys_config.go index 8949c67b..90c45a0d 100644 --- a/src/modules/system/model/sys_config.go +++ b/src/modules/system/model/sys_config.go @@ -1,25 +1,21 @@ package model -// 参数配置对象 sys_config +// SysConfig 参数配置表 type SysConfig struct { - // 参数主键 - ConfigID string `json:"configId"` - // 参数名称 - ConfigName string `json:"configName" binding:"required"` - // 参数键名 - ConfigKey string `json:"configKey" binding:"required"` - // 参数键值 - ConfigValue string `json:"configValue" binding:"required"` - // 系统内置(Y是 N否) - ConfigType string `json:"configType"` - // 创建者 - CreateBy string `json:"createBy"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 更新者 - UpdateBy string `json:"updateBy"` - // 更新时间 - UpdateTime int64 `json:"updateTime"` - // 备注 - Remark string `json:"remark"` + ConfigId int64 `json:"configId" gorm:"column:config_id;primaryKey;autoIncrement"` // 参数ID + ConfigName string `json:"configName" gorm:"column:config_name" binding:"required"` // 参数名称 + ConfigKey string `json:"configKey" gorm:"column:config_key" binding:"required"` // 参数键名 + ConfigValue string `json:"configValue" gorm:"column:config_value" binding:"required"` // 参数键值 + ConfigType string `json:"configType" gorm:"column:config_type"` // 系统内置(Y是 N否) + DelFlag string `json:"-" gorm:"column:del_flag"` // 删除标记(0存在 1删除) + 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"` // 备注 +} + +// TableName 表名称 +func (*SysConfig) TableName() string { + return "sys_config" } diff --git a/src/modules/system/model/sys_dept.go b/src/modules/system/model/sys_dept.go index b7a08f1e..f1829e49 100644 --- a/src/modules/system/model/sys_dept.go +++ b/src/modules/system/model/sys_dept.go @@ -1,41 +1,28 @@ package model -// SysDept 部门对象 sys_dept +// SysDept 部门表 type SysDept struct { - // 部门ID - DeptID string `json:"deptId"` - // 父部门ID - ParentID string `json:"parentId" binding:"required"` - // 祖级列表 - Ancestors string `json:"ancestors"` - // 部门名称 - DeptName string `json:"deptName" binding:"required"` - // 显示顺序 - OrderNum int `json:"orderNum"` - // 负责人 - Leader string `json:"leader"` - // 联系电话 - Phone string `json:"phone"` - // 邮箱 - Email string `json:"email"` - // 部门状态(0正常 1停用) - Status string `json:"status"` - // 删除标志(0代表存在 1代表删除) - DelFlag string `json:"delFlag"` - // 创建者 - CreateBy string `json:"createBy"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 更新者 - UpdateBy string `json:"updateBy"` - // 更新时间 - UpdateTime int64 `json:"updateTime"` + DeptId int64 `json:"deptId" gorm:"column:dept_id;primaryKey;autoIncrement"` // 部门ID + ParentId int64 `json:"parentId" gorm:"column:parent_id" binding:"required"` // 父部门ID 默认0 + Ancestors string `json:"ancestors" gorm:"column:ancestors"` // 祖级列表 + DeptName string `json:"deptName" gorm:"column:dept_name" binding:"required"` // 部门名称 + DeptSort int64 `json:"deptSort" gorm:"column:dept_sort"` // 显示顺序 + Leader string `json:"leader" gorm:"column:leader"` // 负责人 + Phone string `json:"phone" gorm:"column:phone"` // 联系电话 + Email string `json:"email" gorm:"column:email"` // 邮箱 + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 部门状态(0停用 1正常) + DelFlag string `json:"-" gorm:"column:del_flag"` // 删除标记(0存在 1删除) + 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"` // 更新时间 // ====== 非数据库字段属性 ====== - // 子部门列表 - Children []SysDept `json:"children,omitempty"` - - // 父部门名称 - ParentName string `json:"parentName,omitempty"` + Children []SysDept `json:"children,omitempty" gorm:"-"` // 子部门列表 +} + +// TableName 表名称 +func (*SysDept) TableName() string { + return "sys_dept" } diff --git a/src/modules/system/model/sys_dict_data.go b/src/modules/system/model/sys_dict_data.go index 7c8cd06a..e79946ec 100644 --- a/src/modules/system/model/sys_dict_data.go +++ b/src/modules/system/model/sys_dict_data.go @@ -1,31 +1,24 @@ package model -// SysDictData 字典数据对象 sys_dict_data +// SysDictData 字典数据表 type SysDictData struct { - // 字典编码 - DictCode string `json:"dictCode"` - // 字典排序 - DictSort int `json:"dictSort"` - // 字典标签 - DictLabel string `json:"dictLabel" binding:"required"` - // 字典键值 - DictValue string `json:"dictValue" binding:"required"` - // 字典类型 - DictType string `json:"dictType" binding:"required"` - // 样式属性(样式扩展) - TagClass string `json:"tagClass"` - // 标签类型(预设颜色) - TagType string `json:"tagType"` - // 状态(0停用 1正常) - Status string `json:"status"` - // 创建者 - CreateBy string `json:"createBy"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 更新者 - UpdateBy string `json:"updateBy"` - // 更新时间 - UpdateTime int64 `json:"updateTime"` - // 备注 - Remark string `json:"remark"` + DataId int64 `json:"dataId" gorm:"column:data_id;primaryKey;autoIncrement"` // 数据ID + DictType string `json:"dictType" gorm:"column:dict_type" binding:"required"` // 字典类型 + DataLabel string `json:"dataLabel" gorm:"column:data_label" binding:"required"` // 数据标签 + DataValue string `json:"dataValue" gorm:"column:data_value" binding:"required"` // 数据键值 + DataSort int64 `json:"dataSort" gorm:"column:data_sort"` // 数据排序 + TagClass string `json:"tagClass" gorm:"column:tag_class"` // 样式属性(样式扩展) + TagType string `json:"tagType" gorm:"column:tag_type"` // 标签类型(预设颜色) + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 状态(0停用 1正常) + DelFlag string `json:"-" gorm:"column:del_flag"` // 删除标记(0存在 1删除) + 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"` // 备注 +} + +// TableName 表名称 +func (*SysDictData) TableName() string { + return "sys_dict_data" } diff --git a/src/modules/system/model/sys_dict_type.go b/src/modules/system/model/sys_dict_type.go index 0ad0b1ab..af6c2f81 100644 --- a/src/modules/system/model/sys_dict_type.go +++ b/src/modules/system/model/sys_dict_type.go @@ -1,23 +1,20 @@ package model -// SysDictType 字典类型对象 sys_dict_type +// SysDictType 字典类型表 type SysDictType struct { - // 字典主键 - DictID string `json:"dictId"` - // 字典名称 - DictName string `json:"dictName" binding:"required"` - // 字典类型 - DictType string `json:"dictType" binding:"required"` - // 状态(0停用 1正常) - Status string `json:"status"` - // 创建者 - CreateBy string `json:"createBy"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 更新者 - UpdateBy string `json:"updateBy"` - // 更新时间 - UpdateTime int64 `json:"updateTime"` - // 备注 - Remark string `json:"remark"` + DictId int64 `json:"dictId" gorm:"column:dict_id;primaryKey;autoIncrement"` // 字典ID + DictName string `json:"dictName" gorm:"column:dict_name" binding:"required"` // 字典名称 + DictType string `json:"dictType" gorm:"column:dict_type" binding:"required"` // 字典类型 + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 状态(0停用 1正常) + DelFlag string `json:"-" gorm:"column:del_flag"` // 删除标记(0存在 1删除) + 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"` // 备注 +} + +// TableName 表名称 +func (*SysDictType) TableName() string { + return "sys_dict_type" } diff --git a/src/modules/system/model/sys_i18n.go b/src/modules/system/model/sys_i18n.go new file mode 100644 index 00000000..32e56720 --- /dev/null +++ b/src/modules/system/model/sys_i18n.go @@ -0,0 +1,19 @@ +package model + +// SysI18n 系统_多语言 sys_i18n +type SysI18n struct { + ID int64 `json:"id" gorm:"column:config_id;primaryKey;autoIncrement"` // ID + DelFlag string `json:"delFlag" gorm:"column:del_flag"` // 删除标记(0存在 1删除) + 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"` // 更新时间 + Key string `json:"key" gorm:"column:key"` // 多语言属性名 + ValueZh string `json:"valueZh" gorm:"column:value_zh"` // 中文 + ValueEn string `json:"valueEn" gorm:"column:value_en"` // 英文 +} + +// TableName 表名称 +func (*SysI18n) TableName() string { + return "sys_i18n" +} diff --git a/src/modules/system/model/sys_log_login.go b/src/modules/system/model/sys_log_login.go index 8548f8de..28d8de7f 100644 --- a/src/modules/system/model/sys_log_login.go +++ b/src/modules/system/model/sys_log_login.go @@ -1,23 +1,19 @@ package model -// SysLogLogin 系统登录日志表 sys_log_login +// SysLogLogin 系统登录日志表 type SysLogLogin struct { - // 登录ID - LoginID string `json:"loginId"` - // 用户账号 - UserName string `json:"userName"` - // 登录IP地址 - IPAddr string `json:"ipaddr"` - // 登录地点 - LoginLocation string `json:"loginLocation"` - // 浏览器类型 - Browser string `json:"browser"` - // 操作系统 - OS string `json:"os"` - // 登录状态(0失败 1成功) - Status string `json:"status"` - // 提示消息 - Msg string `json:"msg"` - // 访问时间 - LoginTime int64 `json:"loginTime"` + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 登录ID + UserName string `json:"userName" gorm:"column:user_name"` // 用户账号 + LoginIp string `json:"loginIp" gorm:"column:login_ip"` // 登录IP地址 + LoginLocation string `json:"loginLocation" gorm:"column:login_location"` // 登录地点 + Browser string `json:"browser" gorm:"column:browser"` // 浏览器类型 + OS string `json:"os" gorm:"column:os"` // 操作系统 + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 登录状态(0失败 1成功) + Msg string `json:"msg" gorm:"column:msg"` // 提示消息 + LoginTime int64 `json:"loginTime" gorm:"column:login_time"` // 登录时间 +} + +// TableName 表名称 +func (*SysLogLogin) TableName() string { + return "sys_log_login" } diff --git a/src/modules/system/model/sys_log_operate.go b/src/modules/system/model/sys_log_operate.go index 3a0b6041..ba77f018 100644 --- a/src/modules/system/model/sys_log_operate.go +++ b/src/modules/system/model/sys_log_operate.go @@ -1,37 +1,24 @@ package model -// SysLogOperate 系统操作日志表 sys_log_operate +// SysLogOperate 系统操作日志表 type SysLogOperate struct { - // 日志主键 - OperID string `json:"operId"` - // 模块标题 - Title string `json:"title"` - // 业务类型(0其它 1新增 2修改 3删除 4授权 5导出 6导入 7强退 8清空数据) - BusinessType string `json:"businessType"` - // 方法名称 - Method string `json:"method"` - // 请求方式 - RequestMethod string `json:"requestMethod"` - // 操作人员类别(0其它 1后台用户 2手机端用户) - OperatorType string `json:"operatorType"` - // 操作人员 - OperName string `json:"operName"` - // 部门名称 - DeptName string `json:"deptName"` - // 请求URL - OperURL string `json:"operUrl"` - // 主机地址 - OperIP string `json:"operIp"` - // 操作地点 - OperLocation string `json:"operLocation"` - // 请求参数 - OperParam string `json:"operParam"` - // 操作消息 - OperMsg string `json:"operMsg"` - // 操作状态(0异常 1正常) - Status string `json:"status"` - // 操作时间 - OperTime int64 `json:"operTime"` - // 消耗时间(毫秒) - CostTime int64 `json:"costTime"` + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 操作ID + Title string `json:"title" gorm:"column:title"` // 模块标题 + BusinessType string `json:"businessType" gorm:"column:business_type"` // 业务类型(0其它 1新增 2修改 3删除 4授权 5导出 6导入 7强退 8清空数据) + OperaUrl string `json:"operaUrl" gorm:"column:opera_url"` // 请求URL + OperaUrlMethod string `json:"operaUrlMethod" gorm:"column:opera_url_method"` // 请求方式 + OperaIp string `json:"operaIp" gorm:"column:opera_ip"` // 主机地址 + OperaLocation string `json:"operaLocation" gorm:"column:opera_location"` // 操作地点 + OperaParam string `json:"operaParam" gorm:"column:opera_param"` // 请求参数 + OperaMsg string `json:"operaMsg" gorm:"column:opera_msg"` // 操作消息 + OperaMethod string `json:"operaMethod" gorm:"column:opera_method"` // 方法名称 + OperaBy string `json:"operaBy" gorm:"column:opera_by"` // 操作人员 + OperaTime int64 `json:"operaTime" gorm:"column:opera_time"` // 操作时间 + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 操作状态(0异常 1正常) + CostTime int64 `json:"costTime" gorm:"column:cost_time"` // 消耗时间(毫秒) +} + +// TableName 表名称 +func (*SysLogOperate) TableName() string { + return "sys_log_operate" } diff --git a/src/modules/system/model/sys_menu.go b/src/modules/system/model/sys_menu.go index 397e30eb..a1b6125e 100644 --- a/src/modules/system/model/sys_menu.go +++ b/src/modules/system/model/sys_menu.go @@ -1,46 +1,33 @@ package model -// SysMenu 菜单权限对象 sys_menu +// SysMenu 菜单权限表 type SysMenu struct { - // 菜单ID - MenuID string `json:"menuId"` - // 菜单名称 - MenuName string `json:"menuName" binding:"required"` - // 父菜单ID 默认0 - ParentID string `json:"parentId" binding:"required"` - // 显示顺序 - MenuSort int `json:"menuSort"` - // 路由地址 - Path string `json:"path"` - // 组件路径 - Component string `json:"component"` - // 是否内部跳转(0否 1是) - IsFrame string `json:"isFrame"` - // 是否缓存(0不缓存 1缓存) - IsCache string `json:"isCache"` - // 菜单类型(D目录 M菜单 B按钮) - MenuType string `json:"menuType" binding:"required"` - // 是否显示(0隐藏 1显示) - Visible string `json:"visible"` - // 菜单状态(0停用 1正常) - Status string `json:"status"` - // 权限标识 - Perms string `json:"perms"` - // 菜单图标(#无图标) - Icon string `json:"icon"` - // 创建者 - CreateBy string `json:"createBy"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 更新者 - UpdateBy string `json:"updateBy"` - // 更新时间 - UpdateTime int64 `json:"updateTime"` - // 备注 - Remark string `json:"remark"` + MenuId int64 `json:"menuId" gorm:"column:menu_id;primaryKey;autoIncrement"` // 菜单ID + MenuName string `json:"menuName" gorm:"column:menu_name" binding:"required"` // 菜单名称 + ParentId int64 `json:"parentId" gorm:"column:parent_id"` // 父菜单ID 默认0 + MenuSort int64 `json:"menuSort" gorm:"column:menu_sort"` // 显示顺序 + MenuPath string `json:"menuPath" gorm:"column:menu_path"` // 路由地址 + Component string `json:"component" gorm:"column:component"` // 组件路径 + FrameFlag string `json:"frameFlag" gorm:"column:frame_flag"` // 内部跳转标记(0否 1是) + CacheFlag string `json:"cacheFlag" gorm:"column:cache_flag"` // 缓存标记(0不缓存 1缓存) + MenuType string `json:"menuType" gorm:"column:menu_type" binding:"required"` // 菜单类型(D目录 M菜单 A访问权限) + VisibleFlag string `json:"visibleFlag" gorm:"column:visible_flag"` // 是否显示(0隐藏 1显示) + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 菜单状态(0停用 1正常) + Perms string `json:"perms" gorm:"column:perms"` // 权限标识 + Icon string `json:"icon" gorm:"column:icon"` // 菜单图标(#无图标) + DelFlag string `json:"-" gorm:"column:del_flag"` // 删除标记(0存在 1删除) + 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"` // 备注 // ====== 非数据库字段属性 ====== - // 子菜单 - Children []SysMenu `json:"children,omitempty"` + Children []SysMenu `json:"children,omitempty" gorm:"-"` // 子菜单 +} + +// TableName 表名称 +func (*SysMenu) TableName() string { + return "sys_menu" } diff --git a/src/modules/system/model/sys_notice.go b/src/modules/system/model/sys_notice.go deleted file mode 100644 index dc33097a..00000000 --- a/src/modules/system/model/sys_notice.go +++ /dev/null @@ -1,27 +0,0 @@ -package model - -// SysNotice 通知公告对象 sys_notice -type SysNotice struct { - // 公告ID - NoticeID string `json:"noticeId"` - // 公告标题 - NoticeTitle string `json:"noticeTitle" binding:"required"` - // 公告类型(1通知 2公告) - NoticeType string `json:"noticeType" binding:"required"` - // 公告内容 - NoticeContent string `json:"noticeContent" binding:"required"` - // 公告状态(0关闭 1正常) - Status string `json:"status"` - // 删除标志(0代表存在 1代表删除) - DelFlag string `json:"delFlag"` - // 创建者 - CreateBy string `json:"createBy"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 更新者 - UpdateBy string `json:"updateBy"` - // 更新时间 - UpdateTime int64 `json:"updateTime"` - // 备注 - Remark string `json:"remark"` -} diff --git a/src/modules/system/model/sys_post.go b/src/modules/system/model/sys_post.go index 7b651971..23fbce1c 100644 --- a/src/modules/system/model/sys_post.go +++ b/src/modules/system/model/sys_post.go @@ -1,25 +1,21 @@ package model -// SysPost 岗位对象 sys_post +// SysPost 岗位信息表 type SysPost struct { - // 岗位ID - PostID string `json:"postId"` - // 岗位编码 - PostCode string `json:"postCode" binding:"required"` - // 岗位名称 - PostName string `json:"postName" binding:"required"` - // 显示顺序 - PostSort int `json:"postSort"` - // 状态(0停用 1正常) - Status string `json:"status"` - // 创建者 - CreateBy string `json:"createBy"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 更新者 - UpdateBy string `json:"updateBy"` - // 更新时间 - UpdateTime int64 `json:"updateTime"` - // 备注 - Remark string `json:"remark"` + PostId int64 `json:"postId" gorm:"column:post_id;primaryKey;autoIncrement"` // 岗位ID + PostCode string `json:"postCode" gorm:"column:post_code" binding:"required"` // 岗位编码 + PostName string `json:"postName" gorm:"column:post_name" binding:"required"` // 岗位名称 + PostSort int64 `json:"postSort" gorm:"column:post_sort"` // 显示顺序 + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 状态(0停用 1正常) + DelFlag string `json:"-" gorm:"column:del_flag"` // 删除标记(0存在 1删除) + 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"` // 备注 +} + +// TableName 表名称 +func (*SysPost) TableName() string { + return "sys_post" } diff --git a/src/modules/system/model/sys_role.go b/src/modules/system/model/sys_role.go index c4a8d9eb..ce0b4a57 100644 --- a/src/modules/system/model/sys_role.go +++ b/src/modules/system/model/sys_role.go @@ -1,40 +1,29 @@ package model -// SysRole 角色对象 sys_role +// SysRole 角色信息表 type SysRole struct { - // 角色ID - RoleID string `json:"roleId"` - // 角色名称 - RoleName string `json:"roleName" binding:"required"` - // 角色键值 - RoleKey string `json:"roleKey" binding:"required"` - // 显示顺序 - RoleSort int `json:"roleSort"` - // 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限) - DataScope string `json:"dataScope"` - // 菜单树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示) - MenuCheckStrictly string `json:"menuCheckStrictly"` - // 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示) - DeptCheckStrictly string `json:"deptCheckStrictly"` - // 角色状态(0停用 1正常) - Status string `json:"status"` - // 删除标志(0代表存在 1代表删除) - DelFlag string `json:"delFlag"` - // 创建者 - CreateBy string `json:"createBy"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 更新者 - UpdateBy string `json:"updateBy"` - // 更新时间 - UpdateTime int64 `json:"updateTime"` - // 备注 - Remark string `json:"remark"` + RoleId int64 `json:"roleId" gorm:"column:role_id;primaryKey;autoIncrement"` // 角色ID + RoleName string `json:"roleName" gorm:"column:role_name" binding:"required"` // 角色名称 + RoleKey string `json:"roleKey" gorm:"column:role_key" binding:"required"` // 角色键值 + RoleSort int64 `json:"roleSort" gorm:"column:role_sort"` // 显示顺序 + DataScope string `json:"dataScope" gorm:"column:data_scope"` // 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限) + MenuCheckStrictly string `json:"menuCheckStrictly" gorm:"column:menu_check_strictly"` // 菜单树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示) + DeptCheckStrictly string `json:"deptCheckStrictly" gorm:"column:dept_check_strictly"` // 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 角色状态(0停用 1正常) + DelFlag string `json:"-" gorm:"column:del_flag"` // 删除标记(0存在 1删除) + 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"` // 备注 // ====== 非数据库字段属性 ====== - // 菜单组 - MenuIds []string `json:"menuIds,omitempty"` - // 部门组(数据权限) - DeptIds []string `json:"deptIds,omitempty"` + MenuIds []int64 `json:"menuIds,omitempty" gorm:"-"` // 菜单组 + DeptIds []int64 `json:"deptIds,omitempty" gorm:"-"` // 部门组(数据权限) +} + +// TableName 表名称 +func (*SysRole) TableName() string { + return "sys_role" } diff --git a/src/modules/system/model/sys_role_dept.go b/src/modules/system/model/sys_role_dept.go index 29f98405..7b23a382 100644 --- a/src/modules/system/model/sys_role_dept.go +++ b/src/modules/system/model/sys_role_dept.go @@ -1,15 +1,12 @@ package model -// SysRoleDept 角色和部门关联对象 sys_role_dept +// SysRoleDept 角色和部门关联表 type SysRoleDept struct { - RoleID string `json:"roleId"` // 角色ID - DeptID string `json:"deptId"` // 部门ID + RoleId int64 `json:"roleId" gorm:"column:role_id"` // 角色ID + DeptId int64 `json:"deptId" gorm:"column:dept_id"` // 部门ID } -// NewSysRoleDept 创建角色和部门关联对象的构造函数 -func NewSysRoleDept(roleID string, deptID string) SysRoleDept { - return SysRoleDept{ - RoleID: roleID, - DeptID: deptID, - } +// TableName 表名称 +func (*SysRoleDept) TableName() string { + return "sys_role_dept" } diff --git a/src/modules/system/model/sys_role_menu.go b/src/modules/system/model/sys_role_menu.go index 3d5f74df..a2a65347 100644 --- a/src/modules/system/model/sys_role_menu.go +++ b/src/modules/system/model/sys_role_menu.go @@ -1,15 +1,12 @@ package model -// SysRoleMenu 角色和菜单关联对象 sys_role_menu +// SysRoleMenu 角色和菜单关联表 type SysRoleMenu struct { - RoleID string `json:"roleId"` // 角色ID - MenuID string `json:"menuId"` // 菜单ID + RoleId int64 `json:"roleId" gorm:"column:role_id"` // 角色ID + MenuId int64 `json:"menuId" gorm:"column:menu_id"` // 菜单ID } -// NewSysRoleMenu 创建角色和菜单关联对象的构造函数 -func NewSysRoleMenu(roleID string, menuID string) SysRoleMenu { - return SysRoleMenu{ - RoleID: roleID, - MenuID: menuID, - } +// TableName 表名称 +func (*SysRoleMenu) TableName() string { + return "sys_role_menu" } diff --git a/src/modules/system/model/sys_user.go b/src/modules/system/model/sys_user.go index c580784f..d4eef3e0 100644 --- a/src/modules/system/model/sys_user.go +++ b/src/modules/system/model/sys_user.go @@ -1,56 +1,35 @@ package model -// SysUser 用户对象 sys_user +// SysUser 用户信息表 type SysUser struct { - // 用户ID - UserID string `json:"userId"` - // 部门ID - DeptID string `json:"deptId"` - // 用户账号 - UserName string `json:"userName" binding:"required"` - // 用户昵称 - NickName string `json:"nickName" binding:"required"` - // 用户类型(sys系统用户) - UserType string `json:"userType"` - // 用户邮箱 - Email string `json:"email"` - // 手机号码 - PhoneNumber string `json:"phonenumber"` - // 用户性别(0未知 1男 2女) - Sex string `json:"sex"` - // 头像地址 - Avatar string `json:"avatar"` - // 密码 - Password string `json:"-"` - // 帐号状态(0停用 1正常) - Status string `json:"status"` - // 删除标志(0代表存在 1代表删除) - DelFlag string `json:"delFlag"` - // 最后登录IP - LoginIP string `json:"loginIp"` - // 最后登录时间 - LoginDate int64 `json:"loginDate"` - // 创建者 - CreateBy string `json:"createBy"` - // 创建时间 - CreateTime int64 `json:"createTime"` - // 更新者 - UpdateBy string `json:"updateBy"` - // 更新时间 - UpdateTime int64 `json:"updateTime"` - // 备注 - Remark string `json:"remark"` + UserId int64 `json:"userId" gorm:"column:user_id;primaryKey;autoIncrement"` // 用户ID + DeptId int64 `json:"deptId" gorm:"column:dept_id"` // 部门ID + UserName string `json:"userName" gorm:"column:user_name"` // 用户账号 + Email string `json:"email" gorm:"column:email"` // 用户邮箱 + Phone string `json:"phone" gorm:"column:phone"` // 手机号码 + NickName string `json:"nickName" gorm:"column:nick_name"` // 用户昵称 + Sex string `json:"sex" gorm:"column:sex"` // 用户性别(0未选择 1男 2女) + Avatar string `json:"avatar" gorm:"column:avatar"` // 头像地址 + Password string `json:"-" gorm:"column:password"` // 密码 + StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 账号状态(0停用 1正常) + DelFlag string `json:"-" gorm:"column:del_flag"` // 删除标记(0存在 1删除) + LoginIp string `json:"loginIp" gorm:"column:login_ip"` // 最后登录IP + LoginTime int64 `json:"loginTime" gorm:"column:login_time"` // 最后登录时间 + 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"` // 备注 // ====== 非数据库字段属性 ====== - // 部门对象 - Dept SysDept `json:"dept,omitempty" binding:"structonly"` - // 角色对象组 - Roles []SysRole `json:"roles"` - // 角色ID - RoleID string `json:"roleId,omitempty"` - // 角色组 - RoleIDs []string `json:"roleIds,omitempty"` - // 岗位组 - PostIDs []string `json:"postIds,omitempty"` + Dept *SysDept `json:"dept" gorm:"-"` // 部门对象 + Roles []*SysRole `json:"roles" gorm:"-"` // 角色对象组 + RoleIds []int64 `json:"roleIds,omitempty" gorm:"-"` // 角色组 + PostIds []int64 `json:"postIds,omitempty" gorm:"-"` // 岗位组 +} + +// TableName 表名称 +func (*SysUser) TableName() string { + return "sys_user" } diff --git a/src/modules/system/model/sys_user_post.go b/src/modules/system/model/sys_user_post.go index 557cd2e9..1931893d 100644 --- a/src/modules/system/model/sys_user_post.go +++ b/src/modules/system/model/sys_user_post.go @@ -1,15 +1,12 @@ package model -// SysUserPost 用户和岗位关联对象 sys_user_post +// SysUserPost 用户与岗位关联表 type SysUserPost struct { - UserID string `json:"userId"` // 用户ID - PostID string `json:"postId"` // 岗位ID + UserId int64 `json:"userId" gorm:"column:user_id"` // 用户ID + PostId int64 `json:"postId" gorm:"column:post_id"` // 岗位ID } -// NewSysUserPost 创建用户和岗位关联对象的构造函数 -func NewSysUserPost(userID string, postID string) SysUserPost { - return SysUserPost{ - UserID: userID, - PostID: postID, - } +// TableName 表名称 +func (*SysUserPost) TableName() string { + return "sys_user_post" } diff --git a/src/modules/system/model/sys_user_role.go b/src/modules/system/model/sys_user_role.go index e2c44a78..72c10a5e 100644 --- a/src/modules/system/model/sys_user_role.go +++ b/src/modules/system/model/sys_user_role.go @@ -1,15 +1,12 @@ package model -// SysUserRole 用户和角色关联对象 sys_user_role +// SysUserRole 用户和角色关联表 type SysUserRole struct { - UserID string `json:"userId"` // 用户ID - RoleID string `json:"roleId"` // 角色ID + UserId int64 `json:"userId" gorm:"column:user_id"` // 用户ID + RoleId int64 `json:"roleId" gorm:"column:role_id"` // 角色ID } -// NewSysUserRole 创建用户和角色关联对象的构造函数 -func NewSysUserRole(userID string, roleID string) SysUserRole { - return SysUserRole{ - UserID: userID, - RoleID: roleID, - } +// TableName 表名称 +func (*SysUserRole) TableName() string { + return "sys_user_role" } diff --git a/src/modules/system/model/vo/router.go b/src/modules/system/model/vo/router.go new file mode 100644 index 00000000..ccfe366c --- /dev/null +++ b/src/modules/system/model/vo/router.go @@ -0,0 +1,21 @@ +package vo + +// Router 路由信息对象 +type Router struct { + Name string `json:"name"` // 路由名字 英文首字母大写 + Path string `json:"path"` // 路由地址 + Meta RouterMeta `json:"meta"` // 其他元素 + Component string `json:"component"` // 组件地址 + Redirect string `json:"redirect"` // 重定向地址 + Children []Router `json:"children,omitempty"` // 子路由 +} + +// RouterMeta 路由元信息对象 +type RouterMeta struct { + Title string `json:"title"` // 设置该菜单在侧边栏和面包屑中展示的名字 + Icon string `json:"icon"` // 设置该菜单的图标 + Cache bool `json:"cache"` // 设置为true,则不会被 缓存 + Target string `json:"target"` // 内链地址(http(s)://开头), 打开目标位置 '_blank' | '_self' | '' + HideChildInMenu bool `json:"hideChildInMenu"` // 在菜单中隐藏子节点 + HideInMenu bool `json:"hideInMenu"` // 在菜单中隐藏自己和子节点 +} diff --git a/src/modules/system/model/vo/tree_select.go b/src/modules/system/model/vo/tree_select.go new file mode 100644 index 00000000..be5bd76c --- /dev/null +++ b/src/modules/system/model/vo/tree_select.go @@ -0,0 +1,46 @@ +package vo + +import "be.ems/src/modules/system/model" + +// TreeSelect 树结构实体类 +type TreeSelect struct { + ID int64 `json:"id"` // 节点ID + Label string `json:"label"` // 节点名称 + Children []TreeSelect `json:"children"` // 子节点 +} + +// SysMenuTreeSelect 使用给定的 SysMenu 对象解析为 TreeSelect 对象 +func SysMenuTreeSelect(sysMenu model.SysMenu) TreeSelect { + t := TreeSelect{} + t.ID = sysMenu.MenuId + t.Label = sysMenu.MenuName + + if len(sysMenu.Children) > 0 { + for _, menu := range sysMenu.Children { + child := SysMenuTreeSelect(menu) + t.Children = append(t.Children, child) + } + } else { + t.Children = []TreeSelect{} + } + + return t +} + +// SysDeptTreeSelect 使用给定的 SysDept 对象解析为 TreeSelect 对象 +func SysDeptTreeSelect(sysDept model.SysDept) TreeSelect { + t := TreeSelect{} + t.ID = sysDept.DeptId + t.Label = sysDept.DeptName + + if len(sysDept.Children) > 0 { + for _, dept := range sysDept.Children { + child := SysDeptTreeSelect(dept) + t.Children = append(t.Children, child) + } + } else { + t.Children = []TreeSelect{} + } + + return t +} diff --git a/src/modules/system/repository/sys_config.go b/src/modules/system/repository/sys_config.go index 9755fb06..cd228807 100644 --- a/src/modules/system/repository/sys_config.go +++ b/src/modules/system/repository/sys_config.go @@ -1,30 +1,200 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "fmt" + "time" -// ISysConfig 参数配置表 数据层接口 -type ISysConfig interface { - // SelectDictDataPage 分页查询参数配置列表数据 - SelectConfigPage(query map[string]any) map[string]any + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) - // SelectConfigList 查询参数配置列表 - SelectConfigList(sysConfig model.SysConfig) []model.SysConfig +// NewSysConfig 实例化数据层 +var NewSysConfig = &SysConfig{} - // SelectConfigValueByKey 通过参数键名查询参数键值 - SelectConfigValueByKey(configKey string) string +// SysConfig 参数配置表 数据层处理 +type SysConfig struct{} - // SelectConfigByIds 通过配置ID查询参数配置信息 - SelectConfigByIds(configIds []string) []model.SysConfig +// SelectByPage 分页查询集合 +func (r SysConfig) SelectByPage(query map[string]string) ([]model.SysConfig, int64) { + tx := db.DB("").Model(&model.SysConfig{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if v, ok := query["configName"]; ok && v != "" { + tx = tx.Where("config_name like concat(?, '%')", v) + } + if v, ok := query["configType"]; ok && v != "" { + tx = tx.Where("config_type = ?", v) + } + if v, ok := query["configKey"]; ok && v != "" { + tx = tx.Where("config_key like concat(?, '%')", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s000", v) + tx = tx.Where("create_time >= ?", v) + } else if len(v) == 13 { + tx = tx.Where("create_time >= ?", v) + } + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s999", v) + tx = tx.Where("create_time <= ?", v) + } else if len(v) == 13 { + tx = tx.Where("create_time <= ?", v) + } + } - // CheckUniqueConfig 校验配置参数是否唯一 - CheckUniqueConfig(sysConfig model.SysConfig) string + // 查询结果 + var total int64 = 0 + rows := []model.SysConfig{} - // InsertConfig 新增参数配置 - InsertConfig(sysConfig model.SysConfig) string + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } - // UpdateConfig 修改参数配置 - UpdateConfig(sysConfig model.SysConfig) int64 - - // DeleteConfigByIds 批量删除参数配置信息 - DeleteConfigByIds(configIds []string) int64 + // 查询数据分页 + 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 + } + return rows, total +} + +// Select 查询集合 +func (r SysConfig) Select(sysConfig model.SysConfig) []model.SysConfig { + tx := db.DB("").Model(&model.SysConfig{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if sysConfig.ConfigName != "" { + tx = tx.Where("config_name like concat(?, '%')", sysConfig.ConfigName) + } + if sysConfig.ConfigType != "" { + tx = tx.Where("config_type = ?", sysConfig.ConfigType) + } + if sysConfig.ConfigKey != "" { + tx = tx.Where("config_key like concat(?, '%')", sysConfig.ConfigKey) + } + if sysConfig.CreateTime > 0 { + tx = tx.Where("create_time >= ?", sysConfig.CreateTime) + } + + // 查询数据 + rows := []model.SysConfig{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询信息 +func (r SysConfig) SelectByIds(configIds []int64) []model.SysConfig { + rows := []model.SysConfig{} + if len(configIds) <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysConfig{}) + // 构建查询条件 + tx = tx.Where("config_id in ? and del_flag = '0'", configIds) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 返回新增数据ID +func (r SysConfig) Insert(sysConfig model.SysConfig) int64 { + sysConfig.DelFlag = "0" + if sysConfig.CreateBy != "" { + ms := time.Now().UnixMilli() + sysConfig.UpdateBy = sysConfig.CreateBy + sysConfig.UpdateTime = ms + sysConfig.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(&sysConfig).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysConfig.ConfigId +} + +// Update 修改信息 返回受影响行数 +func (r SysConfig) Update(sysConfig model.SysConfig) int64 { + if sysConfig.ConfigId <= 0 { + return 0 + } + if sysConfig.UpdateBy != "" { + sysConfig.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.SysConfig{}) + // 构建查询条件 + tx = tx.Where("config_id = ?", sysConfig.ConfigId) + tx = tx.Omit("config_id", "del_flag", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(sysConfig).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 返回受影响行数 +func (r SysConfig) DeleteByIds(configIds []int64) int64 { + if len(configIds) <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysConfig{}) + // 构建查询条件 + tx = tx.Where("config_id in ?", configIds) + // 执行更新删除标记 + if err := tx.Update("del_flag", "1").Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 返回数据ID +func (r SysConfig) CheckUnique(sysConfig model.SysConfig) int64 { + tx := db.DB("").Model(&model.SysConfig{}) + tx = tx.Where("del_flag = 0") + // 查询条件拼接 + if sysConfig.ConfigType != "" { + tx = tx.Where("config_type = ?", sysConfig.ConfigType) + } + if sysConfig.ConfigKey != "" { + tx = tx.Where("config_key = ?", sysConfig.ConfigKey) + } + // 查询数据 + var id int64 = 0 + if err := tx.Select("config_id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id +} + +// SelectValueByKey 通过Key查询Value +func (r SysConfig) SelectValueByKey(configKey string) string { + if configKey == "" { + return "" + } + tx := db.DB("").Model(&model.SysConfig{}) + tx.Where("config_key = ? and del_flag = '0'", configKey) + // 查询数据 + var configValue string = "" + if err := tx.Select("config_value").Limit(1).Find(&configValue).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return configValue + } + return configValue } diff --git a/src/modules/system/repository/sys_config.impl.go b/src/modules/system/repository/sys_config.impl.go deleted file mode 100644 index 4b323772..00000000 --- a/src/modules/system/repository/sys_config.impl.go +++ /dev/null @@ -1,334 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "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/system/model" -) - -// 实例化数据层 SysConfigImpl 结构体 -var NewSysConfigImpl = &SysConfigImpl{ - selectSql: `select - config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark - from sys_config`, - - resultMap: map[string]string{ - "config_id": "ConfigID", - "config_name": "ConfigName", - "config_key": "ConfigKey", - "config_value": "ConfigValue", - "config_type": "ConfigType", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// SysConfigImpl 参数配置表 数据层处理 -type SysConfigImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysConfigImpl) convertResultRows(rows []map[string]any) []model.SysConfig { - arr := make([]model.SysConfig, 0) - for _, row := range rows { - sysConfig := model.SysConfig{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&sysConfig, keyMapper, value) - } - } - arr = append(arr, sysConfig) - } - return arr -} - -// SelectDictDataPage 分页查询参数配置列表数据 -func (r *SysConfigImpl) SelectConfigPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["configName"]; ok && v != "" { - conditions = append(conditions, "config_name like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["configType"]; ok && v != "" { - conditions = append(conditions, "config_type = ?") - params = append(params, v) - } - if v, ok := query["configKey"]; ok && v != "" { - conditions = append(conditions, "config_key like concat(?, '%')") - params = append(params, v) - } - beginTime, ok := query["beginTime"] - if !ok { - beginTime, ok = query["params[beginTime]"] - } - if ok && beginTime != "" { - conditions = append(conditions, "create_time >= ?") - params = append(params, parse.Number(beginTime.(string))) - } - endTime, ok := query["endTime"] - if !ok { - endTime, ok = query["params[endTime]"] - } - if ok && endTime != "" { - conditions = append(conditions, "create_time <= ?") - params = append(params, parse.Number(endTime.(string))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysConfig{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from sys_config" - 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) - - // 查询数据 - querySql := r.selectSql + whereSql + 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 -} - -// SelectConfigList 查询参数配置列表 -func (r *SysConfigImpl) SelectConfigList(sysConfig model.SysConfig) []model.SysConfig { - // 查询条件拼接 - var conditions []string - var params []any - if sysConfig.ConfigName != "" { - conditions = append(conditions, "config_name like concat(?, '%')") - params = append(params, sysConfig.ConfigName) - } - if sysConfig.ConfigType != "" { - conditions = append(conditions, "config_type = ?") - params = append(params, sysConfig.ConfigType) - } - if sysConfig.ConfigKey != "" { - conditions = append(conditions, "config_key like concat(?, '%')") - params = append(params, sysConfig.ConfigKey) - } - if sysConfig.CreateTime > 0 { - conditions = append(conditions, "create_time >= ?") - params = append(params, sysConfig.CreateTime) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysConfig{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectConfigValueByKey 通过参数键名查询参数键值 -func (r *SysConfigImpl) SelectConfigValueByKey(configKey string) string { - querySql := "select config_value as 'str' from sys_config where config_key = ?" - results, err := datasource.RawDB("", querySql, []any{configKey}) - if err != nil { - logger.Errorf("query err => %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// SelectConfigByIds 通过配置ID查询参数配置信息 -func (r *SysConfigImpl) SelectConfigByIds(configIds []string) []model.SysConfig { - placeholder := repo.KeyPlaceholderByQuery(len(configIds)) - querySql := r.selectSql + " where config_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(configIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysConfig{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueConfig 校验配置参数是否唯一 -func (r *SysConfigImpl) CheckUniqueConfig(sysConfig model.SysConfig) string { - // 查询条件拼接 - var conditions []string - var params []any - if sysConfig.ConfigKey != "" { - conditions = append(conditions, "config_key = ?") - params = append(params, sysConfig.ConfigKey) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select config_id as 'str' from sys_config " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// InsertConfig 新增参数配置 -func (r *SysConfigImpl) InsertConfig(sysConfig model.SysConfig) string { - // 参数拼接 - params := make(map[string]any) - if sysConfig.ConfigName != "" { - params["config_name"] = sysConfig.ConfigName - } - if sysConfig.ConfigKey != "" { - params["config_key"] = sysConfig.ConfigKey - } - if sysConfig.ConfigValue != "" { - params["config_value"] = sysConfig.ConfigValue - } - if sysConfig.ConfigType != "" { - params["config_type"] = sysConfig.ConfigType - } - if sysConfig.Remark != "" { - params["remark"] = sysConfig.Remark - } - if sysConfig.CreateBy != "" { - params["create_by"] = sysConfig.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_config (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// UpdateConfig 修改参数配置 -func (r *SysConfigImpl) UpdateConfig(sysConfig model.SysConfig) int64 { - // 参数拼接 - params := make(map[string]any) - if sysConfig.ConfigName != "" { - params["config_name"] = sysConfig.ConfigName - } - if sysConfig.ConfigKey != "" { - params["config_key"] = sysConfig.ConfigKey - } - if sysConfig.ConfigValue != "" { - params["config_value"] = sysConfig.ConfigValue - } - if sysConfig.ConfigType != "" { - params["config_type"] = sysConfig.ConfigType - } - params["remark"] = sysConfig.Remark - if sysConfig.UpdateBy != "" { - params["update_by"] = sysConfig.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update sys_config set " + strings.Join(keys, ",") + " where config_id = ?" - - // 执行更新 - values = append(values, sysConfig.ConfigID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteConfigByIds 批量删除参数配置信息 -func (r *SysConfigImpl) DeleteConfigByIds(configIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(configIds)) - sql := "delete from sys_config where config_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(configIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/system/repository/sys_dept.go b/src/modules/system/repository/sys_dept.go index 99b4aead..6a38e23f 100644 --- a/src/modules/system/repository/sys_dept.go +++ b/src/modules/system/repository/sys_dept.go @@ -1,42 +1,254 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "fmt" + "strings" + "time" -// ISysDept 部门表 数据层接口 -type ISysDept interface { - // SelectDeptList 查询部门管理数据 - SelectDeptList(sysDept model.SysDept, dataScopeSQL string) []model.SysDept + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) - // SelectDeptListByRoleId 根据角色ID查询部门树信息 - SelectDeptListByRoleId(roleId string, deptCheckStrictly bool) []string +// NewSysDept 实例化数据层 +var NewSysDept = &SysDept{} - // SelectDeptById 根据部门ID查询信息 - SelectDeptById(deptId string) model.SysDept +// SysDept 部门表 数据层处理 +type SysDept struct{} - // SelectChildrenDeptById 根据ID查询所有子部门 - SelectChildrenDeptById(deptId string) []model.SysDept +// Select 查询集合 +func (r SysDept) Select(sysDept model.SysDept, dataScopeSQL string) []model.SysDept { + tx := db.DB("").Model(&model.SysDept{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if sysDept.DeptId > 0 { + tx = tx.Where("dept_id = ?", sysDept.DeptId) + } + if sysDept.ParentId > 0 { + tx = tx.Where("parent_id = ?", sysDept.ParentId) + } + if sysDept.DeptName != "" { + tx = tx.Where("dept_name like concat(?, '%')", sysDept.DeptName) + } + if sysDept.StatusFlag != "" { + tx = tx.Where("status_flag = ?", sysDept.StatusFlag) + } + if dataScopeSQL != "" { + tx = tx.Where(dataScopeSQL) + } - // HasChildByDeptId 是否存在子节点 - HasChildByDeptId(deptId string) int64 - - // CheckDeptExistUser 查询部门是否存在用户 - CheckDeptExistUser(deptId string) int64 - - // CheckUniqueDept 校验部门是否唯一 - CheckUniqueDept(sysDept model.SysDept) string - - // InsertDept 新增部门信息 - InsertDept(sysDept model.SysDept) string - - // UpdateDept 修改部门信息 - UpdateDept(sysDept model.SysDept) int64 - - // UpdateDeptStatusNormal 修改所在部门正常状态 - UpdateDeptStatusNormal(deptIds []string) int64 - - // UpdateDeptChildren 修改子元素关系 - UpdateDeptChildren(sysDepts []model.SysDept) int64 - - // DeleteDeptById 删除部门管理信息 - DeleteDeptById(deptId string) int64 + // 查询数据 + rows := []model.SysDept{} + if err := tx.Order("parent_id, dept_sort asc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectById 通过ID查询信息 +func (r SysDept) SelectById(deptId int64) model.SysDept { + if deptId <= 0 { + return model.SysDept{} + } + tx := db.DB("").Model(&model.SysDept{}) + // 构建查询条件 + tx = tx.Where("dept_id = ? and del_flag = '0'", deptId) + // 查询数据 + item := model.SysDept{} + if err := tx.Limit(1).Find(&item).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return item + } + return item +} + +// Insert 新增信息 返回新增数据ID +func (r SysDept) Insert(sysDept model.SysDept) int64 { + sysDept.DelFlag = "0" + if sysDept.CreateBy != "" { + ms := time.Now().UnixMilli() + sysDept.UpdateBy = sysDept.CreateBy + sysDept.UpdateTime = ms + sysDept.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(&sysDept).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysDept.DeptId +} + +// Update 修改信息 返回受影响行数 +func (r SysDept) Update(sysDept model.SysDept) int64 { + if sysDept.DeptId <= 0 { + return 0 + } + if sysDept.UpdateBy != "" { + sysDept.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.SysDept{}) + // 构建查询条件 + tx = tx.Where("dept_id = ?", sysDept.DeptId) + tx = tx.Omit("dept_id", "del_flag", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(sysDept).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteById 删除信息 返回受影响行数 +func (r SysDept) DeleteById(deptId int64) int64 { + if deptId <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysDept{}) + // 构建查询条件 + tx = tx.Where("dept_id = ?", deptId) + // 执行更新删除标记 + if err := tx.Update("del_flag", "1").Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 返回数据ID +func (r SysDept) CheckUnique(sysDept model.SysDept) int64 { + tx := db.DB("").Model(&model.SysDept{}) + tx = tx.Where("del_flag = 0") + // 查询条件拼接 + if sysDept.DeptName != "" { + tx = tx.Where("dept_name = ?", sysDept.DeptName) + } + if sysDept.ParentId > 0 { + tx = tx.Where("parent_id = ?", sysDept.ParentId) + } + + // 查询数据 + var id int64 = 0 + if err := tx.Select("dept_id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id +} + +// ExistChildrenByDeptId 存在子节点数量 +func (r SysDept) ExistChildrenByDeptId(deptId int64) int64 { + if deptId <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysDept{}) + tx = tx.Where("del_flag = '0' and status_flag = '1' and parent_id = ?", deptId) + // 查询数据 + var count int64 = 0 + if err := tx.Count(&count).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return count + } + return count +} + +// ExistUserByDeptId 存在用户使用数量 +func (r SysDept) ExistUserByDeptId(deptId int64) int64 { + if deptId <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysUser{}) + tx = tx.Where("del_flag = '0' and dept_id = ?", deptId) + // 查询数据 + var count int64 = 0 + if err := tx.Count(&count).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return count + } + return count +} + +// SelectDeptIdsByRoleId 通过角色ID查询包含的部门ID +func (r SysDept) SelectDeptIdsByRoleId(roleId int64, deptCheckStrictly bool) []int64 { + if roleId <= 0 { + return []int64{} + } + + tx := db.DB("").Model(&model.SysDept{}) + tx = tx.Where("del_flag = '0'") + tx = tx.Where("dept_id in (SELECT DISTINCT dept_id FROM sys_role_dept WHERE role_id = ?)", roleId) + // 父子互相关联显示,取所有子节点 + if deptCheckStrictly { + tx = tx.Where(`dept_id not in ( + SELECT d.parent_id FROM sys_dept d + INNER JOIN sys_role_dept rd ON rd.dept_id = d.dept_id + AND rd.role_id = ? + )`, roleId) + } + + // 查询数据 + rows := []int64{} + if err := tx.Distinct("dept_id").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectChildrenDeptById 根据ID查询所有子部门 +func (r SysDept) SelectChildrenDeptById(deptId int64) []model.SysDept { + tx := db.DB("").Model(&model.SysDept{}) + tx = tx.Where("del_flag = 0") + tx = tx.Where("find_in_set(?, ancestors)", deptId) + // 查询数据 + rows := []model.SysDept{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// UpdateDeptStatusNormal 修改所在部门正常状态 +func (r SysDept) UpdateDeptStatusNormal(deptIds []int64) int64 { + if len(deptIds) <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysDept{}) + // 构建查询条件 + tx = tx.Where("dept_id in ?", deptIds) + // 执行更新状态标记 + if err := tx.Update("status_flag", "1").Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// UpdateDeptChildren 修改子元素关系 +func (r SysDept) UpdateDeptChildren(arr []model.SysDept) int64 { + if len(arr) == 0 { + return 0 + } + + // 构建查询条件 + var conditions []string + var deptIds []any + for _, dept := range arr { + caseSql := fmt.Sprintf("WHEN dept_id = %d THEN '%s'", dept.DeptId, dept.Ancestors) + conditions = append(conditions, caseSql) + deptIds = append(deptIds, dept.DeptId) + } + cases := strings.Join(conditions, " ") + casesVal := fmt.Sprintf("CASE %s END", cases) + + // 执行更新操作 + tx := db.DB("").Model(&model.SysDept{}) + tx = tx.Update("ancestors", casesVal) + if err := tx.Where("dept_id in ?", deptIds).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/system/repository/sys_dept.impl.go b/src/modules/system/repository/sys_dept.impl.go deleted file mode 100644 index 62ec2d26..00000000 --- a/src/modules/system/repository/sys_dept.impl.go +++ /dev/null @@ -1,393 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "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/system/model" -) - -// 实例化数据层 SysDeptImpl 结构体 -var NewSysDeptImpl = &SysDeptImpl{ - selectSql: `select - d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time - from sys_dept d`, - - resultMap: map[string]string{ - "dept_id": "DeptID", - "parent_id": "ParentID", - "ancestors": "Ancestors", - "dept_name": "DeptName", - "order_num": "OrderNum", - "leader": "Leader", - "phone": "Phone", - "email": "Email", - "status": "Status", - "del_flag": "DelFlag", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - "parent_name": "ParentName", - }, -} - -// SysDeptImpl 部门表 数据层处理 -type SysDeptImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysDeptImpl) convertResultRows(rows []map[string]any) []model.SysDept { - arr := make([]model.SysDept, 0) - for _, row := range rows { - sysDept := model.SysDept{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&sysDept, keyMapper, value) - } - } - arr = append(arr, sysDept) - } - return arr -} - -// SelectDeptList 查询部门管理数据 -func (r *SysDeptImpl) SelectDeptList(sysDept model.SysDept, dataScopeSQL string) []model.SysDept { - // 查询条件拼接 - var conditions []string - var params []any - if sysDept.DeptID != "" { - conditions = append(conditions, "dept_id = ?") - params = append(params, sysDept.DeptID) - } - if sysDept.ParentID != "" { - conditions = append(conditions, "parent_id = ?") - params = append(params, sysDept.ParentID) - } - if sysDept.DeptName != "" { - conditions = append(conditions, "dept_name like concat(?, '%')") - params = append(params, sysDept.DeptName) - } - if sysDept.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, sysDept.Status) - } - - // 构建查询条件语句 - whereSql := " where d.del_flag = '0' " - if len(conditions) > 0 { - whereSql += " and " + strings.Join(conditions, " and ") - } - - // 查询数据 - orderSql := " order by d.parent_id, d.order_num asc " - querySql := r.selectSql + whereSql + dataScopeSQL + orderSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysDept{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectDeptListByRoleId 根据角色ID查询部门树信息 -func (r *SysDeptImpl) SelectDeptListByRoleId(roleId string, deptCheckStrictly bool) []string { - querySql := `select d.dept_id as 'str' from sys_dept d - left join sys_role_dept rd on d.dept_id = rd.dept_id - where rd.role_id = ? ` - var params []any - params = append(params, roleId) - // 展开 - if deptCheckStrictly { - querySql += ` and d.dept_id not in - (select d.parent_id from sys_dept d - inner join sys_role_dept rd on d.dept_id = rd.dept_id - and rd.role_id = ?) ` - params = append(params, roleId) - } - querySql += "order by d.parent_id, d.order_num" - - // 查询结果 - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []string{} - } - - if len(results) > 0 { - ids := make([]string, 0) - for _, v := range results { - ids = append(ids, fmt.Sprintf("%v", v["str"])) - } - return ids - } - return []string{} -} - -// SelectDeptById 根据部门ID查询信息 -func (r *SysDeptImpl) SelectDeptById(deptId string) model.SysDept { - querySql := `select d.dept_id, d.parent_id, d.ancestors, - d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, - (select dept_name from sys_dept where dept_id = d.parent_id) parent_name - from sys_dept d where d.dept_id = ?` - results, err := datasource.RawDB("", querySql, []any{deptId}) - if err != nil { - logger.Errorf("query err => %v", err) - return model.SysDept{} - } - // 转换实体 - rows := r.convertResultRows(results) - if len(rows) > 0 { - return rows[0] - } - return model.SysDept{} -} - -// SelectChildrenDeptById 根据ID查询所有子部门 -func (r *SysDeptImpl) SelectChildrenDeptById(deptId string) []model.SysDept { - querySql := r.selectSql + " where find_in_set(?, d.ancestors)" - results, err := datasource.RawDB("", querySql, []any{deptId}) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysDept{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// HasChildByDeptId 是否存在子节点 -func (r *SysDeptImpl) HasChildByDeptId(deptId string) int64 { - querySql := "select count(1) as 'total' from sys_dept where status = '1' and parent_id = ? limit 1" - results, err := datasource.RawDB("", querySql, []any{deptId}) - if err != nil { - logger.Errorf("query err => %v", err) - return 0 - } - if len(results) > 0 { - return parse.Number(results[0]["total"]) - } - return 0 -} - -// CheckDeptExistUser 查询部门是否存在用户 -func (r *SysDeptImpl) CheckDeptExistUser(deptId string) int64 { - querySql := "select count(1) as 'total' from sys_user where dept_id = ? and del_flag = '0'" - results, err := datasource.RawDB("", querySql, []any{deptId}) - if err != nil { - logger.Errorf("query err => %v", err) - return 0 - } - if len(results) > 0 { - return parse.Number(results[0]["total"]) - } - return 0 -} - -// CheckUniqueDept 校验部门是否唯一 -func (r *SysDeptImpl) CheckUniqueDept(sysDept model.SysDept) string { - // 查询条件拼接 - var conditions []string - var params []any - if sysDept.DeptName != "" { - conditions = append(conditions, "dept_name = ?") - params = append(params, sysDept.DeptName) - } - if sysDept.ParentID != "" { - conditions = append(conditions, "parent_id = ?") - params = append(params, sysDept.ParentID) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - if whereSql == "" { - return "" - } - - // 查询数据 - querySql := "select dept_id as 'str' from sys_dept " + whereSql + " and del_flag = '0' limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// InsertDept 新增部门信息 -func (r *SysDeptImpl) InsertDept(sysDept model.SysDept) string { - // 参数拼接 - params := make(map[string]any) - if sysDept.DeptID != "" { - params["dept_id"] = sysDept.DeptID - } - if sysDept.ParentID != "" { - params["parent_id"] = sysDept.ParentID - } - if sysDept.DeptName != "" { - params["dept_name"] = sysDept.DeptName - } - if sysDept.Ancestors != "" { - params["ancestors"] = sysDept.Ancestors - } - if sysDept.OrderNum > 0 { - params["order_num"] = sysDept.OrderNum - } - if sysDept.Leader != "" { - params["leader"] = sysDept.Leader - } - if sysDept.Phone != "" { - params["phone"] = sysDept.Phone - } - if sysDept.Email != "" { - params["email"] = sysDept.Email - } - if sysDept.Status != "" { - params["status"] = sysDept.Status - } - if sysDept.CreateBy != "" { - params["create_by"] = sysDept.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_dept (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// UpdateDept 修改部门信息 -func (r *SysDeptImpl) UpdateDept(sysDept model.SysDept) int64 { - // 参数拼接 - params := make(map[string]any) - if sysDept.ParentID != "" { - params["parent_id"] = sysDept.ParentID - } - if sysDept.DeptName != "" { - params["dept_name"] = sysDept.DeptName - } - if sysDept.Ancestors != "" { - params["ancestors"] = sysDept.Ancestors - } - if sysDept.OrderNum > 0 { - params["order_num"] = sysDept.OrderNum - } - if sysDept.Leader != "" { - params["leader"] = sysDept.Leader - } - if sysDept.Phone != "" { - params["phone"] = sysDept.Phone - } - if sysDept.Email != "" { - params["email"] = sysDept.Email - } - if sysDept.Status != "" { - params["status"] = sysDept.Status - } - if sysDept.UpdateBy != "" { - params["update_by"] = sysDept.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update sys_dept set " + strings.Join(keys, ",") + " where dept_id = ?" - - // 执行更新 - values = append(values, sysDept.DeptID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// UpdateDeptStatusNormal 修改所在部门正常状态 -func (r *SysDeptImpl) UpdateDeptStatusNormal(deptIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(deptIds)) - sql := "update sys_dept set status = '1' where dept_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(deptIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("update err => %v", err) - return 0 - } - return results -} - -// UpdateDeptChildren 修改子元素关系 -func (r *SysDeptImpl) UpdateDeptChildren(sysDepts []model.SysDept) int64 { - // 无参数 - if len(sysDepts) == 0 { - return 0 - } - - // 更新条件拼接 - var conditions []string - var params []any - for _, dept := range sysDepts { - caseSql := fmt.Sprintf("WHEN dept_id = '%s' THEN '%s'", dept.DeptID, dept.Ancestors) - conditions = append(conditions, caseSql) - params = append(params, dept.DeptID) - } - - cases := strings.Join(conditions, " ") - placeholders := repo.KeyPlaceholderByQuery(len(params)) - sql := "update sys_dept set ancestors = CASE " + cases + " END where dept_id in (" + placeholders + ")" - results, err := datasource.ExecDB("", sql, params) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// DeleteDeptById 删除部门管理信息 -func (r *SysDeptImpl) DeleteDeptById(deptId string) int64 { - sql := "update sys_dept set status = '0', del_flag = '1' where dept_id = ?" - results, err := datasource.ExecDB("", sql, []any{deptId}) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/system/repository/sys_dict_data.go b/src/modules/system/repository/sys_dict_data.go index cfa8b5ac..79507037 100644 --- a/src/modules/system/repository/sys_dict_data.go +++ b/src/modules/system/repository/sys_dict_data.go @@ -1,33 +1,199 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "time" -// ISysDictData 字典类型数据表 数据层接口 -type ISysDictData interface { - // SelectDictDataPage 根据条件分页查询字典数据 - SelectDictDataPage(query map[string]any) map[string]any + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) - // SelectDictDataList 根据条件查询字典数据 - SelectDictDataList(sysDictData model.SysDictData) []model.SysDictData +// NewSysDictData 实例化数据层 +var NewSysDictData = &SysDictData{} - // SelectDictDataByCodes 根据字典数据编码查询信息 - SelectDictDataByCodes(dictCodes []string) []model.SysDictData +// SysDictData 字典类型数据表 数据层处理 +type SysDictData struct{} - // CountDictDataByType 查询字典数据 - CountDictDataByType(dictType string) int64 +// SelectByPage 分页查询集合 +func (r SysDictData) SelectByPage(query map[string]string) ([]model.SysDictData, int64) { + tx := db.DB("").Model(&model.SysDictData{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if v, ok := query["dictType"]; ok && v != "" { + tx = tx.Where("dict_type = ?", v) + } + if v, ok := query["dataLabel"]; ok && v != "" { + tx = tx.Where("data_label like concat(?, '%')", v) + } + if v, ok := query["statusFlag"]; ok && v != "" { + tx = tx.Where("status_flag = ?", v) + } - // CheckUniqueDictData 校验字典数据是否唯一 - CheckUniqueDictData(sysDictData model.SysDictData) string + // 查询结果 + var total int64 = 0 + rows := []model.SysDictData{} - // DeleteDictDataByCodes 批量删除字典数据信息 - DeleteDictDataByCodes(dictCodes []string) int64 + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } - // InsertDictData 新增字典数据信息 - InsertDictData(sysDictData model.SysDictData) string - - // UpdateDictData 修改字典数据信息 - UpdateDictData(sysDictData model.SysDictData) int64 - - // UpdateDictDataType 同步修改字典类型 - UpdateDictDataType(oldDictType string, newDictType string) int64 + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Order("data_sort asc").Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// Select 查询集合 +func (r SysDictData) Select(sysDictData model.SysDictData) []model.SysDictData { + tx := db.DB("").Model(&model.SysDictData{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if sysDictData.DataLabel != "" { + tx = tx.Where("data_label like concat(?, '%')", sysDictData.DataLabel) + } + if sysDictData.DictType != "" { + tx = tx.Where("dict_type = ?", sysDictData.DictType) + } + if sysDictData.StatusFlag != "" { + tx = tx.Where("status_flag = ?", sysDictData.StatusFlag) + } + + // 查询数据 + rows := []model.SysDictData{} + if err := tx.Order("data_sort asc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询信息 +func (r SysDictData) SelectByIds(dataIds []int64) []model.SysDictData { + rows := []model.SysDictData{} + if len(dataIds) <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysDictData{}) + // 构建查询条件 + tx = tx.Where("data_id in ? and del_flag = '0'", dataIds) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 返回新增数据ID +func (r SysDictData) Insert(sysDictData model.SysDictData) int64 { + sysDictData.DelFlag = "0" + if sysDictData.CreateBy != "" { + ms := time.Now().UnixMilli() + sysDictData.UpdateBy = sysDictData.CreateBy + sysDictData.UpdateTime = ms + sysDictData.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(&sysDictData).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysDictData.DataId +} + +// Update 修改信息 返回受影响行数 +func (r SysDictData) Update(sysDictData model.SysDictData) int64 { + if sysDictData.DataId <= 0 { + return 0 + } + if sysDictData.UpdateBy != "" { + sysDictData.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.SysDictData{}) + // 构建查询条件 + tx = tx.Where("data_id = ?", sysDictData.DataId) + tx = tx.Omit("data_id", "del_flag", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(sysDictData).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 返回受影响行数 +func (r SysDictData) DeleteByIds(dataIds []int64) int64 { + if len(dataIds) <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysDictData{}) + // 构建查询条件 + tx = tx.Where("data_id in ?", dataIds) + // 执行更新删除标记 + if err := tx.Update("del_flag", "1").Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 返回数据ID +func (r SysDictData) CheckUnique(sysDictData model.SysDictData) int64 { + tx := db.DB("").Model(&model.SysDictData{}) + tx = tx.Where("del_flag = 0") + // 查询条件拼接 + if sysDictData.DictType != "" { + tx = tx.Where("dict_type = ?", sysDictData.DictType) + } + if sysDictData.DataLabel != "" { + tx = tx.Where("data_label = ?", sysDictData.DataLabel) + } + if sysDictData.DataValue != "" { + tx = tx.Where("data_value = ?", sysDictData.DataValue) + } + // 查询数据 + var id int64 = 0 + if err := tx.Select("data_id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id +} + +// ExistDataByDictType 存在数据数量 +func (r SysDictData) ExistDataByDictType(dictType string) int64 { + if dictType == "" { + return 0 + } + tx := db.DB("").Model(&model.SysDictData{}) + tx = tx.Where("del_flag = '0' and dict_type = ?", dictType) + // 查询数据 + var count int64 = 0 + if err := tx.Count(&count).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return count + } + return count +} + +// UpdateDataByDictType 更新一组字典类型 返回受影响行数 +func (r SysDictData) UpdateDataByDictType(oldDictType string, newDictType string) int64 { + if oldDictType == "" || newDictType == "" { + return 0 + } + tx := db.DB("").Model(&model.SysDictData{}) + // 构建查询条件 + tx = tx.Where("dict_type = ?", oldDictType) + // 执行更新删除标记 + if err := tx.Update("dict_type", newDictType).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/system/repository/sys_dict_data.impl.go b/src/modules/system/repository/sys_dict_data.impl.go deleted file mode 100644 index 5231a2a6..00000000 --- a/src/modules/system/repository/sys_dict_data.impl.go +++ /dev/null @@ -1,362 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "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/system/model" -) - -// 实例化数据层 SysDictDataImpl 结构体 -var NewSysDictData = &SysDictDataImpl{ - selectSql: `select - dict_code, dict_sort, dict_label, dict_value, dict_type, tag_class, tag_type, status, create_by, create_time, remark - from sys_dict_data`, - - resultMap: map[string]string{ - "dict_code": "DictCode", - "dict_sort": "DictSort", - "dict_label": "DictLabel", - "dict_value": "DictValue", - "dict_type": "DictType", - "tag_class": "TagClass", - "tag_type": "TagType", - "status": "Status", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// SysDictDataImpl 字典类型数据表 数据层处理 -type SysDictDataImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysDictDataImpl) convertResultRows(rows []map[string]any) []model.SysDictData { - arr := make([]model.SysDictData, 0) - for _, row := range rows { - sysDictData := model.SysDictData{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&sysDictData, keyMapper, value) - } - } - arr = append(arr, sysDictData) - } - return arr -} - -// SelectDictDataPage 根据条件分页查询字典数据 -func (r *SysDictDataImpl) SelectDictDataPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["dictType"]; ok && v != "" { - conditions = append(conditions, "dict_type = ?") - params = append(params, v) - } - if v, ok := query["dictLabel"]; ok && v != "" { - conditions = append(conditions, "dict_label like concat(?, '%')") - params = append(params, strings.TrimSpace(v.(string))) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "status = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysDictData{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from sys_dict_data" - 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 := " order by dict_sort asc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + 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 -} - -// SelectDictDataList 根据条件查询字典数据 -func (r *SysDictDataImpl) SelectDictDataList(sysDictData model.SysDictData) []model.SysDictData { - // 查询条件拼接 - var conditions []string - var params []any - if sysDictData.DictLabel != "" { - conditions = append(conditions, "dict_label like concat(?, '%')") - params = append(params, sysDictData.DictLabel) - } - if sysDictData.DictType != "" { - conditions = append(conditions, "dict_type = ?") - params = append(params, sysDictData.DictType) - } - if sysDictData.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, sysDictData.Status) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - orderSql := " order by dict_sort asc " - querySql := r.selectSql + whereSql + orderSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysDictData{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectDictDataByCodes 根据字典数据编码查询信息 -func (r *SysDictDataImpl) SelectDictDataByCodes(dictCodes []string) []model.SysDictData { - placeholder := repo.KeyPlaceholderByQuery(len(dictCodes)) - querySql := r.selectSql + " where dict_code in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(dictCodes) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysDictData{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CountDictDataByType 查询字典数据 -func (r *SysDictDataImpl) CountDictDataByType(dictType string) int64 { - querySql := "select count(1) as 'total' from sys_dict_data where dict_type = ?" - results, err := datasource.RawDB("", querySql, []any{dictType}) - if err != nil { - logger.Errorf("query err => %v", err) - return 0 - } - if len(results) > 0 { - return parse.Number(results[0]["total"]) - } - return 0 -} - -// CheckUniqueDictData 校验字典数据是否唯一 -func (r *SysDictDataImpl) CheckUniqueDictData(sysDictData model.SysDictData) string { - // 查询条件拼接 - var conditions []string - var params []any - if sysDictData.DictType != "" { - conditions = append(conditions, "dict_type = ?") - params = append(params, sysDictData.DictType) - } - if sysDictData.DictLabel != "" { - conditions = append(conditions, "dict_label = ?") - params = append(params, sysDictData.DictLabel) - } - if sysDictData.DictValue != "" { - conditions = append(conditions, "dict_value = ?") - params = append(params, sysDictData.DictValue) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select dict_code as 'str' from sys_dict_data " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// DeleteDictDataByCodes 批量删除字典数据信息 -func (r *SysDictDataImpl) DeleteDictDataByCodes(dictCodes []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(dictCodes)) - sql := "delete from sys_dict_data where dict_code in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(dictCodes) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// InsertDictData 新增字典数据信息 -func (r *SysDictDataImpl) InsertDictData(sysDictData model.SysDictData) string { - // 参数拼接 - params := make(map[string]any) - if sysDictData.DictSort > 0 { - params["dict_sort"] = sysDictData.DictSort - } - if sysDictData.DictLabel != "" { - params["dict_label"] = sysDictData.DictLabel - } - if sysDictData.DictValue != "" { - params["dict_value"] = sysDictData.DictValue - } - if sysDictData.DictType != "" { - params["dict_type"] = sysDictData.DictType - } - if sysDictData.TagClass != "" { - params["tag_class"] = sysDictData.TagClass - } - if sysDictData.TagType != "" { - params["tag_type"] = sysDictData.TagType - } - if sysDictData.Status != "" { - params["status"] = sysDictData.Status - } - if sysDictData.Remark != "" { - params["remark"] = sysDictData.Remark - } - if sysDictData.CreateBy != "" { - params["create_by"] = sysDictData.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_dict_data (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// UpdateDictData 修改字典数据信息 -func (r *SysDictDataImpl) UpdateDictData(sysDictData model.SysDictData) int64 { - // 参数拼接 - params := make(map[string]any) - if sysDictData.DictSort > 0 { - params["dict_sort"] = sysDictData.DictSort - } - if sysDictData.DictLabel != "" { - params["dict_label"] = sysDictData.DictLabel - } - if sysDictData.DictValue != "" { - params["dict_value"] = sysDictData.DictValue - } - if sysDictData.DictType != "" { - params["dict_type"] = sysDictData.DictType - } - if sysDictData.Status != "" { - params["status"] = sysDictData.Status - } - params["tag_class"] = sysDictData.TagClass - params["tag_type"] = sysDictData.TagType - params["remark"] = sysDictData.Remark - if sysDictData.UpdateBy != "" { - params["update_by"] = sysDictData.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update sys_dict_data set " + strings.Join(keys, ",") + " where dict_code = ?" - - // 执行更新 - values = append(values, sysDictData.DictCode) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// UpdateDictDataType 同步修改字典类型 -func (r *SysDictDataImpl) UpdateDictDataType(oldDictType string, newDictType string) int64 { - // 参数拼接 - params := make([]any, 0) - if oldDictType == "" || newDictType == "" { - return 0 - } - params = append(params, newDictType) - params = append(params, oldDictType) - - // 构建执行语句 - sql := "update sys_dict_data set dict_type = ? where dict_type = ?" - - // 执行更新 - rows, err := datasource.ExecDB("", sql, params) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} diff --git a/src/modules/system/repository/sys_dict_type.go b/src/modules/system/repository/sys_dict_type.go index d38d34d1..23c75251 100644 --- a/src/modules/system/repository/sys_dict_type.go +++ b/src/modules/system/repository/sys_dict_type.go @@ -1,30 +1,197 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "fmt" + "time" -// ISysDictType 字典类型表 数据层接口 -type ISysDictType interface { - // SelectDictTypePage 根据条件分页查询字典类型 - SelectDictTypePage(query map[string]any) map[string]any + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) - // SelectDictTypeList 根据条件查询字典类型 - SelectDictTypeList(sysDictType model.SysDictType) []model.SysDictType +// NewSysDictType 实例化数据层 +var NewSysDictType = &SysDictType{} - // SelectDictTypeByIDs 根据字典类型ID查询信息 - SelectDictTypeByIDs(dictIDs []string) []model.SysDictType +// SysDictType 字典类型表 数据层处理 +type SysDictType struct{} - // SelectDictTypeByType 根据字典类型查询信息 - SelectDictTypeByType(dictType string) model.SysDictType +// SelectByPage 分页查询集合 +func (r SysDictType) SelectByPage(query map[string]string) ([]model.SysDictType, int64) { + tx := db.DB("").Model(&model.SysDictType{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if v, ok := query["dictName"]; ok && v != "" { + tx = tx.Where("dict_name like concat(?, '%')", v) + } + if v, ok := query["dictType"]; ok && v != "" { + tx = tx.Where("dict_type like concat(?, '%')", v) + } + if v, ok := query["statusFlag"]; ok && v != "" { + tx = tx.Where("status_flag = ?", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s000", v) + tx = tx.Where("create_time >= ?", v) + } else if len(v) == 13 { + tx = tx.Where("create_time >= ?", v) + } + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s999", v) + tx = tx.Where("create_time <= ?", v) + } else if len(v) == 13 { + tx = tx.Where("create_time <= ?", v) + } + } - // CheckUniqueDictType 校验字典类型是否唯一 - CheckUniqueDictType(sysDictType model.SysDictType) string + // 查询结果 + var total int64 = 0 + rows := []model.SysDictType{} - // InsertDictType 新增字典类型信息 - InsertDictType(sysDictType model.SysDictType) string + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } - // UpdateDictType 修改字典类型信息 - UpdateDictType(sysDictType model.SysDictType) int64 - - // DeleteDictTypeByIDs 批量删除字典类型信息 - DeleteDictTypeByIDs(dictIDs []string) int64 + // 查询数据分页 + 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 + } + return rows, total +} + +// Select 查询集合 +func (r SysDictType) Select(sysDictType model.SysDictType) []model.SysDictType { + tx := db.DB("").Model(&model.SysDictType{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if sysDictType.DictName != "" { + tx = tx.Where("dict_name like concat(?, '%')", sysDictType.DictName) + } + if sysDictType.DictType != "" { + tx = tx.Where("dict_type like concat(?, '%')", sysDictType.DictType) + } + if sysDictType.StatusFlag != "" { + tx = tx.Where("status_flag = ?", sysDictType.StatusFlag) + } + + // 查询数据 + rows := []model.SysDictType{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询信息 +func (r SysDictType) SelectByIds(dictIds []int64) []model.SysDictType { + rows := []model.SysDictType{} + if len(dictIds) <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysDictType{}) + // 构建查询条件 + tx = tx.Where("dict_id in ? and del_flag = '0'", dictIds) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 返回新增数据ID +func (r SysDictType) Insert(sysDictType model.SysDictType) int64 { + sysDictType.DelFlag = "0" + if sysDictType.CreateBy != "" { + ms := time.Now().UnixMilli() + sysDictType.UpdateBy = sysDictType.CreateBy + sysDictType.UpdateTime = ms + sysDictType.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(&sysDictType).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysDictType.DictId +} + +// Update 修改信息 返回受影响的行数 +func (r SysDictType) Update(sysDictType model.SysDictType) int64 { + if sysDictType.DictId <= 0 { + return 0 + } + if sysDictType.UpdateBy != "" { + sysDictType.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.SysDictType{}) + // 构建查询条件 + tx = tx.Where("dict_id = ?", sysDictType.DictId) + tx = tx.Omit("dict_id", "del_flag", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(sysDictType).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 返回受影响的行数 +func (r SysDictType) DeleteByIds(dictIds []int64) int64 { + if len(dictIds) <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysDictType{}) + // 构建查询条件 + tx = tx.Where("dict_id in ?", dictIds) + // 执行更新删除标记 + if err := tx.Update("del_flag", "1").Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 返回数据ID +func (r SysDictType) CheckUnique(sysDictType model.SysDictType) int64 { + tx := db.DB("").Model(&model.SysDictType{}) + tx = tx.Where("del_flag = 0") + // 查询条件拼接 + if sysDictType.DictName != "" { + tx = tx.Where("dict_name = ?", sysDictType.DictName) + } + if sysDictType.DictType != "" { + tx = tx.Where("dict_type = ?", sysDictType.DictType) + } + // 查询数据 + var id int64 = 0 + if err := tx.Select("dict_id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id +} + +// SelectByType 通过字典类型查询信息 +func (r SysDictType) SelectByType(dictType string) model.SysDictType { + item := model.SysDictType{} + if dictType == "" { + return item + } + tx := db.DB("").Model(&model.SysDictType{}) + tx.Where("dict_type = ? and del_flag = '0'", dictType) + // 查询数据 + if err := tx.Limit(1).Find(&item).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return item + } + return item } diff --git a/src/modules/system/repository/sys_dict_type.impl.go b/src/modules/system/repository/sys_dict_type.impl.go deleted file mode 100644 index db321360..00000000 --- a/src/modules/system/repository/sys_dict_type.impl.go +++ /dev/null @@ -1,329 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "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/system/model" -) - -// 实例化数据层 SysDictTypeImpl 结构体 -var NewSysDictType = &SysDictTypeImpl{ - selectSql: `select - dict_id, dict_name, dict_type, status, create_by, create_time, remark - from sys_dict_type`, - - resultMap: map[string]string{ - "dict_id": "DictID", - "dict_name": "DictName", - "dict_type": "DictType", - "remark": "Remark", - "status": "Status", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// SysDictTypeImpl 字典类型表 数据层处理 -type SysDictTypeImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysDictTypeImpl) convertResultRows(rows []map[string]any) []model.SysDictType { - arr := make([]model.SysDictType, 0) - for _, row := range rows { - sysDictType := model.SysDictType{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&sysDictType, keyMapper, value) - } - } - arr = append(arr, sysDictType) - } - return arr -} - -// SelectDictTypePage 根据条件分页查询字典类型 -func (r *SysDictTypeImpl) SelectDictTypePage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["dictName"]; ok && v != "" { - conditions = append(conditions, "dict_name like concat(?, '%')") - params = append(params, strings.TrimSpace(v.(string))) - } - if v, ok := query["dictType"]; ok && v != "" { - conditions = append(conditions, "dict_type like concat(?, '%')") - params = append(params, strings.TrimSpace(v.(string))) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "status = ?") - params = append(params, v) - } - beginTime, ok := query["beginTime"] - if !ok { - beginTime, ok = query["params[beginTime]"] - } - if ok && beginTime != "" { - conditions = append(conditions, "create_time >= ?") - params = append(params, parse.Number(beginTime.(string))) - } - endTime, ok := query["endTime"] - if !ok { - endTime, ok = query["params[endTime]"] - } - if ok && endTime != "" { - conditions = append(conditions, "create_time <= ?") - params = append(params, parse.Number(endTime.(string))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysDictType{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from sys_dict_type" - 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) - - // 查询数据 - querySql := r.selectSql + whereSql + 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 -} - -// SelectDictTypeList 根据条件查询字典类型 -func (r *SysDictTypeImpl) SelectDictTypeList(sysDictType model.SysDictType) []model.SysDictType { - // 查询条件拼接 - var conditions []string - var params []any - if sysDictType.DictName != "" { - conditions = append(conditions, "dict_name like concat(?, '%')") - params = append(params, sysDictType.DictName) - } - if sysDictType.DictType != "" { - conditions = append(conditions, "dict_type like concat(?, '%')") - params = append(params, sysDictType.DictType) - } - if sysDictType.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, sysDictType.Status) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysDictType{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectDictTypeByIDs 根据字典类型ID查询信息 -func (r *SysDictTypeImpl) SelectDictTypeByIDs(dictIDs []string) []model.SysDictType { - placeholder := repo.KeyPlaceholderByQuery(len(dictIDs)) - querySql := r.selectSql + " where dict_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(dictIDs) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysDictType{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// SelectDictTypeByType 根据字典类型查询信息 -func (r *SysDictTypeImpl) SelectDictTypeByType(dictType string) model.SysDictType { - querySql := r.selectSql + " where dict_type = ?" - results, err := datasource.RawDB("", querySql, []any{dictType}) - if err != nil { - logger.Errorf("query err => %v", err) - return model.SysDictType{} - } - // 转换实体 - rows := r.convertResultRows(results) - if len(rows) > 0 { - return rows[0] - } - return model.SysDictType{} -} - -// CheckUniqueDictType 校验字典是否唯一 -func (r *SysDictTypeImpl) CheckUniqueDictType(sysDictType model.SysDictType) string { - // 查询条件拼接 - var conditions []string - var params []any - if sysDictType.DictName != "" { - conditions = append(conditions, "dict_name = ?") - params = append(params, sysDictType.DictName) - } - if sysDictType.DictType != "" { - conditions = append(conditions, "dict_type = ?") - params = append(params, sysDictType.DictType) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select dict_id as 'str' from sys_dict_type " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// InsertDictType 新增字典类型信息 -func (r *SysDictTypeImpl) InsertDictType(sysDictType model.SysDictType) string { - // 参数拼接 - params := make(map[string]any) - if sysDictType.DictName != "" { - params["dict_name"] = sysDictType.DictName - } - if sysDictType.DictType != "" { - params["dict_type"] = sysDictType.DictType - } - if sysDictType.Status != "" { - params["status"] = sysDictType.Status - } - if sysDictType.Remark != "" { - params["remark"] = sysDictType.Remark - } - if sysDictType.CreateBy != "" { - params["create_by"] = sysDictType.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_dict_type (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// UpdateDictType 修改字典类型信息 -func (r *SysDictTypeImpl) UpdateDictType(sysDictType model.SysDictType) int64 { - // 参数拼接 - params := make(map[string]any) - if sysDictType.DictName != "" { - params["dict_name"] = sysDictType.DictName - } - if sysDictType.DictType != "" { - params["dict_type"] = sysDictType.DictType - } - if sysDictType.Status != "" { - params["status"] = sysDictType.Status - } - params["remark"] = sysDictType.Remark - if sysDictType.UpdateBy != "" { - params["update_by"] = sysDictType.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update sys_dict_type set " + strings.Join(keys, ",") + " where dict_id = ?" - - // 执行更新 - values = append(values, sysDictType.DictID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteDictTypeByIDs 批量删除字典类型信息 -func (r *SysDictTypeImpl) DeleteDictTypeByIDs(dictIDs []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(dictIDs)) - sql := "delete from sys_dict_type where dict_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(dictIDs) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/system/repository/sys_i18n.go b/src/modules/system/repository/sys_i18n.go new file mode 100644 index 00000000..98708f52 --- /dev/null +++ b/src/modules/system/repository/sys_i18n.go @@ -0,0 +1,122 @@ +package repository + +import ( + "time" + + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) + +// NewSysI18n 实例化数据层 +var NewSysI18n = &SysI18n{} + +// SysI18nRepository 多语言 数据层处理 +type SysI18n struct{} + +// Select 查询集合 +func (r SysI18n) Select(param model.SysI18n) []model.SysI18n { + tx := db.DB("").Model(&model.SysI18n{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if param.Key != "" { + tx = tx.Where("key = ?", param.Key) + } + if param.ValueZh != "" { + tx = tx.Where("value_zh = ?", param.ValueZh) + } + if param.ValueEn != "" { + tx = tx.Where("value_en = ?", param.ValueEn) + } + + // 查询数据 + rows := []model.SysI18n{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询信息 +func (r SysI18n) SelectByIds(ids []int64) []model.SysI18n { + rows := []model.SysI18n{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysI18n{}) + // 构建查询条件 + tx = tx.Where("id in ? and del_flag = '0'", ids) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 返回新增数据ID +func (r SysI18n) Insert(param model.SysI18n) int64 { + param.DelFlag = "0" + if param.CreateBy != "" { + ms := time.Now().UnixMilli() + param.UpdateBy = param.CreateBy + param.UpdateTime = ms + param.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return param.ID +} + +// Update 修改信息 返回受影响行数 +func (r SysI18n) Update(param model.SysI18n) int64 { + if param.ID <= 0 { + return 0 + } + if param.UpdateBy != "" { + param.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.SysI18n{}) + // 构建查询条件 + tx = tx.Where("id = ?", param.ID) + tx = tx.Omit("id", "del_flag", "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 SysI18n) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysI18n{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) + // 执行更新删除标记 + if err := tx.Update("del_flag", "1").Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 返回ID +func (r SysI18n) CheckUnique(key string) int64 { + tx := db.DB("").Model(&model.SysI18n{}) + tx = tx.Where("del_flag = 0 and key= ?", key) + // 查询数据 + var id int64 = 0 + if err := tx.Select("id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id +} diff --git a/src/modules/system/repository/sys_log_login.go b/src/modules/system/repository/sys_log_login.go index 8dfbc828..348a0b38 100644 --- a/src/modules/system/repository/sys_log_login.go +++ b/src/modules/system/repository/sys_log_login.go @@ -1,21 +1,91 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "fmt" + "time" -// ISysLogLogin 系统登录日志表 数据层接口 -type ISysLogLogin interface { - // SelectSysLogLoginPage 分页查询系统登录日志集合 - SelectSysLogLoginPage(query map[string]any, dataScopeSQL string) map[string]any + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) - // SelectSysLogLoginList 查询系统登录日志集合 - SelectSysLogLoginList(sysLogLogin model.SysLogLogin) []model.SysLogLogin +// NewSysLogLogin 实例化数据层 +var NewSysLogLogin = &SysLogLogin{} - // InsertSysLogLogin 新增系统登录日志 - InsertSysLogLogin(sysLogLogin model.SysLogLogin) string +// SysLogLoginRepository 系统登录访问表 数据层处理 +type SysLogLogin struct{} - // DeleteSysLogLoginByIds 批量删除系统登录日志 - DeleteSysLogLoginByIds(loginIds []string) int64 +// SelectByPage 分页查询集合 +func (r SysLogLogin) SelectByPage(query map[string]string, dataScopeSQL string) ([]model.SysLogLogin, int64) { + tx := db.DB("").Model(&model.SysLogLogin{}) + // 查询条件拼接 + if v, ok := query["loginIp"]; ok && v != "" { + tx = tx.Where("login_ip like concat(?, '%')", v) + } + if v, ok := query["userName"]; ok && v != "" { + tx = tx.Where("user_name like concat(?, '%')", v) + } + if v, ok := query["statusFlag"]; ok && v != "" { + tx = tx.Where("status_flag = ?", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s000", v) + tx = tx.Where("login_time >= ?", v) + } else if len(v) == 13 { + tx = tx.Where("login_time >= ?", v) + } + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s999", v) + tx = tx.Where("login_time <= ?", v) + } else if len(v) == 13 { + tx = tx.Where("login_time <= ?", v) + } + } + if dataScopeSQL != "" { + dataScopeSQL = fmt.Sprintf("select distinct user_name from sys_user where %s", dataScopeSQL) + tx = tx.Where(fmt.Sprintf("user_name in ( %s )", dataScopeSQL)) + } - // CleanSysLogLogin 清空系统登录日志 - CleanSysLogLogin() error + // 查询结果 + var total int64 = 0 + rows := []model.SysLogLogin{} + + // 查询数量为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) + err := tx.Order("id desc").Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// Insert 新增信息 返回新增的数据ID +func (r SysLogLogin) Insert(sysLogLogin model.SysLogLogin) int64 { + sysLogLogin.LoginTime = time.Now().UnixMilli() + // 执行插入 + if err := db.DB("").Create(&sysLogLogin).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysLogLogin.ID +} + +// Clean 清空信息 +func (r SysLogLogin) Clean() int64 { + tx := db.DB("").Delete(&model.SysLogLogin{}) + if err := tx.Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/system/repository/sys_log_login.impl.go b/src/modules/system/repository/sys_log_login.impl.go deleted file mode 100644 index d32e17b7..00000000 --- a/src/modules/system/repository/sys_log_login.impl.go +++ /dev/null @@ -1,255 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "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/system/model" -) - -// 实例化数据层 SysLogLoginImpl 结构体 -var NewSysLogLoginImpl = &SysLogLoginImpl{ - selectSql: `select login_id, user_name, ipaddr, login_location, - browser, os, status, msg, login_time from sys_log_login`, - - resultMap: map[string]string{ - "login_id": "LoginID", - "user_name": "UserName", - "status": "Status", - "ipaddr": "IPAddr", - "login_location": "LoginLocation", - "browser": "Browser", - "os": "OS", - "msg": "Msg", - "login_time": "LoginTime", - }, -} - -// SysLogLoginImpl 系统登录访问表 数据层处理 -type SysLogLoginImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysLogLoginImpl) convertResultRows(rows []map[string]any) []model.SysLogLogin { - arr := make([]model.SysLogLogin, 0) - for _, row := range rows { - SysLogLogin := model.SysLogLogin{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&SysLogLogin, keyMapper, value) - } - } - arr = append(arr, SysLogLogin) - } - return arr -} - -// SelectSysLogLoginPage 分页查询系统登录日志集合 -func (r *SysLogLoginImpl) SelectSysLogLoginPage(query map[string]any, dataScopeSQL string) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["ipaddr"]; ok && v != "" { - conditions = append(conditions, "ipaddr like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["userName"]; ok && v != "" { - conditions = append(conditions, "user_name like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "status = ?") - params = append(params, v) - } - beginTime, ok := query["beginTime"] - if !ok { - beginTime, ok = query["params[beginTime]"] - } - if ok && beginTime != "" { - conditions = append(conditions, "login_time >= ?") - params = append(params, parse.Number(beginTime.(string))) - } - endTime, ok := query["endTime"] - if !ok { - endTime, ok = query["params[endTime]"] - } - if ok && endTime != "" { - conditions = append(conditions, "login_time <= ?") - params = append(params, parse.Number(endTime.(string))) - } - - // 构建查询条件语句 - selectSql := r.selectSql - totalSql := "select count(login_id) as 'total' from sys_log_login" - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - whereSql += dataScopeSQL - } else if dataScopeSQL != "" { - totalSql = `select count(o.login_id) as 'total' - from sys_log_login o - left join sys_user u on u.user_name = o.user_name - left join sys_dept d on u.dept_id = d.dept_id` - selectSql = `select o.login_id, o.user_name, o.ipaddr, o.login_location, - o.browser, o.os, o.status, o.msg, o.login_time - from sys_log_login o - left join sys_user u on u.user_name = o.user_name - left join sys_dept d on u.dept_id = d.dept_id` - whereSql += " where 1=1" + dataScopeSQL - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysLogLogin{}, - } - - // 查询数量 长度为0直接返回 - 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 := " order by login_id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := selectSql + whereSql + dataScopeSQL + 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 -} - -// SelectSysLogLoginList 查询系统登录日志集合 -func (r *SysLogLoginImpl) SelectSysLogLoginList(SysLogLogin model.SysLogLogin) []model.SysLogLogin { - // 查询条件拼接 - var conditions []string - var params []any - if SysLogLogin.IPAddr != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, SysLogLogin.IPAddr) - } - if SysLogLogin.UserName != "" { - conditions = append(conditions, "user_name like concat(?, '%')") - params = append(params, SysLogLogin.UserName) - } - if SysLogLogin.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, SysLogLogin.Status) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysLogLogin{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// InsertSysLogLogin 新增系统登录日志 -func (r *SysLogLoginImpl) InsertSysLogLogin(SysLogLogin model.SysLogLogin) string { - // 参数拼接 - params := make(map[string]any) - params["login_time"] = time.Now().UnixMilli() - if SysLogLogin.UserName != "" { - params["user_name"] = SysLogLogin.UserName - } - if SysLogLogin.Status != "" { - params["status"] = SysLogLogin.Status - } - if SysLogLogin.IPAddr != "" { - params["ipaddr"] = SysLogLogin.IPAddr - } - if SysLogLogin.LoginLocation != "" { - params["login_location"] = SysLogLogin.LoginLocation - } - if SysLogLogin.Browser != "" { - params["browser"] = SysLogLogin.Browser - } - if SysLogLogin.OS != "" { - params["os"] = SysLogLogin.OS - } - if SysLogLogin.Msg != "" { - params["msg"] = SysLogLogin.Msg - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_log_login (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// DeleteSysLogLoginByIds 批量删除系统登录日志 -func (r *SysLogLoginImpl) DeleteSysLogLoginByIds(loginIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(loginIds)) - sql := "delete from sys_log_login where login_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(loginIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// CleanSysLogLogin 清空系统登录日志 -func (r *SysLogLoginImpl) CleanSysLogLogin() error { - sql := "truncate table sys_log_login" - _, err := datasource.ExecDB("", sql, []any{}) - return err -} diff --git a/src/modules/system/repository/sys_log_operate.go b/src/modules/system/repository/sys_log_operate.go index 5f8cb010..6f46e4ee 100644 --- a/src/modules/system/repository/sys_log_operate.go +++ b/src/modules/system/repository/sys_log_operate.go @@ -1,24 +1,99 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "fmt" + "time" -// ISysLogOperate 操作日志表 数据层接口 -type ISysLogOperate interface { - // SelectSysLogOperatePage 分页查询系统操作日志集合 - SelectSysLogOperatePage(query map[string]any, dataScopeSQL string) map[string]any + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) - // SelectSysLogOperateList 查询系统操作日志集合 - SelectSysLogOperateList(sysLogOperate model.SysLogOperate) []model.SysLogOperate +// NewSysLogOperate 实例化数据层 +var NewSysLogOperate = &SysLogOperate{} - // SelectSysLogOperateById 查询操作日志详细 - SelectSysLogOperateById(operId string) model.SysLogOperate +// SysLogOperateRepository 操作日志表 数据层处理 +type SysLogOperate struct{} - // InsertSysLogOperate 新增操作日志 - InsertSysLogOperate(sysLogOperate model.SysLogOperate) string +// SelectByPage 分页查询集合 +func (r SysLogOperate) SelectByPage(query map[string]string, dataScopeSQL string) ([]model.SysLogOperate, int64) { + tx := db.DB("").Model(&model.SysLogOperate{}) + // 查询条件拼接 + if v, ok := query["title"]; ok && v != "" { + tx = tx.Where("title like concat(?, '%')", v) + } + if v, ok := query["businessType"]; ok && v != "" { + tx = tx.Where("business_type = ?", v) + } + if v, ok := query["operaBy"]; ok && v != "" { + tx = tx.Where("opera_by like concat(?, '%')", v) + } + if v, ok := query["operaIp"]; ok && v != "" { + tx = tx.Where("opera_ip like concat(?, '%')", v) + } + if v, ok := query["statusFlag"]; ok && v != "" { + tx = tx.Where("status_flag = ?", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s000", v) + tx = tx.Where("opera_time >= ?", v) + } else if len(v) == 13 { + tx = tx.Where("opera_time >= ?", v) + } + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s999", v) + tx = tx.Where("opera_time <= ?", v) + } else if len(v) == 13 { + tx = tx.Where("opera_time <= ?", v) + } + } + if dataScopeSQL != "" { + dataScopeSQL = fmt.Sprintf("select distinct user_name from sys_user where %s", dataScopeSQL) + tx = tx.Where(fmt.Sprintf("opera_by in ( %s )", dataScopeSQL)) + } - // DeleteSysLogOperateByIds 批量删除系统操作日志 - DeleteSysLogOperateByIds(operIds []string) int64 + // 查询结果 + var total int64 = 0 + rows := []model.SysLogOperate{} - // CleanSysLogOperate 清空操作日志 - CleanSysLogOperate() error + // 查询数量为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) + err := tx.Order("id desc").Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// Insert 新增信息 +func (r SysLogOperate) Insert(sysLogOperate model.SysLogOperate) int64 { + if sysLogOperate.OperaBy != "" { + sysLogOperate.OperaTime = time.Now().UnixMilli() + } + // 执行插入 + if err := db.DB("").Create(&sysLogOperate).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysLogOperate.ID +} + +// Clean 清空信息 +func (r SysLogOperate) Clean() int64 { + tx := db.DB("").Delete(&model.SysLogOperate{}) + if err := tx.Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/system/repository/sys_log_operate.impl.go b/src/modules/system/repository/sys_log_operate.impl.go deleted file mode 100644 index b6a0869a..00000000 --- a/src/modules/system/repository/sys_log_operate.impl.go +++ /dev/null @@ -1,310 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "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/system/model" -) - -// 实例化数据层 SysLogOperateImpl 结构体 -var NewSysLogOperateImpl = &SysLogOperateImpl{ - selectSql: `select - oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, - oper_url, oper_ip, oper_location, oper_param, oper_msg, status, oper_time, cost_time - from sys_log_operate`, - - resultMap: map[string]string{ - "oper_id": "OperID", - "title": "Title", - "business_type": "BusinessType", - "method": "Method", - "request_method": "RequestMethod", - "operator_type": "OperatorType", - "oper_name": "OperName", - "dept_name": "DeptName", - "oper_url": "OperURL", - "oper_ip": "OperIP", - "oper_location": "OperLocation", - "oper_param": "OperParam", - "oper_msg": "OperMsg", - "status": "Status", - "oper_time": "OperTime", - "cost_time": "CostTime", - }, -} - -// SysLogOperateImpl 操作日志表 数据层处理 -type SysLogOperateImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysLogOperateImpl) convertResultRows(rows []map[string]any) []model.SysLogOperate { - arr := make([]model.SysLogOperate, 0) - for _, row := range rows { - SysLogOperate := model.SysLogOperate{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&SysLogOperate, keyMapper, value) - } - } - arr = append(arr, SysLogOperate) - } - return arr -} - -// SelectSysLogOperatePage 分页查询系统操作日志集合 -func (r *SysLogOperateImpl) SelectSysLogOperatePage(query map[string]any, dataScopeSQL string) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.TrimSpace(v.(string))) - } - if v, ok := query["businessType"]; ok && v != "" { - conditions = append(conditions, "business_type = ?") - params = append(params, v) - } - if v, ok := query["operName"]; ok && v != "" { - conditions = append(conditions, "oper_name like concat(?, '%')") - params = append(params, strings.TrimSpace(v.(string))) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "status = ?") - params = append(params, v) - } - beginTime, ok := query["beginTime"] - if !ok { - beginTime, ok = query["params[beginTime]"] - } - if ok && beginTime != "" { - conditions = append(conditions, "oper_time >= ?") - params = append(params, parse.Number(beginTime.(string))) - } - endTime, ok := query["endTime"] - if !ok { - endTime, ok = query["params[endTime]"] - } - if ok && endTime != "" { - conditions = append(conditions, "oper_time <= ?") - params = append(params, parse.Number(endTime.(string))) - } - - // 构建查询条件语句 - selectSql := r.selectSql - totalSql := "select count(oper_id) as 'total' from sys_log_operate" - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - whereSql += dataScopeSQL - } else if dataScopeSQL != "" { - totalSql = `select count(o.oper_id) as 'total' - from sys_log_operate o - left join sys_user u on u.user_name = o.oper_name - left join sys_dept d on u.dept_id = d.dept_id` - selectSql = `select - o.oper_id, o.title, o.business_type, o.method, o.request_method, o.operator_type, o.oper_name, o.dept_name, - o.oper_url, o.oper_ip, o.oper_location, o.oper_param, o.oper_msg, o.status, o.oper_time, o.cost_time - from sys_log_operate o - left join sys_user u on u.user_name = o.oper_name - left join sys_dept d on u.dept_id = d.dept_id` - whereSql += " where 1=1" + dataScopeSQL - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysLogOperate{}, - } - - // 查询数量 长度为0直接返回 - 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 := " order by oper_id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := selectSql + whereSql + 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 -} - -// SelectSysLogOperateList 查询系统操作日志集合 -func (r *SysLogOperateImpl) SelectSysLogOperateList(SysLogOperate model.SysLogOperate) []model.SysLogOperate { - // 查询条件拼接 - var conditions []string - var params []any - if SysLogOperate.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, SysLogOperate.Title) - } - if SysLogOperate.BusinessType != "" { - conditions = append(conditions, "business_type = ?") - params = append(params, SysLogOperate.BusinessType) - } - if SysLogOperate.OperName != "" { - conditions = append(conditions, "oper_name like concat(?, '%')") - params = append(params, SysLogOperate.OperName) - } - if SysLogOperate.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, SysLogOperate.Status) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysLogOperate{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectSysLogOperateById 查询操作日志详细 -func (r *SysLogOperateImpl) SelectSysLogOperateById(operId string) model.SysLogOperate { - querySql := r.selectSql + " where oper_id = ?" - results, err := datasource.RawDB("", querySql, []any{operId}) - if err != nil { - logger.Errorf("query err => %v", err) - return model.SysLogOperate{} - } - // 转换实体 - rows := r.convertResultRows(results) - if len(rows) > 0 { - return rows[0] - } - return model.SysLogOperate{} -} - -// InsertSysLogOperate 新增操作日志 -func (r *SysLogOperateImpl) InsertSysLogOperate(SysLogOperate model.SysLogOperate) string { - // 参数拼接 - params := make(map[string]any) - params["oper_time"] = time.Now().UnixMilli() - if SysLogOperate.Title != "" { - params["title"] = SysLogOperate.Title - } - if SysLogOperate.BusinessType != "" { - params["business_type"] = SysLogOperate.BusinessType - } - if SysLogOperate.Method != "" { - params["method"] = SysLogOperate.Method - } - if SysLogOperate.RequestMethod != "" { - params["request_method"] = SysLogOperate.RequestMethod - } - if SysLogOperate.OperatorType != "" { - params["operator_type"] = SysLogOperate.OperatorType - } - if SysLogOperate.DeptName != "" { - params["dept_name"] = SysLogOperate.DeptName - } - if SysLogOperate.OperName != "" { - params["oper_name"] = SysLogOperate.OperName - } - if SysLogOperate.OperURL != "" { - params["oper_url"] = SysLogOperate.OperURL - } - if SysLogOperate.OperIP != "" { - params["oper_ip"] = SysLogOperate.OperIP - } - if SysLogOperate.OperLocation != "" { - params["oper_location"] = SysLogOperate.OperLocation - } - if SysLogOperate.OperParam != "" { - params["oper_param"] = SysLogOperate.OperParam - } - if SysLogOperate.OperMsg != "" { - params["oper_msg"] = SysLogOperate.OperMsg - } - if SysLogOperate.Status != "" { - params["status"] = SysLogOperate.Status - } - if SysLogOperate.CostTime > 0 { - params["cost_time"] = SysLogOperate.CostTime - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_log_operate (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// DeleteSysLogOperateByIds 批量删除系统操作日志 -func (r *SysLogOperateImpl) DeleteSysLogOperateByIds(operIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(operIds)) - sql := "delete from sys_log_operate where oper_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(operIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// CleanSysLogOperate 清空操作日志 -func (r *SysLogOperateImpl) CleanSysLogOperate() error { - sql := "truncate table sys_log_operate" - _, err := datasource.ExecDB("", sql, []any{}) - return err -} diff --git a/src/modules/system/repository/sys_menu.go b/src/modules/system/repository/sys_menu.go index bf030777..48972b98 100644 --- a/src/modules/system/repository/sys_menu.go +++ b/src/modules/system/repository/sys_menu.go @@ -1,36 +1,286 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "time" -// ISysMenu 菜单表 数据层接口 -type ISysMenu interface { - // SelectMenuList 查询系统菜单列表 - SelectMenuList(sysMenu model.SysMenu, userId string) []model.SysMenu + "be.ems/src/framework/constants" + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) - // SelectMenuPermsByUserId 根据用户ID查询权限 - SelectMenuPermsByUserId(userId string) []string +// NewSysMenu 实例化数据层 +var NewSysMenu = &SysMenu{} - // SelectMenuTreeByUserId 根据用户ID查询菜单 - SelectMenuTreeByUserId(userId string) []model.SysMenu +// SysMenu 菜单表 数据层处理 +type SysMenu struct{} - // SelectMenuListByRoleId 根据角色ID查询菜单树信息 - SelectMenuListByRoleId(roleId string, menuCheckStrictly bool) []string +// Select 查询集合 userId为0是系统管理员 +func (r SysMenu) Select(sysMenu model.SysMenu, userId int64) []model.SysMenu { + tx := db.DB("").Model(&model.SysMenu{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if sysMenu.MenuName != "" { + tx = tx.Where("menu_name like concat(?, '%')", sysMenu.MenuName) + } + if sysMenu.VisibleFlag != "" { + tx = tx.Where("visible_flag = ?", sysMenu.VisibleFlag) + } + if sysMenu.StatusFlag != "" { + tx = tx.Where("status_flag = ?", sysMenu.StatusFlag) + } - // SelectMenuByIds 根据菜单ID查询信息 - SelectMenuByIds(menuIds []string) []model.SysMenu + // 个人菜单 + if userId > 0 { + tx = tx.Where(`menu_id in ( + select menu_id from sys_role_menu where role_id in ( + select role_id from sys_user_role where user_id = ? + ))`, userId) + } - // HasChildByMenuIdAndStatus 存在菜单子节点数量与状态 - HasChildByMenuIdAndStatus(menuId, status string) int64 - - // InsertMenu 新增菜单信息 - InsertMenu(sysMenu model.SysMenu) string - - // UpdateMenu 修改菜单信息 - UpdateMenu(sysMenu model.SysMenu) int64 - - // DeleteMenuById 删除菜单管理信息 - DeleteMenuById(menuId string) int64 - - // CheckUniqueMenu 校验菜单是否唯一 - CheckUniqueMenu(sysMenu model.SysMenu) string + // 查询数据 + rows := []model.SysMenu{} + tx.Order("parent_id, menu_sort") + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询信息 +func (r SysMenu) SelectByIds(menuIds []int64) []model.SysMenu { + rows := []model.SysMenu{} + if len(menuIds) <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysMenu{}) + // 构建查询条件 + tx = tx.Where("menu_id in ? and del_flag = '0'", menuIds) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 +func (r SysMenu) Insert(sysMenu model.SysMenu) int64 { + sysMenu.DelFlag = "0" + if sysMenu.MenuId <= 0 { + return 0 + } + if sysMenu.Icon == "" { + sysMenu.Icon = "#" + } + if sysMenu.CreateBy != "" { + ms := time.Now().UnixMilli() + sysMenu.UpdateBy = sysMenu.CreateBy + sysMenu.UpdateTime = ms + sysMenu.CreateTime = ms + } + + // 根据菜单类型重置参数 + if sysMenu.MenuType == constants.MENU_TYPE_BUTTON { + sysMenu.Component = "" + sysMenu.FrameFlag = "1" + sysMenu.CacheFlag = "1" + sysMenu.VisibleFlag = "1" + sysMenu.MenuPath = "" + sysMenu.Icon = "#" + } else if sysMenu.MenuType == constants.MENU_TYPE_DIR { + sysMenu.Component = "" + sysMenu.FrameFlag = "1" + sysMenu.CacheFlag = "1" + sysMenu.Perms = "" + } + + // 执行插入 + if err := db.DB("").Create(&sysMenu).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysMenu.MenuId +} + +// Update 修改信息 +func (r SysMenu) Update(sysMenu model.SysMenu) int64 { + if sysMenu.MenuId <= 0 { + return 0 + } + if sysMenu.Icon == "" { + sysMenu.Icon = "#" + } + if sysMenu.UpdateBy != "" { + sysMenu.UpdateTime = time.Now().UnixMilli() + } + + // 根据菜单类型重置参数 + if sysMenu.MenuType == constants.MENU_TYPE_BUTTON { + sysMenu.Component = "" + sysMenu.FrameFlag = "1" + sysMenu.CacheFlag = "1" + sysMenu.VisibleFlag = "1" + sysMenu.MenuPath = "" + sysMenu.Icon = "#" + } else if sysMenu.MenuType == constants.MENU_TYPE_DIR { + sysMenu.Component = "" + sysMenu.FrameFlag = "1" + sysMenu.CacheFlag = "1" + sysMenu.Perms = "" + } + + tx := db.DB("").Model(&model.SysMenu{}) + // 构建查询条件 + tx = tx.Where("menu_id = ?", sysMenu.MenuId) + tx = tx.Omit("menu_id", "del_flag", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(sysMenu).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteById 删除信息 返回受影响行数 +func (r SysMenu) DeleteById(menuId int64) int64 { + if menuId <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysMenu{}) + // 构建查询条件 + tx = tx.Where("menu_id = ?", menuId) + // 执行更新删除标记 + if err := tx.Update("del_flag", "1").Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 +func (r SysMenu) CheckUnique(sysMenu model.SysMenu) int64 { + tx := db.DB("").Model(&model.SysMenu{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if sysMenu.ParentId <= 0 { + tx = tx.Where("parent_id = ?", sysMenu.ParentId) + } + if sysMenu.MenuName != "" { + tx = tx.Where("menu_name = ?", sysMenu.MenuName) + } + if sysMenu.MenuPath != "" { + tx = tx.Where("menu_path = ?", sysMenu.MenuPath) + } + + // 查询数据 + var id int64 = 0 + if err := tx.Select("menu_id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id +} + +// ExistChildrenByMenuIdAndStatus 菜单下同状态存在子节点数量 +func (r SysMenu) ExistChildrenByMenuIdAndStatus(menuId int64, statusFlag string) int64 { + if menuId <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysMenu{}) + // 构建查询条件 + tx = tx.Where("parent_id = ? and del_flag = '0'", menuId) + if statusFlag != "" { + tx = tx.Where("status_flag = ?", statusFlag) + tx = tx.Where("menu_type in ?", []string{constants.MENU_TYPE_DIR, constants.MENU_TYPE_MENU}) + } + // 查询数据 + var count int64 = 0 + if err := tx.Count(&count).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return count + } + return count +} + +// SelectPermsByUserId 根据用户ID查询权限标识 +func (r SysMenu) SelectPermsByUserId(userId int64) []string { + rows := []string{} + if userId <= 0 { + return rows + } + tx := db.DB("").Table("sys_menu m") + // 构建查询条件 + tx = tx.Distinct("m.perms"). + Joins("left join sys_role_menu rm on m.menu_id = rm.menu_id"). + Joins("left join sys_user_role ur on rm.role_id = ur.role_id"). + Joins("left join sys_role r on r.role_id = ur.role_id"). + Where("m.status_flag = '1' and m.perms != '' and r.status_flag = '1' and r.del_flag = '0'"). + Where("ur.user_id = ?", userId) + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByRoleId 根据角色ID查询菜单树信息 +func (r SysMenu) SelectByRoleId(roleId int64, menuCheckStrictly bool) []int64 { + if roleId <= 0 { + return []int64{} + } + + tx := db.DB("").Model(&model.SysMenu{}) + tx = tx.Where("del_flag = '0'") + tx = tx.Where("menu_id in (select menu_id from sys_role_menu where role_id = ?)", roleId) + // 父子互相关联显示,取所有子节点 + if menuCheckStrictly { + tx = tx.Where(`menu_id not in ( + select m.parent_id from sys_menu m + inner join sys_role_menu rm on m.menu_id = rm.menu_id + and rm.role_id = ? + )`, roleId) + } + + // 查询数据 + rows := []int64{} + if err := tx.Distinct("menu_id").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectTreeByUserId 根据用户ID查询菜单 0为管理员查询全部菜单,其他为用户ID查询权限 +func (r SysMenu) SelectTreeByUserId(userId int64) []model.SysMenu { + if userId < 0 { + return []model.SysMenu{} + } + + tx := db.DB("").Model(&model.SysMenu{}) + tx = tx.Where("del_flag = '0'") + // 管理员全部菜单 + if userId == 0 { + tx = tx.Where("menu_type in ? and status_flag = '1'", []string{constants.MENU_TYPE_DIR, constants.MENU_TYPE_MENU}) + tx.Order("parent_id, menu_sort") + } else { + // 用户ID权限 + tx = tx.Where(`menu_type in ? and status_flag = '1' + and menu_id in ( + select menu_id from sys_role_menu where role_id in ( + select role_id from sys_user_role where user_id = ? + ))`, []string{constants.MENU_TYPE_DIR, constants.MENU_TYPE_MENU}, userId) + tx.Order("parent_id, menu_sort") + } + + // 查询数据 + rows := []model.SysMenu{} + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows } diff --git a/src/modules/system/repository/sys_menu.impl.go b/src/modules/system/repository/sys_menu.impl.go deleted file mode 100644 index 9407e655..00000000 --- a/src/modules/system/repository/sys_menu.impl.go +++ /dev/null @@ -1,474 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/constants/menu" - "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/system/model" -) - -// 实例化数据层 SysMenuImpl 结构体 -var NewSysMenuImpl = &SysMenuImpl{ - selectSql: `select - m.menu_id, m.menu_name, m.parent_id, m.menu_sort, m.path, m.component, m.is_frame, m.is_cache, m.menu_type, m.visible, m.status, ifnull(m.perms,'') as perms, m.icon, m.create_time, m.remark - from sys_menu m`, - - selectSqlByUser: `select distinct - m.menu_id, m.menu_name, m.parent_id, m.menu_sort, m.path, m.component, m.is_frame, m.is_cache, m.menu_type, m.visible, m.status, ifnull(m.perms,'') as perms, m.icon, m.create_time, m.remark - from sys_menu m - left join sys_role_menu rm on m.menu_id = rm.menu_id - left join sys_user_role ur on rm.role_id = ur.role_id - left join sys_role ro on ur.role_id = ro.role_id`, - - resultMap: map[string]string{ - "menu_id": "MenuID", - "menu_name": "MenuName", - "parent_name": "ParentName", - "parent_id": "ParentID", - "path": "Path", - "menu_sort": "MenuSort", - "component": "Component", - "is_frame": "IsFrame", - "is_cache": "IsCache", - "menu_type": "MenuType", - "visible": "Visible", - "status": "Status", - "perms": "Perms", - "icon": "Icon", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - "remark": "Remark", - }, -} - -// SysMenuImpl 菜单表 数据层处理 -type SysMenuImpl struct { - // 查询视图对象SQL - selectSql string - // 查询视图用户对象SQL - selectSqlByUser string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysMenuImpl) convertResultRows(rows []map[string]any) []model.SysMenu { - arr := make([]model.SysMenu, 0) - for _, row := range rows { - sysMenu := model.SysMenu{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&sysMenu, keyMapper, value) - } - } - arr = append(arr, sysMenu) - } - return arr -} - -// SelectMenuList 查询系统菜单列表 -func (r *SysMenuImpl) SelectMenuList(sysMenu model.SysMenu, userId string) []model.SysMenu { - // 查询条件拼接 - var conditions []string - var params []any - if sysMenu.MenuName != "" { - conditions = append(conditions, "m.menu_name like concat(?, '%')") - params = append(params, sysMenu.MenuName) - } - if sysMenu.Visible != "" { - conditions = append(conditions, "m.visible = ?") - params = append(params, sysMenu.Visible) - } - if sysMenu.Status != "" { - conditions = append(conditions, "m.status = ?") - params = append(params, sysMenu.Status) - } - - fromSql := r.selectSql - - // 个人菜单 - if userId != "*" { - fromSql = r.selectSqlByUser - conditions = append(conditions, "ur.user_id = ?") - params = append(params, userId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - orderSql := " order by m.parent_id, m.menu_sort" - querySql := fromSql + whereSql + orderSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysMenu{} - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectMenuPermsByUserId 根据用户ID查询权限 -func (r *SysMenuImpl) SelectMenuPermsByUserId(userId string) []string { - querySql := `select distinct m.perms as 'str' from sys_menu m - left join sys_role_menu rm on m.menu_id = rm.menu_id - left join sys_user_role ur on rm.role_id = ur.role_id - left join sys_role r on r.role_id = ur.role_id - where m.status = '1' and m.perms != '' and r.status = '1' and ur.user_id = ? ` - - // 查询结果 - results, err := datasource.RawDB("", querySql, []any{userId}) - if err != nil { - logger.Errorf("query err => %v", err) - return []string{} - } - - // 读取结果 - rows := make([]string, 0) - for _, m := range results { - rows = append(rows, fmt.Sprintf("%v", m["str"])) - } - return rows -} - -// SelectMenuTreeByUserId 根据用户ID查询菜单 -func (r *SysMenuImpl) SelectMenuTreeByUserId(userId string) []model.SysMenu { - var params []any - var querySql string - - if userId == "*" { - // 管理员全部菜单 - querySql = r.selectSql + ` where - m.menu_type in (?,?) and m.status = '1' - order by m.parent_id, m.menu_sort` - params = append(params, menu.TYPE_DIR) - params = append(params, menu.TYPE_MENU) - } else { - // 用户ID权限 - querySql = r.selectSqlByUser + ` where - m.menu_type in (?, ?) and m.status = '1' - and ur.user_id = ? and ro.status = '1' - order by m.parent_id, m.menu_sort` - params = append(params, menu.TYPE_DIR) - params = append(params, menu.TYPE_MENU) - params = append(params, userId) - } - - // 查询结果 - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysMenu{} - } - - return r.convertResultRows(results) -} - -// SelectMenuListByRoleId 根据角色ID查询菜单树信息 -func (r *SysMenuImpl) SelectMenuListByRoleId(roleId string, menuCheckStrictly bool) []string { - querySql := `select m.menu_id as 'str' from sys_menu m - left join sys_role_menu rm on m.menu_id = rm.menu_id - where rm.role_id = ? ` - var params []any - params = append(params, roleId) - // 展开 - if menuCheckStrictly { - querySql += ` and m.menu_id not in - (select m.parent_id from sys_menu m - inner join sys_role_menu rm on m.menu_id = rm.menu_id - and rm.role_id = ?) ` - params = append(params, roleId) - } - - // 查询结果 - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []string{} - } - - if len(results) > 0 { - ids := make([]string, 0) - for _, v := range results { - ids = append(ids, fmt.Sprintf("%v", v["str"])) - } - return ids - } - return []string{} -} - -// SelectMenuByIds 根据菜单ID查询信息 -func (r *SysMenuImpl) SelectMenuByIds(menuIds []string) []model.SysMenu { - placeholder := repo.KeyPlaceholderByQuery(len(menuIds)) - querySql := r.selectSql + " where m.menu_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(menuIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysMenu{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// HasChildByMenuIdAndStatus 存在菜单子节点数量与状态 -func (r *SysMenuImpl) HasChildByMenuIdAndStatus(menuId, status string) int64 { - querySql := "select count(1) as 'total' from sys_menu where parent_id = ?" - params := []any{menuId} - - // 菜单状态 - if status != "" { - querySql += " and status = ? and menu_type in (?, ?) " - params = append(params, status) - params = append(params, menu.TYPE_DIR) - params = append(params, menu.TYPE_MENU) - } - - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return 0 - } - if len(results) > 0 { - return parse.Number(results[0]["total"]) - } - return 0 -} - -// InsertMenu 新增菜单信息 -func (r *SysMenuImpl) InsertMenu(sysMenu model.SysMenu) string { - // 参数拼接 - params := make(map[string]any) - if sysMenu.MenuID != "" { - params["menu_id"] = sysMenu.MenuID - } - if sysMenu.ParentID != "" { - params["parent_id"] = sysMenu.ParentID - } - if sysMenu.MenuName != "" { - params["menu_name"] = sysMenu.MenuName - } - if sysMenu.MenuSort > 0 { - params["menu_sort"] = sysMenu.MenuSort - } - if sysMenu.Path != "" { - params["path"] = sysMenu.Path - } - if sysMenu.Component != "" { - params["component"] = sysMenu.Component - } - if sysMenu.IsFrame != "" { - params["is_frame"] = sysMenu.IsFrame - } - if sysMenu.IsCache != "" { - params["is_cache"] = sysMenu.IsCache - } - if sysMenu.MenuType != "" { - params["menu_type"] = sysMenu.MenuType - } - if sysMenu.Visible != "" { - params["visible"] = sysMenu.Visible - } - if sysMenu.Status != "" { - params["status"] = sysMenu.Status - } - if sysMenu.Perms != "" { - params["perms"] = sysMenu.Perms - } - if sysMenu.Icon != "" { - params["icon"] = sysMenu.Icon - } else { - params["icon"] = "#" - } - if sysMenu.Remark != "" { - params["remark"] = sysMenu.Remark - } - if sysMenu.CreateBy != "" { - params["create_by"] = sysMenu.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 根据菜单类型重置参数 - if sysMenu.MenuType == menu.TYPE_BUTTON { - params["component"] = "" - params["path"] = "" - params["icon"] = "#" - params["is_cache"] = "1" - params["is_frame"] = "1" - params["visible"] = "1" - params["status"] = "1" - } - if sysMenu.MenuType == menu.TYPE_DIR { - params["component"] = "" - params["perms"] = "" - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_menu (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// UpdateMenu 修改菜单信息 -func (r *SysMenuImpl) UpdateMenu(sysMenu model.SysMenu) int64 { - // 参数拼接 - params := make(map[string]any) - if sysMenu.MenuID != "" { - params["menu_id"] = sysMenu.MenuID - } - if sysMenu.ParentID != "" { - params["parent_id"] = sysMenu.ParentID - } - if sysMenu.MenuName != "" { - params["menu_name"] = sysMenu.MenuName - } - if sysMenu.MenuSort > 0 { - params["menu_sort"] = sysMenu.MenuSort - } - if sysMenu.Path != "" { - params["path"] = sysMenu.Path - } - if sysMenu.Component != "" { - params["component"] = sysMenu.Component - } - if sysMenu.IsFrame != "" { - params["is_frame"] = sysMenu.IsFrame - } - if sysMenu.IsCache != "" { - params["is_cache"] = sysMenu.IsCache - } - if sysMenu.MenuType != "" { - params["menu_type"] = sysMenu.MenuType - } - if sysMenu.Visible != "" { - params["visible"] = sysMenu.Visible - } - if sysMenu.Status != "" { - params["status"] = sysMenu.Status - } - if sysMenu.Perms != "" { - params["perms"] = sysMenu.Perms - } - if sysMenu.Icon != "" { - params["icon"] = sysMenu.Icon - } else { - params["icon"] = "#" - } - params["remark"] = sysMenu.Remark - if sysMenu.UpdateBy != "" { - params["update_by"] = sysMenu.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 根据菜单类型重置参数 - if sysMenu.MenuType == menu.TYPE_BUTTON { - params["component"] = "" - params["path"] = "" - params["icon"] = "#" - params["is_cache"] = "1" - params["is_frame"] = "1" - params["visible"] = "1" - params["status"] = "1" - } - if sysMenu.MenuType == menu.TYPE_DIR { - params["component"] = "" - params["perms"] = "" - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update sys_menu set " + strings.Join(keys, ",") + " where menu_id = ?" - - // 执行更新 - values = append(values, sysMenu.MenuID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteMenuById 删除菜单管理信息 -func (r *SysMenuImpl) DeleteMenuById(menuId string) int64 { - sql := "delete from sys_menu where menu_id = ?" - results, err := datasource.ExecDB("", sql, []any{menuId}) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// CheckUniqueMenu 校验菜单是否唯一 -func (r *SysMenuImpl) CheckUniqueMenu(sysMenu model.SysMenu) string { - // 查询条件拼接 - var conditions []string - var params []any - if sysMenu.MenuName != "" { - conditions = append(conditions, "menu_name = ?") - params = append(params, sysMenu.MenuName) - } - if sysMenu.ParentID != "" { - conditions = append(conditions, "parent_id = ?") - params = append(params, sysMenu.ParentID) - } - if sysMenu.Path != "" { - conditions = append(conditions, "path = ?") - params = append(params, sysMenu.Path) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - if whereSql == "" { - return "" - } - - // 查询数据 - querySql := "select menu_id as 'str' from sys_menu " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} diff --git a/src/modules/system/repository/sys_post.go b/src/modules/system/repository/sys_post.go index ba7b3f8f..ad0a1122 100644 --- a/src/modules/system/repository/sys_post.go +++ b/src/modules/system/repository/sys_post.go @@ -1,30 +1,182 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "time" -// ISysPost 岗位表 数据层接口 -type ISysPost interface { - // SelectPostPage 查询岗位分页数据集合 - SelectPostPage(query map[string]any) map[string]any + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) - // SelectPostList 查询岗位数据集合 - SelectPostList(sysPost model.SysPost) []model.SysPost +// NewSysPost 实例化数据层 +var NewSysPost = &SysPost{} - // SelectPostByIds 通过岗位ID查询岗位信息 - SelectPostByIds(postIds []string) []model.SysPost +// SysPost 岗位表 数据层处理 +type SysPost struct{} - // SelectPostListByUserId 根据用户ID获取岗位选择框列表 - SelectPostListByUserId(userId string) []model.SysPost +// SelectByPage 分页查询集合 +func (r SysPost) SelectByPage(query map[string]string) ([]model.SysPost, int64) { + tx := db.DB("").Model(&model.SysPost{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if v, ok := query["postCode"]; ok && v != "" { + tx = tx.Where("post_code like concat(?, '%')", v) + } + if v, ok := query["postName"]; ok && v != "" { + tx = tx.Where("post_name like concat(?, '%')", v) + } + if v, ok := query["statusFlag"]; ok && v != "" { + tx = tx.Where("status_flag = ?", v) + } - // DeletePostByIds 批量删除岗位信息 - DeletePostByIds(postIds []string) int64 + // 查询结果 + var total int64 = 0 + rows := []model.SysPost{} - // UpdatePost 修改岗位信息 - UpdatePost(sysPost model.SysPost) int64 + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } - // InsertPost 新增岗位信息 - InsertPost(sysPost model.SysPost) string - - // CheckUniquePost 校验岗位唯一 - CheckUniquePost(sysPost model.SysPost) string + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Order("post_sort asc").Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// Select 查询集合 +func (r SysPost) Select(sysPost model.SysPost) []model.SysPost { + tx := db.DB("").Model(&model.SysPost{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if sysPost.PostCode != "" { + tx = tx.Where("post_code like concat(?, '%')", sysPost.PostCode) + } + if sysPost.PostName != "" { + tx = tx.Where("post_name like concat(?, '%')", sysPost.PostName) + } + if sysPost.StatusFlag != "" { + tx = tx.Where("status_flag = ?", sysPost.StatusFlag) + } + + // 查询数据 + rows := []model.SysPost{} + if err := tx.Order("post_sort asc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询信息 +func (r SysPost) SelectByIds(postIds []int64) []model.SysPost { + rows := []model.SysPost{} + if len(postIds) <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysPost{}) + // 构建查询条件 + tx = tx.Where("post_id in ? and del_flag = '0'", postIds) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 返回新增数据ID +func (r SysPost) Insert(sysPost model.SysPost) int64 { + sysPost.DelFlag = "0" + if sysPost.CreateBy != "" { + ms := time.Now().UnixMilli() + sysPost.UpdateBy = sysPost.CreateBy + sysPost.UpdateTime = ms + sysPost.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(&sysPost).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysPost.PostId +} + +// Update 修改信息 返回受影响行数 +func (r SysPost) Update(sysPost model.SysPost) int64 { + if sysPost.PostId <= 0 { + return 0 + } + if sysPost.UpdateBy != "" { + sysPost.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.SysPost{}) + // 构建查询条件 + tx = tx.Where("post_id = ?", sysPost.PostId) + tx = tx.Omit("post_id", "del_flag", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(sysPost).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 返回受影响行数 +func (r SysPost) DeleteByIds(postIds []int64) int64 { + if len(postIds) <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysPost{}) + // 构建查询条件 + tx = tx.Where("post_id in ?", postIds) + // 执行更新删除标记 + if err := tx.Update("del_flag", "1").Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 返回ID +func (r SysPost) CheckUnique(sysPost model.SysPost) int64 { + tx := db.DB("").Model(&model.SysPost{}) + tx = tx.Where("del_flag = 0") + // 查询条件拼接 + if sysPost.PostName != "" { + tx = tx.Where("post_name= ?", sysPost.PostName) + } + if sysPost.PostCode != "" { + tx = tx.Where("post_code = ?", sysPost.PostCode) + } + + // 查询数据 + var id int64 = 0 + if err := tx.Select("post_id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id +} + +// SelectByUserId 根据用户ID获取岗位选择框列表 +func (r SysPost) SelectByUserId(userId int64) []model.SysPost { + rows := []model.SysPost{} + if userId <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysPost{}) + // 构建查询条件 + tx = tx.Where("post_id in (select post_id from sys_user_post where user_id = ?)", userId) + // 查询数据 + if err := tx.Order("post_id").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows } diff --git a/src/modules/system/repository/sys_post.impl.go b/src/modules/system/repository/sys_post.impl.go deleted file mode 100644 index c200811b..00000000 --- a/src/modules/system/repository/sys_post.impl.go +++ /dev/null @@ -1,321 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "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/system/model" -) - -// 实例化数据层 SysPostImpl 结构体 -var NewSysPostImpl = &SysPostImpl{ - selectSql: `select - post_id, post_code, post_name, post_sort, status, create_by, create_time, remark - from sys_post`, - - resultMap: map[string]string{ - "post_id": "PostID", - "post_code": "PostCode", - "post_name": "PostName", - "post_sort": "PostSort", - "status": "Status", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - "remark": "Remark", - }, -} - -// SysPostImpl 岗位表 数据层处理 -type SysPostImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysPostImpl) convertResultRows(rows []map[string]any) []model.SysPost { - arr := make([]model.SysPost, 0) - for _, row := range rows { - sysPost := model.SysPost{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&sysPost, keyMapper, value) - } - } - arr = append(arr, sysPost) - } - return arr -} - -// SelectPostPage 查询岗位分页数据集合 -func (r *SysPostImpl) SelectPostPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["postCode"]; ok && v != "" { - conditions = append(conditions, "post_code like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["postName"]; ok && v != "" { - conditions = append(conditions, "post_name like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "status = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysPost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from sys_post" - 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 := " order by post_sort limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectPostList 查询岗位数据集合 -func (r *SysPostImpl) SelectPostList(sysPost model.SysPost) []model.SysPost { - // 查询条件拼接 - var conditions []string - var params []any - if sysPost.PostCode != "" { - conditions = append(conditions, "post_code like concat(?, '%')") - params = append(params, sysPost.PostCode) - } - if sysPost.PostName != "" { - conditions = append(conditions, "post_name like concat(?, '%')") - params = append(params, sysPost.PostName) - } - if sysPost.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, sysPost.Status) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - orderSql := " order by post_sort" - querySql := r.selectSql + whereSql + orderSql - rows, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysPost{} - } - return r.convertResultRows(rows) -} - -// SelectPostByIds 通过岗位ID查询岗位信息 -func (r *SysPostImpl) SelectPostByIds(postIds []string) []model.SysPost { - placeholder := repo.KeyPlaceholderByQuery(len(postIds)) - querySql := r.selectSql + " where post_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(postIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysPost{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// SelectPostListByUserId 根据用户ID获取岗位选择框列表 -func (r *SysPostImpl) SelectPostListByUserId(userId string) []model.SysPost { - // 查询数据 - querySql := `select distinct - p.post_id, p.post_name, p.post_code - from sys_post p - left join sys_user_post up on up.post_id = p.post_id - left join sys_user u on u.user_id = up.user_id - where u.user_id = ? order by p.post_id` - rows, err := datasource.RawDB("", querySql, []any{userId}) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysPost{} - } - return r.convertResultRows(rows) -} - -// DeletePostByIds 批量删除岗位信息 -func (r *SysPostImpl) DeletePostByIds(postIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(postIds)) - sql := "delete from sys_post where post_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(postIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// UpdatePost 修改岗位信息 -func (r *SysPostImpl) UpdatePost(sysPost model.SysPost) int64 { - // 参数拼接 - params := make(map[string]any) - if sysPost.PostCode != "" { - params["post_code"] = sysPost.PostCode - } - if sysPost.PostName != "" { - params["post_name"] = sysPost.PostName - } - if sysPost.PostSort > 0 { - params["post_sort"] = sysPost.PostSort - } - if sysPost.Status != "" { - params["status"] = sysPost.Status - } - params["remark"] = sysPost.Remark - if sysPost.UpdateBy != "" { - params["update_by"] = sysPost.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update sys_post set " + strings.Join(keys, ",") + " where post_id = ?" - - // 执行更新 - values = append(values, sysPost.PostID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// InsertPost 新增岗位信息 -func (r *SysPostImpl) InsertPost(sysPost model.SysPost) string { - // 参数拼接 - params := make(map[string]any) - if sysPost.PostID != "" { - params["post_id"] = sysPost.PostID - } - if sysPost.PostCode != "" { - params["post_code"] = sysPost.PostCode - } - if sysPost.PostName != "" { - params["post_name"] = sysPost.PostName - } - if sysPost.PostSort > 0 { - params["post_sort"] = sysPost.PostSort - } - if sysPost.Status != "" { - params["status"] = sysPost.Status - } - if sysPost.Remark != "" { - params["remark"] = sysPost.Remark - } - if sysPost.CreateBy != "" { - params["create_by"] = sysPost.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_post (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// CheckUniquePost 校验岗位唯一 -func (r *SysPostImpl) CheckUniquePost(sysPost model.SysPost) string { - // 查询条件拼接 - var conditions []string - var params []any - if sysPost.PostName != "" { - conditions = append(conditions, "post_name= ?") - params = append(params, sysPost.PostName) - } - if sysPost.PostCode != "" { - conditions = append(conditions, "post_code = ?") - params = append(params, sysPost.PostCode) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select post_id as 'str' from sys_post " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} diff --git a/src/modules/system/repository/sys_role.go b/src/modules/system/repository/sys_role.go index 85fd822f..a9bd400a 100644 --- a/src/modules/system/repository/sys_role.go +++ b/src/modules/system/repository/sys_role.go @@ -1,30 +1,209 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "fmt" + "time" -// ISysRole 角色表 数据层接口 -type ISysRole interface { - // SelectRolePage 根据条件分页查询角色数据 - SelectRolePage(query map[string]any, dataScopeSQL string) map[string]any + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) - // SelectRoleList 根据条件查询角色数据 - SelectRoleList(sysRole model.SysRole, dataScopeSQL string) []model.SysRole +// NewSysRole 实例化数据层 +var NewSysRole = &SysRole{} - // SelectRoleListByUserId 根据用户ID获取角色选择框列表 - SelectRoleListByUserId(userId string) []model.SysRole +// SysRole 角色表 数据层处理 +type SysRole struct{} - // SelectRoleByIds 通过角色ID查询角色 - SelectRoleByIds(roleIds []string) []model.SysRole +// SelectByPage 分页查询集合 +func (r SysRole) SelectByPage(query map[string]string) ([]model.SysRole, int64) { + tx := db.DB("").Model(&model.SysRole{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if v, ok := query["roleName"]; ok && v != "" { + tx = tx.Where("role_name like concat(?, '%')", v) + } + if v, ok := query["roleKey"]; ok && v != "" { + tx = tx.Where("role_key like concat(?, '%')", v) + } + if v, ok := query["statusFlag"]; ok && v != "" { + tx = tx.Where("status_flag = ?", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s000", v) + tx = tx.Where("create_time >= ?", v) + } else if len(v) == 13 { + tx = tx.Where("create_time >= ?", v) + } + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s999", v) + tx = tx.Where("create_time <= ?", v) + } else if len(v) == 13 { + tx = tx.Where("create_time <= ?", v) + } + } + if v, ok := query["deptId"]; ok && v != "" { + tx = tx.Where(`role_id in ( + select distinct role_id from sys_role_dept where sys_role_dept.dept_id IN ( + SELECT dept_id FROM sys_dept WHERE dept_id = ? or find_in_set(? , ancestors ) + ))`, v, v) + } - // UpdateRole 修改角色信息 - UpdateRole(sysRole model.SysRole) int64 + // 查询结果 + var total int64 = 0 + rows := []model.SysRole{} - // InsertRole 新增角色信息 - InsertRole(sysRole model.SysRole) string + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } - // DeleteRoleByIds 批量删除角色信息 - DeleteRoleByIds(roleIds []string) int64 - - // CheckUniqueRole 校验角色是否唯一 - CheckUniqueRole(sysRole model.SysRole) string + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Order("role_sort asc").Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// Select 查询集合 +func (r SysRole) Select(sysRole model.SysRole) []model.SysRole { + tx := db.DB("").Model(&model.SysRole{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if sysRole.RoleKey != "" { + tx = tx.Where("role_key like concat(?, '%')", sysRole.RoleKey) + } + if sysRole.RoleName != "" { + tx = tx.Where("role_name like concat(?, '%')", sysRole.RoleName) + } + if sysRole.StatusFlag != "" { + tx = tx.Where("status_flag = ?", sysRole.StatusFlag) + } + + // 查询数据 + rows := []model.SysRole{} + if err := tx.Order("role_sort asc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询信息 +func (r SysRole) SelectByIds(roleIds []int64) []model.SysRole { + rows := []model.SysRole{} + if len(roleIds) <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysRole{}) + // 构建查询条件 + tx = tx.Where("role_id in ? and del_flag = '0'", roleIds) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 返回新增数据ID +func (r SysRole) Insert(sysRole model.SysRole) int64 { + sysRole.DelFlag = "0" + if sysRole.CreateBy != "" { + ms := time.Now().UnixMilli() + sysRole.UpdateBy = sysRole.CreateBy + sysRole.UpdateTime = ms + sysRole.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(&sysRole).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysRole.RoleId +} + +// Update 修改信息 返回受影响行数 +func (r SysRole) Update(sysRole model.SysRole) int64 { + if sysRole.RoleId <= 0 { + return 0 + } + if sysRole.UpdateBy != "" { + sysRole.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.SysRole{}) + // 构建查询条件 + tx = tx.Where("role_id = ?", sysRole.RoleId) + tx = tx.Omit("role_id", "del_flag", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(sysRole).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 返回受影响行数 +func (r SysRole) DeleteByIds(roleIds []int64) int64 { + if len(roleIds) <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysRole{}) + // 构建查询条件 + tx = tx.Where("role_id in ?", roleIds) + // 执行更新删除标记 + if err := tx.Update("del_flag", "1").Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 +func (r SysRole) CheckUnique(sysRole model.SysRole) int64 { + tx := db.DB("").Model(&model.SysRole{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if sysRole.RoleName != "" { + tx = tx.Where("role_name = ?", sysRole.RoleName) + } + if sysRole.RoleKey != "" { + tx = tx.Where("role_key = ?", sysRole.RoleKey) + } + + // 查询数据 + var id int64 = 0 + if err := tx.Select("role_id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id +} + +// SelectByUserId 根据用户ID获取角色信息 +func (r SysRole) SelectByUserId(userId int64) []model.SysRole { + rows := []model.SysRole{} + if userId <= 0 { + return rows + } + tx := db.DB("").Table("sys_user_role ur") + // 构建查询条件 + tx = tx.Distinct("r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly, r.status_flag, r.del_flag, r.create_time, r.remark"). + Joins("left join sys_user u on u.user_id = ur.user_id"). + Joins("left join sys_role r on r.role_id = ur.role_id"). + Where("u.del_flag = '0' AND ur.user_id = ?", userId) + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows } diff --git a/src/modules/system/repository/sys_role.impl.go b/src/modules/system/repository/sys_role.impl.go deleted file mode 100644 index 8fe89fa3..00000000 --- a/src/modules/system/repository/sys_role.impl.go +++ /dev/null @@ -1,375 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "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/system/model" -) - -// 实例化数据层 SysRoleImpl 结构体 -var NewSysRoleImpl = &SysRoleImpl{ - selectSql: `select distinct - r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, - r.dept_check_strictly, r.status, r.del_flag, r.create_time, r.remark - from sys_role r - left join sys_user_role ur on ur.role_id = r.role_id - left join sys_user u on u.user_id = ur.user_id - left join sys_dept d on u.dept_id = d.dept_id`, - - resultMap: map[string]string{ - "role_id": "RoleID", - "role_name": "RoleName", - "role_key": "RoleKey", - "role_sort": "RoleSort", - "data_scope": "DataScope", - "menu_check_strictly": "MenuCheckStrictly", - "dept_check_strictly": "DeptCheckStrictly", - "status": "Status", - "del_flag": "DelFlag", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - "remark": "Remark", - }, -} - -// SysRoleImpl 角色表 数据层处理 -type SysRoleImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysRoleImpl) convertResultRows(rows []map[string]any) []model.SysRole { - arr := make([]model.SysRole, 0) - for _, row := range rows { - sysRole := model.SysRole{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&sysRole, keyMapper, value) - } - } - arr = append(arr, sysRole) - } - return arr -} - -// SelectRolePage 根据条件分页查询角色数据 -func (r *SysRoleImpl) SelectRolePage(query map[string]any, dataScopeSQL string) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["roleId"]; ok && v != "" { - conditions = append(conditions, "r.role_id = ?") - params = append(params, v) - } - if v, ok := query["roleName"]; ok && v != "" { - conditions = append(conditions, "r.role_name like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["roleKey"]; ok && v != "" { - conditions = append(conditions, "r.role_key like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "r.status = ?") - params = append(params, v) - } - beginTime, ok := query["beginTime"] - if !ok { - beginTime, ok = query["params[beginTime]"] - } - if ok && beginTime != "" { - conditions = append(conditions, "r.create_time >= ?") - params = append(params, parse.Number(beginTime.(string))) - } - endTime, ok := query["endTime"] - if !ok { - endTime, ok = query["params[endTime]"] - } - if ok && endTime != "" { - conditions = append(conditions, "r.create_time <= ?") - params = append(params, parse.Number(endTime.(string))) - } - if v, ok := query["deptId"]; ok && v != "" { - conditions = append(conditions, `(u.dept_id = ? or u.dept_id in ( - select t.dept_id from sys_dept t where find_in_set(?, ancestors) - ))`) - params = append(params, v) - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := " where r.del_flag = '0' and r.role_id != '1' " - if len(conditions) > 0 { - whereSql += " and " + strings.Join(conditions, " and ") - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysRole{}, - } - - // 查询数量 长度为0直接返回 - totalSql := `select count(distinct r.role_id) as 'total' from sys_role r - left join sys_user_role ur on ur.role_id = r.role_id - left join sys_user u on u.user_id = ur.user_id - left join sys_dept d on u.dept_id = d.dept_id` - totalRows, err := datasource.RawDB("", totalSql+whereSql+dataScopeSQL, 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 := " order by r.role_sort asc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + dataScopeSQL + 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 -} - -// SelectRoleList 根据条件查询角色数据 -func (r *SysRoleImpl) SelectRoleList(sysRole model.SysRole, dataScopeSQL string) []model.SysRole { - // 查询条件拼接 - var conditions []string - var params []any - if sysRole.RoleID != "" { - conditions = append(conditions, "r.role_id = ?") - params = append(params, sysRole.RoleID) - } - if sysRole.RoleKey != "" { - conditions = append(conditions, "r.role_key like concat(?, '%')") - params = append(params, sysRole.RoleKey) - } - if sysRole.RoleName != "" { - conditions = append(conditions, "r.role_name like concat(?, '%')") - params = append(params, sysRole.RoleName) - } - if sysRole.Status != "" { - conditions = append(conditions, "r.status = ?") - params = append(params, sysRole.Status) - } - - // 构建查询条件语句 - whereSql := " where r.del_flag = '0' " - if len(conditions) > 0 { - whereSql += " and " + strings.Join(conditions, " and ") - } - - // 查询数据 - orderSql := " order by r.role_sort" - querySql := r.selectSql + whereSql + dataScopeSQL + orderSql - rows, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysRole{} - } - return r.convertResultRows(rows) -} - -// SelectRoleListByUserId 根据用户ID获取角色选择框列表 -func (r *SysRoleImpl) SelectRoleListByUserId(userId string) []model.SysRole { - querySql := r.selectSql + " where r.del_flag = '0' and ur.user_id = ?" - results, err := datasource.RawDB("", querySql, []any{userId}) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysRole{} - } - return r.convertResultRows(results) -} - -// SelectRoleByIds 通过角色ID查询角色 -func (r *SysRoleImpl) SelectRoleByIds(roleIds []string) []model.SysRole { - placeholder := repo.KeyPlaceholderByQuery(len(roleIds)) - querySql := r.selectSql + " where r.role_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(roleIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysRole{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// UpdateRole 修改角色信息 -func (r *SysRoleImpl) UpdateRole(sysRole model.SysRole) int64 { - // 参数拼接 - params := make(map[string]any) - if sysRole.RoleName != "" { - params["role_name"] = sysRole.RoleName - } - if sysRole.RoleKey != "" { - params["role_key"] = sysRole.RoleKey - } - if sysRole.RoleSort > 0 { - params["role_sort"] = sysRole.RoleSort - } - if sysRole.DataScope != "" { - params["data_scope"] = sysRole.DataScope - } - if sysRole.MenuCheckStrictly != "" { - params["menu_check_strictly"] = sysRole.MenuCheckStrictly - } - if sysRole.DeptCheckStrictly != "" { - params["dept_check_strictly"] = sysRole.DeptCheckStrictly - } - if sysRole.Status != "" { - params["status"] = sysRole.Status - } - params["remark"] = sysRole.Remark - if sysRole.UpdateBy != "" { - params["update_by"] = sysRole.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update sys_role set " + strings.Join(keys, ",") + " where role_id = ?" - - // 执行更新 - values = append(values, sysRole.RoleID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// InsertRole 新增角色信息 -func (r *SysRoleImpl) InsertRole(sysRole model.SysRole) string { - // 参数拼接 - params := make(map[string]any) - if sysRole.RoleID != "" { - params["role_id"] = sysRole.RoleID - } - if sysRole.RoleName != "" { - params["role_name"] = sysRole.RoleName - } - if sysRole.RoleKey != "" { - params["role_key"] = sysRole.RoleKey - } - if sysRole.RoleSort > 0 { - params["role_sort"] = sysRole.RoleSort - } - if sysRole.DataScope != "" { - params["data_scope"] = sysRole.DataScope - } - if sysRole.MenuCheckStrictly != "" { - params["menu_check_strictly"] = sysRole.MenuCheckStrictly - } - if sysRole.DeptCheckStrictly != "" { - params["dept_check_strictly"] = sysRole.DeptCheckStrictly - } - if sysRole.Status != "" { - params["status"] = sysRole.Status - } - params["remark"] = sysRole.Remark - if sysRole.CreateBy != "" { - params["create_by"] = sysRole.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_role (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// DeleteRoleByIds 批量删除角色信息 -func (r *SysRoleImpl) DeleteRoleByIds(roleIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(roleIds)) - sql := "update sys_role set del_flag = '1' where role_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(roleIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// CheckUniqueRole 校验角色是否唯一 -func (r *SysRoleImpl) CheckUniqueRole(sysRole model.SysRole) string { - // 查询条件拼接 - var conditions []string - var params []any - if sysRole.RoleName != "" { - conditions = append(conditions, "r.role_name = ?") - params = append(params, sysRole.RoleName) - } - if sysRole.RoleKey != "" { - conditions = append(conditions, "r.role_key = ?") - params = append(params, sysRole.RoleKey) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select role_id as 'str' from sys_role r " + whereSql + " and r.del_flag = '0' limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} diff --git a/src/modules/system/repository/sys_role_dept.go b/src/modules/system/repository/sys_role_dept.go index f46f00ff..948450f8 100644 --- a/src/modules/system/repository/sys_role_dept.go +++ b/src/modules/system/repository/sys_role_dept.go @@ -1,15 +1,55 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) -// ISysRoleDept 角色与部门关联表 数据层接口 -type ISysRoleDept interface { - // DeleteRoleDept 批量删除角色部门关联信息 - DeleteRoleDept(roleIds []string) int64 +// NewSysRoleDept 实例化数据层 +var NewSysRoleDept = &SysRoleDept{} - // DeleteDeptRole 批量删除部门角色关联信息 - DeleteDeptRole(deptIds []string) int64 +// SysRoleDept 角色与部门关联表 数据层处理 +type SysRoleDept struct{} - // BatchRoleDept 批量新增角色部门信息 - BatchRoleDept(sysRoleDepts []model.SysRoleDept) int64 +// DeleteByRoleIds 批量删除信息By角色 +func (r SysRoleDept) DeleteByRoleIds(roleIds []int64) int64 { + if len(roleIds) <= 0 { + return 0 + } + tx := db.DB("").Where("role_id in ?", roleIds) + // 执行删除 + if err := tx.Delete(&model.SysRoleDept{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByDeptIds 批量删除信息By部门 +func (r SysRoleDept) DeleteByDeptIds(deptIds []int64) int64 { + if len(deptIds) <= 0 { + return 0 + } + tx := db.DB("").Where("dept_id in ?", deptIds) + // 执行删除 + if err := tx.Delete(&model.SysRoleDept{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// BatchInsert 批量新增信息 +func (r SysRoleDept) BatchInsert(sysRoleDepts []model.SysRoleDept) int64 { + if len(sysRoleDepts) <= 0 { + return 0 + } + // 执行批量删除 + tx := db.DB("").CreateInBatches(sysRoleDepts, 500) + if err := tx.Error; err != nil { + logger.Errorf("delete batch err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/system/repository/sys_role_dept.impl.go b/src/modules/system/repository/sys_role_dept.impl.go deleted file mode 100644 index 04359127..00000000 --- a/src/modules/system/repository/sys_role_dept.impl.go +++ /dev/null @@ -1,58 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/system/model" -) - -// 实例化数据层 SysRoleDeptImpl 结构体 -var NewSysRoleDeptImpl = &SysRoleDeptImpl{} - -// SysRoleDeptImpl 角色与部门关联表 数据层处理 -type SysRoleDeptImpl struct{} - -// DeleteRoleDept 批量删除角色部门关联信息 -func (r *SysRoleDeptImpl) DeleteRoleDept(roleIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(roleIds)) - sql := "delete from sys_role_dept where role_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(roleIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// DeleteDeptRole 批量删除部门角色关联信息 -func (r *SysRoleDeptImpl) DeleteDeptRole(deptIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(deptIds)) - sql := "delete from sys_role_dept where dept_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(deptIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// BatchRoleDept 批量新增角色部门信息 -func (r *SysRoleDeptImpl) BatchRoleDept(sysRoleDepts []model.SysRoleDept) int64 { - keyValues := make([]string, 0) - for _, item := range sysRoleDepts { - keyValues = append(keyValues, fmt.Sprintf("(%s,%s)", item.RoleID, item.DeptID)) - } - sql := "insert into sys_role_dept(role_id, dept_id) values " + strings.Join(keyValues, ",") - results, err := datasource.ExecDB("", sql, nil) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/system/repository/sys_role_menu.go b/src/modules/system/repository/sys_role_menu.go index 486ba95f..4032bf9c 100644 --- a/src/modules/system/repository/sys_role_menu.go +++ b/src/modules/system/repository/sys_role_menu.go @@ -1,18 +1,71 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) -// ISysRoleMenu 角色与菜单关联表 数据层接口 -type ISysRoleMenu interface { - // CheckMenuExistRole 查询菜单分配给角色使用数量 - CheckMenuExistRole(menuId string) int64 +// NewSysRoleMenu 实例化数据层 +var NewSysRoleMenu = &SysRoleMenu{} - // DeleteRoleMenu 批量删除角色和菜单关联 - DeleteRoleMenu(roleIds []string) int64 +// SysRoleMenu 角色与菜单关联表 数据层处理 +type SysRoleMenu struct{} - // DeleteMenuRole 批量删除菜单和角色关联 - DeleteMenuRole(menuIds []string) int64 - - // BatchRoleMenu 批量新增角色菜单信息 - BatchRoleMenu(sysRoleMenus []model.SysRoleMenu) int64 +// ExistRoleByMenuId 存在角色使用数量By菜单 +func (r SysRoleMenu) ExistRoleByMenuId(menuId int64) int64 { + if menuId <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysRoleMenu{}) + tx = tx.Where("menu_id = ?", menuId) + // 查询数据 + var count int64 = 0 + if err := tx.Count(&count).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return count + } + return count +} + +// DeleteByRoleIds 批量删除关联By角色 +func (r SysRoleMenu) DeleteByRoleIds(roleIds []int64) int64 { + if len(roleIds) <= 0 { + return 0 + } + tx := db.DB("").Where("role_id in ?", roleIds) + // 执行删除 + if err := tx.Delete(&model.SysRoleMenu{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByMenuIds 批量删除关联By菜单 +func (r SysRoleMenu) DeleteByMenuIds(menuIds []int64) int64 { + if len(menuIds) <= 0 { + return 0 + } + tx := db.DB("").Where("menu_id in ?", menuIds) + // 执行删除 + if err := tx.Delete(&model.SysRoleMenu{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// BatchInsert 批量新增信息 +func (r SysRoleMenu) BatchInsert(sysRoleMenus []model.SysRoleMenu) int64 { + if len(sysRoleMenus) <= 0 { + return 0 + } + // 执行批量删除 + tx := db.DB("").CreateInBatches(sysRoleMenus, 500) + if err := tx.Error; err != nil { + logger.Errorf("delete batch err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/system/repository/sys_role_menu.impl.go b/src/modules/system/repository/sys_role_menu.impl.go deleted file mode 100644 index 0570d860..00000000 --- a/src/modules/system/repository/sys_role_menu.impl.go +++ /dev/null @@ -1,73 +0,0 @@ -package repository - -import ( - "fmt" - "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/system/model" -) - -// 实例化数据层 SysRoleMenuImpl 结构体 -var NewSysRoleMenuImpl = &SysRoleMenuImpl{} - -// SysRoleMenuImpl 角色与菜单关联表 数据层处理 -type SysRoleMenuImpl struct{} - -// CheckMenuExistRole 查询菜单分配给角色使用数量 -func (r *SysRoleMenuImpl) CheckMenuExistRole(menuId string) int64 { - querySql := "select count(1) as 'total' from sys_role_menu where menu_id = ?" - results, err := datasource.RawDB("", querySql, []any{menuId}) - if err != nil { - logger.Errorf("query err => %v", err) - return 0 - } - if len(results) > 0 { - return parse.Number(results[0]["total"]) - } - return 0 -} - -// DeleteRoleMenu 批量删除角色和菜单关联 -func (r *SysRoleMenuImpl) DeleteRoleMenu(roleIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(roleIds)) - sql := "delete from sys_role_menu where role_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(roleIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// DeleteMenuRole 批量删除菜单和角色关联 -func (r *SysRoleMenuImpl) DeleteMenuRole(menuIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(menuIds)) - sql := "delete from sys_role_menu where menu_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(menuIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// BatchRoleMenu 批量新增角色菜单信息 -func (r *SysRoleMenuImpl) BatchRoleMenu(sysRoleMenus []model.SysRoleMenu) int64 { - keyValues := make([]string, 0) - for _, item := range sysRoleMenus { - keyValues = append(keyValues, fmt.Sprintf("(%s,%s)", item.RoleID, item.MenuID)) - } - sql := "insert into sys_role_menu(role_id, menu_id) values " + strings.Join(keyValues, ",") - results, err := datasource.ExecDB("", sql, nil) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/system/repository/sys_user.go b/src/modules/system/repository/sys_user.go index cb45da28..f879b3b8 100644 --- a/src/modules/system/repository/sys_user.go +++ b/src/modules/system/repository/sys_user.go @@ -1,33 +1,280 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "fmt" + "time" -// ISysUser 用户表 数据层接口 -type ISysUser interface { - // SelectUserPage 根据条件分页查询用户列表 - SelectUserPage(query map[string]any, dataScopeSQL string) map[string]any + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/crypto" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/system/model" +) - // SelectAllocatedPage 根据条件分页查询分配用户角色列表 - SelectAllocatedPage(query map[string]any, dataScopeSQL string) map[string]any +// NewSysUser 实例化数据层 +var NewSysUser = &SysUser{} - // SelectUserList 根据条件查询用户列表 - SelectUserList(sysUser model.SysUser, dataScopeSQL string) []model.SysUser +// SysUser 用户表 数据层处理 +type SysUser struct{} - // SelectUserByIds 通过用户ID查询用户 - SelectUserByIds(userIds []string) []model.SysUser +// SelectByPage 分页查询集合 +func (r SysUser) SelectByPage(query map[string]string, dataScopeSQL string) ([]model.SysUser, int64) { + tx := db.DB("").Model(&model.SysUser{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if v, ok := query["userId"]; ok && v != "" { + tx = tx.Where("user_id = ?", v) + } + if v, ok := query["userName"]; ok && v != "" { + tx = tx.Where("user_name like concat(?, '%')", v) + } + if v, ok := query["phone"]; ok && v != "" { + tx = tx.Where("phone like concat(?, '%')", v) + } + if v, ok := query["statusFlag"]; ok && v != "" { + tx = tx.Where("status_flag = ?", v) + } + if v, ok := query["beginTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s000", v) + tx = tx.Where("login_time >= ?", v) + } else if len(v) == 13 { + tx = tx.Where("login_time >= ?", v) + } + } + if v, ok := query["endTime"]; ok && v != "" { + if len(v) == 10 { + v = fmt.Sprintf("%s999", v) + tx = tx.Where("login_time <= ?", v) + } else if len(v) == 13 { + tx = tx.Where("login_time <= ?", v) + } + } + if v, ok := query["deptId"]; ok && v != "" { + tx = tx.Where(`(dept_id = ? or dept_id in ( + select t.dept_id from sys_dept t where find_in_set(?, ancestors) + ))`, v, v) + } + if dataScopeSQL != "" { + tx = tx.Where(dataScopeSQL) + } - // SelectUserByUserName 通过用户登录账号查询用户 - SelectUserByUserName(userName string) model.SysUser + // 查询结果 + var total int64 = 0 + rows := []model.SysUser{} - // InsertUser 新增用户信息 - InsertUser(sysUser model.SysUser) string + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total + } - // UpdateUser 修改用户信息 - UpdateUser(sysUser model.SysUser) int64 - - // DeleteUserByIds 批量删除用户信息 - DeleteUserByIds(userIds []string) int64 - - // CheckUniqueUser 校验用户信息是否唯一 - CheckUniqueUser(sysUser model.SysUser) string + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + err := tx.Order("user_id desc").Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// Select 查询集合 +func (r SysUser) Select(sysUser model.SysUser) []model.SysUser { + tx := db.DB("").Model(&model.SysUser{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if sysUser.UserName != "" { + tx = tx.Where("user_name like concat(?, '%')", sysUser.UserName) + } + if sysUser.Phone != "" { + tx = tx.Where("phone like concat(?, '%')", sysUser.Phone) + } + if sysUser.StatusFlag != "" { + tx = tx.Where("status_flag = ?", sysUser.StatusFlag) + } + if sysUser.UserId > 0 { + tx = tx.Where("user_id = ?", sysUser.UserId) + } + + // 查询数据 + rows := []model.SysUser{} + if err := tx.Order("login_time desc").Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// SelectByIds 通过ID查询信息 +func (r SysUser) SelectByIds(userIds []int64) []model.SysUser { + rows := []model.SysUser{} + if len(userIds) <= 0 { + return rows + } + tx := db.DB("").Model(&model.SysUser{}) + // 构建查询条件 + tx = tx.Where("user_id in ? and del_flag = '0'", userIds) + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows + } + return rows +} + +// Insert 新增信息 +func (r SysUser) Insert(sysUser model.SysUser) int64 { + sysUser.DelFlag = "0" + if sysUser.CreateBy != "" { + ms := time.Now().UnixMilli() + sysUser.UpdateBy = sysUser.CreateBy + sysUser.UpdateTime = ms + sysUser.CreateTime = ms + } + if sysUser.Password != "" { + sysUser.Password = crypto.BcryptHash(sysUser.Password) + } + // 执行插入 + if err := db.DB("").Create(&sysUser).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) + return 0 + } + return sysUser.UserId +} + +// Update 修改信息 +func (r SysUser) Update(sysUser model.SysUser) int64 { + if sysUser.UserId <= 0 { + return 0 + } + if sysUser.UpdateBy != "" { + sysUser.UpdateTime = time.Now().UnixMilli() + } + if sysUser.Password != "" { + sysUser.Password = crypto.BcryptHash(sysUser.Password) + } + tx := db.DB("").Model(&model.SysUser{}) + // 构建查询条件 + tx = tx.Where("user_id = ?", sysUser.UserId) + tx = tx.Omit("user_id", "del_flag", "create_by", "create_time") + // 执行更新 + if err := tx.Updates(sysUser).Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 +func (r SysUser) DeleteByIds(userIds []int64) int64 { + if len(userIds) <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysUser{}) + // 构建查询条件 + tx = tx.Where("user_id in ?", userIds) + // 执行更新删除标记 + if err := tx.Update("del_flag", "1").Error; err != nil { + logger.Errorf("update err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// CheckUnique 检查信息是否唯一 +func (r SysUser) CheckUnique(sysUser model.SysUser) int64 { + tx := db.DB("").Model(&model.SysUser{}) + tx = tx.Where("del_flag = 0") + // 查询条件拼接 + if sysUser.UserName != "" { + tx = tx.Where("user_name = ?", sysUser.UserName) + } + if sysUser.Phone != "" { + tx = tx.Where("phone = ?", sysUser.Phone) + } + if sysUser.Email != "" { + tx = tx.Where("email = ?", sysUser.Email) + } + + // 查询数据 + var id int64 = 0 + if err := tx.Select("user_id").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id + } + return id +} + +// SelectByUserName 通过登录账号查询信息 +func (r SysUser) SelectByUserName(userName string) model.SysUser { + item := model.SysUser{} + if userName == "" { + return item + } + tx := db.DB("").Model(&model.SysUser{}) + // 构建查询条件 + tx = tx.Where("user_name = ? and del_flag = '0'", userName) + // 查询数据 + if err := tx.Limit(1).Find(&item).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return item + } + return item +} + +// SelectAuthUsersByPage 分页查询集合By分配用户角色 +func (r SysUser) SelectAuthUsersByPage(query map[string]string, dataScopeSQL string) ([]model.SysUser, int64) { + tx := db.DB("").Model(&model.SysUser{}) + tx = tx.Where("del_flag = '0'") + // 查询条件拼接 + if v, ok := query["userName"]; ok && v != "" { + tx = tx.Where("user_name like concat(?, '%')", v) + } + if v, ok := query["phone"]; ok && v != "" { + tx = tx.Where("phone like concat(?, '%')", v) + } + if v, ok := query["statusFlag"]; ok && v != "" { + tx = tx.Where("status_flag = ?", v) + } + + // 分配角色的用户 + if roleId, ok := query["roleId"]; ok && roleId != "" { + auth, ok := query["auth"] + if ok && parse.Boolean(auth) { + tx = tx.Where(`user_id in ( + select distinct u.user_id from sys_user u + inner join sys_user_role ur on u.user_id = ur.user_id + and ur.role_id = ? + )`, roleId) + } else { + tx = tx.Where(`user_id not in ( + select distinct u.user_id from sys_user u + inner join sys_user_role ur on u.user_id = ur.user_id + and ur.role_id = ? + )`, roleId) + } + } + if dataScopeSQL != "" { + tx = tx.Where(dataScopeSQL) + } + + // 查询结果 + var total int64 = 0 + rows := []model.SysUser{} + + // 查询数量为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) + err := tx.Order("user_id desc").Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total } diff --git a/src/modules/system/repository/sys_user.impl.go b/src/modules/system/repository/sys_user.impl.go deleted file mode 100644 index b2403043..00000000 --- a/src/modules/system/repository/sys_user.impl.go +++ /dev/null @@ -1,564 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/crypto" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/system/model" -) - -// 实例化数据层 SysUserImpl 结构体 -var NewSysUserImpl = &SysUserImpl{ - selectSql: `select - u.user_id, u.dept_id, u.user_name, u.nick_name, u.user_type, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, - d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, - r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status - from sys_user u - left join sys_dept d on u.dept_id = d.dept_id - left join sys_user_role ur on u.user_id = ur.user_id - left join sys_role r on r.role_id = ur.role_id`, - - sysUserMap: map[string]string{ - "user_id": "UserID", - "dept_id": "DeptID", - "user_name": "UserName", - "nick_name": "NickName", - "user_type": "UserType", - "email": "Email", - "phonenumber": "PhoneNumber", - "sex": "Sex", - "avatar": "Avatar", - "password": "Password", - "status": "Status", - "del_flag": "DelFlag", - "login_ip": "LoginIP", - "login_date": "LoginDate", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - "remark": "Remark", - }, - - sysDeptMap: map[string]string{ - "dept_id": "DeptID", - "parent_id": "ParentID", - "dept_name": "DeptName", - "ancestors": "Ancestors", - "order_num": "OrderNum", - "leader": "Leader", - "dept_status": "Status", - }, - - sysRoleMap: map[string]string{ - "role_id": "RoleID", - "role_name": "RoleName", - "role_key": "RoleKey", - "role_sort": "RoleSort", - "data_scope": "DataScope", - "role_status": "Status", - }, -} - -// SysUserImpl 用户表 数据层处理 -type SysUserImpl struct { - // 查询视图对象SQL - selectSql string - // 用户信息实体映射 - sysUserMap map[string]string - // 用户部门实体映射 一对一 - sysDeptMap map[string]string - // 用户角色实体映射 一对多 - sysRoleMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *SysUserImpl) convertResultRows(rows []map[string]any) []model.SysUser { - arr := make([]model.SysUser, 0) - - for _, row := range rows { - sysUser := model.SysUser{} - sysDept := model.SysDept{} - sysRole := model.SysRole{} - sysUser.Roles = []model.SysRole{} - - for key, value := range row { - if keyMapper, ok := r.sysUserMap[key]; ok { - repo.SetFieldValue(&sysUser, keyMapper, value) - } - if keyMapper, ok := r.sysDeptMap[key]; ok { - repo.SetFieldValue(&sysDept, keyMapper, value) - } - if keyMapper, ok := r.sysRoleMap[key]; ok { - repo.SetFieldValue(&sysRole, keyMapper, value) - } - } - - sysUser.Dept = sysDept - if sysRole.RoleKey != "" { - sysUser.Roles = append(sysUser.Roles, sysRole) - } - - one := true - for i, a := range arr { - if a.UserID == sysUser.UserID { - arrUser := &arr[i] - arrUser.Roles = append(arrUser.Roles, sysUser.Roles...) - one = false - break - } - } - if one { - arr = append(arr, sysUser) - } - } - - return arr -} - -// SelectUserPage 根据条件分页查询用户列表 -func (r *SysUserImpl) SelectUserPage(query map[string]any, dataScopeSQL string) map[string]any { - selectUserTotalSql := `select count(distinct u.user_id) as 'total' - from sys_user u - left join sys_dept d on u.dept_id = d.dept_id - left join sys_user_role ur on u.user_id = ur.user_id - left join sys_role r on r.role_id = ur.role_id` - - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["userId"]; ok && v != "" { - conditions = append(conditions, "u.user_id = ?") - params = append(params, v) - } - if v, ok := query["userName"]; ok && v != "" { - conditions = append(conditions, "u.user_name like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "u.status = ?") - params = append(params, v) - } - if v, ok := query["phonenumber"]; ok && v != "" { - conditions = append(conditions, "u.phonenumber like concat(?, '%')") - params = append(params, v) - } - beginTime, ok := query["beginTime"] - if !ok { - beginTime, ok = query["params[beginTime]"] - } - if ok && beginTime != "" { - conditions = append(conditions, "u.login_date >= ?") - params = append(params, parse.Number(beginTime.(string))) - } - endTime, ok := query["endTime"] - if !ok { - endTime, ok = query["params[endTime]"] - } - if ok && endTime != "" { - conditions = append(conditions, "u.login_date <= ?") - params = append(params, parse.Number(endTime.(string))) - } - if v, ok := query["deptId"]; ok && v != "" { - conditions = append(conditions, "(u.dept_id = ? or u.dept_id in ( select t.dept_id from sys_dept t where find_in_set(?, ancestors) ))") - params = append(params, v) - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := " where u.del_flag = '0' and u.user_id != '1' " - if len(conditions) > 0 { - whereSql += " and " + strings.Join(conditions, " and ") - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysUser{}, - } - - // 查询数量 长度为0直接返回 - totalSql := selectUserTotalSql + whereSql + dataScopeSQL - totalRows, err := datasource.RawDB("", totalSql, 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) - - // 查询数据 - querySql := r.selectSql + whereSql + dataScopeSQL + 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 -} - -// SelectAllocatedPage 根据条件分页查询分配用户角色列表 -func (r *SysUserImpl) SelectAllocatedPage(query map[string]any, dataScopeSQL string) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["userName"]; ok && v != "" { - conditions = append(conditions, "u.user_name like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["phonenumber"]; ok && v != "" { - conditions = append(conditions, "u.phonenumber like concat(?, '%')") - params = append(params, v) - } - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "u.status = ?") - params = append(params, v) - } - // 分配角色用户 - if allocated, ok := query["allocated"]; ok && allocated != "" { - if roleId, ok := query["roleId"]; ok && roleId != "" { - if parse.Boolean(allocated) { - conditions = append(conditions, "r.role_id = ?") - params = append(params, roleId) - } else { - conditions = append(conditions, `(r.role_id != ? or r.role_id IS NULL) - and u.user_id not in ( - select u.user_id from sys_user u - inner join sys_user_role ur on u.user_id = ur.user_id - and ur.role_id = ? - )`) - params = append(params, roleId) - params = append(params, roleId) - } - - } - } - - // 构建查询条件语句 - whereSql := " where u.del_flag = '0' and u.user_id != '1' " - if len(conditions) > 0 { - whereSql += " and " + strings.Join(conditions, " and ") - } - - // 查询结果 - result := map[string]any{ - "total": 0, - "rows": []model.SysUser{}, - } - - // 查询数量 长度为0直接返回 - totalSql := `select count(distinct u.user_id) as 'total' from sys_user u - left join sys_dept d on u.dept_id = d.dept_id - left join sys_user_role ur on u.user_id = ur.user_id - left join sys_role r on r.role_id = ur.role_id` - totalRows, err := datasource.RawDB("", totalSql+whereSql+dataScopeSQL, 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) - - // 查询数据 - querySql := `select distinct - u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, - u.phonenumber, u.status, u.create_time, d.dept_name - from sys_user u - left join sys_dept d on u.dept_id = d.dept_id - left join sys_user_role ur on u.user_id = ur.user_id - left join sys_role r on r.role_id = ur.role_id` - querySql = querySql + whereSql + dataScopeSQL + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectUserList 根据条件查询用户列表 -func (r *SysUserImpl) SelectUserList(sysUser model.SysUser, dataScopeSQL string) []model.SysUser { - selectUserSql := `select - u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader - from sys_user u - left join sys_dept d on u.dept_id = d.dept_id` - - // 查询条件拼接 - var conditions []string - var params []any - if sysUser.UserID != "" { - conditions = append(conditions, "u.user_id = ?") - params = append(params, sysUser.UserID) - } - if sysUser.UserName != "" { - conditions = append(conditions, "u.user_name like concat(?, '%')") - params = append(params, sysUser.UserName) - } - if sysUser.Status != "" { - conditions = append(conditions, "u.status = ?") - params = append(params, sysUser.Status) - } - if sysUser.PhoneNumber != "" { - conditions = append(conditions, "u.phonenumber like concat(?, '%')") - params = append(params, sysUser.PhoneNumber) - } - - // 构建查询条件语句 - whereSql := " where u.del_flag = '0' " - if len(conditions) > 0 { - whereSql += " and " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := selectUserSql + whereSql + dataScopeSQL - rows, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysUser{} - } - return r.convertResultRows(rows) -} - -// SelectUserByIds 通过用户ID查询用户 -func (r *SysUserImpl) SelectUserByIds(userIds []string) []model.SysUser { - placeholder := repo.KeyPlaceholderByQuery(len(userIds)) - querySql := r.selectSql + " where u.del_flag = '0' and u.user_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(userIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.SysUser{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// SelectUserByUserName 通过用户登录账号查询用户 -func (r *SysUserImpl) SelectUserByUserName(userName string) model.SysUser { - querySql := r.selectSql + " where u.del_flag = '0' and u.user_name = ?" - results, err := datasource.RawDB("", querySql, []any{userName}) - if err != nil { - logger.Errorf("query err => %v", err) - return model.SysUser{} - } - // 转换实体 - rows := r.convertResultRows(results) - if len(rows) > 0 { - return rows[0] - } - return model.SysUser{} -} - -// InsertUser 新增用户信息 -func (r *SysUserImpl) InsertUser(sysUser model.SysUser) string { - // 参数拼接 - params := make(map[string]any) - if sysUser.UserID != "" { - params["user_id"] = sysUser.UserID - } - if sysUser.DeptID != "" { - params["dept_id"] = sysUser.DeptID - } - if sysUser.UserName != "" { - params["user_name"] = sysUser.UserName - } - if sysUser.NickName != "" { - params["nick_name"] = sysUser.NickName - } - if sysUser.UserType != "" { - params["user_type"] = sysUser.UserType - } - if sysUser.Avatar != "" { - params["avatar"] = sysUser.Avatar - } - if sysUser.Email != "" { - params["email"] = sysUser.Email - } - if sysUser.PhoneNumber != "" { - params["phonenumber"] = sysUser.PhoneNumber - } - if sysUser.Sex != "" { - params["sex"] = sysUser.Sex - } - if sysUser.Password != "" { - password := crypto.BcryptHash(sysUser.Password) - params["password"] = password - } - if sysUser.Status != "" { - params["status"] = sysUser.Status - } - if sysUser.Remark != "" { - params["remark"] = sysUser.Remark - } - if sysUser.CreateBy != "" { - params["create_by"] = sysUser.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into sys_user (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// UpdateUser 修改用户信息 -func (r *SysUserImpl) UpdateUser(sysUser model.SysUser) int64 { - // 参数拼接 - params := make(map[string]any) - if sysUser.DeptID != "" { - params["dept_id"] = sysUser.DeptID - } - if sysUser.UserName != "" { - params["user_name"] = sysUser.UserName - } - if sysUser.NickName != "" { - params["nick_name"] = sysUser.NickName - } - if sysUser.UserType != "" { - params["user_type"] = sysUser.UserType - } - if sysUser.Avatar != "" { - params["avatar"] = sysUser.Avatar - } - - params["email"] = sysUser.Email - params["phonenumber"] = sysUser.PhoneNumber - params["sex"] = sysUser.Sex - if sysUser.Password != "" { - password := crypto.BcryptHash(sysUser.Password) - params["password"] = password - } - if sysUser.Status != "" { - params["status"] = sysUser.Status - } - params["remark"] = sysUser.Remark - if sysUser.UpdateBy != "" { - params["update_by"] = sysUser.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - if sysUser.LoginIP != "" { - params["login_ip"] = sysUser.LoginIP - } - if sysUser.LoginDate > 0 { - params["login_date"] = sysUser.LoginDate - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update sys_user set " + strings.Join(keys, ",") + " where user_id = ?" - - // 执行更新 - values = append(values, sysUser.UserID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteUserByIds 批量删除用户信息 -func (r *SysUserImpl) DeleteUserByIds(userIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(userIds)) - username := "CASE WHEN user_name = '' THEN user_name WHEN LENGTH(user_name) >= 36 THEN CONCAT('del_', SUBSTRING(user_name, 5, 36)) ELSE CONCAT('del_', user_name) END" - email := "CASE WHEN email = '' THEN email WHEN LENGTH(email) >= 64 THEN CONCAT('del_', SUBSTRING(email, 5, 64)) ELSE CONCAT('del_', email) END" - phonenumber := "CASE WHEN phonenumber = '' THEN phonenumber WHEN LENGTH(phonenumber) >= 16 THEN CONCAT('del_', SUBSTRING(phonenumber, 5, 16)) ELSE CONCAT('del_', phonenumber) END" - sql := fmt.Sprintf("update sys_user set del_flag = '1', user_name = %s, email = %s, phonenumber = %s where user_id in (%s)", username, email, phonenumber, placeholder) - parameters := repo.ConvertIdsSlice(userIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("update err => %v", err) - return 0 - } - return results -} - -// CheckUniqueUser 校验用户信息是否唯一 -func (r *SysUserImpl) CheckUniqueUser(sysUser model.SysUser) string { - // 查询条件拼接 - var conditions []string - var params []any - if sysUser.UserName != "" { - conditions = append(conditions, "user_name = ?") - params = append(params, sysUser.UserName) - } - if sysUser.PhoneNumber != "" { - conditions = append(conditions, "phonenumber = ?") - params = append(params, sysUser.PhoneNumber) - } - if sysUser.Email != "" { - conditions = append(conditions, "email = ?") - params = append(params, sysUser.Email) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select user_id as 'str' from sys_user " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} diff --git a/src/modules/system/repository/sys_user_post.go b/src/modules/system/repository/sys_user_post.go index 2a13449e..34d3d339 100644 --- a/src/modules/system/repository/sys_user_post.go +++ b/src/modules/system/repository/sys_user_post.go @@ -1,15 +1,57 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) -// ISysUserPost 用户与岗位关联表 数据层接口 -type ISysUserPost interface { - // CountUserPostByPostId 通过岗位ID查询岗位使用数量 - CountUserPostByPostId(postId string) int64 +// NewSysUserPost 实例化数据层 +var NewSysUserPost = &SysUserPost{} - // BatchUserPost 批量新增用户岗位信息 - BatchUserPost(sysUserPosts []model.SysUserPost) int64 +// SysUserPost 用户与岗位关联表 数据层处理 +type SysUserPost struct{} - // DeleteUserPost 批量删除用户和岗位关联 - DeleteUserPost(userIds []string) int64 +// ExistUserByPostId 存在用户使用数量 +func (r SysUserPost) ExistUserByPostId(postId int64) int64 { + if postId <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysUserPost{}) + tx = tx.Where("post_id = ?", postId) + // 查询数据 + var count int64 = 0 + if err := tx.Count(&count).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return count + } + return count +} + +// DeleteByUserIds 批量删除关联By用户 +func (r SysUserPost) DeleteByUserIds(userIds []int64) int64 { + if len(userIds) <= 0 { + return 0 + } + tx := db.DB("").Where("user_id in ?", userIds) + // 执行删除 + if err := tx.Delete(&model.SysUserPost{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// BatchInsert 批量新增信息 +func (r SysUserPost) BatchInsert(sysUserPosts []model.SysUserPost) int64 { + if len(sysUserPosts) <= 0 { + return 0 + } + // 执行批量删除 + tx := db.DB("").CreateInBatches(sysUserPosts, 500) + if err := tx.Error; err != nil { + logger.Errorf("delete batch err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/system/repository/sys_user_post.impl.go b/src/modules/system/repository/sys_user_post.impl.go deleted file mode 100644 index baa2393b..00000000 --- a/src/modules/system/repository/sys_user_post.impl.go +++ /dev/null @@ -1,60 +0,0 @@ -package repository - -import ( - "fmt" - "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/system/model" -) - -// 实例化数据层 SysUserPostImpl 结构体 -var NewSysUserPostImpl = &SysUserPostImpl{} - -// SysUserPostImpl 用户与岗位关联表 数据层处理 -type SysUserPostImpl struct{} - -// CountUserPostByPostId 通过岗位ID查询岗位使用数量 -func (r *SysUserPostImpl) CountUserPostByPostId(postId string) int64 { - querySql := "select count(1) as total from sys_user_role where role_id = ?" - results, err := datasource.RawDB("", querySql, []any{postId}) - if err != nil { - logger.Errorf("query err => %v", err) - return 0 - } - if len(results) > 0 { - return parse.Number(results[0]["total"]) - } - return 0 -} - -// DeleteUserPost 批量删除用户和岗位关联 -func (r *SysUserPostImpl) DeleteUserPost(userIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(userIds)) - sql := "delete from sys_user_post where user_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(userIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// BatchUserPost 批量新增用户岗位信息 -func (r *SysUserPostImpl) BatchUserPost(sysUserPosts []model.SysUserPost) int64 { - keyValues := make([]string, 0) - for _, item := range sysUserPosts { - keyValues = append(keyValues, fmt.Sprintf("(%s,%s)", item.UserID, item.PostID)) - } - sql := "insert into sys_user_post(user_id, post_id) values " + strings.Join(keyValues, ",") - results, err := datasource.ExecDB("", sql, nil) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/system/repository/sys_user_role.go b/src/modules/system/repository/sys_user_role.go index 392b88dc..1c269a44 100644 --- a/src/modules/system/repository/sys_user_role.go +++ b/src/modules/system/repository/sys_user_role.go @@ -1,18 +1,71 @@ package repository -import "be.ems/src/modules/system/model" +import ( + "be.ems/src/framework/database/db" + "be.ems/src/framework/logger" + "be.ems/src/modules/system/model" +) -// ISysUserRole 用户与角色关联表 数据层接口 -type ISysUserRole interface { - // CountUserRoleByRoleId 通过角色ID查询角色使用数量 - CountUserRoleByRoleId(roleId string) int64 +// NewSysUserRole 实例化数据层 +var NewSysUserRole = &SysUserRole{} - // BatchUserRole 批量新增用户角色信息 - BatchUserRole(sysUserRoles []model.SysUserRole) int64 +// SysUserRole 用户与角色关联表 数据层处理 +type SysUserRole struct{} - // DeleteUserRole 批量删除用户和角色关联 - DeleteUserRole(userIds []string) int64 - - // DeleteUserRoleByRoleId 批量取消授权用户角色 - DeleteUserRoleByRoleId(roleId string, userIds []string) int64 +// ExistUserByRoleId 存在用户使用数量 +func (r SysUserRole) ExistUserByRoleId(roleId int64) int64 { + if roleId <= 0 { + return 0 + } + tx := db.DB("").Model(&model.SysUserRole{}) + tx = tx.Where("role_id = ?", roleId) + // 查询数据 + var count int64 = 0 + if err := tx.Count(&count).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return count + } + return count +} + +// DeleteByUserIds 批量删除关联By用户 +func (r SysUserRole) DeleteByUserIds(userIds []int64) int64 { + if len(userIds) <= 0 { + return 0 + } + tx := db.DB("").Where("user_id in ?", userIds) + // 执行删除 + if err := tx.Delete(&model.SysUserRole{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// DeleteByRoleId 批量删除关联By角色 +func (r SysUserRole) DeleteByRoleId(roleId int64, userIds []int64) int64 { + if roleId <= 0 || len(userIds) <= 0 { + return 0 + } + tx := db.DB("").Where("role_id = ?", roleId).Where("user_id in ?", userIds) + // 执行删除 + if err := tx.Delete(&model.SysUserRole{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected +} + +// BatchInsert 批量新增信息 +func (r SysUserRole) BatchInsert(sysUserRoles []model.SysUserRole) int64 { + if len(sysUserRoles) <= 0 { + return 0 + } + // 执行批量删除 + tx := db.DB("").CreateInBatches(sysUserRoles, 500) + if err := tx.Error; err != nil { + logger.Errorf("delete batch err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/system/repository/sys_user_role.impl.go b/src/modules/system/repository/sys_user_role.impl.go deleted file mode 100644 index f472a1c4..00000000 --- a/src/modules/system/repository/sys_user_role.impl.go +++ /dev/null @@ -1,74 +0,0 @@ -package repository - -import ( - "fmt" - "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/system/model" -) - -// 实例化数据层 SysUserRoleImpl 结构体 -var NewSysUserRoleImpl = &SysUserRoleImpl{} - -// SysUserRoleImpl 用户与角色关联表 数据层处理 -type SysUserRoleImpl struct{} - -// CountUserRoleByRoleId 通过角色ID查询角色使用数量 -func (r *SysUserRoleImpl) CountUserRoleByRoleId(roleId string) int64 { - querySql := "select count(1) as total from sys_user_role where role_id = ?" - results, err := datasource.RawDB("", querySql, []any{roleId}) - if err != nil { - logger.Errorf("query err => %v", err) - return 0 - } - if len(results) > 0 { - return parse.Number(results[0]["total"]) - } - return 0 -} - -// BatchUserRole 批量新增用户角色信息 -func (r *SysUserRoleImpl) BatchUserRole(sysUserRoles []model.SysUserRole) int64 { - keyValues := make([]string, 0) - for _, item := range sysUserRoles { - keyValues = append(keyValues, fmt.Sprintf("(%s,%s)", item.UserID, item.RoleID)) - } - sql := "insert into sys_user_role(user_id, role_id) values " + strings.Join(keyValues, ",") - results, err := datasource.ExecDB("", sql, nil) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// DeleteUserRole 批量删除用户和角色关联 -func (r *SysUserRoleImpl) DeleteUserRole(userIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(userIds)) - sql := "delete from sys_user_role where user_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(userIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// DeleteUserRoleByRoleId 批量取消授权用户角色 -func (r *SysUserRoleImpl) DeleteUserRoleByRoleId(roleId string, userIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(userIds)) - sql := "delete from sys_user_role where role_id= ? and user_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(userIds) - parameters = append([]any{roleId}, parameters...) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/system/service/sys_config.go b/src/modules/system/service/sys_config.go index 38c3108f..bc3664e2 100644 --- a/src/modules/system/service/sys_config.go +++ b/src/modules/system/service/sys_config.go @@ -1,33 +1,177 @@ package service -import "be.ems/src/modules/system/model" +import ( + "fmt" + "strconv" -// ISysConfig 参数配置 服务层接口 -type ISysConfig interface { - // SelectDictDataPage 分页查询参数配置列表数据 - SelectConfigPage(query map[string]any) map[string]any + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) - // SelectConfigValueByKey 通过参数键名查询参数键值 - SelectConfigValueByKey(configKey string) string - - // SelectConfigById 通过配置ID查询参数配置信息 - SelectConfigById(configId string) model.SysConfig - - // CheckUniqueConfigKey 校验参数键名是否唯一 - CheckUniqueConfigKey(configKey, configId string) bool - - // InsertConfig 新增参数配置 - InsertConfig(sysConfig model.SysConfig) string - - // UpdateConfig 修改参数配置 - UpdateConfig(sysConfig model.SysConfig) int64 - - // DeleteConfigByIds 批量删除参数配置信息 - DeleteConfigByIds(configIds []string) (int64, error) - - // ResetConfigCache 重置参数缓存数据 - ResetConfigCache() - - // SelectConfigByKey 查询配置信息BY键 - SelectConfigByKey(configKey string) model.SysConfig +// NewSysConfig 实例化服务层 +var NewSysConfig = &SysConfig{ + sysConfigRepository: repository.NewSysConfig, +} + +// SysConfig 参数配置 服务层处理 +type SysConfig struct { + sysConfigRepository *repository.SysConfig // 参数配置表 +} + +// FindByPage 分页查询列表数据 +func (s SysConfig) FindByPage(query map[string]string) ([]model.SysConfig, int64) { + return s.sysConfigRepository.SelectByPage(query) +} + +// FindById 通过ID查询信息 +func (s SysConfig) FindById(configId int64) model.SysConfig { + if configId <= 0 { + return model.SysConfig{} + } + configs := s.sysConfigRepository.SelectByIds([]int64{configId}) + if len(configs) > 0 { + return configs[0] + } + return model.SysConfig{} +} + +// Insert 新增信息 +func (s SysConfig) Insert(sysConfig model.SysConfig) int64 { + configId := s.sysConfigRepository.Insert(sysConfig) + if configId > 0 { + s.CacheLoad(sysConfig.ConfigKey) + } + return configId +} + +// Update 修改信息 +func (s SysConfig) Update(sysConfig model.SysConfig) int64 { + rows := s.sysConfigRepository.Update(sysConfig) + if rows > 0 { + s.CacheLoad(sysConfig.ConfigKey) + } + return rows +} + +// DeleteByIds 批量删除信息 +func (s SysConfig) DeleteByIds(configIds []int64) (int64, error) { + // 检查是否存在 + configs := s.sysConfigRepository.SelectByIds(configIds) + if len(configs) <= 0 { + return 0, fmt.Errorf("没有权限访问参数配置数据!") + } + for _, config := range configs { + // 检查是否为内置参数 + if config.ConfigType == "Y" { + return 0, fmt.Errorf("该配置参数属于内置参数,禁止删除!") + } + // 清除缓存 + s.CacheClean(config.ConfigKey) + } + if len(configs) == len(configIds) { + return s.sysConfigRepository.DeleteByIds(configIds), nil + } + return 0, fmt.Errorf("删除参数配置信息失败!") +} + +// CheckUniqueByKey 检查参数键名是否唯一 +func (s SysConfig) CheckUniqueByKey(configKey string, configId int64) bool { + uniqueId := s.sysConfigRepository.CheckUnique(model.SysConfig{ + ConfigKey: configKey, + }) + if uniqueId == configId { + return true + } + return uniqueId == 0 +} + +// FindValueByKey 通过参数键名查询参数值 +func (s SysConfig) FindValueByKey(configKey string) string { + cacheKey := constants.CACHE_SYS_CONFIG + ":" + configKey + // 从缓存中读取 + if cacheValue, err := redis.Get("", cacheKey); cacheValue != "" || err != nil { + return cacheValue + } + // 无缓存时读取数据放入缓存中 + if configValue := s.sysConfigRepository.SelectValueByKey(configKey); configValue != "" { + _ = redis.Set("", cacheKey, configValue) + return configValue + } + return "" +} + +// CacheLoad 加载参数缓存数据 传入*查询全部 +func (s SysConfig) CacheLoad(configKey string) { + // 查询全部参数 + if configKey == "*" || configKey == "" { + sysConfigs := s.sysConfigRepository.Select(model.SysConfig{}) + for _, v := range sysConfigs { + key := constants.CACHE_SYS_CONFIG + ":" + v.ConfigKey + _ = redis.Del("", key) + _ = redis.Set("", key, v.ConfigValue) + } + return + } + // 指定参数 + cacheValue := s.sysConfigRepository.SelectValueByKey(configKey) + if cacheValue != "" { + key := constants.CACHE_SYS_CONFIG + ":" + configKey + _ = redis.Del("", key) + _ = redis.Set("", key, cacheValue) + } +} + +// CacheClean 清空参数缓存数据 传入*清除全部 +func (s SysConfig) CacheClean(configKey string) bool { + key := constants.CACHE_SYS_CONFIG + ":" + configKey + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + return redis.DelKeys("", keys) == nil +} + +// FindByKey 查询配置信息BY键 +func (s SysConfig) FindByKey(configKey string) model.SysConfig { + sysConf := s.sysConfigRepository.Select(model.SysConfig{ + ConfigKey: configKey, + }) + if len(sysConf) > 0 { + return sysConf[0] + } + return model.SysConfig{} +} + +// ExportData 导出数据表格 +func (s SysConfig) ExportData(rows []model.SysConfig, fileName string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "参数编号", + "B1": "参数名称", + "C1": "参数键名", + "D1": "参数键值", + "E1": "系统内置", + } + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + typeValue := "否" + if row.ConfigType == "Y" { + typeValue = "是" + } + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ConfigId, + "B" + idx: row.ConfigName, + "C" + idx: row.ConfigKey, + "D" + idx: row.ConfigValue, + "E" + idx: typeValue, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") } diff --git a/src/modules/system/service/sys_config.impl.go b/src/modules/system/service/sys_config.impl.go deleted file mode 100644 index d983102e..00000000 --- a/src/modules/system/service/sys_config.impl.go +++ /dev/null @@ -1,170 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/redis" - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/repository" -) - -// 实例化服务层 SysConfigImpl 结构体 -var NewSysConfigImpl = &SysConfigImpl{ - sysConfigRepository: repository.NewSysConfigImpl, -} - -// SysConfigImpl 参数配置 服务层处理 -type SysConfigImpl struct { - // 参数配置表 - sysConfigRepository repository.ISysConfig -} - -// SelectDictDataPage 分页查询参数配置列表数据 -func (r *SysConfigImpl) SelectConfigPage(query map[string]any) map[string]any { - return r.sysConfigRepository.SelectConfigPage(query) -} - -// SelectConfigList 查询参数配置列表 -func (r *SysConfigImpl) SelectConfigList(sysConfig model.SysConfig) []model.SysConfig { - return r.sysConfigRepository.SelectConfigList(sysConfig) -} - -// SelectConfigValueByKey 通过参数键名查询参数键值 -func (r *SysConfigImpl) SelectConfigValueByKey(configKey string) string { - cacheKey := r.getCacheKey(configKey) - // 从缓存中读取 - cacheValue, _ := redis.Get("", cacheKey) - if cacheValue != "" { - return cacheValue - } - // 无缓存时读取数据放入缓存中 - configValue := r.sysConfigRepository.SelectConfigValueByKey(configKey) - if configValue != "" { - redis.Set("", cacheKey, configValue) - return configValue - } - return "" -} - -// SelectConfigById 通过配置ID查询参数配置信息 -func (r *SysConfigImpl) SelectConfigById(configId string) model.SysConfig { - if configId == "" { - return model.SysConfig{} - } - configs := r.sysConfigRepository.SelectConfigByIds([]string{configId}) - if len(configs) > 0 { - return configs[0] - } - return model.SysConfig{} -} - -// CheckUniqueConfigKey 校验参数键名是否唯一 -func (r *SysConfigImpl) CheckUniqueConfigKey(configKey, configId string) bool { - uniqueId := r.sysConfigRepository.CheckUniqueConfig(model.SysConfig{ - ConfigKey: configKey, - }) - if uniqueId == configId { - return true - } - return uniqueId == "" -} - -// InsertConfig 新增参数配置 -func (r *SysConfigImpl) InsertConfig(sysConfig model.SysConfig) string { - configId := r.sysConfigRepository.InsertConfig(sysConfig) - if configId != "" { - r.loadingConfigCache(sysConfig.ConfigKey) - } - return configId -} - -// UpdateConfig 修改参数配置 -func (r *SysConfigImpl) UpdateConfig(sysConfig model.SysConfig) int64 { - rows := r.sysConfigRepository.UpdateConfig(sysConfig) - if rows > 0 { - r.loadingConfigCache(sysConfig.ConfigKey) - } - return rows -} - -// DeleteConfigByIds 批量删除参数配置信息 -func (r *SysConfigImpl) DeleteConfigByIds(configIds []string) (int64, error) { - // 检查是否存在 - configs := r.sysConfigRepository.SelectConfigByIds(configIds) - if len(configs) <= 0 { - return 0, fmt.Errorf("config.noData") - } - for _, config := range configs { - // 检查是否为内置参数 - if config.ConfigType == "Y" { - // 操作含有内置参数,禁止删除! - return 0, fmt.Errorf("config.errType") - } - // 清除缓存 - r.clearConfigCache(config.ConfigKey) - } - if len(configs) == len(configIds) { - rows := r.sysConfigRepository.DeleteConfigByIds(configIds) - return rows, nil - } - // 删除参数配置信息失败! - return 0, fmt.Errorf("config.errDelete") -} - -// ResetConfigCache 重置参数缓存数据 -func (r *SysConfigImpl) ResetConfigCache() { - r.clearConfigCache("*") - r.loadingConfigCache("*") -} - -// getCacheKey 组装缓存key -func (r *SysConfigImpl) getCacheKey(configKey string) string { - return cachekey.SYS_CONFIG_KEY + configKey -} - -// loadingConfigCache 加载参数缓存数据 -func (r *SysConfigImpl) loadingConfigCache(configKey string) { - // 查询全部参数 - if configKey == "*" { - sysConfigs := r.SelectConfigList(model.SysConfig{}) - for _, v := range sysConfigs { - key := r.getCacheKey(v.ConfigKey) - redis.Del("", key) - redis.Set("", key, v.ConfigValue) - } - return - } - // 指定参数 - if configKey != "" { - cacheValue := r.sysConfigRepository.SelectConfigValueByKey(configKey) - if cacheValue != "" { - key := r.getCacheKey(configKey) - redis.Del("", key) - redis.Set("", key, cacheValue) - } - return - } -} - -// clearConfigCache 清空参数缓存数据 -func (r *SysConfigImpl) clearConfigCache(configKey string) bool { - key := r.getCacheKey(configKey) - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// SelectConfigByKey 查询配置信息BY键 -func (r *SysConfigImpl) SelectConfigByKey(configKey string) model.SysConfig { - sysConf := r.sysConfigRepository.SelectConfigList(model.SysConfig{ - ConfigKey: configKey, - }) - if len(sysConf) > 0 { - return sysConf[0] - } - return model.SysConfig{} -} diff --git a/src/modules/system/service/sys_dept.go b/src/modules/system/service/sys_dept.go index 65b04c6f..98b530d0 100644 --- a/src/modules/system/service/sys_dept.go +++ b/src/modules/system/service/sys_dept.go @@ -1,39 +1,201 @@ package service import ( - "be.ems/src/framework/vo" + "fmt" + "strings" + + "be.ems/src/framework/constants" + "be.ems/src/framework/utils/parse" "be.ems/src/modules/system/model" + "be.ems/src/modules/system/model/vo" + "be.ems/src/modules/system/repository" ) -// ISysDept 部门管理 服务层接口 -type ISysDept interface { - // SelectDeptList 查询部门管理数据 - SelectDeptList(sysDept model.SysDept, dataScopeSQL string) []model.SysDept - - // SelectDeptListByRoleId 根据角色ID查询部门树信息 - SelectDeptListByRoleId(roleId string) []string - - // SelectDeptById 根据部门ID查询信息 - SelectDeptById(deptId string) model.SysDept - - // HasChildByDeptId 是否存在子节点 - HasChildByDeptId(deptId string) int64 - - // CheckDeptExistUser 查询部门是否存在用户 - CheckDeptExistUser(deptId string) int64 - - // CheckUniqueDeptName 校验同级部门名称是否唯一 - CheckUniqueDeptName(deptName, parentId, deptId string) bool - - // InsertDept 新增部门信息 - InsertDept(sysDept model.SysDept) string - - // UpdateDept 修改部门信息 - UpdateDept(sysDept model.SysDept) int64 - - // DeleteDeptById 删除部门管理信息 - DeleteDeptById(deptId string) int64 - - // SelectDeptTreeSelect 查询部门树结构信息 - SelectDeptTreeSelect(sysDept model.SysDept, dataScopeSQL string) []vo.TreeSelect +// NewSysDept 实例化服务层 +var NewSysDept = &SysDept{ + sysDeptRepository: repository.NewSysDept, + sysRoleRepository: repository.NewSysRole, + sysRoleDeptRepository: repository.NewSysRoleDept, +} + +// SysDept 部门管理 服务层处理 +type SysDept struct { + sysDeptRepository *repository.SysDept // 部门服务 + sysRoleRepository *repository.SysRole // 角色服务 + sysRoleDeptRepository *repository.SysRoleDept // 角色与部门关联服务 +} + +// Find 查询数据 +func (s SysDept) Find(sysDept model.SysDept, dataScopeSQL string) []model.SysDept { + return s.sysDeptRepository.Select(sysDept, dataScopeSQL) +} + +// FindById 根据ID查询信息 +func (s SysDept) FindById(deptId int64) model.SysDept { + return s.sysDeptRepository.SelectById(deptId) +} + +// Insert 新增信息 +func (s SysDept) Insert(sysDept model.SysDept) int64 { + return s.sysDeptRepository.Insert(sysDept) +} + +// Update 修改信息 +func (s SysDept) Update(sysDept model.SysDept) int64 { + dept := s.sysDeptRepository.SelectById(sysDept.DeptId) + parentDept := s.sysDeptRepository.SelectById(sysDept.ParentId) + // 上级与当前部门祖级列表更新 + if parentDept.DeptId == sysDept.ParentId && dept.DeptId == sysDept.DeptId { + newAncestors := fmt.Sprintf("%s,%d", parentDept.Ancestors, parentDept.DeptId) + oldAncestors := dept.Ancestors + // 祖级列表不一致时更新 + if newAncestors != oldAncestors { + dept.Ancestors = newAncestors + s.updateDeptChildren(dept.DeptId, newAncestors, oldAncestors) + } + } + // 如果该部门是启用状态,则启用该部门的所有上级部门 + if sysDept.StatusFlag == constants.STATUS_YES && parentDept.StatusFlag == constants.STATUS_NO { + s.updateDeptStatusNormal(sysDept.Ancestors) + } + return s.sysDeptRepository.Update(sysDept) +} + +// updateDeptStatusNormal 修改所在部门正常状态 +func (s SysDept) updateDeptStatusNormal(ancestors string) int64 { + if ancestors == "" || ancestors == "0" { + return 0 + } + deptIds := make([]int64, 0) + for _, v := range strings.Split(ancestors, ",") { + deptIds = append(deptIds, parse.Number(v)) + } + return s.sysDeptRepository.UpdateDeptStatusNormal(deptIds) +} + +// updateDeptChildren 修改子元素关系 +func (s SysDept) updateDeptChildren(deptId int64, newAncestors, oldAncestors string) int64 { + arr := s.sysDeptRepository.SelectChildrenDeptById(deptId) + if len(arr) == 0 { + return 0 + } + // 替换父ID + for i := range arr { + item := &arr[i] + ancestors := strings.Replace(item.Ancestors, oldAncestors, newAncestors, 1) + item.Ancestors = ancestors + } + return s.sysDeptRepository.UpdateDeptChildren(arr) +} + +// DeleteById 删除信息 +func (s SysDept) DeleteById(deptId int64) int64 { + s.sysRoleDeptRepository.DeleteByDeptIds([]int64{deptId}) // 删除角色与部门关联 + return s.sysDeptRepository.DeleteById(deptId) +} + +// FindDeptIdsByRoleId 根据角色ID查询包含的部门ID +func (s SysDept) FindDeptIdsByRoleId(roleId int64) []int64 { + roles := s.sysRoleRepository.SelectByIds([]int64{roleId}) + if len(roles) > 0 { + role := roles[0] + if role.RoleId == roleId { + return s.sysDeptRepository.SelectDeptIdsByRoleId( + role.RoleId, + role.DeptCheckStrictly == "1", + ) + } + } + return []int64{} +} + +// ExistChildrenByDeptId 部门下存在子节点数量 +func (s SysDept) ExistChildrenByDeptId(deptId int64) int64 { + return s.sysDeptRepository.ExistChildrenByDeptId(deptId) +} + +// ExistUserByDeptId 部门下存在用户数量 +func (s SysDept) ExistUserByDeptId(deptId int64) int64 { + return s.sysDeptRepository.ExistUserByDeptId(deptId) +} + +// CheckUniqueParentIdByDeptName 检查同级下部门名称唯一 +func (s SysDept) CheckUniqueParentIdByDeptName(parentId int64, deptName string, deptId int64) bool { + uniqueId := s.sysDeptRepository.CheckUnique(model.SysDept{ + DeptName: deptName, + ParentId: parentId, + }) + if uniqueId == deptId { + return true + } + return uniqueId == 0 +} + +// BuildTreeSelect 查询部门树状结构 +func (s SysDept) BuildTreeSelect(sysDept model.SysDept, dataScopeSQL string) []vo.TreeSelect { + arr := s.sysDeptRepository.Select(sysDept, dataScopeSQL) + treeArr := s.parseDataToTree(arr) + tree := make([]vo.TreeSelect, 0) + for _, item := range treeArr { + tree = append(tree, vo.SysDeptTreeSelect(item)) + } + return tree +} + +// parseDataToTree 将数据解析为树结构,构建前端所需要下拉树结构 +func (s SysDept) parseDataToTree(arr []model.SysDept) []model.SysDept { + // 节点分组 + nodesMap := make(map[int64][]model.SysDept) + // 节点id + treeIds := make([]int64, 0) + // 树节点 + tree := make([]model.SysDept, 0) + + for _, item := range arr { + parentID := item.ParentId + // 分组 + mapItem, ok := nodesMap[parentID] + if !ok { + mapItem = []model.SysDept{} + } + mapItem = append(mapItem, item) + nodesMap[parentID] = mapItem + // 记录节点ID + treeIds = append(treeIds, item.DeptId) + } + + for key, value := range nodesMap { + // 选择不是节点ID的作为树节点 + found := false + for _, id := range treeIds { + if id == key { + found = true + break + } + } + if !found { + tree = append(tree, value...) + } + } + + for i, node := range tree { + iN := s.parseDataToTreeComponent(node, &nodesMap) + tree[i] = iN + } + + return tree +} + +// parseDataToTreeComponent 递归函数处理子节点 +func (s SysDept) parseDataToTreeComponent(node model.SysDept, nodesMap *map[int64][]model.SysDept) model.SysDept { + if children, ok := (*nodesMap)[node.DeptId]; ok { + node.Children = children + } + if len(node.Children) > 0 { + for i, child := range node.Children { + icN := s.parseDataToTreeComponent(child, nodesMap) + node.Children[i] = icN + } + } + return node } diff --git a/src/modules/system/service/sys_dept.impl.go b/src/modules/system/service/sys_dept.impl.go deleted file mode 100644 index 7e266f3f..00000000 --- a/src/modules/system/service/sys_dept.impl.go +++ /dev/null @@ -1,202 +0,0 @@ -package service - -import ( - "strings" - - "be.ems/src/framework/constants/common" - "be.ems/src/framework/vo" - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/repository" -) - -// 实例化服务层 SysDeptImpl 结构体 -var NewSysDeptImpl = &SysDeptImpl{ - sysDeptRepository: repository.NewSysDeptImpl, - sysRoleRepository: repository.NewSysRoleImpl, - sysRoleDeptRepository: repository.NewSysRoleDeptImpl, -} - -// SysDeptImpl 部门表 服务层处理 -type SysDeptImpl struct { - // 部门服务 - sysDeptRepository repository.ISysDept - // 角色服务 - sysRoleRepository repository.ISysRole - // 角色与部门关联服务 - sysRoleDeptRepository repository.ISysRoleDept -} - -// SelectDeptList 查询部门管理数据 -func (r *SysDeptImpl) SelectDeptList(sysDept model.SysDept, dataScopeSQL string) []model.SysDept { - return r.sysDeptRepository.SelectDeptList(sysDept, dataScopeSQL) -} - -// SelectDeptListByRoleId 根据角色ID查询部门树信息 TODO -func (r *SysDeptImpl) SelectDeptListByRoleId(roleId string) []string { - roles := r.sysRoleRepository.SelectRoleByIds([]string{roleId}) - if len(roles) > 0 { - role := roles[0] - if role.RoleID == roleId { - return r.sysDeptRepository.SelectDeptListByRoleId( - role.RoleID, - role.DeptCheckStrictly == "1", - ) - } - } - return []string{} -} - -// SelectDeptById 根据部门ID查询信息 -func (r *SysDeptImpl) SelectDeptById(deptId string) model.SysDept { - return r.sysDeptRepository.SelectDeptById(deptId) -} - -// HasChildByDeptId 是否存在子节点 -func (r *SysDeptImpl) HasChildByDeptId(deptId string) int64 { - return r.sysDeptRepository.HasChildByDeptId(deptId) -} - -// CheckDeptExistUser 查询部门是否存在用户 -func (r *SysDeptImpl) CheckDeptExistUser(deptId string) int64 { - return r.sysDeptRepository.CheckDeptExistUser(deptId) -} - -// CheckUniqueDeptName 校验同级部门名称是否唯一 -func (r *SysDeptImpl) CheckUniqueDeptName(deptName, parentId, deptId string) bool { - uniqueId := r.sysDeptRepository.CheckUniqueDept(model.SysDept{ - DeptName: deptName, - ParentID: parentId, - }) - if uniqueId == deptId { - return true - } - return uniqueId == "" -} - -// InsertDept 新增部门信息 -func (r *SysDeptImpl) InsertDept(sysDept model.SysDept) string { - return r.sysDeptRepository.InsertDept(sysDept) -} - -// UpdateDept 修改部门信息 -func (r *SysDeptImpl) UpdateDept(sysDept model.SysDept) int64 { - parentDept := r.sysDeptRepository.SelectDeptById(sysDept.ParentID) - dept := r.sysDeptRepository.SelectDeptById(sysDept.DeptID) - // 上级与当前部门祖级列表更新 - if parentDept.DeptID == sysDept.ParentID && dept.DeptID == sysDept.DeptID { - newAncestors := parentDept.Ancestors + "," + parentDept.DeptID - oldAncestors := dept.Ancestors - // 祖级列表不一致时更新 - if newAncestors != oldAncestors { - sysDept.Ancestors = newAncestors - r.updateDeptChildren(sysDept.DeptID, newAncestors, oldAncestors) - } - } - // 如果该部门是启用状态,则启用该部门的所有上级部门 - if sysDept.Status == common.STATUS_YES && parentDept.Status == common.STATUS_NO { - r.updateDeptStatusNormal(sysDept.Ancestors) - } - return r.sysDeptRepository.UpdateDept(sysDept) -} - -// updateDeptStatusNormal 修改所在部门正常状态 -func (r *SysDeptImpl) updateDeptStatusNormal(ancestors string) int64 { - if ancestors == "" || ancestors == "0" { - return 0 - } - deptIds := strings.Split(ancestors, ",") - return r.sysDeptRepository.UpdateDeptStatusNormal(deptIds) -} - -// updateDeptChildren 修改子元素关系 -func (r *SysDeptImpl) updateDeptChildren(deptId, newAncestors, oldAncestors string) int64 { - childrens := r.sysDeptRepository.SelectChildrenDeptById(deptId) - if len(childrens) == 0 { - return 0 - } - // 替换父ID - for i := range childrens { - child := &childrens[i] - ancestors := strings.Replace(child.Ancestors, oldAncestors, newAncestors, -1) - child.Ancestors = ancestors - } - return r.sysDeptRepository.UpdateDeptChildren(childrens) -} - -// DeleteDeptById 删除部门管理信息 -func (r *SysDeptImpl) DeleteDeptById(deptId string) int64 { - // 删除角色与部门关联 - r.sysRoleDeptRepository.DeleteDeptRole([]string{deptId}) - return r.sysDeptRepository.DeleteDeptById(deptId) -} - -// SelectDeptTreeSelect 查询部门树结构信息 -func (r *SysDeptImpl) SelectDeptTreeSelect(sysDept model.SysDept, dataScopeSQL string) []vo.TreeSelect { - sysDepts := r.sysDeptRepository.SelectDeptList(sysDept, dataScopeSQL) - depts := r.parseDataToTree(sysDepts) - tree := make([]vo.TreeSelect, 0) - for _, dept := range depts { - tree = append(tree, vo.SysDeptTreeSelect(dept)) - } - return tree -} - -// parseDataToTree 将数据解析为树结构,构建前端所需要下拉树结构 -func (r *SysDeptImpl) parseDataToTree(sysDepts []model.SysDept) []model.SysDept { - // 节点分组 - nodesMap := make(map[string][]model.SysDept) - // 节点id - treeIds := []string{} - // 树节点 - tree := []model.SysDept{} - - for _, item := range sysDepts { - parentID := item.ParentID - // 分组 - mapItem, ok := nodesMap[parentID] - if !ok { - mapItem = []model.SysDept{} - } - mapItem = append(mapItem, item) - nodesMap[parentID] = mapItem - // 记录节点ID - treeIds = append(treeIds, item.DeptID) - } - - for key, value := range nodesMap { - // 选择不是节点ID的作为树节点 - found := false - for _, id := range treeIds { - if id == key { - found = true - break - } - } - if !found { - tree = append(tree, value...) - } - } - - for i, node := range tree { - iN := r.parseDataToTreeComponet(node, &nodesMap) - tree[i] = iN - } - - return tree -} - -// parseDataToTreeComponet 递归函数处理子节点 -func (r *SysDeptImpl) parseDataToTreeComponet(node model.SysDept, nodesMap *map[string][]model.SysDept) model.SysDept { - id := node.DeptID - children, ok := (*nodesMap)[id] - if ok { - node.Children = children - } - if len(node.Children) > 0 { - for i, child := range node.Children { - icN := r.parseDataToTreeComponet(child, nodesMap) - node.Children[i] = icN - } - } - return node -} diff --git a/src/modules/system/service/sys_dict_data.go b/src/modules/system/service/sys_dict_data.go index d5581078..b3881efe 100644 --- a/src/modules/system/service/sys_dict_data.go +++ b/src/modules/system/service/sys_dict_data.go @@ -2,12 +2,15 @@ package service import ( "fmt" + "strconv" + "be.ems/src/framework/constants" + "be.ems/src/framework/utils/file" "be.ems/src/modules/system/model" "be.ems/src/modules/system/repository" ) -// 实例化服务层 SysDictData 结构体 +// NewSysDictData 实例化服务层 var NewSysDictData = &SysDictData{ sysDictDataRepository: repository.NewSysDictData, sysDictTypeService: NewSysDictType, @@ -15,100 +18,127 @@ var NewSysDictData = &SysDictData{ // SysDictData 字典类型数据 服务层处理 type SysDictData struct { - sysDictDataRepository repository.ISysDictData // 字典数据服务 + sysDictDataRepository *repository.SysDictData // 字典数据服务 sysDictTypeService *SysDictType // 字典类型服务 } -// SelectDictDataPage 根据条件分页查询字典数据 -func (r *SysDictData) SelectDictDataPage(query map[string]any) map[string]any { - return r.sysDictDataRepository.SelectDictDataPage(query) +// FindByPage 分页查询列表数据 +func (s SysDictData) FindByPage(query map[string]string) ([]model.SysDictData, int64) { + return s.sysDictDataRepository.SelectByPage(query) } -// SelectDictDataList 根据条件查询字典数据 -func (r *SysDictData) SelectDictDataList(sysDictData model.SysDictData) []model.SysDictData { - return r.sysDictDataRepository.SelectDictDataList(sysDictData) +// Find 查询数据 +func (s SysDictData) Find(sysDictData model.SysDictData) []model.SysDictData { + return s.sysDictDataRepository.Select(sysDictData) } -// SelectDictDataByCode 根据字典数据编码查询信息 -func (r *SysDictData) SelectDictDataByCode(dictCode string) model.SysDictData { - if dictCode == "" { +// FindById 通过ID查询信息 +func (s SysDictData) FindById(dictId int64) model.SysDictData { + if dictId <= 0 { return model.SysDictData{} } - dictCodes := r.sysDictDataRepository.SelectDictDataByCodes([]string{dictCode}) - if len(dictCodes) > 0 { - return dictCodes[0] + dicts := s.sysDictDataRepository.SelectByIds([]int64{dictId}) + if len(dicts) > 0 { + return dicts[0] } return model.SysDictData{} } -// SelectDictDataByType 根据字典类型查询信息 -func (r *SysDictData) SelectDictDataByType(dictType string) []model.SysDictData { - return r.sysDictTypeService.DictDataCache(dictType) +// FindByType 根据字典类型查询信息 +func (s SysDictData) FindByType(dictType string) []model.SysDictData { + return s.sysDictTypeService.FindDataByType(dictType) } -// CheckUniqueDictLabel 校验字典标签是否唯一 -func (r *SysDictData) CheckUniqueDictLabel(dictType, dictLabel, dictCode string) bool { - uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{ - DictType: dictType, - DictLabel: dictLabel, - }) - if uniqueId == dictCode { - return true - } - return uniqueId == "" -} - -// CheckUniqueDictValue 校验字典键值是否唯一 -func (r *SysDictData) CheckUniqueDictValue(dictType, dictValue, dictCode string) bool { - uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{ - DictType: dictType, - DictValue: dictValue, - }) - if uniqueId == dictCode { - return true - } - return uniqueId == "" -} - -// DeleteDictDataByCodes 批量删除字典数据信息 -func (r *SysDictData) DeleteDictDataByCodes(dictCodes []string) (int64, error) { - // 检查是否存在 - dictDatas := r.sysDictDataRepository.SelectDictDataByCodes(dictCodes) - if len(dictDatas) <= 0 { - // 没有可访问字典编码数据! - return 0, fmt.Errorf("there is no accessible dictionary-encoded data") - } - if len(dictDatas) == len(dictCodes) { - for _, v := range dictDatas { - // 刷新缓存 - r.sysDictTypeService.ClearDictCache(v.DictType) - r.sysDictTypeService.LoadingDictCache(v.DictType) - } - rows := r.sysDictDataRepository.DeleteDictDataByCodes(dictCodes) - return rows, nil - } - // 删除字典数据信息失败! - return 0, fmt.Errorf("failed to delete dictionary data information") -} - -// InsertDictData 新增字典数据信息 -func (r *SysDictData) InsertDictData(sysDictData model.SysDictData) string { - insertId := r.sysDictDataRepository.InsertDictData(sysDictData) - if insertId != "" { - // 刷新缓存 - r.sysDictTypeService.ClearDictCache(sysDictData.DictType) - r.sysDictTypeService.LoadingDictCache(sysDictData.DictType) +// Insert 新增信息 +func (s SysDictData) Insert(sysDictData model.SysDictData) int64 { + insertId := s.sysDictDataRepository.Insert(sysDictData) + if insertId > 0 { + s.sysDictTypeService.CacheLoad(sysDictData.DictType) } return insertId } -// UpdateDictData 修改字典数据信息 -func (r *SysDictData) UpdateDictData(sysDictData model.SysDictData) int64 { - rows := r.sysDictDataRepository.UpdateDictData(sysDictData) +// Update 修改信息 +func (s SysDictData) Update(sysDictData model.SysDictData) int64 { + rows := s.sysDictDataRepository.Update(sysDictData) if rows > 0 { - // 刷新缓存 - r.sysDictTypeService.ClearDictCache(sysDictData.DictType) - r.sysDictTypeService.LoadingDictCache(sysDictData.DictType) + s.sysDictTypeService.CacheLoad(sysDictData.DictType) } return rows } + +// DeleteByIds 批量删除信息 +func (s SysDictData) DeleteByIds(dictIds []int64) (int64, error) { + // 检查是否存在 + dicts := s.sysDictDataRepository.SelectByIds(dictIds) + if len(dicts) <= 0 { + return 0, fmt.Errorf("没有权限访问字典编码数据!") + } + if len(dicts) == len(dictIds) { + for _, v := range dicts { + // 刷新缓存 + s.sysDictTypeService.CacheClean(v.DictType) + s.sysDictTypeService.CacheLoad(v.DictType) + } + rows := s.sysDictDataRepository.DeleteByIds(dictIds) + return rows, nil + } + return 0, fmt.Errorf("删除字典数据信息失败!") +} + +// CheckUniqueTypeByLabel 检查同字典类型下字典标签是否唯一 +func (s SysDictData) CheckUniqueTypeByLabel(dictType, dataLabel string, dataId int64) bool { + uniqueId := s.sysDictDataRepository.CheckUnique(model.SysDictData{ + DictType: dictType, + DataLabel: dataLabel, + }) + if uniqueId == dataId { + return true + } + return uniqueId == 0 +} + +// CheckUniqueTypeByValue 检查同字典类型下字典键值是否唯一 +func (s SysDictData) CheckUniqueTypeByValue(dictType, dataValue string, dataId int64) bool { + uniqueId := s.sysDictDataRepository.CheckUnique(model.SysDictData{ + DictType: dictType, + DataValue: dataValue, + }) + if uniqueId == dataId { + return true + } + return uniqueId == 0 +} + +// ExportData 导出数据表格 +func (s SysDictData) ExportData(rows []model.SysDictData, fileName string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "字典类型", + "B1": "数据排序", + "C1": "数据编号", + "D1": "数据标签", + "E1": "数据键值", + "F1": "数据状态", + } + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + statusValue := "停用" + if row.StatusFlag == constants.STATUS_YES { + statusValue = "正常" + } + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.DictType, + "B" + idx: row.DataSort, + "C" + idx: row.DataId, + "D" + idx: row.DataLabel, + "E" + idx: row.DataValue, + "F" + idx: statusValue, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") +} diff --git a/src/modules/system/service/sys_dict_type.go b/src/modules/system/service/sys_dict_type.go index 4008b327..5dc046b3 100644 --- a/src/modules/system/service/sys_dict_type.go +++ b/src/modules/system/service/sys_dict_type.go @@ -3,15 +3,16 @@ package service import ( "encoding/json" "fmt" + "strconv" - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/constants/common" - "be.ems/src/framework/redis" + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" + "be.ems/src/framework/utils/file" "be.ems/src/modules/system/model" "be.ems/src/modules/system/repository" ) -// 实例化服务层 SysDictType 结构体 +// NewSysDictType 实例化服务层 var NewSysDictType = &SysDictType{ sysDictTypeRepository: repository.NewSysDictType, sysDictDataRepository: repository.NewSysDictData, @@ -19,147 +20,149 @@ var NewSysDictType = &SysDictType{ // SysDictType 字典类型 服务层处理 type SysDictType struct { - // 字典类型服务 - sysDictTypeRepository repository.ISysDictType - // 字典数据服务 - sysDictDataRepository repository.ISysDictData + sysDictTypeRepository *repository.SysDictType // 字典类型服务 + sysDictDataRepository *repository.SysDictData // 字典数据服务 } -// SelectDictTypePage 根据条件分页查询字典类型 -func (r *SysDictType) SelectDictTypePage(query map[string]any) map[string]any { - return r.sysDictTypeRepository.SelectDictTypePage(query) +// FindByPage 分页查询列表数据 +func (s SysDictType) FindByPage(query map[string]string) ([]model.SysDictType, int64) { + return s.sysDictTypeRepository.SelectByPage(query) } -// SelectDictTypeList 根据条件查询字典类型 -func (r *SysDictType) SelectDictTypeList(sysDictType model.SysDictType) []model.SysDictType { - return r.sysDictTypeRepository.SelectDictTypeList(sysDictType) +// Find 查询数据 +func (s SysDictType) Find(sysDictType model.SysDictType) []model.SysDictType { + return s.sysDictTypeRepository.Select(sysDictType) } -// SelectDictTypeByID 根据字典类型ID查询信息 -func (r *SysDictType) SelectDictTypeByID(dictID string) model.SysDictType { - if dictID == "" { +// FindById 通过ID查询信息 +func (s SysDictType) FindById(dictId int64) model.SysDictType { + if dictId <= 0 { return model.SysDictType{} } - dictTypes := r.sysDictTypeRepository.SelectDictTypeByIDs([]string{dictID}) + dictTypes := s.sysDictTypeRepository.SelectByIds([]int64{dictId}) if len(dictTypes) > 0 { return dictTypes[0] } return model.SysDictType{} } -// SelectDictTypeByType 根据字典类型查询信息 -func (r *SysDictType) SelectDictTypeByType(dictType string) model.SysDictType { - return r.sysDictTypeRepository.SelectDictTypeByType(dictType) +// FindByType 根据字典类型查询信息 +func (s SysDictType) FindByType(dictType string) model.SysDictType { + return s.sysDictTypeRepository.SelectByType(dictType) } -// CheckUniqueDictName 校验字典名称是否唯一 -func (r *SysDictType) CheckUniqueDictName(dictName, dictID string) bool { - uniqueId := r.sysDictTypeRepository.CheckUniqueDictType(model.SysDictType{ - DictName: dictName, - }) - if uniqueId == dictID { - return true - } - return uniqueId == "" -} - -// CheckUniqueDictType 校验字典类型是否唯一 -func (r *SysDictType) CheckUniqueDictType(dictType, dictID string) bool { - uniqueId := r.sysDictTypeRepository.CheckUniqueDictType(model.SysDictType{ - DictType: dictType, - }) - if uniqueId == dictID { - return true - } - return uniqueId == "" -} - -// InsertDictType 新增字典类型信息 -func (r *SysDictType) InsertDictType(sysDictType model.SysDictType) string { - insertId := r.sysDictTypeRepository.InsertDictType(sysDictType) - if insertId != "" { - r.LoadingDictCache(sysDictType.DictType) +// Insert 新增信息 +func (s SysDictType) Insert(sysDictType model.SysDictType) int64 { + insertId := s.sysDictTypeRepository.Insert(sysDictType) + if insertId > 0 { + s.CacheLoad(sysDictType.DictType) } return insertId } -// UpdateDictType 修改字典类型信息 -func (r *SysDictType) UpdateDictType(sysDictType model.SysDictType) int64 { - data := r.sysDictTypeRepository.SelectDictTypeByIDs([]string{sysDictType.DictID}) - if len(data) == 0 { +// Update 修改信息 +func (s SysDictType) Update(sysDictType model.SysDictType) int64 { + arr := s.sysDictTypeRepository.SelectByIds([]int64{sysDictType.DictId}) + if len(arr) == 0 { return 0 } - // 修改字典类型key时同步更新其字典数据的类型key - oldDictType := data[0].DictType - rows := r.sysDictTypeRepository.UpdateDictType(sysDictType) + // 同字典类型被修改时,同步更新修改 + oldDictType := arr[0].DictType + rows := s.sysDictTypeRepository.Update(sysDictType) if rows > 0 && oldDictType != "" && oldDictType != sysDictType.DictType { - r.sysDictDataRepository.UpdateDictDataType(oldDictType, sysDictType.DictType) + s.sysDictDataRepository.UpdateDataByDictType(oldDictType, sysDictType.DictType) } // 刷新缓存 - r.ClearDictCache(oldDictType) - r.LoadingDictCache(sysDictType.DictType) + s.CacheLoad(sysDictType.DictType) return rows } -// DeleteDictTypeByIDs 批量删除字典类型信息 -func (r *SysDictType) DeleteDictTypeByIDs(dictIDs []string) (int64, error) { +// DeleteByIds 批量删除信息 +func (s SysDictType) DeleteByIds(dictIds []int64) (int64, error) { // 检查是否存在 - dictTypes := r.sysDictTypeRepository.SelectDictTypeByIDs(dictIDs) - if len(dictTypes) <= 0 { - // 没有可访问字典类型数据! - return 0, fmt.Errorf("there is no accessible dictionary type data") + arr := s.sysDictTypeRepository.SelectByIds(dictIds) + if len(arr) <= 0 { + return 0, fmt.Errorf("没有权限访问字典类型数据!") } - for _, v := range dictTypes { + for _, v := range arr { // 字典类型下级含有数据 - useCount := r.sysDictDataRepository.CountDictDataByType(v.DictType) - if useCount > 0 { - // 【%s】存在字典数据,不能删除 - return 0, fmt.Errorf("[%s] dictionary data exists and cannot be deleted", v.DictName) + if useCount := s.sysDictDataRepository.ExistDataByDictType(v.DictType); useCount > 0 { + return 0, fmt.Errorf("【%s】存在字典数据,不能删除", v.DictName) } // 清除缓存 - r.ClearDictCache(v.DictType) + s.CacheClean(v.DictType) } - if len(dictTypes) == len(dictIDs) { - rows := r.sysDictTypeRepository.DeleteDictTypeByIDs(dictIDs) - return rows, nil + if len(arr) == len(dictIds) { + return s.sysDictTypeRepository.DeleteByIds(dictIds), nil } - // 删除字典数据信息失败! - return 0, fmt.Errorf("failed to delete dictionary data information") + return 0, fmt.Errorf("删除字典数据信息失败!") } -// ResetDictCache 重置字典缓存数据 -func (r *SysDictType) ResetDictCache() { - r.ClearDictCache("*") - r.LoadingDictCache("") +// CheckUniqueByName 检查字典名称是否唯一 +func (s SysDictType) CheckUniqueByName(dictName string, dictId int64) bool { + uniqueId := s.sysDictTypeRepository.CheckUnique(model.SysDictType{ + DictName: dictName, + }) + if uniqueId == dictId { + return true + } + return uniqueId == 0 } -// getCacheKey 组装缓存key -func (r *SysDictType) getDictCache(dictType string) string { - return cachekey.SYS_DICT_KEY + dictType +// CheckUniqueByType 检查字典类型是否唯一 +func (s SysDictType) CheckUniqueByType(dictType string, dictId int64) bool { + uniqueId := s.sysDictTypeRepository.CheckUnique(model.SysDictType{ + DictType: dictType, + }) + if uniqueId == dictId { + return true + } + return uniqueId == 0 } -// LoadingDictCache 加载字典缓存数据 -func (r *SysDictType) LoadingDictCache(dictType string) { +// FindDataByType 获取字典数据缓存数据 +func (s SysDictType) FindDataByType(dictType string) []model.SysDictData { + var data []model.SysDictData + key := constants.CACHE_SYS_DICT + ":" + dictType + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + if err := json.Unmarshal([]byte(jsonStr), &data); err != nil { + data = []model.SysDictData{} + } + } else { + data = s.sysDictDataRepository.Select(model.SysDictData{ + StatusFlag: constants.STATUS_YES, + DictType: dictType, + }) + if len(data) > 0 { + _ = redis.Del("", key) + values, _ := json.Marshal(data) + _ = redis.Set("", key, string(values)) + } + } + return data +} + +// CacheLoad 加载字典缓存数据 传入*查询全部 +func (s SysDictType) CacheLoad(dictType string) { sysDictData := model.SysDictData{ - Status: common.STATUS_YES, + DictType: dictType, + StatusFlag: constants.STATUS_YES, } // 指定字典类型 - if dictType != "" { - sysDictData.DictType = dictType - // 删除缓存 - key := r.getDictCache(dictType) - redis.Del("", key) + if dictType == "*" || dictType == "" { + sysDictData.DictType = "" } - sysDictDataList := r.sysDictDataRepository.SelectDictDataList(sysDictData) - if len(sysDictDataList) == 0 { + arr := s.sysDictDataRepository.Select(sysDictData) + if len(arr) == 0 { return } // 将字典数据按类型分组 - m := make(map[string][]model.SysDictData, 0) - for _, v := range sysDictDataList { + m := make(map[string][]model.SysDictData) + for _, v := range arr { key := v.DictType if item, ok := m[key]; ok { m[key] = append(item, v) @@ -170,43 +173,48 @@ func (r *SysDictType) LoadingDictCache(dictType string) { // 放入缓存 for k, v := range m { - key := r.getDictCache(k) + key := constants.CACHE_SYS_DICT + ":" + k + _ = redis.Del("", key) values, _ := json.Marshal(v) - redis.Set("", key, string(values)) + _ = redis.Set("", key, string(values)) } } -// ClearDictCache 清空字典缓存数据 -func (r *SysDictType) ClearDictCache(dictType string) bool { - key := r.getDictCache(dictType) +// CacheClean 清空字典缓存数据 传入*清除全部 +func (s SysDictType) CacheClean(dictType string) bool { + key := constants.CACHE_SYS_DICT + ":" + dictType keys, err := redis.GetKeys("", key) if err != nil { return false } - delOk, _ := redis.DelKeys("", keys) - return delOk + return redis.DelKeys("", keys) == nil } -// DictDataCache 获取字典数据缓存数据 -func (r *SysDictType) DictDataCache(dictType string) []model.SysDictData { - data := []model.SysDictData{} - key := r.getDictCache(dictType) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &data) - if err != nil { - data = []model.SysDictData{} - } - } else { - data = r.sysDictDataRepository.SelectDictDataList(model.SysDictData{ - Status: common.STATUS_YES, - DictType: dictType, - }) - if len(data) > 0 { - redis.Del("", key) - values, _ := json.Marshal(data) - redis.Set("", key, string(values)) - } +// ExportData 导出数据表格 +func (s SysDictType) ExportData(rows []model.SysDictType, fileName string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "字典编号", + "B1": "字典名称", + "C1": "字典类型", + "D1": "字典状态", } - return data + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + statusValue := "停用" + if row.StatusFlag == constants.STATUS_YES { + statusValue = "正常" + } + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.DictId, + "B" + idx: row.DictName, + "C" + idx: row.DictType, + "D" + idx: statusValue, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") } diff --git a/src/modules/system/service/sys_i18n.go b/src/modules/system/service/sys_i18n.go new file mode 100644 index 00000000..ac45f7c3 --- /dev/null +++ b/src/modules/system/service/sys_i18n.go @@ -0,0 +1,133 @@ +package service + +import ( + "fmt" + + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) + +// NewSysI18n 实例化服务层 +var NewSysI18n = &SysI18n{ + sysI18nRepository: repository.NewSysI18n, +} + +// SysI18nService 多语言表 服务层处理 +type SysI18n struct { + sysI18nRepository *repository.SysI18n // 多语言服务 +} + +// Find 查询列表数据 +func (s SysI18n) Find(SysI18n model.SysI18n) []model.SysI18n { + return s.sysI18nRepository.Select(SysI18n) +} + +// FindById 通过ID查询信息 +func (s SysI18n) FindById(id int64) model.SysI18n { + if id <= 0 { + return model.SysI18n{} + } + rows := s.sysI18nRepository.SelectByIds([]int64{id}) + if len(rows) > 0 { + return rows[0] + } + return model.SysI18n{} +} + +// Insert 新增信息 +func (s SysI18n) Insert(param model.SysI18n) int64 { + return s.sysI18nRepository.Insert(param) +} + +// Update 修改信息 +func (s SysI18n) Update(param model.SysI18n) int64 { + return s.sysI18nRepository.Update(param) +} + +// DeleteByIds 批量删除信息 +func (s SysI18n) DeleteByIds(ids []int64) (int64, error) { + // 检查是否存在 + rows := s.sysI18nRepository.SelectByIds(ids) + if len(rows) <= 0 { + return 0, fmt.Errorf("not data") + } + if len(rows) == len(ids) { + return s.sysI18nRepository.DeleteByIds(ids), nil + } + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueByKey 检查属性名是否唯一 +func (s SysI18n) CheckUniqueByKey(key string, id int64) bool { + uniqueId := s.sysI18nRepository.CheckUnique(key) + if uniqueId == id { + return true + } + return uniqueId == 0 +} + +// UpdateKeyValue 更新键对应的值 +func (s SysI18n) UpdateKeyValue(language, key, value string) bool { + rows := s.sysI18nRepository.Select(model.SysI18n{ + Key: key, + }) + if len(rows) != 1 { + return false + } + item := rows[0] + + // 检查是否存在 + if !s.CheckUniqueByKey(key, item.ID) { + return false + } + + // 更新数据 + if language == "zh" { + item.ValueZh = value + } + if language == "en" { + item.ValueEn = value + } + return s.sysI18nRepository.Update(item) > 0 +} + +// CacheLoad 加载多语言数据 传入*查询全部 +func (s SysI18n) CacheLoad(langKey string) { + param := model.SysI18n{ + DelFlag: constants.STATUS_NO, + Key: langKey, + } + + // 指定属性名 + if langKey == "*" || langKey == "" { + param.Key = "" + } + + arr := s.sysI18nRepository.Select(param) + if len(arr) == 0 { + return + } + + // 放入缓存 + for _, v := range arr { + key := constants.CACHE_I18N + ":" + v.Key + _ = redis.Del("", key) + value := map[string]any{ + "zh": v.ValueZh, + "en": v.ValueEn, + } + _ = redis.SetHash("", key, value) + } +} + +// CacheClean 清空多语言数据 传入*清除全部 +func (s SysI18n) CacheClean(langKey string) bool { + key := constants.CACHE_I18N + ":" + langKey + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + return redis.DelKeys("", keys) == nil +} diff --git a/src/modules/system/service/sys_log_login.go b/src/modules/system/service/sys_log_login.go index 9b62ac30..83ac565d 100644 --- a/src/modules/system/service/sys_log_login.go +++ b/src/modules/system/service/sys_log_login.go @@ -1,24 +1,85 @@ package service -import "be.ems/src/modules/system/model" +import ( + "strconv" -// ISysLogLogin 系统登录日志 服务层接口 -type ISysLogLogin interface { - // SelectSysLogLoginPage 分页查询系统登录日志集合 - SelectSysLogLoginPage(query map[string]any, dataScopeSQL string) map[string]any + "be.ems/src/framework/constants" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) - // SelectSysLogLoginList 查询系统登录日志集合 - SelectSysLogLoginList(sysLogLogin model.SysLogLogin) []model.SysLogLogin - - // InsertSysLogLogin 新增系统登录日志 - InsertSysLogLogin(sysLogLogin model.SysLogLogin) string - - // DeleteSysLogLoginByIds 批量删除系统登录日志 - DeleteSysLogLoginByIds(loginIds []string) int64 - - // CleanSysLogLogin 清空系统登录日志 - CleanSysLogLogin() error - - // CreateSysLogLogin 创建系统登录日志 - CreateSysLogLogin(userName, status, msg string, ilobArgs ...string) string +// NewSysLogLogin 实例化服务层 +var NewSysLogLogin = &SysLogLogin{ + sysLogLoginRepository: repository.NewSysLogLogin, +} + +// SysLogLogin 系统登录日志 服务层处理 +type SysLogLogin struct { + sysLogLoginRepository *repository.SysLogLogin // 系统登录日志信息 +} + +// FindByPage 分页查询列表数据 +func (s SysLogLogin) FindByPage(query map[string]string, dataScopeSQL string) ([]model.SysLogLogin, int64) { + return s.sysLogLoginRepository.SelectByPage(query, dataScopeSQL) +} + +// Insert 新增信息 +func (s SysLogLogin) Insert(userName, status, msg string, ilobArr [4]string) int64 { + sysSysLogLogin := model.SysLogLogin{ + LoginIp: ilobArr[0], + LoginLocation: ilobArr[1], + OS: ilobArr[2], + Browser: ilobArr[3], + UserName: userName, + StatusFlag: status, + Msg: msg, + } + return s.sysLogLoginRepository.Insert(sysSysLogLogin) +} + +// Clean 清空系统登录日志 +func (s SysLogLogin) Clean() int64 { + return s.sysLogLoginRepository.Clean() +} + +// ExportData 导出数据表格 +func (s SysLogLogin) ExportData(rows []model.SysLogLogin, fileName string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "序号", + "B1": "用户账号", + "C1": "登录状态", + "D1": "登录地址", + "E1": "登录地点", + "F1": "浏览器", + "G1": "操作系统", + "H1": "提示消息", + "I1": "访问时间", + } + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 状态 + statusValue := "失败" + if row.StatusFlag == constants.STATUS_YES { + statusValue = "成功" + } + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: row.UserName, + "C" + idx: statusValue, + "D" + idx: row.LoginIp, + "E" + idx: row.LoginLocation, + "F" + idx: row.Browser, + "G" + idx: row.OS, + "H" + idx: row.Msg, + "I" + idx: date.ParseDateToStr(row.LoginTime, date.YYYY_MM_DD_HH_MM_SS), + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") } diff --git a/src/modules/system/service/sys_log_login.impl.go b/src/modules/system/service/sys_log_login.impl.go deleted file mode 100644 index 226b0da2..00000000 --- a/src/modules/system/service/sys_log_login.impl.go +++ /dev/null @@ -1,56 +0,0 @@ -package service - -import ( - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/repository" -) - -// 实例化服务层 SysLogLoginImpl 结构体 -var NewSysLogLoginImpl = &SysLogLoginImpl{ - sysLogLoginService: repository.NewSysLogLoginImpl, -} - -// SysLogLoginImpl 系统登录访问 服务层处理 -type SysLogLoginImpl struct { - // 系统登录访问信息 - sysLogLoginService repository.ISysLogLogin -} - -// SelectSysLogLoginPage 分页查询系统登录日志集合 -func (s *SysLogLoginImpl) SelectSysLogLoginPage(query map[string]any, dataScopeSQL string) map[string]any { - return s.sysLogLoginService.SelectSysLogLoginPage(query, dataScopeSQL) -} - -// SelectSysLogLoginList 查询系统登录日志集合 -func (s *SysLogLoginImpl) SelectSysLogLoginList(sysSysLogLogin model.SysLogLogin) []model.SysLogLogin { - return s.sysLogLoginService.SelectSysLogLoginList(sysSysLogLogin) -} - -// InsertSysLogLogin 新增系统登录日志 -func (s *SysLogLoginImpl) InsertSysLogLogin(sysSysLogLogin model.SysLogLogin) string { - return s.sysLogLoginService.InsertSysLogLogin(sysSysLogLogin) -} - -// DeleteSysLogLoginByIds 批量删除系统登录日志 -func (s *SysLogLoginImpl) DeleteSysLogLoginByIds(loginIds []string) int64 { - return s.sysLogLoginService.DeleteSysLogLoginByIds(loginIds) -} - -// CleanSysLogLogin 清空系统登录日志 -func (s *SysLogLoginImpl) CleanSysLogLogin() error { - return s.sysLogLoginService.CleanSysLogLogin() -} - -// CreateSysLogLogin 创建系统登录日志 -func (s *SysLogLoginImpl) CreateSysLogLogin(userName, status, msg string, ilobArgs ...string) string { - sysSysLogLogin := model.SysLogLogin{ - IPAddr: ilobArgs[0], - LoginLocation: ilobArgs[1], - OS: ilobArgs[2], - Browser: ilobArgs[3], - UserName: userName, - Status: status, - Msg: msg, - } - return s.InsertSysLogLogin(sysSysLogLogin) -} diff --git a/src/modules/system/service/sys_log_operate.go b/src/modules/system/service/sys_log_operate.go index d0857b6b..077097f6 100644 --- a/src/modules/system/service/sys_log_operate.go +++ b/src/modules/system/service/sys_log_operate.go @@ -1,24 +1,88 @@ package service -import "be.ems/src/modules/system/model" +import ( + "strconv" -// ISysLogOperate 操作日志表 服务层接口 -type ISysLogOperate interface { - // SelectSysLogOperatePage 分页查询系统操作日志集合 - SelectSysLogOperatePage(query map[string]any, dataScopeSQL string) map[string]any + "be.ems/src/framework/constants" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) - // SelectSysLogOperateList 查询系统操作日志集合 - SelectSysLogOperateList(sysLogOperate model.SysLogOperate) []model.SysLogOperate - - // SelectSysLogOperateById 查询操作日志详细 - SelectSysLogOperateById(operId string) model.SysLogOperate - - // InsertSysLogOperate 新增操作日志 - InsertSysLogOperate(sysLogOperate model.SysLogOperate) string - - // DeleteSysLogOperateByIds 批量删除系统操作日志 - DeleteSysLogOperateByIds(operIds []string) int64 - - // CleanSysLogOperate 清空操作日志 - CleanSysLogOperate() error +// NewSysLogOperate 实例化服务层 +var NewSysLogOperate = &SysLogOperate{ + sysLogOperateRepository: repository.NewSysLogOperate, +} + +// SysLogOperate 操作日志表 服务层处理 +type SysLogOperate struct { + sysLogOperateRepository *repository.SysLogOperate // 操作日志信息 +} + +// FindByPage 分页查询列表数据 +func (s SysLogOperate) FindByPage(query map[string]string, dataScopeSQL string) ([]model.SysLogOperate, int64) { + return s.sysLogOperateRepository.SelectByPage(query, dataScopeSQL) +} + +// Insert 新增信息 +func (s SysLogOperate) Insert(sysLogOperate model.SysLogOperate) int64 { + return s.sysLogOperateRepository.Insert(sysLogOperate) +} + +// Clean 清空操作日志 +func (s SysLogOperate) Clean() int64 { + return s.sysLogOperateRepository.Clean() +} + +// ExportData 导出数据表格 +func (s SysLogOperate) ExportData(rows []model.SysLogOperate, fileName string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "操作序号", + "B1": "模块标题", + "C1": "业务类型", + "D1": "请求URL", + "E1": "请求方式", + "F1": "主机地址", + "G1": "操作地点", + "H1": "请求参数", + "I1": "操作消息", + "J1": "方法名称", + "K1": "操作人员", + "L1": "操作时间", + "M1": "操作状态", + "N1": "消耗时间", + } + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 业务类型 + businessType := "" + // 状态 + statusValue := "失败" + if row.StatusFlag == constants.STATUS_YES { + statusValue = "成功" + } + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: row.Title, + "C" + idx: businessType, + "D" + idx: row.OperaUrl, + "E" + idx: row.OperaUrlMethod, + "F" + idx: row.OperaIp, + "G" + idx: row.OperaLocation, + "H" + idx: row.OperaParam, + "I" + idx: row.OperaMsg, + "J" + idx: row.OperaMethod, + "K" + idx: row.OperaBy, + "L" + idx: date.ParseDateToStr(row.OperaTime, date.YYYY_MM_DD_HH_MM_SS), + "M" + idx: statusValue, + "N" + idx: row.CostTime, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") } diff --git a/src/modules/system/service/sys_log_operate.impl.go b/src/modules/system/service/sys_log_operate.impl.go deleted file mode 100644 index c6edb18b..00000000 --- a/src/modules/system/service/sys_log_operate.impl.go +++ /dev/null @@ -1,47 +0,0 @@ -package service - -import ( - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/repository" -) - -// 实例化服务层 SysLogOperateImpl 结构体 -var NewSysLogOperateImpl = &SysLogOperateImpl{ - SysLogOperateService: repository.NewSysLogOperateImpl, -} - -// SysLogOperateImpl 操作日志表 服务层处理 -type SysLogOperateImpl struct { - // 操作日志信息 - SysLogOperateService repository.ISysLogOperate -} - -// SelectSysLogOperatePage 分页查询系统操作日志集合 -func (r *SysLogOperateImpl) SelectSysLogOperatePage(query map[string]any, dataScopeSQL string) map[string]any { - return r.SysLogOperateService.SelectSysLogOperatePage(query, dataScopeSQL) -} - -// SelectSysLogOperateList 查询系统操作日志集合 -func (r *SysLogOperateImpl) SelectSysLogOperateList(SysLogOperate model.SysLogOperate) []model.SysLogOperate { - return r.SysLogOperateService.SelectSysLogOperateList(SysLogOperate) -} - -// SelectSysLogOperateById 查询操作日志详细 -func (r *SysLogOperateImpl) SelectSysLogOperateById(operId string) model.SysLogOperate { - return r.SysLogOperateService.SelectSysLogOperateById(operId) -} - -// InsertSysLogOperate 新增操作日志 -func (r *SysLogOperateImpl) InsertSysLogOperate(SysLogOperate model.SysLogOperate) string { - return r.SysLogOperateService.InsertSysLogOperate(SysLogOperate) -} - -// DeleteSysLogOperateByIds 批量删除系统操作日志 -func (r *SysLogOperateImpl) DeleteSysLogOperateByIds(operIds []string) int64 { - return r.SysLogOperateService.DeleteSysLogOperateByIds(operIds) -} - -// CleanSysLogOperate 清空操作日志 -func (r *SysLogOperateImpl) CleanSysLogOperate() error { - return r.SysLogOperateService.CleanSysLogOperate() -} diff --git a/src/modules/system/service/sys_menu.go b/src/modules/system/service/sys_menu.go index 02381e53..10af417d 100644 --- a/src/modules/system/service/sys_menu.go +++ b/src/modules/system/service/sys_menu.go @@ -1,51 +1,377 @@ package service import ( - "be.ems/src/framework/vo" + "encoding/base64" + "fmt" + "strings" + + "be.ems/src/framework/constants" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/regular" "be.ems/src/modules/system/model" + "be.ems/src/modules/system/model/vo" + "be.ems/src/modules/system/repository" ) -// ISysMenu 菜单 服务层接口 -type ISysMenu interface { - // SelectMenuList 查询系统菜单列表 - SelectMenuList(sysMenu model.SysMenu, userId string) []model.SysMenu - - // SelectMenuPermsByUserId 根据用户ID查询权限 - SelectMenuPermsByUserId(userId string) []string - - // SelectMenuTreeByUserId 根据用户ID查询权限 - SelectMenuTreeByUserId(userId string) []model.SysMenu - - // SelectMenuTreeSelectByUserId 查询菜单树结构信息 - SelectMenuTreeSelectByUserId(sysMenu model.SysMenu, userId string) []vo.TreeSelect - - // SelectMenuListByRoleId 根据角色ID查询菜单树信息 - SelectMenuListByRoleId(roleId string) []string - - // SelectMenuById 根据菜单ID查询信息 - SelectMenuById(menuId string) model.SysMenu - - // HasChildByMenuIdAndStatus 存在菜单子节点数量与状态 - HasChildByMenuIdAndStatus(menuId, status string) int64 - - // CheckMenuExistRole 查询菜单分配角色数量 - CheckMenuExistRole(menuId string) int64 - - // InsertMenu 新增菜单信息 - InsertMenu(sysMenu model.SysMenu) string - - // UpdateMenu 修改菜单信息 - UpdateMenu(sysMenu model.SysMenu) int64 - - // DeleteMenuById 删除菜单管理信息 - DeleteMenuById(menuId string) int64 - - // CheckUniqueMenuName 校验菜单名称是否唯一 - CheckUniqueMenuName(menuName, parentId, menuId string) bool - - // CheckUniqueMenuPath 校验路由地址是否唯一(针对目录和菜单) - CheckUniqueMenuPath(path, parentId, menuId string) bool - - // BuildRouteMenus 构建前端路由所需要的菜单 - BuildRouteMenus(sysMenus []model.SysMenu, prefix string) []vo.Router +// NewSysMenu 实例化服务层 +var NewSysMenu = &SysMenu{ + sysMenuRepository: repository.NewSysMenu, + sysRoleMenuRepository: repository.NewSysRoleMenu, + sysRoleRepository: repository.NewSysRole, +} + +// SysMenu 菜单 服务层处理 +type SysMenu struct { + sysMenuRepository *repository.SysMenu // 菜单服务 + sysRoleMenuRepository *repository.SysRoleMenu // 角色与菜单关联服务 + sysRoleRepository *repository.SysRole // 角色服务 +} + +// Find 查询数据 +func (s SysMenu) Find(sysMenu model.SysMenu, userId int64) []model.SysMenu { + return s.sysMenuRepository.Select(sysMenu, userId) +} + +// FindById 通过ID查询信息 +func (s SysMenu) FindById(menuId int64) model.SysMenu { + if menuId <= 0 { + return model.SysMenu{} + } + menus := s.sysMenuRepository.SelectByIds([]int64{menuId}) + if len(menus) > 0 { + return menus[0] + } + return model.SysMenu{} +} + +// Insert 新增信息 +func (s SysMenu) Insert(sysMenu model.SysMenu) int64 { + return s.sysMenuRepository.Insert(sysMenu) +} + +// Update 修改信息 +func (s SysMenu) Update(sysMenu model.SysMenu) int64 { + return s.sysMenuRepository.Update(sysMenu) +} + +// DeleteById 删除信息 +func (s SysMenu) DeleteById(menuId int64) int64 { + s.sysRoleMenuRepository.DeleteByMenuIds([]int64{menuId}) // 删除菜单与角色关联 + return s.sysMenuRepository.DeleteById(menuId) +} + +// ExistChildrenByMenuIdAndStatus 菜单下同状态存在子节点数量 +func (s SysMenu) ExistChildrenByMenuIdAndStatus(menuId int64, status string) int64 { + return s.sysMenuRepository.ExistChildrenByMenuIdAndStatus(menuId, status) +} + +// ExistRoleByMenuId 菜单分配给的角色数量 +func (s SysMenu) ExistRoleByMenuId(menuId int64) int64 { + return s.sysRoleMenuRepository.ExistRoleByMenuId(menuId) +} + +// CheckUniqueParentIdByMenuName 检查同级下菜单名称是否唯一 +func (s SysMenu) CheckUniqueParentIdByMenuName(parentId int64, menuName string, menuId int64) bool { + uniqueId := s.sysMenuRepository.CheckUnique(model.SysMenu{ + MenuName: menuName, + ParentId: parentId, + }) + if uniqueId == menuId { + return true + } + return uniqueId == 0 +} + +// CheckUniqueParentIdByMenuPath 检查同级下路由地址是否唯一(针对目录和菜单) +func (s SysMenu) CheckUniqueParentIdByMenuPath(parentId int64, menuPath string, menuId int64) bool { + uniqueId := s.sysMenuRepository.CheckUnique(model.SysMenu{ + MenuPath: menuPath, + ParentId: parentId, + }) + if uniqueId == menuId { + return true + } + return uniqueId == 0 +} + +// FindPermsByUserId 根据用户ID查询权限标识 +func (s SysMenu) FindPermsByUserId(userId int64) []string { + return s.sysMenuRepository.SelectPermsByUserId(userId) +} + +// FindByRoleId 根据角色ID查询菜单树信息 +func (s SysMenu) FindByRoleId(roleId int64) []int64 { + roles := s.sysRoleRepository.SelectByIds([]int64{roleId}) + if len(roles) > 0 { + role := roles[0] + if role.RoleId == roleId { + return s.sysMenuRepository.SelectByRoleId( + role.RoleId, + role.MenuCheckStrictly == "1", + ) + } + } + return []int64{} +} + +// BuildTreeMenusByUserId 根据用户ID查询菜单树状嵌套 +func (s SysMenu) BuildTreeMenusByUserId(userId int64) []model.SysMenu { + arr := s.sysMenuRepository.SelectTreeByUserId(userId) + return s.parseDataToTree(arr) +} + +// BuildTreeSelectByUserId 根据用户ID查询菜单树状结构 +func (s SysMenu) BuildTreeSelectByUserId(sysMenu model.SysMenu, userId int64) []vo.TreeSelect { + arr := s.sysMenuRepository.Select(sysMenu, userId) + menus := s.parseDataToTree(arr) + tree := make([]vo.TreeSelect, 0) + for _, v := range menus { + tree = append(tree, vo.SysMenuTreeSelect(v)) + } + return tree +} + +// parseDataToTree 将数据解析为树结构,构建前端所需要下拉树结构 +func (s SysMenu) parseDataToTree(sysMenus []model.SysMenu) []model.SysMenu { + // 节点分组 + nodesMap := make(map[int64][]model.SysMenu) + // 节点id + var treeIds []int64 + // 树节点 + var tree []model.SysMenu + + for _, item := range sysMenus { + ParentId := item.ParentId + // 分组 + mapItem, ok := nodesMap[ParentId] + if !ok { + mapItem = []model.SysMenu{} + } + mapItem = append(mapItem, item) + nodesMap[ParentId] = mapItem + // 记录节点ID + treeIds = append(treeIds, item.MenuId) + } + + for key, value := range nodesMap { + // 选择不是节点ID的作为树节点 + found := false + for _, id := range treeIds { + if id == key { + found = true + break + } + } + if !found { + tree = append(tree, value...) + } + } + + for i, node := range tree { + iN := s.parseDataToTreeComponent(node, &nodesMap) + tree[i] = iN + } + + return tree +} + +// parseDataToTreeComponent 递归函数处理子节点 +func (s SysMenu) parseDataToTreeComponent(node model.SysMenu, nodesMap *map[int64][]model.SysMenu) model.SysMenu { + if children, ok := (*nodesMap)[node.MenuId]; ok { + node.Children = children + } + if len(node.Children) > 0 { + for i, child := range node.Children { + icN := s.parseDataToTreeComponent(child, nodesMap) + node.Children[i] = icN + } + } + return node +} + +// BuildRouteMenus 构建前端路由所需要的菜单 +func (s SysMenu) BuildRouteMenus(sysMenus []model.SysMenu, prefix string) []vo.Router { + routers := make([]vo.Router, 0) + for _, item := range sysMenus { + router := vo.Router{ + Name: s.getRouteName(item), + Path: s.getRouterPath(item), + Component: s.getComponent(item), + Meta: s.getRouteMeta(item), + Children: []vo.Router{}, + } + + // 子项菜单 目录类型 非路径链接 + cMenus := item.Children + if len(cMenus) > 0 && item.MenuType == constants.MENU_TYPE_DIR && !regular.ValidHttp(item.MenuPath) { + // 获取重定向地址 + redirectPrefix, redirectPath := s.getRouteRedirect( + cMenus, + router.Path, + prefix, + ) + router.Redirect = redirectPath + // 子菜单进入递归 + router.Children = s.BuildRouteMenus(cMenus, redirectPrefix) + } else if item.ParentId == 0 && item.FrameFlag == constants.STATUS_YES && item.MenuType == constants.MENU_TYPE_MENU { + // 父菜单 内部跳转 菜单类型 + menuPath := fmt.Sprintf("/%d", item.MenuId) + childPath := menuPath + s.getRouterPath(item) + children := vo.Router{ + Name: s.getRouteName(item), + Path: childPath, + Component: item.Component, + Meta: s.getRouteMeta(item), + } + router.Meta.HideChildInMenu = true + router.Children = append(router.Children, children) + router.Name = fmt.Sprint(item.MenuId) + router.Path = menuPath + router.Redirect = childPath + router.Component = constants.MENU_COMPONENT_LAYOUT_BASIC + } else if item.ParentId == 0 && item.FrameFlag == constants.STATUS_YES && regular.ValidHttp(item.MenuPath) { + // 父菜单 内部跳转 路径链接 + menuPath := fmt.Sprintf("/%d", item.MenuId) + childPath := menuPath + s.getRouterPath(item) + children := vo.Router{ + Name: s.getRouteName(item), + Path: childPath, + Component: constants.MENU_COMPONENT_LAYOUT_LINK, + Meta: s.getRouteMeta(item), + } + router.Meta.HideChildInMenu = true + router.Children = append(router.Children, children) + router.Name = fmt.Sprint(item.MenuId) + router.Path = menuPath + router.Redirect = childPath + router.Component = constants.MENU_COMPONENT_LAYOUT_BASIC + } + + routers = append(routers, router) + } + return routers +} + +// getRouteName 获取路由名称 路径英文首字母大写 +func (s SysMenu) getRouteName(sysMenu model.SysMenu) string { + routerName := parse.ConvertToCamelCase(sysMenu.MenuPath) + // 路径链接 + if regular.ValidHttp(sysMenu.MenuPath) { + routerName = routerName[:5] + "Link" + } + // 拼上菜单ID防止name重名 + return fmt.Sprintf("%s_%d", routerName, sysMenu.MenuId) +} + +// getRouterPath 获取路由地址 +func (s SysMenu) getRouterPath(sysMenu model.SysMenu) string { + routerPath := sysMenu.MenuPath + + // 显式路径 + if routerPath == "" || strings.HasPrefix(routerPath, "/") { + return routerPath + } + + // 路径链接 内部跳转 + if regular.ValidHttp(routerPath) && sysMenu.FrameFlag == constants.STATUS_YES { + routerPath = regular.Replace(`/^http(s)?:\/\/+/`, routerPath, "") + routerPath = base64.StdEncoding.EncodeToString([]byte(routerPath)) + } + + // 父菜单 内部跳转 + if sysMenu.ParentId == 0 && sysMenu.FrameFlag == constants.STATUS_YES { + routerPath = "/" + routerPath + } + + return routerPath +} + +// getComponent 获取组件信息 +func (s SysMenu) getComponent(sysMenu model.SysMenu) string { + // 内部跳转 路径链接 + if sysMenu.FrameFlag == constants.STATUS_YES && regular.ValidHttp(sysMenu.MenuPath) { + return constants.MENU_COMPONENT_LAYOUT_LINK + } + + // 非父菜单 目录类型 + if sysMenu.ParentId > 0 && sysMenu.MenuType == constants.MENU_TYPE_DIR { + return constants.MENU_COMPONENT_LAYOUT_BLANK + } + + // 组件路径 内部跳转 菜单类型 + if sysMenu.Component != "" && sysMenu.FrameFlag == constants.STATUS_YES && sysMenu.MenuType == constants.MENU_TYPE_MENU { + // 父菜单套外层布局 + if sysMenu.ParentId == 0 { + return constants.MENU_COMPONENT_LAYOUT_BASIC + } + return sysMenu.Component + } + + return constants.MENU_COMPONENT_LAYOUT_BASIC +} + +// getRouteMeta 获取路由元信息 +func (s SysMenu) getRouteMeta(sysMenu model.SysMenu) vo.RouterMeta { + meta := vo.RouterMeta{} + if sysMenu.Icon == "#" { + meta.Icon = "" + } else { + meta.Icon = sysMenu.Icon + } + meta.Title = sysMenu.MenuName + meta.HideChildInMenu = false + meta.HideInMenu = sysMenu.VisibleFlag == constants.STATUS_NO + meta.Cache = sysMenu.CacheFlag == constants.STATUS_YES + meta.Target = "" + + // 路径链接 非内部跳转 + if regular.ValidHttp(sysMenu.MenuPath) && sysMenu.FrameFlag == constants.STATUS_NO { + meta.Target = "_blank" + } + + return meta +} + +// getRouteRedirect 获取路由重定向地址(针对目录) +// +// cMenus 子菜单数组 +// routerPath 当前菜单路径 +// prefix 菜单重定向路径前缀 +func (s SysMenu) getRouteRedirect(cMenus []model.SysMenu, routerPath string, prefix string) (string, string) { + redirectPath := "" + + // 重定向为首个显示并启用的子菜单 + var firstChild *model.SysMenu + for _, item := range cMenus { + if item.FrameFlag == constants.STATUS_YES && item.VisibleFlag == constants.STATUS_YES { + firstChild = &item + break + } + } + + // 检查内嵌隐藏菜单是否可做重定向 + if firstChild == nil { + for _, item := range cMenus { + if item.FrameFlag == constants.STATUS_YES && item.VisibleFlag == constants.STATUS_NO && strings.Contains(item.MenuPath, constants.MENU_PATH_INLINE) { + firstChild = &item + break + } + } + } + + if firstChild != nil { + firstChildPath := s.getRouterPath(*firstChild) + if strings.HasPrefix(firstChildPath, "/") { + redirectPath = firstChildPath + } else { + // 拼接追加路径 + if !strings.HasPrefix(routerPath, "/") { + prefix += "/" + } + prefix = prefix + routerPath + redirectPath = prefix + "/" + firstChildPath + } + } + + return prefix, redirectPath } diff --git a/src/modules/system/service/sys_menu.impl.go b/src/modules/system/service/sys_menu.impl.go deleted file mode 100644 index 3bb338b2..00000000 --- a/src/modules/system/service/sys_menu.impl.go +++ /dev/null @@ -1,391 +0,0 @@ -package service - -import ( - "encoding/base64" - "strings" - - "be.ems/src/framework/constants/common" - "be.ems/src/framework/constants/menu" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/regular" - "be.ems/src/framework/vo" - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/repository" -) - -// 实例化服务层 SysMenuImpl 结构体 -var NewSysMenuImpl = &SysMenuImpl{ - sysMenuRepository: repository.NewSysMenuImpl, - sysRoleMenuRepository: repository.NewSysRoleMenuImpl, - sysRoleRepository: repository.NewSysRoleImpl, -} - -// SysMenuImpl 菜单 服务层处理 -type SysMenuImpl struct { - // 菜单服务 - sysMenuRepository repository.ISysMenu - // 角色与菜单关联服务 - sysRoleMenuRepository repository.ISysRoleMenu - // 角色服务 - sysRoleRepository repository.ISysRole -} - -// SelectMenuList 查询系统菜单列表 -func (r *SysMenuImpl) SelectMenuList(sysMenu model.SysMenu, userId string) []model.SysMenu { - return r.sysMenuRepository.SelectMenuList(sysMenu, userId) -} - -// SelectMenuPermsByUserId 根据用户ID查询权限 -func (r *SysMenuImpl) SelectMenuPermsByUserId(userId string) []string { - return r.sysMenuRepository.SelectMenuPermsByUserId(userId) -} - -// SelectMenuTreeByUserId 根据用户ID查询菜单 -func (r *SysMenuImpl) SelectMenuTreeByUserId(userId string) []model.SysMenu { - sysMenus := r.sysMenuRepository.SelectMenuTreeByUserId(userId) - return r.parseDataToTree(sysMenus) -} - -// SelectMenuTreeSelectByUserId 根据用户ID查询菜单树结构信息 -func (r *SysMenuImpl) SelectMenuTreeSelectByUserId(sysMenu model.SysMenu, userId string) []vo.TreeSelect { - sysMenus := r.sysMenuRepository.SelectMenuList(sysMenu, userId) - - // 过滤旧前端菜单 - sysMenusF := []model.SysMenu{} - for _, v := range sysMenus { - if v.Perms == "page" { - continue - } - sysMenusF = append(sysMenusF, v) - } - - menus := r.parseDataToTree(sysMenusF) - tree := make([]vo.TreeSelect, 0) - for _, menu := range menus { - tree = append(tree, vo.SysMenuTreeSelect(menu)) - } - return tree -} - -// SelectMenuListByRoleId 根据角色ID查询菜单树信息 TODO -func (r *SysMenuImpl) SelectMenuListByRoleId(roleId string) []string { - roles := r.sysRoleRepository.SelectRoleByIds([]string{roleId}) - if len(roles) > 0 { - role := roles[0] - if role.RoleID == roleId { - return r.sysMenuRepository.SelectMenuListByRoleId( - role.RoleID, - role.MenuCheckStrictly == "1", - ) - } - } - return []string{} -} - -// SelectMenuById 根据菜单ID查询信息 -func (r *SysMenuImpl) SelectMenuById(menuId string) model.SysMenu { - if menuId == "" { - return model.SysMenu{} - } - menus := r.sysMenuRepository.SelectMenuByIds([]string{menuId}) - if len(menus) > 0 { - return menus[0] - } - return model.SysMenu{} -} - -// HasChildByMenuIdAndStatus 存在菜单子节点数量与状态 -func (r *SysMenuImpl) HasChildByMenuIdAndStatus(menuId, status string) int64 { - return r.sysMenuRepository.HasChildByMenuIdAndStatus(menuId, status) -} - -// CheckMenuExistRole 查询菜单是否存在角色 -func (r *SysMenuImpl) CheckMenuExistRole(menuId string) int64 { - return r.sysRoleMenuRepository.CheckMenuExistRole(menuId) -} - -// InsertMenu 新增菜单信息 -func (r *SysMenuImpl) InsertMenu(sysMenu model.SysMenu) string { - return r.sysMenuRepository.InsertMenu(sysMenu) -} - -// UpdateMenu 修改菜单信息 -func (r *SysMenuImpl) UpdateMenu(sysMenu model.SysMenu) int64 { - return r.sysMenuRepository.UpdateMenu(sysMenu) -} - -// DeleteMenuById 删除菜单管理信息 -func (r *SysMenuImpl) DeleteMenuById(menuId string) int64 { - // 删除菜单与角色关联 - r.sysRoleMenuRepository.DeleteMenuRole([]string{menuId}) - return r.sysMenuRepository.DeleteMenuById(menuId) -} - -// CheckUniqueMenuName 校验菜单名称是否唯一 -func (r *SysMenuImpl) CheckUniqueMenuName(menuName, parentId, menuId string) bool { - uniqueId := r.sysMenuRepository.CheckUniqueMenu(model.SysMenu{ - MenuName: menuName, - ParentID: parentId, - }) - if uniqueId == menuId { - return true - } - return uniqueId == "" -} - -// CheckUniqueMenuPath 校验路由地址是否唯一(针对目录和菜单) -func (r *SysMenuImpl) CheckUniqueMenuPath(path, parentId, menuId string) bool { - uniqueId := r.sysMenuRepository.CheckUniqueMenu(model.SysMenu{ - Path: path, - ParentID: parentId, - }) - if uniqueId == menuId { - return true - } - return uniqueId == "" -} - -// BuildRouteMenus 构建前端路由所需要的菜单 -func (r *SysMenuImpl) BuildRouteMenus(sysMenus []model.SysMenu, prefix string) []vo.Router { - routers := []vo.Router{} - for _, item := range sysMenus { - router := vo.Router{} - router.Name = r.getRouteName(item) - router.Path = r.getRouterPath(item) - router.Component = r.getComponent(item) - router.Meta = r.getRouteMeta(item) - - // 子项菜单 目录类型 非路径链接 - cMenus := item.Children - if len(cMenus) > 0 && item.MenuType == menu.TYPE_DIR && !regular.ValidHttp(item.Path) { - // 获取重定向地址 - redirectPrefix, redirectPath := r.getRouteRedirect( - cMenus, - router.Path, - prefix, - ) - router.Redirect = redirectPath - // 子菜单进入递归 - router.Children = r.BuildRouteMenus(cMenus, redirectPrefix) - } else if item.ParentID == "0" && item.IsFrame == common.STATUS_YES && item.MenuType == menu.TYPE_MENU { - // 父菜单 内部跳转 菜单类型 - menuPath := "/" + item.MenuID - childPath := menuPath + r.getRouterPath(item) - children := vo.Router{ - Name: r.getRouteName(item), - Path: childPath, - Component: item.Component, - Meta: r.getRouteMeta(item), - } - router.Meta.HideChildInMenu = true - router.Children = append(router.Children, children) - router.Name = item.MenuID - router.Path = menuPath - router.Redirect = childPath - router.Component = menu.COMPONENT_LAYOUT_BASIC - } else if item.ParentID == "0" && item.IsFrame == common.STATUS_YES && regular.ValidHttp(item.Path) { - // 父菜单 内部跳转 路径链接 - menuPath := "/" + item.MenuID - childPath := menuPath + r.getRouterPath(item) - children := vo.Router{ - Name: r.getRouteName(item), - Path: childPath, - Component: menu.COMPONENT_LAYOUT_LINK, - Meta: r.getRouteMeta(item), - } - router.Meta.HideChildInMenu = true - router.Children = append(router.Children, children) - router.Name = item.MenuID - router.Path = menuPath - router.Redirect = childPath - router.Component = menu.COMPONENT_LAYOUT_BASIC - } - - routers = append(routers, router) - } - return routers -} - -// getRouteName 获取路由名称 路径英文首字母大写 -func (r *SysMenuImpl) getRouteName(sysMenu model.SysMenu) string { - routerName := parse.ConvertToCamelCase(sysMenu.Path) - // 路径链接 - if regular.ValidHttp(sysMenu.Path) { - routerName = routerName[:5] + "Link" - } - // 拼上菜单ID防止name重名 - return routerName + "_" + sysMenu.MenuID -} - -// getRouterPath 获取路由地址 -func (r *SysMenuImpl) getRouterPath(sysMenu model.SysMenu) string { - routerPath := sysMenu.Path - - // 显式路径 - if routerPath == "" || strings.HasPrefix(routerPath, "/") { - return routerPath - } - - // 路径链接 内部跳转 - if regular.ValidHttp(routerPath) && sysMenu.IsFrame == common.STATUS_YES { - routerPath = regular.Replace(routerPath, `/^http(s)?:\/\/+/`, "") - routerPath = base64.StdEncoding.EncodeToString([]byte(routerPath)) - } - - // 父菜单 内部跳转 - if sysMenu.ParentID == "0" && sysMenu.IsFrame == common.STATUS_YES { - routerPath = "/" + routerPath - } - - return routerPath -} - -// getComponent 获取组件信息 -func (r *SysMenuImpl) getComponent(sysMenu model.SysMenu) string { - // 内部跳转 路径链接 - if sysMenu.IsFrame == common.STATUS_YES && regular.ValidHttp(sysMenu.Path) { - return menu.COMPONENT_LAYOUT_LINK - } - - // 非父菜单 目录类型 - if sysMenu.ParentID != "0" && sysMenu.MenuType == menu.TYPE_DIR { - return menu.COMPONENT_LAYOUT_BLANK - } - - // 组件路径 内部跳转 菜单类型 - if sysMenu.Component != "" && sysMenu.IsFrame == common.STATUS_YES && sysMenu.MenuType == menu.TYPE_MENU { - // 父菜单套外层布局 - if sysMenu.ParentID == "0" { - return menu.COMPONENT_LAYOUT_BASIC - } - return sysMenu.Component - } - - return menu.COMPONENT_LAYOUT_BASIC -} - -// getRouteMeta 获取路由元信息 -func (r *SysMenuImpl) getRouteMeta(sysMenu model.SysMenu) vo.RouterMeta { - meta := vo.RouterMeta{} - if sysMenu.Icon == "#" { - meta.Icon = "" - } else { - meta.Icon = sysMenu.Icon - } - meta.Title = sysMenu.MenuName - meta.HideChildInMenu = false - meta.HideInMenu = sysMenu.Visible == common.STATUS_NO - meta.Cache = sysMenu.IsCache == common.STATUS_YES - meta.Target = "" - - // 路径链接 非内部跳转 - if regular.ValidHttp(sysMenu.Path) && sysMenu.IsFrame == common.STATUS_NO { - meta.Target = "_blank" - } - - return meta -} - -// getRouteRedirect 获取路由重定向地址(针对目录) -// -// cMenus 子菜单数组 -// routerPath 当前菜单路径 -// prefix 菜单重定向路径前缀 -func (r *SysMenuImpl) getRouteRedirect(cMenus []model.SysMenu, routerPath string, prefix string) (string, string) { - redirectPath := "" - - // 重定向为首个显示并启用的子菜单 - var firstChild *model.SysMenu - for _, item := range cMenus { - if item.IsFrame == common.STATUS_YES && item.Visible == common.STATUS_YES { - firstChild = &item - break - } - } - - // 检查内嵌隐藏菜单是否可做重定向 - if firstChild == nil { - for _, item := range cMenus { - if item.IsFrame == common.STATUS_YES && item.Visible == common.STATUS_NO && strings.Contains(item.Path, menu.PATH_INLINE) { - firstChild = &item - break - } - } - } - - if firstChild != nil { - firstChildPath := r.getRouterPath(*firstChild) - if strings.HasPrefix(firstChildPath, "/") { - redirectPath = firstChildPath - } else { - // 拼接追加路径 - if !strings.HasPrefix(routerPath, "/") { - prefix += "/" - } - prefix = prefix + routerPath - redirectPath = prefix + "/" + firstChildPath - } - } - - return prefix, redirectPath -} - -// parseDataToTree 将数据解析为树结构,构建前端所需要下拉树结构 -func (r *SysMenuImpl) parseDataToTree(sysMenus []model.SysMenu) []model.SysMenu { - // 节点分组 - nodesMap := make(map[string][]model.SysMenu) - // 节点id - treeIds := []string{} - // 树节点 - tree := []model.SysMenu{} - - for _, item := range sysMenus { - parentID := item.ParentID - // 分组 - mapItem, ok := nodesMap[parentID] - if !ok { - mapItem = []model.SysMenu{} - } - mapItem = append(mapItem, item) - nodesMap[parentID] = mapItem - // 记录节点ID - treeIds = append(treeIds, item.MenuID) - } - - for key, value := range nodesMap { - // 选择不是节点ID的作为树节点 - found := false - for _, id := range treeIds { - if id == key { - found = true - break - } - } - if !found { - tree = append(tree, value...) - } - } - - for i, node := range tree { - iN := r.parseDataToTreeComponet(node, &nodesMap) - tree[i] = iN - } - - return tree -} - -// parseDataToTreeComponet 递归函数处理子节点 -func (r *SysMenuImpl) parseDataToTreeComponet(node model.SysMenu, nodesMap *map[string][]model.SysMenu) model.SysMenu { - id := node.MenuID - children, ok := (*nodesMap)[id] - if ok { - node.Children = children - } - if len(node.Children) > 0 { - for i, child := range node.Children { - icN := r.parseDataToTreeComponet(child, nodesMap) - node.Children[i] = icN - } - } - return node -} diff --git a/src/modules/system/service/sys_post.go b/src/modules/system/service/sys_post.go index 4911e964..4b9c7606 100644 --- a/src/modules/system/service/sys_post.go +++ b/src/modules/system/service/sys_post.go @@ -1,33 +1,134 @@ package service -import "be.ems/src/modules/system/model" +import ( + "fmt" + "strconv" -// ISysPost 岗位信息 服务层接口 -type ISysPost interface { - // SelectPostPage 查询岗位分页数据集合 - SelectPostPage(query map[string]any) map[string]any + "be.ems/src/framework/constants" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) - // SelectPostList 查询岗位数据集合 - SelectPostList(sysPost model.SysPost) []model.SysPost - - // SelectPostById 通过岗位ID查询岗位信息 - SelectPostById(postId string) model.SysPost - - // SelectPostListByUserId 根据用户ID获取岗位选择框列表 - SelectPostListByUserId(userId string) []model.SysPost - - // DeletePostByIds 批量删除岗位信息 - DeletePostByIds(postIds []string) (int64, error) - - // UpdatePost 修改岗位信息 - UpdatePost(sysPost model.SysPost) int64 - - // InsertPost 新增岗位信息 - InsertPost(sysPost model.SysPost) string - - // CheckUniquePostName 校验岗位名称 - CheckUniquePostName(postName, postId string) bool - - // CheckUniquePostCode 校验岗位编码 - CheckUniquePostCode(postCode, postId string) bool +// NewSysPost 实例化服务层 +var NewSysPost = &SysPost{ + sysPostRepository: repository.NewSysPost, + sysUserPostRepository: repository.NewSysUserPost, +} + +// SysPostService 岗位表 服务层处理 +type SysPost struct { + sysPostRepository *repository.SysPost // 岗位服务 + sysUserPostRepository *repository.SysUserPost // 用户与岗位关联服务 +} + +// FindByPage 分页查询列表数据 +func (s SysPost) FindByPage(query map[string]string) ([]model.SysPost, int64) { + return s.sysPostRepository.SelectByPage(query) +} + +// Find 查询列表数据 +func (s SysPost) Find(sysPost model.SysPost) []model.SysPost { + return s.sysPostRepository.Select(sysPost) +} + +// FindById 通过ID查询信息 +func (s SysPost) FindById(postId int64) model.SysPost { + if postId <= 0 { + return model.SysPost{} + } + posts := s.sysPostRepository.SelectByIds([]int64{postId}) + if len(posts) > 0 { + return posts[0] + } + return model.SysPost{} +} + +// Insert 新增信息 +func (s SysPost) Insert(sysPost model.SysPost) int64 { + return s.sysPostRepository.Insert(sysPost) +} + +// Update 修改信息 +func (s SysPost) Update(sysPost model.SysPost) int64 { + return s.sysPostRepository.Update(sysPost) +} + +// DeleteByIds 批量删除信息 +func (s SysPost) DeleteByIds(postIds []int64) (int64, error) { + // 检查是否存在 + posts := s.sysPostRepository.SelectByIds(postIds) + if len(posts) <= 0 { + // return 0, fmt.Errorf("没有权限访问岗位数据!") + return 0, fmt.Errorf("there is no accessible post data") + } + for _, post := range posts { + if useCount := s.sysUserPostRepository.ExistUserByPostId(post.PostId); useCount > 0 { + // return 0, fmt.Errorf("【%s】已分配给用户,不能删除", post.PostName) + return 0, fmt.Errorf("[%s] has been assigned to a user and cannot be deleted", post.PostName) + } + } + if len(posts) == len(postIds) { + return s.sysPostRepository.DeleteByIds(postIds), nil + } + // return 0, fmt.Errorf("删除岗位信息失败!") + return 0, fmt.Errorf("failed to delete post information") +} + +// CheckUniqueByName 检查岗位名称是否唯一 +func (s SysPost) CheckUniqueByName(postName string, postId int64) bool { + uniqueId := s.sysPostRepository.CheckUnique(model.SysPost{ + PostName: postName, + }) + if uniqueId == postId { + return true + } + return uniqueId == 0 +} + +// CheckUniqueByCode 检查岗位编码是否唯一 +func (s SysPost) CheckUniqueByCode(postCode string, postId int64) bool { + uniqueId := s.sysPostRepository.CheckUnique(model.SysPost{ + PostCode: postCode, + }) + if uniqueId == postId { + return true + } + return uniqueId == 0 +} + +// FindByUserId 根据用户ID获取岗位选择框列表 +func (s SysPost) FindByUserId(userId int64) []model.SysPost { + return s.sysPostRepository.SelectByUserId(userId) +} + +// ExportData 导出数据表格 +func (s SysPost) ExportData(rows []model.SysPost, fileName string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "岗位编号", + "B1": "岗位编码", + "C1": "岗位名称", + "D1": "岗位排序", + "E1": "岗位状态", + } + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + statusValue := "停用" + if row.StatusFlag == constants.STATUS_YES { + statusValue = "正常" + } + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.PostId, + "B" + idx: row.PostCode, + "C" + idx: row.PostName, + "D" + idx: row.PostSort, + "E" + idx: statusValue, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") } diff --git a/src/modules/system/service/sys_post.impl.go b/src/modules/system/service/sys_post.impl.go deleted file mode 100644 index 3fbc9de9..00000000 --- a/src/modules/system/service/sys_post.impl.go +++ /dev/null @@ -1,104 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/repository" -) - -// 实例化服务层 SysPostImpl 结构体 -var NewSysPostImpl = &SysPostImpl{ - sysPostRepository: repository.NewSysPostImpl, - sysUserPostRepository: repository.NewSysUserPostImpl, -} - -// SysPostImpl 岗位表 服务层处理 -type SysPostImpl struct { - // 岗位服务 - sysPostRepository repository.ISysPost - // 用户与岗位关联服务 - sysUserPostRepository repository.ISysUserPost -} - -// SelectPostPage 查询岗位分页数据集合 -func (r *SysPostImpl) SelectPostPage(query map[string]any) map[string]any { - return r.sysPostRepository.SelectPostPage(query) -} - -// SelectPostList 查询岗位数据集合 -func (r *SysPostImpl) SelectPostList(sysPost model.SysPost) []model.SysPost { - return r.sysPostRepository.SelectPostList(sysPost) -} - -// SelectPostById 通过岗位ID查询岗位信息 -func (r *SysPostImpl) SelectPostById(postId string) model.SysPost { - if postId == "" { - return model.SysPost{} - } - posts := r.sysPostRepository.SelectPostByIds([]string{postId}) - if len(posts) > 0 { - return posts[0] - } - return model.SysPost{} -} - -// SelectPostListByUserId 根据用户ID获取岗位选择框列表 -func (r *SysPostImpl) SelectPostListByUserId(userId string) []model.SysPost { - return r.sysPostRepository.SelectPostListByUserId(userId) -} - -// DeletePostByIds 批量删除岗位信息 -func (r *SysPostImpl) DeletePostByIds(postIds []string) (int64, error) { - // 检查是否存在 - posts := r.sysPostRepository.SelectPostByIds(postIds) - if len(posts) <= 0 { - // 没有可访问岗位数据! - return 0, fmt.Errorf("there is no accessible post data") - } - for _, post := range posts { - useCount := r.sysUserPostRepository.CountUserPostByPostId(post.PostID) - if useCount > 0 { - // 【%s】已分配给用户,不能删除 - return 0, fmt.Errorf("[%s] has been assigned to a user and cannot be deleted", post.PostName) - } - } - if len(posts) == len(postIds) { - rows := r.sysPostRepository.DeletePostByIds(postIds) - return rows, nil - } - // 删除岗位信息失败! - return 0, fmt.Errorf("failed to delete post information") -} - -// UpdatePost 修改岗位信息 -func (r *SysPostImpl) UpdatePost(sysPost model.SysPost) int64 { - return r.sysPostRepository.UpdatePost(sysPost) -} - -// InsertPost 新增岗位信息 -func (r *SysPostImpl) InsertPost(sysPost model.SysPost) string { - return r.sysPostRepository.InsertPost(sysPost) -} - -// CheckUniquePostName 校验岗位名称 -func (r *SysPostImpl) CheckUniquePostName(postName, postId string) bool { - uniqueId := r.sysPostRepository.CheckUniquePost(model.SysPost{ - PostName: postName, - }) - if uniqueId == postId { - return true - } - return uniqueId == "" -} - -// CheckUniquePostCode 校验岗位编码 -func (r *SysPostImpl) CheckUniquePostCode(postCode, postId string) bool { - uniqueId := r.sysPostRepository.CheckUniquePost(model.SysPost{ - PostCode: postCode, - }) - if uniqueId == postId { - return true - } - return uniqueId == "" -} diff --git a/src/modules/system/service/sys_role.go b/src/modules/system/service/sys_role.go index 6bdca714..812340ac 100644 --- a/src/modules/system/service/sys_role.go +++ b/src/modules/system/service/sys_role.go @@ -1,42 +1,190 @@ package service -import "be.ems/src/modules/system/model" +import ( + "fmt" -// ISysRole 角色 服务层接口 -type ISysRole interface { - // SelectRolePage 根据条件分页查询角色数据 - SelectRolePage(query map[string]any, dataScopeSQL string) map[string]any + "be.ems/src/framework/constants" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) - // SelectRoleList 根据条件查询角色数据 - SelectRoleList(sysRole model.SysRole, dataScopeSQL string) []model.SysRole - - // SelectRoleListByUserId 根据用户ID获取角色选择框列表 - SelectRoleListByUserId(userId string) []model.SysRole - - // SelectRoleById 通过角色ID查询角色 - SelectRoleById(roleId string) model.SysRole - - // UpdateRole 修改角色信息 - UpdateRole(sysRole model.SysRole) int64 - - // InsertRole 新增角色信息 - InsertRole(sysRole model.SysRole) string - - // DeleteRoleByIds 批量删除角色信息 - DeleteRoleByIds(roleIds []string) (int64, error) - - // CheckUniqueRoleName 校验角色名称是否唯一 - CheckUniqueRoleName(roleName, roleId string) bool - - // CheckUniqueRoleKey 校验角色权限是否唯一 - CheckUniqueRoleKey(roleKey, roleId string) bool - - // AuthDataScope 修改数据权限信息 - AuthDataScope(sysRole model.SysRole) int64 - - // DeleteAuthUsers 批量取消授权用户角色 - DeleteAuthUsers(roleId string, userIds []string) int64 - - // InsertAuthUsers 批量新增授权用户角色 - InsertAuthUsers(roleId string, userIds []string) int64 +// NewSysRole 实例化服务层 +var NewSysRole = &SysRole{ + sysRoleRepository: repository.NewSysRole, + sysUserRoleRepository: repository.NewSysUserRole, + sysRoleDeptRepository: repository.NewSysRoleDept, + sysRoleMenuRepository: repository.NewSysRoleMenu, +} + +// SysRole 角色 服务层处理 +type SysRole struct { + sysRoleRepository *repository.SysRole // 角色服务 + sysUserRoleRepository *repository.SysUserRole // 用户与角色关联服务 + sysRoleDeptRepository *repository.SysRoleDept // 角色与部门关联服务 + sysRoleMenuRepository *repository.SysRoleMenu // 角色与菜单关联服务 +} + +// FindByPage 分页查询列表数据 +func (r SysRole) FindByPage(query map[string]string) ([]model.SysRole, int64) { + return r.sysRoleRepository.SelectByPage(query) +} + +// Find 查询列表数据 +func (r SysRole) Find(sysRole model.SysRole) []model.SysRole { + rows := r.sysRoleRepository.Select(sysRole) + arr := make([]model.SysRole, 0) + for _, v := range rows { + if v.RoleId == constants.SYS_ROLE_SYSTEM_ID { + continue + } + arr = append(arr, v) + } + return arr +} + +// FindById 通过ID查询信息 +func (r SysRole) FindById(roleId int64) model.SysRole { + if roleId <= 0 { + return model.SysRole{} + } + posts := r.sysRoleRepository.SelectByIds([]int64{roleId}) + if len(posts) > 0 { + return posts[0] + } + return model.SysRole{} +} + +// Insert 新增信息 +func (r SysRole) Insert(sysRole model.SysRole) int64 { + insertId := r.sysRoleRepository.Insert(sysRole) + if insertId > 0 && len(sysRole.MenuIds) > 0 { + r.insertRoleMenu(insertId, sysRole.MenuIds) + } + return insertId +} + +// insertRoleMenu 新增角色菜单信息 +func (r SysRole) insertRoleMenu(roleId int64, menuIds []int64) int64 { + if roleId <= 0 || len(menuIds) <= 0 { + return 0 + } + sysRoleMenus := make([]model.SysRoleMenu, 0) + for _, menuId := range menuIds { + if menuId <= 0 { + continue + } + sysRoleMenus = append(sysRoleMenus, model.SysRoleMenu{ + RoleId: roleId, MenuId: menuId, + }) + } + return r.sysRoleMenuRepository.BatchInsert(sysRoleMenus) +} + +// Update 修改信息 +func (r SysRole) Update(sysRole model.SysRole) int64 { + rows := r.sysRoleRepository.Update(sysRole) + if rows > 0 && len(sysRole.MenuIds) > 0 { + // 删除角色与菜单关联 + r.sysRoleMenuRepository.DeleteByRoleIds([]int64{sysRole.RoleId}) + r.insertRoleMenu(sysRole.RoleId, sysRole.MenuIds) + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r SysRole) DeleteByIds(roleIds []int64) (int64, error) { + // 检查是否存在 + roles := r.sysRoleRepository.SelectByIds(roleIds) + if len(roles) <= 0 { + return 0, fmt.Errorf("没有权限访问角色数据!") + } + for _, role := range roles { + // 检查是否为已删除 + if role.DelFlag == "1" { + return 0, fmt.Errorf("ID:%d 角色信息已经删除!", role.RoleId) + } + // 检查分配用户 + if useCount := r.sysUserRoleRepository.ExistUserByRoleId(role.RoleId); useCount > 0 { + return 0, fmt.Errorf("【%s】已分配给用户,不能删除", role.RoleName) + } + } + if len(roles) == len(roleIds) { + r.sysRoleMenuRepository.DeleteByRoleIds(roleIds) // 删除角色与菜单关联 + r.sysRoleDeptRepository.DeleteByRoleIds(roleIds) // 删除角色与部门关联 + return r.sysRoleRepository.DeleteByIds(roleIds), nil + } + return 0, fmt.Errorf("删除角色信息失败!") +} + +// FindByUserId 根据用户ID获取角色选择框列表 +func (r SysRole) FindByUserId(userId int64) []model.SysRole { + return r.sysRoleRepository.SelectByUserId(userId) +} + +// CheckUniqueByName 检查角色名称是否唯一 +func (r SysRole) CheckUniqueByName(roleName string, roleId int64) bool { + uniqueId := r.sysRoleRepository.CheckUnique(model.SysRole{ + RoleName: roleName, + }) + if uniqueId == roleId { + return true + } + return uniqueId == 0 +} + +// CheckUniqueByKey 检查角色权限是否唯一 +func (r SysRole) CheckUniqueByKey(roleKey string, roleId int64) bool { + uniqueId := r.sysRoleRepository.CheckUnique(model.SysRole{ + RoleKey: roleKey, + }) + if uniqueId == roleId { + return true + } + return uniqueId == 0 +} + +// UpdateAndDataScope 修改信息同时更新数据权限信息 +func (r SysRole) UpdateAndDataScope(sysRole model.SysRole) int64 { + // 修改角色信息 + rows := r.sysRoleRepository.Update(sysRole) + if rows > 0 { + // 删除角色与部门关联 + r.sysRoleDeptRepository.DeleteByRoleIds([]int64{sysRole.RoleId}) + // 新增角色和部门信息 + if sysRole.DataScope == constants.ROLE_SCOPE_CUSTOM && len(sysRole.DeptIds) > 0 { + arr := make([]model.SysRoleDept, 0) + for _, deptId := range sysRole.DeptIds { + if deptId <= 0 { + continue + } + arr = append(arr, model.SysRoleDept{ + RoleId: sysRole.RoleId, DeptId: deptId, + }) + } + r.sysRoleDeptRepository.BatchInsert(arr) + } + } + return rows +} + +// InsertAuthUsers 批量新增授权用户角色 +func (r SysRole) InsertAuthUsers(roleId int64, userIds []int64) int64 { + if roleId <= 0 || len(userIds) <= 0 { + return 0 + } + sysUserRoles := make([]model.SysUserRole, 0) + for _, userId := range userIds { + if userId <= 0 { + continue + } + sysUserRoles = append(sysUserRoles, model.SysUserRole{ + UserId: userId, RoleId: roleId, + }) + } + return r.sysUserRoleRepository.BatchInsert(sysUserRoles) +} + +// DeleteAuthUsers 批量取消授权用户角色 +func (r SysRole) DeleteAuthUsers(roleId int64, userIds []int64) int64 { + return r.sysUserRoleRepository.DeleteByRoleId(roleId, userIds) } diff --git a/src/modules/system/service/sys_role.impl.go b/src/modules/system/service/sys_role.impl.go deleted file mode 100644 index 708b4ffc..00000000 --- a/src/modules/system/service/sys_role.impl.go +++ /dev/null @@ -1,189 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/repository" -) - -// 实例化服务层 SysRoleImpl 结构体 -var NewSysRoleImpl = &SysRoleImpl{ - sysRoleRepository: repository.NewSysRoleImpl, - sysUserRoleRepository: repository.NewSysUserRoleImpl, - sysRoleDeptRepository: repository.NewSysRoleDeptImpl, - sysRoleMenuRepository: repository.NewSysRoleMenuImpl, -} - -// SysRoleImpl 角色 服务层处理 -type SysRoleImpl struct { - // 角色服务 - sysRoleRepository repository.ISysRole - // 用户与角色关联服务 - sysUserRoleRepository repository.ISysUserRole - // 角色与部门关联服务 - sysRoleDeptRepository repository.ISysRoleDept - // 角色与菜单关联服务 - sysRoleMenuRepository repository.ISysRoleMenu -} - -// SelectRolePage 根据条件分页查询角色数据 -func (r *SysRoleImpl) SelectRolePage(query map[string]any, dataScopeSQL string) map[string]any { - return r.sysRoleRepository.SelectRolePage(query, dataScopeSQL) -} - -// SelectRoleList 根据条件查询角色数据 -func (r *SysRoleImpl) SelectRoleList(sysRole model.SysRole, dataScopeSQL string) []model.SysRole { - return r.sysRoleRepository.SelectRoleList(sysRole, dataScopeSQL) -} - -// SelectRoleListByUserId 根据用户ID获取角色选择框列表 -func (r *SysRoleImpl) SelectRoleListByUserId(userId string) []model.SysRole { - return r.sysRoleRepository.SelectRoleListByUserId(userId) -} - -// SelectRoleById 通过角色ID查询角色 -func (r *SysRoleImpl) SelectRoleById(roleId string) model.SysRole { - if roleId == "" { - return model.SysRole{} - } - posts := r.sysRoleRepository.SelectRoleByIds([]string{roleId}) - if len(posts) > 0 { - return posts[0] - } - return model.SysRole{} -} - -// UpdateRole 修改角色信息 -func (r *SysRoleImpl) UpdateRole(sysRole model.SysRole) int64 { - rows := r.sysRoleRepository.UpdateRole(sysRole) - if rows > 0 && len(sysRole.MenuIds) > 0 { - // 删除角色与菜单关联 - r.sysRoleMenuRepository.DeleteRoleMenu([]string{sysRole.RoleID}) - r.insertRoleMenu(sysRole.RoleID, sysRole.MenuIds) - } - return rows -} - -// InsertRole 新增角色信息 -func (r *SysRoleImpl) InsertRole(sysRole model.SysRole) string { - insertId := r.sysRoleRepository.InsertRole(sysRole) - if insertId != "" && len(sysRole.MenuIds) > 0 { - r.insertRoleMenu(insertId, sysRole.MenuIds) - } - return insertId -} - -// insertRoleMenu 新增角色菜单信息 -func (r *SysRoleImpl) insertRoleMenu(roleId string, menuIds []string) int64 { - if roleId == "" || len(menuIds) <= 0 { - return 0 - } - - sysRoleMenus := []model.SysRoleMenu{} - for _, menuId := range menuIds { - if menuId == "" { - continue - } - sysRoleMenus = append(sysRoleMenus, model.NewSysRoleMenu(roleId, menuId)) - } - - return r.sysRoleMenuRepository.BatchRoleMenu(sysRoleMenus) -} - -// DeleteRoleByIds 批量删除角色信息 -func (r *SysRoleImpl) DeleteRoleByIds(roleIds []string) (int64, error) { - // 检查是否存在 - roles := r.sysRoleRepository.SelectRoleByIds(roleIds) - if len(roles) <= 0 { - // 没有可访问角色数据! - return 0, fmt.Errorf("there is no accessible role data") - } - for _, role := range roles { - // 检查是否为已删除 - if role.DelFlag == "1" { - // 【%s】角色信息已经删除! - return 0, fmt.Errorf("[%s] Role information has been deleted", role.RoleID) - } - // 检查分配用户 - userCount := r.sysUserRoleRepository.CountUserRoleByRoleId(role.RoleID) - if userCount > 0 { - // 【%s】已分配给用户,不能删除 - return 0, fmt.Errorf("[%s] has been assigned to a user and cannot be deleted", role.RoleName) - } - } - if len(roles) == len(roleIds) { - // 删除角色与菜单关联 - r.sysRoleMenuRepository.DeleteRoleMenu(roleIds) - // 删除角色与部门关联 - r.sysRoleDeptRepository.DeleteRoleDept(roleIds) - rows := r.sysRoleRepository.DeleteRoleByIds(roleIds) - return rows, nil - } - // 删除角色信息失败! - return 0, fmt.Errorf("failed to delete role information") -} - -// CheckUniqueRoleName 校验角色名称是否唯一 -func (r *SysRoleImpl) CheckUniqueRoleName(roleName, roleId string) bool { - uniqueId := r.sysRoleRepository.CheckUniqueRole(model.SysRole{ - RoleName: roleName, - }) - if uniqueId == roleId { - return true - } - return uniqueId == "" -} - -// CheckUniqueRoleKey 校验角色权限是否唯一 -func (r *SysRoleImpl) CheckUniqueRoleKey(roleKey, roleId string) bool { - uniqueId := r.sysRoleRepository.CheckUniqueRole(model.SysRole{ - RoleKey: roleKey, - }) - if uniqueId == roleId { - return true - } - return uniqueId == "" -} - -// AuthDataScope 修改数据权限信息 -func (r *SysRoleImpl) AuthDataScope(sysRole model.SysRole) int64 { - // 修改角色信息 - rows := r.sysRoleRepository.UpdateRole(sysRole) - // 删除角色与部门关联 - r.sysRoleDeptRepository.DeleteRoleDept([]string{sysRole.RoleID}) - // 新增角色和部门信息 - if sysRole.DataScope == "2" && len(sysRole.DeptIds) > 0 { - sysRoleDepts := []model.SysRoleDept{} - for _, deptId := range sysRole.DeptIds { - if deptId == "" { - continue - } - sysRoleDepts = append(sysRoleDepts, model.NewSysRoleDept(sysRole.RoleID, deptId)) - } - rows += r.sysRoleDeptRepository.BatchRoleDept(sysRoleDepts) - } - return rows -} - -// DeleteAuthUsers 批量取消授权用户角色 -func (r *SysRoleImpl) DeleteAuthUsers(roleId string, userIds []string) int64 { - return r.sysUserRoleRepository.DeleteUserRoleByRoleId(roleId, userIds) -} - -// InsertAuthUsers 批量新增授权用户角色 -func (r *SysRoleImpl) InsertAuthUsers(roleId string, userIds []string) int64 { - if roleId == "" || len(userIds) <= 0 { - return 0 - } - - sysUserRoles := []model.SysUserRole{} - for _, userId := range userIds { - if userId == "" { - continue - } - sysUserRoles = append(sysUserRoles, model.NewSysUserRole(userId, roleId)) - } - - return r.sysUserRoleRepository.BatchUserRole(sysUserRoles) -} diff --git a/src/modules/system/service/sys_user.go b/src/modules/system/service/sys_user.go index 7c149ea1..0cfaa855 100644 --- a/src/modules/system/service/sys_user.go +++ b/src/modules/system/service/sys_user.go @@ -1,42 +1,244 @@ package service -import "be.ems/src/modules/system/model" +import ( + "fmt" -// ISysUser 用户 服务层接口 -type ISysUser interface { - // SelectUserPage 根据条件分页查询用户列表 - SelectUserPage(query map[string]any, dataScopeSQL string) map[string]any + "be.ems/src/framework/constants" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) - // SelectUserList 根据条件查询用户列表 - SelectUserList(sysUser model.SysUser, dataScopeSQL string) []model.SysUser - - // SelectAllocatedPage 根据条件分页查询分配用户角色列表 - SelectAllocatedPage(query map[string]any, dataScopeSQL string) map[string]any - - // SelectUserByUserName 通过用户名查询用户 - SelectUserByUserName(userName string) model.SysUser - - // SelectUserById 通过用户ID查询用户 - SelectUserById(userId string) model.SysUser - - // InsertUser 新增用户信息 - InsertUser(sysUser model.SysUser) string - - // UpdateUser 修改用户信息 - UpdateUser(sysUser model.SysUser) int64 - - // UpdateUserAndRolePost 修改用户信息同时更新角色和岗位 - UpdateUserAndRolePost(sysUser model.SysUser) int64 - - // DeleteUserByIds 批量删除用户信息 - DeleteUserByIds(userIds []string) (int64, error) - - // CheckUniqueUserName 校验用户名称是否唯一 - CheckUniqueUserName(userName, userId string) bool - - // CheckUniquePhone 校验手机号码是否唯一 - CheckUniquePhone(phonenumber, userId string) bool - - // CheckUniqueEmail 校验email是否唯一 - CheckUniqueEmail(email, userId string) bool +// NewSysUser 实例化服务层 +var NewSysUser = &SysUser{ + sysUserRepository: repository.NewSysUser, + sysRoleRepository: repository.NewSysRole, + sysDeptRepository: repository.NewSysDept, + sysUserRoleRepository: repository.NewSysUserRole, + sysUserPostRepository: repository.NewSysUserPost, + sysDictTypeService: NewSysDictType, + sysDictDataService: NewSysDictData, + sysConfigService: NewSysConfig, +} + +// SysUser 用户 服务层处理 +type SysUser struct { + sysUserRepository *repository.SysUser // 用户服务 + sysRoleRepository *repository.SysRole // 角色服务 + sysDeptRepository *repository.SysDept // 部门服务 + sysUserRoleRepository *repository.SysUserRole // 用户与角色服务 + sysUserPostRepository *repository.SysUserPost // 用户与岗位服务 + sysDictTypeService *SysDictType // 字典类型服务 + sysDictDataService *SysDictData // 字典数据服务 + sysConfigService *SysConfig // 参数配置服务 +} + +// FindByPage 分页查询列表数据 +func (s SysUser) FindByPage(query map[string]string, dataScopeSQL string) ([]model.SysUser, int64) { + rows, total := s.sysUserRepository.SelectByPage(query, dataScopeSQL) + for i, v := range rows { + // 部门 + deptInfo := s.sysDeptRepository.SelectById(v.DeptId) + rows[i].Dept = &deptInfo + // 角色 + roleArr := s.sysRoleRepository.SelectByUserId(v.UserId) + roleIds := make([]int64, 0) + roles := make([]*model.SysRole, 0) + for _, role := range roleArr { + roles = append(roles, &role) + roleIds = append(roleIds, role.RoleId) + } + rows[i].Roles = roles + rows[i].RoleIds = roleIds + } + return rows, total +} + +// Find 查询数据 +func (s SysUser) Find(sysUser model.SysUser) []model.SysUser { + return s.sysUserRepository.Select(sysUser) +} + +// FindById 通过ID查询信息 +func (s SysUser) FindById(userId int64) model.SysUser { + userInfo := model.SysUser{} + if userId <= 0 { + return userInfo + } + users := s.sysUserRepository.SelectByIds([]int64{userId}) + if len(users) > 0 { + userInfo = users[0] + // 部门 + deptInfo := s.sysDeptRepository.SelectById(userInfo.DeptId) + userInfo.Dept = &deptInfo + // 角色 + roleArr := s.sysRoleRepository.SelectByUserId(userInfo.UserId) + roleIds := make([]int64, 0) + roles := make([]*model.SysRole, 0) + for _, role := range roleArr { + roles = append(roles, &role) + roleIds = append(roleIds, role.RoleId) + } + userInfo.Roles = roles + userInfo.RoleIds = roleIds + } + return userInfo +} + +// Insert 新增信息 +func (s SysUser) Insert(sysUser model.SysUser) int64 { + // 新增用户信息 + insertId := s.sysUserRepository.Insert(sysUser) + if insertId > 0 { + s.insertUserRole(insertId, sysUser.RoleIds) // 新增用户角色信息 + s.insertUserPost(insertId, sysUser.PostIds) // 新增用户岗位信息 + } + return insertId +} + +// insertUserRole 新增用户角色信息 +func (s SysUser) insertUserRole(userId int64, roleIds []int64) int64 { + if userId <= 0 || len(roleIds) <= 0 { + return 0 + } + + var arr []model.SysUserRole + for _, roleId := range roleIds { + // 系统管理员角色禁止操作,只能通过配置指定用户ID分配 + if roleId <= 0 || roleId == constants.SYS_ROLE_SYSTEM_ID { + continue + } + arr = append(arr, model.SysUserRole{ + UserId: userId, RoleId: roleId, + }) + } + + return s.sysUserRoleRepository.BatchInsert(arr) +} + +// insertUserPost 新增用户岗位信息 +func (s SysUser) insertUserPost(userId int64, postIds []int64) int64 { + if userId <= 0 || len(postIds) <= 0 { + return 0 + } + + var arr []model.SysUserPost + for _, postId := range postIds { + if postId <= 0 { + continue + } + arr = append(arr, model.SysUserPost{ + UserId: userId, PostId: postId, + }) + } + + return s.sysUserPostRepository.BatchInsert(arr) +} + +// Update 修改信息 +func (s SysUser) Update(sysUser model.SysUser) int64 { + return s.sysUserRepository.Update(sysUser) +} + +// UpdateUserAndRolePost 修改用户信息同时更新角色和岗位 +func (s SysUser) UpdateUserAndRolePost(sysUser model.SysUser) int64 { + // 删除用户与角色关联 + s.sysUserRoleRepository.DeleteByUserIds([]int64{sysUser.UserId}) + // 新增用户角色信息 + s.insertUserRole(sysUser.UserId, sysUser.RoleIds) + // 删除用户与岗位关联 + s.sysUserPostRepository.DeleteByUserIds([]int64{sysUser.UserId}) + // 新增用户岗位信息 + s.insertUserPost(sysUser.UserId, sysUser.PostIds) + return s.sysUserRepository.Update(sysUser) +} + +// DeleteByIds 批量删除信息 +func (s SysUser) DeleteByIds(userIds []int64) (int64, error) { + // 检查是否存在 + users := s.sysUserRepository.SelectByIds(userIds) + if len(users) <= 0 { + return 0, fmt.Errorf("没有权限访问用户数据!") + } + if len(users) == len(userIds) { + s.sysUserRoleRepository.DeleteByUserIds(userIds) // 删除用户与角色关联 + s.sysUserPostRepository.DeleteByUserIds(userIds) // 删除用户与岗位关联 + return s.sysUserRepository.DeleteByIds(userIds), nil + } + return 0, fmt.Errorf("删除用户信息失败!") +} + +// CheckUniqueByUserName 检查用户名称是否唯一 +func (s SysUser) CheckUniqueByUserName(userName string, userId int64) bool { + uniqueId := s.sysUserRepository.CheckUnique(model.SysUser{ + UserName: userName, + }) + if uniqueId == userId { + return true + } + return uniqueId == 0 +} + +// CheckUniqueByPhone 检查手机号码是否唯一 +func (s SysUser) CheckUniqueByPhone(phone string, userId int64) bool { + uniqueId := s.sysUserRepository.CheckUnique(model.SysUser{ + Phone: phone, + }) + if uniqueId == userId { + return true + } + return uniqueId == 0 +} + +// CheckUniqueByEmail 检查Email是否唯一 +func (s SysUser) CheckUniqueByEmail(email string, userId int64) bool { + uniqueId := s.sysUserRepository.CheckUnique(model.SysUser{ + Email: email, + }) + if uniqueId == userId { + return true + } + return uniqueId == 0 +} + +// FindByUserName 通过用户名查询用户信息 +func (s SysUser) FindByUserName(userName string) model.SysUser { + userinfo := s.sysUserRepository.SelectByUserName(userName) + if userinfo.UserName != userName { + return userinfo + } + // 部门 + deptInfo := s.sysDeptRepository.SelectById(userinfo.DeptId) + userinfo.Dept = &deptInfo + // 角色 + roleArr := s.sysRoleRepository.SelectByUserId(userinfo.UserId) + roles := make([]*model.SysRole, 0) + roleIds := make([]int64, 0) + for _, role := range roleArr { + roles = append(roles, &role) + roleIds = append(roleIds, role.RoleId) + } + userinfo.Roles = roles + userinfo.RoleIds = roleIds + return userinfo +} + +// FindAuthUsersPage 根据条件分页查询分配用户角色列表 +func (s SysUser) FindAuthUsersPage(query map[string]string, dataScopeSQL string) ([]model.SysUser, int64) { + rows, total := s.sysUserRepository.SelectAuthUsersByPage(query, dataScopeSQL) + for i, v := range rows { + // 部门 + deptInfo := s.sysDeptRepository.SelectById(v.DeptId) + rows[i].Dept = &deptInfo + // 角色 + roleArr := s.sysRoleRepository.SelectByUserId(v.UserId) + roleIds := make([]int64, 0) + roles := make([]*model.SysRole, 0) + for _, role := range roleArr { + roles = append(roles, &role) + roleIds = append(roleIds, role.RoleId) + } + rows[i].Roles = roles + rows[i].RoleIds = roleIds + } + return rows, total } diff --git a/src/modules/system/service/sys_user.impl.go b/src/modules/system/service/sys_user.impl.go deleted file mode 100644 index 8f1baf2e..00000000 --- a/src/modules/system/service/sys_user.impl.go +++ /dev/null @@ -1,178 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/framework/constants/admin" - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/repository" -) - -// 实例化服务层 SysUserImpl 结构体 -var NewSysUserImpl = &SysUserImpl{ - sysUserRepository: repository.NewSysUserImpl, - sysUserRoleRepository: repository.NewSysUserRoleImpl, - sysUserPostRepository: repository.NewSysUserPostImpl, -} - -// SysUserImpl 用户 服务层处理 -type SysUserImpl struct { - // 用户服务 - sysUserRepository repository.ISysUser - // 用户与角色服务 - sysUserRoleRepository repository.ISysUserRole - // 用户与岗位服务 - sysUserPostRepository repository.ISysUserPost -} - -// SelectUserPage 根据条件分页查询用户列表 -func (r *SysUserImpl) SelectUserPage(query map[string]any, dataScopeSQL string) map[string]any { - return r.sysUserRepository.SelectUserPage(query, dataScopeSQL) -} - -// SelectUserList 根据条件查询用户列表 -func (r *SysUserImpl) SelectUserList(sysUser model.SysUser, dataScopeSQL string) []model.SysUser { - return r.sysUserRepository.SelectUserList(sysUser, dataScopeSQL) -} - -// SelectAllocatedPage 根据条件分页查询分配用户角色列表 -func (r *SysUserImpl) SelectAllocatedPage(query map[string]any, dataScopeSQL string) map[string]any { - return r.sysUserRepository.SelectAllocatedPage(query, dataScopeSQL) -} - -// SelectUserByUserName 通过用户名查询用户 -func (r *SysUserImpl) SelectUserByUserName(userName string) model.SysUser { - return r.sysUserRepository.SelectUserByUserName(userName) -} - -// SelectUserById 通过用户ID查询用户 -func (r *SysUserImpl) SelectUserById(userId string) model.SysUser { - if userId == "" { - return model.SysUser{} - } - users := r.sysUserRepository.SelectUserByIds([]string{userId}) - if len(users) > 0 { - return users[0] - } - return model.SysUser{} -} - -// InsertUser 新增用户信息 -func (r *SysUserImpl) InsertUser(sysUser model.SysUser) string { - // 新增用户信息 - insertId := r.sysUserRepository.InsertUser(sysUser) - if insertId != "" { - // 新增用户角色信息 - r.insertUserRole(insertId, sysUser.RoleIDs) - // 新增用户岗位信息 - r.insertUserPost(insertId, sysUser.PostIDs) - } - return insertId -} - -// insertUserRole 新增用户角色信息 -func (r *SysUserImpl) insertUserRole(userId string, roleIds []string) int64 { - if userId == "" || len(roleIds) <= 0 { - return 0 - } - - sysUserRoles := []model.SysUserRole{} - for _, roleId := range roleIds { - // 管理员角色禁止操作,只能通过配置指定用户ID分配 - if roleId == "" || roleId == admin.ROLE_ID { - continue - } - sysUserRoles = append(sysUserRoles, model.NewSysUserRole(userId, roleId)) - } - - return r.sysUserRoleRepository.BatchUserRole(sysUserRoles) -} - -// insertUserPost 新增用户岗位信息 -func (r *SysUserImpl) insertUserPost(userId string, postIds []string) int64 { - if userId == "" || len(postIds) <= 0 { - return 0 - } - - sysUserPosts := []model.SysUserPost{} - for _, postId := range postIds { - if postId == "" { - continue - } - sysUserPosts = append(sysUserPosts, model.NewSysUserPost(userId, postId)) - } - - return r.sysUserPostRepository.BatchUserPost(sysUserPosts) -} - -// UpdateUser 修改用户信息 -func (r *SysUserImpl) UpdateUser(sysUser model.SysUser) int64 { - return r.sysUserRepository.UpdateUser(sysUser) -} - -// UpdateUserAndRolePost 修改用户信息同时更新角色和岗位 -func (r *SysUserImpl) UpdateUserAndRolePost(sysUser model.SysUser) int64 { - // 删除用户与角色关联 - r.sysUserRoleRepository.DeleteUserRole([]string{sysUser.UserID}) - // 新增用户角色信息 - r.insertUserRole(sysUser.UserID, sysUser.RoleIDs) - // 删除用户与岗位关联 - r.sysUserPostRepository.DeleteUserPost([]string{sysUser.UserID}) - // 新增用户岗位信息 - r.insertUserPost(sysUser.UserID, sysUser.PostIDs) - return r.sysUserRepository.UpdateUser(sysUser) -} - -// DeleteUserByIds 批量删除用户信息 -func (r *SysUserImpl) DeleteUserByIds(userIds []string) (int64, error) { - // 检查是否存在 - users := r.sysUserRepository.SelectUserByIds(userIds) - if len(users) <= 0 { - // 没有可访问用户数据! - return 0, fmt.Errorf("there is no accessible user data") - } - if len(users) == len(userIds) { - // 删除用户与角色关联 - r.sysUserRoleRepository.DeleteUserRole(userIds) - // 删除用户与岗位关联 - r.sysUserPostRepository.DeleteUserPost(userIds) - // ... 注意其他userId进行关联的表 - // 删除用户 - rows := r.sysUserRepository.DeleteUserByIds(userIds) - return rows, nil - } - return 0, fmt.Errorf("failed to delete user information") -} - -// CheckUniqueUserName 校验用户名称是否唯一 -func (r *SysUserImpl) CheckUniqueUserName(userName, userId string) bool { - uniqueId := r.sysUserRepository.CheckUniqueUser(model.SysUser{ - UserName: userName, - }) - if uniqueId == userId { - return true - } - return uniqueId == "" -} - -// CheckUniquePhone 校验手机号码是否唯一 -func (r *SysUserImpl) CheckUniquePhone(phonenumber, userId string) bool { - uniqueId := r.sysUserRepository.CheckUniqueUser(model.SysUser{ - PhoneNumber: phonenumber, - }) - if uniqueId == userId { - return true - } - return uniqueId == "" -} - -// CheckUniqueEmail 校验email是否唯一 -func (r *SysUserImpl) CheckUniqueEmail(email, userId string) bool { - uniqueId := r.sysUserRepository.CheckUniqueUser(model.SysUser{ - Email: email, - }) - if uniqueId == userId { - return true - } - return uniqueId == "" -} diff --git a/src/modules/system/system.go b/src/modules/system/system.go index 1331f83b..f8c2fb57 100644 --- a/src/modules/system/system.go +++ b/src/modules/system/system.go @@ -1,14 +1,12 @@ package system import ( + "github.com/gin-gonic/gin" + "be.ems/src/framework/logger" "be.ems/src/framework/middleware" - "be.ems/src/framework/middleware/collectlogs" - "be.ems/src/framework/middleware/repeat" "be.ems/src/modules/system/controller" "be.ems/src/modules/system/service" - - "github.com/gin-gonic/gin" ) // Setup 模块路由注册 @@ -31,34 +29,41 @@ func Setup(router *gin.Engine) { ) sysConfigGroup.POST("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:config:add"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysConfig", collectlogs.BUSINESS_TYPE_INSERT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysConfig", middleware.BUSINESS_TYPE_INSERT)), controller.NewSysConfig.Add, ) sysConfigGroup.PUT("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:config:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysConfig", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysConfig", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysConfig.Edit, ) - sysConfigGroup.DELETE("/:configIds", + sysConfigGroup.DELETE("/:configId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:config:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysConfig", collectlogs.BUSINESS_TYPE_DELETE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysConfig", middleware.BUSINESS_TYPE_DELETE)), controller.NewSysConfig.Remove, ) - sysConfigGroup.PUT("/refreshCache", - repeat.RepeatSubmit(5), + sysConfigGroup.PUT("/refresh", + middleware.RepeatSubmit(5), middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:config:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysConfig", collectlogs.BUSINESS_TYPE_CLEAN)), - controller.NewSysConfig.RefreshCache, + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysConfig", middleware.BUSINESS_TYPE_OTHER)), + controller.NewSysConfig.Refresh, ) - sysConfigGroup.GET("/configKey/:configKey", controller.NewSysConfig.ConfigKey) - sysConfigGroup.POST("/export", + sysConfigGroup.GET("/config-key/:configKey", + middleware.RateLimit(middleware.LimitOption{ + Time: 120, + Count: 15, + Type: middleware.LIMIT_IP, + }), + controller.NewSysConfig.ConfigKey, + ) + sysConfigGroup.GET("/export", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:config:export"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysConfig", collectlogs.BUSINESS_TYPE_EXPORT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysConfig", middleware.BUSINESS_TYPE_EXPORT)), controller.NewSysConfig.Export, ) - sysConfigGroup.PUT("/changeValue", + sysConfigGroup.PUT("/change-value", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:config:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysConfig", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysConfig", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysConfig.ConfigValue, ) } @@ -76,30 +81,30 @@ func Setup(router *gin.Engine) { ) sysDeptGroup.POST("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dept:add"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDept", collectlogs.BUSINESS_TYPE_INSERT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDept", middleware.BUSINESS_TYPE_INSERT)), controller.NewSysDept.Add, ) sysDeptGroup.PUT("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dept:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDept", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDept", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysDept.Edit, ) sysDeptGroup.DELETE("/:deptId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dept:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDept", collectlogs.BUSINESS_TYPE_DELETE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDept", middleware.BUSINESS_TYPE_DELETE)), controller.NewSysDept.Remove, ) sysDeptGroup.GET("/list/exclude/:deptId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dept:list"}}), controller.NewSysDept.ExcludeChild, ) - sysDeptGroup.GET("/treeSelect", + sysDeptGroup.GET("/tree", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dept:list", "system:user:list"}}), - controller.NewSysDept.TreeSelect, + controller.NewSysDept.Tree, ) - sysDeptGroup.GET("/roleDeptTreeSelect/:roleId", + sysDeptGroup.GET("/tree/role/:roleId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dept:query", "system:user:edit"}}), - controller.NewSysDept.RoleDeptTreeSelect, + controller.NewSysDept.TreeRole, ) } @@ -110,32 +115,32 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:list"}}), controller.NewSysDictData.List, ) - sysDictDataGroup.GET("/:dictCode", + sysDictDataGroup.GET("/:dataId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:query"}}), controller.NewSysDictData.Info, ) sysDictDataGroup.POST("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:add"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDictData", collectlogs.BUSINESS_TYPE_INSERT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDictData", middleware.BUSINESS_TYPE_INSERT)), controller.NewSysDictData.Add, ) sysDictDataGroup.PUT("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDictData", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDictData", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysDictData.Edit, ) - sysDictDataGroup.DELETE("/:dictCodes", + sysDictDataGroup.DELETE("/:dataId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDictData", collectlogs.BUSINESS_TYPE_DELETE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDictData", middleware.BUSINESS_TYPE_DELETE)), controller.NewSysDictData.Remove, ) sysDictDataGroup.GET("/type/:dictType", middleware.PreAuthorize(nil), controller.NewSysDictData.DictType, ) - sysDictDataGroup.POST("/export", + sysDictDataGroup.GET("/export", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:export"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDictData", collectlogs.BUSINESS_TYPE_EXPORT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDictData", middleware.BUSINESS_TYPE_EXPORT)), controller.NewSysDictData.Export, ) } @@ -153,35 +158,78 @@ func Setup(router *gin.Engine) { ) sysDictTypeGroup.POST("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:add"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDictType", collectlogs.BUSINESS_TYPE_INSERT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDictType", middleware.BUSINESS_TYPE_INSERT)), controller.NewSysDictType.Add, ) sysDictTypeGroup.PUT("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDictType", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDictType", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysDictType.Edit, ) - sysDictTypeGroup.DELETE("/:dictIds", + sysDictTypeGroup.DELETE("/:dictId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDictType", collectlogs.BUSINESS_TYPE_DELETE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDictType", middleware.BUSINESS_TYPE_DELETE)), controller.NewSysDictType.Remove, ) - sysDictTypeGroup.PUT("/refreshCache", + sysDictTypeGroup.PUT("/refresh", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDictType", collectlogs.BUSINESS_TYPE_CLEAN)), - controller.NewSysDictType.RefreshCache, + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDictType", middleware.BUSINESS_TYPE_OTHER)), + controller.NewSysDictType.Refresh, ) - sysDictTypeGroup.GET("/getDictOptionselect", + sysDictTypeGroup.GET("/options", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:query"}}), - controller.NewSysDictType.DictOptionselect, + controller.NewSysDictType.Options, ) - sysDictTypeGroup.POST("/export", + sysDictTypeGroup.GET("/export", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:dict:export"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysDictType", collectlogs.BUSINESS_TYPE_EXPORT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysDictType", middleware.BUSINESS_TYPE_EXPORT)), controller.NewSysDictType.Export, ) } + // 系统登录日志信息 + sysLogLoginGroup := router.Group("/system/log/login") + { + sysLogLoginGroup.GET("/list", + middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:login:list"}}), + controller.NewSysLogLogin.List, + ) + sysLogLoginGroup.DELETE("/clean", + middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:login:remove"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLogLogin", middleware.BUSINESS_TYPE_CLEAN)), + controller.NewSysLogLogin.Clean, + ) + sysLogLoginGroup.PUT("/unlock/:userName", + middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:login:unlock"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLogLogin", middleware.BUSINESS_TYPE_OTHER)), + controller.NewSysLogLogin.Unlock, + ) + sysLogLoginGroup.GET("/export", + middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:login:export"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLogLogin", middleware.BUSINESS_TYPE_EXPORT)), + controller.NewSysLogLogin.Export, + ) + } + + // 操作日志记录信息 + sysLogOperateGroup := router.Group("/system/log/operate") + { + sysLogOperateGroup.GET("/list", + middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:operate:list"}}), + controller.NewSysLogOperate.List, + ) + sysLogOperateGroup.DELETE("/clean", + middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:operate:remove"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLogOper", middleware.BUSINESS_TYPE_CLEAN)), + controller.NewSysLogOperate.Clean, + ) + sysLogOperateGroup.GET("/export", + middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:operate:export"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLogOper", middleware.BUSINESS_TYPE_EXPORT)), + controller.NewSysLogOperate.Export, + ) + } + // 菜单信息 sysMenuGroup := router.Group("/system/menu") { @@ -195,26 +243,26 @@ func Setup(router *gin.Engine) { ) sysMenuGroup.POST("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:menu:add"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysMenu", collectlogs.BUSINESS_TYPE_INSERT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysMenu", middleware.BUSINESS_TYPE_INSERT)), controller.NewSysMenu.Add, ) sysMenuGroup.PUT("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:menu:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysMenu", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysMenu", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysMenu.Edit, ) sysMenuGroup.DELETE("/:menuId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:menu:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysMenu", collectlogs.BUSINESS_TYPE_DELETE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysMenu", middleware.BUSINESS_TYPE_DELETE)), controller.NewSysMenu.Remove, ) - sysMenuGroup.GET("/treeSelect", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:menu:list", "system:dept:list"}}), - controller.NewSysMenu.TreeSelect, - ) - sysMenuGroup.GET("/roleMenuTreeSelect/:roleId", + sysMenuGroup.GET("/tree", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:menu:list", "system:role:query"}}), - controller.NewSysMenu.RoleMenuTreeSelect, + controller.NewSysMenu.Tree, + ) + sysMenuGroup.GET("/tree/role/:roleId", + middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:menu:list", "system:role:query"}}), + controller.NewSysMenu.TreeRole, ) } @@ -231,21 +279,22 @@ func Setup(router *gin.Engine) { ) sysPostGroup.POST("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:post:add"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysPost", collectlogs.BUSINESS_TYPE_INSERT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysPost", middleware.BUSINESS_TYPE_INSERT)), controller.NewSysPost.Add, ) sysPostGroup.PUT("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:post:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysPost", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysPost", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysPost.Edit, ) - sysPostGroup.DELETE("/:postIds", + sysPostGroup.DELETE("/:postId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:post:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysPost", collectlogs.BUSINESS_TYPE_DELETE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysPost", middleware.BUSINESS_TYPE_DELETE)), controller.NewSysPost.Remove, ) - sysPostGroup.POST("/export", + sysPostGroup.GET("/export", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:post:export"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysPost", middleware.BUSINESS_TYPE_EXPORT)), controller.NewSysPost.Export, ) } @@ -259,17 +308,13 @@ func Setup(router *gin.Engine) { ) sysProfileGroup.PUT("", middleware.PreAuthorize(nil), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysProfile", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysProfile.UpdateProfile, ) - sysProfileGroup.PUT("/updatePwd", + sysProfileGroup.PUT("/password", middleware.PreAuthorize(nil), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysProfile", collectlogs.BUSINESS_TYPE_UPDATE)), - controller.NewSysProfile.UpdatePwd, - ) - sysProfileGroup.POST("/avatar", - middleware.PreAuthorize(nil), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysProfileAvatar", collectlogs.BUSINESS_TYPE_UPDATE)), - controller.NewSysProfile.Avatar, + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysProfile", middleware.BUSINESS_TYPE_UPDATE)), + controller.NewSysProfile.UpdatePassword, ) } @@ -286,43 +331,43 @@ func Setup(router *gin.Engine) { ) sysRoleGroup.POST("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:role:add"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysRole", collectlogs.BUSINESS_TYPE_INSERT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysRole", middleware.BUSINESS_TYPE_INSERT)), controller.NewSysRole.Add, ) sysRoleGroup.PUT("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:role:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysRole", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysRole", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysRole.Edit, ) - sysRoleGroup.DELETE("/:roleIds", + sysRoleGroup.DELETE("/:roleId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:role:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysRole", collectlogs.BUSINESS_TYPE_DELETE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysRole", middleware.BUSINESS_TYPE_DELETE)), controller.NewSysRole.Remove, ) - sysRoleGroup.PUT("/changeStatus", - repeat.RepeatSubmit(5), + sysRoleGroup.PUT("/status", + middleware.RepeatSubmit(5), middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:role:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysRole", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysRole", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysRole.Status, ) - sysRoleGroup.PUT("/dataScope", - repeat.RepeatSubmit(5), + sysRoleGroup.PUT("/data-scope", + middleware.RepeatSubmit(5), middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysRole", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysRole", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysRole.DataScope, ) - sysRoleGroup.GET("/authUser/allocatedList", + sysRoleGroup.GET("/user/list", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:list"}}), - controller.NewSysRole.AuthUserAllocatedList, + controller.NewSysRole.UserAuthList, ) - sysRoleGroup.PUT("/authUser/checked", + sysRoleGroup.PUT("/user/auth", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysRole", collectlogs.BUSINESS_TYPE_GRANT)), - controller.NewSysRole.AuthUserChecked, + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysRole", middleware.BUSINESS_TYPE_GRANT)), + controller.NewSysRole.UserAuthChecked, ) - sysRoleGroup.POST("/export", + sysRoleGroup.GET("/export", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:export"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysRole", collectlogs.BUSINESS_TYPE_EXPORT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysRole", middleware.BUSINESS_TYPE_EXPORT)), controller.NewSysRole.Export, ) } @@ -340,96 +385,43 @@ func Setup(router *gin.Engine) { ) sysUserGroup.POST("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:add"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysUser", collectlogs.BUSINESS_TYPE_INSERT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysUser", middleware.BUSINESS_TYPE_INSERT)), controller.NewSysUser.Add, ) sysUserGroup.PUT("", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysUser", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysUser", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysUser.Edit, ) - sysUserGroup.DELETE("/:userIds", + sysUserGroup.DELETE("/:userId", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysUser", collectlogs.BUSINESS_TYPE_DELETE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysUser", middleware.BUSINESS_TYPE_DELETE)), controller.NewSysUser.Remove, ) - sysUserGroup.PUT("/resetPwd", + sysUserGroup.PUT("/password", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:resetPwd"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysUser", collectlogs.BUSINESS_TYPE_UPDATE)), - controller.NewSysUser.ResetPwd, + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysUser", middleware.BUSINESS_TYPE_UPDATE)), + controller.NewSysUser.Password, ) - sysUserGroup.PUT("/changeStatus", - repeat.RepeatSubmit(5), + sysUserGroup.PUT("/status", + middleware.RepeatSubmit(5), middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:edit"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysUser", collectlogs.BUSINESS_TYPE_UPDATE)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysUser", middleware.BUSINESS_TYPE_UPDATE)), controller.NewSysUser.Status, ) - sysUserGroup.POST("/export", + sysUserGroup.GET("/export", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:export"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysUser", collectlogs.BUSINESS_TYPE_EXPORT)), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysUser", middleware.BUSINESS_TYPE_EXPORT)), controller.NewSysUser.Export, ) - sysUserGroup.GET("/importTemplate", + sysUserGroup.GET("/import/template", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:import"}}), controller.NewSysUser.Template, ) - sysUserGroup.POST("/importData", + sysUserGroup.POST("/import", middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:user:import"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysUser", collectlogs.BUSINESS_TYPE_INSERT)), - controller.NewSysUser.ImportData, - ) - } - - // 操作日志记录信息 - sysLogOperGroup := router.Group("/system/log/operate") - { - sysLogOperGroup.GET("/list", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:operate:list"}}), - controller.NewSysLogOperate.List, - ) - sysLogOperGroup.DELETE("/:operIds", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:operate:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysLogOper", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewSysLogOperate.Remove, - ) - sysLogOperGroup.DELETE("/clean", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:operate:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysLogOper", collectlogs.BUSINESS_TYPE_CLEAN)), - controller.NewSysLogOperate.Clean, - ) - sysLogOperGroup.POST("/export", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:operate:export"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysLogOper", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewSysLogOperate.Export, - ) - } - - // 系统登录日志信息 - sysLogLoginGroup := router.Group("/system/log/login") - { - sysLogLoginGroup.GET("/list", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:login:list"}}), - controller.NewSysLogLogin.List, - ) - sysLogLoginGroup.DELETE("/:loginIds", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:login:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysLogLogin", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewSysLogLogin.Remove, - ) - sysLogLoginGroup.DELETE("/clean", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:login:remove"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysLogLogin", collectlogs.BUSINESS_TYPE_CLEAN)), - controller.NewSysLogLogin.Clean, - ) - sysLogLoginGroup.PUT("/unlock/:userName", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:login:unlock"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysLogLogin", collectlogs.BUSINESS_TYPE_CLEAN)), - controller.NewSysLogLogin.Unlock, - ) - sysLogLoginGroup.POST("/export", - middleware.PreAuthorize(map[string][]string{"hasPerms": {"system:log:login:export"}}), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysLogLogin", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewSysLogLogin.Export, + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysUser", middleware.BUSINESS_TYPE_IMPORT)), + controller.NewSysUser.Import, ) } } @@ -437,7 +429,12 @@ func Setup(router *gin.Engine) { // InitLoad 初始参数 func InitLoad() { // 启动时,刷新缓存-参数配置 - service.NewSysConfigImpl.ResetConfigCache() + service.NewSysConfig.CacheClean("*") + service.NewSysConfig.CacheLoad("*") // 启动时,刷新缓存-字典类型数据 - service.NewSysDictType.ResetDictCache() + service.NewSysDictType.CacheClean("*") + service.NewSysDictType.CacheLoad("*") + // 启动时,刷新缓存-多语言数据 + service.NewSysI18n.CacheClean("*") + service.NewSysI18n.CacheLoad("*") } diff --git a/src/modules/tool/controller/iperf.go b/src/modules/tool/controller/iperf.go index 6f226678..5ef938dd 100644 --- a/src/modules/tool/controller/iperf.go +++ b/src/modules/tool/controller/iperf.go @@ -8,8 +8,8 @@ import ( "be.ems/src/framework/i18n" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" neService "be.ems/src/modules/network_element/service" "be.ems/src/modules/tool/service" wsService "be.ems/src/modules/ws/service" @@ -38,7 +38,7 @@ type IPerfController struct { // @Tags tool/iperf // @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) +// @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) // @Param version query string true "Version" Enums(V2, V3) // @Success 200 {object} object "Response Results" @@ -47,24 +47,24 @@ type IPerfController struct { // @Description iperf version information // @Router /tool/iperf/v [get] func (s *IPerfController) Version(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { NeType string `form:"neType" binding:"required"` // 网元类型 NeId string `form:"neId" binding:"required"` // 网元ID Version string `form:"version" binding:"required,oneof=V2 V3"` // 版本 } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } output, err := s.iperfService.Version(query.NeType, query.NeId, query.Version) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } data := strings.Split(output, "\n") - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // iperf 软件安装 @@ -81,22 +81,22 @@ func (s *IPerfController) Version(c *gin.Context) { // @Description iperf software installation // @Router /tool/iperf/i [post] func (s *IPerfController) Install(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` // 网元类型 NeId string `json:"neId" binding:"required"` // 网元ID Version string `form:"version" binding:"required,oneof=V2 V3"` // 版本 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } if err := s.iperfService.Install(body.NeType, body.NeId, body.Version); err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } // iperf 软件运行 @@ -106,7 +106,7 @@ func (s *IPerfController) Install(c *gin.Context) { // @Tags tool/iperf // @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) +// @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) // @Param cols query number false "Terminal line characters" default(120) // @Param rows query number false "Terminal display lines" default(40) @@ -117,7 +117,7 @@ func (s *IPerfController) Install(c *gin.Context) { // @Description (ws://) iperf software running // @Router /tool/iperf/run [get] func (s *IPerfController) Run(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { NeType string `form:"neType" binding:"required"` // 网元类型 NeId string `form:"neId" binding:"required"` // 网元标识id @@ -125,28 +125,28 @@ func (s *IPerfController) Run(c *gin.Context) { Rows int `form:"rows"` // 终端显示行数 } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } // 网元主机的SSH客户端 sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() // ssh连接会话 clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) if err != nil { - c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) + c.JSON(200, resp.ErrMsg("neinfo ssh client session new err")) return } defer clientSession.Close() @@ -158,7 +158,7 @@ func (s *IPerfController) Run(c *gin.Context) { } defer wsConn.Close() - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + wsClient := s.wsService.ClientCreate(loginUser.UserId, nil, wsConn, clientSession) go s.wsService.ClientWriteListen(wsClient) go s.wsService.ClientReadListen(wsClient, s.iperfService.Run) @@ -175,7 +175,7 @@ func (s *IPerfController) Run(c *gin.Context) { outputByte := clientSession.Read() if len(outputByte) > 0 { outputStr := string(outputByte) - msgByte, _ := json.Marshal(result.Ok(map[string]any{ + msgByte, _ := json.Marshal(resp.Ok(map[string]any{ "requestId": fmt.Sprintf("iperf3_%d", ms.UnixMilli()), "data": outputStr, })) @@ -183,7 +183,7 @@ func (s *IPerfController) Run(c *gin.Context) { } case <-wsClient.StopChan: // 等待停止信号 s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + logger.Infof("ws Stop Client UID %d", wsClient.BindUid) return } } diff --git a/src/modules/tool/controller/ping.go b/src/modules/tool/controller/ping.go index c8806a53..6ee0ca66 100644 --- a/src/modules/tool/controller/ping.go +++ b/src/modules/tool/controller/ping.go @@ -7,8 +7,8 @@ import ( "be.ems/src/framework/i18n" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" neService "be.ems/src/modules/network_element/service" "be.ems/src/modules/tool/model" "be.ems/src/modules/tool/service" @@ -45,19 +45,19 @@ type PingController struct { // @Description Ping for Basic Information Running // @Router /tool/ping [post] func (s *PingController) Statistics(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.Ping if err := c.ShouldBindBodyWithJSON(&body); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } info, err := s.pingService.Statistics(body) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.OkData(info)) + c.JSON(200, resp.OkData(info)) } // ping 传统UNIX运行 @@ -74,11 +74,11 @@ func (s *PingController) Statistics(c *gin.Context) { // @Description (ws://) Ping for Local UNIX running // @Router /tool/ping [get] func (s *PingController) StatisticsOn(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } @@ -89,14 +89,14 @@ func (s *PingController) StatisticsOn(c *gin.Context) { } defer wsConn.Close() - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, nil) + wsClient := s.wsService.ClientCreate(loginUser.UserId, nil, wsConn, nil) go s.wsService.ClientWriteListen(wsClient) go s.wsService.ClientReadListen(wsClient, s.pingService.StatisticsOn) // 等待停止信号 for value := range wsClient.StopChan { s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s %s", wsClient.BindUid, value) + logger.Infof("ws Stop Client UID %d %s", wsClient.BindUid, value) return } } @@ -108,7 +108,7 @@ func (s *PingController) StatisticsOn(c *gin.Context) { // @Tags tool/ping // @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) +// @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 @@ -116,22 +116,22 @@ func (s *PingController) StatisticsOn(c *gin.Context) { // @Description Ping for version information on the network element side // @Router /tool/ping/v [get] func (s *PingController) Version(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { NeType string `form:"neType" binding:"required"` // 网元类型 NeID string `form:"neId" binding:"required"` // 网元ID } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } output, err := s.pingService.Version(query.NeType, query.NeID) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.OkData(output)) + c.JSON(200, resp.OkData(output)) } // ping 网元端UNIX运行 @@ -141,7 +141,7 @@ func (s *PingController) Version(c *gin.Context) { // @Tags tool/ping // @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) +// @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) // @Param cols query number false "Terminal line characters" default(120) // @Param rows query number false "Terminal display lines" default(40) @@ -152,7 +152,7 @@ func (s *PingController) Version(c *gin.Context) { // @Description (ws://) Ping for UNIX runs on the network element side // @Router /tool/ping/run [get] func (s *PingController) Run(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { NeType string `form:"neType" binding:"required"` // 网元类型 NeId string `form:"neId" binding:"required"` // 网元标识id @@ -160,28 +160,28 @@ func (s *PingController) Run(c *gin.Context) { Rows int `form:"rows"` // 终端显示行数 } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } // 网元主机的SSH客户端 sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() // ssh连接会话 clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) if err != nil { - c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) + c.JSON(200, resp.ErrMsg("neinfo ssh client session new err")) return } defer clientSession.Close() @@ -193,7 +193,7 @@ func (s *PingController) Run(c *gin.Context) { } defer wsConn.Close() - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + wsClient := s.wsService.ClientCreate(loginUser.UserId, nil, wsConn, clientSession) go s.wsService.ClientWriteListen(wsClient) go s.wsService.ClientReadListen(wsClient, s.pingService.Run) @@ -210,7 +210,7 @@ func (s *PingController) Run(c *gin.Context) { outputByte := clientSession.Read() if len(outputByte) > 0 { outputStr := string(outputByte) - msgByte, _ := json.Marshal(result.Ok(map[string]any{ + msgByte, _ := json.Marshal(resp.Ok(map[string]any{ "requestId": fmt.Sprintf("ping_%d", ms.UnixMilli()), "data": outputStr, })) @@ -218,7 +218,7 @@ func (s *PingController) Run(c *gin.Context) { } case <-wsClient.StopChan: // 等待停止信号 s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + logger.Infof("ws Stop Client UID %d", wsClient.BindUid) return } } diff --git a/src/modules/tool/service/iperf.go b/src/modules/tool/service/iperf.go index bdb3b7ea..d1530911 100644 --- a/src/modules/tool/service/iperf.go +++ b/src/modules/tool/service/iperf.go @@ -9,8 +9,8 @@ import ( "be.ems/src/framework/config" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/ssh" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" + "be.ems/src/framework/ssh" neService "be.ems/src/modules/network_element/service" wsModel "be.ems/src/modules/ws/model" ) @@ -137,8 +137,8 @@ func (s *IPerf) Run(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { // 必传requestId确认消息 if reqMsg.RequestID == "" { msg := "message requestId is required" - logger.Infof("ws IPerf Run UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) + logger.Infof("ws IPerf Run UID %d err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(resp.ErrMsg(msg)) client.MsgChan <- msgByte return } @@ -149,7 +149,7 @@ func (s *IPerf) Run(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { switch reqMsg.Type { case "close": // 主动关闭 - resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + resultByte, _ := json.Marshal(resp.OkMsg("user initiated closure")) client.MsgChan <- resultByte // 等待1s后关闭连接 time.Sleep(1 * time.Second) @@ -184,8 +184,8 @@ func (s *IPerf) Run(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { } if err != nil { - logger.Warnf("ws IPerf Run UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + logger.Warnf("ws IPerf Run UID %d err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(resp.ErrMsg(err.Error())) client.MsgChan <- msgByte if err == io.EOF { // 等待1s后关闭连接 diff --git a/src/modules/tool/service/ping.go b/src/modules/tool/service/ping.go index 79f51a2a..6d2db937 100644 --- a/src/modules/tool/service/ping.go +++ b/src/modules/tool/service/ping.go @@ -8,8 +8,8 @@ import ( "time" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/ssh" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" + "be.ems/src/framework/ssh" neService "be.ems/src/modules/network_element/service" "be.ems/src/modules/tool/model" wsModel "be.ems/src/modules/ws/model" @@ -47,8 +47,8 @@ func (s *Ping) StatisticsOn(client *wsModel.WSClient, reqMsg wsModel.WSRequest) // 必传requestId确认消息 if reqMsg.RequestID == "" { msg := "message requestId is required" - logger.Infof("ws Commont UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) + logger.Infof("ws Commont UID %d err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(resp.ErrMsg(msg)) client.MsgChan <- msgByte return } @@ -59,7 +59,7 @@ func (s *Ping) StatisticsOn(client *wsModel.WSClient, reqMsg wsModel.WSRequest) switch reqMsg.Type { case "close": // 主动关闭 - resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + resultByte, _ := json.Marshal(resp.OkMsg("user initiated closure")) client.MsgChan <- resultByte // 等待1s后关闭连接 time.Sleep(1 * time.Second) @@ -81,7 +81,7 @@ func (s *Ping) StatisticsOn(client *wsModel.WSClient, reqMsg wsModel.WSRequest) // 接收的数据包 pinger.OnRecv = func(pkt *probing.Packet) { - resultByte, _ := json.Marshal(result.Ok(map[string]any{ + resultByte, _ := json.Marshal(resp.Ok(map[string]any{ "requestId": reqMsg.RequestID, "data": fmt.Sprintf("%d bytes from %s: icmp_seq=%d time=%v\\r\\n", pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt), })) @@ -89,7 +89,7 @@ func (s *Ping) StatisticsOn(client *wsModel.WSClient, reqMsg wsModel.WSRequest) } // 已接收过的数据包 pinger.OnDuplicateRecv = func(pkt *probing.Packet) { - resultByte, _ := json.Marshal(result.Ok(map[string]any{ + resultByte, _ := json.Marshal(resp.Ok(map[string]any{ "requestId": reqMsg.RequestID, "data": fmt.Sprintf("%d bytes from %s: icmp_seq=%d time=%v ttl=%v (DUP!)\\r\\n", pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt, pkt.TTL), })) @@ -100,13 +100,13 @@ func (s *Ping) StatisticsOn(client *wsModel.WSClient, reqMsg wsModel.WSRequest) end1 := fmt.Sprintf("\\r\\n--- %s ping statistics ---\\r\\n", stats.Addr) end2 := fmt.Sprintf("%d packets transmitted, %d packets received, %v%% packet loss\\r\\n", stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss) end3 := fmt.Sprintf("round-trip min/avg/max/stddev = %v/%v/%v/%v\\r\\n", stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt) - resultByte, _ := json.Marshal(result.Ok(map[string]any{ + resultByte, _ := json.Marshal(resp.Ok(map[string]any{ "requestId": reqMsg.RequestID, "data": fmt.Sprintf("%s%s%s", end1, end2, end3), })) client.MsgChan <- resultByte } - resultByte, _ := json.Marshal(result.Ok(map[string]any{ + resultByte, _ := json.Marshal(resp.Ok(map[string]any{ "requestId": reqMsg.RequestID, "data": fmt.Sprintf("PING %s (%s) %d bytes of data.\\r\\n", pinger.Addr(), pinger.IPAddr(), pinger.Size), })) @@ -120,8 +120,8 @@ func (s *Ping) StatisticsOn(client *wsModel.WSClient, reqMsg wsModel.WSRequest) } if err != nil { - logger.Warnf("ws ping run UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + logger.Warnf("ws ping run UID %d err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(resp.ErrMsg(err.Error())) client.MsgChan <- msgByte if err == io.EOF { // 等待1s后关闭连接 @@ -150,8 +150,8 @@ func (s *Ping) Run(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { // 必传requestId确认消息 if reqMsg.RequestID == "" { msg := "message requestId is required" - logger.Infof("ws ping run UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) + logger.Infof("ws ping run UID %d err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(resp.ErrMsg(msg)) client.MsgChan <- msgByte return } @@ -162,7 +162,7 @@ func (s *Ping) Run(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { switch reqMsg.Type { case "close": // 主动关闭 - resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + resultByte, _ := json.Marshal(resp.OkMsg("user initiated closure")) client.MsgChan <- resultByte // 等待1s后关闭连接 time.Sleep(1 * time.Second) @@ -197,8 +197,8 @@ func (s *Ping) Run(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { } if err != nil { - logger.Warnf("ws ping run UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + logger.Warnf("ws ping run UID %d err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(resp.ErrMsg(err.Error())) client.MsgChan <- msgByte if err == io.EOF { // 等待1s后关闭连接 diff --git a/src/modules/trace/controller/packet.go b/src/modules/trace/controller/packet.go index ac54aa2b..db8d8b3f 100644 --- a/src/modules/trace/controller/packet.go +++ b/src/modules/trace/controller/packet.go @@ -1,12 +1,14 @@ package controller import ( + "fmt" + "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" traceService "be.ems/src/modules/trace/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 PacketController 结构体 @@ -26,85 +28,89 @@ type PacketController struct { // GET /devices func (s *PacketController) Devices(c *gin.Context) { data := s.packetService.NetworkDevices() - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) } // 信令跟踪开始 // // POST /start func (s *PacketController) Start(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { TaskNo string `json:"taskNo" binding:"required"` // 任务编号 Device string `json:"device" binding:"required"` // 网卡设备 Filter string `json:"filter" ` // 过滤表达式(port 33030 or 33040) OutputPCAP bool `json:"outputPCAP" ` // 输出PCAP文件 (默认false) } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } msg, err := s.packetService.LiveStart(body.TaskNo, body.Device, body.Filter, body.OutputPCAP) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.OkData(msg)) + c.JSON(200, resp.OkData(msg)) } // 信令跟踪结束 // // POST /stop func (s *PacketController) Stop(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { TaskNo string `json:"taskNo" binding:"required"` // 任务编号 } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } if err := s.packetService.LiveStop(body.TaskNo); err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } // 信令跟踪过滤 // // PUT /filter func (s *PacketController) Filter(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { TaskNo string `json:"taskNo" binding:"required"` // 任务编号 Expr string `json:"expr" ` // 过滤表达式(port 33030 or 33040) } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } if err := s.packetService.LiveFilter(body.TaskNo, body.Expr); err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } // 信令跟踪续期保活 // // PUT /keep-alive func (s *PacketController) KeepAlive(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { TaskNo string `json:"taskNo" binding:"required"` // 任务编号 Duration int `json:"duration" ` // 服务失效的时间,默认设置为120秒 } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } @@ -114,8 +120,8 @@ func (s *PacketController) KeepAlive(c *gin.Context) { } if err := s.packetService.LiveTimeout(body.TaskNo, body.Duration); err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } diff --git a/src/modules/trace/controller/tcpdump.go b/src/modules/trace/controller/tcpdump.go index dd1efbf2..c2920e08 100644 --- a/src/modules/trace/controller/tcpdump.go +++ b/src/modules/trace/controller/tcpdump.go @@ -1,9 +1,11 @@ package controller import ( + "fmt" + "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" traceService "be.ems/src/modules/trace/service" "github.com/gin-gonic/gin" @@ -35,7 +37,7 @@ type TCPdumpController struct { // @Description Network Element Capture Packet PACP Start // @Router /trace/tcpdump/start [post] func (s *TCPdumpController) DumpStart(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` // 网元类型 NeId string `json:"neId" binding:"required"` // 网元ID @@ -43,16 +45,17 @@ func (s *TCPdumpController) DumpStart(c *gin.Context) { } err := c.ShouldBindBodyWithJSON(&body) if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } taskCode, err := s.tcpdumpService.DumpStart(body.NeType, body.NeId, body.Cmd) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.OkData(taskCode)) + c.JSON(200, resp.OkData(taskCode)) } // 网元抓包PACP 结束 @@ -69,7 +72,7 @@ func (s *TCPdumpController) DumpStart(c *gin.Context) { // @Description Network Element Capture Packet PACP Stop // @Router /trace/tcpdump/stop [post] func (s *TCPdumpController) DumpStop(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` // 网元类型 NeId string `json:"neId" binding:"required"` // 网元ID @@ -77,16 +80,17 @@ func (s *TCPdumpController) DumpStop(c *gin.Context) { } err := c.ShouldBindBodyWithJSON(&body) if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } logFiles, err := s.tcpdumpService.DumpStop(body.NeType, body.NeId, body.TaskCode) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.OkData(logFiles)) + c.JSON(200, resp.OkData(logFiles)) } // UPF标准版内部抓包 @@ -103,7 +107,7 @@ func (s *TCPdumpController) DumpStop(c *gin.Context) { // @Description UPF Standard Edition Internal Grab Bag // @Router /trace/tcpdump/upf [post] func (s *TCPdumpController) UPFTrace(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { NeType string `json:"neType" binding:"required"` // 网元类型 NeId string `json:"neId" binding:"required"` // 网元ID @@ -111,14 +115,15 @@ func (s *TCPdumpController) UPFTrace(c *gin.Context) { } err := c.ShouldBindBodyWithJSON(&body) if err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } msg, err := s.tcpdumpService.UPFTrace(body.NeType, body.NeId, body.Cmd) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.OkData(msg)) + c.JSON(200, resp.OkData(msg)) } diff --git a/src/modules/trace/controller/trace_data.go b/src/modules/trace/controller/trace_data.go index 2d8222b9..1d032d64 100644 --- a/src/modules/trace/controller/trace_data.go +++ b/src/modules/trace/controller/trace_data.go @@ -1,13 +1,12 @@ package controller import ( - "strings" - "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" traceService "be.ems/src/modules/trace/service" + "github.com/gin-gonic/gin" ) @@ -20,43 +19,42 @@ var NewTraceData = &TraceDataController{ // // PATH /data type TraceDataController struct { - // 跟踪_数据信息服务 - traceDataService *traceService.TraceData + traceDataService *traceService.TraceData // 跟踪_数据信息服务 } // 跟踪任务数据列表 // // GET /list func (s *TraceDataController) List(c *gin.Context) { - query := ctx.QueryMap(c) - - // 查询数据 - data := s.traceDataService.SelectPage(query) - c.JSON(200, result.Ok(data)) + query := reqctx.QueryMap(c) + rows, total := s.traceDataService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 跟踪任务数据删除 // -// DELETE /:ids +// DELETE /:id func (s *TraceDataController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - rowIds := c.Param("ids") - if rowIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(rowIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.traceDataService.DeleteByIds(uniqueIDs) + + rows, err := s.traceDataService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } diff --git a/src/modules/trace/controller/trace_task.go b/src/modules/trace/controller/trace_task.go index fc912eab..f37cb523 100644 --- a/src/modules/trace/controller/trace_task.go +++ b/src/modules/trace/controller/trace_task.go @@ -4,16 +4,15 @@ import ( "fmt" "path/filepath" "runtime" - "strings" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/trace/model" traceService "be.ems/src/modules/trace/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 TraceTaskController 结构体 @@ -33,116 +32,125 @@ type TraceTaskController struct { // // GET /list func (s *TraceTaskController) List(c *gin.Context) { - query := ctx.QueryMap(c) - - // 查询数据 - data := s.traceTaskService.SelectPage(query) - c.JSON(200, result.Ok(data)) + query := reqctx.QueryMap(c) + rows, total := s.traceTaskService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 跟踪任务信息 // // GET /:id func (s *TraceTaskController) Info(c *gin.Context) { - language := ctx.AcceptLanguage(c) - id := c.Param("id") - if id == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + id := parse.Number(c.Param("id")) + if id <= 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } - data := s.traceTaskService.SelectById(id) + data := s.traceTaskService.FindById(id) if data.ID == id { - c.JSON(200, result.OkData(data)) + c.JSON(200, resp.OkData(data)) return } - c.JSON(200, result.Err(nil)) + c.JSON(200, resp.Err(nil)) } // 跟踪任务新增 // // POST / func (s *TraceTaskController) Add(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.TraceTask - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.ID != "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + err := c.ShouldBindBodyWithJSON(&body) + if err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.ID > 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id not is empty")) return } - body.CreateBy = ctx.LoginUserToUserName(c) + body.CreateBy = reqctx.LoginUserToUserName(c) if err = s.traceTaskService.Insert(body); err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } // 跟踪任务修改 // // PUT / func (s *TraceTaskController) Edit(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body model.TraceTask - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.ID == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + err := c.ShouldBindBodyWithJSON(&body) + if err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) + return + } + if body.ID == 0 { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } // 检查是否存在 - taskInfo := s.traceTaskService.SelectById(body.ID) + taskInfo := s.traceTaskService.FindById(body.ID) if taskInfo.ID != body.ID { // 没有可访问任务信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "task.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "task.noData"))) return } - body.UpdateBy = ctx.LoginUserToUserName(c) + body.UpdateBy = reqctx.LoginUserToUserName(c) if err = s.traceTaskService.Update(body); err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.Ok(nil)) + c.JSON(200, resp.Ok(nil)) } // 跟踪任务删除 // -// DELETE /:ids +// DELETE /:id func (s *TraceTaskController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - rowIds := c.Param("ids") - if rowIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(rowIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.traceTaskService.DeleteByIds(uniqueIDs) + + rows, err := s.traceTaskService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // 跟踪任务文件 // // GET /filePull func (s *TraceTaskController) FilePull(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys struct { TraceId string `form:"traceId" binding:"required"` } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } diff --git a/src/modules/trace/controller/trace_task_hlr.go b/src/modules/trace/controller/trace_task_hlr.go index 07acc5ba..586c48b9 100644 --- a/src/modules/trace/controller/trace_task_hlr.go +++ b/src/modules/trace/controller/trace_task_hlr.go @@ -5,18 +5,17 @@ import ( "os" "path/filepath" "runtime" - "strings" "be.ems/src/framework/i18n" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/generate" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" neService "be.ems/src/modules/network_element/service" "be.ems/src/modules/trace/model" traceService "be.ems/src/modules/trace/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 TraceTaskHlrController 结构体 @@ -37,49 +36,50 @@ type TraceTaskHlrController struct { // // GET /list func (s *TraceTaskHlrController) List(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var querys model.TraceTaskHlrQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + var query model.TraceTaskHlrQuery + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } - // 查询数据 - data := s.traceTaskHlrService.SelectPage(querys) - c.JSON(200, result.Ok(data)) + rows, total := s.traceTaskHlrService.FindByPage(query) + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // 跟踪任务删除 // -// DELETE /:ids +// DELETE /:id func (s *TraceTaskHlrController) Remove(c *gin.Context) { - language := ctx.AcceptLanguage(c) - rowIds := c.Param("ids") - if rowIds == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + language := reqctx.AcceptLanguage(c) + id := c.Param("id") + if id == "" { + c.JSON(400, resp.CodeMsg(40010, "bind err: id is empty")) return } + // 处理字符转id数组后去重 - ids := strings.Split(rowIds, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(id, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } - rows, err := s.traceTaskHlrService.DeleteByIds(uniqueIDs) + + rows, err := s.traceTaskHlrService.DeleteByIds(ids) if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return } msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows}) - c.JSON(200, result.OkMsg(msg)) + c.JSON(200, resp.OkMsg(msg)) } // 跟踪任务创建 // // POST /start func (s *TraceTaskHlrController) Start(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { IMSI string `json:"imsi"` // IMSI MSISDN string `json:"msisdn"` // MSISDN @@ -87,13 +87,13 @@ func (s *TraceTaskHlrController) Start(c *gin.Context) { EndTime int64 `json:"endTime"` // 结束时间 Remark string `json:"remark"` // 备注说明 } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } if body.IMSI == "" && body.MSISDN == "" { - c.JSON(400, result.CodeMsg(400, "imsi amd msisdn is empty")) + c.JSON(400, resp.CodeMsg(400, "imsi amd msisdn is empty")) return } @@ -103,88 +103,88 @@ func (s *TraceTaskHlrController) Start(c *gin.Context) { StartTime: body.StartTime, EndTime: body.EndTime, Remark: body.Remark, - CreateBy: ctx.LoginUserToUserName(c), + CreateBy: reqctx.LoginUserToUserName(c), } id, err := s.traceTaskHlrService.Start(task) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(id)) + c.JSON(200, resp.OkData(id)) } // 跟踪任务停止 // // POST /stop func (s *TraceTaskHlrController) Stop(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var body struct { ID string `json:"id" binding:"required"` // 任务ID } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 处理字符转id数组后去重 - ids := strings.Split(body.ID, ",") - uniqueIDs := parse.RemoveDuplicates(ids) - if len(uniqueIDs) <= 0 { - c.JSON(200, result.Err(nil)) - return + uniqueIDs := parse.RemoveDuplicatesToArray(body.ID, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) } errArr := []map[string]any{} - for _, id := range uniqueIDs { - task := s.traceTaskHlrService.SelectById(id) - if task.ID != id || task.ID == "" { + for _, id := range ids { + task := s.traceTaskHlrService.FindById(id) + if task.ID == 0 || task.ID != id { errArr = append(errArr, map[string]any{"id": id, "err": "task not found"}) continue } - task.UpdateBy = ctx.LoginUserToUserName(c) + task.UpdateBy = reqctx.LoginUserToUserName(c) err := s.traceTaskHlrService.Stop(task) if err != nil { errArr = append(errArr, map[string]any{"id": id, "err": err.Error()}) continue } } - c.JSON(200, result.OkData(errArr)) + c.JSON(200, resp.OkData(errArr)) } // 跟踪任务文件 // // POST /file func (s *TraceTaskHlrController) File(c *gin.Context) { - language := ctx.AcceptLanguage(c) var body struct { - ID string `json:"id" binding:"required"` // 任务ID + ID int64 `json:"id" binding:"required"` // 任务ID Dir string `json:"dir" binding:"required"` // 网元文件目录 } - if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } - task := s.traceTaskHlrService.SelectById(body.ID) - if task.ID != body.ID || task.ID == "" { - c.JSON(200, result.CodeMsg(400, "task not found")) + task := s.traceTaskHlrService.FindById(body.ID) + if task.ID == 0 || task.ID != body.ID { + c.JSON(200, resp.CodeMsg(400, "task not found")) return } list, err := s.traceTaskHlrService.File(task.TraceId, body.Dir) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } - c.JSON(200, result.OkData(list)) + c.JSON(200, resp.OkData(list)) } // 跟踪任务文件从网元到本地 // // GET /filePull func (s *TraceTaskHlrController) FilePull(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var querys struct { NeType string `form:"neType" binding:"required"` NeID string `form:"neId" binding:"required"` @@ -193,28 +193,29 @@ func (s *TraceTaskHlrController) FilePull(c *gin.Context) { DelTemp bool `form:"delTemp"` // 删除本地临时文件 } if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(40422, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := s.neInfoService.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { - c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sftpClient.Close() @@ -227,7 +228,7 @@ func (s *TraceTaskHlrController) FilePull(c *gin.Context) { } // 复制到本地 if err = sftpClient.CopyFileRemoteToLocal(nePath, localFilePath); err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } diff --git a/src/modules/trace/model/trace_data.go b/src/modules/trace/model/trace_data.go index 368d16e7..f21f0859 100644 --- a/src/modules/trace/model/trace_data.go +++ b/src/modules/trace/model/trace_data.go @@ -2,19 +2,19 @@ package model // TraceData 跟踪_数据 trace_data type TraceData struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - TaskId int64 `json:"taskId" gorm:"task_id"` // 任务ID - IMSI string `json:"imsi" gorm:"imsi"` - MSISDN string `json:"msisdn" gorm:"msisdn"` // 可能存在 - SrcAddr string `json:"srcAddr" gorm:"src_addr"` // 源地址带端口 - DstAddr string `json:"dstAddr" gorm:"dst_addr"` // 目标地址带端口 - IfType int64 `json:"ifType" gorm:"if_type"` // 接口类型,未分类 - MsgType int64 `json:"msgType" gorm:"msg_type"` - MsgDirect int64 `json:"msgDirect" gorm:"msg_direct"` - Length int64 `json:"length" gorm:"length"` // 去除头后的原始数据byte长度 - Timestamp int64 `json:"timestamp" gorm:"timestamp"` // 毫秒 - RawMsg string `json:"rawMsg" gorm:"raw_msg"` // 去除头后的原始数据byteBase64 - DecMsg string `json:"decMsg" gorm:"dec_msg"` // TCP内容消息 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + TaskId int64 `json:"taskId" gorm:"column:task_id"` // 任务ID + IMSI string `json:"imsi" gorm:"column:imsi"` + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 可能存在 + SrcAddr string `json:"srcAddr" gorm:"column:src_addr"` // 源地址带端口 + DstAddr string `json:"dstAddr" gorm:"column:dst_addr"` // 目标地址带端口 + IfType int64 `json:"ifType" gorm:"column:if_type"` // 接口类型,未分类 + MsgType int64 `json:"msgType" gorm:"column:msg_type"` + MsgDirect int64 `json:"msgDirect" gorm:"column:msg_direct"` + Length int64 `json:"length" gorm:"column:length"` // 去除头后的原始数据byte长度 + Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 毫秒 + RawMsg string `json:"rawMsg" gorm:"column:raw_msg"` // 去除头后的原始数据byteBase64 + DecMsg string `json:"decMsg" gorm:"column:dec_msg"` // TCP内容消息 } // TableName 表名称 diff --git a/src/modules/trace/model/trace_task.go b/src/modules/trace/model/trace_task.go index 752d4f70..c581afa2 100644 --- a/src/modules/trace/model/trace_task.go +++ b/src/modules/trace/model/trace_task.go @@ -2,27 +2,27 @@ package model // TraceTask 跟踪_任务 type TraceTask struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 跟踪任务ID - TraceId string `json:"traceId" gorm:"trace_id"` // 任务编号 - TraceType string `json:"traceType" gorm:"trace_type"` // 1-Interface,2-Device,3-User - StartTime int64 `json:"startTime" gorm:"start_time"` // 开始时间 毫秒 - EndTime int64 `json:"endTime" gorm:"end_time"` // 结束时间 毫秒 - Interfaces string `json:"interfaces" gorm:"interfaces"` // 接口跟踪必须 例如 N8,N10 - IMSI string `json:"imsi" gorm:"imsi"` // 用户跟踪必须 - MSISDN string `json:"msisdn" gorm:"msisdn"` // 用户跟踪可选 - UeIp string `json:"ueIp" gorm:"ue_ip"` // 设备跟踪必须 IP - SrcIp string `json:"srcIp" gorm:"src_ip"` // 源地址IP - DstIp string `json:"dstIp" gorm:"dst_ip"` // 目标地址IP - SignalPort int64 `json:"signalPort" gorm:"signal_port"` // 地址IP端口 - CreateBy string `json:"createBy" gorm:"create_by"` // 创建者 - CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 - UpdateBy string `json:"updateBy" gorm:"update_by"` // 更新者 - UpdateTime int64 `json:"updateTime" gorm:"update_time"` // 更新时间 - Remark string `json:"remark" gorm:"remark"` // 备注 - NeType string `json:"neType" gorm:"ne_type"` // 网元类型 - NeId string `json:"neId" gorm:"ne_id"` // 网元ID - NotifyUrl string `json:"notifyUrl" gorm:"notify_url"` // 信息数据通知回调地址UDP 例如udp:192.168.5.58:29500 - FetchMsg string `json:"fetchMsg" gorm:"fetch_msg"` // 任务下发请求响应消息 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 跟踪任务ID + TraceId string `json:"traceId" gorm:"column:trace_id"` // 任务编号 + TraceType string `json:"traceType" gorm:"column:trace_type"` // 1-Interface,2-Device,3-User + StartTime int64 `json:"startTime" gorm:"column:start_time"` // 开始时间 毫秒 + EndTime int64 `json:"endTime" gorm:"column:end_time"` // 结束时间 毫秒 + Interfaces string `json:"interfaces" gorm:"column:interfaces"` // 接口跟踪必须 例如 N8,N10 + IMSI string `json:"imsi" gorm:"column:imsi"` // 用户跟踪必须 + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户跟踪可选 + UeIp string `json:"ueIp" gorm:"column:ue_ip"` // 设备跟踪必须 IP + SrcIp string `json:"srcIp" gorm:"column:src_ip"` // 源地址IP + DstIp string `json:"dstIp" gorm:"column:dst_ip"` // 目标地址IP + SignalPort int64 `json:"signalPort" gorm:"column:signal_port"` // 地址IP端口 + 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"` // 备注 + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + NeId string `json:"neId" gorm:"column:ne_id"` // 网元ID + NotifyUrl string `json:"notifyUrl" gorm:"column:notify_url"` // 信息数据通知回调地址UDP 例如udp:192.168.5.58:29500 + FetchMsg string `json:"fetchMsg" gorm:"column:fetch_msg"` // 任务下发请求响应消息 } // TableName 表名称 diff --git a/src/modules/trace/model/trace_task_hlr.go b/src/modules/trace/model/trace_task_hlr.go index 2d306c4d..9658a017 100644 --- a/src/modules/trace/model/trace_task_hlr.go +++ b/src/modules/trace/model/trace_task_hlr.go @@ -2,19 +2,19 @@ package model // TraceTaskHlr 跟踪_任务给HRL网元 trace_task_hlr type TraceTaskHlr struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - TraceId string `json:"traceId" gorm:"trace_id"` // 任务编号 - IMSI string `json:"imsi" gorm:"imsi"` // IMSI - MSISDN string `json:"msisdn" gorm:"msisdn"` // MSISDN - StartTime int64 `json:"startTime" gorm:"start_time"` // 开始时间 - EndTime int64 `json:"endTime" gorm:"end_time"` // 结束时间 - Status string `json:"status" gorm:"status"` // 任务状态(0停止 1进行) - Msg string `json:"msg" gorm:"msg"` // 任务信息 - Remark string `json:"remark" gorm:"remark"` // 备注说明 - CreateBy string `json:"createBy" gorm:"create_by"` // 创建者 - CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 - UpdateBy string `json:"updateBy" gorm:"update_by"` // 更新者 - UpdateTime int64 `json:"updateTime" gorm:"update_time"` // 更新时间 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + TraceId string `json:"traceId" gorm:"column:trace_id"` // 任务编号 + IMSI string `json:"imsi" gorm:"column:imsi"` // IMSI + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // MSISDN + StartTime int64 `json:"startTime" gorm:"column:start_time"` // 开始时间 + EndTime int64 `json:"endTime" gorm:"column:end_time"` // 结束时间 + Status string `json:"status" gorm:"column:status"` // 任务状态(0停止 1进行) + Msg string `json:"msg" gorm:"column:msg"` // 任务信息 + 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"` // 更新时间 } // TableName 表名称 diff --git a/src/modules/trace/repository/trace_data.go b/src/modules/trace/repository/trace_data.go index c1e791b4..c25acd19 100644 --- a/src/modules/trace/repository/trace_data.go +++ b/src/modules/trace/repository/trace_data.go @@ -1,246 +1,102 @@ package repository import ( - "strings" + "fmt" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/trace/model" ) // 实例化数据层 TraceData 结构体 -var NewTraceData = &TraceData{ - selectSql: `select id, task_id, imsi, msisdn, src_addr, dst_addr, if_type, msg_type, msg_direct, length, timestamp, raw_msg, dec_msg from trace_data`, - - resultMap: map[string]string{ - "id": "ID", - "task_id": "TaskId", - "imsi": "IMSI", - "msisdn": "MSISDN", - "src_addr": "SrcAddr", - "dst_addr": "DstAddr", - "if_type": "IfType", - "msg_type": "MsgType", - "msg_direct": "MsgDirect", - "length": "Length", - "timestamp": "Timestamp", - "raw_msg": "RawMsg", - "dec_msg": "DecMsg", - }, -} +var NewTraceData = &TraceData{} // CDREventIMSImpl 跟踪_任务给HRL网元 数据层处理 -type TraceData struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type TraceData struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *TraceData) convertResultRows(rows []map[string]any) []model.TraceData { - arr := make([]model.TraceData, 0) - for _, row := range rows { - item := model.TraceData{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *TraceData) SelectPage(query map[string]any) map[string]any { +// SelectByPage 分页查询集合 +func (r TraceData) SelectByPage(query map[string]string) ([]model.TraceData, int64) { + tx := db.DB("").Model(&model.TraceData{}) // 查询条件拼接 - var conditions []string - var params []any if v, ok := query["imsi"]; ok && v != "" { - conditions = append(conditions, "imsi like concat(?, '%')") - params = append(params, v) + tx = tx.Where("imsi like concat(?, '%')", v) } if v, ok := query["msisdn"]; ok && v != "" { - conditions = append(conditions, "msisdn like concat(?, '%')") - params = append(params, v) + tx = tx.Where("msisdn like concat(?, '%')", v) } if v, ok := query["startTime"]; ok && v != "" { - conditions = append(conditions, "timestamp >= ?") - params = append(params, v) + if len(v) == 10 { + v = fmt.Sprintf("%s000", v) + tx = tx.Where("timestamp >= ?", v) + } else if len(v) == 13 { + tx = tx.Where("timestamp >= ?", v) + } } if v, ok := query["endTime"]; ok && v != "" { - conditions = append(conditions, "timestamp <= ?") - params = append(params, v) + if len(v) == 10 { + v = fmt.Sprintf("%s999", v) + tx = tx.Where("timestamp <= ?", v) + } else if len(v) == 13 { + tx = tx.Where("timestamp <= ?", v) + } } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + // 查询结果 + var total int64 = 0 + rows := []model.TraceData{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - result := map[string]any{ - "total": 0, - "rows": []model.TraceData{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from trace_data" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + // 查询数据分页 + 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("total err => %v", err) - return result + logger.Errorf("query find err => %v", err.Error()) + return rows, total } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total + return rows, total +} + +// SelectByIds 通过ID查询信息 +func (r TraceData) SelectByIds(ids []int64) []model.TraceData { + rows := []model.TraceData{} + if len(ids) <= 0 { + return rows } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - + tx := db.DB("").Model(&model.TraceData{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result + return rows } -// SelectList 根据实体查询 -func (r *TraceData) SelectList(data model.TraceData) []model.TraceData { - // 查询条件拼接 - var conditions []string - var params []any - if data.IMSI != "" { - conditions = append(conditions, "imsi = ?") - params = append(params, data.IMSI) - } - if data.MSISDN != "" { - conditions = append(conditions, "msisdn = ?") - params = append(params, data.MSISDN) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *TraceData) SelectByIds(ids []string) []model.TraceData { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.TraceData{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *TraceData) Insert(data model.TraceData) string { - // 参数拼接 - params := make(map[string]any) - if data.TaskId > 0 { - params["task_id"] = data.TaskId - } - if data.IMSI != "" { - params["imsi"] = data.IMSI - } - if data.MSISDN != "" { - params["msisdn"] = data.MSISDN - } - if data.SrcAddr != "" { - params["src_addr"] = data.SrcAddr - } - if data.DstAddr != "" { - params["dst_addr"] = data.DstAddr - } - if data.IfType > -1 { - params["if_type"] = data.IfType - } - if data.MsgType > -1 { - params["msg_type"] = data.MsgType - } - if data.MsgDirect > -1 { - params["msg_direct"] = data.MsgDirect - } - if data.Length > 0 { - params["length"] = data.Length - } - if data.Timestamp > 0 { - params["timestamp"] = data.Timestamp - } - if data.RawMsg != "" { - params["raw_msg"] = data.RawMsg - } - if data.DecMsg != "" { - params["dec_msg"] = data.DecMsg - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into trace_data (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() +// Insert 新增信息 返回新增数据ID +func (r TraceData) Insert(param model.TraceData) int64 { // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// DeleteByIds 批量删除信息 -func (r *TraceData) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from trace_data where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) return 0 } - return results + return param.ID +} + +// DeleteByIds 批量删除信息 返回受影响行数 +func (r TraceData) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.TraceData{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } diff --git a/src/modules/trace/repository/trace_task.go b/src/modules/trace/repository/trace_task.go index 39f3aa30..26a064a7 100644 --- a/src/modules/trace/repository/trace_task.go +++ b/src/modules/trace/repository/trace_task.go @@ -1,358 +1,147 @@ package repository import ( - "fmt" - "strings" "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/trace/model" ) // 实例化数据层 TraceTask 结构体 -var NewTraceTask = &TraceTask{ - selectSql: `select id, trace_id, trace_type, start_time, end_time, - interfaces, imsi, msisdn, - ue_ip, src_ip, dst_ip, signal_port, - create_by, create_time, update_by, update_time, remark, - ne_type, ne_id, notify_url, fetch_msg - from trace_task`, - - resultMap: map[string]string{ - "id": "ID", - "trace_id": "TraceId", - "trace_type": "TraceType", - "start_time": "StartTime", - "end_time": "EndTime", - "interfaces": "Interfaces", - "imsi": "IMSI", - "msisdn": "MSISDN", - "ue_ip": "UeIp", - "src_ip": "SrcIp", - "dst_ip": "DstIp", - "signal_port": "SignalPort", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - "remark": "Remark", - "ne_type": "NeType", - "ne_id": "NeId", - "notify_url": "NotifyUrl", - "fetch_msg": "FetchMsg", - }, -} +var NewTraceTask = &TraceTask{} // TraceTask 跟踪_任务 数据层处理 -type TraceTask struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type TraceTask struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *TraceTask) convertResultRows(rows []map[string]any) []model.TraceTask { - arr := make([]model.TraceTask, 0) - for _, row := range rows { - item := model.TraceTask{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *TraceTask) SelectPage(query map[string]any) map[string]any { +// SelectByPage 分页查询集合 +func (r TraceTask) SelectByPage(query map[string]string) ([]model.TraceTask, int64) { + tx := db.DB("").Model(&model.TraceTask{}) // 查询条件拼接 - var conditions []string - var params []any if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, v) + tx = tx.Where("ne_type = ?", v) } if v, ok := query["imsi"]; ok && v != "" { - conditions = append(conditions, "imsi like concat(?, '%')") - params = append(params, v) + tx = tx.Where("imsi like concat(?, '%')", v) } if v, ok := query["msisdn"]; ok && v != "" { - conditions = append(conditions, "msisdn like concat(?, '%')") - params = append(params, v) + tx = tx.Where("msisdn like concat(?, '%')", v) } if v, ok := query["startTime"]; ok && v != "" { - conditions = append(conditions, "start_time >= ?") - params = append(params, v) + tx = tx.Where("start_time >= ?", v) } if v, ok := query["endTime"]; ok && v != "" { - conditions = append(conditions, "end_time <= ?") - params = append(params, v) + tx = tx.Where("end_time >= ?", v) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + // 查询结果 + var total int64 = 0 + rows := []model.TraceTask{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - result := map[string]any{ - "total": 0, - "rows": []model.TraceTask{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from trace_task" - 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) + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) // 排序 - orderSql := "" if v, ok := query["sortField"]; ok && v != "" { - sortSql := v.(string) + sortSql := v if v, ok := query["sortOrder"]; ok && v != "" { - if v.(string) == "desc" { + if v == "desc" { sortSql += " desc " } else { sortSql += " asc " } } - orderSql = fmt.Sprintf(" order by %s ", sortSql) + tx.Order(sortSql) } + err := tx.Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// SelectByIds 通过ID查询信息 +func (r TraceTask) SelectByIds(ids []int64) []model.TraceTask { + rows := []model.TraceTask{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.TraceTask{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *TraceTask) SelectList(task model.TraceTask) []model.TraceTask { - // 查询条件拼接 - var conditions []string - var params []any - if task.IMSI != "" { - conditions = append(conditions, "imsi = ?") - params = append(params, task.IMSI) - } - if task.SrcIp != "" { - conditions = append(conditions, "src_ip = ?") - params = append(params, task.SrcIp) - } - if task.DstIp != "" { - conditions = append(conditions, "dst_ip = ?") - params = append(params, task.DstIp) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *TraceTask) SelectByIds(ids []string) []model.TraceTask { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.TraceTask{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *TraceTask) Insert(task model.TraceTask) string { - // 参数拼接 - params := make(map[string]any) - if task.TraceId != "" { - params["trace_id"] = task.TraceId - } - if task.TraceType != "" { - params["trace_type"] = task.TraceType - } - if task.StartTime > 0 { - params["start_time"] = task.StartTime - } - if task.EndTime > 0 { - params["end_time"] = task.EndTime - } - if task.Interfaces != "" { - params["interfaces"] = task.Interfaces - } - if task.IMSI != "" { - params["imsi"] = task.IMSI - } - if task.MSISDN != "" { - params["msisdn"] = task.MSISDN - } - if task.UeIp != "" { - params["ue_ip"] = task.UeIp - } - if task.SrcIp != "" { - params["src_ip"] = task.SrcIp - } - if task.DstIp != "" { - params["dst_ip"] = task.DstIp - } - if task.SignalPort != 0 { - params["signal_port"] = task.SignalPort - } - if task.NeType != "" { - params["ne_type"] = task.NeType - } - if task.NeId != "" { - params["ne_id"] = task.NeId - } - if task.NotifyUrl != "" { - params["notify_url"] = task.NotifyUrl - } - if task.FetchMsg != "" { - params["fetch_msg"] = task.FetchMsg - } - if task.Remark != "" { - params["remark"] = task.Remark - } - if task.CreateBy != "" { - params["create_by"] = task.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into trace_task (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *TraceTask) Update(task model.TraceTask) int64 { - // 参数拼接 - params := make(map[string]any) - params["trace_id"] = task.TraceId - params["trace_type"] = task.TraceType - params["ne_type"] = task.NeType - params["ne_id"] = task.NeId - params["notify_url"] = task.NotifyUrl - - params["start_time"] = task.StartTime - params["end_time"] = task.EndTime - params["fetch_msg"] = task.FetchMsg - params["remark"] = task.Remark - - params["interfaces"] = task.Interfaces - - params["imsi"] = task.IMSI - params["msisdn"] = task.MSISDN - - params["ue_ip"] = task.UeIp - params["src_ip"] = task.SrcIp - params["dst_ip"] = task.DstIp - params["signal_port"] = task.SignalPort - - if task.UpdateBy != "" { - params["update_by"] = task.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update trace_task set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, task.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows } return rows } -// DeleteByIds 批量删除信息 -func (r *TraceTask) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from trace_task where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +// Insert 新增信息 返回新增数据ID +func (r TraceTask) Insert(param model.TraceTask) int64 { + if param.CreateBy != "" { + ms := time.Now().UnixMilli() + param.UpdateBy = param.CreateBy + param.UpdateTime = ms + param.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) return 0 } - return results + return param.ID +} + +// Update 修改信息 返回受影响行数 +func (r TraceTask) Update(param model.TraceTask) int64 { + if param.ID <= 0 { + return 0 + } + if param.UpdateBy != "" { + param.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.TraceTask{}) + // 构建查询条件 + 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 TraceTask) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.TraceTask{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } // LastID 最后一条ID -func (r *TraceTask) LastID() int64 { +func (r TraceTask) LastID() int64 { + tx := db.DB("").Model(&model.TraceTask{}) // 查询数据 - querySql := "SELECT id as 'str' FROM trace_task ORDER BY id DESC LIMIT 1" - results, err := datasource.RawDB("", querySql, nil) - if err != nil { - logger.Errorf("query err %v", err) - return 0 + var id int64 = 0 + if err := tx.Select("id").Order("id DESC").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id } - if len(results) > 0 { - return parse.Number(results[0]["str"]) - } - return 0 + return id } diff --git a/src/modules/trace/repository/trace_task_hlr.go b/src/modules/trace/repository/trace_task_hlr.go index 15b6cbf5..95e638be 100644 --- a/src/modules/trace/repository/trace_task_hlr.go +++ b/src/modules/trace/repository/trace_task_hlr.go @@ -2,315 +2,144 @@ package repository import ( "fmt" - "strings" "time" - "be.ems/src/framework/datasource" + "be.ems/src/framework/database/db" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" "be.ems/src/modules/trace/model" ) // 实例化数据层 TraceTaskHlr 结构体 -var NewTraceTaskHlr = &TraceTaskHlr{ - selectSql: `select id, trace_id, imsi, msisdn, start_time, end_time, status, msg, remark, create_by, create_time, update_by, update_time from trace_task_hlr`, - - resultMap: map[string]string{ - "id": "ID", - "trace_id": "TraceId", - "imsi": "IMSI", - "msisdn": "MSISDN", - "start_time": "StartTime", - "end_time": "EndTime", - "status": "Status", - "msg": "Msg", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} +var NewTraceTaskHlr = &TraceTaskHlr{} // TraceTaskHlr 跟踪_任务给HRL网元 数据层处理 -type TraceTaskHlr struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} +type TraceTaskHlr struct{} -// convertResultRows 将结果记录转实体结果组 -func (r *TraceTaskHlr) convertResultRows(rows []map[string]any) []model.TraceTaskHlr { - arr := make([]model.TraceTaskHlr, 0) - for _, row := range rows { - item := model.TraceTaskHlr{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *TraceTaskHlr) SelectPage(querys model.TraceTaskHlrQuery) map[string]any { +// SelectByPage 分页查询集合 +func (r TraceTaskHlr) SelectByPage(query model.TraceTaskHlrQuery) ([]model.TraceTaskHlr, int64) { + tx := db.DB("").Model(&model.TraceTaskHlr{}) // 查询条件拼接 - var conditions []string - var params []any - if querys.IMSI != "" { - conditions = append(conditions, "imsi like concat(?, '%')") - params = append(params, querys.IMSI) + if query.IMSI != "" { + tx = tx.Where("imsi like concat(?, '%')", query.IMSI) } - if querys.MSISDN != "" { - conditions = append(conditions, "msisdn like concat(?, '%')") - params = append(params, querys.MSISDN) + if query.MSISDN != "" { + tx = tx.Where("msisdn like concat(?, '%')", query.MSISDN) } - if querys.StartTime != "" && len(querys.StartTime) == 13 { - conditions = append(conditions, "start_time >= ?") - params = append(params, querys.StartTime) + if query.StartTime != "" && len(query.StartTime) == 13 { + tx = tx.Where("start_time >= ?", query.StartTime) } - if querys.EndTime != "" && len(querys.EndTime) == 13 { - conditions = append(conditions, "end_time <= ?") - params = append(params, querys.EndTime) + if query.EndTime != "" && len(query.EndTime) == 13 { + tx = tx.Where("end_time >= ?", query.StartTime) } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") + // 查询结果 + var total int64 = 0 + rows := []model.TraceTaskHlr{} + + // 查询数量为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + return rows, total } - result := map[string]any{ - "total": 0, - "rows": []model.TraceTaskHlr{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from trace_task_hlr" - 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(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) + // 查询数据分页 + pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) + tx = tx.Limit(pageSize).Offset(pageSize * pageNum) // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { + if query.SortField != "" { + sortSql := query.SortField + if query.SortOrder != "" { + if query.SortOrder == "desc" { sortSql += " desc " } else { sortSql += " asc " } } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + tx.Order(fmt.Sprintf("id desc, %s ", sortSql)) } + err := tx.Find(&rows).Error + if err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows, total + } + return rows, total +} + +// SelectByIds 通过ID查询信息 +func (r TraceTaskHlr) SelectByIds(ids []int64) []model.TraceTaskHlr { + rows := []model.TraceTaskHlr{} + if len(ids) <= 0 { + return rows + } + tx := db.DB("").Model(&model.TraceTaskHlr{}) + // 构建查询条件 + tx = tx.Where("id in ?", ids) // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *TraceTaskHlr) SelectList(task model.TraceTaskHlr) []model.TraceTaskHlr { - // 查询条件拼接 - var conditions []string - var params []any - if task.IMSI != "" { - conditions = append(conditions, "imsi = ?") - params = append(params, task.IMSI) - } - if task.MSISDN != "" { - conditions = append(conditions, "msisdn = ?") - params = append(params, task.MSISDN) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *TraceTaskHlr) SelectByIds(ids []string) []model.TraceTaskHlr { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.TraceTaskHlr{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *TraceTaskHlr) Insert(task model.TraceTaskHlr) string { - // 参数拼接 - params := make(map[string]any) - if task.TraceId != "" { - params["trace_id"] = task.TraceId - } - if task.IMSI != "" { - params["imsi"] = task.IMSI - } - if task.MSISDN != "" { - params["msisdn"] = task.MSISDN - } - if task.StartTime != 0 { - params["start_time"] = task.StartTime - } - if task.EndTime != 0 { - params["end_time"] = task.EndTime - } - if task.Status != "" { - params["status"] = task.Status - } - if task.Msg != "" { - params["msg"] = task.Msg - } - if task.Remark != "" { - params["remark"] = task.Remark - } - if task.CreateBy != "" { - params["create_by"] = task.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into trace_task_hlr (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *TraceTaskHlr) Update(task model.TraceTaskHlr) int64 { - // 参数拼接 - params := make(map[string]any) - if task.TraceId != "" { - params["trace_id"] = task.TraceId - } - if task.IMSI != "" { - params["imsi"] = task.IMSI - } - if task.MSISDN != "" { - params["msisdn"] = task.MSISDN - } - if task.StartTime != 0 { - params["start_time"] = task.StartTime - } - if task.EndTime != 0 { - params["end_time"] = task.EndTime - } - if task.Status != "" { - params["status"] = task.Status - } - if task.Msg != "" { - params["msg"] = task.Msg - } - if task.Remark != "" { - params["remark"] = task.Remark - } - if task.UpdateBy != "" { - params["update_by"] = task.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update trace_task_hlr set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, task.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return rows } return rows } -// DeleteByIds 批量删除信息 -func (r *TraceTaskHlr) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from trace_task_hlr where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) +// Insert 新增信息 返回新增数据ID +func (r TraceTaskHlr) Insert(param model.TraceTaskHlr) int64 { + if param.CreateBy != "" { + ms := time.Now().UnixMilli() + param.UpdateBy = param.CreateBy + param.UpdateTime = ms + param.CreateTime = ms + } + // 执行插入 + if err := db.DB("").Create(¶m).Error; err != nil { + logger.Errorf("insert err => %v", err.Error()) return 0 } - return results + return param.ID +} + +// Update 修改信息 返回受影响行数 +func (r TraceTaskHlr) Update(param model.TraceTaskHlr) int64 { + if param.ID <= 0 { + return 0 + } + if param.UpdateBy != "" { + param.UpdateTime = time.Now().UnixMilli() + } + tx := db.DB("").Model(&model.TraceTaskHlr{}) + // 构建查询条件 + 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 TraceTaskHlr) DeleteByIds(ids []int64) int64 { + if len(ids) <= 0 { + return 0 + } + tx := db.DB("").Where("id in ?", ids) + if err := tx.Delete(&model.TraceTaskHlr{}).Error; err != nil { + logger.Errorf("delete err => %v", err.Error()) + return 0 + } + return tx.RowsAffected } // LastID 最后一条ID -func (r *TraceTaskHlr) LastID() int64 { +func (r TraceTaskHlr) LastID() int64 { + tx := db.DB("").Model(&model.TraceTaskHlr{}) // 查询数据 - querySql := "SELECT id as 'str' FROM trace_task_hlr ORDER BY id DESC LIMIT 1" - results, err := datasource.RawDB("", querySql, nil) - if err != nil { - logger.Errorf("query err %v", err) - return 0 + var id int64 = 0 + if err := tx.Select("id").Order("id DESC").Limit(1).Find(&id).Error; err != nil { + logger.Errorf("query find err => %v", err.Error()) + return id } - if len(results) > 0 { - return parse.Number(results[0]["str"]) - } - return 0 + return id } diff --git a/src/modules/trace/service/packet.go b/src/modules/trace/service/packet.go index 64cc6430..8091f356 100644 --- a/src/modules/trace/service/packet.go +++ b/src/modules/trace/service/packet.go @@ -1,7 +1,6 @@ package service import ( - "be.ems/src/framework/vo" packetTask "be.ems/src/modules/trace/packet_task" ) @@ -12,8 +11,8 @@ var NewPacket = &Packet{} type Packet struct{} // NetworkDevices 获取网卡设备信息 -func (s *Packet) NetworkDevices() []vo.TreeSelect { - arr := make([]vo.TreeSelect, 0) +func (s *Packet) NetworkDevices() []map[string]any { + arr := make([]map[string]any, 0) devices, err := packetTask.NetworkDevices() if err != nil { return arr @@ -28,16 +27,16 @@ func (s *Packet) NetworkDevices() []vo.TreeSelect { if lable == "" { lable = device.Name } - item := vo.TreeSelect{ - ID: device.Name, - Label: lable, - Children: []vo.TreeSelect{}, + item := map[string]any{ + "id": device.Name, + "label": lable, + "children": []map[string]any{}, } for _, address := range device.Addresses { if address.IP != nil { ip := address.IP.String() - item.Children = append(item.Children, vo.TreeSelect{ID: ip, Label: ip}) + item["children"] = append(item["children"].([]map[string]any), map[string]any{"id": ip, "label": ip}) } } arr = append(arr, item) diff --git a/src/modules/trace/service/tcpdump.go b/src/modules/trace/service/tcpdump.go index b94a027d..e691b51d 100644 --- a/src/modules/trace/service/tcpdump.go +++ b/src/modules/trace/service/tcpdump.go @@ -9,7 +9,7 @@ import ( "time" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/ssh" neService "be.ems/src/modules/network_element/service" ) @@ -34,7 +34,7 @@ func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) { } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.IP == "" { return "", fmt.Errorf("app.common.noNEInfo") } @@ -96,7 +96,7 @@ func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) { // DumpStop 停止已存在抓包句柄 func (s *TCPdump) DumpStop(neType, neId, taskCode string) ([]string, error) { // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.IP == "" { return []string{}, fmt.Errorf("app.common.noNEInfo") } @@ -214,7 +214,7 @@ func (s *TCPdump) UPFTrace(neType, neId, cmdStr string) (string, error) { } // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := s.neInfoService.FindByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.IP == "" { return "", fmt.Errorf("app.common.noNEInfo") } diff --git a/src/modules/trace/service/trace_data.go b/src/modules/trace/service/trace_data.go index 4a9ee7c6..8d26e51a 100644 --- a/src/modules/trace/service/trace_data.go +++ b/src/modules/trace/service/trace_data.go @@ -18,14 +18,14 @@ type TraceData struct { traceDataRepository *repository.TraceData } -// SelectPage 根据条件分页查询 -func (r *TraceData) SelectPage(query map[string]any) map[string]any { - return r.traceDataRepository.SelectPage(query) +// FindByPage 根据条件分页查询 +func (r *TraceData) FindByPage(query map[string]string) ([]model.TraceData, int64) { + return r.traceDataRepository.SelectByPage(query) } -// SelectById 通过ID查询 -func (r *TraceData) SelectById(id string) model.TraceData { - tasks := r.traceDataRepository.SelectByIds([]string{id}) +// FindById 通过ID查询 +func (r *TraceData) FindById(id int64) model.TraceData { + tasks := r.traceDataRepository.SelectByIds([]int64{id}) if len(tasks) > 0 { return tasks[0] } @@ -33,12 +33,12 @@ func (r *TraceData) SelectById(id string) model.TraceData { } // Insert 新增信息 -func (r *TraceData) Insert(task model.TraceData) string { +func (r *TraceData) Insert(task model.TraceData) int64 { return r.traceDataRepository.Insert(task) } // DeleteByIds 批量删除信息 -func (r *TraceData) DeleteByIds(ids []string) (int64, error) { +func (r *TraceData) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 rows := r.traceDataRepository.SelectByIds(ids) if len(rows) <= 0 { diff --git a/src/modules/trace/service/trace_task.go b/src/modules/trace/service/trace_task.go index 15f09976..d5259ab1 100644 --- a/src/modules/trace/service/trace_task.go +++ b/src/modules/trace/service/trace_task.go @@ -176,14 +176,14 @@ func (r *TraceTask) CloseUDP() { r.udpService.Close() } -// SelectPage 根据条件分页查询 -func (r *TraceTask) SelectPage(query map[string]any) map[string]any { - return r.traceTaskRepository.SelectPage(query) +// FindByPage 根据条件分页查询 +func (r *TraceTask) FindByPage(query map[string]string) ([]model.TraceTask, int64) { + return r.traceTaskRepository.SelectByPage(query) } -// SelectById 通过ID查询 -func (r *TraceTask) SelectById(id string) model.TraceTask { - tasks := r.traceTaskRepository.SelectByIds([]string{id}) +// FindById 通过ID查询 +func (r *TraceTask) FindById(id int64) model.TraceTask { + tasks := r.traceTaskRepository.SelectByIds([]int64{id}) if len(tasks) > 0 { return tasks[0] } @@ -209,7 +209,7 @@ func (r *TraceTask) Insert(task model.TraceTask) error { task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) // 查询网元获取IP - neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) + neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(task.NeType, task.NeId) if neInfo.NeId != task.NeId || neInfo.IP == "" { return fmt.Errorf("app.common.noNEInfo") } @@ -274,7 +274,7 @@ func (r *TraceTask) Update(task model.TraceTask) error { task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) // 查询网元获取IP - neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) + neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(task.NeType, task.NeId) if neInfo.NeId != task.NeId || neInfo.IP == "" { return fmt.Errorf("app.common.noNEInfo") } @@ -319,7 +319,7 @@ func (r *TraceTask) Update(task model.TraceTask) error { } // DeleteByIds 批量删除信息 -func (r *TraceTask) DeleteByIds(ids []string) (int64, error) { +func (r *TraceTask) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 rows := r.traceTaskRepository.SelectByIds(ids) if len(rows) <= 0 { @@ -329,7 +329,7 @@ func (r *TraceTask) DeleteByIds(ids []string) (int64, error) { if len(rows) == len(ids) { // 停止任务 for _, v := range rows { - neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(v.NeType, v.NeId) + neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(v.NeType, v.NeId) if neInfo.NeId != v.NeId || neInfo.IP == "" { continue } diff --git a/src/modules/trace/service/trace_task_hlr.go b/src/modules/trace/service/trace_task_hlr.go index 791cc12c..6642a21d 100644 --- a/src/modules/trace/service/trace_task_hlr.go +++ b/src/modules/trace/service/trace_task_hlr.go @@ -5,8 +5,8 @@ import ( "fmt" "path/filepath" + "be.ems/src/framework/ssh" "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/ssh" neFetchlink "be.ems/src/modules/network_element/fetch_link" neModel "be.ems/src/modules/network_element/model" neService "be.ems/src/modules/network_element/service" @@ -26,14 +26,14 @@ type TraceTaskHlr struct { neInfoService *neService.NeInfo // 网元信息服务 } -// SelectPage 根据条件分页查询 -func (r *TraceTaskHlr) SelectPage(querys model.TraceTaskHlrQuery) map[string]any { - return r.traceTaskHlrRepository.SelectPage(querys) +// FindByPage 根据条件分页查询 +func (r *TraceTaskHlr) FindByPage(querys model.TraceTaskHlrQuery) ([]model.TraceTaskHlr, int64) { + return r.traceTaskHlrRepository.SelectByPage(querys) } -// SelectById 通过ID查询 -func (r *TraceTaskHlr) SelectById(id string) model.TraceTaskHlr { - tasks := r.traceTaskHlrRepository.SelectByIds([]string{id}) +// FindById 通过ID查询 +func (r *TraceTaskHlr) FindById(id int64) model.TraceTaskHlr { + tasks := r.traceTaskHlrRepository.SelectByIds([]int64{id}) if len(tasks) > 0 { return tasks[0] } @@ -41,7 +41,7 @@ func (r *TraceTaskHlr) SelectById(id string) model.TraceTaskHlr { } // Insert 新增信息 -func (r *TraceTaskHlr) Insert(task model.TraceTaskHlr) string { +func (r *TraceTaskHlr) Insert(task model.TraceTaskHlr) int64 { return r.traceTaskHlrRepository.Insert(task) } @@ -51,7 +51,7 @@ func (r *TraceTaskHlr) Update(task model.TraceTaskHlr) int64 { } // DeleteByIds 批量删除信息 -func (r *TraceTaskHlr) DeleteByIds(ids []string) (int64, error) { +func (r *TraceTaskHlr) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 rows := r.traceTaskHlrRepository.SelectByIds(ids) if len(rows) <= 0 { @@ -60,7 +60,7 @@ func (r *TraceTaskHlr) DeleteByIds(ids []string) (int64, error) { if len(rows) == len(ids) { // 停止任务 - neInfos := r.neInfoService.SelectList(neModel.NeInfo{NeType: "HLR"}, false, false) + neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "HLR"}, false, false) for _, r := range rows { if r.Status == "0" { continue @@ -79,7 +79,7 @@ func (r *TraceTaskHlr) DeleteByIds(ids []string) (int64, error) { } // Start 创建任务 -func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (string, error) { +func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (int64, error) { hlrList := []map[string]any{} traceId := r.traceTaskHlrRepository.LastID() + 1 // 生成任务ID < 65535 data := map[string]any{ @@ -88,7 +88,7 @@ func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (string, error) { "msisdn": task.MSISDN, } if task.StartTime > task.EndTime { - return "", fmt.Errorf("startTime must less than endTime") + return 0, fmt.Errorf("startTime must less than endTime") } if task.StartTime > 0 { data["startTime"] = date.ParseDateToStr(task.StartTime, date.YYYY_MM_DDTHH_MM_SSZ) @@ -98,7 +98,7 @@ func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (string, error) { } // 发送创建任务 - neInfos := r.neInfoService.SelectList(neModel.NeInfo{NeType: "HLR"}, false, false) + neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "HLR"}, false, false) for _, neInfo := range neInfos { hlrItem := map[string]any{ "neType": neInfo.NeType, @@ -119,8 +119,8 @@ func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (string, error) { task.Status = "1" task.TraceId = fmt.Sprint(traceId) id := r.traceTaskHlrRepository.Insert(task) - if id == "" { - return "", fmt.Errorf("start task fail") + if id <= 0 { + return 0, fmt.Errorf("start task fail") } return id, nil } @@ -129,7 +129,7 @@ func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (string, error) { func (r *TraceTaskHlr) Stop(task model.TraceTaskHlr) error { hlrList := []map[string]any{} // 发送停止任务 - neInfos := r.neInfoService.SelectList(neModel.NeInfo{NeType: "HLR"}, false, false) + neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "HLR"}, false, false) for _, neInfo := range neInfos { hlrItem := map[string]any{ "neType": neInfo.NeType, @@ -161,7 +161,7 @@ func (r *TraceTaskHlr) Stop(task model.TraceTaskHlr) error { func (r *TraceTaskHlr) File(traceId, dirPath string) ([]map[string]any, error) { hlrList := []map[string]any{} // 查询所有匹配的网元类型 - neInfos := r.neInfoService.SelectList(neModel.NeInfo{NeType: "HLR"}, false, false) + neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "HLR"}, false, false) if len(neInfos) == 0 { return nil, fmt.Errorf("not found network element") } diff --git a/src/modules/trace/trace.go b/src/modules/trace/trace.go index 0fe3b742..b2edf33d 100644 --- a/src/modules/trace/trace.go +++ b/src/modules/trace/trace.go @@ -71,7 +71,7 @@ func Setup(router *gin.Engine) { taskHLRGroup.GET("/list", controller.NewTraceTaskHlr.List, ) - taskHLRGroup.DELETE("/:ids", + taskHLRGroup.DELETE("/:id", controller.NewTraceTaskHlr.Remove, ) taskHLRGroup.POST("/start", @@ -109,7 +109,7 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.task", collectlogs.BUSINESS_TYPE_UPDATE)), controller.NewTraceTask.Edit, ) - taskGroup.DELETE("/:ids", + taskGroup.DELETE("/:id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.task", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewTraceTask.Remove, @@ -127,7 +127,7 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewTraceData.List, ) - taskDataGroup.DELETE("/:ids", + taskDataGroup.DELETE("/:id", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.taskData", collectlogs.BUSINESS_TYPE_DELETE)), controller.NewTraceData.Remove, diff --git a/src/modules/ws/controller/ws.go b/src/modules/ws/controller/ws.go index ece900d7..c95bd4fe 100644 --- a/src/modules/ws/controller/ws.go +++ b/src/modules/ws/controller/ws.go @@ -5,9 +5,9 @@ import ( "be.ems/src/framework/i18n" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo/result" "be.ems/src/modules/ws/service" "github.com/gin-gonic/gin" @@ -36,18 +36,19 @@ type WSController struct { // @Tags ws // @Accept json // @Produce json -// @Param subGroupID query string false "Subscribe to message groups, multiple separated by commas" -// @Success 200 {object} object "Response Results" +// @Param subGroupID query string false "Subscribe to message groups, multiple separated by commas" +// @Param access_token query string false "Authorization tokens are used when it is inconvenient to pass parameters through the header." +// @Success 200 {object} object "Response Results" // @Summary (ws://) Generic // @Description (ws://) Generic // @Router /ws [get] func (s *WSController) WS(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } @@ -70,14 +71,14 @@ func (s *WSController) WS(c *gin.Context) { } defer conn.Close() - wsClient := s.wsService.ClientCreate(loginUser.UserID, subGroupIDs, conn, nil) + wsClient := s.wsService.ClientCreate(loginUser.UserId, subGroupIDs, conn, nil) go s.wsService.ClientWriteListen(wsClient) go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Commont) // 等待停止信号 for value := range wsClient.StopChan { s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s %s", wsClient.BindUid, value) + logger.Infof("ws Stop Client UID %d %s", wsClient.BindUid, value) return } } @@ -86,12 +87,12 @@ func (s *WSController) WS(c *gin.Context) { // // GET /test?clientId=xxx&groupID=xxx func (s *WSController) Test(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } @@ -113,5 +114,5 @@ func (s *WSController) Test(c *gin.Context) { } } - c.JSON(200, result.OkData(errMsgArr)) + c.JSON(200, resp.OkData(errMsgArr)) } diff --git a/src/modules/ws/controller/ws_redis.go b/src/modules/ws/controller/ws_redis.go index febcd3c7..f72de6b8 100644 --- a/src/modules/ws/controller/ws_redis.go +++ b/src/modules/ws/controller/ws_redis.go @@ -1,11 +1,11 @@ package controller import ( + "be.ems/src/framework/database/redis" "be.ems/src/framework/i18n" "be.ems/src/framework/logger" - "be.ems/src/framework/redis" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" @@ -15,26 +15,26 @@ import ( // // GET /redis?hostId=1 func (s *WSController) Redis(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { - HostId string `form:"hostId" binding:"required"` // 连接主机ID + HostId int64 `form:"hostId" binding:"required"` // 连接主机ID } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } - neHost := neService.NewNeHost.SelectById(query.HostId) - if neHost.HostID != query.HostId || neHost.HostType != "redis" { + neHost := neService.NewNeHost.FindById(query.HostId) + if neHost.ID != query.HostId || neHost.HostType != "redis" { // 没有可访问主机信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.noData"))) return } @@ -44,7 +44,7 @@ func (s *WSController) Redis(c *gin.Context) { client, err := connRedis.NewClient() if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer client.Close() @@ -56,14 +56,14 @@ func (s *WSController) Redis(c *gin.Context) { } defer wsConn.Close() - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, client) + wsClient := s.wsService.ClientCreate(loginUser.UserId, nil, wsConn, client) go s.wsService.ClientWriteListen(wsClient) go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Redis) // 等待停止信号 for value := range wsClient.StopChan { s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s %s", wsClient.BindUid, value) + logger.Infof("ws Stop Client UID %d %s", wsClient.BindUid, value) return } } diff --git a/src/modules/ws/controller/ws_ssh.go b/src/modules/ws/controller/ws_ssh.go index db33b6bd..c6c4e232 100644 --- a/src/modules/ws/controller/ws_ssh.go +++ b/src/modules/ws/controller/ws_ssh.go @@ -7,9 +7,9 @@ import ( "be.ems/src/framework/i18n" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/utils/ssh" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/ssh" neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" @@ -19,14 +19,14 @@ import ( // // GET /ssh?hostId=1&cols=80&rows=40 func (s *WSController) SSH(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { - HostId string `form:"hostId" binding:"required"` // 连接主机ID - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 + HostId int64 `form:"hostId" binding:"required"` // 连接主机ID + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } if query.Cols < 80 || query.Cols > 400 { @@ -37,16 +37,16 @@ func (s *WSController) SSH(c *gin.Context) { } // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } - neHost := neService.NewNeHost.SelectById(query.HostId) - if neHost.HostID != query.HostId || neHost.HostType != "ssh" { + neHost := neService.NewNeHost.FindById(query.HostId) + if neHost.ID != query.HostId || neHost.HostType != "ssh" { // 没有可访问主机信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.noData"))) return } @@ -62,7 +62,7 @@ func (s *WSController) SSH(c *gin.Context) { } if clientErr != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer client.Close() @@ -71,7 +71,7 @@ func (s *WSController) SSH(c *gin.Context) { clientSession, err := client.NewClientSession(query.Cols, query.Rows) if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer clientSession.Close() @@ -83,7 +83,7 @@ func (s *WSController) SSH(c *gin.Context) { } defer wsConn.Close() - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + wsClient := s.wsService.ClientCreate(loginUser.UserId, nil, wsConn, clientSession) go s.wsService.ClientWriteListen(wsClient) go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Shell) @@ -96,8 +96,8 @@ func (s *WSController) SSH(c *gin.Context) { outputByte := clientSession.Read() if len(outputByte) > 0 { outputStr := string(outputByte) - msgByte, _ := json.Marshal(result.Ok(map[string]any{ - "requestId": fmt.Sprintf("ssh_%s_%d", neHost.HostID, ms.UnixMilli()), + msgByte, _ := json.Marshal(resp.Ok(map[string]any{ + "requestId": fmt.Sprintf("ssh_%d_%d", neHost.ID, ms.UnixMilli()), "data": outputStr, })) wsClient.MsgChan <- msgByte @@ -111,7 +111,7 @@ func (s *WSController) SSH(c *gin.Context) { } case <-wsClient.StopChan: // 等待停止信号 s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + logger.Infof("ws Stop Client UID %d", wsClient.BindUid) return } } diff --git a/src/modules/ws/controller/ws_telnet.go b/src/modules/ws/controller/ws_telnet.go index 34f52240..38f4917d 100644 --- a/src/modules/ws/controller/ws_telnet.go +++ b/src/modules/ws/controller/ws_telnet.go @@ -7,9 +7,9 @@ import ( "be.ems/src/framework/i18n" "be.ems/src/framework/logger" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" "be.ems/src/framework/telnet" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" @@ -19,14 +19,14 @@ import ( // // GET /telnet?hostId=1 func (s *WSController) Telnet(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { - HostId string `form:"hostId" binding:"required"` // 连接主机ID - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 + HostId int64 `form:"hostId" binding:"required"` // 连接主机ID + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } if query.Cols < 120 || query.Cols > 400 { @@ -37,16 +37,16 @@ func (s *WSController) Telnet(c *gin.Context) { } // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } - neHost := neService.NewNeHost.SelectById(query.HostId) - if neHost.HostID != query.HostId || neHost.HostType != "telnet" { + neHost := neService.NewNeHost.FindById(query.HostId) + if neHost.ID != query.HostId || neHost.HostType != "telnet" { // 没有可访问主机信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.noData"))) return } @@ -56,7 +56,7 @@ func (s *WSController) Telnet(c *gin.Context) { client, err := connTelnet.NewClient() if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer client.Close() @@ -64,7 +64,7 @@ func (s *WSController) Telnet(c *gin.Context) { clientSession, err := client.NewClientSession(query.Cols, query.Rows) if err != nil { // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return } defer clientSession.Close() @@ -76,7 +76,7 @@ func (s *WSController) Telnet(c *gin.Context) { } defer wsConn.Close() - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + wsClient := s.wsService.ClientCreate(loginUser.UserId, nil, wsConn, clientSession) go s.wsService.ClientWriteListen(wsClient) go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Telnet) @@ -89,8 +89,8 @@ func (s *WSController) Telnet(c *gin.Context) { outputByte := clientSession.Read() if len(outputByte) > 0 { outputStr := string(outputByte) - msgByte, _ := json.Marshal(result.Ok(map[string]any{ - "requestId": fmt.Sprintf("telnet_%s_%d", neHost.HostID, ms.UnixMilli()), + msgByte, _ := json.Marshal(resp.Ok(map[string]any{ + "requestId": fmt.Sprintf("telnet_%d_%d", neHost.ID, ms.UnixMilli()), "data": outputStr, })) wsClient.MsgChan <- msgByte @@ -104,7 +104,7 @@ func (s *WSController) Telnet(c *gin.Context) { } case <-wsClient.StopChan: // 等待停止信号 s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + logger.Infof("ws Stop Client UID %d", wsClient.BindUid) return } } diff --git a/src/modules/ws/controller/ws_view.go b/src/modules/ws/controller/ws_view.go index e910b130..0f4f3c34 100644 --- a/src/modules/ws/controller/ws_view.go +++ b/src/modules/ws/controller/ws_view.go @@ -7,8 +7,8 @@ import ( "be.ems/src/framework/i18n" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" @@ -21,17 +21,17 @@ import ( // @Tags ws // @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) +// @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) // @Param cols query number false "Terminal line characters" default(120) // @Param rows query number false "Terminal display lines" default(40) -// @Param access_token query string true "Authorization" +// @Param access_token query string true "Authorization tokens are used when it is inconvenient to pass parameters through the header." // @Success 200 {object} object "Response Results" // @Summary (ws://) Terminal Interactive File Content Viewing // @Description (ws://) Terminal Interactive File Content Viewing // @Router /ws/view [get] func (s *WSController) ShellView(c *gin.Context) { - language := ctx.AcceptLanguage(c) + language := reqctx.AcceptLanguage(c) var query struct { NeType string `form:"neType" binding:"required"` // 网元类型 NeId string `form:"neId" binding:"required"` // 网元标识id @@ -39,7 +39,7 @@ func (s *WSController) ShellView(c *gin.Context) { Rows int `form:"rows"` // 终端显示行数 } if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } if query.Cols < 120 || query.Cols > 400 { @@ -50,23 +50,23 @@ func (s *WSController) ShellView(c *gin.Context) { } // 登录用户信息 - loginUser, err := ctx.LoginUser(c) + loginUser, err := reqctx.LoginUser(c) if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + c.JSON(401, resp.CodeMsg(401, i18n.TKey(language, err.Error()))) return } // 网元主机的SSH客户端 sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) + c.JSON(200, resp.ErrMsg(err.Error())) return } defer sshClient.Close() // ssh连接会话 clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) if err != nil { - c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) + c.JSON(200, resp.ErrMsg("neinfo ssh client session new err")) return } defer clientSession.Close() @@ -78,7 +78,7 @@ func (s *WSController) ShellView(c *gin.Context) { } defer wsConn.Close() - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + wsClient := s.wsService.ClientCreate(loginUser.UserId, nil, wsConn, clientSession) go s.wsService.ClientWriteListen(wsClient) go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.ShellView) @@ -95,7 +95,7 @@ func (s *WSController) ShellView(c *gin.Context) { outputByte := clientSession.Read() if len(outputByte) > 0 { outputStr := string(outputByte) - msgByte, _ := json.Marshal(result.Ok(map[string]any{ + msgByte, _ := json.Marshal(resp.Ok(map[string]any{ "requestId": fmt.Sprintf("view_%d", ms.UnixMilli()), "data": outputStr, })) @@ -103,7 +103,7 @@ func (s *WSController) ShellView(c *gin.Context) { } case <-wsClient.StopChan: // 等待停止信号 s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + logger.Infof("ws Stop Client UID %d", wsClient.BindUid) return } } diff --git a/src/modules/ws/model/ws.go b/src/modules/ws/model/ws.go index 759195ff..c5ea0ba2 100644 --- a/src/modules/ws/model/ws.go +++ b/src/modules/ws/model/ws.go @@ -7,7 +7,7 @@ type WSClient struct { ID string // 客户端连接ID-随机字符串16位 Conn *websocket.Conn // 连接实例 LastHeartbeat int64 // 最近一次心跳消息(毫秒) - BindUid string // 绑定登录用户ID + BindUid int64 // 绑定登录用户ID SubGroup []string // 订阅组ID MsgChan chan []byte // 消息通道 StopChan chan struct{} // 停止信号-退出协程 diff --git a/src/modules/ws/processor/cdr_connect.go b/src/modules/ws/processor/cdr_connect.go index 35d7846a..a3848860 100644 --- a/src/modules/ws/processor/cdr_connect.go +++ b/src/modules/ws/processor/cdr_connect.go @@ -5,7 +5,7 @@ import ( "fmt" "be.ems/src/framework/logger" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" neDataModel "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neInfoService "be.ems/src/modules/network_element/service" @@ -22,14 +22,14 @@ func GetCDRConnectByIMS(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.FindByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - rows, total := neDataService.NewCDREventIMS.SelectPage(query) - resultByte, err := json.Marshal(result.Ok(map[string]any{ + rows, total := neDataService.NewCDREventIMS.FindByPage(query) + resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": map[string]any{"rows": rows, "total": total}, })) @@ -47,14 +47,14 @@ func GetCDRConnectBySMF(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.FindByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - rows, total := neDataService.NewCDREventSMF.SelectPage(query) - resultByte, err := json.Marshal(result.Ok(map[string]any{ + rows, total := neDataService.NewCDREventSMF.FindByPage(query) + resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": map[string]any{"rows": rows, "total": total}, })) @@ -72,14 +72,14 @@ func GetCDRConnectBySMSC(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.FindByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - rows, total := neDataService.NewCDREventSMSC.SelectPage(query) - resultByte, err := json.Marshal(result.Ok(map[string]any{ + rows, total := neDataService.NewCDREventSMSC.FindByPage(query) + resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": map[string]any{"rows": rows, "total": total}, })) diff --git a/src/modules/ws/processor/ne_state.go b/src/modules/ws/processor/ne_state.go index bd4b1446..fc606b33 100644 --- a/src/modules/ws/processor/ne_state.go +++ b/src/modules/ws/processor/ne_state.go @@ -5,7 +5,7 @@ import ( "fmt" "be.ems/src/framework/logger" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" ) @@ -28,7 +28,7 @@ func GetNeState(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { return nil, fmt.Errorf("no matching network element information found") } @@ -36,7 +36,7 @@ func GetNeState(requestID string, data any) ([]byte, error) { // 网元直连 resData, err := neFetchlink.NeState(neInfo) if err != nil { - resultByte, err := json.Marshal(result.Ok(map[string]any{ + resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": map[string]any{ "online": false, @@ -50,7 +50,7 @@ func GetNeState(requestID string, data any) ([]byte, error) { } resData["online"] = true - resultByte, err := json.Marshal(result.Ok(map[string]any{ + resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": resData, })) diff --git a/src/modules/ws/processor/net_connect.go b/src/modules/ws/processor/net_connect.go index 5e242435..87b74595 100644 --- a/src/modules/ws/processor/net_connect.go +++ b/src/modules/ws/processor/net_connect.go @@ -6,7 +6,7 @@ import ( "strings" "be.ems/src/framework/logger" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" "be.ems/src/modules/ws/model" "github.com/shirou/gopsutil/v4/net" "github.com/shirou/gopsutil/v4/process" @@ -56,7 +56,7 @@ func GetNetConnections(requestID string, data any) ([]byte, error) { } } - resultByte, err := json.Marshal(result.Ok(map[string]any{ + resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": dataArr, })) diff --git a/src/modules/ws/processor/ps_process.go b/src/modules/ws/processor/ps_process.go index a685eba3..47d171b3 100644 --- a/src/modules/ws/processor/ps_process.go +++ b/src/modules/ws/processor/ps_process.go @@ -8,7 +8,7 @@ import ( "sync" "be.ems/src/framework/logger" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" "be.ems/src/modules/ws/model" "github.com/shirou/gopsutil/v4/process" ) @@ -120,7 +120,7 @@ func GetProcessData(requestID string, data any) ([]byte, error) { return dataArr[i].PID < dataArr[j].PID }) - resultByte, err := json.Marshal(result.Ok(map[string]any{ + resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": dataArr, })) diff --git a/src/modules/ws/processor/ue_connect.go b/src/modules/ws/processor/ue_connect.go index b875e8e8..79d99952 100644 --- a/src/modules/ws/processor/ue_connect.go +++ b/src/modules/ws/processor/ue_connect.go @@ -5,7 +5,7 @@ import ( "fmt" "be.ems/src/framework/logger" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" neDataModel "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" @@ -22,14 +22,14 @@ func GetUEConnectByAMF(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID("AMF", query.NeID) + neInfo := neService.NewNeInfo.FindByNeTypeAndNeID("AMF", query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("not fount neId info") } query.RmUID = neInfo.RmUID - rows, total := neDataService.NewUEEventAMF.SelectPage(query) - resultByte, err := json.Marshal(result.Ok(map[string]any{ + rows, total := neDataService.NewUEEventAMF.FindByPage(query) + resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": map[string]any{"rows": rows, "total": total}, })) @@ -47,14 +47,14 @@ func GetUEConnectByMME(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID("MME", query.NeID) + neInfo := neService.NewNeInfo.FindByNeTypeAndNeID("MME", query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("not fount neId info") } query.RmUID = neInfo.RmUID - rows, total := neDataService.NewUEEventMME.SelectPage(query) - resultByte, err := json.Marshal(result.Ok(map[string]any{ + rows, total := neDataService.NewUEEventMME.FindByPage(query) + resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": map[string]any{"rows": rows, "total": total}, })) diff --git a/src/modules/ws/processor/upf_total_flow.go b/src/modules/ws/processor/upf_total_flow.go index 0186dcd3..a0397014 100644 --- a/src/modules/ws/processor/upf_total_flow.go +++ b/src/modules/ws/processor/upf_total_flow.go @@ -5,7 +5,7 @@ import ( "fmt" "be.ems/src/framework/logger" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" ) @@ -29,14 +29,14 @@ func GetUPFTotalFlow(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { return nil, fmt.Errorf("no matching network element information found") } - dataMap := neDataService.NewPerfKPI.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) + dataMap := neDataService.NewKpiReport.FindUPFTotalFlow(neInfo.RmUID, querys.Day) - resultByte, err := json.Marshal(result.Ok(map[string]any{ + resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": dataMap, })) diff --git a/src/modules/ws/service/ws.go b/src/modules/ws/service/ws.go index 728dd609..264c1aab 100644 --- a/src/modules/ws/service/ws.go +++ b/src/modules/ws/service/ws.go @@ -7,8 +7,8 @@ import ( "time" "be.ems/src/framework/logger" + "be.ems/src/framework/resp" "be.ems/src/framework/utils/generate" - "be.ems/src/framework/vo/result" "be.ems/src/modules/ws/model" "github.com/gorilla/websocket" ) @@ -53,7 +53,7 @@ func (s *WS) UpgraderWs(w http.ResponseWriter, r *http.Request) *websocket.Conn // groupIDs 用户订阅组 // conn ws连接实例 // childConn 子连接实例 -func (s *WS) ClientCreate(uid string, groupIDs []string, conn *websocket.Conn, childConn any) *model.WSClient { +func (s *WS) ClientCreate(uid int64, groupIDs []string, conn *websocket.Conn, childConn any) *model.WSClient { // clientID也可以用其他方式生成,只要能保证在所有服务端中都能保证唯一即可 clientID := generate.Code(16) @@ -72,7 +72,7 @@ func (s *WS) ClientCreate(uid string, groupIDs []string, conn *websocket.Conn, c wsClients.Store(clientID, wsClient) // 存入用户持有客户端 - if uid != "" { + if uid > 0 { if v, ok := wsUsers.Load(uid); ok { uidClientIds := v.(*[]string) *uidClientIds = append(*uidClientIds, clientID) @@ -82,7 +82,7 @@ func (s *WS) ClientCreate(uid string, groupIDs []string, conn *websocket.Conn, c } // 存入用户订阅组 - if uid != "" && len(groupIDs) > 0 { + if uid > 0 && len(groupIDs) > 0 { for _, groupID := range groupIDs { if v, ok := wsGroup.Load(groupID); ok { groupClientIds := v.(*[]string) @@ -112,7 +112,7 @@ func (s *WS) ClientClose(clientID string) { }() // 客户端断线时自动踢出Uid绑定列表 - if client.BindUid != "" { + if client.BindUid > 0 { if v, ok := wsUsers.Load(client.BindUid); ok { uidClientIds := v.(*[]string) if len(*uidClientIds) > 0 { @@ -160,7 +160,7 @@ func (s *WS) ClientReadListen(wsClient *model.WSClient, receiveFn func(*model.WS // 读取消息 messageType, msg, err := wsClient.Conn.ReadMessage() if err != nil { - logger.Warnf("ws ReadMessage UID %s err: %s", wsClient.BindUid, err.Error()) + logger.Warnf("ws ReadMessage UID %d err: %s", wsClient.BindUid, err.Error()) s.ClientClose(wsClient.ID) return } @@ -170,7 +170,7 @@ func (s *WS) ClientReadListen(wsClient *model.WSClient, receiveFn func(*model.WS if messageType == websocket.TextMessage { var reqMsg model.WSRequest if err := json.Unmarshal(msg, &reqMsg); err != nil { - msgByte, _ := json.Marshal(result.ErrMsg("message format json error")) + msgByte, _ := json.Marshal(resp.ErrMsg("message format json error")) wsClient.MsgChan <- msgByte continue } @@ -189,7 +189,7 @@ func (s *WS) ClientWriteListen(wsClient *model.WSClient) { } }() // 发客户端id确认是否连接 - msgByte, _ := json.Marshal(result.OkData(map[string]string{ + msgByte, _ := json.Marshal(resp.OkData(map[string]string{ "clientId": wsClient.ID, })) wsClient.MsgChan <- msgByte @@ -203,7 +203,7 @@ func (s *WS) ClientWriteListen(wsClient *model.WSClient) { // 发送消息 err := wsClient.Conn.WriteMessage(websocket.TextMessage, msg) if err != nil { - logger.Warnf("ws WriteMessage UID %s err: %s", wsClient.BindUid, err.Error()) + logger.Warnf("ws WriteMessage UID %d err: %s", wsClient.BindUid, err.Error()) s.ClientClose(wsClient.ID) return } diff --git a/src/modules/ws/service/ws_receive.go b/src/modules/ws/service/ws_receive.go index 1b3b516d..6bb8f571 100644 --- a/src/modules/ws/service/ws_receive.go +++ b/src/modules/ws/service/ws_receive.go @@ -8,11 +8,11 @@ import ( "strings" "time" + "be.ems/src/framework/database/redis" "be.ems/src/framework/logger" - "be.ems/src/framework/redis" + "be.ems/src/framework/resp" + "be.ems/src/framework/ssh" "be.ems/src/framework/telnet" - "be.ems/src/framework/utils/ssh" - "be.ems/src/framework/vo/result" "be.ems/src/modules/ws/model" "be.ems/src/modules/ws/processor" ) @@ -26,7 +26,7 @@ type WSReceive struct{} // close 关闭服务连接 func (s *WSReceive) close(client *model.WSClient) { // 主动关闭 - resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + resultByte, _ := json.Marshal(resp.OkMsg("user initiated closure")) client.MsgChan <- resultByte // 等待1s后关闭连接 time.Sleep(1 * time.Second) @@ -38,8 +38,8 @@ func (s *WSReceive) Commont(client *model.WSClient, reqMsg model.WSRequest) { // 必传requestId确认消息 if reqMsg.RequestID == "" { msg := "message requestId is required" - logger.Infof("ws Commont UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) + logger.Infof("ws Commont UID %d err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(resp.ErrMsg(msg)) client.MsgChan <- msgByte return } @@ -74,8 +74,8 @@ func (s *WSReceive) Commont(client *model.WSClient, reqMsg model.WSRequest) { } if err != nil { - logger.Warnf("ws Commont UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + logger.Warnf("ws Commont UID %d err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(resp.ErrMsg(err.Error())) client.MsgChan <- msgByte return } @@ -89,8 +89,8 @@ func (s *WSReceive) Shell(client *model.WSClient, reqMsg model.WSRequest) { // 必传requestId确认消息 if reqMsg.RequestID == "" { msg := "message requestId is required" - logger.Infof("ws Shell UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) + logger.Infof("ws Shell UID %d err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(resp.ErrMsg(msg)) client.MsgChan <- msgByte return } @@ -124,8 +124,8 @@ func (s *WSReceive) Shell(client *model.WSClient, reqMsg model.WSRequest) { } if err != nil { - logger.Warnf("ws Shell UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + logger.Warnf("ws Shell UID %d err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(resp.ErrMsg(err.Error())) client.MsgChan <- msgByte if err == io.EOF { // 等待1s后关闭连接 @@ -144,8 +144,8 @@ func (s *WSReceive) ShellView(client *model.WSClient, reqMsg model.WSRequest) { // 必传requestId确认消息 if reqMsg.RequestID == "" { msg := "message requestId is required" - logger.Infof("ws ShellView UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) + logger.Infof("ws ShellView UID %d err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(resp.ErrMsg(msg)) client.MsgChan <- msgByte return } @@ -190,8 +190,8 @@ func (s *WSReceive) ShellView(client *model.WSClient, reqMsg model.WSRequest) { } if err != nil { - logger.Warnf("ws ShellView UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + logger.Warnf("ws ShellView UID %d err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(resp.ErrMsg(err.Error())) client.MsgChan <- msgByte if err == io.EOF { // 等待1s后关闭连接 @@ -210,8 +210,8 @@ func (s *WSReceive) Telnet(client *model.WSClient, reqMsg model.WSRequest) { // 必传requestId确认消息 if reqMsg.RequestID == "" { msg := "message requestId is required" - logger.Infof("ws Shell UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) + logger.Infof("ws Shell UID %d err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(resp.ErrMsg(msg)) client.MsgChan <- msgByte return } @@ -245,8 +245,8 @@ func (s *WSReceive) Telnet(client *model.WSClient, reqMsg model.WSRequest) { } if err != nil { - logger.Warnf("ws Shell UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + logger.Warnf("ws Shell UID %d err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(resp.ErrMsg(err.Error())) client.MsgChan <- msgByte if err == io.EOF { // 等待1s后关闭连接 @@ -265,8 +265,8 @@ func (s *WSReceive) Redis(client *model.WSClient, reqMsg model.WSRequest) { // 必传requestId确认消息 if reqMsg.RequestID == "" { msg := "message requestId is required" - logger.Infof("ws Shell UID %s err: %s", client.BindUid, msg) - msgByte, _ := json.Marshal(result.ErrMsg(msg)) + logger.Infof("ws Shell UID %d err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(resp.ErrMsg(msg)) client.MsgChan <- msgByte return } @@ -309,7 +309,7 @@ func (s *WSReceive) Redis(client *model.WSClient, reqMsg model.WSRequest) { dataStr = fmt.Sprintf("%s \r\n", output) } } - resByte, _ = json.Marshal(result.Ok(map[string]any{ + resByte, _ = json.Marshal(resp.Ok(map[string]any{ "requestId": reqMsg.RequestID, "data": dataStr, })) @@ -318,8 +318,8 @@ func (s *WSReceive) Redis(client *model.WSClient, reqMsg model.WSRequest) { } if err != nil { - logger.Warnf("ws Shell UID %s err: %s", client.BindUid, err.Error()) - msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + logger.Warnf("ws Shell UID %d err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(resp.ErrMsg(err.Error())) client.MsgChan <- msgByte if err == io.EOF { // 等待1s后关闭连接 diff --git a/src/modules/ws/service/ws_send.go b/src/modules/ws/service/ws_send.go index eba535b4..fda2979c 100644 --- a/src/modules/ws/service/ws_send.go +++ b/src/modules/ws/service/ws_send.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" - "be.ems/src/framework/vo/result" + "be.ems/src/framework/resp" "be.ems/src/modules/ws/model" ) @@ -34,6 +34,10 @@ const ( GROUP_AMF_UE = "1010" // 组号-MME_UE会话事件 1011_neId GROUP_MME_UE = "1011" + // 组号-告警 2000_neType_neId + GROUP_ALARM = "2000" + // 组号-告警事件 2000_neType_neId + GROUP_ALARM_EVENT = "2002" ) // 实例化服务层 WSSend 结构体 @@ -49,7 +53,7 @@ func (s *WSSend) ByClientID(clientID string, data any) error { return fmt.Errorf("no fount client ID: %s", clientID) } - dataByte, err := json.Marshal(result.OkData(data)) + dataByte, err := json.Marshal(resp.OkData(data)) if err != nil { return err }