using DMS.Application.DTOs;
using DMS.Application.DTOs.Events;
using DMS.Application.Interfaces;
using DMS.Application.Interfaces.Management;
using DMS.Core.Enums;
namespace DMS.Application.Services.Management;
///
/// 菜单管理服务,负责菜单相关的业务逻辑。
///
public class MenuManagementService : IMenuManagementService
{
private readonly IMenuService _menuService;
private readonly IAppDataStorageService _appDataStorageService;
///
/// 当菜单数据发生变化时触发
///
public event EventHandler MenuChanged;
public MenuManagementService(IMenuService menuService,IAppDataStorageService appDataStorageService)
{
_menuService = menuService;
_appDataStorageService = appDataStorageService;
}
///
/// 异步获取所有菜单DTO列表。
///
public async Task> GetAllMenusAsync()
{
return await _menuService.GetAllMenusAsync();
}
///
/// 异步根据ID获取菜单DTO。
///
public async Task GetMenuByIdAsync(int id)
{
return await _menuService.GetMenuByIdAsync(id);
}
///
/// 异步创建一个新菜单。
///
public async Task CreateMenuAsync(MenuBeanDto menuDto)
{
return await _menuService.CreateMenuAsync(menuDto);
}
///
/// 异步更新一个已存在的菜单。
///
public async Task UpdateMenuAsync(MenuBeanDto menuDto)
{
await _menuService.UpdateMenuAsync(menuDto);
}
///
/// 异步删除一个菜单。
///
public async Task DeleteMenuAsync(int id)
{
await _menuService.DeleteMenuAsync(id);
}
///
/// 在内存中添加菜单
///
public void AddMenuToMemory(MenuBeanDto menuDto)
{
if (_appDataStorageService.Menus.TryAdd(menuDto.Id, menuDto))
{
MenuBeanDto parentMenu = null;
if (menuDto.ParentId > 0 && _appDataStorageService.Menus.TryGetValue(menuDto.ParentId, out var parent))
{
parentMenu = parent;
parent.Children.Add(menuDto);
}
OnMenuChanged(new MenuChangedEventArgs(DataChangeType.Added, menuDto, parentMenu));
}
}
///
/// 在内存中更新菜单
///
public void UpdateMenuInMemory(MenuBeanDto menuDto)
{
_appDataStorageService.Menus.AddOrUpdate(menuDto.Id, menuDto, (key, oldValue) => menuDto);
MenuBeanDto parentMenu = null;
if (menuDto.ParentId > 0 && _appDataStorageService.Menus.TryGetValue(menuDto.ParentId, out var parent))
{
parentMenu = parent;
}
OnMenuChanged(new MenuChangedEventArgs(DataChangeType.Updated, menuDto, parentMenu));
}
///
/// 在内存中删除菜单
///
public void RemoveMenuFromMemory(int menuId)
{
if (_appDataStorageService.Menus.TryRemove(menuId, out var menuDto))
{
MenuBeanDto parentMenu = null;
if (menuDto.ParentId > 0 && _appDataStorageService.Menus.TryGetValue(menuDto.ParentId, out var parent))
{
parentMenu = parent;
}
OnMenuChanged(new MenuChangedEventArgs(DataChangeType.Deleted, menuDto, parentMenu));
}
}
///
/// 获取根菜单列表
///
public List GetRootMenus()
{
return _appDataStorageService.Menus.Values.Where(m => m.ParentId == 0)
.ToList();
}
///
/// 根据父级ID获取子菜单列表
///
/// 父级菜单ID
/// 子菜单列表
public List GetChildMenus(int parentId)
{
return _appDataStorageService.Menus.Values.Where(m => m.ParentId == parentId)
.ToList();
}
///
/// 构建菜单树结构
///
public void BuildMenuTree()
{
// 清空现有菜单树
_appDataStorageService.MenuTrees.Clear();
// 获取所有根菜单
var rootMenus = GetRootMenus();
// 将根菜单添加到菜单树中
foreach (var rootMenu in rootMenus)
{
_appDataStorageService.MenuTrees.TryAdd(rootMenu.Id, rootMenu);
}
}
///
/// 触发菜单变更事件
///
protected virtual void OnMenuChanged(MenuChangedEventArgs e)
{
MenuChanged?.Invoke(this, e);
}
}