You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
5.1 KiB
155 lines
5.1 KiB
using BBWYB.Client.APIServices;
|
|
using BBWYB.Client.Models;
|
|
using BBWYB.Client.Views.Order;
|
|
using BBWYB.Client.Views.Purchase;
|
|
using BBWYB.Common.Extensions;
|
|
using BBWYB.Common.Models;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using CommunityToolkit.Mvvm.Messaging;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Input;
|
|
|
|
namespace BBWYB.Client.ViewModels
|
|
{
|
|
public class ChoosePurchaseSchemeViewModel : BaseVM
|
|
{
|
|
private PurchaseService purchaseService;
|
|
private GlobalContext globalContext;
|
|
private Order order;
|
|
private bool freeChoice;
|
|
private bool isResponse = true;
|
|
private bool isLoading;
|
|
|
|
public IList<PurchaseSchemeSkuGroup> SkuGroup { get; set; }
|
|
|
|
public ICommand ConfirmCommand { get; set; }
|
|
|
|
public ICommand RefreshCommand { get; set; }
|
|
|
|
|
|
public bool FreeChoice { get => freeChoice; set { SetProperty(ref freeChoice, value); } }
|
|
|
|
public bool IsLoading { get => isLoading; set { SetProperty(ref isLoading, value); } }
|
|
|
|
public ChoosePurchaseSchemeViewModel(PurchaseService purchaseService, GlobalContext globalContext)
|
|
{
|
|
this.purchaseService = purchaseService;
|
|
this.globalContext = globalContext;
|
|
this.SkuGroup = new ObservableCollection<PurchaseSchemeSkuGroup>();
|
|
ConfirmCommand = new RelayCommand(Confirm);
|
|
RefreshCommand = new RelayCommand(Refresh);
|
|
}
|
|
|
|
protected override void Load()
|
|
{
|
|
IsLoading = true;
|
|
Task.Factory.StartNew(() => LoadScheme());
|
|
}
|
|
|
|
public void SetData(Order order)
|
|
{
|
|
this.order = order;
|
|
}
|
|
|
|
private void LoadScheme()
|
|
{
|
|
var skuIdList = order.ItemList.Select(osku => osku.SkuId).ToList();
|
|
var response = purchaseService.GetPurchaseSchemeList(skuIdList, shopId: globalContext.User.Shop.ShopId);
|
|
LoadScheme(response);
|
|
}
|
|
|
|
private void LoadScheme(ApiResponse<IList<PurchaseSchemeResponse>> response)
|
|
{
|
|
IsLoading = false;
|
|
if (!response.Success)
|
|
{
|
|
App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "提示"));
|
|
return;
|
|
}
|
|
|
|
if (response.Data == null || response.Data.Count() == 0)
|
|
return;
|
|
|
|
var groups = response.Data.GroupBy(s => s.SkuId);
|
|
App.Current.Dispatcher.Invoke(() =>
|
|
{
|
|
foreach (var g in groups)
|
|
{
|
|
var skuGroup = new PurchaseSchemeSkuGroup()
|
|
{
|
|
SkuId = g.Key,
|
|
SchemeList = g.Select(p => PurchaseScheme.Convert(p)).ToList()
|
|
};
|
|
skuGroup.OnSchemeChanged = OnSchemeChanged;
|
|
SkuGroup.Add(skuGroup);
|
|
}
|
|
});
|
|
}
|
|
|
|
private void Confirm()
|
|
{
|
|
if (SkuGroup.Any(s => s.SelectedScheme == null))
|
|
{
|
|
App.Current.Dispatcher.Invoke(() => MessageBox.Show("采购方案选择不完整", "提示"));
|
|
return;
|
|
}
|
|
|
|
var schemeList = new List<PurchaseScheme>();
|
|
foreach (var g in SkuGroup)
|
|
{
|
|
schemeList.Add(g.SelectedScheme);
|
|
}
|
|
|
|
var p = new OnlinePurchase(order, schemeList);
|
|
p.ShowDialog();
|
|
// GalaSoft.MvvmLight.Messaging.Messenger.Default.Send<object>(null, "ChoosePurchaseScheme_Close");
|
|
WeakReferenceMessenger.Default.Send(new Message_ChoosePurchaseSchemeClose(null));
|
|
}
|
|
|
|
private void OnSchemeChanged(PurchaseSchemeSkuGroup skuGroup)
|
|
{
|
|
if (FreeChoice)
|
|
return;
|
|
if (!isResponse)
|
|
return;
|
|
isResponse = false;
|
|
var purchaserId = skuGroup.SelectedScheme.PurchaserId;
|
|
|
|
foreach (var otherSkuGroup in SkuGroup)
|
|
{
|
|
if (otherSkuGroup.SkuId == skuGroup.SkuId)
|
|
continue;
|
|
|
|
var samePurchaseScheme = otherSkuGroup.SchemeList.FirstOrDefault(s => s.PurchaserId == purchaserId);
|
|
if (samePurchaseScheme != null)
|
|
otherSkuGroup.SelectedScheme = samePurchaseScheme;
|
|
}
|
|
isResponse = true;
|
|
}
|
|
|
|
public override void Refresh()
|
|
{
|
|
if (SkuGroup.Count() == 0)
|
|
return;
|
|
IsLoading = true;
|
|
var schemeIdList = new List<long>();
|
|
foreach (var group in SkuGroup)
|
|
{
|
|
schemeIdList.AddRange(group.SchemeList.Select(s => s.Id));
|
|
group.SchemeList.Clear();
|
|
}
|
|
SkuGroup.Clear();
|
|
|
|
Task.Factory.StartNew(() => purchaseService.RefreshPurchaseScheme(schemeIdList)).ContinueWith(t =>
|
|
{
|
|
var response = t.Result;
|
|
LoadScheme(response);
|
|
});
|
|
|
|
}
|
|
}
|
|
}
|
|
|