浏览代码

fix: 商家菜单关键词搜索

hsun 1 年之前
父节点
当前提交
5c5d7b5096
共有 2 个文件被更改,包括 67 次插入21 次删除
  1. 51 21
      controllers/eta_business/eta_business_menu.go
  2. 16 0
      services/eta_business/eta_business_menu.go

+ 51 - 21
controllers/eta_business/eta_business_menu.go

@@ -2,13 +2,13 @@ package eta_business
 
 import (
 	"encoding/json"
-	"fmt"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/eta_business"
 	etaBusinessService "hongze/hz_crm_api/services/eta_business"
 	"hongze/hz_crm_api/utils"
 	"html/template"
+	"sort"
 	"strings"
 	"time"
 )
@@ -88,33 +88,63 @@ func (this *EtaBusinessMenuController) List() {
 		}
 	}
 
-	list := make([]*eta_business.EtaBusinessMenu, 0)
-	order := `sort ASC, create_time DESC, menu_id DESC`
-
 	// 关键词
 	keyword := this.GetString("Keyword")
 	keyword = strings.TrimSpace(keyword)
+	keyword = template.HTMLEscapeString(keyword)
+
+	// 所有菜单列表
+	menuOb := new(eta_business.EtaBusinessMenu)
+	order := `sort ASC, create_time DESC, menu_id DESC`
+	menus, e := menuOb.GetItemsByCondition(menuCond, menuPars, []string{}, order)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取商家菜单列表失败, Err: " + e.Error()
+		return
+	}
+
+	list := make([]*eta_business.EtaBusinessMenu, 0)
 	if keyword != "" {
-		keyword = template.HTMLEscapeString(keyword)
-		kw := fmt.Sprint("%", keyword, "%")
-		menus, e := eta_business.GetMenuItemsByKeyword(kw, []string{}, order)
-		if e != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取商家菜单列表失败, Err: " + e.Error()
-			return
+		menuMap := make(map[int]*eta_business.EtaBusinessMenu)
+		parentMap := make(map[int]*eta_business.EtaBusinessMenu)
+		existMap := make(map[int]bool)
+
+		for _, m := range menus {
+			menuMap[m.MenuId] = m
+		}
+		for _, m := range menus {
+			if m.ParentId > 0 {
+				parentMap[m.MenuId] = menuMap[m.ParentId]
+			}
 		}
-		list = menus
-	}
 
-	// 普通查询
-	if keyword == "" {
-		menuOb := new(eta_business.EtaBusinessMenu)
-		menus, e := menuOb.GetItemsByCondition(menuCond, menuPars, []string{}, order)
-		if e != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取商家菜单列表失败, Err: " + e.Error()
-			return
+		// 遍历菜单, 取出跟关键词匹配的菜单(层级比较深, 递归效率很低, 产品要这个需求暂时也没啥办法优化=_=!)
+		for _, m := range menus {
+			if !strings.Contains(m.Name, keyword) {
+				continue
+			}
+			if existMap[m.MenuId] {
+				continue
+			}
+			existMap[m.MenuId] = true
+			list = append(list, m)
+
+			// 取出关键词所匹配的所有父级菜单
+			if m.ParentId > 0 {
+				parents := etaBusinessService.GetMenuParentsRecursive(menus, m.ParentId)
+				for _, p := range parents {
+					if !existMap[p.MenuId] {
+						existMap[p.MenuId] = true
+						list = append(list, p)
+					}
+				}
+			}
 		}
+
+		sort.Slice(list, func(i, j int) bool {
+			return list[j].Sort > list[i].Sort
+		})
+	} else {
 		list = menus
 	}
 

+ 16 - 0
services/eta_business/eta_business_menu.go

@@ -28,3 +28,19 @@ func GetMenuChildrenIdsRecursive(list []*eta_business.EtaBusinessMenu, parentId
 	}
 	return res
 }
+
+// GetMenuParentsRecursive 遍历子菜单的所有父级菜单
+func GetMenuParentsRecursive(list []*eta_business.EtaBusinessMenu, parentId int) []*eta_business.EtaBusinessMenu {
+	res := make([]*eta_business.EtaBusinessMenu, 0)
+	for _, v := range list {
+		if v.MenuId == parentId {
+			res = append(res, v)
+			parents := make([]*eta_business.EtaBusinessMenu, 0)
+			if v.ParentId > 0 {
+				parents = GetMenuParentsRecursive(list, v.ParentId)
+			}
+			res = append(res, parents...)
+		}
+	}
+	return res
+}