using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq.Expressions; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Sln.Wcs.Model.Domain; using Sln.Wcs.Repository.service; using Sln.Wcs.UI.ViewModels.Base; using Sln.Wcs.UI.Views.Base; namespace Sln.Wcs.UI.ViewModels.Path; public partial class PathInfoViewModel : CrudPageViewModel { private readonly IBasePathDetailsService _detailService; private BasePathInfo? _currentPath; [ObservableProperty] private bool _isPanelOpen; [ObservableProperty] private ObservableCollection _detailItems = new(); [ObservableProperty] private string _slidePanelTitle = string.Empty; public PathInfoViewModel(IBasePathInfoService service, IBasePathDetailsService detailService) : base(service) { _detailService = detailService; PageTitle = "路径信息管理"; } public override List FieldConfigs => new() { new() { PropertyName = "pathCode", DisplayName = "路径编号" }, new() { PropertyName = "pathName", DisplayName = "路径名称" }, new() { PropertyName = "pathType", DisplayName = "路径类型", FieldType = FieldType.Number }, new() { PropertyName = "pathCategory", DisplayName = "路径类别", FieldType = FieldType.Number }, new() { PropertyName = "startPoint", DisplayName = "起点" }, new() { PropertyName = "endPoint", DisplayName = "终点" }, new() { PropertyName = "isFlag", DisplayName = "启用", FieldType = FieldType.CheckBox }, new() { PropertyName = "remark", DisplayName = "备注" }, }; protected override Expression>? BuildSearchExpression(string search) => x => (x.pathCode != null && x.pathCode.Contains(search)) || (x.pathName != null && x.pathName.Contains(search)); public override Avalonia.Controls.Control CreateView() => new Sln.Wcs.UI.Views.Path.PathInfoListView(); public void LoadDetailsData(BasePathInfo path) { _currentPath = path; LoadDetails(); SlidePanelTitle = $"路径明细 - {path.pathCode}"; } [RelayCommand] public void ClosePanel() { IsPanelOpen = false; } [RelayCommand] private async System.Threading.Tasks.Task AddDetail() { if (_currentPath is null) return; var entity = new BasePathDetails { pathCode = _currentPath.pathCode }; var editor = new EntityEditWindow(); var result = await editor.ShowDialog(entity, DetailFieldConfigs, false, GetMainWindow()); if (result) { _detailService.Insert(entity); LoadDetails(); } } public async System.Threading.Tasks.Task EditDetailAsync(BasePathDetails detail) { var editor = new EntityEditWindow(); var result = await editor.ShowDialog(detail, DetailFieldConfigs, true, GetMainWindow()); if (result) { _detailService.Update(detail); LoadDetails(); } } public void DeleteDetail(BasePathDetails detail) { _detailService.DeleteById(detail.objId); LoadDetails(); } private void LoadDetails() { if (_currentPath is null) return; var list = _detailService.Query(x => x.pathCode == _currentPath.pathCode); DetailItems = new ObservableCollection(list); } public List DetailFieldConfigs => new() { new() { PropertyName = "pathCode", DisplayName = "路径编号", IsRequired = true, IsReadOnly = true }, new() { PropertyName = "pathName", DisplayName = "路径名称" }, new() { PropertyName = "startPoint", DisplayName = "起点", IsRequired = true }, new() { PropertyName = "endPoint", DisplayName = "终点", IsRequired = true }, new() { PropertyName = "deviceType", DisplayName = "设备类型", FieldType = FieldType.Number }, new() { PropertyName = "isFlag", DisplayName = "启用", FieldType = FieldType.CheckBox }, new() { PropertyName = "remark", DisplayName = "备注" }, }; private Avalonia.Controls.Window GetMainWindow() { return (Avalonia.Controls.Window)Avalonia.Application.Current! .ApplicationLifetime!.GetType() .GetProperty("MainWindow")! .GetValue(Avalonia.Application.Current.ApplicationLifetime)!; } }