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.
268 lines
13 KiB
268 lines
13 KiB
using BBWYB.Common.Log;
|
|
using BBWYB.Common.Models;
|
|
using BBWYB.Server.Model;
|
|
using BBWYB.Server.Model.Db;
|
|
using BBWYB.Server.Model.Dto;
|
|
using FreeSql;
|
|
using Newtonsoft.Json.Linq;
|
|
using SDKAdapter;
|
|
using SDKAdapter.OperationPlatform.Client;
|
|
using SDKAdapter.OperationPlatform.Models;
|
|
using Yitter.IdGenerator;
|
|
|
|
namespace BBWYB.Server.Business.Sync
|
|
{
|
|
public class OrderSyncBusiness : BaseBusiness, IDenpendency
|
|
{
|
|
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<Model.Db.Order>(qtOrderIdList).ToList();
|
|
|
|
List<Model.Db.Order> insertOrderList = new List<Model.Db.Order>();
|
|
List<OrderSku> insertOrderSkuList = new List<OrderSku>();
|
|
List<OrderConsignee> insertOrderConsigneeList = new List<OrderConsignee>();
|
|
|
|
List<IUpdate<Model.Db.Order>> updateOrderList = new List<IUpdate<Model.Db.Order>>();
|
|
|
|
foreach (var qtOrder in qtOrderList.Items)
|
|
{
|
|
var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == qtOrder.OrderId);
|
|
var orderState = ConvertQuanTanOrderState(qtOrder.OrderState, qtOrder.IsPay, dbOrder?.IsPurchased ?? false);
|
|
if (dbOrder == null)
|
|
{
|
|
//新订单
|
|
dbOrder = new Model.Db.Order()
|
|
{
|
|
Id = qtOrder.OrderId,
|
|
OrderSn = qtOrder.OrderSn,
|
|
BuyerRemark = qtOrder.BuyerRemark,
|
|
EndTime = qtOrder.EndTime,
|
|
//ExpressName = qtOrder.DeliveryResponse.ExpressName,
|
|
FreightPrice = qtOrder.FreightAmount,
|
|
ModifyTime = qtOrder.ModifyTime,
|
|
IsPurchased = 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,
|
|
VenderRemark = qtOrder.VenderRemark,
|
|
//WaybillNo = qtOrder.DeliveryResponse.WayBillNo,
|
|
OrderState = orderState,
|
|
ClientOrderId = qtOrder.ClientOrderId,
|
|
BuyerAccount = qtOrder.UserAccount,
|
|
InPackAmount = qtOrder.PackAmount
|
|
};
|
|
JArray belongSkus = null;
|
|
if (!string.IsNullOrEmpty(qtOrder.Extended))
|
|
{
|
|
try
|
|
{
|
|
var jobject = JObject.Parse(qtOrder.Extended);
|
|
//dbOrder.SourceSku = jobject.Value<string>("SourceSku");
|
|
dbOrder.SourceShopName = jobject.Value<string>("SourceShopName");
|
|
|
|
if (jobject.ContainsKey("BelongSkus"))
|
|
belongSkus = jobject["BelongSkus"] as JArray;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
if (!insertOrderList.Any(o => o.Id == dbOrder.Id))
|
|
insertOrderList.Add(dbOrder);
|
|
|
|
//订单sku
|
|
foreach (var qtOrderSku in qtOrder.OrderSkuList)
|
|
{
|
|
insertOrderSkuList.Add(new OrderSku()
|
|
{
|
|
//Id = idGenerator.NewLong(),
|
|
Id = long.Parse(qtOrderSku.Id),
|
|
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,
|
|
BelongSkuId = belongSkus?.FirstOrDefault(j => j.Value<string>("SkuId") == qtOrderSku.SkuId)?.Value<string>("BelongSkuId") ?? string.Empty,
|
|
InPackAmount = qtOrderSku.PackAmount,
|
|
BuyerPayFreight = qtOrderSku.FreightAmount
|
|
});
|
|
}
|
|
|
|
//收货人
|
|
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
|
|
});
|
|
}
|
|
else
|
|
{
|
|
var updateOrderState = false;
|
|
//var updateWaybillNo = false;
|
|
//var updateExpressName = false;
|
|
var updateModifyTime = false;
|
|
var updateBuyerRemark = false;
|
|
var updateVenderRemark = false;
|
|
var updateBuyerAccount = 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 (dbOrder.BuyerAccount != qtOrder.UserAccount)
|
|
updateBuyerAccount = true;
|
|
|
|
if (updateOrderState || updateModifyTime || updateBuyerRemark || updateVenderRemark || updateBuyerAccount)
|
|
{
|
|
var update = fsql.Update<Model.Db.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)
|
|
.SetIf(updateBuyerAccount, o => o.BuyerAccount, qtOrder.UserAccount);
|
|
updateOrderList.Add(update);
|
|
}
|
|
}
|
|
}
|
|
|
|
fsql.Transaction(() =>
|
|
{
|
|
if (insertOrderList.Count > 0)
|
|
fsql.Insert(insertOrderList).ExecuteAffrows();
|
|
|
|
if (insertOrderSkuList.Count() > 0)
|
|
fsql.Insert(insertOrderSkuList).ExecuteAffrows();
|
|
|
|
if (insertOrderConsigneeList.Count() > 0)
|
|
fsql.Insert(insertOrderConsigneeList).ExecuteAffrows();
|
|
|
|
if (updateOrderList.Count() > 0)
|
|
foreach (var update in updateOrderList)
|
|
update.ExecuteAffrows();
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
nLogManager.GetLogger(loggerName).Error(ex);
|
|
}
|
|
}
|
|
|
|
private Enums.OrderState ConvertQuanTanOrderState(string qtOrderState, bool isPay, bool isPurchased)
|
|
{
|
|
/*
|
|
-1、已取消;
|
|
0、待发货;
|
|
1、待收货;
|
|
2、待评价;
|
|
3、已完成;
|
|
*/
|
|
if (qtOrderState == "-1")
|
|
return Enums.OrderState.已取消;
|
|
|
|
if (!isPay)
|
|
return Enums.OrderState.待付款;
|
|
|
|
if (qtOrderState == "0")
|
|
{
|
|
if (!isPurchased)
|
|
return Enums.OrderState.等待采购;
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|