using HandyControl.Tools.Extension; using System.Collections.ObjectModel; using YY.Admin.Core; using YY.Admin.Core.Entity; using YY.Admin.Core.Services; namespace YY.Admin.ViewModels.RawMaterialEntry; /// /// 库区选择弹窗 ViewModel。 /// 用于「拆码明细 → 库位」字段:点击库位输入框时弹出本对话框,支持按名称/编码搜索,单选确认。 /// public class WarehouseAreaPickerDialogViewModel : BaseViewModel, IDialogResultable { private readonly IWarehouseAreaService _warehouseAreaService; private string? _searchAreaName; public string? SearchAreaName { get => _searchAreaName; set => SetProperty(ref _searchAreaName, value); } private string? _searchAreaCode; public string? SearchAreaCode { get => _searchAreaCode; set => SetProperty(ref _searchAreaCode, value); } public ObservableCollection Records { get; } = new(); private MesXslWarehouseArea? _selectedRecord; public MesXslWarehouseArea? SelectedRecord { get => _selectedRecord; set { SetProperty(ref _selectedRecord, value); ConfirmCommand.RaiseCanExecuteChanged(); RaisePropertyChanged(nameof(SelectedRecordDisplay)); RaisePropertyChanged(nameof(HasSelectedRecord)); } } public string SelectedRecordDisplay => _selectedRecord != null ? $"[{_selectedRecord.AreaCode}] {_selectedRecord.AreaName} · 仓库:{_selectedRecord.WarehouseName ?? "-"}" : "选中库区后点击「确认选择」"; public bool HasSelectedRecord => _selectedRecord != null; private bool _result; public bool Result { get => _result; set => SetProperty(ref _result, value); } public Action? CloseAction { get; set; } public DelegateCommand SearchCommand { get; } public DelegateCommand ConfirmCommand { get; } public DelegateCommand CancelCommand { get; } public WarehouseAreaPickerDialogViewModel( IWarehouseAreaService warehouseAreaService, IContainerExtension container, IRegionManager regionManager) : base(container, regionManager) { _warehouseAreaService = warehouseAreaService; SearchCommand = new DelegateCommand(async () => await LoadAsync()); ConfirmCommand = new DelegateCommand(Confirm, () => SelectedRecord != null); CancelCommand = new DelegateCommand(() => CloseAction?.Invoke()); _ = LoadAsync(); } /// /// 可由外部传入「当前已选库区名称」用于打开后高亮预选。 /// public void Initialize(string? currentAreaName) { if (!string.IsNullOrWhiteSpace(currentAreaName)) { SearchAreaName = currentAreaName.Trim(); _ = LoadAsync(); } } private async Task LoadAsync() { try { IsLoading = true; var result = await _warehouseAreaService.PageAsync( 1, 500, areaCode: SearchAreaCode?.Trim(), areaName: SearchAreaName?.Trim(), warehouseId: null, status: "0"); Records.Clear(); foreach (var record in result.Records) { Records.Add(record); } if (!string.IsNullOrWhiteSpace(SearchAreaName)) { SelectedRecord = Records.FirstOrDefault(x => string.Equals(x.AreaName, SearchAreaName, StringComparison.OrdinalIgnoreCase)); } } catch { Records.Clear(); } finally { IsLoading = false; } } private void Confirm() { if (SelectedRecord == null) { return; } Result = true; CloseAction?.Invoke(); } }