Browse Source

1688爬虫

qianyi
shanji 3 years ago
parent
commit
d6f37a5dfe
  1. 88
      BBWY.Client/APIServices/PurchaseProductAPIService.cs
  2. 5
      BBWY.Client/App.xaml.cs
  3. 12
      BBWY.Client/Extensions/CopyExtensions.cs
  4. 100
      BBWY.Client/ViewModels/Purchase/1688PreviewPurchaseViewModel.cs
  5. 86
      BBWY.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs
  6. 2
      BBWY.Common/Http/RestAPIService.cs

88
BBWY.Client/APIServices/PurchaseProductAPIService.cs

@ -4,6 +4,7 @@ using BBWY.Common.Http;
using BBWY.Common.Models; using BBWY.Common.Models;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
@ -17,6 +18,7 @@ namespace BBWY.Client.APIServices
private RestApiService restApiService; private RestApiService restApiService;
private string oneBoundKey = "t5060712539"; private string oneBoundKey = "t5060712539";
private string oneBoundSecret = "20211103"; private string oneBoundSecret = "20211103";
private ConcurrentDictionary<string, (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)> productChaches;
private IDictionary<string, string> _1688ProductDetailRequestHeader; private IDictionary<string, string> _1688ProductDetailRequestHeader;
@ -31,6 +33,7 @@ namespace BBWY.Client.APIServices
{ "Accept-Encoding","gzip, deflate, br"}, { "Accept-Encoding","gzip, deflate, br"},
{ "Accept-Language","zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"} { "Accept-Language","zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"}
}; };
productChaches = new ConcurrentDictionary<string, (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)>();
} }
public (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)? GetProductInfo(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode, PurchaseProductAPIMode apiMode) public (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)? GetProductInfo(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode, PurchaseProductAPIMode apiMode)
@ -39,13 +42,17 @@ namespace BBWY.Client.APIServices
if (apiMode == PurchaseProductAPIMode.Spider) if (apiMode == PurchaseProductAPIMode.Spider)
{ {
data = LoadFromSpider(platform, productId, skuId, purchaseProductId, priceMode); data = LoadFromSpider(platform, productId, skuId, purchaseProductId, priceMode);
if (data == null)
data = LoadFromOneBound(platform, productId, skuId, purchaseProductId, priceMode);
} }
else if (apiMode == PurchaseProductAPIMode.OneBound) else if (apiMode == PurchaseProductAPIMode.OneBound)
{ {
data = LoadFromOneBound(platform, productId, skuId, purchaseProductId, priceMode); data = LoadFromOneBound(platform, productId, skuId, purchaseProductId, priceMode);
if (data == null)
data = LoadFromSpider(platform, productId, skuId, purchaseProductId, priceMode);
} }
return data; return data?.Copy();
} }
private (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)? LoadFromOneBound(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode) private (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)? LoadFromOneBound(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode)
@ -59,6 +66,9 @@ namespace BBWY.Client.APIServices
if (string.IsNullOrEmpty(platformStr)) if (string.IsNullOrEmpty(platformStr))
return null; return null;
if (productChaches.TryGetValue($"{purchaseProductId}_{priceMode}", out (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus) tuple))
return tuple;
var result = restApiService.SendRequest("https://api-gw.onebound.cn/", $"{platformStr}/item_get", $"key={oneBoundKey}&secret={oneBoundSecret}&num_iid={purchaseProductId}&lang=zh-CN&cache=no&agent={(priceMode == PurchaseOrderMode.批发 ? 0 : 1)}", null, HttpMethod.Get, paramPosition: ParamPosition.Query, enableRandomTimeStamp: true); var result = restApiService.SendRequest("https://api-gw.onebound.cn/", $"{platformStr}/item_get", $"key={oneBoundKey}&secret={oneBoundSecret}&num_iid={purchaseProductId}&lang=zh-CN&cache=no&agent={(priceMode == PurchaseOrderMode.批发 ? 0 : 1)}", null, HttpMethod.Get, paramPosition: ParamPosition.Query, enableRandomTimeStamp: true);
if (result.StatusCode != System.Net.HttpStatusCode.OK) if (result.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception($"{result.StatusCode} {result.Content}"); throw new Exception($"{result.StatusCode} {result.Content}");
@ -83,7 +93,7 @@ namespace BBWY.Client.APIServices
PurchaseSkuId = j.Value<string>("sku_id"), PurchaseSkuId = j.Value<string>("sku_id"),
PurchaseSkuSpecId = j.Value<string>("spec_id"), PurchaseSkuSpecId = j.Value<string>("spec_id"),
Title = j.Value<string>("properties_name"), Title = j.Value<string>("properties_name"),
Logo = GetSkuLogo(j, (JArray)j["item"]["prop_imgs"]["prop_img"]) Logo = GetOneBoundSkuLogo(j, (JArray)j["item"]["prop_imgs"]["prop_img"])
}).ToList(); }).ToList();
var purchaserId = j["item"]["seller_info"].Value<string>("user_num_id"); var purchaserId = j["item"]["seller_info"].Value<string>("user_num_id");
@ -92,14 +102,16 @@ namespace BBWY.Client.APIServices
purchaserName = j["item"]["seller_info"].Value<string>("shop_name"); purchaserName = j["item"]["seller_info"].Value<string>("shop_name");
var purchaserLocation = j["item"].Value<string>("location"); var purchaserLocation = j["item"].Value<string>("location");
return ( tuple = (new Purchaser()
new Purchaser()
{ {
Id = purchaserId, Id = purchaserId,
Name = purchaserName, Name = purchaserName,
Location = purchaserLocation Location = purchaserLocation
}, }, list);
list);
productChaches.TryAdd($"{purchaseProductId}_{priceMode}", tuple);
return tuple;
} }
} }
catch { } catch { }
@ -108,7 +120,7 @@ namespace BBWY.Client.APIServices
} }
} }
private string GetSkuLogo(JToken skuJToken, JArray prop_img) private string GetOneBoundSkuLogo(JToken skuJToken, JArray prop_img)
{ {
if (!prop_img.HasValues) if (!prop_img.HasValues)
return "pack://application:,,,/Resources/Images/defaultItem.png"; return "pack://application:,,,/Resources/Images/defaultItem.png";
@ -124,11 +136,13 @@ namespace BBWY.Client.APIServices
private (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)? LoadFromSpider(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode) private (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)? LoadFromSpider(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode)
{ {
if (productChaches.TryGetValue($"{purchaseProductId}_{priceMode}", out (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus) tuple))
return tuple;
switch (platform) switch (platform)
{ {
case Platform.: case Platform.:
LoadFrom1688Spider(platform, productId, skuId, purchaseProductId, priceMode); return LoadFrom1688Spider(platform, productId, skuId, purchaseProductId, priceMode);
break;
case Platform.: case Platform.:
break; break;
@ -146,23 +160,73 @@ namespace BBWY.Client.APIServices
//data/1081181309582/data/pirceModel/[currentPrices]/[0]price //data/1081181309582/data/pirceModel/[currentPrices]/[0]price
try
{
var _1688pageResult = restApiService.SendRequest("https://detail.1688.com", var _1688pageResult = restApiService.SendRequest("https://detail.1688.com",
$"offer/{purchaseProductId}.html", $"offer/{purchaseProductId}.html",
$"clickid={Guid.NewGuid().ToString().Md5Encrypt()}&sessionid={Guid.NewGuid().ToString().Md5Encrypt()}&sk={(priceMode == PurchaseOrderMode.批发 ? "order" : "consign")}", $"clickid={Guid.NewGuid().ToString().Md5Encrypt()}&sessionid={Guid.NewGuid().ToString().Md5Encrypt()}&sk={(priceMode == PurchaseOrderMode.批发 ? "order" : "consign")}",
_1688ProductDetailRequestHeader, _1688ProductDetailRequestHeader,
HttpMethod.Get); HttpMethod.Get,
httpClientName: "gzip");
if (_1688pageResult.StatusCode != System.Net.HttpStatusCode.OK) if (_1688pageResult.StatusCode != System.Net.HttpStatusCode.OK)
return null; return null;
var match = Regex.Match(_1688pageResult.Content, @"(window\.__INIT_DATA=)(.*)(\s?</script>)"); var match = Regex.Match(_1688pageResult.Content, @"(window\.__INIT_DATA=)(.*)(\r*\n*\s*</script>)");
if (!match.Success) if (!match.Success)
return null; return null;
var jsonStr = match.Groups[2].Value; var jsonStr = match.Groups[2].Value;
var j = JObject.Parse(jsonStr); var jobject = JObject.Parse(jsonStr);
var purchaser = new Purchaser()
{
Id = jobject["globalData"]["tempModel"]["sellerUserId"].ToString(),
Name = jobject["globalData"]["tempModel"]["companyName"].ToString(),
Location = jobject["data"]["1081181309101"]["data"]["location"].ToString()
};
var colors3216 = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(j => j.Value<int>("fid") == 3216)["value"].Children().Select(j => new
{
name = j.Value<string>("name"),
imageUrl = j.Value<string>("imageUrl")
}).ToList();
var price = jobject["data"]["1081181309582"]["data"]["priceModel"]["currentPrices"][0].Value<decimal>("price");
var purchaseSchemeProductSkus = new List<PurchaseSchemeProductSku>();
foreach (var jsku in jobject["globalData"]["skuModel"]["skuInfoMap"].Children())
{
var jskuProperty = jsku as JProperty;
var name = jskuProperty.Name;
var matchName = name.Contains("&gt;") ? name.Substring(0, name.IndexOf("&gt;")) : name;
var value = jskuProperty.Value;
purchaseSchemeProductSkus.Add(new PurchaseSchemeProductSku()
{
ProductId = productId,
SkuId = skuId,
PurchaseProductId = purchaseProductId,
Price = price,
Title = name,
PurchaseSkuId = value.Value<string>("skuId"),
PurchaseSkuSpecId = value.Value<string>("specId"),
Logo = colors3216.FirstOrDefault(c => c.name == matchName)?.imageUrl ?? "pack://application:,,,/Resources/Images/defaultItem.png"
});
}
var tuple = (purchaser, purchaseSchemeProductSkus);
productChaches.TryAdd($"{purchaseProductId}_{priceMode}", tuple);
return tuple;
}
catch
{
return null; return null;
} }
} }
} }
}

5
BBWY.Client/App.xaml.cs

@ -9,6 +9,7 @@ using System;
using System.IO; using System.IO;
using System.IO.MemoryMappedFiles; using System.IO.MemoryMappedFiles;
using System.Linq; using System.Linq;
using System.Net.Http;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -70,6 +71,10 @@ namespace BBWY.Client
IServiceCollection serviceCollection = new ServiceCollection(); IServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddHttpClient(); serviceCollection.AddHttpClient();
serviceCollection.AddHttpClient("gzip").ConfigurePrimaryHttpMessageHandler(handler => new HttpClientHandler()
{
AutomaticDecompression = System.Net.DecompressionMethods.GZip
});
serviceCollection.AddSingleton<RestApiService>(); serviceCollection.AddSingleton<RestApiService>();
serviceCollection.AddSingleton(gl); serviceCollection.AddSingleton(gl);
serviceCollection.BatchRegisterServices(new Assembly[] { Assembly.Load("BBWY.Client") }, typeof(IDenpendency)); serviceCollection.BatchRegisterServices(new Assembly[] { Assembly.Load("BBWY.Client") }, typeof(IDenpendency));

12
BBWY.Client/Extensions/CopyExtensions.cs

@ -0,0 +1,12 @@
using Newtonsoft.Json;
namespace BBWY.Client.Extensions
{
public static class CopyExtensions
{
public static T Copy<T>(this T p)
{
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(p));
}
}
}

100
BBWY.Client/ViewModels/Purchase/1688PreviewPurchaseViewModel.cs

@ -54,6 +54,7 @@ namespace BBWY.Client.ViewModels
private OneBoundAPIService oneBoundAPIService; private OneBoundAPIService oneBoundAPIService;
private PurchaseService purchaseService; private PurchaseService purchaseService;
private PurchaseOrderService purchaseOrderService; private PurchaseOrderService purchaseOrderService;
private PurchaseProductAPIService purchaseProductAPIService;
private DelayTrigger delayTrigger; private DelayTrigger delayTrigger;
private decimal productAmount; private decimal productAmount;
@ -73,11 +74,13 @@ namespace BBWY.Client.ViewModels
public _1688PreviewPurchaseViewModel(OneBoundAPIService oneBoundAPIService, public _1688PreviewPurchaseViewModel(OneBoundAPIService oneBoundAPIService,
PurchaseService purchaseService, PurchaseService purchaseService,
PurchaseOrderService purchaseOrderService, PurchaseOrderService purchaseOrderService,
PurchaseProductAPIService purchaseProductAPIService,
GlobalContext globalContext, GlobalContext globalContext,
OrderListViewModel orderListViewModel) OrderListViewModel orderListViewModel)
{ {
this.oneBoundAPIService = oneBoundAPIService; this.oneBoundAPIService = oneBoundAPIService;
this.purchaseOrderService = purchaseOrderService; this.purchaseOrderService = purchaseOrderService;
this.purchaseProductAPIService = purchaseProductAPIService;
this.purchaseService = purchaseService; this.purchaseService = purchaseService;
this.delayTrigger = new DelayTrigger(); this.delayTrigger = new DelayTrigger();
this.delayTrigger.OnExecute = OnDelayTriggerExecute; this.delayTrigger.OnExecute = OnDelayTriggerExecute;
@ -129,7 +132,7 @@ namespace BBWY.Client.ViewModels
var ewh = new ManualResetEvent(false); var ewh = new ManualResetEvent(false);
waitList.Add(ewh); waitList.Add(ewh);
var orderSku = order.ItemList.FirstOrDefault(osku => osku.Id == purchaseScheme.SkuId); var orderSku = order.ItemList.FirstOrDefault(osku => osku.Id == purchaseScheme.SkuId);
Task.Factory.StartNew(() => LoadPurchaseProduct(purchaseSchemeProduct, orderSku, ewh)); Task.Factory.StartNew(() => LoadPurchaseProduct(purchaseScheme.PurchasePlatform, purchaseSchemeProduct, orderSku, ewh));
} }
} }
@ -159,14 +162,36 @@ namespace BBWY.Client.ViewModels
} }
private void LoadPurchaseProduct(PurchaseSchemeProduct purchaseSchemeProduct, OrderSku orderSku, ManualResetEvent ewh) private void LoadPurchaseProduct(Platform platform, PurchaseSchemeProduct purchaseSchemeProduct, OrderSku orderSku, ManualResetEvent ewh)
{ {
var purchaseSchemeProductSkuList = LoadPurchaseProductCore(purchaseSchemeProduct, out string errorMsg); //var purchaseSchemeProductSkuList = LoadPurchaseProductCore(purchaseSchemeProduct, out string errorMsg);
if (purchaseSchemeProductSkuList != null && purchaseSchemeProductSkuList.Count > 0) //if (purchaseSchemeProductSkuList != null && purchaseSchemeProductSkuList.Count > 0)
//{
// App.Current.Dispatcher.Invoke(() =>
// {
// foreach (var purchaseSchemeProductSku in purchaseSchemeProductSkuList)
// {
// if (purchaseSchemeProduct.SelectedSkuIdList.Any(s => s == purchaseSchemeProductSku.PurchaseSkuId))
// {
// PurchaseSchemeProductSkuList.Add(purchaseSchemeProductSku);
// purchaseSchemeProductSku.ItemTotal = orderSku.ItemTotal;
// purchaseSchemeProductSku.OnItemTotalChanged = OnItemTotalChanged;
// }
// }
// });
//}
var data = purchaseProductAPIService.GetProductInfo(platform,
purchaseSchemeProduct.ProductId,
purchaseSchemeProduct.SkuId,
purchaseSchemeProduct.PurchaseProductId,
PurchaseOrderMode,
PurchaseProductAPIMode.Spider);
if (data != null && data.Value.purchaseSchemeProductSkus != null && data.Value.purchaseSchemeProductSkus.Count > 0)
{ {
App.Current.Dispatcher.Invoke(() => App.Current.Dispatcher.Invoke(() =>
{ {
foreach (var purchaseSchemeProductSku in purchaseSchemeProductSkuList) foreach (var purchaseSchemeProductSku in data.Value.purchaseSchemeProductSkus)
{ {
if (purchaseSchemeProduct.SelectedSkuIdList.Any(s => s == purchaseSchemeProductSku.PurchaseSkuId)) if (purchaseSchemeProduct.SelectedSkuIdList.Any(s => s == purchaseSchemeProductSku.PurchaseSkuId))
{ {
@ -177,45 +202,46 @@ namespace BBWY.Client.ViewModels
} }
}); });
} }
ewh.Set(); ewh.Set();
ewh.Dispose(); ewh.Dispose();
} }
private IList<PurchaseSchemeProductSku> LoadPurchaseProductCore(PurchaseSchemeProduct purchaseSchemeProduct, out string errorMsg) //private IList<PurchaseSchemeProductSku> LoadPurchaseProductCore(PurchaseSchemeProduct purchaseSchemeProduct, out string errorMsg)
{ //{
errorMsg = string.Empty; // errorMsg = string.Empty;
//1688商品详情接口 // //1688商品详情接口
var response = oneBoundAPIService.GetProductInfo("1688", purchaseSchemeProduct.PurchaseProductId); // var response = oneBoundAPIService.GetProductInfo("1688", purchaseSchemeProduct.PurchaseProductId);
if (!response.Success) // if (!response.Success)
{ // {
//记录日志 // //记录日志
errorMsg = response.Msg; // errorMsg = response.Msg;
Console.WriteLine(errorMsg); // Console.WriteLine(errorMsg);
return null; // return null;
} // }
var jobject = response.Data; // var jobject = response.Data;
var skuJArray = (JArray)jobject["item"]["skus"]["sku"]; // var skuJArray = (JArray)jobject["item"]["skus"]["sku"];
if (skuJArray.Count == 0) // if (skuJArray.Count == 0)
{ // {
errorMsg = $"商品{purchaseSchemeProduct.PurchaseProductId}缺少sku信息"; // errorMsg = $"商品{purchaseSchemeProduct.PurchaseProductId}缺少sku信息";
return null; // return null;
} // }
return skuJArray.Select(j => new PurchaseSchemeProductSku() // return skuJArray.Select(j => new PurchaseSchemeProductSku()
{ // {
ProductId = purchaseSchemeProduct.ProductId, // ProductId = purchaseSchemeProduct.ProductId,
SkuId = purchaseSchemeProduct.SkuId, // SkuId = purchaseSchemeProduct.SkuId,
PurchaseProductId = purchaseSchemeProduct.PurchaseProductId, // PurchaseProductId = purchaseSchemeProduct.PurchaseProductId,
Price = j.Value<decimal>("price"), // Price = j.Value<decimal>("price"),
PurchaseSkuId = j.Value<string>("sku_id"), // PurchaseSkuId = j.Value<string>("sku_id"),
PurchaseSkuSpecId = j.Value<string>("spec_id"), // PurchaseSkuSpecId = j.Value<string>("spec_id"),
Title = j.Value<string>("properties_name"), // Title = j.Value<string>("properties_name"),
Logo = GetSkuLogo(j, (JArray)jobject["item"]["prop_imgs"]["prop_img"]) // Logo = GetSkuLogo(j, (JArray)jobject["item"]["prop_imgs"]["prop_img"])
}).ToList(); // }).ToList();
} //}
private string GetSkuLogo(JToken skuJToken, JArray prop_img) private string GetSkuLogo(JToken skuJToken, JArray prop_img)
{ {

86
BBWY.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs

@ -115,7 +115,7 @@ namespace BBWY.Client.ViewModels
foreach (var purchaseSchemeProduct in sku.SelectedPurchaseScheme.PurchaseSchemeProductList) foreach (var purchaseSchemeProduct in sku.SelectedPurchaseScheme.PurchaseSchemeProductList)
{ {
purchaseSchemeProduct.IsEditing = false; purchaseSchemeProduct.IsEditing = false;
LoadPurchaseProduct(sku.SelectedPurchaseScheme.PurchasePlatform, purchaseSchemeProduct); LoadPurchaseProduct(sku.SelectedPurchaseScheme.PurchasePlatform, purchaseSchemeProduct, purchaseSchemeProduct.PurchaseProductId, null, out _);
} }
ewh.Set(); ewh.Set();
ewh.Dispose(); ewh.Dispose();
@ -127,38 +127,44 @@ namespace BBWY.Client.ViewModels
} }
} }
public void LoadPurchaseProduct(Platform platform, PurchaseSchemeProduct purchaseSchemeProduct, IList<PurchaseSchemeProductSku> skuList = null) public void LoadPurchaseProduct(Platform platform, PurchaseSchemeProduct purchaseSchemeProduct, string purchaseProductId, Func<string, string> checkPurchaserFunc, out string errorMsg)
{ {
errorMsg = string.Empty;
App.Current.Dispatcher.Invoke(() => App.Current.Dispatcher.Invoke(() =>
{ {
purchaseSchemeProduct.SkuList.Clear(); purchaseSchemeProduct.SkuList.Clear();
purchaseSchemeProduct.PurchaseSchemeProductSkuList.Clear(); purchaseSchemeProduct.PurchaseSchemeProductSkuList.Clear();
}); });
if (skuList == null)
{
//skuList = LoadPurchaseProductCore(purchaseSchemeProduct.PurchaseProductId, out _, out _, out _, out _, null); //skuList = LoadPurchaseProductCore(purchaseSchemeProduct.PurchaseProductId, out _, out _, out _, out _, null);
var data = purchaseProductAPIService.GetProductInfo(platform, var data = purchaseProductAPIService.GetProductInfo(platform,
purchaseSchemeProduct.ProductId, purchaseSchemeProduct.ProductId,
purchaseSchemeProduct.SkuId, purchaseSchemeProduct.SkuId,
purchaseSchemeProduct.PurchaseProductId, purchaseProductId,
PurchaseOrderMode., PurchaseOrderMode.,
PurchaseProductAPIMode.Spider); PurchaseProductAPIMode.Spider);
if (data != null) if (data != null)
{ {
PurchaserId = data.Value.purchaser.Id; if (checkPurchaserFunc != null)
PurchaserName = data.Value.purchaser.Name; {
PurchaserLocation = data.Value.purchaser.Location; errorMsg = checkPurchaserFunc(data.Value.purchaser.Id);
if (!string.IsNullOrEmpty(errorMsg))
return;
} }
if (data.Value.purchaseSchemeProductSkus.Count == 0)
{
errorMsg = $"商品{purchaseSchemeProduct.PurchaseProductId}缺少sku信息";
return;
} }
if (skuList == null) PurchaserId = data.Value.purchaser.Id;
return; PurchaserName = data.Value.purchaser.Name;
PurchaserLocation = data.Value.purchaser.Location;
App.Current.Dispatcher.BeginInvoke((Action)delegate App.Current.Dispatcher.BeginInvoke((Action)delegate
{ {
foreach (var sku in skuList) foreach (var sku in data.Value.purchaseSchemeProductSkus)
{ {
purchaseSchemeProduct.SkuList.Add(sku); purchaseSchemeProduct.SkuList.Add(sku);
if (purchaseSchemeProduct.SelectedSkuIdList.Any(s => s == sku.PurchaseSkuId)) if (purchaseSchemeProduct.SelectedSkuIdList.Any(s => s == sku.PurchaseSkuId))
@ -169,6 +175,7 @@ namespace BBWY.Client.ViewModels
} }
}); });
} }
}
//private IList<PurchaseSchemeProductSku> LoadPurchaseProductCore(string purchseProductId, //private IList<PurchaseSchemeProductSku> LoadPurchaseProductCore(string purchseProductId,
// out string errorMsg, // out string errorMsg,
@ -255,7 +262,8 @@ namespace BBWY.Client.ViewModels
productSku.SelectedPurchaseScheme = new PurchaseScheme() productSku.SelectedPurchaseScheme = new PurchaseScheme()
{ {
ProductId = productSku.ProductId, ProductId = productSku.ProductId,
SkuId = productSku.Id SkuId = productSku.Id,
PurchasePlatform = Platform.
}; };
} }
else if (productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Count >= 4) else if (productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Count >= 4)
@ -313,12 +321,7 @@ namespace BBWY.Client.ViewModels
Task.Factory.StartNew(() => Task.Factory.StartNew(() =>
{ {
var purchaseSchemeProductSkuList = LoadPurchaseProductCore(purchaseProductId, LoadPurchaseProduct(sku.SelectedPurchaseScheme.PurchasePlatform, purchaseSchemeProduct, purchaseProductId, (p) =>
out string errorMsg,
out string purchaserId,
out string purchaserName,
out string purchaserLocation,
(p) =>
{ {
if (sku.PurchaseSchemeList.Any(s => s.PurchaserId == p)) if (sku.PurchaseSchemeList.Any(s => s.PurchaserId == p))
return $"sku{sku.Id}的采购方案中已存在相同的采购商"; return $"sku{sku.Id}的采购方案中已存在相同的采购商";
@ -327,24 +330,51 @@ namespace BBWY.Client.ViewModels
return "采购商必须相同"; return "采购商必须相同";
return string.Empty; return string.Empty;
}); }, out string errorMsg);
IsLoading = false; IsLoading = false;
if (!string.IsNullOrEmpty(errorMsg)) if (!string.IsNullOrEmpty(errorMsg))
{ {
App.Current.Dispatcher.Invoke(() => App.Current.Dispatcher.Invoke(() => MessageBox.Show(errorMsg, "绑定采购商"));
{
MessageBox.Show(errorMsg, "绑定采购商");
});
return; return;
} }
PurchaserId = purchaserId;
PurchaserName = purchaserName;
PurchaserLocation = purchaserLocation;
purchaseSchemeProduct.PurchaseUrl = purchaseUrl; purchaseSchemeProduct.PurchaseUrl = purchaseUrl;
purchaseSchemeProduct.PurchaseProductId = purchaseProductId; purchaseSchemeProduct.PurchaseProductId = purchaseProductId;
LoadPurchaseProduct(purchaseSchemeProduct, purchaseSchemeProductSkuList);
//var purchaseSchemeProductSkuList = LoadPurchaseProductCore(purchaseProductId,
// out string errorMsg,
// out string purchaserId,
// out string purchaserName,
// out string purchaserLocation,
// (p) =>
// {
// if (sku.PurchaseSchemeList.Any(s => s.PurchaserId == p))
// return $"sku{sku.Id}的采购方案中已存在相同的采购商";
// if (!string.IsNullOrEmpty(PurchaserId) && p != PurchaserId)
// return "采购商必须相同";
// return string.Empty;
// });
//IsLoading = false;
//if (!string.IsNullOrEmpty(errorMsg))
//{
// App.Current.Dispatcher.Invoke(() =>
// {
// MessageBox.Show(errorMsg, "绑定采购商");
// });
// return;
//}
//PurchaserId = purchaserId;
//PurchaserName = purchaserName;
//PurchaserLocation = purchaserLocation;
//purchaseSchemeProduct.PurchaseUrl = purchaseUrl;
//purchaseSchemeProduct.PurchaseProductId = purchaseProductId;
//LoadPurchaseProduct(purchaseSchemeProduct, purchaseSchemeProductSkuList);
}); });
} }

2
BBWY.Common/Http/RestAPIService.cs

@ -67,7 +67,7 @@ namespace BBWY.Common.Http
if (enableRandomTimeStamp) if (enableRandomTimeStamp)
url = $"{url}{(isCombineParam ? "&" : "?")}t={DateTime.Now.DateTimeToStamp()}"; url = $"{url}{(isCombineParam ? "&" : "?")}t={DateTime.Now.DateTimeToStamp()}";
using (var httpClient = httpClientFactory.CreateClient()) using (var httpClient = string.IsNullOrEmpty(httpClientName) ? httpClientFactory.CreateClient() : httpClientFactory.CreateClient(httpClientName))
{ {
using (var request = new HttpRequestMessage(httpMethod, url)) using (var request = new HttpRequestMessage(httpMethod, url))
{ {

Loading…
Cancel
Save