134 lines
3.9 KiB
C#
134 lines
3.9 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.RawMaterialEntry;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 库区选择弹窗 ViewModel。
|
||
|
|
/// 用于「拆码明细 → 库位」字段:点击库位输入框时弹出本对话框,支持按名称/编码搜索,单选确认。
|
||
|
|
/// </summary>
|
||
|
|
public class WarehouseAreaPickerDialogViewModel : BaseViewModel, IDialogResultable<bool>
|
||
|
|
{
|
||
|
|
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<MesXslWarehouseArea> 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();
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 可由外部传入「当前已选库区名称」用于打开后高亮预选。
|
||
|
|
/// </summary>
|
||
|
|
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();
|
||
|
|
}
|
||
|
|
}
|