using BBWY.Common.Http; using BBWY.Common.Models; using BBWY.Server.Business.Extensions; using BBWY.Server.Business.PlatformSDK.DataExtension; using BBWY.Server.Model; using BBWY.Server.Model.Db; using BBWY.Server.Model.Dto; using FreeSql; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NLog; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; using Yitter.IdGenerator; namespace BBWY.Server.Business { public class OrderSyncBusiness : BaseSyncBusiness, IDenpendency { private IDictionary> syncOrderMethodDic; private IMemoryCache memoryCache; private IList validOrderState; public OrderSyncBusiness(RestApiService restApiService, IOptions options, NLogManager nLogManager, IFreeSql fsql, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager, VenderBusiness venderBusiness, IMemoryCache memoryCache, YunDingBusiness yunDingBusiness) : base(restApiService, options, nLogManager, fsql, idGenerator, taskSchedulerManager, venderBusiness, yunDingBusiness) { this.memoryCache = memoryCache; syncOrderMethodDic = new Dictionary>() { { Enums.Platform.京东, SyncJDOrder } }; this.validOrderState = new List() { "WAIT_SELLER_STOCK_OUT","WAIT_GOODS_RECEIVE_CONFIRM","FINISHED_L","LOCKED","TRADE_CANCELED","POP_ORDER_PAUSE","PAUSE" }; } /// /// 手动同步订单 /// /// /// /// /// public void ManualSyncOrder(long shopId, string orderId, DateTime? startTime = null, DateTime? endTime = null) { var shop = venderBusiness.GetShopByShopId(shopId.ToString()); SyncOrder(shop, orderId, startTime, endTime, isAuto: false, Enums.SortTimeType.StartTime); } /// /// 手动同步订单 /// /// /// /// /// public void ManualSyncOrder(long shopId, IList orderIds, DateTime? startTime = null, DateTime? endTime = null) { var shop = venderBusiness.GetShopByShopId(shopId.ToString()); Task.Factory.StartNew(() => { var i = 1; foreach (var orderId in orderIds) { SyncOrder(shop, orderId, startTime, endTime, isAuto: false, Enums.SortTimeType.StartTime); Thread.Sleep(500); i++; Console.WriteLine(); Console.WriteLine($"Sync Order {orderId}, {i}"); } Console.WriteLine("job done"); }, System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); } private void SyncOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false, Enums.SortTimeType? sortTimeType = null) { try { //logger.Info($"订单同步 {shop.ShopName} isAuto {isAuto}"); if (!syncOrderMethodDic.ContainsKey(shop.PlatformId)) throw new Exception("不支持的平台"); var shopId = long.Parse(shop.ShopId); var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId); var orderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetOrderList", new SearchPlatformOrderRequest() { StartDate = startTime ?? DateTime.Now.AddHours(shop.ShopName.Contains("腾奇") ? -0.5 : -3), EndDate = endTime ?? DateTime.Now, AppKey = shop.AppKey, AppSecret = shop.AppSecret, AppToken = shop.AppToken, PageIndex = 1, PageSize = 100, Platform = shop.PlatformId, JDColType = string.IsNullOrEmpty(shop.ShopType) ? "0" : shop.ShopType, //SaveResponseLog = true, OrderId = orderId, SortTimeType = sortTimeType }, GetYunDingRequestHeader(), HttpMethod.Post, timeOutSeconds: 120); if (orderListApiResult.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception($"获取订单失败 {orderListApiResult.Content}"); var orderListResponse = JsonConvert.DeserializeObject>(orderListApiResult.Content); if (!orderListResponse.Success) throw new Exception($"获取订单失败 {orderListApiResult.Content}"); if (orderListResponse.Data == null || orderListResponse.Data.Count == 0) return; syncOrderMethodDic[shop.PlatformId](orderListResponse.Data, shopId, relayAPIHost, shop.AppKey, shop.AppSecret, shop.AppToken, shop.PlatformCommissionRatio ?? 0.05M); } catch (Exception ex) { var shopData = JsonConvert.SerializeObject(shop); nLogManager.Default().Error(ex, $"SyncOrder ShopData:{shopData}"); } } public void SyncOrderByDate(SyncOrderByDateRequest syncOrderByDateRequest) { if (fsql.Select().Where(ost => ost.ShopId == syncOrderByDateRequest.ShopId && ost.State == Enums.OrderSyncState.Running).Any()) throw new BusinessException("存在未结束的同步任务,请稍后同步"); syncOrderByDateRequest.EndTime = syncOrderByDateRequest.EndTime.Date.AddDays(1).AddSeconds(-1); if ((syncOrderByDateRequest.EndTime - syncOrderByDateRequest.StartTime).Days > 7) throw new BusinessException("同步任务时差最长7天"); var orderSyncTask = new OrderSyncTask() { Id = idGenerator.NewLong(), ShopId = syncOrderByDateRequest.ShopId, State = Enums.OrderSyncState.Running, SyncStartTime = syncOrderByDateRequest.StartTime, SyncEndTime = syncOrderByDateRequest.EndTime }; fsql.Insert(orderSyncTask).ExecuteAffrows(); Task.Factory.StartNew(() => { var currentStartTime = syncOrderByDateRequest.StartTime; var currentEndTime = currentStartTime.AddHours(3); var keeploop = true; while (keeploop) { try { ManualSyncOrder(syncOrderByDateRequest.ShopId, string.Empty, currentStartTime, currentEndTime); } catch (Exception ex) { } finally { var lessHour = (syncOrderByDateRequest.EndTime - currentEndTime).TotalHours; if (lessHour > 3) { currentStartTime = currentStartTime.AddHours(3); currentEndTime = currentEndTime.AddHours(3); } else if (lessHour > 0 && lessHour < 3) { currentStartTime = currentEndTime; currentEndTime = syncOrderByDateRequest.EndTime; } else if (lessHour <= 0) { keeploop = false; } } } try { fsql.Update(orderSyncTask.Id).Set(ost => ost.State, Enums.OrderSyncState.End).ExecuteAffrows(); } catch (Exception ex) { } }, System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); } private void SyncJDOrder(JArray orderTokenJArray, long shopId, string relayAPIHost, string appKey, string appSecret, string appToken, decimal platformCommissionRatio) { var validOrders = orderTokenJArray.Where(o => validOrderState.Contains(o.Value("orderState"))); if (validOrders.Count() == 0) return; #region 数据库操作 List insertOrderList = new List(); List insertOrderConsigneeList = new List(); List insertOrderCostList = new List(); List insertOrderCostDetailList = new List(); List insertOrderSkuList = new List(); List insertOrderCouponList = new List(); List insertOrderTotalInfoList = new List(); IList> updateOrderList = new List>(); Dictionary> updateOrderSkuDictionary = new Dictionary>(); IList> updatePurchaseOrderList = new List>(); #endregion var interfaceOrderIdList = validOrders.Select(orderJToken => orderJToken.Value("orderId")); var interfaceCanceledOrderIdList = validOrders.Where(orderJToken => orderJToken.Value("orderState").Equals("TRADE_CANCELED")) .Select(orderJToken => orderJToken.Value("orderId")); //接口查询结果中取消状态的订单Id var dbOrderList = fsql.Select().Where(o => interfaceOrderIdList.Contains(o.Id)).ToList(o => new Order { Id = o.Id, OrderState = o.OrderState, StorageType = o.StorageType, BuyerRemark = o.BuyerRemark, VenderRemark = o.VenderRemark, ModifyTime = o.ModifyTime, EndTime = o.EndTime, WaybillNo = o.WaybillNo, FreightPrice = o.FreightPrice, OrderPayment = o.OrderPayment, SellerPreferentialAmount = o.SellerPreferentialAmount, OrderSellerPrice = o.OrderSellerPrice, OrderTotalPrice = o.OrderTotalPrice, StoreOrder = o.StoreOrder, PreferentialAmount = o.PreferentialAmount, StoreId = o.StoreId, IsGift = o.IsGift }); //数据库订单 var dbOrderConsigneeList = fsql.Select().Where(oc => interfaceOrderIdList.Contains(oc.OrderId)).ToList(); //数据库订单收货信息 var dbOrderCostList = fsql.Select().Where(oc => interfaceOrderIdList.Contains(oc.OrderId)).ToList(); //数据库订单成本信息 var dbOrderCouponList = fsql.Select().Where(oc => interfaceOrderIdList.Contains(oc.OrderId)).ToList(); //数据库订单优惠信息 var dbOrderSkuList = fsql.Select().Where(osku => interfaceOrderIdList.Contains(osku.OrderId)).ToList(); //数据库sku信息 List dbOrderCostDetailList = null; //数据库成本明细 if (interfaceCanceledOrderIdList.Count() > 0 && dbOrderList.Any(dbOrder => interfaceCanceledOrderIdList.Contains(dbOrder.Id) && dbOrder.OrderState != Enums.OrderState.已取消)) { dbOrderCostDetailList = fsql.Select().Where(ocd => interfaceCanceledOrderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList(); } #region 优惠券/促销/拆分明细 //var dbOrderCouponNewList = fsql.Select().Where(ocn => interfaceOrderIdList.Contains(ocn.OrderId)).ToList(); //var dbOrderPromotionList = fsql.Select().Where(op => interfaceOrderIdList.Contains(op.OrderId)).ToList(); var dbOrderTotalList = fsql.Select().Where(ot => interfaceOrderIdList.Contains(ot.Id)).ToList(); #endregion var orderSkuIds = new List(); foreach (var orderJToken in validOrders) { var itemInfoList = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value("jdPrice") != 0M); foreach (var josku in itemInfoList) { var skuId = josku.Value("skuId"); if (!orderSkuIds.Contains(skuId)) orderSkuIds.Add(skuId); } } var dbPurchaseOrderList = fsql.Select().Where(po => po.ShopId == shopId && po.RemainingQuantity != 0 && orderSkuIds.Contains(po.SkuId)).ToList(); //数据库采购单 orderSkuIds.Clear(); foreach (var orderJToken in validOrders) { var orderId = orderJToken.Value("orderId"); if (insertOrderList.Any(o => o.Id == orderId)) continue; var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == orderId); var isNewOrder = dbOrder == null; SDCalculationCostRequest sDCalculationCostRequest = null; //SD信息埋点 #region 订单基本信息 var buyerRemark = orderJToken.Value("orderRemark"); var venderRemark = orderJToken.Value("venderRemark"); var modifyTime = orderJToken.Value("modified"); var endTime = orderJToken.Value("orderEndTime"); var waybillNo = orderJToken.Value("waybill"); var freightPrice = orderJToken.Value("freightPrice"); var orderPayment = orderJToken.Value("orderPayment"); var sellerPreferentialAmount = orderJToken.Value("sellerDiscount"); var orderSellerPrice = orderJToken.Value("orderSellerPrice"); var orderTotalPrice = orderJToken.Value("orderTotalPrice"); var storeOrder = orderJToken.Value("storeOrder") ?? string.Empty; var storeId = orderJToken.Value("storeId"); var storageType = ConvertStoreOrder(storeOrder); var preferentialAmount = 0M; if (dbOrder == null) { dbOrder = new Order() { Id = orderId, BuyerRemark = buyerRemark, VenderRemark = venderRemark, FreightPrice = freightPrice, EndTime = endTime, StartTime = orderJToken.Value("orderStartTime"), ModifyTime = modifyTime, OrderPayment = orderPayment, SellerPreferentialAmount = sellerPreferentialAmount, OrderSellerPrice = orderSellerPrice, OrderTotalPrice = orderTotalPrice, OrderType = (Enums.OrderType)orderJToken.Value("orderType"), Platform = Enums.Platform.京东, ShopId = shopId, //VenderId = orderJToken.Value("venderId"), WaybillNo = waybillNo, StoreOrder = storeOrder, StoreId = storeId, IsGift = orderSellerPrice == 0M, StorageType = storageType }; if (memoryCache.TryGetValue(orderId, out sDCalculationCostRequest)) { dbOrder.StorageType = Enums.StorageType.SD; dbOrder.SDType = sDCalculationCostRequest.SDType; dbOrder.Flag = sDCalculationCostRequest.Flag; if (!string.IsNullOrEmpty(sDCalculationCostRequest.VenderRemark)) dbOrder.VenderRemark = sDCalculationCostRequest.VenderRemark; dbOrder.SDKey = sDCalculationCostRequest.SDKey; dbOrder.SDPayBillNo = sDCalculationCostRequest.SDPayBillNo; dbOrder.SDOperator = sDCalculationCostRequest.SDOperator; dbOrder.SDPayChannel = sDCalculationCostRequest.SDPayChannel; } var payType = orderJToken.Value("payType"); if (payType.Contains("-")) dbOrder.PayType = (Enums.PayType)Convert.ToInt32(payType.Substring(0, 1)); insertOrderList.Add(dbOrder); #region OrderSku var itemInfoList = orderJToken["itemInfoList"] as JArray; foreach (var orderSkuJToken in itemInfoList) { var itemTotal = orderSkuJToken.Value("itemTotal"); var jdPrice = orderSkuJToken.Value("jdPrice"); var wareId = orderSkuJToken.Value("wareId"); var skuId = orderSkuJToken.Value("skuId"); //if (orderSkuJToken.Value("jdPrice") != 0M) //{ var osku = new OrderSku() { Id = idGenerator.NewLong(), ItemTotal = itemTotal, Price = jdPrice, ProductId = wareId, Title = orderSkuJToken.Value("skuName").SimplifySkuName(), ProductNo = orderSkuJToken.Value("productNo"), CreateTime = DateTime.Now, OrderId = orderId, SkuId = skuId }; insertOrderSkuList.Add(osku); //} //CumulativeSkuDailySalesDetail(skuDailySalesDetailDictionary, dbOrder.StartTime.Value, shopId, skuId, wareId, jdPrice, itemTotal); } #endregion } else { //preferentialAmount = dbOrder.PreferentialAmount; if (storageType != null && dbOrder.StorageType != storageType) dbOrder.StorageType = storageType; var currentDbOrderSkuList = dbOrderSkuList.Where(osku => osku.OrderId == orderId).ToList(); var itemInfoList = orderJToken["itemInfoList"] as JArray; foreach (var orderSkuJToken in itemInfoList) { //var itemTotal = orderSkuJToken.Value("itemTotal"); //var jdPrice = orderSkuJToken.Value("jdPrice"); var wareId = orderSkuJToken.Value("wareId"); var skuId = orderSkuJToken.Value("skuId"); var dbOsku = currentDbOrderSkuList.FirstOrDefault(osku => osku.SkuId == skuId); var skuUpdateKey = $""; if (dbOsku != null && dbOsku.ProductId != wareId && !updateOrderSkuDictionary.ContainsKey(skuUpdateKey)) { var update = fsql.Update(dbOsku.Id).Set(osku => osku.ProductId, wareId); updateOrderSkuDictionary.Add(skuUpdateKey, update); } } } #endregion #region 收货人信息 if (dbOrderConsigneeList.FirstOrDefault(oc => oc.OrderId == orderId) == null) { var orderConsignee = new OrderConsignee() { OrderId = orderId, City = orderJToken["consigneeInfo"].Value("city"), Province = orderJToken["consigneeInfo"].Value("province"), County = orderJToken["consigneeInfo"].Value("county"), Town = orderJToken["consigneeInfo"].Value("town"), IsDecode = false, CreateTime = DateTime.Now }; insertOrderConsigneeList.Add(orderConsignee); } #endregion #region 订单优惠 var orderCouponJArray = (JArray)orderJToken["couponDetailList"]; if (orderCouponJArray.HasValues) { foreach (var orderCouponJToken in orderCouponJArray) { var couponType = orderCouponJToken.Value("couponType"); if (string.IsNullOrEmpty(couponType)) continue; //dbOrder.PreferentialAmount += orderCouponJToken.Value("couponPrice"); preferentialAmount += orderCouponJToken.Value("couponPrice"); if (!dbOrderCouponList.Any(oc => oc.OrderId == orderId)) { insertOrderCouponList.Add(new OrderCoupon() { Id = idGenerator.NewLong(), SkuId = orderCouponJToken.Value("skuId"), OrderId = orderId, CreateTime = DateTime.Now, CouponType = couponType, CouponPrice = orderCouponJToken.Value("couponPrice") }); } } } #endregion #region 订单状态转换 var orderState = ConvertOrderState(orderJToken, dbOrder.StorageType); #endregion #region 取消订单恢复库存 if (orderState == Enums.OrderState.已取消 && !isNewOrder && dbOrder.OrderState != Enums.OrderState.已取消 && dbOrder.StorageType != Enums.StorageType.SD && dbOrder.StorageType != Enums.StorageType.代发) { var currentOrderCostDetailList = dbOrderCostDetailList.Where(ocd => ocd.OrderId == orderId); if (currentOrderCostDetailList.Count() > 0) { foreach (var orderCostDetail in currentOrderCostDetailList) { var updateSql = fsql.Update(orderCostDetail.PurchaseOrderPKId) .Set(po => po.RemainingQuantity + orderCostDetail.DeductionQuantity); updatePurchaseOrderList.Add(updateSql); } } } #endregion #region 扣减库存, 计算成本 if (dbOrder.StorageType != null && dbOrder.StorageType != Enums.StorageType.代发 && orderState != null && orderState != Enums.OrderState.待付款 && orderState != Enums.OrderState.已取消) { var orderCost = dbOrderCostList.FirstOrDefault(oc => oc.OrderId == dbOrder.Id); if (orderCost == null && orderSellerPrice > 0M) { if (isNewOrder && dbOrder.StorageType == Enums.StorageType.SD && sDCalculationCostRequest != null) { //检查SD埋点 if (sDCalculationCostRequest.PlatformCommissionRatio == 0M) sDCalculationCostRequest.PlatformCommissionRatio = 0.05M; orderCost = new OrderCost() { OrderId = sDCalculationCostRequest.OrderId, PlatformCommissionRatio = sDCalculationCostRequest.PlatformCommissionRatio, PreferentialAmount = preferentialAmount, Profit = 0, DeliveryExpressFreight = sDCalculationCostRequest.DeliveryExpressFreight, CreateTime = DateTime.Now, IsManualEdited = true, SDCommissionAmount = sDCalculationCostRequest.SDCommissionAmount, SDOrderAmount = sDCalculationCostRequest.SDOrderAmount }; orderCost.CalculationSDOrderProfitAndCost(dbOrder, null); insertOrderCostList.Add(orderCost); } else if (!fsql.Select(dbOrder.Id).Any()) //再查询一次数据库,以防同步开始执行后被人为操作扣减库存,造成重复扣减库存 { var orderSkuJArray = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value("jdPrice") != 0M); if (orderSkuJArray != null && orderSkuJArray.Count() > 0) { var orderCostPurchaseAmount = 0M; var orderDeliveryExpressFreight = 0M; //发货总运费,sku购买数量第二个开始半价 var avgPreferential = preferentialAmount / orderSkuJArray.Count(); #region 扣减库存 foreach (var orderSkuJToken in orderSkuJArray) { var orderSkuId = orderSkuJToken.Value("skuId"); var itemTotal = orderSkuJToken.Value("itemTotal"); //sku购买数量 var itemPrice = orderSkuJToken.Value("jdPrice"); //sku单价 var isReduceMultiTimes = false; //是否多次扣减库存 while (itemTotal != 0) { var purchaseOrder = dbPurchaseOrderList.FirstOrDefault(po => po.StorageType == dbOrder.StorageType && po.RemainingQuantity != 0 && po.SkuId == orderSkuId); if (purchaseOrder == null) break; //没有库存了 //本次扣减量 var deductionQuantity = purchaseOrder.RemainingQuantity >= itemTotal ? itemTotal : purchaseOrder.RemainingQuantity; //本次扣减量的采购成本 var currentPurchaseAmount = purchaseOrder.UnitCost * deductionQuantity; //本次扣减量的发货运费 var currentSkuDeliveryFreight = isReduceMultiTimes ? (purchaseOrder.SingleDeliveryFreight / 2 * deductionQuantity) : (purchaseOrder.SingleDeliveryFreight + purchaseOrder.SingleDeliveryFreight / 2 * (deductionQuantity - 1)); purchaseOrder.RemainingQuantity -= deductionQuantity; itemTotal -= deductionQuantity; //累计采购成本 orderCostPurchaseAmount += currentPurchaseAmount; //累计发货运费(销售运费) orderDeliveryExpressFreight += currentSkuDeliveryFreight; isReduceMultiTimes = true; var updateSql = fsql.Update(purchaseOrder.Id).Set(po => po.RemainingQuantity - deductionQuantity); updatePurchaseOrderList.Add(updateSql); var orderCostDetail = new OrderCostDetail() { Id = idGenerator.NewLong(), OrderId = orderId, ProductId = orderSkuJToken.Value("wareId"), SkuId = orderSkuId, CreateTime = DateTime.Now, PurchaseOrderPKId = purchaseOrder.Id, //UnitCost = purchaseOrder.UnitCost, DeductionQuantity = deductionQuantity, DeliveryExpressFreight = currentSkuDeliveryFreight, //TotalCost = currentPurchaseAmount, ConsumableAmount = purchaseOrder.SingleConsumableAmount * deductionQuantity, FirstFreight = purchaseOrder.SingleFirstFreight * deductionQuantity, //OperationAmount = purchaseOrder.SingleOperationAmount * deductionQuantity, InStorageAmount = purchaseOrder.SingleInStorageAmount * deductionQuantity, OutStorageAmount = purchaseOrder.SingleOutStorageAmount * deductionQuantity, PurchaseFreight = purchaseOrder.SingleFreight * deductionQuantity, SkuAmount = purchaseOrder.SingleSkuAmount * deductionQuantity, StorageAmount = purchaseOrder.SingleStorageAmount * deductionQuantity, IsEnabled = true }; orderCostDetail.SkuGrossProfit = itemPrice * deductionQuantity - avgPreferential - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - itemPrice * deductionQuantity * platformCommissionRatio; insertOrderCostDetailList.Add(orderCostDetail); } } #endregion #region 计算成本 orderCost = new OrderCost() { OrderId = orderId, PlatformCommissionRatio = platformCommissionRatio, PreferentialAmount = preferentialAmount, Profit = 0, PurchaseAmount = orderCostPurchaseAmount, DeliveryExpressFreight = orderDeliveryExpressFreight, CreateTime = DateTime.Now }; if (dbOrder.OrderTotalPrice != 0) orderCost.CalculationOrderProfitAndCost(dbOrder, null); else orderCost.CalculationOrderProfitAndCost(orderSellerPrice, freightPrice, null); insertOrderCostList.Add(orderCost); #endregion } } } } #endregion #region 检查订单信息是否变化 if (isNewOrder) { dbOrder.OrderState = orderState; dbOrder.PreferentialAmount = preferentialAmount; } else if ((orderState != null && orderState != dbOrder.OrderState) || buyerRemark != dbOrder.BuyerRemark || venderRemark != dbOrder.VenderRemark || modifyTime != dbOrder.ModifyTime || endTime != dbOrder.EndTime || waybillNo != dbOrder.WaybillNo || freightPrice != dbOrder.FreightPrice || orderPayment != dbOrder.OrderPayment || sellerPreferentialAmount != dbOrder.SellerPreferentialAmount || orderSellerPrice != dbOrder.OrderSellerPrice || (orderSellerPrice > 0M && dbOrder.IsGift) || orderTotalPrice != dbOrder.OrderTotalPrice || storeOrder != dbOrder.StoreOrder || preferentialAmount != dbOrder.PreferentialAmount || storeId != dbOrder.StoreId) { var updateSql = fsql.Update(orderId).SetIf(orderState != null && orderState != dbOrder.OrderState, o => o.OrderState, orderState) .SetIf(buyerRemark != dbOrder.BuyerRemark, o => o.BuyerRemark, buyerRemark) .SetIf(venderRemark != dbOrder.VenderRemark, o => o.VenderRemark, venderRemark) .SetIf(modifyTime != dbOrder.ModifyTime, o => o.ModifyTime, modifyTime) .SetIf(endTime != dbOrder.EndTime, o => o.EndTime, modifyTime) .SetIf(waybillNo != dbOrder.WaybillNo, o => o.WaybillNo, waybillNo) .SetIf(freightPrice != dbOrder.FreightPrice, o => o.FreightPrice, freightPrice) .SetIf(orderPayment != dbOrder.OrderPayment, o => o.OrderPayment, orderPayment) .SetIf(sellerPreferentialAmount != dbOrder.SellerPreferentialAmount, o => o.SellerPreferentialAmount, sellerPreferentialAmount) .SetIf(orderSellerPrice != dbOrder.OrderSellerPrice, o => o.OrderSellerPrice, orderSellerPrice) .SetIf(orderTotalPrice != dbOrder.OrderTotalPrice, o => o.OrderTotalPrice, orderTotalPrice) .SetIf(orderSellerPrice > 0M && dbOrder.IsGift == true, o => o.IsGift, false) .SetIf(storeOrder != dbOrder.StoreOrder, o => o.StoreOrder, storeOrder) .SetIf(storeOrder != dbOrder.StoreOrder, o => o.StorageType, storageType) .SetIf(preferentialAmount != dbOrder.PreferentialAmount, o => o.PreferentialAmount, preferentialAmount) .SetIf(storeId != dbOrder.StoreId, o => o.StoreId, storeId); updateOrderList.Add(updateSql); } #endregion #region 删除SD埋点 try { if (sDCalculationCostRequest != null) memoryCache.Remove(orderId); } catch { } #endregion #region 优惠券/促销/拆分明细 if (orderState != Enums.OrderState.暂停 && orderState != Enums.OrderState.待付款 && !dbOrderTotalList.Any(ot => ot.Id == orderId)) { } #endregion } #region 补齐sku logo if (insertOrderSkuList.Count() > 0) { foreach (var orderSku in insertOrderSkuList) { if (!orderSkuIds.Contains(orderSku.SkuId)) orderSkuIds.Add(orderSku.SkuId); } var orderSkuRequestCount = (orderSkuIds.Count() - 1) / 50 + 1; //sku最多一次请求50条 for (var i = 0; i < orderSkuRequestCount; i++) { var orderSkuIdString = string.Join(",", orderSkuIds.Skip(i * 50).Take(50)); var skuHttpResult = restApiService.SendRequest(relayAPIHost, "Api/PlatformSDK/GetSimpleProductSkuList", new SearchProductSkuRequest() { AppKey = appKey, AppSecret = appSecret, AppToken = appToken, Platform = Enums.Platform.京东, Sku = orderSkuIdString }, GetYunDingRequestHeader(), HttpMethod.Post); if (skuHttpResult.StatusCode != System.Net.HttpStatusCode.OK) continue; var skuResponse = JsonConvert.DeserializeObject>>(skuHttpResult.Content); if (!skuResponse.Success) continue; foreach (var sku in skuResponse.Data) { var insertSkus = insertOrderSkuList.Where(orderSku => orderSku.SkuId == sku.Id); foreach (var insertSku in insertSkus) { insertSku.Logo = sku.Logo; } } } } #endregion fsql.Transaction(() => { if (insertOrderList.Count() > 0) fsql.Insert(insertOrderList).ExecuteAffrows(); if (insertOrderSkuList.Count() > 0) fsql.Insert(insertOrderSkuList).ExecuteAffrows(); if (insertOrderConsigneeList.Count() > 0) fsql.Insert(insertOrderConsigneeList).ExecuteAffrows(); if (insertOrderCostList.Count() > 0) fsql.Insert(insertOrderCostList).ExecuteAffrows(); if (insertOrderCostDetailList.Count() > 0) fsql.Insert(insertOrderCostDetailList).ExecuteAffrows(); if (insertOrderCouponList.Count() > 0) fsql.Insert(insertOrderCouponList).ExecuteAffrows(); if (updatePurchaseOrderList.Count() > 0) { foreach (var update in updatePurchaseOrderList) update.ExecuteAffrows(); } if (updateOrderList.Count() > 0) { foreach (var update in updateOrderList) update.ExecuteAffrows(); } if (updateOrderSkuDictionary.Keys.Count() > 0) { foreach (var update in updateOrderSkuDictionary) update.Value.ExecuteAffrows(); } }); } private Enums.StorageType? ConvertStoreOrder(string storeOrder) { if (string.IsNullOrEmpty(storeOrder)) return null; if (storeOrder.Contains("京仓")) return Enums.StorageType.京仓; else if (storeOrder.Contains("云仓")) return Enums.StorageType.云仓; return null; } /// /// 同步所有店铺的订单 /// public void SyncAllShopOrder() { var shopList = venderBusiness.GetShopList(platform: Enums.Platform.京东); foreach (var shop in shopList) { Task.Factory.StartNew(() => SyncOrder(shop, string.Empty, isAuto: true), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); } } /// /// 转换订单状态 /// /// /// /// private Enums.OrderState? ConvertOrderState(JToken orderJToken, Enums.StorageType? storageType = null) { var jdOrderState = orderJToken.Value("orderState"); Enums.OrderState? orderState = null; #region SOP状态翻译 if (jdOrderState.Equals("NOT_PAY")) //未付款 { orderState = Enums.OrderState.待付款; } else if (jdOrderState.Equals("WAIT_SELLER_STOCK_OUT")) //等待出库 { orderState = Enums.OrderState.等待采购; if (storageType != null) orderState = Enums.OrderState.待出库; } else if (jdOrderState.Equals("WAIT_GOODS_RECEIVE_CONFIRM")) { orderState = Enums.OrderState.待收货; } else if (jdOrderState.Equals("FINISHED_L")) { orderState = Enums.OrderState.已完成; } else if (jdOrderState.Equals("LOCKED")) { orderState = Enums.OrderState.锁定; } else if (jdOrderState.Equals("TRADE_CANCELED")) { orderState = Enums.OrderState.已取消; } else if (jdOrderState.Equals("POP_ORDER_PAUSE") || jdOrderState.Equals("PAUSE")) { orderState = Enums.OrderState.暂停; } #endregion #region FBP状态翻译 else if (jdOrderState.Equals("DengDaiDaYin") || jdOrderState.Equals("DengDaiChuKu") || jdOrderState.Equals("DengDaiDaBao") || jdOrderState.Equals("DengDaiFaHuo")) { orderState = Enums.OrderState.待出库; } else if (jdOrderState.Equals("DengDaiQueRenShouHuo")) { orderState = Enums.OrderState.待收货; } else if (jdOrderState.Equals("WanCheng")) { orderState = Enums.OrderState.已完成; } else if (jdOrderState.Equals("SuoDing") || jdOrderState.Equals("LOCKED")) { orderState = Enums.OrderState.锁定; } else if (jdOrderState.Equals("TRADE_CANCELED")) { orderState = Enums.OrderState.已取消; } #endregion return orderState; } public void OrderDelete(long ShopId, IList orderIds) { fsql.Transaction(() => { fsql.Delete().Where(o => o.ShopId == ShopId && orderIds.Contains(o.Id)).ExecuteAffrows(); fsql.Delete().Where(osku => orderIds.Contains(osku.OrderId)).ExecuteAffrows(); fsql.Delete().Where(ocd => orderIds.Contains(ocd.OrderId)).ExecuteAffrows(); fsql.Delete().Where(oc => orderIds.Contains(oc.OrderId)).ExecuteAffrows(); fsql.Delete().Where(ods => orderIds.Contains(ods.OrderId)).ExecuteAffrows(); fsql.Delete().Where(ocs => orderIds.Contains(ocs.OrderId)).ExecuteAffrows(); fsql.Delete().Where(oc => orderIds.Contains(oc.OrderId)).ExecuteAffrows(); }); } /// /// 接收订单推送 /// /// public void OrderPublish(OrderPublishRequest request) { nLogManager.Default().Info($"订单推送-{JsonConvert.SerializeObject(request)}"); if (request.orderStatus != "TRADE_CREATED") return; var shop = venderBusiness.GetShopByVenderId(request.venderId); if (shop == null) return; IInsert insertWaitPayOrder = null; IInsert insertJdPublishOrder = null; { var isExists = fsql.Select(request.orderId).Any(); if (!isExists) { insertWaitPayOrder = fsql.Insert(new WaitPayOrder() { CreateTime = DateTime.Now, Id = request.orderId, ShopId = long.Parse(shop.ShopId) }); } } { var isExists = fsql.Select(request.orderId).Any(); if (!isExists) { insertJdPublishOrder = fsql.Insert(new JdPublishOrder() { CreateTime = DateTime.Now, Id = request.orderId, ShopId = long.Parse(shop.ShopId) }); } } if (insertWaitPayOrder != null || insertJdPublishOrder != null) { fsql.Transaction(() => { insertWaitPayOrder?.ExecuteAffrows(); insertJdPublishOrder?.ExecuteAffrows(); }); } } #region 同步暂停订单 public void CheckJDPauseOrder(long? shopId) { var shopList = venderBusiness.GetShopList(shopId, platform: Enums.Platform.京东); var shopIds = shopList.Select(s => long.Parse(s.ShopId)).ToList(); var deleteRow = fsql.Select().Where(wo => shopIds.Contains(wo.ShopId.Value)) .Where(wo => fsql.Select().Where(o => o.Id == wo.Id).Any()) .ToDelete() .ExecuteAffrows(); var waitPayOrderList = fsql.Select().Where(wo => shopIds.Contains(wo.ShopId.Value)).ToList(); if (waitPayOrderList.Count() == 0) return; foreach (var shop in shopList) { var currentWaitPayOrderList = waitPayOrderList.Where(wo => wo.ShopId == long.Parse(shop.ShopId)).ToList(); if (currentWaitPayOrderList.Count() > 0) { Task.Factory.StartNew(() => CheckJDPauseOrder(shop, currentWaitPayOrderList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); } } } private void CheckJDPauseOrder(ShopResponse shop, IList waitPayOrderList) { foreach (var w in waitPayOrderList) { SyncOrder(shop, w.Id); } } public void DeleteTimeOutWaitPayOrder() { IDelete deleteWaitPayOrder = null; IDelete deleteJdPublishOrder = null; { var deleteTime = DateTime.Now.AddHours(-24); deleteWaitPayOrder = fsql.Delete().Where(w => w.CreateTime <= deleteTime); } { var deleteTime = DateTime.Now.AddDays(-90); deleteJdPublishOrder = fsql.Delete().Where(w => w.CreateTime <= deleteTime); } fsql.Transaction(() => { deleteWaitPayOrder?.ExecuteAffrows(); deleteJdPublishOrder?.ExecuteAffrows(); }); } /// /// 修复订单Sku缺少的spu /// public void RepairOrderSkuProductId() { var date = DateTime.Now.AddHours(-2); var waitRepairOrderSkuList = fsql.Select() .InnerJoin((osku, psku) => osku.SkuId == psku.Id) .Where((osku, psku) => osku.CreateTime >= date && string.IsNullOrEmpty(osku.ProductId) && osku.Price > 0) .ToList((osku, psku) => new { Id = osku.Id, SkuId = osku.SkuId, ProductId = psku.ProductId }); if (waitRepairOrderSkuList.Count() == 0) return; var waitRepairOrderSkuGroupList = waitRepairOrderSkuList.GroupBy(s => s.ProductId); fsql.Transaction(() => { foreach (var group in waitRepairOrderSkuGroupList) { var orderSkuIds = group.Select(g => g.Id).ToList(); var productId = group.Key; fsql.Update(orderSkuIds).Set(osku => osku.ProductId, productId).ExecuteAffrows(); } }); } #endregion } }