diff --git a/BBWY.Client/APIServices/OrderService.cs b/BBWY.Client/APIServices/OrderService.cs index a170b632..b164607f 100644 --- a/BBWY.Client/APIServices/OrderService.cs +++ b/BBWY.Client/APIServices/OrderService.cs @@ -33,7 +33,7 @@ namespace BBWY.Client.APIServices { orderId, startDate, - EndDate = endDate.Date.AddDays(1).AddSeconds(-1), + endDate, orderState, pageIndex, pageSize, diff --git a/BBWY.Server.API/Controllers/OrderController.cs b/BBWY.Server.API/Controllers/OrderController.cs index f08b50ee..72acd51e 100644 --- a/BBWY.Server.API/Controllers/OrderController.cs +++ b/BBWY.Server.API/Controllers/OrderController.cs @@ -88,6 +88,16 @@ namespace BBWY.Server.API.Controllers orderBusiness.OutStock(outStockRequest); } + /// + /// 指定时间范围的订单同步 + /// + /// + [HttpPost] + public void SyncOrderByDate([FromBody] SyncOrderByDateRequest syncOrderByDateRequest) + { + orderBusiness.SyncOrderByDate(syncOrderByDateRequest); + } + /// /// 订单同步 /// diff --git a/BBWY.Server.Business/Order/OrderBusiness.cs b/BBWY.Server.Business/Order/OrderBusiness.cs index 3793e155..1cd91861 100644 --- a/BBWY.Server.Business/Order/OrderBusiness.cs +++ b/BBWY.Server.Business/Order/OrderBusiness.cs @@ -15,6 +15,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; +using System.Threading.Tasks; using Yitter.IdGenerator; namespace BBWY.Server.Business @@ -26,12 +27,14 @@ namespace BBWY.Server.Business private IDictionary> syncOrderMethodDic; private IIdGenerator idGenerator; private IDictionary mdsApiHeader; + private TaskSchedulerManager taskSchedulerManager; - public OrderBusiness(RestApiService restApiService, IConfiguration configuration, ILogger logger, IFreeSql fsql, IIdGenerator idGenerator, IOptions options) : base(restApiService, options) + public OrderBusiness(RestApiService restApiService, IConfiguration configuration, ILogger logger, IFreeSql fsql, IIdGenerator idGenerator, IOptions options, TaskSchedulerManager taskSchedulerManager) : base(restApiService, options) { this.logger = logger; this.fsql = fsql; this.idGenerator = idGenerator; + this.taskSchedulerManager = taskSchedulerManager; syncOrderMethodDic = new Dictionary>() { { Enums.Platform.京东, SyncJDOrder } @@ -45,6 +48,8 @@ namespace BBWY.Server.Business { if (searchOrderRequest.OrderState == Enums.OrderState.已取消) searchOrderRequest.ExcludeCanceled = false; + if (searchOrderRequest.EndDate != null) + searchOrderRequest.EndDate = searchOrderRequest.EndDate.Value.Date.AddDays(1).AddSeconds(-1); var select = fsql.Select().LeftJoin((o, ocs, oct, ods) => o.Id == ocs.OrderId) .LeftJoin((o, ocs, oct, ods) => o.Id == oct.OrderId) @@ -651,7 +656,15 @@ namespace BBWY.Server.Business .ExecuteAffrows(); } - public void SyncOrder(long shopId, string orderId) + /// + /// 同步订单 + /// + /// + /// + /// 默认3小时前 + /// 默认当前时间 + /// + public void SyncOrder(long shopId, string orderId, DateTime? startTime = null, DateTime? endTime = null) { #region 获取店铺信息; var shopResult = restApiService.SendRequest(globalConfig.MdsApi, "/TaskList/Shop/GetShopsByShopId", $"shopId={shopId}", mdsApiHeader, HttpMethod.Get, enableRandomTimeStamp: true); @@ -682,8 +695,8 @@ namespace BBWY.Server.Business var relayAPIHost = GetPlatformRelayAPIHost((Enums.Platform)platformId); var orderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetOrderList", new SearchPlatformOrderRequest() { - StartDate = DateTime.Now.AddHours(-3), - EndDate = DateTime.Now, + StartDate = startTime ?? DateTime.Now.AddHours(-3), + EndDate = endTime ?? DateTime.Now, AppKey = appKey, AppSecret = appSecret, AppToken = appToken, @@ -713,6 +726,62 @@ namespace BBWY.Server.Business } } + 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) { var orderTokenList = orderTokenJArray.Where(o => o.Value("orderTotalPrice") != 0); @@ -738,7 +807,6 @@ namespace BBWY.Server.Business dbOrderCostDetailList = fsql.Select().Where(ocd => interfaceCanceledOrderIdList.Contains(ocd.OrderId)).ToList(); } - var orderSkuIds = new List(); foreach (var orderJToken in orderTokenList) { diff --git a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs index b0d3bfef..56ea584a 100644 --- a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs +++ b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs @@ -178,7 +178,7 @@ namespace BBWY.Server.Business if (searchOrderRequest.StartDate != null) fbpReq.startDate = searchOrderRequest.StartDate.Value.ToString("yyyy-MM-dd HH:mm:ss"); if (searchOrderRequest.EndDate != null) - fbpReq.endDate = searchOrderRequest.EndDate.Value.Date.AddDays(1).AddSeconds(-1).ToString("yyyy-MM-dd HH:mm:ss"); + fbpReq.endDate = searchOrderRequest.EndDate.Value.Date.ToString("yyyy-MM-dd HH:mm:ss"); if (string.IsNullOrEmpty(searchOrderRequest.OrderState)) { fbpReq.orderState = "DengDaiDaYin,DengDaiChuKu,DengDaiDaBao,DengDaiFaHuo,ZiTiTuZhong,ShangMenTiHuo,ZiTiTuiHuo,DengDaiQueRenShouHuo,PeiSongTuiHuo,HuoDaoFuKuanQueRen,WanCheng,DengDaiFenQiFuKuan,ServiceFinished,SuoDing,DengDaiTuiKuan,DengDaiKeHuHuiFu,TRADE_CANCELED,LOCKED"; @@ -211,7 +211,7 @@ namespace BBWY.Server.Business if (searchOrderRequest.StartDate != null) sopReq.startDate = searchOrderRequest.StartDate.Value.ToString("yyyy-MM-dd HH:mm:ss"); if (searchOrderRequest.EndDate != null) - sopReq.endDate = searchOrderRequest.EndDate.Value.Date.AddDays(1).AddSeconds(-1).ToString("yyyy-MM-dd HH:mm:ss"); + sopReq.endDate = searchOrderRequest.EndDate.Value.Date.ToString("yyyy-MM-dd HH:mm:ss"); if (string.IsNullOrEmpty(searchOrderRequest.OrderState)) { //WAIT_SELLER_STOCK_OUT,WAIT_GOODS_RECEIVE_CONFIRM,WAIT_SELLER_DELIVER,PAUSE,FINISHED_L,TRADE_CANCELED,LOCKED diff --git a/BBWY.Server.Business/Statistics/StatisticsBusiness.cs b/BBWY.Server.Business/Statistics/StatisticsBusiness.cs index 1e886422..7d379c78 100644 --- a/BBWY.Server.Business/Statistics/StatisticsBusiness.cs +++ b/BBWY.Server.Business/Statistics/StatisticsBusiness.cs @@ -19,13 +19,13 @@ namespace BBWY.Server.Business public OrderAchievementResponse GetOrderAchievementStatistics(OrderAchievementRequest request) { - request.EndTime = request.EndTime.Date.AddDays(1); + request.EndTime = request.EndTime.Date.AddDays(1).AddSeconds(-1); var response = fsql.Select().LeftJoin((o, oc) => o.Id == oc.OrderId) .Where((o, oc) => o.ShopId == request.ShopId && o.OrderState != null && !invalidOrderStateList.Contains(o.OrderState.Value) && o.StartTime >= request.StartTime && - o.StartTime < request.EndTime) + o.StartTime <= request.EndTime) .ToAggregate((o, oc) => new OrderAchievementResponse() { OrderCount = o.Count(), diff --git a/BBWY.Server.Model/Db/Order/OrderSyncTask.cs b/BBWY.Server.Model/Db/Order/OrderSyncTask.cs index a28786b9..e80d36e8 100644 --- a/BBWY.Server.Model/Db/Order/OrderSyncTask.cs +++ b/BBWY.Server.Model/Db/Order/OrderSyncTask.cs @@ -5,7 +5,7 @@ namespace BBWY.Server.Model.Db { [Table(Name = "ordersynctask", DisableSyncStructure = true)] - public partial class Ordersynctask + public partial class OrderSyncTask { [Column(DbType = "bigint(1)", IsPrimary = true)] diff --git a/BBWY.Server.Model/Dto/Request/Order/SyncOrderByDateRequest.cs b/BBWY.Server.Model/Dto/Request/Order/SyncOrderByDateRequest.cs new file mode 100644 index 00000000..04a8b3af --- /dev/null +++ b/BBWY.Server.Model/Dto/Request/Order/SyncOrderByDateRequest.cs @@ -0,0 +1,13 @@ +using System; + +namespace BBWY.Server.Model.Dto +{ + public class SyncOrderByDateRequest + { + public long ShopId { get; set; } + + public DateTime StartTime { get; set; } + + public DateTime EndTime { get; set; } + } +}