|  | @@ -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).
 |