using BBWY.Client.APIServices; using BBWY.Client.Models; using BBWY.Common.Extensions; using BBWY.Common.Models; using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Messaging; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace BBWY.Client.ViewModels { public class WareStockViewModel : BaseVM, IDenpendency { #region Property private PurchaseOrderService purchaseOrderService; private ProductService productService; private GlobalContext globalContext; private bool isLoading; private int pageIndex = 1; private int pageSize; private int productCount; private string searchProductItem; private string searchSpu; private string searchSku; private string searchPurchaseOrder; public bool IsLoading { get => isLoading; set { Set(ref isLoading, value); } } public int PageIndex { get => pageIndex; set { Set(ref pageIndex, value); } } public int PageSize { get => pageSize; set { Set(ref pageSize, value); } } public int ProductCount { get => productCount; set { Set(ref productCount, value); } } public string SearchProductItem { get => searchProductItem; set { Set(ref searchProductItem, value); } } public string SearchSpu { get => searchSpu; set { Set(ref searchSpu, value); } } public string SearchSku { get => searchSku; set { Set(ref searchSku, value); } } public string SearchPurchaseOrder { get => searchPurchaseOrder; set { Set(ref searchPurchaseOrder, value); } } public IList ProductList { get; set; } #endregion #region ICommand public ICommand SearchCommand { get; set; } public ICommand ProductPageIndexChangedCommand { get; set; } public ICommand AddPurchaserOrderCommand { get; set; } public ICommand EditPurchaseOrderCommand { get; set; } public ICommand DeletePurchaseOrderCommand { get; set; } public ICommand SavePurchaseOrderCommand { get; set; } public ICommand SwitchStorageTypeCommand { get; set; } #endregion #region Method public WareStockViewModel(GlobalContext globalContext, PurchaseOrderService purchaseOrderService, ProductService productService) { this.globalContext = globalContext; this.purchaseOrderService = purchaseOrderService; this.productService = productService; ProductList = new ObservableCollection(); SearchCommand = new RelayCommand(() => { PageIndex = 1; Task.Factory.StartNew(() => LoadWare(1)); }); ProductPageIndexChangedCommand = new RelayCommand((p) => Task.Factory.StartNew(() => LoadWare(p.PageIndex))); SwitchStorageTypeCommand = new RelayCommand(SwitchStorageType); AddPurchaserOrderCommand = new RelayCommand(AddPurchaserOrder); EditPurchaseOrderCommand = new RelayCommand(po => po.IsEdit = true); DeletePurchaseOrderCommand = new RelayCommand(DeletePurchaseOrder); SavePurchaseOrderCommand = new RelayCommand(SavePurchaseOrder); Task.Factory.StartNew(() => LoadWare(1)); } public override void Refresh() { ProductList.Clear(); ProductCount = 0; PageSize = 1; } private void LoadWare(int pageIndex) { if (!string.IsNullOrEmpty(SearchSpu) && !string.IsNullOrEmpty(SearchSku)) { App.Current.Dispatcher.Invoke(() => MessageBox.Show("SPU和SKU条件不能共存")); return; } App.Current.Dispatcher.Invoke(() => ProductList.Clear()); IsLoading = true; #region 加载JD商品列表 ApiResponse productApiResponse = null; if (!string.IsNullOrEmpty(SearchSku)) { var skuResponse = productService.GetProductSkuList(string.Empty, SearchSku); if (skuResponse.Success) { if (skuResponse.Data.Count == 0) { IsLoading = false; return; } productApiResponse = productService.GetProductList(skuResponse.Data[0].ProductId, string.Empty, string.Empty, pageIndex); } else { IsLoading = false; App.Current.Dispatcher.Invoke(() => MessageBox.Show(skuResponse.Msg, "加载sku")); return; } } else { productApiResponse = productService.GetProductList(SearchSpu, string.Empty, SearchProductItem, pageIndex); } if (!productApiResponse.Success) { IsLoading = false; App.Current.Dispatcher.Invoke(() => MessageBox.Show(productApiResponse.Msg, "加载产品")); return; } var productList = productApiResponse.Data.Items; ProductCount = productApiResponse.Data.Count; if (ProductCount == 0) { IsLoading = false; return; } #endregion #region 加载JDSKU列表 var waitList = new List(); foreach (var p in productList) { var ewh = new ManualResetEvent(false); waitList.Add(ewh); Task.Factory.StartNew(() => LoadSku(p, ewh)); } WaitHandle.WaitAll(waitList.ToArray(), 8000); #endregion #region 加载采购单 LoadPurchaseOrder(productList, StorageType.京仓); #endregion App.Current.Dispatcher.BeginInvoke((Action)delegate { foreach (var p in productList) ProductList.Add(p); //使滚动条保持顶部 Messenger.Default.Send(string.Empty, "WareStock_ProductListScrollToTop"); }); IsLoading = false; } private void LoadSku(Product product, EventWaitHandle ewh) { try { var skuResponse = productService.GetProductSkuList(product.Id, string.Empty); if (!skuResponse.Success) { IsLoading = false; App.Current.Dispatcher.Invoke(() => MessageBox.Show(skuResponse.Msg, "加载sku")); return; } foreach (var sku in skuResponse.Data) { sku.StorageList.Add(new StorageModel() { ProductId = product.Id, SkuId = sku.Id, StorageType = StorageType.京仓 }); sku.StorageList.Add(new StorageModel() { ProductId = product.Id, SkuId = sku.Id, StorageType = StorageType.云仓 }); sku.StorageList.Add(new StorageModel() { ProductId = product.Id, SkuId = sku.Id, StorageType = StorageType.本地自发 }); sku.SelectedStorageModel = sku.StorageList[0]; } product.SkuList = skuResponse.Data; } catch (Exception ex) { } finally { ewh.Set(); } } private void LoadPurchaseOrder(IList productList, StorageType storageType) { var skuList = new List(); foreach (var p in productList) skuList.AddRange(p.SkuList); LoadPurchaseOrder(skuList, storageType); } private void LoadPurchaseOrder(IList skuList, StorageType storageType) { App.Current.Dispatcher.Invoke(() => { foreach (var s in skuList) s.PurchaseOrderList.Clear(); }); var response = purchaseOrderService.GetList(skuList.Select(s => s.Id).ToList(), storageType, globalContext.User.Shop.ShopId); if (response.Success) { var purchaseOrderList = response.Data; App.Current.Dispatcher.Invoke(() => { foreach (var s in skuList) { var currentSkuPurchaseOrderList = purchaseOrderList.Where(po => po.SkuId == s.Id).Map>(); foreach (var po in currentSkuPurchaseOrderList) s.PurchaseOrderList.Add(po); } }); } } private void SwitchStorageType(StorageModel storageModel) { var product = ProductList.FirstOrDefault(p => p.Id == storageModel.ProductId); var sku = product.SkuList.FirstOrDefault(s => s.Id == storageModel.SkuId); if (sku.SelectedStorageModel == storageModel) return; sku.SelectedStorageModel = storageModel; IsLoading = true; Task.Factory.StartNew(() => { LoadPurchaseOrder(new List() { sku }, storageModel.StorageType); IsLoading = false; }); } private void AddPurchaserOrder(Product product) { foreach (var sku in product.SkuList) sku.PurchaseOrderList.Add(new PurchaseOrder { IsEdit = true, SkuId = sku.Id, ProductId = product.Id, UserId = globalContext.User.Id, StorageType = sku.SelectedStorageModel.StorageType, PurchaseMethod = PurchaseMethod.线下采购, CreateTime = DateTime.Now, ShopId = globalContext.User.Shop.ShopId, PurchasePlatform = Platform.阿里巴巴 }); } private void DeletePurchaseOrder(PurchaseOrder purchaseOrder) { var product = ProductList.FirstOrDefault(p => p.Id == purchaseOrder.ProductId); var sku = product.SkuList.FirstOrDefault(s => s.Id == purchaseOrder.SkuId); if (purchaseOrder.Id == 0) { sku.PurchaseOrderList.Remove(purchaseOrder); } else { if (MessageBox.Show("确定要删除采购单吗?", "确认", MessageBoxButton.OKCancel) != MessageBoxResult.OK) return; IsLoading = true; Task.Factory.StartNew(() => { var response = purchaseOrderService.DeletePurchaseOrder(purchaseOrder.Id); IsLoading = false; App.Current.Dispatcher.BeginInvoke((Action)delegate { if (response.Success) sku.PurchaseOrderList.Remove(purchaseOrder); else MessageBox.Show(response.Msg, "删除采购单"); }); }); } } private void SavePurchaseOrder(PurchaseOrder purchaseOrder) { if (purchaseOrder.PurchasePlatform == null || string.IsNullOrEmpty(purchaseOrder.PurchaseOrderId) || purchaseOrder.PurchaseQuantity == 0) { MessageBox.Show("缺少必要信息", "保存采购单"); return; } if (purchaseOrder.RemainingQuantity > purchaseOrder.PurchaseQuantity) { MessageBox.Show("剩余库存不成超过采购数量", "保存采购单"); return; } purchaseOrder.IsEdit = false; var product = ProductList.FirstOrDefault(p => p.Id == purchaseOrder.ProductId); var sku = product.SkuList.FirstOrDefault(s => s.Id == purchaseOrder.SkuId); IsLoading = true; Task.Factory.StartNew(() => { var response = purchaseOrder.Id == 0 ? purchaseOrderService.AddPurchaseOrder(purchaseOrder) : purchaseOrderService.EditPurchaseOrder(purchaseOrder); IsLoading = false; if (response.Success) { if (purchaseOrder.Id == 0) LoadPurchaseOrder(new List() { sku }, purchaseOrder.StorageType.Value); } else { App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "保存采购单")); } }); } #endregion } }