using BBWYB.Common.Http; using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Business.Extensions; using BBWYB.Server.Business.JD; using BBWYB.Server.Model; using BBWYB.Server.Model.Core; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Db.Mds; using BBWYB.Server.Model.Db.MDS; using BBWYB.Server.Model.Dto; using FreeSql; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SDKAdapter; using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Models; using SDKAdapter.PurchasePlatform.Client; using SDKAdapter.PurchasePlatform.Models; using System.Text; using System.Text.RegularExpressions; using Yitter.IdGenerator; namespace BBWYB.Server.Business { public class PurchaseOrderBusiness : BaseBusiness, IDenpendency { private Lazy pplatformClientFactoryLazy; private Lazy taskSchedulerManagerLazy; private Lazy fsqlManagerLazy; private Lazy expressCompanyNameConverterLazy; private Lazy kuaiDi100ManagerLazy; private Lazy dingDingBusinessLazy; private Lazy qiKuManagerLazy; private Lazy restApiServiceLazy; private Lazy jdBusinessLazy; private Lazy opPlatformClientFactoryLazy; private Lazy venderBusinessLazy; private Lazy purchaseSchemeBusinessLazy; private PP_PlatformClientFactory ppPlatformClientFactory => pplatformClientFactoryLazy.Value; private TaskSchedulerManager taskSchedulerManager => taskSchedulerManagerLazy.Value; private FreeSqlMultiDBManager fsqlManager => fsqlManagerLazy.Value; private ExpressCompanyNameConverter expressCompanyNameConverter => expressCompanyNameConverterLazy.Value; private KuaiDi100Manager kuaiDi100Manager => kuaiDi100ManagerLazy.Value; private DingDingBusiness dingDingBusiness => dingDingBusinessLazy.Value; private QiKuManager qiKuManager => qiKuManagerLazy.Value; private RestApiService restApiService => restApiServiceLazy.Value; private OP_PlatformClientFactory opPlatformClientFactory => opPlatformClientFactoryLazy.Value; private VenderBusiness venderBusiness => venderBusinessLazy.Value; private JDBusiness jdBusiness => jdBusinessLazy.Value; private PurchaseSchemeBusiness purchaseSchemeBusiness => purchaseSchemeBusinessLazy.Value; private IList cantPurchaseOrderStateList; public PurchaseOrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, IServiceProvider serviceProvider) : base(fsql, nLogManager, idGenerator) { pplatformClientFactoryLazy = new Lazy(() => serviceProvider.GetService()); taskSchedulerManagerLazy = new Lazy(() => serviceProvider.GetService()); fsqlManagerLazy = new Lazy(() => serviceProvider.GetService()); expressCompanyNameConverterLazy = new Lazy(() => serviceProvider.GetService()); kuaiDi100ManagerLazy = new Lazy(() => serviceProvider.GetService()); dingDingBusinessLazy = new Lazy(() => serviceProvider.GetService()); qiKuManagerLazy = new Lazy(() => serviceProvider.GetService()); restApiServiceLazy = new Lazy(() => serviceProvider.GetService()); jdBusinessLazy = new Lazy(() => serviceProvider.GetService()); opPlatformClientFactoryLazy = new Lazy(() => serviceProvider.GetService()); venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); purchaseSchemeBusinessLazy = new Lazy(() => serviceProvider.GetService()); cantPurchaseOrderStateList = new List() { Enums.OrderState.已取消, Enums.OrderState.已完成, Enums.OrderState.待付款 }; } /// /// 合并相同的采购Sku /// /// /// private IList CombineRepeatPurchaseSku(IList cargoParamList) { IList orderProductParamList = new List(); var samePurchaseSkuGroups = cargoParamList.GroupBy(p => p.SkuId).ToList(); foreach (var samePurchaseSkuGroup in samePurchaseSkuGroups) { var first = samePurchaseSkuGroup.First(); orderProductParamList.Add(new PP_OrderProductParamRequest() { ProductId = first.ProductId, SkuId = first.SkuId, SpecId = first.SpecId, Quantity = samePurchaseSkuGroup.Sum(p => p.Quantity) }); } return orderProductParamList; } /// /// 预览采购单 /// /// /// /// public PreviewOrderResponse PreviewPurchaseOrder(PreviewOrderRequest request) { nLogManager.Default().Info($"PreviewPurchaseOrder {JsonConvert.SerializeObject(request)}"); 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("缺少采购账号"); if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0) throw new BusinessException("缺少报价参数"); #region 验证同一个批次中,一个订单sku不能同时拥有多个采购方案 IDictionary schemeValidationDictionary = new Dictionary(); foreach (var purchaseGroup in request.CargoParamGroupList) { foreach (var cargo in purchaseGroup.CargoParamList) { if (!schemeValidationDictionary.ContainsKey(cargo.BelongSkuId)) schemeValidationDictionary.TryAdd(cargo.BelongSkuId, cargo.SchemeId); if (schemeValidationDictionary.TryGetValue(cargo.BelongSkuId, out long schemeId)) { if (cargo.SchemeId != schemeId) { throw new BusinessException($"订单sku{cargo.BelongSkuId}只允许使用一个采购方案进行报价"); } } } } schemeValidationDictionary.Clear(); #endregion var extJArray = new List(); var freightAmount = 0M; var productAmount = 0M; var totalAmount = 0M; var previewAmountGroupByPurchaserList = new List(); foreach (var cargoParamGroup in request.CargoParamGroupList) { var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == cargoParamGroup.PurchasePlatform); if (purchaseAccount == null) throw new BusinessException($"缺少{cargoParamGroup.PurchasePlatform}采购平台账号,请在店铺配置中设置"); var orderProductParamList = CombineRepeatPurchaseSku(cargoParamGroup.CargoParamList); try { var response = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)cargoParamGroup.PurchasePlatform) .PreviewOrder(new PP_PreviewOrderRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, Consignee = new PP_ConsigneeRequest() { Address = request.Consignee.Address, City = request.Consignee.City, ContactName = request.Consignee.ContactName, County = request.Consignee.County, Mobile = request.Consignee.Mobile, Province = request.Consignee.Province, TelePhone = request.Consignee.TelePhone, Town = request.Consignee.Town }, Platform = (AdapterEnums.PlatformType)cargoParamGroup.PurchasePlatform, PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode, OrderProductParamList = orderProductParamList }); if (cargoParamGroup.PurchasePlatform == Enums.Platform.阿里巴巴) extJArray.Add(new { cargoParamGroup.PurchaserId, cargoParamGroup.PurchasePlatform, OrderTradeTypeCode = response.Extensions }); freightAmount += response.FreightAmount; productAmount += response.ProductAmount; totalAmount += response.TotalAmount; previewAmountGroupByPurchaserList.Add(new PreviewAmountGroupByPurchaser() { FreightAmount = response.FreightAmount, ProductAmount = response.ProductAmount, TotalAmount = response.TotalAmount, PurchasePlatform = cargoParamGroup.PurchasePlatform, PurchaserId = cargoParamGroup.PurchaserId, PurchaserName = cargoParamGroup.PurchaserName }); } catch (Exception ex) { var errorBuilder = new StringBuilder(); errorBuilder.AppendLine($"采购商:{cargoParamGroup.PurchaserName}"); #region 匹配订单sku if (ex.Message.Contains("库存不足")) { var match = Regex.Match(ex.Message, @"商品\[(\d+)_(\w+)\]"); if (match.Success) { var purchaseProductId = match.Groups[1].Value; var purchaseSkuSpecId = match.Groups[2].Value; var errorCargoParam = cargoParamGroup.CargoParamList.FirstOrDefault(c => c.SpecId == purchaseSkuSpecId && c.ProductId == purchaseProductId); if (errorCargoParam != null) { errorBuilder.AppendLine($"订单sku[{errorCargoParam.BelongSkuId}]所使用的配件[${errorCargoParam.SkuId}]库存不足"); } } else { errorBuilder.AppendLine(ex.Message); } } else { errorBuilder.AppendLine(ex.Message); } #endregion throw new BusinessException(errorBuilder.ToString()); } } return new PreviewOrderResponse() { Extensions = JsonConvert.SerializeObject(extJArray), FreightAmount = freightAmount, ProductAmount = productAmount, TotalAmount = totalAmount, PreviewAmountGroupByPurchaserList = previewAmountGroupByPurchaserList }; } /// /// 创建采购单 /// /// /// public void CreatePurchaseOrder(CreateOrderRequest request) { nLogManager.Default().Info($"CreatePurchaseOrder\r\n{JsonConvert.SerializeObject(request)}"); var dbOrder = fsql.Select(request.OrderId).ToOne(); if (dbOrder == null) throw new BusinessException("订单不存在"); if (cantPurchaseOrderStateList.Contains(dbOrder.OrderState.Value)) throw new BusinessException($"当前订单状态:{dbOrder.OrderState},不允许采购"); 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("缺少采购账号"); if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0) throw new BusinessException("缺少下单商品参数"); #region 验证同一个批次中,一个订单sku不能同时拥有多个采购方案 IDictionary schemeValidationDictionary = new Dictionary(); foreach (var purchaseGroup in request.CargoParamGroupList) { foreach (var cargo in purchaseGroup.CargoParamList) { if (!schemeValidationDictionary.ContainsKey(cargo.BelongSkuId)) schemeValidationDictionary.TryAdd(cargo.BelongSkuId, cargo.SchemeId); if (schemeValidationDictionary.TryGetValue(cargo.BelongSkuId, out long schemeId)) { if (cargo.SchemeId != schemeId) { throw new BusinessException($"订单sku{cargo.BelongSkuId}只允许使用一个采购方案进行下单"); } } } } schemeValidationDictionary.Clear(); #endregion var isRepurchase = fsql.Select(dbOrder.Id).Any(); var orderSkus = fsql.Select().Where(osku => osku.OrderId == request.OrderId).ToList(); var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == request.OrderId && opi.IsEnabled == true).ToList(); var orderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == request.OrderId && ocd.IsEnabled == true).ToList(); var orderSkuCostList = fsql.Select().Where(osc => osc.OrderId == request.OrderId).ToList(); foreach (var cargoParamGroup in request.CargoParamGroupList) { var purchaseOrder = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaserId == cargoParamGroup.PurchaserId); if (purchaseOrder != null) { foreach (var cargoParam in cargoParamGroup.CargoParamList) { if (purchaseOrder.BelongSkuIds.Contains(cargoParam.BelongSkuId)) { //throw new BusinessException($"订单sku[{cargoParam.BelongSkuId}]已经存在同一个商家[{cargoParamGroup.PurchaserId}][{cargoParamGroup.PurchaserName}]的另一笔采购单中[{purchaseOrder.PurchaseOrderId}],请不要为同一笔订单sku进行同商家采购"); throw new BusinessException($"提示:请勿为同一个订单中的sku重复向同一个商家下采购单\r\n重复信息:\r\n- 订单sku:{cargoParam.BelongSkuId}\r\n- 商家:{cargoParamGroup.PurchaserName}"); } } } } var extJArray = JsonConvert.DeserializeObject(request.Extensions); List insertOrderCostDetails = new List(); List insertOrderPurchaseInfos = new List(); List insertOrderPurchaseSkuInfos = new List(); List> updatePurchaseSchemeList = new List>(); List insertOrderPurchaseRelationInfoList = new List(); List updatePurchaseTimeLimitTaskOrderSkuList = new List(); List notifyQikuPackSchemeParamList = null; if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越) notifyQikuPackSchemeParamList = new List(); IInsert insertOrderCost = null; IUpdate updateOrderCost = null; List insertOrderSkuCostList = new List(); IList> updateOrderSkuCostList = new List>(); List createdPurchaseOrderItemList = new List(); foreach (var cargoParamGroup in request.CargoParamGroupList) { var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == cargoParamGroup.PurchasePlatform); if (purchaseAccount == null) throw new BusinessException($"缺少{cargoParamGroup.PurchasePlatform}采购平台账号,请在店铺配置中设置"); var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)cargoParamGroup.PurchasePlatform); var extJson = extJArray.FirstOrDefault(j => j.Value("PurchaserId") == cargoParamGroup.PurchaserId); var orderProductParamList = CombineRepeatPurchaseSku(cargoParamGroup.CargoParamList); var createOrderResponse = client.CreateOrder(new PP_CreateOrderRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, Consignee = new PP_ConsigneeRequest() { Address = request.Consignee.Address, City = request.Consignee.City, ContactName = request.Consignee.ContactName, County = request.Consignee.County, Mobile = request.Consignee.Mobile, Province = request.Consignee.Province, TelePhone = request.Consignee.TelePhone, Town = request.Consignee.Town }, Platform = (AdapterEnums.PlatformType)purchaseAccount.PurchasePlatformId, PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode, Extensions = extJson.Value("OrderTradeTypeCode"), Remark = !string.IsNullOrEmpty(cargoParamGroup.Remark) ? cargoParamGroup.Remark : request.Remark, OrderProductParamList = orderProductParamList }); var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, OrderId = createOrderResponse.OrderId }); createdPurchaseOrderItemList.AddRange(purchaseOrderSimpleInfo.ItemList); //totalPurchaseProductAmount += purchaseOrderSimpleInfo.ProductAmount; //totalPurchaseFreight += purchaseOrderSimpleInfo.FreightAmount; #region 创建订单采购关系 foreach (var cargoParam in cargoParamGroup.CargoParamList) { var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == cargoParam.BelongSkuId); insertOrderPurchaseRelationInfoList.Add(new OrderPurchaseRelationInfo() { Id = idGenerator.NewLong(), BelongSkuId = cargoParam.BelongSkuId, CreateTime = DateTime.Now, OrderId = request.OrderId, PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, PurchaseProductId = cargoParam.ProductId, PurchaseSkuId = cargoParam.SkuId, PurchaseSpecId = cargoParam.SpecId, Quantity = cargoParam.Quantity, SchemeId = cargoParam.SchemeId, SourceSkuId = orderSku?.BelongSkuId, SchemeVersion = cargoParam.SchemeVersion ?? 1 }); } #endregion #region 等比计算采购成本 var proportionalCalculationResultList = ProportionalCalculationCost(cargoParamGroup.CargoParamList, purchaseOrderSimpleInfo); foreach (var proportionalCalculationResult in proportionalCalculationResultList) { var skuId = proportionalCalculationResult.SkuId; var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == skuId); var orderCostDetail = new OrderCostDetail() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, DeductionQuantity = orderSku.ItemTotal.Value, OrderId = request.OrderId, ProductId = orderSku.ProductId, PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, SkuId = skuId, IsEnabled = true }; orderCostDetail.CalculationOrderCostDetailCostAndProfit(proportionalCalculationResult.ProductAmount, proportionalCalculationResult.FreightAmount, 0M, 0M); insertOrderCostDetails.Add(orderCostDetail); } #endregion #region 采购订单信息 var belongSkuIdList = cargoParamGroup.CargoParamList.Select(c => c.BelongSkuId).Distinct().ToList(); var orderPurchaserInfo = new OrderPurchaseInfo() { Id = idGenerator.NewLong(), OrderId = request.OrderId, CreateTime = DateTime.Now, PurchaseAccountId = purchaseAccount.Id, PurchaseAccountName = purchaseAccount.AccountName, PurchaseMethod = Enums.PurchaseMethod.线上采购, OrderState = Enums.PurchaseOrderState.待发货, PurchaseOrderId = createOrderResponse.OrderId, PurchasePlatform = cargoParamGroup.PurchasePlatform, PurchaserId = cargoParamGroup.PurchaserId, PurchaserName = cargoParamGroup.PurchaserName, ShopId = request.ShopId, BelongSkuIds = string.Join(",", belongSkuIdList), IsEnabled = true, Remark = !string.IsNullOrEmpty(cargoParamGroup.Remark) ? cargoParamGroup.Remark : request.Remark }; insertOrderPurchaseInfos.Add(orderPurchaserInfo); #endregion #region 采购订单Sku信息 foreach (var purchaseOrderSku in purchaseOrderSimpleInfo.ItemList) { var orderPurchaseSkuInfo = new OrderPurchaseSkuInfo() { Id = purchaseOrderSku.OrderSkuId, CreateTime = DateTime.Now, OrderId = request.OrderId, PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, PurchaseProductId = purchaseOrderSku.ProductId, PurchaseSkuId = purchaseOrderSku.SkuId, ShopId = request.ShopId }; insertOrderPurchaseSkuInfos.Add(orderPurchaseSkuInfo); } #endregion #region 采购限时任务 foreach (var belongSkuId in belongSkuIdList) { if (!updatePurchaseTimeLimitTaskOrderSkuList.Any(x => x == belongSkuId)) updatePurchaseTimeLimitTaskOrderSkuList.Add(belongSkuId); } #endregion #region 封装查询齐库合格证接口参数 if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越) { foreach (var belongSkuId in belongSkuIdList) //订单skuId { var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == belongSkuId); if (orderSku == null) continue; var cargoParam = cargoParamGroup.CargoParamList.FirstOrDefault(c => c.BelongSkuId == belongSkuId); if (cargoParam == null) continue; if (!notifyQikuPackSchemeParamList.Any(x => x.SkuId == orderSku.BelongSkuId)) { notifyQikuPackSchemeParamList.Add(new QiKuPackTaskSkuPurchaseSchemeIdRequest() { SkuId = orderSku.BelongSkuId, SkuPurchaseSchemeId = cargoParam.SchemeId.ToString() }); } } } #endregion } #region 更新采购方案最近采购价格 { var allCargoParamList = new List(); request.CargoParamGroupList.ForEach(x => allCargoParamList.AddRange(x.CargoParamList)); var cargoParamGroupsBySchemeList = allCargoParamList.GroupBy(c => c.SchemeId); foreach (var cargoParamGroupsByScheme in cargoParamGroupsBySchemeList) { var defalutCost = 0M; var schemeId = cargoParamGroupsByScheme.Key; defalutCost = cargoParamGroupsByScheme.Sum(cargoParam => createdPurchaseOrderItemList.Where(x => x.SkuId == cargoParam.SkuId) .Select(x => x.Price * (cargoParam.PurchaseRatio ?? 1)).DefaultIfEmpty(0M).First()); var update = fsql.Update(schemeId).Set(ps => ps.LastPurchaseTime, DateTime.Now) .Set(ps => ps.LastPurchasePriceCost, defalutCost); updatePurchaseSchemeList.Add(update); } } #endregion #region 订单Sku成本 var allOrderCostDetail = orderCostDetailList.Union(insertOrderCostDetails).ToList(); foreach (var orderSku in orderSkus) { var orderSkuCost = orderSkuCostList.FirstOrDefault(osc => osc.SkuId == orderSku.SkuId); if (orderSkuCost == null) { orderSkuCost = new OrderSkuCost() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, OrderId = request.OrderId, SkuId = orderSku.SkuId }; orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, allOrderCostDetail); insertOrderSkuCostList.Add(orderSkuCost); } else { orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, allOrderCostDetail); var update = fsql.Update().SetSource(orderSkuCost); updateOrderSkuCostList.Add(update); } } #endregion #region 订单成本 var orderCost = new OrderCost() { OrderId = request.OrderId, CreateTime = DateTime.Now, IsManualEdited = false }; //var totalPurchaseProductAmount = orderCostDetailList.Union(insertOrderCostDetails).Sum(ocd => ocd.SkuAmount); //var totalPurchaseFreight = orderCostDetailList.Union(insertOrderCostDetails).Sum(ocd => ocd.PurchaseFreight); //orderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, // totalPurchaseProductAmount ?? 0M, // totalPurchaseFreight ?? 0M, // 0M, // 0M); orderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, orderSkuCostList.Union(insertOrderSkuCostList).ToList()); if (!isRepurchase) { insertOrderCost = fsql.Insert(orderCost); } else { updateOrderCost = fsql.Update().SetSource(orderCost).IgnoreColumns(a => new { a.CreateTime }); } #endregion #region 订单状态 dbOrder.CalculationOrderState(fsql, orderSkus, orderPurchaseInfoList.Union(insertOrderPurchaseInfos).ToList()); #endregion #region 通知C端状态 Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion #region 查询齐库合格证 if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越 && notifyQikuPackSchemeParamList != null && notifyQikuPackSchemeParamList.Count() > 0) { Task.Factory.StartNew(() => qiKuManager.SearchCerConfigured(dbOrder, notifyQikuPackSchemeParamList, orderSkus), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } #endregion fsql.Transaction(() => { if (updatePurchaseTimeLimitTaskOrderSkuList.Count() > 0) { fsql.Update().Set(t => t.CompletionTime, DateTime.Now) .SetIf(dbOrder.PayTime != null, t => t.IsTimely == (DateTime.Now < t.ExpirationTime ? true : false)) .Where(t => t.OrderId == request.OrderId) .Where(t => updatePurchaseTimeLimitTaskOrderSkuList.Contains(t.SkuId)) .Where(t => t.CompletionTime == null) .Where(t => t.TaskType == Enums.TimeLimitTaskType.采购任务) .ExecuteAffrows(); } if (insertOrderCostDetails.Count() > 0) fsql.Insert(insertOrderCostDetails).ExecuteAffrows(); if (insertOrderPurchaseInfos.Count() > 0) fsql.Insert(insertOrderPurchaseInfos).ExecuteAffrows(); if (insertOrderPurchaseSkuInfos.Count() > 0) fsql.Insert(insertOrderPurchaseSkuInfos).ExecuteAffrows(); if (insertOrderPurchaseRelationInfoList.Count() > 0) fsql.Insert(insertOrderPurchaseRelationInfoList).ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); insertOrderCost?.ExecuteAffrows(); if (updatePurchaseSchemeList.Count() > 0) { foreach (var update in updatePurchaseSchemeList) update.ExecuteAffrows(); } fsql.Update(request.OrderId).Set(o => o.OrderState, dbOrder.OrderState) .SetIf(!string.IsNullOrEmpty(request.Remark), o => o.PurchaseRemark, request.Remark) .Set(o => o.IsPurchased, true) .ExecuteAffrows(); if (insertOrderSkuCostList.Count() > 0) fsql.Insert(insertOrderSkuCostList).ExecuteAffrows(); if (updateOrderSkuCostList.Count() > 0) { foreach (var update in updateOrderSkuCostList) update.ExecuteAffrows(); } }); //#region 更新采购方案最新价格 //Task.Factory.StartNew(() => //{ // try // { // purchaseSchemeBusiness.RefreshPurchaseScheme(new RefreshSchemeRequest() // { // SchemeIdList = updatePurchaseTimeSchemeIdList // }); // } // catch { } //}, CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); //#endregion } /// /// 获取关联订单列表 /// /// /// public IList GetAssociationPurchaseOrderList(string orderId) { IList list = new List(); var purchaseOrderList = fsql.Select().Where(opi => opi.OrderId == orderId).ToList(); var orderSkuList = fsql.Select().Where(osku => osku.OrderId == orderId).ToList(); var orderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == orderId).ToList(); foreach (var purchaseOrder in purchaseOrderList) { var associationPurchaseOrder = new AssociationPurchaseOrderResponse() { PurchaseAccountId = purchaseOrder.PurchaseAccountId, PurchaseAccountName = purchaseOrder.PurchaseAccountName, PurchasePlatform = purchaseOrder.PurchasePlatform.Value, PurchaserId = purchaseOrder.PurchaserId, PurchaserName = purchaseOrder.PurchaserName, PurchaseOrderId = purchaseOrder.PurchaseOrderId, IsEnabled = purchaseOrder.IsEnabled, PurchaseMethod = purchaseOrder.PurchaseMethod.Value }; var currentOrderCostDetailList = orderCostDetailList.Where(ocd => ocd.PurchaseOrderId == purchaseOrder.PurchaseOrderId).ToList(); foreach (var orderCostDetail in currentOrderCostDetailList) { var orderSku = orderSkuList.FirstOrDefault(osku => osku.SkuId == orderCostDetail.SkuId); var assocationOrderCostDetail = new AssocationOrderCostDetailResponse() { Id = orderCostDetail.Id, Logo = orderSku.Logo, Title = orderSku.Title, OrderId = orderSku.OrderId, SkuId = orderSku.SkuId, PurchaseQuantity = orderCostDetail.DeductionQuantity ?? 0, PurchaseFreight = orderCostDetail.PurchaseFreight ?? 0M, SkuAmount = orderCostDetail.SkuAmount ?? 0M, }; if (assocationOrderCostDetail.PurchaseQuantity != 0) assocationOrderCostDetail.PurchasePrice = assocationOrderCostDetail.SkuAmount / assocationOrderCostDetail.PurchaseQuantity; associationPurchaseOrder.AssocationOrderCostDetailList.Add(assocationOrderCostDetail); } associationPurchaseOrder.PurchaseAmount = associationPurchaseOrder.AssocationOrderCostDetailList.Sum(x => x.SkuAmount); associationPurchaseOrder.PurchaseFreight = associationPurchaseOrder.AssocationOrderCostDetailList.Sum(x => x.PurchaseFreight); list.Add(associationPurchaseOrder); } return list; } /// /// 关联订单 /// /// public void AssociatePurchaseOrder(AssociationOrderRequest request) { nLogManager.Default().Info($"AssociatePurchaseOrder {JsonConvert.SerializeObject(request)}"); #region 数据验证 var dbOrder = fsql.Select(request.OrderId).ToOne(); if (dbOrder == null) throw new BusinessException("订单不存在"); if (cantPurchaseOrderStateList.Contains(dbOrder.OrderState.Value)) throw new BusinessException($"当前订单状态:{dbOrder.OrderState},不允许关联"); if (request.AssociationPurchaseOrderList == null || request.AssociationPurchaseOrderList.Count() == 0) throw new BusinessException("缺少采购单信息"); var validation_groups_pid = request.AssociationPurchaseOrderList.GroupBy(po => po.PurchaseOrderId); if (validation_groups_pid.Any(x => x.Count() > 1)) throw new BusinessException("不允许包含重复的采购单"); foreach (var apo in request.AssociationPurchaseOrderList) { if (Math.Abs(apo.PurchaseAmount - apo.AssocationOrderCostDetailList.Sum(aocd => aocd.SkuAmount)) > 1) throw new BusinessException($"采购单{apo.PurchaseOrderId}的采购货款与明细采购货款总和误差不能超过1"); } var purchaseOrderIds = request.AssociationPurchaseOrderList.Select(apo => apo.PurchaseOrderId).ToList(); var dbPurchaseOrderList = fsql.Select().Where(opi => purchaseOrderIds.Contains(opi.PurchaseOrderId)).ToList(); if (dbPurchaseOrderList.Count() > 0) { if (dbPurchaseOrderList.Any(opi => opi.OrderId != request.OrderId)) { var otherUsePurchaseOrder = dbPurchaseOrderList.FirstOrDefault(opi => opi.OrderId != request.OrderId); throw new BusinessException($"采购单{otherUsePurchaseOrder.PurchaseOrderId}的已经被其他订单{otherUsePurchaseOrder.OrderId}绑定"); } if (dbPurchaseOrderList.Any(opi => opi.OrderState == Enums.PurchaseOrderState.已取消)) { var invalidPurchaseOrder = dbPurchaseOrderList.FirstOrDefault(opi => opi.OrderState == Enums.PurchaseOrderState.已取消); throw new BusinessException($"采购单{invalidPurchaseOrder.PurchaseOrderId}已失效,不能参与绑定"); } } #endregion #region 读取采购单中的采购账号/采购方案 IList purchaseAccountIdList = request.AssociationPurchaseOrderList.Select(x => string.IsNullOrEmpty(x.PurchaseAccountId) ? x.PurchaseAccountName : x.PurchaseAccountId).Distinct().ToList(); IList dbPurchaseAccountList = null; if (purchaseAccountIdList.Count() > 0) { dbPurchaseAccountList = fsqlManager.MDSfsql.Select().Where(pa => purchaseAccountIdList.Contains(pa.Id) || purchaseAccountIdList.Contains(pa.AccountName)).ToList(); } #endregion var dbOrderSkuList = fsql.Select().Where(osku => osku.OrderId == request.OrderId).ToList(); var dbOrderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == request.OrderId && ocd.IsEnabled == true).ToList(); var dbOrderCost = fsql.Select(request.OrderId).ToOne(); var dbOrderSkuCostList = fsql.Select().Where(osc => osc.OrderId == request.OrderId).ToList(); List insertOrderPurchaseInfoList = new List(); List insertOrderPurchaseSkuInfoList = new List(); List insertOrderPurchaseRelationInfoList = new List(); IList> updateOrderPurchaseInfoList = new List>(); List insertOrderCostDetailList = new List(); IList> updateOrderCostDetailList = new List>(); IInsert insertOrderCost = null; IUpdate updateOrderCost = null; List insertOrderSkuCostList = new List(); IList> updateOrderSkuCostList = new List>(); List updatePurchaseTimeLimitTaskOrderSkuList = new List(); List notifyQikuPackSchemeParamList = new List(); foreach (var purchaseOrder in request.AssociationPurchaseOrderList) { //if (dbInvalidPurchaseOrderIdList.Contains(purchaseOrder.PurchaseOrderId)) // continue; var totalQuantity = purchaseOrder.AssocationOrderCostDetailList.Sum(x => x.PurchaseQuantity); var dbPurchaserOrder = dbPurchaseOrderList.FirstOrDefault(x => x.PurchaseOrderId == purchaseOrder.PurchaseOrderId); if (dbPurchaserOrder == null) { if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴) { #region 补齐采购SKU和采购关系 var purchaseAccount = dbPurchaseAccountList.FirstOrDefault(pa => pa.Id == purchaseOrder.PurchaseAccountId || pa.AccountName == purchaseOrder.PurchaseAccountName); if (purchaseAccount == null) throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId}缺少有效的采购账号"); #region 查询1688采购单 var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)purchaseOrder.PurchasePlatform); var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, OrderId = purchaseOrder.PurchaseOrderId }); #endregion #region 处理采购商Id var purchaserId = purchaseOrderSimpleInfo.PurchaserId; if (string.IsNullOrEmpty(purchaserId)) throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId}缺少采购商Id"); purchaserId = purchaserId.Replace("b2b-", string.Empty); var purchaserId2 = purchaserId.Substring(0, purchaserId.Length - 5); var purchaserIds = new List() { purchaserId, purchaserId2 }; var dbPurchaser = fsql.Select().Where(p => p.Platform == Enums.Platform.阿里巴巴 && (purchaserIds.Contains(p.Id) || purchaserIds.Contains(p.Id2))).ToOne(); if (dbPurchaser == null) throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId}缺少有效采购商"); purchaserId = dbPurchaser.Id; if (string.IsNullOrEmpty(purchaseOrder.PurchaserId)) purchaseOrder.PurchaserId = purchaserId; #endregion #region 匹配采购方案 var skuIds = purchaseOrder.AssocationOrderCostDetailList.Select(ocd => ocd.SkuId).ToList(); var purchaseSchemeList = purchaseSchemeBusiness.GetPurchaseSchemeList(new QuerySchemeRequest() { ShopId = dbOrder.ShopId, SkuIdList = skuIds }); if (purchaseSchemeList.Count() == 0) throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId} 采购商Id{purchaserId} 未匹配到采购方案"); #endregion #region 补齐采购关系 foreach (var assOrderCostDetail in purchaseOrder.AssocationOrderCostDetailList) { var matchResultList = MatchPurchaseScheme(assOrderCostDetail.SkuId, assOrderCostDetail.PurchaseQuantity, purchaserId, purchaseSchemeList, purchaseOrderSimpleInfo); if (matchResultList.Count() == 0) throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId} 采购商Id {purchaserId} Sku{assOrderCostDetail.SkuId}缺少采购方案"); foreach (var cargoParam in matchResultList) { var dbOrderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == assOrderCostDetail.SkuId); var orderPurchaseRelationInfo = new OrderPurchaseRelationInfo() { Id = idGenerator.NewLong(), BelongSkuId = assOrderCostDetail.SkuId, CreateTime = DateTime.Now, OrderId = assOrderCostDetail.OrderId, PurchaseOrderId = purchaseOrder.PurchaseOrderId, PurchaseSkuId = cargoParam.SkuId, PurchaseProductId = cargoParam.ProductId, PurchaseSpecId = cargoParam.SpecId, SchemeId = cargoParam.SchemeId, SchemeVersion = cargoParam.SchemeVersion ?? 1, Quantity = assOrderCostDetail.PurchaseQuantity, SourceSkuId = dbOrderSku.BelongSkuId }; insertOrderPurchaseRelationInfoList.Add(orderPurchaseRelationInfo); } } #region 补齐采购SKU foreach (var purchaseOrderSku in purchaseOrderSimpleInfo.ItemList) { var orderPurchaseSkuInfo = new OrderPurchaseSkuInfo() { Id = purchaseOrderSku.OrderSkuId, CreateTime = DateTime.Now, OrderId = request.OrderId, PurchaseOrderId = purchaseOrder.PurchaseOrderId, PurchaseProductId = purchaseOrderSku.ProductId, PurchaseSkuId = purchaseOrderSku.SkuId, ShopId = request.ShopId }; insertOrderPurchaseSkuInfoList.Add(orderPurchaseSkuInfo); } #endregion #endregion #endregion } #region 订单成本明细 foreach (var assOrderCostDetail in purchaseOrder.AssocationOrderCostDetailList) { var dbOrderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == assOrderCostDetail.SkuId); var purchaseFreight = purchaseOrder.PurchaseFreight * (1.0M * assOrderCostDetail.PurchaseQuantity / totalQuantity); var orderCostDetail = new OrderCostDetail() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, DeductionQuantity = assOrderCostDetail.PurchaseQuantity, IsEnabled = true, OrderId = request.OrderId, ProductId = dbOrderSku.ProductId, SkuId = assOrderCostDetail.SkuId, PurchaseOrderId = purchaseOrder.PurchaseOrderId }; orderCostDetail.CalculationOrderCostDetailCostAndProfit(assOrderCostDetail.SkuAmount, purchaseFreight, 0M, 0M); insertOrderCostDetailList.Add(orderCostDetail); } #endregion #region 采购单 dbPurchaserOrder = new OrderPurchaseInfo() { Id = idGenerator.NewLong(), OrderId = request.OrderId, PurchaseAccountId = purchaseOrder.PurchaseAccountId, PurchaseAccountName = purchaseOrder.PurchaseAccountName, IsEnabled = true, BelongSkuIds = string.Join(",", purchaseOrder.AssocationOrderCostDetailList.Select(x => x.SkuId)), CreateTime = DateTime.Now, PurchaseMethod = Enums.PurchaseMethod.关联外部单, OrderState = Enums.PurchaseOrderState.待发货, PurchaseOrderId = purchaseOrder.PurchaseOrderId, PurchasePlatform = purchaseOrder.PurchasePlatform, PurchaserId = purchaseOrder.PurchaserId, PurchaserName = purchaseOrder.PurchaserName, ShopId = request.ShopId }; insertOrderPurchaseInfoList.Add(dbPurchaserOrder); #endregion #region 采购限时任务 foreach (var ocd in purchaseOrder.AssocationOrderCostDetailList) { if (!updatePurchaseTimeLimitTaskOrderSkuList.Any(x => x == ocd.SkuId)) updatePurchaseTimeLimitTaskOrderSkuList.Add(ocd.SkuId); } #endregion #region 封装查询齐库合格证参数 if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越) { if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴) { var waitList = insertOrderPurchaseRelationInfoList.Where(r => !notifyQikuPackSchemeParamList.Any(x => x.SkuId == r.SourceSkuId && x.SkuPurchaseSchemeId == r.SchemeId?.ToString())) .Select(r => new QiKuPackTaskSkuPurchaseSchemeIdRequest() { SkuId = r.SourceSkuId, SkuPurchaseSchemeId = r.SchemeId?.ToString() }).ToList(); if (waitList != null && waitList.Count() > 0) notifyQikuPackSchemeParamList.AddRange(waitList); } else { foreach (var ocd in purchaseOrder.AssocationOrderCostDetailList) { var orderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == ocd.SkuId); if (orderSku == null) continue; if (!notifyQikuPackSchemeParamList.Any(x => x.SkuId == orderSku.BelongSkuId)) notifyQikuPackSchemeParamList.Add(new QiKuPackTaskSkuPurchaseSchemeIdRequest() { SkuId = orderSku.BelongSkuId, SkuPurchaseSchemeId = null }); } } } #endregion } else { if (dbPurchaserOrder.OrderId != request.OrderId) throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId}不属于订单{request.OrderId}"); dbPurchaserOrder.PurchaseAccountId = purchaseOrder.PurchaseAccountId; dbPurchaserOrder.PurchaseAccountName = purchaseOrder.PurchaseAccountName; //dbPurchaserOrder.BelongSkuIds = string.Join(",", purchaseOrder.AssocationOrderCostDetailList.Select(x => x.SkuId)); dbPurchaserOrder.PurchasePlatform = purchaseOrder.PurchasePlatform; if (!string.IsNullOrEmpty(purchaseOrder.PurchaserId) && purchaseOrder.PurchaserId != dbPurchaserOrder.PurchaserId) dbPurchaserOrder.PurchaserId = purchaseOrder.PurchaserId; if (!string.IsNullOrEmpty(purchaseOrder.PurchaserName) && purchaseOrder.PurchaserName != dbPurchaserOrder.PurchaserName) dbPurchaserOrder.PurchaserName = purchaseOrder.PurchaserName; updateOrderPurchaseInfoList.Add(fsql.Update().SetSource(dbPurchaserOrder)); foreach (var assOrderCostDetail in purchaseOrder.AssocationOrderCostDetailList) { var dbOrderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == assOrderCostDetail.SkuId); var orderCostDetail = dbOrderCostDetailList.FirstOrDefault(ocd => ocd.SkuId == assOrderCostDetail.SkuId && ocd.PurchaseOrderId == purchaseOrder.PurchaseOrderId); var purchaseFreight = purchaseOrder.PurchaseFreight * (1.0M * assOrderCostDetail.PurchaseQuantity / totalQuantity); var isOcdEmpty = orderCostDetail == null; if (isOcdEmpty) { orderCostDetail = new OrderCostDetail() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, DeductionQuantity = assOrderCostDetail.PurchaseQuantity, IsEnabled = true, OrderId = request.OrderId, ProductId = dbOrderSku.ProductId, SkuId = assOrderCostDetail.SkuId, PurchaseOrderId = purchaseOrder.PurchaseOrderId, ShopId = request.ShopId }; } orderCostDetail.DeductionQuantity = assOrderCostDetail.PurchaseQuantity; orderCostDetail.CalculationOrderCostDetailCostAndProfit(assOrderCostDetail.SkuAmount, purchaseFreight, orderCostDetail.OutPackAmount ?? 0M, orderCostDetail.DeliveryExpressFreight ?? 0M); if (isOcdEmpty) insertOrderCostDetailList.Add(orderCostDetail); else updateOrderCostDetailList.Add(fsql.Update().SetSource(orderCostDetail)); } } } #region 订单Sku成本 var allOrderCostDetail = dbOrderCostDetailList.Union(insertOrderCostDetailList).ToList(); foreach (var orderSku in dbOrderSkuList) { var orderSkuCost = dbOrderSkuCostList.FirstOrDefault(osc => osc.SkuId == orderSku.SkuId); if (orderSkuCost == null) { orderSkuCost = new OrderSkuCost() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, OrderId = request.OrderId, SkuId = orderSku.SkuId }; orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, allOrderCostDetail); insertOrderSkuCostList.Add(orderSkuCost); } else { orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, allOrderCostDetail); var update = fsql.Update().SetSource(orderSkuCost); updateOrderSkuCostList.Add(update); } } #endregion #region 订单成本 var dbOrderCostIsEmpty = dbOrderCost == null; if (dbOrderCostIsEmpty) { dbOrderCost = new OrderCost() { OrderId = request.OrderId, IsManualEdited = false, CreateTime = DateTime.Now }; } dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, dbOrderSkuCostList.Union(insertOrderSkuCostList).ToList()); //var totalPurchaseProductAmount = request.AssociationPurchaseOrderList.Sum(x => x.PurchaseAmount); //var totalPurchaseFreight = request.AssociationPurchaseOrderList.Sum(x => x.PurchaseFreight); //var totalOutPackAmount = dbOrderCostDetailList.Sum(ocd => ocd.OutPackAmount); //dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, // totalPurchaseProductAmount, // totalPurchaseFreight, // totalOutPackAmount ?? 0M, // 0M); if (dbOrderCostIsEmpty) insertOrderCost = fsql.Insert(dbOrderCost); else updateOrderCost = fsql.Update().SetSource(dbOrderCost); #endregion #region 订单状态 dbOrder.CalculationOrderState(fsql, dbOrderSkuList, dbPurchaseOrderList.Union(insertOrderPurchaseInfoList).ToList()); #endregion #region 通知C端状态 Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion #region 查询齐库合格证 if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越 && notifyQikuPackSchemeParamList.Count() > 0) { Task.Factory.StartNew(() => qiKuManager.SearchCerConfigured(dbOrder, notifyQikuPackSchemeParamList, dbOrderSkuList), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } #endregion fsql.Transaction(() => { if (insertOrderPurchaseInfoList.Count() > 0) fsql.Insert(insertOrderPurchaseInfoList).ExecuteAffrows(); if (insertOrderPurchaseSkuInfoList.Count() > 0) fsql.Insert(insertOrderPurchaseSkuInfoList).ExecuteAffrows(); if (insertOrderPurchaseRelationInfoList.Count() > 0) fsql.Insert(insertOrderPurchaseRelationInfoList).ExecuteAffrows(); if (updatePurchaseTimeLimitTaskOrderSkuList.Count() > 0) { fsql.Update().Set(t => t.CompletionTime, DateTime.Now) .SetIf(dbOrder.PayTime != null, t => t.IsTimely == (DateTime.Now < t.ExpirationTime ? true : false)) .Where(t => t.OrderId == request.OrderId) .Where(t => updatePurchaseTimeLimitTaskOrderSkuList.Contains(t.SkuId)) .Where(t => t.CompletionTime == null) .Where(t => t.TaskType == Enums.TimeLimitTaskType.采购任务) .ExecuteAffrows(); } if (updateOrderPurchaseInfoList.Count() > 0) { foreach (var update in updateOrderPurchaseInfoList) update.ExecuteAffrows(); } if (insertOrderCostDetailList.Count() > 0) fsql.Insert(insertOrderCostDetailList).ExecuteAffrows(); if (updateOrderCostDetailList.Count() > 0) { foreach (var update in updateOrderCostDetailList) update.ExecuteAffrows(); } insertOrderCost?.ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); fsql.Update(dbOrder.Id).Set(o => o.OrderState, dbOrder.OrderState) .Set(o => o.IsPurchased, true) .ExecuteAffrows(); if (insertOrderSkuCostList.Count() > 0) fsql.Insert(insertOrderSkuCostList).ExecuteAffrows(); if (updateOrderSkuCostList.Count() > 0) { foreach (var update in updateOrderSkuCostList) update.ExecuteAffrows(); } }); } /// /// 预览关联订单信息(不支持关联预览的平台会返回null) /// /// public AssociationPurchaseOrderResponse PreviewAssocationPurchaseOrder(AssocationPurchaseOrderPreviewRequest request) { if (request.PurchasePlatform != Enums.Platform.阿里巴巴) return null; var order = fsql.Select(request.OrderId).ToOne(); if (order == null) throw new BusinessException("订单不存在"); var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.PurchasePlatform); var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() { AppKey = request.PurchaseAccount.AppKey, AppSecret = request.PurchaseAccount.AppSecret, AppToken = request.PurchaseAccount.AppToken, OrderId = request.PurchaseOrderId }); #region 处理采购商Id var purchaserId = purchaseOrderSimpleInfo.PurchaserId; if (string.IsNullOrEmpty(purchaserId)) throw new BusinessException($"采购单{request.PurchaseOrderId}缺少采购商Id"); purchaserId = purchaserId.Replace("b2b-", string.Empty); var purchaserId2 = purchaserId.Substring(0, purchaserId.Length - 5); var purchaserIds = new List() { purchaserId, purchaserId2 }; var dbPurchaser = fsql.Select().Where(p => p.Platform == Enums.Platform.阿里巴巴 && (purchaserIds.Contains(p.Id) || purchaserIds.Contains(p.Id2))).ToOne(); if (dbPurchaser == null) throw new BusinessException($"采购单{request.PurchaseOrderId}缺少有效采购商"); purchaserId = dbPurchaser.Id; #endregion #region 查询订单Sku var dbOrderSkuList = fsql.Select().Where(osku => osku.OrderId == request.OrderId).ToList(); if (dbOrderSkuList.Count() == 0) throw new BusinessException("缺少订单sku信息"); #endregion #region 查询订单sku所有采购方案 var skuIds = dbOrderSkuList.Select(osku => osku.SkuId).ToList(); var purchaseSchemeList = purchaseSchemeBusiness.GetPurchaseSchemeList(new QuerySchemeRequest() { ShopId = order.ShopId, SkuIdList = skuIds }); if (purchaseSchemeList.Count() == 0) throw new BusinessException("未匹配到采购方案"); #endregion #region 匹配采购单所使用到的采购方案 var cargoParamList = new List(); foreach (var orderSku in dbOrderSkuList) { var matchResultList = MatchPurchaseScheme(orderSku.SkuId, orderSku.ItemTotal ?? 1, purchaserId, purchaseSchemeList, purchaseOrderSimpleInfo); if (matchResultList.Count() > 0) cargoParamList.AddRange(matchResultList); } if (cargoParamList.Count() == 0) throw new BusinessException("未匹配到采购方案"); #endregion #region 等比计算采购成本 var assocationOrderCostDetailList = new List(); //var belongSkuGroups = cargoParamList.GroupBy(p => p.BelongSkuId); //var purchaseSkuTotalQuantity = cargoParamList.Sum(x => x.Quantity); //foreach (var belongSkuGroup in belongSkuGroups) //{ // var skuId = belongSkuGroup.Key; // //var currentOrderSkuCargoParamList = cargoParamList.Where(p => p.BelongSkuId == skuId); //找当前skuId的采购skuId // var currentOrderSkuCargoParamList = belongSkuGroup.ToList(); //找当前skuId的采购skuId // var currentSkuAmount = 0M; //采购成本 // var currentSkuTotalPurchaseQuantity = currentOrderSkuCargoParamList.Sum(x => x.Quantity); //当前skuId的采购数量总和 // var currentPurchaseFreight = purchaseOrderSimpleInfo.FreightAmount * // (1.0M * currentSkuTotalPurchaseQuantity / purchaseSkuTotalQuantity); //采购运费 // foreach (var currentOrderSkuCargo in currentOrderSkuCargoParamList) // { // var currentPurchaseSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) // .Sum(p => p.ProductAmount); // var currentPurchaseSkuTotalQuantity = cargoParamList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) // .Sum(p => p.Quantity); // currentSkuAmount += currentPurchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity / currentPurchaseSkuTotalQuantity); // } // var orderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == skuId); // var assocationOrderCostDetail = new AssocationOrderCostDetailResponse() // { // Logo = orderSku.Logo, // Title = orderSku.Title, // SkuId = skuId, // OrderId = orderSku.OrderId, // SkuAmount = currentSkuAmount, // PurchaseQuantity = orderSku.ItemTotal.Value, // PurchaseFreight = currentPurchaseFreight // }; // assocationOrderCostDetail.PurchasePrice = assocationOrderCostDetail.SkuAmount / assocationOrderCostDetail.PurchaseQuantity; // assocationOrderCostDetailList.Add(assocationOrderCostDetail); //} var proportionalCalculationResultList = ProportionalCalculationCost(cargoParamList, purchaseOrderSimpleInfo); foreach (var proportionalCalculationResult in proportionalCalculationResultList) { var skuId = proportionalCalculationResult.SkuId; var orderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == skuId); var assocationOrderCostDetail = new AssocationOrderCostDetailResponse() { Logo = orderSku.Logo, Title = orderSku.Title, SkuId = skuId, OrderId = orderSku.OrderId, SkuAmount = proportionalCalculationResult.ProductAmount, PurchaseQuantity = orderSku.ItemTotal.Value, PurchaseFreight = proportionalCalculationResult.FreightAmount }; assocationOrderCostDetail.PurchasePrice = assocationOrderCostDetail.SkuAmount / assocationOrderCostDetail.PurchaseQuantity; assocationOrderCostDetailList.Add(assocationOrderCostDetail); } if (assocationOrderCostDetailList.Count() == 0) throw new BusinessException("没有匹配到合适的采购方案"); #endregion return new AssociationPurchaseOrderResponse(assocationOrderCostDetailList) { PurchaserId = dbPurchaser.Id, PurchaserName = dbPurchaser.Name, PurchaseAccountId = request.PurchaseAccount.Id, PurchaseAccountName = request.PurchaseAccount.AccountName, PurchaseAmount = purchaseOrderSimpleInfo.ProductAmount, PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount, PurchaseMethod = Enums.PurchaseMethod.关联外部单, PurchaseOrderId = request.PurchaseOrderId, PurchasePlatform = request.PurchasePlatform, IsEnabled = true }; } /// /// 设置历史采购单 /// /// public void SetHistoryPurchaseOrder(SetHistoryPurchaseOrderRequest request) { nLogManager.Default().Info($"SetHistoryPurchaseOrder {JsonConvert.SerializeObject(request)}"); var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == request.OrderId && opi.IsEnabled == true).ToList(); var historyPurchaseOrder = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); if (historyPurchaseOrder == null) throw new BusinessException("未查询到采购单"); IList> updateOrderSkuCostList = new List>(); var dbOrderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == request.OrderId && ocd.PurchaseOrderId != request.PurchaseOrderId && ocd.IsEnabled == true).ToList(); var dbOrderSkuCostList = fsql.Select().Where(osc => osc.OrderId == request.OrderId).ToList(); var dbOrderCost = fsql.Select(request.OrderId).ToOne(); var dbOrder = fsql.Select(request.OrderId).ToOne(); var dbOrderSku = fsql.Select().Where(osku => osku.OrderId == request.OrderId).ToList(); foreach (var orderSkuCost in dbOrderSkuCostList) { var orderSku = dbOrderSku.FirstOrDefault(osku => osku.SkuId == orderSkuCost.SkuId); if (orderSku == null) continue; orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, dbOrderCostDetailList); updateOrderSkuCostList.Add(fsql.Update().SetSource(orderSkuCost)); } dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice ?? 0M, dbOrderSkuCostList); #region 找出失效的快递单 List deleteWaybillNoList = new List(); //查询该采购单所使用的快递单号 var useWaybillNos = fsql.Select().Where(eori => eori.PurchaseOrderId == historyPurchaseOrder.PurchaseOrderId).ToList(eori => eori.WayBillNo); //查询使用上述快递单号的快递单关系 var expressOrderRelationList = fsql.Select().Where(eori => useWaybillNos.Contains(eori.WayBillNo)).ToList(); //以快递单号进行分组 var expressOrderRelationGroups = expressOrderRelationList.GroupBy(eori => eori.WayBillNo); foreach (var group in expressOrderRelationGroups) { if (group.Count() == group.Count(eori => eori.PurchaseOrderId == historyPurchaseOrder.PurchaseOrderId)) deleteWaybillNoList.Add(group.Key); } #endregion orderPurchaseInfoList.Remove(historyPurchaseOrder); dbOrder.CalculationOrderState(fsql, orderPurchaseInfoList: orderPurchaseInfoList); fsql.Transaction(() => { if (request.IsDelete == true) { fsql.Delete(historyPurchaseOrder.Id).ExecuteAffrows(); } else { fsql.Update(historyPurchaseOrder.Id) .Set(opi => opi.IsEnabled, false) .Set(opi => opi.OrderState, Enums.PurchaseOrderState.已取消) .Set(opi => opi.HistorySettingTime, DateTime.Now) .Where(opi => opi.PurchaseOrderId == request.PurchaseOrderId) .ExecuteAffrows(); } fsql.Update() .Set(ocd => ocd.IsEnabled, false) .Where(ocd => ocd.PurchaseOrderId == request.PurchaseOrderId) .ExecuteAffrows(); fsql.Delete().Where(opsi => opsi.PurchaseOrderId == request.PurchaseOrderId).ExecuteAffrows(); fsql.Delete().Where(opri => opri.PurchaseOrderId == request.PurchaseOrderId).ExecuteAffrows(); fsql.Delete().Where(eori => eori.PurchaseOrderId == historyPurchaseOrder.PurchaseOrderId).ExecuteAffrows(); if (deleteWaybillNoList.Count() > 0) fsql.Delete(deleteWaybillNoList).ExecuteAffrows(); fsql.Delete().Where(i => i.OrderId == request.OrderId && i.PurchaseOrderId == request.PurchaseOrderId) .ExecuteAffrows(); fsql.Update().SetSource(dbOrderCost).ExecuteAffrows(); fsql.Update(dbOrder.Id).Set(o => o.OrderState, dbOrder.OrderState).ExecuteAffrows(); if (updateOrderSkuCostList.Count() > 0) { foreach (var update in updateOrderSkuCostList) update.ExecuteAffrows(); } }); } /// /// 修改采购快递单 /// /// public void EditPurchaseExpressOrder(EditPurchaseExpressOrderRequest request) { nLogManager.Default().Info($"EditPurchaseExpressOrder {JsonConvert.SerializeObject(request)}"); var dbOrder = fsql.Select(request.OrderId).ToOne(); if (dbOrder == null) throw new BusinessException($"订单号{request.OrderId}不存在"); var shopIds = dbOrder.ShopId.ToString(); var shop = fsqlManager.MDSfsql.Select().Where(s => s.ShopId == shopIds).ToOne(); var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == request.OrderId && opi.IsEnabled == true).ToList(); var purchaseOrder = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); if (purchaseOrder == null) throw new BusinessException($"未查询到采购单号{request.PurchaseOrderId}"); IInsert insertPEO = null; IInsert insertEORI = null; IDelete deleteEORI = null; IDelete deletePEO = null; IUpdate updatePurchaseOrderSku = null; IUpdate updatePurchaseOrder = null; IUpdate updateOrder = null; var waybillNos = new List() { request.OldWaybillNo, request.NewWaybillNo }; var expressOrderRelationList = fsql.Select().Where(eori => waybillNos.Contains(eori.WayBillNo)).ToList(); var oldWaybillNoRelationList = expressOrderRelationList.Where(eori => eori.WayBillNo == request.OldWaybillNo).ToList(); var newWaybillNoRelationList = expressOrderRelationList.Where(eori => eori.WayBillNo == request.NewWaybillNo).ToList(); #region 旧快递单号验证 if (!oldWaybillNoRelationList.Any()) throw new BusinessException("未查询到旧快递单号"); if (!oldWaybillNoRelationList.Any(eori => eori.PurchaseOrderId == request.PurchaseOrderId)) throw new BusinessException($"旧快递单号{request.OldWaybillNo}不属于采购单{request.PurchaseOrderId},无权修改"); if (oldWaybillNoRelationList.Count() == oldWaybillNoRelationList.Count(eori => eori.PurchaseOrderId == request.PurchaseOrderId)) deletePEO = fsql.Delete(request.OldWaybillNo); deleteEORI = fsql.Delete().Where(eori => eori.PurchaseOrderId == request.PurchaseOrderId && eori.WayBillNo == request.OldWaybillNo); #endregion #region 新快递单号验证 if (!newWaybillNoRelationList.Any(eori => eori.PurchaseOrderId == request.PurchaseOrderId)) { var eori = new ExpressOrderRelationInfo() { Id = idGenerator.NewLong(), OrderId = request.OrderId, PurchaseOrderId = request.PurchaseOrderId, CreateTime = DateTime.Now, ShopId = dbOrder.ShopId, WayBillNo = request.NewWaybillNo }; insertEORI = fsql.Insert(eori); } else throw new BusinessException("请勿重复为同一采购单设置相同的快递单号"); PurchaseExpressOrder newPeo = null; if (!newWaybillNoRelationList.Any()) { newPeo = new PurchaseExpressOrder() { WaybillNo = request.NewWaybillNo, TargetExpressId = request.NewExpressId, TargetExpressName = request.NewExpressName, CreateTime = DateTime.Now, ShopId = dbOrder.ShopId.Value, IsSubscribeKD100 = false, ExpressState = kuaiDi100Manager.GetExpressState(1) //快递100发货状态值 默认揽收 }; try { kuaiDi100Manager.SubscribeKuaiDi100(request.NewWaybillNo, request.NewExpressId, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish"); newPeo.IsSubscribeKD100 = true; } catch (Exception ex) { nLogManager.Default().Error(ex, $"EditPurchaseExpressOrder,Request:{JsonConvert.SerializeObject(request)}"); #region 订阅失败发送钉钉通知 var dingdingMsg = new StringBuilder(); dingdingMsg.AppendLine($"错误:{ex.Message}"); dingdingMsg.AppendLine($"采购订单号:{request.PurchaseOrderId}"); dingdingMsg.AppendLine($"拳探订单号:{request.OrderId}"); dingdingMsg.AppendLine($"拳探订单Sn:{dbOrder.OrderSn}"); dingdingMsg.AppendLine($"源物流公司:无"); dingdingMsg.AppendLine($"目标物流公司:{request.NewExpressName} {request.NewExpressId}"); dingdingMsg.AppendLine($"快递单号:{request.NewWaybillNo}"); dingdingMsg.AppendLine("触发环节:修改物流单号"); dingdingMsg.Append($"店铺名:{shop.ShopName}"); Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion } insertPEO = fsql.Insert(newPeo); } #endregion #region 更新采购sku使用的快递单号 IList orderPurchaseSkuList = null; if (purchaseOrder.PurchasePlatform == Enums.Platform.阿里巴巴) { orderPurchaseSkuList = fsql.Select().Where(posku => posku.PurchaseOrderId == request.PurchaseOrderId).ToList(); foreach (var posku in orderPurchaseSkuList) { if (posku.WaybillNo == request.OldWaybillNo) posku.WaybillNo = request.NewWaybillNo; } updatePurchaseOrderSku = fsql.Update().Set(psku => psku.WaybillNo, request.NewWaybillNo) .Where(psku => psku.PurchaseOrderId == request.PurchaseOrderId) .Where(psku => psku.WaybillNo == request.OldWaybillNo); } #endregion #region 计算采购单状态 var purchaseExpressOrderList = fsql.Select() .InnerJoin((eori, peo) => eori.WayBillNo == peo.WaybillNo) .Where((eori, peo) => eori.PurchaseOrderId == request.PurchaseOrderId).ToList((eori, peo) => new PurchaseExpressOrder { CreateTime = peo.CreateTime, ExpressContent = peo.ExpressContent, ExpressChangedTime = peo.ExpressChangedTime, ExpressState = peo.ExpressState, IsSubscribeKD100 = peo.IsSubscribeKD100, //OrderId = eori.OrderId, //PurchaseOrderId = eori.PurchaseOrderId, ShopId = eori.ShopId.Value, SourceExpressId = peo.SourceExpressId, SourceExpressName = peo.SourceExpressName, TargetExpressId = peo.TargetExpressId, TargetExpressName = peo.TargetExpressName, WaybillNo = peo.WaybillNo }); if (newPeo != null) purchaseExpressOrderList.Add(newPeo); var oldPurchaseOrderState = purchaseOrder.OrderState; purchaseOrder.CalculationOrderState(dbOrder.IntoStoreType.Value, fsql, orderPurchaseSkuList, purchaseExpressOrderList); if (oldPurchaseOrderState != purchaseOrder.OrderState) updatePurchaseOrder = fsql.Update(purchaseOrder.Id).Set(opi => opi.OrderState, purchaseOrder.OrderState); #endregion #region 计算订单状态 var oldOrderState = dbOrder.OrderState; dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); if (oldOrderState != dbOrder.OrderState) { updateOrder = fsql.Update(dbOrder.Id).Set(o => o.OrderState, dbOrder.OrderState); #region 通知C端状态 Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion } #endregion fsql.Transaction(() => { insertPEO?.ExecuteAffrows(); insertEORI?.ExecuteAffrows(); deleteEORI?.ExecuteAffrows(); deletePEO?.ExecuteAffrows(); updatePurchaseOrderSku?.ExecuteAffrows(); updatePurchaseOrder?.ExecuteAffrows(); updateOrder?.ExecuteAffrows(); }); } /// /// 手动发货 /// /// public void ManualDelivery(ManualDeliveryRequest request) { nLogManager.Default().Info($"ManualDelivery {JsonConvert.SerializeObject(request)}"); if (request.ExpressId == "zhuanxianwuliu" && string.IsNullOrEmpty(request.WaybillNo)) request.WaybillNo = $"wdh{idGenerator.NewLong()}"; #region 查询当前采购单的订单信息 var dbOrder = fsql.Select().InnerJoin((opi, o) => opi.OrderId == o.Id) .Where((opi, o) => opi.PurchaseOrderId == request.PurchaseOrderId && opi.IsEnabled == true) .ToOne((opi, o) => new Order { Id = o.Id, OrderSn = o.OrderSn, OrderState = o.OrderState, ShopId = o.ShopId, IntoStoreType = o.IntoStoreType }); if (dbOrder == null) throw new BusinessException("未查询到采购单的订单信息"); if (dbOrder.IntoStoreType == Enums.IntoStoreType.厂商代发入仓) throw new BusinessException("厂家代发入仓订单请使用【设置快递单和入仓采购单接口(厂家代发入仓专用)】"); #endregion #region 准备数据库更新对象 List insertPurchaseExpressOrderList = new List(); IList> updateOrderPurchaseSkuList = new List>(); IUpdate updateOrderPurchase = null; IUpdate updateOrder = null; IInsert insertExpressOrderRelation = null; #endregion #region 查询该笔采购单的快递单信息 //var purchaseExpressOrderList = fsql.Select().Where(x => x.PurchaseOrderId == request.PurchaseOrderId).ToList(); var purchaseExpressOrderList = fsql.Select() .InnerJoin((eori, peo) => eori.WayBillNo == peo.WaybillNo) .Where((eori, peo) => eori.PurchaseOrderId == request.PurchaseOrderId).ToList((eori, peo) => new PurchaseExpressOrder { CreateTime = peo.CreateTime, ExpressContent = peo.ExpressContent, ExpressChangedTime = peo.ExpressChangedTime, ExpressState = peo.ExpressState, IsSubscribeKD100 = peo.IsSubscribeKD100, //OrderId = eori.OrderId, //PurchaseOrderId = eori.PurchaseOrderId, ShopId = eori.ShopId.Value, SourceExpressId = peo.SourceExpressId, SourceExpressName = peo.SourceExpressName, TargetExpressId = peo.TargetExpressId, TargetExpressName = peo.TargetExpressName, WaybillNo = peo.WaybillNo }); bool isExists = purchaseExpressOrderList.Any(exo => exo.WaybillNo == request.WaybillNo); bool isDbExists = fsql.Select(request.WaybillNo).Any(); #endregion #region 店铺信息 var shop = fsqlManager.MDSfsql.Select().Where(s => s.ShopId == dbOrder.ShopId.ToString()).ToOne(); if (shop == null) throw new BusinessException("未查询到采购单所属店铺"); #endregion #region 查询订单的全部采购单信息 var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == dbOrder.Id && opi.IsEnabled == true).ToList(); var orderPurchaseInfo = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); if (orderPurchaseInfo == null) throw new BusinessException("未查询到采购单信息"); #endregion IList orderPurchaseSkuList = null; if (orderPurchaseInfo.PurchasePlatform == Enums.Platform.阿里巴巴) { #region 查询采购关联信息 var orderPurchaseRelationList = fsql.Select().Where(opri => opri.PurchaseOrderId == request.PurchaseOrderId && opri.BelongSkuId == request.SkuId).ToList(); if (orderPurchaseRelationList.Count() == 0) throw new BusinessException("未查询到采购单的关联信息"); #endregion #region 查询该笔采购单的采购sku信息并更新快递单号 orderPurchaseSkuList = fsql.Select().Where(x => x.PurchaseOrderId == request.PurchaseOrderId).ToList(); if (orderPurchaseSkuList.Count() == 0) throw new BusinessException("未查询到采购单sku信息"); foreach (var relation in orderPurchaseRelationList) { var orderPurchaseSku = orderPurchaseSkuList.FirstOrDefault(posku => posku.PurchaseSkuId == relation.PurchaseSkuId); if (orderPurchaseSku == null) throw new BusinessException("未查询到采购单sku信息"); if (orderPurchaseSku.WaybillNo != request.WaybillNo) { orderPurchaseSku.WaybillNo = request.WaybillNo; updateOrderPurchaseSkuList.Add(fsql.Update(orderPurchaseSku.Id).Set(ps => ps.WaybillNo, request.WaybillNo)); } } #endregion } #region 订阅快递100 bool isSubscribeKD100 = false; if (request.ExpressId != "zhuanxianwuliu" && !isDbExists) { #region 订阅快递100 try { kuaiDi100Manager.SubscribeKuaiDi100(request.WaybillNo, request.ExpressId, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish"); isSubscribeKD100 = true; } catch (Exception ex) { nLogManager.Default().Error(ex, $"ManualDelivery,Request:{JsonConvert.SerializeObject(request)}"); #region 订阅失败发送钉钉通知 var dingdingMsg = new StringBuilder(); dingdingMsg.AppendLine($"错误:{ex.Message}"); dingdingMsg.AppendLine($"采购订单号:{request.PurchaseOrderId}"); dingdingMsg.AppendLine($"拳探订单号:{dbOrder.Id}"); dingdingMsg.AppendLine($"拳探订单Sn:{dbOrder.OrderSn}"); dingdingMsg.AppendLine($"源物流公司:无"); dingdingMsg.AppendLine($"目标物流公司:{request.ExpressName} {request.ExpressId}"); dingdingMsg.AppendLine($"快递单号:{request.WaybillNo}"); dingdingMsg.AppendLine("触发环节:手动发货"); dingdingMsg.Append($"店铺名:{shop.ShopName}"); Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion } #endregion } #endregion #region 创建快递单 if (!isDbExists) { var purchaseExpressOrder = new PurchaseExpressOrder() { //OrderId = dbOrder.Id, CreateTime = DateTime.Now, //PurchaseOrderId = request.PurchaseOrderId, ShopId = dbOrder.ShopId ?? 0, TargetExpressId = request.ExpressId, TargetExpressName = request.ExpressName, WaybillNo = request.WaybillNo, ExpressState = kuaiDi100Manager.GetExpressState(1), //快递100发货状态值 默认揽收 IsSubscribeKD100 = isSubscribeKD100, ExpressContent = "手动发货", ExpressChangedTime = DateTime.Now }; insertPurchaseExpressOrderList.Add(purchaseExpressOrder); } #endregion #region 创建快递单关系 if (!isExists) { var expressOrderRelation = new ExpressOrderRelationInfo() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, OrderId = dbOrder.Id, PurchaseOrderId = request.PurchaseOrderId, ShopId = dbOrder.ShopId.Value, WayBillNo = request.WaybillNo }; insertExpressOrderRelation = fsql.Insert(expressOrderRelation); if (!insertPurchaseExpressOrderList.Any(p => p.WaybillNo == request.WaybillNo)) { purchaseExpressOrderList.Add(new PurchaseExpressOrder() { CreateTime = DateTime.Now, ShopId = dbOrder.ShopId ?? 0, TargetExpressId = request.ExpressId, TargetExpressName = request.ExpressName, WaybillNo = request.WaybillNo, ExpressState = kuaiDi100Manager.GetExpressState(1), //快递100发货状态值 默认揽收 IsSubscribeKD100 = isSubscribeKD100, ExpressContent = "手动发货", ExpressChangedTime = DateTime.Now }); } } #endregion #region 计算采购单状态 orderPurchaseInfo.CalculationOrderState(dbOrder.IntoStoreType.Value, fsql, orderPurchaseSkuList, purchaseExpressOrderList.Union(insertPurchaseExpressOrderList).ToList()); updateOrderPurchase = fsql.Update(orderPurchaseInfo.Id) .Set(opi => opi.OrderState, orderPurchaseInfo.OrderState); #endregion #region 计算订单状态 dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); updateOrder = fsql.Update(dbOrder.Id) .Set(o => o.OrderState, dbOrder.OrderState); #endregion #region 通知C端状态 Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion fsql.Transaction(() => { if (insertPurchaseExpressOrderList.Count() > 0) fsql.Insert(insertPurchaseExpressOrderList).ExecuteAffrows(); if (updateOrderPurchaseSkuList.Count() > 0) { foreach (var update in updateOrderPurchaseSkuList) update.ExecuteAffrows(); } updateOrderPurchase?.ExecuteAffrows(); updateOrder?.ExecuteAffrows(); insertExpressOrderRelation?.ExecuteAffrows(); }); } /// /// 厂家代入仓订单发货 /// /// public void PurchaserDelivery(PurchaserDeliveryRequest request) { nLogManager.Default().Info($"PurchaserDelivery {JsonConvert.SerializeObject(request)}"); var dbOrder = fsql.Select(request.OrderId).ToOne(); if (dbOrder == null) throw new BusinessException("订单不存在"); if (dbOrder.IntoStoreType != Enums.IntoStoreType.厂商代发入仓) throw new BusinessException("此订单非厂商代发入仓"); if (request.InStorePurchaseOrderManualDeliveryList.Count() == 0) throw new BusinessException("缺少快递信息"); if (request.InStorePurchaseOrderManualDeliveryList.Any(x => x.InStorePurchaseOrderIdList.Count() == 0)) throw new BusinessException("缺少入仓采购单信息"); if (request.InStorePurchaseOrderManualDeliveryList.Any(x => x.InStorePurchaseOrderIdList.Count() != x.InStorePurchaseOrderIdList.Distinct().Count())) throw new BusinessException("同一个快递单下不允许出现重复的入仓采购单"); List insertPurchaseExpressOrderList = new List(); List insertExpressOrderRelationList = new List(); List insertInStorePurchaseOrderRelationList = new List(); //IList> updateOrderPurchaseSkuList = new List>(); IUpdate updateOrderPurchase = null; IUpdate updateOrder = null; #region 查询该笔采购单的快递单信息 //var purchaseExpressOrderList = fsql.Select().Where(x => x.PurchaseOrderId == request.PurchaseOrderId).ToList(); var purchaseExpressOrderList = fsql.Select() .InnerJoin((eori, peo) => eori.WayBillNo == peo.WaybillNo) .Where((eori, peo) => eori.PurchaseOrderId == request.PurchaseOrderId).ToList((eori, peo) => new PurchaseExpressOrder { CreateTime = peo.CreateTime, ExpressContent = peo.ExpressContent, ExpressChangedTime = peo.ExpressChangedTime, ExpressState = peo.ExpressState, IsSubscribeKD100 = peo.IsSubscribeKD100, //OrderId = eori.OrderId, //PurchaseOrderId = eori.PurchaseOrderId, ShopId = eori.ShopId.Value, SourceExpressId = peo.SourceExpressId, SourceExpressName = peo.SourceExpressName, TargetExpressId = peo.TargetExpressId, TargetExpressName = peo.TargetExpressName, WaybillNo = peo.WaybillNo }); var wayBillNos = request.InStorePurchaseOrderManualDeliveryList.Select(x => x.WaybillNo).ToList(); var dbPurchaseExpressOrderList = fsql.Select(wayBillNos).ToList(); #endregion #region 查询该订单的入库采购单关系 var dbInStoreRelationList = fsql.Select().Where(x => x.OrderId == request.OrderId).ToList(); #endregion #region 店铺信息 var shop = fsqlManager.MDSfsql.Select().Where(s => s.ShopId == dbOrder.ShopId.ToString()).ToOne(); if (shop == null) throw new BusinessException("未查询到采购单所属店铺"); #endregion #region 查询订单的全部采购单信息 var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == dbOrder.Id && opi.IsEnabled == true).ToList(); var orderPurchaseInfo = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); if (orderPurchaseInfo == null) throw new BusinessException("未查询到采购单信息"); #endregion foreach (var peoRequest in request.InStorePurchaseOrderManualDeliveryList) { bool isExists = purchaseExpressOrderList.Any(exo => exo.WaybillNo == peoRequest.WaybillNo); bool isDbExists = dbPurchaseExpressOrderList.Any(exo => exo.WaybillNo == peoRequest.WaybillNo); #region 订阅快递100 bool isSubscribeKD100 = false; if (peoRequest.ExpressId != "zhuanxianwuliu" && !isDbExists) { try { kuaiDi100Manager.SubscribeKuaiDi100(peoRequest.WaybillNo, peoRequest.ExpressId, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish"); isSubscribeKD100 = true; } catch (Exception ex) { if (!ex.Message.Contains("重复订阅")) { nLogManager.Default().Error(ex, $"ManualDelivery,Request:{JsonConvert.SerializeObject(request)}"); #region 订阅失败发送钉钉通知 var dingdingMsg = new StringBuilder(); dingdingMsg.AppendLine($"错误:{ex.Message}"); dingdingMsg.AppendLine($"采购订单号:{request.PurchaseOrderId}"); dingdingMsg.AppendLine($"拳探订单号:{dbOrder.Id}"); dingdingMsg.AppendLine($"拳探订单Sn:{dbOrder.OrderSn}"); dingdingMsg.AppendLine($"源物流公司:无"); dingdingMsg.AppendLine($"目标物流公司:{peoRequest.ExpressName} {peoRequest.ExpressId}"); dingdingMsg.AppendLine($"快递单号:{peoRequest.WaybillNo}"); dingdingMsg.AppendLine("触发环节:厂家代发入仓手动发货"); dingdingMsg.Append($"店铺名:{shop.ShopName}"); Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion } } } #endregion #region 创建快递单 if (!isDbExists) { var purchaseExpressOrder = new PurchaseExpressOrder() { //OrderId = dbOrder.Id, CreateTime = DateTime.Now, //PurchaseOrderId = request.PurchaseOrderId, ShopId = dbOrder.ShopId ?? 0, TargetExpressId = peoRequest.ExpressId, TargetExpressName = peoRequest.ExpressName, WaybillNo = peoRequest.WaybillNo, ExpressState = kuaiDi100Manager.GetExpressState(1), //快递100发货状态值 默认揽收 IsSubscribeKD100 = isSubscribeKD100, ExpressContent = "手动发货", ExpressChangedTime = DateTime.Now }; insertPurchaseExpressOrderList.Add(purchaseExpressOrder); } #endregion #region 创建快递单关系 if (!isExists) { var expressOrderRelation = new ExpressOrderRelationInfo() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, OrderId = dbOrder.Id, PurchaseOrderId = request.PurchaseOrderId, ShopId = dbOrder.ShopId.Value, WayBillNo = peoRequest.WaybillNo }; insertExpressOrderRelationList.Add(expressOrderRelation); if (!insertPurchaseExpressOrderList.Any(p => p.WaybillNo == peoRequest.WaybillNo)) { purchaseExpressOrderList.Add(new PurchaseExpressOrder() { CreateTime = DateTime.Now, ShopId = dbOrder.ShopId ?? 0, TargetExpressId = peoRequest.ExpressId, TargetExpressName = peoRequest.ExpressName, WaybillNo = peoRequest.WaybillNo, ExpressState = kuaiDi100Manager.GetExpressState(1), //快递100发货状态值 默认揽收 IsSubscribeKD100 = isSubscribeKD100, ExpressContent = "手动发货", ExpressChangedTime = DateTime.Now }); } } #endregion #region 入库采购单号 var waitInsertInStoreRelationList = peoRequest.InStorePurchaseOrderIdList.Where(x => !dbInStoreRelationList.Any(r => r.WaybillNo == peoRequest.WaybillNo && r.InStorePurchaseOrderId == x)).ToList(); if (waitInsertInStoreRelationList.Count() > 0) { insertInStorePurchaseOrderRelationList.AddRange(waitInsertInStoreRelationList.Select(x => new InStorePurchaseOrdeRrelationInfo() { CreateTime = DateTime.Now, Id = idGenerator.NewLong(), InStorePurchaseOrderId = x, OrderId = request.OrderId, PurchaseOrderId = request.PurchaseOrderId, ShopId = dbOrder.ShopId, WaybillNo = peoRequest.WaybillNo })); } #endregion } #region 计算采购单状态 orderPurchaseInfo.CalculationOrderState(dbOrder.IntoStoreType.Value, fsql, null, purchaseExpressOrderList.Union(insertPurchaseExpressOrderList).ToList()); updateOrderPurchase = fsql.Update(orderPurchaseInfo.Id) .Set(opi => opi.OrderState, orderPurchaseInfo.OrderState); #endregion #region 计算订单状态 dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); updateOrder = fsql.Update(dbOrder.Id) .Set(o => o.OrderState, dbOrder.OrderState); #endregion #region 通知C端状态 Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion fsql.Transaction(() => { if (insertPurchaseExpressOrderList.Count() > 0) fsql.Insert(insertPurchaseExpressOrderList).ExecuteAffrows(); if (insertExpressOrderRelationList.Count() > 0) fsql.Insert(insertExpressOrderRelationList).ExecuteAffrows(); if (insertInStorePurchaseOrderRelationList.Count() > 0) fsql.Insert(insertInStorePurchaseOrderRelationList).ExecuteAffrows(); //if (updateOrderPurchaseSkuList.Count() > 0) //{ // foreach (var update in updateOrderPurchaseSkuList) // update.ExecuteAffrows(); //} updateOrderPurchase?.ExecuteAffrows(); updateOrder?.ExecuteAffrows(); }); } public void ManualSign(ManualSignRequest request) { Task.Factory.StartNew(() => OnExpressOrderChange(request.WayBillNo, "QianShou", DateTime.Now, "手动签收"), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } public void BatchManualSign(BatchManualSignRequest request) { if (request.WayBillNoList == null || request.WayBillNoList.Count() == 0) throw new BusinessException("缺少快递单号"); if (request.WayBillNoList.Distinct().Count() < request.WayBillNoList.Count()) throw new BusinessException("不允许重复的快递单号"); Task.Factory.StartNew(() => { foreach (var waybillNo in request.WayBillNoList) OnExpressOrderChange(waybillNo, "QianShou", DateTime.Now, "手动签收"); }, CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } ///// ///// 手动收货 ///// ///// //public void ManualSign(ManualSignRequest request) //{ // IList> updatePurchaseExpressOrderList = new List>(); // IUpdate updateOrderPurchase = null; // IUpdate updateOrder = null; // #region 查询该笔采购单的快递单信息 // var purchaseExpressOrderList = fsql.Select().Where(x => x.PurchaseOrderId == request.PurchaseOrderId).ToList(); // #endregion // #region 查询当前采购单的订单信息 // var dbOrder = fsql.Select().InnerJoin((opi, o) => opi.OrderId == o.Id) // .Where((opi, o) => opi.PurchaseOrderId == request.PurchaseOrderId && opi.IsEnabled == true) // .ToOne((opi, o) => new Order // { // Id = o.Id, // OrderState = o.OrderState, // ShopId = o.ShopId // }); // if (dbOrder == null) // throw new BusinessException("未查询到采购单的订单信息"); // #endregion // #region 查询订单的全部采购单信息 // var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == dbOrder.Id && opi.IsEnabled == true).ToList(); // var orderPurchaseInfo = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); // if (orderPurchaseInfo == null) // throw new BusinessException("未查询到采购单信息"); // #endregion // IList orderPurchaseSkuList = null; // IList orderPurchaseRelationList = null; // if (orderPurchaseInfo.PurchasePlatform == Enums.Platform.阿里巴巴) // { // #region 查询采购关联信息 // orderPurchaseRelationList = fsql.Select().Where(opri => opri.PurchaseOrderId == request.PurchaseOrderId && // opri.BelongSkuId == request.SkuId).ToList(); // if (orderPurchaseRelationList.Count() == 0) // throw new BusinessException("未查询到采购单的关联信息"); // #endregion // #region 查询该笔采购单的采购sku信息 // orderPurchaseSkuList = fsql.Select().Where(x => x.PurchaseOrderId == request.PurchaseOrderId).ToList(); // if (orderPurchaseSkuList.Count() == 0) // throw new BusinessException("未查询到采购单sku信息"); // #endregion // #region 更新采购sku的快递单状态为签收 // foreach (var relation in orderPurchaseRelationList) // { // var orderPurchaseSku = orderPurchaseSkuList.FirstOrDefault(posku => posku.PurchaseSkuId == relation.PurchaseSkuId); // if (orderPurchaseSku == null) // throw new BusinessException("未查询到采购单sku信息"); // if (!string.IsNullOrEmpty(orderPurchaseSku.WaybillNo)) // { // var purchaseExpressOrder = purchaseExpressOrderList.FirstOrDefault(exo => exo.WaybillNo == orderPurchaseSku.WaybillNo); // if (purchaseExpressOrder == null) // throw new BusinessException("未查询到采购sku的快递信息"); // var expressState = kuaiDi100Manager.GetExpressState(3); // if (purchaseExpressOrder.ExpressState != expressState) // { // purchaseExpressOrder.ExpressState = expressState; // updatePurchaseExpressOrderList.Add(fsql.Update(purchaseExpressOrder.WaybillNo) // .Set(exo => exo.ExpressState, purchaseExpressOrder.ExpressState) // .Set(exo => exo.ExpressChangedTime, DateTime.Now) // .Set(exo => exo.ExpressContent, "手动签收")); // } // } // } // #endregion // } // else // { // foreach (var purchaseExpressOrder in purchaseExpressOrderList) // { // var expressState = kuaiDi100Manager.GetExpressState(3); // if (purchaseExpressOrder.ExpressState != expressState) // { // purchaseExpressOrder.ExpressState = expressState; // updatePurchaseExpressOrderList.Add(fsql.Update(purchaseExpressOrder.WaybillNo) // .Set(exo => exo.ExpressState, purchaseExpressOrder.ExpressState) // .Set(exo => exo.ExpressChangedTime, DateTime.Now) // .Set(exo => exo.ExpressContent, "手动签收")); // } // } // } // #region 计算采购单状态 // orderPurchaseInfo.CalculationOrderState(fsql, orderPurchaseSkuList, purchaseExpressOrderList); // updateOrderPurchase = fsql.Update(orderPurchaseInfo.Id) // .Set(opi => opi.OrderState, orderPurchaseInfo.OrderState); // #endregion // #region 计算订单状态 // dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); // updateOrder = fsql.Update(dbOrder.Id) // .Set(o => o.OrderState, dbOrder.OrderState); // #endregion // #region 通知齐库打包落仓情况 // Task.Factory.StartNew(() => qiKuManager.PublishQiKu(orderPurchaseInfo, orderPurchaseRelationList, orderPurchaseSkuList, purchaseExpressOrderList), // CancellationToken.None, // TaskCreationOptions.LongRunning, // taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); // #endregion // #region 通知C端状态 // Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); // #endregion // fsql.Transaction(() => // { // if (updatePurchaseExpressOrderList.Count() > 0) // { // foreach (var update in updatePurchaseExpressOrderList) // update.ExecuteAffrows(); // } // updateOrderPurchase?.ExecuteAffrows(); // updateOrder?.ExecuteAffrows(); // }); //} ///// ///// 签收采购单 ///// ///// //public void SignPurchaseOrder(SignPurchaseOrderRequest request) //{ // var dbOrder = fsql.Select(request.OrderId).ToOne(); // if (dbOrder == null) // throw new BusinessException("无效订单号"); // if (dbOrder.OrderState == Enums.OrderState.已取消) // throw new BusinessException("订单已取消"); // if (dbOrder.OrderState == Enums.OrderState.已完成) // throw new BusinessException("订单已完成无需签收"); // var dbOrderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == request.OrderId && opi.IsEnabled == true).ToList(); // var dbOrderPurchaseInfo = dbOrderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == request.PurchaseOrderId); // if (dbOrderPurchaseInfo == null) // throw new BusinessException("无效采购单号"); // if (!dbOrderPurchaseInfo.IsEnabled) // throw new BusinessException("采购单已失效"); // if (dbOrderPurchaseInfo.OrderState == Enums.PurchaseOrderState.已签收 || // dbOrderPurchaseInfo.IsSign == true) // throw new BusinessException("采购单已签收"); // dbOrderPurchaseInfo.IsSign = true; // dbOrderPurchaseInfo.OrderState = Enums.PurchaseOrderState.已签收; // dbOrder.CalculationOrderState(fsql, null, dbOrderPurchaseInfoList); // fsql.Transaction(() => // { // fsql.Update().SetSource(dbOrderPurchaseInfo).ExecuteAffrows(); // fsql.Update(dbOrder.Id) // .Set(o => o.OrderState, dbOrder.OrderState) // .Set(o => o.IsWaitPack, true).ExecuteAffrows(); // }); //} #region 1688CallBack 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; case "LOGISTICS_BUYER_VIEW_TRACE": // LogisticsUpdateCallbackFrom1688(jObject);//1688物流信息变更 break; case "ORDER_BUYER_VIEW_ORDER_PAY": OrderPayFrom1688(jObject); break; default: break; } } /// /// 1688发货回调 /// /// private void DeliveryCallbackFrom1688(JObject jObject) { var purchaseOrderId = jObject["data"].Value("orderId"); Task.Factory.StartNew(() => DeliveryCallbackFrom1688(purchaseOrderId), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } /// /// 1688发货回调 /// /// 采购单 private void DeliveryCallbackFrom1688(string purchaseOrderId) { string orderId = string.Empty; long? shopId = null; string currentProgress = string.Empty; string wayBillNoResponseInfo = string.Empty; try { #region 查询当前采购单的订单信息 currentProgress = "查询当前采购单的订单信息"; var dbOrder = fsql.Select().InnerJoin((opi, o) => opi.OrderId == o.Id) .Where((opi, o) => opi.PurchaseOrderId == purchaseOrderId && opi.IsEnabled == true) .ToOne((opi, o) => new Order { Id = o.Id, OrderSn = o.OrderSn, OrderState = o.OrderState, ShopId = o.ShopId, IntoStoreType = o.IntoStoreType }); if (dbOrder == null) throw new Exception("未查询到采购单的订单信息"); if (dbOrder.IntoStoreType == Enums.IntoStoreType.厂商代发入仓) return; List insertPurchaseExpressOrderList = new List(); List insertExpressOrderRelationInfoList = new List(); IList> updateOrderPurchaseSkuList = new List>(); IUpdate updateOrderPurchase = null; IUpdate updateOrder = null; orderId = dbOrder.Id; shopId = dbOrder.ShopId; #endregion #region 店铺信息 var shop = fsqlManager.MDSfsql.Select().Where(s => s.ShopId == dbOrder.ShopId.ToString()).ToOne(); if (shop == null) throw new BusinessException("未查询到采购单所属店铺"); #endregion #region 查询订单的全部采购单信息 currentProgress = "查询订单的全部采购单信息"; var orderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == orderId && opi.IsEnabled == true).ToList(); var orderPurchaseInfo = orderPurchaseInfoList.FirstOrDefault(opi => opi.PurchaseOrderId == purchaseOrderId); #endregion #region 查询该笔采购单的sku信息 currentProgress = "查询该笔采购单的sku信息"; var orderPurchaseSkuList = fsql.Select().Where(x => x.PurchaseOrderId == purchaseOrderId).ToList(); #endregion #region 查询该笔采购单的快递单信息 currentProgress = "查询该笔采购单的快递单信息"; //var purchaseExpressOrderList = fsql.Select().Where(x => x.PurchaseOrderId == purchaseOrderId).ToList(); var purchaseExpressOrderList = fsql.Select() .InnerJoin((eori, peo) => eori.WayBillNo == peo.WaybillNo) .Where((eori, peo) => eori.PurchaseOrderId == purchaseOrderId).ToList((eori, peo) => new PurchaseExpressOrder { CreateTime = peo.CreateTime, ExpressContent = peo.ExpressContent, ExpressChangedTime = peo.ExpressChangedTime, ExpressState = peo.ExpressState, IsSubscribeKD100 = peo.IsSubscribeKD100, OrderId = eori.OrderId, PurchaseOrderId = eori.PurchaseOrderId, ShopId = eori.ShopId.Value, SourceExpressId = peo.SourceExpressId, SourceExpressName = peo.SourceExpressName, TargetExpressId = peo.TargetExpressId, TargetExpressName = peo.TargetExpressName, WaybillNo = peo.WaybillNo }); #endregion #region 查询采购账号 currentProgress = "查询采购账号"; var purchaseAccount = fsqlManager.MDSfsql.Select().Where(pa => pa.Id == orderPurchaseInfo.PurchaseAccountId).ToOne(); if (purchaseAccount == null) throw new Exception($"未查询到采购账号{orderPurchaseInfo.PurchaseAccountId}"); #endregion #region 获取采购单的物流信息 currentProgress = "获取采购单的物流信息"; var client = ppPlatformClientFactory.GetClient(AdapterEnums.PlatformType.阿里巴巴); var ppQueryOrderLogisticsRequest = new PP_QueryOrderLogisticsRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, OrderId = purchaseOrderId, Platform = AdapterEnums.PlatformType.阿里巴巴 }; var logisticsList = client.QueryOrderLogistics(ppQueryOrderLogisticsRequest); wayBillNoResponseInfo = JsonConvert.SerializeObject(new { purchaseOrderId, logisticsList }); var wayBillNos = logisticsList.Where(w => !string.IsNullOrEmpty(w.WayBillNo)).Select(w => w.WayBillNo).ToList(); var dbWayBillNos = fsql.Select(wayBillNos).ToList(w => w.WaybillNo); #endregion #region 找出新发货的快递单 foreach (var logisticsInfo in logisticsList) { if (string.IsNullOrEmpty(logisticsInfo.WayBillNo) || purchaseExpressOrderList.Any(po => po.WaybillNo == logisticsInfo.WayBillNo)) continue; #region 订阅快递100 currentProgress = "订阅快递100"; LogisticsCompanyRelationship kuaidi100Company = null; bool isSubscribeKD100 = false; try { kuaidi100Company = expressCompanyNameConverter.ConverterToKuaiDi100Company(logisticsInfo.ExpressName); if (kuaidi100Company == null) throw new Exception($"无翻译结果"); kuaiDi100Manager.SubscribeKuaiDi100(logisticsInfo.WayBillNo, kuaidi100Company.TargetCode, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish"); isSubscribeKD100 = true; } catch (Exception ex) { if (!ex.Message.Contains("重复订阅")) { nLogManager.Default().Error(ex, $"DeliveryCallback 回调平台1688,订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo}"); #region 订阅失败发送钉钉通知 var dingdingMsg = new StringBuilder(); dingdingMsg.AppendLine($"错误:{ex.Message}"); dingdingMsg.AppendLine($"采购订单号:{purchaseOrderId}"); dingdingMsg.AppendLine($"拳探订单号:{orderId}"); dingdingMsg.AppendLine($"拳探订单Sn:{dbOrder.OrderSn}"); dingdingMsg.AppendLine($"源物流公司:{logisticsInfo.ExpressName}"); dingdingMsg.AppendLine($"目标物流公司:{kuaidi100Company?.TargetName} {kuaidi100Company?.TargetCode}"); dingdingMsg.AppendLine($"快递单号:{logisticsInfo.WayBillNo}"); dingdingMsg.AppendLine("触发环节:1688发货回调"); dingdingMsg.Append($"店铺名:{shop.ShopName}"); Task.Factory.StartNew(() => SendDingDing(dingdingMsg.ToString()), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion if (ex.Message.Contains("无翻译结果")) throw; } } #endregion #region 创建快递单 if (!dbWayBillNos.Contains(logisticsInfo.WayBillNo)) { var purchaseExpressOrder = new PurchaseExpressOrder() { //OrderId = orderId, CreateTime = DateTime.Now, //PurchaseOrderId = purchaseOrderId, ShopId = shopId ?? 0, SourceExpressId = logisticsInfo.ExpressId, SourceExpressName = logisticsInfo.ExpressName, WaybillNo = logisticsInfo.WayBillNo, TargetExpressId = kuaidi100Company?.TargetCode, TargetExpressName = kuaidi100Company?.TargetName, ExpressState = kuaiDi100Manager.GetExpressState(1), //快递100发货状态值 默认揽收 IsSubscribeKD100 = isSubscribeKD100 }; insertPurchaseExpressOrderList.Add(purchaseExpressOrder); } #endregion #region 更新采购sku的快递单号 foreach (var orderEntryId in logisticsInfo.OrderEntryIds) { var purchaseSku = orderPurchaseSkuList.FirstOrDefault(x => x.Id == orderEntryId); if (purchaseSku == null) continue; purchaseSku.WaybillNo = logisticsInfo.WayBillNo; updateOrderPurchaseSkuList.Add(fsql.Update(orderEntryId).Set(ps => ps.WaybillNo, logisticsInfo.WayBillNo)); } #endregion #region 创建快递关系 insertExpressOrderRelationInfoList.Add(new ExpressOrderRelationInfo() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, OrderId = dbOrder.Id, PurchaseOrderId = purchaseOrderId, ShopId = dbOrder.ShopId, WayBillNo = logisticsInfo.WayBillNo }); #endregion } #endregion #region 计算采购单状态 orderPurchaseInfo.CalculationOrderState(dbOrder.IntoStoreType.Value, fsql, orderPurchaseSkuList, purchaseExpressOrderList.Union(insertPurchaseExpressOrderList).ToList()); updateOrderPurchase = fsql.Update(orderPurchaseInfo.Id) .Set(opi => opi.OrderState, orderPurchaseInfo.OrderState); #endregion #region 计算订单状态 dbOrder.CalculationOrderState(fsql, null, orderPurchaseInfoList); updateOrder = fsql.Update(dbOrder.Id) .Set(o => o.OrderState, dbOrder.OrderState); #endregion #region 通知C端订单状态 Task.Factory.StartNew(() => SendPurchaseOrderStateToC(dbOrder.Id, dbOrder.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion fsql.Transaction(() => { if (insertExpressOrderRelationInfoList.Count() > 0) fsql.Insert(insertExpressOrderRelationInfoList).ExecuteAffrows(); if (insertPurchaseExpressOrderList.Count() > 0) fsql.Insert(insertPurchaseExpressOrderList).ExecuteAffrows(); if (updateOrderPurchaseSkuList.Count() > 0) { foreach (var update in updateOrderPurchaseSkuList) update.ExecuteAffrows(); } updateOrderPurchase?.ExecuteAffrows(); updateOrder?.ExecuteAffrows(); }); } catch (Exception ex) { nLogManager.Default().Error(ex, $"DeliveryCallback 回调平台1688,订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo}"); } } /// /// 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); } private void OrderPayFrom1688(JObject jObject) { var purchaseOrderId = jObject["data"].Value("orderId"); Task.Factory.StartNew(() => OrderPayCallback(purchaseOrderId, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } #endregion /// /// 采购平台改价回调 /// /// /// private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform) { OnSomeOnePurchaseOrderChanged(purchaseOrderId, true); } private void OrderPayCallback(string purchaseOrderId, Enums.Platform callbackPlatform) { OnSomeOnePurchaseOrderChanged(purchaseOrderId, false); } public void KuaiDi100Publish(string param) { nLogManager.GetLogger("快递100").Info($"KuaiDi100Publish {param}"); try { JObject jobject = JObject.Parse(param); var waybillNo = jobject["lastResult"].Value("nu"); var state = jobject["lastResult"].Value("state"); var convertState = kuaiDi100Manager.GetExpressState(state); if (convertState == "Unknow") return; var dataArray = jobject["lastResult"]["data"].Children().Select(d => new { context = d.Value("context"), ftime = d.Value("ftime"), statusCode = d.Value("statusCode") }).OrderByDescending(d => d.ftime).ToList(); var lastData = dataArray.FirstOrDefault(); Task.Factory.StartNew(() => OnExpressOrderChange(waybillNo, convertState, lastData.ftime, lastData.context), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } catch (Exception ex) { nLogManager.GetLogger("快递100").Error(ex, $"KuaiDi100Publish-{param}"); } } /// /// 快递单信息变更 /// /// /// /// /// private void OnExpressOrderChange(string wayBillNo, string state, DateTime expressChangeTime, string expressContent) { try { IUpdate updatePurchaseExpressOrder = null; List> updateOrderPurchaseList = new List>(); List> updateOrderList = new List>(); List insertTimeLimitTaskList = new List(); List insertInStoreOrderCheckTaskList = new List(); #region 查询该笔快递单 var tpeo = fsql.Select(wayBillNo).ToOne(); if (tpeo == null) throw new Exception("未查询到快递单"); #endregion #region 查询和该快递单有关的订单 (多笔订单) var orderIds = fsql.Select() .InnerJoin((eori, peo) => eori.WayBillNo == peo.WaybillNo) .Where((eori, peo) => eori.WayBillNo == wayBillNo) .GroupBy((eori, peo) => eori.OrderId) .ToList(g => g.Key); if (orderIds.Count() == 0) throw new Exception("未查询到任何订单号"); #endregion #region 查询订单 var orderList = fsql.Select(orderIds).ToList(o => new Order { Id = o.Id, OrderSn = o.OrderSn, ShopId = o.ShopId, OrderState = o.OrderState, IntoStoreType = o.IntoStoreType, SourceShopName = o.SourceShopName }); if (orderList.Count() == 0) throw new Exception("未查询到任何订单"); #endregion #region 查询订单sku var orderSkuList = fsql.Select().Where(osku => orderIds.Contains(osku.OrderId)).ToList(); if (orderSkuList.Count() == 0) throw new Exception("未查询到任何订单sku"); #endregion #region 查询采购单 var purchaseOrderList = fsql.Select().Where(ori => ori.IsEnabled == true && orderIds.Contains(ori.OrderId)).ToList(); if (purchaseOrderList.Count() == 0) throw new Exception("未查询到任何采购单"); var purchaseOrderIds = purchaseOrderList.Select(po => po.PurchaseOrderId).ToList(); #endregion #region 查询采购SKU IList orderPurchaseSkuList = fsql.Select() .Where(posku => purchaseOrderIds.Contains(posku.PurchaseOrderId)) .ToList(); #endregion #region 查询采购sku关联信息 IList orderPurchaseRelationList = fsql.Select() .Where(ops => purchaseOrderIds.Contains(ops.PurchaseOrderId)) .ToList(); #endregion #region 查询采购单关联的快递单 var purchaseExpressOrderList = fsql.Select() .InnerJoin((eori, peo) => eori.WayBillNo == peo.WaybillNo) .Where((eori, peo) => orderIds.Contains(eori.OrderId)).ToList((eori, peo) => new PurchaseExpressOrder { CreateTime = peo.CreateTime, ExpressContent = peo.ExpressContent, ExpressChangedTime = peo.ExpressChangedTime, ExpressState = peo.ExpressState, IsSubscribeKD100 = peo.IsSubscribeKD100, OrderId = eori.OrderId, PurchaseOrderId = eori.PurchaseOrderId, ShopId = eori.ShopId.Value, SourceExpressId = peo.SourceExpressId, SourceExpressName = peo.SourceExpressName, TargetExpressId = peo.TargetExpressId, TargetExpressName = peo.TargetExpressName, WaybillNo = peo.WaybillNo }); #endregion #region 更新采购单信息 tpeo.ExpressState = state; tpeo.ExpressChangedTime = expressChangeTime; tpeo.ExpressContent = expressContent; updatePurchaseExpressOrder = fsql.Update().SetSource(tpeo); #endregion #region 查询入库单信息 IList inStoreOrderCheckTaskList = null; if (orderList.Any(o => o.IntoStoreType == Enums.IntoStoreType.厂商代发入仓) && state == "QianShou") inStoreOrderCheckTaskList = fsql.Select().Where(i => orderIds.Contains(i.OrderId)).ToList(); #endregion #region 计算订单状态和采购单状态 foreach (var order in orderList) { var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList(); var currentPurchaseOrderList = purchaseOrderList.Where(po => po.OrderId == order.Id).ToList(); #region 计算采购单状态 foreach (var po in currentPurchaseOrderList) { var currentPoSkuList = orderPurchaseSkuList.Where(posku => posku.PurchaseOrderId == po.PurchaseOrderId).ToList(); var currentPeoList = purchaseExpressOrderList.Where(peo => peo.PurchaseOrderId == po.PurchaseOrderId).ToList(); var peo = currentPeoList.FirstOrDefault(p => p.WaybillNo == wayBillNo); if (peo != null) peo.ExpressState = state; var oldPurchaseOrderState = po.OrderState; po.CalculationOrderState(order.IntoStoreType.Value, fsql, currentPoSkuList, currentPeoList); if (po.OrderState != oldPurchaseOrderState) { var update = fsql.Update(po.Id).Set(po => po.OrderState, po.OrderState); updateOrderPurchaseList.Add(update); } } #endregion #region 推送齐库到货情况 if (order.IntoStoreType == Enums.IntoStoreType.发回齐越 && state == "QianShou") { Task.Factory.StartNew(() => qiKuManager.PublishQikuReceiveInfo(order.Id, wayBillNo, currentPurchaseOrderList, currentOrderSkuList, purchaseExpressOrderList, orderPurchaseRelationList, orderPurchaseSkuList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } #endregion #region 计算订单状态 var oldOrderState = order.OrderState; order.CalculationOrderState(fsql, currentOrderSkuList, currentPurchaseOrderList); if (order.OrderState != oldOrderState) { var update = fsql.Update(order.Id).Set(o => o.OrderState, order.OrderState); updateOrderList.Add(update); #region 通知C端状态 Task.Factory.StartNew(() => SendPurchaseOrderStateToC(order.Id, order.OrderState.Value), CancellationToken.None, TaskCreationOptions.None, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); #endregion #region 创建待核算任务 if (order.OrderState == Enums.OrderState.待核算) { var isExists = fsql.Select().Where(t => t.OrderId == order.Id && t.TaskType == Enums.TimeLimitTaskType.待核算任务).Any(); if (!isExists) { //创建待核算任务 var t = new TimeLimitTask() { CreateTme = DateTime.Now, Id = idGenerator.NewLong(), OrderId = order.Id, //SkuId = orderSku.SkuId, OrderSn = order.OrderSn, ShopId = order.ShopId, TaskType = Enums.TimeLimitTaskType.待核算任务, ExpirationTime = DateTime.Now.AddDays(1) }; insertTimeLimitTaskList.Add(t); } } #endregion } #endregion #region 创建入仓单检查任务 if (order.IntoStoreType == Enums.IntoStoreType.厂商代发入仓 && state == "QianShou" && order.OrderState == Enums.OrderState.待验收 && inStoreOrderCheckTaskList != null && !inStoreOrderCheckTaskList.Any(x => x.OrderId == order.Id)) { insertInStoreOrderCheckTaskList.Add(new InStoreOrderCheckTask() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, IsChecked = false, OrderId = order.Id, ShopId = order.ShopId, OrderSn = order.OrderSn }); } #endregion } #endregion #region 更新数据库 fsql.Transaction(() => { updatePurchaseExpressOrder?.ExecuteAffrows(); if (updateOrderPurchaseList.Count() > 0) { foreach (var update in updateOrderPurchaseList) update.ExecuteAffrows(); } if (updateOrderList.Count() > 0) { foreach (var update in updateOrderList) update.ExecuteAffrows(); } if (insertTimeLimitTaskList.Count() > 0) fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows(); if (insertInStoreOrderCheckTaskList.Count() > 0) fsql.Insert(insertInStoreOrderCheckTaskList).ExecuteAffrows(); }); #endregion } catch (Exception ex) { nLogManager.GetLogger("快递100").Error(ex, wayBillNo); } } /// /// 采购单信息变更(改价,付款) /// /// 采购单Id /// 当不需要触发订单改价时是否继续走流程 public void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce) { bool isEditOrderPrice = true; try { var orderPurchaseInfo = fsql.Select().Where(opi => opi.PurchaseOrderId == purchaseOrderId && opi.IsEnabled == true).ToOne(); if (orderPurchaseInfo == null) throw new Exception($"采购单{purchaseOrderId}-未查询到采购单"); var dbOrder = fsql.Select(orderPurchaseInfo.OrderId).ToOne(); var dbOrderPurchaseInfoList = fsql.Select().Where(opi => opi.OrderId == orderPurchaseInfo.OrderId && opi.IsEnabled == true).ToList(); if (dbOrderPurchaseInfoList.Count() == 0) throw new Exception($"采购单{purchaseOrderId}-未查询到订单{orderPurchaseInfo.OrderId}的采购单集合"); isEditOrderPrice = dbOrderPurchaseInfoList.Count() == dbOrderPurchaseInfoList.Count(opi => opi.PurchasePlatform == Enums.Platform.阿里巴巴 && opi.PurchaseMethod == Enums.PurchaseMethod.线上采购) && dbOrder.OrderState != Enums.OrderState.已取消 && dbOrder.OrderState != Enums.OrderState.部分采购; if (!keepRunWhenNoEditOrderPirce && !isEditOrderPrice) return; var dbOrderCost = fsql.Select(dbOrder.Id).ToOne(); if (dbOrderCost == null) throw new Exception($"采购单{purchaseOrderId}-未查询到订单{dbOrder.Id}的成本"); var purchaseAccount = fsqlManager.MDSfsql.Select().Where(pa => pa.Id == orderPurchaseInfo.PurchaseAccountId).ToOne(); if (purchaseAccount == null) throw new Exception($"采购单{purchaseOrderId}-未查询到采购账号{orderPurchaseInfo.PurchaseAccountId}"); var shop = fsqlManager.MDSfsql.Select().Where(s => s.ShopId == dbOrder.ShopId.ToString()).ToOne(); var dbOrderCostDetails = fsql.Select().Where(ocd => ocd.OrderId == dbOrder.Id && ocd.IsEnabled == true).ToList(); if (dbOrderCostDetails.Count() == 0) throw new Exception($"采购单{purchaseOrderId}-未查询到订单{orderPurchaseInfo.OrderId}的明细成本"); var dbPurchaseOrderIdList = dbOrderPurchaseInfoList.Select(x => x.PurchaseOrderId).ToList(); var dbOrderPurchaseRelationInfos = fsql.Select().Where(x => dbPurchaseOrderIdList.Contains(x.PurchaseOrderId)).ToList(); if (dbOrderPurchaseRelationInfos.Count() == 0) throw new Exception($"采购单{purchaseOrderId}-未查询到采购单关联明细"); var dbOrderSkus = fsql.Select().Where(osku => osku.OrderId == dbOrder.Id).ToList(); var dbOrderSkuCostList = fsql.Select().Where(osc => osc.OrderId == dbOrder.Id).ToList(); List> updateOrderCostDetailList = new List>(); IUpdate updateOrderCost = null; IList> updateOrderSkuList = new List>(); IUpdate updateOrder = null; List insertOrderSkuCostList = new List(); IList> updateOrderSkuCostList = new List>(); IList op_EditPriceSkuRequests = new List(); IUpdate updatePurchaseOrder = null; IDictionary oskuPriceEditParamDictionary = new Dictionary(); var ppclient = ppPlatformClientFactory.GetClient(AdapterEnums.PlatformType.阿里巴巴); var totalPurchaseProductAmount = 0M; var totalPurchaseFreight = 0M; foreach (var opi in dbOrderPurchaseInfoList) { if (opi.PurchasePlatform != Enums.Platform.阿里巴巴) continue; var purchaseOrderSimpleInfo = ppclient.QueryOrderDetail(new PP_QueryOrderDetailRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, OrderId = opi.PurchaseOrderId }); totalPurchaseProductAmount += purchaseOrderSimpleInfo.ProductAmount; totalPurchaseFreight += purchaseOrderSimpleInfo.FreightAmount; var currentPurchaseOrderRelationInfos = dbOrderPurchaseRelationInfos.Where(x => x.PurchaseOrderId == opi.PurchaseOrderId).ToList(); var cargoParamList = currentPurchaseOrderRelationInfos.Select(x => new CargoParamRequest() { SkuId = x.PurchaseSkuId, BelongSkuId = x.BelongSkuId, ProductId = x.PurchaseProductId, Quantity = x.Quantity ?? 1, SpecId = x.PurchaseSpecId, SchemeId = x.SchemeId.Value }).ToList(); #region 等比计算采购成本 var proportionalCalculationResultList = ProportionalCalculationCost(cargoParamList, purchaseOrderSimpleInfo); foreach (var proportionalCalculationResult in proportionalCalculationResultList) { var skuId = proportionalCalculationResult.SkuId; #region 订单sku平价 if (isEditOrderPrice) { var orderSku = dbOrderSkus.FirstOrDefault(osku => osku.SkuId == skuId); if (!oskuPriceEditParamDictionary.TryGetValue(orderSku.SkuId, out OP_EditPriceSkuRequest editSkuPrice)) { editSkuPrice = new OP_EditPriceSkuRequest() { SkuId = orderSku.SkuId, OrderSkuId = orderSku.Id.ToString(), InPackAmountPrice = orderSku.InPackAmount ?? 0M }; oskuPriceEditParamDictionary.Add(orderSku.SkuId, editSkuPrice); } editSkuPrice.Price += proportionalCalculationResult.ProductAmount / (orderSku.ItemTotal ?? 1M); editSkuPrice.Freight += proportionalCalculationResult.FreightAmount; } #endregion #region 更新sku成本明细 var dbOrderSkuDetail = dbOrderCostDetails.FirstOrDefault(ocd => ocd.SkuId == skuId && ocd.PurchaseOrderId == opi.PurchaseOrderId); dbOrderSkuDetail.CalculationOrderCostDetailCostAndProfit(proportionalCalculationResult.ProductAmount, proportionalCalculationResult.FreightAmount, dbOrderSkuDetail.OutPackAmount ?? 0M, dbOrderSkuDetail.DeliveryExpressFreight ?? 0M); updateOrderCostDetailList.Add(fsql.Update().SetSource(dbOrderSkuDetail)); #endregion } #endregion //var purchaseSkuTotalQuantity = purchaseOrderSimpleInfo.ItemList.Sum(x => x.Quantity); //var belongSkuGroups = currentPurchaseOrderRelationInfos.GroupBy(p => p.BelongSkuId); //foreach (var belongSkuGroup in belongSkuGroups) //{ // var belongSkuId = belongSkuGroup.Key; // var currentOrderSkuCargoParamList = belongSkuGroup.ToList(); //找当前skuId的采购skuId // var currentOrderSkuProductAmount = 0M; //采购成本 // var currentSkuTotalPurchaseQuantity = currentOrderSkuCargoParamList.Sum(x => x.Quantity); //当前skuId的采购数量总和 // var currentPurchaseFreight = purchaseOrderSimpleInfo.FreightAmount * // (1.0M * currentSkuTotalPurchaseQuantity / purchaseSkuTotalQuantity); //采购运费 // foreach (var currentOrderSkuCargo in currentOrderSkuCargoParamList) // { // var currentPurchaseSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.PurchaseSkuId) // .Sum(p => p.ProductAmount); // var currentPurchaseSkuTotalQuantity = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.PurchaseSkuId) // .Sum(p => p.Quantity); // currentOrderSkuProductAmount += currentPurchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity.Value / currentPurchaseSkuTotalQuantity); // } // #region 订单sku平价 // var orderSku = dbOrderSkus.FirstOrDefault(osku => osku.SkuId == belongSkuId); // if (isEditOrderPrice) // { // if (!oskuPriceEditParamDictionary.TryGetValue(orderSku.SkuId, out OP_EditPriceSkuRequest editSkuPrice)) // { // editSkuPrice = new OP_EditPriceSkuRequest() // { // SkuId = orderSku.SkuId, // OrderSkuId = orderSku.Id.ToString(), // InPackAmountPrice = orderSku.InPackAmount ?? 0M // }; // oskuPriceEditParamDictionary.Add(orderSku.SkuId, editSkuPrice); // } // editSkuPrice.Price += currentOrderSkuProductAmount / (orderSku.ItemTotal ?? 1M); // editSkuPrice.Freight += currentPurchaseFreight ?? 0M; // //orderSku.Price = // //orderSku.BuyerPayFreight = currentPurchaseFreight; // //if (!op_EditPriceSkuRequests.Any(x => x.SkuId == orderSku.SkuId)) // //{ // // op_EditPriceSkuRequests.Add(new OP_EditPriceSkuRequest() // // { // // Freight = currentPurchaseFreight ?? 0M, // // InPackAmountPrice = orderSku.InPackAmount ?? 0M, // // OrderSkuId = orderSku.Id.ToString(), // // Price = orderSku.Price ?? 0M, // // SkuId = orderSku.SkuId // // }); // // updateOrderSkuList.Add(fsql.Update(orderSku.Id).Set(osku => osku.Price, orderSku.Price) // // .Set(osku => osku.BuyerPayFreight, orderSku.BuyerPayFreight)); // //} // } // #endregion // var dbOrderSkuDetail = dbOrderCostDetails.FirstOrDefault(ocd => ocd.SkuId == belongSkuId && ocd.PurchaseOrderId == opi.PurchaseOrderId); // dbOrderSkuDetail.CalculationOrderCostDetailCostAndProfit(currentOrderSkuProductAmount, // currentPurchaseFreight ?? 0M, // dbOrderSkuDetail.OutPackAmount ?? 0M, // dbOrderSkuDetail.DeliveryExpressFreight ?? 0M); // updateOrderCostDetailList.Add(fsql.Update().SetSource(dbOrderSkuDetail)); //} } if (isEditOrderPrice) { #region 更新订单sku金额 foreach (var editSkuPriceKey in oskuPriceEditParamDictionary.Keys) { oskuPriceEditParamDictionary.TryGetValue(editSkuPriceKey, out var editSkuPrice); var orderSku = dbOrderSkus.FirstOrDefault(osku => osku.SkuId == editSkuPrice.SkuId); orderSku.Price = editSkuPrice.Price; orderSku.BuyerPayFreight = editSkuPrice.Freight; op_EditPriceSkuRequests.Add(editSkuPrice); updateOrderSkuList.Add(fsql.Update(orderSku.Id).Set(osku => osku.Price, orderSku.Price) .Set(osku => osku.BuyerPayFreight, orderSku.BuyerPayFreight)); } #endregion #region 更新订单金额 dbOrder.OrderTotalPrice = totalPurchaseProductAmount + totalPurchaseFreight; dbOrder.OrderSellerPrice = totalPurchaseProductAmount; dbOrder.FreightPrice = totalPurchaseFreight; updateOrder = fsql.Update(dbOrder.Id).Set(o => o.OrderTotalPrice, dbOrder.OrderTotalPrice) .Set(o => o.OrderSellerPrice, dbOrder.OrderSellerPrice) .Set(o => o.FreightPrice, dbOrder.FreightPrice); updatePurchaseOrder = fsql.Update(orderPurchaseInfo.Id).Set(opi => opi.IsAutoEditOrderPrice, Enums.AutoEditOrderPriceType.已平价); #endregion } #region 订单Sku成本 foreach (var orderSku in dbOrderSkus) { var orderSkuCost = dbOrderSkuCostList.FirstOrDefault(osc => osc.SkuId == orderSku.SkuId); if (orderSkuCost == null) { orderSkuCost = new OrderSkuCost() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, OrderId = dbOrder.Id, SkuId = orderSku.SkuId }; orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, dbOrderCostDetails); insertOrderSkuCostList.Add(orderSkuCost); } else { orderSkuCost.CalculationOrderSkuCostAndProfit(orderSku, dbOrderCostDetails); var update = fsql.Update().SetSource(orderSkuCost); updateOrderSkuCostList.Add(update); } } #endregion #region 订单成本 dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice.Value, dbOrderSkuCostList.Union(insertOrderSkuCostList).ToList()); //dbOrderCost.CalculationOrderCostAndProfit(dbOrder.OrderTotalPrice ?? 0M, // totalPurchaseProductAmount, // totalPurchaseFreight, // dbOrderCostDetails.Sum(ocd => ocd.OutPackAmount ?? 0M), // dbOrderCostDetails.Sum(ocd => ocd.DeliveryExpressFreight ?? 0M)); updateOrderCost = fsql.Update().SetSource(dbOrderCost); #endregion fsql.Transaction(() => { updatePurchaseOrder?.ExecuteAffrows(); foreach (var update in updateOrderCostDetailList) update.ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); foreach (var update in updateOrderSkuList) update.ExecuteAffrows(); updateOrder?.ExecuteAffrows(); if (insertOrderSkuCostList.Count() > 0) fsql.Insert(insertOrderSkuCostList).ExecuteAffrows(); if (updateOrderSkuCostList.Count() > 0) { foreach (var update in updateOrderSkuCostList) update.ExecuteAffrows(); } }); if (isEditOrderPrice) { #region 通知拳探改价 var opclient = opPlatformClientFactory.GetClient(AdapterEnums.PlatformType.拳探); opclient.EditPrice(new OP_EditPriceRequest() { AppKey = shop.AppKey, AppSecret = shop.AppSecret, AppToken = shop.AppToken, OrderId = dbOrder.Id, EditItems = op_EditPriceSkuRequests }); #endregion #region 通知C端改价 restApiService.SendRequest("https://bbwy.qiyue666.com", "/Api/PurchaseOrder/QuanTanEditPriceCallback", new { orderId = dbOrder.Id }, null, HttpMethod.Post); #endregion } } catch (Exception ex) { nLogManager.Default().Error(ex, $"OrderPriceModificationCallback 采购单号{purchaseOrderId}"); } } private void SendDingDing(string content) { try { dingDingBusiness.SendDingDingBotMessage("SEC5f08a3dd6813e50bf9a3b81350ec12a8086c64b9e29ef858a17f5cc7887906d7", "https://oapi.dingtalk.com/robot/send?access_token=7ce472411bb8dde0c3ff503fcca9ead84d39950ee3c4c65c808dbc58981eb929", content); } catch { } } private void SendPurchaseOrderStateToC(string orderId, Enums.OrderState orderState) { try { restApiService.SendRequest("https://bbwy.qiyue666.com", "api/BatchPurchase/UpdatePurchaseOrderState", new { OrderId = orderId, PurchaseOrderState = orderState }, null, HttpMethod.Post); } catch { } } /// /// 匹配采购方案 /// /// /// /// /// /// /// private IList MatchPurchaseScheme(string skuId, int itemTotal, string purchaserId, IList purchaseSchemeList, PP_QueryOrderDetailResponse purchaseOrderSimpleInfo) { List cargoParamList = new List(); var currentSkuSchemeList = purchaseSchemeList.Where(ps => ps.SkuId == skuId).ToList(); if (currentSkuSchemeList.Count() > 0) { foreach (var scheme in currentSkuSchemeList) { var samePurchaserProductList = scheme.PurchaseSchemeProductList.Where(psp => psp.PurchaserId == purchaserId).ToList(); if (samePurchaserProductList.Count() == 0) continue; bool isMatch = true; foreach (var schemeProduct in samePurchaserProductList) { if (schemeProduct.PurchaseSchemeProductSkuList.Any(pss => purchaseOrderSimpleInfo.ItemList.Count(x => x.SkuId == pss.PurchaseSkuId) == 0)) { isMatch = false; break; } } if (isMatch) { foreach (var schemeProduct in samePurchaserProductList) { cargoParamList.AddRange(schemeProduct.PurchaseSchemeProductSkuList.Select(pss => new CargoParamRequest() { BelongSkuId = pss.SkuId, ProductId = pss.PurchaseProductId, SkuId = pss.PurchaseSkuId, SchemeId = pss.SkuPurchaseSchemeId, SchemeVersion = scheme.Version, SpecId = pss.PurchaseSkuSpecId, Quantity = itemTotal * (pss.PurchaseRatio ?? 1) })); } break; } } } return cargoParamList; } /// /// 等比计算sku采购成本 /// /// /// /// private IList ProportionalCalculationCost(IList cargoParamList, PP_QueryOrderDetailResponse purchaseOrderSimpleInfo) { var list = new List(); var belongSkuGroups = cargoParamList.GroupBy(p => p.BelongSkuId); var purchaseSkuTotalQuantity = cargoParamList.Sum(x => x.Quantity); foreach (var belongSkuGroup in belongSkuGroups) { var skuId = belongSkuGroup.Key; //var currentOrderSkuCargoParamList = cargoParamList.Where(p => p.BelongSkuId == skuId); //找当前skuId的采购skuId var currentOrderSkuCargoParamList = belongSkuGroup.ToList(); //找当前skuId的采购skuId var currentSkuAmount = 0M; //采购成本 var currentSkuTotalPurchaseQuantity = currentOrderSkuCargoParamList.Sum(x => x.Quantity); //当前skuId的采购数量总和 var currentPurchaseFreight = purchaseOrderSimpleInfo.FreightAmount * (1.0M * currentSkuTotalPurchaseQuantity / purchaseSkuTotalQuantity); //采购运费 foreach (var currentOrderSkuCargo in currentOrderSkuCargoParamList) { var currentPurchaseSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) .Sum(p => p.ProductAmount); var currentPurchaseSkuTotalQuantity = cargoParamList.Where(p => p.SkuId == currentOrderSkuCargo.SkuId) .Sum(p => p.Quantity); currentSkuAmount += currentPurchaseSkuProductAmount * (1.0M * currentOrderSkuCargo.Quantity / currentPurchaseSkuTotalQuantity); } list.Add(new ProportionalCalculationCostResult() { SkuId = skuId, FreightAmount = currentPurchaseFreight, ProductAmount = currentSkuAmount }); } return list; } } }