From 279075bff0d194bf58a29a711b52b93a6203eae7 Mon Sep 17 00:00:00 2001 From: "506583276@qq.com" <506583276@qq.com> Date: Fri, 23 Jun 2023 13:58:26 +0800 Subject: [PATCH 1/5] 1 --- .../Models/PackPurchaseTask/PurchaseSku.cs | 19 +-- .../UpdatePurchaseTaskViewModel.cs | 160 ++++++++++-------- .../UpdatePurchaseTaskWindow.xaml | 109 +++++++++++- 3 files changed, 199 insertions(+), 89 deletions(-) diff --git a/BBWYB.Client/Models/PackPurchaseTask/PurchaseSku.cs b/BBWYB.Client/Models/PackPurchaseTask/PurchaseSku.cs index 3895817..493f428 100644 --- a/BBWYB.Client/Models/PackPurchaseTask/PurchaseSku.cs +++ b/BBWYB.Client/Models/PackPurchaseTask/PurchaseSku.cs @@ -10,7 +10,7 @@ namespace BBWYB.Client.Models.PackPurchaseTask /// /// 配件sku /// - public class PurchaseSku:ObservableObject + public class PurchaseSku : ObservableObject { /// @@ -32,7 +32,7 @@ namespace BBWYB.Client.Models.PackPurchaseTask /// /// 配件图 /// - public string Logo { get=>logo; set { SetProperty(ref logo, value); } } + public string Logo { get => logo; set { SetProperty(ref logo, value); } } /// /// 配件商品Id /// @@ -48,21 +48,16 @@ namespace BBWYB.Client.Models.PackPurchaseTask /// /// 合格证配置信息 /// - public CertificateModel CerDTO { get ; set ; } + public CertificateModel CerDTO { get; set; } private bool isSetCertificate; /// /// 设置显示(合格证) /// - public bool IsSetCertificate - { - get => isSetCertificate; set - { - - SetProperty(ref isSetCertificate, value); - //IsNeedCertificateModel = IsSetCertificate ? Need.不需要 : Need.需要; - } - } + public bool IsSetCertificate { get => isSetCertificate; set { SetProperty(ref isSetCertificate, value); } } } + + + } diff --git a/BBWYB.Client/ViewModels/PackPurchaseTask/UpdatePurchaseTaskViewModel.cs b/BBWYB.Client/ViewModels/PackPurchaseTask/UpdatePurchaseTaskViewModel.cs index beed8bb..f10991b 100644 --- a/BBWYB.Client/ViewModels/PackPurchaseTask/UpdatePurchaseTaskViewModel.cs +++ b/BBWYB.Client/ViewModels/PackPurchaseTask/UpdatePurchaseTaskViewModel.cs @@ -472,17 +472,101 @@ namespace BBWYB.Client.ViewModels Brand = productApiResponse.Data.Items[0].BrandName; } + + IsNeedBarCode = Need.需要; + IsSetBarCode = true; + IsSetCertificate = true; var productSku = packPurchaseTaskService.GetConfigPack(SkuId, "", OrderId); - if (productSku == null || !productSku.Success || productSku.Data == null) + if (productSku == null) { - MessageBox.Show(productSku.Msg); + MessageBox.Show("网络异常!"); return false; } + PurchaseSkuList = new ObservableCollection(); + SkuPurchaseSchemeId = null; + if (productSku.Success && productSku.Data != null && !string.IsNullOrEmpty(productSku.Data.SkuPurchaseSchemeId)) + { + SkuPurchaseSchemeId = productSku.Data.SkuPurchaseSchemeId; + BarCodeModel = productSku.Data.BarCode; + + foreach (var item in productSku.Data.PurchaseSkus) + { + var list = purchaseService.GetPurchaseSkuBasicInfo(item.PurchaseProductId); + if (list == null || !list.Success || list.Data == null) continue; + var skuItem = list.Data.ItemList.FirstOrDefault(f => f.PurchaseSkuId == item.PurchaseSkuId); + if (skuItem == null) + { + MessageBox.Show($"{item.PurchaseProductId}采购商品列表不存在skuid:{item.PurchaseSkuId},sku商品可能被下架了."); + //return false; + } + App.Current.Dispatcher.Invoke(new Action(() => + { + PurchaseSkuList.Add(new Models.PackPurchaseTask.PurchaseSku + { + Logo = skuItem?.Logo, + Title = skuItem?.Title, + IsNeedCer = item.IsNeedCer, + PurchaseSkuId = item.PurchaseSkuId, + CerDTO = item.CerDTO, + IsSetCertificate = item.CerDTO == null ? true : false, + }); + })); + } + + + if (productSku.Data.PackConfig != null) + { + var config = productSku.Data.PackConfig; + SkuTitle = config.SkuGoodsTitle; + BrandName = config.BrandName; + GoodsNumber = config.GoodsNumber; + PackType = (PackType)config.PackType; + BasicPack = (BasicPack)config.BasicPack; + Availability = (TaskState)config.Availability; + //MarkMessage = config.MarkMessage; + CertificatePosition = config.CertificatePosition == null ? CertificatePosition.无 : (CertificatePosition)config.CertificatePosition.Value; + // Increment1 = config.Increment1; + + IsNeedBarCode = config.NeedBar ? Need.需要 : Need.不需要; + IsNeedCertificateModel = config.NeedCer ? Need.需要 : Need.不需要; + + IsSetBarCode = !config.NeedBar; + IsSetCertificate = !config.NeedCer; + + string[] increateDatas = config.Increment1?.Split(','); + bool isSelected = false; + + IncreateList = new ObservableCollection(); + foreach (var item in increates) + { + isSelected = false; + if (increateDatas != null && increateDatas.Count() > 0 && increateDatas.Contains(item)) + { + isSelected = true; + } + App.Current.Dispatcher.Invoke(() => + { + IncreateList.Add(new IncreateModel + { + IncreateName = item, + IsSelected = isSelected + }); + }); + } + + } + } + else + { + PurchaseSkuList.Add(new Models.PackPurchaseTask.PurchaseSku + { + CerDTO = new CertificateModel { } + }); + } + - SkuPurchaseSchemeId = productSku.Data.SkuPurchaseSchemeId; - BarCodeModel = productSku.Data.BarCode; if (BarCodeModel == null) { BarCodeModel = new BarCodeModel(); @@ -495,75 +579,7 @@ namespace BBWYB.Client.ViewModels BarCodeModel.ProductNo = ProductNo; BarCodeModel.SkuId = SkuId; BarCodeModel.SkuName = SkuName; - PurchaseSkuList = new ObservableCollection(); - foreach (var item in productSku.Data.PurchaseSkus) - { - var list = purchaseService.GetPurchaseSkuBasicInfo(item.PurchaseProductId); - if (list == null) continue; - var skuItem = list.Data.ItemList.FirstOrDefault(f => f.PurchaseSkuId == item.PurchaseSkuId); - if (skuItem == null) - { - MessageBox.Show($"{item.PurchaseProductId}采购商品列表不存在skuid:{item.PurchaseSkuId},sku商品可能被下架了."); - //return false; - } - App.Current.Dispatcher.Invoke(new Action(() => - { - PurchaseSkuList.Add(new Models.PackPurchaseTask.PurchaseSku - { - Logo = skuItem?.Logo, - Title = skuItem?.Title, - IsNeedCer = item.IsNeedCer, - PurchaseSkuId = item.PurchaseSkuId, - CerDTO = item.CerDTO, - IsSetCertificate = item.CerDTO == null ? true : false, - }); - })); - } - IsNeedBarCode = Need.需要; - IsSetBarCode = true; - IsSetCertificate = true; - if (productSku.Data.PackConfig != null) - { - var config = productSku.Data.PackConfig; - SkuTitle = config.SkuGoodsTitle; - BrandName = config.BrandName; - GoodsNumber = config.GoodsNumber; - PackType = (PackType)config.PackType; - BasicPack = (BasicPack)config.BasicPack; - Availability = (TaskState)config.Availability; - //MarkMessage = config.MarkMessage; - CertificatePosition = config.CertificatePosition == null ? CertificatePosition.无 : (CertificatePosition)config.CertificatePosition.Value; - // Increment1 = config.Increment1; - - IsNeedBarCode = config.NeedBar ? Need.需要 : Need.不需要; - IsNeedCertificateModel = config.NeedCer ? Need.需要 : Need.不需要; - - IsSetBarCode = !config.NeedBar; - IsSetCertificate = !config.NeedCer; - - string[] increateDatas = config.Increment1?.Split(','); - bool isSelected = false; - - IncreateList = new ObservableCollection(); - foreach (var item in increates) - { - isSelected = false; - if (increateDatas != null && increateDatas.Count() > 0 && increateDatas.Contains(item)) - { - isSelected = true; - } - App.Current.Dispatcher.Invoke(() => - { - IncreateList.Add(new IncreateModel - { - IncreateName = item, - IsSelected = isSelected - }); - }); - } - - } return true; diff --git a/BBWYB.Client/Views/PackPurchaseTask/UpdatePurchaseTaskWindow.xaml b/BBWYB.Client/Views/PackPurchaseTask/UpdatePurchaseTaskWindow.xaml index 12c5fcc..85f5526 100644 --- a/BBWYB.Client/Views/PackPurchaseTask/UpdatePurchaseTaskWindow.xaml +++ b/BBWYB.Client/Views/PackPurchaseTask/UpdatePurchaseTaskWindow.xaml @@ -126,15 +126,16 @@ - + Foreground="{StaticResource Text.Color}" + Visibility="{Binding SkuPurchaseSchemeId,Converter={StaticResource objConverter},ConverterParameter=#null:Collapsed:Visible}" + > @@ -236,6 +237,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 977599bd05db9ad9415a2949318b2122b1c7d89d Mon Sep 17 00:00:00 2001 From: "506583276@qq.com" <506583276@qq.com> Date: Tue, 27 Jun 2023 15:01:11 +0800 Subject: [PATCH 2/5] 1 --- BBWYB.Client/Models/PackPurchaseTask/CertificateModel.cs | 4 ++-- BBWYB.Client/Models/PackPurchaseTask/PurchaseSku.cs | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/BBWYB.Client/Models/PackPurchaseTask/CertificateModel.cs b/BBWYB.Client/Models/PackPurchaseTask/CertificateModel.cs index 1db59f8..edd9b61 100644 --- a/BBWYB.Client/Models/PackPurchaseTask/CertificateModel.cs +++ b/BBWYB.Client/Models/PackPurchaseTask/CertificateModel.cs @@ -146,11 +146,11 @@ namespace BBWYB.Client.Models.PackPurchaseTask - private int goodsNumber = 1; + private long goodsNumber = 1; /// /// 配件序号 /// - public int GoodsNumber { get => goodsNumber; set { SetProperty(ref goodsNumber, value); } } + public long GoodsNumber { get => goodsNumber; set { SetProperty(ref goodsNumber, value); } } private string produceDate; /// diff --git a/BBWYB.Client/Models/PackPurchaseTask/PurchaseSku.cs b/BBWYB.Client/Models/PackPurchaseTask/PurchaseSku.cs index 493f428..0fa4e65 100644 --- a/BBWYB.Client/Models/PackPurchaseTask/PurchaseSku.cs +++ b/BBWYB.Client/Models/PackPurchaseTask/PurchaseSku.cs @@ -10,7 +10,7 @@ namespace BBWYB.Client.Models.PackPurchaseTask /// /// 配件sku /// - public class PurchaseSku : ObservableObject + public class PurchaseSku:ObservableObject { /// @@ -32,7 +32,7 @@ namespace BBWYB.Client.Models.PackPurchaseTask /// /// 配件图 /// - public string Logo { get => logo; set { SetProperty(ref logo, value); } } + public string Logo { get=>logo; set { SetProperty(ref logo, value); } } /// /// 配件商品Id /// @@ -54,10 +54,8 @@ namespace BBWYB.Client.Models.PackPurchaseTask /// /// 设置显示(合格证) /// - public bool IsSetCertificate { get => isSetCertificate; set { SetProperty(ref isSetCertificate, value); } } + public bool IsSetCertificate{get => isSetCertificate; set{SetProperty(ref isSetCertificate, value);}} } - - } From ccce8753d8f0e2c06f4c70d8c16e9b711473b195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=9E=E9=B1=BC?= <506583276@qq.com> Date: Mon, 8 Apr 2024 22:15:54 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E1688=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E4=B8=8B=E5=8D=95=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BBWYB.Client/APIServices/MdsApiService.cs | 6 +- BBWYB.Client/App.xaml | 4 +- BBWYB.Client/App.xaml.cs | 4 + BBWYB.Client/BBWYB.Client.csproj | 3 +- BBWYB.Client/GlobalContext.cs | 358 ++++++- .../Helpers/1688/Collect1688Helper.cs | 927 +++++++++++++++++ BBWYB.Client/Helpers/1688/Md5Helper.cs | 28 + BBWYB.Client/Helpers/CustomWebView2.cs | 32 + BBWYB.Client/Models/1688/AddressModel.cs | 17 + BBWYB.Client/Models/1688/OrderParameter.cs | 109 ++ BBWYB.Client/Models/1688/OrderProduct.cs | 22 + BBWYB.Client/Models/1688/PrewOrderResponse.cs | 25 + BBWYB.Client/Models/1688/ProductModel.cs | 15 + BBWYB.Client/Models/1688/_1688CookieModel.cs | 23 + .../Request/PackPurchaseTask/CerRequest.cs | 2 +- BBWYB.Client/Models/Enums.cs | 10 + BBWYB.Client/Models/Shop/PurchaseAccount.cs | 5 + BBWYB.Client/Views/1688/Login1688Window.xaml | 12 + .../Views/1688/Login1688Window.xaml.cs | 214 ++++ .../Views/1688/NewLogin1688Window.xaml | 13 + .../Views/1688/NewLogin1688Window.xaml.cs | 184 ++++ BBWYB.Client/Views/Web.xaml.cs | 18 +- BBWYB.Client/WebView2Manager.cs | 4 +- BBWYB.Client/appsettings.json | 4 +- BBWYB.Server.API/BBWYB.Server.API.csproj | 1 + .../Controllers/PurchaseOrderController.cs | 15 + .../BBWYB.Server.Business.csproj | 1 + .../PurchaseOrder/PurchaseOrderBusiness.cs | 604 ++++++++++++ .../PurchaseProductAPIService.cs | 2 +- .../Vender/VenderBusiness.cs | 1 + .../_1688Helper/Collect1688Helper.cs | 930 ++++++++++++++++++ .../_1688Helper/Md5Helper.cs | 28 + BBWYB.Server.Model/Db/MDS/Purchaseaccount.cs | 7 +- .../PurchaseOrder/CreateOrderRequest.cs | 9 + .../PurchaseOrder/PreviewOrderRequest.cs | 2 + .../Dto/Request/Vender/ShopSettingRequest.cs | 2 + BBWYB.Server.Model/Dto/_1688/AddressModel.cs | 17 + .../Dto/_1688/OrderParameter.cs | 110 +++ BBWYB.Server.Model/Dto/_1688/OrderProduct.cs | 22 + .../Dto/_1688/PrewOrderResponse.cs | 26 + BBWYB.Server.Model/Dto/_1688/ProductModel.cs | 15 + .../Dto/_1688/_1688CookieModel.cs | 21 + BBWYB.Server.Model/Enums.cs | 10 + 43 files changed, 3845 insertions(+), 17 deletions(-) create mode 100644 BBWYB.Client/Helpers/1688/Collect1688Helper.cs create mode 100644 BBWYB.Client/Helpers/1688/Md5Helper.cs create mode 100644 BBWYB.Client/Helpers/CustomWebView2.cs create mode 100644 BBWYB.Client/Models/1688/AddressModel.cs create mode 100644 BBWYB.Client/Models/1688/OrderParameter.cs create mode 100644 BBWYB.Client/Models/1688/OrderProduct.cs create mode 100644 BBWYB.Client/Models/1688/PrewOrderResponse.cs create mode 100644 BBWYB.Client/Models/1688/ProductModel.cs create mode 100644 BBWYB.Client/Models/1688/_1688CookieModel.cs create mode 100644 BBWYB.Client/Views/1688/Login1688Window.xaml create mode 100644 BBWYB.Client/Views/1688/Login1688Window.xaml.cs create mode 100644 BBWYB.Client/Views/1688/NewLogin1688Window.xaml create mode 100644 BBWYB.Client/Views/1688/NewLogin1688Window.xaml.cs create mode 100644 BBWYB.Server.Business/_1688Helper/Collect1688Helper.cs create mode 100644 BBWYB.Server.Business/_1688Helper/Md5Helper.cs create mode 100644 BBWYB.Server.Model/Dto/_1688/AddressModel.cs create mode 100644 BBWYB.Server.Model/Dto/_1688/OrderParameter.cs create mode 100644 BBWYB.Server.Model/Dto/_1688/OrderProduct.cs create mode 100644 BBWYB.Server.Model/Dto/_1688/PrewOrderResponse.cs create mode 100644 BBWYB.Server.Model/Dto/_1688/ProductModel.cs create mode 100644 BBWYB.Server.Model/Dto/_1688/_1688CookieModel.cs diff --git a/BBWYB.Client/APIServices/MdsApiService.cs b/BBWYB.Client/APIServices/MdsApiService.cs index 11940be..79e3c80 100644 --- a/BBWYB.Client/APIServices/MdsApiService.cs +++ b/BBWYB.Client/APIServices/MdsApiService.cs @@ -80,7 +80,8 @@ namespace BBWYB.Client.APIServices PlatformCommissionRatio = jShop.Value("PlatformCommissionRatio") ?? 0.05M, ShopName = jShop.Value("ShopName"), VenderType = jShop.Value("ShopType"), - TeamId = jShop.Value("TeamId") + TeamId = jShop.Value("TeamId"), + }; d.ShopList.Add(shop); @@ -95,7 +96,8 @@ namespace BBWYB.Client.APIServices AppSecret = jPurchaseAccount.Value("AppSecret"), AppToken = jPurchaseAccount.Value("AppToken"), ShopId = shop.ShopId, - PurchasePlatformId = (Platform)jPurchaseAccount.Value("AppPlatformId") + PurchasePlatformId = (Platform)jPurchaseAccount.Value("AppPlatformId"), + Password = jPurchaseAccount.Value("Password"), }); } } diff --git a/BBWYB.Client/App.xaml b/BBWYB.Client/App.xaml index 2048417..d69d440 100644 --- a/BBWYB.Client/App.xaml +++ b/BBWYB.Client/App.xaml @@ -4,9 +4,9 @@ xmlns:local="clr-namespace:BBWYB.Client" xmlns:vm="clr-namespace:BBWYB.Client.ViewModels" xmlns:ctr="clr-namespace:BBWYB.Client.Converters" - StartupUri="/Views/Web.xaml" + StartupUri="/Views/Web.xaml" ShutdownMode="OnExplicitShutdown"> - + diff --git a/BBWYB.Client/App.xaml.cs b/BBWYB.Client/App.xaml.cs index 826b4a8..5c620b5 100644 --- a/BBWYB.Client/App.xaml.cs +++ b/BBWYB.Client/App.xaml.cs @@ -30,6 +30,8 @@ namespace BBWYB.Client var gl = new GlobalContext(); string userToken = string.Empty; + + #if DEBUG //齐越山鸡 //userToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxNTM1MzMwMzI4ODkyMTQ5NzYwIiwidGVhbUlkIjoiMTUxNjk3NDI1MDU0MjUwMTg4OCIsInNvblRlYW1JZHMiOiIxNDM2Mjg4NTAwMjM1MjQzNTIwIiwiZXhwIjoxNzI2MzAwNjY0fQ.hPSbgJEuTt0MLy_7YkSJX4rRG3drJAfso-5IS8ZlOkY"; @@ -85,6 +87,8 @@ namespace BBWYB.Client serviceCollection.AddTransient(); serviceCollection.AddMapper(new MappingProfile()); ServiceProvider = serviceCollection.BuildServiceProvider(); + + base.OnStartup(e); } diff --git a/BBWYB.Client/BBWYB.Client.csproj b/BBWYB.Client/BBWYB.Client.csproj index 5fca9cb..77215bc 100644 --- a/BBWYB.Client/BBWYB.Client.csproj +++ b/BBWYB.Client/BBWYB.Client.csproj @@ -37,9 +37,10 @@ - + + diff --git a/BBWYB.Client/GlobalContext.cs b/BBWYB.Client/GlobalContext.cs index e35f704..2395bbb 100644 --- a/BBWYB.Client/GlobalContext.cs +++ b/BBWYB.Client/GlobalContext.cs @@ -1,14 +1,21 @@ using BBWYB.Client.APIServices; using BBWYB.Client.Helpers; using BBWYB.Client.Models; +using BBWYB.Client.Models._1688; +using BBWYB.Client.Views; +using BBWYB.Client.Views._1688; using BBWYB.Client.Views.PackPurchaseTaska; +using BBWYB.Common.Models; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.Linq; using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; using System.Windows; namespace BBWYB.Client @@ -20,9 +27,11 @@ namespace BBWYB.Client { public GlobalContext() { - BBWYBApiVersion = "10041"; + BBWYBApiVersion = "10042"; } + public List<_1688CookieModel> _1688CookieList { get; set; } = new List<_1688CookieModel>(); + private User user; public User User { get => user; set { SetProperty(ref user, value); } } @@ -44,6 +53,7 @@ namespace BBWYB.Client public string QKApiHost { get; set; } public string BBWYBApiVersion { get; set; } + public Window CurryWindow { get; set; } #endregion #region Web @@ -120,6 +130,352 @@ namespace BBWYB.Client packTask.Show(); // } + + + /// + /// + /// + /// + /// + /// 是否必须登陆 + /// + public async Task Login1688_(string userName, string password, bool IsNeedLogin) + { + return await Task.Factory.StartNew(() => + { + if (!IsNeedLogin) + { + if (_1688CookieList.Any(c => c.UserName == userName)) + { + return _1688CookieList.FirstOrDefault(c => c.UserName == userName).Cookie; + } + } + string cookie = string.Empty; + try + { + //检查是否跨线程 + + if (!App.Current.Dispatcher.CheckAccess()) + { + App.Current.Dispatcher.Invoke(new Action(() => + { + var loginWindow = new Login1688Window(userName, password); + loginWindow.ShowDialog(); + var newCookie = loginWindow.downCookies; + + + if (!string.IsNullOrEmpty(newCookie)) + //更新或者添加 + if (_1688CookieList.Any(c => c.UserName == userName)) + { + var oldCookie = _1688CookieList.FirstOrDefault(c => c.UserName == userName); + oldCookie.Cookie = newCookie; + } + else + { + _1688CookieList.Add(new _1688CookieModel() { UserName = userName, Cookie = newCookie }); + } + + cookie = loginWindow.downCookies; + + })); + } + } + catch (Exception ex) + { + + + } + return cookie; + + }); + + + + + + + } + + /// + /// + /// + /// + /// + /// 是否必须登陆 + /// + public async Task Login1688123(string userName, string password, bool IsNeedLogin) + { + return await Task.Factory.StartNew(() => + { + if (!IsNeedLogin) + { + if (_1688CookieList.Any(c => c.UserName == userName)) + { + return _1688CookieList.FirstOrDefault(c => c.UserName == userName).Cookie; + } + } + string cookie = string.Empty; + + try + { + //检查是否跨线程 + + if (!App.Current.Dispatcher.CheckAccess()) + { + App.Current.Dispatcher.Invoke(new Action(() => + { + var loginWindow = new NewLogin1688Window(userName, password); + loginWindow.ShowDialog(); + var newCookie = loginWindow.downCookies; + //更新或者添加 + if (_1688CookieList.Any(c => c.UserName == userName)) + { + var oldCookie = _1688CookieList.FirstOrDefault(c => c.UserName == userName); + oldCookie.Cookie = newCookie; + } + else + { + _1688CookieList.Add(new _1688CookieModel() { UserName = userName, Cookie = newCookie }); + } + cookie = loginWindow.downCookies; + + })); + } + //else + //{ + // var loginWindow = new NewLogin1688Window(userName, password); + // loginWindow.ShowDialog(); + // var newCookie = loginWindow.downCookies; + // //更新或者添加 + // if (_1688CookieList.Any(c => c.UserName == userName)) + // { + // var oldCookie = _1688CookieList.FirstOrDefault(c => c.UserName == userName); + // oldCookie.Cookie = newCookie; + // } + // else + // { + // _1688CookieList.Add(new _1688CookieModel() { UserName = userName, Cookie = newCookie }); + // } + // cookie = loginWindow.downCookies; + + //} + } + catch (Exception ex) + { + + + } + return cookie; + + }); + + + + + + + } + + + + + /// + /// 客户端登陆 不获取cookie + /// + /// + /// + /// 是否必须登陆 + /// + public string Login1688(string userName, string password, bool IsNeedLogin) + { + + if (!IsNeedLogin) + { + if (_1688CookieList.Any(c => c.UserName == userName&&!c.IsExpire)) + { + return JsonConvert.SerializeObject(_1688CookieList.FirstOrDefault(c => c.UserName == userName)); + } + } + + Task.Factory.StartNew(() => + { + + try + { + //检查是否跨线程 + + if (!App.Current.Dispatcher.CheckAccess()) + { + App.Current.Dispatcher.Invoke(new Action(() => + { + var loginWindow = new NewLogin1688Window(userName, password); + loginWindow.ShowDialog(); + var newCookie = loginWindow.downCookies; + + + if (!string.IsNullOrEmpty(newCookie)) + //更新或者添加 + if (_1688CookieList.Any(c => c.UserName == userName)) + { + var oldCookie = _1688CookieList.FirstOrDefault(c => c.UserName == userName); + oldCookie.Cookie = newCookie; + } + else + { + _1688CookieList.Add(new _1688CookieModel() { UserName = userName, Cookie = newCookie, Password = password, LoginTime = DateTime.Now }); + } + //SaveLocalFile?.Invoke(_1688LogunPath, JsonConvert.SerializeObject(_1688CookieList)); + + })); + } + //else + //{ + // var loginWindow = new NewLogin1688Window(userName, password); + // loginWindow.ShowDialog(); + // var newCookie = loginWindow.downCookies; + // //更新或者添加 + // if (_1688CookieList.Any(c => c.UserName == userName)) + // { + // var oldCookie = _1688CookieList.FirstOrDefault(c => c.UserName == userName); + // oldCookie.Cookie = newCookie; + // } + // else + // { + // _1688CookieList.Add(new _1688CookieModel() { UserName = userName, Cookie = newCookie }); + // } + // cookie = loginWindow.downCookies; + + //} + } + catch (Exception ex) + { + } + }); + + return null; + } + //public Action SaveLocalFile { get; set; } + //public const string _1688LogunPath = "1688LoginCookies"; + + public void SetCookieExpire(string userName) + { + if (_1688CookieList.Any(c => c.UserName == userName)) + { + var oldCookie = _1688CookieList.FirstOrDefault(c => c.UserName == userName); + oldCookie.IsExpire = true; + //SaveLocalFile?.Invoke(_1688LogunPath, JsonConvert.SerializeObject(_1688CookieList)); + } + } + /* + public string CreatePurchaseOrderByWeb(string orderProductListJson, string adress, int _orderModel, string remark, string userName, string password) + { + + OrderModel orderModel = (OrderModel)_orderModel; + List models = JsonConvert.DeserializeObject>(orderProductListJson); + + + List distinModels = new List(); + //合并相同的sku商品 叠加数量 + foreach (var item in models) + { + + //判断是否存在 + if (distinModels.Any(m => m.SkuId == item.SkuId && m.SpectId == item.SpectId && m.ProductId == item.ProductId)) + { + var oldModel = distinModels.FirstOrDefault(m => m.SkuId == item.SkuId); + oldModel.Quantity += item.Quantity; + } + else + { + distinModels.Add(item); + } + + + } + + + models = distinModels; + + + + + string cookie = ""; + + if (_1688CookieList.Any(c => c.UserName == userName)) + { + var oldCookie = _1688CookieList.FirstOrDefault(c => c.UserName == userName); + cookie = oldCookie.Cookie; + } + else + { + Login1688(userName, password, true); + + return JsonConvert.SerializeObject(new ApiResponse + { + Code = 1000, + Msg = "登录失效,请重新登陆后下单", + + }); + } + Collect1688Helper collect1688Helper = new Collect1688Helper(cookie); + + var prewOrder = collect1688Helper.PrewOrder(models, adress, orderModel); + if (prewOrder == null) + { + Login1688(userName, password, true); + return JsonConvert.SerializeObject(new ApiResponse + { + Code = 1000, + Msg = "登录失效,正在重新登陆,登录后点击下单!", + }); + } + return JsonConvert.SerializeObject(collect1688Helper.CommitOrder(prewOrder, remark)); + + } + public async Task CreatePurchaseOrderByWeb_olf(string orderProductListJson, string adress, int _orderModel, string remark, string userName, string password) + { + + OrderModel orderModel = (OrderModel)_orderModel; + List models = JsonConvert.DeserializeObject>(orderProductListJson); + + string cookie = ""; + + if (_1688CookieList.Any(c => c.UserName == userName)) + { + var oldCookie = _1688CookieList.FirstOrDefault(c => c.UserName == userName); + cookie = oldCookie.Cookie; + } + else + { + Login1688(userName, password, true); + + return JsonConvert.SerializeObject(new ApiResponse + { + Code = 1000, + Msg = "登录失效,请重新登陆后下单", + + }); + } + + + return await Task.Factory.StartNew(() => + { + Collect1688Helper collect1688Helper = new Collect1688Helper(cookie); + + var prewOrder = collect1688Helper.PrewOrder(models, adress, orderModel); + if (prewOrder == null) + { + return JsonConvert.SerializeObject(new ApiResponse + { + Code = 1000, + Msg = "预览订单失败,登录失效", + }); + } + return JsonConvert.SerializeObject(collect1688Helper.CommitOrder(prewOrder, remark)); + }); + } + */ #endregion } } \ No newline at end of file diff --git a/BBWYB.Client/Helpers/1688/Collect1688Helper.cs b/BBWYB.Client/Helpers/1688/Collect1688Helper.cs new file mode 100644 index 0000000..6c95654 --- /dev/null +++ b/BBWYB.Client/Helpers/1688/Collect1688Helper.cs @@ -0,0 +1,927 @@ +using BBWYB.Client.Models; +//using BBWYB.Common.Models; +//using HtmlAgilityPack; +//using Newtonsoft.Json; +//using Newtonsoft.Json.Linq; +//using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Net.Http; +//using System.Text; +//using System.Text.RegularExpressions; +//using System.Threading.Tasks; + +//namespace BBWYB.Client.Helpers +//{ +// /// +// /// 手动支付采购单业务 +// /// +// public class Collect1688Helper +// { + +// private string _1688Cookie { get; set; } +// public Action AddLog { get; set; } + +// public Collect1688Helper(string _1688Cookie) +// { +// this._1688Cookie = _1688Cookie; +// } + +// private string UrlEncode(string str, string encodingStr) +// { +// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); +// return System.Web.HttpUtility.UrlEncode(str, Encoding.GetEncoding(encodingStr)); +// } + +// /// +// /// +// /// +// /// +// public ProductModel GetProductMsg(string offerId)//获取限制条件 +// { +// string url = $"https://detail.1688.com/offer/{offerId}.html"; +// using HttpClient http = new HttpClient(); + +// //添加cookie +// http.DefaultRequestHeaders.Add("Cookie", _1688Cookie); +// http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"); +// var res = http.GetAsync(url).Result; +// if (res.IsSuccessStatusCode) +// { +// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); +// var html = res?.Content?.ReadAsStringAsync().Result; + +// string ipvId = GetRegexValue(html, "\"ipvId\":\"([^\"]+)\""); //可以不带ipvId +// //"sellerUserId":3199397430, +// //string sellerUserId = GetRegexValue(html, "\"sellerUserId\":([^,]+),"); + +// //"mixNumber": 2, +// int mixNumber = int.Parse(GetRegexValue(html, "\"mixNumber\":([^,]+),")); +// return new ProductModel() { MixNumber = mixNumber, IpvId = ipvId }; +// } +// AddLog("获取商品信息失败"); +// return null; +// } + + +// public OrderParameter GetProductParameter(List orderProducts, OrderModel orderModel, string ipvId) +// { +// var flow = orderModel.ToString(); //下单类型 +// string url = $"https://order.1688.com/order/smart_make_order.htm?p=detail&_input_charset=utf-8&fromkv={UrlEncode($"offerdetail:pc;ipvId:{ipvId}", "utf-8")}"; + +// List orderProductIds = new List(); +// foreach (var orderProduct in orderProducts) +// { +// orderProductIds.Add(@$"{{""specId"":""{orderProduct.SpectId}"",""offerId"":{orderProduct.ProductId},""quantity"":{orderProduct.Quantity},""flow"":""{flow}"",""ext"":{{""sceneCode"":""""}},""selectedTradeServices"":[]}}"); + +// } + +// var id = UrlEncode($"[{string.Join(",", orderProductIds)}]", "gb2312"); + +// string postData = $"id={id}&flow=xxx"; + + +// var response = PostHtml(url, postData, _1688Cookie); + +// if (response == null || !response.IsSuccessStatusCode) +// { +// AddLog("获取订单参数失败"); +// return null; +// } +// // string lvid = response.Headers.Get("Eagleeye-Traceid"); + +// string lvid = ""; +// if (response.Headers.Contains("Eagleeye-Traceid")) +// { +// //获取响应头 Resin-Trace的值 + +// var trace = response.Headers.GetValues("Eagleeye-Traceid"); +// if (trace.Any()) +// { +// lvid = trace.FirstOrDefault(); +// } +// } + +// string html = response.Content.ReadAsStringAsync().Result; +// var orderUrl = GetRegexValue(html, "action=\"([^\"]+)\"").Replace("&", "&"); + +// //data-default-checked-address-id="6012255930" +// var address = GetRegexValue(html, "data-default-checked-address-id=\"([^\"]+)\""); + +// //name="_fm.smarta._0.t" value="350502005" +// var townCode = GetRegexValue(html, "name=\"_fm.smarta._0.t\" value=\"([^\"]+)\""); + +// var res = new OrderParameter() +// { +// Lvid = lvid, +// OrderUrl = orderUrl, +// Address = address, +// TownCode = townCode, +// IpvId = ipvId +// }; +// HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); +// htmlDoc.LoadHtml(html); + +// HtmlNode csrfInput = htmlDoc.DocumentNode.SelectSingleNode("//input[@name='_csrf_token']"); + +// if (csrfInput != null) +// { +// // 获取 value 属性的值 +// string csrfTokenValue = csrfInput.GetAttributeValue("value", ""); +// res.Csrf_token = csrfTokenValue; +// } + + +// // 使用XPath选择器获取
元素 +// HtmlNode orderDiv = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='order']"); + +// if (orderDiv != null) +// { +// List OrderGroupParameterList = new List(); + +// // 获取
内的所有子元素 +// HtmlNodeCollection childNodes = orderDiv.ChildNodes; +// foreach (HtmlNode node in childNodes) +// { +// // 处理每个子元素 +// string innerText = node.InnerText; // 获取元素的文本内容 +// string outerHtml = node.OuterHtml; // 获取元素的HTML代码 +// // 其他操作... + +// if (node.Name == "div") +// { +// var zone_orders = node.Descendants("div") +// .Where(div => div.Attributes.Contains("class") && div.GetAttributeValue("class", "").Equals("zone-order", StringComparison.OrdinalIgnoreCase)); + +// foreach (HtmlNode zone_order in zone_orders) +// { +// // 获取 data-source 属性的值 +// string dataSourceValue = zone_order.GetAttributeValue("data-source", ""); + +// var groupHeaderJson = JsonConvert.DeserializeObject(dataSourceValue); +// //sellerMemberId +// string sellerMemberId = groupHeaderJson.sellerMemberId.ToString(); +// //sellerUserId +// string sellerUserId = groupHeaderJson.sellerUserId.ToString(); +// ////buyerMemberId +// //string buyerMemberId = groupHeaderJson.buyerMemberId.ToString(); +// //orderOutId +// string orderOutId = groupHeaderJson.orderOutId.ToString(); +// //group +// string group = groupHeaderJson.group.ToString(); +// //belong +// string belong = groupHeaderJson.belong.ToString(); +// //flow 下单类型 +// flow = groupHeaderJson?.flow?.ToString(); +// //bizType +// string bizType = groupHeaderJson?.bizType?.ToString(); + + +// var groupDiv = zone_order.Descendants("li") +// .Where(li => li.Attributes.Contains("class") && li.GetAttributeValue("class", "").Equals("step-item step-item-first", StringComparison.OrdinalIgnoreCase)); +// //.SelectSingleNode("//li[@class='step-item step-item-first']"); + +// if (groupDiv == null) +// { +// continue; +// } + +// string stepName = ""; +// foreach (var item in groupDiv) +// { +// var groupDivDataSource = item.GetAttributeValue("data-source", ""); +// if (groupDivDataSource != null) +// { + +// var json = JsonConvert.DeserializeObject(groupDivDataSource); +// group = json.group.ToString(); +// stepName = json.stepName.ToString(); +// } +// } + + + + +// OrderGroupParameter orderGroupParameter = new OrderGroupParameter() +// { +// Group = group, +// StepName = stepName, +// OrderOutId = orderOutId, +// MemberId = sellerMemberId, +// SellerUserId = sellerUserId, +// Belong = belong, + + +// }; + + + + + +// var groupOrders = zone_order.Descendants("tr") +// .Where(tr => tr.Attributes.Contains("data-group-name")); +// List productAmountList = new List(); +// List OrderProductParameterList = new List(); +// foreach (var groupOrder in groupOrders) +// { + +// if (groupOrder.Name == "tr") +// { + +// var data_source = groupOrder.GetAttributeValue("data-source", ""); +// string groutOuterHtml = groupOrder.OuterHtml; +// if (data_source != null) +// { + +// var sumCarriage = GetRegexValue(groutOuterHtml, "\"fee\":([^,]+),"); +// if (sumCarriage == null) +// { +// sumCarriage = "0"; +// } + +// //"freightId":"18605534" +// var freightId = GetRegexValue(groutOuterHtml, "\"freightId\":\"([^\"]+)\""); +// //'freightId':'16850501' +// if (freightId == null) +// { +// freightId = GetRegexValue(groutOuterHtml, "'freightId':'([^\']+)'"); +// } + + + +// //'outId':'general_705889664759_df9e522ec29afb80a682fcaac1dce50c', +// var outId = GetRegexValue(data_source, "'outId':'([^']+)'"); + + + +// //"discountFee":"0" +// var discountFee = decimal.Parse(GetRegexValue(data_source, "\"discountFee\":\"([^\"]+)\"") ?? "0"); + + +// var cargoKey = GetRegexValue(data_source, "'cargoKey':'([^']+)'"); +// //'unitPrice':'6.33' +// var unitPrice = decimal.Parse(GetRegexValue(data_source, "'unitPrice':'([^']+)'")); +// var payFee = (int)(unitPrice * 100); + +// //'quantity':1.0 +// int quantity = (int)(decimal.Parse(GetRegexValue(data_source, "'quantity':([^,]+),"))); + +// //'offerId':'563883060952', +// var offerId = GetRegexValue(data_source, "'offerId':'([^']+)'"); + +// //'skuId':'ea66ab9ceff1fbcc8d0b97d4926e476f', +// var spectId = GetRegexValue(data_source, "'skuId':'([^']+)'"); + +// //'tbSkuId':'5408119750040', +// var skuId = GetRegexValue(data_source, "'tbSkuId':'([^']+)'"); +// //'offerPriceRangeJson':[{"ba":1,"ea":0,"p":2.5}] +// var offerPriceRangeJson = GetRegexValue(data_source, "'offerPriceRangeJson'\\s*:\\s*\\[(.*?)\\]")?.Replace(""", "\""); + + +// var productAmount = quantity * unitPrice - discountFee; +// productAmountList.Add(productAmount); + + +// OrderProductParameterList.Add(new OrderProductParameter() +// { +// ProductAmount = productAmount, +// CargoKey = cargoKey, +// ProductId = offerId, +// SkuId = skuId, +// SpectId = spectId, +// UnitPrice = unitPrice, +// Quantity = quantity, +// DiscountFee = discountFee, +// SumCarriage = decimal.Parse(sumCarriage), +// FreightId = freightId, +// OutId = outId, +// OfferPriceRangeJson = offerPriceRangeJson + +// }); +// } + +// } +// } + +// var totalProductAmount = OrderProductParameterList.Sum(p => p.ProductAmount); + +// var actualPay = OrderProductParameterList.Sum(p => p.ProductAmount + p.SumCarriage); + + +// orderGroupParameter.SumCarriage = OrderProductParameterList.Sum(p => p.SumCarriage); +// orderGroupParameter.ActualPay = actualPay; +// orderGroupParameter.ActualPayFee = (int)(actualPay * 100); +// orderGroupParameter.TotalProductAmount = totalProductAmount; +// orderGroupParameter.PayFee = (int)(totalProductAmount * 100); +// orderGroupParameter.OrderProductParameterList = OrderProductParameterList; +// OrderGroupParameterList.Add(orderGroupParameter); +// } + + +// } +// } + +// res.OrderGroupParameterList = OrderGroupParameterList; + + +// } + +// return res; + +// } + + +// /// +// /// 输入临时收货地址(姓名 手机号 收货地址)或者直接输入地址 (主要获取邮编编码) //feiyu 19959858952 福建省泉州市鲤城区金龙街道古龙路媒人桥2号三文公寓一楼齐越中转仓 +// /// +// public AddressModel InputAddress(string adress, string _csrf_token) +// { +// //callback=jQuery17207000444400310621_1711938052406&address=feiyu+19959858952+%E7%A6%8F%E5%BB%BA%E7%9C%81%E6%B3%89%E5%B7%9E%E5%B8%82%E9%B2%A4%E5%9F%8E%E5%8C%BA%E9%87%91%E9%BE%99%E8%A1%97%E9%81%93%E5%8F%A4%E9%BE%99%E8%B7%AF%E5%AA%92%E4%BA%BA%E6%A1%A52%E5%8F%B7%E4%B8%89%E6%96%87%E5%85%AC%E5%AF%93%E4%B8%80%E6%A5%BC%E9%BD%90%E8%B6%8A%E4%B8%AD%E8%BD%AC%E4%BB%93&_csrf_token=42b5ba743ad1a219f275a0f2b8f13303&_input_charset=utf-8 +// string url = $"https://wuliu.1688.com/address/ajax/address_parse.jsx?callback=jQuery17207000444400310621_1711938052406&address={UrlEncode(adress, "utf-8")}&_csrf_token={_csrf_token}&_input_charset=utf-8"; + +// /* +// jQuery17207000444400310621_1711938052406({ +// "data": { +// "addressDetail": "金龙街道古龙路媒人桥2号三文公寓一楼齐越中转仓", +// "city": "泉州市", +// "cityCode": 350500, +// "district": "鲤城区", +// "districtCode": 350502, +// "divisionZip": "362000", +// "mobileNO": "19959858952", +// "personalName": "feiyu", +// "province": "福建省", +// "provinceCode": 350000 +// }, +// "success": true +//}) +// */ + +// using HttpClient http = new HttpClient(); +// http.BaseAddress = new Uri(url); +// http.DefaultRequestHeaders.Add("Cookie", _1688Cookie); +// http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"); +// var res = http.GetAsync(url).Result; +// if (res.IsSuccessStatusCode) +// { +// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); +// var html = res?.Content?.ReadAsStringAsync().Result; +// if (html.Contains("会话已过期,请刷新页面")) +// { +// AddLog?.Invoke("登陆已过期,请刷新页面"); +// return null; +// } + +// var addressCode = GetRegexValue(html, "\"districtCode\":(\\d+)"); +// var divisionZip = GetRegexValue(html, "\"divisionZip\":\"([^\"]+)\""); +// var mobileNO = GetRegexValue(html, "\"mobileNO\":\"([^\"]+)\""); +// var personalName = GetRegexValue(html, "\"personalName\":\"([^\"]+)\""); +// var addressDetail = GetRegexValue(html, "\"addressDetail\":\"([^\"]+)\""); +// return new AddressModel() +// { +// AddressDetail = addressDetail, +// DivisionZip = divisionZip, +// MobileNO = mobileNO, +// PersonalName = personalName, +// AddressCode = addressCode +// }; +// } + +// return null; + + + +// } + +// //刷新物流列表 +// public OrderParameter ReflashAdress(OrderParameter oldData, AddressModel addressModel, OrderModel orderModel) +// { + +// string url = "https://order.1688.com/order/smart_ajax.jsx?_input_charset=utf-8"; + + + +// List generalOrders_orderGroupKeyList = new List(); +// foreach (var orderGroup in oldData.OrderGroupParameterList) +// { +// List orderList = new List(); +// foreach (var orderProduct in orderGroup.OrderProductParameterList) +// { +// string freightId = orderProduct.FreightId; +// string order = $@"{{""offerId"":""{orderProduct.ProductId}"",""skuId"":""{orderProduct.SpectId}"",""tbSkuId"":""{orderProduct.SkuId}"",""hasSkuUmp"":""false"",""outId"":""{orderProduct.OutId}"",""quantity"":{orderProduct.Quantity},""isfreefreight"":0,""marketingScene"":"""",""offerPriceRangeJson"":[{orderProduct.OfferPriceRangeJson}],""unitPrice"":""{orderProduct.UnitPrice}"",""bundle"":"""",""couple"":"""",""freightId"":""{freightId}"",""rebate"":0,""buyerBearServiceFee"":false,""gift"":""0""}}"; +// orderList.Add(order); +// } + + +// string orderGroupData = $@"""{orderGroup.Group}"":{{""order"":[{string.Join(",", orderList)}] ,""orderOutId"":""{orderGroup.OrderOutId}"",""orderBundle"":"""",""orderCouple"":"""",""type"":""address"",""memberId"":""{orderGroup.MemberId}"",""sellerUserId"":""{orderGroup.SellerUserId}"",""operate"":"""",""countyCode"":""{addressModel.AddressCode}"",""addressCode"":""{addressModel.AddressCode}"",""address"":""-1"",""townCode"":"""",""umpSysAvailble"":""1"",""bizType"":""{orderModel}"",""bizScene"":""{orderModel}"",""transportType"":""multiStep"",""groupId"":""{orderGroup.Group}"",""tplCode"":""assureTrade"",""countryISOCode"":"""",""channelId"":"""",""mobile"":""{addressModel.MobileNO}"",""orderAmount"":""{orderGroup.ActualPayFee}"",""carriage"":""{orderGroup.SumCarriage}"",""belong"":""{orderGroup.Belong}""}}"; + +// generalOrders_orderGroupKeyList.Add(orderGroupData); +// } + +// string generalOrders_orderGroupKey = string.Join(",", generalOrders_orderGroupKeyList); + + + +// string data = $"{{\"ordersUmp.0\":{{\"orderBlockAjaxParam\":{{\"{orderModel}Orders..orderGroupKey\":{{{generalOrders_orderGroupKey}}}}},\"changeType\":\"address\",\"selectedCrossPromotionId\":\"\",\"selectedCrossPromotionIdMap\":\"{{}}\",\"bizScene\":\"{orderModel}\"}}}}"; + +// string postData = $"tasks=ordersUmp.0&data={UrlEncode(data, "UTF-8")}&_csrf_token={oldData.Csrf_token}&lvId={oldData.Lvid}"; +// var response = PostHtml(url, postData, _1688Cookie); + +// if (response == null || !response.IsSuccessStatusCode) +// { +// AddLog("获取订单参数失败"); +// return null; +// } +// // string lvid = response.Headers.Get("Eagleeye-Traceid"); + +// if (response.Headers.Contains("Eagleeye-Traceid")) +// { +// //获取响应头 Resin-Trace的值 + +// var trace = response.Headers.GetValues("Eagleeye-Traceid"); +// if (trace.Any()) +// { +// oldData.Lvid = trace.FirstOrDefault(); +// } +// } + +// var html = response.Content.ReadAsStringAsync().Result; + +// var json = JsonConvert.DeserializeObject(html); + +// dynamic jsonObj = JsonConvert.DeserializeObject(html); + + +// if (jsonObj["success"].ToString() == "true") +// { + + +// var datawuliu = jsonObj["data"]["ordersUmp.0"]["data"]["orderPromotion"].ToString(); + +// //获取键值对的方式 +// bool isReflash = false; +// JObject jbO = JObject.Parse(datawuliu); +// foreach (var property in jbO.Properties()) +// { +// var key = property.Name; +// var groupData = oldData.OrderGroupParameterList.SingleOrDefault(o => o.Group == key); + +// var value = property.Value; +// //获取value下的 freight +// var freight = (JObject)value["freight"]; +// //获取freight的键值对的key值 +// foreach (var item in freight.Properties()) +// { +// var freightKey = item.Name; +// var freightValue = item.Value; +// //获取freight的键值对的value值 + +// //totalFreightFee的值 +// var wuliufee = freightValue["totalFreightFee"].ToString(); + + +// groupData.OrderProductParameterList.OrderByDescending(s => s.SumCarriage).FirstOrDefault(g => g.FreightId == freightKey).SumCarriage = decimal.Parse(wuliufee) / 100m; + + + +// isReflash = true; +// } + + +// var order = (JObject)value["order"]; + +// foreach (var item in order.Properties()) +// { +// var outId = item.Name; + +// var orderProduct = groupData.OrderProductParameterList.FirstOrDefault(g => g.OutId == outId); + +// if (orderProduct != null) +// { +// orderProduct.ProductAmount = item.Value["amount"].ToObject(); + +// //selectedUmpBundle 的couple + +// var skuSelectedUmpBundle = item.Value["selectedUmpBundle"]; + +// if (skuSelectedUmpBundle != null) +// { +// var couple = skuSelectedUmpBundle["couple"].ToString(); + +// var sceneUnitPrice = skuSelectedUmpBundle["sceneUnitPrice"].ToObject(); + + +// var discountFee = skuSelectedUmpBundle["price"].ToObject();//折扣价格 + +// var skuChooseFreeFreight = skuSelectedUmpBundle["isFreeFreight"].ToObject() ? 1 : 0; + + + + +// orderProduct.Couple = couple; +// orderProduct.ChooseFreeFreight = skuChooseFreeFreight; + +// orderProduct.ProductAmount = orderProduct.UnitPrice * orderProduct.Quantity - discountFee; + +// } + + +// } + + + + + + + +// } + +// //selectedShopUmpBundle + + +// var selectedShopUmpBundle = value["selectedShopUmpBundle"]; + +// bool isFreeFreight = false; +// decimal shopDiscountFee = 0; +// string shopCouple = ""; +// if (selectedShopUmpBundle != null) +// { +// shopCouple = selectedShopUmpBundle["couple"].ToString();//店铺优惠券 +// isFreeFreight = selectedShopUmpBundle["isFreeFreight"].ToObject();//是否包邮 +// shopDiscountFee = selectedShopUmpBundle["price"].ToObject();//店铺优惠金额 +// } +// groupData.ChooseFreeFreight = isFreeFreight ? 1 : 0; +// groupData.PromotionId = shopCouple; + + + + +// if (isFreeFreight) +// groupData.SumCarriage = 0; +// else +// groupData.SumCarriage = groupData.OrderProductParameterList.Select(s => s.SumCarriage).Sum(); + +// groupData.TotalProductAmount = groupData.OrderProductParameterList.Select(s => s.ProductAmount).Sum(); + +// groupData.ActualPay = groupData.TotalProductAmount + groupData.SumCarriage - shopDiscountFee; +// groupData.ActualPayFee = (int)(groupData.ActualPay * 100); + + + + + + + + + +// } +// if (isReflash) +// { +// AddLog?.Invoke("刷新地址成功"); +// } +// else +// { +// AddLog?.Invoke("刷新地址失败"); +// } + +// } +// else +// { +// AddLog?.Invoke("刷新地址失败"); +// } + +// return oldData; + +// } + + + +// public string GetCookieStr(string cookies, string cookieName) +// { +// //通过;分割 +// var cookieDatas = cookies.Split(';', StringSplitOptions.RemoveEmptyEntries); +// foreach (var cookie in cookieDatas) +// { +// var cookieParams = cookie.Split('='); +// if (cookieParams.Count() >= 2) +// { +// var key = cookieParams[0]?.Trim(); +// var value = cookieParams[1]?.Trim(); +// if (key == cookieName) +// { +// return value; +// } +// } +// } +// return ""; +// } + +// private string GetRegexValue(string html, string patternStr) +// { +// //使用正则匹配出值 + +// var regex = Regex.Match(html, patternStr); + +// if (regex.Success) +// { +// return regex.Groups[1].Value; +// } +// return null; + +// } + + + +// //获取_csrf_token参数 +// public string GetCsrfToken(string cookies) +// { +// var csrf_token = GetCookieStr(cookies, "_csrf_token"); + +// if (csrf_token == null) +// { +// return null; +// } +// return Md5Helper.Md5_32(csrf_token); +// } + +// //加入购物车 +// public void AddCart(string offerId, string specId, int quantity, string IpvId) +// { +// try +// { +// //时间戳 +// var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); +// string url = "https://cart.1688.com/ajax/safe/add_to_cart_list_new.jsx"; + +// string ext = $"{{\"sceneCode\":\"offerdetail:pc;ipvId:{IpvId}\"}}"; + +// string specData = $"[{{\"amount\":{quantity},\"specId\":\"{specId}\",\"selectedTradeServices\":[]}}]"; +// string postData = $"type=offer&cargoIdentity={offerId}&returnType=url&needTotalPrice=false&promotionSwitch=false&_csrf_token={GetCsrfToken(_1688Cookie)}&t={timestamp}&purchaseType=&ext={UrlEncode(ext, "utf-8")}&specData={UrlEncode(specData, "utf-8")}"; + + + + +// var res = PostHtml(url, postData, _1688Cookie); +// if (res.IsSuccessStatusCode) +// { +// var html = res.Content.ReadAsStringAsync().Result; + +// var json = JsonConvert.DeserializeObject(html); + +// if (json.success) +// { +// AddLog?.Invoke("成功加入购物车"); +// } +// else +// { +// AddLog?.Invoke("加入购物车失败"); +// } + +// } +// } +// catch (Exception ex) +// { + +// AddLog?.Invoke($"加入购物车失败:{ex.Message}"); +// } + + +// } + + + +// public ApiResponse CommitOrder(PrewOrderResponse prewOrderResponse, string remarkMesg) +// { +// var productParameter = prewOrderResponse.orderParameter; +// var orderModel = prewOrderResponse.OrderModel; + +// var adressModel = prewOrderResponse.AddressModel; + + +// var flow = orderModel.ToString(); //下单类型 +// var ipvId = productParameter.IpvId; +// var addressDetail = adressModel.AddressDetail; +// var townCode = productParameter.TownCode; +// var csrf_token = productParameter.Csrf_token; +// var orderUrl = productParameter.OrderUrl; +// var addressCode = adressModel.AddressCode; +// var lvid = productParameter.Lvid; +// var personalName = adressModel.PersonalName; +// var mobileNO = adressModel.MobileNO; +// var _csrf_token = productParameter.Csrf_token; + +// var divisionZip = adressModel.DivisionZip; + + +// // 213e38fa17117750507943145ee537 +// string fromkv = $"offerdetail:pc;ipvId:{productParameter.IpvId}";//24885ba917116953616677208e + +// //string remarkMesg = "拖鞋";//备注消息 + +// string cna = GetCookieStr(_1688Cookie, "cna"); + +// List _fm_sm_0_iList = new List(); + +// List _fm_sma_cargoKeyList = new List(); + +// List _fm_smartin_group_meList = new List(); + +// List smarts_mList = new List(); + +// List _fm_smart_group_meList = new List(); + + +// List _fm_sma_group_g_fList = new List(); + +// foreach (var OrderGroupParameter in productParameter.OrderGroupParameterList) +// { +// var group = OrderGroupParameter.Group; +// var discountFee = OrderGroupParameter.DiscountFee; +// var sumCarriage = OrderGroupParameter.SumCarriage; +// var stepName = OrderGroupParameter.StepName; +// var totalProductAmount = OrderGroupParameter.TotalProductAmount.ToString("0.00"); +// var actualPay = OrderGroupParameter.ActualPay; +// var actualPayFee = OrderGroupParameter.ActualPayFee; +// var payFee = OrderGroupParameter.PayFee; +// var shopCouple = OrderGroupParameter.PromotionId; +// var chooseFreeFreight = OrderGroupParameter.ChooseFreeFreight; + +// foreach (var orderProductParameter in OrderGroupParameter.OrderProductParameterList) +// { +// var cargoKey = orderProductParameter.CargoKey; + +// var unitPrice = orderProductParameter.UnitPrice.ToString("0.00"); +// var productAmount = orderProductParameter.ProductAmount; +// var quantity = orderProductParameter.Quantity; +// var offerId = orderProductParameter.ProductId; +// var specId = orderProductParameter.SpectId; +// var tbSkuId = orderProductParameter.SkuId; + +// var skuChooseFreeFreight = orderProductParameter.ChooseFreeFreight; + +// var _fm_sm_0_i_ = @$"{{""cartId"":"""",""offerId"":""{offerId}"",""specId"":""{specId}"",""tbSkuId"":""{tbSkuId}"",""hasSkuUmp"":""false"",""quantity"":{quantity},""tradeMode"":""multiStep"",""tradeWay"":""100"",""templateCode"":""assureTrade"",""flow"":""{flow}"",""subflow"":"""",""ext"":""{{\""sceneCode\"":\""\""}}""}}"; +// _fm_sm_0_iList.Add(_fm_sm_0_i_); + +// string _fm_sma_cargoKey = @$"{{""group"":""{group}"",""cargoKey"":""{cargoKey}"",""quantity"":{quantity},""unitPrice"":""{unitPrice}"",""offerId"":""{offerId}"",""specId"":""{specId}"",""tbSkuId"":""{tbSkuId}"",""hasSkuUmp"":""false"",""chooseFreeFreight"":{skuChooseFreeFreight},""productAmount"":""{productAmount}"",""discount"":1,""isVirtual"":""0"",""gift"":"""",""cartId"":"""",""promotionId"":""{orderProductParameter.Couple}"",""ext"":""{{\""sceneCode\"":\""\""}}"",""buyerCharge"":false,""marketingScene"":""""}}"; +// _fm_sma_cargoKeyList.Add($"_fm.smar.{cargoKey}.m={UrlEncode(_fm_sma_cargoKey, "gb2312")}"); + + + + +// } +// string smarts_m = @$"[{{""group"":""{group}"",""stepNo"":""1"",""templateId"":""30"",""stepName"":""{UrlEncode(stepName, "GB2312")}"",""instantPay"":""0"",""sellerActionName"":"""",""buyerPayTimeout"":""0"",""buyerConfirmTimeout"":""0"",""needSellerAction"":""0"",""transferAfterConfirm"":""0"",""needSellerCallNext"":""0"",""isStepPayAll"":""0"",""agreement"":"""",""needLogistics"":""1"",""percent"":""1.0"",""deliveryPercent"":""1.0"",""payFee"":""{payFee}"",""actualPayFee"":""{actualPayFee}"",""discountFee"":""{discountFee}"",""itemDiscountFee"":""0"",""price"":""0"",""amount"":""1"",""postFee"":""0"",""mergedJsonVar"":""""}}]"; +// smarts_mList.Add(smarts_m); + +// string _fm_smart_group_me = @$"{{""group"":""{group}"",""tplCode"":""assureTrade"",""message"":""{remarkMesg}"",""sumCarriage"":""{sumCarriage}"",""totalAmount"":""{actualPay}"",""totalProductAmount"":""{totalProductAmount}"",""chooseFreeFreight"":{chooseFreeFreight},""mixAmount"":"""",""mixNumber"":""1"",""promotionId"":""{shopCouple}"",""umpSysAvailble"":""1"",""toleranceFreight"":""${{model.toleranceCollection.toleranceFreight}}"",""checkCarriage"":1,""filledCarriage"":""0.00"",""isNeedSellerConfirmFlag"":""0"",""lvid"":""{lvid}"",""fundUsageSelected"":""0"",""hasTaosampleCard"":""0"",""anonymousBuyer"":true,""payEntry"":""multiStep"",""bizType"":""{flow}"",""payWay"":""100"",""orderCodFee"":0,""crossPromotionIds"":[],""crossPromotionIdsMap"":{{}},""crossShopPromotions"":[],""terminal"":""pc_browser_null_0.0.0"",""cna"":""{cna}"",""fromkv"":""{fromkv}""}}"; +// _fm_smart_group_meList.Add($"_fm.smart.{group}.me={UrlEncode(_fm_smart_group_me, "GB2312")}"); + + +// string _fm_smartin_group_me = @$"{{ ""invoiceFlag"":false,""invoiceType"":0,""invoiceMode"":"""",""streetAddress"":"""",""registerPhone"":"""",""bank"":"""",""accountId"":"""",""companyName"":"""",""localInvoiceId"":""undefined"",""taxpayerIdentifier"":"""",""extParams"":{{ ""email"":""""}},""group"":""{group}""}}"; + +// _fm_smartin_group_meList.Add($"_fm.smartin.{group}.me={UrlEncode(_fm_smartin_group_me, "GB2312")}&_fm.smartin.{group}.i=false"); +// _fm_sma_group_g_fList.Add($"_fm.sma.{group}.g={group}&_fm.sma.{group}.f={flow}"); +// } + + + +// var _fm_smarts_0_m = $"[{string.Join(",", smarts_mList)}]"; + + + +// var _fm_sm_0_i = $"[{string.Join(",", _fm_sm_0_iList)}]"; + + +// string cargoKeyStr = string.Join("&", _fm_sma_cargoKeyList); + +// string _fm_smart_group_meStr = string.Join("&", _fm_smart_group_meList); + +// string _fm_smartin_group_meStr = string.Join("&", _fm_smartin_group_meList); + +// string _fm_smart_group_g_fStr = string.Join("&", _fm_sma_group_g_fList); + + + + +// string url = orderUrl; + +// string key = GetRegexValue(orderUrl, "key=(\\d+)"); +// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + +// string adress = UrlEncode(addressDetail, "GB2312");// +// string userName = UrlEncode(personalName, "GB2312"); +// string phoneNumber = UrlEncode(mobileNO, "GB2312"); + + +// var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + +// string postData = $"action=SmartMakeOrderAction&event_submit_execute=Action&fromWhere=confirmOrder&fromType=normal&_fm.smarti._0.me=%7B%7D&_fm.smarti._0.i=false&_csrf_token={_csrf_token}" + +// $"&_fm.sm._0.f=xxx&_fm.sm._0.i={UrlEncode(_fm_sm_0_i, "GB2312")}&_fm.sm._0.k={key}&_fm.sm._0.a=0&_fm.sm._0.q=&_fm.sm._0.in=&_fm.sm._0.fr=&_fm.sm._0.fro=&_fm.sm._0.s=&_fm.sm._0.se=&_fm.sm._0.p=-1&_fm.sm._0.e=&_fm.sm._0.is=false&_fm.sm._0.null=cart&_fm.sm._0.ex=" + +// $"&_fm.sm._0.sc=&_fm.smart._PAGE_LEVEL_.me=%7B%22group%22%3A%22_PAGE_LEVEL_%22%7D&{_fm_smart_group_meStr}&{cargoKeyStr}" + +// $"&{_fm_smart_group_g_fStr}&_fm.smartm._0.m=&_fm.smarta._0.ar={addressCode}&_fm.smarta._0.p={addressCode}&_fm.smarta._0.c={addressCode}&_fm.smarta._0.po={divisionZip}&_fm.smarta._0.ad={adress}&_fm.smarta._0.t=&_fm.smarta._0.to=&_fm.smarta._0.f={userName}" + +// $"&_fm.smarta._0.ph=&_fm.smarta._0.m={phoneNumber}&_fm.smarta._0.i=false&_fm.smarta._0.is=true&_fm.smarta._0.a=-1&{_fm_smartin_group_meStr}&" + +// $"_fm.smarts._0.m={_fm_smarts_0_m}&_fm.r._0.w={timestamp}"; + +// var s = GetOrderId(url, postData, _1688Cookie); + +// if (s != null) +// { +// AddLog?.Invoke($"下单成功,返回订单号:{s}"); +// return new ApiResponse() { Code = 200, Data = s }; +// } +// else +// { +// AddLog.Invoke("下单失败"); +// return new ApiResponse() { Code = 1000, Msg = "下单失败" }; +// } + +// return new ApiResponse() { Code = 1000, Msg = "下单失败" }; + + +// } + +// private string GetOrderId(string url, string postData, string cookie) +// { +// var response = PostHtml(url, postData, cookie); +// if (response.IsSuccessStatusCode) +// { +// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); +// var sss = response.Content.ReadAsStringAsync().Result; +// if (response.Headers.Contains("Resin-Trace")) +// { +// //获取响应头 Resin-Trace的值 + +// var trace = response.Headers.GetValues("Resin-Trace"); +// if (trace.Any()) +// { +// var traceValue = trace.FirstOrDefault(); + +// if (traceValue.Contains("biz_order")) +// { +// var biz_order = GetRegexValue(traceValue, "biz_order=(\\d+[,]?\\d+)");//获取下单号 + + +// return biz_order; + +// } +// } +// } +// } +// return null; +// } + + +// public HttpResponseMessage PostHtml(string url, string postData, string cookie) +// { +// HttpClient client = new HttpClient(); + + +// //使用 application/x-www-form-urlencoded post提交 +// client.DefaultRequestHeaders.Add("Cookie", cookie); +// //postData = "action=SmartMakeOrderAction&event_submit_execute=Action&fromWhere=confirmOrder&fromType=normal&_fm.smarti._0.me=%7B%7D&_fm.smarti._0.i=false&_csrf_token=e107b86e348b5ff07dd1d1e4b0dff58f&_fm.sm._0.f=xxx&_fm.sm._0.i=%5B%7B%22cartId%22%3A%22%22%2C%22offerId%22%3A%22755527819845%22%2C%22specId%22%3A%2248b8df3db448c6bad0e847c317886360%22%2C%22tbSkuId%22%3A%225207346876796%22%2C%22hasSkuUmp%22%3A%22false%22%2C%22quantity%22%3A1%2C%22tradeMode%22%3A%22multiStep%22%2C%22tradeWay%22%3A%22100%22%2C%22templateCode%22%3A%22assureTrade%22%2C%22flow%22%3A%22general%22%2C%22subflow%22%3A%22%22%2C%22ext%22%3A%22%7B%5C%22sceneCode%5C%22%3A%5C%22%5C%22%7D%22%7D%5D&_fm.sm._0.k=171179300009192219&_fm.sm._0.a=0&_fm.sm._0.q=&_fm.sm._0.in=&_fm.sm._0.fr=&_fm.sm._0.fro=&_fm.sm._0.s=&_fm.sm._0.se=&_fm.sm._0.p=-1&_fm.sm._0.e=&_fm.sm._0.is=false&_fm.sm._0.null=detail&_fm.sm._0.ex=&_fm.sm._0.sc=&_fm.smart._PAGE_LEVEL_.me=%7B%22group%22%3A%22_PAGE_LEVEL_%22%7D&_fm.smart.d4d7e431d5b30a44df6a8b2e50a58237.me=%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22tplCode%22%3A%22assureTrade%22%2C%22message%22%3A%22%22%2C%22sumCarriage%22%3A%222.40%22%2C%22totalAmount%22%3A%228.73%22%2C%22totalProductAmount%22%3A%226.33%22%2C%22chooseFreeFreight%22%3A0%2C%22mixAmount%22%3A%22%22%2C%22mixNumber%22%3A%221%22%2C%22promotionId%22%3A%22%22%2C%22umpSysAvailble%22%3A%221%22%2C%22toleranceFreight%22%3A%22%24%7Bmodel.toleranceCollection.toleranceFreight%7D%22%2C%22checkCarriage%22%3A1%2C%22filledCarriage%22%3A%220.00%22%2C%22isNeedSellerConfirmFlag%22%3A%220%22%2C%22lvid%22%3A%2224885bad17117929999545039e%22%2C%22fundUsageSelected%22%3A%220%22%2C%22hasTaosampleCard%22%3A%220%22%2C%22anonymousBuyer%22%3Afalse%2C%22payEntry%22%3A%22multiStep%22%2C%22bizType%22%3A%22general%22%2C%22payWay%22%3A%22100%22%2C%22orderCodFee%22%3A0%2C%22crossPromotionIds%22%3A%5B%5D%2C%22crossPromotionIdsMap%22%3A%7B%7D%2C%22crossShopPromotions%22%3A%5B%5D%2C%22terminal%22%3A%22pc_browser_null_0.0.0%22%2C%22cna%22%3A%224Ha%2FHb9%2B8QEBASQJijR52Awl%22%2C%22fromkv%22%3A%22offerdetail%3Apc%3BipvId%3A213e36ab17117929945421320e75bd%22%7D&_fm.smar.755527819845_48b8df3db448c6bad0e847c317886360.m=%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22cargoKey%22%3A%22755527819845_48b8df3db448c6bad0e847c317886360%22%2C%22quantity%22%3A1%2C%22unitPrice%22%3A%226.33%22%2C%22offerId%22%3A%22755527819845%22%2C%22specId%22%3A%2248b8df3db448c6bad0e847c317886360%22%2C%22tbSkuId%22%3A%225207346876796%22%2C%22hasSkuUmp%22%3A%22false%22%2C%22chooseFreeFreight%22%3A0%2C%22productAmount%22%3A%226.33%22%2C%22discount%22%3A1%2C%22isVirtual%22%3A%220%22%2C%22gift%22%3A%22%22%2C%22cartId%22%3A%22%22%2C%22promotionId%22%3A%22%22%2C%22ext%22%3A%22%7B%5C%22sceneCode%5C%22%3A%5C%22%5C%22%7D%22%2C%22buyerCharge%22%3Afalse%2C%22marketingScene%22%3A%22%22%7D&_fm.sma.d4d7e431d5b30a44df6a8b2e50a58237.g=d4d7e431d5b30a44df6a8b2e50a58237&_fm.sma.d4d7e431d5b30a44df6a8b2e50a58237.f=general&_fm.smartm._0.m=&_fm.smarta._0.ar=350502&_fm.smarta._0.p=350502&_fm.smarta._0.c=350502&_fm.smarta._0.po=362000&_fm.smarta._0.ad=%BD%F0%C1%FA%BD%D6%B5%C0%B9%C5%C1%FA%C2%B7%C3%BD%C8%CB%C7%C52%BA%C5%C8%FD%CE%C4%B9%AB%D4%A2%D2%BB%C2%A5%C6%EB%D4%BD%D6%D0%D7%AA%B2%D6&_fm.smarta._0.t=&_fm.smarta._0.to=&_fm.smarta._0.f=feiyu&_fm.smarta._0.ph=&_fm.smarta._0.m=19959858952&_fm.smarta._0.i=false&_fm.smarta._0.is=true&_fm.smarta._0.a=-1&_fm.smartin.d4d7e431d5b30a44df6a8b2e50a58237.me=%7B%22invoiceFlag%22%3Afalse%2C%22invoiceType%22%3A0%2C%22invoiceMode%22%3A%22%22%2C%22streetAddress%22%3A%22%22%2C%22registerPhone%22%3A%22%22%2C%22bank%22%3A%22%22%2C%22accountId%22%3A%22%22%2C%22companyName%22%3A%22%22%2C%22localInvoiceId%22%3A%22undefined%22%2C%22taxpayerIdentifier%22%3A%22%22%2C%22extParams%22%3A%7B%22email%22%3A%22%22%7D%2C%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%7D&_fm.smartin.d4d7e431d5b30a44df6a8b2e50a58237.i=false&_fm.smarts._0.m=%5B%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22stepNo%22%3A%221%22%2C%22templateId%22%3A%2230%22%2C%22stepName%22%3A%22%C8%AB%BF%EE%BD%BB%D2%D7%22%2C%22instantPay%22%3A%220%22%2C%22sellerActionName%22%3A%22%22%2C%22buyerPayTimeout%22%3A%220%22%2C%22buyerConfirmTimeout%22%3A%220%22%2C%22needSellerAction%22%3A%220%22%2C%22transferAfterConfirm%22%3A%220%22%2C%22needSellerCallNext%22%3A%220%22%2C%22isStepPayAll%22%3A%220%22%2C%22agreement%22%3A%22%22%2C%22needLogistics%22%3A%221%22%2C%22percent%22%3A%221.0%22%2C%22deliveryPercent%22%3A%221.0%22%2C%22payFee%22%3A%22633%22%2C%22actualPayFee%22%3A%22873%22%2C%22discountFee%22%3A%220%22%2C%22itemDiscountFee%22%3A%220%22%2C%22price%22%3A%220%22%2C%22amount%22%3A%221%22%2C%22postFee%22%3A%220%22%2C%22mergedJsonVar%22%3A%22%22%7D%5D&_fm.r._0.u=140%232w2Dve%2FuzzFMcQo2HiuuFpSanxQgLwMah9FA4xt5yifr2OblcBB8%2FtDVlIZFbEvZcpX14c7HBH%2FAuyTRlaOhIoZWFnLe69cgf%2BoiOnbjo3hqzzn7YQqA3VuzzR8ZiahulFzx2DD3VthqzFrLGXY4U6SxzoObV2EqQG3Y2Ac%2Bx%2BmozFdO2XU%2BobTxzIc7VOg%2FlIXx2Dd6%2F61XrQc12XQzlpg7zPnRVr7uljFo2Aw%2B66G7zFrw2XQ%2B5TjqzWXf3YRLMZ2aMXm"; + +// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); +// HttpContent content = new StringContent(postData, Encoding.GetEncoding("GB2312"), "application/x-www-form-urlencoded"); + +// var response = client.PostAsync(url, content).Result; +// return response; +// } + +// public PrewOrderResponse PrewOrder(List orderProducts, string address, OrderModel orderModel) +// { +// var flow = orderModel.ToString(); //下单类型 +// //获取时间戳 +// var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); +// var ipvId = Md5Helper.Md5_32(timestamp.ToString()); +// var productParameter = GetProductParameter(orderProducts, orderModel, ipvId); +// var _csrf_token = productParameter.Csrf_token; +// var lvid = productParameter.Lvid; +// var orderUrl = productParameter.OrderUrl; +// var adressModel = InputAddress(address, _csrf_token); +// if (adressModel == null) +// { +// return null; +// } +// AddLog?.Invoke($"获取地址信息成功,姓名:{adressModel.PersonalName},手机号:{adressModel.MobileNO},地址:{adressModel.AddressDetail},邮编:{adressModel.DivisionZip}"); + +// var addressCode = adressModel.AddressCode; +// var addressDetail = adressModel.AddressDetail; +// var personalName = adressModel.PersonalName; +// var mobileNO = adressModel.MobileNO; +// var divisionZip = adressModel.DivisionZip; +// //刷新地址 +// productParameter = ReflashAdress(productParameter, adressModel, orderModel); + + + +// return new PrewOrderResponse +// { +// AddressModel = adressModel, +// orderParameter = productParameter, +// OrderModel = orderModel, +// ActualPay = productParameter.OrderGroupParameterList.Select(s => s.ActualPay).Sum(), +// SumCarriage = productParameter.OrderGroupParameterList.Select(s => s.SumCarriage).Sum(), +// TotalProductAmount = productParameter.OrderGroupParameterList.Select(s => s.TotalProductAmount).Sum() +// }; +// } +// } +//} diff --git a/BBWYB.Client/Helpers/1688/Md5Helper.cs b/BBWYB.Client/Helpers/1688/Md5Helper.cs new file mode 100644 index 0000000..83ed241 --- /dev/null +++ b/BBWYB.Client/Helpers/1688/Md5Helper.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Client.Helpers +{ + public class Md5Helper + { + //32位小写 + public static string Md5_32(string str) + { + string cl = str; + string pwd = ""; + System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();//实例化一个md5对像 + // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择  + byte[] s = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(cl)); + // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 + for (int i = 0; i < s.Length; i++) + { + //将得到的字符串使用16进制类型格式 + pwd = pwd + s[i].ToString("X"); + } + return pwd.ToLower(); + } + } +} diff --git a/BBWYB.Client/Helpers/CustomWebView2.cs b/BBWYB.Client/Helpers/CustomWebView2.cs new file mode 100644 index 0000000..71fc1eb --- /dev/null +++ b/BBWYB.Client/Helpers/CustomWebView2.cs @@ -0,0 +1,32 @@ +using Microsoft.Web.WebView2.Core; +using Microsoft.Web.WebView2.Core.DevToolsProtocolExtension; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Client.Helpers +{ + public class CustomWebView2 : Microsoft.Web.WebView2.Wpf.WebView2, IDisposable + { + public CustomWebView2(string folderName = "WebView2UserData") + { + //允许跨域 + var op = new CoreWebView2EnvironmentOptions("--disable-web-security") + { + // AreBrowserExtensionsEnabled = true + }; + var wb2Setting = CoreWebView2Environment.CreateAsync(userDataFolder: System.IO. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), folderName)).Result; + EnsureCoreWebView2Async(wb2Setting); + + } + + + public void DisposeWeb() + { + base.Dispose(); + GC.Collect(); + } + } +} diff --git a/BBWYB.Client/Models/1688/AddressModel.cs b/BBWYB.Client/Models/1688/AddressModel.cs new file mode 100644 index 0000000..505bfee --- /dev/null +++ b/BBWYB.Client/Models/1688/AddressModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Client.Models +{ + public class AddressModel + { + public string AddressDetail { get; internal set; } + public string DivisionZip { get; internal set; } + public string MobileNO { get; internal set; } + public string PersonalName { get; internal set; } + public string AddressCode { get; internal set; } + } +} diff --git a/BBWYB.Client/Models/1688/OrderParameter.cs b/BBWYB.Client/Models/1688/OrderParameter.cs new file mode 100644 index 0000000..3d7644f --- /dev/null +++ b/BBWYB.Client/Models/1688/OrderParameter.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Client.Models +{ + public class OrderParameter + { + public string Csrf_token { get; set; } + + public string OrderUrl { get; set; } + + public string Lvid { get; set; } + + + public List OrderGroupParameterList { get; set; } + public string Address { get; set; } + public string TownCode { get; set; } + public string IpvId { get; set; } + } + + + public class OrderGroupParameter + { + /// + /// 优惠券id + /// + public string PromotionId { get; set; } + + /// + /// 1使用优惠券 0不使用优惠券 + /// + public int ChooseFreeFreight { get; set; } + + public decimal SumCarriage { get; set; } + + public decimal DiscountFee { get; set; } + public decimal TotalProductAmount { get; set; } + + public decimal ActualPay { get; set; } + + public int PayFee { get; set; } + + public int ActualPayFee { get; set; } + public string Group { get; set; } + + public string StepName { get; set; } + + public string OrderOutId { get; set; } + + public string MemberId { get; set; } + + //sellerUserId + public string SellerUserId { get; set; } + + + ////transportType + //public string TransportType { get; set; } + + ////tplCode + //public string TplCode { get; set; } + + //belong + public string Belong { get; set; } + + + public List OrderProductParameterList { get; set; } + } + + + + public class OrderProductParameter + { + public decimal DiscountFee { get; set; } + + public decimal SumCarriage { get; set; } + public string ProductId { get; set; } + + public string SkuId { get; set; } + + public string SpectId { get; set; } + + + public string CargoKey { get; set; } + + public decimal UnitPrice { get; set; } + + public decimal ProductAmount { get; set; } + public int Quantity { get; set; } + public string FreightId { get; internal set; } + + //outId + public string OutId { get; set; } + public string? OfferPriceRangeJson { get; internal set; } + + + /// + /// 优惠券 + /// + public string Couple { get; set; } + + /// + /// 1使用优惠券 0不使用优惠券 + /// + public int ChooseFreeFreight { get; set; } + } +} diff --git a/BBWYB.Client/Models/1688/OrderProduct.cs b/BBWYB.Client/Models/1688/OrderProduct.cs new file mode 100644 index 0000000..1221af3 --- /dev/null +++ b/BBWYB.Client/Models/1688/OrderProduct.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Client.Models +{ + public class OrderProduct + { + public string ProductId { get; set; } + + public string SkuId { get; set; } + + public string SpectId { get; set; } + + //数量 + public int Quantity { get; set; } + + + } +} diff --git a/BBWYB.Client/Models/1688/PrewOrderResponse.cs b/BBWYB.Client/Models/1688/PrewOrderResponse.cs new file mode 100644 index 0000000..b30d27f --- /dev/null +++ b/BBWYB.Client/Models/1688/PrewOrderResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Client.Models +{ + public class PrewOrderResponse + { + public OrderParameter orderParameter { get; set; } + + public OrderModel OrderModel { get; set; } + + public AddressModel AddressModel { get; set; } + + public decimal TotalProductAmount { get; set; } + + public decimal SumCarriage { get; set; } + + //总订单金额 + public decimal ActualPay { get; set; } + + } +} diff --git a/BBWYB.Client/Models/1688/ProductModel.cs b/BBWYB.Client/Models/1688/ProductModel.cs new file mode 100644 index 0000000..0d1d85e --- /dev/null +++ b/BBWYB.Client/Models/1688/ProductModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Client.Models +{ + public class ProductModel + { + public int MixNumber { get; set; } + + public string IpvId { get; set; } + } +} diff --git a/BBWYB.Client/Models/1688/_1688CookieModel.cs b/BBWYB.Client/Models/1688/_1688CookieModel.cs new file mode 100644 index 0000000..980f4ec --- /dev/null +++ b/BBWYB.Client/Models/1688/_1688CookieModel.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Client.Models._1688 +{ + public class _1688CookieModel + { + public string Cookie { get; set; } + + public string UserName { get; set; } + + public string Password { get; set; } + + public DateTime LoginTime { get; set; } + + //是否过期 + public bool IsExpire { get; set; } + + } +} diff --git a/BBWYB.Client/Models/APIModel/Request/PackPurchaseTask/CerRequest.cs b/BBWYB.Client/Models/APIModel/Request/PackPurchaseTask/CerRequest.cs index 574acf8..a7851e8 100644 --- a/BBWYB.Client/Models/APIModel/Request/PackPurchaseTask/CerRequest.cs +++ b/BBWYB.Client/Models/APIModel/Request/PackPurchaseTask/CerRequest.cs @@ -70,7 +70,7 @@ namespace BBWYB.Client.Models.APIModel ///
public string ApplyAge { get; set; } - public int GoodsNumber { get; set; } + public long GoodsNumber { get; set; } public string ProduceDate { get; set; } diff --git a/BBWYB.Client/Models/Enums.cs b/BBWYB.Client/Models/Enums.cs index 2e605ac..3fc190d 100644 --- a/BBWYB.Client/Models/Enums.cs +++ b/BBWYB.Client/Models/Enums.cs @@ -340,4 +340,14 @@ 合格证信息=0,无需合格证=1 } + + /// + /// 下单类型(批发(general)=0,代发(fenxiao=1) + /// + public enum OrderModel + { + general = 0,//批发 + fenxiao = 1//代发 + + } } diff --git a/BBWYB.Client/Models/Shop/PurchaseAccount.cs b/BBWYB.Client/Models/Shop/PurchaseAccount.cs index d39d804..1ef06dd 100644 --- a/BBWYB.Client/Models/Shop/PurchaseAccount.cs +++ b/BBWYB.Client/Models/Shop/PurchaseAccount.cs @@ -20,6 +20,11 @@ namespace BBWYB.Client.Models public string AppSecret { get => appSecret; set { SetProperty(ref appSecret, value); } } public string AppToken { get => appToken; set { SetProperty(ref appToken, value); } } + /// + /// 密码 + /// + public string Password { get; set; } + public object Clone() { return this.MemberwiseClone(); diff --git a/BBWYB.Client/Views/1688/Login1688Window.xaml b/BBWYB.Client/Views/1688/Login1688Window.xaml new file mode 100644 index 0000000..28c6b2c --- /dev/null +++ b/BBWYB.Client/Views/1688/Login1688Window.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/BBWYB.Client/Views/1688/Login1688Window.xaml.cs b/BBWYB.Client/Views/1688/Login1688Window.xaml.cs new file mode 100644 index 0000000..87a1452 --- /dev/null +++ b/BBWYB.Client/Views/1688/Login1688Window.xaml.cs @@ -0,0 +1,214 @@ +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Web.WebView2.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; +using WebView2.DevTools.Dom; + +namespace BBWYB.Client.Views._1688 +{ + /// + /// Login1688Window.xaml 的交互逻辑 + /// + public partial class Login1688Window : System.Windows.Window + { + private WebView2Manager w2m; + private bool isNavigated; + private GlobalContext globalContext; + + public static Login1688Window ShowUrlSearchWindow(string userName, string password) + { + Login1688Window window = null; + + bool? result = null; + if (!App.Current.Dispatcher.CheckAccess()) + { + try + { + App.Current.Dispatcher.Invoke(() => { + window = new Login1688Window(userName, password); + window.ShowDialog(); + }); + } + catch (Exception ex) + { + + + } + + } + else + { + window = new Login1688Window(userName, password); + window.ShowDialog(); + // 在 UI 线程上执行操作 + } + return window; + + } + + public Login1688Window(string userName, string password) + { + InitializeComponent(); + + this.Width = SystemParameters.WorkArea.Size.Width * 0.8; + this.Height = SystemParameters.WorkArea.Size.Height * 0.7; + var sp = (App.Current as App).ServiceProvider; + using (var s = sp.CreateScope()) + { + w2m =new WebView2Manager(); + globalContext = s.ServiceProvider.GetRequiredService(); + } + UserName = userName; + Password = password; + initWebView(); + + + } + + public string UserName { get; set; } + public string Password { get; set; } + + + private void initWebView() + { + + var url = "https://login.taobao.com/?redirect_url=https%3A%2F%2Flogin.1688.com%2Fmember%2Fjump.htm%3Ftarget%3Dhttps%253A%252F%252Flogin.1688.com%252Fmember%252FmarketSigninJump.htm%253FDone%253Dhttps%25253A%25252F%25252Fwww.1688.com%25252F&style=tao_custom&from=1688web"; + w2m.Init("bbwyb_web_1688"); + w2m.wb2.SetValue(Grid.RowProperty, 1); + w2m.wb2.Margin = new Thickness(1, 0, 1, 0); + //grid.Children.Clear(); + gd.Children.Add(w2m.wb2); + + w2m.wb2.NavigationCompleted += Wb2_NavigationCompleted; + + + w2m.CoreWebView2InitializationCompleted += (s) => + { + w2m.wb2.CoreWebView2.Navigate(url); + }; + + } + + private void Wb2_NavigationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs e) + { + if (sender != null && sender is Microsoft.Web.WebView2.Wpf.WebView2) + { + var wv2 = sender as Microsoft.Web.WebView2.Wpf.WebView2; + + + if (wv2.CoreWebView2.Source.StartsWith("https://login.taobao.com/")) + { + + App.Current.Dispatcher.Invoke(async () => + { + await ExecuteJavaScript($"document.getElementById('fm-login-id').value='{UserName}'",1); + Thread.Sleep(100); + await ExecuteJavaScript($"document.getElementById('fm-login-password').value='{Password}'",1); + Thread.Sleep(100); + await ExecuteJavaScript("document.querySelector('.fm-button.fm-submit.password-login').click();", 1); + }); + } + + + + if (wv2.CoreWebView2.Source == ("https://www.1688.com/"))//手机端登录 保存账号密码 + { + + App.Current.Dispatcher.Invoke(async () => + { + await GetCookies("https://www.1688.com/"); + w2m.Close(); + GC.Collect(); + this.Close(); + }); + + + } + } + } + /// + /// 执行js函数 + /// + /// + /// 0 有返回值 1无返回值 + /// + public async Task<(bool istrue, string res)> ExecuteJavaScript(string js, int type = 0) + { + try + { + string script = $"()=>{{ return {js}}}"; + + if (type != 0) + script = $"()=>{{ {js}}}"; + + + string result = ""; + await Application.Current.Dispatcher.Invoke(async () => + { + await w2m.wb2?.EnsureCoreWebView2Async(); + + await using var devToolsContext = await w2m.wb2?.CoreWebView2?.CreateDevToolsContextAsync().WaitAsync((TimeSpan.FromSeconds(5)));// + + result = await devToolsContext.EvaluateFunctionAsync(script).WaitAsync(TimeSpan.FromSeconds(5)); + }); + return new(true, result); + } + catch (Exception ex) + { + // 处理可能的异常 + Console.WriteLine(ex.Message); + + return new(false, ex.Message); + } + + + + } + + public string downCookies { get; set; } = ""; + + static object obj { get; set; } = new object(); + public Dictionary dicCookies { get; set; } = new Dictionary(); + /// + /// 获取cookie + /// + public async Task GetCookies(string url) + { + + if (w2m.wb2.CoreWebView2 != null) + { + var cookieManager = w2m.wb2.CoreWebView2.CookieManager; + List cookies = await cookieManager.GetCookiesAsync(url); + foreach (CoreWebView2Cookie cookie in cookies) + { + if (dicCookies.Keys.Contains(cookie.Name)) + { + dicCookies[cookie.Name] = cookie.Value; + continue; + } + dicCookies.Add(cookie.Name, cookie.Value); + } + //存本地下次打开植入 + foreach (var item in dicCookies.Keys) + { + downCookies += $"{item}={dicCookies[item]}; "; + } + } + + + } + } +} diff --git a/BBWYB.Client/Views/1688/NewLogin1688Window.xaml b/BBWYB.Client/Views/1688/NewLogin1688Window.xaml new file mode 100644 index 0000000..2752f7c --- /dev/null +++ b/BBWYB.Client/Views/1688/NewLogin1688Window.xaml @@ -0,0 +1,13 @@ + + + + + diff --git a/BBWYB.Client/Views/1688/NewLogin1688Window.xaml.cs b/BBWYB.Client/Views/1688/NewLogin1688Window.xaml.cs new file mode 100644 index 0000000..0dd460d --- /dev/null +++ b/BBWYB.Client/Views/1688/NewLogin1688Window.xaml.cs @@ -0,0 +1,184 @@ +using BBWYB.Client.Helpers; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Web.WebView2.Core; +using SJ.Controls; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; + +namespace BBWYB.Client.Views._1688 +{ + /// + /// NewLogin1688Window.xaml 的交互逻辑 + /// + public partial class NewLogin1688Window : Window + { + + CustomWebView2 webView2; + CoreWebView2 web; + public NewLogin1688Window(string userName, string password) + { + InitializeComponent(); + webView2 = new CustomWebView2("bbwyb_web_1688"); + + + + webView2.CoreWebView2InitializationCompleted += WebView2_CoreWebView2InitializationCompleted; + + this.Width = SystemParameters.WorkArea.Size.Width * 0.8; + this.Height = SystemParameters.WorkArea.Size.Height * 0.7; + var sp = (App.Current as App).ServiceProvider; + using (var s = sp.CreateScope()) + { + + globalContext = s.ServiceProvider.GetRequiredService(); + } + UserName = userName; + Password = password; + + gd.Children.Add(webView2); + } + + + GlobalContext globalContext; + public string UserName { get; set; } + public string Password { get; set; } + + private void WebView2_CoreWebView2InitializationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e) + { + + + + + // webView2.CoreWebView2.DocumentTitleChanged += CoreWebView2_DocumentTitleChanged; + web = webView2.CoreWebView2; + + + var url = "https://login.taobao.com/?redirect_url=https%3A%2F%2Flogin.1688.com%2Fmember%2Fjump.htm%3Ftarget%3Dhttps%253A%252F%252Flogin.1688.com%252Fmember%252FmarketSigninJump.htm%253FDone%253Dhttps%25253A%25252F%25252Fwww.1688.com%25252F&style=tao_custom&from=1688web"; + webView2.CoreWebView2.Navigate(url); + //注册winning脚本c#互操作 + // webView2.CoreWebView2.AddHostObjectToScript("hyCoreModel", globalContext); + + //注册全局变量winning + // webView2.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("let hyCoreModel= window.chrome.webview.hostObjects.hyCoreModel;"); + + // web.AddWebResourceRequestedFilter("nacollector://home/img/*", CoreWebView2WebResourceContext.All); + + //web.NavigationCompleted += Web_NavigationCompleted; + + webView2.NavigationCompleted += Web_NavigationCompleted; + + } + + string lastUrl = ""; + private void Web_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e) + { + if (sender != null && sender is Microsoft.Web.WebView2.Wpf.WebView2) + { + var wv2 = sender as Microsoft.Web.WebView2.Wpf.WebView2; + + var url = wv2.CoreWebView2.Source; + + if (url.StartsWith("https://login.taobao.com/") && lastUrl != url) + { + lastUrl = url; + App.Current.Dispatcher.Invoke(() => + { + DoJavaScript($"document.getElementById('fm-login-id').value='{UserName}'",0); + + DoJavaScript($"document.getElementById('fm-login-password').value='{Password}'",0); + + DoJavaScript("document.querySelector('.fm-button.fm-submit.password-login').click();",0); + }); + } + + + + if (url.StartsWith("https://www.1688.com/") && lastUrl != url)//手机端登录 保存账号密码 + { + lastUrl = wv2.CoreWebView2.Source; + App.Current.Dispatcher.Invoke(async () => + { + await GetCookies("https://www.1688.com/"); + webView2.DisposeWeb(); + this.Close(); + }); + + + } + } + + + + } + + + public string downCookies { get; set; } = ""; + + static object obj { get; set; } = new object(); + public Dictionary dicCookies { get; set; } = new Dictionary(); + /// + /// 获取cookie + /// + public async Task GetCookies(string url) + { + + if (webView2.CoreWebView2 != null) + { + var cookieManager = webView2.CoreWebView2.CookieManager; + List cookies = await cookieManager.GetCookiesAsync(url); + foreach (CoreWebView2Cookie cookie in cookies) + { + if (dicCookies.Keys.Contains(cookie.Name)) + { + dicCookies[cookie.Name] = cookie.Value; + continue; + } + dicCookies.Add(cookie.Name, cookie.Value); + } + //存本地下次打开植入 + foreach (var item in dicCookies.Keys) + { + downCookies += $"{item}={dicCookies[item]}; "; + } + } + + + } + + + + + /// + /// 执行js + /// + public (bool isOk, object result) DoJavaScript(string js, double timeSleep =5) + { + try + { + string result = null; + string script = $"(()=>{{{js}}})()"; + + Application.Current.Dispatcher.Invoke(async () => + { + result = await web.ExecuteScriptAsync(script); + }).Wait(TimeSpan.FromSeconds(timeSleep)); + + if (int.TryParse(result, out var val)) + + { + return (true, val); + } + + return (true, result); + } + catch (Exception ex) + { + return (false, null); + } + } + } +} diff --git a/BBWYB.Client/Views/Web.xaml.cs b/BBWYB.Client/Views/Web.xaml.cs index 62e6121..de7075e 100644 --- a/BBWYB.Client/Views/Web.xaml.cs +++ b/BBWYB.Client/Views/Web.xaml.cs @@ -2,6 +2,7 @@ using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.Extensions.DependencyInjection; using SJ.Controls; +using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; @@ -24,16 +25,24 @@ namespace BBWYB.Client.Views var sp = (App.Current as App).ServiceProvider; using (var s = sp.CreateScope()) { - w2m = s.ServiceProvider.GetRequiredService(); + w2m = new WebView2Manager(); globalContext = s.ServiceProvider.GetRequiredService(); } + + WeakReferenceMessenger.Default.Register(this, (o, x) => { this.Dispatcher.BeginInvoke(initWebView); }); } + //public void InitCookieList() + //{ + + //} + + private void Web_Loaded(object sender, System.Windows.RoutedEventArgs e) { @@ -43,10 +52,10 @@ namespace BBWYB.Client.Views private void initWebView() { #if DEBUG - var url = "http://qtbbwy.qiyue666.com"; + //var url = "http://qtbbwy.qiyue666.com"; //var registerName = "webContext"; - //var url = "http://192.168.1.2:8080"; - var registerName = "webTestContext"; + var url = "http://192.168.1.2:8080"; + var registerName = "webTestContext";//webTestContext //var url = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "s.html"); #else var url = "http://qtbbwy.qiyue666.com"; @@ -55,6 +64,7 @@ namespace BBWYB.Client.Views //var url = "http://qtbbwy.qiyue666.com"; w2m.CoreWebView2InitializationCompleted = (e) => { + globalContext.CurryWindow = this; w2m.wb2.CoreWebView2.AddHostObjectToScript(registerName, this.globalContext); isNavigated = true; w2m.wb2.CoreWebView2.Navigate(url); diff --git a/BBWYB.Client/WebView2Manager.cs b/BBWYB.Client/WebView2Manager.cs index 324d982..d38c90e 100644 --- a/BBWYB.Client/WebView2Manager.cs +++ b/BBWYB.Client/WebView2Manager.cs @@ -8,7 +8,7 @@ namespace BBWYB.Client { public class WebView2Manager : IDenpendency { - public WebView2 wb2 { get; private set; } + public Microsoft.Web.WebView2.Wpf.WebView2 wb2 { get; private set; } //public WebView2Manager() //{ // Init(); @@ -17,7 +17,7 @@ namespace BBWYB.Client { if (wb2 == null) { - wb2 = new WebView2(); + wb2 = new Microsoft.Web.WebView2.Wpf.WebView2(); var wb2Setting = CoreWebView2Environment.CreateAsync(userDataFolder: io.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), folderName)).Result; wb2.EnsureCoreWebView2Async(wb2Setting); wb2.CoreWebView2InitializationCompleted += Wb2_CoreWebView2InitializationCompleted; diff --git a/BBWYB.Client/appsettings.json b/BBWYB.Client/appsettings.json index cce26a2..67f255d 100644 --- a/BBWYB.Client/appsettings.json +++ b/BBWYB.Client/appsettings.json @@ -1,6 +1,6 @@ { - //"BBWYApiHost": "http://localhost:5000", - "BBWYApiHost": "http://bbwyb.qiyue666.com", + "BBWYApiHost": "http://localhost:5000", + //"BBWYApiHost": "http://bbwyb.qiyue666.com", "MDSApiHost": "http://mdsapi.qiyue666.com", "BBWYCApiHost": "http://bbwytest.qiyue666.com", "QKApiHost": "http://localhost:8080" diff --git a/BBWYB.Server.API/BBWYB.Server.API.csproj b/BBWYB.Server.API/BBWYB.Server.API.csproj index cede918..3bf0eca 100644 --- a/BBWYB.Server.API/BBWYB.Server.API.csproj +++ b/BBWYB.Server.API/BBWYB.Server.API.csproj @@ -10,6 +10,7 @@ + diff --git a/BBWYB.Server.API/Controllers/PurchaseOrderController.cs b/BBWYB.Server.API/Controllers/PurchaseOrderController.cs index 35b8645..ba7683f 100644 --- a/BBWYB.Server.API/Controllers/PurchaseOrderController.cs +++ b/BBWYB.Server.API/Controllers/PurchaseOrderController.cs @@ -38,6 +38,17 @@ namespace BBWYB.Server.API.Controllers { purchaseOrderBusiness.CreatePurchaseOrder(request); } + + /// + /// 网页创建采购单 + /// + /// + [HttpPost] + public void WebCreatePurchaseOrder([FromBody] WebCreateOrderRequest request) + { + purchaseOrderBusiness.WebCreatePurchaseOrder(request); + } + /// /// 获取关联采购单列表 @@ -185,5 +196,9 @@ namespace BBWYB.Server.API.Controllers message = "成功" }); } + + + + } } diff --git a/BBWYB.Server.Business/BBWYB.Server.Business.csproj b/BBWYB.Server.Business/BBWYB.Server.Business.csproj index e7e1b0a..fa60834 100644 --- a/BBWYB.Server.Business/BBWYB.Server.Business.csproj +++ b/BBWYB.Server.Business/BBWYB.Server.Business.csproj @@ -20,6 +20,7 @@ + diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index c0ea9bb..24db7ea 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -1,6 +1,7 @@ using BBWYB.Common.Http; using BBWYB.Common.Log; using BBWYB.Common.Models; +using BBWYB.Server.Business._1688Helper; using BBWYB.Server.Business.Extensions; using BBWYB.Server.Business.JD; using BBWYB.Server.Model; @@ -21,6 +22,7 @@ using SDKAdapter.PurchasePlatform.Models; using System.Text; using System.Text.RegularExpressions; using Yitter.IdGenerator; +using static SDKAdapter.AdapterEnums; namespace BBWYB.Server.Business { @@ -3331,5 +3333,607 @@ namespace BBWYB.Server.Business } return list; } + + public void WebCreatePurchaseOrder(WebCreateOrderRequest request) + { + nLogManager.Default().Info($"CreatePurchaseOrder\r\n{JsonConvert.SerializeObject(request)}"); + + var dbOrder = fsql.Select(request.OrderId).ToOne(); + if (dbOrder == null) + throw new BusinessException("订单不存在"); + if (cantPurchaseOrderStateList.Contains(dbOrder.OrderState.Value)) + throw new BusinessException($"当前订单状态:{dbOrder.OrderState},不允许采购"); + + if (request.Consignee == null || + string.IsNullOrEmpty(request.Consignee.Address) || + string.IsNullOrEmpty(request.Consignee.Mobile) || + string.IsNullOrEmpty(request.Consignee.ContactName)) + throw new BusinessException("缺少收货人信息"); + if (request.PurchaseAccountList == null || request.PurchaseAccountList.Count() == 0) + throw new BusinessException("缺少采购账号"); + if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0) + throw new BusinessException("缺少下单商品参数"); + if (request.CargoParamGroupList.Any(g => string.IsNullOrEmpty(g.PurchaserId))) + throw new BusinessException("缺少采购商Id"); + if (request.CargoParamGroupList.GroupBy(c => c.PurchaserId).Any(g => g.Count() > 1)) + throw new BusinessException("提交采购商包含重复"); + //if (string.IsNullOrEmpty(request.WaitPayOrderId)) + // throw new BusinessException("缺少待支付订单号"); + + #region 验证同一个批次中,一个订单sku不能同时拥有多个采购方案 + IDictionary schemeValidationDictionary = new Dictionary(); + foreach (var purchaseGroup in request.CargoParamGroupList) + { + foreach (var cargo in purchaseGroup.CargoParamList) + { + if (!schemeValidationDictionary.ContainsKey(cargo.BelongSkuId)) + schemeValidationDictionary.TryAdd(cargo.BelongSkuId, cargo.SchemeId); + + if (schemeValidationDictionary.TryGetValue(cargo.BelongSkuId, out long schemeId)) + { + if (cargo.SchemeId != schemeId) + { + throw new BusinessException($"订单sku{cargo.BelongSkuId}只允许使用一个采购方案进行下单"); + } + } + } + } + schemeValidationDictionary.Clear(); + #endregion + + string cookies = request.LoginCookies; + + var isRepurchase = fsql.Select(dbOrder.Id).Any(); + 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); + + List insertOrderCostDetails = new List(); + List insertOrderPurchaseInfos = new List(); + List insertOrderPurchaseSkuInfos = new List(); + List> updatePurchaseSchemeList = new List>(); + //List> updatePssList = new List>(); + List insertOrderPurchaseRelationInfoList = new List(); + List updatePurchaseTimeLimitTaskOrderSkuList = new List(); + List> updatePurchaserList = new List>(); + List insertSkuHistoryPurchaserRelationList = new List(); + List insertSkuOptimizationHistoryList = new List(); + //List updateSkuOptimizationPurhcasementByIdList = new List(); + + List notifyQikuPackSchemeParamList = null; + if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越) + notifyQikuPackSchemeParamList = new List(); + + IInsert insertOrderCost = null; + IUpdate updateOrderCost = null; + List insertOrderSkuCostList = new List(); + IList> updateOrderSkuCostList = new List>(); + List createdPurchaseOrderItemList = new List(); + + foreach (var cargoParamGroup in request.CargoParamGroupList) + { + var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == cargoParamGroup.PurchasePlatform); + if (purchaseAccount == null) + throw new BusinessException($"缺少{cargoParamGroup.PurchasePlatform}采购平台账号,请在店铺配置中设置"); + + var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)cargoParamGroup.PurchasePlatform); + var extJson = extJArray.FirstOrDefault(j => j.Value("PurchaserId") == cargoParamGroup.PurchaserId); + + var orderProductParamList = CombineRepeatPurchaseSku(cargoParamGroup.CargoParamList); + + //var createOrderResponse = client.CreateOrder(new PP_CreateOrderRequest() + //{ + // AppKey = purchaseAccount.AppKey, + // AppSecret = purchaseAccount.AppSecret, + // AppToken = purchaseAccount.AppToken, + // Consignee = new PP_ConsigneeRequest() + // { + // Address = request.Consignee.Address, + // City = request.Consignee.City, + // ContactName = request.Consignee.ContactName, + // County = request.Consignee.County, + // Mobile = request.Consignee.Mobile, + // Province = request.Consignee.Province, + // TelePhone = request.Consignee.TelePhone, + // Town = request.Consignee.Town + // }, + // Platform = (AdapterEnums.PlatformType)purchaseAccount.PurchasePlatformId, + // PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode, + // Extensions = extJson.Value("OrderTradeTypeCode"), + // Remark = !string.IsNullOrEmpty(cargoParamGroup.Remark) ? cargoParamGroup.Remark : request.Remark, + // OrderProductParamList = orderProductParamList + //}); + + + Collect1688Helper collect1688Helper = new Collect1688Helper(cookies); + + var adress = request.Consignee.ContactName + " " + request.Consignee.Mobile + " " + request.Consignee.Province + request.Consignee.City + request.Consignee.Town + request.Consignee.Address; + + + var orderModel = (Model.Enums.OrderModel)request.PurchaseOrderMode; + + + var prewOrder = collect1688Helper.PrewOrder(orderProductParamList.ToList(), adress, orderModel); + if (prewOrder == null) + { + throw new BusinessException($"登录失效,正在重新登陆,登录后点击下单!"); + } + var remark = !string.IsNullOrEmpty(cargoParamGroup.Remark) ? cargoParamGroup.Remark : request.Remark; + var createOrderResponse = collect1688Helper.CommitOrder(prewOrder, remark); + + if (!createOrderResponse.Success) + { + throw new BusinessException($"{createOrderResponse.Msg}"); + } + + + var purchaseOrderId = createOrderResponse.Data; + + var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() + { + AppKey = purchaseAccount.AppKey, + AppSecret = purchaseAccount.AppSecret, + AppToken = purchaseAccount.AppToken, + OrderId = purchaseOrderId + }); + createdPurchaseOrderItemList.AddRange(purchaseOrderSimpleInfo.ItemList); + + //totalPurchaseProductAmount += purchaseOrderSimpleInfo.ProductAmount; + //totalPurchaseFreight += purchaseOrderSimpleInfo.FreightAmount; + + #region 创建订单采购关系 + foreach (var cargoParam in cargoParamGroup.CargoParamList) + { + var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == cargoParam.BelongSkuId); + insertOrderPurchaseRelationInfoList.Add(new OrderPurchaseRelationInfo() + { + Id = idGenerator.NewLong(), + BelongSkuId = cargoParam.BelongSkuId, + CreateTime = DateTime.Now, + OrderId = request.OrderId, + PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, + PurchaseProductId = cargoParam.ProductId, + PurchaseSkuId = cargoParam.SkuId, + PurchaseSpecId = cargoParam.SpecId, + Quantity = cargoParam.Quantity, + SchemeId = cargoParam.SchemeId, + SourceSkuId = orderSku?.BelongSkuId, + SchemeVersion = cargoParam.SchemeVersion ?? 1 + }); + } + #endregion + + #region 等比计算采购成本 + var proportionalCalculationResultList = ProportionalCalculationCost(cargoParamGroup.CargoParamList, purchaseOrderSimpleInfo); + foreach (var proportionalCalculationResult in proportionalCalculationResultList) + { + var skuId = proportionalCalculationResult.SkuId; + + + var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == skuId); + var orderCostDetail = new OrderCostDetail() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + DeductionQuantity = orderSku.ItemTotal.Value, + OrderId = request.OrderId, + ProductId = orderSku.ProductId, + PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, + SkuId = skuId, + IsEnabled = true + }; + orderCostDetail.CalculationOrderCostDetailCostAndProfit(proportionalCalculationResult.ProductAmount, + proportionalCalculationResult.FreightAmount, + 0M, + 0M); + insertOrderCostDetails.Add(orderCostDetail); + } + #endregion + + #region 采购订单信息 + var belongSkuIdList = cargoParamGroup.CargoParamList.Select(c => c.BelongSkuId).Distinct().ToList(); + var orderPurchaserInfo = new OrderPurchaseInfo() + { + Id = idGenerator.NewLong(), + OrderId = request.OrderId, + CreateTime = DateTime.Now, + PurchaseAccountId = purchaseAccount.Id, + PurchaseAccountName = purchaseAccount.AccountName, + PurchaseMethod = Enums.PurchaseMethod.线上采购, + OrderState = Enums.PurchaseOrderState.待发货, + PurchaseOrderId = purchaseOrderId, + PurchasePlatform = cargoParamGroup.PurchasePlatform, + PurchaserId = cargoParamGroup.PurchaserId, + PurchaserName = cargoParamGroup.PurchaserName, + ShopId = request.ShopId, + BelongSkuIds = string.Join(",", belongSkuIdList), + IsEnabled = true, + Remark = !string.IsNullOrEmpty(cargoParamGroup.Remark) ? cargoParamGroup.Remark : request.Remark, + UpdateTime = DateTime.Now + }; + insertOrderPurchaseInfos.Add(orderPurchaserInfo); + #endregion + + #region 采购订单Sku信息 + foreach (var purchaseOrderSku in purchaseOrderSimpleInfo.ItemList) + { + var orderPurchaseSkuInfo = new OrderPurchaseSkuInfo() + { + Id = purchaseOrderSku.OrderSkuId, + CreateTime = DateTime.Now, + OrderId = request.OrderId, + PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, + PurchaseProductId = purchaseOrderSku.ProductId, + PurchaseSkuId = purchaseOrderSku.SkuId, + ShopId = request.ShopId, + PurchasedPrice = purchaseOrderSku.Price, + PurchasedAmount = purchaseOrderSku.ProductAmount, + PurchasedItemCount = purchaseOrderSku.Quantity + }; + 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(), + SchemeVersion = cargoParam.SchemeVersion ?? 1 + }); + } + } + } + #endregion + } + + #region 更新采购方案/配件 + { + var allCargoParamList = new List(); + request.CargoParamGroupList.ForEach(x => allCargoParamList.AddRange(x.CargoParamList)); + + #region 更新采购方案 + { + var cargoParamGroupsBySchemeList = allCargoParamList.GroupBy(c => c.SchemeId); + foreach (var cargoParamGroupsByScheme in cargoParamGroupsBySchemeList) + { + var schemeId = cargoParamGroupsByScheme.Key; + var skuId = cargoParamGroupsByScheme.FirstOrDefault().BelongSkuId; + var skuItemCount = orderSkus.FirstOrDefault(osku => osku.SkuId == skuId)?.ItemTotal ?? 0; + + //var lastPurchasePriceCost = cargoParamGroupsByScheme.Sum(cargoParam => createdPurchaseOrderItemList.Where(x => x.SkuId == cargoParam.SkuId) + // .Select(x => x.Price * (cargoParam.PurchaseRatio ?? 1)) + // .DefaultIfEmpty(0M) + // .First()); + + var lastPurchasePriceCost = cargoParamGroupsByScheme.Sum(cargoParam => + { + return (createdPurchaseOrderItemList.FirstOrDefault(x => x.SkuId == cargoParam.SkuId)?.Price ?? 0) * (cargoParam.PurchaseRatio ?? 1); + }); + + + var purchasedAmount = insertOrderCostDetails.Where(ocd => ocd.SkuId == skuId).Sum(ocd => ocd.SkuAmount); + var update = fsql.Update(schemeId).Set(ps => ps.LastPurchaseTime, DateTime.Now) + .Set(ps => ps.LastPurchasePriceCost, lastPurchasePriceCost) + .Set(ps => ps.PurchasedCount + 1) + .Set(ps => ps.PurchasedItemCount + skuItemCount) + .Set(ps => ps.PurchasedAmount + purchasedAmount); + updatePurchaseSchemeList.Add(update); + } + } + #endregion + + //#region 更新采购配件 + //{ + // foreach (var cargoParam in allCargoParamList) + // { + // var createOrderItem = createdPurchaseOrderItemList.FirstOrDefault(x => x.SkuId == cargoParam.SkuId); + // if (createOrderItem != null) + // { + // var update = fsql.Update() + // .Set(pss => pss.LastPurchasePriceCost, createOrderItem.Price) + // .Where(pss => pss.PurchaseSkuId == cargoParam.SkuId && pss.SkuPurchaseSchemeId == cargoParam.SchemeId); + // updatePssList.Add(update); + // } + // } + //} + //#endregion + } + #endregion + + #region 更新采购商 + { + var purchaserIdList = new List(); + var purchaserSkuDictionary = new Dictionary>(); + request.CargoParamGroupList.ForEach(x => + { + purchaserIdList.Add(x.PurchaserId); + purchaserSkuDictionary.Add(x.PurchaserId, x.CargoParamList.Select(c => c.BelongSkuId).Distinct().ToList()); + }); + + //采购商的sku采购关系表 + var dbSkuAndPurchaserRelationList = fsql.Select() + .Where(spr => purchaserIdList.Contains(spr.PurchaserId) && spr.ShopId == request.ShopId) + .ToList(); + var dbPurchaserList = fsql.Select(purchaserIdList).ToList(); + foreach (var purchaserId in purchaserIdList) + { + purchaserSkuDictionary.TryGetValue(purchaserId, out var fromRequestSkuList); + var fromDBSkuList = dbSkuAndPurchaserRelationList.Where(x => x.PurchaserId == purchaserId) + .Select(x => x.SkuId) + .Distinct() + .ToList(); + var exceptSkuList = fromRequestSkuList.Except(fromDBSkuList); + var newSkuRelationCount = exceptSkuList.Count(); + if (newSkuRelationCount > 0) + { + insertSkuHistoryPurchaserRelationList.AddRange(exceptSkuList.Select(x => new SkuHistoryPurchaserRelation() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + PurchaserId = purchaserId, + ShopId = request.ShopId, + SkuId = x + })); + } + + #region 更新采购商归属 + var purchaser = dbPurchaserList.FirstOrDefault(p => p.Id == purchaserId); + if (purchaser != null && !string.IsNullOrEmpty(purchaser.BelongBargainTeamId) && purchaser.BelongType == Enums.PurchaserBelongType.临时) + { + var updatePurchaser = fsql.Update(purchaserId).Set(p => p.BelongType, Enums.PurchaserBelongType.永久); + updatePurchaserList.Add(updatePurchaser); + } + #endregion + } + + } + #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() + { + OrderId = request.OrderId, + CreateTime = DateTime.Now, + IsManualEdited = false + }; + + //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); + + var allOrderSkuCostList = orderSkuCostList.Union(insertOrderSkuCostList).ToList(); + orderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, allOrderSkuCostList); + + + if (!isRepurchase) + { + insertOrderCost = fsql.Insert(orderCost); + } + else + { + updateOrderCost = fsql.Update().SetSource(orderCost).IgnoreColumns(a => new { a.CreateTime }); + } + #endregion + + #region 订单状态 + dbOrder.CalculationOrderState(fsql, 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 + + //#region 创建优化历史 + //{ + // //本批次在线采购的订单sku集合 + // var allBelongSkuIdList = request.CargoParamGroupList.SelectMany(cg => cg.CargoParamList.Select(c => c.BelongSkuId)).Distinct().ToList(); + // //var optimizationSkuIdList = orderSkus.Where(osku => osku.IsOptimizationCompleted == 1 && allBelongSkuIdList.Contains(osku.SkuId)) + // // .Select(osku => osku.SkuId) + // // .ToList(); + + // var optimizationTaskList = fsql.Select() + // .Where(s => allBelongSkuIdList.Contains(s.SkuId) && + // s.IsOptimizationCompleted == true && + // s.IsPurchasementCompleted == false) + // .ToList(); + + // var optimizationSkuIdList = optimizationTaskList.Select(s => s.SkuId).Distinct().ToList(); + // if (optimizationSkuIdList.Count() > 0) + // { + // //优化历史 + // var optimizationHistoryList = fsql.Select() + // .Where(s1 => s1.ShopId == request.ShopId && optimizationSkuIdList.Contains(s1.SkuId)) + // .GroupBy(s1 => s1.SkuId) + // .WithTempQuery(g => new { MaxId = g.Max(g.Value.Id) }) + // .From() + // .InnerJoin((s1, s2) => s1.MaxId == s2.Id) + // .ToList((s1, s2) => s2); + + + // foreach (var optimizationSkuId in optimizationSkuIdList) + // { + // var orderSkuCost = allOrderSkuCostList.FirstOrDefault(x => x.SkuId == optimizationSkuId); + // if (orderSkuCost == null) + // continue; + // var orderSku = orderSkus.FirstOrDefault(x => x.SkuId == optimizationSkuId); + // var lastHistory = optimizationHistoryList.FirstOrDefault(x => x.SkuId == optimizationSkuId); + + // var currentPurchasePrice = orderSkuCost.SkuAmount / orderSku.ItemTotal; + // var ratio = (lastHistory?.LastPurchasePrice ?? 0) == 0 ? 0 : 1 - currentPurchasePrice / lastHistory.LastPurchasePrice; + + // var newOptimizationHistory = new SkuOptimizationHistory() + // { + // Id = idGenerator.NewLong(), + // CreateTime = DateTime.Now, + // CurrentPurchasePrice = orderSkuCost.SkuAmount / orderSku.ItemTotal, + // ProductId = orderSku.ProductId, + // ShopId = request.ShopId, + // SkuId = optimizationSkuId, + // LastPurchasePrice = lastHistory?.LastPurchasePrice ?? 0, + // OptimizationRatio = ratio, + // TriggerOptimizationReason = orderSku.TriggerOptimizationReason + // }; + // insertSkuOptimizationHistoryList.Add(newOptimizationHistory); + + // var skuOptimizationTask = optimizationTaskList.FirstOrDefault(x => x.SkuId == optimizationSkuId); + // if (skuOptimizationTask != null) + // updateSkuOptimizationPurhcasementByIdList.Add(skuOptimizationTask.Id); + // } + // } + //} + //#endregion + + fsql.Transaction(() => + { + 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(); + if (insertSkuHistoryPurchaserRelationList.Count() > 0) + fsql.Insert(insertSkuHistoryPurchaserRelationList).ExecuteAffrows(); + if (insertSkuOptimizationHistoryList.Count() > 0) + fsql.Insert(insertSkuOptimizationHistoryList).ExecuteAffrows(); + updateOrderCost?.ExecuteAffrows(); + insertOrderCost?.ExecuteAffrows(); + if (updatePurchaseSchemeList.Count() > 0) + { + foreach (var update in updatePurchaseSchemeList) + update.ExecuteAffrows(); + } + //if (updatePssList.Count() > 0) + //{ + // foreach (var update in updatePssList) + // update.ExecuteAffrows(); + //} + fsql.Update(request.OrderId).Set(o => o.OrderState, dbOrder.OrderState) + .SetIf(!string.IsNullOrEmpty(request.Remark), o => o.PurchaseRemark, request.Remark) + .Set(o => o.IsPurchased, true) + .ExecuteAffrows(); + if (insertOrderSkuCostList.Count() > 0) + fsql.Insert(insertOrderSkuCostList).ExecuteAffrows(); + if (updateOrderSkuCostList.Count() > 0) + { + foreach (var update in updateOrderSkuCostList) + update.ExecuteAffrows(); + } + //if (updateSkuOptimizationPurhcasementByIdList.Count() > 0) + // fsql.Update(updateSkuOptimizationPurhcasementByIdList).Set(s => s.IsPurchasementCompleted, true).ExecuteAffrows(); + + if (updatePurchaserList.Count() > 0) + { + foreach (var update in updatePurchaserList) + update.ExecuteAffrows(); + } + }); + + //#region 更新采购方案最新价格 + //Task.Factory.StartNew(() => + //{ + // try + // { + // purchaseSchemeBusiness.RefreshPurchaseScheme(new RefreshSchemeRequest() + // { + // SchemeIdList = updatePurchaseTimeSchemeIdList + // }); + // } + // catch { } + + //}, CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + //#endregion + } } } diff --git a/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs b/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs index 1c096f6..a21d3ac 100644 --- a/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs +++ b/BBWYB.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs @@ -326,7 +326,7 @@ namespace BBWYB.Server.Business { if (jobject["data"][locationIdList[i]] != null) { - location = jobject["data"][locationIdList[i]]["data"]["location"].ToString(); + location = jobject["data"][locationIdList[i]]["data"]["location"]?.ToString(); if (string.IsNullOrEmpty(location)) continue; break; diff --git a/BBWYB.Server.Business/Vender/VenderBusiness.cs b/BBWYB.Server.Business/Vender/VenderBusiness.cs index 9c54440..6a7925b 100644 --- a/BBWYB.Server.Business/Vender/VenderBusiness.cs +++ b/BBWYB.Server.Business/Vender/VenderBusiness.cs @@ -88,6 +88,7 @@ namespace BBWYB.Server.Business .Set(pa => pa.AppToken, shopSettingRequest.AppToken) .Set(pa => pa.AccountName, shopSettingRequest.AccountName) .Set(pa => pa.PurchasePlatformId, ((int)shopSettingRequest.PurchasePlatformId).ToString()) + .Set(pa => pa.Password, shopSettingRequest.Password) .ExecuteAffrows(); } return shopSettingRequest.PurchaseAccountId; diff --git a/BBWYB.Server.Business/_1688Helper/Collect1688Helper.cs b/BBWYB.Server.Business/_1688Helper/Collect1688Helper.cs new file mode 100644 index 0000000..38c44c6 --- /dev/null +++ b/BBWYB.Server.Business/_1688Helper/Collect1688Helper.cs @@ -0,0 +1,930 @@ + +using BBWYB.Common.Models; +using BBWYB.Server.Model._1688; +using HtmlAgilityPack; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using SDKAdapter.PurchasePlatform.Models; +using System.Text; +using System.Text.RegularExpressions; +using static BBWYB.Server.Model.Enums; + +namespace BBWYB.Server.Business._1688Helper +{ + /// + /// 手动支付采购单业务 + /// + public class Collect1688Helper + { + + private string _1688Cookie { get; set; } + public Action AddLog { get; set; } + + public Collect1688Helper(string _1688Cookie) + { + this._1688Cookie = _1688Cookie; + } + + private string UrlEncode(string str, string encodingStr) + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + return System.Web.HttpUtility.UrlEncode(str, Encoding.GetEncoding(encodingStr)); + } + + ///// + ///// + ///// + ///// + //public ProductModel GetProductMsg(string offerId)//获取限制条件 + //{ + // string url = $"https://detail.1688.com/offer/{offerId}.html"; + // using HttpClient http = new HttpClient(); + + // //添加cookie + // http.DefaultRequestHeaders.Add("Cookie", _1688Cookie); + // http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"); + // var res = http.GetAsync(url).Result; + // if (res.IsSuccessStatusCode) + // { + // Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + // var html = res?.Content?.ReadAsStringAsync().Result; + + // string ipvId = GetRegexValue(html, "\"ipvId\":\"([^\"]+)\""); //可以不带ipvId + // //"sellerUserId":3199397430, + // //string sellerUserId = GetRegexValue(html, "\"sellerUserId\":([^,]+),"); + + // //"mixNumber": 2, + // int mixNumber = int.Parse(GetRegexValue(html, "\"mixNumber\":([^,]+),")); + // return new ProductModel() { MixNumber = mixNumber, IpvId = ipvId }; + // } + // AddLog("获取商品信息失败"); + // return null; + //} + + + public OrderParameter GetProductParameter(List orderProducts, OrderModel orderModel, string ipvId) + { + var flow = orderModel.ToString(); //下单类型 + string url = $"https://order.1688.com/order/smart_make_order.htm?p=detail&_input_charset=utf-8&fromkv={UrlEncode($"offerdetail:pc;ipvId:{ipvId}", "utf-8")}"; + + List orderProductIds = new List(); + foreach (var orderProduct in orderProducts) + { + orderProductIds.Add(@$"{{""specId"":""{orderProduct.SpecId}"",""offerId"":{orderProduct.ProductId},""quantity"":{orderProduct.Quantity},""flow"":""{flow}"",""ext"":{{""sceneCode"":""""}},""selectedTradeServices"":[]}}"); + + } + + var id = UrlEncode($"[{string.Join(",", orderProductIds)}]", "gb2312"); + + string postData = $"id={id}&flow=xxx"; + + + var response = PostHtml(url, postData, _1688Cookie); + + if (response == null || !response.IsSuccessStatusCode) + { + AddLog("获取订单参数失败"); + return null; + } + // string lvid = response.Headers.Get("Eagleeye-Traceid"); + + string lvid = ""; + if (response.Headers.Contains("Eagleeye-Traceid")) + { + //获取响应头 Resin-Trace的值 + + var trace = response.Headers.GetValues("Eagleeye-Traceid"); + if (trace.Any()) + { + lvid = trace.FirstOrDefault(); + } + } + + string html = response.Content.ReadAsStringAsync().Result; + var orderUrl = GetRegexValue(html, "action=\"([^\"]+)\"").Replace("&", "&"); + + //data-default-checked-address-id="6012255930" + var address = GetRegexValue(html, "data-default-checked-address-id=\"([^\"]+)\""); + + //name="_fm.smarta._0.t" value="350502005" + var townCode = GetRegexValue(html, "name=\"_fm.smarta._0.t\" value=\"([^\"]+)\""); + + var res = new OrderParameter() + { + Lvid = lvid, + OrderUrl = orderUrl, + Address = address, + TownCode = townCode, + IpvId = ipvId + }; + HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); + htmlDoc.LoadHtml(html); + + HtmlNode csrfInput = htmlDoc.DocumentNode.SelectSingleNode("//input[@name='_csrf_token']"); + + if (csrfInput != null) + { + // 获取 value 属性的值 + string csrfTokenValue = csrfInput.GetAttributeValue("value", ""); + res.Csrf_token = csrfTokenValue; + } + + + // 使用XPath选择器获取
元素 + HtmlNode orderDiv = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='order']"); + + if (orderDiv != null) + { + List OrderGroupParameterList = new List(); + + // 获取
内的所有子元素 + HtmlNodeCollection childNodes = orderDiv.ChildNodes; + foreach (HtmlNode node in childNodes) + { + // 处理每个子元素 + string innerText = node.InnerText; // 获取元素的文本内容 + string outerHtml = node.OuterHtml; // 获取元素的HTML代码 + // 其他操作... + + if (node.Name == "div") + { + var zone_orders = node.Descendants("div") + .Where(div => div.Attributes.Contains("class") && div.GetAttributeValue("class", "").Equals("zone-order", StringComparison.OrdinalIgnoreCase)); + + foreach (HtmlNode zone_order in zone_orders) + { + // 获取 data-source 属性的值 + string dataSourceValue = zone_order.GetAttributeValue("data-source", ""); + + var groupHeaderJson = JsonConvert.DeserializeObject(dataSourceValue); + //sellerMemberId + string sellerMemberId = groupHeaderJson.sellerMemberId.ToString(); + //sellerUserId + string sellerUserId = groupHeaderJson.sellerUserId.ToString(); + ////buyerMemberId + //string buyerMemberId = groupHeaderJson.buyerMemberId.ToString(); + //orderOutId + string orderOutId = groupHeaderJson.orderOutId.ToString(); + //group + string group = groupHeaderJson.group.ToString(); + //belong + string belong = groupHeaderJson.belong.ToString(); + //flow 下单类型 + flow = groupHeaderJson?.flow?.ToString(); + //bizType + string bizType = groupHeaderJson?.bizType?.ToString(); + + + var groupDiv = zone_order.Descendants("li") + .Where(li => li.Attributes.Contains("class") && li.GetAttributeValue("class", "").Equals("step-item step-item-first", StringComparison.OrdinalIgnoreCase)); + //.SelectSingleNode("//li[@class='step-item step-item-first']"); + + if (groupDiv == null) + { + continue; + } + + string stepName = ""; + foreach (var item in groupDiv) + { + var groupDivDataSource = item.GetAttributeValue("data-source", ""); + if (groupDivDataSource != null) + { + + var json = JsonConvert.DeserializeObject(groupDivDataSource); + group = json.group.ToString(); + stepName = json.stepName.ToString(); + } + } + + + + + OrderGroupParameter orderGroupParameter = new OrderGroupParameter() + { + Group = group, + StepName = stepName, + OrderOutId = orderOutId, + MemberId = sellerMemberId, + SellerUserId = sellerUserId, + Belong = belong, + + + }; + + + + + + var groupOrders = zone_order.Descendants("tr") + .Where(tr => tr.Attributes.Contains("data-group-name")); + List productAmountList = new List(); + List OrderProductParameterList = new List(); + foreach (var groupOrder in groupOrders) + { + + if (groupOrder.Name == "tr") + { + + var data_source = groupOrder.GetAttributeValue("data-source", ""); + string groutOuterHtml = groupOrder.OuterHtml; + if (data_source != null) + { + + var sumCarriage = GetRegexValue(groutOuterHtml, "\"fee\":([^,]+),"); + if (sumCarriage == null) + { + sumCarriage = "0"; + } + + //"freightId":"18605534" + var freightId = GetRegexValue(groutOuterHtml, "\"freightId\":\"([^\"]+)\""); + //'freightId':'16850501' + if (freightId == null) + { + freightId = GetRegexValue(groutOuterHtml, "'freightId':'([^\']+)'"); + } + + + + //'outId':'general_705889664759_df9e522ec29afb80a682fcaac1dce50c', + var outId = GetRegexValue(data_source, "'outId':'([^']+)'"); + + + + //"discountFee":"0" + var discountFee = decimal.Parse(GetRegexValue(data_source, "\"discountFee\":\"([^\"]+)\"") ?? "0"); + + + var cargoKey = GetRegexValue(data_source, "'cargoKey':'([^']+)'"); + //'unitPrice':'6.33' + var unitPrice = decimal.Parse(GetRegexValue(data_source, "'unitPrice':'([^']+)'")); + var payFee = (int)(unitPrice * 100); + + //'quantity':1.0 + int quantity = (int)(decimal.Parse(GetRegexValue(data_source, "'quantity':([^,]+),"))); + + //'ext':'{\"detailOrderBizAttributes\":{\"b_cargo_from\":\"offerdetail:pc;ipvId:2150462317125683404374580e106c\"}}', + var ext = GetRegexValue(data_source, "'ext':'([^']+)'")?.Replace("\\"","\""); + + + //'offerId':'563883060952', + var offerId = GetRegexValue(data_source, "'offerId':'([^']+)'"); + + //'skuId':'ea66ab9ceff1fbcc8d0b97d4926e476f', + var spectId = GetRegexValue(data_source, "'skuId':'([^']+)'"); + + //'tbSkuId':'5408119750040', + var skuId = GetRegexValue(data_source, "'tbSkuId':'([^']+)'"); + //'offerPriceRangeJson':[{"ba":1,"ea":0,"p":2.5}] + var offerPriceRangeJson = GetRegexValue(data_source, "'offerPriceRangeJson'\\s*:\\s*\\[(.*?)\\]")?.Replace(""", "\""); + + + var productAmount = quantity * unitPrice - discountFee; + productAmountList.Add(productAmount); + + + OrderProductParameterList.Add(new OrderProductParameter() + { + ProductAmount = productAmount, + CargoKey = cargoKey, + ProductId = offerId, + SkuId = skuId, + SpectId = spectId, + UnitPrice = unitPrice, + Quantity = quantity, + DiscountFee = discountFee, + SumCarriage = decimal.Parse(sumCarriage), + FreightId = freightId, + OutId = outId, + OfferPriceRangeJson = offerPriceRangeJson, + Ext = ext + + }); + } + + } + } + + var totalProductAmount = OrderProductParameterList.Sum(p => p.ProductAmount); + + var actualPay = OrderProductParameterList.Sum(p => p.ProductAmount + p.SumCarriage); + + + orderGroupParameter.SumCarriage = OrderProductParameterList.Sum(p => p.SumCarriage); + orderGroupParameter.ActualPay = actualPay; + orderGroupParameter.ActualPayFee = (int)(actualPay * 100); + orderGroupParameter.TotalProductAmount = totalProductAmount; + orderGroupParameter.PayFee = (int)(totalProductAmount * 100); + orderGroupParameter.OrderProductParameterList = OrderProductParameterList; + OrderGroupParameterList.Add(orderGroupParameter); + } + + + } + } + + res.OrderGroupParameterList = OrderGroupParameterList; + + + } + + return res; + + } + + + /// + /// 输入临时收货地址(姓名 手机号 收货地址)或者直接输入地址 (主要获取邮编编码) //feiyu 19959858952 福建省泉州市鲤城区金龙街道古龙路媒人桥2号三文公寓一楼齐越中转仓 + /// + public AddressModel InputAddress(string adress, string _csrf_token) + { + //callback=jQuery17207000444400310621_1711938052406&address=feiyu+19959858952+%E7%A6%8F%E5%BB%BA%E7%9C%81%E6%B3%89%E5%B7%9E%E5%B8%82%E9%B2%A4%E5%9F%8E%E5%8C%BA%E9%87%91%E9%BE%99%E8%A1%97%E9%81%93%E5%8F%A4%E9%BE%99%E8%B7%AF%E5%AA%92%E4%BA%BA%E6%A1%A52%E5%8F%B7%E4%B8%89%E6%96%87%E5%85%AC%E5%AF%93%E4%B8%80%E6%A5%BC%E9%BD%90%E8%B6%8A%E4%B8%AD%E8%BD%AC%E4%BB%93&_csrf_token=42b5ba743ad1a219f275a0f2b8f13303&_input_charset=utf-8 + string url = $"https://wuliu.1688.com/address/ajax/address_parse.jsx?callback=jQuery17207000444400310621_1711938052406&address={UrlEncode(adress, "utf-8")}&_csrf_token={_csrf_token}&_input_charset=utf-8"; + + /* + jQuery17207000444400310621_1711938052406({ + "data": { + "addressDetail": "金龙街道古龙路媒人桥2号三文公寓一楼齐越中转仓", + "city": "泉州市", + "cityCode": 350500, + "district": "鲤城区", + "districtCode": 350502, + "divisionZip": "362000", + "mobileNO": "19959858952", + "personalName": "feiyu", + "province": "福建省", + "provinceCode": 350000 + }, + "success": true +}) + */ + + using HttpClient http = new HttpClient(); + http.BaseAddress = new Uri(url); + http.DefaultRequestHeaders.Add("Cookie", _1688Cookie); + http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"); + var res = http.GetAsync(url).Result; + if (res.IsSuccessStatusCode) + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + var html = res?.Content?.ReadAsStringAsync().Result; + if (html.Contains("会话已过期,请刷新页面")) + { + AddLog?.Invoke("登陆已过期,请刷新页面"); + return null; + } + + var addressCode = GetRegexValue(html, "\"districtCode\":(\\d+)"); + var divisionZip = GetRegexValue(html, "\"divisionZip\":\"([^\"]+)\""); + var mobileNO = GetRegexValue(html, "\"mobileNO\":\"([^\"]+)\""); + var personalName = GetRegexValue(html, "\"personalName\":\"([^\"]+)\""); + var addressDetail = GetRegexValue(html, "\"addressDetail\":\"([^\"]+)\""); + return new AddressModel() + { + AddressDetail = addressDetail, + DivisionZip = divisionZip, + MobileNO = mobileNO, + PersonalName = personalName, + AddressCode = addressCode + }; + } + + return null; + + + + } + + //刷新物流列表 + public OrderParameter ReflashAdress(OrderParameter oldData, AddressModel addressModel, OrderModel orderModel) + { + + string url = "https://order.1688.com/order/smart_ajax.jsx?_input_charset=utf-8"; + + + + List generalOrders_orderGroupKeyList = new List(); + foreach (var orderGroup in oldData.OrderGroupParameterList) + { + List orderList = new List(); + foreach (var orderProduct in orderGroup.OrderProductParameterList) + { + string freightId = orderProduct.FreightId; + string order = $@"{{""offerId"":""{orderProduct.ProductId}"",""skuId"":""{orderProduct.SpectId}"",""tbSkuId"":""{orderProduct.SkuId}"",""hasSkuUmp"":""false"",""outId"":""{orderProduct.OutId}"",""quantity"":{orderProduct.Quantity},""isfreefreight"":0,""marketingScene"":"""",""offerPriceRangeJson"":[{orderProduct.OfferPriceRangeJson}],""unitPrice"":""{orderProduct.UnitPrice}"",""bundle"":"""",""couple"":"""",""freightId"":""{freightId}"",""rebate"":0,""buyerBearServiceFee"":false,""gift"":""0""}}"; + orderList.Add(order); + } + + + string orderGroupData = $@"""{orderGroup.Group}"":{{""order"":[{string.Join(",", orderList)}] ,""orderOutId"":""{orderGroup.OrderOutId}"",""orderBundle"":"""",""orderCouple"":"""",""type"":""address"",""memberId"":""{orderGroup.MemberId}"",""sellerUserId"":""{orderGroup.SellerUserId}"",""operate"":"""",""countyCode"":""{addressModel.AddressCode}"",""addressCode"":""{addressModel.AddressCode}"",""address"":""-1"",""townCode"":"""",""umpSysAvailble"":""1"",""bizType"":""{orderModel}"",""bizScene"":""{orderModel}"",""transportType"":""multiStep"",""groupId"":""{orderGroup.Group}"",""tplCode"":""assureTrade"",""countryISOCode"":"""",""channelId"":"""",""mobile"":""{addressModel.MobileNO}"",""orderAmount"":""{orderGroup.ActualPayFee}"",""carriage"":""{orderGroup.SumCarriage}"",""belong"":""{orderGroup.Belong}""}}"; + + generalOrders_orderGroupKeyList.Add(orderGroupData); + } + + string generalOrders_orderGroupKey = string.Join(",", generalOrders_orderGroupKeyList); + + + + string data = $"{{\"ordersUmp.0\":{{\"orderBlockAjaxParam\":{{\"{orderModel}Orders..orderGroupKey\":{{{generalOrders_orderGroupKey}}}}},\"changeType\":\"address\",\"selectedCrossPromotionId\":\"\",\"selectedCrossPromotionIdMap\":\"{{}}\",\"bizScene\":\"{orderModel}\"}}}}"; + + string postData = $"tasks=ordersUmp.0&data={UrlEncode(data, "UTF-8")}&_csrf_token={oldData.Csrf_token}&lvId={oldData.Lvid}"; + var response = PostHtml(url, postData, _1688Cookie); + + if (response == null || !response.IsSuccessStatusCode) + { + AddLog("获取订单参数失败"); + return null; + } + // string lvid = response.Headers.Get("Eagleeye-Traceid"); + + if (response.Headers.Contains("Eagleeye-Traceid")) + { + //获取响应头 Resin-Trace的值 + + var trace = response.Headers.GetValues("Eagleeye-Traceid"); + if (trace.Any()) + { + oldData.Lvid = trace.FirstOrDefault(); + } + } + + var html = response.Content.ReadAsStringAsync().Result; + + var json = JsonConvert.DeserializeObject(html); + + dynamic jsonObj = JsonConvert.DeserializeObject(html); + + + if (jsonObj["success"].ToString() == "true") + { + + + var datawuliu = jsonObj["data"]["ordersUmp.0"]["data"]["orderPromotion"].ToString(); + + //获取键值对的方式 + bool isReflash = false; + JObject jbO = JObject.Parse(datawuliu); + foreach (var property in jbO.Properties()) + { + var key = property.Name; + var groupData = oldData.OrderGroupParameterList.SingleOrDefault(o => o.Group == key); + + var value = property.Value; + //获取value下的 freight + var freight = (JObject)value["freight"]; + //获取freight的键值对的key值 + foreach (var item in freight.Properties()) + { + var freightKey = item.Name; + var freightValue = item.Value; + //获取freight的键值对的value值 + + //totalFreightFee的值 + var wuliufee = freightValue["totalFreightFee"].ToString(); + + + groupData.OrderProductParameterList.OrderByDescending(s => s.SumCarriage).FirstOrDefault(g => g.FreightId == freightKey).SumCarriage = decimal.Parse(wuliufee) / 100m; + + + + isReflash = true; + } + + + var order = (JObject)value["order"]; + + foreach (var item in order.Properties()) + { + var outId = item.Name; + + var orderProduct = groupData.OrderProductParameterList.FirstOrDefault(g => g.OutId == outId); + + if (orderProduct != null) + { + orderProduct.ProductAmount = item.Value["amount"].ToObject(); + + //selectedUmpBundle 的couple + + var skuSelectedUmpBundle = item.Value["selectedUmpBundle"]; + + if (skuSelectedUmpBundle != null) + { + var couple = skuSelectedUmpBundle["couple"].ToString(); + + var sceneUnitPrice = skuSelectedUmpBundle["sceneUnitPrice"].ToObject(); + + + var discountFee = skuSelectedUmpBundle["price"].ToObject();//折扣价格 + + var skuChooseFreeFreight = skuSelectedUmpBundle["isFreeFreight"].ToObject() ? 1 : 0; + + + + + orderProduct.Couple = couple; + orderProduct.ChooseFreeFreight = skuChooseFreeFreight; + + orderProduct.ProductAmount = orderProduct.UnitPrice * orderProduct.Quantity - discountFee; + + } + + + } + + + + + + + + } + + //selectedShopUmpBundle + + + var selectedShopUmpBundle = value["selectedShopUmpBundle"]; + + bool isFreeFreight = false; + decimal shopDiscountFee = 0; + string shopCouple = ""; + if (selectedShopUmpBundle != null) + { + shopCouple = selectedShopUmpBundle["couple"].ToString();//店铺优惠券 + isFreeFreight = selectedShopUmpBundle["isFreeFreight"].ToObject();//是否包邮 + shopDiscountFee = selectedShopUmpBundle["price"].ToObject();//店铺优惠金额 + } + groupData.ChooseFreeFreight = isFreeFreight ? 1 : 0; + groupData.PromotionId = shopCouple; + + + + + if (isFreeFreight) + groupData.SumCarriage = 0; + else + groupData.SumCarriage = groupData.OrderProductParameterList.Select(s => s.SumCarriage).Sum(); + + groupData.TotalProductAmount = groupData.OrderProductParameterList.Select(s => s.ProductAmount).Sum(); + + groupData.ActualPay = groupData.TotalProductAmount + groupData.SumCarriage - shopDiscountFee; + groupData.ActualPayFee = (int)(groupData.ActualPay * 100); + + + + + + + + + + } + if (isReflash) + { + AddLog?.Invoke("刷新地址成功"); + } + else + { + AddLog?.Invoke("刷新地址失败"); + } + + } + else + { + AddLog?.Invoke("刷新地址失败"); + } + + return oldData; + + } + + + + public string GetCookieStr(string cookies, string cookieName) + { + //通过;分割 + var cookieDatas = cookies.Split(';', StringSplitOptions.RemoveEmptyEntries); + foreach (var cookie in cookieDatas) + { + var cookieParams = cookie.Split('='); + if (cookieParams.Count() >= 2) + { + var key = cookieParams[0]?.Trim(); + var value = cookieParams[1]?.Trim(); + if (key == cookieName) + { + return value; + } + } + } + return ""; + } + + private string GetRegexValue(string html, string patternStr) + { + //使用正则匹配出值 + + var regex = Regex.Match(html, patternStr); + + if (regex.Success) + { + return regex.Groups[1].Value; + } + return null; + + } + + + + //获取_csrf_token参数 + public string GetCsrfToken(string cookies) + { + var csrf_token = GetCookieStr(cookies, "_csrf_token"); + + if (csrf_token == null) + { + return null; + } + return Md5Helper.Md5_32(csrf_token); + } + + //加入购物车 + public void AddCart(string offerId, string specId, int quantity, string IpvId) + { + try + { + //时间戳 + var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + string url = "https://cart.1688.com/ajax/safe/add_to_cart_list_new.jsx"; + + string ext = $"{{\"sceneCode\":\"offerdetail:pc;ipvId:{IpvId}\"}}"; + + string specData = $"[{{\"amount\":{quantity},\"specId\":\"{specId}\",\"selectedTradeServices\":[]}}]"; + string postData = $"type=offer&cargoIdentity={offerId}&returnType=url&needTotalPrice=false&promotionSwitch=false&_csrf_token={GetCsrfToken(_1688Cookie)}&t={timestamp}&purchaseType=&ext={UrlEncode(ext, "utf-8")}&specData={UrlEncode(specData, "utf-8")}"; + + + + + var res = PostHtml(url, postData, _1688Cookie); + if (res.IsSuccessStatusCode) + { + var html = res.Content.ReadAsStringAsync().Result; + + var json = JsonConvert.DeserializeObject(html); + + if (json.success) + { + AddLog?.Invoke("成功加入购物车"); + } + else + { + AddLog?.Invoke("加入购物车失败"); + } + + } + } + catch (Exception ex) + { + + AddLog?.Invoke($"加入购物车失败:{ex.Message}"); + } + + + } + + + + public ApiResponse CommitOrder(PrewOrderResponse prewOrderResponse, string remarkMesg) + { + var productParameter = prewOrderResponse.orderParameter; + var orderModel = prewOrderResponse.OrderModel; + + var adressModel = prewOrderResponse.AddressModel; + + + var flow = orderModel.ToString(); //下单类型 + var ipvId = productParameter.IpvId; + var addressDetail = adressModel.AddressDetail; + var townCode = productParameter.TownCode; + var csrf_token = productParameter.Csrf_token; + var orderUrl = productParameter.OrderUrl; + var addressCode = adressModel.AddressCode; + var lvid = productParameter.Lvid; + var personalName = adressModel.PersonalName; + var mobileNO = adressModel.MobileNO; + var _csrf_token = productParameter.Csrf_token; + + var divisionZip = adressModel.DivisionZip; + + + // 213e38fa17117750507943145ee537 + string fromkv = $"offerdetail:pc;ipvId:{productParameter.IpvId}";//24885ba917116953616677208e + + //string remarkMesg = "拖鞋";//备注消息 + + string cna = GetCookieStr(_1688Cookie, "cna"); + + List _fm_sm_0_iList = new List(); + + List _fm_sma_cargoKeyList = new List(); + + List _fm_smartin_group_meList = new List(); + + List smarts_mList = new List(); + + List _fm_smart_group_meList = new List(); + + + List _fm_sma_group_g_fList = new List(); + + foreach (var OrderGroupParameter in productParameter.OrderGroupParameterList) + { + var group = OrderGroupParameter.Group; + var discountFee = OrderGroupParameter.DiscountFee; + var sumCarriage = OrderGroupParameter.SumCarriage; + var stepName = OrderGroupParameter.StepName; + var totalProductAmount = OrderGroupParameter.TotalProductAmount.ToString("0.00"); + var actualPay = OrderGroupParameter.ActualPay; + var actualPayFee = OrderGroupParameter.ActualPayFee; + var payFee = OrderGroupParameter.PayFee; + var shopCouple = OrderGroupParameter.PromotionId; + var chooseFreeFreight = OrderGroupParameter.ChooseFreeFreight; + + foreach (var orderProductParameter in OrderGroupParameter.OrderProductParameterList) + { + var cargoKey = orderProductParameter.CargoKey; + + var unitPrice = orderProductParameter.UnitPrice.ToString("0.00"); + var productAmount = orderProductParameter.ProductAmount; + var quantity = orderProductParameter.Quantity; + var offerId = orderProductParameter.ProductId; + var specId = orderProductParameter.SpectId; + var tbSkuId = orderProductParameter.SkuId; + + var skuChooseFreeFreight = orderProductParameter.ChooseFreeFreight; + + var _fm_sm_0_i_ = @$"{{""cartId"":"""",""offerId"":""{offerId}"",""specId"":""{specId}"",""tbSkuId"":""{tbSkuId}"",""hasSkuUmp"":""false"",""quantity"":{quantity},""tradeMode"":""multiStep"",""tradeWay"":""100"",""templateCode"":""assureTrade"",""flow"":""{flow}"",""subflow"":"""",""ext"":""{{\""sceneCode\"":\""\""}}""}}"; + _fm_sm_0_iList.Add(_fm_sm_0_i_); + + string _fm_sma_cargoKey = @$"{{""group"":""{group}"",""cargoKey"":""{cargoKey}"",""quantity"":{quantity},""unitPrice"":""{unitPrice}"",""offerId"":""{offerId}"",""specId"":""{specId}"",""tbSkuId"":""{tbSkuId}"",""hasSkuUmp"":""false"",""chooseFreeFreight"":{skuChooseFreeFreight},""productAmount"":""{productAmount}"",""discount"":1,""isVirtual"":""0"",""gift"":"""",""cartId"":"""",""promotionId"":""{orderProductParameter.Couple}"",""ext"":""{{\""sceneCode\"":\""\""}}"",""buyerCharge"":false,""marketingScene"":""""}}"; + _fm_sma_cargoKeyList.Add($"_fm.smar.{cargoKey}.m={UrlEncode(_fm_sma_cargoKey, "gb2312")}"); + + + + + } + string smarts_m = @$"[{{""group"":""{group}"",""stepNo"":""1"",""templateId"":""30"",""stepName"":""{UrlEncode(stepName, "GB2312")}"",""instantPay"":""0"",""sellerActionName"":"""",""buyerPayTimeout"":""0"",""buyerConfirmTimeout"":""0"",""needSellerAction"":""0"",""transferAfterConfirm"":""0"",""needSellerCallNext"":""0"",""isStepPayAll"":""0"",""agreement"":"""",""needLogistics"":""1"",""percent"":""1.0"",""deliveryPercent"":""1.0"",""payFee"":""{payFee}"",""actualPayFee"":""{actualPayFee}"",""discountFee"":""{discountFee}"",""itemDiscountFee"":""0"",""price"":""0"",""amount"":""1"",""postFee"":""0"",""mergedJsonVar"":""""}}]"; + smarts_mList.Add(smarts_m); + + string _fm_smart_group_me = @$"{{""group"":""{group}"",""tplCode"":""assureTrade"",""message"":""{remarkMesg}"",""sumCarriage"":""{sumCarriage}"",""totalAmount"":""{actualPay}"",""totalProductAmount"":""{totalProductAmount}"",""chooseFreeFreight"":{chooseFreeFreight},""mixAmount"":"""",""mixNumber"":""1"",""promotionId"":""{shopCouple}"",""umpSysAvailble"":""1"",""toleranceFreight"":""${{model.toleranceCollection.toleranceFreight}}"",""checkCarriage"":1,""filledCarriage"":""0.00"",""isNeedSellerConfirmFlag"":""0"",""lvid"":""{lvid}"",""fundUsageSelected"":""0"",""hasTaosampleCard"":""0"",""anonymousBuyer"":true,""payEntry"":""multiStep"",""bizType"":""{flow}"",""payWay"":""100"",""orderCodFee"":0,""crossPromotionIds"":[],""crossPromotionIdsMap"":{{}},""crossShopPromotions"":[],""terminal"":""pc_browser_null_0.0.0"",""cna"":""{cna}"",""fromkv"":""{fromkv}""}}"; + _fm_smart_group_meList.Add($"_fm.smart.{group}.me={UrlEncode(_fm_smart_group_me, "GB2312")}"); + + + string _fm_smartin_group_me = @$"{{ ""invoiceFlag"":false,""invoiceType"":0,""invoiceMode"":"""",""streetAddress"":"""",""registerPhone"":"""",""bank"":"""",""accountId"":"""",""companyName"":"""",""localInvoiceId"":""undefined"",""taxpayerIdentifier"":"""",""extParams"":{{ ""email"":""""}},""group"":""{group}""}}"; + + _fm_smartin_group_meList.Add($"_fm.smartin.{group}.me={UrlEncode(_fm_smartin_group_me, "GB2312")}&_fm.smartin.{group}.i=false"); + _fm_sma_group_g_fList.Add($"_fm.sma.{group}.g={group}&_fm.sma.{group}.f={flow}"); + } + + + + var _fm_smarts_0_m = $"[{string.Join(",", smarts_mList)}]"; + + + + var _fm_sm_0_i = $"[{string.Join(",", _fm_sm_0_iList)}]"; + + + string cargoKeyStr = string.Join("&", _fm_sma_cargoKeyList); + + string _fm_smart_group_meStr = string.Join("&", _fm_smart_group_meList); + + string _fm_smartin_group_meStr = string.Join("&", _fm_smartin_group_meList); + + string _fm_smart_group_g_fStr = string.Join("&", _fm_sma_group_g_fList); + + + + + string url = orderUrl; + + string key = GetRegexValue(orderUrl, "key=(\\d+)"); + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + + string adress = UrlEncode(addressDetail, "GB2312");// + string userName = UrlEncode(personalName, "GB2312"); + string phoneNumber = UrlEncode(mobileNO, "GB2312"); + + + var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + + string postData = $"action=SmartMakeOrderAction&event_submit_execute=Action&fromWhere=confirmOrder&fromType=normal&_fm.smarti._0.me=%7B%7D&_fm.smarti._0.i=false&_csrf_token={_csrf_token}" + + $"&_fm.sm._0.f=xxx&_fm.sm._0.i={UrlEncode(_fm_sm_0_i, "GB2312")}&_fm.sm._0.k={key}&_fm.sm._0.a=0&_fm.sm._0.q=&_fm.sm._0.in=&_fm.sm._0.fr=&_fm.sm._0.fro=&_fm.sm._0.s=&_fm.sm._0.se=&_fm.sm._0.p=-1&_fm.sm._0.e=&_fm.sm._0.is=false&_fm.sm._0.null=cart&_fm.sm._0.ex=" + + $"&_fm.sm._0.sc=&_fm.smart._PAGE_LEVEL_.me=%7B%22group%22%3A%22_PAGE_LEVEL_%22%7D&{_fm_smart_group_meStr}&{cargoKeyStr}" + + $"&{_fm_smart_group_g_fStr}&_fm.smartm._0.m=&_fm.smarta._0.ar={addressCode}&_fm.smarta._0.p={addressCode}&_fm.smarta._0.c={addressCode}&_fm.smarta._0.po={divisionZip}&_fm.smarta._0.ad={adress}&_fm.smarta._0.t=&_fm.smarta._0.to=&_fm.smarta._0.f={userName}" + + $"&_fm.smarta._0.ph=&_fm.smarta._0.m={phoneNumber}&_fm.smarta._0.i=false&_fm.smarta._0.is=true&_fm.smarta._0.a=-1&{_fm_smartin_group_meStr}&" + + $"_fm.smarts._0.m={_fm_smarts_0_m}&_fm.r._0.w={timestamp}"; + + var s = GetOrderId(url, postData, _1688Cookie); + + if (s != null) + { + AddLog?.Invoke($"下单成功,返回订单号:{s}"); + return new ApiResponse() { Code = 200, Data = s }; + } + else + { + AddLog?.Invoke("下单失败"); + return new ApiResponse() { Code = 1000, Msg = "下单失败" }; + } + + return new ApiResponse() { Code = 1000, Msg = "下单失败" }; + + + } + + private string GetOrderId(string url, string postData, string cookie) + { + var response = PostHtml(url, postData, cookie); + if (response.IsSuccessStatusCode) + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + var sss = response.Content.ReadAsStringAsync().Result; + if (response.Headers.Contains("Resin-Trace")) + { + //获取响应头 Resin-Trace的值 + + var trace = response.Headers.GetValues("Resin-Trace"); + if (trace.Any()) + { + var traceValue = trace.FirstOrDefault(); + + if (traceValue.Contains("biz_order")) + { + var biz_order = GetRegexValue(traceValue, "biz_order=(\\d+[,]?\\d+)");//获取下单号 + + + return biz_order; + + } + } + } + } + return null; + } + + + public HttpResponseMessage PostHtml(string url, string postData, string cookie) + { + HttpClient client = new HttpClient(); + + + //使用 application/x-www-form-urlencoded post提交 + client.DefaultRequestHeaders.Add("Cookie", cookie); + //postData = "action=SmartMakeOrderAction&event_submit_execute=Action&fromWhere=confirmOrder&fromType=normal&_fm.smarti._0.me=%7B%7D&_fm.smarti._0.i=false&_csrf_token=e107b86e348b5ff07dd1d1e4b0dff58f&_fm.sm._0.f=xxx&_fm.sm._0.i=%5B%7B%22cartId%22%3A%22%22%2C%22offerId%22%3A%22755527819845%22%2C%22specId%22%3A%2248b8df3db448c6bad0e847c317886360%22%2C%22tbSkuId%22%3A%225207346876796%22%2C%22hasSkuUmp%22%3A%22false%22%2C%22quantity%22%3A1%2C%22tradeMode%22%3A%22multiStep%22%2C%22tradeWay%22%3A%22100%22%2C%22templateCode%22%3A%22assureTrade%22%2C%22flow%22%3A%22general%22%2C%22subflow%22%3A%22%22%2C%22ext%22%3A%22%7B%5C%22sceneCode%5C%22%3A%5C%22%5C%22%7D%22%7D%5D&_fm.sm._0.k=171179300009192219&_fm.sm._0.a=0&_fm.sm._0.q=&_fm.sm._0.in=&_fm.sm._0.fr=&_fm.sm._0.fro=&_fm.sm._0.s=&_fm.sm._0.se=&_fm.sm._0.p=-1&_fm.sm._0.e=&_fm.sm._0.is=false&_fm.sm._0.null=detail&_fm.sm._0.ex=&_fm.sm._0.sc=&_fm.smart._PAGE_LEVEL_.me=%7B%22group%22%3A%22_PAGE_LEVEL_%22%7D&_fm.smart.d4d7e431d5b30a44df6a8b2e50a58237.me=%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22tplCode%22%3A%22assureTrade%22%2C%22message%22%3A%22%22%2C%22sumCarriage%22%3A%222.40%22%2C%22totalAmount%22%3A%228.73%22%2C%22totalProductAmount%22%3A%226.33%22%2C%22chooseFreeFreight%22%3A0%2C%22mixAmount%22%3A%22%22%2C%22mixNumber%22%3A%221%22%2C%22promotionId%22%3A%22%22%2C%22umpSysAvailble%22%3A%221%22%2C%22toleranceFreight%22%3A%22%24%7Bmodel.toleranceCollection.toleranceFreight%7D%22%2C%22checkCarriage%22%3A1%2C%22filledCarriage%22%3A%220.00%22%2C%22isNeedSellerConfirmFlag%22%3A%220%22%2C%22lvid%22%3A%2224885bad17117929999545039e%22%2C%22fundUsageSelected%22%3A%220%22%2C%22hasTaosampleCard%22%3A%220%22%2C%22anonymousBuyer%22%3Afalse%2C%22payEntry%22%3A%22multiStep%22%2C%22bizType%22%3A%22general%22%2C%22payWay%22%3A%22100%22%2C%22orderCodFee%22%3A0%2C%22crossPromotionIds%22%3A%5B%5D%2C%22crossPromotionIdsMap%22%3A%7B%7D%2C%22crossShopPromotions%22%3A%5B%5D%2C%22terminal%22%3A%22pc_browser_null_0.0.0%22%2C%22cna%22%3A%224Ha%2FHb9%2B8QEBASQJijR52Awl%22%2C%22fromkv%22%3A%22offerdetail%3Apc%3BipvId%3A213e36ab17117929945421320e75bd%22%7D&_fm.smar.755527819845_48b8df3db448c6bad0e847c317886360.m=%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22cargoKey%22%3A%22755527819845_48b8df3db448c6bad0e847c317886360%22%2C%22quantity%22%3A1%2C%22unitPrice%22%3A%226.33%22%2C%22offerId%22%3A%22755527819845%22%2C%22specId%22%3A%2248b8df3db448c6bad0e847c317886360%22%2C%22tbSkuId%22%3A%225207346876796%22%2C%22hasSkuUmp%22%3A%22false%22%2C%22chooseFreeFreight%22%3A0%2C%22productAmount%22%3A%226.33%22%2C%22discount%22%3A1%2C%22isVirtual%22%3A%220%22%2C%22gift%22%3A%22%22%2C%22cartId%22%3A%22%22%2C%22promotionId%22%3A%22%22%2C%22ext%22%3A%22%7B%5C%22sceneCode%5C%22%3A%5C%22%5C%22%7D%22%2C%22buyerCharge%22%3Afalse%2C%22marketingScene%22%3A%22%22%7D&_fm.sma.d4d7e431d5b30a44df6a8b2e50a58237.g=d4d7e431d5b30a44df6a8b2e50a58237&_fm.sma.d4d7e431d5b30a44df6a8b2e50a58237.f=general&_fm.smartm._0.m=&_fm.smarta._0.ar=350502&_fm.smarta._0.p=350502&_fm.smarta._0.c=350502&_fm.smarta._0.po=362000&_fm.smarta._0.ad=%BD%F0%C1%FA%BD%D6%B5%C0%B9%C5%C1%FA%C2%B7%C3%BD%C8%CB%C7%C52%BA%C5%C8%FD%CE%C4%B9%AB%D4%A2%D2%BB%C2%A5%C6%EB%D4%BD%D6%D0%D7%AA%B2%D6&_fm.smarta._0.t=&_fm.smarta._0.to=&_fm.smarta._0.f=feiyu&_fm.smarta._0.ph=&_fm.smarta._0.m=19959858952&_fm.smarta._0.i=false&_fm.smarta._0.is=true&_fm.smarta._0.a=-1&_fm.smartin.d4d7e431d5b30a44df6a8b2e50a58237.me=%7B%22invoiceFlag%22%3Afalse%2C%22invoiceType%22%3A0%2C%22invoiceMode%22%3A%22%22%2C%22streetAddress%22%3A%22%22%2C%22registerPhone%22%3A%22%22%2C%22bank%22%3A%22%22%2C%22accountId%22%3A%22%22%2C%22companyName%22%3A%22%22%2C%22localInvoiceId%22%3A%22undefined%22%2C%22taxpayerIdentifier%22%3A%22%22%2C%22extParams%22%3A%7B%22email%22%3A%22%22%7D%2C%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%7D&_fm.smartin.d4d7e431d5b30a44df6a8b2e50a58237.i=false&_fm.smarts._0.m=%5B%7B%22group%22%3A%22d4d7e431d5b30a44df6a8b2e50a58237%22%2C%22stepNo%22%3A%221%22%2C%22templateId%22%3A%2230%22%2C%22stepName%22%3A%22%C8%AB%BF%EE%BD%BB%D2%D7%22%2C%22instantPay%22%3A%220%22%2C%22sellerActionName%22%3A%22%22%2C%22buyerPayTimeout%22%3A%220%22%2C%22buyerConfirmTimeout%22%3A%220%22%2C%22needSellerAction%22%3A%220%22%2C%22transferAfterConfirm%22%3A%220%22%2C%22needSellerCallNext%22%3A%220%22%2C%22isStepPayAll%22%3A%220%22%2C%22agreement%22%3A%22%22%2C%22needLogistics%22%3A%221%22%2C%22percent%22%3A%221.0%22%2C%22deliveryPercent%22%3A%221.0%22%2C%22payFee%22%3A%22633%22%2C%22actualPayFee%22%3A%22873%22%2C%22discountFee%22%3A%220%22%2C%22itemDiscountFee%22%3A%220%22%2C%22price%22%3A%220%22%2C%22amount%22%3A%221%22%2C%22postFee%22%3A%220%22%2C%22mergedJsonVar%22%3A%22%22%7D%5D&_fm.r._0.u=140%232w2Dve%2FuzzFMcQo2HiuuFpSanxQgLwMah9FA4xt5yifr2OblcBB8%2FtDVlIZFbEvZcpX14c7HBH%2FAuyTRlaOhIoZWFnLe69cgf%2BoiOnbjo3hqzzn7YQqA3VuzzR8ZiahulFzx2DD3VthqzFrLGXY4U6SxzoObV2EqQG3Y2Ac%2Bx%2BmozFdO2XU%2BobTxzIc7VOg%2FlIXx2Dd6%2F61XrQc12XQzlpg7zPnRVr7uljFo2Aw%2B66G7zFrw2XQ%2B5TjqzWXf3YRLMZ2aMXm"; + + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + HttpContent content = new StringContent(postData, Encoding.GetEncoding("GB2312"), "application/x-www-form-urlencoded"); + + var response = client.PostAsync(url, content).Result; + return response; + } + + public PrewOrderResponse PrewOrder(List orderProducts, string address, OrderModel orderModel) + { + var flow = orderModel.ToString(); //下单类型 + //获取时间戳 + var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + var ipvId = Md5Helper.Md5_32(timestamp.ToString()); + var productParameter = GetProductParameter(orderProducts, orderModel, ipvId); + var _csrf_token = productParameter.Csrf_token; + var lvid = productParameter.Lvid; + var orderUrl = productParameter.OrderUrl; + var adressModel = InputAddress(address, _csrf_token); + if (adressModel == null) + { + return null; + } + AddLog?.Invoke($"获取地址信息成功,姓名:{adressModel.PersonalName},手机号:{adressModel.MobileNO},地址:{adressModel.AddressDetail},邮编:{adressModel.DivisionZip}"); + + var addressCode = adressModel.AddressCode; + var addressDetail = adressModel.AddressDetail; + var personalName = adressModel.PersonalName; + var mobileNO = adressModel.MobileNO; + var divisionZip = adressModel.DivisionZip; + //刷新地址 + productParameter = ReflashAdress(productParameter, adressModel, orderModel); + + + + return new PrewOrderResponse + { + AddressModel = adressModel, + orderParameter = productParameter, + OrderModel = orderModel, + ActualPay = productParameter.OrderGroupParameterList.Select(s => s.ActualPay).Sum(), + SumCarriage = productParameter.OrderGroupParameterList.Select(s => s.SumCarriage).Sum(), + TotalProductAmount = productParameter.OrderGroupParameterList.Select(s => s.TotalProductAmount).Sum() + }; + } + } +} diff --git a/BBWYB.Server.Business/_1688Helper/Md5Helper.cs b/BBWYB.Server.Business/_1688Helper/Md5Helper.cs new file mode 100644 index 0000000..474e3e8 --- /dev/null +++ b/BBWYB.Server.Business/_1688Helper/Md5Helper.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Server.Business._1688Helper +{ + public class Md5Helper + { + //32位小写 + public static string Md5_32(string str) + { + string cl = str; + string pwd = ""; + System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();//实例化一个md5对像 + // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择  + byte[] s = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(cl)); + // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 + for (int i = 0; i < s.Length; i++) + { + //将得到的字符串使用16进制类型格式 + pwd = pwd + s[i].ToString("X"); + } + return pwd.ToLower(); + } + } +} diff --git a/BBWYB.Server.Model/Db/MDS/Purchaseaccount.cs b/BBWYB.Server.Model/Db/MDS/Purchaseaccount.cs index b64c376..69bd7fe 100644 --- a/BBWYB.Server.Model/Db/MDS/Purchaseaccount.cs +++ b/BBWYB.Server.Model/Db/MDS/Purchaseaccount.cs @@ -55,6 +55,11 @@ namespace BBWYB.Server.Model.Db.MDS [Column(StringLength = 50)] public string ShopId { get; set; } - } + /// + /// 采购密码 + /// + public string Password { get; set; } + + } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs index 9867925..ca13702 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs @@ -22,4 +22,13 @@ ///
public long ShopId { get; set; } } + public class WebCreateOrderRequest: CreateOrderRequest + { + //public string WaitPayOrderId { get; set; } + + /// + /// 1688登录的Cookies + /// + public string LoginCookies { get; set; } + } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs index a55aff4..c7d0a5f 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs @@ -22,4 +22,6 @@ namespace BBWYB.Server.Model.Dto public List CargoParamGroupList { get; set; } } + + } diff --git a/BBWYB.Server.Model/Dto/Request/Vender/ShopSettingRequest.cs b/BBWYB.Server.Model/Dto/Request/Vender/ShopSettingRequest.cs index 6b93f0d..4f723e8 100644 --- a/BBWYB.Server.Model/Dto/Request/Vender/ShopSettingRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/Vender/ShopSettingRequest.cs @@ -34,5 +34,7 @@ /// 采购平台 ///
public Enums.Platform PurchasePlatformId { get; set; } + + public string Password { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/_1688/AddressModel.cs b/BBWYB.Server.Model/Dto/_1688/AddressModel.cs new file mode 100644 index 0000000..8e69e16 --- /dev/null +++ b/BBWYB.Server.Model/Dto/_1688/AddressModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Server.Model._1688 +{ + public class AddressModel + { + public string AddressDetail { get; set; } + public string DivisionZip { get; set; } + public string MobileNO { get; set; } + public string PersonalName { get; set; } + public string AddressCode { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/_1688/OrderParameter.cs b/BBWYB.Server.Model/Dto/_1688/OrderParameter.cs new file mode 100644 index 0000000..9704536 --- /dev/null +++ b/BBWYB.Server.Model/Dto/_1688/OrderParameter.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Server.Model._1688 +{ + public class OrderParameter + { + public string Csrf_token { get; set; } + + public string OrderUrl { get; set; } + + public string Lvid { get; set; } + + + public List OrderGroupParameterList { get; set; } + public string Address { get; set; } + public string TownCode { get; set; } + public string IpvId { get; set; } + } + + + public class OrderGroupParameter + { + /// + /// 优惠券id + /// + public string PromotionId { get; set; } + + /// + /// 1使用优惠券 0不使用优惠券 + /// + public int ChooseFreeFreight { get; set; } + + public decimal SumCarriage { get; set; } + + public decimal DiscountFee { get; set; } + public decimal TotalProductAmount { get; set; } + + public decimal ActualPay { get; set; } + + public int PayFee { get; set; } + + public int ActualPayFee { get; set; } + public string Group { get; set; } + + public string StepName { get; set; } + + public string OrderOutId { get; set; } + + public string MemberId { get; set; } + + //sellerUserId + public string SellerUserId { get; set; } + + + ////transportType + //public string TransportType { get; set; } + + ////tplCode + //public string TplCode { get; set; } + + //belong + public string Belong { get; set; } + + + public List OrderProductParameterList { get; set; } + } + + + + public class OrderProductParameter + { + public decimal DiscountFee { get; set; } + + public decimal SumCarriage { get; set; } + public string ProductId { get; set; } + + public string SkuId { get; set; } + + public string SpectId { get; set; } + + + public string CargoKey { get; set; } + + public decimal UnitPrice { get; set; } + + public decimal ProductAmount { get; set; } + public int Quantity { get; set; } + public string FreightId { get; set; } + + //outId + public string OutId { get; set; } + public string? OfferPriceRangeJson { get; set; } + + + /// + /// 优惠券 + /// + public string Couple { get; set; } + + /// + /// 1使用优惠券 0不使用优惠券 + /// + public int ChooseFreeFreight { get; set; } + public string Ext { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/_1688/OrderProduct.cs b/BBWYB.Server.Model/Dto/_1688/OrderProduct.cs new file mode 100644 index 0000000..144ba93 --- /dev/null +++ b/BBWYB.Server.Model/Dto/_1688/OrderProduct.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Server.Model._1688 +{ + public class OrderProduct + { + public string ProductId { get; set; } + + public string SkuId { get; set; } + + public string SpectId { get; set; } + + //数量 + public int Quantity { get; set; } + + + } +} diff --git a/BBWYB.Server.Model/Dto/_1688/PrewOrderResponse.cs b/BBWYB.Server.Model/Dto/_1688/PrewOrderResponse.cs new file mode 100644 index 0000000..9fc1080 --- /dev/null +++ b/BBWYB.Server.Model/Dto/_1688/PrewOrderResponse.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static BBWYB.Server.Model.Enums; + +namespace BBWYB.Server.Model._1688 +{ + public class PrewOrderResponse + { + public OrderParameter orderParameter { get; set; } + + public OrderModel OrderModel { get; set; } + + public AddressModel AddressModel { get; set; } + + public decimal TotalProductAmount { get; set; } + + public decimal SumCarriage { get; set; } + + //总订单金额 + public decimal ActualPay { get; set; } + + } +} diff --git a/BBWYB.Server.Model/Dto/_1688/ProductModel.cs b/BBWYB.Server.Model/Dto/_1688/ProductModel.cs new file mode 100644 index 0000000..81f50fb --- /dev/null +++ b/BBWYB.Server.Model/Dto/_1688/ProductModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Server.Model._1688 +{ + public class ProductModel + { + public int MixNumber { get; set; } + + public string IpvId { get; set; } + } +} diff --git a/BBWYB.Server.Model/Dto/_1688/_1688CookieModel.cs b/BBWYB.Server.Model/Dto/_1688/_1688CookieModel.cs new file mode 100644 index 0000000..73dbd7b --- /dev/null +++ b/BBWYB.Server.Model/Dto/_1688/_1688CookieModel.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Server.Model._1688 +{ + public class _1688CookieModel + { + public string Cookie { get; set; } + + public string UserName { get; set; } + + public string Password { get; set; } + + public DateTime LoginTime { get; set; } + + + } +} diff --git a/BBWYB.Server.Model/Enums.cs b/BBWYB.Server.Model/Enums.cs index 3ef2064..17b222d 100644 --- a/BBWYB.Server.Model/Enums.cs +++ b/BBWYB.Server.Model/Enums.cs @@ -381,5 +381,15 @@ 本组添加过采购方案 = 11, 本组历史采购过该供应商的商品 = 12 } + + /// + /// 下单类型(批发(general)=0,代发(fenxiao=1) + /// + public enum OrderModel + { + general = 0,//批发 + fenxiao = 1//代发 + + } } } From 5c1e8a331909ffd7feb302ff72fbc3eab2e3b825 Mon Sep 17 00:00:00 2001 From: shanji <18996038927@163.com> Date: Tue, 9 Apr 2024 00:49:04 +0800 Subject: [PATCH 4/5] =?UTF-8?q?1)=20=E5=BE=85=E4=BC=98=E5=8C=96=E9=99=90?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=88=B0=E6=9C=9F=E6=9C=80=E5=A4=9A?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E4=B8=A4=E6=AC=A1=EF=BC=8C=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=AC=A1=E5=BC=80=E5=A7=8B=E5=85=81=E8=AE=B8=E6=97=A0=E9=99=90?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E4=B8=8D=E5=86=8D=E9=87=8D=E5=90=AF=202)=201?= =?UTF-8?q?688=E6=B6=88=E6=81=AF=E9=80=9A=E7=9F=A5=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B9=B6=E5=8F=91=E6=8E=A7=E5=88=B6,=20?= =?UTF-8?q?=E5=8D=95=E4=BD=8D=E6=97=B6=E9=97=B4=E5=86=85(1min)=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=B6=88=E6=81=AF=E4=B8=80=E7=AC=94=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=EF=BC=8C=E5=8F=AA=E5=85=81=E8=AE=B8=E6=89=A7=E8=A1=8C=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E3=80=82=E4=BD=9C=E7=94=A8=E8=8C=83=E5=9B=B4=E5=90=AB?= =?UTF-8?q?[=E4=BB=98=E6=AC=BE/=E6=94=B9=E4=BB=B7/=E5=8F=91=E8=B4=A7/?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=8F=91=E8=B4=A7]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PurchaseOrder/PurchaseOrderBusiness.cs | 94 +++++++++++++++---- .../SkuOptimization/OptimizationBusiness.cs | 28 +++++- .../TimeLimitTask/TimeLimitTaskBusiness.cs | 5 - .../Db/SpuOptimization/Spuoptimizationtask.cs | 6 ++ 4 files changed, 109 insertions(+), 24 deletions(-) diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 9718937..5d1a801 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -10,6 +10,7 @@ using BBWYB.Server.Model.Db.Mds; using BBWYB.Server.Model.Db.MDS; using BBWYB.Server.Model.Dto; using FreeSql; +using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -39,6 +40,7 @@ namespace BBWYB.Server.Business private Lazy venderBusinessLazy; private Lazy purchaseSchemeBusinessLazy; private Lazy timeLimitRulesLazy; + private Lazy memoryCacheLazy; private PP_PlatformClientFactory ppPlatformClientFactory => pplatformClientFactoryLazy.Value; private TaskSchedulerManager taskSchedulerManager => taskSchedulerManagerLazy.Value; @@ -57,8 +59,12 @@ namespace BBWYB.Server.Business private TimeLimitRules timeLimitRules => timeLimitRulesLazy.Value; + private IMemoryCache memoryCache => memoryCacheLazy.Value; + private IList cantPurchaseOrderStateList; + private TimeSpan _1688ConcurrentKeyTimeSpan; + public PurchaseOrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, @@ -77,12 +83,14 @@ namespace BBWYB.Server.Business venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); purchaseSchemeBusinessLazy = new Lazy(() => serviceProvider.GetService()); timeLimitRulesLazy = new Lazy(() => serviceProvider.GetService()); + memoryCacheLazy = new Lazy(() => serviceProvider.GetService()); cantPurchaseOrderStateList = new List() { Enums.OrderState.已取消, Enums.OrderState.已完成, Enums.OrderState.待付款 }; + _1688ConcurrentKeyTimeSpan = new TimeSpan(0, 1, 0); } /// @@ -2346,25 +2354,56 @@ namespace BBWYB.Server.Business //} #region 1688CallBack + private string Get1688ConcurrentKey(JObject j) + { + var type = j.Value("type").ToUpper(); + var poId = string.Empty; + switch (type) + { + case "ORDER_BUYER_VIEW_PART_PART_SENDGOODS": //部分发货 + case "ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS": //发货 + case "ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY": //订单改价 + case "LOGISTICS_BUYER_VIEW_TRACE": //物流变更 + case "ORDER_BUYER_VIEW_ORDER_PAY": //支付 + poId = j["data"].Value("orderId"); + break; + default: + break; + } + if (string.IsNullOrEmpty(poId)) + return string.Empty; + + return $"{type}_{poId}"; + } + public void CallbackFrom1688(string jsonStr) { nLogManager.Default().Info(jsonStr); var jObject = JObject.Parse(jsonStr); + var _1688ConcurrentKey = Get1688ConcurrentKey(jObject); + + if (!string.IsNullOrEmpty(_1688ConcurrentKey)) + { + if (memoryCache.TryGetValue(_1688ConcurrentKey, out _)) + return;//并发key存在,不允执行 + memoryCache.Set(_1688ConcurrentKey, _1688ConcurrentKey, _1688ConcurrentKeyTimeSpan); + } + var type = jObject.Value("type").ToUpper(); switch (type) { case "ORDER_BUYER_VIEW_PART_PART_SENDGOODS": //部分发货 case "ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS": //发货 - DeliveryCallbackFrom1688(jObject); + DeliveryCallbackFrom1688(jObject, _1688ConcurrentKey); break; case "ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY": - OrderPriceModificationCallbackFrom1688(jObject); //订单改价 + OrderPriceModificationCallbackFrom1688(jObject, _1688ConcurrentKey); //订单改价 break; case "LOGISTICS_BUYER_VIEW_TRACE": // LogisticsUpdateCallbackFrom1688(jObject);//1688物流信息变更 break; case "ORDER_BUYER_VIEW_ORDER_PAY": - OrderPayFrom1688(jObject); + OrderPayFrom1688(jObject, _1688ConcurrentKey); break; default: break; @@ -2375,17 +2414,21 @@ namespace BBWYB.Server.Business /// 1688发货回调 /// /// - private void DeliveryCallbackFrom1688(JObject jObject) + /// 并发key + private void DeliveryCallbackFrom1688(JObject jObject, string _1688ConcurrentKey) { var purchaseOrderId = jObject["data"].Value("orderId"); - Task.Factory.StartNew(() => DeliveryCallbackFrom1688(purchaseOrderId), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => DeliveryCallbackFrom1688(purchaseOrderId, _1688ConcurrentKey), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } /// /// 1688发货回调 /// - /// 采购单 - private void DeliveryCallbackFrom1688(string purchaseOrderId) + /// + /// + /// + /// + private void DeliveryCallbackFrom1688(string purchaseOrderId, string _1688ConcurrentKey) { string orderId = string.Empty; long? shopId = null; @@ -2623,22 +2666,28 @@ namespace BBWYB.Server.Business { nLogManager.Default().Error(ex, $"DeliveryCallback 回调平台1688,订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo}"); } + finally + { + if (!string.IsNullOrEmpty(_1688ConcurrentKey)) + memoryCache.Remove(_1688ConcurrentKey); + } } /// /// 1688订单改价回调 /// /// - private void OrderPriceModificationCallbackFrom1688(JObject jObject) + /// + private void OrderPriceModificationCallbackFrom1688(JObject jObject, string _1688ConcurrentKey) { var purchaseOrderId = jObject["data"].Value("orderId"); - Task.Factory.StartNew(() => OrderPriceModificationCallback(purchaseOrderId, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => OrderPriceModificationCallback(purchaseOrderId, Enums.Platform.阿里巴巴, _1688ConcurrentKey), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } - private void OrderPayFrom1688(JObject jObject) + private void OrderPayFrom1688(JObject jObject, string _1688ConcurrentKey) { var purchaseOrderId = jObject["data"].Value("orderId"); - Task.Factory.StartNew(() => OrderPayCallback(purchaseOrderId, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => OrderPayCallback(purchaseOrderId, Enums.Platform.阿里巴巴, _1688ConcurrentKey), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } #endregion @@ -2648,14 +2697,21 @@ namespace BBWYB.Server.Business ///
/// /// - private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform) + /// + private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform, string concurrentKey) { - OnSomeOnePurchaseOrderChanged(purchaseOrderId, true); + OnSomeOnePurchaseOrderChanged(purchaseOrderId, true, concurrentKey); } - private void OrderPayCallback(string purchaseOrderId, Enums.Platform callbackPlatform) + /// + /// 订单支付回调 + /// + /// + /// + /// + private void OrderPayCallback(string purchaseOrderId, Enums.Platform callbackPlatform, string concurrentKey) { - OnSomeOnePurchaseOrderChanged(purchaseOrderId, false); + OnSomeOnePurchaseOrderChanged(purchaseOrderId, false, concurrentKey); } public void KuaiDi100Publish(string param) @@ -2927,7 +2983,8 @@ namespace BBWYB.Server.Business /// /// 采购单Id /// 当不需要触发订单改价时是否继续走流程 - public void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce) + /// 并发key + public void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce, string concurrentKey) { bool isEditOrderPrice = true; try @@ -3182,6 +3239,11 @@ namespace BBWYB.Server.Business { nLogManager.Default().Error(ex, $"OrderPriceModificationCallback 采购单号{purchaseOrderId}"); } + finally + { + if (!string.IsNullOrEmpty(concurrentKey)) + memoryCache.Remove(concurrentKey); + } } private void SendDingDing(string content) diff --git a/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs b/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs index a980dce..65ecade 100644 --- a/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs +++ b/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs @@ -706,10 +706,10 @@ namespace BBWYB.Server.Business { //已超时 select = select.Where(t => t.IsOptimizationCompleted == true) - .Where(t=> fsql.Select() + .Where(t => fsql.Select() .Where(sbt => sbt.IsOptimizationCompleted == false && - sbt.SpuOptimizationTaskId == t.Id ) - .WhereIf(!string.IsNullOrEmpty(barginTeamId),sbt=>sbt.BelongTeamId == barginTeamId) + sbt.SpuOptimizationTaskId == t.Id) + .WhereIf(!string.IsNullOrEmpty(barginTeamId), sbt => sbt.BelongTeamId == barginTeamId) .Any()); } } @@ -903,6 +903,7 @@ namespace BBWYB.Server.Business IUpdate updateSpuTask = null; IUpdate updateSpuSaleInfo = null; IUpdate updateCompetitiveTenderTask = null; + IUpdate updateTimeLimitTask = null; var spuOptimizationBargainTeamTaskList = fsql.Select() .Where(sbt => sbt.SpuOptimizationTaskId == taskId) @@ -960,12 +961,33 @@ namespace BBWYB.Server.Business .Set(ct => ct.IsWin, true); #endregion } + else + { + //重启任务 + if (spuOptimizationTask.ReStartTimes < 2) + { + var timeLimitTask = fsql.Select().Where(t => t.TaskType == Enums.TimeLimitTaskType.待议价任务 && + t.TaskId == spuOptimizationTask.Id).ToOne(); + if (timeLimitTask != null) + { + var expirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待议价任务, DateTime.Now); + updateTimeLimitTask = fsql.Update(timeLimitTask.Id) + .Set(t => t.ExpirationTime, expirationTime) + .Set(t => t.CompletionTime, null) + .Set(t => t.IsTimely, null); + } + spuOptimizationTask.ReStartTimes++; + updateSpuTask = fsql.Update(spuOptimizationTask.Id) + .Set(t => t.ReStartTimes, spuOptimizationTask.ReStartTimes); + } + } fsql.Transaction(() => { updateSpuTask?.ExecuteAffrows(); updateSpuSaleInfo?.ExecuteAffrows(); updateCompetitiveTenderTask?.ExecuteAffrows(); + updateTimeLimitTask?.ExecuteAffrows(); }); } catch (Exception ex) diff --git a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs index bf98724..e217ff8 100644 --- a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs +++ b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs @@ -38,11 +38,6 @@ namespace BBWYB.Server.Business } public void CheckTask() { - //fsql.Update().Set(t => t.IsTimely, false) - // .Where(t => t.CompletionTime == null) - // .Where(t => t.ExpirationTime < DateTime.Now) - // .ExecuteAffrows(); - var timeoutTaskList = fsql.Select().Where(t => t.CompletionTime == null && t.ExpirationTime < DateTime.Now).ToList(); if (timeoutTaskList.Count() > 0) { diff --git a/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs b/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs index 97c0020..1c5c598 100644 --- a/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs +++ b/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs @@ -87,6 +87,12 @@ namespace BBWYB.Server.Model.Db [Column(DbType = "int", MapType = typeof(int?))] public Enums.TriggerOptimizationReason? TriggerOptimizationReason { get; set; } + /// + /// 重启次数 + /// + [Column(DbType = "int")] + public int ReStartTimes { get; set; } = 0; + } } From 949ee57654f157ae7d96e4bbbbfa2942cbcab37a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=9E=E9=B1=BC?= <506583276@qq.com> Date: Tue, 9 Apr 2024 09:21:34 +0800 Subject: [PATCH 5/5] 1 --- BBWYB.Client/BBWYB.Client.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BBWYB.Client/BBWYB.Client.csproj b/BBWYB.Client/BBWYB.Client.csproj index 77215bc..b246e1a 100644 --- a/BBWYB.Client/BBWYB.Client.csproj +++ b/BBWYB.Client/BBWYB.Client.csproj @@ -37,7 +37,7 @@ - +