Browse Source

分类逻辑改版

hsun 5 months ago
parent
commit
829bcbf2fa
3 changed files with 199 additions and 94 deletions
  1. 160 90
      controllers/classify.go
  2. 37 3
      controllers/ppt_report.go
  3. 2 1
      models/classify.go

+ 160 - 90
controllers/classify.go

@@ -6,6 +6,8 @@ import (
 	"eta_gn/eta_api/services"
 	"eta_gn/eta_api/utils"
 	"fmt"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -458,110 +460,178 @@ func (this *ClassifyController) ListClassify() {
 		enabled = reqEnabled
 	}
 
-	list, err := models.GetClassifyListByKeyword(keyWord, enabled, classifyType)
+	//list, err := models.GetClassifyListByKeyword(keyWord, enabled, classifyType)
+	//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
+	//	}
+	//}
+
+	// 获取所有分类
+	originList, err := models.GetClassifyListByKeyword("", enabled, 0)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	list := originList
 
-	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
+	// 指定分类类型(上级中的分类类型可能与最下层的不一致,但是要把上级也一起取出来, 这需求...=_=!)
+	if classifyType > 0 {
 		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)
+		// 先取出指定分类以及他对应的LevelPath中的所有ID
+		classifyIds := make([]int, 0)
+		for _, v := range originList {
+			if v.ClassifyType != classifyType {
+				continue
+			}
+			pathArr := strings.Split(v.LevelPath, ",")
+			for _, p := range pathArr {
+				id, _ := strconv.Atoi(p)
+				if id <= 0 {
+					continue
+				}
+				if utils.InArrayByInt(classifyIds, id) {
+					continue
+				}
+				classifyIds = append(classifyIds, id)
 			}
 		}
 
-		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
+		// 过滤掉不在ID中的
+		for _, v := range originList {
+			if !utils.InArrayByInt(classifyIds, v.Id) {
+				continue
+			}
+			list = append(list, v)
 		}
 	}
 
-	// 查询分类绑定的权限
-	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)
+	// 有关键词,那么按照上面的方法再筛一遍
+	keyWord = strings.TrimSpace(keyWord)
+	if keyWord != `` {
+		classifyIds := make([]int, 0)
+		for _, v := range list {
+			if !strings.Contains(v.ClassifyName, keyWord) {
+				continue
+			}
+			pathArr := strings.Split(v.LevelPath, ",")
+			for _, p := range pathArr {
+				id, _ := strconv.Atoi(p)
+				if id <= 0 {
+					continue
+				}
+				if utils.InArrayByInt(classifyIds, id) {
+					continue
+				}
+				classifyIds = append(classifyIds, id)
+			}
 		}
-	}
-	// 遍历分类并绑定子目录和权限
-	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
+		for _, v := range originList {
+			if !utils.InArrayByInt(classifyIds, v.Id) {
+				continue
+			}
+			list = append(list, v)
 		}
 	}
 

+ 37 - 3
controllers/ppt_report.go

@@ -56,7 +56,7 @@ func (this *PptV2Controller) ReportClassify() {
 			pars = append(pars, utils.ReportSourceOuter)
 		}
 		pptOb := new(models.PptV2)
-		list, e := pptOb.GetItemsByCondition(cond, pars, models.PptReportQueryFields, "")
+		list, e := pptOb.GetItemsByCondition(cond, pars, models.PptReportQueryFields, "modify_time DESC")
 		if e != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = fmt.Sprintf("获取PPT失败, %v", e)
@@ -103,8 +103,9 @@ func (this *PptV2Controller) ReportClassify() {
 	// 获取分类
 	classifies := make([]*models.Classify, 0)
 	{
+		// 获取所有分类
 		ob := new(models.Classify)
-		cond := ` AND enabled = ? AND classify_type = ?`
+		cond := ` AND enabled = ?`
 		pars := make([]interface{}, 0)
 		pars = append(pars, 1, utils.ReportTypePPT)
 		list, e := ob.GetItemsByCondition(cond, pars, []string{}, "sort ASC, create_time ASC")
@@ -113,8 +114,41 @@ func (this *PptV2Controller) ReportClassify() {
 			br.ErrMsg = fmt.Sprintf("获取分类失败, %v", e)
 			return
 		}
-		classifies = list
+
+		// 上级中的分类类型可能与最下层的不一致,但是要把上级也一起取出来, 所以这里要过滤一遍
+		classifyIds := make([]int, 0)
+		for _, v := range list {
+			if v.ClassifyType != utils.ReportTypePPT {
+				continue
+			}
+			// 没有PPT的分类也都过滤掉
+			//if len(classifyPpt[v.Id]) == 0 {
+			//	continue
+			//}
+
+			// 根据LevelPath去处理
+			pathArr := strings.Split(v.LevelPath, ",")
+			for _, p := range pathArr {
+				id, _ := strconv.Atoi(p)
+				if id <= 0 {
+					continue
+				}
+				if utils.InArrayByInt(classifyIds, id) {
+					continue
+				}
+				classifyIds = append(classifyIds, id)
+			}
+		}
+
+		// 过滤掉不在ID中的
+		for _, v := range list {
+			if !utils.InArrayByInt(classifyIds, v.Id) {
+				continue
+			}
+			classifies = append(classifies, v)
+		}
 	}
+
 	resp = services.GetPptReportClassifyTreeRecursive(classifies, 0, classifyPpt)
 
 	br.Data = resp

+ 2 - 1
models/classify.go

@@ -157,7 +157,8 @@ type ClassifyList struct {
 	Child                 []*ClassifyList `gorm:"-"`
 	ClassifyMenuId        int             `gorm:"-"` //`description:"二级分类-子目录ID"`
 	ClassifyMenuList      []*ClassifyMenu `gorm:"-"`
-	ChartPermissionIdList []int           `gorm:"-"` //`description:"绑定的权限ID"`
+	ChartPermissionIdList []int           `gorm:"-"`                                   //`description:"绑定的权限ID"`
+	LevelPath             string          `gorm:"column:level_path" json:"level_path"` //`description:"分类的层级路径,英文逗号分隔"`
 }
 
 type ClassifyItem struct {