Browse Source

指定时间同步

qianyi
shanji 3 years ago
parent
commit
44b20d85d6
  1. 2
      BBWY.Client/APIServices/OrderService.cs
  2. 10
      BBWY.Server.API/Controllers/OrderController.cs
  3. 78
      BBWY.Server.Business/Order/OrderBusiness.cs
  4. 4
      BBWY.Server.Business/PlatformSDK/JDBusiness.cs
  5. 4
      BBWY.Server.Business/Statistics/StatisticsBusiness.cs
  6. 2
      BBWY.Server.Model/Db/Order/OrderSyncTask.cs
  7. 13
      BBWY.Server.Model/Dto/Request/Order/SyncOrderByDateRequest.cs

2
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,

10
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>

78
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)
{

4
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

4
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(),

2
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)]

13
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; }
}
}
Loading…
Cancel
Save