using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Model; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using FreeSql; using Newtonsoft.Json.Linq; using SDKAdapter; using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Models; using Yitter.IdGenerator; namespace BBWYB.Server.Business.Sync { public class OrderSyncBusiness : BaseBusiness, IDenpendency { private OP_PlatformClientFactory opPlatformClientFactory; private VenderBusiness venderBusiness; private TaskSchedulerManager taskSchedulerManager; public OrderSyncBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, OP_PlatformClientFactory opPlatformClientFactory, VenderBusiness venderBusiness, TaskSchedulerManager taskSchedulerManager) : base(fsql, nLogManager, idGenerator) { this.opPlatformClientFactory = opPlatformClientFactory; this.venderBusiness = venderBusiness; this.taskSchedulerManager = taskSchedulerManager; } public void AutoOrderSync() { var shopList = venderBusiness.GetShopList(platform: Enums.Platform.拳探); foreach (var shop in shopList) { Task.Factory.StartNew(() => Sync(shop, string.Empty, DateTime.Now.AddHours(-3), DateTime.Now, AdapterEnums.SortTimeField.Modify, AdapterEnums.SortType.Desc), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); } } public void ManualOrderSync(long shopId, string orderId, DateTime? startTime, DateTime? endTime) { var shop = venderBusiness.GetShopList(shopId, platform: Enums.Platform.拳探).FirstOrDefault(); if (shop == null) throw new BusinessException($"未找到店铺Id {shopId}"); Task.Factory.StartNew(() => Sync(shop, orderId, startTime, endTime, AdapterEnums.SortTimeField.Modify, AdapterEnums.SortType.Desc), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); } private void Sync(ShopResponse shop, string orderId, DateTime? startTime, DateTime? endTime, AdapterEnums.SortTimeField sortTimeField, AdapterEnums.SortType sortType) { var shopId = long.Parse(shop.ShopId); var loggerName = $"订单同步-{shop.ShopName}"; try { var qtOrderList = opPlatformClientFactory.GetClient(AdapterEnums.PlatformType.拳探).GetOrderList(new OP_QueryOrderRequest() { AppKey = shop.AppKey, AppSecret = shop.AppSecret, AppToken = shop.AppToken, OrderId = orderId, PageIndex = 1, PageSize = 100, Platform = AdapterEnums.PlatformType.拳探, SortTimeField = sortTimeField, SortType = sortType, StartDate = startTime, EndDate = endTime }); if (qtOrderList.Count == 0) return; var qtOrderIdList = qtOrderList.Items.Select(qto => qto.OrderId).ToList(); var dbOrderList = fsql.Select(qtOrderIdList).ToList(); //采购限时任务列表 var payedQTOrderIdList = qtOrderList.Items.Where(qto => qto.IsPay).Select(qto => qto.OrderId).ToList(); var dbPurchaseTimeLimitTaskList = fsql.Select().Where(t => t.TaskType == Enums.TimeLimitTaskType.采购任务 && payedQTOrderIdList.Contains(t.OrderId)).ToList(); List insertOrderList = new List(); List insertOrderSkuList = new List(); List insertOrderConsigneeList = new List(); List insertTimeLimitTaskList = new List(); List> updateOrderList = new List>(); foreach (var qtOrder in qtOrderList.Items) { var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == qtOrder.OrderId); var orderState = ConvertQuanTanOrderState(qtOrder.OrderState, qtOrder.IsPay, dbOrder?.IsPurchased ?? false); if (dbOrder == null) { //新订单 dbOrder = new Model.Db.Order() { Id = qtOrder.OrderId, OrderSn = qtOrder.OrderSn, BuyerRemark = qtOrder.BuyerRemark, EndTime = qtOrder.EndTime, //ExpressName = qtOrder.DeliveryResponse.ExpressName, FreightPrice = qtOrder.FreightAmount, ModifyTime = qtOrder.ModifyTime, IsPurchased = false, OrderPayment = qtOrder.OrderPayment, OrderSellerPrice = qtOrder.OrderProductAmount, OrderTotalPrice = qtOrder.OrderTotalAmount, OrderType = 0, PayType = qtOrder.PayType, Platform = Enums.Platform.拳探, PreferentialAmount = qtOrder.PreferentialAmount, //PurchaseRemark = String.Empty, ShopId = shopId, SellerPreferentialAmount = qtOrder.SellerPreferentialAmount, StartTime = qtOrder.StartTime, VenderRemark = qtOrder.VenderRemark, //WaybillNo = qtOrder.DeliveryResponse.WayBillNo, OrderState = orderState, ClientOrderId = qtOrder.ClientOrderId, BuyerAccount = qtOrder.UserAccount, InPackAmount = qtOrder.PackAmount, PayTime = qtOrder.PayTime, }; JArray belongSkus = null; if (!string.IsNullOrEmpty(qtOrder.Extended)) { try { var jobject = JObject.Parse(qtOrder.Extended); //dbOrder.SourceSku = jobject.Value("SourceSku"); dbOrder.SourceShopName = jobject.Value("SourceShopName"); if (jobject.ContainsKey("BelongSkus")) belongSkus = jobject["BelongSkus"] as JArray; if (jobject.ContainsKey("IntoStoreType")) dbOrder.IntoStoreType = (Enums.IntoStoreType?)jobject.Value("IntoStoreType"); } catch (Exception ex) { } } if (!insertOrderList.Any(o => o.Id == dbOrder.Id)) insertOrderList.Add(dbOrder); //订单sku foreach (var qtOrderSku in qtOrder.OrderSkuList) { insertOrderSkuList.Add(new OrderSku() { //Id = idGenerator.NewLong(), Id = long.Parse(qtOrderSku.Id), CreateTime = DateTime.Now, SkuId = qtOrderSku.SkuId, ItemTotal = qtOrderSku.Quantity, Logo = qtOrderSku.SkuLogo, OrderId = qtOrder.OrderId, Price = qtOrderSku.SkuPrice, Title = qtOrderSku.SkuTitle, ShopId = shopId, ProductId = qtOrderSku.ProductId, BelongSkuId = belongSkus?.FirstOrDefault(j => j.Value("SkuId") == qtOrderSku.SkuId)?.Value("BelongSkuId") ?? string.Empty, InPackAmount = qtOrderSku.PackAmount, BuyerPayFreight = qtOrderSku.FreightAmount }); } //收货人 insertOrderConsigneeList.Add(new OrderConsignee() { OrderId = qtOrder.OrderId, Address = qtOrder.Consignee.Address, City = qtOrder.Consignee.City, ContactName = qtOrder.Consignee.ContactName, County = qtOrder.Consignee.County, CreateTime = DateTime.Now, Mobile = qtOrder.Consignee.Mobile, Province = qtOrder.Consignee.Province, TelePhone = qtOrder.Consignee.Mobile, Town = qtOrder.Consignee.Town }); } else { #region 订单状态脱离拳探 只处理付款和取消 Enums.OrderState? updateOrderState = null; if (dbOrder.OrderState == Enums.OrderState.待付款 && orderState != Enums.OrderState.待付款) updateOrderState = Enums.OrderState.等待采购; if (dbOrder.OrderState != Enums.OrderState.已取消 && orderState == Enums.OrderState.已取消) updateOrderState = Enums.OrderState.已取消; #endregion var updateModifyTime = dbOrder.ModifyTime != qtOrder.ModifyTime; var updateBuyerRemark = dbOrder.BuyerRemark != qtOrder.BuyerRemark; var updateVenderRemark = dbOrder.VenderRemark != qtOrder.VenderRemark; var updateBuyerAccount = dbOrder.BuyerAccount != qtOrder.UserAccount; var updateOrderSn = dbOrder.OrderSn != qtOrder.OrderSn; var updatePayTime = dbOrder.PayTime != qtOrder.PayTime; if (updateOrderState != null || updateModifyTime || updateBuyerRemark || updateVenderRemark || updateBuyerAccount || updateOrderSn || updatePayTime) { var update = fsql.Update(dbOrder.Id).SetIf(updateOrderState != null, o => o.OrderState, updateOrderState) .SetIf(updateModifyTime, o => o.ModifyTime, qtOrder.ModifyTime) .SetIf(updateBuyerRemark, o => o.BuyerRemark, qtOrder.BuyerRemark) .SetIf(updateVenderRemark, o => o.VenderRemark, qtOrder.VenderRemark) .SetIf(updateBuyerAccount, o => o.BuyerAccount, qtOrder.UserAccount) .SetIf(updateOrderSn, o => o.OrderSn, qtOrder.OrderSn) .SetIf(updatePayTime, o => o.PayTime, qtOrder.PayTime); updateOrderList.Add(update); } } } CheckPurchaseTimeLimitTask(shopId, qtOrderList.Items, dbPurchaseTimeLimitTaskList, insertTimeLimitTaskList); 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 (insertTimeLimitTaskList.Count() > 0) fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows(); if (updateOrderList.Count() > 0) foreach (var update in updateOrderList) update.ExecuteAffrows(); }); } catch (Exception ex) { nLogManager.GetLogger(loggerName).Error(ex); } } private void CheckPurchaseTimeLimitTask(long shopId, IList orderList, IList dbTimeLimits, List insertTimeLimitTasks) { foreach (var order in orderList) { if (!order.IsPay || order.PayTime == null) continue; var waitInserTimeLimitTasks = order.OrderSkuList.Where(osku => !dbTimeLimits.Any(x => x.OrderId == order.OrderId && x.SkuId == osku.SkuId)) .Select(osku => new TimeLimitTask() { Id = idGenerator.NewLong(), CreateTme = DateTime.Now, OrderId = order.OrderId, SkuId = osku.SkuId, TaskType = Enums.TimeLimitTaskType.采购任务, ShopId = shopId, ExpirationTime = CalculationPurcashTimeLimitTaskExpirationTime(order.PayTime.Value), PayTime = order.PayTime }).ToList(); if (waitInserTimeLimitTasks != null && waitInserTimeLimitTasks.Count() > 0) insertTimeLimitTasks.AddRange(waitInserTimeLimitTasks); } } /// /// 计算采购限时任务的到期时间 /// /// 付款时间 /// private DateTime CalculationPurcashTimeLimitTaskExpirationTime(DateTime payTime) { var addDays = 0; if (payTime.DayOfWeek == DayOfWeek.Sunday || payTime.DayOfWeek == DayOfWeek.Monday || payTime.DayOfWeek == DayOfWeek.Tuesday || payTime.DayOfWeek == DayOfWeek.Wednesday || payTime.DayOfWeek == DayOfWeek.Thursday || payTime.DayOfWeek == DayOfWeek.Friday) { if (payTime.Hour >= 0 && payTime.Hour < 15) addDays = 0; //当日 else addDays = payTime.DayOfWeek == DayOfWeek.Friday ? 2 : 1; //次日,星期五是后天 } else if (payTime.DayOfWeek == DayOfWeek.Saturday) addDays = 1; return payTime.Date.AddDays(addDays).AddHours(16); } private Enums.OrderState? ConvertQuanTanOrderState(string qtOrderState, bool isPay, bool isPurchased) { /* -1、已取消; 0、待发货; 1、待收货; 2、待评价; 3、已完成; */ if (qtOrderState == "-1") return Enums.OrderState.已取消; if (!isPay) return Enums.OrderState.待付款; if (qtOrderState == "0") { if (!isPurchased) return Enums.OrderState.等待采购; return Enums.OrderState.待发货; } if (qtOrderState == "1") return Enums.OrderState.待收货; if (qtOrderState == "2") return Enums.OrderState.待收货; if (qtOrderState == "3") return Enums.OrderState.已完成; return null; } } }