You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
5.1 KiB
C#

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq.Expressions;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Sln.Wcs.Model.Domain;
using Sln.Wcs.Repository.service;
using Sln.Wcs.UI.ViewModels.Base;
using Sln.Wcs.UI.Views.Base;
namespace Sln.Wcs.UI.ViewModels.Base;
public partial class StoreInfoViewModel : CrudPageViewModel<BaseStoreInfo>
{
private readonly IBaseLocationInfoService _locationService;
private BaseStoreInfo? _currentStore;
[ObservableProperty]
private bool _isPanelOpen;
[ObservableProperty]
private ObservableCollection<BaseLocationInfo> _storeLocations = new();
[ObservableProperty]
private string _slidePanelTitle = string.Empty;
public StoreInfoViewModel(IBaseStoreInfoService service, IBaseLocationInfoService locationService) : base(service)
{
_locationService = locationService;
PageTitle = "仓库信息管理";
}
public override List<FieldConfig> FieldConfigs => new()
{
new() { PropertyName = "storeCode", DisplayName = "仓库编号", IsRequired = true },
new() { PropertyName = "storeName", DisplayName = "仓库名称" },
new() { PropertyName = "storeType", DisplayName = "仓库类型", FieldType = FieldType.Number },
new() { PropertyName = "isFlag", DisplayName = "启用", FieldType = FieldType.CheckBox },
new() { PropertyName = "remark", DisplayName = "备注" },
};
protected override Expression<Func<BaseStoreInfo, bool>>? BuildSearchExpression(string search)
=> x => x.storeCode.Contains(search) || (x.storeName != null && x.storeName.Contains(search));
public override Avalonia.Controls.Control CreateView() => new Sln.Wcs.UI.Views.Base.StoreInfoListView();
public void LoadLocationsData(BaseStoreInfo store)
{
_currentStore = store;
LoadLocations();
SlidePanelTitle = $"库位列表 - {store.storeCode}";
}
[RelayCommand]
public void ClosePanel()
{
IsPanelOpen = false;
}
[RelayCommand]
private async System.Threading.Tasks.Task AddLocation()
{
if (_currentStore is null) return;
var entity = new BaseLocationInfo { storeCode = _currentStore.storeCode };
var editor = new EntityEditWindow();
var result = await editor.ShowDialog(entity, LocationFieldConfigs, false, GetMainWindow());
if (result)
{
_locationService.Insert(entity);
LoadLocations();
}
}
public async System.Threading.Tasks.Task EditLocationAsync(BaseLocationInfo location)
{
var editor = new EntityEditWindow();
var result = await editor.ShowDialog(location, LocationFieldConfigs, true, GetMainWindow());
if (result)
{
_locationService.Update(location);
LoadLocations();
}
}
public async System.Threading.Tasks.Task DeleteLocationAsync(BaseLocationInfo location)
{
var dlg = new Sln.Wcs.UI.Views.Base.ConfirmDialog();
if (!await dlg.ShowDialog("确定要删除该库位吗?", GetMainWindow())) return;
_locationService.DeleteById(location.objId);
LoadLocations();
}
private void LoadLocations()
{
if (_currentStore is null) return;
var list = _locationService.Query(x => x.storeCode == _currentStore.storeCode);
for (int i = 0; i < list.Count; i++) list[i].RowIndex = i + 1;
StoreLocations = new ObservableCollection<BaseLocationInfo>(list);
}
public List<FieldConfig> LocationFieldConfigs => new()
{
new() { PropertyName = "locationCode", DisplayName = "库位编号", IsRequired = true },
new() { PropertyName = "storeCode", DisplayName = "仓库编号", IsRequired = true, IsReadOnly = true },
new() { PropertyName = "locationName", DisplayName = "库位名称" },
new() { PropertyName = "locationArea", DisplayName = "库位区域" },
new() { PropertyName = "locationRows", DisplayName = "排", FieldType = FieldType.Number },
new() { PropertyName = "locationColumns", DisplayName = "列", FieldType = FieldType.Number },
new() { PropertyName = "locationLayers", DisplayName = "层", FieldType = FieldType.Number },
new() { PropertyName = "locationStatus", DisplayName = "库位状态", FieldType = FieldType.Combo, Options = StandardOptions.LocationStatus },
new() { PropertyName = "agvPosition", DisplayName = "AGV定位" },
new() { PropertyName = "materialCode", DisplayName = "物料编号" },
new() { PropertyName = "palletBarcode", DisplayName = "托盘条码" },
new() { PropertyName = "stackCount", DisplayName = "库存数量" },
new() { PropertyName = "isFlag", DisplayName = "启用", FieldType = FieldType.CheckBox },
new() { PropertyName = "remark", DisplayName = "备注" },
};
private Avalonia.Controls.Window GetMainWindow()
{
return (Avalonia.Controls.Window)Avalonia.Application.Current!
.ApplicationLifetime!.GetType()
.GetProperty("MainWindow")!
.GetValue(Avalonia.Application.Current.ApplicationLifetime)!;
}
}