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 System; using System.Collections.Generic; using System.Linq; using System.Net.Http; 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); } public void SyncOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false, Enums.SortTimeType? sortTimeType = null) { try { if (shop.ShopName == "创艺家居日用专营店") nLogManager.Default().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(-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(); List insertOrderCouponNewList = new List(); List insertOrderPromotionList = 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(); var orderSkuCFDetailList = new List(); #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"); try { if (insertOrderList.Any(o => o.Id == orderId)) continue; var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == orderId); var dbOrderTotal = dbOrderTotalList.FirstOrDefault(o => o.Id == orderId); var isNewOrder = dbOrder == null; SDCalculationCostRequest sDCalculationCostRequest = null; //SD信息埋点 #region 优惠券/促销/拆分明细 if (!dbOrderTotalList.Any(ot => ot.Id == orderId)) { Thread.Sleep(2000); var orderCouponDetailHttpResult = restApiService.SendRequest("http://yunding.qiyue666.com", "api/PlatformSDK/GetOrderCouponDetail", new { OrderId = orderId, AppKey = appKey, AppSecret = appSecret, AppToken = appToken, Platform = Enums.Platform.京东 }, null, HttpMethod.Post); if (orderCouponDetailHttpResult.StatusCode == System.Net.HttpStatusCode.OK) { var orderCouponDetailResponse = JsonConvert.DeserializeObject>(orderCouponDetailHttpResult.Content); if (orderCouponDetailResponse.Success) { var jtoken = orderCouponDetailResponse.Data["jingdong_pop_order_queryCouponDetai_responce"]["couponDetailExternal"]["couponDetailVo"]; if (jtoken.Value("totalShouldPay") > 0M) { #region 订单合计信息 var orderTotal = new OrderTotalInfo() { CreateTime = DateTime.Now, Id = orderId, TotalBalance = jtoken.Value("totalBalance"), TotalBaseDiscount = jtoken.Value("TotalBaseDiscount"), TotalBaseFee = jtoken.Value("totalBaseFee"), TotalCoupon = jtoken.Value("totalCoupon"), TotalDongQuan = jtoken.Value("totalDongQuan"), TotalExpiryGiftDiscount = jtoken.Value("totalExpiryGiftDiscount"), TotalGlobalGeneralIncludeTax = jtoken.Value("totalGlobalGeneralIncludeTax"), TotalGlobalGeneralTax = jtoken.Value("totalGlobalGeneralTax"), TotalItemPrice = jtoken.Value("totalItemPrice"), TotalJdZhiFuYouHui = jtoken.Value("totalJdZhiFuYouHui"), TotalJingDou = jtoken.Value("totalJingDou"), TotalJingQuan = jtoken.Value("totalJingQuan"), TotalJingXiangLiJin = jtoken.Value("totalJingXiangLiJin"), TotalLiJinYouHui = jtoken.Value("totalLiJinYouHui"), TotalLuoDiPeiService = jtoken.Value("totalLuoDiPeiService"), TotalManJian = jtoken.Value("totalManJian"), TotalPingTaiChengDanYouHuiQuan = jtoken.Value("totalPingTaiChengDanYouHuiQuan"), TotalPlus95 = jtoken.Value("totalPlus95"), TotalPromotionDiscount = jtoken.Value("totalPromotionDiscount"), TotalRemoteFee = jtoken.Value("totalRemoteFee"), TotalShouldPay = jtoken.Value("totalShouldPay"), TotalSuperRedEnvelope = jtoken.Value("totalSuperRedEnvelope"), TotalTaxFee = jtoken.Value("totalTaxFee"), TotalTuiHuanHuoWuYou = jtoken.Value("totalTuiHuanHuoWuYou"), TotalVenderFee = jtoken.Value("totalVenderFee"), TotalXianPinLeiDongQuan = jtoken.Value("totalXianPinLeiDongQuan"), TotalXianPinLeiJingQuan = jtoken.Value("totalXianPinLeiJingQuan"), TotalZhiFuYingXiaoYouHui = jtoken.Value("totalZhiFuYingXiaoYouHui") }; insertOrderTotalInfoList.Add(orderTotal); #endregion #region 订单优惠券信息 var couponJArray = jtoken["couponList"] as JArray; if (couponJArray != null && couponJArray.Count() > 0) { insertOrderCouponNewList.AddRange(couponJArray.Select(j => new OrderCoupon_New() { Id = idGenerator.NewLong(), CouponId = j.Value("couponId"), CouponName = j.Value("couponName"), CouponNum = j.Value("couponNum"), CouponPrice = j.Value("couponPrice"), CouponTypeDesc = j.Value("couponTypeDesc"), CreateTime = DateTime.Now, JdCouponId = j.Value("jdCouponId"), JdDivideMoney = j.Value("jdDivideMoney"), OrderId = orderId, PriceDivide = j.Value("priceDivide"), VenderDivideMoney = j.Value("venderDivideMoney") })); } #endregion #region 订单活动信息 var promotionJArray = jtoken["promotionList"] as JArray; if (promotionJArray != null && promotionJArray.Count() > 0) { insertOrderPromotionList.AddRange(promotionJArray.Select(j => new OrderPromotion() { Id = idGenerator.NewLong(), BeginTime = j.Value("beginTime"), EndTime = j.Value("endTime"), CreateTime = DateTime.Now, OrderId = orderId, PromotionId = j.Value("promotionId"), PromotionName = j.Value("promotionName"), SalePrice = j.Value("salePrice"), SaleTypeDesc = j.Value("saleTypeDesc") })); } #endregion #region 订单sku金额明细 var skuJArray = jtoken["skuList"] as JArray; if (skuJArray != null && skuJArray.Count() > 0) { foreach (var oskuJtoken in skuJArray) { var skuDiscountInfoList = oskuJtoken["skuDiscountInfoList"] as JArray; decimal? xianPinLeiDongQuan = 0M; if (skuDiscountInfoList != null && skuDiscountInfoList.Count > 0) { foreach (var item1 in skuDiscountInfoList) { var discountTypeList = item1["discountTypeList"] as JArray; if (discountTypeList != null && discountTypeList.Count() > 0) { foreach (var discountType in discountTypeList) { if (discountType.Value("type") == 6) xianPinLeiDongQuan += discountType.Value("amount"); } } } } if (xianPinLeiDongQuan == 0M) xianPinLeiDongQuan = oskuJtoken.Value("xianPinLeiDongQuan"); var oskuCF = new OrderSkuCFDetail() { OrderId = orderId, SkuId = oskuJtoken.Value("skuCode"), Balance = oskuJtoken.Value("balance"), BaseDiscount = oskuJtoken.Value("baseDiscount"), BaseFee = oskuJtoken.Value("baseFee"), Coupon = oskuJtoken.Value("coupon"), DongQuan = oskuJtoken.Value("dongQuan"), ExpiryGiftDiscount = oskuJtoken.Value("expiryGiftDiscount"), GlobalGeneralIncludeTax = oskuJtoken.Value("globalGeneralIncludeTax"), GlobalGeneralTax = oskuJtoken.Value("globalGeneralTax"), JdZhiFuYouHui = oskuJtoken.Value("jdZhiFuYouHui"), JingDou = oskuJtoken.Value("jingDou"), JingQuan = oskuJtoken.Value("jingQuan"), JingXiangLiJin = oskuJtoken.Value("jingXiangLiJin"), LiJinYouHui = oskuJtoken.Value("liJinYouHui"), LuoDiPeiService = oskuJtoken.Value("luoDiPeiService"), ManJian = oskuJtoken.Value("manJian"), PingTaiChengDanYouHuiQuan = oskuJtoken.Value("pingTaiChengDanYouHuiQuan"), Plus95 = oskuJtoken.Value("plus95"), PromotionDiscount = oskuJtoken.Value("promotionDiscount"), RemoteFee = oskuJtoken.Value("remoteFee"), ShouldPay = oskuJtoken.Value("shouldPay"), SuperRedEnvelope = oskuJtoken.Value("superRedEnvelope"), TaxFee = oskuJtoken.Value("taxFee"), TuiHuanHuoWuYou = oskuJtoken.Value("tuiHuanHuoWuYou"), VenderFee = oskuJtoken.Value("venderFee"), XianPinLeiDongQuan = xianPinLeiDongQuan, //数据不齐 XianPinLeiJingQuan = oskuJtoken.Value("xianPinLeiJingQuan"), ZhiFuYingXiaoYouHui = oskuJtoken.Value("zhiFuYingXiaoYouHui") }; orderSkuCFDetailList.Add(oskuCF); } } #endregion } } } } #endregion #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); decimal? actualProductAmount = 0M; decimal actualAmount = 0M; //实收金额 decimal? preferentialAmount = 0M; decimal? pingtaiChengDanYouHuiQuan = 0M; if (dbOrder == null) { var orderTotalInfo = insertOrderTotalInfoList.FirstOrDefault(x => x.Id == orderId); //actualProductAmount = orderPayment - freightPrice + pingtaibutie; pingtaiChengDanYouHuiQuan = (orderTotalInfo?.TotalPingTaiChengDanYouHuiQuan ?? 0M); actualProductAmount = orderSellerPrice + pingtaiChengDanYouHuiQuan; actualAmount = orderSellerPrice + freightPrice + (pingtaiChengDanYouHuiQuan ?? 0M); //preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M) - freightPrice; preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M); dbOrder = new Order() { Id = orderId, BuyerRemark = buyerRemark, VenderRemark = venderRemark, FreightPrice = freightPrice, EndTime = endTime, StartTime = orderJToken.Value("orderStartTime"), ModifyTime = modifyTime, OrderPayment = orderPayment, //(orderTotalInfo?.TotalShouldPay) ?? 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, //PreferentialAmount = (orderTotalInfo?.TotalPingTaiChengDanYouHuiQuan) ?? 0M, ActualProductAmount = actualProductAmount ?? 0M, PreferentialAmount = preferentialAmount ?? 0M, PingTaiChengDanYouHuiQuan = pingtaiChengDanYouHuiQuan ?? 0M }; 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 oskuCF = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == skuId); 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, Balance = oskuCF?.Balance ?? 0M, BaseDiscount = oskuCF?.BaseDiscount ?? 0M, BaseFee = oskuCF?.BaseFee ?? 0M, Coupon = oskuCF?.Coupon ?? 0M, DongQuan = oskuCF?.DongQuan ?? 0M, ExpiryGiftDiscount = oskuCF?.ExpiryGiftDiscount ?? 0M, GlobalGeneralIncludeTax = oskuCF?.GlobalGeneralIncludeTax ?? 0M, GlobalGeneralTax = oskuCF?.GlobalGeneralTax ?? 0M, JdZhiFuYouHui = oskuCF?.JdZhiFuYouHui ?? 0M, JingDou = oskuCF?.JingDou ?? 0M, JingQuan = oskuCF?.JingQuan ?? 0M, JingXiangLiJin = oskuCF?.JingXiangLiJin ?? 0M, LiJinYouHui = oskuCF?.LiJinYouHui ?? 0M, LuoDiPeiService = oskuCF?.LuoDiPeiService ?? 0M, ManJian = oskuCF?.ManJian ?? 0M, PingTaiChengDanYouHuiQuan = oskuCF?.PingTaiChengDanYouHuiQuan ?? 0M, Plus95 = oskuCF?.Plus95 ?? 0M, PromotionDiscount = oskuCF?.PromotionDiscount ?? 0M, RemoteFee = oskuCF?.RemoteFee ?? 0M, ShouldPay = oskuCF?.ShouldPay ?? 0M, SuperRedEnvelope = oskuCF?.SuperRedEnvelope ?? 0M, TaxFee = oskuCF?.TaxFee ?? 0M, TuiHuanHuoWuYou = oskuCF?.TuiHuanHuoWuYou ?? 0M, VenderFee = oskuCF?.VenderFee ?? 0M, XianPinLeiDongQuan = oskuCF?.XianPinLeiDongQuan ?? 0M, XianPinLeiJingQuan = oskuCF?.XianPinLeiJingQuan ?? 0M, ZhiFuYingXiaoYouHui = oskuCF?.ZhiFuYingXiaoYouHui ?? 0M }; osku.ActualAmount = osku.ShouldPay + osku.Balance + osku.PingTaiChengDanYouHuiQuan + osku.SuperRedEnvelope + osku.XianPinLeiDongQuan + osku.JingDou + osku.DongQuan; insertOrderSkuList.Add(osku); //} //CumulativeSkuDailySalesDetail(skuDailySalesDetailDictionary, dbOrder.StartTime.Value, shopId, skuId, wareId, jdPrice, itemTotal); } #endregion } else { var orderTotalInfo = insertOrderTotalInfoList.FirstOrDefault(x => x.Id == orderId); if (orderTotalInfo == null) orderTotalInfo = dbOrderTotalList.FirstOrDefault(x => x.Id == orderId); pingtaiChengDanYouHuiQuan = (orderTotalInfo?.TotalPingTaiChengDanYouHuiQuan ?? 0M); actualProductAmount = orderSellerPrice + pingtaiChengDanYouHuiQuan; actualAmount = orderSellerPrice + freightPrice + (pingtaiChengDanYouHuiQuan ?? 0M); //preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M) - freightPrice; preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M); //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 = $"{orderId}_{skuId}"; if (dbOsku != null) { var oskuCF = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == dbOsku.SkuId); var isDetailChanged = (dbOsku.ShouldPay == 0 || dbOsku.ShouldPay == null) && oskuCF != null && oskuCF.ShouldPay != 0; if (dbOsku.ProductId != wareId || isDetailChanged) { var skuActualAmount = oskuCF?.ShouldPay ?? 0M + oskuCF?.Balance ?? 0M + oskuCF?.PingTaiChengDanYouHuiQuan ?? 0M + oskuCF?.SuperRedEnvelope ?? 0M + oskuCF?.XianPinLeiDongQuan ?? 0M + oskuCF?.JingDou ?? 0M + oskuCF?.DongQuan ?? 0M; var update = fsql.Update(dbOsku.Id) .SetIf(dbOsku.ProductId != wareId, osku => osku.ProductId, wareId) .SetIf(isDetailChanged, osku => osku.ShouldPay, oskuCF?.ShouldPay) .SetIf(isDetailChanged, osku => osku.Balance, oskuCF?.Balance) .SetIf(isDetailChanged, osku => osku.BaseDiscount, oskuCF?.BaseDiscount) .SetIf(isDetailChanged, osku => osku.BaseFee, oskuCF?.BaseFee) .SetIf(isDetailChanged, osku => osku.Coupon, oskuCF?.Coupon) .SetIf(isDetailChanged, osku => osku.DongQuan, oskuCF?.DongQuan) .SetIf(isDetailChanged, osku => osku.ExpiryGiftDiscount, oskuCF?.ExpiryGiftDiscount) .SetIf(isDetailChanged, osku => osku.GlobalGeneralIncludeTax, oskuCF?.GlobalGeneralIncludeTax) .SetIf(isDetailChanged, osku => osku.GlobalGeneralTax, oskuCF?.GlobalGeneralTax) .SetIf(isDetailChanged, osku => osku.JdZhiFuYouHui, oskuCF?.JdZhiFuYouHui) .SetIf(isDetailChanged, osku => osku.JingDou, oskuCF?.JingDou) .SetIf(isDetailChanged, osku => osku.JingQuan, oskuCF?.JingQuan) .SetIf(isDetailChanged, osku => osku.JingXiangLiJin, oskuCF?.JingXiangLiJin) .SetIf(isDetailChanged, osku => osku.LiJinYouHui, oskuCF?.LiJinYouHui) .SetIf(isDetailChanged, osku => osku.LuoDiPeiService, oskuCF?.LuoDiPeiService) .SetIf(isDetailChanged, osku => osku.ManJian, oskuCF?.ManJian) .SetIf(isDetailChanged, osku => osku.PingTaiChengDanYouHuiQuan, oskuCF?.PingTaiChengDanYouHuiQuan) .SetIf(isDetailChanged, osku => osku.Plus95, oskuCF?.Plus95) .SetIf(isDetailChanged, osku => osku.PromotionDiscount, oskuCF?.PromotionDiscount) .SetIf(isDetailChanged, osku => osku.RemoteFee, oskuCF?.RemoteFee) .SetIf(isDetailChanged, osku => osku.SuperRedEnvelope, oskuCF?.SuperRedEnvelope) .SetIf(isDetailChanged, osku => osku.TaxFee, oskuCF?.TaxFee) .SetIf(isDetailChanged, osku => osku.TuiHuanHuoWuYou, oskuCF?.TuiHuanHuoWuYou) .SetIf(isDetailChanged, osku => osku.VenderFee, oskuCF?.VenderFee) .SetIf(isDetailChanged, osku => osku.XianPinLeiDongQuan, oskuCF?.XianPinLeiDongQuan) .SetIf(isDetailChanged, osku => osku.XianPinLeiJingQuan, oskuCF?.XianPinLeiJingQuan) .SetIf(isDetailChanged, osku => osku.ZhiFuYingXiaoYouHui, oskuCF?.ZhiFuYingXiaoYouHui) .SetIf(isDetailChanged && skuActualAmount != 0, osku => osku.ActualAmount, skuActualAmount); ; 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 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.已取消) { bool checkOrderTotal = true; if (dbOrder.StorageType == Enums.StorageType.京仓 || dbOrder.StorageType == Enums.StorageType.云仓) { var orderTotalInfo = insertOrderTotalInfoList.FirstOrDefault(x => x.Id == dbOrder.Id); if (orderTotalInfo == null) orderTotalInfo = dbOrderTotalList.FirstOrDefault(x => x.Id == dbOrder.Id); if (orderTotalInfo == null || orderTotalInfo.TotalShouldPay == 0M) checkOrderTotal = false; } if (checkOrderTotal) { 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 = (dbOrderTotal?.TotalPingTaiChengDanYouHuiQuan) ?? dbOrder.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购买数量 #region sku拆分明细 decimal? skuShouldPay = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.ShouldPay; if (skuShouldPay == null) skuShouldPay = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.ShouldPay; if (skuShouldPay == null) skuShouldPay = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.ShouldPay; decimal? skuPingTaiChengDanYouHuiQuan = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan; if (skuPingTaiChengDanYouHuiQuan == null) skuPingTaiChengDanYouHuiQuan = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan; if (skuPingTaiChengDanYouHuiQuan == null) skuPingTaiChengDanYouHuiQuan = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan; decimal? skuSuperRedEnvelope = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.SuperRedEnvelope; if (skuSuperRedEnvelope == null) skuSuperRedEnvelope = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.SuperRedEnvelope; if (skuSuperRedEnvelope == null) skuSuperRedEnvelope = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.SuperRedEnvelope; decimal? skuXianPinLeiDongQuan = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.XianPinLeiDongQuan; if (skuXianPinLeiDongQuan == null) skuXianPinLeiDongQuan = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.XianPinLeiDongQuan; if (skuXianPinLeiDongQuan == null) skuXianPinLeiDongQuan = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.XianPinLeiDongQuan; decimal? skuVenderFee = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.VenderFee; if (skuVenderFee == null) skuVenderFee = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.VenderFee; if (skuVenderFee == null) skuVenderFee = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.VenderFee; decimal? skuJingDou = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.JingDou; if (skuJingDou == null) skuJingDou = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.JingDou; if (skuJingDou == null) skuJingDou = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.JingDou; decimal? skuDongQuan = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.DongQuan; if (skuDongQuan == null) skuDongQuan = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.DongQuan; if (skuDongQuan == null) skuDongQuan = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.DongQuan; decimal? skuBalnace = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.Balance; if (skuBalnace == null) skuBalnace = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.Balance; if (skuBalnace == null) skuBalnace = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.Balance; #endregion //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 deductionQuantity = itemTotal; //本次扣减量的采购成本 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, PackagingLaborAmount = purchaseOrder.SinglePackagingLaborAmount * deductionQuantity, IsEnabled = true, IsEstimateCost = false }; //orderCostDetail.SkuGrossProfit = itemPrice * deductionQuantity - avgPreferential - // (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - // itemPrice * deductionQuantity * platformCommissionRatio; //var koudian = (skuShouldPay.Value - venderFee.Value) * deductionQuantity * platformCommissionRatio; //orderCostDetail.SkuGrossProfit = (skuShouldPay.Value + pingtaiCoupon.Value) * deductionQuantity - // orderCostDetail.TotalCost - orderCostDetail.DeliveryExpressFreight - // koudian; orderCostDetail.CalculationSkuGrossProfit(skuShouldPay ?? 0M, skuPingTaiChengDanYouHuiQuan ?? 0M, skuSuperRedEnvelope ?? 0M, skuXianPinLeiDongQuan ?? 0M, skuVenderFee ?? 0M, skuJingDou ?? 0M, skuDongQuan ?? 0M, skuBalnace ?? 0M, platformCommissionRatio); insertOrderCostDetailList.Add(orderCostDetail); } } #endregion #region 计算成本 //当具备订单明细成本的时候,才为其创建订单成本 if (insertOrderCostDetailList.Any(iocd => iocd.OrderId == orderId)) { orderCost = new OrderCost() { OrderId = orderId, PlatformCommissionRatio = platformCommissionRatio, PreferentialAmount = (dbOrderTotal?.TotalPingTaiChengDanYouHuiQuan) ?? dbOrder.PreferentialAmount, Profit = 0, PurchaseAmount = orderCostPurchaseAmount, DeliveryExpressFreight = orderDeliveryExpressFreight, CreateTime = DateTime.Now, IsEstimateCost = false }; if (dbOrder.OrderTotalPrice != 0) orderCost.CalculationOrderProfitAndCost(dbOrder, null); else orderCost.CalculationOrderProfitAndCost(actualAmount, 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 || storeId != dbOrder.StoreId || actualProductAmount != dbOrder.ActualProductAmount || preferentialAmount != dbOrder.PreferentialAmount || pingtaiChengDanYouHuiQuan != dbOrder.PingTaiChengDanYouHuiQuan) { 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(storeId != dbOrder.StoreId, o => o.StoreId, storeId) .SetIf(actualProductAmount != dbOrder.ActualProductAmount, o => o.ActualProductAmount, actualProductAmount) .SetIf(preferentialAmount != dbOrder.PreferentialAmount, o => o.PreferentialAmount, preferentialAmount) .SetIf(pingtaiChengDanYouHuiQuan != dbOrder.PingTaiChengDanYouHuiQuan, o => o.PingTaiChengDanYouHuiQuan, pingtaiChengDanYouHuiQuan); updateOrderList.Add(updateSql); } #endregion #region 删除SD埋点 try { if (sDCalculationCostRequest != null) memoryCache.Remove(orderId); } catch { } #endregion } catch (Exception ex) { nLogManager.Default().Error(ex, $"SyncOrder OrderLevel Error, OrderId:{orderId}, ShopId:{shopId}"); } } #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 #region 需要清理的数据 var orderCouponDetailOrderIdList = insertOrderTotalInfoList.Select(x => x.Id).ToList(); #endregion fsql.Transaction(() => { if (orderCouponDetailOrderIdList.Count() > 0) { fsql.Delete(orderCouponDetailOrderIdList).ExecuteAffrows(); fsql.Delete().Where(on => orderCouponDetailOrderIdList.Contains(on.OrderId)).ExecuteAffrows(); fsql.Delete().Where(op => orderCouponDetailOrderIdList.Contains(op.OrderId)).ExecuteAffrows(); } if (insertOrderTotalInfoList.Count() > 0) fsql.Insert(insertOrderTotalInfoList).ExecuteAffrows(); if (insertOrderCouponNewList.Count() > 0) fsql.Insert(insertOrderCouponNewList).ExecuteAffrows(); if (insertOrderPromotionList.Count() > 0) fsql.Insert(insertOrderPromotionList).ExecuteAffrows(); 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.京东); //var a = shopList.FirstOrDefault(s => s.ShopName == "创艺家居日用专营店"); foreach (var shop in shopList) { Task.Factory.StartNew(() => SyncOrder(shop, string.Empty, isAuto: true), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); } } public void SyncAllShopOrderByDate() { var shopList = venderBusiness.GetShopList(platform: Enums.Platform.京东); var st = DateTime.Parse("2023-11-26 00:00:00"); var et = DateTime.Parse("2023-11-27 14:00:00"); foreach (var shop in shopList) { Task.Factory.StartNew(() => SyncOrderByDate(new SyncOrderByDateRequest() { ShopId = long.Parse(shop.ShopId), StartTime = st, EndTime = et }), 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(); }); } #endregion /// /// 修复订单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(); } }); } } }