130 lines
4.3 KiB
C#
130 lines
4.3 KiB
C#
|
|
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.WeightRecord;
|
|||
|
|
|
|||
|
|
public class MixerMaterialPickerDialogViewModel : BaseViewModel, IDialogResultable<bool>
|
|||
|
|
{
|
|||
|
|
private readonly IMixerMaterialService _mixerMaterialService;
|
|||
|
|
|
|||
|
|
private string? _searchCode;
|
|||
|
|
public string? SearchCode { get => _searchCode; set => SetProperty(ref _searchCode, value); }
|
|||
|
|
|
|||
|
|
private string? _searchName;
|
|||
|
|
public string? SearchName { get => _searchName; set => SetProperty(ref _searchName, value); }
|
|||
|
|
|
|||
|
|
public ObservableCollection<SelectableMixerMaterial> Materials { get; } = new();
|
|||
|
|
|
|||
|
|
public IReadOnlyList<SelectableMixerMaterial> SelectedMaterials =>
|
|||
|
|
Materials.Where(m => m.IsSelected).ToList();
|
|||
|
|
|
|||
|
|
public int SelectedCount => Materials.Count(m => m.IsSelected);
|
|||
|
|
|
|||
|
|
public string SelectedDisplayText
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
var names = Materials.Where(m => m.IsSelected).Select(m => m.Source.MaterialName).ToList();
|
|||
|
|
return names.Count == 0 ? "请在上方列表中勾选物料,可多选" : string.Join(";", names);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool HasSelectedMaterials => Materials.Any(m => m.IsSelected);
|
|||
|
|
|
|||
|
|
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 DelegateCommand ClearSelectionCommand { get; }
|
|||
|
|
|
|||
|
|
public MixerMaterialPickerDialogViewModel(
|
|||
|
|
IMixerMaterialService mixerMaterialService,
|
|||
|
|
IContainerExtension container,
|
|||
|
|
IRegionManager regionManager) : base(container, regionManager)
|
|||
|
|
{
|
|||
|
|
_mixerMaterialService = mixerMaterialService;
|
|||
|
|
SearchCommand = new DelegateCommand(async () => await LoadAsync());
|
|||
|
|
ConfirmCommand = new DelegateCommand(Confirm, () => HasSelectedMaterials);
|
|||
|
|
CancelCommand = new DelegateCommand(() => CloseAction?.Invoke());
|
|||
|
|
ClearSelectionCommand = new DelegateCommand(ClearSelection);
|
|||
|
|
_ = LoadAsync();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private async Task LoadAsync()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
IsLoading = true;
|
|||
|
|
var selectedIds = Materials.Where(m => m.IsSelected).Select(m => m.Source.Id).ToHashSet();
|
|||
|
|
var result = await _mixerMaterialService.PageAsync(1, 500,
|
|||
|
|
materialCode: SearchCode?.Trim(),
|
|||
|
|
materialName: SearchName?.Trim());
|
|||
|
|
Materials.Clear();
|
|||
|
|
foreach (var mat in result.Records)
|
|||
|
|
{
|
|||
|
|
var item = new SelectableMixerMaterial(mat);
|
|||
|
|
if (selectedIds.Contains(mat.Id)) item.IsSelected = true;
|
|||
|
|
item.SelectionChanged += NotifySelectionChanged;
|
|||
|
|
Materials.Add(item);
|
|||
|
|
}
|
|||
|
|
NotifySelectionChanged();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
Materials.Clear();
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
IsLoading = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void NotifySelectionChanged()
|
|||
|
|
{
|
|||
|
|
RaisePropertyChanged(nameof(SelectedCount));
|
|||
|
|
RaisePropertyChanged(nameof(SelectedDisplayText));
|
|||
|
|
RaisePropertyChanged(nameof(HasSelectedMaterials));
|
|||
|
|
ConfirmCommand.RaiseCanExecuteChanged();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void ClearSelection()
|
|||
|
|
{
|
|||
|
|
foreach (var m in Materials) m.IsSelected = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void Confirm()
|
|||
|
|
{
|
|||
|
|
if (!HasSelectedMaterials) return;
|
|||
|
|
Result = true;
|
|||
|
|
CloseAction?.Invoke();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class SelectableMixerMaterial : System.ComponentModel.INotifyPropertyChanged
|
|||
|
|
{
|
|||
|
|
public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;
|
|||
|
|
public event Action? SelectionChanged;
|
|||
|
|
|
|||
|
|
private bool _isSelected;
|
|||
|
|
public bool IsSelected
|
|||
|
|
{
|
|||
|
|
get => _isSelected;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
if (_isSelected == value) return;
|
|||
|
|
_isSelected = value;
|
|||
|
|
PropertyChanged?.Invoke(this, new System.ComponentModel.PropertyChangedEventArgs(nameof(IsSelected)));
|
|||
|
|
SelectionChanged?.Invoke();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public MesMixerMaterial Source { get; }
|
|||
|
|
public SelectableMixerMaterial(MesMixerMaterial source) => Source = source;
|
|||
|
|
}
|
|||
|
|
}
|