2026-05-09 18:25:34 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-30 17:40:31 +08:00
|
|
|
|
/// <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}」自动匹配关联磅单";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-09 18:25:34 +08:00
|
|
|
|
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
|
2026-07-30 17:40:31 +08:00
|
|
|
|
? $"[{_selectedRecord.BillNo}] 供应商:{_selectedRecord.SenderUnit ?? "-"} 物料:{_selectedRecord.MixerMaterialNames ?? "-"}"
|
2026-05-09 18:25:34 +08:00
|
|
|
|
: "选中榜单后点击「确认选择」";
|
|
|
|
|
|
|
|
|
|
|
|
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());
|
2026-07-30 17:40:31 +08:00
|
|
|
|
// 不在构造时加载:等 Initialize 带入密炼物料过滤条件后再查,避免竞态覆盖筛选结果
|
2026-05-09 18:25:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-30 17:40:31 +08:00
|
|
|
|
/// <param name="billNo">已选榜单号(用于回显搜索)</param>
|
|
|
|
|
|
/// <param name="mixerMaterialId">已选密炼物料ID,有值则只匹配含该物料的磅单</param>
|
|
|
|
|
|
/// <param name="mixerMaterialName">密炼物料名称(提示展示)</param>
|
|
|
|
|
|
public void Initialize(string? billNo, string? mixerMaterialId = null, string? mixerMaterialName = null)
|
2026-05-09 18:25:34 +08:00
|
|
|
|
{
|
2026-07-30 17:40:31 +08:00
|
|
|
|
_filterMixerMaterialId = string.IsNullOrWhiteSpace(mixerMaterialId) ? null : mixerMaterialId.Trim();
|
|
|
|
|
|
_filterMixerMaterialName = string.IsNullOrWhiteSpace(mixerMaterialName) ? null : mixerMaterialName.Trim();
|
|
|
|
|
|
RaisePropertyChanged(nameof(FilterHint));
|
|
|
|
|
|
|
2026-05-09 18:25:34 +08:00
|
|
|
|
if (!string.IsNullOrWhiteSpace(billNo))
|
|
|
|
|
|
{
|
|
|
|
|
|
SearchBillNo = billNo.Trim();
|
|
|
|
|
|
}
|
2026-07-30 17:40:31 +08:00
|
|
|
|
|
|
|
|
|
|
_ = LoadAsync();
|
2026-05-09 18:25:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task LoadAsync()
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
IsLoading = true;
|
|
|
|
|
|
var result = await _weightRecordService.PageAsync(
|
|
|
|
|
|
1,
|
|
|
|
|
|
200,
|
|
|
|
|
|
filterBillNo: SearchBillNo?.Trim(),
|
|
|
|
|
|
filterPlateNumber: SearchPlateNumber?.Trim(),
|
|
|
|
|
|
filterInoutDirection: "1");
|
|
|
|
|
|
|
|
|
|
|
|
Records.Clear();
|
2026-07-30 17:40:31 +08:00
|
|
|
|
foreach (var record in result.Records.Where(MatchesSelectedMixerMaterial))
|
2026-05-09 18:25:34 +08:00
|
|
|
|
{
|
|
|
|
|
|
Records.Add(record);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(SearchBillNo))
|
|
|
|
|
|
{
|
|
|
|
|
|
SelectedRecord = Records.FirstOrDefault(x =>
|
|
|
|
|
|
string.Equals(x.BillNo, SearchBillNo, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
|
}
|
2026-07-30 17:40:31 +08:00
|
|
|
|
else if (!string.IsNullOrWhiteSpace(_filterMixerMaterialId) && Records.Count == 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 仅匹配到一条时自动选中,便于快速确认
|
|
|
|
|
|
SelectedRecord = Records[0];
|
|
|
|
|
|
}
|
2026-05-09 18:25:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
catch
|
|
|
|
|
|
{
|
|
|
|
|
|
Records.Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
finally
|
|
|
|
|
|
{
|
|
|
|
|
|
IsLoading = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-30 17:40:31 +08:00
|
|
|
|
/// <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));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-09 18:25:34 +08:00
|
|
|
|
private void Confirm()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (SelectedRecord == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Result = true;
|
|
|
|
|
|
CloseAction?.Invoke();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|