You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
12 KiB

2 years ago
using BBWYB.Common.Log;
using BBWYB.Common.Models;
using BBWYB.Server.Model;
using BBWYB.Server.Model.Db;
using BBWYB.Server.Model.Dto;
using FreeSql;
2 years ago
using Newtonsoft.Json.Linq;
2 years ago
using SDKAdapter;
using SDKAdapter.OperationPlatform.Client;
using SDKAdapter.OperationPlatform.Models;
using Yitter.IdGenerator;
namespace BBWYB.Server.Business.Sync
{
2 years ago
public class OrderSyncBusiness : BaseBusiness, IDenpendency
{
2 years ago
private OP_PlatformClientFactory opPlatformClientFactory;
private VenderBusiness venderBusiness;
private TaskSchedulerManager taskSchedulerManager;
public OrderSyncBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, OP_PlatformClientFactory opPlatformClientFactory, VenderBusiness venderBusiness, TaskSchedulerManager taskSchedulerManager) : base(fsql, nLogManager, idGenerator)
{
this.opPlatformClientFactory = opPlatformClientFactory;
this.venderBusiness = venderBusiness;
this.taskSchedulerManager = taskSchedulerManager;
}
public void AutoOrderSync()
{
var shopList = venderBusiness.GetShopList(platform: Enums.Platform.);
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => Sync(shop, string.Empty, DateTime.Now.AddHours(-3), DateTime.Now, AdapterEnums.SortTimeField.Modify, AdapterEnums.SortType.Desc), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
}
}
public void ManualOrderSync(long shopId, string orderId, DateTime? startTime, DateTime? endTime)
{
var shop = venderBusiness.GetShopList(shopId, platform: Enums.Platform.).FirstOrDefault();
if (shop == null)
throw new BusinessException($"未找到店铺Id {shopId}");
Task.Factory.StartNew(() => Sync(shop, orderId, startTime, endTime, AdapterEnums.SortTimeField.Modify, AdapterEnums.SortType.Desc), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
}
private void Sync(ShopResponse shop,
string orderId,
DateTime? startTime,
DateTime? endTime,
AdapterEnums.SortTimeField sortTimeField,
AdapterEnums.SortType sortType)
{
var shopId = long.Parse(shop.ShopId);
var loggerName = $"订单同步-{shop.ShopName}";
try
{
var qtOrderList = opPlatformClientFactory.GetClient(AdapterEnums.PlatformType.).GetOrderList(new OP_QueryOrderRequest()
{
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
AppToken = shop.AppToken,
OrderId = orderId,
PageIndex = 1,
PageSize = 100,
Platform = AdapterEnums.PlatformType.,
SortTimeField = sortTimeField,
SortType = sortType,
StartDate = startTime,
EndDate = endTime
});
if (qtOrderList.Count == 0)
return;
var qtOrderIdList = qtOrderList.Items.Select(qto => qto.OrderId).ToList();
var dbOrderList = fsql.Select<Order>(qtOrderIdList).ToList();
List<Order> insertOrderList = new List<Order>();
2 years ago
List<OrderSku> insertOrderSkuList = new List<OrderSku>();
List<OrderConsignee> insertOrderConsigneeList = new List<OrderConsignee>();
2 years ago
List<IUpdate<Order>> updateOrderList = new List<IUpdate<Order>>();
foreach (var qtOrder in qtOrderList.Items)
{
var orderState = ConvertQuanTanOrderState(qtOrder.OrderState);
var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == qtOrder.OrderId);
if (dbOrder == null)
{
//新订单
dbOrder = new Order()
{
Id = qtOrder.OrderId,
BuyerRemark = qtOrder.BuyerRemark,
EndTime = qtOrder.EndTime,
ExpressName = qtOrder.DeliveryResponse.ExpressName,
FreightPrice = qtOrder.FreightAmount,
ModifyTime = qtOrder.ModifyTime,
Flag = string.Empty,
IsAfterSaleOrder = false,
OrderPayment = qtOrder.OrderPayment,
OrderSellerPrice = qtOrder.OrderProductAmount,
OrderTotalPrice = qtOrder.OrderTotalAmount,
OrderType = 0,
PayType = qtOrder.PayType,
Platform = Enums.Platform.,
PreferentialAmount = qtOrder.PreferentialAmount,
PurchaseRemark = String.Empty,
ShopId = shopId,
SellerPreferentialAmount = qtOrder.SellerPreferentialAmount,
StartTime = qtOrder.StartTime,
StorageType = 0,
VenderRemark = qtOrder.VenderRemark,
WaybillNo = qtOrder.DeliveryResponse.WayBillNo,
2 years ago
OrderState = orderState,
ClientOrderId = qtOrder.ClientOrderId
2 years ago
};
2 years ago
if (!string.IsNullOrEmpty(qtOrder.Extended))
{
try
{
var jobject = JObject.Parse(qtOrder.Extended);
dbOrder.SourceSku = jobject.Value<string>("SourceSku");
dbOrder.SourceShopName = jobject.Value<string>("SourceShopName");
}
catch (Exception ex)
{
}
}
2 years ago
if (!insertOrderList.Any(o => o.Id == dbOrder.Id))
insertOrderList.Add(dbOrder);
2 years ago
//订单sku
foreach (var qtOrderSku in qtOrder.OrderSkuList)
{
insertOrderSkuList.Add(new OrderSku()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
SkuId = qtOrderSku.SkuId,
ItemTotal = qtOrderSku.Quantity,
Logo = qtOrderSku.SkuLogo,
OrderId = qtOrder.OrderId,
Price = qtOrderSku.SkuPrice,
Title = qtOrderSku.SkuTitle,
ShopId = shopId,
ProductId = qtOrderSku.ProductId
});
}
//收货人
insertOrderConsigneeList.Add(new OrderConsignee()
{
OrderId = qtOrder.OrderId,
Address = qtOrder.Consignee.Address,
City = qtOrder.Consignee.City,
ContactName = qtOrder.Consignee.ContactName,
County = qtOrder.Consignee.County,
CreateTime = DateTime.Now,
Mobile = qtOrder.Consignee.Mobile,
Province = qtOrder.Consignee.Province,
TelePhone = qtOrder.Consignee.Mobile,
Town = qtOrder.Consignee.Town
});
2 years ago
}
else
{
var updateOrderState = false;
var updateWaybillNo = false;
var updateExpressName = false;
var updateModifyTime = false;
var updateBuyerRemark = false;
var updateVenderRemark = false;
if (dbOrder.OrderState != orderState)
updateOrderState = true;
if (dbOrder.WaybillNo != qtOrder.DeliveryResponse.WayBillNo)
updateWaybillNo = true;
if (dbOrder.ExpressName != qtOrder.DeliveryResponse.ExpressName)
updateExpressName = true;
if (dbOrder.ModifyTime != qtOrder.ModifyTime)
updateModifyTime = true;
if (dbOrder.BuyerRemark != qtOrder.BuyerRemark)
updateBuyerRemark = true;
if (dbOrder.VenderRemark != qtOrder.VenderRemark)
updateVenderRemark = true;
if (updateOrderState || updateWaybillNo || updateModifyTime || updateBuyerRemark || updateVenderRemark)
{
var update = fsql.Update<Order>(dbOrder.Id).SetIf(updateOrderState, o => o.OrderState == orderState)
.SetIf(updateWaybillNo, o => o.WaybillNo, qtOrder.DeliveryResponse.WayBillNo)
.SetIf(updateExpressName, o => o.ExpressName, qtOrder.DeliveryResponse.ExpressName)
.SetIf(updateModifyTime, o => o.ModifyTime, qtOrder.ModifyTime)
.SetIf(updateBuyerRemark, o => o.BuyerRemark, qtOrder.BuyerRemark)
.SetIf(updateVenderRemark, o => o.VenderRemark, qtOrder.VenderRemark);
updateOrderList.Add(update);
}
}
}
fsql.Transaction(() =>
{
if (insertOrderList.Count > 0)
fsql.Insert(insertOrderList).ExecuteAffrows();
2 years ago
if (insertOrderSkuList.Count() > 0)
fsql.Insert(insertOrderSkuList).ExecuteAffrows();
if (insertOrderConsigneeList.Count() > 0)
fsql.Insert(insertOrderConsigneeList).ExecuteAffrows();
2 years ago
if (updateOrderList.Count() > 0)
foreach (var update in updateOrderList)
update.ExecuteAffrows();
});
}
catch (Exception ex)
{
nLogManager.GetLogger(loggerName).Error(ex);
}
}
2 years ago
private Enums.OrderState ConvertQuanTanOrderState(string qtOrderState)
{
/*
-1退
0
1
2
3
*/
if (qtOrderState == "-1")
return Enums.OrderState.退;
if (qtOrderState == "0")
return Enums.OrderState.;
if (qtOrderState == "1")
return Enums.OrderState.;
if (qtOrderState == "2")
return Enums.OrderState.;
if (qtOrderState == "3")
return Enums.OrderState.;
return Enums.OrderState.Unknow;
}
}
}