diff --git a/BBWY.Server.API/Controllers/BatchPurchaseController.cs b/BBWY.Server.API/Controllers/BatchPurchaseController.cs index 203851a6..041827f6 100644 --- a/BBWY.Server.API/Controllers/BatchPurchaseController.cs +++ b/BBWY.Server.API/Controllers/BatchPurchaseController.cs @@ -36,5 +36,16 @@ namespace BBWY.Server.API.Controllers { return batchPurchaseBusiness.PreviewOrder(request); } + + /// + /// 批量创建采购单 + /// + /// + /// + [HttpPost] + public BatchCreareOrderResponse BatchCreateOrder([FromBody] BatchPurchaseCreateOrderRequest request) + { + return batchPurchaseBusiness.BatchCreateOrder(request); + } } } diff --git a/BBWY.Server.Business/PlatformSDK/QuanTanBusiness.cs b/BBWY.Server.Business/PlatformSDK/QuanTanBusiness.cs index 1f89c33c..fe3ae388 100644 --- a/BBWY.Server.Business/PlatformSDK/QuanTanBusiness.cs +++ b/BBWY.Server.Business/PlatformSDK/QuanTanBusiness.cs @@ -3,6 +3,7 @@ using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Dto; using Microsoft.Extensions.Caching.Memory; +using Newtonsoft.Json; using QuanTan.SDK.Client; using QuanTan.SDK.Model; using System; @@ -74,20 +75,27 @@ namespace BBWY.Server.Business address = createOnlinePurchaseOrderRequest.Consignee.Address, phone = createOnlinePurchaseOrderRequest.Consignee.Mobile, realName = createOnlinePurchaseOrderRequest.Consignee.ContactName - } + }, + extended = JsonConvert.SerializeObject(new + { + BuyerAccount = createOnlinePurchaseOrderRequest.AppToken, + createOnlinePurchaseOrderRequest.SourceSku, + createOnlinePurchaseOrderRequest.SourceShopName + }) }; var qtResponse = quanTanOrderClient.CreateOrder(quantanCreateOrderRequest, createOnlinePurchaseOrderRequest.AppKey, createOnlinePurchaseOrderRequest.AppSecret); if (qtResponse.Status != 200) throw new BusinessException(qtResponse.Message); var payStatus = !string.IsNullOrEmpty(qtResponse.Data.PayStatus) ? qtResponse.Data.PayStatus.ToLower() : string.Empty; - if (payStatus != "success") - throw new BusinessException($"拳探账户余额不足,支付失败,请前往拳探进行手动支付"); + //if (payStatus != "success") + // throw new BusinessException($"拳探账户余额不足,支付失败,请前往拳探进行手动支付"); + - //对接支付接口 return new CreateOnlinePurchaseOrderResponse() { - PurchaseOrderId = qtResponse.Data.OrderId + PurchaseOrderId = qtResponse.Data.OrderId, + IsPay = payStatus == "success" }; } diff --git a/BBWY.Server.Business/PurchaseOrderV2/BatchPurchase/BatchPurchaseBusiness.cs b/BBWY.Server.Business/PurchaseOrderV2/BatchPurchase/BatchPurchaseBusiness.cs index a7f9edb0..ba729f2c 100644 --- a/BBWY.Server.Business/PurchaseOrderV2/BatchPurchase/BatchPurchaseBusiness.cs +++ b/BBWY.Server.Business/PurchaseOrderV2/BatchPurchase/BatchPurchaseBusiness.cs @@ -1,4 +1,5 @@ using BBWY.Common.Models; +using BBWY.Server.Model; using BBWY.Server.Model.Db; using BBWY.Server.Model.Dto; using Newtonsoft.Json; @@ -104,6 +105,12 @@ namespace BBWY.Server.Business return list; } + /// + /// 预览订单 + /// + /// + /// + /// public PreviewOrderResponse PreviewOrder(BatchPurchasePreviewOrderRequest request) { /* @@ -120,7 +127,7 @@ namespace BBWY.Server.Business if (request.PurchaseAccountList == null || request.PurchaseAccountList.Count() == 0) throw new BusinessException("缺少采购账号"); - var purchaserGroups = request.ProductParamList.GroupBy(p => p.PurchaserId); + var skuGroups = request.ProductParamList.GroupBy(p => p.BelongSkuId); var carIds = new List(); var errorBuilder = new StringBuilder(); var freightAmount = 0M; @@ -128,9 +135,9 @@ namespace BBWY.Server.Business var totalAmount = 0M; - foreach (var purchaserGroup in purchaserGroups) + foreach (var skuGroup in skuGroups) { - var productParamList = purchaserGroup.ToList(); + var productParamList = skuGroup.ToList(); try { var purchasePlatform = productParamList.FirstOrDefault().PurchasePlatform; @@ -154,10 +161,10 @@ namespace BBWY.Server.Business }).ToList() }); - if (purchasePlatform == Model.Enums.Platform.拳探) - carIds.Add(new { PurchaserId = purchaserGroup.Key, CardId = previewOrderResponse.Extensions }); - else if (purchasePlatform == Model.Enums.Platform.阿里巴巴) - carIds.Add(new { PurchaserId = purchaserGroup.Key, OrderTradeTypeCode = previewOrderResponse.OrderTradeType?.Code }); + if (purchasePlatform == Enums.Platform.拳探) + carIds.Add(new { BelongSkuId = skuGroup.Key, CardId = previewOrderResponse.Extensions }); + else if (purchasePlatform == Enums.Platform.阿里巴巴) + carIds.Add(new { BelongSkuId = skuGroup.Key, OrderTradeTypeCode = previewOrderResponse.OrderTradeType?.Code }); freightAmount += previewOrderResponse.FreightAmount; productAmount += previewOrderResponse.ProductAmount; @@ -166,7 +173,7 @@ namespace BBWY.Server.Business catch (Exception ex) { errorBuilder.AppendLine($"采购商:{productParamList.FirstOrDefault().PurchaserName}"); - errorBuilder.AppendLine($"店铺SkuId:{string.Join(",", productParamList.Select(p => p.BelongSkuId))}"); + errorBuilder.AppendLine($"店铺SkuId:{skuGroup.Key}"); errorBuilder.AppendLine(ex.Message); throw new BusinessException(errorBuilder.ToString()); } @@ -181,9 +188,160 @@ namespace BBWY.Server.Business }; } - public void BatchCreateOrder() - { - + /// + /// 创建订单 + /// + /// + public BatchCreareOrderResponse BatchCreateOrder(BatchPurchaseCreateOrderRequest request) + { + /* + 下单报价日志 + */ + + if (request.ProductParamList == null || request.ProductParamList.Count() == 0) + throw new BusinessException("缺少商品参数"); + 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("缺少采购账号"); + + var successSkuIdList = new List(); + var failSkuList = new List(); + + var extJArray = JsonConvert.DeserializeObject(request.Extensions); + var skuGroups = request.ProductParamList.GroupBy(p => p.BelongSkuId); + + foreach (var skuGroup in skuGroups) + { + var productParamList = skuGroup.ToList(); + try + { + var firstProductParam = productParamList.FirstOrDefault(); + + + var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == firstProductParam.PurchasePlatform); + var platformSDKBusiness = platformSDKBusinessList.FirstOrDefault(p => p.Platform == v.PurchasePlatform); + string tradeMode = "", cardId = ""; + + var extJson = extJArray.FirstOrDefault(j => j.Value("BelongSkuId") == skuGroup.Key); + if (firstProductParam.PurchasePlatform == Enums.Platform.拳探) + cardId = extJson.Value("CardId"); + else if (firstProductParam.PurchasePlatform == Enums.Platform.阿里巴巴) + tradeMode = extJson.Value("OrderTradeTypeCode"); + + var createOrderResponse = platformSDKBusinessList.FirstOrDefault(p => p.Platform == firstProductParam.PurchasePlatform) + .FastCreateOrder(new CreateOnlinePurchaseOrderRequest() + { + AppKey = purchaseAccount.AppKey, + AppSecret = purchaseAccount.AppSecret, + AppToken = purchaseAccount.AppToken, + Platform = firstProductParam.PurchasePlatform, + Consignee = request.Consignee, + PurchaseOrderMode = request.PurchaseOrderMode, + Remark = request.Remark, + SourceShopName = request.ShopName, + SourceSku = skuGroup.Key, + CargoParamList = productParamList.Select(p => new CargoParamRequest() + { + ProductId = p.PurchaseProductId, + SkuId = p.PurchaseSkuId, + Quantity = p.Quantity, + SpecId = p.PurchaseSpecId + }).ToList(), + TradeMode = tradeMode, + Extensions = cardId + }); + + + + + var purchaseOrderSimpleInfo = platformSDKBusinessList.FirstOrDefault(p => p.Platform == firstProductParam.PurchasePlatform).GetOrderSimpleInfo(new GetOrderInfoRequest() + { + AppKey = purchaseAccount.AppKey, + AppSecret = purchaseAccount.AppSecret, + AppToken = purchaseAccount.AppToken, + OrderId = createOrderResponse.PurchaseOrderId, + Platform = firstProductParam.PurchasePlatform + }); + + var purchaseOrderV2 = new PurchaseOrderV2() + { + Id = createOrderResponse.PurchaseOrderId, + ShopId = request.ShopId, + OrderState = createOrderResponse.IsPay ? Enums.PurchaseOrderState.待发货 : Enums.PurchaseOrderState.待付款, + PurchasePlatform = firstProductParam.PurchasePlatform, + ConsigneeContactName = request.Consignee.ContactName, + ConsigneeMobile = request.Consignee.Mobile, + ConsigneeProvince = request.Consignee.Province, + ConsigneeCity = request.Consignee.City, + ConsigneeCounty = request.Consignee.County, + ConsigneeTown = request.Consignee.Town, + ConsigneeAddress = request.Consignee.Address, + PurchaserId = firstProductParam.PurchaserId, + PurchaserName = firstProductParam.PurchaserName, + PurchaseAccountId = purchaseAccount.Id, + PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount, + ProductAmount = purchaseOrderSimpleInfo.ProductAmount, + PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount, + Remark = request.Remark, + CreateTime = DateTime.Now, + PurchaseMethod = Enums.PurchaseMethod.线上采购, + PurchaseOrderMode = request.PurchaseOrderMode + }; + if (createOrderResponse.IsPay) + purchaseOrderV2.PayTime = DateTime.Now; + + var purchaseOrderSku = new PurchaseOrderSku() + { + Id = idGenerator.NewLong(), + ShopId = request.ShopId, + PurchaseOrderId = createOrderResponse.PurchaseOrderId, + ProductId = firstProductParam.BelongProductId, + SkuId = firstProductParam.BelongSkuId, + Price = firstProductParam.BelongPrice, + SkuTitle = firstProductParam.BelongSkuTitle, + Logo = firstProductParam.BelongLogo, + Quantity = firstProductParam.BelongQuantity, + PurchaseSchemeId = firstProductParam.BelongPurchaseSchemeId, + PurchaseSkuIds = string.Join(",", productParamList.Select(p => p.PurchaseSkuId).ToList()), + PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount, + ProductAmount = purchaseOrderSimpleInfo.ProductAmount, + PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount, + CreateTime = DateTime.Now + }; + + fsql.Transaction(() => + { + fsql.Insert(purchaseOrderV2).ExecuteAffrows(); + fsql.Insert(purchaseOrderSku).ExecuteAffrows(); + }); + successSkuIdList.Add(skuGroup.Key); + } + catch (Exception ex) + { + //var errorBuilder = new StringBuilder(); + //errorBuilder.AppendLine($"采购商:{productParamList.FirstOrDefault().PurchaserName}"); + //errorBuilder.AppendLine($"店铺SkuId:{skuGroup.Key}"); + //errorBuilder.AppendLine(ex.Message); + + failSkuList.Add(new BatchCreareOrderFailDetail() + { + SkuId = skuGroup.Key, + ErrorMsg = ex.Message + }); + + //throw new BusinessException(errorBuilder.ToString()); + } + } + + return new BatchCreareOrderResponse() + { + FailSkuList = failSkuList, + SuccessSkuIdList = successSkuIdList + }; } } } diff --git a/BBWY.Server.Model/Db/PurchaseOrder/PurchaseOrderV2.cs b/BBWY.Server.Model/Db/PurchaseOrder/PurchaseOrderV2.cs index 7b77a78d..72a7c60a 100644 --- a/BBWY.Server.Model/Db/PurchaseOrder/PurchaseOrderV2.cs +++ b/BBWY.Server.Model/Db/PurchaseOrder/PurchaseOrderV2.cs @@ -147,8 +147,8 @@ namespace BBWY.Server.Model.Db /// /// 采购平台 /// - - public int? PurchasePlatform { get; set; } + [Column(MapType = typeof(int?))] + public Enums.Platform? PurchasePlatform { get; set; } /// /// 商家Id @@ -178,7 +178,7 @@ namespace BBWY.Server.Model.Db /// 店铺Id /// - public string ShopId { get; set; } + public long ShopId { get; set; } /// /// 签收时间 diff --git a/BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderRequest.cs b/BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderRequest.cs index 801e6c7c..2d979e28 100644 --- a/BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderRequest.cs +++ b/BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderRequest.cs @@ -46,5 +46,10 @@ /// 扩展数据 /// public string Extensions { get; set; } + + + public string SourceSku { get; set; } + + public string SourceShopName { get; set; } } } diff --git a/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchaseCreateOrderRequest.cs b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchaseCreateOrderRequest.cs index 2c6fd85b..17128f94 100644 --- a/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchaseCreateOrderRequest.cs +++ b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchaseCreateOrderRequest.cs @@ -6,5 +6,14 @@ /// 扩展字段 ,格式参考报价接口返回值 /// public string Extensions { get; set; } + + /// + /// 下单备注 + /// + public string Remark { get; set; } + + public long ShopId { get; set; } + + public string ShopName { get; set; } } } diff --git a/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchasePreviewOrderRequest.cs b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchasePreviewOrderRequest.cs index 5476a007..f1b1191e 100644 --- a/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchasePreviewOrderRequest.cs +++ b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchasePreviewOrderRequest.cs @@ -23,6 +23,21 @@ namespace BBWY.Server.Model.Dto public string PurchaserId { get; set; } public string PurchaserName { get; set; } public Enums.Platform PurchasePlatform { get; set; } + + + public string BelongSkuId { get; set; } + + public string BelongProductId { get; set; } + + public decimal BelongPrice { get; set; } + + public string BelongSkuTitle { get; set; } + + public string BelongLogo { get; set; } + + public int BelongQuantity { get; set; } + + public long BelongPurchaseSchemeId { get; set; } } } diff --git a/BBWY.Server.Model/Dto/Response/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderResponse.cs b/BBWY.Server.Model/Dto/Response/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderResponse.cs index 3517a7a7..4e60cdd1 100644 --- a/BBWY.Server.Model/Dto/Response/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderResponse.cs +++ b/BBWY.Server.Model/Dto/Response/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderResponse.cs @@ -26,5 +26,10 @@ namespace BBWY.Server.Model.Dto /// 下单失败的商品信息 /// public IList FailProductMessageList { get; set; } + + /// + /// 是否已支付 + /// + public bool IsPay { get; set; } } } diff --git a/BBWY.Server.Model/Dto/Response/PurchaseOrderV2/BatchPurchase/BatchCreareOrderResponse.cs b/BBWY.Server.Model/Dto/Response/PurchaseOrderV2/BatchPurchase/BatchCreareOrderResponse.cs new file mode 100644 index 00000000..0059ee8d --- /dev/null +++ b/BBWY.Server.Model/Dto/Response/PurchaseOrderV2/BatchPurchase/BatchCreareOrderResponse.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; + +namespace BBWY.Server.Model.Dto +{ + public class BatchCreareOrderResponse + { + /// + /// 已经成功下单的SkuId集合 + /// + public IList SuccessSkuIdList { get; set; } + + public IList FailSkuList { get; set; } + } + + public class BatchCreareOrderFailDetail + { + public string SkuId { get; set; } + + public string ErrorMsg { get; set; } + } +} diff --git a/QuanTan.SDK/Model/Request/Order/QuanTanCreateOrderRequest.cs b/QuanTan.SDK/Model/Request/Order/QuanTanCreateOrderRequest.cs index 19295caf..9c04a2ab 100644 --- a/QuanTan.SDK/Model/Request/Order/QuanTanCreateOrderRequest.cs +++ b/QuanTan.SDK/Model/Request/Order/QuanTanCreateOrderRequest.cs @@ -9,6 +9,8 @@ public string cartIds { get; set; } public QuanTanCreateOrderReceipt receipt { get; set; } + + public string extended { get; set; } } public class QuanTanCreateOrderReceipt : QuanTanPreviewOrderReceipt