111 lines
3.7 KiB
C#
111 lines
3.7 KiB
C#
using HandyControl.Tools.Extension;
|
|
using System.Collections.ObjectModel;
|
|
using YY.Admin.Core;
|
|
using YY.Admin.Core.Entity;
|
|
using YY.Admin.Core.Services;
|
|
using YY.Admin.Services.Service.MixerMaterialTareStrategy;
|
|
|
|
namespace YY.Admin.ViewModels.RawMaterialEntry;
|
|
|
|
/// <summary>
|
|
/// 拆码明细手动选择「密炼物料皮重策略」弹窗。
|
|
/// </summary>
|
|
public class TareStrategyPickerDialogViewModel : BaseViewModel, IDialogResultable<bool>
|
|
{
|
|
private readonly IMixerMaterialTareStrategyService _tareStrategyService;
|
|
|
|
private string? _materialId;
|
|
private string? _supplierId;
|
|
private DateTime? _entryDate;
|
|
private double? _portionWeight;
|
|
|
|
public ObservableCollection<MesXslMixerMaterialTareStrategy> Records { get; } = new();
|
|
|
|
private MesXslMixerMaterialTareStrategy? _selectedStrategy;
|
|
public MesXslMixerMaterialTareStrategy? SelectedStrategy
|
|
{
|
|
get => _selectedStrategy;
|
|
set
|
|
{
|
|
SetProperty(ref _selectedStrategy, value);
|
|
ConfirmCommand.RaiseCanExecuteChanged();
|
|
RaisePropertyChanged(nameof(SelectedStrategyDisplay));
|
|
}
|
|
}
|
|
|
|
public string SelectedStrategyDisplay => _selectedStrategy == null
|
|
? "请选中一条策略后确认,或点「使用自动匹配」"
|
|
: $"规格:{_selectedStrategy.MaterialSpec ?? "-"} 包装物:{_selectedStrategy.TareWeight:0.###} 托盘:{_selectedStrategy.PalletWeight:0.###}";
|
|
|
|
private bool _result;
|
|
public bool Result { get => _result; set => SetProperty(ref _result, value); }
|
|
public Action? CloseAction { get; set; }
|
|
|
|
public DelegateCommand ConfirmCommand { get; }
|
|
public DelegateCommand UseAutoMatchCommand { get; }
|
|
public DelegateCommand CancelCommand { get; }
|
|
|
|
public TareStrategyPickerDialogViewModel(
|
|
IMixerMaterialTareStrategyService tareStrategyService,
|
|
IContainerExtension container,
|
|
IRegionManager regionManager) : base(container, regionManager)
|
|
{
|
|
_tareStrategyService = tareStrategyService;
|
|
ConfirmCommand = new DelegateCommand(ConfirmSelection, () => SelectedStrategy != null);
|
|
UseAutoMatchCommand = new DelegateCommand(UseAutoMatch);
|
|
CancelCommand = new DelegateCommand(() => CloseAction?.Invoke());
|
|
}
|
|
|
|
public void Initialize(
|
|
string? materialId,
|
|
string? supplierId,
|
|
DateTime? entryDate,
|
|
double? portionWeight,
|
|
string? currentStrategyId)
|
|
{
|
|
_materialId = materialId;
|
|
_supplierId = supplierId;
|
|
_entryDate = entryDate;
|
|
_portionWeight = portionWeight;
|
|
_ = LoadAsync(currentStrategyId);
|
|
}
|
|
|
|
private async Task LoadAsync(string? currentStrategyId)
|
|
{
|
|
try
|
|
{
|
|
var all = await _tareStrategyService.GetAllForMatchAsync();
|
|
var filtered = MixerMaterialTareStrategyMatcher.FilterCandidates(
|
|
all, _materialId, _supplierId, _entryDate, _portionWeight);
|
|
|
|
Records.Clear();
|
|
foreach (var item in filtered)
|
|
Records.Add(item);
|
|
|
|
if (!string.IsNullOrWhiteSpace(currentStrategyId))
|
|
{
|
|
SelectedStrategy = Records.FirstOrDefault(r =>
|
|
string.Equals(r.Id, currentStrategyId, StringComparison.OrdinalIgnoreCase))
|
|
?? all.FirstOrDefault(r => string.Equals(r.Id, currentStrategyId, StringComparison.OrdinalIgnoreCase));
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
Records.Clear();
|
|
}
|
|
}
|
|
|
|
private void ConfirmSelection()
|
|
{
|
|
Result = true;
|
|
CloseAction?.Invoke();
|
|
}
|
|
|
|
private void UseAutoMatch()
|
|
{
|
|
SelectedStrategy = null;
|
|
Result = true;
|
|
CloseAction?.Invoke();
|
|
}
|
|
}
|