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();
}
}