using Prism.Events; using System.Collections.ObjectModel; using YY.Admin.Core; using YY.Admin.Core.Events; using YY.Admin.Core.Extension; using YY.Admin.Core.Helper; using YY.Admin.Services.Service; using YY.Admin.ViewModels.Control; namespace YY.Admin.ViewModels.SysManage; public class DataDictionaryManagementViewModel : BaseViewModel { private readonly IJeecgDictSyncService _dictSyncService; private SubscriptionToken? _dictChangedToken; public ObservableCollection TreeNodes { get; } = []; private DictTreeNode? _selectedTreeNode; public DictTreeNode? SelectedTreeNode { get => _selectedTreeNode; set => SetProperty(ref _selectedTreeNode, value); } private PaginationDataGridViewModel _paginationDataGridViewModel; public PaginationDataGridViewModel PaginationDataGridViewModel { get => _paginationDataGridViewModel; set => SetProperty(ref _paginationDataGridViewModel, value); } private PageJeecgDictItemInput _input; public PageJeecgDictItemInput Input { get => _input; set => SetProperty(ref _input, value); } public List> StatusList => Enum.GetValues(typeof(StatusEnum)) .Cast() .Select(e => new KeyValuePair(e.GetDescription(), (int)e)) .ToList(); public DelegateCommand SearchCommand { get; } public DelegateCommand ResetCommand { get; } public DataDictionaryManagementViewModel( IJeecgDictSyncService dictSyncService, IContainerExtension container, IRegionManager regionManager) : base(container, regionManager) { _dictSyncService = dictSyncService; _paginationDataGridViewModel = new PaginationDataGridViewModel(FetchAsync); _input = new PageJeecgDictItemInput(); SearchCommand = new DelegateCommand(async () => await SearchAsync()); ResetCommand = new DelegateCommand(async () => await ResetAsync()); _dictChangedToken = _eventAggregator .GetEvent() .Subscribe(async _ => await OnDictChangedAsync(), ThreadOption.UIThread); _ = InitializeAsync(); } private async Task InitializeAsync() { await LoadDictTreeAsync(); 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 _dictSyncService.PageAsync(Input); return (result.Items, result.Total); } private async Task SearchAsync() { PaginationDataGridViewModel.PageIndex = 1; await PaginationDataGridViewModel.LoadDataAsync(); } private async Task ResetAsync() { Input = new PageJeecgDictItemInput(); SelectedTreeNode = null; await UIHelper.WaitForRenderAsync(); await SearchAsync(); } public async Task OnDictTreeSelectedAsync(DictTreeNode? node) { SelectedTreeNode = node; Input.DictCode = node?.DictCode; await SearchAsync(); } private async Task LoadDictTreeAsync() { var groups = await _dictSyncService.GetDictGroupsAsync(); TreeNodes.Clear(); foreach (var group in groups) { TreeNodes.Add(new DictTreeNode(group.Key, group.Value)); } } private async Task OnDictChangedAsync() { await LoadDictTreeAsync(); await PaginationDataGridViewModel.LoadDataAsync(); } protected override void CleanUp() { base.CleanUp(); if (_dictChangedToken != null) { _eventAggregator.GetEvent().Unsubscribe(_dictChangedToken); _dictChangedToken = null; } } public class DictTreeNode { public string DictCode { get; } public string DictName { get; } public string DisplayName => $"[{DictCode}] {DictName}"; public DictTreeNode(string dictCode, string dictName) { DictCode = dictCode; DictName = dictName; } } }