From 7d3027b14dbf30ba5cfde1a4176e5fb139bf7a1a Mon Sep 17 00:00:00 2001 From: shanji <18996038927@163.com> Date: Wed, 14 Jun 2023 13:28:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E9=87=87=E8=B4=ADv2=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/BatchPurchaseController.cs | 22 ++ .../BatchPurchase/BatchPurchaseBusiness.cs | 351 +++++++++++++++++- .../BatchPurchasePreviewOrderRequest.cs | 1 - .../BatchPurchaseCargoParamRequestV2.cs | 90 +++++ .../BatchPurchaseCreateOrderRequestV2.cs | 25 ++ .../BatchPurchasePreviewOrderRequestV2.cs | 22 ++ 6 files changed, 507 insertions(+), 4 deletions(-) create mode 100644 BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCargoParamRequestV2.cs create mode 100644 BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCreateOrderRequestV2.cs create mode 100644 BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchasePreviewOrderRequestV2.cs diff --git a/BBWY.Server.API/Controllers/BatchPurchaseController.cs b/BBWY.Server.API/Controllers/BatchPurchaseController.cs index 276dbfe2..81eb963d 100644 --- a/BBWY.Server.API/Controllers/BatchPurchaseController.cs +++ b/BBWY.Server.API/Controllers/BatchPurchaseController.cs @@ -48,6 +48,28 @@ namespace BBWY.Server.API.Controllers return batchPurchaseBusiness.BatchCreateOrder(request); } + /// + /// 预览订单价格V2 + /// + /// + /// + [HttpPost] + public PreviewOrderResponse PreviewOrderV2([FromBody] BatchPurchasePreviewOrderRequestV2 request) + { + return batchPurchaseBusiness.PreviewOrderV2(request); + } + + /// + /// 批量创建采购单V2 + /// + /// + /// + [HttpPost] + public BatchCreareOrderResponse BatchCreateOrderV2(BatchPurchaseCreateOrderRequestV2 request) + { + return batchPurchaseBusiness.BatchCreateOrderV2(request); + } + /// /// 获取采购单列表 /// diff --git a/BBWY.Server.Business/PurchaseOrderV2/BatchPurchase/BatchPurchaseBusiness.cs b/BBWY.Server.Business/PurchaseOrderV2/BatchPurchase/BatchPurchaseBusiness.cs index 9f5b44e1..3ab3a661 100644 --- a/BBWY.Server.Business/PurchaseOrderV2/BatchPurchase/BatchPurchaseBusiness.cs +++ b/BBWY.Server.Business/PurchaseOrderV2/BatchPurchase/BatchPurchaseBusiness.cs @@ -2,7 +2,7 @@ using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Db; -using BBWY.Server.Model.Db.QK; +using BBWY.Server.Model.Db.Mds; using BBWY.Server.Model.Dto; using FreeSql; using Newtonsoft.Json; @@ -11,7 +11,6 @@ using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; -using System.Net.Mail; using System.Text; using System.Threading.Tasks; using Yitter.IdGenerator; @@ -24,17 +23,20 @@ namespace BBWY.Server.Business private IEnumerable platformSDKBusinessList; //private TaskSchedulerManager taskSchedulerManager; private RestApiService restApiService; + private FreeSqlMultiDBManager freeSqlMultiDBManager; public BatchPurchaseBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, ProductBusiness productBusiness, IEnumerable platformSDKBusinessList, - RestApiService restApiService) : base(fsql, nLogManager, idGenerator) + RestApiService restApiService, + FreeSqlMultiDBManager freeSqlMultiDBManager) : base(fsql, nLogManager, idGenerator) { this.productBusiness = productBusiness; this.platformSDKBusinessList = platformSDKBusinessList; this.restApiService = restApiService; + this.freeSqlMultiDBManager = freeSqlMultiDBManager; } /// @@ -200,6 +202,85 @@ namespace BBWY.Server.Business }; } + /// + /// 预览订单V2 + /// + /// + /// + /// + public PreviewOrderResponse PreviewOrderV2(BatchPurchasePreviewOrderRequestV2 request) + { + + if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0 || + request.CargoParamGroupList.Any(g => g.CargoParamList == null || g.CargoParamList.Count() == 0 || string.IsNullOrEmpty(g.PurchaserId))) + 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 extJArray = new List(); + var errorBuilder = new StringBuilder(); + var freightAmount = 0M; + var productAmount = 0M; + var totalAmount = 0M; + + foreach (var purchaseGroup in request.CargoParamGroupList) + { + try + { + var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == purchaseGroup.PurchasePlatform); + + if (purchaseAccount == null) + throw new BusinessException($"缺少{purchaseGroup.PurchasePlatform}采购平台账号,请在店铺配置中设置"); + + var platformSDKBusiness = platformSDKBusinessList.FirstOrDefault(p => p.Platform == purchaseGroup.PurchasePlatform); + var previewOrderResponse = platformSDKBusiness.PreviewOrder(new PreviewOrderReuqest() + { + AppKey = purchaseAccount.AppKey, + AppSecret = purchaseAccount.AppSecret, + AppToken = purchaseAccount.AppToken, + Consignee = request.Consignee, + Platform = purchaseGroup.PurchasePlatform, + PurchaseOrderMode = request.PurchaseOrderMode, + CargoParamList = purchaseGroup.CargoParamList.Select(p => new CargoParamRequest() + { + ProductId = p.ProductId, + SkuId = p.SkuId, + Quantity = p.Quantity, + SpecId = p.SpecId + }).ToList() + }); + + if (purchaseGroup.PurchasePlatform == Enums.Platform.拳探) + extJArray.Add(new { purchaseGroup.PurchaserId, CardId = previewOrderResponse.Extensions }); + else if (purchaseGroup.PurchasePlatform == Enums.Platform.阿里巴巴) + extJArray.Add(new { purchaseGroup.PurchaserId, OrderTradeTypeCode = previewOrderResponse.OrderTradeType?.Code }); + + freightAmount += previewOrderResponse.FreightAmount; + productAmount += previewOrderResponse.ProductAmount; + totalAmount += previewOrderResponse.TotalAmount; + } + catch (Exception ex) + { + errorBuilder.AppendLine($"采购商:{purchaseGroup.PurchaserName}"); + errorBuilder.AppendLine(ex.Message); + throw new BusinessException(errorBuilder.ToString()); + } + } + + return new PreviewOrderResponse() + { + Extensions = JsonConvert.SerializeObject(extJArray), + FreightAmount = freightAmount, + ProductAmount = productAmount, + TotalAmount = totalAmount + }; + } + /// /// 创建订单 /// @@ -455,6 +536,270 @@ namespace BBWY.Server.Business }; } + /// + /// 创建订单 + /// + /// + public BatchCreareOrderResponse BatchCreateOrderV2(BatchPurchaseCreateOrderRequestV2 request) + { + /* + 下单日志 + */ + var loggerName = $"批量采购-{request.ShopName}"; + nLogManager.GetLogger(loggerName).Info(JsonConvert.SerializeObject(request)); + + if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0 || + request.CargoParamGroupList.Any(g => g.CargoParamList == null || g.CargoParamList.Count() == 0 || string.IsNullOrEmpty(g.PurchaserId))) + 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 shop = freeSqlMultiDBManager.MDSfsql.Select().Where(s => s.ShopId == request.ShopId.ToString()).ToOne(); + if (shop == null) + throw new BusinessException("无效的店铺Id"); + var successSkuIdList = new List(); + var failSkuList = new List(); + var qikuPackSkuConfigRequestList = new List(); + + var extJArray = JsonConvert.DeserializeObject(request.Extensions); + + foreach (var purchaseGroup in request.CargoParamGroupList) + { + var belongSkuGroups = purchaseGroup.CargoParamList.GroupBy(p => p.BelongSkuId); + + var belongSkuBasicInfoList = productBusiness.GetProductSkuList(new SearchProductSkuRequest() + { + AppKey = shop.AppKey, + AppSecret = shop.AppSecret, + AppToken = shop.AppToken, + Platform = (Enums.Platform)shop.PlatformId, + Sku = string.Join(",", belongSkuGroups.Select(x => x.Key)), + }); + + try + { + var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == purchaseGroup.PurchasePlatform); + var platformSDKBusiness = platformSDKBusinessList.FirstOrDefault(p => p.Platform == purchaseGroup.PurchasePlatform); + string tradeMode = "", cardId = ""; + + var extJson = extJArray.FirstOrDefault(j => j.Value("PurchaserId") == purchaseGroup.PurchaserId); + if (purchaseGroup.PurchasePlatform == Enums.Platform.拳探) + cardId = extJson.Value("CardId"); + else if (purchaseGroup.PurchasePlatform == Enums.Platform.阿里巴巴) + tradeMode = extJson.Value("OrderTradeTypeCode"); + + + #region 处理JD SKU和拳探SKU的对应关系 + var belongSkus_mappingList = new List(); + if (purchaseGroup.PurchasePlatform == Enums.Platform.拳探) + { + foreach (var belongSkuGroup in belongSkuGroups) + { + var firstProductParam = belongSkuGroup.FirstOrDefault(); + if (!belongSkus_mappingList.Any(j => j.Value("BelongSkuId") == firstProductParam.BelongSkuId)) + { + belongSkus_mappingList.Add(JObject.FromObject(new { firstProductParam.BelongSkuId, firstProductParam.SkuId })); + } + } + if (belongSkus_mappingList.Count() == 0) + throw new BusinessException("缺少来源SKU信息"); + } + #endregion + + var createOrderResponse = platformSDKBusinessList.FirstOrDefault(p => p.Platform == purchaseGroup.PurchasePlatform) + .FastCreateOrder(new CreateOnlinePurchaseOrderRequest() + { + AppKey = purchaseAccount.AppKey, + AppSecret = purchaseAccount.AppSecret, + AppToken = purchaseAccount.AppToken, + Platform = purchaseGroup.PurchasePlatform, + Consignee = request.Consignee, + PurchaseOrderMode = request.PurchaseOrderMode, + Remark = purchaseGroup.Remark, + SourceShopName = request.ShopName, + SourceSku = belongSkus_mappingList, + CargoParamList = purchaseGroup.CargoParamList.Select(p => new CargoParamRequest() + { + ProductId = p.ProductId, + SkuId = p.SkuId, + Quantity = p.Quantity, + SpecId = p.SpecId + }).ToList(), + TradeMode = tradeMode, + Extensions = cardId, + AutoPay = request.AutoPay, + + }); + + var purchaseOrderSimpleInfo = platformSDKBusinessList.FirstOrDefault(p => p.Platform == purchaseGroup.PurchasePlatform).GetOrderSimpleInfo(new GetOrderInfoRequest() + { + AppKey = purchaseAccount.AppKey, + AppSecret = purchaseAccount.AppSecret, + AppToken = purchaseAccount.AppToken, + OrderId = createOrderResponse.PurchaseOrderId, + Platform = purchaseGroup.PurchasePlatform + }); + + List updatePurchaseTimeSchemeIdList = purchaseGroup.CargoParamList.Select(p => p.BelongSchemeId).Distinct().ToList(); + List insertPurchaseOrderSkuList = new List(); + + List skuPackConfigList = null; + if (purchaseGroup.PurchasePlatform == Enums.Platform.拳探) + skuPackConfigList = new List(); + + foreach (var belongSkuGroup in belongSkuGroups) + { + var firstProductParam = belongSkuGroup.FirstOrDefault(); + var currentOrderSkuProductAmount = 0M; //采购成本 + currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => belongSkuGroup.Any(p1 => p1.SkuId == p.SkuId)) + ?.Sum(p => p.ProductAmount) ?? 0M; + + var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / belongSkuGroups.Count(); //采购运费(按sku数均分) + + var belongSkuBasicInfo = belongSkuBasicInfoList.FirstOrDefault(x=>x.Id == belongSkuGroup.Key); + + var purchaseOrderSku = new PurchaseOrderSku() + { + Id = idGenerator.NewLong(), + ShopId = request.ShopId, + PurchaseOrderId = createOrderResponse.PurchaseOrderId, + ProductId = belongSkuBasicInfo.ProductId, + SkuId = firstProductParam.BelongSkuId, + Price = belongSkuBasicInfo.Price, + SkuTitle = belongSkuBasicInfo.Title, + Logo = belongSkuBasicInfo.Logo, + Quantity = firstProductParam.BelongQuantity, + PurchaseSchemeId = firstProductParam.BelongSchemeId, + PurchaseSkuIds = string.Join(",", belongSkuGroup.Select(p => p.SkuId).ToList()), + PurchaseAmount = currentOrderSkuProductAmount + currentOrderSkuFreightAmount, + ProductAmount = currentOrderSkuProductAmount, + PurchaseFreight = currentOrderSkuFreightAmount, + CreateTime = DateTime.Now + }; + insertPurchaseOrderSkuList.Add(purchaseOrderSku); + + + if (purchaseGroup.PurchasePlatform == Enums.Platform.拳探) + { + var skuPackConfig = request.PackSkuConfigList?.FirstOrDefault(s => s.SkuId == firstProductParam.BelongSkuId); + + if (skuPackConfig != null) + { + + skuPackConfigList.Add(new + { + skuId = firstProductParam.BelongSkuId, + skuCount = skuPackConfig.PurchaseCount, + markMessage = skuPackConfig.RemarkMessage, + wareHourses = skuPackConfig.PackSkuSplitConfigList.Select(x => new + { + wareId = x.IsJST ? "qiyuejushuitan" : x.Store.Id, + wareName = x.IsJST ? "齐越聚水潭" : x.Store.Name, + count = x.PackCount, + wareType = x.IsJST ? 3 : GetQiKuWareType(x.Store.Type) + }) + }); + } + } + } + + var purchaseOrderV2 = new PurchaseOrderV2() + { + Id = createOrderResponse.PurchaseOrderId, + ShopId = request.ShopId, + OrderState = createOrderResponse.IsPay ? Enums.PurchaseOrderState.待发货 : Enums.PurchaseOrderState.待付款, + PurchasePlatform = purchaseGroup.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 = purchaseGroup.PurchaserId, + PurchaserName = purchaseGroup.PurchaserName, + PurchaseAccountId = purchaseAccount.Id, + PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount, + ProductAmount = purchaseOrderSimpleInfo.ProductAmount, + PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount, + Remark = purchaseGroup.Remark, + CreateTime = DateTime.Now, + PurchaseMethod = Enums.PurchaseMethod.线上采购, + PurchaseOrderMode = request.PurchaseOrderMode + }; + if (createOrderResponse.IsPay) + purchaseOrderV2.PayTime = DateTime.Now; + + fsql.Transaction(() => + { + fsql.Insert(purchaseOrderV2).ExecuteAffrows(); + //fsql.Insert(purchaseOrderSku).ExecuteAffrows(); + fsql.Insert(insertPurchaseOrderSkuList).ExecuteAffrows(); + fsql.Update(updatePurchaseTimeSchemeIdList).Set(p => p.LastPurchaseTime, DateTime.Now).ExecuteAffrows(); + }); + successSkuIdList.AddRange(belongSkuGroups.Select(g => g.Key)); + + if (purchaseGroup.PurchasePlatform == Enums.Platform.拳探) + { + qikuPackSkuConfigRequestList.Add(new + { + orderId = purchaseOrderV2.Id, + //shopId = request.ShopId.ToString(), + shopId = purchaseGroup.PurchaserId, //拳探店铺Id(商家Id) + originShopName = request.ShopName, + userName = purchaseAccount.AccountName, + platform = Enums.Platform.拳探, + purchaseTaskModels = skuPackConfigList + }); + } + } + catch (Exception ex) + { + failSkuList.AddRange(belongSkuGroups.Select(g => new BatchCreareOrderFailDetail() + { + SkuId = g.Key, + ErrorMsg = ex.Message + })); + //throw new BusinessException(errorBuilder.ToString()); + } + } + + if (qikuPackSkuConfigRequestList.Count() > 0) + { + Task.Factory.StartNew(() => + { + foreach (var qikuPackSkuConfigRequest in qikuPackSkuConfigRequestList) + { + try + { + var qikuResponse = restApiService.SendRequest("http://qiku.qiyue666.com/", + "api/PackPurchaseTask/BatchPublicPurchaseTask", + qikuPackSkuConfigRequest, + null, + HttpMethod.Post); + if (qikuResponse.StatusCode != System.Net.HttpStatusCode.OK) + throw new Exception(qikuResponse.Content); + } + catch (Exception ex) + { + nLogManager.GetLogger($"发布打包任务-{request.ShopName}").Error(ex, JsonConvert.SerializeObject(qikuPackSkuConfigRequest)); + } + } + }); + } + + return new BatchCreareOrderResponse() + { + FailSkuList = failSkuList, + SuccessSkuIdList = successSkuIdList + }; + } + private int GetQiKuWareType(Enums.StockType stockType) { if (stockType == Enums.StockType.京仓) diff --git a/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchasePreviewOrderRequest.cs b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchasePreviewOrderRequest.cs index f1b1191e..9898eef3 100644 --- a/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchasePreviewOrderRequest.cs +++ b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchasePreviewOrderRequest.cs @@ -25,7 +25,6 @@ namespace BBWY.Server.Model.Dto public Enums.Platform PurchasePlatform { get; set; } - public string BelongSkuId { get; set; } public string BelongProductId { get; set; } diff --git a/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCargoParamRequestV2.cs b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCargoParamRequestV2.cs new file mode 100644 index 00000000..2b1319ad --- /dev/null +++ b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCargoParamRequestV2.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BBWY.Server.Model.Dto +{ + public class BatchPurchaseCargoParamRequestV2 + { + /// + /// 采购商品Id + /// + public string ProductId { get; set; } + /// + /// 采购SkuId + /// + public string SkuId { get; set; } + + /// + /// 采购SpecId 1688独有 + /// + public string SpecId { get; set; } + + /// + /// 采购SKU数量 + /// + public int Quantity { get; set; } + + + #region BelongInfo + /// + /// 归属SKUId(JD) + /// + public string BelongSkuId { get; set; } + + ///// + ///// 归属商品Id(JD) + ///// + //public string BelongProductId { get; set; } + + ///// + ///// 归属商品价格(JD) + ///// + //public decimal BelongPrice { get; set; } + + ///// + ///// 归属商品标题(JD) + ///// + //public string BelongSkuTitle { get; set; } + + ///// + ///// 归属商品Logo(JD) + ///// + //public string BelongLogo { get; set; } + + /// + /// 归属SKU数量(JD) + /// + public int BelongQuantity { get; set; } + + /// + /// 采购方案Id + /// + public long BelongSchemeId { get; set; } + #endregion + } + + public class BatchPurchaseCargoParamGroupRequestV2 + { + /// + /// 采购商Id + /// + public string PurchaserId { get; set; } + /// + /// 采购商名称 + /// + public string PurchaserName { get; set; } + + public Enums.Platform PurchasePlatform { get; set; } + + /// + /// 下单备注 + /// + public string Remark { get; set; } + + /// + /// 采购商品列表 + /// + public IList CargoParamList { get; set; } + } +} diff --git a/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCreateOrderRequestV2.cs b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCreateOrderRequestV2.cs new file mode 100644 index 00000000..e3730fc8 --- /dev/null +++ b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCreateOrderRequestV2.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BBWY.Server.Model.Dto +{ + public class BatchPurchaseCreateOrderRequestV2 : BatchPurchasePreviewOrderRequestV2 + { + /// + /// 扩展字段 ,格式参考报价接口返回值 + /// + public string Extensions { get; set; } + + public long ShopId { get; set; } + + public string ShopName { get; set; } + + public string AutoPay { get; set; } + + /// + /// 打包设置 + /// + public IList PackSkuConfigList { get; set; } + } +} diff --git a/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchasePreviewOrderRequestV2.cs b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchasePreviewOrderRequestV2.cs new file mode 100644 index 00000000..97847a08 --- /dev/null +++ b/BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchasePreviewOrderRequestV2.cs @@ -0,0 +1,22 @@ +using BBWY.Server.Model.Db; +using System.Collections.Generic; + +namespace BBWY.Server.Model.Dto +{ + public class BatchPurchasePreviewOrderRequestV2 + { + /// + /// 采购账号列表 + /// + public IList PurchaseAccountList { get; set; } + + public Enums.PurchaseOrderMode PurchaseOrderMode { get; set; } + + /// + /// 收货人信息 + /// + public ConsigneeRequest Consignee { get; set; } + + public IList CargoParamGroupList { get; set; } + } +}