diff --git a/BBWYB.Client/APIServices/PurchaseProductAPIService.cs b/BBWYB.Client/APIServices/PurchaseProductAPIService.cs index 17b0308..6a75477 100644 --- a/BBWYB.Client/APIServices/PurchaseProductAPIService.cs +++ b/BBWYB.Client/APIServices/PurchaseProductAPIService.cs @@ -210,6 +210,7 @@ namespace BBWYB.Client.APIServices Id = jobject["globalData"]["tempModel"]["sellerUserId"].ToString(), Id2 = jobject["globalData"]["tempModel"]["sellerLoginId"]?.ToString(), Name = jobject["globalData"]["tempModel"]["companyName"].ToString(), + MemberId = jobject["globalData"]?["tempModel"]?["sellerMemberId"]?.ToString(), Location = location, Platform = platform }; diff --git a/BBWYB.Client/App.xaml b/BBWYB.Client/App.xaml index 5939b16..2048417 100644 --- a/BBWYB.Client/App.xaml +++ b/BBWYB.Client/App.xaml @@ -4,7 +4,7 @@ xmlns:local="clr-namespace:BBWYB.Client" xmlns:vm="clr-namespace:BBWYB.Client.ViewModels" xmlns:ctr="clr-namespace:BBWYB.Client.Converters" - StartupUri="/Views/MainWindow.xaml" + StartupUri="/Views/Web.xaml" ShutdownMode="OnExplicitShutdown"> diff --git a/BBWYB.Client/App.xaml.cs b/BBWYB.Client/App.xaml.cs index be15769..9b29706 100644 --- a/BBWYB.Client/App.xaml.cs +++ b/BBWYB.Client/App.xaml.cs @@ -50,9 +50,9 @@ namespace BBWYB.Client gl.UserToken = userToken; #region 注册全局异常 - this.DispatcherUnhandledException += App_DispatcherUnhandledException; ; - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; ; - TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; ; + this.DispatcherUnhandledException += App_DispatcherUnhandledException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; #endregion @@ -79,6 +79,7 @@ namespace BBWYB.Client serviceCollection.AddTransient(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); + serviceCollection.AddTransient(); serviceCollection.AddMapper(new MappingProfile()); ServiceProvider = serviceCollection.BuildServiceProvider(); base.OnStartup(e); diff --git a/BBWYB.Client/BBWYB.Client.csproj b/BBWYB.Client/BBWYB.Client.csproj index 5fca9cb..91a07a9 100644 --- a/BBWYB.Client/BBWYB.Client.csproj +++ b/BBWYB.Client/BBWYB.Client.csproj @@ -53,4 +53,17 @@ + + + Code + + + + + + $(DefaultXamlRuntime) + Designer + + + diff --git a/BBWYB.Client/GlobalContext.cs b/BBWYB.Client/GlobalContext.cs index dcc7452..1471516 100644 --- a/BBWYB.Client/GlobalContext.cs +++ b/BBWYB.Client/GlobalContext.cs @@ -1,7 +1,6 @@ using BBWYB.Client.APIServices; using BBWYB.Client.Helpers; using BBWYB.Client.Models; -using BBWYB.Client.ViewModels; using BBWYB.Client.Views.PackPurchaseTaska; using BBWYB.Client.Views.WebB; using CommunityToolkit.Mvvm.ComponentModel; @@ -22,7 +21,7 @@ namespace BBWYB.Client { public GlobalContext() { - BBWYBApiVersion = "10030"; + BBWYBApiVersion = "10038"; } private User user; diff --git a/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeProductResponse.cs b/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeProductResponse.cs index 712aaaf..fb5ed5b 100644 --- a/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeProductResponse.cs +++ b/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeProductResponse.cs @@ -13,6 +13,18 @@ namespace BBWYB.Client.Models public string SkuId { get; set; } public long SkuPurchaseSchemeId { get; set; } public long UserId { get; set; } + + public string PurchaserName { get; set; } + + public string PurchaserId { get; set; } + public string PurchaserId2 { get; set; } + + public string PurchaserLocation { get; set; } + + public Platform? PurchasePlatform { get; set; } + + public string PurchaserMemberId { get; set; } + public List PurchaseSchemeProductSkuList { get; set; } } diff --git a/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeResponse.cs b/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeResponse.cs index b010fef..01dc224 100644 --- a/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeResponse.cs +++ b/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeResponse.cs @@ -11,20 +11,20 @@ namespace BBWYB.Client.Models /// public decimal? DefaultCost { get; set; } public string ProductId { get; set; } - /// - /// 采购商Id - /// - public string PurchaserId { get; set; } + ///// + ///// 采购商Id + ///// + //public string PurchaserId { get; set; } - /// - /// 采购商Id - /// - public string PurchaserId2 { get; set; } - public string PurchaserName { get; set; } - /// - /// 发货地 - /// - public string PurchaserLocation { get; set; } + ///// + ///// 采购商Id + ///// + //public string PurchaserId2 { get; set; } + //public string PurchaserName { get; set; } + ///// + ///// 发货地 + ///// + //public string PurchaserLocation { get; set; } /// /// 采购实际成本 /// @@ -32,10 +32,10 @@ namespace BBWYB.Client.Models public string SkuId { get; set; } public long ShopId { get; set; } - /// - /// 采购平台 - /// - public Platform PurchasePlatform { get; set; } + ///// + ///// 采购平台 + ///// + //public Platform PurchasePlatform { get; set; } /// /// 最后采购时间 @@ -43,6 +43,8 @@ namespace BBWYB.Client.Models public DateTime? LastPurchaseTime { get; set; } public List PurchaseSchemeProductList { get; set; } + + public List PurchaserList { get; set; } } } diff --git a/BBWYB.Client/Models/Product/Purchaser.cs b/BBWYB.Client/Models/Product/Purchaser.cs index 0b021fb..46be3e5 100644 --- a/BBWYB.Client/Models/Product/Purchaser.cs +++ b/BBWYB.Client/Models/Product/Purchaser.cs @@ -25,5 +25,7 @@ namespace BBWYB.Client.Models public string Location { get; set; } public Platform Platform { get; set; } + + public string MemberId { get; set; } } } diff --git a/BBWYB.Client/Models/PurchaseScheme/PurchaseScheme.cs b/BBWYB.Client/Models/PurchaseScheme/PurchaseScheme.cs index 3d5ad1c..45c82e3 100644 --- a/BBWYB.Client/Models/PurchaseScheme/PurchaseScheme.cs +++ b/BBWYB.Client/Models/PurchaseScheme/PurchaseScheme.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq; namespace BBWYB.Client.Models { @@ -21,10 +22,10 @@ namespace BBWYB.Client.Models public decimal DefaultCost { get => defaultCost; set { SetProperty(ref defaultCost, value); } } public decimal RealCost { get => realCost; set { SetProperty(ref realCost, value); } } - public string PurchaserId { get; set; } - public string PurchaserId2 { get; set; } + //public string PurchaserId { get; set; } + //public string PurchaserId2 { get; set; } public string PurchaserName { get; set; } - public string PurchaserLocation { get; set; } + //public string PurchaserLocation { get; set; } public string PurchaseProductId1 { get; set; } public int PurchaseProductSkuCount1 { get; set; } public string PurchaseProductId2 { get; set; } @@ -37,7 +38,7 @@ namespace BBWYB.Client.Models /// /// 采购平台 /// - public Platform PurchasePlatform { get; set; } + //public Platform PurchasePlatform { get; set; } /// /// 最后采购时间 @@ -49,9 +50,12 @@ namespace BBWYB.Client.Models /// public IList PurchaseSchemeProductList { get; set; } + public List PurchaserList { get; set; } + public PurchaseScheme() { PurchaseSchemeProductList = new ObservableCollection(); + PurchaserList = new List(); } /// @@ -68,13 +72,17 @@ namespace BBWYB.Client.Models ProductId = apiModel.ProductId, SkuId = apiModel.SkuId, DefaultCost = apiModel.DefaultCost ?? 0, - RealCost = apiModel.RealCost ?? 0, - PurchaserId = apiModel.PurchaserId, - PurchaserName = apiModel.PurchaserName, - PurchaserLocation = apiModel.PurchaserLocation, - PurchasePlatform = apiModel.PurchasePlatform + RealCost = apiModel.RealCost ?? 0 + //PurchaserId = apiModel.PurchaserId, + //PurchaserName = apiModel.PurchaserName, + //PurchaserLocation = apiModel.PurchaserLocation, + //PurchasePlatform = apiModel.PurchasePlatform }; - + foreach (var p in apiModel.PurchaserList) + { + model.PurchaserList.Add(p); + } + model.PurchaserName = model.PurchaserList.Count() == 1 ? model.PurchaserList[0].Name : $"{model.PurchaserList[0].Name}等{model.PurchaserList.Count()}个采购商"; foreach (var apiProduct in apiModel.PurchaseSchemeProductList) { model.PurchaseSchemeProductList.Add(PurchaseSchemeProduct.Convert(apiProduct)); diff --git a/BBWYB.Client/Models/PurchaseScheme/PurchaseSchemeProduct.cs b/BBWYB.Client/Models/PurchaseScheme/PurchaseSchemeProduct.cs index 16bc54e..6f8d9c7 100644 --- a/BBWYB.Client/Models/PurchaseScheme/PurchaseSchemeProduct.cs +++ b/BBWYB.Client/Models/PurchaseScheme/PurchaseSchemeProduct.cs @@ -28,6 +28,14 @@ namespace BBWYB.Client.Models public string PurchaseUrl { get => purchaseUrl; set { SetProperty(ref purchaseUrl, value); } } public string PurchaseProductId { get => purchaseProductId; set => purchaseProductId = value; } + public string PurchaserId { get; set; } + public string PurchaserId2 { get; set; } + public string PurchaserLocation { get; set; } + public string PurchaserName { get; set; } + public Platform PurchasePlatform { get; set; } + + + public string PurchaserMemberId { get; set; } public bool IsEditing { get => isEditing; @@ -79,7 +87,13 @@ namespace BBWYB.Client.Models ProductId = apiModel.ProductId, SkuId = apiModel.SkuId, PurchaseProductId = apiModel.PurchaseProductId, - PurchaseUrl = apiModel.PurchaseUrl + PurchaseUrl = apiModel.PurchaseUrl, + PurchaserId = apiModel.PurchaserId, + PurchaserId2 = apiModel.PurchaserId2, + PurchaserName = apiModel.PurchaserName, + PurchasePlatform = apiModel.PurchasePlatform.Value, + PurchaserLocation = apiModel.PurchaserLocation, + PurchaserMemberId = apiModel.PurchaserMemberId }; model.SelectedSkuIdList.AddRange(apiModel.PurchaseSchemeProductSkuList.Select(s => s.PurchaseSkuId)); return model; diff --git a/BBWYB.Client/ViewModels/MainViewModel.cs b/BBWYB.Client/ViewModels/MainViewModel.cs index 41da673..4903cbf 100644 --- a/BBWYB.Client/ViewModels/MainViewModel.cs +++ b/BBWYB.Client/ViewModels/MainViewModel.cs @@ -87,14 +87,14 @@ namespace BBWYB.Client.ViewModels { App.Current.Dispatcher.Invoke(() => { - MenuList.Add(new MenuModel() - { - Name = "订单管理", - ChildList = new List() - { - new MenuModel(){ Name="订单列表",Url="/Views/Order/OrderList.xaml" } - } - }); + //MenuList.Add(new MenuModel() + //{ + // Name = "订单管理", + // ChildList = new List() + // { + // new MenuModel(){ Name="订单列表",Url="/Views/Order/OrderList.xaml" } + // } + //}); MenuList.Add(new MenuModel() { Name = "商品管理", @@ -109,7 +109,8 @@ namespace BBWYB.Client.ViewModels ChildList = new List() { new MenuModel(){ Name="订单列表Bata",Url="/Views/WebB/WebB.xaml" }, - new MenuModel(){ Name="绩效考核",Url="/Views/WebB/WebB_KPI.xaml" } + new MenuModel(){ Name="绩效考核",Url="/Views/WebB/WebB_KPI.xaml" }, + new MenuModel(){ Name="货源管理",Url="/Views/WebB/WebB_GoodsSource.xaml" } } }); MenuList.Add(new MenuModel() @@ -232,7 +233,7 @@ namespace BBWYB.Client.ViewModels vm.OrderVM.Refresh(); if (vm.IsCreateWareManager) vm.WareManager.Refresh(); - if (SelectedMenuModel.Name == "订单列表Bata") + if (SelectedMenuModel?.Name == "订单列表Bata") { WeakReferenceMessenger.Default.Send(new Message_WebB_Refresh(null)); } diff --git a/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs b/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs index b445e3c..b5c3b97 100644 --- a/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs +++ b/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs @@ -117,17 +117,17 @@ namespace BBWYB.Client.ViewModels if (!isResponse) return; isResponse = false; - var purchaserId = skuGroup.SelectedScheme.PurchaserId; + //var purchaserId = skuGroup.SelectedScheme.PurchaserId; - foreach (var otherSkuGroup in SkuGroup) - { - if (otherSkuGroup.SkuId == skuGroup.SkuId) - continue; + //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; - } + // var samePurchaseScheme = otherSkuGroup.SchemeList.FirstOrDefault(s => s.PurchaserId == purchaserId); + // if (samePurchaseScheme != null) + // otherSkuGroup.SelectedScheme = samePurchaseScheme; + //} isResponse = true; } diff --git a/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs b/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs index 5358607..ed49682 100644 --- a/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs +++ b/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs @@ -135,8 +135,8 @@ namespace BBWYB.Client.ViewModels Logo = orderSku.Logo, Price = orderSku.Price.Value, ProductId = scheme.ProductId, - PurchasePlatform = scheme.PurchasePlatform, - PurchaserId = scheme.PurchaserId, + //PurchasePlatform = scheme.PurchasePlatform, + //PurchaserId = scheme.PurchaserId, PurchaserName = scheme.PurchaserName, PurchaseSchemeId = scheme.Id, Quantity = orderSku.ItemTotal, diff --git a/BBWYB.Client/ViewModels/ViewModelLocator.cs b/BBWYB.Client/ViewModels/ViewModelLocator.cs index fe4ff35..cbddf8a 100644 --- a/BBWYB.Client/ViewModels/ViewModelLocator.cs +++ b/BBWYB.Client/ViewModels/ViewModelLocator.cs @@ -118,5 +118,14 @@ namespace BBWYB.Client.ViewModels return s.ServiceProvider.GetRequiredService(); } } + + public WebVM WebVM + { + get + { + using var s = sp.CreateScope(); + return s.ServiceProvider.GetRequiredService(); + } + } } } diff --git a/BBWYB.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs b/BBWYB.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs index 85775b6..5a678d6 100644 --- a/BBWYB.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs +++ b/BBWYB.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs @@ -4,9 +4,11 @@ using BBWYB.Client.Views.Ware; using BBWYB.Common.Models; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Text.RegularExpressions; using System.Threading; @@ -16,17 +18,17 @@ using System.Windows.Input; namespace BBWYB.Client.ViewModels { - public class BindingPurchaseProductViewModel : BaseVM, IDenpendency + public class BindingPurchaseProductViewModel : BaseVM { #region Properties private GlobalContext globalContext; private PurchaseService purchaseService; private PurchaseProductAPIService purchaseProductAPIService; - private string purchaserName; + //private string purchaserName; private bool isLoading; - - private Platform purchasePlatform; + private long? schemeId; + //private Platform purchasePlatform; private IDictionary urlPatternDictionary; @@ -34,15 +36,18 @@ namespace BBWYB.Client.ViewModels public IList ProductSkuList { get; set; } - public string PurchaserId { get; set; } + //public string PurchaserId { get; set; } + + //public string PurchaserId2 { get; set; } - public string PurchaserId2 { get; set; } + //public string PurchaserName { get => purchaserName; set { SetProperty(ref purchaserName, value); } } + //public string PurchaserLocation { get; set; } - public string PurchaserName { get => purchaserName; set { SetProperty(ref purchaserName, value); } } - public string PurchaserLocation { get; set; } public bool IsLoading { get => isLoading; set { SetProperty(ref isLoading, value); } } - public Platform PurchasePlatform { get => purchasePlatform; set { SetProperty(ref purchasePlatform, value); } } + public long? SchemeId { get => schemeId; set { SetProperty(ref schemeId, value); } } + + //public Platform PurchasePlatform { get => purchasePlatform; set { SetProperty(ref purchasePlatform, value); } } #endregion @@ -86,68 +91,130 @@ namespace BBWYB.Client.ViewModels { Platform.阿里巴巴,@"^(https://detail.1688.com/offer/(\d+).html)[^\s]*" }, //{ Platform.拳探, @"^(https://qt.qiyue666.com/goods_detail/(\d+))(\?\w*)?$" } }; + ProductSkuList = new ObservableCollection(); } - public void SetData(IList productSkuList, string purchaserId, string purchaserId2, string purchaserName, Platform purchasePlatform) + //public void SetData(IList productSkuList, string purchaserId, string purchaserId2, string purchaserName, Platform purchasePlatform) + //{ + // this.ProductSkuList = productSkuList; + // //this.Product = product; + // this.PurchaserId = purchaserId; + // this.PurchaserId2 = purchaserId2; + // this.PurchaserName = purchaserName; + // this.PurchasePlatform = purchasePlatform; + //} + + public void SetData(IList productSkuList, long? schemeId) { - this.ProductSkuList = productSkuList; + foreach (var productSku in productSkuList) + ProductSkuList.Add(productSku); + this.SchemeId = schemeId; //this.Product = product; - this.PurchaserId = purchaserId; - this.PurchaserId2 = purchaserId2; - this.PurchaserName = purchaserName; - this.PurchasePlatform = purchasePlatform; + //this.PurchaserId = purchaserId; + //this.PurchaserId2 = purchaserId2; + //this.PurchaserName = purchaserName; + //this.PurchasePlatform = purchasePlatform; } protected override void Load() { - if (!string.IsNullOrEmpty(PurchaserId)) + if (this.SchemeId != null) { IsLoading = true; - Task.Factory.StartNew(() => purchaseService.GetPurchaseSchemeList(ProductSkuList.Select(s => s.Id).ToList(), PurchaserId, globalContext.User.Shop.ShopId, purchasePlatform: PurchasePlatform)).ContinueWith(r => - { - var apiResponse = r.Result; - if (!apiResponse.Success) - { - App.Current.Dispatcher.BeginInvoke((Action)delegate - { - MessageBox.Show(apiResponse.Msg, "查询采购方案"); - }); - IsLoading = false; - return; - } - - var purchaseSchemeList = apiResponse.Data; - - var waitList = new List(); - foreach (var sku in ProductSkuList) - { - //当前SKU下当前采购商的采购方案 - var apiScheme = purchaseSchemeList.FirstOrDefault(s => s.SkuId == sku.Id && s.PurchaserId == PurchaserId); - - if (apiScheme == null) - continue; - - sku.SelectedPurchaseScheme = PurchaseScheme.Convert(apiScheme); - var ewh = new ManualResetEvent(false); - waitList.Add(ewh); - - Task.Factory.StartNew(() => - { - foreach (var purchaseSchemeProduct in sku.SelectedPurchaseScheme.PurchaseSchemeProductList) - { - purchaseSchemeProduct.IsEditing = false; - LoadPurchaseProduct(sku.SelectedPurchaseScheme.PurchasePlatform, purchaseSchemeProduct, purchaseSchemeProduct.PurchaseProductId, null, out _); - } - ewh.Set(); - ewh.Dispose(); - }); - } - WaitHandle.WaitAll(waitList.ToArray()); - IsLoading = false; - }); + var skuIdList = ProductSkuList.Select(s => s.Id).ToList(); + var sku = ProductSkuList.FirstOrDefault(); + Task.Factory.StartNew(() => purchaseService.GetPurchaseSchemeList(skuIdList, shopId: globalContext.User.Shop.ShopId, schemeId: SchemeId)).ContinueWith(r => + { + var apiResponse = r.Result; + if (!apiResponse.Success) + { + App.Current.Dispatcher.BeginInvoke((Action)delegate + { + MessageBox.Show(apiResponse.Msg, "查询采购方案"); + }); + IsLoading = false; + return; + } + + var purchaseSchemeList = apiResponse.Data; + var apiScheme = purchaseSchemeList.FirstOrDefault(); + if (apiScheme == null) + { + IsLoading = false; + return; + } + sku.SelectedPurchaseScheme = PurchaseScheme.Convert(apiScheme); + var ewh = new ManualResetEvent(false); + + var waitList = new List(); + waitList.Add(ewh); + + Task.Factory.StartNew(() => + { + foreach (var purchaseSchemeProduct in sku.SelectedPurchaseScheme.PurchaseSchemeProductList) + { + purchaseSchemeProduct.IsEditing = false; + LoadPurchaseProduct(purchaseSchemeProduct.PurchasePlatform, purchaseSchemeProduct, purchaseSchemeProduct.PurchaseProductId, null, out _); + } + ewh.Set(); + ewh.Dispose(); + }); + WaitHandle.WaitAll(waitList.ToArray()); + IsLoading = false; + }); } } + //protected override void Load() + //{ + // if (!string.IsNullOrEmpty(PurchaserId)) + // { + // IsLoading = true; + // Task.Factory.StartNew(() => purchaseService.GetPurchaseSchemeList(ProductSkuList.Select(s => s.Id).ToList(), PurchaserId, globalContext.User.Shop.ShopId, purchasePlatform: PurchasePlatform)).ContinueWith(r => + // { + // var apiResponse = r.Result; + // if (!apiResponse.Success) + // { + // App.Current.Dispatcher.BeginInvoke((Action)delegate + // { + // MessageBox.Show(apiResponse.Msg, "查询采购方案"); + // }); + // IsLoading = false; + // return; + // } + + // var purchaseSchemeList = apiResponse.Data; + + // var waitList = new List(); + // foreach (var sku in ProductSkuList) + // { + // //当前SKU下当前采购商的采购方案 + // var apiScheme = purchaseSchemeList.FirstOrDefault(s => s.SkuId == sku.Id && s.PurchaserId == PurchaserId); + + // if (apiScheme == null) + // continue; + + // sku.SelectedPurchaseScheme = PurchaseScheme.Convert(apiScheme); + // var ewh = new ManualResetEvent(false); + // waitList.Add(ewh); + + // Task.Factory.StartNew(() => + // { + // foreach (var purchaseSchemeProduct in sku.SelectedPurchaseScheme.PurchaseSchemeProductList) + // { + // purchaseSchemeProduct.IsEditing = false; + // LoadPurchaseProduct(sku.SelectedPurchaseScheme.PurchasePlatform, purchaseSchemeProduct, purchaseSchemeProduct.PurchaseProductId, null, out _); + // } + // ewh.Set(); + // ewh.Dispose(); + // }); + // } + // WaitHandle.WaitAll(waitList.ToArray()); + // IsLoading = false; + // }); + // } + //} + public void LoadPurchaseProduct(Platform platform, PurchaseSchemeProduct purchaseSchemeProduct, string purchaseProductId, Func checkPurchaserFunc, out string errorMsg) { errorMsg = string.Empty; @@ -180,10 +247,16 @@ namespace BBWYB.Client.ViewModels return; } - PurchaserId = data.Value.purchaser.Id; - PurchaserId2 = data.Value.purchaser.Id2; - PurchaserName = data.Value.purchaser.Name; - PurchaserLocation = data.Value.purchaser.Location; + purchaseSchemeProduct.PurchaserId = data.Value.purchaser.Id; + purchaseSchemeProduct.PurchaserId2 = data.Value.purchaser.Id2; + purchaseSchemeProduct.PurchaserName = data.Value.purchaser.Name; + purchaseSchemeProduct.PurchaserLocation = data.Value.purchaser.Location; + purchaseSchemeProduct.PurchaserMemberId = data.Value.purchaser.MemberId; + + //PurchaserId = data.Value.purchaser.Id; + //PurchaserId2 = data.Value.purchaser.Id2; + //PurchaserName = data.Value.purchaser.Name; + //PurchaserLocation = data.Value.purchaser.Location; App.Current.Dispatcher.BeginInvoke((Action)delegate { @@ -203,33 +276,33 @@ namespace BBWYB.Client.ViewModels private void AddPurchaseProduct(ProductSku productSku) { - if (productSku.PurchaseSchemeList.Count > 4) - { - MessageBox.Show("该sku的采购方案已达上限(5)"); - return; - } + //if (productSku.PurchaseSchemeList.Count > 4) + //{ + // MessageBox.Show("该sku的采购方案已达上限(5)"); + // return; + //} if (productSku.SelectedPurchaseScheme == null) { productSku.SelectedPurchaseScheme = new PurchaseScheme() { ProductId = productSku.ProductId, - SkuId = productSku.Id, - PurchasePlatform = PurchasePlatform + SkuId = productSku.Id }; } - else if (productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Count >= 4) - { - MessageBox.Show("该采购方案的商品数量已达上限(5)"); - return; - } + //else if (productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Count >= 4) + //{ + // MessageBox.Show("该采购方案的商品数量已达上限(4)"); + // return; + //} productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Add(new PurchaseSchemeProduct() { Id = DateTime.Now.ToFileTime(), IsEditing = true, ProductId = productSku.ProductId, - SkuId = productSku.Id + SkuId = productSku.Id, + PurchasePlatform = Platform.阿里巴巴 //B端写死只能1688 }); } @@ -237,8 +310,8 @@ namespace BBWYB.Client.ViewModels { var productSku = ProductSkuList.FirstOrDefault(sku => sku.Id == purchaseSchemeProduct.SkuId); productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Remove(purchaseSchemeProduct); - if (!ProductSkuList.Any(s => s.SelectedPurchaseScheme != null && s.SelectedPurchaseScheme.PurchaseSchemeProductList.Count > 0)) - PurchaserId = string.Empty; + //if (!ProductSkuList.Any(s => s.SelectedPurchaseScheme != null && s.SelectedPurchaseScheme.PurchaseSchemeProductList.Count > 0)) + // PurchaserId = string.Empty; } /// @@ -254,7 +327,7 @@ namespace BBWYB.Client.ViewModels return; } - urlPatternDictionary.TryGetValue(PurchasePlatform, out string pattern); + urlPatternDictionary.TryGetValue(purchaseSchemeProduct.PurchasePlatform, out string pattern); var match = Regex.Match(purchaseSchemeProduct.PurchaseUrl, pattern); if (!match.Success) @@ -276,13 +349,13 @@ namespace BBWYB.Client.ViewModels Task.Factory.StartNew(() => { - LoadPurchaseProduct(sku.SelectedPurchaseScheme.PurchasePlatform, purchaseSchemeProduct, purchaseProductId, (p) => + LoadPurchaseProduct(purchaseSchemeProduct.PurchasePlatform, purchaseSchemeProduct, purchaseProductId, (p) => { - if (sku.PurchaseSchemeList.Any(s => s.Id != sku.SelectedPurchaseScheme.Id && s.PurchaserId == p)) - return $"sku{sku.Id}的采购方案中已存在相同的采购商"; //同一个sku中的采购方案不能有相同的采购商 + //if (sku.PurchaseSchemeList.Any(s => s.Id != sku.SelectedPurchaseScheme.Id && s.PurchaserId == p)) + // return $"sku{sku.Id}的采购方案中已存在相同的采购商"; //同一个sku中的采购方案不能有相同的采购商 - if (!string.IsNullOrEmpty(PurchaserId) && p != PurchaserId) //同一批操作的sku必须为相同的采购商 - return "采购商必须相同"; + //if (!string.IsNullOrEmpty(PurchaserId) && p != PurchaserId) //同一批操作的sku必须为相同的采购商 + // return "采购商必须相同"; return string.Empty; }, out string errorMsg); @@ -319,10 +392,10 @@ namespace BBWYB.Client.ViewModels purchaseSchemeProduct.IsEditing = false; var productSku = ProductSkuList.FirstOrDefault(sku => sku.Id == purchaseSchemeProduct.SkuId); - productSku.SelectedPurchaseScheme.PurchaserId = PurchaserId; - productSku.SelectedPurchaseScheme.PurchaserId2 = PurchaserId2; - productSku.SelectedPurchaseScheme.PurchaserName = PurchaserName; - productSku.SelectedPurchaseScheme.PurchaserLocation = PurchaserLocation; + //productSku.SelectedPurchaseScheme.PurchaserId = PurchaserId; + //productSku.SelectedPurchaseScheme.PurchaserId2 = PurchaserId2; + //productSku.SelectedPurchaseScheme.PurchaserName = PurchaserName; + //productSku.SelectedPurchaseScheme.PurchaserLocation = PurchaserLocation; productSku.SelectedPurchaseScheme.DefaultCost = productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Sum(p => p.PurchaseSchemeProductSkuList.Count() == 0 ? 0 : p.PurchaseSchemeProductSkuList.Sum(s => s.Price)); } @@ -385,12 +458,13 @@ namespace BBWYB.Client.ViewModels private void Closing(System.ComponentModel.CancelEventArgs e) { - PurchaserId = PurchaserName = string.Empty; + this.SchemeId = null; //clear data foreach (var sku in ProductSkuList) { sku.SelectedPurchaseScheme = null; } + this.ProductSkuList.Clear(); //Product = null; e.Cancel = false; } diff --git a/BBWYB.Client/ViewModels/Ware/WareManagerViewModel.cs b/BBWYB.Client/ViewModels/Ware/WareManagerViewModel.cs index 5661f0a..52b0f7c 100644 --- a/BBWYB.Client/ViewModels/Ware/WareManagerViewModel.cs +++ b/BBWYB.Client/ViewModels/Ware/WareManagerViewModel.cs @@ -20,7 +20,7 @@ namespace BBWYB.Client.ViewModels #region Properties private PurchaseService purchaseService; private ProductService productService; - private BindingPurchaseProductViewModel bindingPurchaseProduct; + //private BindingPurchaseProductViewModel bindingPurchaseProduct; private GlobalContext globalContext; private bool isLoading; private int pageIndex = 1; @@ -45,22 +45,32 @@ namespace BBWYB.Client.ViewModels #endregion #region Commands - public ICommand AddPurchaserCommand { get; set; } - public ICommand EditPurchaserCommand { get; set; } - public ICommand DeletePurchaserCommand { get; set; } + //public ICommand AddPurchaserCommand { get; set; } + //public ICommand EditPurchaserCommand { get; set; } + //public ICommand DeletePurchaserCommand { get; set; } public ICommand SearchCommand { get; set; } public ICommand ProductPageIndexChangedCommand { get; set; } public ICommand SwitchPurchasePlatformCommand { get; set; } + + public ICommand AddSchemeCommand { get; set; } + + public ICommand EditSchemeCommand { get; set; } + + public ICommand DeleteSchemeCommand { get; set; } #endregion #region Methods public WareManagerViewModel(GlobalContext globalContext, BindingPurchaseProductViewModel bindingPurchaseProduct, PurchaseService purchaseService, ProductService productService) { PageSize = 5; - AddPurchaserCommand = new RelayCommand(AddPurchaser); - EditPurchaserCommand = new RelayCommand(EditPurchaser); - DeletePurchaserCommand = new RelayCommand(DeletePurchaser); + //AddPurchaserCommand = new RelayCommand(AddPurchaser); + //EditPurchaserCommand = new RelayCommand(EditPurchaser); + //DeletePurchaserCommand = new RelayCommand(DeletePurchaser); + AddSchemeCommand = new RelayCommand(AddScheme); + EditSchemeCommand = new RelayCommand(EditScheme); + DeleteSchemeCommand = new RelayCommand(DeleteScheme); + SwitchPurchasePlatformCommand = new RelayCommand(SwitchPurchasePlatform); SearchCommand = new RelayCommand(() => { @@ -71,7 +81,7 @@ namespace BBWYB.Client.ViewModels this.purchaseService = purchaseService; this.productService = productService; this.globalContext = globalContext; - this.bindingPurchaseProduct = bindingPurchaseProduct; + //this.bindingPurchaseProduct = bindingPurchaseProduct; ProductList = new ObservableCollection(); Task.Factory.StartNew(() => LoadWare(1)); } @@ -164,7 +174,7 @@ namespace BBWYB.Client.ViewModels { foreach (var p in productList) ProductList.Add(p); - ExtractPurchaser(); + //ExtractPurchaser(); //使滚动条保持顶部 //Messenger.Default.Send(string.Empty, "WareManager_ProductListScrollToTop"); WeakReferenceMessenger.Default.Send(new Message_WareManager_ProductListScrollToTop(null)); @@ -227,96 +237,142 @@ namespace BBWYB.Client.ViewModels /// /// 提取SKU中的采购商到商品的采购商列表中 /// - private void ExtractPurchaser(string productId = "") + //private void ExtractPurchaser(string productId = "") + //{ + // var productList = string.IsNullOrEmpty(productId) ? ProductList : ProductList.Where(p => p.Id == productId); + // foreach (var product in productList) + // { + // product.PurchaserList.Clear(); + // foreach (var sku in product.SkuList) + // { + // if (sku.PurchaseSchemeList.Count() > 0) + // { + // foreach (var pscheme in sku.PurchaseSchemeList) + // { + // var purchaser = product.PurchaserList.FirstOrDefault(purchaser => purchaser.Id == pscheme.PurchaserId); + // if (purchaser == null) + // { + // purchaser = new Purchaser() + // { + // Id = pscheme.PurchaserId, + // Id2 = pscheme.PurchaserId2, + // Name = pscheme.PurchaserName, + // ProductId = product.Id + // }; + // product.PurchaserList.Add(purchaser); + // } + // purchaser.SkuUseCount++; + // } + // } + // } + // } + //} + + //private void AddPurchaser(Product product) + //{ + // if (product.PurchaserList.Count >= 5) + // { + // MessageBox.Show("一个SPU内最多允许5个采购商"); + // return; + // } + + // OpenBindingView(product, string.Empty, string.Empty, string.Empty); + //} + + //private void EditPurchaser(Purchaser purchaser) + //{ + // var product = ProductList.FirstOrDefault(p => p.Id == purchaser.ProductId); + // OpenBindingView(product, purchaser.Id, purchaser.Id2, purchaser.Name); + //} + + //private void DeletePurchaser(Purchaser purchaser) + //{ + // if (MessageBox.Show("确认删除该采购商吗?", "提示", MessageBoxButton.OKCancel) != MessageBoxResult.OK) + // return; + // IsLoading = true; + // Task.Factory.StartNew(() => + // { + // var response = purchaseService.DeletePurchaser(purchaser.ProductId, purchaser.Id); + // IsLoading = false; + // if (response.Success) + // { + // App.Current.Dispatcher.BeginInvoke((Action)delegate + // { + // var product = ProductList.FirstOrDefault(p => p.Id == purchaser.ProductId); + // if (product != null) + // { + // foreach (var sku in product.SkuList) + // { + // var deleteScheme = sku.PurchaseSchemeList.FirstOrDefault(s => s.PurchaserId == purchaser.Id); + // if (deleteScheme != null) + // sku.PurchaseSchemeList.Remove(deleteScheme); + // } + // product.PurchaserList.Remove(purchaser); + // } + // MessageBox.Show("采购商删除成功", "提示"); + // }); + // } + // else + // { + // App.Current.Dispatcher.BeginInvoke((Action)delegate + // { + // MessageBox.Show(response.Msg, "采购商删除"); + // }); + // } + // }); + //} + + private void AddScheme(Product product) { - var productList = string.IsNullOrEmpty(productId) ? ProductList : ProductList.Where(p => p.Id == productId); - foreach (var product in productList) - { - product.PurchaserList.Clear(); - foreach (var sku in product.SkuList) - { - if (sku.PurchaseSchemeList.Count() > 0) - { - foreach (var pscheme in sku.PurchaseSchemeList) - { - var purchaser = product.PurchaserList.FirstOrDefault(purchaser => purchaser.Id == pscheme.PurchaserId); - if (purchaser == null) - { - purchaser = new Purchaser() - { - Id = pscheme.PurchaserId, - Id2 = pscheme.PurchaserId2, - Name = pscheme.PurchaserName, - ProductId = product.Id - }; - product.PurchaserList.Add(purchaser); - } - purchaser.SkuUseCount++; - } - } - } - } - } - - private void AddPurchaser(Product product) - { - if (product.PurchaserList.Count >= 5) - { - MessageBox.Show("一个SPU内最多允许5个采购商"); - return; - } - - OpenBindingView(product, string.Empty, string.Empty, string.Empty); + OpenBindingView(product, string.Empty, null); } - private void EditPurchaser(Purchaser purchaser) + private void EditScheme(PurchaseScheme purchaseScheme) { - var product = ProductList.FirstOrDefault(p => p.Id == purchaser.ProductId); - OpenBindingView(product, purchaser.Id, purchaser.Id2, purchaser.Name); + var product = ProductList.FirstOrDefault(p => p.Id == purchaseScheme.ProductId); + OpenBindingView(product, purchaseScheme.SkuId, purchaseScheme.Id); } - private void DeletePurchaser(Purchaser purchaser) + private void DeleteScheme(PurchaseScheme purchaseScheme) { - if (MessageBox.Show("确认删除该采购商吗?", "提示", MessageBoxButton.OKCancel) != MessageBoxResult.OK) + if (MessageBox.Show("确定删除该采购方案吗?", "提示", MessageBoxButton.OKCancel) != MessageBoxResult.OK) return; IsLoading = true; - Task.Factory.StartNew(() => - { - var response = purchaseService.DeletePurchaser(purchaser.ProductId, purchaser.Id); - IsLoading = false; - if (response.Success) - { - App.Current.Dispatcher.BeginInvoke((Action)delegate - { - var product = ProductList.FirstOrDefault(p => p.Id == purchaser.ProductId); - if (product != null) + Task.Factory.StartNew(() => purchaseService.DeletePurchaseScheme(purchaseScheme.Id)) + .ContinueWith(t => { - foreach (var sku in product.SkuList) + IsLoading = false; + var response = t.Result; + if (!response.Success) { - var deleteScheme = sku.PurchaseSchemeList.FirstOrDefault(s => s.PurchaserId == purchaser.Id); - if (deleteScheme != null) - sku.PurchaseSchemeList.Remove(deleteScheme); + App.Current.Dispatcher.BeginInvoke((Action)delegate + { + MessageBox.Show(response.Msg, "删除采购方案"); + }); + return; } - product.PurchaserList.Remove(purchaser); - } - MessageBox.Show("采购商删除成功", "提示"); - }); - } - else - { - App.Current.Dispatcher.BeginInvoke((Action)delegate - { - MessageBox.Show(response.Msg, "采购商删除"); - }); - } - }); + App.Current.Dispatcher.Invoke(() => + { + var product = ProductList.FirstOrDefault(p => p.Id == purchaseScheme.ProductId); + if (product != null) + { + var sku = product.SkuList.FirstOrDefault(s => s.Id == purchaseScheme.SkuId); + if (sku != null) + { + sku.PurchaseSchemeList.Remove(purchaseScheme); + } + } + MessageBox.Show("采购方案删除成功", "提示"); + }); + }); } - private void OpenBindingView(Product product, string purchaserId, string purchaserId2, string purchaserName) + private void OpenBindingView(Product product, string skuId, long? schemeId) { - var skuList = product.SkuList; - bindingPurchaseProduct.SetData(skuList, purchaserId, purchaserId2, purchaserName, product.SelectedPurchasePlatformModel); - var bindingView = new BindingPurchaseProduct(); + var skuList = string.IsNullOrEmpty(skuId) ? product.SkuList : product.SkuList.Where(s => s.Id == skuId).ToList(); + //bindingPurchaseProduct.SetData(skuList, purchaserId, purchaserId2, purchaserName, product.SelectedPurchasePlatformModel); + //bindingPurchaseProduct.SetData(); + var bindingView = new BindingPurchaseProduct(skuList, schemeId); var r = bindingView.ShowDialog(); if (r == true) { @@ -328,7 +384,7 @@ namespace BBWYB.Client.ViewModels IsLoading = false; App.Current.Dispatcher.BeginInvoke((Action)delegate { - ExtractPurchaser(product.Id); + //ExtractPurchaser(product.Id); }); }); } @@ -345,7 +401,7 @@ namespace BBWYB.Client.ViewModels Task.Factory.StartNew(() => LoadPurchaseScheme(product.SkuList, platform)) .ContinueWith(t => { - App.Current.Dispatcher.Invoke(() => ExtractPurchaser(productId)); + //App.Current.Dispatcher.Invoke(() => ExtractPurchaser(productId)); IsLoading = false; }); } diff --git a/BBWYB.Client/ViewModels/WebVM.cs b/BBWYB.Client/ViewModels/WebVM.cs new file mode 100644 index 0000000..9e5b38c --- /dev/null +++ b/BBWYB.Client/ViewModels/WebVM.cs @@ -0,0 +1,96 @@ +using BBWYB.Client.APIServices; +using BBWYB.Client.Models; +using BBWYB.Client.Views; +using BBWYB.Common.Extensions; +using BBWYB.Common.Models; +using CommunityToolkit.Mvvm.Messaging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace BBWYB.Client.ViewModels +{ + public class WebVM : BaseVM, IDenpendency + { + private MdsApiService mdsApiService; + private MenuModel selectedMenuModel; + private bool isLoading; + ShopService shopService; + public GlobalContext GlobalContext { get; set; } + public bool IsLoading { get => isLoading; set { SetProperty(ref isLoading, value); } } + + public WebVM(GlobalContext globalContext, + MdsApiService mdsApiService, + ShopService shopService) + { + this.mdsApiService = mdsApiService; + this.GlobalContext = globalContext; + this.shopService = shopService; + Task.Factory.StartNew(Login); + } + + private void Login() + { + IsLoading = true; + try + { + var mdsUserResponse = mdsApiService.GetUserInfo(GlobalContext.UserToken); + if (!mdsUserResponse.Success) + throw new Exception($"获取磨刀石用户信息失败 {mdsUserResponse.Msg}"); + + + GlobalContext.User = mdsUserResponse.Data.Map(); + GlobalContext.User.Token = GlobalContext.UserToken; + GlobalContext.User.SonDepartmentNames = string.Empty; + if (mdsUserResponse.Data.SonDepartmentList != null && mdsUserResponse.Data.SonDepartmentList.Count > 0) + GlobalContext.User.SonDepartmentNames = string.Join(',', mdsUserResponse.Data.SonDepartmentList.Select(sd => sd.DepartmentName)); + + var res = shopService.GetDepartmentList(); + if (!res.Success) + throw new Exception(res.Msg); + var allDepartmentList = res.Data.Map>(); + + + var shopList = new List(); + foreach (var d in allDepartmentList) + shopList.AddRange(d.ShopList); + GlobalContext.User.ShopList = shopList; + + + IList departmentList = null; + + //var response = mdsApiService.GetShopDetailList(); + //if (!response.Success) + // throw new Exception(response.Msg); + departmentList = allDepartmentList.Where(d => d.Name.Contains("供应链")).ToList(); + if (departmentList.Count == 0) + throw new Exception("缺少有效的部门数据"); + + var shopIds = new List(); + foreach (var d in departmentList) + { + if (d.ShopList != null && d.ShopList.Count > 0) + { + foreach (var s in d.ShopList) + shopIds.Add(s.ShopId.ToString()); + } + } + + GlobalContext.User.DepartmentList = departmentList; + WeakReferenceMessenger.Default.Send(new Message_WebB_LoginCompleted(null)); + IsLoading = false; + } + catch (Exception ex) + { + IsLoading = false; + App.Current.Dispatcher.Invoke(() => + { + MessageBox.Show(ex.Message, "登录失败"); + }); + Environment.Exit(Environment.ExitCode); + } + } + } +} diff --git a/BBWYB.Client/Views/Ware/BindingPurchaseProduct.xaml b/BBWYB.Client/Views/Ware/BindingPurchaseProduct.xaml index b1ab4a4..31fdd4a 100644 --- a/BBWYB.Client/Views/Ware/BindingPurchaseProduct.xaml +++ b/BBWYB.Client/Views/Ware/BindingPurchaseProduct.xaml @@ -25,7 +25,7 @@ - + public partial class BindingPurchaseProduct : BWindow { - public BindingPurchaseProduct() + private BindingPurchaseProductViewModel bindingVM; + public BindingPurchaseProduct(IList productSkuList, long? schemeId) { InitializeComponent(); - //Messenger.Default.Register(this, "BindingPurchaseProduct_Close", (x) => - // { - // this.Dispatcher.Invoke(() => - // { - // this.DialogResult = x; - // this.Close(); - // }); - // }); - + bindingVM = this.DataContext as BindingPurchaseProductViewModel; + bindingVM.SetData(productSkuList, schemeId); WeakReferenceMessenger.Default.Register(this, (o, x) => { this.Dispatcher.Invoke(() => diff --git a/BBWYB.Client/Views/Ware/WareManager.xaml b/BBWYB.Client/Views/Ware/WareManager.xaml index 505200b..fb7aa82 100644 --- a/BBWYB.Client/Views/Ware/WareManager.xaml +++ b/BBWYB.Client/Views/Ware/WareManager.xaml @@ -42,7 +42,7 @@ - + @@ -79,7 +79,7 @@ - + - + @@ -110,8 +110,11 @@ - + + + - + - + @@ -177,6 +180,8 @@ + + + + + + + + + + + + + + + + + + + + + @@ -216,7 +249,9 @@ - + + + @@ -269,7 +304,7 @@ - - + --> - + + + + + + + + + + + + + + + diff --git a/BBWYB.Client/Views/Web.xaml.cs b/BBWYB.Client/Views/Web.xaml.cs new file mode 100644 index 0000000..19ed019 --- /dev/null +++ b/BBWYB.Client/Views/Web.xaml.cs @@ -0,0 +1,83 @@ +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; +using Microsoft.Extensions.DependencyInjection; +using SJ.Controls; +using System.Windows; +using System.Windows.Controls; + +namespace BBWYB.Client.Views +{ + /// + /// Web.xaml 的交互逻辑 + /// + public partial class Web : BWindow + { + private WebView2Manager w2m; + private bool isNavigated; + private GlobalContext globalContext; + + public Web() + { + InitializeComponent(); + this.Width = SystemParameters.WorkArea.Size.Width * 0.8; + this.Height = SystemParameters.WorkArea.Size.Height * 0.7; + var sp = (App.Current as App).ServiceProvider; + using (var s = sp.CreateScope()) + { + w2m = s.ServiceProvider.GetRequiredService(); + globalContext = s.ServiceProvider.GetRequiredService(); + } + + WeakReferenceMessenger.Default.Register(this, (o, x) => + { + this.Dispatcher.BeginInvoke(initWebView); + }); + } + + private void Web_Loaded(object sender, System.Windows.RoutedEventArgs e) + { + + + } + + private void initWebView() + { +#if DEBUG + var url = "http://192.168.1.2:8080"; + var registerName = "webTestContext"; + //var url = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "s.html"); +#else + var url = "http://qtbbwy.qiyue666.com"; + var registerName = "webContext"; +#endif + //var url = "http://qtbbwy.qiyue666.com"; + w2m.CoreWebView2InitializationCompleted = (e) => + { + w2m.wb2.CoreWebView2.AddHostObjectToScript(registerName, this.globalContext); + isNavigated = true; + w2m.wb2.CoreWebView2.Navigate(url); + }; + + + w2m.Init("bbwyb_web"); + w2m.wb2.SetValue(Grid.RowProperty, 1); + w2m.wb2.Margin = new Thickness(1, 0, 1, 0); + //grid.Children.Clear(); + grid.Children.Add(w2m.wb2); + + if (w2m.IsInitializationCompleted && !isNavigated) + { + w2m.wb2.CoreWebView2.Navigate(url); + //w2m.wb2.CoreWebView2.NavigateToString(content); + isNavigated = true; + } + } + } + + public class Message_WebB_LoginCompleted : ValueChangedMessage + { + public Message_WebB_LoginCompleted(object value) : base(value) + { + } + } +} diff --git a/BBWYB.Client/Views/WebB/WebB_GoodsSource.xaml b/BBWYB.Client/Views/WebB/WebB_GoodsSource.xaml new file mode 100644 index 0000000..8df7144 --- /dev/null +++ b/BBWYB.Client/Views/WebB/WebB_GoodsSource.xaml @@ -0,0 +1,14 @@ + + + + + + diff --git a/BBWYB.Client/Views/WebB/WebB_GoodsSource.xaml.cs b/BBWYB.Client/Views/WebB/WebB_GoodsSource.xaml.cs new file mode 100644 index 0000000..d4b329c --- /dev/null +++ b/BBWYB.Client/Views/WebB/WebB_GoodsSource.xaml.cs @@ -0,0 +1,104 @@ +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; +using Microsoft.Extensions.DependencyInjection; +using System.Windows; +using System.Windows.Controls; + +namespace BBWYB.Client.Views.WebB +{ + /// + /// WebB.xaml 的交互逻辑 + /// + public partial class WebB_GoodsSource : Page + { + private WebView2Manager w2m; + private bool isNavigated; + + private GlobalContext globalContext; + + public WebB_GoodsSource() + { + InitializeComponent(); + this.Loaded += WebB_Loaded; + this.Unloaded += WebB_Unloaded; + + //WeakReferenceMessenger.Default.Register(this, (o, x) => + //{ + // this.Dispatcher.Invoke(() => + // { + // _ = w2m.wb2.ExecuteScriptAsync("window.location.reload();"); + // }); + //}); + + //WeakReferenceMessenger.Default.Register(this, (o, x) => + //{ + // this.Dispatcher.Invoke(() => + // { + // _ = w2m.wb2.ExecuteScriptAsync("window.BBWY_B_WebContex('PACK_CONFIG_SUCCESS');"); + // }); + //}); + } + + private void WebB_Unloaded(object sender, RoutedEventArgs e) + { + grid.Children.Remove(w2m.wb2); + //w2m.wb2.Dispose(); + w2m.Close(); + WeakReferenceMessenger.Default.UnregisterAll(this); + } + + private void WebB_Loaded(object sender, System.Windows.RoutedEventArgs e) + { + var sp = (App.Current as App).ServiceProvider; + using (var s = sp.CreateScope()) + { + w2m = s.ServiceProvider.GetRequiredService(); + globalContext = s.ServiceProvider.GetRequiredService(); + } + +#if DEBUG + var url = "http://192.168.1.2:8080/#/goods-source"; + var registerName = "webTestContext"; + //var url = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "s.html"); +#else + var url = "http://qtbbwy.qiyue666.com/#/goods-source"; + var registerName = "webContext"; +#endif + w2m.CoreWebView2InitializationCompleted = (e) => + { + w2m.wb2.CoreWebView2.AddHostObjectToScript(registerName, this.globalContext); + isNavigated = true; + w2m.wb2.CoreWebView2.Navigate(url); + }; + + + w2m.Init("bbwyb_web"); + w2m.wb2.SetValue(Grid.RowProperty, 1); + w2m.wb2.Margin = new Thickness(1, 0, 1, 0); + //grid.Children.Clear(); + grid.Children.Add(w2m.wb2); + + if (w2m.IsInitializationCompleted && !isNavigated) + { + w2m.wb2.CoreWebView2.Navigate(url); + //w2m.wb2.CoreWebView2.NavigateToString(content); + isNavigated = true; + } + } + } + + + //public class Message_WebB_GoodsSource_Refresh : ValueChangedMessage + //{ + // public Message_WebB_GoodsSource_Refresh(object value) : base(value) + // { + // } + //} + + //public class Message_WebB_GoodsSource_RefreshPack : ValueChangedMessage + //{ + // public Message_WebB_GoodsSource_RefreshPack(object value) : base(value) + // { + // } + //} +} diff --git a/BBWYB.Client/appsettings.json b/BBWYB.Client/appsettings.json index cd45795..cce26a2 100644 --- a/BBWYB.Client/appsettings.json +++ b/BBWYB.Client/appsettings.json @@ -1,5 +1,5 @@ { - // "BBWYApiHost": "http://localhost:5000", + //"BBWYApiHost": "http://localhost:5000", "BBWYApiHost": "http://bbwyb.qiyue666.com", "MDSApiHost": "http://mdsapi.qiyue666.com", "BBWYCApiHost": "http://bbwytest.qiyue666.com", diff --git a/BBWYB.Common/Log/NLogManager.cs b/BBWYB.Common/Log/NLogManager.cs index 54c00a6..698aede 100644 --- a/BBWYB.Common/Log/NLogManager.cs +++ b/BBWYB.Common/Log/NLogManager.cs @@ -29,8 +29,6 @@ namespace BBWYB.Common.Log loggerDictionary.TryAdd(loggerName, logger); } return logger; - - } } } diff --git a/BBWYB.Server.API/Controllers/DataRepairController.cs b/BBWYB.Server.API/Controllers/DataRepairController.cs index 027cc64..36204fd 100644 --- a/BBWYB.Server.API/Controllers/DataRepairController.cs +++ b/BBWYB.Server.API/Controllers/DataRepairController.cs @@ -26,8 +26,15 @@ namespace BBWYB.Server.API.Controllers } /// - /// 修复采购商信息 + /// 修复订单Sku成本 /// + [HttpPost] + public void SupplementOrderSkuCost() + { + dataRepairBusiness.SupplementOrderSkuCost(); + } + + [HttpPost] public void SupplementPurchaserInfo() { @@ -35,12 +42,41 @@ namespace BBWYB.Server.API.Controllers } /// - /// 修复订单Sku成本 + /// 补采购方案分组 /// [HttpPost] - public void SupplementOrderSkuCost() + public void SupplementPurchaseSchemeGroup() { - dataRepairBusiness.SupplementOrderSkuCost(); + dataRepairBusiness.SupplementPurchaseSchemeGroup(); + } + + + /// + /// 手动处理待核算 + /// + [HttpPost] + public void RepairOrderStateToCheckComputation() + { + dataRepairBusiness.RepairOrderStateToCheckComputation(); + } + + + [HttpPost] + public void SyncCCancelOrder() + { dataRepairBusiness.SyncCCancelOrder(); } + + [HttpPost] + public void BSyncToC() + { dataRepairBusiness.BSyncToC(); } + + [HttpPost] + public void SyncHistoryPurchaseScheme() + { dataRepairBusiness.SyncHistoryPurchaseScheme(); } + + [HttpPost] + public void BatchCompleteOrder() + { + dataRepairBusiness.BatchCompleteOrder(); } } } diff --git a/BBWYB.Server.API/Controllers/JDController.cs b/BBWYB.Server.API/Controllers/JDController.cs new file mode 100644 index 0000000..ef06731 --- /dev/null +++ b/BBWYB.Server.API/Controllers/JDController.cs @@ -0,0 +1,25 @@ +using BBWYB.Server.Business.JD; +using Microsoft.AspNetCore.Mvc; + +namespace BBWYB.Server.API.Controllers +{ + + public class JDController : BaseApiController + { + private JDBusiness jdBusiness; + + public JDController(IHttpContextAccessor httpContextAccessor, JDBusiness jdBusiness) : base(httpContextAccessor) + { + this.jdBusiness = jdBusiness; + } + + /// + /// 检查入仓采购单 + /// + [HttpPost] + public void CheckInStoreOrder() + { + jdBusiness.CheckInStoreOrder(); + } + } +} diff --git a/BBWYB.Server.API/Controllers/OrderSyncController.cs b/BBWYB.Server.API/Controllers/OrderSyncController.cs index be68e77..c461613 100644 --- a/BBWYB.Server.API/Controllers/OrderSyncController.cs +++ b/BBWYB.Server.API/Controllers/OrderSyncController.cs @@ -31,5 +31,17 @@ namespace BBWYB.Server.API.Controllers { orderSyncBusiness.ManualOrderSync(shopId, orderId, null, null); } - } + + /// + /// 根据时间同步订单 + /// + /// + /// + /// + [HttpPost] + public void ManualOrderSyncByTime([FromQuery] long shopId, [FromQuery] DateTime startTime, [FromQuery] DateTime endTime) + { + orderSyncBusiness.ManualOrderSync(shopId, startTime, endTime); + } + } } diff --git a/BBWYB.Server.API/Controllers/ProductController.cs b/BBWYB.Server.API/Controllers/ProductController.cs index 3ed179e..8435f26 100644 --- a/BBWYB.Server.API/Controllers/ProductController.cs +++ b/BBWYB.Server.API/Controllers/ProductController.cs @@ -1,4 +1,5 @@ using BBWYB.Server.Business; +using BBWYB.Server.Model.Dto; using Microsoft.AspNetCore.Mvc; using SDKAdapter.OperationPlatform.Models; @@ -34,6 +35,28 @@ namespace BBWYB.Server.API.Controllers return productBusiness.GetProductSkuList(request); } + /// + /// spu列表查询(包含sku) + /// + /// + /// + [HttpPost] + public BProductListResponse GetProductAndSkuList([FromBody]QueryBProductRequest request) + { + return productBusiness.GetProductAndSkuList(request); + } + + /// + /// 查询sku现有售价 + /// + /// + /// + [HttpPost] + public decimal? GetProductSkuPrice([FromBody] QueryProductSkuPriceRequest request) + { + return productBusiness.GetProductSkuPrice(request); + } + /// /// 修改商品价格 /// diff --git a/BBWYB.Server.API/Controllers/PurchaseSchemeController.cs b/BBWYB.Server.API/Controllers/PurchaseSchemeController.cs index 8e519e6..171612f 100644 --- a/BBWYB.Server.API/Controllers/PurchaseSchemeController.cs +++ b/BBWYB.Server.API/Controllers/PurchaseSchemeController.cs @@ -1,5 +1,4 @@ using BBWYB.Server.Business; -using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; @@ -28,7 +27,17 @@ namespace BBWYB.Server.API.Controllers } /// - /// 查询采购方案列表 + /// 添加/编辑采购方案(web) + /// + /// + [HttpPost] + public void EditPurchaseSchemeV2([FromBody] BatchCURDSchemeRequest batchCURDSchemeRequest) + { + purchaseSchemeBusiness.EditPurchaseSchemeV2(batchCURDSchemeRequest); + } + + /// + /// 获取采购方案列表 /// /// /// @@ -39,15 +48,38 @@ namespace BBWYB.Server.API.Controllers } /// - /// 删除采购商 + /// 获取采购分组和采购方案 /// - /// - [HttpDelete] - public void DeletePurchaser([FromBody] DeletePurchaseSchemeRequest deletePurchaseSchemeRequest) + /// + /// + [HttpPost] + public IList GetPurchaseSchemeAndGroupList(QuerySchemeAndGroupRequest request) { - purchaseSchemeBusiness.DeletePurchaser(deletePurchaseSchemeRequest); + return purchaseSchemeBusiness.GetPurchaseSchemeAndGroupList(request); } + /// + /// 获取Sku采购方案数量 + /// + /// + /// + [HttpPost] + public IList GetPurchaseSchemeCountList([FromBody] QuerySchemeCountRequest request) + { + return purchaseSchemeBusiness.GetPurchaseSchemeCountList(request); + } + + + ///// + ///// 删除采购商 + ///// + ///// + //[HttpDelete] + //public void DeletePurchaser([FromBody] DeletePurchaseSchemeRequest deletePurchaseSchemeRequest) + //{ + // purchaseSchemeBusiness.DeletePurchaser(deletePurchaseSchemeRequest); + //} + /// /// 删除采购方案 /// @@ -58,16 +90,16 @@ namespace BBWYB.Server.API.Controllers purchaseSchemeBusiness.DeletePurchaseScheme(schemeId); } - /// - /// 查询共有采购商 - /// - /// - /// - [HttpPost] - public IList GetSharePurchaser([FromBody] QuerySchemeRequest querySchemeRequest) - { - return purchaseSchemeBusiness.GetSharePurchaser(querySchemeRequest); - } + ///// + ///// 查询共有采购商 + ///// + ///// + ///// + //[HttpPost] + //public IList GetSharePurchaser([FromBody] QuerySchemeRequest querySchemeRequest) + //{ + // return purchaseSchemeBusiness.GetSharePurchaser(querySchemeRequest); + //} /// /// 查询采购方案中采购Sku的基本信息 @@ -101,5 +133,48 @@ namespace BBWYB.Server.API.Controllers { return purchaseSchemeBusiness.RefreshPurchaseScheme(request); } + + ///// + ///// 修改采购配件比例 + ///// + ///// + //[HttpPost] + //public void EditPurchaseRatio([FromBody]EditPurchaseRatioAndActualPriceRequest request) + //{ + // purchaseSchemeBusiness.EditPurchaseRatio(request); + //} + + /// + /// 根据慧眼标的Id获取慧眼采购方案(含全部配件基本信息) + /// + /// + /// + [HttpPost] + public IList GetPurchaseSchemeByHYBDId([FromBody] QueryHYSchemeRequest request) + { + return purchaseSchemeBusiness.GetPurchaseSchemeByHYBDId(request); + } + + /// + /// 修改采购配件比例 + /// + /// 最新的采购方案成本 + /// 最新的采购方案成本 + [HttpPost] + public decimal EditPurchaseRatio([FromBody] EditPurchaseRatioRequest request) + { + return purchaseSchemeBusiness.EditPurchaseRatio(request); + } + + /// + /// 删除采购Sku + /// + /// + /// 最新的采购方案成本 + [HttpDelete] + public decimal DeletePurchaseSku([FromBody]DeletePurchaseSkuRequest request) + { + return purchaseSchemeBusiness.DeletePurchaseSku(request); + } } } diff --git a/BBWYB.Server.API/Program.cs b/BBWYB.Server.API/Program.cs index 7cbd9f9..4174b6a 100644 --- a/BBWYB.Server.API/Program.cs +++ b/BBWYB.Server.API/Program.cs @@ -32,10 +32,13 @@ services.AddSingleton(typeof(IFreeSql), fsql); var fsql2 = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, configuration.GetConnectionString("MDSDB")).Build(); +var fsql_bbwyc = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, configuration.GetConnectionString("BBWYCDB")).Build(); + services.AddSingleton(new FreeSqlMultiDBManager() { - BBWYfsql = fsql, - MDSfsql = fsql2 + BBWYBfsql = fsql, + MDSfsql = fsql2, + BBWYCfsql = fsql_bbwyc, }); services.AddSingleton(); diff --git a/BBWYB.Server.API/appsettings.json b/BBWYB.Server.API/appsettings.json index 9a15df4..d071f85 100644 --- a/BBWYB.Server.API/appsettings.json +++ b/BBWYB.Server.API/appsettings.json @@ -10,6 +10,7 @@ "ConnectionStrings": { //"DB": "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=bbwy;charset=utf8;sslmode=none;" "DB": "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=bbwyb;charset=utf8;sslmode=none;", + "BBWYCDB": "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=bbwy_test;charset=utf8;sslmode=none;", "MDSDB": "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=mds;charset=utf8;sslmode=none;" }, "AllowedSwagger": true, diff --git a/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs b/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs index 3fbebc0..a18cacc 100644 --- a/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs +++ b/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs @@ -1,9 +1,14 @@ -using BBWYB.Common.Log; +using BBWYB.Common.Extensions; +using BBWYB.Common.Http; +using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Model; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using FreeSql; +using SDKAdapter; +using SDKAdapter.OperationPlatform.Client; +using SDKAdapter.OperationPlatform.Models; using System.Net.Http.Headers; using Yitter.IdGenerator; @@ -13,10 +18,20 @@ namespace BBWYB.Server.Business { private KuaiDi100Manager kuaiDi100Manager; private PurchaseSchemeBusiness purchaseSchemeBusiness; - public DataRepairBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, KuaiDi100Manager kuaiDi100Manager, PurchaseSchemeBusiness purchaseSchemeBusiness) : base(fsql, nLogManager, idGenerator) + private PurchaseOrderBusiness purchaseOrderBusiness; + private FreeSqlMultiDBManager freeSqlMultiDBManager; + private VenderBusiness venderBusiness; + private OP_PlatformClientFactory opPlatformClientFactory; + private RestApiService restApiService; + public DataRepairBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, KuaiDi100Manager kuaiDi100Manager, PurchaseSchemeBusiness purchaseSchemeBusiness, PurchaseOrderBusiness purchaseOrderBusiness, FreeSqlMultiDBManager freeSqlMultiDBManager, VenderBusiness venderBusiness, OP_PlatformClientFactory opPlatformClientFactory, RestApiService restApiService) : base(fsql, nLogManager, idGenerator) { this.kuaiDi100Manager = kuaiDi100Manager; this.purchaseSchemeBusiness = purchaseSchemeBusiness; + this.purchaseOrderBusiness = purchaseOrderBusiness; + this.freeSqlMultiDBManager = freeSqlMultiDBManager; + this.venderBusiness = venderBusiness; + this.opPlatformClientFactory = opPlatformClientFactory; + this.restApiService = restApiService; } @@ -25,13 +40,56 @@ namespace BBWYB.Server.Business kuaiDi100Manager.SubscribeKuaiDi100(waybillNo, targetCompanyCode, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish"); } + + public void SupplementOrderSkuCost() + { + var orderSkuCostList = fsql.Select().InnerJoin((ocd, o) => ocd.OrderId == o.Id) + .Where((ocd, o) => ocd.IsEnabled == true && + o.IsPurchased == true && + o.OrderState != Enums.OrderState.已取消 && + !fsql.Select().As("osc").Where(osc => osc.OrderId == o.Id).Any()) + .GroupBy((ocd, o) => new { ocd.OrderId, ocd.SkuId }) + .ToList(g => new + { + OrderId = g.Key.OrderId, + SkuId = g.Key.SkuId, + SkuAmount = g.Sum(g.Value.Item1.SkuAmount), + PurchaseFreight = g.Sum(g.Value.Item1.PurchaseFreight) + }); + var orderIds = orderSkuCostList.Select(x => x.OrderId).Distinct().ToList(); + var orderSkuList = fsql.Select().Where(osku => orderIds.Contains(osku.OrderId)).ToList(); + + var insertOrderSkuCostList = new List(); + foreach (var osc in orderSkuCostList) + { + var osku = orderSkuList.FirstOrDefault(osku => osku.SkuId == osc.SkuId && osku.OrderId == osc.OrderId); + var insert = new OrderSkuCost() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + DeliveryExpressFreight = 0M, + OrderId = osc.OrderId, + SkuId = osc.SkuId, + OutPackAmount = 0M, + PurchaseFreight = osc.PurchaseFreight, + SkuAmount = osc.SkuAmount, + TotalCost = osc.PurchaseFreight + osc.SkuAmount, + Profit = ((osku.Price * osku.ItemTotal) ?? 0M) + osku.BuyerPayFreight - osc.PurchaseFreight - osc.SkuAmount + }; + insertOrderSkuCostList.Add(insert); + } + fsql.Transaction(() => + { + fsql.Insert(insertOrderSkuCostList).ExecuteAffrows(); + }); + } + public void SupplementPurchaserInfo() { - var purlList = fsql.Select() - .InnerJoin((psp, ps, p) => psp.SkuPurchaseSchemeId == ps.Id) - .InnerJoin((psp, ps, p) => ps.PurchaserId == p.Id) - .Where((psp, ps, p) => ps.PurchasePlatform == Enums.Platform.阿里巴巴 && string.IsNullOrEmpty(p.Id2)) - .ToList((psp, ps, p) => new + var purlList = fsql.Select() + .InnerJoin((psp, p) => psp.PurchaserId == p.Id) + .Where((psp, p) => p.Platform == Enums.Platform.阿里巴巴 && string.IsNullOrEmpty(p.MemberId)) + .ToList((psp, p) => new { //psp.PurchaseUrl, psp.PurchaseProductId, @@ -58,11 +116,11 @@ namespace BBWYB.Server.Business PriceMode = Enums.PurchaseOrderMode.批发, PurchaseProductId = productId }); - if (!string.IsNullOrEmpty(response?.Purchaser?.Id2)) + if (!string.IsNullOrEmpty(response?.Purchaser?.MemberId)) { - if (response.Purchaser.Id2.Length > 20) - Console.WriteLine(response.Purchaser.Id2); - var update = fsql.Update(purchaseId).Set(p => p.Id2, response.Purchaser.Id2); + if (response.Purchaser.MemberId.Length > 5) + Console.WriteLine(response.Purchaser.MemberId); + var update = fsql.Update(purchaseId).Set(p => p.MemberId, response.Purchaser.MemberId); updatePurchaserList.Add(update); } i++; @@ -93,47 +151,364 @@ namespace BBWYB.Server.Business } } - public void SupplementOrderSkuCost() + public void SupplementPurchaseSchemeGroup() { - var orderSkuCostList = fsql.Select().InnerJoin((ocd, o) => ocd.OrderId == o.Id) - .Where((ocd, o) => ocd.IsEnabled == true && - o.IsPurchased == true && - o.OrderState != Enums.OrderState.已取消 && - !fsql.Select().As("osc").Where(osc => osc.OrderId == o.Id).Any()) - .GroupBy((ocd, o) => new { ocd.OrderId, ocd.SkuId }) - .ToList(g => new - { - OrderId = g.Key.OrderId, - SkuId = g.Key.SkuId, - SkuAmount = g.Sum(g.Value.Item1.SkuAmount), - PurchaseFreight = g.Sum(g.Value.Item1.PurchaseFreight) - }); - var orderIds = orderSkuCostList.Select(x => x.OrderId).Distinct().ToList(); - var orderSkuList = fsql.Select().Where(osku => orderIds.Contains(osku.OrderId)).ToList(); + fsql.Transaction(() => + { + fsql.Delete().Where(psg => 1 == 1).ExecuteAffrows(); + fsql.Delete().Where(psgi => 1 == 1).ExecuteAffrows(); + fsql.Update().Set(ps => ps.SchemeGroupId == 0).Where(ps => 1 == 1).ExecuteAffrows(); + }); - var insertOrderSkuCostList = new List(); - foreach (var osc in orderSkuCostList) + List insertSchemeGroups = new List(); + List insertSchemeGroupIndexs = new List(); + Queue> updatePurchaseSchemeQueue = new Queue>(); + + var purchaseSchemeList = fsql.Select().OrderBy(ps => ps.Id).ToList(); + var purchaseSchemeSpuGroups = purchaseSchemeList.GroupBy(ps => ps.ProductId); + foreach (var purchaseSchemeSpuGroup in purchaseSchemeSpuGroups) { - var osku = orderSkuList.FirstOrDefault(osku => osku.SkuId == osc.SkuId && osku.OrderId == osc.OrderId); - var insert = new OrderSkuCost() + Console.WriteLine($"正在处理spu {purchaseSchemeSpuGroup.Key}"); + var purchaseSchemeSkuGroups = purchaseSchemeSpuGroup.GroupBy(ps => ps.SkuId); + var maxPsGroupCount = purchaseSchemeSkuGroups.Max(g => g.Count()); //该spu最大的采购分组数 + + var groupIndex = new PurchaseSchemeGroupIndex() { - Id = idGenerator.NewLong(), CreateTime = DateTime.Now, - DeliveryExpressFreight = 0M, - OrderId = osc.OrderId, - SkuId = osc.SkuId, - OutPackAmount = 0M, - PurchaseFreight = osc.PurchaseFreight, - SkuAmount = osc.SkuAmount, - TotalCost = osc.PurchaseFreight + osc.SkuAmount, - Profit = ((osku.Price * osku.ItemTotal) ?? 0M) + osku.BuyerPayFreight - osc.PurchaseFreight - osc.SkuAmount + Index = maxPsGroupCount, + ShopId = purchaseSchemeSpuGroup.First().ShopId, + ProductId = purchaseSchemeSpuGroup.First().ProductId }; - insertOrderSkuCostList.Add(insert); + insertSchemeGroupIndexs.Add(groupIndex); + + for (var i = 0; i < maxPsGroupCount; i++) + { + Console.WriteLine($"正在处理第{i + 1}组"); + IList currentIndexSchemeList = new List(); + //取每个sku的第i个方案 + foreach (var purchaseSchemeSkuGroup in purchaseSchemeSkuGroups) + { + var currentSkuPurchaseSchemeList = purchaseSchemeSkuGroup.ToList(); + + if (currentSkuPurchaseSchemeList.Count() >= (i + 1)) + { + var scheme = currentSkuPurchaseSchemeList[i]; + currentIndexSchemeList.Add(scheme); + } + } + + var schemeGroupId = idGenerator.NewLong(); + var insertSchemeGroup = new PurchaseSchemeGroup() + { + Id = schemeGroupId, + //GroupName = schemeGroupId.Value.ToString(), + GroupName = $"{purchaseSchemeSpuGroup.Key}-{i + 1}", + CreateTime = DateTime.Now, + ProductId = currentIndexSchemeList.First().ProductId, + ShopId = currentIndexSchemeList.First().ShopId + }; + insertSchemeGroups.Add(insertSchemeGroup); + + + foreach (var purchaseScheme in currentIndexSchemeList) + { + if (purchaseScheme.SchemeGroupId != schemeGroupId) + { + var update = fsql.Update(purchaseScheme.Id).Set(ps => ps.SchemeGroupId, schemeGroupId); + updatePurchaseSchemeQueue.Enqueue(update); + } + } + } } + Console.WriteLine("数据库处理中"); fsql.Transaction(() => { - fsql.Insert(insertOrderSkuCostList).ExecuteAffrows(); + if (insertSchemeGroups.Count() > 0) + fsql.Insert(insertSchemeGroups).ExecuteAffrows(); + if (insertSchemeGroupIndexs.Count() > 0) + fsql.Insert(insertSchemeGroupIndexs).ExecuteAffrows(); }); + + var updatePurchaseSchemeList = new List>(); + while (true) + { + if (updatePurchaseSchemeQueue.TryDequeue(out var update)) + updatePurchaseSchemeList.Add(update); + else + break; + if (updatePurchaseSchemeList.Count() == 10) + { + Console.WriteLine($"执行数据库 {DateTime.Now}"); + fsql.Transaction(() => + { + foreach (var _update in updatePurchaseSchemeList) + _update.ExecuteAffrows(); + }); + updatePurchaseSchemeList.Clear(); + } + } + if (updatePurchaseSchemeList.Count() > 0) + { + Console.WriteLine($"最后执行数据库 {DateTime.Now}"); + fsql.Transaction(() => + { + foreach (var _update in updatePurchaseSchemeList) + _update.ExecuteAffrows(); + }); + } + } + + public void RepairOrderStateToCheckComputation() + { + List insertComputationTaskList = new List(); + var time = DateTime.Parse("2023-09-01"); + var orderList = fsql.Select().Where(o => o.StartTime <= time && o.OrderState == Enums.OrderState.待验收).ToList(); + var orderIdsList = orderList.Select(o => o.Id).ToList(); + var checmComputationTaskList = fsql.Select().Where(t => t.TaskType == Enums.TimeLimitTaskType.待核算任务 && orderIdsList.Contains(t.OrderId)).ToList(); + foreach (var order in orderList) + { + if (!checmComputationTaskList.Any(x => x.OrderId == order.Id)) + { + insertComputationTaskList.Add(new TimeLimitTask() + { + Id = idGenerator.NewLong(), + OrderId = order.Id, + CreateTme = DateTime.Now, + ExpirationTime = DateTime.Now.AddDays(1), + OrderSn = order.OrderSn, + Remark = "手工处理待核算", + ShopId = order.ShopId, + TaskType = Enums.TimeLimitTaskType.待核算任务 + }); + } + } + + fsql.Transaction(() => + { + if (insertComputationTaskList.Count() > 0) + fsql.Insert(insertComputationTaskList).ExecuteAffrows(); + fsql.Update().Set(o => o.OrderState, Enums.OrderState.待核算) + .Where(o => o.StartTime <= time && o.OrderState == Enums.OrderState.待验收) + .ExecuteAffrows(); + }); + } + + public void SyncCCancelOrder() + { + var c_cancel_orderlist = freeSqlMultiDBManager.BBWYCfsql.Select().Where(p => p.OrderState == Enums.OrderState.已取消).ToList(); + var c_cancel_orderIdlist = c_cancel_orderlist.Select(p => p.Id).ToList(); + if (c_cancel_orderIdlist.Count() > 0) + { + fsql.Transaction(() => + { + fsql.Update(c_cancel_orderIdlist).Set(o => o.OrderState, Enums.OrderState.已取消).ExecuteAffrows(); + }); + } + + } + + public void BSyncToC() + { + var time = DateTime.Parse("2023-09-01"); + var orderList = fsql.Select().Where(o => o.StartTime < time).OrderByDescending(o => o.Id).ToList(o => new { o.Id, o.OrderState }); + var count = orderList.Count(); + var i = 1; + foreach (var order in orderList) + { + + + Thread.Sleep(500); + try + { + var url = "https://bbwy.qiyue666.com"; + var result = restApiService.SendRequest(url, "api/BatchPurchase/UpdatePurchaseOrderState", new + { + OrderId = order.Id, + PurchaseOrderState = order.OrderState + }, null, HttpMethod.Post); + + Console.WriteLine($"{i}/{count},{order.Id},{result.StatusCode}"); + } + catch (Exception ex) + { + + } + finally + { + i++; + } + } + } + + public void SyncHistoryPurchaseScheme() + { + var qtShops = venderBusiness.GetShopList(platform: Enums.Platform.拳探); + foreach (var shop in qtShops) + { + var psList = purchaseSchemeBusiness.GetPurchaseSchemeList(new QuerySchemeRequest() + { + ShopId = long.Parse(shop.ShopId) + }); + + List insertHistoryPSList = new List(); + List insertHistoryPSPList = new List(); + List insertHistoryPSSList = new List(); + + + foreach (var ps in psList) + { + //var newVersion = ps.Version + 1; + var newVersion = ps.Version; + foreach (var psp in ps.PurchaseSchemeProductList) + { + foreach (var pss in psp.PurchaseSchemeProductSkuList) + { + #region 处理历史版本 + var historyPss = pss.Map(); + historyPss.HistoryId = idGenerator.NewLong(); + historyPss.Version = newVersion; + insertHistoryPSSList.Add(historyPss); + #endregion + } + #region 处理历史版本 + var historyPsp = psp.Map(); + historyPsp.HistoryId = idGenerator.NewLong(); + historyPsp.Version = newVersion; + insertHistoryPSPList.Add(historyPsp); + #endregion + } + + #region 处理历史版本 + var historyPs = ps.Map(); + historyPs.HistoryId = idGenerator.NewLong(); + historyPs.Version = newVersion; + insertHistoryPSList.Add(historyPs); + + //updatePurchaseSchemeIdList.Add(ps.Id); + #endregion + } + + + fsql.Transaction(() => + { + if (insertHistoryPSList.Count() > 0) + fsql.Insert(insertHistoryPSList).ExecuteAffrows(); + if (insertHistoryPSPList.Count() > 0) + fsql.Insert(insertHistoryPSPList).ExecuteAffrows(); + if (insertHistoryPSSList.Count() > 0) + fsql.Insert(insertHistoryPSSList).ExecuteAffrows(); + //if (updatePurchaseSchemeIdList.Count() > 0) + // fsql.Update(updatePurchaseSchemeIdList).Set(ps => ps.Version + 1).ExecuteAffrows(); + }); + } + } + + public void BatchCompleteOrder() + { + var time = DateTime.Parse("2023-09-01"); + //var orderStateList = new List() { Enums.OrderState.待付款, Enums.OrderState.已取消, Enums.OrderState.已完成 }; + //var orderList = fsql.Select().Where(o => o.StartTime < time && !orderStateList.Contains(o.OrderState)).ToList(); + + var orderList = fsql.Select().Where(o => o.StartTime < time && o.OrderState == Enums.OrderState.待付款).ToList(); + var shops = venderBusiness.GetShopList(platform: Enums.Platform.拳探); + var count = orderList.Count(); + var i = 1; + + Queue> updateOrderQueue = new Queue>(); + List> updateOrderList = new List>(); + foreach (var order in orderList) + { + Console.WriteLine($"{i}/{count},{order.Id}"); + try + { + var shop = shops.FirstOrDefault(s => s.ShopId == order.ShopId.ToString()); + if (shop == null) + { + i++; + continue; + } + var qtOrderList = opPlatformClientFactory.GetClient(AdapterEnums.PlatformType.拳探).GetOrderList(new OP_QueryOrderRequest() + { + AppKey = shop.AppKey, + AppSecret = shop.AppSecret, + AppToken = shop.AppToken, + OrderId = order.Id, + PageIndex = 1, + PageSize = 100, + Platform = AdapterEnums.PlatformType.拳探, + SortTimeField = AdapterEnums.SortTimeField.Modify, + SortType = AdapterEnums.SortType.Desc, + StartDate = null, + EndDate = null + }); + if (qtOrderList.Count == 0) + { + var update = fsql.Update(order.Id).Set(o => o.OrderState, Enums.OrderState.已取消); + updateOrderQueue.Enqueue(update); + + i++; + continue; + } + + var qtOrder = qtOrderList.Items[0]; + if (qtOrder.OrderState != "-1" && qtOrder.IsPay) + { + var update = fsql.Update(order.Id).Set(o => o.OrderState, Enums.OrderState.已完成); + updateOrderQueue.Enqueue(update); + } + + if ((qtOrder.OrderState == "-1" || !qtOrder.IsPay) && order.OrderState != Enums.OrderState.已取消) + { + var update = fsql.Update(order.Id).Set(o => o.OrderState, Enums.OrderState.已取消); + updateOrderQueue.Enqueue(update); + } + } + catch + { + + } + finally + { + i++; + } + } + + if (updateOrderQueue.Count() > 0) + { + while (true) + { + if (updateOrderQueue.TryDequeue(out var update)) + updateOrderList.Add(update); + else + break; + + if (updateOrderList.Count() == 10) + { + Console.Write($"执行数据库 {DateTime.Now}"); + fsql.Transaction(() => + { + foreach (var u in updateOrderList) + { + u.ExecuteAffrows(); + } + }); + updateOrderList.Clear(); + } + } + + if (updateOrderList.Count() > 0) + { + Console.Write($"最后执行数据库 {DateTime.Now}"); + fsql.Transaction(() => + { + foreach (var u in updateOrderList) + { + u.ExecuteAffrows(); + } + }); + updateOrderList.Clear(); + } + } } } } diff --git a/BBWYB.Server.Business/Extensions/OrderStateExtension.cs b/BBWYB.Server.Business/Extensions/OrderStateExtension.cs index 1834f9c..088ee57 100644 --- a/BBWYB.Server.Business/Extensions/OrderStateExtension.cs +++ b/BBWYB.Server.Business/Extensions/OrderStateExtension.cs @@ -13,18 +13,13 @@ namespace BBWYB.Server.Business /// /// /// - /// 是否在入库单验证失败后通知钉钉 /// /// - /// public static void CalculationOrderState(this Order order, IFreeSql fsql, - out bool IsNotifyDingDingWhenInStoreOrderFail, IList orderSkuList = null, - IList orderPurchaseInfoList = null, - IList jdInStoreOrderDetailList = null) + IList orderPurchaseInfoList = null) { - IsNotifyDingDingWhenInStoreOrderFail = false; if (order.OrderState == Enums.OrderState.已取消 || order.OrderState == Enums.OrderState.已完成 || order.OrderState == Enums.OrderState.待付款) @@ -46,7 +41,7 @@ namespace BBWYB.Server.Business #region 部分采购 foreach (var osku in orderSkuList) { - if (!orderPurchaseInfoList.Any(opi => opi.BelongSkuIds.Contains(osku.SkuId))) + if (!orderPurchaseInfoList.Any(opi => !string.IsNullOrEmpty(opi.BelongSkuIds) && opi.BelongSkuIds.Contains(osku.SkuId))) { order.OrderState = Enums.OrderState.部分采购; return; @@ -120,14 +115,12 @@ namespace BBWYB.Server.Business } else if (order.IntoStoreType == Enums.IntoStoreType.厂商代发入仓) { - if (jdInStoreOrderDetailList == null || jdInStoreOrderDetailList.Count() == 0 || jdInStoreOrderDetailList.Any(x => x.storageStatus != "2")) - { + if (order.OrderState != Enums.OrderState.待核算) order.OrderState = Enums.OrderState.待验收; - IsNotifyDingDingWhenInStoreOrderFail = true; - } - else - order.OrderState = Enums.OrderState.待核算; + } + else if (order.IntoStoreType == Enums.IntoStoreType.其他仓不包装) + order.OrderState = Enums.OrderState.待核算; return; } #endregion diff --git a/BBWYB.Server.Business/FreeSqlMultiDBManager.cs b/BBWYB.Server.Business/FreeSqlMultiDBManager.cs index 5f970e1..a9f54b6 100644 --- a/BBWYB.Server.Business/FreeSqlMultiDBManager.cs +++ b/BBWYB.Server.Business/FreeSqlMultiDBManager.cs @@ -2,7 +2,9 @@ { public class FreeSqlMultiDBManager { - public IFreeSql BBWYfsql { get; set; } + public IFreeSql BBWYBfsql { get; set; } public IFreeSql MDSfsql { get; set; } + + public IFreeSql BBWYCfsql { get; set; } } } diff --git a/BBWYB.Server.Business/JD/JDBusiness.cs b/BBWYB.Server.Business/JD/JDBusiness.cs index d00139d..42fd4e6 100644 --- a/BBWYB.Server.Business/JD/JDBusiness.cs +++ b/BBWYB.Server.Business/JD/JDBusiness.cs @@ -1,8 +1,12 @@ using BBWYB.Common.Http; using BBWYB.Common.Log; using BBWYB.Common.Models; +using BBWYB.Server.Model; +using BBWYB.Server.Model.Db; +using FreeSql; using JD.Dto; using Newtonsoft.Json; +using System.Text; using Yitter.IdGenerator; namespace BBWYB.Server.Business.JD @@ -11,14 +15,20 @@ namespace BBWYB.Server.Business.JD { private RestApiService restApiService; private VenderBusiness venderBusiness; + private DingDingBusiness dingDingBusiness; + private TaskSchedulerManager taskSchedulerManager; public JDBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, RestApiService restApiService, - VenderBusiness venderBusiness) : base(fsql, nLogManager, idGenerator) + VenderBusiness venderBusiness, + DingDingBusiness dingDingBusiness, + TaskSchedulerManager taskSchedulerManager) : base(fsql, nLogManager, idGenerator) { this.restApiService = restApiService; this.venderBusiness = venderBusiness; + this.dingDingBusiness = dingDingBusiness; + this.taskSchedulerManager = taskSchedulerManager; } public ApiResponse> GetJDInStoreOrderDetailList(string sourceShopName, IList poOrderNos) @@ -50,5 +60,196 @@ namespace BBWYB.Server.Business.JD return new ApiResponse>() { Code = 0, Msg = ex.Message }; } } + + public void CheckInStoreOrder() + { + List orderIds = null; + List> updateOrderList = new List>(); + List insertTimeLimitTaskList = new List(); + try + { + var checkTaskList = fsql.Select().Where(x => x.IsChecked == false).ToList(); + if (checkTaskList.Count() == 0) + return; + + orderIds = checkTaskList.Select(x => x.OrderId).ToList(); + var timelimitTaskList = fsql.Select().Where(t => orderIds.Contains(t.OrderId) && t.TaskType == Enums.TimeLimitTaskType.待核算任务).ToList(); + + var orderPurchaseInfoList = fsql.Select().Where(opi => orderIds.Contains(opi.OrderId) && opi.IsEnabled == true).ToList(); + + var waitCheckInStoreOrderList = fsql.Select() + .InnerJoin((io, o) => io.OrderId == o.Id) + .Where((io, o) => orderIds.Contains(io.OrderId) && !string.IsNullOrEmpty(o.SourceShopName)) + .ToList((io, o) => new + { + io.Id, + io.PurchaseOrderId, + io.CreateTime, + io.InStorePurchaseOrderId, + io.OrderId, + io.ShopId, + io.WaybillNo, + o.SourceShopName + }); + var shopIds = checkTaskList.Select(x => x.ShopId.ToString()).ToList(); + var shopList = venderBusiness.GetShopList(shopIds); + + foreach (var checkTask in checkTaskList) + { + var dingdingMsg = new StringBuilder(); + var inStoreOrderRelationList = waitCheckInStoreOrderList.Where(x => x.OrderId == checkTask.OrderId).ToList(); + var currentPurchaseOrderList = orderPurchaseInfoList.Where(opi => opi.OrderId == checkTask.OrderId).ToList(); + var shop = shopList.FirstOrDefault(s => s.ShopId == checkTask.ShopId.ToString()); + if (inStoreOrderRelationList == null || inStoreOrderRelationList.Count() == 0) + { + if (currentPurchaseOrderList.Count() > 0) + { + foreach (var opi in currentPurchaseOrderList) + { + dingdingMsg.AppendLine($"店铺名称:{shop?.ShopName}"); + dingdingMsg.AppendLine($"拳探订单号:{checkTask.OrderSn}"); + dingdingMsg.AppendLine($"采购平台:{opi.PurchasePlatform}"); + dingdingMsg.AppendLine($"采购单号:{opi.PurchaseOrderId}"); + dingdingMsg.AppendLine("缺少入仓采购单号"); + dingdingMsg.AppendLine(); + } + } + } + else + { + var poOrderNos = inStoreOrderRelationList.Select(i => i.InStorePurchaseOrderId).Distinct().ToList(); + //查询京东 + var inStoreResponse = GetJDInStoreOrderDetailList(inStoreOrderRelationList.FirstOrDefault().SourceShopName, poOrderNos); + if (!inStoreResponse.Success) + { + if (currentPurchaseOrderList.Count() > 0) + { + foreach (var opi in currentPurchaseOrderList) + { + dingdingMsg.AppendLine($"店铺名称:{shop?.ShopName}"); + dingdingMsg.AppendLine($"拳探订单号:{checkTask.OrderSn}"); + dingdingMsg.AppendLine($"采购平台:{opi.PurchasePlatform}"); + dingdingMsg.AppendLine($"采购单号:{opi.PurchaseOrderId}"); + dingdingMsg.AppendLine($"{inStoreResponse.Msg}"); + dingdingMsg.AppendLine(); + } + } + } + else + { + bool validateResult = true; + foreach (var inStoreOrderRelation in inStoreOrderRelationList) + { + var jdInStore = inStoreResponse.Data.FirstOrDefault(x => x.poOrderNo == inStoreOrderRelation.InStorePurchaseOrderId); + if (jdInStore != null && jdInStore.storageStatus == "2") + continue; + + validateResult = false; + + var opi = currentPurchaseOrderList.FirstOrDefault(opi => opi.PurchaseOrderId == inStoreOrderRelation.PurchaseOrderId); + + if (jdInStore == null) + { + dingdingMsg.AppendLine($"店铺名称:{shop?.ShopName}"); + dingdingMsg.AppendLine($"拳探订单号:{checkTask.OrderSn}"); + dingdingMsg.AppendLine($"采购平台:{opi?.PurchasePlatform}"); + dingdingMsg.AppendLine($"采购单号:{opi?.PurchaseOrderId}"); + dingdingMsg.AppendLine($"入仓采购单号:{inStoreOrderRelation.InStorePurchaseOrderId}"); + dingdingMsg.AppendLine($"未找到该入仓采购单号"); + dingdingMsg.AppendLine(); + continue; + } + + var stateText = ""; + switch (jdInStore.storageStatus) + { + case "1": + stateText = "有差异待确认"; + break; + case "3": + stateText = "待确认"; + break; + case "4": + stateText = "有差异已确认"; + break; + } + + dingdingMsg.AppendLine($"店铺名称:{shop?.ShopName}"); + dingdingMsg.AppendLine($"拳探订单号:{checkTask.OrderSn}"); + dingdingMsg.AppendLine($"采购平台:{opi?.PurchasePlatform}"); + dingdingMsg.AppendLine($"采购单号:{opi?.PurchaseOrderId}"); + dingdingMsg.AppendLine($"入仓采购单号:{inStoreOrderRelation.InStorePurchaseOrderId}"); + dingdingMsg.AppendLine($"入仓采购单状态:{jdInStore.storageStatus} {stateText}"); + dingdingMsg.AppendLine(); + } + + if (validateResult) + { + var update = fsql.Update().Set(o => o.OrderState, Enums.OrderState.待核算) + .Where(o => o.Id == checkTask.OrderId && o.OrderState == Enums.OrderState.待验收); + updateOrderList.Add(update); + + if (!timelimitTaskList.Any(t => t.OrderId == checkTask.OrderId && t.TaskType == Enums.TimeLimitTaskType.待核算任务)) + { + //创建待核算任务 + var t = new TimeLimitTask() + { + CreateTme = DateTime.Now, + Id = idGenerator.NewLong(), + OrderId = checkTask.OrderId, + OrderSn = checkTask.OrderSn, + ShopId = checkTask.ShopId, + TaskType = Enums.TimeLimitTaskType.待核算任务, + ExpirationTime = DateTime.Now.AddDays(1) + }; + insertTimeLimitTaskList.Add(t); + } + } + } + } + + if (dingdingMsg.Length > 0) + { + Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + } + } + } + catch (Exception ex) + { + nLogManager.Default().Error(ex, "CheckInStoreOrder"); + } + finally + { + try + { + fsql.Transaction(() => + { + if (updateOrderList.Count() > 0) + { + foreach (var update in updateOrderList) + update.ExecuteAffrows(); + } + + if (orderIds != null && orderIds.Count() > 0) + fsql.Update().Set(x => x.IsChecked, true).Where(x => orderIds.Contains(x.OrderId)).ExecuteAffrows(); + + if (insertTimeLimitTaskList.Count() > 0) + fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows(); + }); + } + catch { } + } + } + + private void SendDingDing(string content) + { + try + { + dingDingBusiness.SendDingDingBotMessage("SEC5f08a3dd6813e50bf9a3b81350ec12a8086c64b9e29ef858a17f5cc7887906d7", + "https://oapi.dingtalk.com/robot/send?access_token=7ce472411bb8dde0c3ff503fcca9ead84d39950ee3c4c65c808dbc58981eb929", + content); + } + catch { } + } } } diff --git a/BBWYB.Server.Business/Order/Message/OrderMessageBusiness.cs b/BBWYB.Server.Business/Order/Message/OrderMessageBusiness.cs index c65a7dc..72cf597 100644 --- a/BBWYB.Server.Business/Order/Message/OrderMessageBusiness.cs +++ b/BBWYB.Server.Business/Order/Message/OrderMessageBusiness.cs @@ -1,5 +1,6 @@ using BBWYB.Common.Log; using BBWYB.Common.Models; +using BBWYB.Server.Business.Sync; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using Yitter.IdGenerator; @@ -9,10 +10,19 @@ namespace BBWYB.Server.Business public class OrderMessageBusiness : BaseBusiness, IDenpendency { private MDSBusiness mdsBusiness; + private OrderSyncBusiness orderSyncBusiness; + private FreeSqlMultiDBManager mfsql; - public OrderMessageBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, MDSBusiness mdsBusiness) : base(fsql, nLogManager, idGenerator) + public OrderMessageBusiness(IFreeSql fsql, + NLogManager nLogManager, + IIdGenerator idGenerator, + MDSBusiness mdsBusiness, + OrderSyncBusiness orderSyncBusiness, + FreeSqlMultiDBManager mfsql) : base(fsql, nLogManager, idGenerator) { this.mdsBusiness = mdsBusiness; + this.orderSyncBusiness = orderSyncBusiness; + this.mfsql = mfsql; } public void AddOrderMessage(AddOrderMessageRequest request, string token, string clientCode) @@ -23,9 +33,26 @@ namespace BBWYB.Server.Business if (string.IsNullOrEmpty(clientCode)) throw new BusinessException("缺少客户端标识"); + string orderSn = string.Empty; + long? shopId = null; var order = fsql.Select(request.OrderId).ToOne(); if (order == null) - throw new BusinessException("订单不存在"); + { + var bbwyPurchaseOrder = mfsql.BBWYCfsql.Ado.QuerySingle($"select * from purchaseorderv2 where Id='{request.OrderId}'"); + if (bbwyPurchaseOrder == null) + throw new BusinessException("订单不存在"); + else + { + orderSn = bbwyPurchaseOrder.OrderSn; + shopId = bbwyPurchaseOrder.ShopId; + } + } + else + { + orderSn = order.OrderSn; + shopId = order.ShopId; + } + var user = mdsBusiness.GetUserInfo(token); var om = new OrderMessage() @@ -36,8 +63,8 @@ namespace BBWYB.Server.Business CreatorName = user.UserName, Message = request.Message, OrderId = request.OrderId, - OrderSn = order.OrderSn, - ShopId = order.ShopId, + OrderSn = orderSn, + ShopId = shopId, From = clientCode }; fsql.Insert(om).ExecuteAffrows(); diff --git a/BBWYB.Server.Business/Order/OrderBusiness.cs b/BBWYB.Server.Business/Order/OrderBusiness.cs index e889a35..b231f07 100644 --- a/BBWYB.Server.Business/Order/OrderBusiness.cs +++ b/BBWYB.Server.Business/Order/OrderBusiness.cs @@ -12,6 +12,7 @@ using Newtonsoft.Json; using SDKAdapter; using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Models; +using System.Collections.Concurrent; using System.Linq.Expressions; using System.Security.Cryptography; using Yitter.IdGenerator; @@ -524,15 +525,23 @@ namespace BBWYB.Server.Business public void CancelOrder(CancelOrderRequest request, string mdsToken) { - opPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.Platform).CancelOrder(new OP_CancelOrderRequest() + try { - AppKey = request.AppKey, - AppSecret = request.AppSecret, - AppToken = request.AppToken, - OrderId = request.OrderId, - Platform = (AdapterEnums.PlatformType)request.Platform, - Remark = request.Remark - }); + opPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.Platform).CancelOrder(new OP_CancelOrderRequest() + { + AppKey = request.AppKey, + AppSecret = request.AppSecret, + AppToken = request.AppToken, + OrderId = request.OrderId, + Platform = (AdapterEnums.PlatformType)request.Platform, + Remark = request.Remark + }); + } + catch (Exception ex) + { + if (!ex.Message.Contains("订单已删除")) + throw new BusinessException(ex.Message); + } fsql.Transaction(() => { @@ -726,7 +735,7 @@ namespace BBWYB.Server.Business updateOrderSku = fsql.Update(orderSku.Id).Set(osku => osku.IsCheck, true); var oldOrderState = dbOrder.OrderState; - dbOrder.CalculationOrderState(fsql, out _, orderSkuList, null); + dbOrder.CalculationOrderState(fsql, orderSkuList); if (oldOrderState != dbOrder.OrderState) updateOrder = fsql.Update(dbOrder.Id).Set(o => o.OrderState, dbOrder.OrderState); @@ -744,21 +753,27 @@ namespace BBWYB.Server.Business throw new BusinessException("未查询到订单"); if (order.OrderState != Enums.OrderState.待核算) throw new BusinessException("订单状态不正确,只有待核算的订单才允许核算"); - var orderCost = fsql.Select(orderId).ToOne(); - if (orderCost == null) - throw new BusinessException("未查询到订单成本"); - if (Math.Abs(orderCost.Profit ?? 0) > 1M) - throw new BusinessException("订单利润绝对值不能大于1"); + //var orderCost = fsql.Select(orderId).ToOne(); + //if (orderCost == null) + // throw new BusinessException("未查询到订单成本"); + //if (Math.Abs(orderCost.Profit ?? 0) > 1M) + // throw new BusinessException("订单利润绝对值不能大于1"); + + var orderSkuCostList = fsql.Select().Where(o => o.OrderId == orderId).ToList(); + if (orderSkuCostList.Count() == 0) + throw new BusinessException("未查询到订单sku成本"); + if (orderSkuCostList.Any(osc => Math.Abs(osc.Profit ?? 0) > 1)) + throw new BusinessException("订单sku利润绝对值不能大于1"); fsql.Transaction(() => - { - fsql.Update(orderId).Set(o => o.OrderState, Enums.OrderState.已完成).ExecuteAffrows(); - fsql.Update().Set(t => t.CompletionTime, DateTime.Now) - .Set(t => t.IsTimely == (DateTime.Now < t.ExpirationTime ? true : false)) - .Where(t => t.OrderId == orderId) - .Where(t => t.CompletionTime == null) - .Where(t => t.TaskType == Enums.TimeLimitTaskType.待核算任务).ExecuteAffrows(); - }); + { + fsql.Update(orderId).Set(o => o.OrderState, Enums.OrderState.已完成).ExecuteAffrows(); + fsql.Update().Set(t => t.CompletionTime, DateTime.Now) + .Set(t => t.IsTimely == (DateTime.Now < t.ExpirationTime ? true : false)) + .Where(t => t.OrderId == orderId) + .Where(t => t.CompletionTime == null) + .Where(t => t.TaskType == Enums.TimeLimitTaskType.待核算任务).ExecuteAffrows(); + }); SendPurchaseOrderStateToC(orderId, Enums.OrderState.已完成); } @@ -767,15 +782,21 @@ namespace BBWYB.Server.Business { try { - restApiService.SendRequest("https://bbwy.qiyue666.com", "api/BatchPurchase/UpdatePurchaseOrderState", new +#if DEBUG + var url = "https://bbwy.qiyue666.com"; +#else + var url = "http://172.16.54.105:8090"; +#endif + + restApiService.SendRequest(url, "api/BatchPurchase/UpdatePurchaseOrderState", new { OrderId = orderId, PurchaseOrderState = orderState }, null, HttpMethod.Post); } - catch + catch (Exception ex) { - + nLogManager.Default().Error(ex, $"OrderId-{orderId}推送C订单状态[{orderState}]失败"); } } diff --git a/BBWYB.Server.Business/Product/ProductBusiness.cs b/BBWYB.Server.Business/Product/ProductBusiness.cs index 1f2e4fc..35954b7 100644 --- a/BBWYB.Server.Business/Product/ProductBusiness.cs +++ b/BBWYB.Server.Business/Product/ProductBusiness.cs @@ -1,6 +1,8 @@ using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Model; +using BBWYB.Server.Model.Dto; +using Microsoft.Extensions.DependencyInjection; using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Models; using Yitter.IdGenerator; @@ -10,10 +12,13 @@ namespace BBWYB.Server.Business public class ProductBusiness : BaseBusiness, IDenpendency { private OP_PlatformClientFactory opPlatformClientFactory; + private Lazy purchaseSchemeBusinessLazy; + private PurchaseSchemeBusiness purchaseSchemeBusiness => purchaseSchemeBusinessLazy.Value; - public ProductBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, OP_PlatformClientFactory opPlatformClientFactory) : base(fsql, nLogManager, idGenerator) + public ProductBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, OP_PlatformClientFactory opPlatformClientFactory, IServiceProvider serviceProvider) : base(fsql, nLogManager, idGenerator) { this.opPlatformClientFactory = opPlatformClientFactory; + this.purchaseSchemeBusinessLazy = new Lazy(() => serviceProvider.GetService()); } public OP_ProductListResponse GetProductList(OP_QueryProductRequest request) @@ -26,6 +31,116 @@ namespace BBWYB.Server.Business return opPlatformClientFactory.GetClient(request.Platform).GetProductSkuList(request); } + public BProductListResponse GetProductAndSkuList(QueryBProductRequest request) + { + if (string.IsNullOrEmpty(request.Spu) && !string.IsNullOrEmpty(request.Sku)) + { + var skuResponse = GetProductSkuList(new OP_QueryProductSkuRequest() + { + AppSecret = request.AppSecret, + AppKey = request.AppKey, + AppToken = request.AppToken, + PageIndex = 1, + PageSize = 50, + Platform = request.Platform, + Sku = request.Sku, + Spu = request.Spu + }); + if (skuResponse.Count > 0) + { + request.Spu = skuResponse.Items.FirstOrDefault().ProductId; + request.PageIndex = 1; + request.PageSize = 50; + } + } + + var list = new List(); + var spuResponse = GetProductList(new OP_QueryProductRequest() + { + AppSecret = request.AppSecret, + AppKey = request.AppKey, + AppToken = request.AppToken, + PageIndex = request.PageIndex, + PageSize = request.PageSize, + Platform = request.Platform, + Spu = request.Spu + }); + + var skuIdList = new List(); + if (spuResponse.Items.Count() > 0) + { + foreach (var op_product in spuResponse.Items) + { + var bproduct = new BProductResponse() + { + Id = op_product.Id, + BrandName = op_product.BrandName, + CreateTime = op_product.CreateTime, + Logo = op_product.Logo, + ProductItemNum = op_product.ProductItemNum, + State = op_product.State, + Title = op_product.Title + }; + list.Add(bproduct); + var skuResponse = GetProductSkuList(new OP_QueryProductSkuRequest + { + AppSecret = request.AppSecret, + AppKey = request.AppKey, + AppToken = request.AppToken, + PageIndex = 1, + PageSize = 50, + Platform = request.Platform, + Spu = op_product.Id + }); + if (skuResponse.Count > 0) + { + bproduct.SkuList = skuResponse.Items.Select(x => new BProductSkuResponse() + { + CreateTime = x.CreateTime, + Id = x.Id, + Logo = x.Logo, + Price = x.Price, + ProductId = x.ProductId, + State = x.State, + Title = x.Title + }).ToList(); + skuIdList.AddRange(skuResponse.Items.Select(s => s.Id)); + } + } + } + + var schemeCountRes = purchaseSchemeBusiness.GetPurchaseSchemeCountList(new QuerySchemeCountRequest() + { + SkuIdList = skuIdList + }); + foreach (var bproduct in list) + { + foreach (var bsku in bproduct.SkuList) + bsku.SchemeCount = schemeCountRes.FirstOrDefault(ps => ps.SkuId == bsku.Id)?.SchemeCount ?? 0; + } + + return new BProductListResponse() + { + Count = spuResponse.Count, + Items = list + }; + } + + public decimal? GetProductSkuPrice(QueryProductSkuPriceRequest request) + { + var response = GetProductSkuList(new OP_QueryProductSkuRequest() + { + AppSecret = request.AppSecret, + AppKey = request.AppKey, + AppToken = request.AppToken, + PageIndex = 1, + PageSize = 1, + Platform = (SDKAdapter.AdapterEnums.PlatformType)request.Platform, + Sku = request.Sku + }); + return response.Items?.FirstOrDefault()?.Price; + } + public void EditProductPrice(OP_EditProductPriceRequest request) { var skuRequest = new OP_QueryProductSkuRequest() diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 9347618..15ea68e 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -4,12 +4,12 @@ using BBWYB.Common.Models; using BBWYB.Server.Business.Extensions; using BBWYB.Server.Business.JD; using BBWYB.Server.Model; +using BBWYB.Server.Model.Core; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Db.Mds; using BBWYB.Server.Model.Db.MDS; using BBWYB.Server.Model.Dto; using FreeSql; -using JD.Dto; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -19,6 +19,7 @@ using SDKAdapter.OperationPlatform.Models; using SDKAdapter.PurchasePlatform.Client; using SDKAdapter.PurchasePlatform.Models; using System.Text; +using System.Text.RegularExpressions; using Yitter.IdGenerator; namespace BBWYB.Server.Business @@ -36,6 +37,7 @@ namespace BBWYB.Server.Business private Lazy jdBusinessLazy; private Lazy opPlatformClientFactoryLazy; private Lazy venderBusinessLazy; + private Lazy purchaseSchemeBusinessLazy; private PP_PlatformClientFactory ppPlatformClientFactory => pplatformClientFactoryLazy.Value; private TaskSchedulerManager taskSchedulerManager => taskSchedulerManagerLazy.Value; @@ -50,6 +52,8 @@ namespace BBWYB.Server.Business private JDBusiness jdBusiness => jdBusinessLazy.Value; + private PurchaseSchemeBusiness purchaseSchemeBusiness => purchaseSchemeBusinessLazy.Value; + private IList cantPurchaseOrderStateList; public PurchaseOrderBusiness(IFreeSql fsql, @@ -68,6 +72,7 @@ namespace BBWYB.Server.Business jdBusinessLazy = new Lazy(() => serviceProvider.GetService()); opPlatformClientFactoryLazy = new Lazy(() => serviceProvider.GetService()); venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); + purchaseSchemeBusinessLazy = new Lazy(() => serviceProvider.GetService()); cantPurchaseOrderStateList = new List() { Enums.OrderState.已取消, @@ -140,7 +145,6 @@ namespace BBWYB.Server.Business #endregion var extJArray = new List(); - var errorBuilder = new StringBuilder(); var freightAmount = 0M; var productAmount = 0M; var totalAmount = 0M; @@ -197,8 +201,33 @@ namespace BBWYB.Server.Business } catch (Exception ex) { + var errorBuilder = new StringBuilder(); errorBuilder.AppendLine($"采购商:{cargoParamGroup.PurchaserName}"); - errorBuilder.AppendLine(ex.Message); + #region 匹配订单sku + if (ex.Message.Contains("库存不足")) + { + var match = Regex.Match(ex.Message, @"商品\[(\d+)_(\w+)\]"); + if (match.Success) + { + var purchaseProductId = match.Groups[1].Value; + var purchaseSkuSpecId = match.Groups[2].Value; + + var errorCargoParam = cargoParamGroup.CargoParamList.FirstOrDefault(c => c.SpecId == purchaseSkuSpecId && c.ProductId == purchaseProductId); + if (errorCargoParam != null) + { + errorBuilder.AppendLine($"订单sku[{errorCargoParam.BelongSkuId}]所使用的配件[${errorCargoParam.SkuId}]库存不足"); + } + } + else + { + errorBuilder.AppendLine(ex.Message); + } + } + else + { + errorBuilder.AppendLine(ex.Message); + } + #endregion throw new BusinessException(errorBuilder.ToString()); } } @@ -288,7 +317,7 @@ namespace BBWYB.Server.Business List insertOrderCostDetails = new List(); List insertOrderPurchaseInfos = new List(); List insertOrderPurchaseSkuInfos = new List(); - List updatePurchaseTimeSchemeIdList = new List(); + List> updatePurchaseSchemeList = new List>(); List insertOrderPurchaseRelationInfoList = new List(); List updatePurchaseTimeLimitTaskOrderSkuList = new List(); List notifyQikuPackSchemeParamList = null; @@ -299,6 +328,7 @@ namespace BBWYB.Server.Business IUpdate updateOrderCost = null; List insertOrderSkuCostList = new List(); IList> updateOrderSkuCostList = new List>(); + List createdPurchaseOrderItemList = new List(); foreach (var cargoParamGroup in request.CargoParamGroupList) { @@ -309,8 +339,6 @@ namespace BBWYB.Server.Business var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)cargoParamGroup.PurchasePlatform); var extJson = extJArray.FirstOrDefault(j => j.Value("PurchaserId") == cargoParamGroup.PurchaserId); - updatePurchaseTimeSchemeIdList.AddRange(cargoParamGroup.CargoParamList.Select(p => p.SchemeId).Distinct()); - var orderProductParamList = CombineRepeatPurchaseSku(cargoParamGroup.CargoParamList); var createOrderResponse = client.CreateOrder(new PP_CreateOrderRequest() @@ -343,15 +371,15 @@ namespace BBWYB.Server.Business AppToken = purchaseAccount.AppToken, OrderId = createOrderResponse.OrderId }); + createdPurchaseOrderItemList.AddRange(purchaseOrderSimpleInfo.ItemList); //totalPurchaseProductAmount += purchaseOrderSimpleInfo.ProductAmount; //totalPurchaseFreight += purchaseOrderSimpleInfo.FreightAmount; + #region 创建订单采购关系 foreach (var cargoParam in cargoParamGroup.CargoParamList) { var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == cargoParam.BelongSkuId); - - #region 创建订单采购关系 insertOrderPurchaseRelationInfoList.Add(new OrderPurchaseRelationInfo() { Id = idGenerator.NewLong(), @@ -364,38 +392,20 @@ namespace BBWYB.Server.Business PurchaseSpecId = cargoParam.SpecId, Quantity = cargoParam.Quantity, SchemeId = cargoParam.SchemeId, - SourceSkuId = orderSku?.BelongSkuId + SourceSkuId = orderSku?.BelongSkuId, + SchemeVersion = cargoParam.SchemeVersion ?? 1 }); - #endregion } + #endregion - //采购单总件数,由于1688运费只存在订单层,sku层没有运费,所以需要以订单总件数为基础等比计算采购运费 - var purchaseSkuTotalQuantity = purchaseOrderSimpleInfo.ItemList.Sum(x => x.Quantity); - var belongSkuGroups = cargoParamGroup.CargoParamList.GroupBy(p => p.BelongSkuId); - var belongSkuIdList = belongSkuGroups.Select(bsg => bsg.Key).ToList(); - foreach (var belongSkuGroup in belongSkuGroups) + #region 等比计算采购成本 + var proportionalCalculationResultList = ProportionalCalculationCost(cargoParamGroup.CargoParamList, purchaseOrderSimpleInfo); + foreach (var proportionalCalculationResult in proportionalCalculationResultList) { - var belongSkuId = belongSkuGroup.Key; - var currentOrderSkuCargoParamList = cargoParamGroup.CargoParamList.Where(p => p.BelongSkuId == belongSkuId); //找当前skuId的采购skuId - - var currentSkuAmount = 0M; //采购成本 - var currentSkuTotalPurchaseQuantity = currentOrderSkuCargoParamList.Sum(x => x.Quantity); //当前skuId的采购数量总和 - var currentPurchaseFreight = purchaseOrderSimpleInfo.FreightAmount * - (1.0M * currentSkuTotalPurchaseQuantity / purchaseSkuTotalQuantity); //采购运费 + var skuId = proportionalCalculationResult.SkuId; - foreach (var currentOrderSkuCargo in currentOrderSkuCargoParamList) - { - var currentPurchaseSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) - .Sum(p => p.ProductAmount); - var currentPurchaseSkuTotalQuantity = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) - .Sum(p => p.Quantity); - - currentSkuAmount += currentPurchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity / currentPurchaseSkuTotalQuantity); - //currentPurchaseFreight += purchaseOrderSimpleInfo.FreightAmount * (1.0M * currentOrderSkuCargo.Quantity / purchaseSkuTotalQuantity); - } - #region 成本明细 - var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == belongSkuId); + var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == skuId); var orderCostDetail = new OrderCostDetail() { Id = idGenerator.NewLong(), @@ -404,18 +414,19 @@ namespace BBWYB.Server.Business OrderId = request.OrderId, ProductId = orderSku.ProductId, PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, - SkuId = belongSkuId, + SkuId = skuId, IsEnabled = true }; - orderCostDetail.CalculationOrderCostDetailCostAndProfit(currentSkuAmount, - currentPurchaseFreight, + orderCostDetail.CalculationOrderCostDetailCostAndProfit(proportionalCalculationResult.ProductAmount, + proportionalCalculationResult.FreightAmount, 0M, 0M); insertOrderCostDetails.Add(orderCostDetail); - #endregion } + #endregion #region 采购订单信息 + var belongSkuIdList = cargoParamGroup.CargoParamList.Select(c => c.BelongSkuId).Distinct().ToList(); var orderPurchaserInfo = new OrderPurchaseInfo() { Id = idGenerator.NewLong(), @@ -478,7 +489,8 @@ namespace BBWYB.Server.Business notifyQikuPackSchemeParamList.Add(new QiKuPackTaskSkuPurchaseSchemeIdRequest() { SkuId = orderSku.BelongSkuId, - SkuPurchaseSchemeId = cargoParam.SchemeId.ToString() + SkuPurchaseSchemeId = cargoParam.SchemeId.ToString(), + SchemeVersion = cargoParam.SchemeVersion ?? 1 }); } } @@ -486,6 +498,27 @@ namespace BBWYB.Server.Business #endregion } + #region 更新采购方案最近采购价格 + { + var allCargoParamList = new List(); + + request.CargoParamGroupList.ForEach(x => allCargoParamList.AddRange(x.CargoParamList)); + + var cargoParamGroupsBySchemeList = allCargoParamList.GroupBy(c => c.SchemeId); + foreach (var cargoParamGroupsByScheme in cargoParamGroupsBySchemeList) + { + var defalutCost = 0M; + var schemeId = cargoParamGroupsByScheme.Key; + + defalutCost = cargoParamGroupsByScheme.Sum(cargoParam => createdPurchaseOrderItemList.Where(x => x.SkuId == cargoParam.SkuId) + .Select(x => x.Price * (cargoParam.PurchaseRatio ?? 1)).DefaultIfEmpty(0M).First()); + var update = fsql.Update(schemeId).Set(ps => ps.LastPurchaseTime, DateTime.Now) + .Set(ps => ps.LastPurchasePriceCost, defalutCost); + updatePurchaseSchemeList.Add(update); + } + } + #endregion + #region 订单Sku成本 var allOrderCostDetail = orderCostDetailList.Union(insertOrderCostDetails).ToList(); foreach (var orderSku in orderSkus) @@ -541,7 +574,7 @@ namespace BBWYB.Server.Business #endregion #region 订单状态 - dbOrder.CalculationOrderState(fsql, out _, orderSkus, orderPurchaseInfoList.Union(insertOrderPurchaseInfos).ToList()); + dbOrder.CalculationOrderState(fsql, orderSkus, orderPurchaseInfoList.Union(insertOrderPurchaseInfos).ToList()); #endregion #region 通知C端状态 @@ -579,8 +612,11 @@ namespace BBWYB.Server.Business fsql.Insert(insertOrderPurchaseRelationInfoList).ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); insertOrderCost?.ExecuteAffrows(); - if (updatePurchaseTimeSchemeIdList.Count() > 0) - fsql.Update(updatePurchaseTimeSchemeIdList).Set(p => p.LastPurchaseTime, DateTime.Now).ExecuteAffrows(); + if (updatePurchaseSchemeList.Count() > 0) + { + foreach (var update in updatePurchaseSchemeList) + update.ExecuteAffrows(); + } fsql.Update(request.OrderId).Set(o => o.OrderState, dbOrder.OrderState) .SetIf(!string.IsNullOrEmpty(request.Remark), o => o.PurchaseRemark, request.Remark) .Set(o => o.IsPurchased, true) @@ -593,6 +629,21 @@ namespace BBWYB.Server.Business update.ExecuteAffrows(); } }); + + //#region 更新采购方案最新价格 + //Task.Factory.StartNew(() => + //{ + // try + // { + // purchaseSchemeBusiness.RefreshPurchaseScheme(new RefreshSchemeRequest() + // { + // SchemeIdList = updatePurchaseTimeSchemeIdList + // }); + // } + // catch { } + + //}, CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + //#endregion } /// @@ -745,12 +796,13 @@ namespace BBWYB.Server.Business { if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴) { - #region 补齐采购SKU + #region 补齐采购SKU和采购关系 var purchaseAccount = dbPurchaseAccountList.FirstOrDefault(pa => pa.Id == purchaseOrder.PurchaseAccountId || pa.AccountName == purchaseOrder.PurchaseAccountName); if (purchaseAccount == null) throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId}缺少有效的采购账号"); + #region 查询1688采购单 var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)purchaseOrder.PurchasePlatform); var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() { @@ -759,6 +811,7 @@ namespace BBWYB.Server.Business AppToken = purchaseAccount.AppToken, OrderId = purchaseOrder.PurchaseOrderId }); + #endregion #region 处理采购商Id var purchaserId = purchaseOrderSimpleInfo.PurchaserId; @@ -778,58 +831,29 @@ namespace BBWYB.Server.Business #region 匹配采购方案 var skuIds = purchaseOrder.AssocationOrderCostDetailList.Select(ocd => ocd.SkuId).ToList(); - var purchaseSchemeSkuList = fsql.Select() - .InnerJoin((p, ps, pss) => p.Id == ps.PurchaserId) - .InnerJoin((p, ps, pss) => ps.Id == pss.SkuPurchaseSchemeId) - .Where((p, ps, pss) => p.Id == purchaserId) - .Where((p, ps, pss) => ps.PurchasePlatform == Enums.Platform.阿里巴巴) - .Where((p, ps, pss) => skuIds.Contains(pss.SkuId)) - .ToList((p, ps, pss) => new - { - pss.Id, - pss.SkuId, - pss.ProductId, - pss.PurchaseProductId, - pss.PurchaseSkuId, - pss.PurchaseSkuSpecId, - pss.SkuPurchaseSchemeId - }); - if (purchaseSchemeSkuList.Count() == 0) - throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId} 采购商Id{purchaserId} 未匹配到采购方案"); - #endregion - - - foreach (var purchaseOrderSku in purchaseOrderSimpleInfo.ItemList) + var purchaseSchemeList = purchaseSchemeBusiness.GetPurchaseSchemeList(new QuerySchemeRequest() { - var orderPurchaseSkuInfo = new OrderPurchaseSkuInfo() - { - Id = purchaseOrderSku.OrderSkuId, - CreateTime = DateTime.Now, - OrderId = request.OrderId, - PurchaseOrderId = purchaseOrder.PurchaseOrderId, - PurchaseProductId = purchaseOrderSku.ProductId, - PurchaseSkuId = purchaseOrderSku.SkuId, - ShopId = request.ShopId - }; - insertOrderPurchaseSkuInfoList.Add(orderPurchaseSkuInfo); - } + ShopId = dbOrder.ShopId, + SkuIdList = skuIds + }); + if (purchaseSchemeList.Count() == 0) + throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId} 采购商Id{purchaserId} 未匹配到采购方案"); #endregion #region 补齐采购关系 foreach (var assOrderCostDetail in purchaseOrder.AssocationOrderCostDetailList) { - var currentPurchaseSchemeSkuList = purchaseSchemeSkuList.Where(x => x.SkuId == assOrderCostDetail.SkuId).ToList(); - if (currentPurchaseSchemeSkuList == null || currentPurchaseSchemeSkuList.Count() == 0) + var matchResultList = MatchPurchaseScheme(assOrderCostDetail.SkuId, + assOrderCostDetail.PurchaseQuantity, + purchaserId, + purchaseSchemeList, + purchaseOrderSimpleInfo); + if (matchResultList.Count() == 0) throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId} 采购商Id {purchaserId} Sku{assOrderCostDetail.SkuId}缺少采购方案"); - var dbOrderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == assOrderCostDetail.SkuId); - foreach (var currentPurchaseSchemeSku in currentPurchaseSchemeSkuList) + foreach (var cargoParam in matchResultList) { - var purchaseSkuFromApi = purchaseOrderSimpleInfo.ItemList.FirstOrDefault(x => x.SkuId == currentPurchaseSchemeSku.PurchaseSkuId); - if (purchaseSkuFromApi == null) - { - throw new BusinessException($"Sku{assOrderCostDetail.SkuId}使用了采购方案{currentPurchaseSchemeSku.SkuPurchaseSchemeId}下的采购Sku{currentPurchaseSchemeSku.PurchaseSkuId},而且在采购单{purchaseOrder.PurchaseOrderId}的商品明细中没有找到该采购sku"); - } + var dbOrderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == assOrderCostDetail.SkuId); var orderPurchaseRelationInfo = new OrderPurchaseRelationInfo() { Id = idGenerator.NewLong(), @@ -837,16 +861,38 @@ namespace BBWYB.Server.Business CreateTime = DateTime.Now, OrderId = assOrderCostDetail.OrderId, PurchaseOrderId = purchaseOrder.PurchaseOrderId, - PurchaseSkuId = currentPurchaseSchemeSku.PurchaseSkuId, - PurchaseProductId = currentPurchaseSchemeSku.PurchaseProductId, - PurchaseSpecId = currentPurchaseSchemeSku.PurchaseSkuSpecId, - SchemeId = currentPurchaseSchemeSku.SkuPurchaseSchemeId, + PurchaseSkuId = cargoParam.SkuId, + PurchaseProductId = cargoParam.ProductId, + PurchaseSpecId = cargoParam.SpecId, + SchemeId = cargoParam.SchemeId, + SchemeVersion = cargoParam.SchemeVersion ?? 1, Quantity = assOrderCostDetail.PurchaseQuantity, SourceSkuId = dbOrderSku.BelongSkuId }; insertOrderPurchaseRelationInfoList.Add(orderPurchaseRelationInfo); + } } + + #region 补齐采购SKU + foreach (var purchaseOrderSku in purchaseOrderSimpleInfo.ItemList) + { + var orderPurchaseSkuInfo = new OrderPurchaseSkuInfo() + { + Id = purchaseOrderSku.OrderSkuId, + CreateTime = DateTime.Now, + OrderId = request.OrderId, + PurchaseOrderId = purchaseOrder.PurchaseOrderId, + PurchaseProductId = purchaseOrderSku.ProductId, + PurchaseSkuId = purchaseOrderSku.SkuId, + ShopId = request.ShopId + }; + insertOrderPurchaseSkuInfoList.Add(orderPurchaseSkuInfo); + } + #endregion + + #endregion + #endregion } @@ -1041,7 +1087,7 @@ namespace BBWYB.Server.Business #endregion #region 订单状态 - dbOrder.CalculationOrderState(fsql, out _, dbOrderSkuList, dbPurchaseOrderList.Union(insertOrderPurchaseInfoList).ToList()); + dbOrder.CalculationOrderState(fsql, dbOrderSkuList, dbPurchaseOrderList.Union(insertOrderPurchaseInfoList).ToList()); #endregion #region 通知C端状态 @@ -1113,6 +1159,10 @@ namespace BBWYB.Server.Business if (request.PurchasePlatform != Enums.Platform.阿里巴巴) return null; + var order = fsql.Select(request.OrderId).ToOne(); + if (order == null) + throw new BusinessException("订单不存在"); + var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.PurchasePlatform); var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() { @@ -1143,72 +1193,74 @@ namespace BBWYB.Server.Business #region 查询订单sku所有采购方案 var skuIds = dbOrderSkuList.Select(osku => osku.SkuId).ToList(); - var purchaseSchemeSkuList = fsql.Select() - .InnerJoin((p, ps, pss) => p.Id == ps.PurchaserId) - .InnerJoin((p, ps, pss) => ps.Id == pss.SkuPurchaseSchemeId) - .Where((p, ps, pss) => p.Id == purchaserId) - .Where((p, ps, pss) => ps.PurchasePlatform == Enums.Platform.阿里巴巴) - .Where((p, ps, pss) => skuIds.Contains(pss.SkuId)) - .ToList((p, ps, pss) => new - { - pss.Id, - pss.SkuId, - pss.ProductId, - pss.PurchaseProductId, - pss.PurchaseSkuId, - pss.PurchaseSkuSpecId, - pss.SkuPurchaseSchemeId - }); - if (purchaseSchemeSkuList.Count() == 0) - throw new BusinessException($"采购单{request.PurchaseOrderId} 采购商Id{purchaserId} 未匹配到采购方案"); + var purchaseSchemeList = purchaseSchemeBusiness.GetPurchaseSchemeList(new QuerySchemeRequest() + { + ShopId = order.ShopId, + SkuIdList = skuIds + }); + if (purchaseSchemeList.Count() == 0) + throw new BusinessException("未匹配到采购方案"); #endregion #region 匹配采购单所使用到的采购方案 - var assocationOrderCostDetailList = new List(); - var purchaseSchemeGroups = purchaseSchemeSkuList.GroupBy(s => s.SkuPurchaseSchemeId); var cargoParamList = new List(); - foreach (var schemeGroup in purchaseSchemeGroups) + foreach (var orderSku in dbOrderSkuList) { - var schemePurchaseSkuList = schemeGroup.ToList(); - if (schemePurchaseSkuList.Any(psku => purchaseOrderSimpleInfo.ItemList.Count(x => x.SkuId == psku.PurchaseSkuId) == 0)) - continue; - cargoParamList.AddRange(schemePurchaseSkuList.Select(x => new CargoParamRequest() - { - BelongSkuId = x.SkuId, - ProductId = x.PurchaseProductId, - SkuId = x.PurchaseSkuId, - Quantity = dbOrderSkuList.FirstOrDefault(s => s.SkuId == x.SkuId)?.ItemTotal ?? 1, - SchemeId = x.SkuPurchaseSchemeId, - SpecId = x.PurchaseSkuSpecId - })); + var matchResultList = MatchPurchaseScheme(orderSku.SkuId, orderSku.ItemTotal ?? 1, purchaserId, purchaseSchemeList, purchaseOrderSimpleInfo); + if (matchResultList.Count() > 0) + cargoParamList.AddRange(matchResultList); } - var belongSkuGroups = cargoParamList.GroupBy(p => p.BelongSkuId); - var purchaseSkuTotalQuantity = cargoParamList.Sum(x => x.Quantity); - foreach (var belongSkuGroup in belongSkuGroups) - { - var skuId = belongSkuGroup.Key; - var currentOrderSkuCargoParamList = cargoParamList.Where(p => p.BelongSkuId == skuId); //找当前skuId的采购skuId - - var currentSkuAmount = 0M; //采购成本 - var currentSkuTotalPurchaseQuantity = currentOrderSkuCargoParamList.Sum(x => x.Quantity); //当前skuId的采购数量总和 - var currentPurchaseFreight = purchaseOrderSimpleInfo.FreightAmount * - (1.0M * currentSkuTotalPurchaseQuantity / purchaseSkuTotalQuantity); //采购运费 - - foreach (var currentOrderSkuCargo in currentOrderSkuCargoParamList) - { - var currentPurchaseSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) - .Sum(p => p.ProductAmount); - //var currentPurchaseSkuTotalQuantity = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) - // .Sum(p => p.Quantity); - - var currentPurchaseSkuTotalQuantity = cargoParamList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) - .Sum(p => p.Quantity); - - currentSkuAmount += currentPurchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity / currentPurchaseSkuTotalQuantity); - - } + if (cargoParamList.Count() == 0) + throw new BusinessException("未匹配到采购方案"); + #endregion + #region 等比计算采购成本 + var assocationOrderCostDetailList = new List(); + //var belongSkuGroups = cargoParamList.GroupBy(p => p.BelongSkuId); + //var purchaseSkuTotalQuantity = cargoParamList.Sum(x => x.Quantity); + //foreach (var belongSkuGroup in belongSkuGroups) + //{ + // var skuId = belongSkuGroup.Key; + // //var currentOrderSkuCargoParamList = cargoParamList.Where(p => p.BelongSkuId == skuId); //找当前skuId的采购skuId + // var currentOrderSkuCargoParamList = belongSkuGroup.ToList(); //找当前skuId的采购skuId + + // var currentSkuAmount = 0M; //采购成本 + // var currentSkuTotalPurchaseQuantity = currentOrderSkuCargoParamList.Sum(x => x.Quantity); //当前skuId的采购数量总和 + // var currentPurchaseFreight = purchaseOrderSimpleInfo.FreightAmount * + // (1.0M * currentSkuTotalPurchaseQuantity / purchaseSkuTotalQuantity); //采购运费 + + // foreach (var currentOrderSkuCargo in currentOrderSkuCargoParamList) + // { + // var currentPurchaseSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) + // .Sum(p => p.ProductAmount); + + // var currentPurchaseSkuTotalQuantity = cargoParamList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) + // .Sum(p => p.Quantity); + + // currentSkuAmount += currentPurchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity / currentPurchaseSkuTotalQuantity); + + // } + + // var orderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == skuId); + // var assocationOrderCostDetail = new AssocationOrderCostDetailResponse() + // { + // Logo = orderSku.Logo, + // Title = orderSku.Title, + // SkuId = skuId, + // OrderId = orderSku.OrderId, + // SkuAmount = currentSkuAmount, + // PurchaseQuantity = orderSku.ItemTotal.Value, + // PurchaseFreight = currentPurchaseFreight + // }; + // assocationOrderCostDetail.PurchasePrice = assocationOrderCostDetail.SkuAmount / assocationOrderCostDetail.PurchaseQuantity; + // assocationOrderCostDetailList.Add(assocationOrderCostDetail); + //} + + var proportionalCalculationResultList = ProportionalCalculationCost(cargoParamList, purchaseOrderSimpleInfo); + foreach (var proportionalCalculationResult in proportionalCalculationResultList) + { + var skuId = proportionalCalculationResult.SkuId; var orderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == skuId); var assocationOrderCostDetail = new AssocationOrderCostDetailResponse() { @@ -1216,17 +1268,17 @@ namespace BBWYB.Server.Business Title = orderSku.Title, SkuId = skuId, OrderId = orderSku.OrderId, - SkuAmount = currentSkuAmount, + SkuAmount = proportionalCalculationResult.ProductAmount, PurchaseQuantity = orderSku.ItemTotal.Value, - PurchaseFreight = currentPurchaseFreight + PurchaseFreight = proportionalCalculationResult.FreightAmount }; assocationOrderCostDetail.PurchasePrice = assocationOrderCostDetail.SkuAmount / assocationOrderCostDetail.PurchaseQuantity; assocationOrderCostDetailList.Add(assocationOrderCostDetail); } - #endregion if (assocationOrderCostDetailList.Count() == 0) throw new BusinessException("没有匹配到合适的采购方案"); + #endregion return new AssociationPurchaseOrderResponse(assocationOrderCostDetailList) { @@ -1296,7 +1348,7 @@ namespace BBWYB.Server.Business #endregion orderPurchaseInfoList.Remove(historyPurchaseOrder); - dbOrder.CalculationOrderState(fsql, out _, orderPurchaseInfoList: orderPurchaseInfoList); + dbOrder.CalculationOrderState(fsql, orderPurchaseInfoList: orderPurchaseInfoList); fsql.Transaction(() => { @@ -1339,81 +1391,6 @@ namespace BBWYB.Server.Business }); } - //public void DeletePurchaseOrder(DeletePurchaseOrderRequest request) - //{ - // nLogManager.Default().Info($"DeletePurchaseOrder {JsonConvert.SerializeObject(request)}"); - - // //var po = fsql.Select().Where(opi => opi.PurchaseOrderId == request.PurchaseOrderId).ToOne(); - // //if (po == null) - // // throw new BusinessException("采购单不不存在"); - // //var orderId = po.OrderId; - - // var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == request.OrderId).ToList(); - // var deletePurchaseOrder = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); - // if (deletePurchaseOrder == null) - // throw new BusinessException("采购单不不存在"); - - // var dbOrderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == request.OrderId && - // ocd.PurchaseOrderId != request.PurchaseOrderId).ToList(); - // var dbOrderCost = fsql.Select(request.OrderId).ToOne(); - // var dbOrder = fsql.Select(request.OrderId).ToOne(); - - // var purchaseProductAmount = dbOrderCostDetailList.Count() == 0 ? 0M : dbOrderCostDetailList.Sum(ocd => ocd.SkuAmount) ?? 0M; - // var purchaseFreight = dbOrderCostDetailList.Count() == 0 ? 0M : dbOrderCostDetailList.Sum(ocd => ocd.PurchaseFreight) ?? 0M; - // var outPackAmount = dbOrderCostDetailList.Count() == 0 ? 0M : dbOrderCostDetailList.Sum(ocd => ocd.OutPackAmount) ?? 0M; - // dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, purchaseProductAmount, purchaseFreight, outPackAmount, 0M); - - - // #region 找出失效的快递单 - // List deleteWaybillNoList = new List(); - - // //查询该采购单所使用的快递单号 - // var useWaybillNos = fsql.Select().Where(eori => eori.PurchaseOrderId == request.PurchaseOrderId).ToList(eori => eori.WayBillNo); - - // //查询使用上述快递单号的快递单关系 - // var expressOrderRelationList = fsql.Select().Where(eori => useWaybillNos.Contains(eori.WayBillNo)).ToList(); - - // //以快递单号进行分组 - // var expressOrderRelationGroups = expressOrderRelationList.GroupBy(eori => eori.WayBillNo); - // foreach (var group in expressOrderRelationGroups) - // { - // if (group.Count() == group.Count(eori => eori.PurchaseOrderId == request.PurchaseOrderId)) - // deleteWaybillNoList.Add(group.Key); - // } - // #endregion - - // orderPurchaseInfoList.Remove(deletePurchaseOrder); - // while (orderPurchaseInfoList.Any(opi => opi.IsEnabled == false)) - // { - // var historyPo = orderPurchaseInfoList.FirstOrDefault(opi => opi.IsEnabled == false); - // orderPurchaseInfoList.Remove(historyPo); - // } - // dbOrder.CalculationOrderState(fsql, out _, orderPurchaseInfoList: orderPurchaseInfoList); - - // fsql.Transaction(() => - // { - // fsql.Delete(deletePurchaseOrder.Id).ExecuteAffrows(); - - // fsql.Update() - // .Set(ocd => ocd.IsEnabled, false) - // .Where(ocd => ocd.PurchaseOrderId == request.PurchaseOrderId) - // .ExecuteAffrows(); - - // fsql.Delete().Where(opsi => opsi.PurchaseOrderId == request.PurchaseOrderId).ExecuteAffrows(); - // fsql.Delete().Where(opri => opri.PurchaseOrderId == request.PurchaseOrderId).ExecuteAffrows(); - - // fsql.Delete().Where(eori => eori.PurchaseOrderId == request.PurchaseOrderId).ExecuteAffrows(); - // if (deleteWaybillNoList.Count() > 0) - // fsql.Delete(deleteWaybillNoList).ExecuteAffrows(); - - // fsql.Delete().Where(i => i.OrderId == request.OrderId && i.PurchaseOrderId == request.PurchaseOrderId) - // .ExecuteAffrows(); - - // fsql.Update().SetSource(dbOrderCost).ExecuteAffrows(); - // fsql.Update(dbOrder.Id).Set(o => o.OrderState, dbOrder.OrderState).ExecuteAffrows(); - // }); - //} - /// /// 修改采购快递单 /// @@ -1563,7 +1540,7 @@ namespace BBWYB.Server.Business #region 计算订单状态 var oldOrderState = dbOrder.OrderState; - dbOrder.CalculationOrderState(fsql, out _, null, orderPurchaseInfoList); + dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); if (oldOrderState != dbOrder.OrderState) { updateOrder = fsql.Update(dbOrder.Id).Set(o => o.OrderState, dbOrder.OrderState); @@ -1753,6 +1730,21 @@ namespace BBWYB.Server.Business WayBillNo = request.WaybillNo }; insertExpressOrderRelation = fsql.Insert(expressOrderRelation); + if (!insertPurchaseExpressOrderList.Any(p => p.WaybillNo == request.WaybillNo)) + { + purchaseExpressOrderList.Add(new PurchaseExpressOrder() + { + CreateTime = DateTime.Now, + ShopId = dbOrder.ShopId ?? 0, + TargetExpressId = request.ExpressId, + TargetExpressName = request.ExpressName, + WaybillNo = request.WaybillNo, + ExpressState = kuaiDi100Manager.GetExpressState(1), //快递100发货状态值 默认揽收 + IsSubscribeKD100 = isSubscribeKD100, + ExpressContent = "手动发货", + ExpressChangedTime = DateTime.Now + }); + } } #endregion @@ -1763,7 +1755,7 @@ namespace BBWYB.Server.Business #endregion #region 计算订单状态 - dbOrder.CalculationOrderState(fsql, out _, null, orderPurchaseInfoList); + dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); updateOrder = fsql.Update(dbOrder.Id) .Set(o => o.OrderState, dbOrder.OrderState); #endregion @@ -1793,7 +1785,7 @@ namespace BBWYB.Server.Business /// public void PurchaserDelivery(PurchaserDeliveryRequest request) { - nLogManager.Default().Info($"ManualDelivery {JsonConvert.SerializeObject(request)}"); + nLogManager.Default().Info($"PurchaserDelivery {JsonConvert.SerializeObject(request)}"); var dbOrder = fsql.Select(request.OrderId).ToOne(); if (dbOrder == null) @@ -1885,7 +1877,7 @@ namespace BBWYB.Server.Business dingdingMsg.AppendLine($"源物流公司:无"); dingdingMsg.AppendLine($"目标物流公司:{peoRequest.ExpressName} {peoRequest.ExpressId}"); dingdingMsg.AppendLine($"快递单号:{peoRequest.WaybillNo}"); - dingdingMsg.AppendLine("触发环节:手动发货"); + dingdingMsg.AppendLine("触发环节:厂家代发入仓手动发货"); dingdingMsg.Append($"店铺名:{shop.ShopName}"); Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion @@ -1928,6 +1920,21 @@ namespace BBWYB.Server.Business WayBillNo = peoRequest.WaybillNo }; insertExpressOrderRelationList.Add(expressOrderRelation); + if (!insertPurchaseExpressOrderList.Any(p => p.WaybillNo == peoRequest.WaybillNo)) + { + purchaseExpressOrderList.Add(new PurchaseExpressOrder() + { + CreateTime = DateTime.Now, + ShopId = dbOrder.ShopId ?? 0, + TargetExpressId = peoRequest.ExpressId, + TargetExpressName = peoRequest.ExpressName, + WaybillNo = peoRequest.WaybillNo, + ExpressState = kuaiDi100Manager.GetExpressState(1), //快递100发货状态值 默认揽收 + IsSubscribeKD100 = isSubscribeKD100, + ExpressContent = "手动发货", + ExpressChangedTime = DateTime.Now + }); + } } #endregion @@ -1957,7 +1964,7 @@ namespace BBWYB.Server.Business #endregion #region 计算订单状态 - dbOrder.CalculationOrderState(fsql, out _, null, orderPurchaseInfoList); + dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); updateOrder = fsql.Update(dbOrder.Id) .Set(o => o.OrderState, dbOrder.OrderState); #endregion @@ -2009,7 +2016,6 @@ namespace BBWYB.Server.Business taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } - ///// ///// 手动收货 ///// @@ -2415,7 +2421,7 @@ namespace BBWYB.Server.Business #endregion #region 计算订单状态 - dbOrder.CalculationOrderState(fsql, out _, null, orderPurchaseInfoList); + dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); updateOrder = fsql.Update(dbOrder.Id) .Set(o => o.OrderState, dbOrder.OrderState); #endregion @@ -2525,6 +2531,7 @@ namespace BBWYB.Server.Business List> updateOrderPurchaseList = new List>(); List> updateOrderList = new List>(); List insertTimeLimitTaskList = new List(); + List insertInStoreOrderCheckTaskList = new List(); #region 查询该笔快递单 var tpeo = fsql.Select(wayBillNo).ToOne(); @@ -2610,9 +2617,9 @@ namespace BBWYB.Server.Business #endregion #region 查询入库单信息 - IList inStoreOrderRelationList = null; + IList inStoreOrderCheckTaskList = null; if (orderList.Any(o => o.IntoStoreType == Enums.IntoStoreType.厂商代发入仓) && state == "QianShou") - inStoreOrderRelationList = fsql.Select().Where(i => orderIds.Contains(i.OrderId)).ToList(); + inStoreOrderCheckTaskList = fsql.Select().Where(i => orderIds.Contains(i.OrderId)).ToList(); #endregion #region 计算订单状态和采购单状态 @@ -2620,142 +2627,55 @@ namespace BBWYB.Server.Business { var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList(); var currentPurchaseOrderList = purchaseOrderList.Where(po => po.OrderId == order.Id).ToList(); - foreach (var purchaseOrder in currentPurchaseOrderList) + + #region 计算采购单状态 + foreach (var po in currentPurchaseOrderList) { - var currentPurchaseOrderSkuList = orderPurchaseSkuList.Where(posku => posku.PurchaseOrderId == purchaseOrder.PurchaseOrderId).ToList(); + var currentPoSkuList = orderPurchaseSkuList.Where(posku => posku.PurchaseOrderId == po.PurchaseOrderId).ToList(); - var currentPurchaseExpressOrderList = purchaseExpressOrderList.Where(peo => peo.PurchaseOrderId == purchaseOrder.PurchaseOrderId).ToList(); - var temp = currentPurchaseExpressOrderList.FirstOrDefault(p => p.WaybillNo == wayBillNo); - if (temp != null) - temp.ExpressState = state; + var currentPeoList = purchaseExpressOrderList.Where(peo => peo.PurchaseOrderId == po.PurchaseOrderId).ToList(); + var peo = currentPeoList.FirstOrDefault(p => p.WaybillNo == wayBillNo); + if (peo != null) + peo.ExpressState = state; - var oldPurchaseOrderState = purchaseOrder.OrderState; - purchaseOrder.CalculationOrderState(order.IntoStoreType.Value, fsql, currentPurchaseOrderSkuList, currentPurchaseExpressOrderList); - if (purchaseOrder.OrderState != oldPurchaseOrderState) + var oldPurchaseOrderState = po.OrderState; + po.CalculationOrderState(order.IntoStoreType.Value, fsql, currentPoSkuList, currentPeoList); + if (po.OrderState != oldPurchaseOrderState) { - var update = fsql.Update(purchaseOrder.Id).Set(po => po.OrderState, purchaseOrder.OrderState); + var update = fsql.Update(po.Id).Set(po => po.OrderState, po.OrderState); updateOrderPurchaseList.Add(update); - - #region 通知齐库打包落仓情况 - if (order.IntoStoreType == Enums.IntoStoreType.发回齐越 && state == "QianShou") - { - var currentOrderPurchaseRelationList = orderPurchaseRelationList.Where(opri => opri.PurchaseOrderId == purchaseOrder.PurchaseOrderId).ToList(); - - Task.Factory.StartNew(() => qiKuManager.PublishQiKuReceiveInfo(purchaseOrder, currentOrderPurchaseRelationList, currentPurchaseOrderSkuList, purchaseExpressOrderList), - CancellationToken.None, - TaskCreationOptions.LongRunning, - taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); - } - #endregion } - } - var oldOrderState = order.OrderState; - - if (order.IntoStoreType == Enums.IntoStoreType.厂商代发入仓 && state == "QianShou") - { - #region 检查入库采购单状态 - var isNotifyDingDingWhenInOrderFail = false; - var currentOrder_InStoreOrderRelationList = inStoreOrderRelationList.Where(i => i.OrderId == order.Id).ToList(); - ApiResponse> inStoreResponse = null; - if (currentOrder_InStoreOrderRelationList.Count() > 0) - { - var poOrderNos = currentOrder_InStoreOrderRelationList.Select(i => i.InStorePurchaseOrderId).Distinct().ToList(); - //查询京东 - inStoreResponse = jdBusiness.GetJDInStoreOrderDetailList(order.SourceShopName, poOrderNos); - } - order.CalculationOrderState(fsql, out isNotifyDingDingWhenInOrderFail, currentOrderSkuList, currentPurchaseOrderList, inStoreResponse?.Data); - - if (isNotifyDingDingWhenInOrderFail && inStoreResponse != null) - { - #region 入库单查询有误,通知钉钉 - var shop = venderBusiness.GetShopList(order.ShopId).FirstOrDefault(); - var dingdingMsg = new StringBuilder(); - if (inStoreResponse.Data == null || inStoreResponse.Data.Count() == 0) - { - foreach (var opi in currentPurchaseOrderList) - { - dingdingMsg.AppendLine($"店铺名称:{shop?.ShopName}"); - dingdingMsg.AppendLine($"拳探订单号:{order.OrderSn}"); - dingdingMsg.AppendLine($"采购平台:{opi.PurchasePlatform}"); - dingdingMsg.AppendLine($"采购单号:{opi.PurchaseOrderId}"); - dingdingMsg.AppendLine("缺少入仓采购单号"); - dingdingMsg.AppendLine(); - } - } - else if (!inStoreResponse.Success) - { - foreach (var opi in currentPurchaseOrderList) - { - dingdingMsg.AppendLine($"店铺名称:{shop?.ShopName}"); - dingdingMsg.AppendLine($"拳探订单号:{order.OrderSn}"); - dingdingMsg.AppendLine($"采购平台:{opi.PurchasePlatform}"); - dingdingMsg.AppendLine($"采购单号:{opi.PurchaseOrderId}"); - dingdingMsg.AppendLine($"{inStoreResponse.Msg}"); - dingdingMsg.AppendLine(); - } - } - else - { - foreach (var inStoreOrderRelation in currentOrder_InStoreOrderRelationList) - { - var jdInStore = inStoreResponse.Data.FirstOrDefault(x => x.poOrderNo == inStoreOrderRelation.InStorePurchaseOrderId); - if (jdInStore == null || jdInStore.storageStatus == "2") - continue; - var opi = currentPurchaseOrderList.FirstOrDefault(opi => opi.PurchaseOrderId == inStoreOrderRelation.PurchaseOrderId); - if (opi == null) - continue; - - var stateText = ""; - switch (jdInStore.storageStatus) - { - case "1": - stateText = "有差异待确认"; - break; - case "3": - stateText = "待确认"; - break; - case "4": - stateText = "有差异已确认"; - break; - } - - dingdingMsg.AppendLine($"店铺名称:{shop?.ShopName}"); - dingdingMsg.AppendLine($"拳探订单号:{order.OrderSn}"); - dingdingMsg.AppendLine($"采购平台:{opi.PurchasePlatform}"); - dingdingMsg.AppendLine($"采购单号:{opi.PurchaseOrderId}"); - dingdingMsg.AppendLine($"入仓采购单号:{inStoreOrderRelation.InStorePurchaseOrderId}"); - dingdingMsg.AppendLine($"入仓采购单状态:{jdInStore.storageStatus} {stateText}"); - dingdingMsg.AppendLine(); - } - } + #endregion - Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); - #endregion - } - #endregion - } - else + #region 推送齐库到货情况 + if (order.IntoStoreType == Enums.IntoStoreType.发回齐越 && state == "QianShou") { - order.CalculationOrderState(fsql, out _, currentOrderSkuList, currentPurchaseOrderList); + Task.Factory.StartNew(() => qiKuManager.PublishQikuReceiveInfo(order.Id, + wayBillNo, + currentPurchaseOrderList, + currentOrderSkuList, + purchaseExpressOrderList, + orderPurchaseRelationList, + orderPurchaseSkuList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } + #endregion + #region 计算订单状态 + var oldOrderState = order.OrderState; + order.CalculationOrderState(fsql, currentOrderSkuList, currentPurchaseOrderList); if (order.OrderState != oldOrderState) { var update = fsql.Update(order.Id).Set(o => o.OrderState, order.OrderState); updateOrderList.Add(update); - #region 通知C端状态 - Task.Factory.StartNew(() => SendPurchaseOrderStateToC(order.Id, order.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); - #endregion - #region 创建待核算任务 if (order.OrderState == Enums.OrderState.待核算) { var isExists = fsql.Select().Where(t => t.OrderId == order.Id && t.TaskType == Enums.TimeLimitTaskType.待核算任务).Any(); if (!isExists) { - //创建合格证拟定任务 + //创建待核算任务 var t = new TimeLimitTask() { CreateTme = DateTime.Now, @@ -2772,9 +2692,34 @@ namespace BBWYB.Server.Business } #endregion } + #endregion + + #region 创建入仓单检查任务 + if (order.IntoStoreType == Enums.IntoStoreType.厂商代发入仓 && + state == "QianShou" && + order.OrderState == Enums.OrderState.待验收 && + inStoreOrderCheckTaskList != null && + !inStoreOrderCheckTaskList.Any(x => x.OrderId == order.Id)) + { + insertInStoreOrderCheckTaskList.Add(new InStoreOrderCheckTask() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + IsChecked = false, + OrderId = order.Id, + ShopId = order.ShopId, + OrderSn = order.OrderSn + }); + } + #endregion + + #region 通知C端状态 + Task.Factory.StartNew(() => SendPurchaseOrderStateToC(order.Id, order.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + #endregion } #endregion + #region 更新数据库 fsql.Transaction(() => { @@ -2791,6 +2736,8 @@ namespace BBWYB.Server.Business } if (insertTimeLimitTaskList.Count() > 0) fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows(); + if (insertInStoreOrderCheckTaskList.Count() > 0) + fsql.Insert(insertInStoreOrderCheckTaskList).ExecuteAffrows(); }); #endregion } @@ -2805,7 +2752,7 @@ namespace BBWYB.Server.Business /// /// 采购单Id /// 当不需要触发订单改价时是否继续走流程 - private void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce) + public void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce) { bool isEditOrderPrice = true; try @@ -2864,6 +2811,8 @@ namespace BBWYB.Server.Business IUpdate updatePurchaseOrder = null; + IDictionary oskuPriceEditParamDictionary = new Dictionary(); + var ppclient = ppPlatformClientFactory.GetClient(AdapterEnums.PlatformType.阿里巴巴); var totalPurchaseProductAmount = 0M; @@ -2883,63 +2832,137 @@ namespace BBWYB.Server.Business totalPurchaseProductAmount += purchaseOrderSimpleInfo.ProductAmount; totalPurchaseFreight += purchaseOrderSimpleInfo.FreightAmount; - - var purchaseSkuTotalQuantity = purchaseOrderSimpleInfo.ItemList.Sum(x => x.Quantity); var currentPurchaseOrderRelationInfos = dbOrderPurchaseRelationInfos.Where(x => x.PurchaseOrderId == opi.PurchaseOrderId).ToList(); - - var belongSkuGroups = currentPurchaseOrderRelationInfos.GroupBy(p => p.BelongSkuId); - foreach (var belongSkuGroup in belongSkuGroups) + var cargoParamList = currentPurchaseOrderRelationInfos.Select(x => new CargoParamRequest() { - var belongSkuId = belongSkuGroup.Key; - - var currentOrderSkuCargoParamList = belongSkuGroup.ToList(); //找当前skuId的采购skuId - var currentOrderSkuProductAmount = 0M; //采购成本 - var currentSkuTotalPurchaseQuantity = currentOrderSkuCargoParamList.Sum(x => x.Quantity); //当前skuId的采购数量总和 - var currentPurchaseFreight = purchaseOrderSimpleInfo.FreightAmount * - (1.0M * currentSkuTotalPurchaseQuantity / purchaseSkuTotalQuantity); //采购运费 - - foreach (var currentOrderSkuCargo in currentOrderSkuCargoParamList) - { - var currentPurchaseSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.PurchaseSkuId) - .Sum(p => p.ProductAmount); - var currentPurchaseSkuTotalQuantity = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.PurchaseSkuId) - .Sum(p => p.Quantity); - currentOrderSkuProductAmount += currentPurchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity.Value / currentPurchaseSkuTotalQuantity); - } + SkuId = x.PurchaseSkuId, + BelongSkuId = x.BelongSkuId, + ProductId = x.PurchaseProductId, + Quantity = x.Quantity ?? 1, + SpecId = x.PurchaseSpecId, + SchemeId = x.SchemeId.Value + }).ToList(); + + #region 等比计算采购成本 + var proportionalCalculationResultList = ProportionalCalculationCost(cargoParamList, purchaseOrderSimpleInfo); + foreach (var proportionalCalculationResult in proportionalCalculationResultList) + { + var skuId = proportionalCalculationResult.SkuId; #region 订单sku平价 - var orderSku = dbOrderSkus.FirstOrDefault(osku => osku.SkuId == belongSkuId); if (isEditOrderPrice) { - orderSku.Price = currentOrderSkuProductAmount / orderSku.ItemTotal; - orderSku.BuyerPayFreight = currentPurchaseFreight; - if (!op_EditPriceSkuRequests.Any(x => x.SkuId == orderSku.SkuId)) + var orderSku = dbOrderSkus.FirstOrDefault(osku => osku.SkuId == skuId); + if (!oskuPriceEditParamDictionary.TryGetValue(orderSku.SkuId, out OP_EditPriceSkuRequest editSkuPrice)) { - op_EditPriceSkuRequests.Add(new OP_EditPriceSkuRequest() + editSkuPrice = new OP_EditPriceSkuRequest() { - Freight = currentPurchaseFreight ?? 0M, - InPackAmountPrice = orderSku.InPackAmount ?? 0M, + SkuId = orderSku.SkuId, OrderSkuId = orderSku.Id.ToString(), - Price = orderSku.Price ?? 0M, - SkuId = orderSku.SkuId - }); - updateOrderSkuList.Add(fsql.Update(orderSku.Id).Set(osku => osku.Price, orderSku.Price) - .Set(osku => osku.BuyerPayFreight, orderSku.BuyerPayFreight)); + InPackAmountPrice = orderSku.InPackAmount ?? 0M + }; + oskuPriceEditParamDictionary.Add(orderSku.SkuId, editSkuPrice); } - + editSkuPrice.Price += proportionalCalculationResult.ProductAmount / (orderSku.ItemTotal ?? 1M); + editSkuPrice.Freight += proportionalCalculationResult.FreightAmount; } #endregion - var dbOrderSkuDetail = dbOrderCostDetails.FirstOrDefault(ocd => ocd.SkuId == belongSkuId && ocd.PurchaseOrderId == opi.PurchaseOrderId); - dbOrderSkuDetail.CalculationOrderCostDetailCostAndProfit(currentOrderSkuProductAmount, - currentPurchaseFreight ?? 0M, + #region 更新sku成本明细 + var dbOrderSkuDetail = dbOrderCostDetails.FirstOrDefault(ocd => ocd.SkuId == skuId && ocd.PurchaseOrderId == opi.PurchaseOrderId); + dbOrderSkuDetail.CalculationOrderCostDetailCostAndProfit(proportionalCalculationResult.ProductAmount, + proportionalCalculationResult.FreightAmount, dbOrderSkuDetail.OutPackAmount ?? 0M, dbOrderSkuDetail.DeliveryExpressFreight ?? 0M); updateOrderCostDetailList.Add(fsql.Update().SetSource(dbOrderSkuDetail)); + #endregion + } + #endregion + + //var purchaseSkuTotalQuantity = purchaseOrderSimpleInfo.ItemList.Sum(x => x.Quantity); + //var belongSkuGroups = currentPurchaseOrderRelationInfos.GroupBy(p => p.BelongSkuId); + //foreach (var belongSkuGroup in belongSkuGroups) + //{ + // var belongSkuId = belongSkuGroup.Key; + + // var currentOrderSkuCargoParamList = belongSkuGroup.ToList(); //找当前skuId的采购skuId + // var currentOrderSkuProductAmount = 0M; //采购成本 + // var currentSkuTotalPurchaseQuantity = currentOrderSkuCargoParamList.Sum(x => x.Quantity); //当前skuId的采购数量总和 + // var currentPurchaseFreight = purchaseOrderSimpleInfo.FreightAmount * + // (1.0M * currentSkuTotalPurchaseQuantity / purchaseSkuTotalQuantity); //采购运费 + + // foreach (var currentOrderSkuCargo in currentOrderSkuCargoParamList) + // { + // var currentPurchaseSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.PurchaseSkuId) + // .Sum(p => p.ProductAmount); + // var currentPurchaseSkuTotalQuantity = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.PurchaseSkuId) + // .Sum(p => p.Quantity); + // currentOrderSkuProductAmount += currentPurchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity.Value / currentPurchaseSkuTotalQuantity); + // } + + // #region 订单sku平价 + // var orderSku = dbOrderSkus.FirstOrDefault(osku => osku.SkuId == belongSkuId); + // if (isEditOrderPrice) + // { + // if (!oskuPriceEditParamDictionary.TryGetValue(orderSku.SkuId, out OP_EditPriceSkuRequest editSkuPrice)) + // { + // editSkuPrice = new OP_EditPriceSkuRequest() + // { + // SkuId = orderSku.SkuId, + // OrderSkuId = orderSku.Id.ToString(), + // InPackAmountPrice = orderSku.InPackAmount ?? 0M + // }; + // oskuPriceEditParamDictionary.Add(orderSku.SkuId, editSkuPrice); + // } + // editSkuPrice.Price += currentOrderSkuProductAmount / (orderSku.ItemTotal ?? 1M); + // editSkuPrice.Freight += currentPurchaseFreight ?? 0M; + + // //orderSku.Price = + // //orderSku.BuyerPayFreight = currentPurchaseFreight; + // //if (!op_EditPriceSkuRequests.Any(x => x.SkuId == orderSku.SkuId)) + // //{ + // // op_EditPriceSkuRequests.Add(new OP_EditPriceSkuRequest() + // // { + // // Freight = currentPurchaseFreight ?? 0M, + // // InPackAmountPrice = orderSku.InPackAmount ?? 0M, + // // OrderSkuId = orderSku.Id.ToString(), + // // Price = orderSku.Price ?? 0M, + // // SkuId = orderSku.SkuId + // // }); + // // updateOrderSkuList.Add(fsql.Update(orderSku.Id).Set(osku => osku.Price, orderSku.Price) + // // .Set(osku => osku.BuyerPayFreight, orderSku.BuyerPayFreight)); + // //} + + // } + // #endregion + + // var dbOrderSkuDetail = dbOrderCostDetails.FirstOrDefault(ocd => ocd.SkuId == belongSkuId && ocd.PurchaseOrderId == opi.PurchaseOrderId); + // dbOrderSkuDetail.CalculationOrderCostDetailCostAndProfit(currentOrderSkuProductAmount, + // currentPurchaseFreight ?? 0M, + // dbOrderSkuDetail.OutPackAmount ?? 0M, + // dbOrderSkuDetail.DeliveryExpressFreight ?? 0M); + // updateOrderCostDetailList.Add(fsql.Update().SetSource(dbOrderSkuDetail)); + //} } + if (isEditOrderPrice) { + #region 更新订单sku金额 + foreach (var editSkuPriceKey in oskuPriceEditParamDictionary.Keys) + { + oskuPriceEditParamDictionary.TryGetValue(editSkuPriceKey, out var editSkuPrice); + var orderSku = dbOrderSkus.FirstOrDefault(osku => osku.SkuId == editSkuPrice.SkuId); + orderSku.Price = editSkuPrice.Price; + orderSku.BuyerPayFreight = editSkuPrice.Freight; + + op_EditPriceSkuRequests.Add(editSkuPrice); + updateOrderSkuList.Add(fsql.Update(orderSku.Id).Set(osku => osku.Price, orderSku.Price) + .Set(osku => osku.BuyerPayFreight, orderSku.BuyerPayFreight)); + } + #endregion + + #region 更新订单金额 dbOrder.OrderTotalPrice = totalPurchaseProductAmount + totalPurchaseFreight; dbOrder.OrderSellerPrice = totalPurchaseProductAmount; dbOrder.FreightPrice = totalPurchaseFreight; @@ -2948,6 +2971,7 @@ namespace BBWYB.Server.Business .Set(o => o.FreightPrice, dbOrder.FreightPrice); updatePurchaseOrder = fsql.Update(orderPurchaseInfo.Id).Set(opi => opi.IsAutoEditOrderPrice, Enums.AutoEditOrderPriceType.已平价); + #endregion } #region 订单Sku成本 @@ -3047,17 +3071,121 @@ namespace BBWYB.Server.Business { try { - restApiService.SendRequest("https://bbwy.qiyue666.com", "api/BatchPurchase/UpdatePurchaseOrderState", new +#if DEBUG + var url = "https://bbwy.qiyue666.com"; +#else + var url = "http://172.16.54.105:8090"; +#endif + + restApiService.SendRequest(url, "api/BatchPurchase/UpdatePurchaseOrderState", new { OrderId = orderId, PurchaseOrderState = orderState }, null, HttpMethod.Post); } - catch + catch (Exception ex) { + nLogManager.Default().Error(ex, $"OrderId-{orderId}推送C订单状态[{orderState}]失败"); + } + } + /// + /// 匹配采购方案 + /// + /// + /// + /// + /// + /// + /// + private IList MatchPurchaseScheme(string skuId, + int itemTotal, + string purchaserId, + IList purchaseSchemeList, + PP_QueryOrderDetailResponse purchaseOrderSimpleInfo) + { + List cargoParamList = new List(); + var currentSkuSchemeList = purchaseSchemeList.Where(ps => ps.SkuId == skuId).ToList(); + if (currentSkuSchemeList.Count() > 0) + { + foreach (var scheme in currentSkuSchemeList) + { + var samePurchaserProductList = scheme.PurchaseSchemeProductList.Where(psp => psp.PurchaserId == purchaserId).ToList(); + if (samePurchaserProductList.Count() == 0) + continue; + + bool isMatch = true; + foreach (var schemeProduct in samePurchaserProductList) + { + if (schemeProduct.PurchaseSchemeProductSkuList.Any(pss => purchaseOrderSimpleInfo.ItemList.Count(x => x.SkuId == pss.PurchaseSkuId) == 0)) + { + isMatch = false; + break; + } + } + + if (isMatch) + { + foreach (var schemeProduct in samePurchaserProductList) + { + cargoParamList.AddRange(schemeProduct.PurchaseSchemeProductSkuList.Select(pss => new CargoParamRequest() + { + BelongSkuId = pss.SkuId, + ProductId = pss.PurchaseProductId, + SkuId = pss.PurchaseSkuId, + SchemeId = pss.SkuPurchaseSchemeId, + SchemeVersion = scheme.Version, + SpecId = pss.PurchaseSkuSpecId, + Quantity = itemTotal * (pss.PurchaseRatio ?? 1) + })); + } + break; + } + } } + return cargoParamList; } + /// + /// 等比计算sku采购成本 + /// + /// + /// + /// + private IList ProportionalCalculationCost(IList cargoParamList, + PP_QueryOrderDetailResponse purchaseOrderSimpleInfo) + { + var list = new List(); + var belongSkuGroups = cargoParamList.GroupBy(p => p.BelongSkuId); + var purchaseSkuTotalQuantity = cargoParamList.Sum(x => x.Quantity); + foreach (var belongSkuGroup in belongSkuGroups) + { + var skuId = belongSkuGroup.Key; + //var currentOrderSkuCargoParamList = cargoParamList.Where(p => p.BelongSkuId == skuId); //找当前skuId的采购skuId + var currentOrderSkuCargoParamList = belongSkuGroup.ToList(); //找当前skuId的采购skuId + var currentSkuAmount = 0M; //采购成本 + var currentSkuTotalPurchaseQuantity = currentOrderSkuCargoParamList.Sum(x => x.Quantity); //当前skuId的采购数量总和 + var currentPurchaseFreight = purchaseOrderSimpleInfo.FreightAmount * + (1.0M * currentSkuTotalPurchaseQuantity / purchaseSkuTotalQuantity); //采购运费 + + foreach (var currentOrderSkuCargo in currentOrderSkuCargoParamList) + { + var currentPurchaseSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) + .Sum(p => p.ProductAmount); + + var currentPurchaseSkuTotalQuantity = cargoParamList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) + .Sum(p => p.Quantity); + + currentSkuAmount += currentPurchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity / currentPurchaseSkuTotalQuantity); + } + list.Add(new ProportionalCalculationCostResult() + { + SkuId = skuId, + FreightAmount = currentPurchaseFreight, + ProductAmount = currentSkuAmount + }); + } + return list; + } } } diff --git a/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs b/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs index 2a76e38..927269e 100644 --- a/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs +++ b/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs @@ -31,8 +31,11 @@ namespace BBWYB.Server.Business private List locationIdList; private List priceIdList; + private IList invalidPurchaserNameList; + public PurchaseProductAPIService(RestApiService restApiService, IMemoryCache memoryCache) { + invalidPurchaserNameList = new List() { "超级工厂", "实力工厂", "实力供应商" }; this.memoryCache = memoryCache; this.restApiService = restApiService; _1688ProductDetailRequestHeader = new Dictionary() @@ -129,21 +132,40 @@ namespace BBWYB.Server.Business if (string.IsNullOrEmpty(purchaserName)) purchaserName = jobject["item"]["seller_info"].Value("shop_name"); var purchaserLocation = jobject["item"].Value("location"); + var memberId = jobject["item"]["seller_info"].Value("sid"); + var purchaserId2 = jobject["item"]["seller_info"].Value("shop_name"); return new PurchaseSkuBasicInfoResponse() { - Purchaser = new Model.Db.Purchaser() + Purchaser = new Purchaser() { Id = purchaserId, Location = purchaserLocation, Name = purchaserName, - Platform = request.Platform + Platform = request.Platform, + Id2 = purchaserId2, + MemberId = memberId }, ItemList = list, PurchasePlatform = request.Platform, - PurchaseProductId = request.PurchaseProductId + PurchaseProductId = request.PurchaseProductId, + APIMode = Enums.PurchaseProductAPIMode.OneBound + }; + } + else if (jobject.Value("error_code") == "2000") + { + return new PurchaseSkuBasicInfoResponse() + { + IsInvalid = true, + APIMode = request.FirstApiMode, + PurchaseProductId = request.PurchaseProductId, + PurchasePlatform = request.Platform }; } + else + { + return null; + } } catch { } { @@ -202,11 +224,47 @@ namespace BBWYB.Server.Business var match = Regex.Match(_1688pageResult.Content, @"(window\.__INIT_DATA=)(.*)(\r*\n*\s*)"); if (!match.Success) + { + if (_1688pageResult.Content.Contains("商品已下架")) + { + return new PurchaseSkuBasicInfoResponse() + { + IsInvalid = true, + PurchasePlatform = request.Platform, + APIMode = request.FirstApiMode, + PurchaseProductId = request.PurchaseProductId + }; + } return null; + } var jsonStr = match.Groups[2].Value; var jobject = JObject.Parse(jsonStr); + #region 验证purchaserName + var purchaserName = jobject["globalData"]["tempModel"]["companyName"].ToString(); + if (invalidPurchaserNameList.Contains(purchaserName)) + { + var storeDataMatch = Regex.Match(_1688pageResult.Content, @"(window\.__STORE_DATA=)(.*)(\r*\n*\s*)"); + if (storeDataMatch.Success) + { + try + { + var jsonStr_storeData = storeDataMatch.Groups[2].Value; + var jobject_storeData = JObject.Parse(jsonStr_storeData); + var purchaserName_storeData = jobject_storeData["components"]?["38229149"]?["moduleData"]?["companyName"].ToString(); + if (string.IsNullOrEmpty(purchaserName_storeData)) + purchaserName_storeData = jobject_storeData["components"]?["38229148"]?["moduleData"]?["companyName"].ToString(); + if (string.IsNullOrEmpty(purchaserName_storeData)) + purchaserName_storeData = jobject_storeData["components"]?["38229150"]?["moduleData"]?["companyName"].ToString(); + if (!string.IsNullOrEmpty(purchaserName_storeData)) + purchaserName = purchaserName_storeData; + } + catch { } + } + } + #endregion + var location = ""; for (var i = 0; i < locationIdList.Count(); i++) { @@ -216,11 +274,13 @@ namespace BBWYB.Server.Business break; } } + var purchaser = new Purchaser() { Id = jobject["globalData"]["tempModel"]["sellerUserId"].ToString(), Id2 = jobject["globalData"]["tempModel"]["sellerLoginId"]?.ToString(), - Name = jobject["globalData"]["tempModel"]["companyName"].ToString(), + Name = purchaserName, + MemberId = jobject["globalData"]?["tempModel"]?["sellerMemberId"]?.ToString(), Location = location, Platform = Enums.Platform.阿里巴巴 }; @@ -272,7 +332,10 @@ namespace BBWYB.Server.Business ItemList = list, Purchaser = purchaser, PurchaseProductId = request.PurchaseProductId, - PurchasePlatform = Enums.Platform.阿里巴巴 + PurchasePlatform = Enums.Platform.阿里巴巴, + ProductName = jobject["globalData"]["tempModel"]["offerTitle"]?.ToString(), + ProductLogo = list.FirstOrDefault()?.Logo, + APIMode = Enums.PurchaseProductAPIMode.Spider }; } catch diff --git a/BBWYB.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs b/BBWYB.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs index 2347173..748c5de 100644 --- a/BBWYB.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs +++ b/BBWYB.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs @@ -1,10 +1,12 @@ using BBWYB.Common.Extensions; +using BBWYB.Common.Http; using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Model; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using FreeSql; +using Newtonsoft.Json; using Yitter.IdGenerator; namespace BBWYB.Server.Business @@ -12,108 +14,164 @@ namespace BBWYB.Server.Business public class PurchaseSchemeBusiness : BaseBusiness, IDenpendency { private PurchaseProductAPIService purchaseProductAPIService; + private RestApiService restApiService; - public PurchaseSchemeBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, PurchaseProductAPIService purchaseProductAPIService) : base(fsql, nLogManager, idGenerator) + public PurchaseSchemeBusiness(IFreeSql fsql, + NLogManager nLogManager, + IIdGenerator idGenerator, + PurchaseProductAPIService purchaseProductAPIService, + RestApiService restApiService) : base(fsql, nLogManager, idGenerator) { this.purchaseProductAPIService = purchaseProductAPIService; + this.restApiService = restApiService; } private void ExtractNewPurchaser(IList purchaserSchemeList, IList addPurchaserList) where T : InputPurchaseSchemeRequest { - var reqeustPurchaserIdList = purchaserSchemeList.Select(s => s.PurchaserId).Distinct().ToList(); + List reqeustPurchaserIdList = new List(); + foreach (var scheme in purchaserSchemeList) + reqeustPurchaserIdList.AddRange(scheme.PurchaseSchemeProductList.Select(p => p.PurchaserId)); + reqeustPurchaserIdList = reqeustPurchaserIdList.Distinct().ToList(); + + //var reqeustPurchaserIdList = purchaserSchemeList.Select(s => s.PurchaserId).Distinct().ToList(); var existPurchaserIdList = fsql.Select().Where(p => reqeustPurchaserIdList.Contains(p.Id)).ToList(p => p.Id); var newPurchaserIdList = reqeustPurchaserIdList.Except(existPurchaserIdList); foreach (var scheme in purchaserSchemeList) { - if (newPurchaserIdList.Any(p => p == scheme.PurchaserId) && !addPurchaserList.Any(p => p.Id == scheme.PurchaserId)) + foreach (var ps in scheme.PurchaseSchemeProductList) { - addPurchaserList.Add(new Purchaser() + if (newPurchaserIdList.Any(p => p == ps.PurchaserId) && !addPurchaserList.Any(p => p.Id == ps.PurchaserId)) { - Id = scheme.PurchaserId, - Id2 = scheme.PurchaserId2, - Name = scheme.PurchaserName, - Location = scheme.PurchaserLocation, - Platform = scheme.PurchasePlatform - }); + addPurchaserList.Add(new Purchaser() + { + Id = ps.PurchaserId, + Id2 = ps.PurchaserId2, + Name = ps.PurchaserName, + Location = ps.PurchaserLocation, + Platform = ps.PurchasePlatform ?? Enums.Platform.阿里巴巴, + MemberId = ps.PurchaserMemberId + }); + } } } } public void EditPurchaseScheme(BatchCURDSchemeRequest batchCURDSchemeRequest) { - if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count == 0 && batchCURDSchemeRequest.AddPurchaseSchemeList.Count == 0) + if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count == 0 && + batchCURDSchemeRequest.AddPurchaseSchemeList.Count == 0) throw new BusinessException("非法参数"); - if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(p => string.IsNullOrEmpty(p.PurchaserId) || - string.IsNullOrEmpty(p.PurchaserName))) + if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList.Any(pp => string.IsNullOrEmpty(pp.PurchaserId) || + string.IsNullOrEmpty(pp.PurchaserName)))) throw new BusinessException("新增方案中有采购商Id/Name/Location为空"); - if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(p => string.IsNullOrEmpty(p.PurchaserId) || - string.IsNullOrEmpty(p.PurchaserName))) + if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList.Any(pp => string.IsNullOrEmpty(pp.PurchaserId) || + string.IsNullOrEmpty(pp.PurchaserName)))) throw new BusinessException("编辑方案中有采购商Id/Name/Location为空"); + if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count() > 0 && batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.Id == 0)) + throw new BusinessException("编辑方案中采购方案缺少Id"); - List addPurchaseSchemeList = null; + List addPurchaseSchemeList = new List(); List addPurchaseSchemeProductList = new List(); List addPurchaseSchemeProductSkuList = new List(); List newPurchaserList = new List(); List deletePurchaseSchemeIdList = new List(); + List> updatePurchaseSchemeList = new List>(); - #region 新增采购方案 - if (batchCURDSchemeRequest.AddPurchaseSchemeList.Count > 0) + if (batchCURDSchemeRequest.AddPurchaseSchemeList != null && batchCURDSchemeRequest.AddPurchaseSchemeList.Count > 0) { ExtractNewPurchaser(batchCURDSchemeRequest.AddPurchaseSchemeList, newPurchaserList); - addPurchaseSchemeList = batchCURDSchemeRequest.AddPurchaseSchemeList.Map>(); - - foreach (var scheme in addPurchaseSchemeList) + foreach (var psReq in batchCURDSchemeRequest.AddPurchaseSchemeList) { - scheme.Id = idGenerator.NewLong(); - scheme.CreateTime = DateTime.Now; - - foreach (var purchaseProduct in scheme.PurchaseSchemeProductList) + var ps = new PurchaseScheme() { - purchaseProduct.Id = idGenerator.NewLong(); - purchaseProduct.CreateTime = DateTime.Now; - purchaseProduct.SkuPurchaseSchemeId = scheme.Id; - foreach (var purchaseProductSku in purchaseProduct.PurchaseSchemeProductSkuList) + CreateTime = DateTime.Now, + Id = idGenerator.NewLong(), + ProductId = psReq.ProductId, + SkuId = psReq.SkuId, + ShopId = psReq.ShopId + }; + addPurchaseSchemeList.Add(ps); + foreach (var pspReq in psReq.PurchaseSchemeProductList) + { + var psp = pspReq.Map(); + psp.Id = idGenerator.NewLong(); + psp.CreateTime = DateTime.Now; + psp.SkuPurchaseSchemeId = ps.Id; + addPurchaseSchemeProductList.Add(psp); + + foreach (var pssReq in pspReq.PurchaseSchemeProductSkuList) { - purchaseProductSku.Id = idGenerator.NewLong(); - purchaseProductSku.CreateTime = DateTime.Now; - purchaseProductSku.SkuPurchaseSchemeId = scheme.Id; + var pss = pssReq.Map(); + pss.Id = idGenerator.NewLong(); + pss.CreateTime = DateTime.Now; + pss.SkuPurchaseSchemeId = ps.Id; + addPurchaseSchemeProductSkuList.Add(pss); + ps.DefaultCost += ((pssReq.ActualPrice ?? pssReq.DefaultPrice) ?? 0) * (pssReq.PurchaseRatio ?? 1); } - addPurchaseSchemeProductSkuList.AddRange(purchaseProduct.PurchaseSchemeProductSkuList); } - addPurchaseSchemeProductList.AddRange(scheme.PurchaseSchemeProductList); } } - #endregion #region 更新采购方案 - if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count > 0) + if (batchCURDSchemeRequest.EditPurchaseSchemeList != null && batchCURDSchemeRequest.EditPurchaseSchemeList.Count > 0) { - //ExtractNewPurchaser(batchCURDSchemeRequest.EditPurchaseSchemeList, newPurchaserList); deletePurchaseSchemeIdList.AddRange(batchCURDSchemeRequest.EditPurchaseSchemeList.Select(ps => ps.Id)); - - var editPurchaseSchemeList = batchCURDSchemeRequest.EditPurchaseSchemeList.Map>(); - foreach (var scheme in editPurchaseSchemeList) + foreach (var psReq in batchCURDSchemeRequest.EditPurchaseSchemeList) { - foreach (var purchaseProduct in scheme.PurchaseSchemeProductList) + var schemeId = psReq.Id; + var defaultCost = 0M; + foreach (var pspReq in psReq.PurchaseSchemeProductList) { - purchaseProduct.Id = idGenerator.NewLong(); - purchaseProduct.CreateTime = DateTime.Now; - purchaseProduct.SkuPurchaseSchemeId = scheme.Id; - foreach (var purchaseProductSku in purchaseProduct.PurchaseSchemeProductSkuList) + var psp = pspReq.Map(); + psp.Id = idGenerator.NewLong(); + psp.CreateTime = DateTime.Now; + psp.SkuPurchaseSchemeId = schemeId; + addPurchaseSchemeProductList.Add(psp); + + foreach (var pssReq in pspReq.PurchaseSchemeProductSkuList) { - purchaseProductSku.Id = idGenerator.NewLong(); - purchaseProductSku.CreateTime = DateTime.Now; - purchaseProductSku.SkuPurchaseSchemeId = scheme.Id; + var pss = pssReq.Map(); + pss.Id = idGenerator.NewLong(); + pss.CreateTime = DateTime.Now; + pss.SkuPurchaseSchemeId = schemeId; + addPurchaseSchemeProductSkuList.Add(pss); + defaultCost += ((pssReq.ActualPrice ?? pssReq.DefaultPrice) ?? 0) * (pssReq.PurchaseRatio ?? 1); } - addPurchaseSchemeProductSkuList.AddRange(purchaseProduct.PurchaseSchemeProductSkuList); } - addPurchaseSchemeProductList.AddRange(scheme.PurchaseSchemeProductList); + var psupdate = fsql.Update(schemeId) + .Set(ps => ps.DefaultCost, defaultCost); + updatePurchaseSchemeList.Add(psupdate); } + + //var editPurchaseSchemeList = batchCURDSchemeRequest.EditPurchaseSchemeList.Map>(); + //foreach (var scheme in editPurchaseSchemeList) + //{ + // foreach (var purchaseProduct in scheme.PurchaseSchemeProductList) + // { + // purchaseProduct.Id = idGenerator.NewLong(); + // purchaseProduct.CreateTime = DateTime.Now; + // purchaseProduct.SkuPurchaseSchemeId = scheme.Id; + // foreach (var purchaseProductSku in purchaseProduct.PurchaseSchemeProductSkuList) + // { + // purchaseProductSku.Id = idGenerator.NewLong(); + // purchaseProductSku.CreateTime = DateTime.Now; + // purchaseProductSku.SkuPurchaseSchemeId = scheme.Id; + // } + // addPurchaseSchemeProductSkuList.AddRange(purchaseProduct.PurchaseSchemeProductSkuList); + // } + // addPurchaseSchemeProductList.AddRange(scheme.PurchaseSchemeProductList); + //} } #endregion + foreach (var purchaseProductSku in addPurchaseSchemeProductSkuList) + { + if (purchaseProductSku.PurchaseRatio == null) + purchaseProductSku.PurchaseRatio = 1; + } + fsql.Transaction(() => { if (newPurchaserList.Count > 0) @@ -133,8 +191,379 @@ namespace BBWYB.Server.Business fsql.Insert(addPurchaseSchemeProductList).ExecuteAffrows(); if (addPurchaseSchemeProductSkuList.Count > 0) fsql.Insert(addPurchaseSchemeProductSkuList).ExecuteAffrows(); + if (updatePurchaseSchemeList.Count() > 0) + { + foreach (var update in updatePurchaseSchemeList) + update.ExecuteAffrows(); + } + }); + } + + public void EditPurchaseSchemeV2(BatchCURDSchemeRequest batchCURDSchemeRequest) + { + nLogManager.Default().Info($"EditPurchaseSchemeV2 {JsonConvert.SerializeObject(batchCURDSchemeRequest)}"); + + List dbSchemeGroupList = null; + List dbPurchaseSchemeList = null; + List deleteSchemeIdList = new List(); + + #region 数据验证 + if ((batchCURDSchemeRequest.EditPurchaseSchemeList == null || batchCURDSchemeRequest.EditPurchaseSchemeList.Count == 0) && + (batchCURDSchemeRequest.AddPurchaseSchemeList == null || batchCURDSchemeRequest.AddPurchaseSchemeList.Count == 0)) + throw new BusinessException("更新方案和新增方案参数不能同时为空"); + + if (batchCURDSchemeRequest.EditPurchaseSchemeList != null && batchCURDSchemeRequest.EditPurchaseSchemeList.Count() > 0) + { + var groupCount = batchCURDSchemeRequest.EditPurchaseSchemeList.GroupBy(ps => ps.ProductId).Count(); + if (groupCount > 1) + throw new BusinessException("只能对同一个spu的方案进行编辑"); + + if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.Id == 0)) + throw new BusinessException("更新方案中采购方案缺少Id"); + + if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => string.IsNullOrEmpty(ps.ProductId) || + string.IsNullOrEmpty(ps.SkuId) || + ps.PurchaseSchemeProductList.Any(psp => string.IsNullOrEmpty(psp.ProductId) || + string.IsNullOrEmpty(psp.SkuId) || + psp.PurchaseSchemeProductSkuList.Any(pss => string.IsNullOrEmpty(pss.ProductId) || + string.IsNullOrEmpty(pss.SkuId))))) + { + throw new BusinessException("更新方案缺少ProductId/SkuId"); + } + + #region 验证是否存在数据残缺的采购方案 + for (var i = 0; i < batchCURDSchemeRequest.EditPurchaseSchemeList.Count(); i++) + { + var editScheme = batchCURDSchemeRequest.EditPurchaseSchemeList[i]; + if (editScheme.PurchaseSchemeProductList != null && editScheme.PurchaseSchemeProductList.Count() > 0) + { + for (var j = 0; j < editScheme.PurchaseSchemeProductList.Count(); j++) + { + var editSchemeProduct = editScheme.PurchaseSchemeProductList[j]; + if (editSchemeProduct.PurchaseSchemeProductSkuList == null || editSchemeProduct.PurchaseSchemeProductSkuList.Count() == 0) + { + //如果采购商品不具备配件,则移除该采购商品 + editScheme.PurchaseSchemeProductList.RemoveAt(j); + j--; + } + } + } + + if (editScheme.PurchaseSchemeProductList == null || editScheme.PurchaseSchemeProductList.Count() == 0) + { + //采购方案不再具备采购商品,则移除该采购方案 + batchCURDSchemeRequest.EditPurchaseSchemeList.RemoveAt(i); + i--; + deleteSchemeIdList.Add(editScheme.Id); + } + } + + + #endregion + + + if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList.Any(pp => string.IsNullOrEmpty(pp.PurchaserId) || + string.IsNullOrEmpty(pp.PurchaserId2) || + string.IsNullOrEmpty(pp.PurchaserName)))) + throw new BusinessException("更新方案中有采购商Id/Id2/Name/Location为空"); + + + if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.SchemeGroupId == null || ps.SchemeGroupId == 0)) + throw new BusinessException("更新方案中采购方案缺少分组Id"); + } + + if (batchCURDSchemeRequest.AddPurchaseSchemeList != null && batchCURDSchemeRequest.AddPurchaseSchemeList.Count() > 0) + { + var groupCount = batchCURDSchemeRequest.AddPurchaseSchemeList.GroupBy(ps => ps.ProductId).Count(); + if (groupCount > 1) + throw new BusinessException("只能对同一个spu的方案进行编辑"); + + if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(ps => string.IsNullOrEmpty(ps.ProductId) || + string.IsNullOrEmpty(ps.SkuId) || + ps.PurchaseSchemeProductList.Any(psp => string.IsNullOrEmpty(psp.ProductId) || + string.IsNullOrEmpty(psp.SkuId) || + psp.PurchaseSchemeProductSkuList.Any(pss => string.IsNullOrEmpty(pss.ProductId) || + string.IsNullOrEmpty(pss.SkuId))))) + { + throw new BusinessException("新增方案缺少ProductId/SkuId"); + } + + if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList == null || + ps.PurchaseSchemeProductList.Count() == 0 || + ps.PurchaseSchemeProductList.Any(psp => psp.PurchaseSchemeProductSkuList == null || + psp.PurchaseSchemeProductSkuList.Count() == 0))) + { + throw new BusinessException("新增方案缺少商品信息"); + } + + + if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList.Any(pp => string.IsNullOrEmpty(pp.PurchaserId) || + string.IsNullOrEmpty(pp.PurchaserId2) || + string.IsNullOrEmpty(pp.PurchaserName)))) + throw new BusinessException("新增方案中有采购商Id/Id2/Name/Location为空"); + + + var productIds = batchCURDSchemeRequest.AddPurchaseSchemeList.Select(ps => ps.ProductId).ToList(); + + dbSchemeGroupList = fsql.Select().Where(psg => productIds.Contains(psg.ProductId)).ToList(); + var dbSchemeGroupIds = dbSchemeGroupList.Select(psg => psg.Id).ToList(); + dbPurchaseSchemeList = fsql.Select().Where(ps => dbSchemeGroupIds.Contains(ps.SchemeGroupId)).ToList(); + foreach (var addPurchaseScheme in batchCURDSchemeRequest.AddPurchaseSchemeList) + { + if (addPurchaseScheme.SchemeGroupId == null || addPurchaseScheme.SchemeGroupId == 0) + continue; + var dbSchemeGroup = dbSchemeGroupList.FirstOrDefault(g => g.Id == addPurchaseScheme.SchemeGroupId); + if (dbSchemeGroup == null) + throw new BusinessException($"新增方案中指定了不存在的分组{addPurchaseScheme.SchemeGroupId}"); + var dbPurchaseSchemeList_sameGroup = dbPurchaseSchemeList.Where(ps => ps.SchemeGroupId == addPurchaseScheme.SchemeGroupId).ToList(); + if (dbPurchaseSchemeList_sameGroup.Any(ps => ps.SkuId == addPurchaseScheme.SkuId)) + throw new BusinessException($"采购方案分组中Sku不允许重复,{dbSchemeGroup.GroupName}已存在{addPurchaseScheme.SkuId}的采购方案"); + if (!string.IsNullOrEmpty(addPurchaseScheme.HYSchemeId)) + { + if (dbPurchaseSchemeList.Any(ps => ps.HYSchemeId == addPurchaseScheme.HYSchemeId)) + throw new BusinessException($"慧眼方案Id{addPurchaseScheme.HYSchemeId}已被其他采购方案使用"); + } + } + } + + #endregion + + List addPurchaseSchemeList = new List(); + List addPurchaseSchemeProductList = new List(); + List addPurchaseSchemeProductSkuList = new List(); + List newPurchaserList = new List(); + List deletePartsSchemeIdList = new List(); + List> updatePurchaseSchemeList = new List>(); + + List insertPurchaseSchemeGroupsList = new List(); + IInsert? insertPurchaseSchemeGroupIndex = null; + IUpdate? updatePurchaseSchemeGroupIndex = null; + List insertHistoryPSList = new List(); + List insertHistoryPSPList = new List(); + List insertHistoryPSSList = new List(); + + + if (batchCURDSchemeRequest.AddPurchaseSchemeList != null && batchCURDSchemeRequest.AddPurchaseSchemeList.Count > 0) + { + var firstScheme = batchCURDSchemeRequest.AddPurchaseSchemeList.First(); + + ExtractNewPurchaser(batchCURDSchemeRequest.AddPurchaseSchemeList, newPurchaserList); + + #region 新建分组 + long? newPurchaseGroupId = null; + if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(ps => ps.SchemeGroupId == 0 || ps.SchemeGroupId == null)) + { + var dbPurchaseSchemeGroupIndex = fsql.Select().Where(psgi => psgi.ProductId == firstScheme.ProductId).ToOne(); + if (dbPurchaseSchemeGroupIndex == null) + { + dbPurchaseSchemeGroupIndex = new PurchaseSchemeGroupIndex() + { + CreateTime = DateTime.Now, + Index = 1, + ProductId = firstScheme.ProductId, + ShopId = firstScheme.ShopId + }; + insertPurchaseSchemeGroupIndex = fsql.Insert(dbPurchaseSchemeGroupIndex); + } + else + { + dbPurchaseSchemeGroupIndex.Index++; + updatePurchaseSchemeGroupIndex = fsql.Update(dbPurchaseSchemeGroupIndex.ProductId) + .Set(x => x.Index, dbPurchaseSchemeGroupIndex.Index); + } + + var insertSchemeGroup = new PurchaseSchemeGroup() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + GroupName = $"{firstScheme.ProductId}-{dbPurchaseSchemeGroupIndex.Index}", + ProductId = firstScheme.ProductId, + ShopId = firstScheme.ShopId + }; + insertPurchaseSchemeGroupsList.Add(insertSchemeGroup); + newPurchaseGroupId = insertSchemeGroup.Id; + } + #endregion + + foreach (var psReq in batchCURDSchemeRequest.AddPurchaseSchemeList) + { + if (psReq.SchemeGroupId == null || psReq.SchemeGroupId == 0) + psReq.SchemeGroupId = newPurchaseGroupId; + + var ps = new PurchaseScheme() + { + CreateTime = DateTime.Now, + Id = idGenerator.NewLong(), + ProductId = psReq.ProductId, + SkuId = psReq.SkuId, + ShopId = psReq.ShopId, + HYBDId = psReq.HYBDId, + HYSchemeId = psReq.HYSchemeId, + SchemeGroupId = psReq.SchemeGroupId ?? 0, + Version = 1 + }; + addPurchaseSchemeList.Add(ps); + foreach (var pspReq in psReq.PurchaseSchemeProductList) + { + var psp = pspReq.Map(); + psp.Id = idGenerator.NewLong(); + psp.CreateTime = DateTime.Now; + psp.SkuPurchaseSchemeId = ps.Id; + addPurchaseSchemeProductList.Add(psp); + + foreach (var pssReq in pspReq.PurchaseSchemeProductSkuList) + { + var pss = pssReq.Map(); + pss.Id = idGenerator.NewLong(); + pss.CreateTime = DateTime.Now; + pss.SkuPurchaseSchemeId = ps.Id; + addPurchaseSchemeProductSkuList.Add(pss); + ps.DefaultCost += ((pssReq.ActualPrice ?? pssReq.DefaultPrice) ?? 0) * (pssReq.PurchaseRatio ?? 1); + + #region 处理历史版本 + var historyPss = pss.Map(); + historyPss.HistoryId = idGenerator.NewLong(); + historyPss.Version = 1; + insertHistoryPSSList.Add(historyPss); + #endregion + } + + #region 处理历史版本 + var historyPsp = psp.Map(); + historyPsp.HistoryId = idGenerator.NewLong(); + historyPsp.Version = 1; + insertHistoryPSPList.Add(historyPsp); + #endregion + } + + #region 处理历史版本 + var historyPs = ps.Map(); + historyPs.HistoryId = idGenerator.NewLong(); + insertHistoryPSList.Add(historyPs); + #endregion + } + } + + #region 更新采购方案 + if (batchCURDSchemeRequest.EditPurchaseSchemeList != null && batchCURDSchemeRequest.EditPurchaseSchemeList.Count > 0) + { + ExtractNewPurchaser(batchCURDSchemeRequest.EditPurchaseSchemeList, newPurchaserList); + var editSchemeIdList = batchCURDSchemeRequest.EditPurchaseSchemeList.Select(ps => ps.Id).ToList(); + List dbPurchaseSchemes = fsql.Select().Where(ps => editSchemeIdList.Contains(ps.Id)).ToList(); + + deletePartsSchemeIdList.AddRange(batchCURDSchemeRequest.EditPurchaseSchemeList.Select(ps => ps.Id)); + foreach (var psReq in batchCURDSchemeRequest.EditPurchaseSchemeList) + { + var schemeId = psReq.Id; + var dbps = dbPurchaseSchemes.FirstOrDefault(x => x.Id == schemeId); + if (dbps == null) + throw new BusinessException($"未找到编辑方案{schemeId}"); + var newVersion = dbps.Version + 1; //采购方案版本 + var defaultCost = 0M; + foreach (var pspReq in psReq.PurchaseSchemeProductList) + { + var psp = pspReq.Map(); + psp.Id = idGenerator.NewLong(); + psp.CreateTime = DateTime.Now; + psp.SkuPurchaseSchemeId = schemeId; + addPurchaseSchemeProductList.Add(psp); + + foreach (var pssReq in pspReq.PurchaseSchemeProductSkuList) + { + var pss = pssReq.Map(); + pss.Id = idGenerator.NewLong(); + pss.CreateTime = DateTime.Now; + pss.SkuPurchaseSchemeId = schemeId; + addPurchaseSchemeProductSkuList.Add(pss); + defaultCost += ((pssReq.ActualPrice ?? pssReq.DefaultPrice) ?? 0) * (pssReq.PurchaseRatio ?? 1); + + #region 处理历史版本 + var historyPss = pssReq.Map(); + historyPss.HistoryId = idGenerator.NewLong(); + historyPss.CreateTime = DateTime.Now; + historyPss.SkuPurchaseSchemeId = schemeId; + historyPss.Version = newVersion; + insertHistoryPSSList.Add(historyPss); + #endregion + } + + #region 处理历史版本 + var historyPsp = pspReq.Map(); + historyPsp.HistoryId = idGenerator.NewLong(); + historyPsp.CreateTime = DateTime.Now; + historyPsp.SkuPurchaseSchemeId = schemeId; + historyPsp.Version = newVersion; + insertHistoryPSPList.Add(historyPsp); + #endregion + } + var psupdate = fsql.Update(schemeId) + .Set(ps => ps.DefaultCost, defaultCost) + .Set(ps => ps.HYSchemeId, psReq.HYSchemeId) + .Set(ps => ps.HYBDId, psReq.HYBDId) + .Set(ps => ps.Version, newVersion); + updatePurchaseSchemeList.Add(psupdate); + + #region 处理历史版本 + var historyPs = psReq.Map(); + historyPs.LastPurchaseTime = dbps.LastPurchaseTime; + historyPs.LastPurchasePriceCost = dbps.LastPurchasePriceCost; + historyPs.DefaultCost = defaultCost; + historyPs.CreateTime = DateTime.Now; + historyPs.Version = newVersion; + historyPs.HistoryId = idGenerator.NewLong(); + insertHistoryPSList.Add(historyPs); + #endregion + } + } + #endregion + + foreach (var purchaseProductSku in addPurchaseSchemeProductSkuList) + { + if (purchaseProductSku.PurchaseRatio == null) + purchaseProductSku.PurchaseRatio = 1; + } + + fsql.Transaction(() => + { + if (newPurchaserList.Count > 0) + fsql.Insert(newPurchaserList).ExecuteAffrows(); + + //更新,删除已存在的采购方案商品和Sku + if (deletePartsSchemeIdList.Count > 0) + { + fsql.Delete().Where(p => deletePartsSchemeIdList.Contains(p.SkuPurchaseSchemeId)).ExecuteAffrows(); + fsql.Delete().Where(p => deletePartsSchemeIdList.Contains(p.SkuPurchaseSchemeId)).ExecuteAffrows(); + } + + //新增 + if (addPurchaseSchemeList != null && addPurchaseSchemeList.Count > 0) + fsql.Insert(addPurchaseSchemeList).ExecuteAffrows(); + if (addPurchaseSchemeProductList.Count > 0) + fsql.Insert(addPurchaseSchemeProductList).ExecuteAffrows(); + if (addPurchaseSchemeProductSkuList.Count > 0) + fsql.Insert(addPurchaseSchemeProductSkuList).ExecuteAffrows(); + if (insertPurchaseSchemeGroupsList.Count() > 0) + fsql.Insert(insertPurchaseSchemeGroupsList).ExecuteAffrows(); + if (updatePurchaseSchemeList.Count() > 0) + { + foreach (var update in updatePurchaseSchemeList) + update.ExecuteAffrows(); + } + insertPurchaseSchemeGroupIndex?.ExecuteAffrows(); + updatePurchaseSchemeGroupIndex?.ExecuteAffrows(); + + if (insertHistoryPSList.Count() > 0) + fsql.Insert(insertHistoryPSList).ExecuteAffrows(); + if (insertHistoryPSPList.Count() > 0) + fsql.Insert(insertHistoryPSPList).ExecuteAffrows(); + if (insertHistoryPSSList.Count() > 0) + fsql.Insert(insertHistoryPSSList).ExecuteAffrows(); }); + + //删除信息残缺的采购方案 + if (deleteSchemeIdList.Count() > 0) + DeletePurchaseScheme(deleteSchemeIdList); } /// @@ -142,44 +571,76 @@ namespace BBWYB.Server.Business /// /// /// - public IList GetPurchaseSchemeList(QuerySchemeRequest querySchemeRequest) + public IList GetPurchaseSchemeList(QuerySchemeRequest request) { - var select = fsql.Select().InnerJoin((ps, p) => ps.PurchaserId == p.Id); - if (querySchemeRequest.SchemeId != null && querySchemeRequest.SchemeId != 0) - select = select.Where((ps, p) => ps.Id == querySchemeRequest.SchemeId); - else if (querySchemeRequest.SchemeIdList != null && querySchemeRequest.SchemeIdList.Count() > 0) - select = select.Where((ps, p) => querySchemeRequest.SchemeIdList.Contains(ps.Id)); - else - { - select = select.WhereIf(querySchemeRequest.ShopId != null && querySchemeRequest.ShopId != 0, (ps, p) => ps.ShopId == querySchemeRequest.ShopId) - .WhereIf(querySchemeRequest.SkuIdList != null && querySchemeRequest.SkuIdList.Count() > 0, (ps, p) => querySchemeRequest.SkuIdList.Contains(ps.SkuId)) - .WhereIf(!string.IsNullOrEmpty(querySchemeRequest.PurchaserId), (ps, p) => ps.PurchaserId == querySchemeRequest.PurchaserId) - .WhereIf(querySchemeRequest.PurchasePlatform != null, (ps, p) => ps.PurchasePlatform == querySchemeRequest.PurchasePlatform); + #region 处理条件优先级 + if (request.SchemeId != null) + { + request.SchemeIdList?.Clear(); + request.SchemeGroupIdList?.Clear(); + request.SkuIdList?.Clear(); + request.ProductIdList?.Clear(); + } + else if (request.SchemeIdList != null && request.SchemeIdList.Count() > 0) + { + request.SchemeGroupIdList?.Clear(); + request.SkuIdList?.Clear(); + request.ProductIdList?.Clear(); + } + else if (request.SchemeGroupIdList != null && request.SchemeGroupIdList.Count() > 0) + { + request.SkuIdList?.Clear(); + request.ProductIdList?.Clear(); + } + else if (request.SkuIdList != null && request.SkuIdList.Count() > 0) + { + request.ProductIdList?.Clear(); } + #endregion + + var select = fsql.Select() + .WhereIf(request.ShopId != null && request.ShopId != 0, ps => ps.ShopId == request.ShopId) + .WhereIf(request.SchemeId != null && request.SchemeId != 0, ps => ps.Id == request.SchemeId) + .WhereIf(request.SchemeIdList != null && request.SchemeIdList.Count() > 0, ps => request.SchemeIdList.Contains(ps.Id)) + .WhereIf(request.SchemeGroupIdList != null && request.SchemeGroupIdList.Count() > 0, ps => request.SchemeGroupIdList.Contains(ps.SchemeGroupId)) + .WhereIf(request.SkuIdList != null && request.SkuIdList.Count() > 0, ps => request.SkuIdList.Contains(ps.SkuId)) + .WhereIf(request.ProductIdList != null && request.ProductIdList.Count() > 0, ps => request.ProductIdList.Contains(ps.ProductId)); + + if (request.PurchasePlatform != null || !string.IsNullOrEmpty(request.PurchaserId)) + { + select = select.Where(ps => fsql.Select() + .InnerJoin((psp, p) => psp.PurchaserId == p.Id) + .WhereIf(request.PurchasePlatform != null, (psp, p) => p.Platform == request.PurchasePlatform) + .WhereIf(!string.IsNullOrEmpty(request.PurchaserId), (psp, p) => psp.PurchaserId == request.PurchaserId) + .Where((psp, p) => psp.SkuPurchaseSchemeId == ps.Id).Any()); + } + //var sql = select.ToSql(); + var purchaseSchemeList = select.OrderByDescending(ps => ps.CreateTime).ToList(); - var purchaseSchemeList = select.ToList((ps, p) => new PurchaseSchemeResponse - { - Id = ps.Id, - ProductId = ps.ProductId, - SkuId = ps.SkuId, - ShopId = ps.ShopId, - PurchaserId = p.Id, - PurchaserId2 = p.Id2, - PurchaserName = p.Name, - PurchaserLocation = p.Location, - DefaultCost = ps.DefaultCost, - RealCost = ps.RealCost, - CreateTime = ps.CreateTime, - PurchasePlatform = ps.PurchasePlatform, - LastPurchaseTime = ps.LastPurchaseTime - }); if (purchaseSchemeList.Count > 0) { var purchaseSchemeIdList = purchaseSchemeList.Select(p => p.Id).ToList(); - var purchaseSchemeProductList = fsql.Select().Where(p => purchaseSchemeIdList.Contains(p.SkuPurchaseSchemeId)) - .ToList().Map>(); + var purchaseSchemeProductList = fsql.Select() + .InnerJoin((psp, p) => psp.PurchaserId == p.Id) + .Where((psp, p) => purchaseSchemeIdList.Contains(psp.SkuPurchaseSchemeId)) + .ToList((psp, p) => new PurchaseSchemeProductResponse + { + CreateTime = psp.CreateTime, + Id = psp.Id, + ProductId = psp.ProductId, + PurchaseProductId = psp.PurchaseProductId, + PurchaseUrl = psp.PurchaseUrl, + SkuId = psp.SkuId, + SkuPurchaseSchemeId = psp.SkuPurchaseSchemeId, + PurchaserId = p.Id, + PurchaserId2 = p.Id2, + PurchaserLocation = p.Location, + PurchaserName = p.Name, + PurchasePlatform = p.Platform, + PurchaserMemberId = p.MemberId + }); var purchaseSchemeProductSkuList = fsql.Select().Where(p => purchaseSchemeIdList.Contains(p.SkuPurchaseSchemeId)) .ToList().Map>(); @@ -198,47 +659,124 @@ namespace BBWYB.Server.Business schemeProduct.PurchaseSchemeProductSkuList.AddRange(schemeProductSkuList); } } + + #region 封装采购商 + foreach (var schemeProduct in schemeProductList) + { + if (!scheme.PurchaserList.Any(p => p.Id == schemeProduct.PurchaserId)) + { + scheme.PurchaserList.Add(new Purchaser() + { + Id = schemeProduct.PurchaserId, + Id2 = schemeProduct.PurchaserId2, + Location = schemeProduct.PurchaserLocation, + Name = schemeProduct.PurchaserName, + Platform = schemeProduct.PurchasePlatform, + MemberId = schemeProduct.PurchaserMemberId + }); + } + } + #endregion + + #region 获取采购方案基本信息 + if (request.IncludePurchaseSkuBasicInfo == 1) + { + foreach (var schemeProduct in schemeProductList) + { + try + { + var basicInfo = GetPurchaseSkuBasicInfo(new PurchaseSkuBasicInfoRequest() + { + FirstApiMode = Enums.PurchaseProductAPIMode.Spider, + PriceMode = Enums.PurchaseOrderMode.批发, + Platform = schemeProduct.PurchasePlatform ?? Enums.Platform.阿里巴巴, + PurchaseProductId = schemeProduct.PurchaseProductId + }); + if (basicInfo != null && !basicInfo.IsInvalid) + { + schemeProduct.PurchaseProductLogo = basicInfo.ProductLogo; + schemeProduct.PurchaseProductName = basicInfo.ProductName; + + foreach (var schemeProductSku in schemeProduct.PurchaseSchemeProductSkuList) + { + schemeProductSku.IsInvalid = 1; + var basicSku = basicInfo.ItemList.FirstOrDefault(x => x.PurchaseSkuId == schemeProductSku.PurchaseSkuId); + if (basicSku != null) + { + schemeProductSku.IsInvalid = 0; + schemeProductSku.PurchaseSkuTitle = basicSku.Title; + schemeProductSku.PurchaseSkuPrice = basicSku.Price; + schemeProductSku.PurchaseSkuLogo = basicSku.Logo; + } + } + } + schemeProduct.IsInvalid = (basicInfo == null || basicInfo.IsInvalid) ? 1 : 0; + } + catch + { + + } + } + } + #endregion } } return purchaseSchemeList; } + public IList GetPurchaseSchemeAndGroupList(QuerySchemeAndGroupRequest request) + { + var purchaseSchemeGroupsList = fsql.Select() + .Where(psg => psg.ShopId == request.ShopId && + request.ProductIdList.Contains(psg.ProductId)) + .ToList(); + if (purchaseSchemeGroupsList.Count() > 0) + { + var groupIds = purchaseSchemeGroupsList.Select(g => g.Id).ToList(); + var purchaseSchemeList = GetPurchaseSchemeList(new QuerySchemeRequest() + { + IncludePurchaseSkuBasicInfo = request.IncludePurchaseSkuBasicInfo, + SchemeGroupIdList = groupIds + }); + foreach (var psg in purchaseSchemeGroupsList) + psg.PurchaseSchemeList = purchaseSchemeList.Where(ps => ps.SchemeGroupId == psg.Id).ToList(); + } + return purchaseSchemeGroupsList; + } + + public IList GetPurchaseSchemeCountList(QuerySchemeCountRequest request) + { + var list = fsql.Select().Where(ps => request.SkuIdList.Contains(ps.SkuId)) + .GroupBy(ps => ps.SkuId) + .ToList(g => new PurchaseSchemeCountResponse() + { + SkuId = g.Key, + SchemeCount = g.Count() + }); + return list; + } + public IList RefreshPurchaseScheme(RefreshSchemeRequest request) { var purchaseSchemeList = GetPurchaseSchemeList(new QuerySchemeRequest() { - SchemeIdList = request.SchemeIdList + SchemeIdList = request.SchemeIdList, + IncludePurchaseSkuBasicInfo = 1 }); List> updatePurchaseSchemeList = new List>(); - foreach (var purchaseScheme in purchaseSchemeList) + foreach (var ps in purchaseSchemeList) { - var purchaseProductIds = purchaseScheme.PurchaseSchemeProductList.Select(p => p.PurchaseProductId).ToArray(); - var purchaseSkuIds = new List(); - foreach (var purchaseProduct in purchaseScheme.PurchaseSchemeProductList) + var defaultCost = 0M; + foreach (var psp in ps.PurchaseSchemeProductList) { - purchaseSkuIds.AddRange(purchaseProduct.PurchaseSchemeProductSkuList.Select(ps => ps.PurchaseSkuId)); - } - - var purchaseSkuBasicInfoList = BatchGetPurchaseSkuBasicInfo(new BatchPurchaseSkuBasicInfoRequest() - { - FirstApiMode = Enums.PurchaseProductAPIMode.Spider, - PriceMode = Enums.PurchaseOrderMode.批发, - Params = new List() + foreach (var pss in psp.PurchaseSchemeProductSkuList) { - new BatchPurchaseSkuBasicInfoParamRequest() - { - Platform = purchaseScheme.PurchasePlatform, - PurchaseProductIds = purchaseProductIds, - PurchaseSkuIds = purchaseSkuIds - } + defaultCost += ((pss.ActualPrice ?? pss.PurchaseSkuPrice) ?? 0) * (pss.PurchaseRatio ?? 1); } - }); - - var amount = purchaseSkuBasicInfoList.Sum(p => p.ItemList.Sum(s => s.Price)); - if (purchaseScheme.DefaultCost != amount) + } + if (ps.DefaultCost != defaultCost) { - purchaseScheme.DefaultCost = amount; - var update = fsql.Update(purchaseScheme.Id).Set(p => p.DefaultCost, amount); + var update = fsql.Update(ps.Id).Set(p => p.DefaultCost, defaultCost); updatePurchaseSchemeList.Add(update); } } @@ -255,55 +793,105 @@ namespace BBWYB.Server.Business return purchaseSchemeList; } - /// - /// 获取共同拥有的采购商 - /// - /// - /// - public IList GetSharePurchaser(QuerySchemeRequest querySchemeRequest) - { - var skuCount = querySchemeRequest.SkuIdList.Count(); + ///// + ///// 获取共同拥有的采购商 + ///// + ///// + ///// + //public IList GetSharePurchaser(QuerySchemeRequest querySchemeRequest) + //{ + // var skuCount = querySchemeRequest.SkuIdList.Count(); - var purchaseSchemeList = fsql.Select().InnerJoin((ps, p) => ps.PurchaserId == p.Id) - .Where((ps, p) => ps.ShopId == querySchemeRequest.ShopId) - .Where((ps, p) => querySchemeRequest.SkuIdList.Contains(ps.SkuId)) - .ToList(); - if (purchaseSchemeList.Count() == 0) - return null; + // var purchaseSchemeList = fsql.Select().InnerJoin((ps, p) => ps.PurchaserId == p.Id) + // .Where((ps, p) => ps.ShopId == querySchemeRequest.ShopId) + // .Where((ps, p) => querySchemeRequest.SkuIdList.Contains(ps.SkuId)) + // .ToList(); + // if (purchaseSchemeList.Count() == 0) + // return null; - var group = purchaseSchemeList.GroupBy(p => p.PurchaserId); - var sharePurchaserIdList = new List(); - foreach (var g in group) - { - if (g.Count() == skuCount) - sharePurchaserIdList.Add(g.Key); - } - if (sharePurchaserIdList.Count == 0) - return null; + // var group = purchaseSchemeList.GroupBy(p => p.PurchaserId); + // var sharePurchaserIdList = new List(); + // foreach (var g in group) + // { + // if (g.Count() == skuCount) + // sharePurchaserIdList.Add(g.Key); + // } + // if (sharePurchaserIdList.Count == 0) + // return null; + + // return fsql.Select().Where(p => sharePurchaserIdList.Contains(p.Id)).ToList(); + //} - return fsql.Select().Where(p => sharePurchaserIdList.Contains(p.Id)).ToList(); + //public void DeletePurchaser(DeletePurchaseSchemeRequest deletePurchaseSchemeRequest) + //{ + // var purchaseSchemeIdList = fsql.Select().Where(ps => ps.ProductId == deletePurchaseSchemeRequest.ProductId && + // ps.PurchaserId == deletePurchaseSchemeRequest.PurchaserId).ToList(ps => ps.Id); + + // fsql.Transaction(() => + // { + // fsql.Delete(purchaseSchemeIdList).ExecuteAffrows(); + // fsql.Delete().Where(psp => purchaseSchemeIdList.Contains(psp.SkuPurchaseSchemeId)).ExecuteAffrows(); + // fsql.Delete().Where(psps => purchaseSchemeIdList.Contains(psps.SkuPurchaseSchemeId)).ExecuteAffrows(); + // }); + //} + + public void DeletePurchaseScheme(long schemeId) + { + //IDelete? deletePsg = null; + //var purchaseScheme = fsql.Select(schemeId).ToOne(); + //if (purchaseScheme == null) + // throw new BusinessException("采购方案不存在"); + //if (purchaseScheme.SchemeGroupId != 0) + //{ + // var sameGroupSchemeCount = fsql.Select().Where(ps => ps.SchemeGroupId == purchaseScheme.SchemeGroupId && + // ps.Id != purchaseScheme.Id).Count(); + // if (sameGroupSchemeCount == 0) + // deletePsg = fsql.Delete(purchaseScheme.SchemeGroupId); + //} + //fsql.Transaction(() => + //{ + // deletePsg?.ExecuteAffrows(); + // fsql.Delete(schemeId).ExecuteAffrows(); + // fsql.Delete().Where(p => p.SkuPurchaseSchemeId == schemeId).ExecuteAffrows(); + // fsql.Delete().Where(p => p.SkuPurchaseSchemeId == schemeId).ExecuteAffrows(); + //}); + DeletePurchaseScheme(new List() { schemeId }); } - public void DeletePurchaser(DeletePurchaseSchemeRequest deletePurchaseSchemeRequest) + public void DeletePurchaseScheme(List schemeIdList) { - var purchaseSchemeIdList = fsql.Select().Where(ps => ps.ProductId == deletePurchaseSchemeRequest.ProductId && - ps.PurchaserId == deletePurchaseSchemeRequest.PurchaserId).ToList(ps => ps.Id); + IList deleteSchemeGroupIdList = new List(); + var purchaseSchemeList = fsql.Select(schemeIdList).ToList(); + if (purchaseSchemeList.Count() == 0) + return; + var schemeGroupIdList = purchaseSchemeList.Where(ps => ps.SchemeGroupId != 0).Select(ps => ps.SchemeGroupId).ToList(); + var sameSchemeGroupCountGroups = fsql.Select().Where(ps => ps.SchemeGroupId != 0 && + schemeGroupIdList.Contains(ps.SchemeGroupId) && + !schemeIdList.Contains(ps.Id)) + .GroupBy(ps => ps.SchemeGroupId) + .ToList(g => new + { + SchemeGroupId = g.Key, + SchemeCount = g.Count() + }); - fsql.Transaction(() => + foreach (var purchaseScheme in purchaseSchemeList) { - fsql.Delete(purchaseSchemeIdList).ExecuteAffrows(); - fsql.Delete().Where(psp => purchaseSchemeIdList.Contains(psp.SkuPurchaseSchemeId)).ExecuteAffrows(); - fsql.Delete().Where(psps => purchaseSchemeIdList.Contains(psps.SkuPurchaseSchemeId)).ExecuteAffrows(); - }); - } + if (purchaseScheme.SchemeGroupId != 0) + { + var sameSchemeGroupCount = sameSchemeGroupCountGroups.FirstOrDefault(g => g.SchemeGroupId == purchaseScheme.SchemeGroupId); + if (sameSchemeGroupCount != null && sameSchemeGroupCount.SchemeCount == 0) + deleteSchemeGroupIdList.Add(purchaseScheme.SchemeGroupId); + } + } - public void DeletePurchaseScheme(long schemeId) - { fsql.Transaction(() => { - fsql.Delete(schemeId).ExecuteAffrows(); - fsql.Delete().Where(p => p.SkuPurchaseSchemeId == schemeId).ExecuteAffrows(); - fsql.Delete().Where(p => p.SkuPurchaseSchemeId == schemeId).ExecuteAffrows(); + if (deleteSchemeGroupIdList.Count() > 0) + fsql.Delete(deleteSchemeGroupIdList).ExecuteAffrows(); + fsql.Delete(schemeIdList).ExecuteAffrows(); + fsql.Delete().Where(p => schemeIdList.Contains(p.SkuPurchaseSchemeId)).ExecuteAffrows(); + fsql.Delete().Where(p => schemeIdList.Contains(p.SkuPurchaseSchemeId)).ExecuteAffrows(); }); } @@ -352,6 +940,231 @@ namespace BBWYB.Server.Business return list; } + /// + /// 根据慧眼标的Id获取采购方案(含全部配件基本信息) + /// + /// + /// + /// + public IList GetPurchaseSchemeByHYBDId(QueryHYSchemeRequest request) + { + if (request.ShopId == 0) + throw new BusinessException("缺少店铺Id"); + if (string.IsNullOrEmpty(request.ProductId)) + throw new BusinessException("缺少商品Id"); + if (string.IsNullOrEmpty(request.HYBDId)) + throw new BusinessException("缺少标的Id"); + + var hyHttpResult = restApiService.SendRequest("http://hyapi.qiyue666.com", "/HuiYan/ItemPlan/GetPlanByOrderId", $"orderId={request.HYBDId}", null, HttpMethod.Get); + if (hyHttpResult.StatusCode != System.Net.HttpStatusCode.OK) + throw new BusinessException(hyHttpResult.Content); + var hyResponse = JsonConvert.DeserializeObject>>(hyHttpResult.Content); + if (!hyResponse.Success) + throw new BusinessException(hyResponse.Msg); + if (hyResponse.Data == null || hyResponse.Data.Count() == 0) + throw new BusinessException("该标的Id缺少采购方案"); + var hySchemeList = hyResponse.Data; + var hySchemeIdList = hySchemeList.Select(x => x.Id.ToString()).ToList(); + var dbSchemeList = fsql.Select().Where(ps => ps.ProductId == request.ProductId && + !string.IsNullOrEmpty(ps.HYSchemeId) && + hySchemeIdList.Contains(ps.HYSchemeId)).ToList(); + + var resultList = new List(); + foreach (var hyScheme in hySchemeList) + { + if (hyScheme.PlanItems == null || hyScheme.PlanItems.Count() == 0) + continue; + + var hySchemeResponse = new HYPurchaseSchemeResponse() + { + Id = 0, + CreateTime = DateTime.Now, + HYBDId = request.HYBDId, + IsAdded = dbSchemeList.Any(ps => ps.HYBDId == request.HYBDId && ps.HYSchemeId == hyScheme.Id.ToString()), + HYSchemeId = hyScheme.Id.ToString(), + ProductId = request.ProductId, + ShopId = request.ShopId + }; + resultList.Add(hySchemeResponse); + + foreach (var hySchemeProduct in hyScheme.PlanItems) + { + var basicInfo = GetPurchaseSkuBasicInfo(new PurchaseSkuBasicInfoRequest() + { + FirstApiMode = Enums.PurchaseProductAPIMode.Spider, + PriceMode = Enums.PurchaseOrderMode.批发, + Platform = Enums.Platform.阿里巴巴, + PurchaseProductId = hySchemeProduct.ItemId + }); + + var hySchemeProductResponse = new PurchaseSchemeProductResponse() + { + Id = 0, + ProductId = request.ProductId, + PurchasePlatform = Enums.Platform.阿里巴巴, + PurchaseProductId = hySchemeProduct.ItemId, + PurchaseProductLogo = basicInfo.ProductLogo, + PurchaseProductName = basicInfo.ProductName, + PurchaserId = basicInfo.Purchaser?.Id, + PurchaserId2 = basicInfo.Purchaser?.Id2, + PurchaserMemberId = basicInfo.Purchaser?.MemberId, + PurchaserLocation = basicInfo.Purchaser?.Location, + PurchaserName = basicInfo.Purchaser?.Name, + PurchaseUrl = $"https://detail.1688.com/offer/{hySchemeProduct.ItemId}.html" + }; + hySchemeResponse.PurchaseSchemeProductList.Add(hySchemeProductResponse); + + if (!hySchemeResponse.PurchaserList.Any(p => p.Id == hySchemeProductResponse.PurchaserId)) + { + hySchemeResponse.PurchaserList.Add(new Purchaser() + { + Id = hySchemeProductResponse.PurchaserId, + Id2 = hySchemeProductResponse.PurchaserId2, + Location = hySchemeProductResponse.PurchaserLocation, + Name = hySchemeProductResponse.PurchaserName, + Platform = hySchemeProductResponse.PurchasePlatform, + MemberId = hySchemeProductResponse.PurchaserMemberId + }); + } + + foreach (var skuBasicInfo in basicInfo.ItemList) + { + var hySchemeProductSkuResponse = new PurchaseSchemeProductSkuResponse() + { + Id = 0, + ActualPrice = skuBasicInfo.Price, + ProductId = request.ProductId, + PurchaseProductId = skuBasicInfo.PurchaseProductId, + PurchaseRatio = 1, + PurchaseSkuId = skuBasicInfo.PurchaseSkuId, + PurchaseSkuLogo = skuBasicInfo.Logo, + PurchaseSkuPrice = skuBasicInfo.Price, + PurchaseSkuSpecId = skuBasicInfo.PurchaseSkuSpecId, + PurchaseSkuTitle = skuBasicInfo.Title + }; + hySchemeProductResponse.PurchaseSchemeProductSkuList.Add(hySchemeProductSkuResponse); + hySchemeResponse.DefaultCost += skuBasicInfo.Price; + } + } + } + return resultList; + } + + public decimal EditPurchaseRatio(EditPurchaseRatioRequest request) + { + if (request.SchemeId == 0 || string.IsNullOrEmpty(request.SkuId) || string.IsNullOrEmpty(request.PurchaseSkuId)) + throw new BusinessException("参数不完整"); + if (request.Ratio < 1) + request.Ratio = 1; + var schemeList = GetPurchaseSchemeList(new QuerySchemeRequest() + { + IncludePurchaseSkuBasicInfo = 1, + SchemeId = request.SchemeId + }); + if (schemeList.Count() == 0) + throw new BusinessException("采购方案不存在"); + var scheme = schemeList[0]; + var defaultCost = 0M; + long? pssId = null; + foreach (var schemeProduct in scheme.PurchaseSchemeProductList) + { + var tartegtPurchaseProductSku = schemeProduct.PurchaseSchemeProductSkuList.FirstOrDefault(pss => pss.SkuId == request.SkuId && + pss.PurchaseSkuId == request.PurchaseSkuId); + + if (tartegtPurchaseProductSku != null) + { + tartegtPurchaseProductSku.PurchaseRatio = request.Ratio; + pssId = tartegtPurchaseProductSku.Id; + } + + defaultCost += schemeProduct.PurchaseSchemeProductSkuList.Sum(pss => ((pss.ActualPrice ?? pss.PurchaseSkuPrice) ?? 0) * (pss.PurchaseRatio ?? 1)); + + //foreach (var schemeProductSku in schemeProduct.PurchaseSchemeProductSkuList) + //{ + // if (schemeProductSku.SkuId == request.SkuId && + // schemeProductSku.PurchaseSkuId == request.PurchaseSkuId) + // { + // schemeProductSku.PurchaseRatio = request.Ratio; + // pssId = schemeProductSku.Id; + // } + // defaultCost += ((schemeProductSku.ActualPrice ?? schemeProductSku.PurchaseSkuPrice) ?? 0) * (schemeProductSku.PurchaseRatio ?? 1); + //} + } + if (pssId == null) + throw new BusinessException("未找到需要更新的采购配件"); + fsql.Transaction(() => + { + fsql.Update(request.SchemeId).Set(ps => ps.DefaultCost, defaultCost).ExecuteAffrows(); + fsql.Update(pssId.Value).Set(pss => pss.PurchaseRatio, request.Ratio).ExecuteAffrows(); + }); + return defaultCost; + } + + public decimal DeletePurchaseSku(DeletePurchaseSkuRequest request) + { + if (request.SchemeId == 0 || string.IsNullOrEmpty(request.SkuId) || string.IsNullOrEmpty(request.PurchaseSkuId)) + throw new BusinessException("参数不完整"); + var schemeList = GetPurchaseSchemeList(new QuerySchemeRequest() + { + IncludePurchaseSkuBasicInfo = 1, + SchemeId = request.SchemeId + }); + if (schemeList.Count() == 0) + throw new BusinessException("采购方案不存在"); + var scheme = schemeList[0]; + + if (scheme.PurchaseSchemeProductList.Count() == 1) + { + var lastProduct = scheme.PurchaseSchemeProductList.FirstOrDefault(); + if (lastProduct.PurchaseSchemeProductSkuList.Count() == 1) + { + var lastSku = lastProduct.PurchaseSchemeProductSkuList.FirstOrDefault(); + if (lastSku.PurchaseSkuId == request.PurchaseSkuId && + lastSku.SkuId == request.SkuId) + { + DeletePurchaseScheme(request.SchemeId); + return 0M; + } + else + { + throw new BusinessException("未找到需要移除的采购sku"); + } + } + } + + var defaultCost = 0M; + long? pssId = null; + + IDelete deletePss = null; + IDelete deletePsp = null; + IUpdate updatePs = null; + + foreach (var schemeProduct in scheme.PurchaseSchemeProductList) + { + var tartegtPurchaseProductSku = schemeProduct.PurchaseSchemeProductSkuList.FirstOrDefault(pss => pss.SkuId == request.SkuId && + pss.PurchaseSkuId == request.PurchaseSkuId); + if (tartegtPurchaseProductSku != null) + { + if (schemeProduct.PurchaseSchemeProductSkuList.Count() == 1) + deletePsp = fsql.Delete(schemeProduct.Id); + pssId = tartegtPurchaseProductSku.Id; + deletePss = fsql.Delete(pssId); + } + + defaultCost += schemeProduct.PurchaseSchemeProductSkuList.Where(pss => !(pss.SkuId == request.SkuId && pss.PurchaseSkuId == request.PurchaseSkuId)) + .Sum(pss => ((pss.ActualPrice ?? pss.PurchaseSkuPrice) ?? 0) * (pss.PurchaseRatio ?? 1)); + } + if (pssId == null) + throw new BusinessException("未找到需要移除的采购sku"); + updatePs = fsql.Update(request.SchemeId).Set(ps => ps.DefaultCost, defaultCost); + fsql.Transaction(() => + { + updatePs?.ExecuteAffrows(); + deletePsp?.ExecuteAffrows(); + deletePss?.ExecuteAffrows(); + }); + return defaultCost; + } } } diff --git a/BBWYB.Server.Business/QiKuManager.cs b/BBWYB.Server.Business/QiKuManager.cs index 3788bdf..3382f4c 100644 --- a/BBWYB.Server.Business/QiKuManager.cs +++ b/BBWYB.Server.Business/QiKuManager.cs @@ -35,104 +35,91 @@ namespace BBWYB.Server.Business this.venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); } - /// - /// 通知齐库到货情况 - /// 支持关联的采购平台以来源SKU为单位通知齐库 - /// 不支持关联的采购平台以采购单为单位通知齐库 - /// - /// - /// - /// - /// - public void PublishQiKuReceiveInfo(OrderPurchaseInfo orderPurchaseInfo, - IList orderPurchaseRelationInfoList, - IList orderPurchaseSkuInfoList, - IList purchaseExpressOrderList) - { - if (orderPurchaseInfo.PurchasePlatform == Enums.Platform.阿里巴巴) - PublishQiKuByRelation(orderPurchaseRelationInfoList, orderPurchaseSkuInfoList, purchaseExpressOrderList); - else - PublishQiKuPurchaseExpressOrder(orderPurchaseInfo, purchaseExpressOrderList); - } - - private void PublishQiKuByRelation(IList orderPurchaseRelationInfoList, - IList orderPurchaseSkuInfoList, - IList purchaseExpressOrderList) + public void PublishQikuReceiveInfo(string orderId, + string wayBillNo, + IList currentPurchaseOrderList, + IList currentOrderSkuList, + IList purchaseExpressOrderList_all, + IList orderPurchaseRelationList_all, + IList orderPurchaseSkuList_all) { try { - var relationGroups = orderPurchaseRelationInfoList.GroupBy(opri => opri.SourceSkuId); - foreach (var relationGroup in relationGroups) + //查询跟此快递单有关的当前订单的采购单 + var relationByWaybillNoPurchaseOrderIds = purchaseExpressOrderList_all.Where(peo => peo.OrderId == orderId && peo.WaybillNo == wayBillNo) + .Select(peo => peo.PurchaseOrderId) + .ToList(); + var relationByWaybillNoPurchaseOrderList = currentPurchaseOrderList.Where(po => relationByWaybillNoPurchaseOrderIds.Contains(po.PurchaseOrderId)).ToList(); + + //查询跟采购单有关联的订单sku + var relationOrderSkuList = currentOrderSkuList.Where(osku => relationByWaybillNoPurchaseOrderList.Any(po => po.BelongSkuIds.Contains(osku.SkuId))).ToList(); + foreach (var osku in relationOrderSkuList) { - bool isSignAll = true; - foreach (var relation in relationGroup) + //查询跟此订单sku有关的采购单 + var relationByOrderSkuPurchaseOrderList = currentPurchaseOrderList.Where(po => po.BelongSkuIds.Contains(osku.SkuId)).ToList(); + var isSignAll = true; + foreach (var po in relationByOrderSkuPurchaseOrderList) { - var purchaseSku = orderPurchaseSkuInfoList.FirstOrDefault(x => x.PurchaseSkuId == relation.PurchaseSkuId); - if (purchaseSku == null || string.IsNullOrEmpty(purchaseSku.WaybillNo)) + if (po.PurchasePlatform == Enums.Platform.阿里巴巴) { - isSignAll = false; - continue; + //查询跟此sku有关的关联信息 + var oriRelationList = orderPurchaseRelationList_all.Where(ori => ori.OrderId == osku.OrderId && + ori.PurchaseOrderId == po.PurchaseOrderId && + ori.BelongSkuId == osku.SkuId).ToList(); + if (oriRelationList.Count() == 0) + { + isSignAll = false; + break; + } + foreach (var relation in oriRelationList) + { + var pos = orderPurchaseSkuList_all.FirstOrDefault(pos => pos.OrderId == relation.OrderId && + pos.PurchaseOrderId == relation.PurchaseOrderId && + pos.PurchaseSkuId == relation.PurchaseSkuId); + if (pos == null || string.IsNullOrEmpty(pos.WaybillNo)) + { + isSignAll = false; + break; + } + var peo = purchaseExpressOrderList_all.FirstOrDefault(x => x.WaybillNo == pos.WaybillNo); + if (peo == null || peo.ExpressState != "QianShou") + { + isSignAll = false; + break; + } + } + if (!isSignAll) + break; } - var purchaseExpressOrder = purchaseExpressOrderList.FirstOrDefault(x => x.WaybillNo == purchaseSku.WaybillNo); - if (purchaseExpressOrder == null || purchaseExpressOrder.ExpressState != "QianShou") + else { - isSignAll = false; - continue; + var peoList = purchaseExpressOrderList_all.Where(x => x.OrderId == osku.OrderId && x.PurchaseOrderId == po.PurchaseOrderId); + if (peoList.Count() == 0 || peoList.Any(peo => peo.ExpressState != "QianShou")) + { + isSignAll = false; + break; + } } } - - restApiService.SendRequest("http://qiku.qiyue666.com", - "/Api/PackPurchaseTask/UpdateAvailabilityState", - new - { - availability = isSignAll ? 0 : 1, - orderId = relationGroup.FirstOrDefault().OrderId, - skuId = relationGroup.Key - }, - null, - HttpMethod.Post); - - } - } - catch (Exception ex) - { - - } - } - - private void PublishQiKuPurchaseExpressOrder(OrderPurchaseInfo orderPurchaseInfo, IList purchaseExpressOrderList) - { - try - { - if (string.IsNullOrEmpty(orderPurchaseInfo.BelongSkuIds)) - return; - - var orderId = purchaseExpressOrderList.FirstOrDefault().OrderId; - var orderSkuList = fsql.Select().Where(osku => osku.OrderId == orderId).ToList(); - - var isSignAll = !purchaseExpressOrderList.Any(x => x.ExpressState != "QianShou"); - - var notifyList = orderSkuList.Where(osku => orderPurchaseInfo.BelongSkuIds.Contains(osku.SkuId)).ToList(); - if (notifyList.Count() == 0) - return; - foreach (var notifySku in notifyList) - { - restApiService.SendRequest("http://qiku.qiyue666.com", - "/Api/PackPurchaseTask/UpdateAvailabilityState", - new - { - availability = isSignAll ? 0 : 1, - orderId = notifySku.OrderId, - skuId = notifySku.BelongSkuId - }, - null, - HttpMethod.Post); + //推送齐库 + + var publishResult = restApiService.SendRequest("http://qiku.qiyue666.com", + "/Api/PackPurchaseTask/UpdateAvailabilityState", + new + { + availability = isSignAll ? 0 : 1, + orderId = osku.OrderId, + skuId = osku.BelongSkuId + }, null, HttpMethod.Post); + if (publishResult.StatusCode != System.Net.HttpStatusCode.OK) + throw new Exception(publishResult.Content); } } catch { } + } diff --git a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs index 6f2ef91..3dad87f 100644 --- a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs +++ b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs @@ -5,7 +5,6 @@ using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using FreeSql; using Newtonsoft.Json.Linq; -using Org.BouncyCastle.Bcpg; using SDKAdapter; using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Models; @@ -44,6 +43,22 @@ namespace BBWYB.Server.Business.Sync Task.Factory.StartNew(() => Sync(shop, orderId, startTime, endTime, AdapterEnums.SortTimeField.Modify, AdapterEnums.SortType.Desc), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); } + public void ManualOrderSync(long shopId, DateTime startTime, DateTime endTime) + { + var shop = venderBusiness.GetShopList(shopId, platform: Enums.Platform.拳探).FirstOrDefault(); + if (shop == null) + throw new BusinessException($"未找到店铺Id {shopId}"); + while (true) + { + var s = startTime; + var e = s.AddHours(3); + Sync(shop, string.Empty, s, e, AdapterEnums.SortTimeField.Modify, AdapterEnums.SortType.Desc); + if (e >= endTime) + break; + startTime = startTime.AddHours(3); + } + } + private void Sync(ShopResponse shop, string orderId, DateTime? startTime, @@ -163,6 +178,7 @@ namespace BBWYB.Server.Business.Sync Logo = qtOrderSku.SkuLogo, OrderId = qtOrder.OrderId, Price = qtOrderSku.SkuPrice, + InitialPrice = qtOrderSku.SkuPrice, Title = qtOrderSku.SkuTitle, ShopId = shopId, ProductId = qtOrderSku.ProductId, @@ -191,6 +207,12 @@ namespace BBWYB.Server.Business.Sync { #region 订单状态脱离拳探 只处理付款和取消 Enums.OrderState? updateOrderState = null; + if (orderState == Enums.OrderState.待付款 && dbOrder.OrderState!=Enums.OrderState.待付款) + { + //dbOrder.OrderState = Enums.OrderState.待付款; + updateOrderState = Enums.OrderState.待付款; + } + if (dbOrder.OrderState == Enums.OrderState.待付款 && orderState != Enums.OrderState.待付款) updateOrderState = Enums.OrderState.等待采购; diff --git a/BBWYB.Server.Business/Vender/VenderBusiness.cs b/BBWYB.Server.Business/Vender/VenderBusiness.cs index 1f55d66..a07ca3e 100644 --- a/BBWYB.Server.Business/Vender/VenderBusiness.cs +++ b/BBWYB.Server.Business/Vender/VenderBusiness.cs @@ -32,6 +32,13 @@ namespace BBWYB.Server.Business .ToList(); } + public IList GetShopList(List shopIds) + { + return fsqlManager.MDSfsql.Select().Where(s => !string.IsNullOrEmpty(s.ShopId) && + shopIds.Contains(s.ShopId)) + .ToList(); + } + public long SaveShopSetting(ShopSettingRequest shopSettingRequest) { diff --git a/BBWYB.Server.Model/BBWYB.Server.Model.csproj b/BBWYB.Server.Model/BBWYB.Server.Model.csproj index a408f32..bcfb11f 100644 --- a/BBWYB.Server.Model/BBWYB.Server.Model.csproj +++ b/BBWYB.Server.Model/BBWYB.Server.Model.csproj @@ -12,4 +12,12 @@ + + + + + + + + diff --git a/BBWYB.Server.Model/Db/BBWY/PurchaseOrderV2.cs b/BBWYB.Server.Model/Db/BBWY/PurchaseOrderV2.cs new file mode 100644 index 0000000..3e9aaf4 --- /dev/null +++ b/BBWYB.Server.Model/Db/BBWY/PurchaseOrderV2.cs @@ -0,0 +1,223 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db.BBWY +{ + + /// + /// 采购单表 + /// + [Table(Name = "purchaseorderv2", DisableSyncStructure = true)] + public partial class PurchaseOrderV2 + { + + /// + /// 采购单号 + /// + [Column(StringLength = 100, IsPrimary = true, IsNullable = false)] + public string Id { get; set; } + + /// + /// 拳探订单独有Sn号 + /// + [Column(StringLength = 50)] + public string OrderSn { get; set; } + + /// + /// 完成时间 + /// + [Column(DbType = "datetime")] + public DateTime? CompletionTime { get; set; } + + /// + /// 收货详细地址 + /// + + public string ConsigneeAddress { get; set; } + + /// + /// 收货市 + /// + [Column(StringLength = 30)] + public string ConsigneeCity { get; set; } + + /// + /// 收货联系人名称 + /// + [Column(StringLength = 50)] + public string ConsigneeContactName { get; set; } + + /// + /// 收货区 + /// + [Column(StringLength = 30)] + public string ConsigneeCounty { get; set; } + + /// + /// 收货联系人电话 + /// + [Column(StringLength = 50)] + public string ConsigneeMobile { get; set; } + + /// + /// 收货省 + /// + [Column(StringLength = 30)] + public string ConsigneeProvince { get; set; } + + /// + /// 收货镇 + /// + [Column(StringLength = 30)] + public string ConsigneeTown { get; set; } + + /// + /// 打包耗材费 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? ConsumableAmount { get; set; } = 0.00M; + + /// + /// 创建时间 + /// + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + /// + /// 快递公司 + /// + [Column(StringLength = 100)] + public string ExpressName { get; set; } + + /// + /// 头程运费 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? FirstFreight { get; set; } = 0.00M; + + /// + /// 入仓费 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? InStorageAmount { get; set; } = 0.00M; + + /// + /// 是否转入库存 + /// + + public bool? IsConvertToStock { get; set; } = false; + + /// + /// 是否订阅快递100 + /// + + public bool? IsSubscribeKuaiDi100 { get; set; } = false; + + /// + /// 采购单状态(待付款=0,待发货=1,待收货=2,待质检=3,待打包=4,待结算=5,已完成=6) + /// + [Column(MapType = typeof(int?))] + public Enums.OrderState? OrderState { get; set; } + + /// + /// 支付时间 + /// + [Column(DbType = "datetime")] + public DateTime? PayTime { get; set; } + + /// + /// 采购货款 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? ProductAmount { get; set; } = 0.00M; + + /// + /// 采购账号Id + /// + + public long? PurchaseAccountId { get; set; } + + /// + /// 采购金额(采购货款+采购运费) + /// + [Column(DbType = "decimal(18,2)")] + public decimal? PurchaseAmount { get; set; } = 0.00M; + + /// + /// 采购运费 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? PurchaseFreight { get; set; } = 0.00M; + + /// + /// 采购平台 + /// + [Column(MapType = typeof(int?))] + public Enums.Platform? PurchasePlatform { get; set; } + + /// + /// 商家Id + /// + [Column(StringLength = 20)] + public string PurchaserId { get; set; } + + /// + /// 商家名称 + /// + [Column(StringLength = 100)] + public string PurchaserName { get; set; } + + /// + /// 质检费 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? QualityInspectionAmount { get; set; } = 0.00M; + + /// + /// 备注信息 + /// + + public string Remark { get; set; } + + /// + /// 店铺Id + /// + + public long ShopId { get; set; } + + /// + /// 签收时间 + /// + [Column(DbType = "datetime")] + public DateTime? SignTime { get; set; } + + /// + /// 快递单号 + /// + [Column(StringLength = 100)] + public string WaybillNo { get; set; } + + /// + /// 采购方式(线上=0, 线下=1) + /// + [Column(MapType = typeof(int))] + public Enums.PurchaseMethod PurchaseMethod { get; set; } + + /// + /// 采购单模式 批发 = 0,代发 = 1 + /// + [Column(MapType = typeof(int))] + public Enums.PurchaseOrderMode PurchaseOrderMode { get; set; } + ///// + ///// 打包状态 (待发布=0,打包中=1,已完成=2) + ///// + //[Column(MapType = typeof(int))] + //public Enums.PackState PackState { get; set; } + + /// + /// 入仓类型 (发回齐越 = 0, 厂商代发入仓 = 1) + /// + [Column(MapType = typeof(int?))] + public Enums.IntoStoreType? IntoStoreType { get; set; } + } + +} diff --git a/BBWYB.Server.Model/Db/Order/InStoreOrderCheckTask.cs b/BBWYB.Server.Model/Db/Order/InStoreOrderCheckTask.cs new file mode 100644 index 0000000..8bde073 --- /dev/null +++ b/BBWYB.Server.Model/Db/Order/InStoreOrderCheckTask.cs @@ -0,0 +1,29 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + [Table(Name = "instoreorderchecktask", DisableSyncStructure = true)] + public partial class InStoreOrderCheckTask + { + + [Column(IsPrimary = true)] + public long Id { get; set; } + + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + + public bool? IsChecked { get; set; } = false; + + [Column(StringLength = 50)] + public string OrderId { get; set; } + + [Column(StringLength = 50)] + public string OrderSn { get; set; } + + public long? ShopId { get; set; } + + } + +} diff --git a/BBWYB.Server.Model/Db/Order/InStorePurchaseOrdeRrelationInfo.cs b/BBWYB.Server.Model/Db/Order/InStorePurchaseOrdeRrelationInfo.cs index 1a67e40..ecf27e7 100644 --- a/BBWYB.Server.Model/Db/Order/InStorePurchaseOrdeRrelationInfo.cs +++ b/BBWYB.Server.Model/Db/Order/InStorePurchaseOrdeRrelationInfo.cs @@ -7,29 +7,29 @@ namespace BBWYB.Server.Model.Db /// 入库采购单关系表 /// [Table(Name = "instorepurchaseorderrelationinfo", DisableSyncStructure = true)] - public partial class InStorePurchaseOrdeRrelationInfo + public partial class InStorePurchaseOrdeRrelationInfo { - [Column(IsPrimary = true)] - public long Id { get; set; } + [Column(IsPrimary = true)] + public long Id { get; set; } - [Column(DbType = "datetime")] - public DateTime? CreateTime { get; set; } + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } - [Column(StringLength = 100)] - public string InStorePurchaseOrderId { get; set; } + [Column(StringLength = 100)] + public string InStorePurchaseOrderId { get; set; } - [Column(StringLength = 100)] - public string OrderId { get; set; } + [Column(StringLength = 100)] + public string OrderId { get; set; } - [Column(StringLength = 100)] - public string PurchaseOrderId { get; set; } + [Column(StringLength = 100)] + public string PurchaseOrderId { get; set; } - public long? ShopId { get; set; } + public long? ShopId { get; set; } - [Column(StringLength = 100)] - public string WaybillNo { get; set; } + [Column(StringLength = 100)] + public string WaybillNo { get; set; } - } + } } diff --git a/BBWYB.Server.Model/Db/Order/Order.cs b/BBWYB.Server.Model/Db/Order/Order.cs index 37cca53..f664971 100644 --- a/BBWYB.Server.Model/Db/Order/Order.cs +++ b/BBWYB.Server.Model/Db/Order/Order.cs @@ -23,7 +23,7 @@ namespace BBWYB.Server.Model.Db /// /// 买家备注 /// - + [Column(StringLength = 1000)] public string BuyerRemark { get; set; } /// diff --git a/BBWYB.Server.Model/Db/Order/OrderPurchaseRelationinfo.cs b/BBWYB.Server.Model/Db/Order/OrderPurchaseRelationinfo.cs index 66af1a8..2712ae5 100644 --- a/BBWYB.Server.Model/Db/Order/OrderPurchaseRelationinfo.cs +++ b/BBWYB.Server.Model/Db/Order/OrderPurchaseRelationinfo.cs @@ -64,6 +64,11 @@ namespace BBWYB.Server.Model.Db /// public long? SchemeId { get; set; } + /// + /// 采购方案版本 + /// + public int SchemeVersion { get; set; } = 1; + /// /// 来源SkuId (JD) /// diff --git a/BBWYB.Server.Model/Db/Order/OrderSku.cs b/BBWYB.Server.Model/Db/Order/OrderSku.cs index 2d07800..95b13d2 100644 --- a/BBWYB.Server.Model/Db/Order/OrderSku.cs +++ b/BBWYB.Server.Model/Db/Order/OrderSku.cs @@ -43,6 +43,12 @@ namespace BBWYB.Server.Model.Db [Column(DbType = "decimal(20,2)")] public decimal? Price { get; set; } + /// + /// 最初单价 + /// + [Column(DbType = "decimal(20,2)")] + public decimal? InitialPrice { get; set; } + [Column(StringLength = 50)] public string ProductId { get; set; } diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/OrderPurchaseRelationInfo.cs b/BBWYB.Server.Model/Db/PurchaseScheme/OrderPurchaseRelationInfo.cs deleted file mode 100644 index 629c939..0000000 --- a/BBWYB.Server.Model/Db/PurchaseScheme/OrderPurchaseRelationInfo.cs +++ /dev/null @@ -1,40 +0,0 @@ -using FreeSql.DataAnnotations; -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Xml.Linq; - -namespace BBWYB.Server.Model.Db.PurchaseScheme -{ - [Table(Name = "orderpurchaserelationinfo", DisableSyncStructure = true)] - public class OrderPurchaseRelationInfo - { - [Column( IsPrimary = true)] - public long Id { get; set; } - - /// - /// 采购单Id - /// - public string PurchaseOrderId { get; set; } - /// - /// 订单Id - /// - public string OrderId { get; set; } - - /// - /// 采购方案Id - /// - public string SchemeId { get; set; } - /// - /// 采购spu - /// - public string PurchaseProductId { get; set; } - /// - /// 采购sku - /// - public string PurchaseSkuId { get; set; } - } -} diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs b/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs index be1d49c..2880073 100644 --- a/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs +++ b/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs @@ -1,6 +1,8 @@ using BBWYB.Server.Model.Db; using FreeSql.DataAnnotations; +using Newtonsoft.Json; + namespace BBWYB.Server.Model { @@ -26,20 +28,19 @@ namespace BBWYB.Server.Model public decimal DefaultCost { get; set; } = 0.0M; - [Column(StringLength = 50, IsNullable = false)] - public string ProductId { get; set; } - /// - /// 采购商Id + /// 上次采购成本 /// - [Column(StringLength = 20)] - public string PurchaserId { get; set; } + public decimal LastPurchasePriceCost { get; set; } = 0.0M; - /// - /// 采购实际成本 - /// + [Column(StringLength = 50, IsNullable = false)] + public string ProductId { get; set; } - public decimal RealCost { get; set; } = 0.0M; + ///// + ///// 采购商Id + ///// + //[Column(StringLength = 20)] + //public string PurchaserId { get; set; } [Column(StringLength = 50, IsNullable = false)] public string SkuId { get; set; } @@ -51,8 +52,29 @@ namespace BBWYB.Server.Model /// public DateTime? LastPurchaseTime { get; set; } - [Column(MapType = typeof(int), DbType = "int(1)")] - public Enums.Platform PurchasePlatform { get; set; } + /// + /// 慧眼标的Id + /// + [Column(StringLength = 50)] + public string HYBDId { get; set; } + + /// + /// 慧眼方案Id + /// + [Column(StringLength = 50)] + public string HYSchemeId { get; set; } + + /// + /// 分组Id + /// + [Column(DbType = "bigint")] + public long SchemeGroupId { get; set; } = 0; + + /// + /// 方案版本 + /// + [Column(DbType = "int")] + public int Version { get; set; } = 1; [Column(IsIgnore = true)] public List PurchaseSchemeProductList { get; set; } diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseSchemeGroup.cs b/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseSchemeGroup.cs new file mode 100644 index 0000000..035efd9 --- /dev/null +++ b/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseSchemeGroup.cs @@ -0,0 +1,45 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + /// + /// 采购方案分组表 + /// + [Table(Name = "purchaseschemegroup", DisableSyncStructure = true)] + public partial class PurchaseSchemeGroup + { + + /// + /// 分组Id + /// + [Column(DbType = "bigint", IsPrimary = true)] + public long Id { get; set; } + + /// + /// 创建时间 + /// + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + /// + /// 组名 + /// + [Column(StringLength = 100)] + public string GroupName { get; set; } + + /// + /// 店铺spu,店铺商品Id + /// + [Column(StringLength = 50)] + public string ProductId { get; set; } + + /// + /// 店铺Id + /// + [Column(DbType = "bigint")] + public long? ShopId { get; set; } + + } + +} diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/Purchaser.cs b/BBWYB.Server.Model/Db/PurchaseScheme/Purchaser.cs index d8e6d38..2dd256f 100644 --- a/BBWYB.Server.Model/Db/PurchaseScheme/Purchaser.cs +++ b/BBWYB.Server.Model/Db/PurchaseScheme/Purchaser.cs @@ -40,6 +40,10 @@ namespace BBWYB.Server.Model.Db [Column(MapType = typeof(int?))] public Enums.Platform? Platform { get; set; } + + [Column(StringLength = 50, IsNullable = true)] + public string MemberId { get; set; } + } } diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/PurchasesSchemeGroupIndex.cs b/BBWYB.Server.Model/Db/PurchaseScheme/PurchasesSchemeGroupIndex.cs new file mode 100644 index 0000000..3c5cd4c --- /dev/null +++ b/BBWYB.Server.Model/Db/PurchaseScheme/PurchasesSchemeGroupIndex.cs @@ -0,0 +1,21 @@ +using FreeSql.DataAnnotations; +using Newtonsoft.Json; + +namespace BBWYB.Server.Model.Db +{ + + [Table(Name = "purchaseschemegroupindex", DisableSyncStructure = true)] + public partial class PurchaseSchemeGroupIndex + { + [Column(IsPrimary = true)] + public string ProductId { get; set; } + + public DateTime? CreateTime { get; set; } + + public int? Index { get; set; } + + public long? ShopId { get; set; } + + } + +} diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproduct.cs b/BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproduct.cs index d0733e3..1810917 100644 --- a/BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproduct.cs +++ b/BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproduct.cs @@ -44,6 +44,12 @@ namespace BBWYB.Server.Model.Db /// public long SkuPurchaseSchemeId { get; set; } + /// + /// 采购商Id + /// + [Column(StringLength = 20)] + public string PurchaserId { get; set; } + [Column(IsIgnore = true)] public List PurchaseSchemeProductSkuList { get; set; } diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproductsku.cs b/BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproductsku.cs index 4a9e837..8d4a605 100644 --- a/BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproductsku.cs +++ b/BBWYB.Server.Model/Db/PurchaseScheme/Purchaseschemeproductsku.cs @@ -46,6 +46,17 @@ namespace BBWYB.Server.Model.Db /// public long SkuPurchaseSchemeId { get; set; } + /// + /// 采购比例 + /// + [Column(DbType = "int(1)", IsNullable = true)] + public int? PurchaseRatio { get; set; } = 1; + + /// + /// 实际单价 + /// + public decimal? ActualPrice { get; set; } = 0.00M; + } } diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/history/HistoryPurchaseScheme.cs b/BBWYB.Server.Model/Db/PurchaseScheme/history/HistoryPurchaseScheme.cs new file mode 100644 index 0000000..fa4f370 --- /dev/null +++ b/BBWYB.Server.Model/Db/PurchaseScheme/history/HistoryPurchaseScheme.cs @@ -0,0 +1,83 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + /// + /// 历史采购方案表 + /// + [Table(Name = "historypurchasescheme", DisableSyncStructure = true)] + public partial class HistoryPurchaseScheme + { + /// + /// 历史流水Id + /// + [Column(DbType = "bigint", IsPrimary = true)] + public long HistoryId { get; set; } + + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + /// + /// 采购默认成本 + /// + + public decimal? DefaultCost { get; set; } + + /// + /// 慧眼标的Id + /// + [Column(StringLength = 50)] + public string HYBDId { get; set; } + + /// + /// 慧眼采购方案Id + /// + [Column(StringLength = 50)] + public string HYSchemeId { get; set; } + + /// + /// 采购方案Id + /// + [Column(DbType = "bigint")] + public long? Id { get; set; } + + /// + /// 上次采购成本 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? LastPurchasePriceCost { get; set; } + + /// + /// 上次采购时间 + /// + [Column(DbType = "datetime")] + public DateTime? LastPurchaseTime { get; set; } + + [Column(StringLength = 50, IsNullable = false)] + public string ProductId { get; set; } + + /// + /// 方案分组Id + /// + [Column(DbType = "bigint")] + public long? SchemeGroupId { get; set; } + + /// + /// 店铺Id + /// + [Column(DbType = "bigint")] + public long ShopId { get; set; } + + [Column(StringLength = 50, IsNullable = false)] + public string SkuId { get; set; } + + /// + /// 采购方案版本 + /// + [Column(DbType = "int")] + public int? Version { get; set; } = 1; + + } + +} diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/history/HistoryPurchaseSchemeProduct.cs b/BBWYB.Server.Model/Db/PurchaseScheme/history/HistoryPurchaseSchemeProduct.cs new file mode 100644 index 0000000..86cab85 --- /dev/null +++ b/BBWYB.Server.Model/Db/PurchaseScheme/history/HistoryPurchaseSchemeProduct.cs @@ -0,0 +1,59 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + /// + /// 采购方案商品表 + /// + [ Table(Name = "historypurchaseschemeproduct", DisableSyncStructure = true)] + public partial class HistoryPurchaseSchemeProduct { + + /// + /// 历史流水Id + /// + [Column(DbType = "bigint", IsPrimary = true)] + public long HistoryId { get; set; } + + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + [Column(StringLength = 50)] + public string ProductId { get; set; } + + /// + /// 采购商品Id + /// + [Column(StringLength = 50)] + public string PurchaseProductId { get; set; } + + /// + /// 商家Id + /// + [Column(StringLength = 50)] + public string PurchaserId { get; set; } + + /// + /// 采购商品链接 + /// + [Column(StringLength = 500)] + public string PurchaseUrl { get; set; } + + [Column(StringLength = 50)] + public string SkuId { get; set; } + + /// + /// Sku采购方案Id + /// + [Column(DbType = "bigint")] + public long? SkuPurchaseSchemeId { get; set; } + + /// + /// 采购方案版本 + /// + [Column(DbType = "int")] + public int? Version { get; set; } = 1; + + } + +} diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/history/HistoryPurchaseSchemeProductsku.cs b/BBWYB.Server.Model/Db/PurchaseScheme/history/HistoryPurchaseSchemeProductsku.cs new file mode 100644 index 0000000..78c6cb2 --- /dev/null +++ b/BBWYB.Server.Model/Db/PurchaseScheme/history/HistoryPurchaseSchemeProductsku.cs @@ -0,0 +1,72 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + /// + /// 采购方案sku表 + /// + [Table(Name = "historypurchaseschemeproductsku", DisableSyncStructure = true)] + public partial class HistoryPurchaseSchemeProductSku { + + /// + /// 历史流水Id + /// + [Column(DbType = "bigint", IsPrimary = true)] + public long HistoryId { get; set; } + + /// + /// 实际单价(人工设置) + /// + [Column(DbType = "decimal(18,2)")] + public decimal? ActualPrice { get; set; } = 0.00M; + + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + + [Column(StringLength = 50, IsNullable = false)] + public string ProductId { get; set; } + + /// + /// 采购商品Id + /// + [Column(StringLength = 50, IsNullable = false)] + public string PurchaseProductId { get; set; } + + /// + /// 采购比例 + /// + [Column(DbType = "int")] + public int? PurchaseRatio { get; set; } = 1; + + /// + /// 采购商品的SkuId + /// + [Column(StringLength = 50)] + public string PurchaseSkuId { get; set; } + + /// + /// 采购商品Sku的SpecId + /// + [Column(StringLength = 50)] + public string PurchaseSkuSpecId { get; set; } + + [Column(StringLength = 50, IsNullable = false)] + public string SkuId { get; set; } + + /// + /// Sku采购方案Id + /// + [Column(DbType = "bigint")] + public long SkuPurchaseSchemeId { get; set; } + + /// + /// 采购方案版本 + /// + [Column(DbType = "int")] + public int? Version { get; set; } = 1; + + } + +} diff --git a/BBWYB.Server.Model/Dto/Core/HY/HYPurchaseScheme.cs b/BBWYB.Server.Model/Dto/Core/HY/HYPurchaseScheme.cs new file mode 100644 index 0000000..ed39981 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Core/HY/HYPurchaseScheme.cs @@ -0,0 +1,51 @@ +namespace BBWYB.Server.Model.Dto +{ + public class HYPurchaseScheme + { + /// + /// HY方案Id + /// + public int Id { get; set; } + + public string TeamitemsId { get; set; } + + public string UserId { get; set; } + + /// + /// 配件数量 + /// + public int SkuCount { get; set; } + + public IList PlanItems { get; set; } + } + + public class HYPurchaseSchemeProduct + { + public string Id { get; set; } + + /// + /// 慧眼方案Id + /// + public int SupplierTaskPlanId { get; set; } + + /// + /// Taobao=0 Jd=1 ALBB=2 PDD=3 + /// + public int Platform { get; set; } + + /// + /// 采购商品Id + /// + public string ItemId { get; set; } + } + + public class HYPurchaseSchemeProductSku + { + + } + + public class HYSupplierInfo + { + + } +} diff --git a/BBWYB.Server.Model/Dto/Core/ProportionalCalculationCostResult.cs b/BBWYB.Server.Model/Dto/Core/ProportionalCalculationCostResult.cs new file mode 100644 index 0000000..15c0510 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Core/ProportionalCalculationCostResult.cs @@ -0,0 +1,11 @@ +namespace BBWYB.Server.Model.Core +{ + public class ProportionalCalculationCostResult + { + public string SkuId { get; set; } + + public decimal ProductAmount { get; set; } + + public decimal FreightAmount { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/Product/QueryBProductRequest.cs b/BBWYB.Server.Model/Dto/Request/Product/QueryBProductRequest.cs new file mode 100644 index 0000000..a05a8ee --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/Product/QueryBProductRequest.cs @@ -0,0 +1,8 @@ +using SDKAdapter.OperationPlatform.Models; + +namespace BBWYB.Server.Model.Dto +{ + public class QueryBProductRequest: OP_QueryProductSkuRequest + { + } +} diff --git a/BBWYB.Server.Model/Dto/Request/Product/QueryProductSkuPriceRequest.cs b/BBWYB.Server.Model/Dto/Request/Product/QueryProductSkuPriceRequest.cs new file mode 100644 index 0000000..3f11d72 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/Product/QueryProductSkuPriceRequest.cs @@ -0,0 +1,15 @@ +namespace BBWYB.Server.Model.Dto +{ + public class QueryProductSkuPriceRequest + { + public Enums.Platform Platform { get; set; } + + public string AppKey { get; set; } + + public string AppSecret { get; set; } + + public string AppToken { get; set; } + + public string Sku { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CargoParamRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CargoParamRequest.cs index f87cc75..2286220 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CargoParamRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CargoParamRequest.cs @@ -17,7 +17,7 @@ public string SpecId { get; set; } /// - /// 采购数量 + /// 采购配件数量 (订单sku数量 * 采购比例) /// public int Quantity { get; set; } @@ -30,6 +30,16 @@ /// 采购方案Id /// public long SchemeId { get; set; } + + /// + /// 采购方案版本 + /// + public int? SchemeVersion { get; set; } = 1; + + /// + /// 配件的采购比例 不传值默认1 + /// + public int? PurchaseRatio { get; set; } } public class CargoParamGroupRequest { @@ -52,6 +62,6 @@ /// /// 采购商品列表 /// - public IList CargoParamList { get; set; } + public List CargoParamList { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs index 600af08..a55aff4 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs @@ -7,7 +7,7 @@ namespace BBWYB.Server.Model.Dto /// /// 采购账号列表 /// - public IList PurchaseAccountList { get; set; } + public List PurchaseAccountList { get; set; } public Enums.PurchaseOrderMode PurchaseOrderMode { get; set; } @@ -19,7 +19,7 @@ namespace BBWYB.Server.Model.Dto /// /// 采购参数列表(以采购商分组) /// - public IList CargoParamGroupList { get; set; } + public List CargoParamGroupList { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/BatchCURDSchemeRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/BatchCURDSchemeRequest.cs index 8176ee2..a9670b2 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/BatchCURDSchemeRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/BatchCURDSchemeRequest.cs @@ -7,11 +7,13 @@ namespace BBWYB.Server.Model.Dto /// /// 需要修改的采购方案 /// - public IList EditPurchaseSchemeList { get; set; } + public List EditPurchaseSchemeList { get; set; } /// /// 需要新增的采购方案 /// - public IList AddPurchaseSchemeList { get; set; } + public List AddPurchaseSchemeList { get; set; } + + } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/DeletePurchaseSchemeRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/DeletePurchaseSchemeRequest.cs deleted file mode 100644 index 047cd7b..0000000 --- a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/DeletePurchaseSchemeRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BBWYB.Server.Model.Dto -{ - public class DeletePurchaseSchemeRequest - { - public string ProductId { get; set; } - - public string PurchaserId { get; set; } - } -} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/DeletePurchaseSkuRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/DeletePurchaseSkuRequest.cs new file mode 100644 index 0000000..47d4440 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/DeletePurchaseSkuRequest.cs @@ -0,0 +1,11 @@ +namespace BBWYB.Server.Model.Dto +{ + public class DeletePurchaseSkuRequest + { + public long SchemeId { get; set; } + + public string SkuId { get; set; } + + public string PurchaseSkuId { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/EditPurchaseRatioRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/EditPurchaseRatioRequest.cs new file mode 100644 index 0000000..0eebc71 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/EditPurchaseRatioRequest.cs @@ -0,0 +1,13 @@ +namespace BBWYB.Server.Model.Dto +{ + public class EditPurchaseRatioRequest + { + public long SchemeId { get; set; } + + public string SkuId { get; set; } + + public string PurchaseSkuId { get; set; } + + public int Ratio { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/EditPurchaseSchemeRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/EditPurchaseSchemeRequest.cs index f82c2fb..a5c8f9b 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/EditPurchaseSchemeRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/EditPurchaseSchemeRequest.cs @@ -2,6 +2,9 @@ { public class EditPurchaseSchemeRequest: InputPurchaseSchemeRequest { + /// + /// 采购方案Id + /// public long Id { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductRequest.cs index 3ffb384..cd9caec 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductRequest.cs @@ -1,27 +1,43 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace BBWYB.Server.Model.Dto +namespace BBWYB.Server.Model.Dto { public class InputPurchaseSchemeProductRequest { - /// - /// 店铺商品Id - /// public string ProductId { get; set; } - /// - /// 店铺商品Skull - /// + public string SkuId { get; set; } /// - /// 采购商品id + /// 采购商品Id /// public string PurchaseProductId { get; set; } /// /// 采购链接 /// public string PurchaseUrl { get; set; } - public IList PurchaseSchemeProductSkuList { get; set; } + + /// + /// 采购商Id (1688 SellerUserId) + /// + public string PurchaserId { get; set; } + + /// + /// 采购商Id2 (1688 SellerLoginId) + /// + public string PurchaserId2 { get; set; } + + /// + /// 采购商名称 + /// + public string PurchaserName { get; set; } + /// + /// 采购商发货地 + /// + public string PurchaserLocation { get; set; } + + public string PurchaserMemberId { get; set; } + + + public Enums.Platform? PurchasePlatform { get; set; } + + public List PurchaseSchemeProductSkuList { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductSkuRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductSkuRequest.cs index 9bdfd77..1a6050a 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductSkuRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeProductSkuRequest.cs @@ -1,13 +1,10 @@ namespace BBWYB.Server.Model.Dto { public class InputPurchaseSchemeProductSkuRequest - {/// - /// 店铺商品Id - /// + { + public string ProductId { get; set; } - /// - /// 店铺商品Sku - /// + public string SkuId { get; set; } /// /// 采购商品Id @@ -18,8 +15,23 @@ /// public string PurchaseSkuId { get; set; } /// - /// 采购Ske SpecId (1688独有) + /// 采购SpecId (1688独有) /// public string PurchaseSkuSpecId { get; set; } + + /// + /// 采购配比 + /// + public int? PurchaseRatio { get; set; } + + /// + /// 实际单价(人工填写的单价,未填写传0或null) + /// + public decimal? ActualPrice { get; set; } + + /// + /// 默认单价(采购配件基本信息接口里的单价) + /// + public decimal? DefaultPrice { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeRequest.cs index fda1121..25595ba 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeRequest.cs @@ -4,40 +4,25 @@ namespace BBWYB.Server.Model.Dto { public class InputPurchaseSchemeRequest { - public string ShopId { get; set; } - public string ProductId { get; set; } - public string SkuId { get; set; } - /// - /// 采购默认成本 - /// - public decimal? DefaultCost { get; set; } /// - /// 采购实际成本 + /// 采购方案分组Id,为空将新增分组 /// - public decimal? RealCost { get; set; } - /// - /// 采购商Id - /// - public string PurchaserId { get; set; } + public long? SchemeGroupId { get; set; } /// - /// 采购商Id + /// 慧眼标的Id /// - public string PurchaserId2 { get; set; } + public string HYBDId { get; set; } /// - /// 采购商名称 + /// 慧眼方案Id /// - public string PurchaserName { get; set; } - /// - /// 采购商发货地 - /// - public string PurchaserLocation { get; set; } - /// - /// 采购平台 - /// - public Enums.Platform PurchasePlatform { get; set; } = Enums.Platform.阿里巴巴; + public string HYSchemeId { get; set; } + + public long ShopId { get; set; } + public string ProductId { get; set; } + public string SkuId { get; set; } - public IList PurchaseSchemeProductList { get; set; } + public List PurchaseSchemeProductList { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeAndGroupRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeAndGroupRequest.cs new file mode 100644 index 0000000..1f7cfa4 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeAndGroupRequest.cs @@ -0,0 +1,20 @@ +namespace BBWYB.Server.Model.Dto +{ + public class QuerySchemeAndGroupRequest + { + /// + /// 店铺Id + /// + public long ShopId { get; set; } + + /// + /// 店铺商品Id列表 + /// + public IList ProductIdList { get; set; } + + /// + /// 是否包含采购配件的基本信息(单价,Logo,标题等) 是=1 否=0或null + /// + public int? IncludePurchaseSkuBasicInfo { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeCountRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeCountRequest.cs new file mode 100644 index 0000000..abcd89c --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeCountRequest.cs @@ -0,0 +1,7 @@ +namespace BBWYB.Server.Model.Dto +{ + public class QuerySchemeCountRequest + { + public IList SkuIdList { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeRequest.cs index 59e2088..04d8b45 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/QuerySchemeRequest.cs @@ -5,27 +5,46 @@ namespace BBWYB.Server.Model.Dto public class QuerySchemeRequest { /// - /// 采购方案Id + /// 采购方案Id,有值则忽略SchemeIdList,SchemeGroupIdList,SkuIdList,ProductIdList /// public long? SchemeId { get; set; } /// - /// 采购方案Id集合 + /// 采购方案Id集合,有值则忽略SchemeGroupIdList,SkuIdList,ProductIdList /// - public IList SchemeIdList { get; set; } + public List SchemeIdList { get; set; } + + /// + /// 采购方案分组Id集合,有值则忽略SkuIdList,ProductIdList + /// + public List SchemeGroupIdList { get; set; } + + /// + /// skuId集合,有值则忽略ProductIdList + /// + public List SkuIdList { get; set; } + + /// + /// spuId集合,有值则忽略 + /// + public List ProductIdList { get; set; } public long? ShopId { get; set; } - public IList SkuIdList { get; set; } /// - /// 采购商Id, 可空 + /// 采购商Id, 只要其中一个采购商品满足采购商条件则命中查询 /// public string PurchaserId { get; set; } /// - /// 采购平台 + /// 采购平台, 只要其中一个采购商品满足平台条件则命中查询 /// public Enums.Platform? PurchasePlatform { get; set; } + + /// + /// 是否包含采购配件的基本信息(单价,Logo,标题等) 是=1 否=0或null + /// + public int? IncludePurchaseSkuBasicInfo { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/RefreshSchemeRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/RefreshSchemeRequest.cs index a4f0a20..d755cee 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/RefreshSchemeRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/RefreshSchemeRequest.cs @@ -2,6 +2,6 @@ { public class RefreshSchemeRequest { - public IList SchemeIdList { get; set; } + public List SchemeIdList { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/hy/QueryHYSchemeRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/hy/QueryHYSchemeRequest.cs new file mode 100644 index 0000000..ab142fe --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/hy/QueryHYSchemeRequest.cs @@ -0,0 +1,17 @@ +namespace BBWYB.Server.Model.Dto +{ + public class QueryHYSchemeRequest + { + public long ShopId { get; set; } + + /// + /// 店铺商品Id + /// + public string ProductId { get; set; } + + /// + /// 慧眼标的Id + /// + public string HYBDId { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/QiKu/QiKuPackTaskSkuPurchaseSchemeIdRequest.cs b/BBWYB.Server.Model/Dto/Request/QiKu/QiKuPackTaskSkuPurchaseSchemeIdRequest.cs index 8bde0fe..08ce525 100644 --- a/BBWYB.Server.Model/Dto/Request/QiKu/QiKuPackTaskSkuPurchaseSchemeIdRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/QiKu/QiKuPackTaskSkuPurchaseSchemeIdRequest.cs @@ -5,5 +5,10 @@ public string SkuId { get; set; } public string SkuPurchaseSchemeId { get; set; } + + /// + /// 采购方案版本 + /// + public long? SchemeVersion { get; set; } = 1; } } diff --git a/BBWYB.Server.Model/Dto/Response/Product/BProductResponse.cs b/BBWYB.Server.Model/Dto/Response/Product/BProductResponse.cs new file mode 100644 index 0000000..c970007 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/Product/BProductResponse.cs @@ -0,0 +1,16 @@ +using SDKAdapter.OperationPlatform.Models; + +namespace BBWYB.Server.Model.Dto +{ + public class BProductResponse : OP_ProductResponse + { + public IList SkuList { get; set; } + } + + public class BProductListResponse + { + public int Count { get; set; } + + public IList Items { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/Product/BProductSkuResponse.cs b/BBWYB.Server.Model/Dto/Response/Product/BProductSkuResponse.cs new file mode 100644 index 0000000..756e817 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/Product/BProductSkuResponse.cs @@ -0,0 +1,9 @@ +using SDKAdapter.OperationPlatform.Models; + +namespace BBWYB.Server.Model.Dto +{ + public class BProductSkuResponse: OP_ProductSkuResponse + { + public int SchemeCount { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/HY/HYPurchaseSchemeResponse.cs b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/HY/HYPurchaseSchemeResponse.cs new file mode 100644 index 0000000..8e60df2 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/HY/HYPurchaseSchemeResponse.cs @@ -0,0 +1,10 @@ +namespace BBWYB.Server.Model.Dto +{ + public class HYPurchaseSchemeResponse : PurchaseSchemeResponse + { + /// + /// 是否已经添加到SPU之中 + /// + public bool IsAdded { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseProductBasicInfoResponse.cs b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseProductBasicInfoResponse.cs index 336d112..3d0cacc 100644 --- a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseProductBasicInfoResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseProductBasicInfoResponse.cs @@ -11,6 +11,10 @@ namespace BBWYB.Server.Model.Dto public string PurchaseProductId { get; set; } + public string ProductName { get; set; } + + public string ProductLogo { get; set; } + /// /// 采购SKU基础信息列表 /// @@ -20,6 +24,13 @@ namespace BBWYB.Server.Model.Dto /// 采购商 /// public Purchaser Purchaser { get; set; } + + public Enums.PurchaseProductAPIMode APIMode { get; set; } + + /// + /// 是否失效 + /// + public bool IsInvalid { get; set; } } /// diff --git a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeCountResponse.cs b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeCountResponse.cs new file mode 100644 index 0000000..746ad2b --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeCountResponse.cs @@ -0,0 +1,9 @@ +namespace BBWYB.Server.Model.Dto +{ + public class PurchaseSchemeCountResponse + { + public string SkuId { get; set; } + + public int SchemeCount { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeGroupResponse.cs b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeGroupResponse.cs new file mode 100644 index 0000000..5229648 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeGroupResponse.cs @@ -0,0 +1,9 @@ +using BBWYB.Server.Model.Db; + +namespace BBWYB.Server.Model.Dto +{ + public class PurchaseSchemeGroupResponse : PurchaseSchemeGroup + { + public IList PurchaseSchemeList { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductResponse.cs b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductResponse.cs index 0123956..a1033c5 100644 --- a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductResponse.cs @@ -1,13 +1,34 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace BBWYB.Server.Model.Dto +namespace BBWYB.Server.Model.Dto { public class PurchaseSchemeProductResponse : Model.Db.PurchaseSchemeProduct { + public string PurchaserName { get; set; } + + public string PurchaserId2 { get; set; } + + public string PurchaserLocation { get; set; } + + public Enums.Platform? PurchasePlatform { get; set; } + + public string PurchaserMemberId { get; set; } + + /// + /// 采购商品标题 仅在查询条件IncludePurchaseSkuBasicInfo=1时具备该值 + /// + public string PurchaseProductName { get; set; } + + /// + /// 采购商品Logo 仅在查询条件IncludePurchaseSkuBasicInfo=1时具备该值 + /// + public string PurchaseProductLogo { get; set; } + public new List PurchaseSchemeProductSkuList { get; set; } + /// + /// 是否失效 失效=1 下架或无权都视为失效 其余情况默认为有效 仅在查询条件IncludePurchaseSkuBasicInfo=1时具备该值 + /// + public int? IsInvalid { get; set; } + public PurchaseSchemeProductResponse() { PurchaseSchemeProductSkuList = new List(); diff --git a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductSkuResponse.cs b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductSkuResponse.cs index 7374eaa..95a7739 100644 --- a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductSkuResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeProductSkuResponse.cs @@ -1,10 +1,26 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace BBWYB.Server.Model.Dto +namespace BBWYB.Server.Model.Dto { public class PurchaseSchemeProductSkuResponse : Model.Db.PurchaseSchemeProductSku { + + /// + /// 采购SKU标题 仅在查询条件IncludePurchaseSkuBasicInfo=1时具备该值 + /// + public string PurchaseSkuTitle { get; set; } + + /// + /// 采购SKULogo 仅在查询条件IncludePurchaseSkuBasicInfo=1时具备该值 + /// + public string PurchaseSkuLogo { get; set; } + + /// + /// 采购SKU单价 仅在查询条件IncludePurchaseSkuBasicInfo=1时具备该值 + /// + public decimal? PurchaseSkuPrice { get; set; } + + /// + /// 是否失效 失效=1 其余情况默认为有效 仅在查询条件IncludePurchaseSkuBasicInfo=1时具备该值 + /// + public int? IsInvalid { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeResponse.cs b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeResponse.cs index f322e0a..e1c617b 100644 --- a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeResponse.cs @@ -6,17 +6,20 @@ namespace BBWYB.Server.Model.Dto { public class PurchaseSchemeResponse : PurchaseScheme { - public string PurchaserName { get; set; } + //public string PurchaserName { get; set; } - public string PurchaserId2 { get; set; } + //public string PurchaserId2 { get; set; } - public string PurchaserLocation { get; set; } + //public string PurchaserLocation { get; set; } public new List PurchaseSchemeProductList { get; set; } + public List PurchaserList { get; set; } + public PurchaseSchemeResponse() { PurchaseSchemeProductList = new List(); + PurchaserList = new List(); } } } diff --git a/BBWYB.Server.Model/Enums.cs b/BBWYB.Server.Model/Enums.cs index 0c1429f..104bf09 100644 --- a/BBWYB.Server.Model/Enums.cs +++ b/BBWYB.Server.Model/Enums.cs @@ -300,11 +300,11 @@ } /// - /// 入仓类型 (发回齐越 = 0, 厂商代发入仓 = 1) + /// 入仓类型 (发回齐越 = 0, 厂商代发入仓 = 1,其他仓不包装 = 2) /// public enum IntoStoreType { - 发回齐越 = 0, 厂商代发入仓 = 1 + 发回齐越 = 0, 厂商代发入仓 = 1, 其他仓不包装 = 2 } /// diff --git a/BBWYB.Server.Model/MappingProfiles.cs b/BBWYB.Server.Model/MappingProfiles.cs index 65112b1..f3a6555 100644 --- a/BBWYB.Server.Model/MappingProfiles.cs +++ b/BBWYB.Server.Model/MappingProfiles.cs @@ -50,8 +50,15 @@ namespace BBWYB.Server.Model .ForPath(t => t.OrderCost.PurchaseFreight, opt => opt.MapFrom(f => f.PurchaseFreight)); CreateMap(); - //CreateMap(); - + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); } } } diff --git a/SDKAdapter/ExpressCompanyNameConverter.cs b/SDKAdapter/ExpressCompanyNameConverter.cs index 7ea24ce..9ae4333 100644 --- a/SDKAdapter/ExpressCompanyNameConverter.cs +++ b/SDKAdapter/ExpressCompanyNameConverter.cs @@ -127,7 +127,9 @@ namespace SDKAdapter new LogisticsCompanyRelationship(){SourceName="京东物流",TargetName="京东物流",TargetCode="jd"}, new LogisticsCompanyRelationship(){SourceName="速腾快递",TargetName="速腾快递",TargetCode="suteng"}, new LogisticsCompanyRelationship(){SourceName="运通快运",TargetName="运通快运",TargetCode="ytky168"}, - new LogisticsCompanyRelationship(){SourceName="汇森速运",TargetName="汇森速运",TargetCode="huisenky"} + new LogisticsCompanyRelationship(){SourceName="汇森速运",TargetName="汇森速运",TargetCode="huisenky"}, + new LogisticsCompanyRelationship(){SourceName="丹鸟物流",TargetName="丹鸟物流",TargetCode="danniao"}, + new LogisticsCompanyRelationship(){SourceName="丹鸟",TargetName="丹鸟物流",TargetCode="danniao"} }); } diff --git a/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs b/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs index 6e1cf4a..6cd3169 100644 --- a/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs +++ b/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs @@ -1,4 +1,5 @@ using BBWYB.Common.Http; +using BBWYB.Common.Models; using QuanTan.SDK.Client.Supplier; using QuanTan.SDK.Models.Supplier; using SDKAdapter.OperationPlatform.Models; @@ -203,7 +204,7 @@ namespace SDKAdapter.OperationPlatform.Client remark = request.Remark }, request.AppKey, request.AppSecret); if (qtResponse.Status != 200) - throw new Exception(qtResponse.Message); + throw new BusinessException(qtResponse.Message); } public override void EditPrice(OP_EditPriceRequest request) @@ -222,7 +223,7 @@ namespace SDKAdapter.OperationPlatform.Client }, request.AppKey, request.AppSecret); if (qtResponse.Status != 200) - throw new Exception(qtResponse.Message); + throw new BusinessException(qtResponse.Message); } public override void EditProductPrice(OP_EditProductPriceRequest request) @@ -238,7 +239,7 @@ namespace SDKAdapter.OperationPlatform.Client }).ToList() }, request.AppKey, request.AppSecret); if (qtResponse.Status != 200) - throw new Exception(qtResponse.Message); + throw new BusinessException(qtResponse.Message); } } } diff --git a/WebTest/GlobalContext.cs b/WebTest/GlobalContext.cs index dc18748..aa4c2e7 100644 --- a/WebTest/GlobalContext.cs +++ b/WebTest/GlobalContext.cs @@ -1,5 +1,7 @@ using Newtonsoft.Json; +using System; using System.Runtime.InteropServices; +using System.Windows; namespace WebTest { @@ -27,5 +29,24 @@ namespace WebTest { return "10123"; } + + public void CallALiWangWang(string sellerLoginId) + { + var url = $"aliim:sendmsg?siteid=cnalichn&portalId=&gid=&itemsId=&touid=cnalichn{sellerLoginId}&status=1"; + try + { + //Process.Start("explorer.exe", url); + ShellExecuteHelper.ShellExecute(IntPtr.Zero, "open", url, string.Empty, string.Empty, ShellExecuteHelper.ShowCommands.SW_SHOWNORMAL); + } + catch (Exception ex) + { + try + { + Clipboard.SetText(url); + } + catch { } + MessageBox.Show($"{ex.Message}\r\n唤醒旺旺失败,唤醒链接已复制到剪切板,请手动打开浏览器唤醒", "提示"); + } + } } } \ No newline at end of file diff --git a/WebTest/MainWindow.xaml.cs b/WebTest/MainWindow.xaml.cs index 05a29e6..93a2694 100644 --- a/WebTest/MainWindow.xaml.cs +++ b/WebTest/MainWindow.xaml.cs @@ -26,6 +26,14 @@ namespace WebTest private MdsApiService mdsApiService; private ShopService shopService; +#if DEBUG +private string registerName = "webTestContext"; +#else +private string registerName = "webContext"; +#endif + + + public MainWindow() { InitializeComponent(); @@ -87,7 +95,7 @@ namespace WebTest if (args.PermissionKind == CoreWebView2PermissionKind.ClipboardRead) args.State = CoreWebView2PermissionState.Allow; }; - w2m.wb2.CoreWebView2.AddHostObjectToScript("webTestContext", this.globalContext); + w2m.wb2.CoreWebView2.AddHostObjectToScript(registerName, this.globalContext); }; w2m.Init(); @@ -118,78 +126,42 @@ namespace WebTest if (mdsUserResponse.Data.SonDepartmentList != null && mdsUserResponse.Data.SonDepartmentList.Count > 0) globalContext.User.SonDepartmentNames = string.Join(',', mdsUserResponse.Data.SonDepartmentList.Select(sd => sd.DepartmentName)); + + //if (GlobalContext.User.TeamName == "刷单组") + // return; + + var res = shopService.GetDepartmentList(); + if (!res.Success) + throw new Exception(res.Msg); + var allDepartmentList = res.Data.Map>(); + + //if (GlobalContext.User.TeamName == "刷单组") + //{ + //var shopList = new List(); + //foreach (var d in allDepartmentList) + // shopList.AddRange(d.ShopList); + //globalContext.User.ShopList = shopList; + + IList departmentList = null; - if (globalContext.User.TeamName == "刷单组" || - managerDepartment.Contains(globalContext.User.TeamName) || - managerDepartment.Any(m => globalContext.User.SonDepartmentNames.Contains(m))) - { - var response = shopService.GetDepartmentList(); - if (!response.Success) - throw new Exception(response.Msg); - departmentList = response.Data.Map>(); - } - else - { - var response = mdsApiService.GetShopDetailList(); - if (!response.Success) - throw new Exception(response.Msg); - departmentList = response.Data; - if (departmentList.Count == 0) - throw new Exception("缺少有效的部门数据"); - - var shopIds = new List(); - foreach (var d in departmentList) - { - if (d.ShopList != null && d.ShopList.Count > 0) - { - foreach (var s in d.ShopList) - shopIds.Add(s.ShopId.ToString()); - } - } - var shopList2Res = shopService.GetShopListByIds(shopIds); - if (shopList2Res.Success && shopList2Res.Data != null && shopList2Res.Data.Count() > 0) - { - foreach (var d in departmentList) - { - foreach (var shop in d.ShopList) - { - var s2 = shopList2Res.Data.FirstOrDefault(s => s.ShopId == shop.ShopId); - if (s2 != null) - { - shop.DingDingKey = s2.DingDingKey; - shop.DingDingWebHook = s2.DingDingWebHook; - shop.SkuSafeTurnoverDays = s2.SkuSafeTurnoverDays; - shop.SiNanPolicyLevel = s2.SiNanPolicyLevel; - shop.SiNanDingDingKey = s2.SiNanDingDingKey; - shop.SiNanDingDingWebHook = s2.SiNanDingDingWebHook; - shop.AppKey2 = s2.AppKey2; - shop.AppSecret2 = s2.AppSecret2; - shop.AppToken2 = s2.AppToken2; - } - } - } - } - } - for (var i = 0; i < departmentList.Count(); i++) + //var response = mdsApiService.GetShopDetailList(); + //if (!response.Success) + // throw new Exception(response.Msg); + departmentList = allDepartmentList?.Where(d => d.Name.Contains("供应链")).ToList(); + if (departmentList.Count == 0) + throw new Exception("缺少有效的部门数据"); + + var shopIds = new List(); + foreach (var d in departmentList) { - var d = departmentList[i]; - for (var j = 0; j < d.ShopList.Count(); j++) - { - var shop = d.ShopList[j]; - if (string.IsNullOrEmpty(shop.AppToken2)) - { - d.ShopList.RemoveAt(j); - j--; - } - } - if (d.ShopList == null || d.ShopList.Count() == 0) + if (d.ShopList != null && d.ShopList.Count > 0) { - departmentList.RemoveAt(i); - i--; + foreach (var s in d.ShopList) + shopIds.Add(s.ShopId.ToString()); } - } + globalContext.User.DepartmentList = departmentList; } diff --git a/WebTest/ShellExecuteHelper.cs b/WebTest/ShellExecuteHelper.cs new file mode 100644 index 0000000..5562daa --- /dev/null +++ b/WebTest/ShellExecuteHelper.cs @@ -0,0 +1,36 @@ +using System; +using System.Runtime.InteropServices; + +namespace WebTest +{ + public class ShellExecuteHelper + { + public enum ShowCommands : int + { + SW_HIDE = 0, + SW_SHOWNORMAL = 1, + SW_NORMAL = 1, + SW_SHOWMINIMIZED = 2, + SW_SHOWMAXIMIZED = 3, + SW_MAXIMIZE = 3, + SW_SHOWNOACTIVATE = 4, + SW_SHOW = 5, + SW_MINIMIZE = 6, + SW_SHOWMINNOACTIVE = 7, + SW_SHOWNA = 8, + SW_RESTORE = 9, + SW_SHOWDEFAULT = 10, + SW_FORCEMINIMIZE = 11, + SW_MAX = 11 + } + + [DllImport("shell32.dll")] + public static extern IntPtr ShellExecute( + IntPtr hwnd, + string lpOperation, + string lpFile, + string lpParameters, + string lpDirectory, + ShowCommands nShowCmd); + } +}