diff --git a/BBWY.Server.API/Controllers/OrderController.cs b/BBWY.Server.API/Controllers/OrderController.cs index c07f8d0f..96badb05 100644 --- a/BBWY.Server.API/Controllers/OrderController.cs +++ b/BBWY.Server.API/Controllers/OrderController.cs @@ -141,46 +141,5 @@ namespace BBWY.Server.API.Controllers { orderBusiness.EditAfterSaleOrderSku(editAfterSaleOrderSkuRequest); } - - - /// - /// 指定时间范围的订单同步 - /// - /// - [HttpPost] - public void SyncOrderByDate([FromBody] SyncOrderByDateRequest syncOrderByDateRequest) - { - orderBusiness.SyncOrderByDate(syncOrderByDateRequest); - } - - /// - /// 同步所有店铺订单 - /// - [HttpPost] - public void SyncAllShopOrder() - { - orderBusiness.SyncAllShopOrder(); - } - - /// - /// 订单同步 - /// - /// - /// - [HttpPost("{shopId}/{orderId}")] - public void SyncOrder([FromRoute] long shopId, [FromRoute] string orderId) - { - - Task.Factory.StartNew(() => orderBusiness.SyncOrder(shopId, orderId), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); - } - - /// - /// 退款同步 - /// - [HttpPost] - public void SyncAllShopRefundOrder() - { - orderBusiness.SyncAllShopRefundOrder(); - } } } diff --git a/BBWY.Server.API/Controllers/OrderSyncController.cs b/BBWY.Server.API/Controllers/OrderSyncController.cs new file mode 100644 index 00000000..bac408e0 --- /dev/null +++ b/BBWY.Server.API/Controllers/OrderSyncController.cs @@ -0,0 +1,36 @@ +using BBWY.Server.Business; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace BBWY.Server.API.Controllers +{ + + public class OrderSyncController : BaseApiController + { + private OrderSyncBusiness orderSyncBusiness; + public OrderSyncController(IHttpContextAccessor httpContextAccessor, OrderSyncBusiness orderSyncBusiness) : base(httpContextAccessor) + { + this.orderSyncBusiness = orderSyncBusiness; + } + + /// + /// 同步所有店铺的订单 + /// + [HttpPost] + public void SyncAllShopOrder() + { + orderSyncBusiness.SyncAllShopOrder(); + } + + /// + /// 订单同步 + /// + /// + /// + [HttpPost("{shopId}/{orderId}")] + public void SyncOrder([FromRoute] long shopId, [FromRoute] string orderId) + { + orderSyncBusiness.SyncOrder(shopId, orderId, null, null); + } + } +} diff --git a/BBWY.Server.API/Controllers/PlatformSDKController.cs b/BBWY.Server.API/Controllers/PlatformSDKController.cs index 0bf59013..2dac8411 100644 --- a/BBWY.Server.API/Controllers/PlatformSDKController.cs +++ b/BBWY.Server.API/Controllers/PlatformSDKController.cs @@ -1,4 +1,5 @@ using BBWY.Server.Business; +using BBWY.Server.Model; using BBWY.Server.Model.Dto; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -163,5 +164,16 @@ namespace BBWY.Server.API.Controllers { return platformSDKBusinessList.FirstOrDefault(p => p.Platform == searchRefundPlatformOrderRequest.Platform).GetRefundList(searchRefundPlatformOrderRequest); } + + /// + /// 获取售后订单 + /// + /// + /// + [HttpPost] + public JArray GetAfterOrderList([FromBody] SyncAfterOrderRequest syncAfterOrderRequest) + { + return platformSDKBusinessList.FirstOrDefault(p => p.Platform == syncAfterOrderRequest.Platform).GetAfterOrderList(syncAfterOrderRequest); + } } } diff --git a/BBWY.Server.API/Controllers/RefundOrderSyncController.cs b/BBWY.Server.API/Controllers/RefundOrderSyncController.cs new file mode 100644 index 00000000..60260f48 --- /dev/null +++ b/BBWY.Server.API/Controllers/RefundOrderSyncController.cs @@ -0,0 +1,26 @@ +using BBWY.Server.Business; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace BBWY.Server.API.Controllers +{ + + public class RefundOrderSyncController : BaseApiController + { + private RefundOrderSyncBusiness refundOrderSyncBusiness; + + public RefundOrderSyncController(RefundOrderSyncBusiness refundOrderSyncBusiness, IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor) + { + this.refundOrderSyncBusiness = refundOrderSyncBusiness; + } + + /// + /// 退款同步 + /// + [HttpPost] + public void SyncAllShopRefundOrder() + { + refundOrderSyncBusiness.SyncAllShopRefundOrder(); + } + } +} diff --git a/BBWY.Server.API/Controllers/TestController.cs b/BBWY.Server.API/Controllers/TestController.cs index 30494926..2cace9de 100644 --- a/BBWY.Server.API/Controllers/TestController.cs +++ b/BBWY.Server.API/Controllers/TestController.cs @@ -1,4 +1,5 @@ -using BBWY.Server.Model.Db; +using BBWY.Server.Business; +using BBWY.Server.Model.Db; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; @@ -9,27 +10,17 @@ namespace BBWY.Server.API.Controllers public class TestController : BaseApiController { private IFreeSql fsql; - public TestController(IHttpContextAccessor httpContextAccessor, IFreeSql fsql) : base(httpContextAccessor) + private TestBusiness testBusiness; + public TestController(IHttpContextAccessor httpContextAccessor, IFreeSql fsql, TestBusiness testBusiness) : base(httpContextAccessor) { this.fsql = fsql; + this.testBusiness = testBusiness; } - [HttpGet] - public IList GetList() + [HttpPost] + public void SyncVenderId() { - return new List() { - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - DateTime.Now.ToString() - }; - } - - [HttpGet("{orderId}")] - public decimal SumNoExists([FromRoute] string orderId) - { - var a = fsql.Select().Where(oc => oc.OrderId == orderId).ToAggregate(g => g.Sum(g.Key.CouponPrice) ); - return a; + testBusiness.SyncVenderId(); } } } diff --git a/BBWY.Server.Business/Order/OrderBusiness.cs b/BBWY.Server.Business/Order/OrderBusiness.cs index f3647b23..ab9f3b32 100644 --- a/BBWY.Server.Business/Order/OrderBusiness.cs +++ b/BBWY.Server.Business/Order/OrderBusiness.cs @@ -25,8 +25,7 @@ namespace BBWY.Server.Business { private ILogger logger; private IFreeSql fsql; - private IDictionary> syncOrderMethodDic; - private IDictionary> syncRefundOrderMethodDic; + private IIdGenerator idGenerator; private TaskSchedulerManager taskSchedulerManager; private MDSBusiness mdsBusiness; @@ -48,14 +47,6 @@ namespace BBWY.Server.Business this.fsql = fsql; this.idGenerator = idGenerator; this.taskSchedulerManager = taskSchedulerManager; - syncOrderMethodDic = new Dictionary>() - { - { Enums.Platform.京东, SyncJDOrder } - }; - syncRefundOrderMethodDic = new Dictionary>() - { - { Enums.Platform.京东, SyncJDRefundOrder} - }; this.mdsBusiness = mdsBusiness; this.venderBusiness = venderBusiness; freeSqlMultiDBManagerLazy = new Lazy(() => serviceProvider.GetService()); @@ -1076,668 +1067,5 @@ namespace BBWY.Server.Business updateAfterSaleOrder?.ExecuteAffrows(); }); } - - /// - /// 同步订单 - /// - /// - /// - /// 默认3小时前 - /// 默认当前时间 - /// - public void SyncOrder(long shopId, string orderId, DateTime? startTime = null, DateTime? endTime = null) - { - var shop = mdsBusiness.GetShopInfoByShopId(shopId); - SyncOrder(shop, orderId, startTime, endTime); - } - - private void SyncOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false) - { - 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(-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 - }, null, HttpMethod.Post); - 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); - logger.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 - { - SyncOrder(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 orderTokenList = orderTokenJArray.Where(o => o.Value("orderTotalPrice") != 0); - - var interfaceOrderIdList = orderTokenList.Select(orderJToken => orderJToken.Value("orderId")); - var interfaceCanceledOrderIdList = orderTokenList.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 - }); //数据库订单 - 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(); //数据库订单优惠信息 - - 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(); - } - - var orderSkuIds = new List(); - foreach (var orderJToken in orderTokenList) - { - var itemInfoList = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value("jdPrice") != 0M).Select(skuJToken => skuJToken.Value("skuId")); - foreach (var skuId in itemInfoList) - { - if (!orderSkuIds.Contains(skuId)) - orderSkuIds.Add(skuId); - } - } - var dbPurchaseOrderList = fsql.Select().Where(po => po.RemainingQuantity != 0 && orderSkuIds.Contains(po.SkuId)).ToList(); //数据库采购单 - orderSkuIds.Clear(); - - #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(); - - IList> updateOrderList = new List>(); - IList> updatePurchaseOrderList = new List>(); - #endregion - - foreach (var orderJToken in orderTokenList) - { - var orderId = orderJToken.Value("orderId"); - var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == orderId); - var isNewOrder = dbOrder == null; - - #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"); - if (dbOrder == null) - { - dbOrder = new Order() - { - Id = orderId, - BuyerRemark = buyerRemark, - VenderRemark = venderRemark, - FreightPrice = orderJToken.Value("freightPrice"), - EndTime = endTime, - StartTime = orderJToken.Value("orderStartTime"), - ModifyTime = modifyTime, - OrderPayment = orderJToken.Value("orderPayment"), - SellerPreferentialAmount = orderJToken.Value("sellerDiscount"), - OrderSellerPrice = orderJToken.Value("orderSellerPrice"), - OrderTotalPrice = orderJToken.Value("orderTotalPrice"), - OrderType = (Enums.OrderType)orderJToken.Value("orderType"), - Platform = Enums.Platform.京东, - ShopId = shopId, - //VenderId = orderJToken.Value("venderId"), - WaybillNo = waybillNo, - StoreOrder = orderJToken.Value("storeOrder") ?? string.Empty, - StoreId = orderJToken.Value("storeId") - }; - - if (dbOrder.StoreOrder.Contains("京仓")) - dbOrder.StorageType = Enums.StorageType.京仓; - else if (dbOrder.StoreOrder.Contains("云仓")) - dbOrder.StorageType = Enums.StorageType.云仓; - - var payType = orderJToken.Value("payType"); - if (payType.Contains("-")) - dbOrder.PayType = (Enums.PayType)Convert.ToInt32(payType.Substring(0, 1)); - - insertOrderList.Add(dbOrder); - - #region OrderSku - var orderSkuList = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value("jdPrice") != 0M).Select(skuToken => new OrderSku() - { - Id = idGenerator.NewLong(), - ItemTotal = skuToken.Value("itemTotal"), - Price = skuToken.Value("jdPrice"), - ProductId = skuToken.Value("wareId"), - Title = skuToken.Value("skuName").SimplifySkuName(), - ProductNo = skuToken.Value("productNo"), - CreateTime = DateTime.Now, - OrderId = orderId, - SkuId = skuToken.Value("skuId") - }).ToList(); - insertOrderSkuList.AddRange(orderSkuList); - #endregion - } - #endregion - - #region 收货人信息 - if (dbOrderConsigneeList.FirstOrDefault(oc => oc.OrderId == orderId) == null) - { - var orderConsignee = new OrderConsignee() - { - OrderId = orderId, - //Address = orderJToken["consigneeInfo"].Value("fullAddress"), - //ContactName = orderJToken["consigneeInfo"].Value("fullname"), - //Mobile = orderJToken["consigneeInfo"].Value("mobile"), - //TelePhone = orderJToken["consigneeInfo"].Value("telephone"), - 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 订单优惠 - if (!dbOrderCouponList.Any(oc => oc.OrderId == orderId)) - { - 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"); - 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 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 (dbOrder.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 - - #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.SD && - dbOrder.StorageType != Enums.StorageType.代发 && - orderState != null && - orderState != Enums.OrderState.待付款 && - orderState != Enums.OrderState.已取消) - { - var orderCost = dbOrderCostList.FirstOrDefault(oc => oc.OrderId == dbOrder.Id); - if (orderCost == null) - { - //再查询一次数据库,以防同步开始执行后被人为操作扣减库存,造成重复扣减库存 - 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购买数量第二个开始半价 - - #region 扣减库存 - foreach (var orderSkuJToken in orderSkuJArray) - { - var orderSkuId = orderSkuJToken.Value("skuId"); - var itemTotal = orderSkuJToken.Value("itemTotal"); //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, - PurchaseFreight = purchaseOrder.SingleFreight * deductionQuantity, - SkuAmount = purchaseOrder.SingleSkuAmount * deductionQuantity, - StorageAmount = purchaseOrder.SingleStorageAmount * deductionQuantity - }; - insertOrderCostDetailList.Add(orderCostDetail); - } - } - #endregion - - #region 计算成本 - orderCost = new OrderCost() - { - OrderId = orderId, - PlatformCommissionRatio = platformCommissionRatio, - PreferentialAmount = dbOrder.PreferentialAmount, - Profit = 0, - PurchaseAmount = orderCostPurchaseAmount, - DeliveryExpressFreight = orderDeliveryExpressFreight, - CreateTime = DateTime.Now - }; - orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio; - orderCost.Profit = dbOrder.OrderSellerPrice + - dbOrder.FreightPrice - - orderCost.PurchaseAmount - - orderCost.DeliveryExpressFreight - - orderCost.PlatformCommissionAmount; - insertOrderCostList.Add(orderCost); - #endregion - } - } - } - } - #endregion - - #region 检查订单信息是否变化 - if (isNewOrder) - { - dbOrder.OrderState = orderState; - } - else if ((orderState != null && orderState != dbOrder.OrderState) || - buyerRemark != dbOrder.BuyerRemark || - venderRemark != dbOrder.VenderRemark || - modifyTime != dbOrder.ModifyTime || - endTime != dbOrder.EndTime || - waybillNo != dbOrder.WaybillNo) - { - 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); - updateOrderList.Add(updateSql); - } - #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 - }, null, 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(); - } - }); - } - - /// - /// 同步所有店铺的订单 - /// - public void SyncAllShopOrder() - { - var shopList = venderBusiness.GetShopList(); - foreach (var shop in shopList) - { - Task.Factory.StartNew(() => SyncOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); - } - } - - private void SyncJDRefundOrder(JArray refundOrderTokenJArray, ShopResponse shopResponse) - { - var shopId = long.Parse(shopResponse.ShopId); - var validRefundOrderTokenJArray = refundOrderTokenJArray.Where(j => j.Value("status") == 13 && j.Value("refoundAmount") != 0M).ToList(); - var orderIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["orderId"].ToString()).Distinct().ToList(); - var orderSkuIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["wareId"].ToString()).Distinct().ToList(); - - var updateOrders = fsql.Select().Where(o => orderIds.Contains(o.Id) && o.IsAfterSaleOrder == false).ToList(); - var updateOrderSkus = fsql.Select().Where(osku => orderIds.Contains(osku.OrderId) && - orderSkuIds.Contains(osku.SkuId) && - osku.IsRefund == false).ToList(); - - List afterSaleOrders = new List(); - - foreach (var refundOrderJToken in validRefundOrderTokenJArray) - { - var skuId = refundOrderJToken["sameOrderServiceBill"]["wareId"].ToString(); - var orderId = refundOrderJToken["sameOrderServiceBill"]["orderId"].ToString(); - var updateSku = updateOrderSkus.FirstOrDefault(osku => osku.OrderId == orderId && osku.SkuId == skuId); - if (updateSku == null) - continue; - - var refundAmount = refundOrderJToken.Value("refoundAmount"); - var refundCompleteTime = refundOrderJToken.Value("completeTime").StampToDateTime(); - - - afterSaleOrders.Add(new AfterSaleOrder() - { - Id = idGenerator.NewLong(), - CreateTime = DateTime.Now, - OrderId = updateSku.OrderId, - ProductId = updateSku.ProductId, - RefundAmount = refundAmount, - RefundTime = refundCompleteTime, - SkuId = skuId, - ShopId = shopId - }); - } - - fsql.Transaction(() => - { - if (updateOrders.Count() > 0) - foreach (var updateOrder in updateOrders) - fsql.Update(updateOrder.Id).Set(o => o.IsAfterSaleOrder, true).ExecuteAffrows(); - if (updateOrderSkus.Count() > 0) - foreach (var updateOrderSku in updateOrderSkus) - fsql.Update(updateOrderSku.Id).Set(osku => osku.IsRefund, true).ExecuteAffrows(); - if (afterSaleOrders.Count() > 0) - fsql.Insert(afterSaleOrders).ExecuteAffrows(); - }); - } - - public void SyncRefundOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false) - { - 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 refundOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetRefundList", new SearchRefundPlatformOrderRequest() - { - StartDate = startTime ?? DateTime.Now.Date.AddDays(-1), - EndDate = endTime ?? DateTime.Now, - AppKey = shop.AppKey, - AppSecret = shop.AppSecret, - AppToken = shop.AppToken, - PageIndex = 1, - PageSize = 50, - Platform = shop.PlatformId, - SaveResponseLog = true, - OrderId = orderId - }, null, HttpMethod.Post); - if (refundOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK) - throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}"); - - var refundOrderListResponse = JsonConvert.DeserializeObject>(refundOrderListApiResult.Content); - if (!refundOrderListResponse.Success) - throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}"); - - if (refundOrderListResponse.Data == null || refundOrderListResponse.Data.Count == 0) - return; - - syncRefundOrderMethodDic[shop.PlatformId](refundOrderListResponse.Data, shop); - } - catch (Exception ex) - { - var shopData = JsonConvert.SerializeObject(shop); - logger.Error(ex, $"SyncRefundOrder ShopData:{shopData}"); - } - } - - public void SyncAllShopRefundOrder() - { - var shopList = venderBusiness.GetShopList(); - //SyncRefundOrder(shopList.FirstOrDefault(s => s.ShopName == "布莱特玩具专营店"), string.Empty, isAuto: true); - foreach (var shop in shopList) - { - Task.Factory.StartNew(() => SyncRefundOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncRefundOrderTaskScheduler); - } - } } } diff --git a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs index 8a71d608..aefcadcf 100644 --- a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs +++ b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs @@ -5,6 +5,7 @@ using BBWY.Server.Model.Dto; using Jd.ACES; using Jd.Api; using Jd.Api.Request; +using Jd.Api.Response; using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -470,5 +471,28 @@ namespace BBWY.Server.Business //return base.GetRefundList(searchRefundPlatformOrderRequest); return (JArray)response.Json["jingdong_asc_serviceAndRefund_view_responce"]["pageResult"]["data"]; } + + public override JArray GetAfterOrderList(SyncAfterOrderRequest syncAfterOrderRequest) + { + var jdClient = GetJdClient(syncAfterOrderRequest.AppKey, syncAfterOrderRequest.AppSecret); + var req = new AscQueryListRequest(); + req.buId = syncAfterOrderRequest.VenderId; + req.operatePin = "开发测试"; + req.operateNick = "开发测试"; + req.finishTimeBegin = syncAfterOrderRequest.StartDate; + req.finishTimeEnd = syncAfterOrderRequest.EndDate; + req.pageNumber = syncAfterOrderRequest.PageIndex.ToString(); + req.pageSize = syncAfterOrderRequest.PageSize.ToString(); + if (!string.IsNullOrEmpty(syncAfterOrderRequest.OrderId)) + req.orderId = long.Parse(syncAfterOrderRequest.OrderId); + + AscQueryListResponse response = jdClient.Execute(req, syncAfterOrderRequest.AppToken, DateTime.Now.ToLocalTime()); + if (response.IsError) + throw new BusinessException($"获取售后订单失败 {(string.IsNullOrEmpty(response.ErrorMsg) ? response.ErrMsg : response.ErrorMsg)}"); + + if (response.Json == null) + response.Json = JsonConvert.DeserializeObject(response.Body); + return (JArray)response.Json["jingdong_asc_query_list_responce"]["pageResult"]["data"]; + } } } diff --git a/BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs b/BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs index be91a655..711a7e5b 100644 --- a/BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs +++ b/BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs @@ -99,6 +99,8 @@ namespace BBWY.Server.Business throw new NotImplementedException(); } - public virtual JArray GetRefundList(SearchRefundPlatformOrderRequest searchRefundPlatformOrderRequest) { throw new NotImplementedException(); } + public virtual JArray GetRefundList(SearchRefundPlatformOrderRequest searchRefundPlatformOrderRequest) { throw new NotImplementedException(); } + + public virtual JArray GetAfterOrderList(SyncAfterOrderRequest syncAfterOrderRequest) { throw new NotImplementedException(); } } } diff --git a/BBWY.Server.Business/Sync/AfterSaleOrderSyncBusiness.cs b/BBWY.Server.Business/Sync/AfterSaleOrderSyncBusiness.cs new file mode 100644 index 00000000..39e6dad5 --- /dev/null +++ b/BBWY.Server.Business/Sync/AfterSaleOrderSyncBusiness.cs @@ -0,0 +1,64 @@ +using BBWY.Common.Http; +using BBWY.Common.Models; +using BBWY.Server.Model; +using BBWY.Server.Model.Dto; +using Microsoft.Extensions.Options; +using Newtonsoft.Json.Linq; +using NLog; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Yitter.IdGenerator; + +namespace BBWY.Server.Business +{ + public class AfterSaleOrderSyncBusiness : BaseSyncBusiness, IDenpendency + { + private IDictionary> syncAfterSaleOrderMethodDic; + + + public AfterSaleOrderSyncBusiness(RestApiService restApiService, + IOptions options, + ILogger logger, + IFreeSql fsql, + IIdGenerator idGenerator, + TaskSchedulerManager taskSchedulerManager, + VenderBusiness venderBusiness) : base(restApiService, + options, + logger, + fsql, + idGenerator, + taskSchedulerManager, + venderBusiness) + { + syncAfterSaleOrderMethodDic = new Dictionary>() + { + { Enums.Platform.京东, SyncJDAfterOrder } + }; + } + + private void SyncJDAfterOrder(JArray refundOrderTokenJArray, ShopResponse shopResponse) + { + + } + + + private void SyncAfterOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false) + { + + } + + public void SyncAllShopAfterOrder() + { + var shopList = venderBusiness.GetShopList(); + //SyncRefundOrder(shopList.FirstOrDefault(s => s.ShopName == "布莱特玩具专营店"), string.Empty, isAuto: true); + foreach (var shop in shopList) + { + Task.Factory.StartNew(() => SyncAfterOrder(shop, string.Empty, isAuto: true), + System.Threading.CancellationToken.None, + TaskCreationOptions.LongRunning, + taskSchedulerManager.SyncAfterOrderTaskScheduler); + } + } + } +} diff --git a/BBWY.Server.Business/Sync/BaseSyncBusiness.cs b/BBWY.Server.Business/Sync/BaseSyncBusiness.cs new file mode 100644 index 00000000..240e182e --- /dev/null +++ b/BBWY.Server.Business/Sync/BaseSyncBusiness.cs @@ -0,0 +1,32 @@ +using BBWY.Common.Http; +using BBWY.Common.Models; +using BBWY.Server.Model; +using Microsoft.Extensions.Options; +using NLog; +using Yitter.IdGenerator; + +namespace BBWY.Server.Business +{ + public class BaseSyncBusiness : BasePlatformRelayBusiness, IDenpendency + { + protected ILogger logger; + protected IFreeSql fsql; + protected IIdGenerator idGenerator; + protected TaskSchedulerManager taskSchedulerManager; + protected VenderBusiness venderBusiness; + + public BaseSyncBusiness(RestApiService restApiService, + IOptions options, + ILogger logger, + IFreeSql fsql, + IIdGenerator idGenerator, + TaskSchedulerManager taskSchedulerManager, + VenderBusiness venderBusiness) : base(restApiService, options) + { + this.logger = logger; + this.fsql = fsql; + this.idGenerator = idGenerator; + this.venderBusiness = venderBusiness; + } + } +} diff --git a/BBWY.Server.Business/Sync/OrderSyncBusiness.cs b/BBWY.Server.Business/Sync/OrderSyncBusiness.cs new file mode 100644 index 00000000..26b99b4f --- /dev/null +++ b/BBWY.Server.Business/Sync/OrderSyncBusiness.cs @@ -0,0 +1,605 @@ +using BBWY.Common.Http; +using BBWY.Common.Models; +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.Options; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NLog; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using Yitter.IdGenerator; + +namespace BBWY.Server.Business +{ + public class OrderSyncBusiness : BaseSyncBusiness, IDenpendency + { + private IDictionary> syncOrderMethodDic; + + public OrderSyncBusiness(RestApiService restApiService, + IOptions options, + ILogger logger, + IFreeSql fsql, + IIdGenerator idGenerator, + TaskSchedulerManager taskSchedulerManager, + VenderBusiness venderBusiness) : base(restApiService, + options, + logger, + fsql, + idGenerator, + taskSchedulerManager, + venderBusiness) + { + syncOrderMethodDic = new Dictionary>() + { + { Enums.Platform.京东, SyncJDOrder } + }; + } + + /// + /// 同步订单 + /// + /// + /// + /// 默认3小时前 + /// 默认当前时间 + /// + public void SyncOrder(long shopId, string orderId, DateTime? startTime = null, DateTime? endTime = null) + { + var shop = venderBusiness.GetShopByShopId(shopId.ToString()); + SyncOrder(shop, orderId, startTime, endTime); + } + + private void SyncOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false) + { + 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(-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 + }, null, HttpMethod.Post); + 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); + logger.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 + { + SyncOrder(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 orderTokenList = orderTokenJArray.Where(o => o.Value("orderTotalPrice") != 0); + + var interfaceOrderIdList = orderTokenList.Select(orderJToken => orderJToken.Value("orderId")); + var interfaceCanceledOrderIdList = orderTokenList.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 + }); //数据库订单 + 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(); //数据库订单优惠信息 + + 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(); + } + + var orderSkuIds = new List(); + foreach (var orderJToken in orderTokenList) + { + var itemInfoList = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value("jdPrice") != 0M).Select(skuJToken => skuJToken.Value("skuId")); + foreach (var skuId in itemInfoList) + { + if (!orderSkuIds.Contains(skuId)) + orderSkuIds.Add(skuId); + } + } + var dbPurchaseOrderList = fsql.Select().Where(po => po.RemainingQuantity != 0 && orderSkuIds.Contains(po.SkuId)).ToList(); //数据库采购单 + orderSkuIds.Clear(); + + #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(); + + IList> updateOrderList = new List>(); + IList> updatePurchaseOrderList = new List>(); + #endregion + + foreach (var orderJToken in orderTokenList) + { + var orderId = orderJToken.Value("orderId"); + var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == orderId); + var isNewOrder = dbOrder == null; + + #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"); + if (dbOrder == null) + { + dbOrder = new Order() + { + Id = orderId, + BuyerRemark = buyerRemark, + VenderRemark = venderRemark, + FreightPrice = orderJToken.Value("freightPrice"), + EndTime = endTime, + StartTime = orderJToken.Value("orderStartTime"), + ModifyTime = modifyTime, + OrderPayment = orderJToken.Value("orderPayment"), + SellerPreferentialAmount = orderJToken.Value("sellerDiscount"), + OrderSellerPrice = orderJToken.Value("orderSellerPrice"), + OrderTotalPrice = orderJToken.Value("orderTotalPrice"), + OrderType = (Enums.OrderType)orderJToken.Value("orderType"), + Platform = Enums.Platform.京东, + ShopId = shopId, + //VenderId = orderJToken.Value("venderId"), + WaybillNo = waybillNo, + StoreOrder = orderJToken.Value("storeOrder") ?? string.Empty, + StoreId = orderJToken.Value("storeId") + }; + + if (dbOrder.StoreOrder.Contains("京仓")) + dbOrder.StorageType = Enums.StorageType.京仓; + else if (dbOrder.StoreOrder.Contains("云仓")) + dbOrder.StorageType = Enums.StorageType.云仓; + + var payType = orderJToken.Value("payType"); + if (payType.Contains("-")) + dbOrder.PayType = (Enums.PayType)Convert.ToInt32(payType.Substring(0, 1)); + + insertOrderList.Add(dbOrder); + + #region OrderSku + var orderSkuList = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value("jdPrice") != 0M).Select(skuToken => new OrderSku() + { + Id = idGenerator.NewLong(), + ItemTotal = skuToken.Value("itemTotal"), + Price = skuToken.Value("jdPrice"), + ProductId = skuToken.Value("wareId"), + Title = skuToken.Value("skuName").SimplifySkuName(), + ProductNo = skuToken.Value("productNo"), + CreateTime = DateTime.Now, + OrderId = orderId, + SkuId = skuToken.Value("skuId") + }).ToList(); + insertOrderSkuList.AddRange(orderSkuList); + #endregion + } + #endregion + + #region 收货人信息 + if (dbOrderConsigneeList.FirstOrDefault(oc => oc.OrderId == orderId) == null) + { + var orderConsignee = new OrderConsignee() + { + OrderId = orderId, + //Address = orderJToken["consigneeInfo"].Value("fullAddress"), + //ContactName = orderJToken["consigneeInfo"].Value("fullname"), + //Mobile = orderJToken["consigneeInfo"].Value("mobile"), + //TelePhone = orderJToken["consigneeInfo"].Value("telephone"), + 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 订单优惠 + if (!dbOrderCouponList.Any(oc => oc.OrderId == orderId)) + { + 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"); + 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 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 (dbOrder.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 + + #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.SD && + dbOrder.StorageType != Enums.StorageType.代发 && + orderState != null && + orderState != Enums.OrderState.待付款 && + orderState != Enums.OrderState.已取消) + { + var orderCost = dbOrderCostList.FirstOrDefault(oc => oc.OrderId == dbOrder.Id); + if (orderCost == null) + { + //再查询一次数据库,以防同步开始执行后被人为操作扣减库存,造成重复扣减库存 + 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购买数量第二个开始半价 + + #region 扣减库存 + foreach (var orderSkuJToken in orderSkuJArray) + { + var orderSkuId = orderSkuJToken.Value("skuId"); + var itemTotal = orderSkuJToken.Value("itemTotal"); //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, + PurchaseFreight = purchaseOrder.SingleFreight * deductionQuantity, + SkuAmount = purchaseOrder.SingleSkuAmount * deductionQuantity, + StorageAmount = purchaseOrder.SingleStorageAmount * deductionQuantity + }; + insertOrderCostDetailList.Add(orderCostDetail); + } + } + #endregion + + #region 计算成本 + orderCost = new OrderCost() + { + OrderId = orderId, + PlatformCommissionRatio = platformCommissionRatio, + PreferentialAmount = dbOrder.PreferentialAmount, + Profit = 0, + PurchaseAmount = orderCostPurchaseAmount, + DeliveryExpressFreight = orderDeliveryExpressFreight, + CreateTime = DateTime.Now + }; + orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio; + orderCost.Profit = dbOrder.OrderSellerPrice + + dbOrder.FreightPrice - + orderCost.PurchaseAmount - + orderCost.DeliveryExpressFreight - + orderCost.PlatformCommissionAmount; + insertOrderCostList.Add(orderCost); + #endregion + } + } + } + } + #endregion + + #region 检查订单信息是否变化 + if (isNewOrder) + { + dbOrder.OrderState = orderState; + } + else if ((orderState != null && orderState != dbOrder.OrderState) || + buyerRemark != dbOrder.BuyerRemark || + venderRemark != dbOrder.VenderRemark || + modifyTime != dbOrder.ModifyTime || + endTime != dbOrder.EndTime || + waybillNo != dbOrder.WaybillNo) + { + 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); + updateOrderList.Add(updateSql); + } + #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 + }, null, 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(); + } + }); + } + + /// + /// 同步所有店铺的订单 + /// + public void SyncAllShopOrder() + { + var shopList = venderBusiness.GetShopList(); + foreach (var shop in shopList) + { + Task.Factory.StartNew(() => SyncOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); + } + } + } +} diff --git a/BBWY.Server.Business/Sync/RefundOrderSyncBusiness.cs b/BBWY.Server.Business/Sync/RefundOrderSyncBusiness.cs new file mode 100644 index 00000000..efc3e50b --- /dev/null +++ b/BBWY.Server.Business/Sync/RefundOrderSyncBusiness.cs @@ -0,0 +1,147 @@ +using BBWY.Common.Extensions; +using BBWY.Common.Http; +using BBWY.Common.Models; +using BBWY.Server.Model; +using BBWY.Server.Model.Db; +using BBWY.Server.Model.Dto; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NLog; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using Yitter.IdGenerator; + +namespace BBWY.Server.Business +{ + public class RefundOrderSyncBusiness : BaseSyncBusiness, IDenpendency + { + private IDictionary> syncRefundOrderMethodDic; + + public RefundOrderSyncBusiness(RestApiService restApiService, + IOptions options, + ILogger logger, + IFreeSql fsql, + IIdGenerator idGenerator, + TaskSchedulerManager taskSchedulerManager, + VenderBusiness venderBusiness) : base(restApiService, + options, + logger, + fsql, + idGenerator, + taskSchedulerManager, + venderBusiness) + { + syncRefundOrderMethodDic = new Dictionary>() + { + { Enums.Platform.京东, SyncJDRefundOrder} + }; + } + + private void SyncJDRefundOrder(JArray refundOrderTokenJArray, ShopResponse shopResponse) + { + var shopId = long.Parse(shopResponse.ShopId); + var validRefundOrderTokenJArray = refundOrderTokenJArray.Where(j => j.Value("status") == 13 && j.Value("refoundAmount") != 0M).ToList(); + var orderIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["orderId"].ToString()).Distinct().ToList(); + var orderSkuIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["wareId"].ToString()).Distinct().ToList(); + + var updateOrders = fsql.Select().Where(o => orderIds.Contains(o.Id) && o.IsAfterSaleOrder == false).ToList(); + var updateOrderSkus = fsql.Select().Where(osku => orderIds.Contains(osku.OrderId) && + orderSkuIds.Contains(osku.SkuId) && + osku.IsRefund == false).ToList(); + + List afterSaleOrders = new List(); + + foreach (var refundOrderJToken in validRefundOrderTokenJArray) + { + var skuId = refundOrderJToken["sameOrderServiceBill"]["wareId"].ToString(); + var orderId = refundOrderJToken["sameOrderServiceBill"]["orderId"].ToString(); + var updateSku = updateOrderSkus.FirstOrDefault(osku => osku.OrderId == orderId && osku.SkuId == skuId); + if (updateSku == null) + continue; + + var refundAmount = refundOrderJToken.Value("refoundAmount"); + var refundCompleteTime = refundOrderJToken.Value("completeTime").StampToDateTime(); + + + afterSaleOrders.Add(new AfterSaleOrder() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + OrderId = updateSku.OrderId, + ProductId = updateSku.ProductId, + RefundAmount = refundAmount, + RefundTime = refundCompleteTime, + SkuId = skuId, + ShopId = shopId + }); + } + + fsql.Transaction(() => + { + if (updateOrders.Count() > 0) + foreach (var updateOrder in updateOrders) + fsql.Update(updateOrder.Id).Set(o => o.IsAfterSaleOrder, true).ExecuteAffrows(); + if (updateOrderSkus.Count() > 0) + foreach (var updateOrderSku in updateOrderSkus) + fsql.Update(updateOrderSku.Id).Set(osku => osku.IsRefund, true).ExecuteAffrows(); + if (afterSaleOrders.Count() > 0) + fsql.Insert(afterSaleOrders).ExecuteAffrows(); + }); + } + + private void SyncRefundOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false) + { + try + { + logger.Info($"退款订单同步 {shop.ShopName} isAuto {isAuto}"); + if (!syncRefundOrderMethodDic.ContainsKey(shop.PlatformId)) + throw new Exception("不支持的平台"); + var shopId = long.Parse(shop.ShopId); + var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId); + var refundOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetRefundList", new SearchRefundPlatformOrderRequest() + { + StartDate = startTime ?? DateTime.Now.Date.AddDays(-1), + EndDate = endTime ?? DateTime.Now, + AppKey = shop.AppKey, + AppSecret = shop.AppSecret, + AppToken = shop.AppToken, + PageIndex = 1, + PageSize = 50, + Platform = shop.PlatformId, + SaveResponseLog = true, + OrderId = orderId + }, null, HttpMethod.Post); + if (refundOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK) + throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}"); + + var refundOrderListResponse = JsonConvert.DeserializeObject>(refundOrderListApiResult.Content); + if (!refundOrderListResponse.Success) + throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}"); + + if (refundOrderListResponse.Data == null || refundOrderListResponse.Data.Count == 0) + return; + + syncRefundOrderMethodDic[shop.PlatformId](refundOrderListResponse.Data, shop); + } + catch (Exception ex) + { + var shopData = JsonConvert.SerializeObject(shop); + logger.Error(ex, $"SyncRefundOrder ShopData:{shopData}"); + } + } + + public void SyncAllShopRefundOrder() + { + var shopList = venderBusiness.GetShopList(); + //SyncRefundOrder(shopList.FirstOrDefault(s => s.ShopName == "布莱特玩具专营店"), string.Empty, isAuto: true); + foreach (var shop in shopList) + { + Task.Factory.StartNew(() => SyncRefundOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncRefundOrderTaskScheduler); + } + } + } +} diff --git a/BBWY.Server.Business/TaskSchedulerManager.cs b/BBWY.Server.Business/TaskSchedulerManager.cs index b0c590a9..764b17e6 100644 --- a/BBWY.Server.Business/TaskSchedulerManager.cs +++ b/BBWY.Server.Business/TaskSchedulerManager.cs @@ -8,12 +8,15 @@ namespace BBWY.Server.Business public LimitedConcurrencyLevelTaskScheduler SyncRefundOrderTaskScheduler { get; private set; } + public LimitedConcurrencyLevelTaskScheduler SyncAfterOrderTaskScheduler { get; private set; } + public LimitedConcurrencyLevelTaskScheduler PurchaseOrderCallbackTaskScheduler { get; private set; } public TaskSchedulerManager() { SyncOrderTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10); SyncRefundOrderTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10); + SyncAfterOrderTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10); PurchaseOrderCallbackTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10); } } diff --git a/BBWY.Server.Business/TestBusiness.cs b/BBWY.Server.Business/TestBusiness.cs new file mode 100644 index 00000000..90671597 --- /dev/null +++ b/BBWY.Server.Business/TestBusiness.cs @@ -0,0 +1,46 @@ +using BBWY.Common.Http; +using BBWY.Common.Models; +using BBWY.Server.Model; +using BBWY.Server.Model.Db.Mds; +using FreeSql; +using Microsoft.Extensions.Options; +using System.Collections.Generic; + +namespace BBWY.Server.Business +{ + public class TestBusiness : BasePlatformRelayBusiness, IDenpendency + { + private FreeSqlMultiDBManager freeSqlMultiDBManager; + private VenderBusiness venderBusiness; + public TestBusiness(RestApiService restApiService, + IOptions options, + FreeSqlMultiDBManager freeSqlMultiDBManager, + VenderBusiness venderBusiness) : base(restApiService, options) + { + this.freeSqlMultiDBManager = freeSqlMultiDBManager; + this.venderBusiness = venderBusiness; + } + + public void SyncVenderId() + { + var noVenderShops = freeSqlMultiDBManager.MDSfsql.Select().Where(s => !string.IsNullOrEmpty(s.AppToken) && !string.IsNullOrEmpty(s.ShopId) && string.IsNullOrEmpty(s.VenderId)).ToList(); + //IList < IUpdate < Shops >> updateShops = new List>(); + foreach (var noVenderShop in noVenderShops) + { + if (string.IsNullOrEmpty(noVenderShop.AppKey)) + { + + } + var venderResponse = venderBusiness.GetVenderInfo(new Model.Dto.PlatformRequest() + { + AppKey = noVenderShop.AppKey, + AppSecret = noVenderShop.AppSecret, + AppToken = noVenderShop.AppToken, + Platform = (Enums.Platform)noVenderShop.PlatformId + }); + + freeSqlMultiDBManager.MDSfsql.Update(noVenderShop.Id).Set(s => s.VenderId, venderResponse.VenderId).ExecuteAffrows(); + } + } + } +} diff --git a/BBWY.Server.Business/Vender/VenderBusiness.cs b/BBWY.Server.Business/Vender/VenderBusiness.cs index e4b4cdff..acef3750 100644 --- a/BBWY.Server.Business/Vender/VenderBusiness.cs +++ b/BBWY.Server.Business/Vender/VenderBusiness.cs @@ -67,7 +67,8 @@ namespace BBWY.Server.Business venderResponse.ShopName, venderResponse.ShopId, ShopType = venderResponse.ColType, - AppToken = jDShopToken.Access_Token + AppToken = jDShopToken.Access_Token, + venderResponse.VenderId }, new Dictionary() { { "qy", "qy" } }, HttpMethod.Post); } @@ -224,5 +225,10 @@ namespace BBWY.Server.Business { return freeSqlMultiDBManager.MDSfsql.Select().Where(s => !string.IsNullOrEmpty(s.ShopId)).ToList(); } + + public ShopResponse GetShopByShopId(string shopId) + { + return freeSqlMultiDBManager.MDSfsql.Select().Where(s => s.ShopId == shopId).ToOne(); + } } } diff --git a/BBWY.Server.Model/Db/Mds/Shops.cs b/BBWY.Server.Model/Db/Mds/Shops.cs index 91d21e2c..baf54d65 100644 --- a/BBWY.Server.Model/Db/Mds/Shops.cs +++ b/BBWY.Server.Model/Db/Mds/Shops.cs @@ -74,6 +74,12 @@ namespace BBWY.Server.Model.Db.Mds [Column(StringLength = 50)] public string PurchasePlatformId { get; set; } + + /// + /// 商家编号 + /// + public string VenderId { get; set; } + /// /// 店铺ID /// diff --git a/BBWY.Server.Model/Dto/Request/Sync/SyncAfterOrderRequest.cs b/BBWY.Server.Model/Dto/Request/Sync/SyncAfterOrderRequest.cs new file mode 100644 index 00000000..df8a5c3f --- /dev/null +++ b/BBWY.Server.Model/Dto/Request/Sync/SyncAfterOrderRequest.cs @@ -0,0 +1,20 @@ +using BBWY.Server.Model.Dto; +using System; + +namespace BBWY.Server.Model +{ + public class SyncAfterOrderRequest : PlatformRequest + { + public DateTime? StartDate { get; set; } + + public DateTime? EndDate { get; set; } + + public int PageIndex { get; set; } + + public int PageSize { get; set; } + + public string OrderId { get; set; } + + public string VenderId { get; set; } + } +} diff --git a/BBWY.Server.Model/Dto/Response/Vender/ShopResponse.cs b/BBWY.Server.Model/Dto/Response/Vender/ShopResponse.cs index 4a48bcd0..f1dbc7ae 100644 --- a/BBWY.Server.Model/Dto/Response/Vender/ShopResponse.cs +++ b/BBWY.Server.Model/Dto/Response/Vender/ShopResponse.cs @@ -10,6 +10,8 @@ namespace BBWY.Server.Model.Dto public string ShopId { get; set; } + public string VenderId { get; set; } + public string ShopName { get; set; } /// diff --git a/BBWY.Test/Program.cs b/BBWY.Test/Program.cs index d4078978..5742ce7f 100644 --- a/BBWY.Test/Program.cs +++ b/BBWY.Test/Program.cs @@ -30,12 +30,19 @@ namespace BBWY.Test var token = "2ace3023200c4ea9aa682bbf8bffee18jztm"; var jdClient = GetJdClient(appKey, appSecret); - AscQueryListRequest req = new AscQueryListRequest(); - req.buId = "10598776"; - req.operatePin = "开发测试"; - req.operateNick = "开发测试"; - req.orderId = 249263452032; + + //AscQueryListRequest req = new AscQueryListRequest(); + + //req.buId = "10598776"; + //req.operatePin = "开发测试"; + //req.operateNick = "开发测试"; + + //req.finishTimeBegin = DateTime.Now.AddDays(-30); + //req.finishTimeEnd = DateTime.Now; + //req.pageNumber = "1"; + //req.pageSize = "20"; + //req.orderId = 164569571399; //req.serviceId = 123L; //req.orderId = 123L; //req.applyTimeBegin = new Date(); @@ -55,8 +62,8 @@ namespace BBWY.Test //req.pageSize = 123; //req.extJsonStr = "abc"; - AscQueryListResponse response = jdClient.Execute(req, token, DateTime.Now.ToLocalTime()); - Console.WriteLine(JsonConvert.SerializeObject(response)); + //AscQueryListResponse response = jdClient.Execute(req, token, DateTime.Now.ToLocalTime()); + //Console.WriteLine(JsonConvert.SerializeObject(response)); Console.ReadKey(); } }