Browse Source

fix:报告分类列表接口数据返回三级

Roc 11 months ago
parent
commit
e8fd465001
3 changed files with 335 additions and 35 deletions
  1. 179 34
      controller/eta/classify.go
  2. 76 1
      models/eta/classify.go
  3. 80 0
      services/eta/report_classify.go

+ 179 - 34
controller/eta/classify.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hz_crm_eta/global"
 	"hongze/hz_crm_eta/models/crm"
 	"hongze/hz_crm_eta/models/eta"
+	etaService "hongze/hz_crm_eta/services/eta"
 	"hongze/hz_crm_eta/utils"
 	"time"
 )
@@ -35,26 +36,49 @@ func (this *ClassifyController) ListClassify(c *gin.Context) {
 	}
 
 	keyWord := req.Keyword
-	companyType := req.CompanyType
-	hideDayWeek := req.HideDayWeek
 
-	list, err := eta.GetClassifyList(keyWord, companyType, hideDayWeek)
+	list, err := eta.GetClassifyListByKeyword(keyWord)
 	if err != nil {
 		resp.FailData("获取失败", err.Error(), c)
 		return
 	}
-	finalList := make([]*eta.ClassifyList, 0)
-	parentIds := make([]int, 0)
+
+	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([]*eta.ClassifyListV2, 0)
+
+		tmpList, tmpErr := etaService.GetParentClassifyListByParentIdList(currParentClassifyIdList)
+		if tmpErr != nil {
+			resp.FailData("获取失败", "获取上级分类信息失败,Err:"+err.Error(), c)
+			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 {
-		tmp := new(eta.ClassifyList)
-		tmp.ClassifyListItem = *list[i]
-		finalList = append(finalList, tmp)
-		parentIds = append(parentIds, list[i].Id)
+		classifyIdList = append(classifyIdList, list[i].Id)
 	}
-	parentIdLen := len(parentIds)
+	parentIdLen := len(classifyIdList)
 	if parentIdLen == 0 {
 		data := &eta.ClassifyListResp{
-			List: finalList,
+			List: make([]*eta.ClassifyListV2, 0),
 		}
 		resp.OkData("操作成功", data, c)
 		return
@@ -65,7 +89,7 @@ func (this *ClassifyController) ListClassify(c *gin.Context) {
 	var menuCond string
 	var menuPars []interface{}
 	menuCond += ` classify_id IN (?)`
-	menuPars = append(menuPars, parentIds)
+	menuPars = append(menuPars, classifyIdList)
 	menuOb := new(eta.ClassifyMenu)
 	parentMenus, e := menuOb.GetClassifyMenuList(menuCond, menuPars)
 	if e != nil {
@@ -80,7 +104,7 @@ func (this *ClassifyController) ListClassify(c *gin.Context) {
 	}
 
 	// 获取子分类
-	children, e := eta.GetClassifyChildByParentIds(parentIds, keyWord)
+	children, e := eta.GetClassifyChildByParentIds(classifyIdList, keyWord)
 	if e != nil {
 		resp.FailData("获取失败", "获取子分类失败", c)
 		return
@@ -115,40 +139,161 @@ func (this *ClassifyController) ListClassify(c *gin.Context) {
 		resp.FailData("查询权限失败", e.Error(), c)
 		return
 	}
-	classifyPermissionMap := make(map[string][]int, 0)
+	classifyPermissionMap := make(map[int][]int, 0)
 	if len(permissionList) > 0 {
 		for _, v := range permissionList {
-			classifyPermissionMap[v.KeyWord] = append(classifyPermissionMap[v.KeyWord], v.ChartPermissionId)
+			classifyPermissionMap[v.ClassifyId] = append(classifyPermissionMap[v.ClassifyId], v.ChartPermissionId)
 		}
 	}
-	// 二级分类
-	childrenMap := make(map[int][]*eta.ClassifyItem, 0)
-	for i := range children {
 
-		if childrenMap[children[i].ParentId] == nil {
-			childrenMap[children[i].ParentId] = make([]*eta.ClassifyItem, 0)
-		}
-		tmp := &eta.ClassifyItem{
-			Classify:       *children[i],
-			ClassifyMenuId: relateMap[children[i].Id],
-		}
-		if permissionIds, ok := classifyPermissionMap[children[i].ClassifyName]; ok {
-			tmp.ChartPermissionIdList = permissionIds
+	// 遍历分类并绑定子目录和权限
+	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
 		}
-		childrenMap[children[i].ParentId] = append(childrenMap[children[i].ParentId], tmp)
 	}
 
-	// 一级分类
-	for i := range finalList {
-		finalList[i].ClassifyMenuList = menuListMap[list[i].Id]
-		finalList[i].Child = childrenMap[list[i].Id]
-	}
+	// 先将分类列表排序
+	etaService.SortClassifyListBySortAndCreateTime(list)
+	// 接着转换结构
+	list = etaService.GetClassifyListTreeRecursive(list, 0)
 
 	data := new(eta.ClassifyListResp)
-	data.List = finalList
+	data.List = list
 	resp.OkData("操作成功", data, c)
 }
 
+//func (this *ClassifyController) ListClassify(c *gin.Context) {
+//	var req eta.ClassifyListReq
+//	err := c.Bind(&req)
+//	if err != nil {
+//		errs, ok := err.(validator.ValidationErrors)
+//		if !ok {
+//			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+//			return
+//		}
+//		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+//		return
+//	}
+//
+//	keyWord := req.Keyword
+//	companyType := req.CompanyType
+//	hideDayWeek := req.HideDayWeek
+//
+//	list, err := eta.GetClassifyList(keyWord, companyType, hideDayWeek)
+//	if err != nil {
+//		resp.FailData("获取失败", err.Error(), c)
+//		return
+//	}
+//	finalList := make([]*eta.ClassifyList, 0)
+//	parentIds := make([]int, 0)
+//	for i := range list {
+//		tmp := new(eta.ClassifyList)
+//		tmp.ClassifyListItem = *list[i]
+//		finalList = append(finalList, tmp)
+//		parentIds = append(parentIds, list[i].Id)
+//	}
+//	parentIdLen := len(parentIds)
+//	if parentIdLen == 0 {
+//		data := &eta.ClassifyListResp{
+//			List: finalList,
+//		}
+//		resp.OkData("操作成功", data, c)
+//		return
+//	}
+//
+//	// 获取一级分类-子目录列表
+//	menuListMap := make(map[int][]*eta.ClassifyMenu, 0)
+//	var menuCond string
+//	var menuPars []interface{}
+//	menuCond += ` classify_id IN (?)`
+//	menuPars = append(menuPars, parentIds)
+//	menuOb := new(eta.ClassifyMenu)
+//	parentMenus, e := menuOb.GetClassifyMenuList(menuCond, menuPars)
+//	if e != nil {
+//		resp.FailData("获取失败", "获取一级分类子目录列表失败", c)
+//		return
+//	}
+//	for i := range parentMenus {
+//		if menuListMap[parentMenus[i].ClassifyId] == nil {
+//			menuListMap[parentMenus[i].ClassifyId] = make([]*eta.ClassifyMenu, 0)
+//		}
+//		menuListMap[parentMenus[i].ClassifyId] = append(menuListMap[parentMenus[i].ClassifyId], parentMenus[i])
+//	}
+//
+//	// 获取子分类
+//	children, e := eta.GetClassifyChildByParentIds(parentIds, keyWord)
+//	if e != nil {
+//		resp.FailData("获取失败", "获取子分类失败", c)
+//		return
+//	}
+//	childrenIds := make([]int, 0)
+//	for i := range children {
+//		childrenIds = append(childrenIds, children[i].Id)
+//	}
+//	childrenIdsLen := len(childrenIds)
+//
+//	// 获取二级分类-子目录关联
+//	relateMap := make(map[int]int, 0)
+//	if childrenIdsLen > 0 {
+//		var relateCond string
+//		var relatePars []interface{}
+//		relateCond += ` classify_id IN (?)`
+//		relatePars = append(relatePars, childrenIds)
+//		menuRelationOb := new(eta.ClassifyMenuRelation)
+//		relates, e := menuRelationOb.GetClassifyMenuRelationList(relateCond, relatePars)
+//		if e != nil {
+//			resp.FailData("获取失败", "获取二级分类子目录关联失败, Err: "+e.Error(), c)
+//			return
+//		}
+//		for i := range relates {
+//			relateMap[relates[i].ClassifyId] = relates[i].MenuId
+//		}
+//	}
+//
+//	permissionMappingOb := new(crm.ChartPermissionSearchKeyWordMapping)
+//	permissionList, e := permissionMappingOb.GetPermission()
+//	if e != nil {
+//		resp.FailData("查询权限失败", e.Error(), c)
+//		return
+//	}
+//	classifyPermissionMap := make(map[string][]int, 0)
+//	if len(permissionList) > 0 {
+//		for _, v := range permissionList {
+//			classifyPermissionMap[v.KeyWord] = append(classifyPermissionMap[v.KeyWord], v.ChartPermissionId)
+//		}
+//	}
+//	// 二级分类
+//	childrenMap := make(map[int][]*eta.ClassifyItem, 0)
+//	for i := range children {
+//
+//		if childrenMap[children[i].ParentId] == nil {
+//			childrenMap[children[i].ParentId] = make([]*eta.ClassifyItem, 0)
+//		}
+//		tmp := &eta.ClassifyItem{
+//			Classify:       *children[i],
+//			ClassifyMenuId: relateMap[children[i].Id],
+//		}
+//		if permissionIds, ok := classifyPermissionMap[children[i].ClassifyName]; ok {
+//			tmp.ChartPermissionIdList = permissionIds
+//		}
+//		childrenMap[children[i].ParentId] = append(childrenMap[children[i].ParentId], tmp)
+//	}
+//
+//	// 一级分类
+//	for i := range finalList {
+//		finalList[i].ClassifyMenuList = menuListMap[list[i].Id]
+//		finalList[i].Child = childrenMap[list[i].Id]
+//	}
+//
+//	data := new(eta.ClassifyListResp)
+//	data.List = finalList
+//	resp.OkData("操作成功", data, c)
+//}
+
 // SetEnabled
 // @Title 启用/禁用分类接口
 // @Description 启用/禁用分类

+ 76 - 1
models/eta/classify.go

@@ -156,7 +156,7 @@ type ClassifyListReq struct {
 }
 
 type ClassifyListResp struct {
-	List []*ClassifyList
+	List []*ClassifyListV2
 }
 
 type ClassifySetEnabledReq struct {
@@ -242,3 +242,78 @@ func (c *Classify) UpdateChildClassifyRelateSetting(parentId, relateTel, relateV
 	err = global.MYSQL["rddp"].Exec(sql, relateTel, relateVideo, parentId).Error
 	return
 }
+
+type ClassifyListV2 struct {
+	Id                    int               `orm:"column(id);pk"`
+	ClassifyName          string            `description:"分类名称"`
+	Sort                  int               `description:"排序"`
+	ParentId              int               `description:"父级分类id"`
+	CreateTime            time.Time         `description:"创建时间"`
+	ModifyTime            time.Time         `description:"修改时间"`
+	Abstract              string            `description:"简介"`
+	Descript              string            `description:"描述"`
+	ClassifyLabel         string            `description:"分类标签"`
+	ShowType              int               `description:"展示类型:1-列表 2-专栏"`
+	HasTeleconference     int               `description:"是否有电话会:0-否 1-是"`
+	IsShow                int               `description:"是否在小程序显示:1-显示 0-隐藏"`
+	YbFiccSort            int               `description:"小程序FICC页排序"`
+	YbFiccIcon            string            `description:"小程序FICC页icon"`
+	YbFiccPcIcon          string            `description:"小程序PC端FICC页背景图"`
+	YbIconUrl             string            `description:"小程序已购页icon"`
+	YbBgUrl               string            `description:"小程序已购详情背景图"`
+	YbListImg             string            `description:"小程序研报列表封面图"`
+	YbShareBgImg          string            `description:"小程序研报详情分享背景图"`
+	YbRightBanner         string            `description:"Pc端详情页,右侧,报告合集背景图"`
+	RelateTel             int               `description:"是否在电话会中可选: 0-否; 1-是"`
+	RelateVideo           int               `description:"是否在路演视频中可选: 0-否; 1-是"`
+	Enabled               int               `description:"是否可用,1可用,0禁用"`
+	Child                 []*ClassifyListV2 `gorm:"-"`
+	ClassifyMenuId        int               `description:"二级分类-子目录ID"`
+	ClassifyMenuList      []*ClassifyMenu   `gorm:"-"`
+	ChartPermissionIdList []int             `description:"绑定的权限ID"`
+	Level                 int               `description:"层级"`
+	HasChild              int               `description:"是否有子级别,0:下面没有子分类,1:下面有子分类;默认:0"`
+}
+
+// GetClassifyListByKeyword
+// @Description: 获取分类列表
+// @author: Roc
+// @datetime 2024-06-19 09:49:33
+// @param keyWord string
+// @param enabled int
+// @return items []*ClassifyList
+// @return err error
+func GetClassifyListByKeyword(keyWord string) (items []*ClassifyListV2, err error) {
+	sql := ``
+	pars := make([]interface{}, 0)
+
+	sql = `SELECT * FROM classify WHERE 1=1 `
+
+	if keyWord != `` {
+		sql += ` AND classify_name LIKE ? `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 1)
+	}
+	sql += ` ORDER BY sort ASC, create_time ASC`
+	err = global.MYSQL["rddp"].Raw(sql, pars...).Find(&items).Error
+
+	return
+}
+
+// GetClassifyListByParentIdList
+// @Description: 获取分类列表
+// @author: Roc
+// @datetime 2024-06-19 09:49:33
+// @param keyWord string
+// @param enabled int
+// @return items []*ClassifyList
+// @return err error
+func GetClassifyListByParentIdList(parentClassifyIdList []int) (items []*ClassifyListV2, err error) {
+	num := len(parentClassifyIdList)
+	if num <= 0 {
+		return
+	}
+	sql := `SELECT * FROM classify WHERE id in (?) ORDER BY sort ASC, create_time ASC `
+	err = global.MYSQL["rddp"].Raw(sql, parentClassifyIdList).Find(&items).Error
+
+	return
+}

+ 80 - 0
services/eta/report_classify.go

@@ -5,6 +5,7 @@ import (
 	"hongze/hz_crm_eta/models/eta"
 	"hongze/hz_crm_eta/services/alarm_msg"
 	"hongze/hz_crm_eta/utils"
+	"sort"
 )
 
 // UpdateParentClassifyHasTel 更新父级分类是否含有电话字段
@@ -70,3 +71,82 @@ func UpdateParentClassifyHasTel(classifyId, parentId, hasTeleconference int) (er
 	}
 	return
 }
+
+func GetParentClassifyListByParentIdList(parentClassifyIdList []int) (list []*eta.ClassifyListV2, err error) {
+	num := len(parentClassifyIdList)
+	if num <= 0 {
+		return
+	}
+	list, err = eta.GetClassifyListByParentIdList(parentClassifyIdList)
+	if err != nil {
+		return
+	}
+
+	// 是否还有上级
+	{
+		currParentClassifyIdList := make([]int, 0)
+		for _, v := range list {
+			if v.ParentId > 0 {
+				currParentClassifyIdList = append(currParentClassifyIdList, v.ParentId)
+			}
+		}
+
+		if len(currParentClassifyIdList) > 0 {
+			tmpList, tmpErr := GetParentClassifyListByParentIdList(currParentClassifyIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			list = append(tmpList, list...)
+		}
+	}
+
+	return
+}
+
+// GetClassifyListTreeRecursive
+// @Description: 递归获取分类树形结构
+// @author: Roc
+// @datetime 2024-06-19 13:23:28
+// @param list []*models.ClassifyList
+// @param parentId int
+// @return []*models.ClassifyList
+func GetClassifyListTreeRecursive(list []*eta.ClassifyListV2, parentId int) []*eta.ClassifyListV2 {
+	res := make([]*eta.ClassifyListV2, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			v.Child = GetClassifyListTreeRecursive(list, v.Id)
+			res = append(res, v)
+		}
+	}
+
+	// 前端的JP需要我这么返回
+	if len(res) <= 0 {
+		res = nil
+	}
+
+	return res
+}
+
+// BySortAndCreateTime 用来排序,先按Sort字段升序排序,若Sort相同,则按照CreateTime字段升序排序。
+type BySortAndCreateTime []*eta.ClassifyListV2
+
+func (a BySortAndCreateTime) Len() int {
+	return len(a)
+}
+
+func (a BySortAndCreateTime) Swap(i, j int) {
+	a[i], a[j] = a[j], a[i]
+}
+
+func (a BySortAndCreateTime) Less(i, j int) bool {
+	if a[i].Sort == a[j].Sort {
+		return a[i].CreateTime.Before(a[j].CreateTime)
+	}
+	return a[i].Sort < a[j].Sort
+}
+
+// SortClassifyListBySortAndCreateTime sorts the ClassifyList slice by Sort and then CreateTime in ascending order.
+func SortClassifyListBySortAndCreateTime(classifyList []*eta.ClassifyListV2) {
+	sort.Sort(BySortAndCreateTime(classifyList))
+}