package controllers import ( "encoding/json" "eta/eta_api/models" "eta/eta_api/models/report_approve" "eta/eta_api/services" "eta/eta_api/utils" "fmt" ) // 分类 type ClassifyController struct { BaseAuthController } // @Title 新增分类接口 // @Description 新增分类 // @Param request body models.ClassifyAddReq true "type json string" // @Success 200 新增成功 // @router /add [post] func (this *ClassifyController) Add() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req models.ClassifyAddReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } // 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填 /*menus, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, ``) if e != nil { br.Msg = "保存失败" br.ErrMsg = "获取菜单列表失败, Err: " + e.Error() return } menuMap := make(map[string]bool) for _, m := range menus { if m.ButtonCode != "" { menuMap[m.ButtonCode] = true } }*/ if req.ClassifyName == "" { br.Msg = "分类名称不可为空" return } // 新增分类 err, errMsg, isSentEmail := services.AddReportClassify(req.ClassifyName, req.ParentId, req.ChartPermissionIdList) if err != nil { br.Msg = "添加失败" if errMsg != "" { br.Msg = errMsg } br.ErrMsg = "添加失败,Err:" + err.Error() br.IsSendEmail = isSentEmail return } br.Ret = 200 br.Success = true br.Msg = "新增成功" } // @Title 删除分类-检测接口 // @Description 删除分类-信息检测,是否符合删除条件 // @Param ClassifyId query int true "分类ID" // @Success 200 {object} models.CheckDeleteClassifyResp // @router /checkDeleteClassify [get] func (this *ClassifyController) CheckDeleteClassify() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() classifyId, err := this.GetInt("ClassifyId") if classifyId <= 0 { br.Msg = "参数错误" return } classify, err := models.GetClassifyById(classifyId) if err != nil { br.Msg = "获取信息失败" br.ErrMsg = "获取信息失败,Err:" + err.Error() return } resp := new(models.CheckDeleteClassifyResp) if classify == nil { br.Msg = "分类不存在" resp.Code = 1 resp.Msg = "分类不存在" br.Data = resp br.Ret = 200 br.Success = true return } //判断分类是否关联了报告 if classify.ParentId > 0 { count, err := models.GetReportCountByClassifyId(classifyId) if err != nil { br.Msg = "获取信息失败" br.ErrMsg = "获取信息失败,Err:" + err.Error() return } if count > 0 { resp.Code = 2 resp.Msg = "该分类有关联报告,不允许删除" br.Data = resp br.Ret = 200 br.Msg = "该分类有关联报告,不允许删除" br.Success = true return } } else { subCount, err := models.GetClassifySubCountByClassifyId(classifyId) if err != nil { br.Msg = "获取信息失败" br.ErrMsg = "获取信息失败,Err:" + err.Error() return } if subCount > 0 { resp.Code = 3 resp.Msg = "二级分类有关联报告,不允许删除" br.Data = resp br.Ret = 200 br.Msg = "二级分类有关联报告,不允许删除" br.Success = true return } subTotal, err := models.GetClassifySubCountByParentId(classifyId) if err != nil { br.Msg = "获取信息失败" br.ErrMsg = "获取信息失败,Err:" + err.Error() return } if subTotal > 0 { resp.Code = 4 resp.Msg = "请先删除该分类下关联分类" br.Data = resp br.Ret = 200 br.Msg = "请先删除该分类下关联分类" br.Success = true return } } // 查询该分类是否关联了审批流 flowOb := new(report_approve.ReportApproveFlow) flowCond := fmt.Sprintf(` AND (%s = ? OR %s = ?) AND (%s = ? OR %s = ?)`, report_approve.ReportApproveFlowCols.ReportType, report_approve.ReportApproveFlowCols.ReportType, report_approve.ReportApproveFlowCols.ClassifyFirstId, report_approve.ReportApproveFlowCols.ClassifySecondId) flowPars := make([]interface{}, 0) flowPars = append(flowPars, report_approve.FlowReportTypeChinese, report_approve.FlowReportTypeSmart, classifyId, classifyId) flowCount, e := flowOb.GetCountByCondition(flowCond, flowPars) if e != nil { br.Msg = "检测失败" br.ErrMsg = "获取关联审批流失败, Err: " + e.Error() return } if flowCount > 0 { resp.Code = 5 resp.Msg = "该分类关联审批流,不允许删除" br.Data = resp br.Ret = 200 br.Msg = resp.Msg br.Success = true return } resp.Code = 0 resp.Msg = "检测完成,可进行删除操作" br.Ret = 200 br.Data = resp br.Success = true br.Msg = "检测成功" } // @Title 删除分类接口 // @Description 删除分类 // @Param request body models.DeleteClassifyReq true "type json string" // @Success 200 Ret=200,删除成功 // @router /delete [post] func (this *ClassifyController) Delete() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req models.DeleteClassifyReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ClassifyId <= 0 { br.Msg = "参数错误" return } item, err := models.GetClassifyById(req.ClassifyId) if err != nil { br.Msg = "获取信息失败" br.ErrMsg = "获取信息失败,Err:" + err.Error() return } if item == nil { br.Msg = "分类不存在" return } classifyList := &models.ClassifyList{Id: item.Id} err = services.MarkEnableDeleteClassify([]*models.ClassifyList{classifyList}) if err != nil { br.Msg = "删除失败" br.ErrMsg = "标记失败,Err:" + err.Error() return } if classifyList.IsEnableDelete == 0 { br.Msg = "该分类有关联报告或审批流,不允许删除" return } var childClassifyIds []int if item.HasChild == 1 { // 获取所有子分类 subClassifyMap := make(map[int][]int) allClassify, err := models.GetAllClassifyWithDesc() if err != nil { br.Msg = "删除失败" br.ErrMsg = "获取信息失败,Err:" + err.Error() return } for _, classify := range allClassify { v, ok := subClassifyMap[classify.Id] if !ok { subClassifyMap[classify.Id] = []int{} } pv, pok := subClassifyMap[classify.ParentId] if pok { subClassifyMap[classify.ParentId] = append(pv, classify.Id) } else { subClassifyMap[classify.ParentId] = []int{classify.Id} } if ok { subClassifyMap[classify.ParentId] = append(subClassifyMap[classify.ParentId], v...) } } childClassifyIds = subClassifyMap[item.Id] } err = item.Delete(childClassifyIds) if err != nil { br.Msg = "删除失败" br.ErrMsg = "删除失败,Err:" + err.Error() return } // 被删除是二级分类且关联电话会时, 同步FICC活动分类 //if item.ParentId > 0 && item.RelateTel == 1 { // go func() { // _ = yb.SyncClassifyAndFiccActivityType() // }() //} br.Ret = 200 br.Success = true br.Msg = "删除成功" } // @Title 修改分类接口 // @Description 修改分类 // @Param request body models.EditClassifyReq true "type json string" // @Success 200 Ret=200,修改成功 // @router /edit [post] func (this *ClassifyController) Edit() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req models.EditClassifyReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ClassifyId <= 0 { br.Msg = "参数错误" return } if req.ClassifyName == "" { br.Msg = "分类名称不可为空" return } // 修改分类 err, errMsg, isSentEmail := services.EditReportClassify(req.ClassifyId, req.ClassifyName, req.ChartPermissionIdList) if err != nil { br.Msg = "修改失败" if errMsg != "" { br.Msg = errMsg } br.ErrMsg = "修改失败,Err:" + err.Error() br.IsSendEmail = isSentEmail return } br.Ret = 200 br.Success = true br.Msg = "修改成功" } // ParentClassify // @Title 获取父级分类接口 // @Description 获取父级分类 // @Success 200 {object} models.Classify // @router /parent [get] func (this *ClassifyController) ParentClassify() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() items, err := models.GetAllClassify() if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } classifyIds := make([]int, 0) for i := range items { classifyIds = append(classifyIds, items[i].Id) } classifyLen := len(classifyIds) if classifyLen == 0 { br.Ret = 200 br.Success = true br.Msg = "获取成功" return } // 获取一级分类-子目录列表 menuListMap := make(map[int][]*models.ClassifyMenu, 0) var menuCond string var menuPars []interface{} menuCond += ` AND classify_id IN (` + utils.GetOrmInReplace(classifyLen) + `)` menuPars = append(menuPars, classifyIds) parentMenus, e := models.GetClassifyMenuList(menuCond, menuPars) if e != nil { br.Msg = "获取失败" br.ErrMsg = "获取一级分类子目录列表失败" return } for i := range parentMenus { if menuListMap[parentMenus[i].ClassifyId] == nil { menuListMap[parentMenus[i].ClassifyId] = make([]*models.ClassifyMenu, 0) } menuListMap[parentMenus[i].ClassifyId] = append(menuListMap[parentMenus[i].ClassifyId], parentMenus[i]) } resp := make([]*models.ClassifyItem, 0) for i := range items { resp = append(resp, &models.ClassifyItem{ Classify: *items[i], ClassifyMenuList: menuListMap[items[i].Id], }) } resp = services.GetClassifyTreeRecursive(resp, 0) br.Data = resp br.Ret = 200 br.Success = true br.Msg = "获取成功" } // @Title 根据id获取分类详情接口 // @Description 根据id获取分类详情 // @Param request body models.FindByIdClassifyReq true "type json string" // @Success 200 {object} models.Classify // @router /findById [get] func (this *ClassifyController) FindByIdClassify() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req models.FindByIdClassifyReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } items, err := models.FindByIdClassify(req.ClassifyId) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } br.Data = items br.Ret = 200 br.Success = true br.Msg = "获取成功" } // @Title 获取分类列表 // @Description 获取分类列表 // @Param KeyWord query string true "检索关键词" // @Param CompanyType query string false "产品类型,枚举值:'ficc','权益';不传默认返回全部" // @Param HideDayWeek query int false "是否隐藏晨周报" // @Success 200 {object} models.Classify // @router /list [get] func (this *ClassifyController) ListClassify() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() keyWord := this.GetString("KeyWord") reqEnabled, _ := this.GetInt("Enabled", -1) enabled := -1 if reqEnabled == 1 { enabled = reqEnabled } list, err := models.GetClassifyListByKeyword(keyWord, enabled) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } if keyWord != `` { idMap := make(map[int]bool) currParentClassifyIdList := make([]int, 0) for _, v := range list { idMap[v.Id] = true if v.ParentId > 0 { currParentClassifyIdList = append(currParentClassifyIdList, v.ParentId) } } findList := list list = make([]*models.ClassifyList, 0) tmpList, tmpErr := services.GetParentClassifyListByParentIdList(currParentClassifyIdList) if tmpErr != nil { br.Msg = "获取失败" br.ErrMsg = "获取上级分类信息失败,Err:" + tmpErr.Error() return } for _, v := range tmpList { if _, ok := idMap[v.Id]; !ok { list = append(list, v) } } list = append(list, findList...) } classifyIdList := make([]int, 0) for i := range list { classifyIdList = append(classifyIdList, list[i].Id) } parentIdLen := len(classifyIdList) if parentIdLen == 0 { resp := &models.ClassifyListResp{ List: list, } br.Data = resp br.Ret = 200 br.Success = true br.Msg = "获取成功" return } // 获取子目录列表 menuListMap := make(map[int][]*models.ClassifyMenu, 0) var menuCond string var menuPars []interface{} menuCond += ` AND classify_id IN (` + utils.GetOrmInReplace(parentIdLen) + `)` menuPars = append(menuPars, classifyIdList) parentMenus, e := models.GetClassifyMenuList(menuCond, menuPars) if e != nil { br.Msg = "获取失败" br.ErrMsg = "获取一级分类子目录列表失败" return } for i := range parentMenus { if menuListMap[parentMenus[i].ClassifyId] == nil { menuListMap[parentMenus[i].ClassifyId] = make([]*models.ClassifyMenu, 0) } menuListMap[parentMenus[i].ClassifyId] = append(menuListMap[parentMenus[i].ClassifyId], parentMenus[i]) } // 分类与子目录关联 relateMap := make(map[int]int, 0) { var relateCond string var relatePars []interface{} relateCond += ` AND classify_id IN (` + utils.GetOrmInReplace(parentIdLen) + `)` relatePars = append(relatePars, classifyIdList) relates, e := models.GetClassifyMenuRelationList(relateCond, relatePars) if e != nil { br.Msg = "获取失败" br.ErrMsg = "获取二级分类子目录关联失败, Err: " + e.Error() return } for i := range relates { relateMap[relates[i].ClassifyId] = relates[i].MenuId } } // 查询分类绑定的权限 permissionList, _ := models.GetAllPermissionMapping() classifyPermissionMap := make(map[int][]int) if len(permissionList) > 0 { for _, v := range permissionList { classifyPermissionMap[v.ClassifyId] = append(classifyPermissionMap[v.ClassifyId], v.ChartPermissionId) } } // 遍历分类并绑定子目录和权限 for i, v := range list { list[i].ClassifyMenuList = menuListMap[v.Id] list[i].ClassifyMenuId = relateMap[v.Id] if permissionIds, ok := classifyPermissionMap[v.Id]; ok { list[i].ChartPermissionIdList = permissionIds } } err = services.MarkEnableDeleteClassify(list) if err != nil { br.Msg = "获取失败" br.ErrMsg = "标记可删除分类失败,Err:" + err.Error() return } // 先将分类列表排序 services.SortClassifyListBySortAndCreateTime(list) // 接着转换结构 list = services.GetClassifyListTreeRecursive(list, 0) resp := new(models.ClassifyListResp) resp.List = list br.Data = resp br.Ret = 200 br.Success = true br.Msg = "获取成功" } // ClassifyPermission // @Title 获取分类权限列表 // @Description 获取分类权限列表 // @Param ClassifyId query int true "分类id" // @Success 200 {object} []models.ChartPermissionSearchKeyWordMapping // @router /permission_list [get] func (this *ClassifyController) ClassifyPermission() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() classifyId, _ := this.GetInt("ClassifyId") if classifyId <= 0 { br.Msg = "参数错误" return } //获取报告分类详情 classifyInfo, err := models.GetClassifyById(classifyId) if err != nil { br.Msg = "获取分类信息失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } //获取报告分类权限列表 list, err := models.GetPermissionByClassifyId(classifyInfo.Id) if err != nil { br.Msg = "获取分类信息失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } br.Data = list br.Ret = 200 br.Success = true br.Msg = "获取成功" } // EditClassifyPermission // @Title 编辑分类权限 // @Description 编辑分类权限 // @Param ClassifyId query int true "分类id" // @Success 200 {object} models.EditClassifyPermissionReq // @router /permission/edit [post] func (this *ClassifyController) EditClassifyPermission() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req models.EditClassifyPermissionReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ClassifyId <= 0 { br.Msg = "参数错误" return } if len(req.ChartPermissionIdList) <= 0 { br.Msg = "请选择权限" return } //获取报告分类详情 classifyInfo, err := models.GetClassifyById(req.ClassifyId) if err != nil { br.Msg = "获取分类信息失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } //获取报告分类权限列表 err = models.EditChartPermissionSearchKeyWordMappingMulti(classifyInfo.ClassifyName, req.ChartPermissionIdList, req.ClassifyId) if err != nil { br.Msg = "修改分类权限失败" br.ErrMsg = "修改分类权限失败,Err:" + err.Error() return } go func() { _ = services.EditClassifyChartPermissionSync(classifyInfo.ClassifyName, req.ClassifyId) }() // 是关联电话会二级分类修改了权限, 同步关联报告电话会的分类 //if classifyInfo.ParentId > 0 && classifyInfo.RelateTel == 1 { // go func() { // _ = yb.SyncClassifyAndFiccActivityType() // }() //} br.Ret = 200 br.Success = true br.Msg = "修改成功" } // @Title 含电话会分类列表 // @Description 含电话会分类列表 // @Success 200 {object} models.Classify // @router /tel_list [get] func (this *ClassifyController) TelListClassify() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() resp := make([]*models.SimpleClassifyList, 0) var condition, orderRule string var pars []interface{} if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox { condition += ` AND classify_name <> '晨报' AND classify_name <> '周报' ` } telList, e := models.GetClassifyByCondition(condition, orderRule, pars) if e != nil { return } firstList := make([]*models.SimpleClassifyList, 0) secondList := make([]*models.SimpleClassifyList, 0) secondMap := make(map[int][]*models.SimpleClassifyList, 0) for i := range telList { if telList[i].ParentId == 0 { firstList = append(firstList, telList[i]) } else { secondList = append(secondList, telList[i]) secondMap[telList[i].ParentId] = append(secondMap[telList[i].ParentId], telList[i]) } } for i := range firstList { firstList[i].Child = secondMap[firstList[i].Id] } resp = firstList br.Data = resp br.Ret = 200 br.Success = true br.Msg = "获取成功" } // Move // @Title 移动分类接口 // @Description 移动分类 // @Param request body models.ClassifyMoveReq true "type json string" // @Success 200 新增成功 // @router /move [post] func (this *ClassifyController) Move() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req models.ClassifyMoveReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ClassifyId <= 0 { br.Msg = "请选择分类" return } e, msg := services.MoveReportClassify(req) if e != nil { br.Msg = msg br.ErrMsg = "移动分类失败, Err: " + e.Error() return } br.Ret = 200 br.Success = true br.Msg = "操作成功" } // SetEnabled // @Title 启用/禁用分类接口 // @Description 启用/禁用分类 // @Param request body models.ClassifyMoveReq true "type json string" // @Success 200 新增成功 // @router /enabled/set [post] func (this *ClassifyController) SetEnabled() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req models.ClassifySetEnabledReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.ClassifyId <= 0 { br.Msg = "请选择分类" return } if req.Enabled != 0 && req.Enabled != 1 { br.Msg = "请选择正确的启用禁用状态" return } item, err := models.GetClassifyById(req.ClassifyId) if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "分类不存在" return } br.Msg = "获取信息失败" br.ErrMsg = "获取信息失败,Err:" + err.Error() return } if item == nil { br.Msg = "分类不存在" return } ob := new(models.Classify) //设置分类启用、禁用状态 err = ob.SetEnabled(req.ClassifyId, req.Enabled) if err != nil { br.Msg = "操作失败" br.ErrMsg = "操作失败,Err:" + err.Error() return } br.Ret = 200 br.Success = true br.Msg = "操作成功" } // ClassifyPermissionV2 // @Title 获取权限设置基础信息 // @Description 获取权限设置基础信息接口 // @Param CompanyType query string true "客户类型:传空字符串或者不传为全部,'ficc','权益'" // @Param NoUpgrade query bool false "是否不展示升级权限,默认为 false" // @Success 200 {object} company.PermissionSetResp // @router /permission/list [get] func (this *ClassifyController) ClassifyPermissionV2() { 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 } classifyId, _ := this.GetInt("ClassifyId") if classifyId <= 0 { br.Msg = "参数错误" return } resp := make([]*models.ChartPermissionItem, 0) // 拥有的品种ID列表 permissionIdMap := make(map[int]bool) { //获取报告分类详情 classifyInfo, err := models.GetClassifyById(classifyId) if err != nil { br.Msg = "获取分类信息失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } //获取报告分类权限列表 list, err := models.GetPermission(classifyInfo.Id) if err != nil { br.Msg = "获取分类信息失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } for _, v := range list { permissionIdMap[v.ChartPermissionId] = true } } // 没有关联品种时,直接返回 num := len(permissionIdMap) if num <= 0 { br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp return } cond := ` and product_id = ?` pars := make([]interface{}, 0) pars = append(pars, 1) list, e := services.GetChartPermissionList(cond, pars) if e != nil { br.Msg = "获取失败" br.ErrMsg = "获取品种列表失败, Err: " + e.Error() return } // 品种树 childMap := make(map[int][]*models.ChartPermissionItem) tmpResp := make([]*models.ChartPermissionItem, 0) for _, v := range list { t := new(models.ChartPermissionItem) t.PermissionId = v.ChartPermissionId t.PermissionName = v.PermissionName t.ParentId = v.ParentId t.IsPublic = v.IsPublic t.Enabled = v.Enabled t.Sort = v.Sort t.CreateTime = v.CreatedTime.Format(utils.FormatDateTime) t.Child = make([]*models.ChartPermissionItem, 0) if v.ParentId == 0 { tmpResp = append(tmpResp, t) continue } if v.ParentId > 0 { if _, ok := permissionIdMap[v.ChartPermissionId]; ok { if childMap[v.ParentId] == nil { childMap[v.ParentId] = make([]*models.ChartPermissionItem, 0) } childMap[v.ParentId] = append(childMap[v.ParentId], t) } } } for _, r := range tmpResp { childList, ok := childMap[r.PermissionId] if !ok { continue } r.Child = childList resp = append(resp, r) } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // 处理禅道bug6445,对数据进行补偿刷新 /*func init() { err := services.DealBug6445() if err != nil { return } } */