using BBWY._1688SDK.entity.OrderPreview; using BBWY.Common.Http; using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Dto; using com.alibaba.openapi.client; using com.alibaba.openapi.client.policy; using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json.Linq; using NLog; using System.Collections.Generic; using System.Linq; namespace BBWY.Server.Business { public class _1688Business : PlatformSDKBusiness { public override Enums.Platform Platform => Enums.Platform.阿里巴巴; private RestApiService restApiService; private _1688TradeTypeCompare _1688TradeTypeCompare; public _1688Business(IMemoryCache memoryCache, ILogger logger, RestApiService restApiService) : base(memoryCache, logger) { this.restApiService = restApiService; _1688TradeTypeCompare = new _1688TradeTypeCompare(); } private SyncAPIClient GetSyncAPIClient(string appKey, string appSecret) { if (!memoryCache.TryGetValue(appKey, out SyncAPIClient syncAPIClient)) { syncAPIClient = new SyncAPIClient(appKey, appSecret, restApiService); memoryCache.Set(appKey, syncAPIClient, expirationTimeSpan); } return syncAPIClient; } public override PreviewOrderResponse PreviewOrder(PreviewOrderReuqest previewOrderReuqest) { var client = GetSyncAPIClient(previewOrderReuqest.AppKey, previewOrderReuqest.AppSecret); RequestPolicy reqPolicy = new RequestPolicy(); reqPolicy.HttpMethod = "POST"; reqPolicy.NeedAuthorization = false; reqPolicy.RequestSendTimestamp = false; reqPolicy.UseHttps = false; reqPolicy.UseSignture = true; reqPolicy.AccessPrivateApi = false; Request request = new Request(); APIId apiId = new APIId(); apiId.Name = "alibaba.createOrder.preview"; apiId.NamespaceValue = "com.alibaba.trade"; apiId.Version = 1; request.ApiId = apiId; var param = new CreateOrderPreview() { addressParam = new AddressParam() { fullName = previewOrderReuqest.Consignee.ContactName, mobile = previewOrderReuqest.Consignee.Mobile, phone = previewOrderReuqest.Consignee.TelePhone, postCode = "000000", address = previewOrderReuqest.Consignee.Address, provinceText = previewOrderReuqest.Consignee.Province, cityText = previewOrderReuqest.Consignee.City, areaText = previewOrderReuqest.Consignee.County, townText = previewOrderReuqest.Consignee.Town }, cargoParamList = new List(), flow = "general" }; foreach (var cargo in previewOrderReuqest.CargoParamList) { param.cargoParamList.Add(new CargoParam() { offerId = long.Parse(cargo.ProductId), specId = cargo.SpecId, quantity = cargo.Quantity }); } request.RequestEntity = param; if (!string.IsNullOrEmpty(previewOrderReuqest.AppToken)) request.AccessToken = previewOrderReuqest.AppToken; var result = client.NewRequest(request, reqPolicy); if (result.Value("success") != true) throw new BusinessException(result.Value("errorMsg")) { Code = 0 }; var orderPreviewResuslt = (JArray)result["orderPreviewResuslt"]; List intersectTradeModeList = new List(); foreach (var orderPreviewJToken in orderPreviewResuslt) { if (orderPreviewJToken["tradeModelList"] == null) throw new BusinessException("当前交易不可通过API下单,请使用1688网页交易 [交易模式列表为空]"); var tradeModeJArray = ((JArray)orderPreviewJToken["tradeModelList"]).Where(tradeJToken => tradeJToken.Value("opSupport")); if (tradeModeJArray.Count() == 0) throw new BusinessException("当前交易不可通过API下单,请使用1688网页交易 [没有支持开放平台下单的交易模式]"); if (intersectTradeModeList.Count() == 0) intersectTradeModeList.AddRange(tradeModeJArray); else intersectTradeModeList = intersectTradeModeList.Intersect(tradeModeJArray, _1688TradeTypeCompare).ToList(); } if (intersectTradeModeList.Count() == 0) throw new BusinessException("当前交易不可通过API下单,请使用1688网页交易 [多个拆单之间没有相同的交易模式]"); return new PreviewOrderResponse() { FreightAmount = orderPreviewResuslt.Sum(jt => jt.Value("sumCarriage")) / 100M, ProductAmount = orderPreviewResuslt.Sum(jt => jt.Value("sumPaymentNoCarriage")) / 100M, TotalAmount = orderPreviewResuslt.Sum(jt => jt.Value("sumPayment")) / 100M, OrderTradeType = new OrderTradeTypeResponse() { Code = intersectTradeModeList.First().Value("tradeType"), Name = intersectTradeModeList.First().Value("name"), } }; } } public class _1688TradeTypeCompare : IEqualityComparer { public bool Equals(JToken x, JToken y) { return x.Value("tradeType").Equals(y.Value("tradeType")); } public int GetHashCode(JToken obj) { return obj.GetHashCode(); } } }