package excel import ( "encoding/json" "eta/eta_api/controllers" "eta/eta_api/models" "eta/eta_api/models/data_manage/excel" "eta/eta_api/models/data_manage/excel/request" response2 "eta/eta_api/models/data_manage/excel/response" excel2 "eta/eta_api/services/data/excel" "eta/eta_api/utils" "strconv" "time" ) // ExcelClassifyController ETA表格分类 type ExcelClassifyController struct { controllers.BaseAuthController } // List // @Title excel表格分类列表 // @Description excel表格分类列表接口 // @Param Source query int true "格来源,1:excel插件的表格,2:自定义表格,3:混合表格,默认:1" // @Param IsShowMe query bool true "是否只看我的,true、false" // @Success 200 {object} response.ExcelClassifyListResp // @router /excel_classify/list [get] func (this *ExcelClassifyController) List() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() source, _ := this.GetInt("Source") if source <= 0 { source = utils.EXCEL_DEFAULT } //只看我的 isShowMe, _ := this.GetBool("IsShowMe") showUserId := 0 if isShowMe { showUserId = this.SysUser.AdminId } // 获取一级分类 rootList, err := excel.GetExcelClassifyByParentId(0, source) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取失败" br.ErrMsg = "获取数据失败,Err:" + err.Error() return } // 根据来源获取所有excel表格(无内容) allExcelInfo, err := excel.GetNoContentExcelInfoAll(source, showUserId) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取失败" br.ErrMsg = "获取表格信息失败,Err:" + err.Error() return } ExcelInfoMap := make(map[int][]*excel.ExcelClassifyItems) for _, v := range allExcelInfo { ExcelInfoMap[v.ExcelClassifyId] = append(ExcelInfoMap[v.ExcelClassifyId], v) } //rootChildMap := make(map[int][]*data_manage.ExcelClassifyItems) //for _, v := range classifyAll { // rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v) // if existItems, ok := ExcelInfoMap[v.ExcelClassifyId]; ok { // v.Children = existItems // } else { // items := make([]*data_manage.ExcelClassifyItems, 0) // v.Children = items // } //} nodeAll := make([]*excel.ExcelClassifyItems, 0) for _, v := range rootList { var items []*excel.ExcelClassifyItems if tmpItem, ok := ExcelInfoMap[v.ExcelClassifyId]; ok { items = tmpItem } else { items = make([]*excel.ExcelClassifyItems, 0) } v.Children = items nodeAll = append(nodeAll, v) } resp := response2.ExcelClassifyListResp{ AllNodes: nodeAll, } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // ExcelClassifyItems // @Title 获取所有excel表格分类接口-不包含表格 // @Description 获取所有excel表格分类接口-不包含表格 // @Param Source query int true "格来源,1:excel插件的表格,2:自定义表格,3:混合表格,默认:1" // @Success 200 {object} response.ExcelClassifyListResp // @router /excel_classify/items [get] func (this *ExcelClassifyController) ExcelClassifyItems() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() source, _ := this.GetInt("Source") if source <= 0 { source = utils.EXCEL_DEFAULT } rootList, err := excel.GetExcelClassifyByParentId(0, source) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取数据失败,Err:" + err.Error() return } resp := response2.ExcelClassifyListResp{ AllNodes: rootList, } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // AddExcelClassify // @Title 新增excel表格分类 // @Description 新增excel表格分类接口 // @Param request body request.AddExcelClassifyReq true "type json string" // @Success 200 Ret=200 保存成功 // @router /excel_classify/add [post] func (this *ExcelClassifyController) AddExcelClassify() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.AddExcelClassifyReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ExcelClassifyName == "" { br.Msg = "请输入分类名称" br.IsSendEmail = false return } if req.ParentId < 0 { br.Msg = "参数错误" br.IsSendEmail = false return } source := req.Source if source <= 0 { source = utils.EXCEL_DEFAULT } // 获取同级分类下存在同名分类的数量 count, err := excel.GetExcelClassifyCount(req.ExcelClassifyName, req.ParentId, source) if err != nil { br.Msg = "判断名称是否已存在失败" br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error() return } if count > 0 { br.Msg = "分类名称已存在,请重新输入" br.IsSendEmail = false return } //获取该层级下最大的排序数 maxSort, err := excel.GetExcelClassifyMaxSort(req.ParentId) // 入库 timestamp := strconv.FormatInt(time.Now().UnixNano(), 10) classify := &excel.ExcelClassify{ //ExcelClassifyId: 0, ExcelClassifyName: req.ExcelClassifyName, ParentId: req.ParentId, Source: source, SysUserId: this.SysUser.AdminId, SysUserRealName: this.SysUser.RealName, Level: req.Level + 1, UniqueCode: utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp), Sort: maxSort + 1, CreateTime: time.Now(), ModifyTime: time.Now(), } _, err = excel.AddExcelClassify(classify) if err != nil { br.Msg = "保存分类失败" br.ErrMsg = "保存分类失败,Err:" + err.Error() return } br.Ret = 200 br.Msg = "保存成功" br.Success = true } // EditExcelClassify // @Title 修改excel表格分类 // @Description 修改excel表格分类 // @Param request body request.EditExcelClassifyReq true "type json string" // @Success 200 Ret=200 修改成功 // @router /excel_classify/edit [post] func (this *ExcelClassifyController) EditExcelClassify() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.EditExcelClassifyReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ExcelClassifyName == "" { br.Msg = "请输入分类名称" br.IsSendEmail = false return } if req.ExcelClassifyId <= 0 { br.Msg = "参数错误" br.IsSendEmail = false return } item, err := excel.GetExcelClassifyById(req.ExcelClassifyId) if err != nil { br.Msg = "保存失败" br.Msg = "获取分类信息失败,Err:" + err.Error() return } // 名字一致的话,直接返回成功 if item.ExcelClassifyName == req.ExcelClassifyName { br.Ret = 200 br.Msg = "保存成功" br.Success = true return } // 获取同级分类下存在同名分类的数量 count, err := excel.GetExcelClassifyCount(req.ExcelClassifyName, item.ParentId, item.Source) if err != nil { br.Msg = "判断名称是否已存在失败" br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error() return } if count > 0 { br.Msg = "分类名称已存在,请重新输入" br.IsSendEmail = false return } // 修改分类名称 item.ExcelClassifyName = req.ExcelClassifyName err = item.Update([]string{"ExcelClassifyName"}) if err != nil { br.Msg = "保存失败" br.ErrMsg = "保存失败,Err:" + err.Error() return } br.Ret = 200 br.Msg = "修改成功" br.Success = true br.IsAddLog = true } // DeleteExcelClassifyCheck // @Title 删除表格检测接口 // @Description 删除表格检测接口 // @Param request body request.ExcelClassifyDeleteCheckReq true "type json string" // @Success 200 {object} response.ExcelClassifyDeleteCheckResp // @router /excel_classify/delete/check [post] func (this *ExcelClassifyController) DeleteExcelClassifyCheck() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.ExcelClassifyDeleteCheckReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ExcelClassifyId < 0 && req.ExcelInfoId <= 0 { br.Msg = "参数错误" br.IsSendEmail = false return } var deleteStatus int var tipsMsg string // 校验是否存在该分类 ExcelClassifyInfo, err := excel.GetExcelClassifyById(req.ExcelClassifyId) if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "该分类不存在" br.ErrMsg = "该分类不存在" return } br.Msg = "删除失败" br.ErrMsg = "查询该分类失败,Err:" + err.Error() return } if ExcelClassifyInfo == nil { br.Msg = "该分类不存在" br.ErrMsg = "该分类不存在" br.IsSendEmail = false return } //删除分类 if req.ExcelClassifyId > 0 && req.ExcelInfoId == 0 { //判断表格分类下,是否含有表格 count, err := excel.GetExcelInfoCountByClassifyId(req.ExcelClassifyId) if err != nil { br.Msg = "删除失败" br.ErrMsg = "分类下是否含有指标失败,Err:" + err.Error() return } if count > 0 { deleteStatus = 1 tipsMsg = "该分类下关联表格不可删除" } } //if deleteStatus != 1 && req.ExcelInfoId == 0 { // classifyCount, err := data_manage.GetExcelClassifyCountByClassifyId(req.ExcelClassifyId) // if err != nil && err.Error() != utils.ErrNoRow() { // br.Msg = "删除失败" // br.ErrMsg = "分类下是否含有表格失败,Err:" + err.Error() // return // } // if classifyCount > 0 { // deleteStatus = 2 // tipsMsg = "确认删除当前目录及包含的子目录吗?" // } //} if deleteStatus == 0 { tipsMsg = "可删除,进行删除操作" } resp := response2.ExcelClassifyDeleteCheckResp{ DeleteStatus: deleteStatus, TipsMsg: tipsMsg, } br.Ret = 200 br.Msg = "检测成功" br.Success = true br.Data = resp } // DeleteExcelClassify // @Title 删除表格分类/表格 // @Description 删除表格分类/表格接口 // @Param request body request.DeleteExcelClassifyReq true "type json string" // @Success 200 Ret=200 删除成功 // @router /excel_classify/delete [post] func (this *ExcelClassifyController) DeleteExcelClassify() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } var req request.DeleteExcelClassifyReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ExcelClassifyId < 0 && req.ExcelInfoId <= 0 { br.Msg = "参数错误" br.IsSendEmail = false return } //删除分类 if req.ExcelClassifyId > 0 && req.ExcelInfoId == 0 { //判断是否含有指标 count, err := excel.GetExcelInfoCountByClassifyId(req.ExcelClassifyId) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "删除失败" br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error() return } if count > 0 { br.Msg = "该目录下存在关联ETA表格,不可删除" br.IsSendEmail = false return } classifyItem, err := excel.GetExcelClassifyById(req.ExcelClassifyId) if err != nil { br.Msg = "删除失败" br.ErrMsg = "获取分类失败,Err:" + err.Error() if err.Error() == utils.ErrNoRow() { br.Msg = "分类不存在" br.ErrMsg = "分类不存在" } return } classifyItem.IsDelete = 1 err = classifyItem.Update([]string{"IsDelete"}) if err != nil { br.Msg = "删除失败" br.ErrMsg = "删除失败,Err:" + err.Error() return } } resp := response2.AddExcelInfoResp{} //删除表格 if req.ExcelInfoId > 0 { excelInfo, err := excel.GetExcelInfoById(req.ExcelInfoId) if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "表格已删除,请刷新页面" br.ErrMsg = "表格已删除,请刷新页面" return } else { br.Msg = "删除失败" br.ErrMsg = "删除失败,获取指标信息失败,Err:" + err.Error() return } } if excelInfo == nil { br.Msg = "表格已删除,请刷新页面" br.IsSendEmail = false return } // 删除excel err, errMsg, isSendEmail := excel2.Delete(excelInfo, sysUser) if err != nil { br.Msg = "删除失败" if errMsg != `` { br.Msg = errMsg } br.ErrMsg = "删除失败,Err:" + err.Error() br.IsSendEmail = isSendEmail return } // 返回下一个表格的信息 { var nextItem *excel.ExcelInfo var condition string var pars []interface{} condition += " AND excel_classify_id=? " pars = append(pars, excelInfo.ExcelClassifyId) condition += " AND (sort>? OR (sort=? AND excel_info_id 0 { //上一个兄弟节点 prevClassify, err := excel.GetExcelClassifyById(req.PrevClassifyId) if err != nil { br.Msg = "移动失败" br.ErrMsg = "获取上一个兄弟节点分类信息失败,Err:" + err.Error() return } //如果是移动在两个兄弟节点之间 if req.NextClassifyId > 0 { //下一个兄弟节点 nextClassify, err := excel.GetExcelClassifyById(req.NextClassifyId) if err != nil { br.Msg = "移动失败" br.ErrMsg = "获取下一个兄弟节点分类信息失败,Err:" + err.Error() return } //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1 if prevClassify.Sort == nextClassify.Sort || prevClassify.Sort == ExcelClassifyInfo.Sort { //变更兄弟节点的排序 updateSortStr := `sort + 2` _ = excel.UpdateExcelClassifySortByParentId(prevClassify.ParentId, prevClassify.ExcelClassifyId, prevClassify.Sort, updateSortStr) } else { //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了 if nextClassify.Sort-prevClassify.Sort == 1 { //变更兄弟节点的排序 updateSortStr := `sort + 1` _ = excel.UpdateExcelClassifySortByParentId(prevClassify.ParentId, 0, prevClassify.Sort, updateSortStr) } } } ExcelClassifyInfo.Sort = prevClassify.Sort + 1 ExcelClassifyInfo.ModifyTime = time.Now() updateCol = append(updateCol, "Sort", "ModifyTime") } else { firstClassify, err := excel.GetFirstExcelClassifyByParentId(ExcelClassifyInfo.ParentId) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "移动失败" br.ErrMsg = "获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + err.Error() return } //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序 if firstClassify != nil && firstClassify.Sort == 0 { updateSortStr := ` sort + 1 ` _ = excel.UpdateExcelClassifySortByParentId(firstClassify.ParentId, firstClassify.ExcelClassifyId-1, 0, updateSortStr) } ExcelClassifyInfo.Sort = 0 //那就是排在第一位 ExcelClassifyInfo.ModifyTime = time.Now() updateCol = append(updateCol, "Sort", "ModifyTime") } //更新 if len(updateCol) > 0 { err = ExcelClassifyInfo.Update(updateCol) if err != nil { br.Msg = "移动失败" br.ErrMsg = "修改失败,Err:" + err.Error() return } } br.Ret = 200 br.Success = true br.IsAddLog = true br.Msg = "移动成功" }