Parcourir la source

system: menu update

Yi il y a 5 jours
Parent
commit
55d0c41de1
3 fichiers modifiés avec 36 ajouts et 128 suppressions
  1. 23 56
      model/system_menu.go
  2. 9 69
      module/backend/system_service.go
  3. 4 3
      module/crontab/neck_ring_health.go

+ 23 - 56
model/system_menu.go

@@ -2,7 +2,6 @@ package model
 
 import (
 	"kpt-pasture/util"
-	"sort"
 	"time"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
@@ -154,22 +153,22 @@ func (s SystemMenuSlice) ToPB() []*pasturePb.SearchMenuRequest {
 }
 
 func (s SystemMenuSlice) ToTree() []*pasturePb.MenuTree {
-	res := make([]*pasturePb.MenuTree, len(s))
-	if 0 == len(s) {
-		return res
+	if len(s) == 0 {
+		return make([]*pasturePb.MenuTree, 0)
 	}
-	// 正排序
-	sort.Slice(s, func(i, j int) bool {
-		return s[i].ParentId < s[j].ParentId
-	})
+
+	// 1. 一次性创建所有节点并建立ID映射
+	nodeMap := make(map[int32]*pasturePb.MenuTree, len(s))
+	allNodes := make([]*pasturePb.MenuTree, len(s))
 
 	for i, v := range s {
-		res[i] = &pasturePb.MenuTree{
+		node := &pasturePb.MenuTree{
 			Id:         int32(v.Id),
 			Path:       v.Path,
 			ParentId:   int32(v.ParentId),
 			Name:       v.Name,
 			ButtonType: v.ButtonType,
+			MenuType:   v.MenuType,
 			Meta: &pasturePb.MenuMeta{
 				Icon:     v.Icon,
 				Title:    v.Title,
@@ -180,63 +179,31 @@ func (s SystemMenuSlice) ToTree() []*pasturePb.MenuTree {
 			},
 			Children: make([]*pasturePb.MenuTree, 0),
 		}
+		allNodes[i] = node
+		nodeMap[node.Id] = node
 	}
-	// 构建树
-	tree := buildTree(res)
-	processMenuType4Nodes(tree)
-	return tree
-}
 
-func buildTree(menuTreeList []*pasturePb.MenuTree) []*pasturePb.MenuTree {
-	tree := make([]*pasturePb.MenuTree, 0)
-	for _, menu := range menuTreeList {
-		if menu.ParentId == 0 {
-			tree = append(tree, menu)
+	// 2. 构建树结构
+	rootNodes := make([]*pasturePb.MenuTree, 0, len(s)/2) // 假设约一半是根节点
+	for _, node := range allNodes {
+		if node.ParentId == 0 {
+			rootNodes = append(rootNodes, node)
 		} else {
-			parent := findByID(menuTreeList, menu.ParentId)
-			if parent != nil {
-				parent.Children = append(parent.Children, menu)
+			if parent, exists := nodeMap[node.ParentId]; exists {
+				parent.Children = append(parent.Children, node)
 			}
 		}
 	}
-	return tree
-}
 
-func findByID(menuTreeList []*pasturePb.MenuTree, id int32) *pasturePb.MenuTree {
-	for _, v := range menuTreeList {
-		if id == v.Id {
-			return v
-		}
-		if child := findByID(v.Children, id); child != nil {
-			return child
-		}
-	}
-	return nil
-}
-
-// 新增函数:处理 menu_type == 4 的节点
-func processMenuType4Nodes(menus []*pasturePb.MenuTree) {
-	// 首先构建一个快速查找表
-	nodeMap := make(map[int32]*pasturePb.MenuTree)
-	buildNodeMap(menus, nodeMap)
-
-	// 遍历所有节点
-	for _, menu := range nodeMap {
-		if menu.MenuType == pasturePb.MenuType_Button && menu.ButtonType > pasturePb.ButtonType_Invalid {
-			parent := nodeMap[menu.ParentId]
-			if parent != nil && parent.Meta != nil {
-				parent.Meta.Auths = append(parent.Meta.Auths, PermissionBtnMap[menu.ButtonType])
+	// 3. 处理特殊节点类型
+	for _, node := range nodeMap {
+		if node.MenuType == pasturePb.MenuType_Button && node.ButtonType > pasturePb.ButtonType_Invalid {
+			if parent, ok := nodeMap[node.ParentId]; ok && parent.Meta != nil {
+				parent.Meta.Auths = append(parent.Meta.Auths, PermissionBtnMap[node.ButtonType])
 			}
 		}
 	}
-}
-
-// 新增函数:构建节点映射表
-func buildNodeMap(menus []*pasturePb.MenuTree, nodeMap map[int32]*pasturePb.MenuTree) {
-	for _, menu := range menus {
-		nodeMap[menu.Id] = menu
-		buildNodeMap(menu.Children, nodeMap)
-	}
+	return rootNodes
 }
 
 type MenuItem struct {

+ 9 - 69
module/backend/system_service.go

@@ -350,27 +350,20 @@ func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUs
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
-	// 根据用户token获取用户数据
-	systemUser, err := s.GetCurrentSystemUser(ctx)
-	if err != nil {
-		return nil, xerr.Custom("该用户数据不存在")
-	}
 
-	systemUserDepthRole, err := s.GetSystemUserDepthRole(ctx, userModel.AppPasture.Id, systemUser.Id)
+	systemUserDepthRole, err := s.GetSystemUserDepthRole(ctx, userModel.AppPasture.Id, userModel.SystemUser.Id)
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
 
 	// 获取用户角色数据
 	systemRoleList := make([]*model.SystemRole, 0)
-	if err = s.DB.Where("id IN ?", systemUserDepthRole.GetRoleIds()).
+	if err = s.DB.Model(new(model.SystemRole)).
+		Where("id IN ?", systemUserDepthRole.GetRoleIds()).
 		Where("pasture_id = ?", userModel.AppPasture.Id).
 		Where("is_delete = ?", pasturePb.IsShow_Ok).
 		Where("is_show = ?", pasturePb.IsShow_Ok).
 		Find(&systemRoleList).Error; err != nil {
-		if errors.Is(err, gorm.ErrRecordNotFound) {
-			return nil, xerr.Custom("该用户角色不存在")
-		}
 		return nil, xerr.WithStack(err)
 	}
 
@@ -378,14 +371,9 @@ func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUs
 		return nil, xerr.Custom("该用户角色不存在")
 	}
 
-	roleIds := make([]int64, 0)
-	for _, role := range systemRoleList {
-		roleIds = append(roleIds, role.Id)
-	}
-
 	systemRoleMenuList := make([]*model.SystemRoleMenu, 0)
 	if err = s.DB.Model(new(model.SystemRoleMenu)).
-		Where("role_id IN ?", roleIds).
+		Where("role_id IN ?", systemUserDepthRole.GetRoleIds()).
 		Find(&systemRoleMenuList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
@@ -557,64 +545,16 @@ func (s *StoreEntry) GetMenusWithParents(ctx context.Context, pastureId int64, m
 		return nil, xerr.Customf("菜单id不能为空")
 	}
 
-	systemPastureMenuList := make([]*model.SystemPastureMenu, 0)
-	if err := s.DB.Model(new(model.SystemPastureMenu)).
-		Where("pasture_id = ?", pastureId).
-		Find(&systemPastureMenuList).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
-	pastureMenuIds := make([]int64, 0)
-	for _, v := range systemPastureMenuList {
-		pastureMenuIds = append(pastureMenuIds, v.MenuId)
-	}
-
-	systemMenuList := make([]*model.SystemMenu, 0)
-	if err := s.DB.Model(new(model.SystemMenu)).
-		Where("id IN ?", pastureMenuIds).
-		Find(&systemMenuList).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
-	systemMenuMap := make(map[int64]*model.SystemMenu)
-	for _, v := range systemMenuList {
-		systemMenuMap[v.Id] = v
-	}
-
+	menuIds = util.DeduplicateInt64(menuIds)
 	userMenuList := make([]*model.SystemMenu, 0)
-	if err := s.DB.Model(new(model.SystemMenu)).
-		Where("id IN ?", menuIds).
+	if err := s.DB.Table(fmt.Sprintf("%s as a", new(model.SystemMenu).TableName())).
+		Select("a.*").
+		Joins("LEFT JOIN system_role_menu as b ON a.id = b.menu_id").
+		Where("b.id IN ?", menuIds).
 		Find(&userMenuList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 
-	// 收集所有需要的菜单ID(包括各级父菜单ID)
-	processed := make(map[int64]struct{}) // 防止重复处理
-	for _, menu := range userMenuList {
-		currentID := menu.Id
-
-		// 向上追溯所有父级菜单
-		for currentID != 0 {
-			// 如果已经处理过,跳过
-			if _, exists := processed[currentID]; exists {
-				break
-			}
-
-			// 添加到结果集
-			menuIds = append(menuIds, currentID)
-			processed[currentID] = struct{}{}
-
-			// 获取父菜单
-			parentMenu, ok := systemMenuMap[currentID]
-			if !ok || parentMenu.ParentId == 0 {
-				break
-			}
-			currentID = parentMenu.ParentId
-		}
-	}
-
-	// 去重
-	menuIds = util.DeduplicateInt64(menuIds)
 	allSystemMenuList := make([]*model.SystemMenu, 0)
 	if err := s.DB.Model(new(model.SystemMenu)).
 		Where("id IN (?) AND is_delete = ?", menuIds, pasturePb.IsShow_Ok).

+ 4 - 3
module/crontab/neck_ring_health.go

@@ -63,10 +63,11 @@ func (e *Entry) HealthWarning(pastureId int64, processIds []int64) {
 		lastHeatDate = habit.HeatDate
 		lastScore = habit.Score
 
-		if isWorse == 1 {
-			newHealthWarning := model.NewNeckRingHealth(habit, sumChew, chew3dago)
-			healthWarningList = append(healthWarningList, newHealthWarning)
+		if isWorse != 1 {
+			continue
 		}
+		newHealthWarning := model.NewNeckRingHealth(habit, sumChew, chew3dago)
+		healthWarningList = append(healthWarningList, newHealthWarning)
 	}
 	if len(healthWarningList) > 0 {
 		e.updateNeckRingHealth(pastureId, healthWarningList)