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;
///
/// 库区选择弹窗 ViewModel。
/// 用于「拆码明细 → 库位」字段:点击库位输入框时弹出本对话框,支持按名称/编码搜索,单选确认。
///
public class WarehouseAreaPickerDialogViewModel : BaseViewModel, IDialogResultable
{
private readonly IWarehouseAreaService _warehouseAreaService;
private string? _searchAreaName;
public string? SearchAreaName
{
get => _searchAreaName;
set => SetProperty(ref _searchAreaName, value);
}
private string? _searchAreaCode;
public string? SearchAreaCode
{
get => _searchAreaCode;
set => SetProperty(ref _searchAreaCode, value);
}
public ObservableCollection Records { get; } = new();
private MesXslWarehouseArea? _selectedRecord;
public MesXslWarehouseArea? SelectedRecord
{
get => _selectedRecord;
set
{
SetProperty(ref _selectedRecord, value);
ConfirmCommand.RaiseCanExecuteChanged();
RaisePropertyChanged(nameof(SelectedRecordDisplay));
RaisePropertyChanged(nameof(HasSelectedRecord));
}
}
public string SelectedRecordDisplay => _selectedRecord != null
? $"[{_selectedRecord.AreaCode}] {_selectedRecord.AreaName} · 仓库:{_selectedRecord.WarehouseName ?? "-"}"
: "选中库区后点击「确认选择」";
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 WarehouseAreaPickerDialogViewModel(
IWarehouseAreaService warehouseAreaService,
IContainerExtension container,
IRegionManager regionManager) : base(container, regionManager)
{
_warehouseAreaService = warehouseAreaService;
SearchCommand = new DelegateCommand(async () => await LoadAsync());
ConfirmCommand = new DelegateCommand(Confirm, () => SelectedRecord != null);
CancelCommand = new DelegateCommand(() => CloseAction?.Invoke());
_ = LoadAsync();
}
///
/// 可由外部传入「当前已选库区名称」用于打开后高亮预选。
///
public void Initialize(string? currentAreaName)
{
if (!string.IsNullOrWhiteSpace(currentAreaName))
{
SearchAreaName = currentAreaName.Trim();
_ = LoadAsync();
}
}
private async Task LoadAsync()
{
try
{
IsLoading = true;
var result = await _warehouseAreaService.PageAsync(
1,
500,
areaCode: SearchAreaCode?.Trim(),
areaName: SearchAreaName?.Trim(),
warehouseId: null,
status: "0");
Records.Clear();
foreach (var record in result.Records)
{
Records.Add(record);
}
if (!string.IsNullOrWhiteSpace(SearchAreaName))
{
SelectedRecord = Records.FirstOrDefault(x =>
string.Equals(x.AreaName, SearchAreaName, StringComparison.OrdinalIgnoreCase));
}
}
catch
{
Records.Clear();
}
finally
{
IsLoading = false;
}
}
private void Confirm()
{
if (SelectedRecord == null)
{
return;
}
Result = true;
CloseAction?.Invoke();
}
}