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; public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultable { private readonly IWeightRecordService _weightRecordService; private string? _searchBillNo; public string? SearchBillNo { get => _searchBillNo; set => SetProperty(ref _searchBillNo, value); } private string? _searchPlateNumber; public string? SearchPlateNumber { get => _searchPlateNumber; set => SetProperty(ref _searchPlateNumber, value); } /// 入场记录已选密炼物料ID:有值时仅展示关联该物料的磅单。 private string? _filterMixerMaterialId; private string? _filterMixerMaterialName; public string FilterHint { get { if (string.IsNullOrWhiteSpace(_filterMixerMaterialId)) { return "未选择密炼物料时显示全部进厂磅单;已选物料时仅匹配含该物料的磅单。"; } var name = string.IsNullOrWhiteSpace(_filterMixerMaterialName) ? _filterMixerMaterialId : _filterMixerMaterialName; return $"已按密炼物料「{name}」自动匹配关联磅单"; } } public ObservableCollection Records { get; } = new(); private MesXslWeightRecord? _selectedRecord; public MesXslWeightRecord? SelectedRecord { get => _selectedRecord; set { SetProperty(ref _selectedRecord, value); ConfirmCommand.RaiseCanExecuteChanged(); RaisePropertyChanged(nameof(SelectedRecordDisplay)); RaisePropertyChanged(nameof(HasSelectedRecord)); } } public string SelectedRecordDisplay => _selectedRecord != null ? $"[{_selectedRecord.BillNo}] 供应商:{_selectedRecord.SenderUnit ?? "-"} 物料:{_selectedRecord.MixerMaterialNames ?? "-"}" : "选中榜单后点击「确认选择」"; 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 WeightRecordPickerDialogViewModel( IWeightRecordService weightRecordService, IContainerExtension container, IRegionManager regionManager) : base(container, regionManager) { _weightRecordService = weightRecordService; SearchCommand = new DelegateCommand(async () => await LoadAsync()); ConfirmCommand = new DelegateCommand(Confirm, () => SelectedRecord != null); CancelCommand = new DelegateCommand(() => CloseAction?.Invoke()); // 不在构造时加载:等 Initialize 带入密炼物料过滤条件后再查,避免竞态覆盖筛选结果 } /// 已选榜单号(用于回显搜索) /// 已选密炼物料ID,有值则只匹配含该物料的磅单 /// 密炼物料名称(提示展示) public void Initialize(string? billNo, string? mixerMaterialId = null, string? mixerMaterialName = null) { _filterMixerMaterialId = string.IsNullOrWhiteSpace(mixerMaterialId) ? null : mixerMaterialId.Trim(); _filterMixerMaterialName = string.IsNullOrWhiteSpace(mixerMaterialName) ? null : mixerMaterialName.Trim(); RaisePropertyChanged(nameof(FilterHint)); if (!string.IsNullOrWhiteSpace(billNo)) { SearchBillNo = billNo.Trim(); } _ = LoadAsync(); } private async Task LoadAsync() { try { IsLoading = true; var result = await _weightRecordService.PageAsync( 1, 200, filterBillNo: SearchBillNo?.Trim(), filterPlateNumber: SearchPlateNumber?.Trim(), filterInoutDirection: "1"); Records.Clear(); foreach (var record in result.Records.Where(MatchesSelectedMixerMaterial)) { Records.Add(record); } if (!string.IsNullOrWhiteSpace(SearchBillNo)) { SelectedRecord = Records.FirstOrDefault(x => string.Equals(x.BillNo, SearchBillNo, StringComparison.OrdinalIgnoreCase)); } else if (!string.IsNullOrWhiteSpace(_filterMixerMaterialId) && Records.Count == 1) { // 仅匹配到一条时自动选中,便于快速确认 SelectedRecord = Records[0]; } } catch { Records.Clear(); } finally { IsLoading = false; } } /// 未指定物料时不过滤;指定时要求磅单 MixerMaterialIds 含该ID。 private bool MatchesSelectedMixerMaterial(MesXslWeightRecord record) { if (string.IsNullOrWhiteSpace(_filterMixerMaterialId)) { return true; } if (string.IsNullOrWhiteSpace(record.MixerMaterialIds)) { return false; } var parts = record.MixerMaterialIds.Split( new[] { ';', ',', ';', ',' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); return parts.Any(p => string.Equals(p, _filterMixerMaterialId, StringComparison.OrdinalIgnoreCase)); } private void Confirm() { if (SelectedRecord == null) { return; } Result = true; CloseAction?.Invoke(); } }