Files
qhmes/yy-admin-master/YY.Admin/ViewModels/RawMaterialEntry/WeightRecordPickerDialogViewModel.cs

179 lines
5.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<bool>
{
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);
}
/// <summary>入场记录已选密炼物料ID有值时仅展示关联该物料的磅单。</summary>
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<MesXslWeightRecord> 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 带入密炼物料过滤条件后再查,避免竞态覆盖筛选结果
}
/// <param name="billNo">已选榜单号(用于回显搜索)</param>
/// <param name="mixerMaterialId">已选密炼物料ID有值则只匹配含该物料的磅单</param>
/// <param name="mixerMaterialName">密炼物料名称(提示展示)</param>
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;
}
}
/// <summary>未指定物料时不过滤;指定时要求磅单 MixerMaterialIds 含该ID。</summary>
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();
}
}