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(); List insertOrderList = new List(); List insertOrderSkuList = new List(); List insertOrderConsigneeList = 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, 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 }; 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; } 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 { var updateOrderState = false; //var updateWaybillNo = false; //var updateExpressName = false; var updateModifyTime = false; var updateBuyerRemark = false; var updateVenderRemark = false; var updateBuyerAccount = false; if (dbOrder.OrderState != orderState) updateOrderState = true; //if (dbOrder.WaybillNo != qtOrder.DeliveryResponse.WayBillNo) // updateWaybillNo = true; //if (dbOrder.ExpressName != qtOrder.DeliveryResponse.ExpressName) // updateExpressName = true; if (dbOrder.ModifyTime != qtOrder.ModifyTime) updateModifyTime = true; if (dbOrder.BuyerRemark != qtOrder.BuyerRemark) updateBuyerRemark = true; if (dbOrder.VenderRemark != qtOrder.VenderRemark) updateVenderRemark = true; if (dbOrder.BuyerAccount != qtOrder.UserAccount) updateBuyerAccount = true; if (updateOrderState || updateModifyTime || updateBuyerRemark || updateVenderRemark || updateBuyerAccount) { var update = fsql.Update(dbOrder.Id).SetIf(updateOrderState, o => o.OrderState == orderState) //.SetIf(updateWaybillNo, o => o.WaybillNo, qtOrder.DeliveryResponse.WayBillNo) //.SetIf(updateExpressName, o => o.ExpressName, qtOrder.DeliveryResponse.ExpressName) .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); updateOrderList.Add(update); } } } 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 (updateOrderList.Count() > 0) foreach (var update in updateOrderList) update.ExecuteAffrows(); }); } catch (Exception ex) { nLogManager.GetLogger(loggerName).Error(ex); } } 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 Enums.OrderState.Unknow; } } }