using BBWY.Common.Extensions; using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Db; using BBWY.Server.Model.Dto; using FreeSql; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using QuanTan.SDK.Model; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Yitter.IdGenerator; using BBWY.Server.Business.Extensions; namespace BBWY.Server.Business { public class PurchaseOrderBusiness : BaseBusiness, IDenpendency { private IEnumerable platformSDKBusinessList; private TaskSchedulerManager taskSchedulerManager; private OrderBusiness orderBusiness; private MDSBusiness mdsBusiness; private VenderBusiness venderBusiness; private LogisticsCompanyConverter logisticsCompanyConverter; //private IDictionary deliverySelfDic; public PurchaseOrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, IEnumerable platformSDKBusinessList, TaskSchedulerManager taskSchedulerManager, OrderBusiness orderBusiness, MDSBusiness mdsBusiness, VenderBusiness venderBusiness, LogisticsCompanyConverter logisticsCompanyConverter) : base(fsql, nLogManager, idGenerator) { this.platformSDKBusinessList = platformSDKBusinessList; this.taskSchedulerManager = taskSchedulerManager; this.orderBusiness = orderBusiness; this.mdsBusiness = mdsBusiness; this.venderBusiness = venderBusiness; this.logisticsCompanyConverter = logisticsCompanyConverter; //deliverySelfDic = new Dictionary() //{ // {Enums.Platform.京东 , "1274"} //厂家自送 //}; } public void AddPurchaseOrder(AddPurchaseOrderRequest addPurchaseOrderRequest) { if (string.IsNullOrEmpty(addPurchaseOrderRequest.PurchaseOrderId) || string.IsNullOrEmpty(addPurchaseOrderRequest.SkuId) || string.IsNullOrEmpty(addPurchaseOrderRequest.ProductId)) throw new BusinessException("缺少采购单必要信息"); if (fsql.Select().Where(po => po.SkuId == addPurchaseOrderRequest.SkuId && po.PurchaseOrderId == addPurchaseOrderRequest.PurchaseOrderId && po.StorageType == addPurchaseOrderRequest.StorageType).Any()) throw new BusinessException("同一个SkuId和同一种仓储类型中不能存在重复的采购单号"); var purchaseOrder = addPurchaseOrderRequest.Map(); purchaseOrder.Id = idGenerator.NewLong(); purchaseOrder.CreateTime = DateTime.Now; if (purchaseOrder.StorageType == Enums.StorageType.京仓) { if (purchaseOrder.SingleInStorageAmount == 0M) purchaseOrder.SingleInStorageAmount = 0.2M; if (purchaseOrder.SingleOutStorageAmount == 0M) purchaseOrder.SingleOutStorageAmount = 2.8M; if (purchaseOrder.SingleRefundInStorageAmount == 0M) purchaseOrder.SingleRefundInStorageAmount = 2.8M; } if (purchaseOrder.StorageType == Enums.StorageType.云仓) { if (purchaseOrder.SingleInStorageAmount == 0M) purchaseOrder.SingleInStorageAmount = 0.2M; if (purchaseOrder.SingleOutStorageAmount == 0M) purchaseOrder.SingleOutStorageAmount = 0.9M; if (purchaseOrder.SingleRefundInStorageAmount == 0M) purchaseOrder.SingleRefundInStorageAmount = 1M; } fsql.Insert(purchaseOrder).ExecuteAffrows(); } public void EditPurchaseOrder(EditPurchaseOrderRequest editPurchaseOrderRequest) { fsql.Update(editPurchaseOrderRequest.Id).Set(po => po.PurchaseQuantity, editPurchaseOrderRequest.PurchaseQuantity) .Set(po => po.RemainingQuantity, editPurchaseOrderRequest.RemainingQuantity) .Set(po => po.SingleSkuAmount, editPurchaseOrderRequest.SingleSkuAmount) .Set(po => po.SingleFreight, editPurchaseOrderRequest.SingleFreight) .Set(po => po.SingleFirstFreight, editPurchaseOrderRequest.SingleFirstFreight) .Set(po => po.SingleInStorageAmount, editPurchaseOrderRequest.SingleInStorageAmount) .Set(po => po.SingleOutStorageAmount, editPurchaseOrderRequest.SingleOutStorageAmount) .Set(po => po.SingleRefundInStorageAmount, editPurchaseOrderRequest.SingleRefundInStorageAmount) .Set(po => po.SingleConsumableAmount, editPurchaseOrderRequest.SingleConsumableAmount) .Set(po => po.SingleStorageAmount, editPurchaseOrderRequest.SingleStorageAmount) .Set(po => po.SingleDeliveryFreight, editPurchaseOrderRequest.SingleDeliveryFreight) .ExecuteAffrows(); } public IList GetList(QueryPurchaseOrderRequest queryPurchaseOrderRequest) { return fsql.Select().Where(po => po.ShopId == queryPurchaseOrderRequest.ShopId && queryPurchaseOrderRequest.SkuIdList.Contains(po.SkuId) && po.StorageType == queryPurchaseOrderRequest.StorageType) .ToList() .Map>(); } public void DeletePurchaseOrder(long id) { fsql.Delete(id).ExecuteAffrows(); } public PreviewOrderResponse PreviewPurchaseOrder(PreviewOrderReuqest previewOrderReuqest) { return platformSDKBusinessList.FirstOrDefault(p => p.Platform == previewOrderReuqest.Platform).PreviewOrder(previewOrderReuqest); } public void NewFastCreateOrder(CreateOnlinePurchaseOrderRequest createOnlinePurchaseOrderRequest) { if (createOnlinePurchaseOrderRequest.PlatformCommissionRatio == 0M) createOnlinePurchaseOrderRequest.PlatformCommissionRatio = 0.05M; //if (createOnlinePurchaseOrderRequest.Platform != Enums.Platform.阿里巴巴) // throw new NotImplementedException(); var dbOrder = fsql.Select(createOnlinePurchaseOrderRequest.OrderId).ToOne(); if (dbOrder == null) throw new BusinessException("订单不存在"); if (dbOrder.OrderState != Enums.OrderState.等待采购 && dbOrder.OrderState != Enums.OrderState.待出库) throw new BusinessException("只能为等待采购或待出库的订单进行采购"); var oldPourchaseIdList = fsql.Select().Where(ocd => ocd.OrderId == dbOrder.Id) .ToList(ocd => ocd.PurchaseOrderPKId); var deletePurchaseOrder = fsql.Delete().Where(po => oldPourchaseIdList.Contains(po.Id)); var deleteOrderCostDetail = fsql.Delete().Where(ocd => ocd.OrderId == dbOrder.Id); var isRepurchase = fsql.Select(dbOrder.Id).Any(); var orderSkus = fsql.Select().Where(osku => osku.Price != 0 && osku.OrderId == createOnlinePurchaseOrderRequest.OrderId).ToList(); var orderSkuIds = orderSkus.Select(osku => osku.Id).ToList(); #region 合并重复的采购sku var repeatPurchaseSkuGroups = createOnlinePurchaseOrderRequest.CargoParamList.GroupBy(p => p.SkuId).ToList(); foreach (var group in repeatPurchaseSkuGroups) { if (group.Count() > 1) { var repeatSkus = group.ToList(); foreach (var repeatSku in repeatSkus) createOnlinePurchaseOrderRequest.CargoParamList.Remove(repeatSku); createOnlinePurchaseOrderRequest.CargoParamList.Add(new CargoParamRequest() { BelongSkuId = repeatSkus[0].BelongSkuId, ProductId = repeatSkus[0].ProductId, SkuId = repeatSkus[0].SkuId, SpecId = repeatSkus[0].SpecId, Quantity = repeatSkus.Sum(s => s.Quantity) }); } } #endregion List updatePurchaseTimeSchemeIdList = new List(); updatePurchaseTimeSchemeIdList.AddRange(createOnlinePurchaseOrderRequest.CargoParamList.Select(p => p.SchemeId).Distinct()); var createOrderResponse = platformSDKBusinessList.FirstOrDefault(p => p.Platform == createOnlinePurchaseOrderRequest.Platform) .FastCreateOrder(createOnlinePurchaseOrderRequest); var purchaseOrderSimpleInfo = platformSDKBusinessList.FirstOrDefault(p => p.Platform == createOnlinePurchaseOrderRequest.Platform).GetOrderSimpleInfo(new GetOrderInfoRequest() { AppKey = createOnlinePurchaseOrderRequest.AppKey, AppSecret = createOnlinePurchaseOrderRequest.AppSecret, AppToken = createOnlinePurchaseOrderRequest.AppToken, OrderId = createOrderResponse.PurchaseOrderId, Platform = createOnlinePurchaseOrderRequest.Platform }); nLogManager.Default().Info($"NewFastCreateOrder\r\ncreateOnlinePurchaseOrderRequest\r\n{JsonConvert.SerializeObject(createOnlinePurchaseOrderRequest)}\r\npurchaseOrderSimpleInfo\r\n{JsonConvert.SerializeObject(purchaseOrderSimpleInfo)}"); List insertPurchaseOrders = new List(); List insertPurchaseOrderDetails = new List(); List insertOrderCostDetails = new List(); IInsert insertOrderCost = null; IUpdate updateOrderCost = null; IInsert insertOrderDropShipping = null; var avgPreferential = dbOrder.PreferentialAmount / orderSkus.Count(); foreach (var orderSku in orderSkus) { #region 计算当前sku的采购成本和采购运费 var currentOrderSkuProductAmount = 0M; //采购成本 var currentOrderSkuCargoParamList = createOnlinePurchaseOrderRequest.CargoParamList.Where(p => p.BelongSkuId == orderSku.SkuId); //找当前skuId的采购skuId currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => currentOrderSkuCargoParamList.Any(p1 => p1.SkuId == p.SkuId)) ?.Sum(p => p.ProductAmount) ?? 0M; var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / orderSkus.Count(); //采购运费(按sku数均分) #endregion #region 采购单 var purchaseOrder = new PurchaseOrder() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, ProductId = orderSku.ProductId, SkuId = orderSku.SkuId, PurchaseMethod = Enums.PurchaseMethod.线上采购, PurchaseOrderId = createOrderResponse.PurchaseOrderId, PurchasePlatform = createOnlinePurchaseOrderRequest.Platform, PurchaseQuantity = orderSku.ItemTotal.Value, RemainingQuantity = 0, ShopId = createOnlinePurchaseOrderRequest.ShopId, SingleConsumableAmount = 0, SingleDeliveryFreight = 0, SingleFirstFreight = 0, SingleStorageAmount = 0, //SingleOperationAmount = 0, SingleOutStorageAmount = 0, SingleInStorageAmount = 0, SingleSkuAmount = currentOrderSkuProductAmount / orderSku.ItemTotal.Value, SingleFreight = currentOrderSkuFreightAmount / orderSku.ItemTotal.Value, StorageType = Enums.StorageType.代发, PurchaserId = createOnlinePurchaseOrderRequest.PurchaserId }; insertPurchaseOrders.Add(purchaseOrder); #endregion #region 采购单明细 insertPurchaseOrderDetails.AddRange(currentOrderSkuCargoParamList.Select(p => new PurchaseOrderDetail() { Id = idGenerator.NewLong(), OrderId = createOnlinePurchaseOrderRequest.OrderId, PurchaseOrderPKId = purchaseOrder.Id, PurchaseSkuId = p.SkuId, SkuId = orderSku.SkuId })); #endregion #region 成本明细 var orderCostDetail = new OrderCostDetail() { Id = idGenerator.NewLong(), ConsumableAmount = 0, CreateTime = DateTime.Now, DeductionQuantity = orderSku.ItemTotal.Value, DeliveryExpressFreight = 0, FirstFreight = 0, //OperationAmount = 0, InStorageAmount = 0, OutStorageAmount = 0, OrderId = createOnlinePurchaseOrderRequest.OrderId, ProductId = orderSku.ProductId, PurchaseFreight = currentOrderSkuFreightAmount, PurchaseOrderPKId = purchaseOrder.Id, SkuAmount = currentOrderSkuProductAmount, SkuId = orderSku.SkuId, StorageAmount = 0, //UnitCost = purchaseOrder.UnitCost, //TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount//purchaseOrder.UnitCost * orderSku.ItemTotal.Value }; //orderCostDetail.SkuGrossProfit = orderSku.Price.Value * orderCostDetail.DeductionQuantity - avgPreferential - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - orderSku.Price.Value * orderCostDetail.DeductionQuantity * createOnlinePurchaseOrderRequest.PlatformCommissionRatio; //orderCostDetail.SkuGrossProfit = ((orderSku.ShouldPay ?? 0M) + orderSku.Coupon ?? 0M) * orderCostDetail.DeductionQuantity - orderCostDetail.TotalCost - orderCostDetail.DeliveryExpressFreight; orderCostDetail.CalculationSkuGrossProfit(orderSku.ShouldPay ?? 0M, orderSku.PingTaiChengDanYouHuiQuan ?? 0M, orderSku.SuperRedEnvelope ?? 0M, orderSku.XianPinLeiDongQuan ?? 0M, orderSku.VenderFee ?? 0M, orderSku.JingDou ?? 0M, orderSku.DongQuan ?? 0M, orderSku.Balance ?? 0M, createOnlinePurchaseOrderRequest.PlatformCommissionRatio); insertOrderCostDetails.Add(orderCostDetail); #endregion } #region 订单成本 var orderCost = new OrderCost() { OrderId = createOnlinePurchaseOrderRequest.OrderId, CreateTime = DateTime.Now, DeliveryExpressFreight = 0, IsManualEdited = false, PlatformCommissionRatio = createOnlinePurchaseOrderRequest.PlatformCommissionRatio, PreferentialAmount = dbOrder.PreferentialAmount, SDCommissionAmount = 0, SDOrderAmount = 0, PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount }; orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio; orderCost.Profit = dbOrder.OrderSellerPrice + dbOrder.FreightPrice - orderCost.PurchaseAmount - orderCost.DeliveryExpressFreight - orderCost.PlatformCommissionAmount; if (!isRepurchase) { insertOrderCost = fsql.Insert(orderCost); } else { updateOrderCost = fsql.Update().SetSource(orderCost).IgnoreColumns(a => new { a.CreateTime }); } #endregion #region 代发信息 var orderDropShipping = new OrderDropShipping() { Id = idGenerator.NewLong(), OrderId = createOnlinePurchaseOrderRequest.OrderId, PurchaseAccountId = createOnlinePurchaseOrderRequest.PurchaseAccountId, BuyerAccount = createOnlinePurchaseOrderRequest.BuyerAccount, SellerAccount = createOnlinePurchaseOrderRequest.SellerAccount, CreateTime = DateTime.Now, DeliveryFreight = 0, PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount, SkuAmount = purchaseOrderSimpleInfo.ProductAmount, PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount, PurchaseOrderId = createOrderResponse.PurchaseOrderId, PurchasePlatform = createOnlinePurchaseOrderRequest.Platform, ShopId = dbOrder.ShopId }; insertOrderDropShipping = fsql.Insert(orderDropShipping); #endregion fsql.Transaction(() => { deletePurchaseOrder.ExecuteAffrows(); deleteOrderCostDetail.ExecuteAffrows(); fsql.Update().Set(ods => ods.IsHistory, true).Where(ods => ods.OrderId == createOnlinePurchaseOrderRequest.OrderId).ExecuteAffrows(); fsql.Insert(insertPurchaseOrders).ExecuteAffrows(); fsql.Insert(insertPurchaseOrderDetails).ExecuteAffrows(); fsql.Insert(insertOrderCostDetails).ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); insertOrderCost?.ExecuteAffrows(); insertOrderDropShipping?.ExecuteAffrows(); fsql.Update(createOnlinePurchaseOrderRequest.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState.等待采购, o => o.OrderState, Model.Enums.OrderState.待出库) .Set(o => o.StorageType, Model.Enums.StorageType.代发) .ExecuteAffrows(); fsql.Update().Set(osku => osku.OrderDropShippingId, orderDropShipping.Id) .Where(osku => orderSkuIds.Contains(osku.Id)) .ExecuteAffrows(); if (updatePurchaseTimeSchemeIdList.Count() > 0) fsql.Update(updatePurchaseTimeSchemeIdList).Set(p => p.LastPurchaseTime, DateTime.Now).ExecuteAffrows(); }); } /// /// 查询审核采购单 /// 暂时从订单查询采购单,之后改为直接查询采购单 /// /// /// public IList GetAuditPurchaseOrderList(AuditOrderRequest auditOrderRequest) { auditOrderRequest.EndDate = auditOrderRequest.EndDate.Date.AddDays(1).AddSeconds(-1); return fsql.Select().InnerJoin((o, ods) => o.Id == ods.OrderId) .Where((o, ods) => o.StartTime >= auditOrderRequest.StartDate && o.StartTime <= auditOrderRequest.EndDate && auditOrderRequest.ShopIdList.Contains(o.ShopId)) .ToList((o, ods) => new AuditPurchaseOrderResponse() { OrderDropShippingId = ods.Id, OrderId = o.Id, PurchaseAmount = ods.PurchaseAmount, PurchaseOrderId = ods.PurchaseOrderId, MerchantOrderId = ods.MerchantOrderId, ShopId = o.ShopId, PurchaseTime = ods.CreateTime, PurchasePlatform = ods.PurchasePlatform, OrderStartTime = o.StartTime }); } #region CallBack #region 1688 CallBack public void CallbackFrom1688(string jsonStr) { nLogManager.Default().Info(jsonStr); var jObject = JObject.Parse(jsonStr); var type = jObject.Value("type").ToUpper(); switch (type) { case "ORDER_BUYER_VIEW_PART_PART_SENDGOODS": //部分发货 case "ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS": //发货 DeliveryCallbackFrom1688(jObject); break; case "ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY": OrderPriceModificationCallbackFrom1688(jObject); //订单改价 break; default: break; } } /// /// 1688发货回调 /// /// private void DeliveryCallbackFrom1688(JObject jObject) { var purchaseOrderId = jObject["data"].Value("orderId"); //处理一键代发的回调 //Task.Factory.StartNew(() => DeliveryCallback(purchaseOrderId, null, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); //处理采购单的回调 } /// /// 1688订单改价回调 /// /// private void OrderPriceModificationCallbackFrom1688(JObject jObject) { var purchaseOrderId = jObject["data"].Value("orderId"); Task.Factory.StartNew(() => OrderPriceModificationCallback(purchaseOrderId, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } #endregion #region QuanTan Callback public void QuanTanSendGoodsCallback(QuanTanSendGoodsNotifyRequest request) { Task.Factory.StartNew(() => DeliveryCallback(request.OrderId, new WayBillNoResponse() { LogisticsCompanyId = request.ExpressId, LogisticsCompanyName = request.ExpressName, WayBillNo = request.WayBillNo, }, Enums.Platform.拳探), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); Task.Factory.StartNew(() => DeliveryCallbackForPurchaseOrder(request.OrderId, new WayBillNoResponse() { LogisticsCompanyId = request.ExpressId, LogisticsCompanyName = request.ExpressName, WayBillNo = request.WayBillNo, }, Enums.Platform.拳探), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } public void QuanTanEditPriceCallback(QuanTanEditPriceNotifyRequest request) { //Task.Factory.StartNew(() => OrderPriceModificationCallback(request.OrderId, Enums.Platform.拳探), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); Task.Factory.StartNew(() => OrderPriceNotifitionForPurchaseOrder(request.OrderId, Enums.Platform.拳探), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } #endregion #region bbwyb Callback #endregion /// /// 采购平台发货回调(一件代发) /// /// /// /// private void DeliveryCallback(string purchaseOrderId, WayBillNoResponse wayBillNoResponse, Enums.Platform callbackPlatform) { string currentProgress = string.Empty; string wayBillNoResponseInfo = string.Empty; string logisticsCompanyListInfo = string.Empty; string logisticsCompanyId = string.Empty; string orderId = string.Empty; long? shopId = null; OutStockRequest outStockRequest = null; try { #region 查询代发信息 currentProgress = "查询代发信息"; var orderDropshipping = fsql.Select().Where(o => o.PurchaseOrderId == purchaseOrderId).ToOne(); if (orderDropshipping == null) throw new Exception("未查询到代发信息"); orderId = orderDropshipping.OrderId; #endregion #region 查询订单 if (orderDropshipping.ShopId == null) { var order = fsql.Select(orderId).ToOne(); if (order == null) throw new Exception("未查询到订单"); shopId = order.ShopId; } else { shopId = orderDropshipping.ShopId.Value; } #endregion #region 查询采购账号 currentProgress = "查询采购账号"; var purchaseAccount = fsql.Select().WhereIf(orderDropshipping.PurchaseAccountId != 0, pa => pa.Id == orderDropshipping.PurchaseAccountId) .WhereIf(orderDropshipping.PurchaseAccountId == 0, pa => pa.AccountName == orderDropshipping.BuyerAccount) .Where(pa => pa.PurchasePlatformId == callbackPlatform && pa.ShopId == shopId.Value).ToOne(); if (purchaseAccount == null) throw new Exception($"未查询到采购账号{orderDropshipping.BuyerAccount}"); #endregion #region 获取采购单的物流信息 currentProgress = "获取采购单的物流信息"; var queryOrderWayBillNoRequest = new QueryOrderWayBillNoRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, OrderId = purchaseOrderId, Platform = callbackPlatform }; if (wayBillNoResponse == null) wayBillNoResponse = platformSDKBusinessList.FirstOrDefault(p => p.Platform == callbackPlatform).GetWayBillNoByOrderId(queryOrderWayBillNoRequest); wayBillNoResponseInfo = JsonConvert.SerializeObject(new { Request = queryOrderWayBillNoRequest, Result = wayBillNoResponse }); #endregion #region 查询采购账号的归属店铺 currentProgress = "查询采购账号归属店铺"; var shop = mdsBusiness.GetShopInfoByShopId(purchaseAccount.ShopId.Value); #endregion #region 获取目标平台的物流公司列表 currentProgress = "获取店铺平台物流公司列表"; var logisticsCompanyList = venderBusiness.GetLogisticsList(new PlatformRequest() { AppKey = shop.AppKey, AppSecret = shop.AppSecret, AppToken = shop.AppToken, Platform = shop.PlatformId }); if (logisticsCompanyList != null) logisticsCompanyListInfo = JsonConvert.SerializeObject(logisticsCompanyList); #endregion #region 物流公司翻译 currentProgress = "物流公司翻译"; //logisticsCompanyId = ConvertLogisticsCompanyId(wayBillNoResponse.LogisticsCompanyName, logisticsCompanyList, shop.Platform); logisticsCompanyId = logisticsCompanyConverter.Converter(wayBillNoResponse.LogisticsCompanyName, callbackPlatform, shop.PlatformId, logisticsCompanyList); #endregion #region 店铺平台订单出库 currentProgress = "店铺平台订单出库"; outStockRequest = new OutStockRequest() { AppKey = shop.AppKey, AppSecret = shop.AppSecret, AppToken = shop.AppToken, OrderId = orderDropshipping.OrderId, Platform = shop.PlatformId, WayBillNo = wayBillNoResponse.WayBillNo, LogisticsId = logisticsCompanyId, //物流公司Id SaveResponseLog = true }; orderBusiness.OutStock(outStockRequest); #endregion nLogManager.Default().Info($"DeliveryCallback 回调平台{callbackPlatform},订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo},店铺平台物流公司列表:{logisticsCompanyListInfo},翻译后的物流公司Id:{logisticsCompanyId},出库请求:{(outStockRequest != null ? JsonConvert.SerializeObject(outStockRequest) : null)}"); } catch (Exception ex) { nLogManager.Default().Error(ex, $"DeliveryCallback 回调平台{callbackPlatform},订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo},店铺平台物流公司列表:{logisticsCompanyListInfo},翻译后的物流公司Id:{logisticsCompanyId},出库请求:{(outStockRequest != null ? JsonConvert.SerializeObject(outStockRequest) : null)}"); } } /// /// 采购平台发货回调(采购单) /// /// /// /// private void DeliveryCallbackForPurchaseOrder(string purchaseOrderId, WayBillNoResponse wayBillNoResponse, Enums.Platform callbackPlatform) { var msg = $"DeliveryCallbackForPurchaseOrder purchaseOrderId:{purchaseOrderId},wayBillNoResponse:{JsonConvert.SerializeObject(wayBillNoResponse)},callbackPlatform:{callbackPlatform}"; try { nLogManager.Default().Info(msg); var purchaseOrderV2 = fsql.Select(purchaseOrderId).ToOne(); if (purchaseOrderV2 == null) throw new Exception("未查询到采购单信息"); fsql.Update(purchaseOrderId).SetIf(purchaseOrderV2.OrderState == Enums.PurchaseOrderState.待发货 || purchaseOrderV2.OrderState == Enums.PurchaseOrderState.待付款, p => p.OrderState, Enums.PurchaseOrderState.待收货) .Set(p => p.ExpressName, wayBillNoResponse.LogisticsCompanyName) .Set(p => p.WaybillNo, wayBillNoResponse.WayBillNo) .ExecuteAffrows(); } catch (Exception ex) { nLogManager.Default().Error(ex, msg); } } /// /// 采购平台改价回调(一件代发) /// /// /// private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform) { string currentProgress = string.Empty; try { #region 查询代发信息 currentProgress = "查询代发信息"; var orderDropshipping = fsql.Select().Where(o => o.PurchaseOrderId == purchaseOrderId).ToOne(); if (orderDropshipping == null) throw new Exception("未查询到代发信息"); #endregion #region 查询订单Sku currentProgress = "查询订单Sku"; var orderSkuList = fsql.Select().Where(osku => osku.Price != 0 && osku.OrderId == orderDropshipping.OrderId).ToList(); if (orderSkuList == null || orderSkuList.Count() == 0) throw new BusinessException("订单Sku不存在"); #endregion #region 查询采购单 currentProgress = "查询采购单"; var purchaseOrderList = fsql.Select().Where(po => po.PurchaseOrderId == purchaseOrderId).ToList(); if (purchaseOrderList == null || purchaseOrderList.Count() == 0) throw new BusinessException("采购单不存在"); if (orderSkuList.Count() > 1 && purchaseOrderList.Any(p => p.PurchaseMethod == Enums.PurchaseMethod.线下采购)) throw new Exception("多sku订单关联采购单不支持改价"); #endregion #region 查询成本 currentProgress = "查询成本"; var orderCost = fsql.Select(orderDropshipping.OrderId).ToOne(); if (orderCost == null) throw new BusinessException("订单成本不存在"); #endregion #region 查询成本明细 currentProgress = "查询成本明细"; var orderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == orderDropshipping.OrderId).ToList(); if (orderCostDetailList == null || orderCostDetailList.Count() == 0) throw new BusinessException("订单成本明细不存在"); #endregion #region 查询采购账号 currentProgress = "查询采购账号"; var purchaseAccount = fsql.Select().WhereIf(orderDropshipping.PurchaseAccountId != 0, pa => pa.Id == orderDropshipping.PurchaseAccountId) .WhereIf(orderDropshipping.PurchaseAccountId == 0, pa => pa.AccountName == orderDropshipping.BuyerAccount) .Where(pa => pa.PurchasePlatformId == callbackPlatform).ToOne(); if (purchaseAccount == null) throw new Exception($"未查询到采购账号{orderDropshipping.BuyerAccount}"); #endregion #region 查询改价后的订单金额 currentProgress = "查询改价后的订单金额"; var purchaseOrderSimpleInfo = platformSDKBusinessList.FirstOrDefault(p => p.Platform == callbackPlatform).GetOrderSimpleInfo(new GetOrderInfoRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, OrderId = purchaseOrderId, Platform = callbackPlatform }); #endregion #region 查询采购单明细 currentProgress = "查询采购单明细"; var purchaseOrderDetails = fsql.Select().Where(p => p.OrderId == orderDropshipping.OrderId); #endregion #region 查询订单 currentProgress = "查询订单"; var dbOrder = fsql.Select(orderDropshipping.OrderId).ToOne(); if (dbOrder == null) throw new BusinessException("订单不存在"); #endregion IList> updatePurchaseOrders = new List>(); IList> updateOrderCostDetails = new List>(); foreach (var orderSku in orderSkuList) { var currentOrderSkuProductAmount = 0M; //采购成本 if (orderSkuList.Count() != 1) { var currentOrderSkuPurchaseOrderDetails = purchaseOrderDetails.Where(p => p.SkuId == orderSku.SkuId); //找当前skuId的采购skuId currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => currentOrderSkuPurchaseOrderDetails.Any(p1 => p1.PurchaseSkuId == p.SkuId)) ?.Sum(p => p.ProductAmount) ?? 0M; } else { currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ProductAmount; } var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / orderSkuList.Count(); //采购运费(按sku数均分) var purchaseOrder = purchaseOrderList.FirstOrDefault(po => po.SkuId == orderSku.SkuId); var orderCostDetail = orderCostDetailList.FirstOrDefault(oc => oc.PurchaseOrderPKId == purchaseOrder.Id); purchaseOrder.SingleSkuAmount = currentOrderSkuProductAmount / orderSku.ItemTotal.Value; purchaseOrder.SingleFreight = currentOrderSkuFreightAmount / orderSku.ItemTotal.Value; orderCostDetail.SkuAmount = currentOrderSkuProductAmount; orderCostDetail.PurchaseFreight = currentOrderSkuFreightAmount; //orderCostDetail.UnitCost = purchaseOrder.UnitCost; //orderCostDetail.TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount; updatePurchaseOrders.Add(fsql.Update().SetSource(purchaseOrder)); updateOrderCostDetails.Add(fsql.Update().SetSource(orderCostDetail)); } orderCost.PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount; orderCost.Profit = dbOrder.OrderSellerPrice + dbOrder.FreightPrice - orderCost.PurchaseAmount - orderCost.DeliveryExpressFreight - orderCost.PlatformCommissionAmount; orderDropshipping.PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount; orderDropshipping.SkuAmount = purchaseOrderSimpleInfo.ProductAmount; orderDropshipping.PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount; fsql.Transaction(() => { foreach (var update in updatePurchaseOrders) update.ExecuteAffrows(); foreach (var update in updateOrderCostDetails) update.ExecuteAffrows(); fsql.Update().SetSource(orderCost).ExecuteAffrows(); fsql.Update().SetSource(orderDropshipping).ExecuteAffrows(); }); } catch (Exception ex) { nLogManager.Default().Error(ex, $"OrderPriceModificationCallback 回调平台{callbackPlatform},采购单号{purchaseOrderId},执行进度[{currentProgress}]"); } } /// /// 采购平台改价回调(采购单) /// /// /// private void OrderPriceNotifitionForPurchaseOrder(string purchaseOrderId, Enums.Platform callbackPlatform) { string currentProgress = string.Empty; try { #region 查询数据库采购单 currentProgress = "查询数据库采购单"; var purchaseOrder = fsql.Select(purchaseOrderId).ToOne(); if (purchaseOrder == null) throw new Exception($"未查询到采购单"); #endregion #region 查询采购账号 currentProgress = "查询采购账号"; var purchaseAccount = fsql.Select().Where(pa => pa.Id == purchaseOrder.PurchaseAccountId).ToOne(); if (purchaseAccount == null) throw new Exception($"未查询到采购账号"); #endregion #region 查询接口采购单 currentProgress = "查询接口采购单"; var purchaseOrderSimpleInfo = platformSDKBusinessList.FirstOrDefault(p => p.Platform == callbackPlatform).GetOrderSimpleInfo(new GetOrderInfoRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, OrderId = purchaseOrderId, Platform = callbackPlatform }); #endregion currentProgress = "更新数据库"; fsql.Transaction(() => { fsql.Update(purchaseOrderId).Set(po => po.ProductAmount, purchaseOrderSimpleInfo.ProductAmount) .Set(po => po.PurchaseFreight, purchaseOrderSimpleInfo.FreightAmount) .Set(po => po.PurchaseAmount, purchaseOrderSimpleInfo.TotalAmount) .ExecuteAffrows(); foreach (var purchaseOrderSku in purchaseOrderSimpleInfo.ItemList) { fsql.Update().Where(pos => pos.PurchaseOrderId == purchaseOrderId && pos.PurchaseSkuIds == purchaseOrderSku.SkuId) .Set(pos => pos.ProductAmount, purchaseOrderSku.ProductAmount) .Set(pos => pos.PurchaseFreight, purchaseOrderSku.FreightAmount) .Set(pos => pos.PurchaseAmount, purchaseOrderSku.ProductAmount + purchaseOrderSku.FreightAmount) .Set(pos => pos.Price, purchaseOrderSku.Price) .ExecuteAffrows(); } }); } catch (Exception ex) { nLogManager.Default().Error(ex, $"OrderPriceNotifitionForPurchaseOrder 回调平台{callbackPlatform},采购单号{purchaseOrderId},执行进度[{currentProgress}]"); } } #endregion } }