| 
					
				 | 
			
			
				@@ -286,24 +286,46 @@ func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	systemRoleList := make([]*model.SystemRole, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err = s.DB.Where("id IN ?", systemUser.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) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 获取用户菜单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	systemMenuList := make([]*model.SystemMenu, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err = s.DB.Table(fmt.Sprintf("%s as a", new(model.SystemRoleMenu).TableName())). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Select("b.*"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Joins("LEFT JOIN system_menu AS b ON a.menu_id = b.id"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("a.role_id IN ? and b.is_delete = ?", systemUser.GetRoleIds(), pasturePb.IsShow_Ok). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Order("b.parent_id ASC,b.id ASC"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Group("b.id"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Find(&systemMenuList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(systemRoleList) <= 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		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). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Find(&systemRoleMenuList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(systemRoleMenuList) <= 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return nil, xerr.Custom("该用户角色没有菜单权限") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 菜单Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	menuIds := make([]int64, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, roleMenu := range systemRoleMenuList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		menuIds = append(menuIds, roleMenu.MenuId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 获取用户菜单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	systemMenuList, err := s.GetMenusWithParents(ctx, menuIds) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 获取菜单权限 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return &pasturePb.SystemUserMenuTreeResponse{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Code: http.StatusOK, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -406,245 +428,63 @@ func (s *StoreEntry) SystemUserRoleSave(ctx context.Context, req *pasturePb.Syst 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// SystemRoleCreateOrUpdate 添加角色 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (s *StoreEntry) SystemRoleCreateOrUpdate(ctx context.Context, req *pasturePb.SearchRoleRequest) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	userModel, err := s.GetUserModel(ctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if req.Id > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		systemRole := &model.SystemRole{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err = s.DB.Model(systemRole). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Where("id = ?", req.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Where("pasture_id = ?", userModel.AppPasture.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			First(systemRole).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if systemRole.IsDelete == pasturePb.IsShow_No { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return xerr.Custom("角色已删除") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		systemRole.RoleUpdate(req) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err = s.DB.Model(systemRole). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Select("name", "remarks", "is_show"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Where("id = ?", req.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Where("pasture_id = ?", userModel.AppPasture.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Updates(systemRole).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		newSystemRole := model.NewSystemRole(userModel.AppPasture.Id, req) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err = s.DB.Model(new(model.SystemRole)).Create(newSystemRole).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (s *StoreEntry) GetMenusWithParents(ctx context.Context, menuIds []int64) ([]*model.SystemMenu, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(menuIds) <= 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return nil, xerr.Customf("菜单id不能为空") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 用于存储所有需要查询的菜单ID(包括递归查询的父级ID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	allMenuIDs := make(map[int64]struct{}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 用于存储已经处理过的菜单ID,避免重复处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	processedIDs := make(map[int64]struct{}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// DeleteSystemRole 删除系统角色 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	userModel, err := s.GetUserModel(ctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	systemRole := &model.SystemRole{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err = s.DB.Model(new(model.SystemRole)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("id = ? ", roleId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("pasture_id = ?", userModel.AppPasture.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("is_delete = ?", pasturePb.IsShow_Ok). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		First(systemRole).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 初始化待处理ID队列 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	queue := make([]int64, len(menuIds)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	copy(queue, menuIds) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err = s.DB.Model(systemRole). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Update("is_delete", pasturePb.IsShow_No).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for len(queue) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		currentID := queue[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		queue = queue[1:] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// IsShowSystemRole 角色是否启用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (s *StoreEntry) IsShowSystemRole(ctx context.Context, roleId int64) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	userModel, err := s.GetUserModel(ctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	systemRole := &model.SystemRole{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err = s.DB.Model(new(model.SystemRole)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("id = ?", roleId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("pasture_id = ?", userModel.AppPasture.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("is_delete = ?", pasturePb.IsShow_Ok). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		First(systemRole).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return xerr.Custom("该角色不存在") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 如果已经处理过,跳过 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if _, exists := processedIDs[currentID]; exists { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	isShow := pasturePb.IsShow_No 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if systemRole.IsShow == pasturePb.IsShow_No { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		isShow = pasturePb.IsShow_Ok 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err = s.DB.Model(systemRole).Update("is_show", isShow).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// SearchSystemRoleList 查询系统角色 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *pasturePb.SearchRoleRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchRoleResponse, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	userModel, err := s.GetUserModel(ctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	systemRoleList := make([]*model.SystemRole, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var count int64 = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	pref := s.DB.Model(new(model.SystemRole)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("pasture_id = ?", userModel.AppPasture.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("is_delete = ?", operationPb.IsShow_OK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if req.Name != "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if req.IsShow > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		pref.Where("is_show = ?", req.IsShow) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err = pref.Order("is_show asc,id desc"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Count(&count). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Limit(int(pagination.PageSize)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Offset(int(pagination.PageOffset)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Find(&systemRoleList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return &pasturePb.SearchRoleResponse{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Code: http.StatusOK, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Msg:  "ok", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Data: &pasturePb.SearchRoleData{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Page:     pagination.Page, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Total:    int32(count), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			PageSize: pagination.PageSize, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			List:     model.SystemRoleSlice(systemRoleList).ToPB(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// SearchSystemRoleListByIds 根据id查询角色列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (s *StoreEntry) SearchSystemRoleListByIds(ctx context.Context, pastureId int64, ids []int64) ([]*model.SystemRole, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	systemRoleList := make([]*model.SystemRole, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err := s.DB.Model(new(model.SystemRole)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("pasture_id = ?", pastureId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("is_show = ?", operationPb.IsShow_OK). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Find(&systemRoleList, ids).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return systemRoleList, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// GetRoleMenuList 查询系统角色对应的菜单数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (s *StoreEntry) GetRoleMenuList(ctx context.Context, roleId int64) (*pasturePb.SystemRoleMenuResponse, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	systemRole := &model.SystemRole{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Id: roleId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err := s.DB.First(systemRole).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return nil, xerr.Custom("该数据不存在") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if systemRole.IsDelete == pasturePb.IsShow_No { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return nil, xerr.Custom("该数据已被删除") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	menuList := make([]*model.SystemRoleMenu, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err := s.DB.Where("role_id = ?", systemRole.Id).Find(&menuList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		zaplog.Error("GetSystemRoleMenuList", zap.Any("Err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return &pasturePb.SystemRoleMenuResponse{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Code: http.StatusOK, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Msg:  "ok", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Data: model.SystemRoleMenuSlice(menuList).ToPB(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// RoleMenuSave 保存系统角色对应的菜单数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (s *StoreEntry) RoleMenuSave(ctx context.Context, res *pasturePb.SystemRoleMenuRequest) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	userModel, err := s.GetUserModel(ctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if len(res.MenuIds) <= 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.Custom("请选择菜单") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	systemRole := &model.SystemRole{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err = s.DB.Model(new(model.SystemRole)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("id = ?", res.RoleId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("pasture_id = ?", userModel.AppPasture.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		First(systemRole).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return xerr.Custom("该数据不存在") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if systemRole.IsDelete == pasturePb.IsShow_No { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.Custom("该数据已删除") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if systemRole.IsShow == pasturePb.IsShow_No { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.Custom("该数据已禁用") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err = s.DB.Transaction(func(tx *gorm.DB) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err = tx.Model(new(model.SystemRoleMenu)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Where("role_id = ?", systemRole.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Delete(&model.SystemRoleMenu{}). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 标记为已处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		processedIDs[currentID] = struct{}{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		allMenuIDs[currentID] = struct{}{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 如果不是顶级菜单,查询其父级ID并加入队列 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if currentID != 0 { // 0是顶级菜单的parent_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var parentID int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			err := s.DB.Model(new(model.SystemMenu)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Where("id = ? AND is_delete = 1", currentID). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Pluck("parent_id", &parentID).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return nil, fmt.Errorf("failed to get parent ID for menu %d: %v", currentID, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		newSystemRoleMenuList := model.NewSystemRoleMenu(systemRole.Id, res.MenuIds) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err = tx.Model(new(model.SystemRoleMenu)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Create(newSystemRoleMenuList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if parentID != 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				queue = append(queue, parentID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (s *StoreEntry) SystemRoleList(ctx context.Context) (*pasturePb.GetRoleListResponse, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	userModel, err := s.GetUserModel(ctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 将map中的ID转换为slice 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var ids []int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for id := range allMenuIDs { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ids = append(ids, id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	systemRoleList := make([]*model.SystemRole, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err = s.DB.Model(new(model.SystemRole)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("is_delete = ?", pasturePb.IsShow_Ok). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("pasture_id = ?", userModel.AppPasture.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Find(&systemRoleList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 查询所有需要的菜单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	systemMenuList := make([]*model.SystemMenu, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err := s.DB.Model(new(model.SystemMenu)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Where("id IN (?) AND is_delete = 1", ids). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Order("parent_id ASC,id ASC"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Group("id"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Find(&systemMenuList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return nil, fmt.Errorf("failed to query menus: %v", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return &pasturePb.GetRoleListResponse{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Code: http.StatusOK, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Msg:  "ok", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Data: model.SystemRoleSlice(systemRoleList).ToPB(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	}, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return systemMenuList, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |