Files
qhmes/yy-admin-master/YY.Admin/ViewModels/SysManage/CategoryDictionaryManagementViewModel.cs

144 lines
4.5 KiB
C#

using HandyControl.Controls;
using System.Collections.ObjectModel;
using YY.Admin.Core;
using YY.Admin.Core.Helper;
using YY.Admin.Services.Service.Category;
using YY.Admin.Services.Service.Category.Dto;
using YY.Admin.ViewModels.Control;
namespace YY.Admin.ViewModels.SysManage;
public class CategoryDictionaryManagementViewModel : BaseViewModel
{
private readonly IJeecgCategorySyncService _categorySyncService;
private PaginationDataGridViewModel<JeecgCategoryItemOutput> _paginationDataGridViewModel;
public PaginationDataGridViewModel<JeecgCategoryItemOutput> PaginationDataGridViewModel
{
get => _paginationDataGridViewModel;
set => SetProperty(ref _paginationDataGridViewModel, value);
}
private PageJeecgCategoryItemInput _input;
public PageJeecgCategoryItemInput Input
{
get => _input;
set => SetProperty(ref _input, value);
}
public DelegateCommand SearchCommand { get; }
public DelegateCommand ResetCommand { get; }
public DelegateCommand SyncCommand { get; }
public ObservableCollection<CategoryTreeNode> TreeNodes { get; } = [];
private CategoryTreeNode? _selectedTreeNode;
public CategoryTreeNode? SelectedTreeNode
{
get => _selectedTreeNode;
set => SetProperty(ref _selectedTreeNode, value);
}
public CategoryDictionaryManagementViewModel(
IJeecgCategorySyncService categorySyncService,
IContainerExtension container,
IRegionManager regionManager) : base(container, regionManager)
{
_categorySyncService = categorySyncService;
_paginationDataGridViewModel = new PaginationDataGridViewModel<JeecgCategoryItemOutput>(FetchAsync);
_input = new PageJeecgCategoryItemInput();
SearchCommand = new DelegateCommand(async () => await SearchAsync());
ResetCommand = new DelegateCommand(async () => await ResetAsync());
SyncCommand = new DelegateCommand(async () => await SyncAsync());
_ = InitializeAsync();
}
private async Task InitializeAsync()
{
await LoadTreeAsync();
await UIHelper.WaitForRenderAsync();
await PaginationDataGridViewModel.LoadDataAsync();
}
private async Task<(IEnumerable<JeecgCategoryItemOutput> data, int totalCount)> FetchAsync()
{
Input.Page = PaginationDataGridViewModel.PageIndex;
Input.PageSize = PaginationDataGridViewModel.DataCountPerPage;
var result = await _categorySyncService.PageAsync(Input);
return (result.Items, result.Total);
}
private async Task SearchAsync()
{
PaginationDataGridViewModel.PageIndex = 1;
await PaginationDataGridViewModel.LoadDataAsync();
}
private async Task ResetAsync()
{
Input = new PageJeecgCategoryItemInput();
SelectedTreeNode = null;
await UIHelper.WaitForRenderAsync();
await LoadTreeAsync();
await SearchAsync();
}
private async Task SyncAsync()
{
var count = await _categorySyncService.SyncFromJeecgAsync();
if (count > 0)
{
Growl.Success($"同步完成,共处理 {count} 条分类字典数据");
}
else
{
Growl.Warning("未同步到分类字典,请确认后端可访问");
}
await LoadTreeAsync();
await SearchAsync();
}
public async Task OnTreeSelectedAsync(CategoryTreeNode? node)
{
SelectedTreeNode = node;
Input.Pid = node?.Id;
await SearchAsync();
}
private async Task LoadTreeAsync()
{
TreeNodes.Clear();
var tree = await _categorySyncService.LoadTreeAsync();
foreach (var item in tree)
{
TreeNodes.Add(MapTreeNode(item));
}
}
private static CategoryTreeNode MapTreeNode(JeecgCategoryTreeNodeDto dto)
{
var node = new CategoryTreeNode
{
Id = dto.Id,
Name = dto.Name ?? dto.Code ?? dto.Id,
Code = dto.Code
};
foreach (var child in dto.Children)
{
node.Children.Add(MapTreeNode(child));
}
return node;
}
public class CategoryTreeNode
{
public string Id { get; set; } = string.Empty;
public string? Name { get; set; }
public string? Code { get; set; }
public ObservableCollection<CategoryTreeNode> Children { get; set; } = [];
public string DisplayName => string.IsNullOrWhiteSpace(Code) ? (Name ?? Id) : $"{Name} ({Code})";
}
}