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; }
+ }
+}