diff --git a/BBWYB.Client/APIServices/ProductService.cs b/BBWYB.Client/APIServices/ProductService.cs index 6bb7947..8de8ee3 100644 --- a/BBWYB.Client/APIServices/ProductService.cs +++ b/BBWYB.Client/APIServices/ProductService.cs @@ -10,20 +10,21 @@ namespace BBWYB.Client.APIServices { public ProductService(RestApiService restApiService, GlobalContext globalContext) : base(restApiService, globalContext) { } - public ApiResponse GetProductList(string spu, string productName, string productItem, int pageIndex) + public ApiResponse GetProductList(string spu, string productName, string productItem, int pageIndex, int pageSize) { return SendRequest(globalContext.BBWYApiHost, "api/product/GetProductList", new { - Spu = spu, - ProductName = productName, - ProductItem = productItem, - PageIndex = pageIndex, - Platform = globalContext.User.Shop.Platform, - AppKey = globalContext.User.Shop.AppKey, - AppSecret = globalContext.User.Shop.AppSecret, - AppToken = globalContext.User.Shop.AppToken + spu, + productName, + productItem, + pageIndex, + pageSize, + globalContext.User.Shop.Platform, + globalContext.User.Shop.AppKey, + globalContext.User.Shop.AppSecret, + globalContext.User.Shop.AppToken }, null, HttpMethod.Post); @@ -37,10 +38,10 @@ namespace BBWYB.Client.APIServices { Spu = spu, Sku = sku, - Platform = globalContext.User.Shop.Platform, - AppKey = globalContext.User.Shop.AppKey, - AppSecret = globalContext.User.Shop.AppSecret, - AppToken = globalContext.User.Shop.AppToken + globalContext.User.Shop.Platform, + globalContext.User.Shop.AppKey, + globalContext.User.Shop.AppSecret, + globalContext.User.Shop.AppToken }, null, HttpMethod.Post); @@ -85,5 +86,5 @@ namespace BBWYB.Client.APIServices // } - + } diff --git a/BBWYB.Client/APIServices/PurchaseProductAPIService.cs b/BBWYB.Client/APIServices/PurchaseProductAPIService.cs index f3ddb57..17b0308 100644 --- a/BBWYB.Client/APIServices/PurchaseProductAPIService.cs +++ b/BBWYB.Client/APIServices/PurchaseProductAPIService.cs @@ -20,16 +20,15 @@ namespace BBWYB.Client.APIServices private string oneBoundKey = "t5060712539"; private string oneBoundSecret = "20211103"; - //private string qtAppId = "BBWY2023022001"; - //private string qtAppSecret = "908e131365d5448ca651ba20ed7ddefe"; private TimeSpan purchaseProductCacheTimeSpan; - //private TimeSpan _1688SessionIdTimeSpan; - - //private ConcurrentDictionary purchaseSchemeProductSkus)> productChaches; private IDictionary _1688ProductDetailRequestHeader; + private List _1688ColorPropertyFieldIdList; + private List locationIdList; + private List priceIdList; + public PurchaseProductAPIService(RestApiService restApiService, IMemoryCache memoryCache) { this.restApiService = restApiService; @@ -43,6 +42,10 @@ namespace BBWYB.Client.APIServices { "Accept-Language","zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"} }; purchaseProductCacheTimeSpan = TimeSpan.FromDays(1); + + _1688ColorPropertyFieldIdList = new List() { 3216, 1627207, 1234, 3151, 7853, 446, 374, 404, 100019516, 3114, 2068 }; + locationIdList = new List() { "1081181309101", "16347413030323", "13772573013156" }; + priceIdList = new List() { "1081181309582", "1081181309582", "16347413030316", "13772573013151" }; } public (Purchaser purchaser, IList purchaseSchemeProductSkus)? GetProductInfo(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode, PurchaseProductAPIMode apiMode) @@ -191,30 +194,47 @@ namespace BBWYB.Client.APIServices var jsonStr = match.Groups[2].Value; var jobject = JObject.Parse(jsonStr); + var location = ""; + for (var i = 0; i < locationIdList.Count(); i++) + { + if (jobject["data"][locationIdList[i]] != null) + { + location = jobject["data"][locationIdList[i]]["data"]["location"].ToString(); + break; + } + } + //16347413030323 var purchaser = new Purchaser() { Id = jobject["globalData"]["tempModel"]["sellerUserId"].ToString(), + Id2 = jobject["globalData"]["tempModel"]["sellerLoginId"]?.ToString(), Name = jobject["globalData"]["tempModel"]["companyName"].ToString(), - Location = jobject["data"]["1081181309101"] != null ? - jobject["data"]["1081181309101"]["data"]["location"].ToString() : - jobject["data"]["16347413030323"]["data"]["location"].ToString() + Location = location, + Platform = platform }; - var colorsProperty = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(j => j.Value("fid") == 3216 || - j.Value("fid") == 1627207 || - j.Value("fid") == 1234 || - j.Value("fid") == 3151)["value"] - .Children() - .Select(j => new - { - name = j.Value("name"), - imageUrl = j.Value("imageUrl") - }).ToList(); - - var firstPrice = jobject["data"]["1081181309582"] != null ? - jobject["data"]["1081181309582"]["data"]["priceModel"]["currentPrices"][0].Value("price") : - jobject["data"]["16347413030316"]["data"]["priceModel"]["currentPrices"][0].Value("price"); + var fidJToken = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(j => _1688ColorPropertyFieldIdList.Contains(j.Value("fid"))); + if (fidJToken == null) + fidJToken = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(j => j.Value("prop").Contains("颜色")); + if (fidJToken == null && jobject["globalData"]["skuModel"]["skuProps"].Children().Count() == 1) + fidJToken = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(); + var colorsProperty = fidJToken["value"].Children() + .Select(j => new + { + name = j.Value("name"), + imageUrl = j.Value("imageUrl") + }).ToList(); + + var firstPrice = 0.0M; + for (var i = 0; i < priceIdList.Count(); i++) + { + if (jobject["data"][priceIdList[i]] != null) + { + firstPrice = jobject["data"][priceIdList[i]]["data"]["priceModel"]["currentPrices"][0].Value("price"); + break; + } + } var purchaseSchemeProductSkus = new List(); diff --git a/BBWYB.Client/App.xaml.cs b/BBWYB.Client/App.xaml.cs index fed38fb..be15769 100644 --- a/BBWYB.Client/App.xaml.cs +++ b/BBWYB.Client/App.xaml.cs @@ -32,10 +32,10 @@ namespace BBWYB.Client #if DEBUG //齐越山鸡 - //userToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxNTM1MzMwMzI4ODkyMTQ5NzYwIiwidGVhbUlkIjoiMTUxNjk3NDI1MDU0MjUwMTg4OCIsInNvblRlYW1JZHMiOiIxNDM2Mjg4NTAwMjM1MjQzNTIwIiwiZXhwIjoxNjk0NjY5NjkxfQ.cSwro-7bGwOu92YejH9JhMenTai7Mvf99i2paQCmxIw"; + userToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxNTM1MzMwMzI4ODkyMTQ5NzYwIiwidGVhbUlkIjoiMTUxNjk3NDI1MDU0MjUwMTg4OCIsInNvblRlYW1JZHMiOiIxNDM2Mjg4NTAwMjM1MjQzNTIwIiwiZXhwIjoxNjk0NjY5NjkxfQ.cSwro-7bGwOu92YejH9JhMenTai7Mvf99i2paQCmxIw"; - //拳探店铺 测试002 - userToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMzk1NzA4MjA4NjU1MzcyMjg4IiwidGVhbUlkIjoiMTYyMDM0NDE0MDg1MDAwODA2NCIsInNvblRlYW1JZHMiOiIiLCJleHAiOjE3MDk5ODUwOTB9.v9iMB4kSpiYvHoPK3WSaOn5GE7bIUhO7266yowvxjfU"; + //拳探店铺 陈默 + //userToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxNjI0OTUxNjgzNTc2NTAwMjI0IiwidGVhbUlkIjoiMTYyMDM0MjAxNDcwNjk3ODgxNiIsInNvblRlYW1JZHMiOiIxNjIwMzQyMDE0NzA2OTc4ODE2LDE2MjAzNDM4Mjc0NzI1ODQ3MDQsMTYyMDM0NDAzMzczNTg3MjUxMiwxNjIwMzQ0MDkyODI5NDIxNTY4LDE2MjAzNDQxNDA4NTAwMDgwNjQiLCJleHAiOjE3MjA3NjQzMjV9.Q8fiKXCHgvzbm7NDEre-MeoSju_AmC6Ae6eDY22rUAw"; #else var tokenResult = ReadMMF(); diff --git a/BBWYB.Client/GlobalContext.cs b/BBWYB.Client/GlobalContext.cs index 2176586..dcc7452 100644 --- a/BBWYB.Client/GlobalContext.cs +++ b/BBWYB.Client/GlobalContext.cs @@ -1,4 +1,5 @@ using BBWYB.Client.APIServices; +using BBWYB.Client.Helpers; using BBWYB.Client.Models; using BBWYB.Client.ViewModels; using BBWYB.Client.Views.PackPurchaseTaska; @@ -7,6 +8,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Windows; @@ -20,7 +22,7 @@ namespace BBWYB.Client { public GlobalContext() { - BBWYBApiVersion = "10025"; + BBWYBApiVersion = "10030"; } private User user; @@ -57,6 +59,25 @@ namespace BBWYB.Client return BBWYBApiVersion; } + 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唤醒旺旺失败,唤醒链接已复制到剪切板,请手动打开浏览器唤醒", "提示"); + } + } + /// /// 对web版提供的修改打包任务方法 /// diff --git a/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeResponse.cs b/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeResponse.cs index c44c023..b010fef 100644 --- a/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeResponse.cs +++ b/BBWYB.Client/Models/APIModel/Response/PurchaseSchemeResponse.cs @@ -15,6 +15,11 @@ namespace BBWYB.Client.Models /// 采购商Id /// public string PurchaserId { get; set; } + + /// + /// 采购商Id + /// + public string PurchaserId2 { get; set; } public string PurchaserName { get; set; } /// /// 发货地 diff --git a/BBWYB.Client/Models/Product/Purchaser.cs b/BBWYB.Client/Models/Product/Purchaser.cs index 9d0040d..0b021fb 100644 --- a/BBWYB.Client/Models/Product/Purchaser.cs +++ b/BBWYB.Client/Models/Product/Purchaser.cs @@ -11,6 +11,8 @@ namespace BBWYB.Client.Models public string Id { get; set; } + public string Id2 { get; set; } + public string Name { get; set; } /// diff --git a/BBWYB.Client/Models/PurchaseScheme/PurchaseScheme.cs b/BBWYB.Client/Models/PurchaseScheme/PurchaseScheme.cs index bb84ac1..3d5ad1c 100644 --- a/BBWYB.Client/Models/PurchaseScheme/PurchaseScheme.cs +++ b/BBWYB.Client/Models/PurchaseScheme/PurchaseScheme.cs @@ -22,6 +22,7 @@ namespace BBWYB.Client.Models public decimal RealCost { get => realCost; set { SetProperty(ref realCost, value); } } public string PurchaserId { get; set; } + public string PurchaserId2 { get; set; } public string PurchaserName { get; set; } public string PurchaserLocation { get; set; } public string PurchaseProductId1 { get; set; } diff --git a/BBWYB.Client/Resources/Images/bbwylogo.ico b/BBWYB.Client/Resources/Images/bbwylogo.ico index 5fb3f35..c743326 100644 Binary files a/BBWYB.Client/Resources/Images/bbwylogo.ico and b/BBWYB.Client/Resources/Images/bbwylogo.ico differ diff --git a/BBWYB.Client/ViewModels/MainViewModel.cs b/BBWYB.Client/ViewModels/MainViewModel.cs index 0343adb..41da673 100644 --- a/BBWYB.Client/ViewModels/MainViewModel.cs +++ b/BBWYB.Client/ViewModels/MainViewModel.cs @@ -1,13 +1,11 @@ using BBWYB.Client.APIServices; using BBWYB.Client.Models; -using BBWYB.Client.Views; using BBWYB.Client.Views.SelectShop; using BBWYB.Client.Views.WebB; using BBWYB.Common.Extensions; using BBWYB.Common.Models; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; -using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -111,7 +109,7 @@ namespace BBWYB.Client.ViewModels ChildList = new List() { new MenuModel(){ Name="订单列表Bata",Url="/Views/WebB/WebB.xaml" }, - //new MenuModel(){ Name="团队配置",Url="/Views/Setting/TeamSetting.xaml" } + new MenuModel(){ Name="绩效考核",Url="/Views/WebB/WebB_KPI.xaml" } } }); MenuList.Add(new MenuModel() @@ -171,7 +169,7 @@ namespace BBWYB.Client.ViewModels var response = mdsApiService.GetShopDetailList(); if (!response.Success) throw new Exception(response.Msg); - departmentList = response.Data; + departmentList = response.Data?.Where(d => d.Name.Contains("供应链")).ToList(); if (departmentList.Count == 0) throw new Exception("缺少有效的部门数据"); diff --git a/BBWYB.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs b/BBWYB.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs index 2a8ec79..85775b6 100644 --- a/BBWYB.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs +++ b/BBWYB.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs @@ -35,6 +35,9 @@ namespace BBWYB.Client.ViewModels public IList ProductSkuList { get; set; } public string PurchaserId { get; set; } + + public string PurchaserId2 { 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); } } @@ -85,11 +88,12 @@ namespace BBWYB.Client.ViewModels }; } - public void SetData(IList productSkuList, string purchaserId, 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; } @@ -177,6 +181,7 @@ namespace BBWYB.Client.ViewModels } PurchaserId = data.Value.purchaser.Id; + PurchaserId2 = data.Value.purchaser.Id2; PurchaserName = data.Value.purchaser.Name; PurchaserLocation = data.Value.purchaser.Location; @@ -315,6 +320,7 @@ namespace BBWYB.Client.ViewModels 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.DefaultCost = productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Sum(p => p.PurchaseSchemeProductSkuList.Count() == 0 ? 0 : p.PurchaseSchemeProductSkuList.Sum(s => s.Price)); diff --git a/BBWYB.Client/ViewModels/Ware/WareManagerViewModel.cs b/BBWYB.Client/ViewModels/Ware/WareManagerViewModel.cs index c0d4a14..5661f0a 100644 --- a/BBWYB.Client/ViewModels/Ware/WareManagerViewModel.cs +++ b/BBWYB.Client/ViewModels/Ware/WareManagerViewModel.cs @@ -57,6 +57,7 @@ namespace BBWYB.Client.ViewModels #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); @@ -111,7 +112,7 @@ namespace BBWYB.Client.ViewModels IsLoading = false; return; } - productApiResponse = productService.GetProductList(skuResponse.Data.Items[0].ProductId, string.Empty, string.Empty, pageIndex); + productApiResponse = productService.GetProductList(skuResponse.Data.Items[0].ProductId, string.Empty, string.Empty, pageIndex, PageSize); } else { @@ -122,7 +123,7 @@ namespace BBWYB.Client.ViewModels } else { - productApiResponse = productService.GetProductList(SearchSpu, SearchProductName, SearchProductItem, pageIndex); + productApiResponse = productService.GetProductList(SearchSpu, SearchProductName, SearchProductItem, pageIndex, PageSize); } if (!productApiResponse.Success) @@ -241,7 +242,13 @@ namespace BBWYB.Client.ViewModels var purchaser = product.PurchaserList.FirstOrDefault(purchaser => purchaser.Id == pscheme.PurchaserId); if (purchaser == null) { - purchaser = new Purchaser() { Id = pscheme.PurchaserId, Name = pscheme.PurchaserName, ProductId = product.Id }; + purchaser = new Purchaser() + { + Id = pscheme.PurchaserId, + Id2 = pscheme.PurchaserId2, + Name = pscheme.PurchaserName, + ProductId = product.Id + }; product.PurchaserList.Add(purchaser); } purchaser.SkuUseCount++; @@ -259,13 +266,13 @@ namespace BBWYB.Client.ViewModels return; } - OpenBindingView(product, string.Empty, string.Empty); + 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.Name); + OpenBindingView(product, purchaser.Id, purchaser.Id2, purchaser.Name); } private void DeletePurchaser(Purchaser purchaser) @@ -305,10 +312,10 @@ namespace BBWYB.Client.ViewModels }); } - private void OpenBindingView(Product product, string purchaserId, string purchaserName) + private void OpenBindingView(Product product, string purchaserId, string purchaserId2, string purchaserName) { var skuList = product.SkuList; - bindingPurchaseProduct.SetData(skuList, purchaserId, purchaserName, product.SelectedPurchasePlatformModel); + bindingPurchaseProduct.SetData(skuList, purchaserId, purchaserId2, purchaserName, product.SelectedPurchasePlatformModel); var bindingView = new BindingPurchaseProduct(); var r = bindingView.ShowDialog(); if (r == true) diff --git a/BBWYB.Client/Views/WebB/WebB.xaml.cs b/BBWYB.Client/Views/WebB/WebB.xaml.cs index 9c39e7f..b365133 100644 --- a/BBWYB.Client/Views/WebB/WebB.xaml.cs +++ b/BBWYB.Client/Views/WebB/WebB.xaml.cs @@ -1,10 +1,6 @@ -using BBWYB.Client.APIServices; -using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.Extensions.DependencyInjection; -using System.Collections.Generic; -using System.IO; -using System.Reflection; using System.Windows; using System.Windows.Controls; @@ -18,9 +14,6 @@ namespace BBWYB.Client.Views.WebB private WebView2Manager w2m; private bool isNavigated; - private IList managerDepartment; - private MdsApiService mdsApiService; - private ShopService shopService; private GlobalContext globalContext; public WebB() @@ -61,20 +54,20 @@ namespace BBWYB.Client.Views.WebB { w2m = s.ServiceProvider.GetRequiredService(); globalContext = s.ServiceProvider.GetRequiredService(); - mdsApiService = s.ServiceProvider.GetRequiredService(); - shopService = s.ServiceProvider.GetRequiredService(); } #if DEBUG var url = "http://192.168.1.8: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("webContext", this.globalContext); + w2m.wb2.CoreWebView2.AddHostObjectToScript(registerName, this.globalContext); isNavigated = true; w2m.wb2.CoreWebView2.Navigate(url); }; diff --git a/BBWYB.Client/Views/WebB/WebB_KPI.xaml b/BBWYB.Client/Views/WebB/WebB_KPI.xaml new file mode 100644 index 0000000..261dbfd --- /dev/null +++ b/BBWYB.Client/Views/WebB/WebB_KPI.xaml @@ -0,0 +1,14 @@ + + + + + + diff --git a/BBWYB.Client/Views/WebB/WebB_KPI.xaml.cs b/BBWYB.Client/Views/WebB/WebB_KPI.xaml.cs new file mode 100644 index 0000000..da0813d --- /dev/null +++ b/BBWYB.Client/Views/WebB/WebB_KPI.xaml.cs @@ -0,0 +1,87 @@ +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Windows; +using System.Windows.Controls; + +namespace BBWYB.Client.Views.WebB +{ + /// + /// WebB_KPI.xaml 的交互逻辑 + /// + public partial class WebB_KPI : Page + { + private WebView2Manager w2m; + private bool isNavigated; + + private GlobalContext globalContext; + public WebB_KPI() + { + InitializeComponent(); + + this.Loaded += WebB_KPI_Loaded; ; + this.Unloaded += WebB_KPI_Unloaded; + + WeakReferenceMessenger.Default.Register(this, (o, x) => + { + this.Dispatcher.Invoke(() => + { + _ = w2m.wb2.ExecuteScriptAsync("window.location.reload();"); + }); + }); + } + + private void WebB_KPI_Unloaded(object sender, RoutedEventArgs e) + { + grid.Children.Remove(w2m.wb2); + w2m.Close(); + WeakReferenceMessenger.Default.UnregisterAll(this); + } + + private void WebB_KPI_Loaded(object sender, 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://localhost:8080/#/performance"; + var registerName = "webTestContext"; +#else + var url = "http://qtbbwy.qiyue666.com/#/performance"; + 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_WebBKPI_Refresh : ValueChangedMessage + { + public Message_WebBKPI_Refresh(object value) : base(value) + { + } + } +} diff --git a/BBWYB.Server.API/Controllers/BaseApiController.cs b/BBWYB.Server.API/Controllers/BaseApiController.cs index bfb1ca8..283c4fe 100644 --- a/BBWYB.Server.API/Controllers/BaseApiController.cs +++ b/BBWYB.Server.API/Controllers/BaseApiController.cs @@ -1,5 +1,7 @@ using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Primitives; + namespace BBWYB.Server.API.Controllers { [Produces("application/json")] @@ -13,5 +15,22 @@ namespace BBWYB.Server.API.Controllers { this.httpContextAccessor = httpContextAccessor; } + + protected string GetUserId() + { + return httpContextAccessor?.HttpContext?.User.Claims.Where(x => x.Type == "userId")?.FirstOrDefault()?.Value; + } + + protected string GetToken() + { + httpContextAccessor.HttpContext.Request.Headers.TryGetValue("Authorization", out StringValues token); + return token; + } + + protected string GetClientCode() + { + httpContextAccessor.HttpContext.Request.Headers.TryGetValue("ClientCode", out StringValues clientCode); + return clientCode; + } } } diff --git a/BBWYB.Server.API/Controllers/DataRepairController.cs b/BBWYB.Server.API/Controllers/DataRepairController.cs index e01a121..027cc64 100644 --- a/BBWYB.Server.API/Controllers/DataRepairController.cs +++ b/BBWYB.Server.API/Controllers/DataRepairController.cs @@ -25,5 +25,22 @@ namespace BBWYB.Server.API.Controllers dataRepairBusiness.SubscribeKD100(waybillNo, targetCompanyCode); } + /// + /// 修复采购商信息 + /// + [HttpPost] + public void SupplementPurchaserInfo() + { + dataRepairBusiness.SupplementPurchaserInfo(); + } + + /// + /// 修复订单Sku成本 + /// + [HttpPost] + public void SupplementOrderSkuCost() + { + dataRepairBusiness.SupplementOrderSkuCost(); + } } } diff --git a/BBWYB.Server.API/Controllers/OrderController.cs b/BBWYB.Server.API/Controllers/OrderController.cs index eb83425..538d1f8 100644 --- a/BBWYB.Server.API/Controllers/OrderController.cs +++ b/BBWYB.Server.API/Controllers/OrderController.cs @@ -68,10 +68,8 @@ namespace BBWYB.Server.API.Controllers [HttpPost] public void CancelOrder([FromBody] CancelOrderRequest request) { - if (!httpContextAccessor.HttpContext.Request.Headers.TryGetValue("Authorization", out StringValues token)) - throw new Exception("未获取到token"); - - orderBusiness.CancelOrder(request, token.ToString()); + var token = GetToken(); + orderBusiness.CancelOrder(request, token); } /// @@ -119,7 +117,7 @@ namespace BBWYB.Server.API.Controllers /// /// [HttpPost("{orderId}")] - public void CheckComputationOrder([FromRoute]string orderId) + public void CheckComputationOrder([FromRoute] string orderId) { orderBusiness.CheckComputationOrder(orderId); } @@ -133,5 +131,37 @@ namespace BBWYB.Server.API.Controllers { orderBusiness.QiKuPublishPackAmount(request); } + + /// + /// 统计各状态订单数量 + /// + /// + /// + [HttpPost("{shopId}")] + public OrderCountByStateResponse StatisticsOrderCountByOrderState([FromRoute] long shopId) + { + return orderBusiness.StatisticsOrderCountByOrderState(shopId); + } + + /// + /// 齐库推送sku配置状态 + /// + /// + [HttpPost] + [AllowAnonymous] + public void QikuPublishOrderSkuPackConfigState([FromBody] QikuPublishOrderSkuPackConfigStateRequest request) + { + orderBusiness.QikuPublishOrderSkuPackConfigState(request); + } + + /// + /// 设置/取消特殊单 + /// + /// + [HttpPost] + public void SetSpecialOrder([FromBody] SetSpecialOrderRequest request) + { + orderBusiness.SetSpecialOrder(request); + } } } diff --git a/BBWYB.Server.API/Controllers/OrderMessageController.cs b/BBWYB.Server.API/Controllers/OrderMessageController.cs new file mode 100644 index 0000000..3c3f4c1 --- /dev/null +++ b/BBWYB.Server.API/Controllers/OrderMessageController.cs @@ -0,0 +1,53 @@ +using BBWYB.Server.Business; +using BBWYB.Server.Model.Dto; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace BBWYB.Server.API.Controllers +{ + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] + public class OrderMessageController : BaseApiController + { + private OrderMessageBusiness orderMessageBusiness; + + public OrderMessageController(IHttpContextAccessor httpContextAccessor, OrderMessageBusiness orderMessageBusiness) : base(httpContextAccessor) + { + this.orderMessageBusiness = orderMessageBusiness; + } + + /// + /// 新增订单留言 + /// + /// + [HttpPost] + public void AddOrderMessage([FromBody] AddOrderMessageRequest request) + { + var token = GetToken(); + var clientCode = GetClientCode(); + orderMessageBusiness.AddOrderMessage(request, token, clientCode); + } + + /// + /// 查询订单留言 + /// + /// + /// + [HttpGet("{orderId}")] + public IList GetOrderMessageList([FromRoute] string orderId) + { + return orderMessageBusiness.GetOrderMessageList(orderId); + } + + /// + /// 批量查询订单留言 + /// + /// + /// + [HttpPost] + public IList GetOrdersMessageList([FromBody]string[] orderIds) + { + return orderMessageBusiness.GetOrderMessageList(orderIds); + } + } +} diff --git a/BBWYB.Server.API/Controllers/ProductController.cs b/BBWYB.Server.API/Controllers/ProductController.cs index 7d34e71..3ed179e 100644 --- a/BBWYB.Server.API/Controllers/ProductController.cs +++ b/BBWYB.Server.API/Controllers/ProductController.cs @@ -33,5 +33,15 @@ namespace BBWYB.Server.API.Controllers { return productBusiness.GetProductSkuList(request); } + + /// + /// 修改商品价格 + /// + /// + [HttpPost] + public void EditProductPrice([FromBody] OP_EditProductPriceRequest request) + { + productBusiness.EditProductPrice(request); + } } } diff --git a/BBWYB.Server.API/Controllers/PurchaseOrderController.cs b/BBWYB.Server.API/Controllers/PurchaseOrderController.cs index 2b4dd1a..35b8645 100644 --- a/BBWYB.Server.API/Controllers/PurchaseOrderController.cs +++ b/BBWYB.Server.API/Controllers/PurchaseOrderController.cs @@ -91,6 +91,17 @@ namespace BBWYB.Server.API.Controllers purchaseOrderBusiness.SetHistoryPurchaseOrder(request); } + /// + /// 删除历史采购单 + /// + /// + [HttpDelete] + public void DeletePurchaseOrder([FromBody] DeletePurchaseOrderRequest request) + { + request.IsDelete = true; + purchaseOrderBusiness.SetHistoryPurchaseOrder(request); + } + /// /// 手动签收采购单 /// @@ -112,6 +123,16 @@ namespace BBWYB.Server.API.Controllers purchaseOrderBusiness.ManualDelivery(request); } + /// + /// 设置快递单和入仓采购单(厂商代发入仓订单专用) + /// + /// + [HttpPost] + public void PurchaserDelivery([FromBody] PurchaserDeliveryRequest request) + { + purchaseOrderBusiness.PurchaserDelivery(request); + } + /// /// 手动收货 /// diff --git a/BBWYB.Server.API/Controllers/TimeLimitTaskController.cs b/BBWYB.Server.API/Controllers/TimeLimitTaskController.cs new file mode 100644 index 0000000..deca3ce --- /dev/null +++ b/BBWYB.Server.API/Controllers/TimeLimitTaskController.cs @@ -0,0 +1,63 @@ +using BBWYB.Server.Business; +using BBWYB.Server.Model.Dto; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace BBWYB.Server.API.Controllers +{ + /// + /// 限时任务 + /// + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] + public class TimeLimitTaskController : BaseApiController + { + private TimeLimitTaskBusiness timeLimitTaskBusiness; + public TimeLimitTaskController(IHttpContextAccessor httpContextAccessor, TimeLimitTaskBusiness timeLimitTaskBusiness) : base(httpContextAccessor) + { + this.timeLimitTaskBusiness = timeLimitTaskBusiness; + } + + /// + /// 检查任务过期(自动任务,前端无需对接) + /// + [HttpPost] + [AllowAnonymous] + public void CheckTask() + { + timeLimitTaskBusiness.CheckTask(); + } + + /// + /// 查询限时任务列表 + /// + /// + /// + [HttpPost] + public TimeLimitTaskListResponse QueryTimeLimitTask([FromBody] QueryTimeLimitTaskRequest request) + { + return timeLimitTaskBusiness.QueryTimeLimitTask(request); + } + + /// + /// 限时任务统计 + /// + /// + /// + [HttpPost] + public IList TimeOutStatistics([FromBody]QueryTimeOutRequest request) + { + return timeLimitTaskBusiness.TimeOutStatistics(request); + } + + /// + /// 修改备注 + /// + /// + [HttpPost] + public void EditTimeLimitTaskRemark([FromBody] EditTimeLimitTaskRemarkRequest request) + { + timeLimitTaskBusiness.EditTimeLimitTaskRemark(request); + } + } +} diff --git a/BBWYB.Server.API/appsettings.json b/BBWYB.Server.API/appsettings.json index 9be7fb6..9a15df4 100644 --- a/BBWYB.Server.API/appsettings.json +++ b/BBWYB.Server.API/appsettings.json @@ -15,9 +15,9 @@ "AllowedSwagger": true, "Secret": "D96BFA5B-F2AF-45BC-9342-5A55C3F9BBB0", "ApiVersionRequirements": [ - { - "Api": "/api/purchaseOrder/createpurchaseorder", - "MinimumVersion": 10017 - } + //{ + // "Api": "/api/purchaseOrder/createpurchaseorder", + // "MinimumVersion": 10017 + //} ] } diff --git a/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs b/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs index 7c953d0..3fbebc0 100644 --- a/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs +++ b/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs @@ -1,8 +1,10 @@ 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 System.Net.Http.Headers; using Yitter.IdGenerator; namespace BBWYB.Server.Business @@ -10,9 +12,11 @@ namespace BBWYB.Server.Business public class DataRepairBusiness : BaseBusiness, IDenpendency { private KuaiDi100Manager kuaiDi100Manager; - public DataRepairBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, KuaiDi100Manager kuaiDi100Manager) : base(fsql, nLogManager, idGenerator) + private PurchaseSchemeBusiness purchaseSchemeBusiness; + public DataRepairBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, KuaiDi100Manager kuaiDi100Manager, PurchaseSchemeBusiness purchaseSchemeBusiness) : base(fsql, nLogManager, idGenerator) { this.kuaiDi100Manager = kuaiDi100Manager; + this.purchaseSchemeBusiness = purchaseSchemeBusiness; } @@ -20,5 +24,116 @@ namespace BBWYB.Server.Business { kuaiDi100Manager.SubscribeKuaiDi100(waybillNo, targetCompanyCode, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish"); } + + 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 + { + //psp.PurchaseUrl, + psp.PurchaseProductId, + p.Id + }); + var groups = purlList.GroupBy(p => p.Id); + Console.WriteLine(groups.Count()); + IList> updatePurchaserList = new List>(); + int i = 1; + foreach (var group in groups) + { + var purchaseId = group.Key; + var productId = group.Max(p => p.PurchaseProductId); + Thread.Sleep(1000); + Console.WriteLine(); + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine($"index {i}"); + Console.ResetColor(); + Console.WriteLine(); + var response = purchaseSchemeBusiness.GetPurchaseSkuBasicInfo(new PurchaseSkuBasicInfoRequest() + { + FirstApiMode = Enums.PurchaseProductAPIMode.Spider, + Platform = Enums.Platform.阿里巴巴, + PriceMode = Enums.PurchaseOrderMode.批发, + PurchaseProductId = productId + }); + if (!string.IsNullOrEmpty(response?.Purchaser?.Id2)) + { + if (response.Purchaser.Id2.Length > 20) + Console.WriteLine(response.Purchaser.Id2); + var update = fsql.Update(purchaseId).Set(p => p.Id2, response.Purchaser.Id2); + updatePurchaserList.Add(update); + } + i++; + + if (updatePurchaserList.Count >= 10) + { + fsql.Transaction(() => + { + foreach (var update in updatePurchaserList) + update.ExecuteAffrows(); + }); + updatePurchaserList.Clear(); + Console.WriteLine(); + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("更新数据库更新"); + Console.ResetColor(); + Console.WriteLine(); + } + } + + if (updatePurchaserList.Count() > 0) + { + fsql.Transaction(() => + { + foreach (var update in updatePurchaserList) + update.ExecuteAffrows(); + }); + } + } + + 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(); + }); + } } } diff --git a/BBWYB.Server.Business/Extensions/OrderAmountExtension.cs b/BBWYB.Server.Business/Extensions/OrderAmountExtension.cs index b5becfd..4538bae 100644 --- a/BBWYB.Server.Business/Extensions/OrderAmountExtension.cs +++ b/BBWYB.Server.Business/Extensions/OrderAmountExtension.cs @@ -8,17 +8,11 @@ namespace BBWYB.Server.Business.Extensions /// 计算订单sku明细的成本和利润 /// /// 订单SKU明细成本对象 - /// sku商品金额(收入) - /// sku买家支付运费(收入) - /// sku实收打包费(收入) /// sku采购货款(支出) /// sku采购运费(支出) /// sku支出打包费(支出) /// sku发货运费(支出) public static void CalculationOrderCostDetailCostAndProfit(this OrderCostDetail ocd, - decimal skuProductAmount, - decimal skuBuyerPayFreight, - decimal skuInPackAmount, decimal skuPurchaseProductAmount, decimal skuPurchaseFreight, decimal skuOutPackAmount, @@ -29,7 +23,50 @@ namespace BBWYB.Server.Business.Extensions ocd.OutPackAmount = skuOutPackAmount; ocd.DeliveryExpressFreight = skuDeliveryExpressFreight; ocd.TotalCost = ocd.SkuAmount + ocd.PurchaseFreight + ocd.OutPackAmount + ocd.DeliveryExpressFreight; //采购货款+采购运费+支出打包费+发货运费 - ocd.Profit = skuProductAmount + skuBuyerPayFreight + skuInPackAmount - ocd.TotalCost; //SKU货款+买家支付运费+SKU打包费 - SKU总成本 + //ocd.Profit = skuProductAmount + skuBuyerPayFreight + skuInPackAmount - ocd.TotalCost; //SKU货款+买家支付运费+SKU打包费 - SKU总成本 + } + + /// + /// 计算订单sku成本和利润 + /// + /// 订单SKU明细成本对象 + /// sku商品金额(收入) + /// sku买家支付运费(收入) + /// sku实收打包费(收入) + /// 订单成本明细列表 + public static void CalculationOrderSkuCostAndProfit(this OrderSkuCost orderSkuCost, + decimal skuProductAmount, + decimal skuBuyerPayFreight, + decimal skuInPackAmount, + IList orderCostDetailList) + { + var currentSkuCostDetailList = orderCostDetailList.Where(ocd => ocd.SkuId == orderSkuCost.SkuId && ocd.IsEnabled == true).ToList(); + + orderSkuCost.SkuAmount = currentSkuCostDetailList.Sum(ocd => ocd.SkuAmount); + orderSkuCost.PurchaseFreight = currentSkuCostDetailList.Sum(ocd => ocd.PurchaseFreight); + orderSkuCost.OutPackAmount = currentSkuCostDetailList.Sum(ocd => ocd.OutPackAmount); + orderSkuCost.DeliveryExpressFreight = currentSkuCostDetailList.Sum(ocd => ocd.DeliveryExpressFreight); + orderSkuCost.TotalCost = orderSkuCost.SkuAmount + + orderSkuCost.PurchaseFreight + + orderSkuCost.OutPackAmount + + orderSkuCost.DeliveryExpressFreight; //采购货款+采购运费+支出打包费+发货运费 + orderSkuCost.Profit = skuProductAmount + skuBuyerPayFreight + skuInPackAmount - orderSkuCost.TotalCost; //SKU货款+买家支付运费+SKU打包费 - SKU总成本 + } + + /// + /// 计算订单sku成本和利润 + /// + /// + /// + /// + public static void CalculationOrderSkuCostAndProfit(this OrderSkuCost orderSkuCost, + OrderSku orderSku, + IList orderCostDetailList) + { + orderSkuCost.CalculationOrderSkuCostAndProfit((orderSku.ItemTotal * orderSku.Price) ?? 0M, + orderSku.BuyerPayFreight ?? 0M, + orderSku.InPackAmount ?? 0M, + orderCostDetailList); } /// @@ -41,12 +78,12 @@ namespace BBWYB.Server.Business.Extensions /// 采购运费 /// 支出打包费 /// 发货运费 - public static void CalculationOrderCostCostAndProfit(this OrderCost oc, - decimal orderAmount, - decimal purchaseProductAmount, - decimal purchaseFreight, - decimal outPackAmount, - decimal deliveryExpressFreight) + public static void CalculationOrderCostAndProfit(this OrderCost oc, + decimal orderAmount, + decimal purchaseProductAmount, + decimal purchaseFreight, + decimal outPackAmount, + decimal deliveryExpressFreight) { oc.PurchaseAmount = purchaseProductAmount + purchaseFreight; //兼容以前 @@ -57,5 +94,25 @@ namespace BBWYB.Server.Business.Extensions oc.TotalCost = oc.SkuAmount + oc.PurchaseFreight + oc.OutPackAmount + oc.DeliveryExpressFreight; oc.Profit = orderAmount - oc.TotalCost; } + + /// + /// 计算订单的成本和利润 + /// + /// + /// + /// + public static void CalculationOrderCostAndProfit(this OrderCost oc, + decimal orderAmount, + IList orderSkuCostList) + { + var currentOrderSkuCostList = orderSkuCostList.Where(osc => osc.OrderId == oc.OrderId).ToList(); + oc.SkuAmount = currentOrderSkuCostList.Sum(osc => osc.SkuAmount); + oc.PurchaseFreight = currentOrderSkuCostList.Sum(osc => osc.PurchaseFreight); + oc.PurchaseAmount = oc.SkuAmount + oc.PurchaseFreight; //兼容以前 + oc.OutPackAmount = currentOrderSkuCostList.Sum(osc => osc.OutPackAmount); + oc.DeliveryExpressFreight = currentOrderSkuCostList.Sum(osc => osc.DeliveryExpressFreight); + oc.TotalCost = oc.SkuAmount + oc.PurchaseFreight + oc.OutPackAmount + oc.DeliveryExpressFreight; + oc.Profit = orderAmount - oc.TotalCost; + } } } diff --git a/BBWYB.Server.Business/Extensions/OrderStateExtension.cs b/BBWYB.Server.Business/Extensions/OrderStateExtension.cs index 4fe1500..1834f9c 100644 --- a/BBWYB.Server.Business/Extensions/OrderStateExtension.cs +++ b/BBWYB.Server.Business/Extensions/OrderStateExtension.cs @@ -2,6 +2,7 @@ using BBWYB.Server.Model; using BBWYB.Server.Model.Db; +using JD.Dto; namespace BBWYB.Server.Business { @@ -11,14 +12,19 @@ namespace BBWYB.Server.Business /// 计算订单状态 /// /// + /// + /// 是否在入库单验证失败后通知钉钉 /// /// - /// + /// public static void CalculationOrderState(this Order order, IFreeSql fsql, + out bool IsNotifyDingDingWhenInStoreOrderFail, IList orderSkuList = null, - IList orderPurchaseInfoList = null) + IList orderPurchaseInfoList = null, + IList jdInStoreOrderDetailList = null) { + IsNotifyDingDingWhenInStoreOrderFail = false; if (order.OrderState == Enums.OrderState.已取消 || order.OrderState == Enums.OrderState.已完成 || order.OrderState == Enums.OrderState.待付款) @@ -112,8 +118,16 @@ namespace BBWYB.Server.Business else order.OrderState = Enums.OrderState.待核算; } - else - order.OrderState = Enums.OrderState.已完成; + else if (order.IntoStoreType == Enums.IntoStoreType.厂商代发入仓) + { + if (jdInStoreOrderDetailList == null || jdInStoreOrderDetailList.Count() == 0 || jdInStoreOrderDetailList.Any(x => x.storageStatus != "2")) + { + order.OrderState = Enums.OrderState.待验收; + IsNotifyDingDingWhenInStoreOrderFail = true; + } + else + order.OrderState = Enums.OrderState.待核算; + } return; } #endregion @@ -125,10 +139,12 @@ namespace BBWYB.Server.Business /// 计算采购单状态 /// /// + /// /// /// /// public static void CalculationOrderState(this OrderPurchaseInfo orderPurchaseInfo, + Enums.IntoStoreType intoStoreType, IFreeSql fsql, IList orderPurchaseSkuList = null, IList purchaseExpressOrderList = null) @@ -145,18 +161,15 @@ namespace BBWYB.Server.Business if (orderPurchaseInfo.OrderState == Enums.PurchaseOrderState.已取消) return; + if (purchaseExpressOrderList == null) + return; - if (orderPurchaseInfo.PurchasePlatform == Enums.Platform.阿里巴巴) + if (orderPurchaseInfo.PurchasePlatform == Enums.Platform.阿里巴巴 && intoStoreType != Enums.IntoStoreType.厂商代发入仓) //支持采购sku和关联信息 { if (orderPurchaseSkuList == null) orderPurchaseSkuList = fsql.Select().Where(ops => ops.PurchaseOrderId == orderPurchaseInfo.PurchaseOrderId).ToList(); - } - if (purchaseExpressOrderList == null) - return; - if (orderPurchaseInfo.PurchasePlatform == Enums.Platform.阿里巴巴) //支持采购sku和关联信息 - { #region 待发货 if (orderPurchaseSkuList.Count() == orderPurchaseSkuList.Count(ops => string.IsNullOrEmpty(ops.WaybillNo))) { @@ -186,7 +199,6 @@ namespace BBWYB.Server.Business #endregion } - #region 待收货 if (purchaseExpressOrderList.Count(exo => exo.ExpressState == "QianShou") == 0) { diff --git a/BBWYB.Server.Business/Extensions/PurchaseExpressOrderExtension.cs b/BBWYB.Server.Business/Extensions/PurchaseExpressOrderExtension.cs index ad26a54..db654d7 100644 --- a/BBWYB.Server.Business/Extensions/PurchaseExpressOrderExtension.cs +++ b/BBWYB.Server.Business/Extensions/PurchaseExpressOrderExtension.cs @@ -10,10 +10,12 @@ namespace BBWYB.Server.Business.Extensions /// 计算快递单归属 /// /// 必须是经过与快递单关系表进行联合查询的结果 (ExpressOrderRelationInfo-PurchaseExpressOrder) + /// /// /// /// public static void CalculationBelongOrderSku(this PurchaseExpressOrderResponse purchaseExpressOrder, + Enums.IntoStoreType? intoStoreType, IList orderPurchaseInfoList, IList orderPurchaseRelationInfoList, IList orderPurchaseSkuInfoList) @@ -21,7 +23,7 @@ namespace BBWYB.Server.Business.Extensions var purchaseOrder = orderPurchaseInfoList.FirstOrDefault(po => po.PurchaseOrderId == purchaseExpressOrder.PurchaseOrderId); if (purchaseOrder == null) return; - if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴) + if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴 && intoStoreType != Enums.IntoStoreType.厂商代发入仓) { var purchaseSkuIds = orderPurchaseSkuInfoList.Where(posku => posku.WaybillNo == purchaseExpressOrder.WaybillNo && posku.PurchaseOrderId == purchaseOrder.PurchaseOrderId) @@ -32,27 +34,10 @@ namespace BBWYB.Server.Business.Extensions .Distinct() .ToList(); purchaseExpressOrder.BelongSkuIds = string.Join(",", orderSkuIds); - - //var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == purchaseOrder.OrderId && - // orderSkuIds.Contains(osku.SkuId)).ToList(); - //foreach (var osku in currentOrderSkuList) - //{ - // if (osku.PurchaseExpressOrderList.Any(peo => peo.WaybillNo == purchaseExpressOrder.WaybillNo)) - // continue; - // osku.PurchaseExpressOrderList.Add(purchaseExpressOrder); - //} } else { purchaseExpressOrder.BelongSkuIds = purchaseOrder.BelongSkuIds; - //var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == purchaseOrder.OrderId && - // purchaseOrder.BelongSkuIds.Contains(osku.SkuId)).ToList(); - //foreach (var osku in currentOrderSkuList) - //{ - // if (osku.PurchaseExpressOrderList.Any(peo => peo.WaybillNo == purchaseExpressOrder.WaybillNo)) - // continue; - // osku.PurchaseExpressOrderList.Add(purchaseExpressOrder); - //} } } } diff --git a/BBWYB.Server.Business/JD/JDBusiness.cs b/BBWYB.Server.Business/JD/JDBusiness.cs new file mode 100644 index 0000000..d00139d --- /dev/null +++ b/BBWYB.Server.Business/JD/JDBusiness.cs @@ -0,0 +1,54 @@ +using BBWYB.Common.Http; +using BBWYB.Common.Log; +using BBWYB.Common.Models; +using JD.Dto; +using Newtonsoft.Json; +using Yitter.IdGenerator; + +namespace BBWYB.Server.Business.JD +{ + public class JDBusiness : BaseBusiness, IDenpendency + { + private RestApiService restApiService; + private VenderBusiness venderBusiness; + public JDBusiness(IFreeSql fsql, + NLogManager nLogManager, + IIdGenerator idGenerator, + RestApiService restApiService, + VenderBusiness venderBusiness) : base(fsql, nLogManager, idGenerator) + { + this.restApiService = restApiService; + this.venderBusiness = venderBusiness; + } + + public ApiResponse> GetJDInStoreOrderDetailList(string sourceShopName, IList poOrderNos) + { + var shop = venderBusiness.GetShopList(shopName: sourceShopName).FirstOrDefault(); + if (shop == null) + return new ApiResponse>() { Code = 0, Msg = $"未找到店铺{sourceShopName}" }; + + try + { + var httpResult = restApiService.SendRequest("https://yunding.qiyue666.com/", "api/PlatformSDK/GetJDInStorePurchaseOrderList", new + { + Platform = shop.PlatformId, + shop.AppKey, + shop.AppSecret, + shop.AppToken, + PoOrderNos = string.Join(',', poOrderNos) + }, null, HttpMethod.Post); + + if (httpResult.StatusCode != System.Net.HttpStatusCode.OK) + return new ApiResponse>() { Code = 0, Msg = httpResult.Content }; + + + var response = JsonConvert.DeserializeObject>>(httpResult.Content); + return response; + } + catch (Exception ex) + { + return new ApiResponse>() { Code = 0, Msg = ex.Message }; + } + } + } +} diff --git a/BBWYB.Server.Business/MDS/MDSBusiness.cs b/BBWYB.Server.Business/MDS/MDSBusiness.cs new file mode 100644 index 0000000..e442f62 --- /dev/null +++ b/BBWYB.Server.Business/MDS/MDSBusiness.cs @@ -0,0 +1,32 @@ +using BBWYB.Common.Http; +using BBWYB.Common.Log; +using BBWYB.Common.Models; +using BBWYB.Server.Model.Dto; +using Newtonsoft.Json; +using Yitter.IdGenerator; + +namespace BBWYB.Server.Business +{ + public class MDSBusiness : BaseBusiness, IDenpendency + { + private RestApiService restApiService; + public MDSBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, RestApiService restApiService) : base(fsql, nLogManager, idGenerator) + { + this.restApiService = restApiService; + } + + public UserInfoResponse GetUserInfo(string token) + { + var httpResult = restApiService.SendRequest("http://mdsapi.qiyue666.com/", "TaskList/User/GetUserInfo", null, new Dictionary() + { + { "Authorization",token} + }, HttpMethod.Get); + if (httpResult.StatusCode != System.Net.HttpStatusCode.OK) + throw new BusinessException($"获取用户信息失败 {httpResult.Content}"); + var response = JsonConvert.DeserializeObject>(httpResult.Content); + if (!response.Success) + throw new BusinessException($"获取用户信息失败 {response.Msg}"); + return response.Data; + } + } +} diff --git a/BBWYB.Server.Business/Order/Message/OrderMessageBusiness.cs b/BBWYB.Server.Business/Order/Message/OrderMessageBusiness.cs new file mode 100644 index 0000000..c65a7dc --- /dev/null +++ b/BBWYB.Server.Business/Order/Message/OrderMessageBusiness.cs @@ -0,0 +1,56 @@ +using BBWYB.Common.Log; +using BBWYB.Common.Models; +using BBWYB.Server.Model.Db; +using BBWYB.Server.Model.Dto; +using Yitter.IdGenerator; + +namespace BBWYB.Server.Business +{ + public class OrderMessageBusiness : BaseBusiness, IDenpendency + { + private MDSBusiness mdsBusiness; + + public OrderMessageBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, MDSBusiness mdsBusiness) : base(fsql, nLogManager, idGenerator) + { + this.mdsBusiness = mdsBusiness; + } + + public void AddOrderMessage(AddOrderMessageRequest request, string token, string clientCode) + { + if (string.IsNullOrEmpty(request.Message) || + string.IsNullOrEmpty(request.OrderId)) + throw new BusinessException("留言信息不完整"); + if (string.IsNullOrEmpty(clientCode)) + throw new BusinessException("缺少客户端标识"); + + var order = fsql.Select(request.OrderId).ToOne(); + if (order == null) + throw new BusinessException("订单不存在"); + + var user = mdsBusiness.GetUserInfo(token); + var om = new OrderMessage() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + CreatorId = user.Id, + CreatorName = user.UserName, + Message = request.Message, + OrderId = request.OrderId, + OrderSn = order.OrderSn, + ShopId = order.ShopId, + From = clientCode + }; + fsql.Insert(om).ExecuteAffrows(); + } + + public IList GetOrderMessageList(string orderId) + { + return fsql.Select().Where(om => om.OrderId == orderId).ToList(); + } + + public IList GetOrderMessageList(string[] orderIds) + { + return fsql.Select().Where(om => orderIds.Contains(om.OrderId)).ToList(); + } + } +} diff --git a/BBWYB.Server.Business/Order/OrderBusiness.cs b/BBWYB.Server.Business/Order/OrderBusiness.cs index b89c2b6..e889a35 100644 --- a/BBWYB.Server.Business/Order/OrderBusiness.cs +++ b/BBWYB.Server.Business/Order/OrderBusiness.cs @@ -7,6 +7,7 @@ using BBWYB.Server.Model; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using FreeSql; +using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using SDKAdapter; using SDKAdapter.OperationPlatform.Client; @@ -19,12 +20,32 @@ namespace BBWYB.Server.Business { public class OrderBusiness : BaseBusiness, IDenpendency { - private OP_PlatformClientFactory opPlatformClientFactory; - private RestApiService restApiService; - public OrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, OP_PlatformClientFactory opPlatformClientFactory, RestApiService restApiService) : base(fsql, nLogManager, idGenerator) + + private IList waitConfigStateList; + + private Lazy qikuManagerLazy; + private Lazy opPlatformClientFactoryLazy; + private Lazy restApiServiceLazy; + + private OP_PlatformClientFactory opPlatformClientFactory => opPlatformClientFactoryLazy.Value; + private RestApiService restApiService => restApiServiceLazy.Value; + private QiKuManager qikuManager => qikuManagerLazy.Value; + + private List hgzTaskTypeList; + + public OrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, IServiceProvider serviceProvider) : base(fsql, nLogManager, idGenerator) { - this.opPlatformClientFactory = opPlatformClientFactory; - this.restApiService = restApiService; + qikuManagerLazy = new Lazy(() => serviceProvider.GetService()); + opPlatformClientFactoryLazy = new Lazy(() => serviceProvider.GetService()); + restApiServiceLazy = new Lazy(() => serviceProvider.GetService()); + + waitConfigStateList = new List() { Enums.PackConfigState.待配置, Enums.PackConfigState.需修改 }; + + hgzTaskTypeList = new List() + { + Enums.TimeLimitTaskType.合格证拟定任务, + Enums.TimeLimitTaskType.合格证补充任务 + }; } private ISelect GetOrderListQueryConditions(QueryOrderRequest request) @@ -38,21 +59,68 @@ namespace BBWYB.Server.Business select = select.Where((o, ocs, oct) => o.OrderSn == request.OrderSn); else { - if (!string.IsNullOrEmpty(request.Sku) || !string.IsNullOrEmpty(request.SourceSku) || !string.IsNullOrEmpty(request.ProductId)) + if (!string.IsNullOrEmpty(request.Sku) || + !string.IsNullOrEmpty(request.SourceSku) || + !string.IsNullOrEmpty(request.ProductId) || + request.IsWaitConfig) { var childSelect = fsql.Select().As("osku") .WhereIf(!string.IsNullOrEmpty(request.Sku), osku => osku.SkuId == request.Sku) .WhereIf(!string.IsNullOrEmpty(request.SourceSku), osku => osku.BelongSkuId == request.SourceSku) - .WhereIf(!string.IsNullOrEmpty(request.ProductId), osku => osku.ProductId == request.ProductId); - select = select.Where((o, ocs, oct) => childSelect.Where(osku => osku.OrderId == o.Id).Any()); + .WhereIf(!string.IsNullOrEmpty(request.ProductId), osku => osku.ProductId == request.ProductId) + .WhereIf(request.IsWaitConfig && request.IsOnlyDisplayPackConfigEditState != 1, osku => waitConfigStateList.Contains(osku.PackConfigState) || osku.PackConfigState == null) + .WhereIf(request.IsWaitConfig && request.IsOnlyDisplayPackConfigEditState == 1, osku => osku.PackConfigState == Enums.PackConfigState.需修改); + select = select.WhereIf(request.IsWaitConfig, (o, ocs, oct) => o.OrderState != Enums.OrderState.已取消) + .WhereIf(request.IsWaitConfig, (o, ocs, oct) => o.IntoStoreType == Enums.IntoStoreType.发回齐越) + .WhereIf(request.IsWaitConfig, (o, ocs, oct) => o.IsPurchased == true) + .Where((o, ocs, oct) => childSelect.Where(osku => osku.OrderId == o.Id).Any()); + + if (request.IsWaitConfig && request.IsOnlyDisplayCerConfigTimeOut == 1) + { + var configTimeOutChildSelect = fsql.Select().As("t") + .Where(t => t.ShopId == request.ShopId) + .Where(t => hgzTaskTypeList.Contains(t.TaskType)) + .Where(t => t.IsTimely == false); + select = select.Where((o, ocs, oct) => configTimeOutChildSelect.Where(t => t.OrderId == o.Id).Any()); + } + } + + if (request.IsOnlyDisplayPurchaseTimeOut == 1 && (request.OrderState == Enums.OrderState.等待采购 || request.OrderState == Enums.OrderState.部分采购)) + { + var childSelect = fsql.Select().As("t") + .Where(t => t.ShopId == request.ShopId) + .Where(t => t.TaskType == Enums.TimeLimitTaskType.采购任务) + .Where(t => t.IsTimely == false); + select = select.Where((o, ocs, oct) => childSelect.Where(t => t.OrderId == o.Id).Any()); + } + + if (request.IsOnlyDisplayCheckComputationTimeOut == 1 && request.OrderState == Enums.OrderState.待核算) + { + var childSelect = fsql.Select().As("t") + .Where(t => t.ShopId == request.ShopId) + .Where(t => t.TaskType == Enums.TimeLimitTaskType.待核算任务) + .Where(t => t.IsTimely == false); + select = select.Where((o, ocs, oct) => childSelect.Where(t => t.OrderId == o.Id).Any()); } - if (!string.IsNullOrEmpty(request.PurchaseOrderId)) + var isDeliveryTimeout = request.IsOnlyDisplayDeliveryTimeout == 1 && (request.OrderState == Enums.OrderState.待发货 || request.OrderState == Enums.OrderState.部分发货); + if (isDeliveryTimeout || !string.IsNullOrEmpty(request.PurchaseOrderId)) { - var childSelect = fsql.Select().As("opi") - .Where(opi => opi.PurchaseOrderId == request.PurchaseOrderId); + var childSelect = fsql.Select().As("opi"); + if (isDeliveryTimeout) + { + var before24hTime = DateTime.Now.AddHours(-24); + childSelect = childSelect.Where(opi => opi.ShopId == request.ShopId && + (opi.OrderState == Enums.PurchaseOrderState.待发货 || opi.OrderState == Enums.PurchaseOrderState.部分发货) && + opi.CreateTime < before24hTime); + } + if (!string.IsNullOrEmpty(request.PurchaseOrderId)) + { + childSelect = childSelect.Where(opi => opi.PurchaseOrderId == request.PurchaseOrderId); + } select = select.Where((o, ocs, oct) => childSelect.Where(opi => opi.OrderId == o.Id).Any()); } + select = select.WhereIf(request.OrderState == Enums.OrderState.待付款 || request.OrderState == Enums.OrderState.待验收 || request.OrderState == Enums.OrderState.待核算 || @@ -65,11 +133,13 @@ namespace BBWYB.Server.Business o.OrderState == Enums.OrderState.部分发货) .WhereIf(request.OrderState == Enums.OrderState.待收货, (o, ocs, oct) => o.OrderState == Enums.OrderState.待收货 || o.OrderState == Enums.OrderState.部分收货) - .WhereIf(request.IsWaitConfig, (o, ocs, oct) => o.OrderState != Enums.OrderState.已取消 && o.IsPurchased == true) .WhereIf(request.StartDate != null, (o, ocs, oct) => o.StartTime >= request.StartDate) .WhereIf(request.EndDate != null, (o, ocs, oct) => o.StartTime <= request.EndDate) .WhereIf(!string.IsNullOrEmpty(request.ClientOrderId), (o, ocs, oct) => o.ClientOrderId == request.ClientOrderId) - .WhereIf(!string.IsNullOrEmpty(request.SourceShopName), (o, ocs, oct) => o.SourceShopName == request.SourceShopName); + .WhereIf(!string.IsNullOrEmpty(request.SourceShopName), (o, ocs, oct) => o.SourceShopName == request.SourceShopName) + .WhereIf(request.IsOnlyDisplaySpecialOrder == 1, (o, ocs, oct) => o.IsSpecialOrder == 1) + .WhereIf(request.IsOnlyDisplaySendQiYue == 1, (o, ocs, oct) => o.IntoStoreType == Enums.IntoStoreType.发回齐越) + .WhereIf(request.IsOnlyDisplayPurchaserSendInStore == 1, (o, ocs, oct) => o.IntoStoreType == Enums.IntoStoreType.厂商代发入仓); } select = select.WhereIf(request.ShopId != null, (o, ocs, oct) => o.ShopId == request.ShopId); @@ -112,6 +182,8 @@ namespace BBWYB.Server.Business InPackAmount = o.InPackAmount, IsWaitPack = o.IsWaitPack, IntoStoreType = o.IntoStoreType, + PayTime = o.PayTime, + IsSpecialOrder = o.IsSpecialOrder, ContactName = ocs.ContactName, Address = ocs.Address, @@ -174,14 +246,50 @@ namespace BBWYB.Server.Business }); #endregion + #region 查询入仓采购单信息 + var inStoreRelationList = fsql.Select().Where(i => orderIdList.Contains(i.OrderId)).ToList(); + if (inStoreRelationList.Count() > 0) + { + foreach (var purchaseExpressOrder in purchaseExpressOrderList) + { + purchaseExpressOrder.InStorePurchaseOrderIdList = inStoreRelationList.Where(i => i.OrderId == purchaseExpressOrder.OrderId && + i.PurchaseOrderId == purchaseExpressOrder.PurchaseOrderId && + i.WaybillNo == purchaseExpressOrder.WaybillNo) + .Select(i => i.InStorePurchaseOrderId) + .ToList(); + } + } + #endregion + + #region 查询订单留言 + var orderMessageList = fsql.Select().Where(om => orderIdList.Contains(om.OrderId)).ToList(); + foreach (var order in orderList) + order.OrderMessageList = orderMessageList.Where(om => om.OrderId == order.Id).ToList(); + #endregion + #region 处理订单成本明细 var orderCostDetailList = fsql.Select().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList(); foreach (var order in orderList) order.OrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id).ToList(); #endregion + #region 处理订单Sku成本 + var orderSkuCostList = fsql.Select().Where(osc => orderIdList.Contains(osc.OrderId)).ToList(); + foreach (var order in orderList) + { + if (order.OrderCost == null) + continue; + order.OrderCost.OrderSkuCostList = orderSkuCostList.Where(osc => osc.OrderId == order.Id).ToList(); + foreach (var orderSkuCost in order.OrderCost.OrderSkuCostList) + { + orderSkuCost.OrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id && ocd.SkuId == orderSkuCost.SkuId).ToList(); + } + } + #endregion + #region 处理采购信息 var orderPurchaseInfoList = fsql.Select().Where(op => orderIdList.Contains(op.OrderId) && op.IsEnabled == true).ToList(); + var purchaserIdList = orderPurchaseInfoList.Where(opi => !string.IsNullOrEmpty(opi.PurchaserId)).Select(opi => opi.PurchaserId).Distinct().ToList(); var orderPurchaseSkuInfoList = fsql.Select().Where(o => orderIdList.Contains(o.OrderId)).ToList(); foreach (var order in orderList) { @@ -191,12 +299,41 @@ namespace BBWYB.Server.Business orderPurchaseInfo.OrderPurchaseSkuInfoList = orderPurchaseSkuInfoList.Where(opsi => opsi.PurchaseOrderId == orderPurchaseInfo.PurchaseOrderId).ToList(); orderPurchaseInfo.PurchaseExpressOrderList = purchaseExpressOrderList.Where(peo => peo.PurchaseOrderId == orderPurchaseInfo.PurchaseOrderId).ToList(); } + + if (order.OrderPurchaseInfoList != null && order.OrderPurchaseInfoList.Count() > 0) + { + if (order.OrderState == Enums.OrderState.部分采购 && + order.OrderPurchaseInfoList.Any(opi => opi.IsAutoEditOrderPrice == Enums.AutoEditOrderPriceType.已平价)) + { + order.IsAutoEditOrderPrice = Enums.AutoEditOrderPriceType.部分平价; + continue; + } + + var opiCount = order.OrderPurchaseInfoList.Count(); + var pjCount = order.OrderPurchaseInfoList.Count(opi => opi.IsAutoEditOrderPrice == Enums.AutoEditOrderPriceType.已平价); + if (pjCount == 0) + order.IsAutoEditOrderPrice = Enums.AutoEditOrderPriceType.未平价; + if (opiCount == pjCount) + order.IsAutoEditOrderPrice = Enums.AutoEditOrderPriceType.已平价; + else if (opiCount > pjCount) + order.IsAutoEditOrderPrice = Enums.AutoEditOrderPriceType.部分平价; + } + } + #endregion + + #region 处理采购单商家信息 + if (purchaserIdList.Count() > 0) + { + var purchaserList = fsql.Select(purchaserIdList).ToList(); + foreach (var purchaseOrder in orderPurchaseInfoList) + { + purchaseOrder.Purchaser = purchaserList.FirstOrDefault(p => p.Id == purchaseOrder.PurchaserId); + } } #endregion #region 处理SKU - var orderSkuList = fsql.Select().Where(osku => osku.Price != 0 && - orderIdList.Contains(osku.OrderId)).ToList(); + var orderSkuList = fsql.Select().Where(osku => orderIdList.Contains(osku.OrderId)).ToList(); foreach (var order in orderList) { order.ItemList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList(); @@ -206,7 +343,10 @@ namespace BBWYB.Server.Business #region 处理SKU的快递单 foreach (var purchaseExpressOrder in purchaseExpressOrderList) { - purchaseExpressOrder.CalculationBelongOrderSku(orderPurchaseInfoList, orderPurchaseRelationInfoList, orderPurchaseSkuInfoList); + var order = orderList.FirstOrDefault(o => o.Id == purchaseExpressOrder.OrderId); + if (order == null) + continue; + purchaseExpressOrder.CalculationBelongOrderSku(order.IntoStoreType, orderPurchaseInfoList, orderPurchaseRelationInfoList, orderPurchaseSkuInfoList); var currentOrderSkuList = orderSkuList.Where(osku => !string.IsNullOrEmpty(purchaseExpressOrder.BelongSkuIds) && osku.OrderId == purchaseExpressOrder.OrderId && purchaseExpressOrder.BelongSkuIds.Contains(osku.SkuId)).ToList(); @@ -216,43 +356,83 @@ namespace BBWYB.Server.Business continue; osku.PurchaseExpressOrderList.Add(purchaseExpressOrder); } + } + #endregion - //var purchaseOrder = orderPurchaseInfoList.FirstOrDefault(po => po.PurchaseOrderId == purchaseExpressOrder.PurchaseOrderId); - //if (purchaseOrder == null) - // continue; - //if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴) - //{ - // var purchaseSkuIds = orderPurchaseSkuInfoList.Where(posku => posku.WaybillNo == purchaseExpressOrder.WaybillNo && - // posku.PurchaseOrderId == purchaseOrder.PurchaseOrderId) - // .Select(posku => posku.PurchaseSkuId).ToList(); - // var orderSkuIds = orderPurchaseRelationInfoList.Where(ori => ori.PurchaseOrderId == purchaseOrder.PurchaseOrderId && - // purchaseSkuIds.Contains(ori.PurchaseSkuId)) - // .Select(ori => ori.BelongSkuId) - // .Distinct() - // .ToList(); - - // var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == purchaseOrder.OrderId && - // orderSkuIds.Contains(osku.SkuId)).ToList(); - // foreach (var osku in currentOrderSkuList) - // { - // if (osku.PurchaseExpressOrderList.Any(peo => peo.WaybillNo == purchaseExpressOrder.WaybillNo)) - // continue; - // osku.PurchaseExpressOrderList.Add(purchaseExpressOrder); - // } - //} - //else - //{ - // var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == purchaseOrder.OrderId && - // purchaseOrder.BelongSkuIds.Contains(osku.SkuId)).ToList(); - // foreach (var osku in currentOrderSkuList) - // { - // if (osku.PurchaseExpressOrderList.Any(peo => peo.WaybillNo == purchaseExpressOrder.WaybillNo)) - // continue; - // osku.PurchaseExpressOrderList.Add(purchaseExpressOrder); - // } - //} + #region 限时任务 + var orderTimeLimitTaskList = fsql.Select().Where(t => orderIdList.Contains(t.OrderId)) + .ToList(); + + foreach (var order in orderList) + { + foreach (var orderSku in order.ItemList) + { + #region 采购限时任务 + orderSku.PurchaseTimeLimitTask = orderTimeLimitTaskList.FirstOrDefault(t => t.OrderId == order.Id && + t.SkuId == orderSku.SkuId && + t.TaskType == Enums.TimeLimitTaskType.采购任务); + #endregion + + #region 合格证拟定任务 + orderSku.CerConfigTimeLimitTask = orderTimeLimitTaskList.FirstOrDefault(t => t.OrderId == order.Id && + t.SkuId == orderSku.SkuId && + t.TaskType == Enums.TimeLimitTaskType.合格证拟定任务); + #endregion + + #region 合格证补充任务 + orderSku.CerEditTimeLimitTask = orderTimeLimitTaskList.FirstOrDefault(t => t.OrderId == order.Id && + t.SkuId == orderSku.SkuId && + t.TaskType == Enums.TimeLimitTaskType.合格证补充任务); + #endregion + + #region 待核算任务 + orderSku.CheckComputationTimeLimitTask = orderTimeLimitTaskList.FirstOrDefault(t => t.OrderId == order.Id && + t.TaskType == Enums.TimeLimitTaskType.待核算任务); + #endregion + + #region 判断sku的发货状态 + var purchaseOrder = order.OrderPurchaseInfoList.FirstOrDefault(opi => opi.OrderId == order.Id && opi.BelongSkuIds.Contains(orderSku.SkuId)); + if (purchaseOrder != null) + { + if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴 && order.IntoStoreType != Enums.IntoStoreType.厂商代发入仓) + { + //验证采购关系 + var currentSku_PurchaseSkuIdList = orderPurchaseRelationInfoList.Where(opri => opri.OrderId == order.Id && + opri.PurchaseOrderId == purchaseOrder.PurchaseOrderId && + opri.BelongSkuId == orderSku.SkuId) + .Select(x => x.PurchaseSkuId) + .Distinct() + .ToList(); + if (currentSku_PurchaseSkuIdList.Count() > 0) + { + var currentSku_PurchaseSkuList = purchaseOrder.OrderPurchaseSkuInfoList?.Where(posku => currentSku_PurchaseSkuIdList.Contains(posku.PurchaseSkuId)) + ?.ToList(); + if (currentSku_PurchaseSkuList != null && currentSku_PurchaseSkuList.Count() > 0) + { + var totalCount = currentSku_PurchaseSkuList.Count(); + var shipCount = currentSku_PurchaseSkuList.Count(posku => !string.IsNullOrEmpty(posku.WaybillNo)); + if (totalCount == shipCount) + orderSku.ShipState = 1; + if (shipCount == 0) + orderSku.ShipState = 0; + if (totalCount > shipCount) + orderSku.ShipState = 2; + } + } + } + else + { + orderSku.ShipState = purchaseOrder.PurchaseExpressOrderList != null && + purchaseOrder.PurchaseExpressOrderList.Count() > 0 ? 1 : 0; + } + } + #endregion + } } + #endregion + + } return new OrderListResponse() { @@ -281,7 +461,7 @@ namespace BBWYB.Server.Business TargetExpressName = peo.TargetExpressName, WaybillNo = peo.WaybillNo }); - + var order = fsql.Select(request.OrderId).ToOne(); var orderPurchaseInfoList = fsql.Select().Where(op => op.OrderId == request.OrderId && op.IsEnabled == true).ToList(); var orderPurchaseRelationList = fsql.Select().Where(opri => opri.OrderId == request.OrderId && opri.SourceSkuId == request.SourceSkuId).ToList(); var orderPurchaseSkuList = fsql.Select().Where(posku => posku.OrderId == request.OrderId).ToList(); @@ -291,7 +471,7 @@ namespace BBWYB.Server.Business #region 处理SKU的快递单 foreach (var purchaseExpressOrder in purchaseExpressOrderList) { - purchaseExpressOrder.CalculationBelongOrderSku(orderPurchaseInfoList, orderPurchaseRelationList, orderPurchaseSkuList); + purchaseExpressOrder.CalculationBelongOrderSku(order.IntoStoreType, orderPurchaseInfoList, orderPurchaseRelationList, orderPurchaseSkuList); if (!string.IsNullOrEmpty(purchaseExpressOrder.BelongSkuIds)) { if (purchaseExpressOrder.BelongSkuIds.Contains(orderSku.SkuId)) @@ -301,37 +481,6 @@ namespace BBWYB.Server.Business } } } - //foreach (var purchaseOrder in orderPurchaseInfoList) - //{ - // if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴) - // { - // var currentRelationList = orderPurchaseRelationList.Where(ori => ori.PurchaseOrderId == purchaseOrder.PurchaseOrderId).ToList(); - - // var waybillNos = orderPurchaseSkuList.Where(posku => posku.PurchaseOrderId == purchaseOrder.PurchaseOrderId && - // currentRelationList.Any(opri => opri.PurchaseSkuId == posku.PurchaseSkuId)) - // .Select(x => x.WaybillNo) - // .ToList(); - // foreach (var waybillNo in waybillNos) - // { - // var peo = purchaseExpressOrderList.FirstOrDefault(x => x.WaybillNo == waybillNo); - // if (peo != null && !list.Any(x => x.WaybillNo == waybillNo && x.PurchaseOrderId == purchaseOrder.PurchaseOrderId)) - // list.Add(peo); - // } - // } - // else - // { - // var currentSkuList = orderSkuList.Where(osku => purchaseOrder.BelongSkuIds.Contains(osku.SkuId)).Select(osku => osku.BelongSkuId).Distinct().ToList(); - // if (currentSkuList.Contains(request.SourceSkuId)) - // { - // var peoList = purchaseExpressOrderList.Where(x => x.PurchaseOrderId == purchaseOrder.PurchaseOrderId).ToList(); - // foreach (var peo in peoList) - // { - // if (!list.Any(x => x.WaybillNo == peo.WaybillNo && x.PurchaseOrderId == purchaseOrder.PurchaseOrderId)) - // list.Add(peo); - // } - // } - // } - //} #endregion return list; } @@ -356,7 +505,7 @@ namespace BBWYB.Server.Business TargetExpressName = peo.TargetExpressName, WaybillNo = peo.WaybillNo }); - + var orderList = fsql.Select(orderIds).ToList(); var orderPurchaseInfoList = fsql.Select().Where(op => orderIds.Contains(op.OrderId) && op.IsEnabled == true).ToList(); var orderPurchaseRelationList = fsql.Select().Where(opri => orderIds.Contains(opri.OrderId)).ToList(); var orderPurchaseSkuList = fsql.Select().Where(posku => orderIds.Contains(posku.OrderId)).ToList(); @@ -364,7 +513,10 @@ namespace BBWYB.Server.Business #region 处理SKU的快递单 foreach (var purchaseExpressOrder in purchaseExpressOrderList) { - purchaseExpressOrder.CalculationBelongOrderSku(orderPurchaseInfoList, orderPurchaseRelationList, orderPurchaseSkuList); + var order = orderList.FirstOrDefault(o => o.Id == purchaseExpressOrder.OrderId); + if (order == null) + continue; + purchaseExpressOrder.CalculationBelongOrderSku(order.IntoStoreType, orderPurchaseInfoList, orderPurchaseRelationList, orderPurchaseSkuList); } #endregion return purchaseExpressOrderList; @@ -382,7 +534,11 @@ namespace BBWYB.Server.Business Remark = request.Remark }); - fsql.Update(request.OrderId).Set(o => o.OrderState, Enums.OrderState.已取消).ExecuteAffrows(); + fsql.Transaction(() => + { + fsql.Update(request.OrderId).Set(o => o.OrderState, Enums.OrderState.已取消).ExecuteAffrows(); + fsql.Delete().Where(t => t.OrderId == request.OrderId).ExecuteAffrows(); + }); try { @@ -448,23 +604,52 @@ namespace BBWYB.Server.Business var order = orderListResponse.Items.FirstOrDefault(); var orderCost = fsql.Select(request.OrderId).ToOne(); + var orderSkuCostList = fsql.Select().Where(osc => osc.OrderId == request.OrderId).ToList(); + var orderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == request.OrderId && ocd.IsEnabled == true).ToList(); IList> updates_orderSku = new List>(); IUpdate updateOrderCost = null; + IList> updateOrderSkuCostList = new List>(); + IList> updateOrderCostDetailList = new List>(); + + foreach (var orderSku in order.OrderSkuList) { updates_orderSku.Add(fsql.Update(orderSku.Id).Set(osku => osku.Price, orderSku.SkuPrice) .Set(osku => osku.BuyerPayFreight, orderSku.FreightAmount) .Set(osku => osku.InPackAmount, orderSku.PackAmount)); + + var ocdList = orderCostDetailList.Where(ocd => ocd.SkuId == orderSku.SkuId).ToList(); + if (ocdList != null && ocdList.Count() > 0) + { + foreach (var orderCostDetail in ocdList) + { + orderCostDetail.CalculationOrderCostDetailCostAndProfit(orderCostDetail.SkuAmount ?? 0M, + orderCostDetail.PurchaseFreight ?? 0M, + orderCostDetail.OutPackAmount ?? 0M, + orderCostDetail.DeliveryExpressFreight ?? 0M); + updateOrderCostDetailList.Add(fsql.Update(orderCostDetail.Id).Set(ocd => ocd.Profit, orderCostDetail.Profit)); + } + } + + var orderSkuCost = orderSkuCostList.FirstOrDefault(osc => osc.SkuId == orderSku.SkuId); + if (orderSkuCost != null) + { + orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku.SkuPrice * orderSku.Quantity, + orderSku.FreightAmount, + orderSku.PackAmount, + ocdList); + updateOrderSkuCostList.Add(fsql.Update(orderSkuCost.Id).Set(osc => osc.Profit, orderSkuCost.Profit)); + } } if (orderCost != null) { - orderCost.CalculationOrderCostCostAndProfit(order.OrderTotalAmount, - orderCost.SkuAmount ?? 0M, - orderCost.PurchaseFreight ?? 0M, - orderCost.OutPackAmount ?? 0M, - orderCost.DeliveryExpressFreight ?? 0M); + orderCost.CalculationOrderCostAndProfit(order.OrderTotalAmount, + orderCost.SkuAmount ?? 0M, + orderCost.PurchaseFreight ?? 0M, + orderCost.OutPackAmount ?? 0M, + orderCost.DeliveryExpressFreight ?? 0M); updateOrderCost = fsql.Update().SetSource(orderCost); } @@ -474,6 +659,7 @@ namespace BBWYB.Server.Business fsql.Update(request.OrderId).Set(o => o.OrderTotalPrice, order.OrderTotalAmount) .Set(o => o.OrderSellerPrice, order.OrderProductAmount) .Set(o => o.FreightPrice, order.FreightAmount) + .Set(o => o.InPackAmount, order.PackAmount) .ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); @@ -482,6 +668,14 @@ namespace BBWYB.Server.Business foreach (var update in updates_orderSku) update.ExecuteAffrows(); } + if (updateOrderCostDetailList.Count() > 0) + { + foreach (var update in updateOrderCostDetailList) + update.ExecuteAffrows(); + } + if (updateOrderSkuCostList.Count() > 0) + foreach (var update in updateOrderSkuCostList) + update.ExecuteAffrows(); }); #region 通知C端 @@ -532,7 +726,7 @@ namespace BBWYB.Server.Business updateOrderSku = fsql.Update(orderSku.Id).Set(osku => osku.IsCheck, true); var oldOrderState = dbOrder.OrderState; - dbOrder.CalculationOrderState(fsql, orderSkuList, null); + dbOrder.CalculationOrderState(fsql, out _, orderSkuList, null); if (oldOrderState != dbOrder.OrderState) updateOrder = fsql.Update(dbOrder.Id).Set(o => o.OrderState, dbOrder.OrderState); @@ -556,7 +750,16 @@ namespace BBWYB.Server.Business if (Math.Abs(orderCost.Profit ?? 0) > 1M) throw new BusinessException("订单利润绝对值不能大于1"); - fsql.Update(orderId).Set(o => o.OrderState, Enums.OrderState.已完成).ExecuteAffrows(); + 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(); + }); + SendPurchaseOrderStateToC(orderId, Enums.OrderState.已完成); } @@ -575,5 +778,58 @@ namespace BBWYB.Server.Business } } + + public OrderCountByStateResponse StatisticsOrderCountByOrderState(long shopId) + { + var noOrderStateList = new List() + { + Enums.OrderState.已取消, + Enums.OrderState.已完成 + }; + var orderCountGroup = fsql.Select().Where(o => o.ShopId == shopId) + .Where(o => !noOrderStateList.Contains(o.OrderState.Value)) + .GroupBy(o => o.OrderState) + .ToList(g => new + { + OrderState = g.Key, + OrderCount = g.Count() + }); + + var childSelect = fsql.Select().As("osku").Where(osku => waitConfigStateList.Contains(osku.PackConfigState) || osku.PackConfigState == null); + var waitConfigCount = fsql.Select().Where(o => o.ShopId == shopId) + .Where(o => !noOrderStateList.Contains(o.OrderState.Value)) + .Where(o => o.IntoStoreType == Enums.IntoStoreType.发回齐越) + .Where(o => o.IsPurchased == true) + .Where(o => childSelect.Where(osku => osku.OrderId == o.Id).Any()) + .Count(); + + return new OrderCountByStateResponse() + { + WaitPayCount = orderCountGroup.FirstOrDefault(o => o.OrderState == Enums.OrderState.待付款)?.OrderCount ?? 0, + WaitPurchaseCount = orderCountGroup.FirstOrDefault(o => o.OrderState == Enums.OrderState.等待采购 || + o.OrderState == Enums.OrderState.部分采购)?.OrderCount ?? 0, + WaitShipmentCount = orderCountGroup.FirstOrDefault(o => o.OrderState == Enums.OrderState.待发货 || + o.OrderState == Enums.OrderState.部分发货)?.OrderCount ?? 0, + WaitReceiveCount = orderCountGroup.FirstOrDefault(o => o.OrderState == Enums.OrderState.待收货 || + o.OrderState == Enums.OrderState.部分收货)?.OrderCount ?? 0, + WaitCheckCount = orderCountGroup.FirstOrDefault(o => o.OrderState == Enums.OrderState.待验收)?.OrderCount ?? 0, + WaitComputationCount = orderCountGroup.FirstOrDefault(o => o.OrderState == Enums.OrderState.待核算)?.OrderCount ?? 0, + WaitConfigCount = waitConfigCount, + }; + } + + /// + /// 齐库推送sku配置状态 + /// + /// + public void QikuPublishOrderSkuPackConfigState(QikuPublishOrderSkuPackConfigStateRequest request) + { + qikuManager.QikuPublishOrderSkuPackConfigState(request); + } + + public void SetSpecialOrder(SetSpecialOrderRequest request) + { + fsql.Update(request.OrderId).Set(o => o.IsSpecialOrder, request.IsSpecialOrder).ExecuteAffrows(); + } } } diff --git a/BBWYB.Server.Business/Product/ProductBusiness.cs b/BBWYB.Server.Business/Product/ProductBusiness.cs index 39d0d55..1f2e4fc 100644 --- a/BBWYB.Server.Business/Product/ProductBusiness.cs +++ b/BBWYB.Server.Business/Product/ProductBusiness.cs @@ -1,5 +1,6 @@ using BBWYB.Common.Log; using BBWYB.Common.Models; +using BBWYB.Server.Model; using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Models; using Yitter.IdGenerator; @@ -14,7 +15,7 @@ namespace BBWYB.Server.Business { this.opPlatformClientFactory = opPlatformClientFactory; } - + public OP_ProductListResponse GetProductList(OP_QueryProductRequest request) { return opPlatformClientFactory.GetClient(request.Platform).GetProductList(request); @@ -24,5 +25,44 @@ namespace BBWYB.Server.Business { return opPlatformClientFactory.GetClient(request.Platform).GetProductSkuList(request); } + + public void EditProductPrice(OP_EditProductPriceRequest request) + { + var skuRequest = new OP_QueryProductSkuRequest() + { + AppKey = request.AppKey, + AppSecret = request.AppSecret, + AppToken = request.AppToken, + PageIndex = 1, + PageSize = 50, + Platform = request.Platform, + Spu = request.Spu + }; + var editSkuList = new List(); + while (true) + { + var response = GetProductSkuList(skuRequest); + if (response.Items.Count > 0) + { + editSkuList.AddRange(response.Items.Select(sku => new OP_EditProductSkuPriceRequest() + { + Sku = sku.Id, + Price = sku.Price, + })); + } + if (response.Items.Count < 50) + break; + skuRequest.PageIndex++; + } + foreach (var editReq in request.EditSkuList) + { + var editSku = editSkuList.FirstOrDefault(x => x.Sku == editReq.Sku); + if (editSku != null) + editSku.Price = editReq.Price; + } + request.EditSkuList.Clear(); + request.EditSkuList.AddRange(editSkuList); + opPlatformClientFactory.GetClient(request.Platform).EditProductPrice(request); + } } } diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index f149f2c..9347618 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -2,16 +2,20 @@ using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Business.Extensions; +using BBWYB.Server.Business.JD; using BBWYB.Server.Model; 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; using SDKAdapter; +using SDKAdapter.OperationPlatform.Client; +using SDKAdapter.OperationPlatform.Models; using SDKAdapter.PurchasePlatform.Client; using SDKAdapter.PurchasePlatform.Models; using System.Text; @@ -29,6 +33,9 @@ namespace BBWYB.Server.Business private Lazy dingDingBusinessLazy; private Lazy qiKuManagerLazy; private Lazy restApiServiceLazy; + private Lazy jdBusinessLazy; + private Lazy opPlatformClientFactoryLazy; + private Lazy venderBusinessLazy; private PP_PlatformClientFactory ppPlatformClientFactory => pplatformClientFactoryLazy.Value; private TaskSchedulerManager taskSchedulerManager => taskSchedulerManagerLazy.Value; @@ -38,6 +45,10 @@ namespace BBWYB.Server.Business private DingDingBusiness dingDingBusiness => dingDingBusinessLazy.Value; private QiKuManager qiKuManager => qiKuManagerLazy.Value; private RestApiService restApiService => restApiServiceLazy.Value; + private OP_PlatformClientFactory opPlatformClientFactory => opPlatformClientFactoryLazy.Value; + private VenderBusiness venderBusiness => venderBusinessLazy.Value; + + private JDBusiness jdBusiness => jdBusinessLazy.Value; private IList cantPurchaseOrderStateList; @@ -54,6 +65,9 @@ namespace BBWYB.Server.Business dingDingBusinessLazy = new Lazy(() => serviceProvider.GetService()); qiKuManagerLazy = new Lazy(() => serviceProvider.GetService()); restApiServiceLazy = new Lazy(() => serviceProvider.GetService()); + jdBusinessLazy = new Lazy(() => serviceProvider.GetService()); + opPlatformClientFactoryLazy = new Lazy(() => serviceProvider.GetService()); + venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); cantPurchaseOrderStateList = new List() { Enums.OrderState.已取消, @@ -247,8 +261,27 @@ namespace BBWYB.Server.Business var isRepurchase = fsql.Select(dbOrder.Id).Any(); - var orderSkus = fsql.Select().Where(osku => osku.Price != 0 && osku.OrderId == request.OrderId).ToList(); + var orderSkus = fsql.Select().Where(osku => osku.OrderId == request.OrderId).ToList(); var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == request.OrderId && opi.IsEnabled == true).ToList(); + var orderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == request.OrderId && ocd.IsEnabled == true).ToList(); + var orderSkuCostList = fsql.Select().Where(osc => osc.OrderId == request.OrderId).ToList(); + + + foreach (var cargoParamGroup in request.CargoParamGroupList) + { + var purchaseOrder = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaserId == cargoParamGroup.PurchaserId); + if (purchaseOrder != null) + { + foreach (var cargoParam in cargoParamGroup.CargoParamList) + { + if (purchaseOrder.BelongSkuIds.Contains(cargoParam.BelongSkuId)) + { + //throw new BusinessException($"订单sku[{cargoParam.BelongSkuId}]已经存在同一个商家[{cargoParamGroup.PurchaserId}][{cargoParamGroup.PurchaserName}]的另一笔采购单中[{purchaseOrder.PurchaseOrderId}],请不要为同一笔订单sku进行同商家采购"); + throw new BusinessException($"提示:请勿为同一个订单中的sku重复向同一个商家下采购单\r\n重复信息:\r\n- 订单sku:{cargoParam.BelongSkuId}\r\n- 商家:{cargoParamGroup.PurchaserName}"); + } + } + } + } var extJArray = JsonConvert.DeserializeObject(request.Extensions); @@ -257,20 +290,15 @@ namespace BBWYB.Server.Business List insertOrderPurchaseSkuInfos = new List(); List updatePurchaseTimeSchemeIdList = new List(); List insertOrderPurchaseRelationInfoList = new List(); - - #region 待更新 - IList updateOrderCostDetailIdList = fsql.Select() - .Where(ocd => ocd.OrderId == request.OrderId && ocd.IsEnabled == true) - .ToList(ocd => ocd.Id); - IList updatePurchaseOrderIdList = fsql.Select() - .Where(opi => opi.OrderId == request.OrderId && opi.IsEnabled == true) - .ToList(opi => opi.Id); - #endregion + List updatePurchaseTimeLimitTaskOrderSkuList = new List(); + List notifyQikuPackSchemeParamList = null; + if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越) + notifyQikuPackSchemeParamList = new List(); IInsert insertOrderCost = null; IUpdate updateOrderCost = null; - var totalPurchaseProductAmount = 0M; - var totalPurchaseFreight = 0M; + List insertOrderSkuCostList = new List(); + IList> updateOrderSkuCostList = new List>(); foreach (var cargoParamGroup in request.CargoParamGroupList) { @@ -316,12 +344,14 @@ namespace BBWYB.Server.Business OrderId = createOrderResponse.OrderId }); - totalPurchaseProductAmount += purchaseOrderSimpleInfo.ProductAmount; - totalPurchaseFreight += purchaseOrderSimpleInfo.FreightAmount; + //totalPurchaseProductAmount += purchaseOrderSimpleInfo.ProductAmount; + //totalPurchaseFreight += purchaseOrderSimpleInfo.FreightAmount; foreach (var cargoParam in cargoParamGroup.CargoParamList) { var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == cargoParam.BelongSkuId); + + #region 创建订单采购关系 insertOrderPurchaseRelationInfoList.Add(new OrderPurchaseRelationInfo() { Id = idGenerator.NewLong(), @@ -336,12 +366,13 @@ namespace BBWYB.Server.Business SchemeId = cargoParam.SchemeId, SourceSkuId = orderSku?.BelongSkuId }); - + #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) { var belongSkuId = belongSkuGroup.Key; @@ -376,10 +407,7 @@ namespace BBWYB.Server.Business SkuId = belongSkuId, IsEnabled = true }; - orderCostDetail.CalculationOrderCostDetailCostAndProfit(orderSku.Price.Value * orderSku.ItemTotal.Value, - orderSku.BuyerPayFreight ?? 0M, - orderSku.InPackAmount ?? 0M, - currentSkuAmount, + orderCostDetail.CalculationOrderCostDetailCostAndProfit(currentSkuAmount, currentPurchaseFreight, 0M, 0M); @@ -402,7 +430,7 @@ namespace BBWYB.Server.Business PurchaserId = cargoParamGroup.PurchaserId, PurchaserName = cargoParamGroup.PurchaserName, ShopId = request.ShopId, - BelongSkuIds = string.Join(",", belongSkuGroups.Select(bsg => bsg.Key)), + BelongSkuIds = string.Join(",", belongSkuIdList), IsEnabled = true, Remark = !string.IsNullOrEmpty(cargoParamGroup.Remark) ? cargoParamGroup.Remark : request.Remark }; @@ -425,8 +453,65 @@ namespace BBWYB.Server.Business insertOrderPurchaseSkuInfos.Add(orderPurchaseSkuInfo); } #endregion + + #region 采购限时任务 + foreach (var belongSkuId in belongSkuIdList) + { + if (!updatePurchaseTimeLimitTaskOrderSkuList.Any(x => x == belongSkuId)) + updatePurchaseTimeLimitTaskOrderSkuList.Add(belongSkuId); + } + #endregion + + #region 封装查询齐库合格证接口参数 + if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越) + { + foreach (var belongSkuId in belongSkuIdList) //订单skuId + { + var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == belongSkuId); + if (orderSku == null) + continue; + var cargoParam = cargoParamGroup.CargoParamList.FirstOrDefault(c => c.BelongSkuId == belongSkuId); + if (cargoParam == null) + continue; + if (!notifyQikuPackSchemeParamList.Any(x => x.SkuId == orderSku.BelongSkuId)) + { + notifyQikuPackSchemeParamList.Add(new QiKuPackTaskSkuPurchaseSchemeIdRequest() + { + SkuId = orderSku.BelongSkuId, + SkuPurchaseSchemeId = cargoParam.SchemeId.ToString() + }); + } + } + } + #endregion } + #region 订单Sku成本 + var allOrderCostDetail = orderCostDetailList.Union(insertOrderCostDetails).ToList(); + foreach (var orderSku in orderSkus) + { + var orderSkuCost = orderSkuCostList.FirstOrDefault(osc => osc.SkuId == orderSku.SkuId); + if (orderSkuCost == null) + { + orderSkuCost = new OrderSkuCost() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + OrderId = request.OrderId, + SkuId = orderSku.SkuId + }; + orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, allOrderCostDetail); + insertOrderSkuCostList.Add(orderSkuCost); + } + else + { + orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, allOrderCostDetail); + var update = fsql.Update().SetSource(orderSkuCost); + updateOrderSkuCostList.Add(update); + } + } + #endregion + #region 订单成本 var orderCost = new OrderCost() { @@ -434,11 +519,16 @@ namespace BBWYB.Server.Business CreateTime = DateTime.Now, IsManualEdited = false }; - orderCost.CalculationOrderCostCostAndProfit(dbOrder.OrderTotalPrice.Value, - totalPurchaseProductAmount, - totalPurchaseFreight, - 0M, - 0M); + + //var totalPurchaseProductAmount = orderCostDetailList.Union(insertOrderCostDetails).Sum(ocd => ocd.SkuAmount); + //var totalPurchaseFreight = orderCostDetailList.Union(insertOrderCostDetails).Sum(ocd => ocd.PurchaseFreight); + //orderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, + // totalPurchaseProductAmount ?? 0M, + // totalPurchaseFreight ?? 0M, + // 0M, + // 0M); + orderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, orderSkuCostList.Union(insertOrderSkuCostList).ToList()); + if (!isRepurchase) { @@ -451,24 +541,42 @@ namespace BBWYB.Server.Business #endregion #region 订单状态 - dbOrder.CalculationOrderState(fsql, orderSkus, orderPurchaseInfoList.Union(insertOrderPurchaseInfos).ToList()); + dbOrder.CalculationOrderState(fsql, out _, orderSkus, orderPurchaseInfoList.Union(insertOrderPurchaseInfos).ToList()); #endregion #region 通知C端状态 Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion + #region 查询齐库合格证 + if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越 && + notifyQikuPackSchemeParamList != null && + notifyQikuPackSchemeParamList.Count() > 0) + { + Task.Factory.StartNew(() => qiKuManager.SearchCerConfigured(dbOrder, notifyQikuPackSchemeParamList, orderSkus), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + } + #endregion + fsql.Transaction(() => { - if (updatePurchaseOrderIdList.Count() > 0) - fsql.Update(updatePurchaseOrderIdList).Set(opi => opi.IsEnabled, false).ExecuteAffrows(); - if (updateOrderCostDetailIdList.Count() > 0) - fsql.Update(updateOrderCostDetailIdList).Set(ocd => ocd.IsEnabled, false).ExecuteAffrows(); - - fsql.Insert(insertOrderCostDetails).ExecuteAffrows(); - fsql.Insert(insertOrderPurchaseInfos).ExecuteAffrows(); - fsql.Insert(insertOrderPurchaseSkuInfos).ExecuteAffrows(); - fsql.Insert(insertOrderPurchaseRelationInfoList).ExecuteAffrows(); + if (updatePurchaseTimeLimitTaskOrderSkuList.Count() > 0) + { + fsql.Update().Set(t => t.CompletionTime, DateTime.Now) + .SetIf(dbOrder.PayTime != null, t => t.IsTimely == (DateTime.Now < t.ExpirationTime ? true : false)) + .Where(t => t.OrderId == request.OrderId) + .Where(t => updatePurchaseTimeLimitTaskOrderSkuList.Contains(t.SkuId)) + .Where(t => t.CompletionTime == null) + .Where(t => t.TaskType == Enums.TimeLimitTaskType.采购任务) + .ExecuteAffrows(); + } + if (insertOrderCostDetails.Count() > 0) + fsql.Insert(insertOrderCostDetails).ExecuteAffrows(); + if (insertOrderPurchaseInfos.Count() > 0) + fsql.Insert(insertOrderPurchaseInfos).ExecuteAffrows(); + if (insertOrderPurchaseSkuInfos.Count() > 0) + fsql.Insert(insertOrderPurchaseSkuInfos).ExecuteAffrows(); + if (insertOrderPurchaseRelationInfoList.Count() > 0) + fsql.Insert(insertOrderPurchaseRelationInfoList).ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); insertOrderCost?.ExecuteAffrows(); if (updatePurchaseTimeSchemeIdList.Count() > 0) @@ -476,8 +584,14 @@ namespace BBWYB.Server.Business 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) - .Set(o => o.PackConfigState, Enums.PackConfigState.待配置) .ExecuteAffrows(); + if (insertOrderSkuCostList.Count() > 0) + fsql.Insert(insertOrderSkuCostList).ExecuteAffrows(); + if (updateOrderSkuCostList.Count() > 0) + { + foreach (var update in updateOrderSkuCostList) + update.ExecuteAffrows(); + } }); } @@ -554,15 +668,6 @@ namespace BBWYB.Server.Business if (request.AssociationPurchaseOrderList == null || request.AssociationPurchaseOrderList.Count() == 0) throw new BusinessException("缺少采购单信息"); - //var dbPurchaseOrderList = fsql.Select().Where(opi => opi.OrderId == request.OrderId).ToList(); - //var dbInvalidPurchaseOrderIdList = dbPurchaseOrderList.Where(opi => !opi.IsEnabled).Select(opi => opi.PurchaseOrderId).ToList(); - - //var dbvalidPurchaseOrderList = dbPurchaseOrderList.Where(opi => opi.IsEnabled).ToList(); - - //if (request.AssociationPurchaseOrderList.Any(x => dbInvalidPurchaseOrderIdList.Contains(x.PurchaseOrderId))) - // throw new BusinessException("关联采购单时不能包含历史采购单"); - - var validation_groups_pid = request.AssociationPurchaseOrderList.GroupBy(po => po.PurchaseOrderId); if (validation_groups_pid.Any(x => x.Count() > 1)) throw new BusinessException("不允许包含重复的采购单"); @@ -609,7 +714,7 @@ namespace BBWYB.Server.Business var dbOrderSkuList = fsql.Select().Where(osku => osku.OrderId == request.OrderId).ToList(); var dbOrderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == request.OrderId && ocd.IsEnabled == true).ToList(); var dbOrderCost = fsql.Select(request.OrderId).ToOne(); - + var dbOrderSkuCostList = fsql.Select().Where(osc => osc.OrderId == request.OrderId).ToList(); List insertOrderPurchaseInfoList = new List(); @@ -622,6 +727,12 @@ namespace BBWYB.Server.Business IInsert insertOrderCost = null; IUpdate updateOrderCost = null; + List insertOrderSkuCostList = new List(); + IList> updateOrderSkuCostList = new List>(); + + List updatePurchaseTimeLimitTaskOrderSkuList = new List(); + List notifyQikuPackSchemeParamList = new List(); + foreach (var purchaseOrder in request.AssociationPurchaseOrderList) { //if (dbInvalidPurchaseOrderIdList.Contains(purchaseOrder.PurchaseOrderId)) @@ -656,10 +767,13 @@ namespace BBWYB.Server.Business purchaserId = purchaserId.Replace("b2b-", string.Empty); var purchaserId2 = purchaserId.Substring(0, purchaserId.Length - 5); var purchaserIds = new List() { purchaserId, purchaserId2 }; - var dbPurchaser = fsql.Select().Where(p => p.Platform == Enums.Platform.阿里巴巴 && purchaserIds.Contains(p.Id)).ToOne(); + var dbPurchaser = fsql.Select().Where(p => p.Platform == Enums.Platform.阿里巴巴 && (purchaserIds.Contains(p.Id) || + purchaserIds.Contains(p.Id2))).ToOne(); if (dbPurchaser == null) throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId}缺少有效采购商"); purchaserId = dbPurchaser.Id; + if (string.IsNullOrEmpty(purchaseOrder.PurchaserId)) + purchaseOrder.PurchaserId = purchaserId; #endregion #region 匹配采购方案 @@ -753,10 +867,7 @@ namespace BBWYB.Server.Business SkuId = assOrderCostDetail.SkuId, PurchaseOrderId = purchaseOrder.PurchaseOrderId }; - orderCostDetail.CalculationOrderCostDetailCostAndProfit(dbOrderSku.Price.Value * dbOrderSku.ItemTotal.Value, - dbOrderSku.BuyerPayFreight ?? 0M, - dbOrderSku.InPackAmount ?? 0M, - assOrderCostDetail.SkuAmount, + orderCostDetail.CalculationOrderCostDetailCostAndProfit(assOrderCostDetail.SkuAmount, purchaseFreight, 0M, 0M); @@ -784,6 +895,44 @@ namespace BBWYB.Server.Business }; insertOrderPurchaseInfoList.Add(dbPurchaserOrder); #endregion + + #region 采购限时任务 + foreach (var ocd in purchaseOrder.AssocationOrderCostDetailList) + { + if (!updatePurchaseTimeLimitTaskOrderSkuList.Any(x => x == ocd.SkuId)) + updatePurchaseTimeLimitTaskOrderSkuList.Add(ocd.SkuId); + } + #endregion + + #region 封装查询齐库合格证参数 + if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越) + { + if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴) + { + var waitList = insertOrderPurchaseRelationInfoList.Where(r => !notifyQikuPackSchemeParamList.Any(x => x.SkuId == r.SourceSkuId && + x.SkuPurchaseSchemeId == r.SchemeId?.ToString())) + .Select(r => new QiKuPackTaskSkuPurchaseSchemeIdRequest() + { + SkuId = r.SourceSkuId, + SkuPurchaseSchemeId = r.SchemeId?.ToString() + }).ToList(); + + if (waitList != null && waitList.Count() > 0) + notifyQikuPackSchemeParamList.AddRange(waitList); + } + else + { + foreach (var ocd in purchaseOrder.AssocationOrderCostDetailList) + { + var orderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == ocd.SkuId); + if (orderSku == null) + continue; + if (!notifyQikuPackSchemeParamList.Any(x => x.SkuId == orderSku.BelongSkuId)) + notifyQikuPackSchemeParamList.Add(new QiKuPackTaskSkuPurchaseSchemeIdRequest() { SkuId = orderSku.BelongSkuId, SkuPurchaseSchemeId = null }); + } + } + } + #endregion } else { @@ -793,8 +942,10 @@ namespace BBWYB.Server.Business dbPurchaserOrder.PurchaseAccountName = purchaseOrder.PurchaseAccountName; //dbPurchaserOrder.BelongSkuIds = string.Join(",", purchaseOrder.AssocationOrderCostDetailList.Select(x => x.SkuId)); dbPurchaserOrder.PurchasePlatform = purchaseOrder.PurchasePlatform; - dbPurchaserOrder.PurchaserId = purchaseOrder.PurchaserId; - dbPurchaserOrder.PurchaserName = purchaseOrder.PurchaserName; + if (!string.IsNullOrEmpty(purchaseOrder.PurchaserId) && purchaseOrder.PurchaserId != dbPurchaserOrder.PurchaserId) + dbPurchaserOrder.PurchaserId = purchaseOrder.PurchaserId; + if (!string.IsNullOrEmpty(purchaseOrder.PurchaserName) && purchaseOrder.PurchaserName != dbPurchaserOrder.PurchaserName) + dbPurchaserOrder.PurchaserName = purchaseOrder.PurchaserName; updateOrderPurchaseInfoList.Add(fsql.Update().SetSource(dbPurchaserOrder)); foreach (var assOrderCostDetail in purchaseOrder.AssocationOrderCostDetailList) @@ -806,8 +957,8 @@ namespace BBWYB.Server.Business var purchaseFreight = purchaseOrder.PurchaseFreight * (1.0M * assOrderCostDetail.PurchaseQuantity / totalQuantity); - - if (orderCostDetail == null) + var isOcdEmpty = orderCostDetail == null; + if (isOcdEmpty) { orderCostDetail = new OrderCostDetail() { @@ -823,15 +974,12 @@ namespace BBWYB.Server.Business }; } orderCostDetail.DeductionQuantity = assOrderCostDetail.PurchaseQuantity; - orderCostDetail.CalculationOrderCostDetailCostAndProfit(dbOrderSku.Price.Value * dbOrderSku.ItemTotal.Value, - dbOrderSku.BuyerPayFreight ?? 0M, - dbOrderSku.InPackAmount ?? 0M, - assOrderCostDetail.SkuAmount, - purchaseFreight, - orderCostDetail.OutPackAmount ?? 0M, - orderCostDetail.DeliveryExpressFreight ?? 0M); - - if (orderCostDetail == null) + orderCostDetail.CalculationOrderCostDetailCostAndProfit(assOrderCostDetail.SkuAmount, + purchaseFreight, + orderCostDetail.OutPackAmount ?? 0M, + orderCostDetail.DeliveryExpressFreight ?? 0M); + + if (isOcdEmpty) insertOrderCostDetailList.Add(orderCostDetail); else updateOrderCostDetailList.Add(fsql.Update().SetSource(orderCostDetail)); @@ -839,6 +987,33 @@ namespace BBWYB.Server.Business } } + #region 订单Sku成本 + var allOrderCostDetail = dbOrderCostDetailList.Union(insertOrderCostDetailList).ToList(); + foreach (var orderSku in dbOrderSkuList) + { + var orderSkuCost = dbOrderSkuCostList.FirstOrDefault(osc => osc.SkuId == orderSku.SkuId); + if (orderSkuCost == null) + { + orderSkuCost = new OrderSkuCost() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + OrderId = request.OrderId, + SkuId = orderSku.SkuId + }; + orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, allOrderCostDetail); + insertOrderSkuCostList.Add(orderSkuCost); + } + else + { + orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, allOrderCostDetail); + var update = fsql.Update().SetSource(orderSkuCost); + updateOrderSkuCostList.Add(update); + } + } + #endregion + + #region 订单成本 var dbOrderCostIsEmpty = dbOrderCost == null; if (dbOrderCostIsEmpty) { @@ -849,29 +1024,38 @@ namespace BBWYB.Server.Business CreateTime = DateTime.Now }; } - - var totalPurchaseProductAmount = request.AssociationPurchaseOrderList.Sum(x => x.PurchaseAmount); - var totalPurchaseFreight = request.AssociationPurchaseOrderList.Sum(x => x.PurchaseFreight); - var totalOutPackAmount = dbOrderCostDetailList.Sum(ocd => ocd.OutPackAmount); - dbOrderCost.CalculationOrderCostCostAndProfit(dbOrder.OrderTotalPrice.Value, - totalPurchaseProductAmount, - totalPurchaseFreight, - totalOutPackAmount ?? 0M, - 0M); + dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, dbOrderSkuCostList.Union(insertOrderSkuCostList).ToList()); + //var totalPurchaseProductAmount = request.AssociationPurchaseOrderList.Sum(x => x.PurchaseAmount); + //var totalPurchaseFreight = request.AssociationPurchaseOrderList.Sum(x => x.PurchaseFreight); + //var totalOutPackAmount = dbOrderCostDetailList.Sum(ocd => ocd.OutPackAmount); + //dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, + // totalPurchaseProductAmount, + // totalPurchaseFreight, + // totalOutPackAmount ?? 0M, + // 0M); if (dbOrderCostIsEmpty) insertOrderCost = fsql.Insert(dbOrderCost); else updateOrderCost = fsql.Update().SetSource(dbOrderCost); + #endregion #region 订单状态 - dbOrder.CalculationOrderState(fsql, dbOrderSkuList, dbPurchaseOrderList.Union(insertOrderPurchaseInfoList).ToList()); + dbOrder.CalculationOrderState(fsql, out _, dbOrderSkuList, dbPurchaseOrderList.Union(insertOrderPurchaseInfoList).ToList()); #endregion #region 通知C端状态 Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion + #region 查询齐库合格证 + if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越 && + notifyQikuPackSchemeParamList.Count() > 0) + { + Task.Factory.StartNew(() => qiKuManager.SearchCerConfigured(dbOrder, notifyQikuPackSchemeParamList, dbOrderSkuList), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + } + #endregion + fsql.Transaction(() => { if (insertOrderPurchaseInfoList.Count() > 0) @@ -881,6 +1065,16 @@ namespace BBWYB.Server.Business if (insertOrderPurchaseRelationInfoList.Count() > 0) fsql.Insert(insertOrderPurchaseRelationInfoList).ExecuteAffrows(); + if (updatePurchaseTimeLimitTaskOrderSkuList.Count() > 0) + { + fsql.Update().Set(t => t.CompletionTime, DateTime.Now) + .SetIf(dbOrder.PayTime != null, t => t.IsTimely == (DateTime.Now < t.ExpirationTime ? true : false)) + .Where(t => t.OrderId == request.OrderId) + .Where(t => updatePurchaseTimeLimitTaskOrderSkuList.Contains(t.SkuId)) + .Where(t => t.CompletionTime == null) + .Where(t => t.TaskType == Enums.TimeLimitTaskType.采购任务) + .ExecuteAffrows(); + } if (updateOrderPurchaseInfoList.Count() > 0) { foreach (var update in updateOrderPurchaseInfoList) @@ -899,6 +1093,14 @@ namespace BBWYB.Server.Business fsql.Update(dbOrder.Id).Set(o => o.OrderState, dbOrder.OrderState) .Set(o => o.IsPurchased, true) .ExecuteAffrows(); + + if (insertOrderSkuCostList.Count() > 0) + fsql.Insert(insertOrderSkuCostList).ExecuteAffrows(); + if (updateOrderSkuCostList.Count() > 0) + { + foreach (var update in updateOrderSkuCostList) + update.ExecuteAffrows(); + } }); } @@ -927,7 +1129,7 @@ namespace BBWYB.Server.Business purchaserId = purchaserId.Replace("b2b-", string.Empty); var purchaserId2 = purchaserId.Substring(0, purchaserId.Length - 5); var purchaserIds = new List() { purchaserId, purchaserId2 }; - var dbPurchaser = fsql.Select().Where(p => p.Platform == Enums.Platform.阿里巴巴 && purchaserIds.Contains(p.Id)).ToOne(); + var dbPurchaser = fsql.Select().Where(p => p.Platform == Enums.Platform.阿里巴巴 && (purchaserIds.Contains(p.Id) || purchaserIds.Contains(p.Id2))).ToOne(); if (dbPurchaser == null) throw new BusinessException($"采购单{request.PurchaseOrderId}缺少有效采购商"); purchaserId = dbPurchaser.Id; @@ -964,17 +1166,49 @@ namespace BBWYB.Server.Business #region 匹配采购单所使用到的采购方案 var assocationOrderCostDetailList = new List(); var purchaseSchemeGroups = purchaseSchemeSkuList.GroupBy(s => s.SkuPurchaseSchemeId); - var totalPurchaseCount = purchaseOrderSimpleInfo.ItemList.Sum(x => x.Quantity); + var cargoParamList = new List(); foreach (var schemeGroup in purchaseSchemeGroups) { 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 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 orderPurchaseSkuOfCurrentSchemeList = purchaseOrderSimpleInfo.ItemList.Where(psku => schemePurchaseSkuList.Count(x => x.PurchaseSkuId == psku.SkuId) > 0); + var currentPurchaseSkuTotalQuantity = cargoParamList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) + .Sum(p => p.Quantity); + currentSkuAmount += currentPurchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity / currentPurchaseSkuTotalQuantity); + + } - var skuId = schemePurchaseSkuList.FirstOrDefault().SkuId; var orderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == skuId); var assocationOrderCostDetail = new AssocationOrderCostDetailResponse() { @@ -982,9 +1216,9 @@ namespace BBWYB.Server.Business Title = orderSku.Title, SkuId = skuId, OrderId = orderSku.OrderId, - SkuAmount = orderPurchaseSkuOfCurrentSchemeList.Sum(psku => psku.ProductAmount), + SkuAmount = currentSkuAmount, PurchaseQuantity = orderSku.ItemTotal.Value, - PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount * (1.0M * orderPurchaseSkuOfCurrentSchemeList.Sum(x => x.Quantity) / totalPurchaseCount) + PurchaseFreight = currentPurchaseFreight }; assocationOrderCostDetail.PurchasePrice = assocationOrderCostDetail.SkuAmount / assocationOrderCostDetail.PurchaseQuantity; assocationOrderCostDetailList.Add(assocationOrderCostDetail); @@ -1015,22 +1249,34 @@ namespace BBWYB.Server.Business /// public void SetHistoryPurchaseOrder(SetHistoryPurchaseOrderRequest request) { - 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.CalculationOrderCostCostAndProfit(dbOrder.OrderTotalPrice.Value, purchaseProductAmount, purchaseFreight, outPackAmount, 0M); - + nLogManager.Default().Info($"SetHistoryPurchaseOrder {JsonConvert.SerializeObject(request)}"); var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == request.OrderId && opi.IsEnabled == true).ToList(); var historyPurchaseOrder = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); if (historyPurchaseOrder == null) throw new BusinessException("未查询到采购单"); + IList> updateOrderSkuCostList = new List>(); + + var dbOrderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == request.OrderId && + ocd.PurchaseOrderId != request.PurchaseOrderId && + ocd.IsEnabled == true).ToList(); + var dbOrderSkuCostList = fsql.Select().Where(osc => osc.OrderId == request.OrderId).ToList(); + var dbOrderCost = fsql.Select(request.OrderId).ToOne(); + var dbOrder = fsql.Select(request.OrderId).ToOne(); + var dbOrderSku = fsql.Select().Where(osku => osku.OrderId == request.OrderId).ToList(); + + foreach (var orderSkuCost in dbOrderSkuCostList) + { + var orderSku = dbOrderSku.FirstOrDefault(osku => osku.SkuId == orderSkuCost.SkuId); + if (orderSku == null) + continue; + orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, dbOrderCostDetailList); + updateOrderSkuCostList.Add(fsql.Update().SetSource(orderSkuCost)); + } + + dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice ?? 0M, dbOrderSkuCostList); + #region 找出失效的快递单 List deleteWaybillNoList = new List(); @@ -1049,17 +1295,24 @@ namespace BBWYB.Server.Business } #endregion - orderPurchaseInfoList.Remove(historyPurchaseOrder); - dbOrder.CalculationOrderState(fsql, orderPurchaseInfoList: orderPurchaseInfoList); + dbOrder.CalculationOrderState(fsql, out _, orderPurchaseInfoList: orderPurchaseInfoList); fsql.Transaction(() => { - fsql.Update(historyPurchaseOrder.Id) - .Set(opi => opi.IsEnabled, false) - .Set(opi => opi.OrderState, Enums.PurchaseOrderState.已取消) - .Where(opi => opi.PurchaseOrderId == request.PurchaseOrderId) - .ExecuteAffrows(); + if (request.IsDelete == true) + { + fsql.Delete(historyPurchaseOrder.Id).ExecuteAffrows(); + } + else + { + fsql.Update(historyPurchaseOrder.Id) + .Set(opi => opi.IsEnabled, false) + .Set(opi => opi.OrderState, Enums.PurchaseOrderState.已取消) + .Set(opi => opi.HistorySettingTime, DateTime.Now) + .Where(opi => opi.PurchaseOrderId == request.PurchaseOrderId) + .ExecuteAffrows(); + } fsql.Update() .Set(ocd => ocd.IsEnabled, false) @@ -1073,13 +1326,94 @@ namespace BBWYB.Server.Business if (deleteWaybillNoList.Count() > 0) fsql.Delete(deleteWaybillNoList).ExecuteAffrows(); - //fsql.Delete().Where(peo => peo.PurchaseOrderId == request.PurchaseOrderId).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(); + if (updateOrderSkuCostList.Count() > 0) + { + foreach (var update in updateOrderSkuCostList) + update.ExecuteAffrows(); + } }); } + //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(); + // }); + //} + /// /// 修改采购快递单 /// @@ -1176,7 +1510,7 @@ namespace BBWYB.Server.Business dingdingMsg.AppendLine($"快递单号:{request.NewWaybillNo}"); dingdingMsg.AppendLine("触发环节:修改物流单号"); dingdingMsg.Append($"店铺名:{shop.ShopName}"); - Task.Factory.StartNew(() => SendDingDingOnKD100SubscribeFail(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion } insertPEO = fsql.Insert(newPeo); @@ -1222,14 +1556,14 @@ namespace BBWYB.Server.Business if (newPeo != null) purchaseExpressOrderList.Add(newPeo); var oldPurchaseOrderState = purchaseOrder.OrderState; - purchaseOrder.CalculationOrderState(fsql, orderPurchaseSkuList, purchaseExpressOrderList); + purchaseOrder.CalculationOrderState(dbOrder.IntoStoreType.Value, fsql, orderPurchaseSkuList, purchaseExpressOrderList); if (oldPurchaseOrderState != purchaseOrder.OrderState) updatePurchaseOrder = fsql.Update(purchaseOrder.Id).Set(opi => opi.OrderState, purchaseOrder.OrderState); #endregion #region 计算订单状态 var oldOrderState = dbOrder.OrderState; - dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); + dbOrder.CalculationOrderState(fsql, out _, null, orderPurchaseInfoList); if (oldOrderState != dbOrder.OrderState) { updateOrder = fsql.Update(dbOrder.Id).Set(o => o.OrderState, dbOrder.OrderState); @@ -1262,6 +1596,23 @@ namespace BBWYB.Server.Business if (request.ExpressId == "zhuanxianwuliu" && string.IsNullOrEmpty(request.WaybillNo)) request.WaybillNo = $"wdh{idGenerator.NewLong()}"; + #region 查询当前采购单的订单信息 + var dbOrder = fsql.Select().InnerJoin((opi, o) => opi.OrderId == o.Id) + .Where((opi, o) => opi.PurchaseOrderId == request.PurchaseOrderId && opi.IsEnabled == true) + .ToOne((opi, o) => new Order + { + Id = o.Id, + OrderSn = o.OrderSn, + OrderState = o.OrderState, + ShopId = o.ShopId, + IntoStoreType = o.IntoStoreType + }); + if (dbOrder == null) + throw new BusinessException("未查询到采购单的订单信息"); + if (dbOrder.IntoStoreType == Enums.IntoStoreType.厂商代发入仓) + throw new BusinessException("厂家代发入仓订单请使用【设置快递单和入仓采购单接口(厂家代发入仓专用)】"); + #endregion + #region 准备数据库更新对象 List insertPurchaseExpressOrderList = new List(); IList> updateOrderPurchaseSkuList = new List>(); @@ -1294,21 +1645,6 @@ namespace BBWYB.Server.Business bool isDbExists = fsql.Select(request.WaybillNo).Any(); #endregion - #region 查询当前采购单的订单信息 - var dbOrder = fsql.Select().InnerJoin((opi, o) => opi.OrderId == o.Id) - .Where((opi, o) => opi.PurchaseOrderId == request.PurchaseOrderId && opi.IsEnabled == true) - .ToOne((opi, o) => new Order - { - Id = o.Id, - OrderSn = o.OrderSn, - OrderState = o.OrderState, - ShopId = o.ShopId, - IntoStoreType = o.IntoStoreType - }); - if (dbOrder == null) - throw new BusinessException("未查询到采购单的订单信息"); - #endregion - #region 店铺信息 var shop = fsqlManager.MDSfsql.Select().Where(s => s.ShopId == dbOrder.ShopId.ToString()).ToOne(); if (shop == null) @@ -1376,7 +1712,7 @@ namespace BBWYB.Server.Business dingdingMsg.AppendLine($"快递单号:{request.WaybillNo}"); dingdingMsg.AppendLine("触发环节:手动发货"); dingdingMsg.Append($"店铺名:{shop.ShopName}"); - Task.Factory.StartNew(() => SendDingDingOnKD100SubscribeFail(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion } #endregion @@ -1421,13 +1757,13 @@ namespace BBWYB.Server.Business #endregion #region 计算采购单状态 - orderPurchaseInfo.CalculationOrderState(fsql, orderPurchaseSkuList, purchaseExpressOrderList.Union(insertPurchaseExpressOrderList).ToList()); + orderPurchaseInfo.CalculationOrderState(dbOrder.IntoStoreType.Value, fsql, orderPurchaseSkuList, purchaseExpressOrderList.Union(insertPurchaseExpressOrderList).ToList()); updateOrderPurchase = fsql.Update(orderPurchaseInfo.Id) .Set(opi => opi.OrderState, orderPurchaseInfo.OrderState); #endregion #region 计算订单状态 - dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); + dbOrder.CalculationOrderState(fsql, out _, null, orderPurchaseInfoList); updateOrder = fsql.Update(dbOrder.Id) .Set(o => o.OrderState, dbOrder.OrderState); #endregion @@ -1451,51 +1787,251 @@ namespace BBWYB.Server.Business }); } - public void ManualSign(ManualSignRequest request) - { - Task.Factory.StartNew(() => OnExpressOrderChange(request.WayBillNo, "QianShou", DateTime.Now, "手动签收"), - CancellationToken.None, - TaskCreationOptions.LongRunning, - taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); - } - - public void BatchManualSign(BatchManualSignRequest request) + /// + /// 厂家代入仓订单发货 + /// + /// + public void PurchaserDelivery(PurchaserDeliveryRequest request) { - if (request.WayBillNoList == null || request.WayBillNoList.Count() == 0) - throw new BusinessException("缺少快递单号"); - if (request.WayBillNoList.Distinct().Count() < request.WayBillNoList.Count()) - throw new BusinessException("不允许重复的快递单号"); - Task.Factory.StartNew(() => - { - foreach (var waybillNo in request.WayBillNoList) - OnExpressOrderChange(waybillNo, "QianShou", DateTime.Now, "手动签收"); - }, CancellationToken.None, - TaskCreationOptions.LongRunning, - taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); - } + nLogManager.Default().Info($"ManualDelivery {JsonConvert.SerializeObject(request)}"); - ///// - ///// 手动收货 - ///// - ///// - //public void ManualSign(ManualSignRequest request) - //{ - // IList> updatePurchaseExpressOrderList = new List>(); - // IUpdate updateOrderPurchase = null; - // IUpdate updateOrder = null; + var dbOrder = fsql.Select(request.OrderId).ToOne(); + if (dbOrder == null) + throw new BusinessException("订单不存在"); + if (dbOrder.IntoStoreType != Enums.IntoStoreType.厂商代发入仓) + throw new BusinessException("此订单非厂商代发入仓"); + if (request.InStorePurchaseOrderManualDeliveryList.Count() == 0) + throw new BusinessException("缺少快递信息"); + if (request.InStorePurchaseOrderManualDeliveryList.Any(x => x.InStorePurchaseOrderIdList.Count() == 0)) + throw new BusinessException("缺少入仓采购单信息"); + if (request.InStorePurchaseOrderManualDeliveryList.Any(x => x.InStorePurchaseOrderIdList.Count() != x.InStorePurchaseOrderIdList.Distinct().Count())) + throw new BusinessException("同一个快递单下不允许出现重复的入仓采购单"); - // #region 查询该笔采购单的快递单信息 - // var purchaseExpressOrderList = fsql.Select().Where(x => x.PurchaseOrderId == request.PurchaseOrderId).ToList(); - // #endregion + List insertPurchaseExpressOrderList = new List(); + List insertExpressOrderRelationList = new List(); + List insertInStorePurchaseOrderRelationList = new List(); + //IList> updateOrderPurchaseSkuList = new List>(); + IUpdate updateOrderPurchase = null; + IUpdate updateOrder = null; - // #region 查询当前采购单的订单信息 - // var dbOrder = fsql.Select().InnerJoin((opi, o) => opi.OrderId == o.Id) - // .Where((opi, o) => opi.PurchaseOrderId == request.PurchaseOrderId && opi.IsEnabled == true) - // .ToOne((opi, o) => new Order - // { - // Id = o.Id, - // OrderState = o.OrderState, - // ShopId = o.ShopId + #region 查询该笔采购单的快递单信息 + //var purchaseExpressOrderList = fsql.Select().Where(x => x.PurchaseOrderId == request.PurchaseOrderId).ToList(); + var purchaseExpressOrderList = fsql.Select() + .InnerJoin((eori, peo) => eori.WayBillNo == peo.WaybillNo) + .Where((eori, peo) => eori.PurchaseOrderId == request.PurchaseOrderId).ToList((eori, peo) => new PurchaseExpressOrder + { + CreateTime = peo.CreateTime, + ExpressContent = peo.ExpressContent, + ExpressChangedTime = peo.ExpressChangedTime, + ExpressState = peo.ExpressState, + IsSubscribeKD100 = peo.IsSubscribeKD100, + //OrderId = eori.OrderId, + //PurchaseOrderId = eori.PurchaseOrderId, + ShopId = eori.ShopId.Value, + SourceExpressId = peo.SourceExpressId, + SourceExpressName = peo.SourceExpressName, + TargetExpressId = peo.TargetExpressId, + TargetExpressName = peo.TargetExpressName, + WaybillNo = peo.WaybillNo + }); + + var wayBillNos = request.InStorePurchaseOrderManualDeliveryList.Select(x => x.WaybillNo).ToList(); + var dbPurchaseExpressOrderList = fsql.Select(wayBillNos).ToList(); + #endregion + + #region 查询该订单的入库采购单关系 + var dbInStoreRelationList = fsql.Select().Where(x => x.OrderId == request.OrderId).ToList(); + #endregion + + #region 店铺信息 + var shop = fsqlManager.MDSfsql.Select().Where(s => s.ShopId == dbOrder.ShopId.ToString()).ToOne(); + if (shop == null) + throw new BusinessException("未查询到采购单所属店铺"); + #endregion + + #region 查询订单的全部采购单信息 + var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == dbOrder.Id && opi.IsEnabled == true).ToList(); + var orderPurchaseInfo = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); + if (orderPurchaseInfo == null) + throw new BusinessException("未查询到采购单信息"); + #endregion + + foreach (var peoRequest in request.InStorePurchaseOrderManualDeliveryList) + { + bool isExists = purchaseExpressOrderList.Any(exo => exo.WaybillNo == peoRequest.WaybillNo); + bool isDbExists = dbPurchaseExpressOrderList.Any(exo => exo.WaybillNo == peoRequest.WaybillNo); + + #region 订阅快递100 + bool isSubscribeKD100 = false; + if (peoRequest.ExpressId != "zhuanxianwuliu" && !isDbExists) + { + try + { + kuaiDi100Manager.SubscribeKuaiDi100(peoRequest.WaybillNo, peoRequest.ExpressId, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish"); + isSubscribeKD100 = true; + } + catch (Exception ex) + { + if (!ex.Message.Contains("重复订阅")) + { + nLogManager.Default().Error(ex, $"ManualDelivery,Request:{JsonConvert.SerializeObject(request)}"); + + #region 订阅失败发送钉钉通知 + var dingdingMsg = new StringBuilder(); + dingdingMsg.AppendLine($"错误:{ex.Message}"); + dingdingMsg.AppendLine($"采购订单号:{request.PurchaseOrderId}"); + dingdingMsg.AppendLine($"拳探订单号:{dbOrder.Id}"); + dingdingMsg.AppendLine($"拳探订单Sn:{dbOrder.OrderSn}"); + dingdingMsg.AppendLine($"源物流公司:无"); + dingdingMsg.AppendLine($"目标物流公司:{peoRequest.ExpressName} {peoRequest.ExpressId}"); + dingdingMsg.AppendLine($"快递单号:{peoRequest.WaybillNo}"); + dingdingMsg.AppendLine("触发环节:手动发货"); + dingdingMsg.Append($"店铺名:{shop.ShopName}"); + Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + #endregion + } + } + } + #endregion + + #region 创建快递单 + if (!isDbExists) + { + var purchaseExpressOrder = new PurchaseExpressOrder() + { + //OrderId = dbOrder.Id, + CreateTime = DateTime.Now, + //PurchaseOrderId = request.PurchaseOrderId, + ShopId = dbOrder.ShopId ?? 0, + TargetExpressId = peoRequest.ExpressId, + TargetExpressName = peoRequest.ExpressName, + WaybillNo = peoRequest.WaybillNo, + ExpressState = kuaiDi100Manager.GetExpressState(1), //快递100发货状态值 默认揽收 + IsSubscribeKD100 = isSubscribeKD100, + ExpressContent = "手动发货", + ExpressChangedTime = DateTime.Now + }; + insertPurchaseExpressOrderList.Add(purchaseExpressOrder); + } + #endregion + + #region 创建快递单关系 + if (!isExists) + { + var expressOrderRelation = new ExpressOrderRelationInfo() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + OrderId = dbOrder.Id, + PurchaseOrderId = request.PurchaseOrderId, + ShopId = dbOrder.ShopId.Value, + WayBillNo = peoRequest.WaybillNo + }; + insertExpressOrderRelationList.Add(expressOrderRelation); + } + #endregion + + #region 入库采购单号 + var waitInsertInStoreRelationList = peoRequest.InStorePurchaseOrderIdList.Where(x => !dbInStoreRelationList.Any(r => r.WaybillNo == peoRequest.WaybillNo && + r.InStorePurchaseOrderId == x)).ToList(); + if (waitInsertInStoreRelationList.Count() > 0) + { + insertInStorePurchaseOrderRelationList.AddRange(waitInsertInStoreRelationList.Select(x => new InStorePurchaseOrdeRrelationInfo() + { + CreateTime = DateTime.Now, + Id = idGenerator.NewLong(), + InStorePurchaseOrderId = x, + OrderId = request.OrderId, + PurchaseOrderId = request.PurchaseOrderId, + ShopId = dbOrder.ShopId, + WaybillNo = peoRequest.WaybillNo + })); + } + #endregion + } + + #region 计算采购单状态 + orderPurchaseInfo.CalculationOrderState(dbOrder.IntoStoreType.Value, fsql, null, purchaseExpressOrderList.Union(insertPurchaseExpressOrderList).ToList()); + updateOrderPurchase = fsql.Update(orderPurchaseInfo.Id) + .Set(opi => opi.OrderState, orderPurchaseInfo.OrderState); + #endregion + + #region 计算订单状态 + dbOrder.CalculationOrderState(fsql, out _, null, orderPurchaseInfoList); + updateOrder = fsql.Update(dbOrder.Id) + .Set(o => o.OrderState, dbOrder.OrderState); + #endregion + + #region 通知C端状态 + Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + #endregion + + fsql.Transaction(() => + { + if (insertPurchaseExpressOrderList.Count() > 0) + fsql.Insert(insertPurchaseExpressOrderList).ExecuteAffrows(); + if (insertExpressOrderRelationList.Count() > 0) + fsql.Insert(insertExpressOrderRelationList).ExecuteAffrows(); + if (insertInStorePurchaseOrderRelationList.Count() > 0) + fsql.Insert(insertInStorePurchaseOrderRelationList).ExecuteAffrows(); + + //if (updateOrderPurchaseSkuList.Count() > 0) + //{ + // foreach (var update in updateOrderPurchaseSkuList) + // update.ExecuteAffrows(); + //} + updateOrderPurchase?.ExecuteAffrows(); + updateOrder?.ExecuteAffrows(); + }); + + } + + public void ManualSign(ManualSignRequest request) + { + Task.Factory.StartNew(() => OnExpressOrderChange(request.WayBillNo, "QianShou", DateTime.Now, "手动签收"), + CancellationToken.None, + TaskCreationOptions.LongRunning, + taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + } + + public void BatchManualSign(BatchManualSignRequest request) + { + if (request.WayBillNoList == null || request.WayBillNoList.Count() == 0) + throw new BusinessException("缺少快递单号"); + if (request.WayBillNoList.Distinct().Count() < request.WayBillNoList.Count()) + throw new BusinessException("不允许重复的快递单号"); + Task.Factory.StartNew(() => + { + foreach (var waybillNo in request.WayBillNoList) + OnExpressOrderChange(waybillNo, "QianShou", DateTime.Now, "手动签收"); + }, CancellationToken.None, + TaskCreationOptions.LongRunning, + taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + } + + + ///// + ///// 手动收货 + ///// + ///// + //public void ManualSign(ManualSignRequest request) + //{ + // IList> updatePurchaseExpressOrderList = new List>(); + // IUpdate updateOrderPurchase = null; + // IUpdate updateOrder = null; + + // #region 查询该笔采购单的快递单信息 + // var purchaseExpressOrderList = fsql.Select().Where(x => x.PurchaseOrderId == request.PurchaseOrderId).ToList(); + // #endregion + + // #region 查询当前采购单的订单信息 + // var dbOrder = fsql.Select().InnerJoin((opi, o) => opi.OrderId == o.Id) + // .Where((opi, o) => opi.PurchaseOrderId == request.PurchaseOrderId && opi.IsEnabled == true) + // .ToOne((opi, o) => new Order + // { + // Id = o.Id, + // OrderState = o.OrderState, + // ShopId = o.ShopId // }); // if (dbOrder == null) // throw new BusinessException("未查询到采购单的订单信息"); @@ -1657,6 +2193,9 @@ namespace BBWYB.Server.Business case "LOGISTICS_BUYER_VIEW_TRACE": // LogisticsUpdateCallbackFrom1688(jObject);//1688物流信息变更 break; + case "ORDER_BUYER_VIEW_ORDER_PAY": + OrderPayFrom1688(jObject); + break; default: break; } @@ -1684,11 +2223,6 @@ namespace BBWYB.Server.Business string wayBillNoResponseInfo = string.Empty; try { - List insertPurchaseExpressOrderList = new List(); - List insertExpressOrderRelationInfoList = new List(); - IList> updateOrderPurchaseSkuList = new List>(); - IUpdate updateOrderPurchase = null; - IUpdate updateOrder = null; #region 查询当前采购单的订单信息 currentProgress = "查询当前采购单的订单信息"; @@ -1704,6 +2238,16 @@ namespace BBWYB.Server.Business }); if (dbOrder == null) throw new Exception("未查询到采购单的订单信息"); + + if (dbOrder.IntoStoreType == Enums.IntoStoreType.厂商代发入仓) + return; + + List insertPurchaseExpressOrderList = new List(); + List insertExpressOrderRelationInfoList = new List(); + IList> updateOrderPurchaseSkuList = new List>(); + IUpdate updateOrderPurchase = null; + IUpdate updateOrder = null; + orderId = dbOrder.Id; shopId = dbOrder.ShopId; #endregion @@ -1809,8 +2353,11 @@ namespace BBWYB.Server.Business dingdingMsg.AppendLine($"快递单号:{logisticsInfo.WayBillNo}"); dingdingMsg.AppendLine("触发环节:1688发货回调"); dingdingMsg.Append($"店铺名:{shop.ShopName}"); - Task.Factory.StartNew(() => SendDingDingOnKD100SubscribeFail(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion + + if (ex.Message.Contains("无翻译结果")) + throw; } } #endregion @@ -1862,13 +2409,13 @@ namespace BBWYB.Server.Business #endregion #region 计算采购单状态 - orderPurchaseInfo.CalculationOrderState(fsql, orderPurchaseSkuList, purchaseExpressOrderList.Union(insertPurchaseExpressOrderList).ToList()); + orderPurchaseInfo.CalculationOrderState(dbOrder.IntoStoreType.Value, fsql, orderPurchaseSkuList, purchaseExpressOrderList.Union(insertPurchaseExpressOrderList).ToList()); updateOrderPurchase = fsql.Update(orderPurchaseInfo.Id) .Set(opi => opi.OrderState, orderPurchaseInfo.OrderState); #endregion #region 计算订单状态 - dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); + dbOrder.CalculationOrderState(fsql, out _, null, orderPurchaseInfoList); updateOrder = fsql.Update(dbOrder.Id) .Set(o => o.OrderState, dbOrder.OrderState); #endregion @@ -1907,245 +2454,14 @@ namespace BBWYB.Server.Business var purchaseOrderId = jObject["data"].Value("orderId"); Task.Factory.StartNew(() => OrderPriceModificationCallback(purchaseOrderId, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } - #endregion - - ///// - ///// 采购平台发货回调 - ///// - ///// - ///// - ///// - //private void DeliveryCallback(string purchaseOrderId, PP_QueryOrderLogisticsResponse wayBillNoResponse, Enums.Platform callbackPlatform) - //{ - // string currentProgress = string.Empty; - // string wayBillNoResponseInfo = string.Empty; - // string expressCompanyListInfo = string.Empty; - // string expressCompanyInfo = string.Empty; - // string orderId = string.Empty; - // long? shopId = null; - // try - // { - // #region 查询代发信息 - // currentProgress = "查询代发信息"; - // var orderPurchaseInfo = fsql.Select().Where(o => o.PurchaseOrderId == purchaseOrderId && o.IsEnabled == true).ToOne(); - // if (orderPurchaseInfo == null) - // throw new Exception("未查询到代发信息"); - // orderId = orderPurchaseInfo.OrderId; - // shopId = orderPurchaseInfo.ShopId; - // #endregion - - // //#region 查询采购账号的归属店铺 - // //currentProgress = "查询采购账号归属店铺"; - // //var shop = venderBusiness.GetShopList(shopId: shopId)?.FirstOrDefault(); - // //if (shop == null) - // // throw new Exception("未查询到店铺信息"); - // //#endregion - - // #region 查询采购账号 - // currentProgress = "查询采购账号"; - // var purchaseAccount = fsqlManager.MDSfsql.Select().Where(pa => pa.Id == orderPurchaseInfo.PurchaseAccountId).ToOne(); - // if (purchaseAccount == null) - // throw new Exception($"未查询到采购账号{orderPurchaseInfo.PurchaseAccountId}"); - // #endregion - - // #region 获取采购单的物流信息 - // currentProgress = "获取采购单的物流信息"; - // if (wayBillNoResponse == null) - // { - // var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)callbackPlatform); - // var ppQueryOrderLogisticsRequest = new PP_QueryOrderLogisticsRequest() - // { - // AppKey = purchaseAccount.AppKey, - // AppSecret = purchaseAccount.AppSecret, - // AppToken = purchaseAccount.AppToken, - // OrderId = purchaseOrderId, - // Platform = (AdapterEnums.PlatformType)callbackPlatform - // }; - // wayBillNoResponse = client.QueryOrderLogistics(ppQueryOrderLogisticsRequest); - // wayBillNoResponseInfo = JsonConvert.SerializeObject(new { Request = ppQueryOrderLogisticsRequest, Result = wayBillNoResponse }); - // } - // #endregion - - // //#region 获取目标平台的物流公司列表 - // //currentProgress = "获取店铺平台物流公司列表"; - // //var expressCompanyList = venderBusiness.GetExpressCompanyList(new PlatformRequest() - // //{ - // // AppKey = shop.AppKey, - // // AppSecret = shop.AppSecret, - // // AppToken = shop.AppToken, - // // Platform = shop.PlatformId - // //}); - // //if (expressCompanyList != null) - // // expressCompanyListInfo = JsonConvert.SerializeObject(expressCompanyList); - // //#endregion - - - - // //#region 物流公司翻译 - // //currentProgress = "物流公司翻译"; - - // //OP_QueryExpressCompanyResponse convertExpressCompany = null; - - // //try - // //{ - // // convertExpressCompany = expressCompanyNameConverter.Converter(wayBillNoResponse.ExpressName, - // // (AdapterEnums.PlatformType)callbackPlatform, - // // (AdapterEnums.PlatformType)shop.PlatformId, - // // expressCompanyList); - // // if (convertExpressCompany != null) - // // expressCompanyInfo = JsonConvert.SerializeObject(convertExpressCompany); - // //} - // //catch - // //{ - // // throw; - // //} - // //finally - // //{ - // // #region 店铺平台订单出库 - // // currentProgress = "店铺平台订单出库"; - // // orderBusiness.OutStock(new OutStockRequest() - // // { - // // AppKey = shop.AppKey, - // // AppSecret = shop.AppSecret, - // // AppToken = shop.AppToken, - // // OrderId = orderId, - // // TargetExpressId = convertExpressCompany?.ExpressId ?? string.Empty, //物流公司Id - // // TargetExpressName = convertExpressCompany?.ExpressName ?? string.Empty, //物流公司名称 - // // SourceExpressId = wayBillNoResponse.ExpressId, - // // SourceExpressName = wayBillNoResponse.ExpressName, - // // PurchaseOrderId = purchaseOrderId, - // // Platform = shop.PlatformId, - // // WayBillNo = wayBillNoResponse.WayBillNo - // // }); - // // #endregion - // //} - // //#endregion - - - // //#region 店铺平台订单出库 - // //currentProgress = "店铺平台订单出库"; - // //orderBusiness.OutStock(new OutStockRequest() - // //{ - // // //AppKey = shop.AppKey, - // // //AppSecret = shop.AppSecret, - // // //AppToken = shop.AppToken, - // // OrderId = orderId, - // // //TargetExpressId = convertExpressCompany?.ExpressId ?? string.Empty, //物流公司Id - // // //TargetExpressName = convertExpressCompany?.ExpressName ?? string.Empty, //物流公司名称 - // // SourceExpressId = wayBillNoResponse.ExpressId, - // // SourceExpressName = wayBillNoResponse.ExpressName, - // // PurchaseOrderId = purchaseOrderId, - // // //Platform = shop.PlatformId, - // // WayBillNo = wayBillNoResponse.WayBillNo - // //}); - // //#endregion - - - // nLogManager.Default().Info($"DeliveryCallback 回调平台{callbackPlatform},订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo},店铺平台物流公司列表:{expressCompanyListInfo},翻译后的物流公司:{expressCompanyInfo}"); - // } - // catch (Exception ex) - // { - // nLogManager.Default().Error(ex, $"DeliveryCallback 回调平台{callbackPlatform},订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo},店铺平台物流公司列表:{expressCompanyListInfo},翻译后的物流公司:{expressCompanyInfo}"); - // } - //} - - ///// - ///// 1688物流信息变更回调 - ///// - ///// - //private void LogisticsUpdateCallbackFrom1688(JObject jObject) - //{ - // Task.Factory.StartNew(() => - // { - // IList> updateOrderPurchaseSkuInfoList = new List>(); - // IList> updateOrderPurchaseInfoList = new List>(); - - // var statusChanged = jObject["data"]["OrderLogisticsTracingModel"].Value("statusChanged").ToUpper(); - // var orderLogsItems = jObject["data"]["OrderLogisticsTracingModel"]["orderLogsItems"].Children(); - - // var purchaseOrderIds = orderLogsItems.Select(x => x.Value("orderId")).Distinct().ToList(); - // var orderEntryIds = orderLogsItems.Select(x => x.Value("orderEntryId")).Distinct().ToList(); - - // var dbOrderPurchaseInfoList = fsql.Select().Where(opi => purchaseOrderIds.Contains(opi.PurchaseOrderId) && opi.IsEnabled == true).ToList(); - - // var dbOrderPurchaseSkuInfoList = fsql.Select() - // .WhereIf(purchaseOrderIds.Count() > 1, ops => purchaseOrderIds.Contains(ops.PurchaseOrderId)) - // .WhereIf(purchaseOrderIds.Count() == 1, ops => ops.PurchaseOrderId == purchaseOrderIds[0]) - // .ToList(); - - // var dbOrderPurchaseRelationInfoList = fsql.Select() - // .WhereIf(purchaseOrderIds.Count() > 1, opr => purchaseOrderIds.Contains(opr.PurchaseOrderId)) - // .WhereIf(purchaseOrderIds.Count() == 1, opr => opr.PurchaseOrderId == purchaseOrderIds[0]) - // .ToList(); - - // foreach (var orderEntryId in orderEntryIds) - // { - // var dbOrderPurchaseSkuInfo = dbOrderPurchaseSkuInfoList.FirstOrDefault(x => x.Id == orderEntryId); - // if (dbOrderPurchaseSkuInfo.ExpressState != statusChanged) - // { - // var update = fsql.Update(orderEntryId).Set(x => x.ExpressState, statusChanged) - // .Set(x => x.ExpressChangeTime, DateTime.Now); - // updateOrderPurchaseSkuInfoList.Add(update); - // dbOrderPurchaseSkuInfo.ExpressState = statusChanged; - // } - // } - - // if (statusChanged == "SIGN") - // { - // var groupsByPoIds = dbOrderPurchaseSkuInfoList.GroupBy(x => x.PurchaseOrderId); - // foreach (var group in groupsByPoIds) - // { - // var isSignAll = group.Count() == group.Where(x => x.ExpressState == "SIGN").Count(); - // if (isSignAll) - // { - // var dbOrderPurchaseInfo = dbOrderPurchaseInfoList.FirstOrDefault(x => x.PurchaseOrderId == group.Key && x.IsEnabled == true); - // if (dbOrderPurchaseInfo != null) - // { - // dbOrderPurchaseInfo.OrderState = Enums.PurchaseOrderState.已签收; - // updateOrderPurchaseInfoList.Add(fsql.Update().SetSource(dbOrderPurchaseInfo)); - // } - // } - - // #region 通知齐库 - // var relationList = dbOrderPurchaseRelationInfoList.Where(x => x.PurchaseOrderId == group.Key).ToList(); - // foreach (var relation in relationList) - // { - // try - // { - // restApiService.SendRequest("http://qiku.qiyue666.com", - // "/Api/PackPurchaseTask/UpdateAvailabilityState", - // new - // { - // availability = isSignAll ? 0 : 1, - // orderId = relation.OrderId, - // skuId = relation.SourceSkuId - // }, - // null, - // HttpMethod.Post); - // } - // catch (Exception ex) - // { - - // } - // } - // #endregion - // } - // } - - // if (updateOrderPurchaseSkuInfoList.Count() > 0 || updateOrderPurchaseInfoList.Count() > 0) - // { - // fsql.Transaction(() => - // { - // foreach (var update in updateOrderPurchaseSkuInfoList) - // update.ExecuteAffrows(); - // foreach (var update in updateOrderPurchaseInfoList) - // update.ExecuteAffrows(); - // }); - // } + private void OrderPayFrom1688(JObject jObject) + { + var purchaseOrderId = jObject["data"].Value("orderId"); + Task.Factory.StartNew(() => OrderPayCallback(purchaseOrderId, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + } + #endregion - // }, CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); - //} /// /// 采购平台改价回调 @@ -2154,122 +2470,12 @@ namespace BBWYB.Server.Business /// private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform) { - string currentProgress = string.Empty; - - try - { - var orderPurchaseInfo = fsql.Select().Where(opi => opi.PurchaseOrderId == purchaseOrderId).ToOne(); - if (orderPurchaseInfo == null) - throw new Exception($"采购单{purchaseOrderId}-未查询到采购单"); - - var purchaseAccount = fsqlManager.MDSfsql.Select().Where(pa => pa.Id == orderPurchaseInfo.PurchaseAccountId).ToOne(); - if (purchaseAccount == null) - throw new Exception($"采购单{purchaseOrderId}-未查询到采购账号{orderPurchaseInfo.PurchaseAccountId}"); - - var dbOrder = fsql.Select(orderPurchaseInfo.OrderId).ToOne(); - var dbOrderCost = fsql.Select(orderPurchaseInfo.OrderId).ToOne(); - if (dbOrderCost == null) - throw new Exception($"采购单{purchaseOrderId}-未查询到订单{orderPurchaseInfo.OrderId}的成本"); - - var dbOrderCostDetails = fsql.Select().Where(ocd => ocd.OrderId == dbOrder.Id && ocd.IsEnabled == true).ToList(); - if (dbOrderCostDetails.Count() == 0) - throw new Exception($"采购单{purchaseOrderId}-未查询到订单{orderPurchaseInfo.OrderId}的明细成本"); - - - var dbOrderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == orderPurchaseInfo.OrderId && opi.IsEnabled == true).ToList(); - if (dbOrderPurchaseInfoList.Count() == 0) - throw new Exception($"采购单{purchaseOrderId}-未查询到订单{orderPurchaseInfo.OrderId}的采购单集合"); - - var dbPurchaseOrderIdList = dbOrderPurchaseInfoList.Select(x => x.PurchaseOrderId).ToList(); - var dbOrderPurchaseRelationInfos = fsql.Select().Where(x => dbPurchaseOrderIdList.Contains(x.PurchaseOrderId)).ToList(); - if (dbOrderPurchaseRelationInfos.Count() == 0) - throw new Exception($"采购单{purchaseOrderId}-未查询到采购单关联明细,手动关联的采购单不支持改价"); - - var dbOrderSkus = fsql.Select().Where(osku => osku.OrderId == orderPurchaseInfo.OrderId).ToList(); - - List> updateOrderCostDetailList = new List>(); - IUpdate updateOrderCost = null; - - var client = ppPlatformClientFactory.GetClient(AdapterEnums.PlatformType.阿里巴巴); - - var totalPurchaseProductAmount = 0M; - var totalPurchaseFreight = 0M; - foreach (var opi in dbOrderPurchaseInfoList) - { - var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() - { - AppKey = purchaseAccount.AppKey, - AppSecret = purchaseAccount.AppSecret, - AppToken = purchaseAccount.AppToken, - OrderId = opi.PurchaseOrderId - }); - - 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 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); - } - - var dbOrderSkuDetail = dbOrderCostDetails.FirstOrDefault(ocd => ocd.SkuId == belongSkuId); - var orderSku = dbOrderSkus.FirstOrDefault(osku => osku.SkuId == belongSkuId); - //dbOrderSkuDetail.SkuAmount = currentOrderSkuProductAmount; - //dbOrderSkuDetail.PurchaseFreight = currentOrderSkuFreightAmount; - //dbOrderSkuDetail.TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount; - - dbOrderSkuDetail.CalculationOrderCostDetailCostAndProfit(orderSku.Price.Value * orderSku.ItemTotal.Value, - orderSku.BuyerPayFreight ?? 0M, - orderSku.InPackAmount ?? 0M, - currentOrderSkuProductAmount, - currentPurchaseFreight ?? 0M, - dbOrderSkuDetail.OutPackAmount ?? 0M, - dbOrderSkuDetail.DeliveryExpressFreight ?? 0M); - updateOrderCostDetailList.Add(fsql.Update().SetSource(dbOrderSkuDetail)); - } - - //dbOrderCost.TotalCost = dbOrderCost.PurchaseAmount = totalPurchaseAmount; - //dbOrderCost.Profit = dbOrder.OrderTotalPrice - - // dbOrderCost.PurchaseAmount - - // dbOrderCost.DeliveryExpressFreight; - - - dbOrderCost.CalculationOrderCostCostAndProfit(dbOrder.OrderTotalPrice ?? 0M, - totalPurchaseProductAmount, - totalPurchaseFreight, - dbOrderCostDetails.Sum(ocd => ocd.OutPackAmount ?? 0M), - dbOrderCostDetails.Sum(ocd => ocd.DeliveryExpressFreight ?? 0M)); - updateOrderCost = fsql.Update().SetSource(dbOrderCost); + OnSomeOnePurchaseOrderChanged(purchaseOrderId, true); + } - fsql.Transaction(() => - { - foreach (var update in updateOrderCostDetailList) - update.ExecuteAffrows(); - updateOrderCost?.ExecuteAffrows(); - }); - } - } - catch (Exception ex) - { - nLogManager.Default().Error(ex, $"OrderPriceModificationCallback 回调平台{callbackPlatform},采购单号{purchaseOrderId},执行进度[{currentProgress}]"); - } + private void OrderPayCallback(string purchaseOrderId, Enums.Platform callbackPlatform) + { + OnSomeOnePurchaseOrderChanged(purchaseOrderId, false); } public void KuaiDi100Publish(string param) @@ -2318,6 +2524,7 @@ namespace BBWYB.Server.Business IUpdate updatePurchaseExpressOrder = null; List> updateOrderPurchaseList = new List>(); List> updateOrderList = new List>(); + List insertTimeLimitTaskList = new List(); #region 查询该笔快递单 var tpeo = fsql.Select(wayBillNo).ToOne(); @@ -2339,9 +2546,11 @@ namespace BBWYB.Server.Business var orderList = fsql.Select(orderIds).ToList(o => new Order { Id = o.Id, + OrderSn = o.OrderSn, ShopId = o.ShopId, OrderState = o.OrderState, - IntoStoreType = o.IntoStoreType + IntoStoreType = o.IntoStoreType, + SourceShopName = o.SourceShopName }); if (orderList.Count() == 0) throw new Exception("未查询到任何订单"); @@ -2400,6 +2609,12 @@ namespace BBWYB.Server.Business updatePurchaseExpressOrder = fsql.Update().SetSource(tpeo); #endregion + #region 查询入库单信息 + IList inStoreOrderRelationList = null; + if (orderList.Any(o => o.IntoStoreType == Enums.IntoStoreType.厂商代发入仓) && state == "QianShou") + inStoreOrderRelationList = fsql.Select().Where(i => orderIds.Contains(i.OrderId)).ToList(); + #endregion + #region 计算订单状态和采购单状态 foreach (var order in orderList) { @@ -2415,18 +2630,18 @@ namespace BBWYB.Server.Business temp.ExpressState = state; var oldPurchaseOrderState = purchaseOrder.OrderState; - purchaseOrder.CalculationOrderState(fsql, currentPurchaseOrderSkuList, currentPurchaseExpressOrderList); + purchaseOrder.CalculationOrderState(order.IntoStoreType.Value, fsql, currentPurchaseOrderSkuList, currentPurchaseExpressOrderList); if (purchaseOrder.OrderState != oldPurchaseOrderState) { var update = fsql.Update(purchaseOrder.Id).Set(po => po.OrderState, purchaseOrder.OrderState); updateOrderPurchaseList.Add(update); #region 通知齐库打包落仓情况 - if (order.IntoStoreType == Enums.IntoStoreType.发回齐越) + if (order.IntoStoreType == Enums.IntoStoreType.发回齐越 && state == "QianShou") { var currentOrderPurchaseRelationList = orderPurchaseRelationList.Where(opri => opri.PurchaseOrderId == purchaseOrder.PurchaseOrderId).ToList(); - Task.Factory.StartNew(() => qiKuManager.PublishQiKu(purchaseOrder, currentOrderPurchaseRelationList, currentPurchaseOrderSkuList, purchaseExpressOrderList), + Task.Factory.StartNew(() => qiKuManager.PublishQiKuReceiveInfo(purchaseOrder, currentOrderPurchaseRelationList, currentPurchaseOrderSkuList, purchaseExpressOrderList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); @@ -2436,7 +2651,95 @@ namespace BBWYB.Server.Business } var oldOrderState = order.OrderState; - order.CalculationOrderState(fsql, currentOrderSkuList, currentPurchaseOrderList); + + 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(); + } + } + + Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + #endregion + } + #endregion + } + else + { + order.CalculationOrderState(fsql, out _, currentOrderSkuList, currentPurchaseOrderList); + } + if (order.OrderState != oldOrderState) { var update = fsql.Update(order.Id).Set(o => o.OrderState, order.OrderState); @@ -2445,6 +2748,29 @@ namespace BBWYB.Server.Business #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, + Id = idGenerator.NewLong(), + OrderId = order.Id, + //SkuId = orderSku.SkuId, + OrderSn = order.OrderSn, + ShopId = order.ShopId, + TaskType = Enums.TimeLimitTaskType.待核算任务, + ExpirationTime = DateTime.Now.AddDays(1) + }; + insertTimeLimitTaskList.Add(t); + } + } + #endregion } } #endregion @@ -2463,6 +2789,8 @@ namespace BBWYB.Server.Business foreach (var update in updateOrderList) update.ExecuteAffrows(); } + if (insertTimeLimitTaskList.Count() > 0) + fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows(); }); #endregion } @@ -2472,7 +2800,239 @@ namespace BBWYB.Server.Business } } - private void SendDingDingOnKD100SubscribeFail(string content) + /// + /// 采购单信息变更(改价,付款) + /// + /// 采购单Id + /// 当不需要触发订单改价时是否继续走流程 + private void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce) + { + bool isEditOrderPrice = true; + try + { + var orderPurchaseInfo = fsql.Select().Where(opi => opi.PurchaseOrderId == purchaseOrderId && opi.IsEnabled == true).ToOne(); + if (orderPurchaseInfo == null) + throw new Exception($"采购单{purchaseOrderId}-未查询到采购单"); + + var dbOrder = fsql.Select(orderPurchaseInfo.OrderId).ToOne(); + + var dbOrderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == orderPurchaseInfo.OrderId && opi.IsEnabled == true).ToList(); + if (dbOrderPurchaseInfoList.Count() == 0) + throw new Exception($"采购单{purchaseOrderId}-未查询到订单{orderPurchaseInfo.OrderId}的采购单集合"); + + isEditOrderPrice = dbOrderPurchaseInfoList.Count() == dbOrderPurchaseInfoList.Count(opi => opi.PurchasePlatform == Enums.Platform.阿里巴巴 && + opi.PurchaseMethod == Enums.PurchaseMethod.线上采购) && + dbOrder.OrderState != Enums.OrderState.已取消 && + dbOrder.OrderState != Enums.OrderState.部分采购; + + if (!keepRunWhenNoEditOrderPirce && !isEditOrderPrice) + return; + + var dbOrderCost = fsql.Select(dbOrder.Id).ToOne(); + if (dbOrderCost == null) + throw new Exception($"采购单{purchaseOrderId}-未查询到订单{dbOrder.Id}的成本"); + + var purchaseAccount = fsqlManager.MDSfsql.Select().Where(pa => pa.Id == orderPurchaseInfo.PurchaseAccountId).ToOne(); + if (purchaseAccount == null) + throw new Exception($"采购单{purchaseOrderId}-未查询到采购账号{orderPurchaseInfo.PurchaseAccountId}"); + + var shop = fsqlManager.MDSfsql.Select().Where(s => s.ShopId == dbOrder.ShopId.ToString()).ToOne(); + + var dbOrderCostDetails = fsql.Select().Where(ocd => ocd.OrderId == dbOrder.Id && ocd.IsEnabled == true).ToList(); + if (dbOrderCostDetails.Count() == 0) + throw new Exception($"采购单{purchaseOrderId}-未查询到订单{orderPurchaseInfo.OrderId}的明细成本"); + + var dbPurchaseOrderIdList = dbOrderPurchaseInfoList.Select(x => x.PurchaseOrderId).ToList(); + var dbOrderPurchaseRelationInfos = fsql.Select().Where(x => dbPurchaseOrderIdList.Contains(x.PurchaseOrderId)).ToList(); + if (dbOrderPurchaseRelationInfos.Count() == 0) + throw new Exception($"采购单{purchaseOrderId}-未查询到采购单关联明细"); + + var dbOrderSkus = fsql.Select().Where(osku => osku.OrderId == dbOrder.Id).ToList(); + var dbOrderSkuCostList = fsql.Select().Where(osc => osc.OrderId == dbOrder.Id).ToList(); + + + List> updateOrderCostDetailList = new List>(); + IUpdate updateOrderCost = null; + + IList> updateOrderSkuList = new List>(); + IUpdate updateOrder = null; + + List insertOrderSkuCostList = new List(); + IList> updateOrderSkuCostList = new List>(); + + IList op_EditPriceSkuRequests = new List(); + + IUpdate updatePurchaseOrder = null; + + var ppclient = ppPlatformClientFactory.GetClient(AdapterEnums.PlatformType.阿里巴巴); + + var totalPurchaseProductAmount = 0M; + var totalPurchaseFreight = 0M; + foreach (var opi in dbOrderPurchaseInfoList) + { + if (opi.PurchasePlatform != Enums.Platform.阿里巴巴) + continue; + + var purchaseOrderSimpleInfo = ppclient.QueryOrderDetail(new PP_QueryOrderDetailRequest() + { + AppKey = purchaseAccount.AppKey, + AppSecret = purchaseAccount.AppSecret, + AppToken = purchaseAccount.AppToken, + OrderId = opi.PurchaseOrderId + }); + + 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 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) + { + orderSku.Price = currentOrderSkuProductAmount / orderSku.ItemTotal; + 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) + { + dbOrder.OrderTotalPrice = totalPurchaseProductAmount + totalPurchaseFreight; + dbOrder.OrderSellerPrice = totalPurchaseProductAmount; + dbOrder.FreightPrice = totalPurchaseFreight; + updateOrder = fsql.Update(dbOrder.Id).Set(o => o.OrderTotalPrice, dbOrder.OrderTotalPrice) + .Set(o => o.OrderSellerPrice, dbOrder.OrderSellerPrice) + .Set(o => o.FreightPrice, dbOrder.FreightPrice); + + updatePurchaseOrder = fsql.Update(orderPurchaseInfo.Id).Set(opi => opi.IsAutoEditOrderPrice, Enums.AutoEditOrderPriceType.已平价); + } + + #region 订单Sku成本 + foreach (var orderSku in dbOrderSkus) + { + var orderSkuCost = dbOrderSkuCostList.FirstOrDefault(osc => osc.SkuId == orderSku.SkuId); + if (orderSkuCost == null) + { + orderSkuCost = new OrderSkuCost() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + OrderId = dbOrder.Id, + SkuId = orderSku.SkuId + }; + orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, dbOrderCostDetails); + insertOrderSkuCostList.Add(orderSkuCost); + } + else + { + orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, dbOrderCostDetails); + var update = fsql.Update().SetSource(orderSkuCost); + updateOrderSkuCostList.Add(update); + } + } + #endregion + + #region 订单成本 + dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, dbOrderSkuCostList.Union(insertOrderSkuCostList).ToList()); + //dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice ?? 0M, + // totalPurchaseProductAmount, + // totalPurchaseFreight, + // dbOrderCostDetails.Sum(ocd => ocd.OutPackAmount ?? 0M), + // dbOrderCostDetails.Sum(ocd => ocd.DeliveryExpressFreight ?? 0M)); + updateOrderCost = fsql.Update().SetSource(dbOrderCost); + #endregion + + fsql.Transaction(() => + { + updatePurchaseOrder?.ExecuteAffrows(); + foreach (var update in updateOrderCostDetailList) + update.ExecuteAffrows(); + updateOrderCost?.ExecuteAffrows(); + foreach (var update in updateOrderSkuList) + update.ExecuteAffrows(); + updateOrder?.ExecuteAffrows(); + if (insertOrderSkuCostList.Count() > 0) + fsql.Insert(insertOrderSkuCostList).ExecuteAffrows(); + if (updateOrderSkuCostList.Count() > 0) + { + foreach (var update in updateOrderSkuCostList) + update.ExecuteAffrows(); + } + }); + + if (isEditOrderPrice) + { + #region 通知拳探改价 + var opclient = opPlatformClientFactory.GetClient(AdapterEnums.PlatformType.拳探); + opclient.EditPrice(new OP_EditPriceRequest() + { + AppKey = shop.AppKey, + AppSecret = shop.AppSecret, + AppToken = shop.AppToken, + OrderId = dbOrder.Id, + EditItems = op_EditPriceSkuRequests + }); + #endregion + + #region 通知C端改价 + restApiService.SendRequest("https://bbwy.qiyue666.com", + "/Api/PurchaseOrder/QuanTanEditPriceCallback", + new { orderId = dbOrder.Id }, + null, + HttpMethod.Post); + #endregion + } + } + catch (Exception ex) + { + nLogManager.Default().Error(ex, $"OrderPriceModificationCallback 采购单号{purchaseOrderId}"); + } + } + + private void SendDingDing(string content) { try { @@ -2498,5 +3058,6 @@ namespace BBWYB.Server.Business } } + } } diff --git a/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs b/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs index 9fa4e91..2a76e38 100644 --- a/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs +++ b/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs @@ -27,6 +27,10 @@ namespace BBWYB.Server.Business private IDictionary _1688ProductDetailRequestHeader; + private List _1688ColorPropertyFieldIdList; + private List locationIdList; + private List priceIdList; + public PurchaseProductAPIService(RestApiService restApiService, IMemoryCache memoryCache) { this.memoryCache = memoryCache; @@ -40,6 +44,16 @@ namespace BBWYB.Server.Business { "Accept-Language","zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"} }; purchaseProductCacheTimeSpan = TimeSpan.FromDays(1); + _1688ColorPropertyFieldIdList = new List() { 3216, 1627207, 1234, 3151, 7853, 446, 374, 404, 100019516, 3114, 2068 }; + //jobject["data"]["1081181309101"] != null ? + // jobject["data"]["1081181309101"]["data"]["location"].ToString() : + // jobject["data"]["16347413030323"]["data"]["location"].ToString(), + locationIdList = new List() { "1081181309101", "16347413030323", "13772573013156" }; + + //var firstPrice = jobject["data"]["1081181309582"] != null ? + // jobject["data"]["1081181309582"]["data"]["priceModel"]["currentPrices"][0].Value("price") : + // jobject["data"]["16347413030316"]["data"]["priceModel"]["currentPrices"][0].Value("price"); + priceIdList = new List() { "1081181309582", "1081181309582", "16347413030316", "13772573013151" }; } public PurchaseSkuBasicInfoResponse GetProductInfo(PurchaseSkuBasicInfoRequest request) @@ -193,31 +207,43 @@ namespace BBWYB.Server.Business var jsonStr = match.Groups[2].Value; var jobject = JObject.Parse(jsonStr); - //16347413030323 + var location = ""; + for (var i = 0; i < locationIdList.Count(); i++) + { + if (jobject["data"][locationIdList[i]] != null) + { + location = jobject["data"][locationIdList[i]]["data"]["location"].ToString(); + break; + } + } var purchaser = new Purchaser() { Id = jobject["globalData"]["tempModel"]["sellerUserId"].ToString(), + Id2 = jobject["globalData"]["tempModel"]["sellerLoginId"]?.ToString(), Name = jobject["globalData"]["tempModel"]["companyName"].ToString(), - Location = jobject["data"]["1081181309101"] != null ? - jobject["data"]["1081181309101"]["data"]["location"].ToString() : - jobject["data"]["16347413030323"]["data"]["location"].ToString(), + Location = location, Platform = Enums.Platform.阿里巴巴 }; - - var colorsProperty = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(j => j.Value("fid") == 3216 || - j.Value("fid") == 1627207 || - j.Value("fid") == 1234 || - j.Value("fid") == 3151)["value"] - .Children() - .Select(j => new - { - name = j.Value("name"), - imageUrl = j.Value("imageUrl") - }).ToList(); - - var firstPrice = jobject["data"]["1081181309582"] != null ? - jobject["data"]["1081181309582"]["data"]["priceModel"]["currentPrices"][0].Value("price") : - jobject["data"]["16347413030316"]["data"]["priceModel"]["currentPrices"][0].Value("price"); + var fidJToken = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(j => _1688ColorPropertyFieldIdList.Contains(j.Value("fid"))); + if (fidJToken == null) + fidJToken = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(j => j.Value("prop").Contains("颜色")); + if (fidJToken == null && jobject["globalData"]["skuModel"]["skuProps"].Children().Count() == 1) + fidJToken = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(); + var colorsProperty = fidJToken["value"].Children() + .Select(j => new + { + name = j.Value("name"), + imageUrl = j.Value("imageUrl") + }).ToList(); + var firstPrice = 0.0M; + for (var i = 0; i < priceIdList.Count(); i++) + { + if (jobject["data"][priceIdList[i]] != null) + { + firstPrice = jobject["data"][priceIdList[i]]["data"]["priceModel"]["currentPrices"][0].Value("price"); + break; + } + } var list = new List(); diff --git a/BBWYB.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs b/BBWYB.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs index 54d8390..2347173 100644 --- a/BBWYB.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs +++ b/BBWYB.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs @@ -30,6 +30,7 @@ namespace BBWYB.Server.Business addPurchaserList.Add(new Purchaser() { Id = scheme.PurchaserId, + Id2 = scheme.PurchaserId2, Name = scheme.PurchaserName, Location = scheme.PurchaserLocation, Platform = scheme.PurchasePlatform @@ -163,6 +164,7 @@ namespace BBWYB.Server.Business SkuId = ps.SkuId, ShopId = ps.ShopId, PurchaserId = p.Id, + PurchaserId2 = p.Id2, PurchaserName = p.Name, PurchaserLocation = p.Location, DefaultCost = ps.DefaultCost, diff --git a/BBWYB.Server.Business/QiKuManager.cs b/BBWYB.Server.Business/QiKuManager.cs index 8a93d99..3788bdf 100644 --- a/BBWYB.Server.Business/QiKuManager.cs +++ b/BBWYB.Server.Business/QiKuManager.cs @@ -1,22 +1,42 @@ 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 Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using System.Text; +using Yitter.IdGenerator; namespace BBWYB.Server.Business { - public class QiKuManager : IDenpendency + public class QiKuManager : BaseBusiness, IDenpendency { private RestApiService restApiService; - private IFreeSql fsql; - public QiKuManager(RestApiService restApiService, IFreeSql fsql) + private List hgzTaskTypeList; + + private Lazy dingDingBusinessLazy; + private Lazy venderBusinessLazy; + + private DingDingBusiness dingDingBusiness => dingDingBusinessLazy.Value; + private VenderBusiness venderBusiness => venderBusinessLazy.Value; + + public QiKuManager(RestApiService restApiService, IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, IServiceProvider serviceProvider) : base(fsql, nLogManager, idGenerator) { this.restApiService = restApiService; - this.fsql = fsql; + hgzTaskTypeList = new List() + { + Enums.TimeLimitTaskType.合格证拟定任务, + Enums.TimeLimitTaskType.合格证补充任务 + }; + this.dingDingBusinessLazy = new Lazy(() => serviceProvider.GetService()); + this.venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); } /// - /// 通知齐库 + /// 通知齐库到货情况 /// 支持关联的采购平台以来源SKU为单位通知齐库 /// 不支持关联的采购平台以采购单为单位通知齐库 /// @@ -24,10 +44,10 @@ namespace BBWYB.Server.Business /// /// /// - public void PublishQiKu(OrderPurchaseInfo orderPurchaseInfo, - IList orderPurchaseRelationInfoList, - IList orderPurchaseSkuInfoList, - IList purchaseExpressOrderList) + public void PublishQiKuReceiveInfo(OrderPurchaseInfo orderPurchaseInfo, + IList orderPurchaseRelationInfoList, + IList orderPurchaseSkuInfoList, + IList purchaseExpressOrderList) { if (orderPurchaseInfo.PurchasePlatform == Enums.Platform.阿里巴巴) PublishQiKuByRelation(orderPurchaseRelationInfoList, orderPurchaseSkuInfoList, purchaseExpressOrderList); @@ -114,5 +134,183 @@ namespace BBWYB.Server.Business } } + + + /// + /// 查询齐库合格证 + /// + /// + /// + /// + public void SearchCerConfigured(Order order, IList packTaskSkuPurchaseSchemeIdList, IList orderSkuList) + { + try + { + nLogManager.Default().Info($"SearchCerConfigured OrderId {order.Id}, packTaskSkuPurchaseSchemeIdList {JsonConvert.SerializeObject(packTaskSkuPurchaseSchemeIdList)}"); + var restApiResult = restApiService.SendRequest("http://qiku.qiyue666.com", "api/PackPurchaseTask/SearchCerConfigured", new + { + orderId = order.Id, + packTaskSkuPurchaseSchemeIdList + }, null, HttpMethod.Post); + + if (restApiResult.StatusCode != System.Net.HttpStatusCode.OK) + throw new Exception(restApiResult.Content); + var response = JsonConvert.DeserializeObject>(restApiResult.Content); + if (!response.Success) + throw new Exception(response.Msg); + + if (response.Data.PackTaskSkuPurchaseSchemeIdList != null && response.Data.PackTaskSkuPurchaseSchemeIdList.Count() > 0) + { + IList> updateOrderSkuList = new List>(); + List insertTimeLimitTaskList = new List(); + + var dbTimeLimitTaskList = fsql.Select().Where(t => t.OrderId == order.Id && + t.TaskType == Enums.TimeLimitTaskType.合格证拟定任务).ToList(); + foreach (var skuConfigured in response.Data.PackTaskSkuPurchaseSchemeIdList) + { + var orderSku = orderSkuList.FirstOrDefault(osku => osku.BelongSkuId == skuConfigured.SkuId); + if (orderSku == null) + continue; + var oldPackState = orderSku.PackConfigState ?? Enums.PackConfigState.待配置; + var qiKuPackState = skuConfigured.IsConfiguredCer ? Enums.PackConfigState.已配置 : Enums.PackConfigState.待配置; + if (oldPackState != qiKuPackState) + { + orderSku.PackConfigState = qiKuPackState; + var update = fsql.Update(orderSku.Id).Set(osku => osku.PackConfigState, qiKuPackState); + updateOrderSkuList.Add(update); + } + + if (qiKuPackState == Enums.PackConfigState.待配置 && order.ShopId != 9 && !dbTimeLimitTaskList.Any(t => t.SkuId == orderSku.SkuId)) + { + //创建合格证拟定任务 + var t = new TimeLimitTask() + { + CreateTme = DateTime.Now, + Id = idGenerator.NewLong(), + OrderId = order.Id, + SkuId = orderSku.SkuId, + OrderSn = order.OrderSn, + ShopId = order.ShopId, + TaskType = Enums.TimeLimitTaskType.合格证拟定任务, + ExpirationTime = DateTime.Now.AddDays(1), + }; + insertTimeLimitTaskList.Add(t); + } + } + + fsql.Transaction(() => + { + if (updateOrderSkuList.Count() > 0) + { + foreach (var update in updateOrderSkuList) + update.ExecuteAffrows(); + } + if (insertTimeLimitTaskList.Count() > 0) + fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows(); + }); + } + } + catch (Exception ex) + { + nLogManager.Default().Error(ex, $"SearchCerConfigured\r\n{JsonConvert.SerializeObject(new { order.Id, packTaskSkuPurchaseSchemeIdList })}"); + } + } + + + /// + /// 齐库推送sku配置状态 + /// + /// + public void QikuPublishOrderSkuPackConfigState(QikuPublishOrderSkuPackConfigStateRequest request) + { + var order = fsql.Select(request.OrderId).ToOne(); + if (order == null) + throw new BusinessException($"未查询到订单{request.OrderId}"); + + if (request.PackConfigState == Enums.PackConfigState.需修改 && order.ShopId != 9) + return; + + var orderSku = fsql.Select().Where(osku => osku.OrderId == request.OrderId && osku.BelongSkuId == request.SkuId).ToOne(); + if (orderSku == null) + throw new BusinessException($"未查询到订单来源sku{request.SkuId}"); + + + IInsert insertTimeLimitTask = null; + IUpdate updateTimeLimitTask = null; + IUpdate updateOrderSku = null; + + if (orderSku.PackConfigState != request.PackConfigState) + { + //updateOrderSku = fsql.Select() + // .InnerJoin((osku, o) => osku.OrderId == o.Id) + // .Where((osku, o) => o.OrderState != Enums.OrderState.已取消 && + // o.IntoStoreType == Enums.IntoStoreType.发回齐越 && + // osku.SkuId == orderSku.SkuId && + // osku.PackConfigState != request.PackConfigState) + // .ToUpdate() + // .Set(osku => osku.PackConfigState, request.PackConfigState); + updateOrderSku = fsql.Update(orderSku.Id).Set(osku => osku.PackConfigState, request.PackConfigState); + } + + if (request.PackConfigState == Enums.PackConfigState.需修改) + { + var isExists = fsql.Select().Where(t => t.OrderId == request.OrderId && + t.SkuId == orderSku.SkuId && + t.CompletionTime == null && + t.TaskType == Enums.TimeLimitTaskType.合格证补充任务) + .Any(); + if (!isExists) + { + var t = new TimeLimitTask() + { + CreateTme = DateTime.Now, + Id = idGenerator.NewLong(), + OrderId = request.OrderId, + SkuId = orderSku.SkuId, + OrderSn = order.OrderSn, + ShopId = order.ShopId, + TaskType = Enums.TimeLimitTaskType.合格证补充任务 + }; + if (DateTime.Now.Hour < 16) + t.ExpirationTime = DateTime.Now.AddHours(2); + else + t.ExpirationTime = DateTime.Now.Date.AddDays(1).AddHours(13); + insertTimeLimitTask = fsql.Insert(t); + + #region 发送钉钉通知 + try + { + var shop = venderBusiness.GetShopList(order.ShopId.Value).FirstOrDefault(); + var content = new StringBuilder(); + content.AppendLine($"拳探店铺:{shop?.ShopName}"); + content.AppendLine($"订单号:{order.OrderSn}"); + content.AppendLine($"拳探SKU:{orderSku.SkuId}"); + content.AppendLine("信息:需补充合格证信息"); + dingDingBusiness.SendDingDingBotMessage("SECf32e6111bb4bd633cfe44cf0c1d4c3384cda4b91096bcdd962402fdfd67f31c6", + "https://oapi.dingtalk.com/robot/send?access_token=c87a037e038ec38e379ad5bc6fe50adc679ba89d4957f8fc5396e15fbc3a9df7", + content.ToString()); + } + catch { } + #endregion + } + } + else if (request.PackConfigState == Enums.PackConfigState.已配置) + { + + updateTimeLimitTask = fsql.Update().Set(t => t.CompletionTime, DateTime.Now) + .Set(t => t.IsTimely == (DateTime.Now < t.ExpirationTime ? true : false)) + .Where(t => t.OrderId == request.OrderId) + .Where(t => t.SkuId == orderSku.SkuId) + .Where(t => t.CompletionTime == null) + .Where(t => hgzTaskTypeList.Contains(t.TaskType)); + } + + fsql.Transaction(() => + { + insertTimeLimitTask?.ExecuteAffrows(); + updateTimeLimitTask?.ExecuteAffrows(); + updateOrderSku?.ExecuteAffrows(); + }); + } } } diff --git a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs index 67e235d..6f2ef91 100644 --- a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs +++ b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs @@ -5,6 +5,7 @@ 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; @@ -74,12 +75,21 @@ namespace BBWYB.Server.Business.Sync var qtOrderIdList = qtOrderList.Items.Select(qto => qto.OrderId).ToList(); var dbOrderList = fsql.Select(qtOrderIdList).ToList(); + //采购限时任务列表 + var payedQTOrderIdList = qtOrderList.Items.Where(qto => qto.IsPay).Select(qto => qto.OrderId).ToList(); + + var dbPurchaseTimeLimitTaskList = fsql.Select().Where(t => t.TaskType == Enums.TimeLimitTaskType.采购任务 && + payedQTOrderIdList.Contains(t.OrderId)).ToList(); + List insertOrderList = new List(); List insertOrderSkuList = new List(); List insertOrderConsigneeList = new List(); + List insertTimeLimitTaskList = new List(); + List deleteTimeLimitTaskOrderIdList = new List(); List> updateOrderList = new List>(); + foreach (var qtOrder in qtOrderList.Items) { var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == qtOrder.OrderId); @@ -113,7 +123,8 @@ namespace BBWYB.Server.Business.Sync OrderState = orderState, ClientOrderId = qtOrder.ClientOrderId, BuyerAccount = qtOrder.UserAccount, - InPackAmount = qtOrder.PackAmount + InPackAmount = qtOrder.PackAmount, + PayTime = qtOrder.PayTime, }; JArray belongSkus = null; if (!string.IsNullOrEmpty(qtOrder.Extended)) @@ -178,45 +189,43 @@ namespace BBWYB.Server.Business.Sync } else { - Enums.OrderState? updateOrderState = null; - var updateModifyTime = false; - var updateBuyerRemark = false; - var updateVenderRemark = false; - var updateBuyerAccount = false; - var updateOrderSn = false; - #region 订单状态脱离拳探 只处理付款和取消 + Enums.OrderState? updateOrderState = null; if (dbOrder.OrderState == Enums.OrderState.待付款 && orderState != Enums.OrderState.待付款) updateOrderState = Enums.OrderState.等待采购; if (dbOrder.OrderState != Enums.OrderState.已取消 && orderState == Enums.OrderState.已取消) + { updateOrderState = Enums.OrderState.已取消; + if (dbPurchaseTimeLimitTaskList.Any(t => t.OrderId == qtOrder.OrderId)) + deleteTimeLimitTaskOrderIdList.Add(qtOrder.OrderId); + } + #endregion - if (dbOrder.ModifyTime != qtOrder.ModifyTime) - updateModifyTime = true; - if (dbOrder.BuyerRemark != qtOrder.BuyerRemark) - updateBuyerRemark = true; - if (dbOrder.VenderRemark != qtOrder.VenderRemark) - updateVenderRemark = true; - if (dbOrder.BuyerAccount != qtOrder.UserAccount) - updateBuyerAccount = true; - if (dbOrder.OrderSn != qtOrder.OrderSn) - updateOrderSn = true; - - if (updateOrderState != null || updateModifyTime || updateBuyerRemark || updateVenderRemark || updateBuyerAccount || updateOrderSn) + var updateModifyTime = dbOrder.ModifyTime != qtOrder.ModifyTime; + var updateBuyerRemark = dbOrder.BuyerRemark != qtOrder.BuyerRemark; + var updateVenderRemark = dbOrder.VenderRemark != qtOrder.VenderRemark; + var updateBuyerAccount = dbOrder.BuyerAccount != qtOrder.UserAccount; + var updateOrderSn = dbOrder.OrderSn != qtOrder.OrderSn; + var updatePayTime = dbOrder.PayTime != qtOrder.PayTime; + + if (updateOrderState != null || updateModifyTime || updateBuyerRemark || updateVenderRemark || updateBuyerAccount || updateOrderSn || updatePayTime) { - var update = fsql.Update(dbOrder.Id).SetIf(updateOrderState != null, o => o.OrderState, orderState) + var update = fsql.Update(dbOrder.Id).SetIf(updateOrderState != null, o => o.OrderState, updateOrderState) .SetIf(updateModifyTime, o => o.ModifyTime, qtOrder.ModifyTime) .SetIf(updateBuyerRemark, o => o.BuyerRemark, qtOrder.BuyerRemark) .SetIf(updateVenderRemark, o => o.VenderRemark, qtOrder.VenderRemark) .SetIf(updateBuyerAccount, o => o.BuyerAccount, qtOrder.UserAccount) - .SetIf(updateOrderSn, o => o.OrderSn, qtOrder.OrderSn); + .SetIf(updateOrderSn, o => o.OrderSn, qtOrder.OrderSn) + .SetIf(updatePayTime, o => o.PayTime, qtOrder.PayTime); updateOrderList.Add(update); } } } + CheckPurchaseTimeLimitTask(shopId, qtOrderList.Items, dbPurchaseTimeLimitTaskList, insertTimeLimitTaskList); + fsql.Transaction(() => { if (insertOrderList.Count > 0) @@ -228,9 +237,15 @@ namespace BBWYB.Server.Business.Sync if (insertOrderConsigneeList.Count() > 0) fsql.Insert(insertOrderConsigneeList).ExecuteAffrows(); + if (insertTimeLimitTaskList.Count() > 0) + fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows(); + if (updateOrderList.Count() > 0) foreach (var update in updateOrderList) update.ExecuteAffrows(); + + if (deleteTimeLimitTaskOrderIdList.Count() > 0) + fsql.Delete().Where(t => deleteTimeLimitTaskOrderIdList.Contains(t.OrderId)).ExecuteAffrows(); }); } catch (Exception ex) @@ -239,6 +254,55 @@ namespace BBWYB.Server.Business.Sync } } + private void CheckPurchaseTimeLimitTask(long shopId, IList orderList, IList dbTimeLimits, List insertTimeLimitTasks) + { + foreach (var order in orderList) + { + if (!order.IsPay || order.PayTime == null || order.OrderState == "-1") + continue; + var waitInserTimeLimitTasks = order.OrderSkuList.Where(osku => !dbTimeLimits.Any(x => x.OrderId == order.OrderId && x.SkuId == osku.SkuId)) + .Select(osku => new TimeLimitTask() + { + Id = idGenerator.NewLong(), + CreateTme = DateTime.Now, + OrderId = order.OrderId, + OrderSn = order.OrderSn, + SkuId = osku.SkuId, + TaskType = Enums.TimeLimitTaskType.采购任务, + ShopId = shopId, + ExpirationTime = CalculationPurcashTimeLimitTaskExpirationTime(order.PayTime.Value), + PayTime = order.PayTime + }).ToList(); + if (waitInserTimeLimitTasks != null && waitInserTimeLimitTasks.Count() > 0) + insertTimeLimitTasks.AddRange(waitInserTimeLimitTasks); + } + } + + /// + /// 计算采购限时任务的到期时间 + /// + /// 付款时间 + /// + private DateTime CalculationPurcashTimeLimitTaskExpirationTime(DateTime payTime) + { + var addDays = 0; + if (payTime.DayOfWeek == DayOfWeek.Sunday || + payTime.DayOfWeek == DayOfWeek.Monday || + payTime.DayOfWeek == DayOfWeek.Tuesday || + payTime.DayOfWeek == DayOfWeek.Wednesday || + payTime.DayOfWeek == DayOfWeek.Thursday || + payTime.DayOfWeek == DayOfWeek.Friday) + { + if (payTime.Hour >= 0 && payTime.Hour < 15) + addDays = 0; //当日 + else + addDays = payTime.DayOfWeek == DayOfWeek.Friday ? 2 : 1; //次日,星期五是后天 + } + else if (payTime.DayOfWeek == DayOfWeek.Saturday) + addDays = 1; + return payTime.Date.AddDays(addDays).AddHours(16); + } + private Enums.OrderState? ConvertQuanTanOrderState(string qtOrderState, bool isPay, bool isPurchased) { /* diff --git a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs new file mode 100644 index 0000000..4a016b8 --- /dev/null +++ b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs @@ -0,0 +1,140 @@ +using BBWYB.Common.Log; +using BBWYB.Common.Models; +using BBWYB.Server.Model; +using BBWYB.Server.Model.Db; +using BBWYB.Server.Model.Dto; +using Yitter.IdGenerator; + +namespace BBWYB.Server.Business +{ + public class TimeLimitTaskBusiness : BaseBusiness, IDenpendency + { + private VenderBusiness venderBusiness; + private List hgzTaskTypeList; + public TimeLimitTaskBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, VenderBusiness venderBusiness) : base(fsql, nLogManager, idGenerator) + { + this.venderBusiness = venderBusiness; + hgzTaskTypeList = new List() + { + Enums.TimeLimitTaskType.合格证拟定任务, + Enums.TimeLimitTaskType.合格证补充任务 + }; + } + public void CheckTask() + { + fsql.Update().Set(t => t.IsTimely, false) + .Where(t => t.CompletionTime == null) + .Where(t => t.ExpirationTime < DateTime.Now) + .ExecuteAffrows(); + } + + + public TimeLimitTaskListResponse QueryTimeLimitTask(QueryTimeLimitTaskRequest request) + { + if (request.StartDate > request.EndDate) + throw new BusinessException("开始时间不能大于结束时间"); + if (request.PageSize > 100) + request.PageSize = 100; + + var shopList = venderBusiness.GetShopList(request.ShopId, Model.Enums.Platform.拳探); + + request.EndDate = request.EndDate.Date.AddDays(1).AddSeconds(-1); + var list = fsql.Select().WhereIf(request.ShopId != null, t => t.ShopId == request.ShopId) + .Where(t => t.CreateTme >= request.StartDate && t.CreateTme <= request.EndDate) + .WhereIf(request.IsCompleted != null && request.IsCompleted == 1, t => t.CompletionTime != null) + .WhereIf(request.IsCompleted != null && request.IsCompleted == 0, t => t.CompletionTime == null) + .WhereIf(request.IsTimeOut != null && request.IsTimeOut == 1, t => t.IsTimely == false) + .WhereIf(request.IsTimeOut != null && request.IsTimeOut == 0, t => t.IsTimely == true || t.IsTimely == null) + .WhereIf(request.TimeLimitTaskType != null, t => t.TaskType == request.TimeLimitTaskType) + .OrderByDescending(t => t.CreateTme) + .Count(out var count) + .Page(request.PageIndex, request.PageSize) + .ToList(); + foreach (var task in list) + { + var shopId = task.ShopId.ToString(); + task.ShopName = shopList.FirstOrDefault(s => s.ShopId == shopId)?.ShopName; + } + return new TimeLimitTaskListResponse() + { + Count = count, + ItemList = list + }; + } + + public IList TimeOutStatistics(QueryTimeOutRequest request) + { + if (request.StartDate > request.EndDate) + throw new BusinessException("开始时间不能大于结束时间"); + request.EndDate = request.EndDate.Date.AddDays(1).AddSeconds(-1); + + var shopList = venderBusiness.GetShopList(request.ShopId, Model.Enums.Platform.拳探); + var list = new List(); + + var shopIdList = new List(); + + #region 采购超时率 + var purchaseTaskCountGroups = fsql.Select().WhereIf(request.ShopId != null, t => t.ShopId == request.ShopId) + .Where(t => t.CreateTme >= request.StartDate && t.CreateTme <= request.EndDate) + .Where(t => t.TaskType == Model.Enums.TimeLimitTaskType.采购任务) + .GroupBy(t => t.ShopId) + .ToList(g => new + { + ShopId = g.Key, + TaskCount = g.Count() + }); + + var purchaseTaskTimOutCountGroups = fsql.Select().WhereIf(request.ShopId != null, t => t.ShopId == request.ShopId) + .Where(t => t.CreateTme >= request.StartDate && t.CreateTme <= request.EndDate) + .Where(t => t.IsTimely == false) + .Where(t => t.TaskType == Model.Enums.TimeLimitTaskType.采购任务) + .GroupBy(t => t.ShopId) + .ToList(g => new + { + ShopId = g.Key, + TaskCount = g.Count() + }); + #endregion + + #region 合格证补充/拟定超时量 + var cerTimeOutCountGroups = fsql.Select().WhereIf(request.ShopId != null, t => t.ShopId == request.ShopId) + .Where(t => t.CreateTme >= request.StartDate && t.CreateTme <= request.EndDate) + .Where(t => t.IsTimely == false) + .Where(t => hgzTaskTypeList.Contains(t.TaskType)) + .GroupBy(t => new { t.ShopId, t.TaskType }) + .ToList(g => new + { + ShopId = g.Key.ShopId, + TaskType = g.Key.TaskType, + TaskCount = g.Count() + }); + #endregion + + shopIdList.AddRange(purchaseTaskCountGroups.Select(g => g.ShopId.Value).ToList()); + + foreach (var shopId in shopIdList) + { + var sid = shopId.ToString(); + var response = new TimeLimitTaskStatisticsResponse(); + response.ShopId = shopId; + response.ShopName = shopList.FirstOrDefault(s => s.ShopId == sid)?.ShopName; + var purchaseTaskCount = purchaseTaskCountGroups.FirstOrDefault(x => x.ShopId == response.ShopId)?.TaskCount ?? 0; + var purchaseTaskTimeOutCount = purchaseTaskTimOutCountGroups.FirstOrDefault(x => x.ShopId == response.ShopId)?.TaskCount ?? 0; + + response.PurchaseTimeOutPercent = purchaseTaskCount == 0 ? 0 : Math.Round(1.0 * purchaseTaskTimeOutCount / purchaseTaskCount * 100, 2); + response.CerEditTimeOutCount = cerTimeOutCountGroups.FirstOrDefault(x => x.ShopId == response.ShopId && + x.TaskType == Enums.TimeLimitTaskType.合格证补充任务)?.TaskCount ?? 0; + response.CerConfigTimeOutCount = cerTimeOutCountGroups.FirstOrDefault(x => x.ShopId == response.ShopId && + x.TaskType == Enums.TimeLimitTaskType.合格证拟定任务)?.TaskCount ?? 0; + list.Add(response); + } + + return list; + } + + public void EditTimeLimitTaskRemark(EditTimeLimitTaskRemarkRequest request) + { + fsql.Update(request.TaskId).Set(t => t.Remark, request.Remark).ExecuteAffrows(); + } + } +} diff --git a/BBWYB.Server.Business/Vender/VenderBusiness.cs b/BBWYB.Server.Business/Vender/VenderBusiness.cs index e11998b..1f55d66 100644 --- a/BBWYB.Server.Business/Vender/VenderBusiness.cs +++ b/BBWYB.Server.Business/Vender/VenderBusiness.cs @@ -23,11 +23,12 @@ namespace BBWYB.Server.Business this.kuaiDi100Manager = kuaiDi100Manager; } - public IList GetShopList(long? shopId = null, Enums.Platform? platform = null) + public IList GetShopList(long? shopId = null, Enums.Platform? platform = null, string shopName = "") { return fsqlManager.MDSfsql.Select().Where(s => !string.IsNullOrEmpty(s.ShopId)) .WhereIf(shopId != null, s => s.ShopId == shopId.ToString()) .WhereIf(platform != null, s => s.PlatformId == (int)platform) + .WhereIf(!string.IsNullOrEmpty(shopName), s => s.ShopName == shopName) .ToList(); } @@ -87,7 +88,7 @@ namespace BBWYB.Server.Business public IList GetKuaiDi100ExpressCompanyList(KuaiDi100ExpressSearchRequest request) { - return kuaiDi100Manager.GetKuaiDi100ExpressCompanyList(request); + return kuaiDi100Manager.GetKuaiDi100ExpressCompanyList(request); } } } diff --git a/BBWYB.Server.Model/Db/Order/OrderCost.cs b/BBWYB.Server.Model/Db/Order/Cost/OrderCost.cs similarity index 100% rename from BBWYB.Server.Model/Db/Order/OrderCost.cs rename to BBWYB.Server.Model/Db/Order/Cost/OrderCost.cs diff --git a/BBWYB.Server.Model/Db/Order/OrderCostDetail.cs b/BBWYB.Server.Model/Db/Order/Cost/OrderCostDetail.cs similarity index 100% rename from BBWYB.Server.Model/Db/Order/OrderCostDetail.cs rename to BBWYB.Server.Model/Db/Order/Cost/OrderCostDetail.cs diff --git a/BBWYB.Server.Model/Db/Order/Cost/OrderSkuCost.cs b/BBWYB.Server.Model/Db/Order/Cost/OrderSkuCost.cs new file mode 100644 index 0000000..6053218 --- /dev/null +++ b/BBWYB.Server.Model/Db/Order/Cost/OrderSkuCost.cs @@ -0,0 +1,62 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + [Table(Name = "orderskucost", DisableSyncStructure = true)] + public partial class OrderSkuCost { + + [Column(IsPrimary = true)] + public long Id { get; set; } + + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + /// + /// 发货运费 + /// + [Column(DbType = "decimal(20,2)")] + public decimal? DeliveryExpressFreight { get; set; } + + /// + /// 订单Id + /// + [Column(StringLength = 50)] + public string OrderId { get; set; } + + /// + /// 支出打包费 + /// + [Column(DbType = "decimal(20,2)")] + public decimal? OutPackAmount { get; set; } + + /// + /// 订单利润 + /// + [Column(DbType = "decimal(20,2)")] + public decimal? Profit { get; set; } + + /// + /// 采购运费 + /// + [Column(DbType = "decimal(20,2)")] + public decimal? PurchaseFreight { get; set; } + + /// + /// 采购货款 + /// + [Column(DbType = "decimal(20,2)")] + public decimal? SkuAmount { get; set; } + + [Column(StringLength = 50)] + public string SkuId { get; set; } + + /// + /// Sku总成本 + /// + [Column(DbType = "decimal(20,2)")] + public decimal? TotalCost { get; set; } + + } + +} diff --git a/BBWYB.Server.Model/Db/Order/InStorePurchaseOrdeRrelationInfo.cs b/BBWYB.Server.Model/Db/Order/InStorePurchaseOrdeRrelationInfo.cs new file mode 100644 index 0000000..1a67e40 --- /dev/null +++ b/BBWYB.Server.Model/Db/Order/InStorePurchaseOrdeRrelationInfo.cs @@ -0,0 +1,35 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + /// + /// 入库采购单关系表 + /// + [Table(Name = "instorepurchaseorderrelationinfo", DisableSyncStructure = true)] + public partial class InStorePurchaseOrdeRrelationInfo + { + + [Column(IsPrimary = true)] + public long Id { get; set; } + + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + [Column(StringLength = 100)] + public string InStorePurchaseOrderId { get; set; } + + [Column(StringLength = 100)] + public string OrderId { get; set; } + + [Column(StringLength = 100)] + public string PurchaseOrderId { get; set; } + + public long? ShopId { 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 4f6863d..37cca53 100644 --- a/BBWYB.Server.Model/Db/Order/Order.cs +++ b/BBWYB.Server.Model/Db/Order/Order.cs @@ -50,6 +50,12 @@ namespace BBWYB.Server.Model.Db [Column(DbType = "datetime")] public DateTime? ModifyTime { get; set; } + /// + /// 支付时间 + /// + [Column(DbType = "datetime", IsNullable = true)] + public DateTime? PayTime { get; set; } + /// /// 用户应付金额 /// @@ -252,6 +258,12 @@ namespace BBWYB.Server.Model.Db [Column(MapType = typeof(int?))] public Enums.IntoStoreType? IntoStoreType { get; set; } + + /// + /// 是否为特殊单 + /// + [Column(DbType = "int(1)", IsNullable = true)] + public int? IsSpecialOrder { get; set; } } } diff --git a/BBWYB.Server.Model/Db/Order/OrderMessage.cs b/BBWYB.Server.Model/Db/Order/OrderMessage.cs new file mode 100644 index 0000000..cb9c0d8 --- /dev/null +++ b/BBWYB.Server.Model/Db/Order/OrderMessage.cs @@ -0,0 +1,38 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + [Table(Name = "ordermessage", DisableSyncStructure = true)] + public partial class OrderMessage + { + + [Column(IsPrimary = true)] + public long Id { get; set; } + + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + [Column(StringLength = 50)] + public string CreatorId { get; set; } + + [Column(StringLength = 50)] + public string CreatorName { get; set; } + + [Column(StringLength = 500)] + public string Message { get; set; } + + [Column(StringLength = 50)] + public string OrderId { get; set; } + + [Column(StringLength = 50)] + public string OrderSn { get; set; } + + public long? ShopId { get; set; } + + [Column(StringLength = 50)] + public string From { get; set; } + + } + +} diff --git a/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs b/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs index c40d326..112db0e 100644 --- a/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs +++ b/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs @@ -56,35 +56,6 @@ namespace BBWYB.Server.Model.Db /// public long? ShopId { get; set; } - ///// - ///// ݵ - ///// - //[Column(StringLength = 100)] - //public string WaybillNo { get; set; } - - ///// - ///// ԭʼݹ˾ - ///// - //[Column(StringLength = 100)] - //public string SourceExpressName { get; set; } - - ///// - ///// ԭʼݹ˾Id - ///// - //[Column(StringLength = 100)] - //public string SourceExpressId { get; set; } - - ///// - ///// Ŀݹ˾ - ///// - //[Column(StringLength = 100)] - //public string TargetExpressName { get; set; } - - ///// - ///// Ŀݹ˾Id - ///// - //[Column(StringLength = 100)] - //public string TargetExpressId { get; set; } /// /// Sku @@ -101,17 +72,23 @@ namespace BBWYB.Server.Model.Db [Column(StringLength = 500)] public string Remark { get; set; } - ///// - ///// Ƿǩ - ///// - //[Column(DbType = "bit")] - //public bool? IsSign { get; set; } = false; + /// + /// ʷɹʱ + /// + [Column(DbType = "datetime", IsNullable = true)] + public DateTime HistorySettingTime { get; set; } /// /// ɹ״̬ /// [Column(MapType = typeof(int?))] public Enums.PurchaseOrderState? OrderState { get; set; } + + /// + /// Ƿƽ + /// + [Column(MapType = typeof(int?))] + public Enums.AutoEditOrderPriceType? IsAutoEditOrderPrice { get; set; } } } diff --git a/BBWYB.Server.Model/Db/Order/OrderSku.cs b/BBWYB.Server.Model/Db/Order/OrderSku.cs index cedf9ec..2d07800 100644 --- a/BBWYB.Server.Model/Db/Order/OrderSku.cs +++ b/BBWYB.Server.Model/Db/Order/OrderSku.cs @@ -70,10 +70,6 @@ namespace BBWYB.Server.Model.Db public string Title { get; set; } - - /// - /// 打包配置状态(0=待配置, 1=已配置) - /// [Column(DbType = "int(1)", MapType = typeof(int?))] public Enums.PackConfigState? PackConfigState { get; set; } diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs b/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs index 3b1ae95..be1d49c 100644 --- a/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs +++ b/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs @@ -1,8 +1,6 @@ using BBWYB.Server.Model.Db; using FreeSql.DataAnnotations; -using System; -using System.Collections.Generic; namespace BBWYB.Server.Model { diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/Purchaser.cs b/BBWYB.Server.Model/Db/PurchaseScheme/Purchaser.cs index 6833df3..d8e6d38 100644 --- a/BBWYB.Server.Model/Db/PurchaseScheme/Purchaser.cs +++ b/BBWYB.Server.Model/Db/PurchaseScheme/Purchaser.cs @@ -11,11 +11,17 @@ namespace BBWYB.Server.Model.Db { /// - /// 采购商Id + /// 采购商Id (1688 SellerUserId) /// [Column(StringLength = 20, IsPrimary = true, IsNullable = false)] public string Id { get; set; } + /// + /// 采购商Id2 (1688 SellerLoginId) + /// + [Column(StringLength = 50)] + public string Id2 { get; set; } + /// /// 采购商名称 /// diff --git a/BBWYB.Server.Model/Db/TimeLimitTask/TimeLimitTask.cs b/BBWYB.Server.Model/Db/TimeLimitTask/TimeLimitTask.cs new file mode 100644 index 0000000..d325eaf --- /dev/null +++ b/BBWYB.Server.Model/Db/TimeLimitTask/TimeLimitTask.cs @@ -0,0 +1,84 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + /// + /// 时限任务表 + /// + [Table(Name = "timelimittask", DisableSyncStructure = true)] + public partial class TimeLimitTask + { + + [Column(IsPrimary = true)] + public long Id { get; set; } + + /// + /// 完成时间 + /// + [Column(DbType = "datetime")] + public DateTime? CompletionTime { get; set; } + + /// + /// 创建时间 + /// + [Column(DbType = "datetime")] + public DateTime? CreateTme { get; set; } + + /// + /// 付款时间 + /// + [Column(DbType = "datetime")] + public DateTime? PayTime { get; set; } + + /// + /// 到期时间(非时间长度,而是具体的时间) + /// + [Column(DbType = "datetime")] + public DateTime? ExpirationTime { get; set; } + + /// + /// 是否及时完成 + /// + + public bool? IsTimely { get; set; } + + /// + /// 订单Id (采购任务时有效) + /// + [Column(StringLength = 50)] + public string OrderId { get; set; } + + /// + /// 订单Sn (采购任务时有效) + /// + [Column(StringLength = 100)] + public string OrderSn { get; set; } + + /// + /// 店铺Id + /// + + public long? ShopId { get; set; } + + /// + /// SKU + /// + [Column(StringLength = 50)] + public string SkuId { get; set; } + + /// + /// 任务类型(采购任务=0,合格证拟定任务=10,合格证补充任务=11) + /// + [Column(MapType = typeof(int?))] + public Enums.TimeLimitTaskType? TaskType { get; set; } + + /// + /// 备注 + /// + [Column(StringLength = 500)] + public string Remark { get; set; } + + } + +} diff --git a/BBWYB.Server.Model/Dto/Request/Order/AddOrderMessageRequest.cs b/BBWYB.Server.Model/Dto/Request/Order/AddOrderMessageRequest.cs new file mode 100644 index 0000000..4588593 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/Order/AddOrderMessageRequest.cs @@ -0,0 +1,9 @@ +namespace BBWYB.Server.Model.Dto +{ + public class AddOrderMessageRequest + { + public string Message { get; set; } + + public string OrderId { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/Order/QueryOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/Order/QueryOrderRequest.cs index 8f73ec2..7a0508d 100644 --- a/BBWYB.Server.Model/Dto/Request/Order/QueryOrderRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/Order/QueryOrderRequest.cs @@ -71,14 +71,48 @@ /// /// 是否为待配置 (复合条件) - /// 条件1: 已采购 + 未取消 + /// 订单未取消 + 订单为发回齐越 + 订单已采购 + 任意sku为待配置 /// public bool IsWaitConfig { get; set; } - ///// - ///// 是否过滤已配置 - ///// - //public bool ExcludeConfigured { get; set; } + /// + /// 是否仅显示待采购超时,是=1否=0,null则不处理该条件,只在订单状态为【待采购和部分采购】时生效 + /// + public int? IsOnlyDisplayPurchaseTimeOut { get; set; } + + /// + /// 是否仅显示待发货超时,是=1否=0,null则不处理该条件,只在订单状态为【待发货和部分发货】时生效 + /// + public int? IsOnlyDisplayDeliveryTimeout { get; set; } + + /// + /// 是否仅显示待配置-需修改,是=1否=0,null则不处理该条件,只在【IsWaitConfig=true】时生效 + /// + public int? IsOnlyDisplayPackConfigEditState { get; set; } + + /// + /// 是否仅显示配置超时,是=1否=0,null则不处理该条件,只在【IsWaitConfig=true】时生效(优先) + /// + public int? IsOnlyDisplayCerConfigTimeOut { get; set; } + /// + /// 是否仅显示核算超时,是=1否=0,null则不处理该条件,只在订单状态为【待核算】时生效 + /// + public int? IsOnlyDisplayCheckComputationTimeOut { get; set; } + + /// + /// 是否仅显示发回齐越,是=1否=0,null则不处理该条件 + /// + public int? IsOnlyDisplaySendQiYue { get; set; } + + /// + /// 是否仅显示厂家代发入仓,是=1否=0,null则不处理该条件 + /// + public int? IsOnlyDisplayPurchaserSendInStore { get; set; } + + /// + /// 是否仅显示特殊单,是=1否=0,null则不处理该条件 + /// + public int? IsOnlyDisplaySpecialOrder { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/Order/SetSpecialOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/Order/SetSpecialOrderRequest.cs new file mode 100644 index 0000000..e07f0b7 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/Order/SetSpecialOrderRequest.cs @@ -0,0 +1,12 @@ +namespace BBWYB.Server.Model.Dto +{ + public class SetSpecialOrderRequest + { + public string OrderId { get; set; } + + /// + /// 是=1 否=0 + /// + public int IsSpecialOrder { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/DeletePurchaseOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/DeletePurchaseOrderRequest.cs new file mode 100644 index 0000000..81fa3ad --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/DeletePurchaseOrderRequest.cs @@ -0,0 +1,6 @@ +namespace BBWYB.Server.Model.Dto +{ + public class DeletePurchaseOrderRequest : SetHistoryPurchaseOrderRequest + { + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PurchaserDeliveryRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PurchaserDeliveryRequest.cs new file mode 100644 index 0000000..1b06d38 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PurchaserDeliveryRequest.cs @@ -0,0 +1,39 @@ +namespace BBWYB.Server.Model.Dto +{ + public class PurchaserDeliveryRequest + { + public string OrderId { get; set; } + + public string PurchaseOrderId { get; set; } + + /// + /// 订单SkuId (OrderSku对象的SkuId) + /// + public string SkuId { get; set; } + + public IList InStorePurchaseOrderManualDeliveryList { get; set; } + } + + public class InStorePurchaseOrderManualDeliveryRequest + { + /// + /// 快递公司Id + /// + public string ExpressId { get; set; } + + /// + /// 快递公司名称 + /// + public string ExpressName { get; set; } + + /// + /// 快递单号 + /// + public string WaybillNo { get; set; } + + /// + /// 入库采购单集合 + /// + public IList InStorePurchaseOrderIdList { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/SetHistoryPurchaseOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/SetHistoryPurchaseOrderRequest.cs index 72a02b9..0a9476f 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/SetHistoryPurchaseOrderRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/SetHistoryPurchaseOrderRequest.cs @@ -11,5 +11,7 @@ /// 采购单Id /// public string PurchaseOrderId { get; set; } + + public bool? IsDelete { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeRequest.cs index 6d07002..fda1121 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseScheme/InputPurchaseSchemeRequest.cs @@ -19,6 +19,12 @@ namespace BBWYB.Server.Model.Dto /// 采购商Id /// public string PurchaserId { get; set; } + + /// + /// 采购商Id + /// + public string PurchaserId2 { get; set; } + /// /// 采购商名称 /// diff --git a/BBWYB.Server.Model/Dto/Request/QiKu/QiKuPackTaskSkuPurchaseSchemeIdRequest.cs b/BBWYB.Server.Model/Dto/Request/QiKu/QiKuPackTaskSkuPurchaseSchemeIdRequest.cs new file mode 100644 index 0000000..8bde0fe --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/QiKu/QiKuPackTaskSkuPurchaseSchemeIdRequest.cs @@ -0,0 +1,9 @@ +namespace BBWYB.Server.Model.Dto +{ + public class QiKuPackTaskSkuPurchaseSchemeIdRequest + { + public string SkuId { get; set; } + + public string SkuPurchaseSchemeId { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/QiKu/QikuPublishOrderSkuPackConfigStateRequest.cs b/BBWYB.Server.Model/Dto/Request/QiKu/QikuPublishOrderSkuPackConfigStateRequest.cs new file mode 100644 index 0000000..7767790 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/QiKu/QikuPublishOrderSkuPackConfigStateRequest.cs @@ -0,0 +1,11 @@ +namespace BBWYB.Server.Model.Dto +{ + public class QikuPublishOrderSkuPackConfigStateRequest + { + public string OrderId { get; set; } + + public string SkuId { get; set; } + + public Enums.PackConfigState PackConfigState { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/TimeLimitTask/EditTimeLimitTaskRemarkRequest.cs b/BBWYB.Server.Model/Dto/Request/TimeLimitTask/EditTimeLimitTaskRemarkRequest.cs new file mode 100644 index 0000000..df2bf69 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/TimeLimitTask/EditTimeLimitTaskRemarkRequest.cs @@ -0,0 +1,9 @@ +namespace BBWYB.Server.Model.Dto +{ + public class EditTimeLimitTaskRemarkRequest + { + public long TaskId { get; set; } + + public string Remark { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeLimitTaskRequest.cs b/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeLimitTaskRequest.cs new file mode 100644 index 0000000..6f7b9cd --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeLimitTaskRequest.cs @@ -0,0 +1,36 @@ +namespace BBWYB.Server.Model.Dto +{ + public class QueryTimeLimitTaskRequest + { + public DateTime StartDate { get; set; } + + public DateTime EndDate { get; set; } + + public Enums.TimeLimitTaskType? TimeLimitTaskType { get; set; } + + /// + /// 是否完成,完成=1,未完成=0,可空 + /// + public int? IsCompleted { get; set; } + + /// + /// 是否超时,超时=1,未超时=0,可空 + /// + public int? IsTimeOut { get; set; } + + /// + /// 店铺Id,可空 + /// + public long? ShopId { get; set; } + + /// + /// 页码,1开始 + /// + public int PageIndex { get; set; } + + /// + /// 每页记录数 + /// + public int PageSize { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeOutRequest.cs b/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeOutRequest.cs new file mode 100644 index 0000000..32cf2aa --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeOutRequest.cs @@ -0,0 +1,14 @@ +namespace BBWYB.Server.Model.Dto +{ + public class QueryTimeOutRequest + { + public DateTime StartDate { get; set; } + + public DateTime EndDate { get; set; } + + /// + /// 店铺Id 可空 + /// + public long? ShopId { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/JD/JDInStoreOrderDetail.cs b/BBWYB.Server.Model/Dto/Response/JD/JDInStoreOrderDetail.cs new file mode 100644 index 0000000..e80da50 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/JD/JDInStoreOrderDetail.cs @@ -0,0 +1,34 @@ +namespace JD.Dto +{ + public class JDInStoreOrderDetail + { + public string poOrderNo { get; set; } + + public string isvPoOrderNo { get; set; } + + /// + /// 开放平台事业部编号 + /// + public string deptNo { get; set; } + + /// + /// 开放平台库房编号 + /// + public string whNo { get; set; } + + /// + /// 开放平台供应商编号 + /// + public string supplierNo { get; set; } + + /// + /// 采购入库单状态:4等待箱明细、5等待序列号清单、6待集单、10新建、15追加中、16已集单、20初始、30预约、31单据申报、32入园放行、33理货申报、34入库放行、40叫号、50验收、51 TC验收、60上架、70完成、80异常、81未完成、82申报失败、90取消中、91取消成功、92取消失败、93待取消、94等待取消中、95库房修改;最大长度4字符 + /// + public string poOrderStatus { get; set; } + + /// + /// 采购入库单入库状态;1:有差异待确认,2:无差异已确认,3:待确认,4:有差异已确认 + /// + public string storageStatus { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/MDS/UserInfoResponse.cs b/BBWYB.Server.Model/Dto/Response/MDS/UserInfoResponse.cs new file mode 100644 index 0000000..75600c0 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/MDS/UserInfoResponse.cs @@ -0,0 +1,11 @@ +namespace BBWYB.Server.Model.Dto +{ + public class UserInfoResponse + { + public string Id { get; set; } + + public string UserName { get; set; } + + //其余字段需要用到的时候再扩充 + } +} diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderCostResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderCostResponse.cs index a11a0ff..4a01b40 100644 --- a/BBWYB.Server.Model/Dto/Response/Order/OrderCostResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderCostResponse.cs @@ -4,6 +4,6 @@ namespace BBWYB.Server.Model.Dto { public class OrderCostResponse : OrderCost { - + public IList OrderSkuCostList { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderCountByStateResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderCountByStateResponse.cs new file mode 100644 index 0000000..723ad6f --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderCountByStateResponse.cs @@ -0,0 +1,40 @@ +namespace BBWYB.Server.Model.Dto +{ + public class OrderCountByStateResponse + { + /// + /// 待付款数量 + /// + public long WaitPayCount { get; set; } + + /// + /// 待采购数量(含部分采购) + /// + public int WaitPurchaseCount { get; set; } + + /// + /// 待配置数量 + /// + public long WaitConfigCount { get; set; } + + /// + /// 待发货数量(含部分发货) + /// + public long WaitShipmentCount { get; set; } + + /// + /// 待收货数量(含部分收货) + /// + public long WaitReceiveCount { get; set; } + + /// + /// 待验收数量 + /// + public long WaitCheckCount { get; set; } + + /// + /// 待核算数量 + /// + public long WaitComputationCount { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderMessageResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderMessageResponse.cs new file mode 100644 index 0000000..b2236ca --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderMessageResponse.cs @@ -0,0 +1,8 @@ +using BBWYB.Server.Model.Db; + +namespace BBWYB.Server.Model.Dto +{ + public class OrderMessageResponse : OrderMessage + { + } +} diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderPurchaseInfoResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderPurchaseInfoResponse.cs index 61c2004..06c4120 100644 --- a/BBWYB.Server.Model/Dto/Response/Order/OrderPurchaseInfoResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderPurchaseInfoResponse.cs @@ -13,5 +13,10 @@ namespace BBWYB.Server.Model.Dto /// 快递单列表 /// public IList PurchaseExpressOrderList { get; set; } + + /// + /// 采购商家 + /// + public Purchaser Purchaser { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderResponse.cs index 3c5e42a..5943840 100644 --- a/BBWYB.Server.Model/Dto/Response/Order/OrderResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderResponse.cs @@ -26,6 +26,11 @@ /// public DateTime ModifyTime { get; set; } + /// + /// 支付时间 + /// + public DateTime? PayTime { get; set; } + /// /// 订单平台 /// @@ -147,6 +152,15 @@ public Enums.PackConfigState? PackConfigState { get; set; } public Enums.IntoStoreType? IntoStoreType { get; set; } + + public Enums.AutoEditOrderPriceType? IsAutoEditOrderPrice { get; set; } + + public IList OrderMessageList { get; set; } + + /// + /// 是否为特殊单 是=1 否=0 + /// + public int? IsSpecialOrder { get; set; } } public class OrderListResponse diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderSkuCostResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderSkuCostResponse.cs new file mode 100644 index 0000000..f3c62b1 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderSkuCostResponse.cs @@ -0,0 +1,9 @@ +using BBWYB.Server.Model.Db; + +namespace BBWYB.Server.Model.Dto +{ + public class OrderSkuCostResponse : OrderSkuCost + { + public IList OrderCostDetailList { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/Order/OrderSkuResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/OrderSkuResponse.cs index daafc7e..a890d67 100644 --- a/BBWYB.Server.Model/Dto/Response/Order/OrderSkuResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/Order/OrderSkuResponse.cs @@ -4,19 +4,40 @@ namespace BBWYB.Server.Model.Dto { public class OrderSkuResponse : OrderSku { - // /// - // /// 采购方案 - // /// - //public long SchemeId { get;set; } - public OrderSkuResponse() { PurchaseExpressOrderList = new List(); + //TimeLimitTaskList = new List(); } + /// + /// 订单SKU发货状态 (未发货=0,已发货=1,部分发=2) + /// + public int ShipState { get; set; } + /// /// 快递单列表 /// public IList PurchaseExpressOrderList { get; set; } + + /// + /// 采购限时任务 + /// + public TimeLimitTaskResponse? PurchaseTimeLimitTask { get; set; } + + /// + /// 合格证拟定任务 + /// + public TimeLimitTaskResponse? CerConfigTimeLimitTask { get; set; } + + /// + /// 合格证补充任务 + /// + public TimeLimitTaskResponse? CerEditTimeLimitTask { get; set; } + + /// + /// 待核算任务 + /// + public TimeLimitTaskResponse? CheckComputationTimeLimitTask { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Response/Order/PurchaseExpressOrderResponse.cs b/BBWYB.Server.Model/Dto/Response/Order/PurchaseExpressOrderResponse.cs index 0a0a2a9..dd2f73f 100644 --- a/BBWYB.Server.Model/Dto/Response/Order/PurchaseExpressOrderResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/Order/PurchaseExpressOrderResponse.cs @@ -2,11 +2,16 @@ namespace BBWYB.Server.Model.Dto { - public class PurchaseExpressOrderResponse: PurchaseExpressOrder + public class PurchaseExpressOrderResponse : PurchaseExpressOrder { /// /// 归属SkuId,逗号间隔 (拳探SKU) /// public string BelongSkuIds { get; set; } + + /// + /// 入仓采购单号 + /// + public IList InStorePurchaseOrderIdList { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeResponse.cs b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeResponse.cs index 30bbb75..f322e0a 100644 --- a/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/PurchaseScheme/PurchaseSchemeResponse.cs @@ -8,6 +8,8 @@ namespace BBWYB.Server.Model.Dto { public string PurchaserName { get; set; } + public string PurchaserId2 { get; set; } + public string PurchaserLocation { get; set; } public new List PurchaseSchemeProductList { get; set; } diff --git a/BBWYB.Server.Model/Dto/Response/QiKu/QiKuBindingSchemeResponse.cs b/BBWYB.Server.Model/Dto/Response/QiKu/QiKuBindingSchemeResponse.cs new file mode 100644 index 0000000..6b0c1ba --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/QiKu/QiKuBindingSchemeResponse.cs @@ -0,0 +1,22 @@ +namespace BBWYB.Server.Model.Dto +{ + public class QiKuBindingSchemeResponse + { + public string OrderId { get; set; } + + public IList PackTaskSkuPurchaseSchemeIdList { get; set; } + } + + public class QiKuBindingSchemeSkuResponse + { + /// + /// 来源skuId + /// + public string SkuId { get; set; } + + /// + /// 是否配置合格证 + /// + public bool IsConfiguredCer { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskListResponse.cs b/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskListResponse.cs new file mode 100644 index 0000000..f8be7d9 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskListResponse.cs @@ -0,0 +1,9 @@ +namespace BBWYB.Server.Model.Dto +{ + public class TimeLimitTaskListResponse + { + public long Count { get; set; } + + public IList ItemList { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskResponse.cs b/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskResponse.cs new file mode 100644 index 0000000..802c9ad --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskResponse.cs @@ -0,0 +1,9 @@ +using BBWYB.Server.Model.Db; + +namespace BBWYB.Server.Model.Dto +{ + public class TimeLimitTaskResponse : TimeLimitTask + { + public string ShopName { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskStatisticsResponse.cs b/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskStatisticsResponse.cs new file mode 100644 index 0000000..e350e0f --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskStatisticsResponse.cs @@ -0,0 +1,25 @@ +namespace BBWYB.Server.Model.Dto +{ + public class TimeLimitTaskStatisticsResponse + { + public long ShopId { get; set; } + + public string ShopName { get; set; } + + /// + /// 采购超时率(%) + /// + public double PurchaseTimeOutPercent { get; set; } + + + /// + /// 合格证补充超时量 + /// + public int? CerEditTimeOutCount { get; set; } + + /// + /// 合格证拟定超时量 + /// + public int? CerConfigTimeOutCount { get; set; } + } +} diff --git a/BBWYB.Server.Model/Enums.cs b/BBWYB.Server.Model/Enums.cs index a64c561..0c1429f 100644 --- a/BBWYB.Server.Model/Enums.cs +++ b/BBWYB.Server.Model/Enums.cs @@ -103,10 +103,10 @@ public enum PurchaseOrderState { 待发货 = 0, - 部分发货 = 1, - 待收货 = 10, - 部分收货 = 11, - 已签收 = 20, + 部分发货 = 1, + 待收货 = 10, + 部分收货 = 11, + 已签收 = 20, 已取消 = 100 } @@ -290,12 +290,13 @@ } /// - /// 打包配置状态 待配置 = 0,已配置 = 1 + /// 打包配置状态 待配置 = 0,已配置 = 1,需修改 = 2 /// public enum PackConfigState { 待配置 = 0, - 已配置 = 1 + 已配置 = 1, + 需修改 = 2 } /// @@ -305,5 +306,21 @@ { 发回齐越 = 0, 厂商代发入仓 = 1 } + + /// + /// 限时任务类型 采购任务 = 0, 合格证拟定任务 = 10, 合格证补充任务 = 11, 待核算任务 = 20 + /// + public enum TimeLimitTaskType + { + 采购任务 = 0, 合格证拟定任务 = 10, 合格证补充任务 = 11, 待核算任务 = 20 + } + + /// + /// 平价状态 未平价=0 已平价=1 部分平价=2 + /// + public enum AutoEditOrderPriceType + { + 未平价 = 0, 已平价 = 1, 部分平价 = 2 + } } } diff --git a/BBWYB.Server.Model/MappingProfiles.cs b/BBWYB.Server.Model/MappingProfiles.cs index 467dbb8..65112b1 100644 --- a/BBWYB.Server.Model/MappingProfiles.cs +++ b/BBWYB.Server.Model/MappingProfiles.cs @@ -45,7 +45,9 @@ namespace BBWYB.Server.Model .ForPath(t => t.OrderCost.PlatformCommissionAmount, opt => opt.MapFrom(f => f.PlatformCommissionAmount ?? 0)) .ForPath(t => t.OrderCost.PlatformCommissionRatio, opt => opt.MapFrom(f => f.PlatformCommissionRatio ?? 0)) .ForPath(t => t.OrderCost.PreferentialAmount, opt => opt.MapFrom(f => f.PreferentialAmount)) - .ForPath(t => t.OrderCost.IsManualEdited, opt => opt.MapFrom(f => f.IsManualEdited)); + .ForPath(t => t.OrderCost.IsManualEdited, opt => opt.MapFrom(f => f.IsManualEdited)) + .ForPath(t => t.OrderCost.SkuAmount, opt => opt.MapFrom(f => f.SkuAmount)) + .ForPath(t => t.OrderCost.PurchaseFreight, opt => opt.MapFrom(f => f.PurchaseFreight)); CreateMap(); //CreateMap(); diff --git a/QuanTan.SDK/Client/Supplier/QuanTan_Supplier_ProductClient.cs b/QuanTan.SDK/Client/Supplier/QuanTan_Supplier_ProductClient.cs index d38770c..01770d1 100644 --- a/QuanTan.SDK/Client/Supplier/QuanTan_Supplier_ProductClient.cs +++ b/QuanTan.SDK/Client/Supplier/QuanTan_Supplier_ProductClient.cs @@ -19,5 +19,10 @@ namespace QuanTan.SDK.Client.Supplier { return SendRequest("api/platform/supply/product/list", request, appId, appSecret); } + + public QuanTanResponse EditProductPrice(QuanTan_Supplier_EditProductPriceRequest request, string appId, string appSecret) + { + return SendRequest("api/platform/supply/product/price/change", request, appId, appSecret); + } } } diff --git a/QuanTan.SDK/Models/Supplier/Request/Order/QuanTan_Supplier_EditPriceRequest.cs b/QuanTan.SDK/Models/Supplier/Request/Order/QuanTan_Supplier_EditPriceRequest.cs index 203ad72..35c2f21 100644 --- a/QuanTan.SDK/Models/Supplier/Request/Order/QuanTan_Supplier_EditPriceRequest.cs +++ b/QuanTan.SDK/Models/Supplier/Request/Order/QuanTan_Supplier_EditPriceRequest.cs @@ -22,8 +22,13 @@ public decimal price { get; set; } /// - /// Sku总运费 + /// Sku运费 /// public decimal postagePrice { get; set; } + + /// + /// 单个订单商品的打包费 + /// + public decimal packingChargeSingle { get; set; } } } diff --git a/QuanTan.SDK/Models/Supplier/Request/Product/QuanTan_Supplier_EditProductPriceRequest.cs b/QuanTan.SDK/Models/Supplier/Request/Product/QuanTan_Supplier_EditProductPriceRequest.cs new file mode 100644 index 0000000..abee5c5 --- /dev/null +++ b/QuanTan.SDK/Models/Supplier/Request/Product/QuanTan_Supplier_EditProductPriceRequest.cs @@ -0,0 +1,18 @@ +namespace QuanTan.SDK.Models.Supplier +{ + public class QuanTan_Supplier_EditProductPriceRequest + { + public string productId { get; set; } + + public string editAdmin { get; set; } + + public IList skuList { get; set; } + } + + public class QuanTan_Supplier_EditProductSkuPriceRequest + { + public string skuId { get; set; } + + public decimal price { get; set; } + } +} diff --git a/SDKAdapter/ExpressCompanyNameConverter.cs b/SDKAdapter/ExpressCompanyNameConverter.cs index 262bb46..7ea24ce 100644 --- a/SDKAdapter/ExpressCompanyNameConverter.cs +++ b/SDKAdapter/ExpressCompanyNameConverter.cs @@ -124,7 +124,10 @@ namespace SDKAdapter new LogisticsCompanyRelationship(){SourceName="加运美速递",TargetName="加运美",TargetCode="jiayunmeiwuliu"}, new LogisticsCompanyRelationship(){SourceName="加运美",TargetName="加运美",TargetCode="jiayunmeiwuliu"}, new LogisticsCompanyRelationship(){SourceName="信丰物流",TargetName="信丰物流",TargetCode="xinfengwuliu"}, - new LogisticsCompanyRelationship(){SourceName="京东物流",TargetName="京东物流",TargetCode="jd"} + new LogisticsCompanyRelationship(){SourceName="京东物流",TargetName="京东物流",TargetCode="jd"}, + new LogisticsCompanyRelationship(){SourceName="速腾快递",TargetName="速腾快递",TargetCode="suteng"}, + new LogisticsCompanyRelationship(){SourceName="运通快运",TargetName="运通快运",TargetCode="ytky168"}, + new LogisticsCompanyRelationship(){SourceName="汇森速运",TargetName="汇森速运",TargetCode="huisenky"} }); } diff --git a/SDKAdapter/OperationPlatform/Client/Base/OP_PlatformClient.cs b/SDKAdapter/OperationPlatform/Client/Base/OP_PlatformClient.cs index ffbc8f7..066e416 100644 --- a/SDKAdapter/OperationPlatform/Client/Base/OP_PlatformClient.cs +++ b/SDKAdapter/OperationPlatform/Client/Base/OP_PlatformClient.cs @@ -51,5 +51,10 @@ namespace SDKAdapter.OperationPlatform.Client { throw new NotImplementedException(); } + + public virtual void EditProductPrice(OP_EditProductPriceRequest request) + { + throw new NotImplementedException(); + } } } diff --git a/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs b/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs index d8d8589..6e1cf4a 100644 --- a/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs +++ b/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs @@ -146,6 +146,7 @@ namespace SDKAdapter.OperationPlatform.Client PackAmount = qto.PackingCharge, PayType = 0, IsPay = qto.Paid == 1, + PayTime = qto.Paid == 1 ? qto.PayTime : null, PreferentialAmount = 0, SellerPreferentialAmount = 0, OrderSkuList = qto.OrderProduct.Select(qtosku => new OP_OrderProductSkuResponse() @@ -215,12 +216,29 @@ namespace SDKAdapter.OperationPlatform.Client { orderProductId = item.OrderSkuId, postagePrice = item.Freight, - price = item.Price + price = item.Price, + packingChargeSingle = item.InPackAmountPrice }).ToList() }, request.AppKey, request.AppSecret); if (qtResponse.Status != 200) throw new Exception(qtResponse.Message); } + + public override void EditProductPrice(OP_EditProductPriceRequest request) + { + var qtResponse = supplier_ProductClient.EditProductPrice(new QuanTan_Supplier_EditProductPriceRequest() + { + productId = request.Spu, + editAdmin = request.AppToken, + skuList = request.EditSkuList.Select(x => new QuanTan_Supplier_EditProductSkuPriceRequest() + { + price = x.Price, + skuId = x.Sku + }).ToList() + }, request.AppKey, request.AppSecret); + if (qtResponse.Status != 200) + throw new Exception(qtResponse.Message); + } } } diff --git a/SDKAdapter/OperationPlatform/Models/Request/Order/OP_EditPriceRequest.cs b/SDKAdapter/OperationPlatform/Models/Request/Order/OP_EditPriceRequest.cs index 9cbe0b2..a0effe9 100644 --- a/SDKAdapter/OperationPlatform/Models/Request/Order/OP_EditPriceRequest.cs +++ b/SDKAdapter/OperationPlatform/Models/Request/Order/OP_EditPriceRequest.cs @@ -10,26 +10,32 @@ public class OP_EditPriceSkuRequest { /// - /// 订单Sku商品Id + /// 订单Sku对象Id主键 /// public string OrderSkuId { get; set; } - public string SkuId { get; set; } /// - /// 单价 + /// sku单价 /// public decimal Price { get; set; } + /// - /// 数量 + /// sku打包费单价 /// - public int Quantity { get; set; } + public decimal InPackAmountPrice { get; set; } + + ///// + ///// 数量 + ///// + //public int Quantity { get; set; } /// - /// 运费 + /// 单笔sku的订单运费(用户支付运费) /// public decimal Freight { get; set; } + } } diff --git a/SDKAdapter/OperationPlatform/Models/Request/Product/OP_EditProductPriceRequest.cs b/SDKAdapter/OperationPlatform/Models/Request/Product/OP_EditProductPriceRequest.cs new file mode 100644 index 0000000..78828c9 --- /dev/null +++ b/SDKAdapter/OperationPlatform/Models/Request/Product/OP_EditProductPriceRequest.cs @@ -0,0 +1,16 @@ +namespace SDKAdapter.OperationPlatform.Models +{ + public class OP_EditProductPriceRequest : BasePlatformRequest + { + public string Spu { get; set; } + + public List EditSkuList { get; set; } + } + + public class OP_EditProductSkuPriceRequest + { + public string Sku { get; set; } + + public decimal Price { get; set; } + } +} diff --git a/SDKAdapter/OperationPlatform/Models/Response/Order/OP_OrderResponse.cs b/SDKAdapter/OperationPlatform/Models/Response/Order/OP_OrderResponse.cs index f0bc2eb..6ba4431 100644 --- a/SDKAdapter/OperationPlatform/Models/Response/Order/OP_OrderResponse.cs +++ b/SDKAdapter/OperationPlatform/Models/Response/Order/OP_OrderResponse.cs @@ -42,6 +42,11 @@ /// public bool IsPay { get; set; } + /// + /// 支付时间 + /// + public DateTime? PayTime { get; set; } + /// /// 下单来源 /// 京东【】