From 44b20d85d63ea06b07aa8360874b7cc096c4a965 Mon Sep 17 00:00:00 2001
From: shanj <18996038927@163.com>
Date: Sat, 5 Mar 2022 05:45:02 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8C=87=E5=AE=9A=E6=97=B6=E9=97=B4=E5=90=8C?=
 =?UTF-8?q?=E6=AD=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 BBWY.Client/APIServices/OrderService.cs       |  2 +-
 .../Controllers/OrderController.cs            | 10 +++
 BBWY.Server.Business/Order/OrderBusiness.cs   | 78 +++++++++++++++++--
 .../PlatformSDK/JDBusiness.cs                 |  4 +-
 .../Statistics/StatisticsBusiness.cs          |  4 +-
 BBWY.Server.Model/Db/Order/OrderSyncTask.cs   |  2 +-
 .../Request/Order/SyncOrderByDateRequest.cs   | 13 ++++
 7 files changed, 102 insertions(+), 11 deletions(-)
 create mode 100644 BBWY.Server.Model/Dto/Request/Order/SyncOrderByDateRequest.cs

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);
         }
 
+        /// <summary>
+        /// 指定时间范围的订单同步
+        /// </summary>
+        /// <param name="syncOrderByDateRequest"></param>
+        [HttpPost]
+        public void SyncOrderByDate([FromBody] SyncOrderByDateRequest syncOrderByDateRequest)
+        {
+            orderBusiness.SyncOrderByDate(syncOrderByDateRequest);
+        }
+
         /// <summary>
         /// 订单同步
         /// </summary>
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<Enums.Platform, Action<JArray, long, string, string, string, string>> syncOrderMethodDic;
         private IIdGenerator idGenerator;
         private IDictionary<string, string> mdsApiHeader;
+        private TaskSchedulerManager taskSchedulerManager;
 
-        public OrderBusiness(RestApiService restApiService, IConfiguration configuration, ILogger logger, IFreeSql fsql, IIdGenerator idGenerator, IOptions<GlobalConfig> options) : base(restApiService, options)
+        public OrderBusiness(RestApiService restApiService, IConfiguration configuration, ILogger logger, IFreeSql fsql, IIdGenerator idGenerator, IOptions<GlobalConfig> options, TaskSchedulerManager taskSchedulerManager) : base(restApiService, options)
         {
             this.logger = logger;
             this.fsql = fsql;
             this.idGenerator = idGenerator;
+            this.taskSchedulerManager = taskSchedulerManager;
             syncOrderMethodDic = new Dictionary<Enums.Platform, Action<JArray, long, string, string, string, string>>()
             {
                 { 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<Order, OrderConsignee, OrderCost, OrderDropShipping>().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)
+        /// <summary>
+        /// 同步订单
+        /// </summary>
+        /// <param name="shopId"></param>
+        /// <param name="orderId"></param>
+        /// <param name="startTime">默认3小时前</param>
+        /// <param name="endTime">默认当前时间</param>
+        /// <exception cref="Exception"></exception>
+        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<OrderSyncTask>().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>(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<decimal>("orderTotalPrice") != 0);
@@ -738,7 +807,6 @@ namespace BBWY.Server.Business
                 dbOrderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => interfaceCanceledOrderIdList.Contains(ocd.OrderId)).ToList();
             }
 
-
             var orderSkuIds = new List<string>();
             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<Order, OrderCost>().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; }
+    }
+}