diff --git a/src/modules/practical_training/controller/pt_ne_config_apply.go b/src/modules/practical_training/controller/pt_ne_config_apply.go index 42b155ff..d346a9d7 100644 --- a/src/modules/practical_training/controller/pt_ne_config_apply.go +++ b/src/modules/practical_training/controller/pt_ne_config_apply.go @@ -6,6 +6,7 @@ import ( "be.ems/src/framework/i18n" "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/parse" "be.ems/src/framework/vo/result" "be.ems/src/modules/practical_training/model" "be.ems/src/modules/practical_training/service" @@ -23,10 +24,8 @@ var NewPtNeConfigApply = &PtNeConfigApplyController{ // // PATH /neConfigApply type PtNeConfigApplyController struct { - // 实训教学_网元参数配置应用申请服务 - ptNeConfigApplyService service.IPtNeConfigApplyService - // 实训教学_网元参数配置服务 - ptNeConfigDataService service.IPtNeConfigDataService + ptNeConfigApplyService *service.PtNeConfigApplyService // 实训教学_网元参数配置应用申请服务 + ptNeConfigDataService *service.PtNeConfigDataService // 实训教学_网元参数配置服务 } // 班级学生列表 (仅教师操作) @@ -44,9 +43,8 @@ func (s *PtNeConfigApplyController) Students(c *gin.Context) { // GET /list func (s *PtNeConfigApplyController) List(c *gin.Context) { querys := ctx.QueryMap(c) - data := s.ptNeConfigApplyService.SelectPage(querys) - - c.JSON(200, result.Ok(data)) + total, rows := s.ptNeConfigApplyService.SelectPage(querys) + c.JSON(200, result.Ok(map[string]any{"total": total, "rows": rows})) } // 网元参数配置应用申请提交(仅学生操作) @@ -109,7 +107,7 @@ func (s *PtNeConfigApplyController) Add(c *gin.Context) { func (s *PtNeConfigApplyController) Edit(c *gin.Context) { language := ctx.AcceptLanguage(c) var body struct { - ApplyId string `json:"applyId"` // 申请ID + ApplyId int64 `json:"applyId"` // 申请ID NeType string `json:"neType"` // 网元类型 Status string `json:"status" binding:"required,oneof=2 3"` // 状态 2应用 3退回 BackInfo string `json:"backInfo"` // 退回信息 @@ -123,7 +121,7 @@ func (s *PtNeConfigApplyController) Edit(c *gin.Context) { currentUserName := ctx.LoginUserToUserName(c) // 指定有申请的学生直接应用 (管理/教师自身操作) - if body.ApplyId == "" && body.NeType != "" && body.Student != "" { + if body.ApplyId <= 0 && body.NeType != "" && body.Student != "" { applyInfos := s.ptNeConfigApplyService.SelectList(model.PtNeConfigApply{CreateBy: body.Student, NeType: body.NeType, Status: "0"}) if len(applyInfos) == 0 { // 未找到申请信息 @@ -163,7 +161,7 @@ func (s *PtNeConfigApplyController) Edit(c *gin.Context) { } // 不指定申请直接应用 (管理/教师自身操作) - if body.ApplyId == "" && body.NeType != "" && body.Status == "2" { + if body.ApplyId <= 0 && body.NeType != "" && body.Status == "2" { if body.Student != "" { currentUserName = body.Student } @@ -176,12 +174,12 @@ func (s *PtNeConfigApplyController) Edit(c *gin.Context) { } // 不指定申请直接应用而是批量退回 - if body.ApplyId == "" && body.BackId != "" && body.Status == "3" { + if body.ApplyId <= 0 && body.BackId != "" && body.Status == "3" { ids := strings.Split(body.BackId, ",") num := 0 for _, id := range ids { - applyInfo := s.ptNeConfigApplyService.SelectById(id) - if applyInfo.ID == "" || applyInfo.Status != "0" { + applyInfo := s.ptNeConfigApplyService.SelectById(parse.Number(id)) + if applyInfo.ID <= 0 || applyInfo.Status != "0" { continue } applyInfo.UpdateBy = currentUserName diff --git a/src/modules/practical_training/controller/pt_ne_config_data.go b/src/modules/practical_training/controller/pt_ne_config_data.go index 11f0ecb1..7f1af370 100644 --- a/src/modules/practical_training/controller/pt_ne_config_data.go +++ b/src/modules/practical_training/controller/pt_ne_config_data.go @@ -18,18 +18,16 @@ import ( // NewPtNeConfigData 实例化控制层 var NewPtNeConfigData = &PtNeConfigDataController{ - ptNeConfigDataService: service.NewPtNeConfigDataService, - ptNeConfigDataLogService: service.NewPtNeConfigDataLogService, + ptNeConfigDataService: *service.NewPtNeConfigDataService, + ptNeConfigDataLogService: *service.NewPtNeConfigDataLogService, } // 网元参数配置服务 // // PATH /neConfigData type PtNeConfigDataController struct { - // 实训教学_网元参数配置服务 - ptNeConfigDataService service.IPtNeConfigDataService - // 实训教学_网元参数配置数据变更日志服务 - ptNeConfigDataLogService service.IPtNeConfigDataLogService + ptNeConfigDataService service.PtNeConfigDataService // 实训教学_网元参数配置服务 + ptNeConfigDataLogService service.PtNeConfigDataLogService // 实训教学_网元参数配置数据变更日志服务 } // 保存为示例配置 (仅管理员操作) @@ -252,7 +250,7 @@ func (s *PtNeConfigDataController) Edit(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 { + if err := c.ShouldBindBodyWithJSON(&body); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } diff --git a/src/modules/practical_training/controller/pt_ne_config_data_log.go b/src/modules/practical_training/controller/pt_ne_config_data_log.go index f9039823..fd6c7137 100644 --- a/src/modules/practical_training/controller/pt_ne_config_data_log.go +++ b/src/modules/practical_training/controller/pt_ne_config_data_log.go @@ -23,10 +23,8 @@ var NewPtNeConfigDataLog = &PtNeConfigDataLog{ // // PATH /neConfigDataLog type PtNeConfigDataLog struct { - // 实训教学_网元参数配置服务 - ptNeConfigDataService service.IPtNeConfigDataService - // 实训教学_网元参数配置数据变更日志服务 - ptNeConfigDataLogService service.IPtNeConfigDataLogService + ptNeConfigDataService *service.PtNeConfigDataService // 实训教学_网元参数配置服务 + ptNeConfigDataLogService *service.PtNeConfigDataLogService // 实训教学_网元参数配置数据变更日志服务 } // 网元参数配置数据变更日志列表 @@ -56,9 +54,8 @@ func (s *PtNeConfigDataLog) Info(c *gin.Context) { } query["stubType"] = stubType query["createBy"] = currentUserName - data := s.ptNeConfigDataLogService.SelectPage(query) - - c.JSON(200, result.Ok(data)) + total, rows := s.ptNeConfigDataLogService.SelectPage(query) + c.JSON(200, result.Ok(map[string]any{"total": total, "rows": rows})) } // 网元参数配置数据变更日志还原到数据 @@ -67,7 +64,7 @@ func (s *PtNeConfigDataLog) Info(c *gin.Context) { func (s *PtNeConfigDataLog) Restore(c *gin.Context) { language := ctx.AcceptLanguage(c) var body struct { - ID string `json:"id" binding:"required"` // 变更日志ID + ID int64 `json:"id" binding:"required"` // 变更日志ID Value string `json:"value" binding:"required,oneof=old new"` // 还原属性 old旧信息 new新信息 } if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { @@ -134,11 +131,19 @@ func (s *PtNeConfigDataLog) Remove(c *gin.Context) { // 处理字符转id数组后去重 idsArr := strings.Split(id, ",") uniqueIDs := parse.RemoveDuplicates(idsArr) - if len(uniqueIDs) <= 0 { + ids := []int64{} + for _, v := range uniqueIDs { + id := parse.Number(v) + if id <= 0 { + continue + } + ids = append(ids, parse.Number(v)) + } + if len(ids) <= 0 { c.JSON(200, result.Err(nil)) return } - rows, err := s.ptNeConfigDataLogService.DeleteByIds(uniqueIDs) + rows, err := s.ptNeConfigDataLogService.DeleteByIds(ids) if err != nil { c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) return diff --git a/src/modules/practical_training/controller/pt_sys_user.go b/src/modules/practical_training/controller/pt_sys_user.go new file mode 100644 index 00000000..7e5ce306 --- /dev/null +++ b/src/modules/practical_training/controller/pt_sys_user.go @@ -0,0 +1,249 @@ +package controller + +import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/i18n" + "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/system/model" + "be.ems/src/modules/system/service" + + "github.com/gin-gonic/gin" +) + +// 实例化控制层 SysUserController 结构体 +var NewSysUser = &PtSysUserController{ + sysUserService: service.NewSysUserImpl, + sysDictDataService: service.NewSysDictData, + sysConfigService: service.NewSysConfigImpl, +} + +// 用户信息 +// +// PATH /pt/system/user +type PtSysUserController struct { + sysUserService service.ISysUser // 用户服务 + sysDictDataService *service.SysDictData // 字典数据服务 + sysConfigService service.ISysConfig // 参数配置服务 +} + +// 用户信息列表导入模板下载 +// +// GET /importTemplate +func (s *PtSysUserController) Template(c *gin.Context) { + // 多语言处理 + language := ctx.AcceptLanguage(c) + // 登录用户 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + // 根据角色指定导入模板 + fileKey := "user" + roles := loginUser.User.Roles + if len(roles) == 1 && roles[0].RoleKey == "teacher" { + fileKey = "student" + } + + fileName := fmt.Sprintf("%s_import_template_%d.xlsx", fileKey, time.Now().UnixMilli()) + asserPath := fmt.Sprintf("assets/template/excel/%s_import_template_%s.xlsx", fileKey, language) + + // 从 embed.FS 中读取默认配置文件内容 + assetsDir := config.GetAssetsDirFS() + // 读取内嵌文件 + fileData, err := assetsDir.ReadFile(asserPath) + if err != nil { + c.String(500, "Failed to read file") + return + } + + // 设置响应头 + c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName)) + c.Header("Content-Type", "application/octet-stream") + + // 返回响应体 + c.Data(200, "application/octet-stream", fileData) +} + +// 用户信息列表导入 +// +// POST /importData +func (s *PtSysUserController) ImportData(c *gin.Context) { + language := ctx.AcceptLanguage(c) + // 登录用户 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + // 允许进行更新 + 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())) + return + } + + // 读取表格数据 + rows, err := file.ReadSheet(filePath, "") + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + + // 根据角色指定导入模板 + roleKey := "" + roles := loginUser.User.Roles + if len(roles) == 1 && roles[0].RoleKey == "teacher" { + roleKey = "student" + } + // 获取操作人名称 + operName := ctx.LoginUserToUserName(c) + isUpdateSupport := parse.Boolean(updateSupport) + + // 读取默认初始密码 + initPassword := s.sysConfigService.SelectConfigValueByKey("sys.user.initPassword") + // 读取用户性别字典数据 + dictSysUserSex := s.sysDictDataService.SelectDictDataByType("sys_user_sex") + + // 导入记录 + successNum := 0 + failureNum := 0 + successMsgArr := []string{} + failureMsgArr := []string{} + mustItemArr := []string{"B", "C"} + for _, row := range rows { + // 检查必填列 + ownItem := true + for _, item := range mustItemArr { + if v, ok := row[item]; !ok || v == "" { + ownItem = false + break + } + } + if !ownItem { + mustItemArrStr := strings.Join(mustItemArr, "、") + failureNum++ + // 表格中必填列表项, + msg := i18n.TTemplate(language, "user.import.mustItem", map[string]any{"text": mustItemArrStr}) + failureMsgArr = append(failureMsgArr, msg) + continue + } + + // 用户性别转值 + sysUserSex := "0" + for _, v := range dictSysUserSex { + label := i18n.TKey(language, v.DictLabel) + if row["D"] == label { + sysUserSex = v.DictValue + break + } + } + // 用户状态 + sysUserStatus := common.STATUS_NO + if row["E"] == "正常" || row["G"] == "Normal" { + sysUserStatus = common.STATUS_YES + } + + sysUserRole := "" // 用户角色 + sysUserPost := "" // 用户岗位 + sysUserDept := "101" // 用户部门 101未指定 + if roleKey == "student" { + sysUserRole = "4" + sysUserPost = "3" + sysUserDept = loginUser.DeptID + } + if v, ok := row["F"]; ok && v != "" { + if v == "学生" || v == "Student" { + sysUserRole = "4" + sysUserPost = "3" + } else if v == "教师" || v == "Teacher" { + sysUserRole = "3" + sysUserPost = "2" + } + } + if v, ok := row["G"]; ok && v != "" && v != "100" { + sysUserDept = v + } + + // 构建用户实体信息 + newSysUser := model.SysUser{ + UserType: "sys", + Password: initPassword, + DeptID: sysUserDept, + UserName: row["B"], + NickName: row["C"], + Status: sysUserStatus, + Sex: sysUserSex, + RoleIDs: []string{sysUserRole}, + PostIDs: []string{sysUserPost}, + } + + // 验证是否存在这个用户 + 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}) + successNum++ + successMsgArr = append(successMsgArr, msg) + } else { + // 用户编号:%s 登录名称 %s 导入失败 + msg := i18n.TTemplate(language, "user.import.fail", map[string]any{"id": row["A"], "name": newSysUser.UserName}) + failureNum++ + failureMsgArr = append(failureMsgArr, msg) + } + continue + } + + // 如果用户已存在 同时 是否更新支持 + if userInfo.UserName == newSysUser.UserName && isUpdateSupport { + newSysUser.UserID = userInfo.UserID + newSysUser.UpdateBy = operName + rows := s.sysUserService.UpdateUser(newSysUser) + if rows > 0 { + // 用户编号:%s 登录名称 %s 更新成功 + msg := i18n.TTemplate(language, "user.import.successUpdate", map[string]any{"id": row["A"], "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}) + failureNum++ + failureMsgArr = append(failureMsgArr, msg) + } + continue + } + } + + message := "" + if failureNum > 0 { + // 很抱歉,导入失败!共 %d 条数据格式不正确,错误如下: + msg := i18n.TTemplate(language, "user.import.failTip", map[string]any{"num": failureNum}) + message = strings.Join(append([]string{msg}, failureMsgArr...), "
") + } else { + // 恭喜您,数据已全部导入成功!共 %d 条,数据如下: + 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)) +} diff --git a/src/modules/practical_training/model/pt_ne_config_apply.go b/src/modules/practical_training/model/pt_ne_config_apply.go index 4c9ee885..ffef01ec 100644 --- a/src/modules/practical_training/model/pt_ne_config_apply.go +++ b/src/modules/practical_training/model/pt_ne_config_apply.go @@ -2,14 +2,14 @@ package model // PtNeConfigApply 实训教学_网元参数配置应用下发申请 type PtNeConfigApply struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // ID - 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"` // 更新时间 - NeType string `json:"neType" gorm:"ne_type"` // 网元类型 - Status string `json:"status" gorm:"status"` // 应用状态 0申请 1撤回 2应用 3退回 - BackInfo string `json:"backInfo" gorm:"back_info"` // 退回信息 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // ID + 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"` // 更新时间 + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + Status string `json:"status" gorm:"column:status"` // 应用状态 0申请 1撤回 2应用 3退回 + BackInfo string `json:"backInfo" gorm:"column:back_info"` // 退回信息 } // TableName 表名称 diff --git a/src/modules/practical_training/model/pt_ne_config_data.go b/src/modules/practical_training/model/pt_ne_config_data.go index 3a52d0be..0bf8c1c2 100644 --- a/src/modules/practical_training/model/pt_ne_config_data.go +++ b/src/modules/practical_training/model/pt_ne_config_data.go @@ -2,19 +2,19 @@ package model // PtNeConfigData 实训教学_网元参数配置数据信息 type PtNeConfigData struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // ID - 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"` // 备注 - StubType string `json:"stubType" gorm:"stub_type"` // 存根数据类型 0系统 1班级 2个人 - NeType string `json:"neType" gorm:"ne_type"` // 网元类型 - ParamName string `json:"paramName" gorm:"param_name"` // 参数名 - ParamDisplay string `json:"paramDisplay" gorm:"param_display"` // 参数显示名 - ParamType string `json:"paramType" gorm:"param_type"` // 参数类型 list列表单层 array数组多层 - ParamJson string `json:"paramJson" gorm:"param_json"` // 参数数据 - DeptId string `json:"deptId" gorm:"dept_id"` // 部门班级ID 100系统 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 默认ID + 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"` // 备注 + StubType string `json:"stubType" gorm:"column:stub_type"` // 存根数据类型 0系统 1班级 2个人 + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + ParamName string `json:"paramName" gorm:"column:param_name"` // 参数名 + ParamDisplay string `json:"paramDisplay" gorm:"column:param_display"` // 参数显示名 + ParamType string `json:"paramType" gorm:"column:param_type"` // 参数类型 list列表单层 array数组多层 + ParamJson string `json:"paramJson" gorm:"column:param_json"` // 参数数据 + DeptId string `json:"deptId" gorm:"column:dept_id"` // 部门班级ID 100系统 // ====== 非数据库字段属性 ====== diff --git a/src/modules/practical_training/model/pt_ne_config_data_log.go b/src/modules/practical_training/model/pt_ne_config_data_log.go index 6ec92154..96f3101b 100644 --- a/src/modules/practical_training/model/pt_ne_config_data_log.go +++ b/src/modules/practical_training/model/pt_ne_config_data_log.go @@ -2,17 +2,17 @@ package model // PtNeConfigDataLog 实训教学_网元参数配置数据变更日志 type PtNeConfigDataLog struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // ID - CreateBy string `json:"createBy" gorm:"create_by"` // 创建者 - CreateTime int64 `json:"createTime" gorm:"create_time"` // 创建时间 - StubType string `json:"stubType" gorm:"stub_type"` // 存根数据类型 0系统 1班级 2个人 - NeType string `json:"neType" gorm:"ne_type"` // 网元类型 - ParamName string `json:"paramName" gorm:"param_name"` // 参数名 - ParamDisplay string `json:"paramDisplay" gorm:"param_display"` // 参数显示名 - ParamType string `json:"paramType" gorm:"param_type"` // 参数类型 list列表单层 array数组多层 - ParamJsonOld string `json:"paramJsonOld" gorm:"param_json_old"` // 原始内容 - ParamJsonNew string `json:"paramJsonNew" gorm:"param_json_new"` // 当前内容 - OperaType int64 `json:"operaType" gorm:"opera_type"` // 操作类型 0其他 1新增 2更新 3删除 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // ID + CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + StubType string `json:"stubType" gorm:"column:stub_type"` // 存根数据类型 0系统 1班级 2个人 + NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + ParamName string `json:"paramName" gorm:"column:param_name"` // 参数名 + ParamDisplay string `json:"paramDisplay" gorm:"column:param_display"` // 参数显示名 + ParamType string `json:"paramType" gorm:"column:param_type"` // 参数类型 list列表单层 array数组多层 + ParamJsonOld string `json:"paramJsonOld" gorm:"column:param_json_old"` // 原始内容 + ParamJsonNew string `json:"paramJsonNew" gorm:"column:param_json_new"` // 当前内容 + OperaType int64 `json:"operaType" gorm:"column:opera_type"` // 操作类型 0其他 1新增 2更新 3删除 } // TableName 表名称 diff --git a/src/modules/practical_training/practical_training.go b/src/modules/practical_training/practical_training.go index 8ed40b05..0674caa2 100644 --- a/src/modules/practical_training/practical_training.go +++ b/src/modules/practical_training/practical_training.go @@ -13,10 +13,8 @@ import ( func Setup(router *gin.Engine) { logger.Infof("开始加载 ====> practical_training 模块路由") - ptGroup := router.Group("/pt") - // 网元参数配置 - neConfigDataGroup := ptGroup.Group("/neConfigData") + neConfigDataGroup := router.Group("/pt/neConfigData") { neConfigDataGroup.POST("/saveAsDefault", middleware.PreAuthorize(map[string][]string{"hasRoles": {"admin"}}), @@ -59,7 +57,7 @@ func Setup(router *gin.Engine) { } // 网元参数配置数据变更日志 - neConfigDataLogGroup := ptGroup.Group("/neConfigDataLog") + neConfigDataLogGroup := router.Group("/pt/neConfigDataLog") { neConfigDataLogGroup.GET("", middleware.PreAuthorize(nil), @@ -78,7 +76,7 @@ func Setup(router *gin.Engine) { } // 网元参数配置应用申请 - neConfigApplyGroup := ptGroup.Group("/neConfigApply") + neConfigApplyGroup := router.Group("/pt/neConfigApply") { neConfigApplyGroup.GET("/students", middleware.PreAuthorize(map[string][]string{"hasRoles": {"teacher"}}), @@ -99,4 +97,17 @@ func Setup(router *gin.Engine) { controller.NewPtNeConfigApply.Edit, ) } + + // 教学用户 + systemUserGroup := router.Group("/pt/system/user") + { + systemUserGroup.GET("/importTemplate", + middleware.PreAuthorize(nil), + controller.NewSysUser.Template, + ) + systemUserGroup.POST("/importData", + middleware.PreAuthorize(nil), + controller.NewSysUser.ImportData, + ) + } } diff --git a/src/modules/practical_training/repository/pt_ne_config_apply.go b/src/modules/practical_training/repository/pt_ne_config_apply.go index 88d42def..ab3ca57b 100644 --- a/src/modules/practical_training/repository/pt_ne_config_apply.go +++ b/src/modules/practical_training/repository/pt_ne_config_apply.go @@ -1,27 +1,170 @@ package repository -import "be.ems/src/modules/practical_training/model" +import ( + "strings" + "time" -// IPtNeConfigApplyRepository 数据层接口 -type IPtNeConfigApplyRepository interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/practical_training/model" +) - // SelectList 根据实体查询 - SelectList(param model.PtNeConfigApply) []model.PtNeConfigApply +// NewPtNeConfigApplyRepository 实例化数据层 +var NewPtNeConfigApplyRepository = &PtNeConfigApplyRepository{} - // SelectByIds 通过ID查询 - SelectByIds(paramIds []string) []model.PtNeConfigApply +// PtNeConfigApplyRepository 数据层处理 +type PtNeConfigApplyRepository struct{} - // Insert 新增信息 - Insert(param model.PtNeConfigApply) string +// SelectPage 根据条件分页查询字典类型 +func (r *PtNeConfigApplyRepository) SelectPage(query map[string]any) (int64, []model.PtNeConfigApply) { + tx := datasource.DB("").Model(&model.PtNeConfigApply{}) + // 查询条件拼接 + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("neType = ?", v) + } + if v, ok := query["status"]; ok && v != "" { + tx = tx.Where("status = ?", v) + } - // Update 修改信息 - Update(param model.PtNeConfigApply) int64 + var total int64 = 0 + rows := []model.PtNeConfigApply{} - // DeleteByIds 批量删除信息 - DeleteByIds(paramIds []string) int64 + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + logger.Errorf("total err => %v", err) + return total, rows + } - // SelectListByClass 查询班级学生信息 - SelectListByClass(deptId, userName string) []map[string]any + // 分页 + pageNum, pageSize := repo.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 != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } else { + tx = tx.Order("id desc") + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return total, rows +} + +// SelectList 根据实体查询 +func (r *PtNeConfigApplyRepository) SelectList(param model.PtNeConfigApply) []model.PtNeConfigApply { + tx := datasource.DB("").Model(&model.PtNeConfigApply{}) + // 查询条件拼接 + if param.CreateBy != "" { + tx = tx.Where("create_by = ?", param.CreateBy) + } + if param.Status != "" { + tx = tx.Where("status = ?", param.Status) + } + if param.NeType != "" { + tx = tx.Where("ne_type = ?", param.NeType) + } + + // 查询数据 + arr := []model.PtNeConfigApply{} + if err := tx.Order("id asc").Find(&arr).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return arr +} + +// SelectByIds 通过ID查询 +func (r *PtNeConfigApplyRepository) SelectByIds(paramIds []int64) []model.PtNeConfigApply { + tx := datasource.DB("").Model(&model.PtNeConfigApply{}) + arr := []model.PtNeConfigApply{} + // 查询条件拼接 + tx = tx.Where("id in ?", paramIds) + // 查询数据 + if err := tx.Order("imsi asc").Find(&arr).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return arr +} + +// Insert 新增信息 +func (r *PtNeConfigApplyRepository) Insert(param model.PtNeConfigApply) int64 { + if param.CreateBy != "" { + param.CreateTime = time.Now().UnixMilli() + } + + if err := datasource.DB("").Create(¶m).Error; err != nil { + logger.Errorf("Create err => %v", err) + } + return param.ID +} + +// Update 修改信息 +func (r *PtNeConfigApplyRepository) Update(param model.PtNeConfigApply) int64 { + if param.ID <= 0 { + return 0 + } + if param.UpdateBy != "" { + param.UpdateTime = time.Now().UnixMilli() + } + + tx := datasource.DB("").Updates(¶m) + if err := tx.Error; err != nil { + logger.Errorf("Create err => %v", err) + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 +func (r *PtNeConfigApplyRepository) DeleteByIds(paramIds []int64) int64 { + tx := datasource.DefaultDB().Where("id in ?", paramIds).Delete(&model.PtNeConfigApply{}) + if err := tx.Error; err != nil { + logger.Errorf("Delete err => %v", err) + } + return tx.RowsAffected +} + +// SelectListByClass 查询班级学生信息 +func (r *PtNeConfigApplyRepository) SelectListByClass(deptId, userName string) []map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if deptId != "" { + conditions = append(conditions, "d.dept_id = ?") + params = append(params, deptId) + } + if userName != "" { + conditions = append(conditions, "u.user_name like concat('%',?,'%')") + params = append(params, userName) + } + // 构建查询条件语句 + whereSql := " where u.del_flag = '0' AND u.user_id != '1' AND ur.role_id = '4' " + if len(conditions) > 0 { + whereSql += " and " + strings.Join(conditions, " and ") + } + // 查询数据 + querySql := `SELECT + u.user_Id as userId, u.user_name as userName, u.nick_name as nickName, u.login_ip as loginIp, u.login_date AS loginDate, + COALESCE(pnca.id, '') as applyId, COALESCE(pnca.status, '') as applyStatus + 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 pt_ne_config_apply pnca ON pnca.create_by = u.user_name AND pnca.status = '0' + ` + whereSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + return results } diff --git a/src/modules/practical_training/repository/pt_ne_config_apply.impl.go b/src/modules/practical_training/repository/pt_ne_config_apply.impl.go deleted file mode 100644 index a4898664..00000000 --- a/src/modules/practical_training/repository/pt_ne_config_apply.impl.go +++ /dev/null @@ -1,275 +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/practical_training/model" -) - -// NewPtNeConfigApplyRepository 实例化数据层 -var NewPtNeConfigApplyRepository = &PtNeConfigApplyRepository{ - selectSql: `select - id, create_by, create_time, update_by, update_time, back_info, - status, ne_type - from pt_ne_config_apply`, - - resultMap: map[string]string{ - "id": "ID", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - "ne_type": "NeType", - "status": "Status", - "back_info": "BackInfo", - }, -} - -// PtNeConfigApplyRepository 数据层处理 -type PtNeConfigApplyRepository struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *PtNeConfigApplyRepository) convertResultRows(rows []map[string]any) []model.PtNeConfigApply { - arr := make([]model.PtNeConfigApply, 0) - for _, row := range rows { - item := model.PtNeConfigApply{} - 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 *PtNeConfigApplyRepository) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["status"]; ok && v != "" { - conditions = append(conditions, "status = ?") - params = append(params, v) - } - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": int64(0), - "rows": []model.PtNeConfigApply{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from pt_ne_config_apply" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - if total := parse.Number(totalRows[0]["total"]); total > 0 { - result["total"] = total - } else { - return result - } - - // 分页 - 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 -} - -// SelectList 根据实体查询 -func (r *PtNeConfigApplyRepository) SelectList(param model.PtNeConfigApply) []model.PtNeConfigApply { - // 查询条件拼接 - var conditions []string - var params []any - if param.CreateBy != "" { - conditions = append(conditions, "create_by = ?") - params = append(params, param.CreateBy) - } - if param.Status != "" { - conditions = append(conditions, "status = ?") - params = append(params, param.Status) - } - if param.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, param.NeType) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - 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 *PtNeConfigApplyRepository) SelectByIds(paramIds []string) []model.PtNeConfigApply { - placeholder := repo.KeyPlaceholderByQuery(len(paramIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(paramIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.PtNeConfigApply{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *PtNeConfigApplyRepository) Insert(param model.PtNeConfigApply) string { - // 参数拼接 - params := make(map[string]any) - if param.CreateBy != "" { - params["create_by"] = param.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - params["back_info"] = param.BackInfo - if param.Status != "" { - params["status"] = param.Status - } - if param.NeType != "" { - params["ne_type"] = param.NeType - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into pt_ne_config_apply (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - tx := datasource.DefaultDB().Begin() // 开启事务 - // 执行插入 - if err := tx.Exec(sql, values...).Error; err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - if err := tx.Raw("select last_insert_id()").Row().Scan(&insertedID); err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - tx.Commit() // 提交事务 - return insertedID -} - -// Update 修改信息 -func (r *PtNeConfigApplyRepository) Update(param model.PtNeConfigApply) int64 { - // 参数拼接 - params := make(map[string]any) - if param.UpdateBy != "" { - params["update_by"] = param.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - params["back_info"] = param.BackInfo - if param.Status != "" { - params["status"] = param.Status - } - if param.NeType != "" { - params["ne_type"] = param.NeType - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update pt_ne_config_apply set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, param.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *PtNeConfigApplyRepository) DeleteByIds(paramIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(paramIds)) - sql := "delete from pt_ne_config_apply where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(paramIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} - -// SelectListByClass 查询班级学生信息 -func (r *PtNeConfigApplyRepository) SelectListByClass(deptId, userName string) []map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if deptId != "" { - conditions = append(conditions, "d.dept_id = ?") - params = append(params, deptId) - } - if userName != "" { - conditions = append(conditions, "u.user_name like concat('%',?,'%')") - params = append(params, userName) - } - // 构建查询条件语句 - whereSql := " where u.del_flag = '0' AND u.user_id != '1' AND ur.role_id = '4' " - if len(conditions) > 0 { - whereSql += " and " + strings.Join(conditions, " and ") - } - // 查询数据 - querySql := `SELECT - u.user_Id as userId, u.user_name as userName, u.nick_name as nickName, u.login_ip as loginIp, u.login_date AS loginDate, - COALESCE(pnca.id, '') as applyId, COALESCE(pnca.status, '') as applyStatus - 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 pt_ne_config_apply pnca ON pnca.create_by = u.user_name AND pnca.status = '0' - ` + whereSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results -} diff --git a/src/modules/practical_training/repository/pt_ne_config_data.go b/src/modules/practical_training/repository/pt_ne_config_data.go index 7b48856c..7769d7be 100644 --- a/src/modules/practical_training/repository/pt_ne_config_data.go +++ b/src/modules/practical_training/repository/pt_ne_config_data.go @@ -1,24 +1,152 @@ package repository -import "be.ems/src/modules/practical_training/model" +import ( + "time" -// IPtNeConfigDataRepository 数据层接口 -type IPtNeConfigDataRepository interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/practical_training/model" +) - // SelectList 根据实体查询 - SelectList(param model.PtNeConfigData) []model.PtNeConfigData +// NewPtNeConfigDataRepository 实例化数据层 +var NewPtNeConfigDataRepository = &PtNeConfigDataRepository{} - // SelectByIds 通过ID查询 - SelectByIds(paramIds []string) []model.PtNeConfigData +// PtNeConfigDataRepository 数据层处理 +type PtNeConfigDataRepository struct{} - // Insert 新增信息 - Insert(param model.PtNeConfigData) string +// SelectPage 根据条件分页查询字典类型 +func (r *PtNeConfigDataRepository) SelectPage(query map[string]any) (int64, []model.PtNeConfigData) { + tx := datasource.DB("").Model(&model.PtNeConfigData{}) + // 查询条件拼接 + if v, ok := query["createBy"]; ok && v != "" { + tx = tx.Where("create_by = ?", v) + } + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("ne_type = ?", v) + } + if v, ok := query["stubType"]; ok && v != "" { + tx = tx.Where("stub_type = ?", v) + } + if v, ok := query["paramName"]; ok && v != "" { + tx = tx.Where("param_name = ?", v) + } + if v, ok := query["paramType"]; ok && v != "" { + tx = tx.Where("param_type = ?", v) + } - // Update 修改信息 - Update(param model.PtNeConfigData) int64 + var total int64 = 0 + rows := []model.PtNeConfigData{} - // DeleteByIds 批量删除信息 - DeleteByIds(paramIds []string) int64 + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + logger.Errorf("total err => %v", err) + return total, rows + } + + // 分页 + pageNum, pageSize := repo.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 != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } else { + tx = tx.Order("id desc") + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return total, rows +} + +// SelectList 根据实体查询 +func (r *PtNeConfigDataRepository) SelectList(param model.PtNeConfigData) []model.PtNeConfigData { + tx := datasource.DB("").Model(&model.PtNeConfigData{}) + // 查询条件拼接 + if param.CreateBy != "" { + tx = tx.Where("create_by = ?", param.CreateBy) + } + if param.StubType != "" { + tx = tx.Where("stub_type = ?", param.StubType) + } + if param.NeType != "" { + tx = tx.Where("ne_type = ?", param.NeType) + } + if param.ParamName != "" { + tx = tx.Where("param_name = ?", param.ParamName) + } + if param.ParamType != "" { + tx = tx.Where("param_type = ?", param.ParamType) + } + if param.DeptId != "" { + tx = tx.Where("dept_id = ?", param.DeptId) + } + + // 查询数据 + arr := []model.PtNeConfigData{} + if err := tx.Order("update_time asc").Find(&arr).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return arr +} + +// SelectByIds 通过ID查询 +func (r *PtNeConfigDataRepository) SelectByIds(paramIds []string) []model.PtNeConfigData { + tx := datasource.DB("").Model(&model.PtNeConfigData{}) + arr := []model.PtNeConfigData{} + // 查询条件拼接 + tx = tx.Where("id in ?", paramIds) + // 查询数据 + if err := tx.Find(&arr).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return arr +} + +// Insert 新增信息 +func (r *PtNeConfigDataRepository) Insert(param model.PtNeConfigData) int64 { + if param.CreateBy != "" { + param.CreateTime = time.Now().UnixMilli() + } + + if err := datasource.DB("").Create(¶m).Error; err != nil { + logger.Errorf("Create err => %v", err) + } + return param.ID +} + +// Update 修改信息 +func (r *PtNeConfigDataRepository) Update(param model.PtNeConfigData) int64 { + if param.ID <= 0 { + return 0 + } + if param.UpdateBy != "" { + param.UpdateTime = time.Now().UnixMilli() + } + tx := datasource.DB("").Updates(¶m) + if err := tx.Error; err != nil { + logger.Errorf("Create err => %v", err) + } + return tx.RowsAffected +} + +// DeleteByIds 批量删除信息 +func (r *PtNeConfigDataRepository) DeleteByIds(paramIds []string) int64 { + tx := datasource.DefaultDB().Where("id in ?", paramIds).Delete(&model.PtNeConfigDataLog{}) + if err := tx.Error; err != nil { + logger.Errorf("Delete err => %v", err) + } + return tx.RowsAffected } diff --git a/src/modules/practical_training/repository/pt_ne_config_data.impl.go b/src/modules/practical_training/repository/pt_ne_config_data.impl.go deleted file mode 100644 index dafe35be..00000000 --- a/src/modules/practical_training/repository/pt_ne_config_data.impl.go +++ /dev/null @@ -1,297 +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/practical_training/model" -) - -// NewPtNeConfigDataRepository 实例化数据层 -var NewPtNeConfigDataRepository = &PtNeConfigDataRepository{ - selectSql: `select - id, create_by, create_time, update_by, update_time, remark, stub_type, ne_type, param_name, param_display, param_type, param_json, dept_id - from pt_ne_config_data`, - - resultMap: map[string]string{ - "id": "ID", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - "remark": "Remark", - "stub_type": "StubType", - "ne_type": "NeType", - "param_name": "ParamName", - "param_display": "ParamDisplay", - "param_type": "ParamType", - "param_json": "ParamJson", - "dept_id": "DeptId", - }, -} - -// PtNeConfigDataRepository 数据层处理 -type PtNeConfigDataRepository struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *PtNeConfigDataRepository) convertResultRows(rows []map[string]any) []model.PtNeConfigData { - arr := make([]model.PtNeConfigData, 0) - for _, row := range rows { - item := model.PtNeConfigData{} - 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 *PtNeConfigDataRepository) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, v) - } - if v, ok := query["paramName"]; ok && v != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, v) - } - if v, ok := query["paramType"]; ok && v != "" { - conditions = append(conditions, "param_type = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.PtNeConfigData{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from pt_ne_config_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 := " 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 *PtNeConfigDataRepository) SelectList(param model.PtNeConfigData) []model.PtNeConfigData { - // 查询条件拼接 - var conditions []string - var params []any - if param.CreateBy != "" { - conditions = append(conditions, "create_by = ?") - params = append(params, param.CreateBy) - } - if param.StubType != "" { - conditions = append(conditions, "stub_type = ?") - params = append(params, param.StubType) - } - if param.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, param.NeType) - } - if param.ParamName != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, param.ParamName) - } - if param.ParamType != "" { - conditions = append(conditions, "param_type = ?") - params = append(params, param.ParamType) - } - if param.DeptId != "" { - conditions = append(conditions, "dept_id = ?") - params = append(params, param.DeptId) - } - - // 构建查询条件语句 - 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) -} - -// SelectByIds 通过ID查询 -func (r *PtNeConfigDataRepository) SelectByIds(paramIds []string) []model.PtNeConfigData { - placeholder := repo.KeyPlaceholderByQuery(len(paramIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(paramIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.PtNeConfigData{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *PtNeConfigDataRepository) Insert(param model.PtNeConfigData) string { - // 参数拼接 - params := make(map[string]any) - if param.CreateBy != "" { - params["create_by"] = param.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - params["remark"] = param.Remark - if param.StubType != "" { - params["stub_type"] = param.StubType - } - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJson != "" { - params["param_json"] = param.ParamJson - } - if param.DeptId != "" { - params["dept_id"] = param.DeptId - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into pt_ne_config_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 -} - -// Update 修改信息 -func (r *PtNeConfigDataRepository) Update(param model.PtNeConfigData) int64 { - // 参数拼接 - params := make(map[string]any) - if param.UpdateBy != "" { - params["update_by"] = param.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - params["remark"] = param.Remark - if param.StubType != "" { - params["stub_type"] = param.StubType - } - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJson != "" { - params["param_json"] = param.ParamJson - } - if param.DeptId != "" { - params["dept_id"] = param.DeptId - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update pt_ne_config_data set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, param.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *PtNeConfigDataRepository) DeleteByIds(paramIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(paramIds)) - sql := "delete from pt_ne_config_data where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(paramIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/practical_training/repository/pt_ne_config_data_log.go b/src/modules/practical_training/repository/pt_ne_config_data_log.go index 77271333..0e2cafc9 100644 --- a/src/modules/practical_training/repository/pt_ne_config_data_log.go +++ b/src/modules/practical_training/repository/pt_ne_config_data_log.go @@ -1,21 +1,143 @@ package repository -import "be.ems/src/modules/practical_training/model" +import ( + "time" -// IPtNeConfigDataLogRepository 数据层接口 -type IPtNeConfigDataLogRepository interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/practical_training/model" +) - // SelectList 根据实体查询 - SelectList(param model.PtNeConfigDataLog) []model.PtNeConfigDataLog +// NewPtNeConfigDataLogRepository 实例化数据层 +var NewPtNeConfigDataLogRepository = &PtNeConfigDataLogRepository{} - // SelectByIds 通过ID查询 - SelectByIds(paramIds []string) []model.PtNeConfigDataLog +// PtNeConfigDataLogRepository 数据层处理 +type PtNeConfigDataLogRepository struct{} - // Insert 新增信息 - Insert(param model.PtNeConfigDataLog) string +// SelectPage 根据条件分页查询字典类型 +func (r *PtNeConfigDataLogRepository) SelectPage(query map[string]any) (int64, []model.PtNeConfigDataLog) { + tx := datasource.DB("").Model(&model.PtNeConfigDataLog{}) + // 查询条件拼接 + if v, ok := query["createBy"]; ok && v != "" { + tx = tx.Where("create_by = ?", v) + } + if v, ok := query["neType"]; ok && v != "" { + tx = tx.Where("ne_type = ?", v) + } + if v, ok := query["stubType"]; ok && v != "" { + tx = tx.Where("stub_type = ?", v) + } + if v, ok := query["paramName"]; ok && v != "" { + tx = tx.Where("param_name = ?", v) + } + if v, ok := query["paramType"]; ok && v != "" { + tx = tx.Where("param_type = ?", v) + } + if v, ok := query["operaType"]; ok && v != "" { + tx = tx.Where("opera_type = ?", v) + } + if v, ok := query["status"]; ok && v != "" { + tx = tx.Where("status = ?", v) + } - // DeleteByIds 批量删除信息 - DeleteByIds(paramIds []string) int64 + var total int64 = 0 + rows := []model.PtNeConfigDataLog{} + + // 查询数量 长度为0直接返回 + if err := tx.Count(&total).Error; err != nil || total <= 0 { + logger.Errorf("total err => %v", err) + return total, rows + } + + // 分页 + pageNum, pageSize := repo.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 != "" { + if o == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + tx = tx.Order(sortSql) + } else { + tx = tx.Order("id desc") + } + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) + } + + return total, rows +} + +// SelectList 根据实体查询 +func (r *PtNeConfigDataLogRepository) SelectList(param model.PtNeConfigDataLog) []model.PtNeConfigDataLog { + tx := datasource.DB("").Model(&model.PtNeConfigDataLog{}) + // 查询条件拼接 + if param.CreateBy != "" { + tx = tx.Where("create_by = ?", param.CreateBy) + } + if param.StubType != "" { + tx = tx.Where("stub_type = ?", param.StubType) + } + if param.NeType != "" { + tx = tx.Where("ne_type = ?", param.NeType) + } + if param.ParamName != "" { + tx = tx.Where("param_name = ?", param.ParamName) + } + if param.ParamType != "" { + tx = tx.Where("param_type = ?", param.ParamType) + } + if param.OperaType > 0 { + tx = tx.Where("opera_type = ?", param.OperaType) + } + + // 查询数据 + arr := []model.PtNeConfigDataLog{} + if err := tx.Order("create_time desc").Find(&arr).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return arr +} + +// SelectByIds 通过ID查询 +func (r *PtNeConfigDataLogRepository) SelectByIds(paramIds []int64) []model.PtNeConfigDataLog { + tx := datasource.DB("").Model(&model.PtNeConfigDataLog{}) + arr := []model.PtNeConfigDataLog{} + // 查询条件拼接 + tx = tx.Where("id in ?", paramIds) + // 查询数据 + if err := tx.Order("imsi asc").Find(&arr).Error; err != nil { + logger.Errorf("query err => %v", err) + } + return arr +} + +// Insert 新增信息 +func (r *PtNeConfigDataLogRepository) Insert(param model.PtNeConfigDataLog) int64 { + if param.CreateBy != "" { + param.CreateTime = time.Now().UnixMilli() + } + + if err := datasource.DB("").Create(¶m).Error; err != nil { + logger.Errorf("Create err => %v", err) + } + return param.ID +} + +// DeleteByIds 批量删除信息 +func (r *PtNeConfigDataLogRepository) DeleteByIds(paramIds []int64) int64 { + tx := datasource.DefaultDB().Where("id in ?", paramIds).Delete(&model.PtNeConfigDataLog{}) + if err := tx.Error; err != nil { + logger.Errorf("Delete err => %v", err) + } + return tx.RowsAffected } diff --git a/src/modules/practical_training/repository/pt_ne_config_data_log.impl.go b/src/modules/practical_training/repository/pt_ne_config_data_log.impl.go deleted file mode 100644 index 00b481d4..00000000 --- a/src/modules/practical_training/repository/pt_ne_config_data_log.impl.go +++ /dev/null @@ -1,262 +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/practical_training/model" -) - -// NewPtNeConfigDataLogRepository 实例化数据层 -var NewPtNeConfigDataLogRepository = &PtNeConfigDataLogRepository{ - selectSql: `select - id, create_by, create_time, stub_type, ne_type, param_name, param_display, param_type, param_json_old, param_json_new, opera_type - from pt_ne_config_data_log`, - - resultMap: map[string]string{ - "id": "ID", - "create_by": "CreateBy", - "create_time": "CreateTime", - "stub_type": "StubType", - "ne_type": "NeType", - "param_name": "ParamName", - "param_display": "ParamDisplay", - "param_type": "ParamType", - "param_json_old": "ParamJsonOld", - "param_json_new": "ParamJsonNew", - "opera_type": "OperaType", - }, -} - -// PtNeConfigDataLogRepository 数据层处理 -type PtNeConfigDataLogRepository struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *PtNeConfigDataLogRepository) convertResultRows(rows []map[string]any) []model.PtNeConfigDataLog { - arr := make([]model.PtNeConfigDataLog, 0) - for _, row := range rows { - item := model.PtNeConfigDataLog{} - 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 *PtNeConfigDataLogRepository) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["createBy"]; ok && v != "" { - conditions = append(conditions, "create_by = ?") - params = append(params, v) - } - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, v) - } - if v, ok := query["stubType"]; ok && v != "" { - conditions = append(conditions, "stub_type = ?") - params = append(params, v) - } - if v, ok := query["paramName"]; ok && v != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, v) - } - if v, ok := query["paramType"]; ok && v != "" { - conditions = append(conditions, "param_type = ?") - params = append(params, v) - } - if v, ok := query["operaType"]; ok && v != "" { - conditions = append(conditions, "opera_type = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.PtNeConfigDataLog{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from pt_ne_config_data_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 create_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 -} - -// SelectList 根据实体查询 -func (r *PtNeConfigDataLogRepository) SelectList(param model.PtNeConfigDataLog) []model.PtNeConfigDataLog { - // 查询条件拼接 - var conditions []string - var params []any - if param.CreateBy != "" { - conditions = append(conditions, "create_by = ?") - params = append(params, param.CreateBy) - } - if param.StubType != "" { - conditions = append(conditions, "stub_type = ?") - params = append(params, param.StubType) - } - if param.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, param.NeType) - } - if param.ParamName != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, param.ParamName) - } - if param.ParamType != "" { - conditions = append(conditions, "param_type = ?") - params = append(params, param.ParamType) - } - if param.OperaType >= 0 { - conditions = append(conditions, "opera_type = ?") - params = append(params, param.OperaType) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by create_time desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *PtNeConfigDataLogRepository) SelectByIds(paramIds []string) []model.PtNeConfigDataLog { - placeholder := repo.KeyPlaceholderByQuery(len(paramIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(paramIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.PtNeConfigDataLog{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *PtNeConfigDataLogRepository) Insert(param model.PtNeConfigDataLog) string { - // 参数拼接 - params := make(map[string]any) - if param.CreateBy != "" { - params["create_by"] = param.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - if param.StubType != "" { - params["stub_type"] = param.StubType - } - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJsonOld != "" { - params["param_json_old"] = param.ParamJsonOld - } - if param.ParamJsonNew != "" { - params["param_json_new"] = param.ParamJsonNew - } - params["opera_type"] = param.OperaType - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into pt_ne_config_data_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 -} - -// DeleteByIds 批量删除信息 -func (r *PtNeConfigDataLogRepository) DeleteByIds(paramIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(paramIds)) - sql := "delete from pt_ne_config_data_log where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(paramIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/practical_training/service/pt_ne_config_apply.go b/src/modules/practical_training/service/pt_ne_config_apply.go index 6c3b30fb..cab6eff7 100644 --- a/src/modules/practical_training/service/pt_ne_config_apply.go +++ b/src/modules/practical_training/service/pt_ne_config_apply.go @@ -1,29 +1,71 @@ package service import ( + "fmt" + "be.ems/src/modules/practical_training/model" + "be.ems/src/modules/practical_training/repository" ) -// IPtNeConfigApplyService 服务层接口 -type IPtNeConfigApplyService interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any - - // SelectList 根据实体查询 - SelectList(param model.PtNeConfigApply) []model.PtNeConfigApply - - // SelectByIds 通过ID查询 - SelectById(paramId string) model.PtNeConfigApply - - // Insert 新增信息 - Insert(param model.PtNeConfigApply) string - - // Update 修改信息 - Update(param model.PtNeConfigApply) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(paramIds []string) (int64, error) - - // SelectListByClass 查询班级学生信息 - SelectListByClass(deptId, userName string) []map[string]any +// NewPtNeConfigApplyService 实例化服务层 +var NewPtNeConfigApplyService = &PtNeConfigApplyService{ + ptNeConfigApplyRepository: *repository.NewPtNeConfigApplyRepository, +} + +// PtNeConfigApplyService 服务层处理 +type PtNeConfigApplyService struct { + ptNeConfigApplyRepository repository.PtNeConfigApplyRepository // 实训教学_网元参数配置表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *PtNeConfigApplyService) SelectPage(query map[string]any) (int64, []model.PtNeConfigApply) { + return r.ptNeConfigApplyRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *PtNeConfigApplyService) SelectList(param model.PtNeConfigApply) []model.PtNeConfigApply { + return r.ptNeConfigApplyRepository.SelectList(param) +} + +// SelectByIds 通过ID查询 +func (r *PtNeConfigApplyService) SelectById(paramId int64) model.PtNeConfigApply { + if paramId <= 0 { + return model.PtNeConfigApply{} + } + neHosts := r.ptNeConfigApplyRepository.SelectByIds([]int64{paramId}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.PtNeConfigApply{} +} + +// Insert 新增信息 +func (r *PtNeConfigApplyService) Insert(param model.PtNeConfigApply) int64 { + return r.ptNeConfigApplyRepository.Insert(param) +} + +// Update 修改信息 +func (r *PtNeConfigApplyService) Update(param model.PtNeConfigApply) int64 { + return r.ptNeConfigApplyRepository.Update(param) +} + +// DeleteByIds 批量删除信息 +func (r *PtNeConfigApplyService) DeleteByIds(paramIds []int64) (int64, error) { + // 检查是否存在 + ids := r.ptNeConfigApplyRepository.SelectByIds(paramIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("ptNeConfigApply.noData") + } + + if len(ids) == len(paramIds) { + rows := r.ptNeConfigApplyRepository.DeleteByIds(paramIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// SelectListByClass 查询班级学生信息 +func (r *PtNeConfigApplyService) SelectListByClass(deptId, userName string) []map[string]any { + return r.ptNeConfigApplyRepository.SelectListByClass(deptId, userName) } diff --git a/src/modules/practical_training/service/pt_ne_config_apply.impl.go b/src/modules/practical_training/service/pt_ne_config_apply.impl.go deleted file mode 100644 index 46ad36fe..00000000 --- a/src/modules/practical_training/service/pt_ne_config_apply.impl.go +++ /dev/null @@ -1,72 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/practical_training/model" - "be.ems/src/modules/practical_training/repository" -) - -// NewPtNeConfigApplyService 实例化服务层 -var NewPtNeConfigApplyService = &PtNeConfigApplyService{ - ptNeConfigApplyRepository: repository.NewPtNeConfigApplyRepository, -} - -// PtNeConfigApplyService 服务层处理 -type PtNeConfigApplyService struct { - // 实训教学_网元参数配置表 - ptNeConfigApplyRepository repository.IPtNeConfigApplyRepository -} - -// SelectNeHostPage 分页查询列表数据 -func (r *PtNeConfigApplyService) SelectPage(query map[string]any) map[string]any { - return r.ptNeConfigApplyRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *PtNeConfigApplyService) SelectList(param model.PtNeConfigApply) []model.PtNeConfigApply { - return r.ptNeConfigApplyRepository.SelectList(param) -} - -// SelectByIds 通过ID查询 -func (r *PtNeConfigApplyService) SelectById(paramId string) model.PtNeConfigApply { - if paramId == "" { - return model.PtNeConfigApply{} - } - neHosts := r.ptNeConfigApplyRepository.SelectByIds([]string{paramId}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.PtNeConfigApply{} -} - -// Insert 新增信息 -func (r *PtNeConfigApplyService) Insert(param model.PtNeConfigApply) string { - return r.ptNeConfigApplyRepository.Insert(param) -} - -// Update 修改信息 -func (r *PtNeConfigApplyService) Update(param model.PtNeConfigApply) int64 { - return r.ptNeConfigApplyRepository.Update(param) -} - -// DeleteByIds 批量删除信息 -func (r *PtNeConfigApplyService) DeleteByIds(paramIds []string) (int64, error) { - // 检查是否存在 - ids := r.ptNeConfigApplyRepository.SelectByIds(paramIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("ptNeConfigApply.noData") - } - - if len(ids) == len(paramIds) { - rows := r.ptNeConfigApplyRepository.DeleteByIds(paramIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// SelectListByClass 查询班级学生信息 -func (r *PtNeConfigApplyService) SelectListByClass(deptId, userName string) []map[string]any { - return r.ptNeConfigApplyRepository.SelectListByClass(deptId, userName) -} diff --git a/src/modules/practical_training/service/pt_ne_config_data.go b/src/modules/practical_training/service/pt_ne_config_data.go index b8aad0a9..be84de7f 100644 --- a/src/modules/practical_training/service/pt_ne_config_data.go +++ b/src/modules/practical_training/service/pt_ne_config_data.go @@ -1,42 +1,461 @@ package service import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "reflect" + + "be.ems/src/framework/constants/uploadsubpath" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + 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" "be.ems/src/modules/practical_training/model" + "be.ems/src/modules/practical_training/repository" + "github.com/xuri/excelize/v2" ) -// IPtNeConfigDataService 服务层接口 -type IPtNeConfigDataService interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any - - // SelectList 根据实体查询 - SelectList(param model.PtNeConfigData) []model.PtNeConfigData - - // SelectByIds 通过ID查询 - SelectById(paramId string) model.PtNeConfigData - - // Insert 新增信息 - Insert(param model.PtNeConfigData) string - - // Update 修改信息 - Update(param model.PtNeConfigData) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(paramIds []string) (int64, error) - - // SaveAsDefault 系统网元配置保存为系统示例 - SaveAsDefault(neType, neId string) - - // ResetAsDefault 重置配置示例 - // stubType:2个人为班级示例 1班级为系统示例 - ResetAsDefault(operaUserName, stubType, neType, deptId string) - - // SelectByStubType 通过存根类型查询 - SelectByStubType(param model.PtNeConfigData) model.PtNeConfigData - - // ApplyToNe 参数应用到网元 - ApplyToNe(paramUser, neType string) error - - // ExportToExcel 导出网元的全部配置项数据 - ExportToExcel(operaUserName, fileName string) (string, error) +// NewPtNeConfigDataService 实例化服务层 +var NewPtNeConfigDataService = &PtNeConfigDataService{ + ptNeConfigDataLogRepository: repository.NewPtNeConfigDataLogRepository, + ptNeConfigDataRepository: repository.NewPtNeConfigDataRepository, + neConfigService: neService.NewNeConfig, + neInfoService: neService.NewNeInfo, +} + +// PtNeConfigDataService 服务层处理 +type PtNeConfigDataService struct { + // 实训教学_网元参数配置数据变更日志 + ptNeConfigDataLogRepository *repository.PtNeConfigDataLogRepository + // 实训教学_网元参数配置表 + ptNeConfigDataRepository *repository.PtNeConfigDataRepository + // 网元参数配置可用属性值服务 + neConfigService *neService.NeConfig + // 网元信息服务 + neInfoService *neService.NeInfo +} + +// SelectNeHostPage 分页查询列表数据 +func (r *PtNeConfigDataService) SelectPage(query map[string]any) (int64, []model.PtNeConfigData) { + return r.ptNeConfigDataRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *PtNeConfigDataService) SelectList(param model.PtNeConfigData) []model.PtNeConfigData { + return r.ptNeConfigDataRepository.SelectList(param) +} + +// SelectByIds 通过ID查询 +func (r *PtNeConfigDataService) SelectById(paramId string) model.PtNeConfigData { + if paramId == "" { + return model.PtNeConfigData{} + } + neHosts := r.ptNeConfigDataRepository.SelectByIds([]string{paramId}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.PtNeConfigData{} +} + +// Insert 新增信息 +func (r *PtNeConfigDataService) Insert(param model.PtNeConfigData) int64 { + return r.ptNeConfigDataRepository.Insert(param) +} + +// Update 修改信息 +func (r *PtNeConfigDataService) Update(param model.PtNeConfigData) int64 { + return r.ptNeConfigDataRepository.Update(param) +} + +// DeleteByIds 批量删除信息 +func (r *PtNeConfigDataService) DeleteByIds(paramIds []string) (int64, error) { + // 检查是否存在 + ids := r.ptNeConfigDataRepository.SelectByIds(paramIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("ptNeConfigData.noData") + } + + if len(ids) == len(paramIds) { + rows := r.ptNeConfigDataRepository.DeleteByIds(paramIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// SaveAsDefault 系统网元配置保存为系统示例 +func (r *PtNeConfigDataService) SaveAsDefault(neType, neId string) { + // 查询网元获取IP获取网元状态 + neInfo := r.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId || neInfo.IP == "" { + return + } + + stubType := "0" + operaUserName := "admin" + deptId := "100" + confs := r.neConfigService.SelectList(neModel.NeConfig{NeType: neInfo.NeType}) + for _, v := range confs { + // 查询是否存在记录 + hasItems := r.SelectList(model.PtNeConfigData{ + NeType: v.NeType, + StubType: stubType, + ParamName: v.ParamName, + ParamType: v.ParamType, + }) + // 网元直连 获取网元配置信息 + resData, err := neFetchlink.NeConfigInfo(neInfo, v.ParamName) + if err != nil { + continue + } + // 将json数据转字符串存储 data:[{},{}] + data, ok := resData["data"] + if !ok { + continue + } + paramDataByte, err := json.Marshal(data) + if err != nil { + continue + } + // 插入 + if len(hasItems) == 0 { + r.Insert(model.PtNeConfigData{ + CreateBy: operaUserName, + StubType: stubType, + NeType: v.NeType, + ParamName: v.ParamName, + ParamDisplay: v.ParamDisplay, + ParamType: v.ParamType, + ParamJson: string(paramDataByte), + DeptId: deptId, + }) + } + // 更新 + if len(hasItems) == 1 { + item := hasItems[0] + item.UpdateBy = operaUserName + item.ParamDisplay = v.ParamDisplay + item.ParamJson = string(paramDataByte) + item.DeptId = deptId + r.Update(item) + } + } +} + +// ResetAsDefault 重置配置示例 +// stubType:2个人为班级示例 1班级为系统示例 +func (r *PtNeConfigDataService) ResetAsDefault(operaUserName, stubType, neType, deptId string) { + rootStubType := "1" + if stubType == "1" { + rootStubType = "0" + } + if stubType == "2" { + rootStubType = "1" + } + ptConfs := r.SelectList(model.PtNeConfigData{StubType: rootStubType, NeType: neType}) + + for _, v := range ptConfs { + // 查询是否存在记录 + hasItems := r.SelectList(model.PtNeConfigData{ + CreateBy: operaUserName, + NeType: v.NeType, + StubType: stubType, + ParamName: v.ParamName, + ParamType: v.ParamType, + }) + + // 插入 + if len(hasItems) == 0 { + r.Insert(model.PtNeConfigData{ + CreateBy: operaUserName, + StubType: stubType, + NeType: v.NeType, + ParamName: v.ParamName, + ParamDisplay: v.ParamDisplay, + ParamType: v.ParamType, + ParamJson: v.ParamJson, + DeptId: deptId, + }) + // 保留变更日志 + changeLog := model.PtNeConfigDataLog{ + CreateBy: operaUserName, + StubType: stubType, + NeType: v.NeType, + ParamName: v.ParamName, + ParamDisplay: v.ParamDisplay, + ParamType: v.ParamType, + OperaType: 0, + ParamJsonOld: "[]", + ParamJsonNew: v.ParamJson, + } + r.ptNeConfigDataLogRepository.Insert(changeLog) + } + // 更新 + if len(hasItems) == 1 { + item := hasItems[0] + item.UpdateBy = operaUserName + item.ParamDisplay = v.ParamDisplay + item.ParamJson = v.ParamJson + item.DeptId = deptId + r.Update(item) + // 保留变更日志 + changeLog := model.PtNeConfigDataLog{ + CreateBy: operaUserName, + StubType: hasItems[0].StubType, + NeType: v.NeType, + ParamName: v.ParamName, + ParamDisplay: v.ParamDisplay, + ParamType: v.ParamType, + OperaType: 0, + ParamJsonOld: hasItems[0].ParamJson, + ParamJsonNew: v.ParamJson, + } + r.ptNeConfigDataLogRepository.Insert(changeLog) + } + } +} + +// SelectByStubType 通过存根类型查询 +func (r *PtNeConfigDataService) SelectByStubType(param model.PtNeConfigData) model.PtNeConfigData { + list := r.SelectList(param) + if len(list) == 0 && param.StubType != "1" { + param.CreateBy = "" + param.StubType = "1" + list = r.SelectList(param) + } + if len(list) == 0 && param.StubType != "0" { + param.CreateBy = "" + param.StubType = "0" + param.DeptId = "100" + list = r.SelectList(param) + } + var paraData model.PtNeConfigData + if len(list) > 0 { + paraData = list[0] + if err := json.Unmarshal([]byte(paraData.ParamJson), ¶Data.ParamData); err != nil { + paraData.ParamData = []map[string]any{} + } + } + return paraData +} + +// ApplyToNe 参数应用到网元 +func (r *PtNeConfigDataService) ApplyToNe(paramUser, neType string) error { + ptConfs := r.SelectList(model.PtNeConfigData{CreateBy: paramUser, NeType: neType}) + if len(ptConfs) == 0 { + return fmt.Errorf("NeConfigData Not Found") + } + + // 找网元,只有一套就固定neId:001 + neInfo := r.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, "001") + if neInfo.NeType != neType || neInfo.ID == "" { + return fmt.Errorf("NeInfo Not Found") + } + + // 遍历去设置参数 + for _, ptConf := range ptConfs { + if err := json.Unmarshal([]byte(ptConf.ParamJson), &ptConf.ParamData); err != nil { + ptConf.ParamData = []map[string]any{} + } + // 将json数据转字符串存储 [{},{}] + if len(ptConf.ParamData) == 0 { + continue + } + // 单层逐个更新 + if ptConf.ParamType == "list" { + for k, v := range ptConf.ParamData[0] { + neFetchlink.NeConfigUpdate(neInfo, ptConf.ParamName, "", map[string]any{k: v}) + } + } + // 多层逐个更新 + if ptConf.ParamType == "array" { + // 删除原先配置 + resData, err := neFetchlink.NeConfigInfo(neInfo, ptConf.ParamName) + if err != nil { + continue + } + if data, ok := resData["data"]; ok { + for i := 0; i < len(data.([]any)); i++ { // 倒序遍历 + originIndex := i + newIndex := len(data.([]any)) - originIndex - 1 + element := data.([]any)[newIndex] + loc := parse.Number(element.(map[string]any)["index"]) + neFetchlink.NeConfigDelete(neInfo, ptConf.ParamName, fmt.Sprint(loc)) + } + } + + // 遍历新增 + for _, v := range ptConf.ParamData { + loc := parse.Number(v["index"]) + neFetchlink.NeConfigInstall(neInfo, ptConf.ParamName, fmt.Sprint(loc), v) + // 检查是否有array子层 + for vk, vv := range v { + if reflect.TypeOf(vv).Kind() == reflect.Slice { + for i, item := range vv.([]any) { + data := item.(map[string]any) + data["index"] = i + neFetchlink.NeConfigInstall(neInfo, ptConf.ParamName, fmt.Sprintf("%v/%s/%v", loc, vk, i), data) + } + } + } + } + } + } + + return nil +} + +// ExportToExcel 导出网元的全部配置项数据 +func (r *PtNeConfigDataService) ExportToExcel(operaUserName, fileName string) (string, error) { + confs := r.neConfigService.SelectNeConfigByNeType("*") + datas := r.ptNeConfigDataRepository.SelectList(model.PtNeConfigData{CreateBy: operaUserName}) + return r.writeSheet(confs, datas, fileName) +} + +// writeSheet 写入表格 +func (r *PtNeConfigDataService) writeSheet(sheetData []neModel.NeConfig, cellData []model.PtNeConfigData, fileName string) (string, error) { + f := excelize.NewFile() + defer f.Close() + + // 设置颜色填充 + styleType, _ := f.NewStyle(&excelize.Style{Fill: excelize.Fill{ + Type: "pattern", + Pattern: 1, + Color: []string{"F0F806"}, // RRGGBB 格式的 + }}) + styleRow, _ := f.NewStyle(&excelize.Style{Fill: excelize.Fill{ + Type: "pattern", + Pattern: 1, + Color: []string{"D0CECE"}, // RRGGBB 格式的 + }}) + styleMore, _ := f.NewStyle(&excelize.Style{Font: &excelize.Font{ + Color: "4472C4", + VertAlign: "center", + }}) + // 网元工作簿行计数 + sheetNameRows := make(map[string]int) + + for _, sd := range sheetData { + _ = json.Unmarshal([]byte(sd.ParamJson), &sd.ParamData) + // 取到对应数据 + var data model.PtNeConfigData + for _, cell := range cellData { + if cell.NeType == sd.NeType && cell.ParamName == sd.ParamName { + data = cell + break + } + } + if err := json.Unmarshal([]byte(data.ParamJson), &data.ParamData); err != nil || len(data.ParamData) == 0 { + continue + } + + sheetName := sd.NeType + // 创建一个工作表 + f.NewSheet(sheetName) + // 设置工作表上宽度为 20 + // f.SetColWidth(sheetName, "B", "C", 20) + sheetRows := 1 + if v, ok := sheetNameRows[sheetName]; ok && v != 0 { + sheetRows = v + } + // 合并标题单元格 + f.MergeCell(sheetName, fmt.Sprintf("A%d", sheetRows), fmt.Sprintf("C%d", sheetRows)) + f.SetCellStyle(sheetName, fmt.Sprintf("A%d", sheetRows), fmt.Sprintf("C%d", sheetRows), styleType) + // 标题 + f.SetCellValue(sheetName, fmt.Sprintf("A%d", sheetRows), sd.ParamDisplay) + sheetRows += 1 + + // fmt.Println(sheetName, " ========= ", sd.ParamDisplay, " ==== ", sd.ParamType, len(data.ParamData)) + itemData := []*[]any{} + + if sd.ParamType == "list" { + itemData = append(itemData, &[]any{"Key", "Value"}) + for _, v := range sd.ParamData { + name := v["name"].(string) + value := v["value"] + // 取到对应数据 + for _, dv := range data.ParamData { + value = dv[name] + } + itemData = append(itemData, &[]any{v["display"], value}) + } + } + + if sd.ParamType == "array" { + rowTitle := []any{} // 行头 + rowData := make([][]any, len(data.ParamData)) // 行数据 + for _, v := range sd.ParamData { + rowTitle = append(rowTitle, v["display"]) + name := v["name"].(string) + // 取到对应数据 + for i, dv := range data.ParamData { + rowData[i] = append(rowData[i], dv[name]) + } + } + itemData = append(itemData, &rowTitle) + for _, v := range rowData { + item := v + itemData = append(itemData, &item) + } + } + + for i, row := range itemData { + // 行头样式 + if i == 0 { + f.SetCellStyle(sheetName, fmt.Sprintf("A%d", sheetRows), fmt.Sprintf("A%d", sheetRows), styleRow) + } + + f.SetSheetRow(sheetName, fmt.Sprintf("A%d", sheetRows), row) + + // 存在array子层时转字符串 + for i, s := range *row { + if reflect.ValueOf(s).Kind() == reflect.Slice { + if cell, err := excelize.CoordinatesToCellName(i+1, sheetRows); err == nil { + b, _ := json.Marshal(s) + f.SetCellDefault(sheetName, cell, "#") + f.SetCellStyle(sheetName, cell, cell, styleMore) + f.AddComment(sheetName, excelize.Comment{ + Cell: cell, + Author: "OMC", + Text: string(b), + }) + } + } + } + + sheetRows += 1 + } + + // 记下次写入的行数 + sheetRows += 2 + sheetNameRows[sheetName] = sheetRows + } + + // 默认工作表 + f.SetCellValue("Sheet1", "A1", cellData[0].CreateBy) + f.MergeCell("Sheet1", "A1", "B1") + f.SetCellStyle("Sheet1", "A1", "B1", styleType) + f.SetCellValue("Sheet1", "A2", "5GC") + f.SetCellStyle("Sheet1", "A2", "A2", styleRow) + sheetNameData := []any{} + for k := range sheetNameRows { + sheetNameData = append(sheetNameData, k) + } + f.SetSheetRow("Sheet1", "A3", &sheetNameData) + + // 上传资源路径 + filePath := file.ParseUploadFileDir(uploadsubpath.EXPORT) + saveFilePath := filepath.ToSlash(filepath.Join(filePath, fileName)) + // 创建文件目录 + if err := os.MkdirAll(filepath.Dir(saveFilePath), 0775); err != nil { + return "", fmt.Errorf("failed to create save file %v", err) + } + // 根据指定路径保存文件 + if err := f.SaveAs(saveFilePath); err != nil { + return "", fmt.Errorf("failed to save worksheet %v", err) + } + return saveFilePath, nil } diff --git a/src/modules/practical_training/service/pt_ne_config_data.impl.go b/src/modules/practical_training/service/pt_ne_config_data.impl.go deleted file mode 100644 index a6b9bc66..00000000 --- a/src/modules/practical_training/service/pt_ne_config_data.impl.go +++ /dev/null @@ -1,461 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "reflect" - - "be.ems/src/framework/constants/uploadsubpath" - "be.ems/src/framework/utils/file" - "be.ems/src/framework/utils/parse" - 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" - "be.ems/src/modules/practical_training/model" - "be.ems/src/modules/practical_training/repository" - "github.com/xuri/excelize/v2" -) - -// NewPtNeConfigDataService 实例化服务层 -var NewPtNeConfigDataService = &PtNeConfigDataService{ - ptNeConfigDataLogRepository: repository.NewPtNeConfigDataLogRepository, - ptNeConfigDataRepository: repository.NewPtNeConfigDataRepository, - neConfigService: neService.NewNeConfigImpl, - neInfoService: neService.NewNeInfoImpl, -} - -// PtNeConfigDataService 服务层处理 -type PtNeConfigDataService struct { - // 实训教学_网元参数配置数据变更日志 - ptNeConfigDataLogRepository repository.IPtNeConfigDataLogRepository - // 实训教学_网元参数配置表 - ptNeConfigDataRepository repository.IPtNeConfigDataRepository - // 网元参数配置可用属性值服务 - neConfigService neService.INeConfig - // 网元信息服务 - neInfoService neService.INeInfo -} - -// SelectNeHostPage 分页查询列表数据 -func (r *PtNeConfigDataService) SelectPage(query map[string]any) map[string]any { - return r.ptNeConfigDataRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *PtNeConfigDataService) SelectList(param model.PtNeConfigData) []model.PtNeConfigData { - return r.ptNeConfigDataRepository.SelectList(param) -} - -// SelectByIds 通过ID查询 -func (r *PtNeConfigDataService) SelectById(paramId string) model.PtNeConfigData { - if paramId == "" { - return model.PtNeConfigData{} - } - neHosts := r.ptNeConfigDataRepository.SelectByIds([]string{paramId}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.PtNeConfigData{} -} - -// Insert 新增信息 -func (r *PtNeConfigDataService) Insert(param model.PtNeConfigData) string { - return r.ptNeConfigDataRepository.Insert(param) -} - -// Update 修改信息 -func (r *PtNeConfigDataService) Update(param model.PtNeConfigData) int64 { - return r.ptNeConfigDataRepository.Update(param) -} - -// DeleteByIds 批量删除信息 -func (r *PtNeConfigDataService) DeleteByIds(paramIds []string) (int64, error) { - // 检查是否存在 - ids := r.ptNeConfigDataRepository.SelectByIds(paramIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("ptNeConfigData.noData") - } - - if len(ids) == len(paramIds) { - rows := r.ptNeConfigDataRepository.DeleteByIds(paramIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// SaveAsDefault 系统网元配置保存为系统示例 -func (r *PtNeConfigDataService) SaveAsDefault(neType, neId string) { - // 查询网元获取IP获取网元状态 - neInfo := r.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId || neInfo.IP == "" { - return - } - - stubType := "0" - operaUserName := "admin" - deptId := "100" - confs := r.neConfigService.SelectList(neModel.NeConfig{NeType: neInfo.NeType}) - for _, v := range confs { - // 查询是否存在记录 - hasItems := r.SelectList(model.PtNeConfigData{ - NeType: v.NeType, - StubType: stubType, - ParamName: v.ParamName, - ParamType: v.ParamType, - }) - // 网元直连 获取网元配置信息 - resData, err := neFetchlink.NeConfigInfo(neInfo, v.ParamName) - if err != nil { - continue - } - // 将json数据转字符串存储 data:[{},{}] - data, ok := resData["data"] - if !ok { - continue - } - paramDataByte, err := json.Marshal(data) - if err != nil { - continue - } - // 插入 - if len(hasItems) == 0 { - r.Insert(model.PtNeConfigData{ - CreateBy: operaUserName, - StubType: stubType, - NeType: v.NeType, - ParamName: v.ParamName, - ParamDisplay: v.ParamDisplay, - ParamType: v.ParamType, - ParamJson: string(paramDataByte), - DeptId: deptId, - }) - } - // 更新 - if len(hasItems) == 1 { - item := hasItems[0] - item.UpdateBy = operaUserName - item.ParamDisplay = v.ParamDisplay - item.ParamJson = string(paramDataByte) - item.DeptId = deptId - r.Update(item) - } - } -} - -// ResetAsDefault 重置配置示例 -// stubType:2个人为班级示例 1班级为系统示例 -func (r *PtNeConfigDataService) ResetAsDefault(operaUserName, stubType, neType, deptId string) { - rootStubType := "1" - if stubType == "1" { - rootStubType = "0" - } - if stubType == "2" { - rootStubType = "1" - } - ptConfs := r.SelectList(model.PtNeConfigData{StubType: rootStubType, NeType: neType}) - - for _, v := range ptConfs { - // 查询是否存在记录 - hasItems := r.SelectList(model.PtNeConfigData{ - CreateBy: operaUserName, - NeType: v.NeType, - StubType: stubType, - ParamName: v.ParamName, - ParamType: v.ParamType, - }) - - // 插入 - if len(hasItems) == 0 { - r.Insert(model.PtNeConfigData{ - CreateBy: operaUserName, - StubType: stubType, - NeType: v.NeType, - ParamName: v.ParamName, - ParamDisplay: v.ParamDisplay, - ParamType: v.ParamType, - ParamJson: v.ParamJson, - DeptId: deptId, - }) - // 保留变更日志 - changeLog := model.PtNeConfigDataLog{ - CreateBy: operaUserName, - StubType: stubType, - NeType: v.NeType, - ParamName: v.ParamName, - ParamDisplay: v.ParamDisplay, - ParamType: v.ParamType, - OperaType: 0, - ParamJsonOld: "[]", - ParamJsonNew: v.ParamJson, - } - r.ptNeConfigDataLogRepository.Insert(changeLog) - } - // 更新 - if len(hasItems) == 1 { - item := hasItems[0] - item.UpdateBy = operaUserName - item.ParamDisplay = v.ParamDisplay - item.ParamJson = v.ParamJson - item.DeptId = deptId - r.Update(item) - // 保留变更日志 - changeLog := model.PtNeConfigDataLog{ - CreateBy: operaUserName, - StubType: hasItems[0].StubType, - NeType: v.NeType, - ParamName: v.ParamName, - ParamDisplay: v.ParamDisplay, - ParamType: v.ParamType, - OperaType: 0, - ParamJsonOld: hasItems[0].ParamJson, - ParamJsonNew: v.ParamJson, - } - r.ptNeConfigDataLogRepository.Insert(changeLog) - } - } -} - -// SelectByStubType 通过存根类型查询 -func (r *PtNeConfigDataService) SelectByStubType(param model.PtNeConfigData) model.PtNeConfigData { - list := r.SelectList(param) - if len(list) == 0 && param.StubType != "1" { - param.CreateBy = "" - param.StubType = "1" - list = r.SelectList(param) - } - if len(list) == 0 && param.StubType != "0" { - param.CreateBy = "" - param.StubType = "0" - param.DeptId = "100" - list = r.SelectList(param) - } - var paraData model.PtNeConfigData - if len(list) > 0 { - paraData = list[0] - if err := json.Unmarshal([]byte(paraData.ParamJson), ¶Data.ParamData); err != nil { - paraData.ParamData = []map[string]any{} - } - } - return paraData -} - -// ApplyToNe 参数应用到网元 -func (r *PtNeConfigDataService) ApplyToNe(paramUser, neType string) error { - ptConfs := r.SelectList(model.PtNeConfigData{CreateBy: paramUser, NeType: neType}) - if len(ptConfs) == 0 { - return fmt.Errorf("NeConfigData Not Found") - } - - // 找网元,只有一套就固定neId:001 - neInfo := r.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, "001") - if neInfo.NeType != neType || neInfo.ID == "" { - return fmt.Errorf("NeInfo Not Found") - } - - // 遍历去设置参数 - for _, ptConf := range ptConfs { - if err := json.Unmarshal([]byte(ptConf.ParamJson), &ptConf.ParamData); err != nil { - ptConf.ParamData = []map[string]any{} - } - // 将json数据转字符串存储 [{},{}] - if len(ptConf.ParamData) == 0 { - continue - } - // 单层逐个更新 - if ptConf.ParamType == "list" { - for k, v := range ptConf.ParamData[0] { - neFetchlink.NeConfigUpdate(neInfo, ptConf.ParamName, "", map[string]any{k: v}) - } - } - // 多层逐个更新 - if ptConf.ParamType == "array" { - // 删除原先配置 - resData, err := neFetchlink.NeConfigInfo(neInfo, ptConf.ParamName) - if err != nil { - continue - } - if data, ok := resData["data"]; ok { - for i := 0; i < len(data.([]any)); i++ { // 倒序遍历 - originIndex := i - newIndex := len(data.([]any)) - originIndex - 1 - element := data.([]any)[newIndex] - loc := parse.Number(element.(map[string]any)["index"]) - neFetchlink.NeConfigDelete(neInfo, ptConf.ParamName, fmt.Sprint(loc)) - } - } - - // 遍历新增 - for _, v := range ptConf.ParamData { - loc := parse.Number(v["index"]) - neFetchlink.NeConfigInstall(neInfo, ptConf.ParamName, fmt.Sprint(loc), v) - // 检查是否有array子层 - for vk, vv := range v { - if reflect.TypeOf(vv).Kind() == reflect.Slice { - for i, item := range vv.([]any) { - data := item.(map[string]any) - data["index"] = i - neFetchlink.NeConfigInstall(neInfo, ptConf.ParamName, fmt.Sprintf("%v/%s/%v", loc, vk, i), data) - } - } - } - } - } - } - - return nil -} - -// ExportToExcel 导出网元的全部配置项数据 -func (r *PtNeConfigDataService) ExportToExcel(operaUserName, fileName string) (string, error) { - confs := r.neConfigService.SelectNeConfigByNeType("*") - datas := r.ptNeConfigDataRepository.SelectList(model.PtNeConfigData{CreateBy: operaUserName}) - return r.writeSheet(confs, datas, fileName) -} - -// writeSheet 写入表格 -func (r *PtNeConfigDataService) writeSheet(sheetData []neModel.NeConfig, cellData []model.PtNeConfigData, fileName string) (string, error) { - f := excelize.NewFile() - defer f.Close() - - // 设置颜色填充 - styleType, _ := f.NewStyle(&excelize.Style{Fill: excelize.Fill{ - Type: "pattern", - Pattern: 1, - Color: []string{"F0F806"}, // RRGGBB 格式的 - }}) - styleRow, _ := f.NewStyle(&excelize.Style{Fill: excelize.Fill{ - Type: "pattern", - Pattern: 1, - Color: []string{"D0CECE"}, // RRGGBB 格式的 - }}) - styleMore, _ := f.NewStyle(&excelize.Style{Font: &excelize.Font{ - Color: "4472C4", - VertAlign: "center", - }}) - // 网元工作簿行计数 - sheetNameRows := make(map[string]int) - - for _, sd := range sheetData { - _ = json.Unmarshal([]byte(sd.ParamJson), &sd.ParamData) - // 取到对应数据 - var data model.PtNeConfigData - for _, cell := range cellData { - if cell.NeType == sd.NeType && cell.ParamName == sd.ParamName { - data = cell - break - } - } - if err := json.Unmarshal([]byte(data.ParamJson), &data.ParamData); err != nil || len(data.ParamData) == 0 { - continue - } - - sheetName := sd.NeType - // 创建一个工作表 - f.NewSheet(sheetName) - // 设置工作表上宽度为 20 - // f.SetColWidth(sheetName, "B", "C", 20) - sheetRows := 1 - if v, ok := sheetNameRows[sheetName]; ok && v != 0 { - sheetRows = v - } - // 合并标题单元格 - f.MergeCell(sheetName, fmt.Sprintf("A%d", sheetRows), fmt.Sprintf("C%d", sheetRows)) - f.SetCellStyle(sheetName, fmt.Sprintf("A%d", sheetRows), fmt.Sprintf("C%d", sheetRows), styleType) - // 标题 - f.SetCellValue(sheetName, fmt.Sprintf("A%d", sheetRows), sd.ParamDisplay) - sheetRows += 1 - - // fmt.Println(sheetName, " ========= ", sd.ParamDisplay, " ==== ", sd.ParamType, len(data.ParamData)) - itemData := []*[]any{} - - if sd.ParamType == "list" { - itemData = append(itemData, &[]any{"Key", "Value"}) - for _, v := range sd.ParamData { - name := v["name"].(string) - value := v["value"] - // 取到对应数据 - for _, dv := range data.ParamData { - value = dv[name] - } - itemData = append(itemData, &[]any{v["display"], value}) - } - } - - if sd.ParamType == "array" { - rowTitle := []any{} // 行头 - rowData := make([][]any, len(data.ParamData)) // 行数据 - for _, v := range sd.ParamData { - rowTitle = append(rowTitle, v["display"]) - name := v["name"].(string) - // 取到对应数据 - for i, dv := range data.ParamData { - rowData[i] = append(rowData[i], dv[name]) - } - } - itemData = append(itemData, &rowTitle) - for _, v := range rowData { - item := v - itemData = append(itemData, &item) - } - } - - for i, row := range itemData { - // 行头样式 - if i == 0 { - f.SetCellStyle(sheetName, fmt.Sprintf("A%d", sheetRows), fmt.Sprintf("A%d", sheetRows), styleRow) - } - - f.SetSheetRow(sheetName, fmt.Sprintf("A%d", sheetRows), row) - - // 存在array子层时转字符串 - for i, s := range *row { - if reflect.ValueOf(s).Kind() == reflect.Slice { - if cell, err := excelize.CoordinatesToCellName(i+1, sheetRows); err == nil { - b, _ := json.Marshal(s) - f.SetCellDefault(sheetName, cell, "#") - f.SetCellStyle(sheetName, cell, cell, styleMore) - f.AddComment(sheetName, excelize.Comment{ - Cell: cell, - Author: "OMC", - Text: string(b), - }) - } - } - } - - sheetRows += 1 - } - - // 记下次写入的行数 - sheetRows += 2 - sheetNameRows[sheetName] = sheetRows - } - - // 默认工作表 - f.SetCellValue("Sheet1", "A1", cellData[0].CreateBy) - f.MergeCell("Sheet1", "A1", "B1") - f.SetCellStyle("Sheet1", "A1", "B1", styleType) - f.SetCellValue("Sheet1", "A2", "5GC") - f.SetCellStyle("Sheet1", "A2", "A2", styleRow) - sheetNameData := []any{} - for k := range sheetNameRows { - sheetNameData = append(sheetNameData, k) - } - f.SetSheetRow("Sheet1", "A3", &sheetNameData) - - // 上传资源路径 - filePath := file.ParseUploadFileDir(uploadsubpath.EXPORT) - saveFilePath := filepath.ToSlash(filepath.Join(filePath, fileName)) - // 创建文件目录 - if err := os.MkdirAll(filepath.Dir(saveFilePath), 0775); err != nil { - return "", fmt.Errorf("failed to create save file %v", err) - } - // 根据指定路径保存文件 - if err := f.SaveAs(saveFilePath); err != nil { - return "", fmt.Errorf("failed to save worksheet %v", err) - } - return saveFilePath, nil -} diff --git a/src/modules/practical_training/service/pt_ne_config_data_log.go b/src/modules/practical_training/service/pt_ne_config_data_log.go index e86df8c0..be3b3700 100644 --- a/src/modules/practical_training/service/pt_ne_config_data_log.go +++ b/src/modules/practical_training/service/pt_ne_config_data_log.go @@ -1,23 +1,62 @@ package service import ( + "fmt" + "be.ems/src/modules/practical_training/model" + "be.ems/src/modules/practical_training/repository" ) -// IPtNeConfigDataLogService 服务层接口 -type IPtNeConfigDataLogService interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any - - // SelectList 根据实体查询 - SelectList(param model.PtNeConfigDataLog) []model.PtNeConfigDataLog - - // SelectByIds 通过ID查询 - SelectById(paramId string) model.PtNeConfigDataLog - - // Insert 新增信息 - Insert(param model.PtNeConfigDataLog) string - - // DeleteByIds 批量删除信息 - DeleteByIds(paramIds []string) (int64, error) +// NewPtNeConfigDataService 实例化服务层 +var NewPtNeConfigDataLogService = &PtNeConfigDataLogService{ + ptNeConfigDataLogRepository: *repository.NewPtNeConfigDataLogRepository, +} + +// PtNeConfigDataLogService 服务层处理 +type PtNeConfigDataLogService struct { + // 实训教学_网元参数配置数据变更日志 + ptNeConfigDataLogRepository repository.PtNeConfigDataLogRepository +} + +// SelectNeHostPage 分页查询列表数据 +func (r *PtNeConfigDataLogService) SelectPage(query map[string]any) (int64, []model.PtNeConfigDataLog) { + return r.ptNeConfigDataLogRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *PtNeConfigDataLogService) SelectList(param model.PtNeConfigDataLog) []model.PtNeConfigDataLog { + return r.ptNeConfigDataLogRepository.SelectList(param) +} + +// SelectByIds 通过ID查询 +func (r *PtNeConfigDataLogService) SelectById(paramId int64) model.PtNeConfigDataLog { + if paramId <= 0 { + return model.PtNeConfigDataLog{} + } + neHosts := r.ptNeConfigDataLogRepository.SelectByIds([]int64{paramId}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.PtNeConfigDataLog{} +} + +// Insert 新增信息 +func (r *PtNeConfigDataLogService) Insert(param model.PtNeConfigDataLog) int64 { + return r.ptNeConfigDataLogRepository.Insert(param) +} + +// DeleteByIds 批量删除信息 +func (r *PtNeConfigDataLogService) DeleteByIds(paramIds []int64) (int64, error) { + // 检查是否存在 + ids := r.ptNeConfigDataLogRepository.SelectByIds(paramIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("ptNeConfigDataLog.noData") + } + + if len(ids) == len(paramIds) { + rows := r.ptNeConfigDataLogRepository.DeleteByIds(paramIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/practical_training/service/pt_ne_config_data_log.impl.go b/src/modules/practical_training/service/pt_ne_config_data_log.impl.go deleted file mode 100644 index e5305f22..00000000 --- a/src/modules/practical_training/service/pt_ne_config_data_log.impl.go +++ /dev/null @@ -1,62 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/practical_training/model" - "be.ems/src/modules/practical_training/repository" -) - -// NewPtNeConfigDataService 实例化服务层 -var NewPtNeConfigDataLogService = &PtNeConfigDataLogService{ - ptNeConfigDataLogRepository: repository.NewPtNeConfigDataLogRepository, -} - -// PtNeConfigDataLogService 服务层处理 -type PtNeConfigDataLogService struct { - // 实训教学_网元参数配置数据变更日志 - ptNeConfigDataLogRepository repository.IPtNeConfigDataLogRepository -} - -// SelectNeHostPage 分页查询列表数据 -func (r *PtNeConfigDataLogService) SelectPage(query map[string]any) map[string]any { - return r.ptNeConfigDataLogRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *PtNeConfigDataLogService) SelectList(param model.PtNeConfigDataLog) []model.PtNeConfigDataLog { - return r.ptNeConfigDataLogRepository.SelectList(param) -} - -// SelectByIds 通过ID查询 -func (r *PtNeConfigDataLogService) SelectById(paramId string) model.PtNeConfigDataLog { - if paramId == "" { - return model.PtNeConfigDataLog{} - } - neHosts := r.ptNeConfigDataLogRepository.SelectByIds([]string{paramId}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.PtNeConfigDataLog{} -} - -// Insert 新增信息 -func (r *PtNeConfigDataLogService) Insert(param model.PtNeConfigDataLog) string { - return r.ptNeConfigDataLogRepository.Insert(param) -} - -// DeleteByIds 批量删除信息 -func (r *PtNeConfigDataLogService) DeleteByIds(paramIds []string) (int64, error) { - // 检查是否存在 - ids := r.ptNeConfigDataLogRepository.SelectByIds(paramIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("ptNeConfigDataLog.noData") - } - - if len(ids) == len(paramIds) { - rows := r.ptNeConfigDataLogRepository.DeleteByIds(paramIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -}