Files
DMS/DMS.WPF/Services/MenuViewService.cs

163 lines
5.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AutoMapper;
using DMS.Application.Interfaces;
using DMS.Application.Interfaces.Management;
using DMS.Application.Services.Management;
using DMS.Core.Models;
using DMS.WPF.Interfaces;
using DMS.WPF.ItemViewModel;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
namespace DMS.WPF.Services;
/// <summary>
/// 菜单数据服务类,负责管理菜单相关的数据和操作。
/// </summary>
public class MenuViewService : IMenuViewService
{
private readonly IMapper _mapper;
private readonly IViewDataService _wpfDataService;
private readonly IAppDataService _appDataService;
private readonly IMenuManagementService _menuManagementService;
/// <summary>
/// MenuDataService类的构造函数。
/// </summary>
/// <param name="mapper">AutoMapper 实例。</param>
/// <param name="appStorageService">数据服务中心实例。</param>
public MenuViewService(IMapper mapper, IViewDataService dataStorageService, IAppDataService appStorageService, IMenuManagementService menuManagementService)
{
_mapper = mapper;
_wpfDataService = dataStorageService;
_appDataService = appStorageService;
_menuManagementService = menuManagementService;
}
public void LoadAllMenus()
{
_wpfDataService.Menus = _mapper.Map<ObservableCollection<MenuItem>>(_appDataService.Menus.Values);
BuildMenuTrees();
}
/// <summary>
/// 构建菜单树。
/// </summary>
public void BuildMenuTrees()
{
// 创建一个新的临时列表来存储根菜单
var newRootMenus = new List<MenuItem>();
// 首先确保所有菜单项的Children集合是干净的
foreach (var menu in _wpfDataService.Menus)
{
// 避免循环引用清空Children集合
menu.Children.Clear();
}
// 遍历所有菜单项,构建树形结构
foreach (var menu in _wpfDataService.Menus)
{
var parentMenu = _wpfDataService.Menus.FirstOrDefault(m => m.Id == menu.ParentId);
// 检查是否有父ID并且父ID不为0通常0或null表示根节点
if (parentMenu != null && menu.ParentId != 0)
{
// 将当前菜单添加到父菜单的Children列表中
if (!parentMenu.Children.Contains(menu))
{
parentMenu.Children.Add(menu);
}
}
else
{
// 如果没有父ID则这是一个根菜单
newRootMenus.Add(menu);
}
}
// 在UI线程安全地更新MenuTrees集合
_wpfDataService.MenuTrees.Clear();
foreach (var rootMenu in newRootMenus)
{
_wpfDataService.MenuTrees.Add(rootMenu);
}
}
/// <summary>
/// 添加菜单项。
/// </summary>
public void AddMenuToView(MenuItem MenuItem)
{
if (MenuItem is null) return;
var parentMenu = _wpfDataService.Menus.FirstOrDefault(m => m.Id == MenuItem.ParentId);
if (parentMenu is not null)
{
// 首先添加到菜单列表
_wpfDataService.Menus.Add(MenuItem);
// 然后将当前菜单添加到父菜单的Children列表中
if (!parentMenu.Children.Contains(MenuItem))
{
parentMenu.Children.Add(MenuItem);
}
//将子菜单也添加到列表中
foreach (var item in MenuItem.Children)
{
_wpfDataService.Menus.Add(item);
}
}
}
/// <summary>
/// 更新菜单项。
/// </summary>
public async Task UpdateMenuItem(MenuItem MenuItem)
{
if (MenuItem is null) return;
var menu = _wpfDataService.Menus.FirstOrDefault(m => m.Id == MenuItem.Id);
if (menu is not null)
{
var res = await _menuManagementService.UpdateAsync(_mapper.Map<MenuBean>(MenuItem));
if (res > 0)
{
menu.Header = MenuItem.Header;
}
}
}
/// <summary>
/// 删除菜单项。
/// </summary>
public void DeleteMenuToView(MenuItem? MenuItem)
{
if (MenuItem is null) return;
foreach (var children in MenuItem.Children)
{
_wpfDataService.Menus.Remove(children);
}
MenuItem.Children.Clear();
// 从菜单列表中移除
_wpfDataService.Menus.Remove(MenuItem);
// 从树形结构中移除
if (MenuItem.ParentId.HasValue && MenuItem.ParentId.Value != 0)
{
// 如果有父菜单从父菜单的Children中移除
var parentMenu = _wpfDataService.Menus.FirstOrDefault(m => m.Id == MenuItem.ParentId.Value);
parentMenu?.Children.Remove(MenuItem);
}
else
{
// 如果是根菜单从MenuTrees中移除
_wpfDataService.MenuTrees.Remove(MenuItem);
}
}
}