配合示方生成混炼示方优化

This commit is contained in:
2026-07-30 17:40:31 +08:00
parent 5c27bacd11
commit dea9b7a58c
15 changed files with 541 additions and 107 deletions

View File

@@ -526,7 +526,10 @@ public class RawMaterialEntryEditDialogViewModel : BaseViewModel, IDialogResulta
.Initialize<WeightRecordPickerDialogViewModel>(vm =>
{
pickerVm = vm;
vm.Initialize(Entry?.BillNo);
vm.Initialize(
Entry?.BillNo,
SelectedMaterial?.Id ?? Entry?.MaterialId,
SelectedMaterial?.MaterialName ?? Entry?.MaterialName);
})
.GetResultAsync<bool>());
}

View File

@@ -24,6 +24,26 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
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;
@@ -40,7 +60,7 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
}
public string SelectedRecordDisplay => _selectedRecord != null
? $"[{_selectedRecord.BillNo}] 供应商:{_selectedRecord.SenderUnit ?? "-"}"
? $"[{_selectedRecord.BillNo}] 供应商:{_selectedRecord.SenderUnit ?? "-"} 物料:{_selectedRecord.MixerMaterialNames ?? "-"}"
: "选中榜单后点击「确认选择」";
public bool HasSelectedRecord => _selectedRecord != null;
@@ -67,16 +87,24 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
SearchCommand = new DelegateCommand(async () => await LoadAsync());
ConfirmCommand = new DelegateCommand(Confirm, () => SelectedRecord != null);
CancelCommand = new DelegateCommand(() => CloseAction?.Invoke());
_ = LoadAsync();
// 不在构造时加载:等 Initialize 带入密炼物料过滤条件后再查,避免竞态覆盖筛选结果
}
public void Initialize(string? billNo)
/// <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();
}
_ = LoadAsync();
}
private async Task LoadAsync()
@@ -92,7 +120,7 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
filterInoutDirection: "1");
Records.Clear();
foreach (var record in result.Records)
foreach (var record in result.Records.Where(MatchesSelectedMixerMaterial))
{
Records.Add(record);
}
@@ -102,6 +130,11 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
SelectedRecord = Records.FirstOrDefault(x =>
string.Equals(x.BillNo, SearchBillNo, StringComparison.OrdinalIgnoreCase));
}
else if (!string.IsNullOrWhiteSpace(_filterMixerMaterialId) && Records.Count == 1)
{
// 仅匹配到一条时自动选中,便于快速确认
SelectedRecord = Records[0];
}
}
catch
{
@@ -113,6 +146,25 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
}
}
/// <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)