You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
7.6 KiB
229 lines
7.6 KiB
package service |
|
|
|
import ( |
|
"fmt" |
|
"gofaster/internal/auth/model" |
|
"gofaster/internal/auth/repository" |
|
|
|
"go.uber.org/zap" |
|
) |
|
|
|
// MenuGroupService 菜单分组服务 |
|
type MenuGroupService struct { |
|
menuGroupRepo *repository.MenuGroupRepository |
|
logger *zap.Logger |
|
} |
|
|
|
// NewMenuGroupService 创建菜单分组服务实例 |
|
func NewMenuGroupService(menuGroupRepo *repository.MenuGroupRepository, logger *zap.Logger) *MenuGroupService { |
|
return &MenuGroupService{ |
|
menuGroupRepo: menuGroupRepo, |
|
logger: logger, |
|
} |
|
} |
|
|
|
// CreateMenuGroup 创建菜单分组 |
|
func (s *MenuGroupService) CreateMenuGroup(menuGroup *model.MenuGroup) error { |
|
s.logger.Info("开始创建菜单分组", zap.String("name", menuGroup.Name)) |
|
|
|
// 检查名称是否已存在 |
|
if s.menuGroupRepo.ExistsByName(menuGroup.Name) { |
|
return fmt.Errorf("菜单分组名称已存在: %s", menuGroup.Name) |
|
} |
|
|
|
// 设置默认值 |
|
if menuGroup.Sort == 0 { |
|
menuGroup.Sort = 999 // 默认排序值 |
|
} |
|
if menuGroup.Status == 0 { |
|
menuGroup.Status = 1 // 默认启用 |
|
} |
|
|
|
if err := s.menuGroupRepo.Create(menuGroup); err != nil { |
|
s.logger.Error("创建菜单分组失败", zap.Error(err)) |
|
return fmt.Errorf("创建菜单分组失败: %w", err) |
|
} |
|
|
|
s.logger.Info("菜单分组创建成功", zap.String("name", menuGroup.Name), zap.Uint("id", menuGroup.ID)) |
|
return nil |
|
} |
|
|
|
// GetMenuGroupByID 根据ID获取菜单分组 |
|
func (s *MenuGroupService) GetMenuGroupByID(id uint) (*model.MenuGroup, error) { |
|
menuGroup, err := s.menuGroupRepo.FindByID(id) |
|
if err != nil { |
|
s.logger.Error("获取菜单分组失败", zap.Uint("id", id), zap.Error(err)) |
|
return nil, fmt.Errorf("获取菜单分组失败: %w", err) |
|
} |
|
return menuGroup, nil |
|
} |
|
|
|
// GetMenuGroupByName 根据名称获取菜单分组 |
|
func (s *MenuGroupService) GetMenuGroupByName(name string) (*model.MenuGroup, error) { |
|
menuGroup, err := s.menuGroupRepo.FindByName(name) |
|
if err != nil { |
|
s.logger.Error("获取菜单分组失败", zap.String("name", name), zap.Error(err)) |
|
return nil, fmt.Errorf("获取菜单分组失败: %w", err) |
|
} |
|
return menuGroup, nil |
|
} |
|
|
|
// ListMenuGroups 获取菜单分组列表 |
|
func (s *MenuGroupService) ListMenuGroups() ([]*model.MenuGroup, error) { |
|
menuGroups, err := s.menuGroupRepo.List() |
|
if err != nil { |
|
s.logger.Error("获取菜单分组列表失败", zap.Error(err)) |
|
return nil, fmt.Errorf("获取菜单分组列表失败: %w", err) |
|
} |
|
return menuGroups, nil |
|
} |
|
|
|
// ListMenuGroupsByStatus 根据状态获取菜单分组列表 |
|
func (s *MenuGroupService) ListMenuGroupsByStatus(status int) ([]*model.MenuGroup, error) { |
|
menuGroups, err := s.menuGroupRepo.ListByStatus(status) |
|
if err != nil { |
|
s.logger.Error("根据状态获取菜单分组列表失败", zap.Int("status", status), zap.Error(err)) |
|
return nil, fmt.Errorf("根据状态获取菜单分组列表失败: %w", err) |
|
} |
|
return menuGroups, nil |
|
} |
|
|
|
// UpdateMenuGroup 更新菜单分组 |
|
func (s *MenuGroupService) UpdateMenuGroup(menuGroup *model.MenuGroup) error { |
|
s.logger.Info("开始更新菜单分组", zap.Uint("id", menuGroup.ID), zap.String("name", menuGroup.Name)) |
|
|
|
// 检查菜单分组是否存在 |
|
existing, err := s.menuGroupRepo.FindByID(menuGroup.ID) |
|
if err != nil { |
|
s.logger.Error("菜单分组不存在", zap.Uint("id", menuGroup.ID), zap.Error(err)) |
|
return fmt.Errorf("菜单分组不存在: %w", err) |
|
} |
|
|
|
// 检查名称是否已被其他记录使用 |
|
if s.menuGroupRepo.ExistsByName(menuGroup.Name, menuGroup.ID) { |
|
return fmt.Errorf("菜单分组名称已存在: %s", menuGroup.Name) |
|
} |
|
|
|
// 更新字段 |
|
existing.Name = menuGroup.Name |
|
existing.Description = menuGroup.Description |
|
existing.Sort = menuGroup.Sort |
|
existing.Status = menuGroup.Status |
|
|
|
if err := s.menuGroupRepo.Update(existing); err != nil { |
|
s.logger.Error("更新菜单分组失败", zap.Error(err)) |
|
return fmt.Errorf("更新菜单分组失败: %w", err) |
|
} |
|
|
|
s.logger.Info("菜单分组更新成功", zap.Uint("id", menuGroup.ID)) |
|
return nil |
|
} |
|
|
|
// DeleteMenuGroup 删除菜单分组 |
|
func (s *MenuGroupService) DeleteMenuGroup(id uint) error { |
|
s.logger.Info("开始删除菜单分组", zap.Uint("id", id)) |
|
|
|
// 检查菜单分组是否存在 |
|
_, err := s.menuGroupRepo.FindByID(id) |
|
if err != nil { |
|
s.logger.Error("菜单分组不存在", zap.Uint("id", id), zap.Error(err)) |
|
return fmt.Errorf("菜单分组不存在: %w", err) |
|
} |
|
|
|
if err := s.menuGroupRepo.Delete(id); err != nil { |
|
s.logger.Error("删除菜单分组失败", zap.Error(err)) |
|
return fmt.Errorf("删除菜单分组失败: %w", err) |
|
} |
|
|
|
s.logger.Info("菜单分组删除成功", zap.Uint("id", id)) |
|
return nil |
|
} |
|
|
|
// BatchDeleteMenuGroups 批量删除菜单分组 |
|
func (s *MenuGroupService) BatchDeleteMenuGroups(ids []uint) error { |
|
s.logger.Info("开始批量删除菜单分组", zap.Uints("ids", ids)) |
|
|
|
if len(ids) == 0 { |
|
return fmt.Errorf("删除ID列表不能为空") |
|
} |
|
|
|
if err := s.menuGroupRepo.BatchDelete(ids); err != nil { |
|
s.logger.Error("批量删除菜单分组失败", zap.Error(err)) |
|
return fmt.Errorf("批量删除菜单分组失败: %w", err) |
|
} |
|
|
|
s.logger.Info("批量删除菜单分组成功", zap.Uints("ids", ids)) |
|
return nil |
|
} |
|
|
|
// UpdateMenuGroupStatus 更新菜单分组状态 |
|
func (s *MenuGroupService) UpdateMenuGroupStatus(id uint, status int) error { |
|
s.logger.Info("开始更新菜单分组状态", zap.Uint("id", id), zap.Int("status", status)) |
|
|
|
// 检查菜单分组是否存在 |
|
_, err := s.menuGroupRepo.FindByID(id) |
|
if err != nil { |
|
s.logger.Error("菜单分组不存在", zap.Uint("id", id), zap.Error(err)) |
|
return fmt.Errorf("菜单分组不存在: %w", err) |
|
} |
|
|
|
// 验证状态值 |
|
if status != 0 && status != 1 { |
|
return fmt.Errorf("状态值无效,只能是0或1") |
|
} |
|
|
|
if err := s.menuGroupRepo.UpdateStatus(id, status); err != nil { |
|
s.logger.Error("更新菜单分组状态失败", zap.Error(err)) |
|
return fmt.Errorf("更新菜单分组状态失败: %w", err) |
|
} |
|
|
|
s.logger.Info("菜单分组状态更新成功", zap.Uint("id", id), zap.Int("status", status)) |
|
return nil |
|
} |
|
|
|
// UpdateMenuGroupSort 更新菜单分组排序 |
|
func (s *MenuGroupService) UpdateMenuGroupSort(id uint, sort int) error { |
|
s.logger.Info("开始更新菜单分组排序", zap.Uint("id", id), zap.Int("sort", sort)) |
|
|
|
// 检查菜单分组是否存在 |
|
_, err := s.menuGroupRepo.FindByID(id) |
|
if err != nil { |
|
s.logger.Error("菜单分组不存在", zap.Uint("id", id), zap.Error(err)) |
|
return fmt.Errorf("菜单分组不存在: %w", err) |
|
} |
|
|
|
if err := s.menuGroupRepo.UpdateSort(id, sort); err != nil { |
|
s.logger.Error("更新菜单分组排序失败", zap.Error(err)) |
|
return fmt.Errorf("更新菜单分组排序失败: %w", err) |
|
} |
|
|
|
s.logger.Info("菜单分组排序更新成功", zap.Uint("id", id), zap.Int("sort", sort)) |
|
return nil |
|
} |
|
|
|
// BatchUpdateMenuGroupSort 批量更新菜单分组排序 |
|
func (s *MenuGroupService) BatchUpdateMenuGroupSort(sorts map[uint]int) error { |
|
s.logger.Info("开始批量更新菜单分组排序", zap.Any("sorts", sorts)) |
|
|
|
if len(sorts) == 0 { |
|
return fmt.Errorf("排序数据不能为空") |
|
} |
|
|
|
if err := s.menuGroupRepo.BatchUpdateSort(sorts); err != nil { |
|
s.logger.Error("批量更新菜单分组排序失败", zap.Error(err)) |
|
return fmt.Errorf("批量更新菜单分组排序失败: %w", err) |
|
} |
|
|
|
s.logger.Info("批量更新菜单分组排序成功") |
|
return nil |
|
} |
|
|
|
// GetMenuGroupStats 获取菜单分组统计信息 |
|
func (s *MenuGroupService) GetMenuGroupStats() (map[string]interface{}, error) { |
|
stats, err := s.menuGroupRepo.GetStats() |
|
if err != nil { |
|
s.logger.Error("获取菜单分组统计信息失败", zap.Error(err)) |
|
return nil, fmt.Errorf("获取菜单分组统计信息失败: %w", err) |
|
} |
|
return stats, nil |
|
}
|
|
|