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 _paginationDataGridViewModel; public PaginationDataGridViewModel 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 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(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 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 Children { get; set; } = []; public string DisplayName => string.IsNullOrWhiteSpace(Code) ? (Name ?? Id) : $"{Name} ({Code})"; } }