|
|
@ -18,149 +18,149 @@ using Yitter.IdGenerator; |
|
|
|
|
|
|
|
namespace BBWY.Server.Business |
|
|
|
{ |
|
|
|
public class RefundOrderSyncBusiness : BaseSyncBusiness, IDenpendency |
|
|
|
{ |
|
|
|
private IDictionary<Enums.Platform, Action<JArray, ShopResponse>> syncRefundOrderMethodDic; |
|
|
|
|
|
|
|
public RefundOrderSyncBusiness(RestApiService restApiService, |
|
|
|
IOptions<GlobalConfig> options, |
|
|
|
ILogger logger, |
|
|
|
IFreeSql fsql, |
|
|
|
IIdGenerator idGenerator, |
|
|
|
TaskSchedulerManager taskSchedulerManager, |
|
|
|
VenderBusiness venderBusiness) : base(restApiService, |
|
|
|
options, |
|
|
|
logger, |
|
|
|
fsql, |
|
|
|
idGenerator, |
|
|
|
taskSchedulerManager, |
|
|
|
venderBusiness) |
|
|
|
{ |
|
|
|
syncRefundOrderMethodDic = new Dictionary<Enums.Platform, Action<JArray, ShopResponse>>() |
|
|
|
{ |
|
|
|
{ Enums.Platform.京东, SyncJDRefundOrder} |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
private void SyncJDRefundOrder(JArray refundOrderTokenJArray, ShopResponse shopResponse) |
|
|
|
{ |
|
|
|
var shopId = long.Parse(shopResponse.ShopId); |
|
|
|
var validRefundOrderTokenJArray = refundOrderTokenJArray.Where(j => j.Value<int>("status") == 13 && j.Value<decimal>("refoundAmount") != 0M).ToList(); |
|
|
|
var orderIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["orderId"].ToString()).Distinct().ToList(); |
|
|
|
var orderSkuIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["wareId"].ToString()).Distinct().ToList(); |
|
|
|
|
|
|
|
var updateOrders = fsql.Select<Order>().Where(o => orderIds.Contains(o.Id) && o.IsAfterSaleOrder == false).ToList(); |
|
|
|
var dbOrderSkus = fsql.Select<OrderSku>().Where(osku => orderIds.Contains(osku.OrderId) && orderSkuIds.Contains(osku.SkuId)).ToList(); |
|
|
|
var updateOrderSkus = dbOrderSkus.Where(osku => osku.IsRefund == false).ToList(); |
|
|
|
|
|
|
|
var afterOrders = fsql.Select<AfterSaleOrder>().Where(aso => orderIds.Contains(aso.OrderId)).ToList(); |
|
|
|
|
|
|
|
List<AfterSaleOrder> insertAfterSaleOrders = new List<AfterSaleOrder>(); |
|
|
|
List<IUpdate<AfterSaleOrder>> updateAfterSaleOrders = new List<IUpdate<AfterSaleOrder>>(); |
|
|
|
|
|
|
|
foreach (var refundOrderJToken in validRefundOrderTokenJArray) |
|
|
|
{ |
|
|
|
var skuId = refundOrderJToken["sameOrderServiceBill"]["wareId"].ToString(); |
|
|
|
var orderId = refundOrderJToken["sameOrderServiceBill"]["orderId"].ToString(); |
|
|
|
|
|
|
|
var refundAmount = refundOrderJToken.Value<decimal>("refoundAmount"); |
|
|
|
var refundCompleteTime = refundOrderJToken.Value<long>("completeTime").StampToDateTime(); |
|
|
|
|
|
|
|
var serviceId = refundOrderJToken["sameOrderServiceBill"]["serviceId"].ToString(); |
|
|
|
|
|
|
|
var afterOrder = afterOrders.FirstOrDefault(aso => aso.ServiceId == serviceId); |
|
|
|
if (afterOrder == null) |
|
|
|
{ |
|
|
|
var dbSku = dbOrderSkus.FirstOrDefault(osku => osku.OrderId == orderId && osku.SkuId == skuId); |
|
|
|
if (dbSku == null) |
|
|
|
continue; |
|
|
|
insertAfterSaleOrders.Add(new AfterSaleOrder() |
|
|
|
{ |
|
|
|
Id = idGenerator.NewLong(), |
|
|
|
CreateTime = DateTime.Now, |
|
|
|
OrderId = dbSku.OrderId, |
|
|
|
ProductId = dbSku.ProductId, |
|
|
|
RefundAmount = refundAmount, |
|
|
|
RefundTime = refundCompleteTime, |
|
|
|
SkuId = skuId, |
|
|
|
ShopId = shopId, |
|
|
|
ServiceId = serviceId, |
|
|
|
ApplyTime = long.Parse(refundOrderJToken["sameOrderServiceBill"]["afsApplyTime"].ToString()).StampToDateTime() |
|
|
|
}); |
|
|
|
} |
|
|
|
else if (afterOrder.RefundAmount == 0) |
|
|
|
{ |
|
|
|
var update = fsql.Update<AfterSaleOrder>(afterOrder.Id).Set(aso => aso.RefundAmount, refundAmount) |
|
|
|
.Set(aso => aso.RefundTime, refundCompleteTime); |
|
|
|
updateAfterSaleOrders.Add(update); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
fsql.Transaction(() => |
|
|
|
{ |
|
|
|
if (updateOrders.Count() > 0) |
|
|
|
foreach (var updateOrder in updateOrders) |
|
|
|
fsql.Update<Order>(updateOrder.Id).Set(o => o.IsAfterSaleOrder, true).ExecuteAffrows(); |
|
|
|
if (updateOrderSkus.Count() > 0) |
|
|
|
foreach (var updateOrderSku in updateOrderSkus) |
|
|
|
fsql.Update<OrderSku>(updateOrderSku.Id).Set(osku => osku.IsRefund, true).ExecuteAffrows(); |
|
|
|
if (insertAfterSaleOrders.Count() > 0) |
|
|
|
fsql.Insert(insertAfterSaleOrders).ExecuteAffrows(); |
|
|
|
if (updateAfterSaleOrders.Count() > 0) |
|
|
|
foreach (var update in updateAfterSaleOrders) |
|
|
|
update.ExecuteAffrows(); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private void SyncRefundOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false) |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
|
//logger.Info($"退款订单同步 {shop.ShopName} isAuto {isAuto}");
|
|
|
|
if (!syncRefundOrderMethodDic.ContainsKey(shop.PlatformId)) |
|
|
|
throw new Exception("不支持的平台"); |
|
|
|
var shopId = long.Parse(shop.ShopId); |
|
|
|
var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId); |
|
|
|
var refundOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetRefundList", new SearchRefundPlatformOrderRequest() |
|
|
|
{ |
|
|
|
StartDate = startTime ?? DateTime.Now.Date.AddDays(-1), |
|
|
|
EndDate = endTime ?? DateTime.Now, |
|
|
|
AppKey = shop.AppKey, |
|
|
|
AppSecret = shop.AppSecret, |
|
|
|
AppToken = shop.AppToken, |
|
|
|
PageIndex = 1, |
|
|
|
PageSize = 50, |
|
|
|
Platform = shop.PlatformId, |
|
|
|
SaveResponseLog = true, |
|
|
|
OrderId = orderId |
|
|
|
}, null, HttpMethod.Post); |
|
|
|
if (refundOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK) |
|
|
|
throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}"); |
|
|
|
|
|
|
|
var refundOrderListResponse = JsonConvert.DeserializeObject<ApiResponse<JArray>>(refundOrderListApiResult.Content); |
|
|
|
if (!refundOrderListResponse.Success) |
|
|
|
throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}"); |
|
|
|
|
|
|
|
if (refundOrderListResponse.Data == null || refundOrderListResponse.Data.Count == 0) |
|
|
|
return; |
|
|
|
|
|
|
|
syncRefundOrderMethodDic[shop.PlatformId](refundOrderListResponse.Data, shop); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
var shopData = JsonConvert.SerializeObject(shop); |
|
|
|
logger.Error(ex, $"SyncRefundOrder ShopData:{shopData}"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void SyncAllShopRefundOrder() |
|
|
|
{ |
|
|
|
var shopList = venderBusiness.GetShopList(); |
|
|
|
//SyncRefundOrder(shopList.FirstOrDefault(s => s.ShopName == "赟娅墨森专卖店"), string.Empty, isAuto: true);
|
|
|
|
foreach (var shop in shopList) |
|
|
|
{ |
|
|
|
Task.Factory.StartNew(() => SyncRefundOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncRefundOrderTaskScheduler); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
//public class RefundOrderSyncBusiness : BaseSyncBusiness, IDenpendency
|
|
|
|
//{
|
|
|
|
// private IDictionary<Enums.Platform, Action<JArray, ShopResponse>> syncRefundOrderMethodDic;
|
|
|
|
|
|
|
|
// public RefundOrderSyncBusiness(RestApiService restApiService,
|
|
|
|
// IOptions<GlobalConfig> options,
|
|
|
|
// ILogger logger,
|
|
|
|
// IFreeSql fsql,
|
|
|
|
// IIdGenerator idGenerator,
|
|
|
|
// TaskSchedulerManager taskSchedulerManager,
|
|
|
|
// VenderBusiness venderBusiness) : base(restApiService,
|
|
|
|
// options,
|
|
|
|
// logger,
|
|
|
|
// fsql,
|
|
|
|
// idGenerator,
|
|
|
|
// taskSchedulerManager,
|
|
|
|
// venderBusiness)
|
|
|
|
// {
|
|
|
|
// syncRefundOrderMethodDic = new Dictionary<Enums.Platform, Action<JArray, ShopResponse>>()
|
|
|
|
// {
|
|
|
|
// { Enums.Platform.京东, SyncJDRefundOrder}
|
|
|
|
// };
|
|
|
|
// }
|
|
|
|
|
|
|
|
// private void SyncJDRefundOrder(JArray refundOrderTokenJArray, ShopResponse shopResponse)
|
|
|
|
// {
|
|
|
|
// var shopId = long.Parse(shopResponse.ShopId);
|
|
|
|
// var validRefundOrderTokenJArray = refundOrderTokenJArray.Where(j => j.Value<int>("status") == 13 && j.Value<decimal>("refoundAmount") != 0M).ToList();
|
|
|
|
// var orderIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["orderId"].ToString()).Distinct().ToList();
|
|
|
|
// var orderSkuIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["wareId"].ToString()).Distinct().ToList();
|
|
|
|
|
|
|
|
// var updateOrders = fsql.Select<Order>().Where(o => orderIds.Contains(o.Id) && o.IsAfterSaleOrder == false).ToList();
|
|
|
|
// var dbOrderSkus = fsql.Select<OrderSku>().Where(osku => orderIds.Contains(osku.OrderId) && orderSkuIds.Contains(osku.SkuId)).ToList();
|
|
|
|
// var updateOrderSkus = dbOrderSkus.Where(osku => osku.IsRefund == false).ToList();
|
|
|
|
|
|
|
|
// var afterOrders = fsql.Select<AfterSaleOrder>().Where(aso => orderIds.Contains(aso.OrderId)).ToList();
|
|
|
|
|
|
|
|
// List<AfterSaleOrder> insertAfterSaleOrders = new List<AfterSaleOrder>();
|
|
|
|
// List<IUpdate<AfterSaleOrder>> updateAfterSaleOrders = new List<IUpdate<AfterSaleOrder>>();
|
|
|
|
|
|
|
|
// foreach (var refundOrderJToken in validRefundOrderTokenJArray)
|
|
|
|
// {
|
|
|
|
// var skuId = refundOrderJToken["sameOrderServiceBill"]["wareId"].ToString();
|
|
|
|
// var orderId = refundOrderJToken["sameOrderServiceBill"]["orderId"].ToString();
|
|
|
|
|
|
|
|
// var refundAmount = refundOrderJToken.Value<decimal>("refoundAmount");
|
|
|
|
// var refundCompleteTime = refundOrderJToken.Value<long>("completeTime").StampToDateTime();
|
|
|
|
|
|
|
|
// var serviceId = refundOrderJToken["sameOrderServiceBill"]["serviceId"].ToString();
|
|
|
|
|
|
|
|
// var afterOrder = afterOrders.FirstOrDefault(aso => aso.ServiceId == serviceId);
|
|
|
|
// if (afterOrder == null)
|
|
|
|
// {
|
|
|
|
// var dbSku = dbOrderSkus.FirstOrDefault(osku => osku.OrderId == orderId && osku.SkuId == skuId);
|
|
|
|
// if (dbSku == null)
|
|
|
|
// continue;
|
|
|
|
// insertAfterSaleOrders.Add(new AfterSaleOrder()
|
|
|
|
// {
|
|
|
|
// Id = idGenerator.NewLong(),
|
|
|
|
// CreateTime = DateTime.Now,
|
|
|
|
// OrderId = dbSku.OrderId,
|
|
|
|
// ProductId = dbSku.ProductId,
|
|
|
|
// RefundAmount = refundAmount,
|
|
|
|
// RefundTime = refundCompleteTime,
|
|
|
|
// SkuId = skuId,
|
|
|
|
// ShopId = shopId,
|
|
|
|
// ServiceId = serviceId,
|
|
|
|
// ApplyTime = long.Parse(refundOrderJToken["sameOrderServiceBill"]["afsApplyTime"].ToString()).StampToDateTime()
|
|
|
|
// });
|
|
|
|
// }
|
|
|
|
// else if (afterOrder.RefundAmount == 0)
|
|
|
|
// {
|
|
|
|
// var update = fsql.Update<AfterSaleOrder>(afterOrder.Id).Set(aso => aso.RefundAmount, refundAmount)
|
|
|
|
// .Set(aso => aso.RefundTime, refundCompleteTime);
|
|
|
|
// updateAfterSaleOrders.Add(update);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// fsql.Transaction(() =>
|
|
|
|
// {
|
|
|
|
// if (updateOrders.Count() > 0)
|
|
|
|
// foreach (var updateOrder in updateOrders)
|
|
|
|
// fsql.Update<Order>(updateOrder.Id).Set(o => o.IsAfterSaleOrder, true).ExecuteAffrows();
|
|
|
|
// if (updateOrderSkus.Count() > 0)
|
|
|
|
// foreach (var updateOrderSku in updateOrderSkus)
|
|
|
|
// fsql.Update<OrderSku>(updateOrderSku.Id).Set(osku => osku.IsRefund, true).ExecuteAffrows();
|
|
|
|
// if (insertAfterSaleOrders.Count() > 0)
|
|
|
|
// fsql.Insert(insertAfterSaleOrders).ExecuteAffrows();
|
|
|
|
// if (updateAfterSaleOrders.Count() > 0)
|
|
|
|
// foreach (var update in updateAfterSaleOrders)
|
|
|
|
// update.ExecuteAffrows();
|
|
|
|
// });
|
|
|
|
// }
|
|
|
|
|
|
|
|
// private void SyncRefundOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false)
|
|
|
|
// {
|
|
|
|
// try
|
|
|
|
// {
|
|
|
|
// //logger.Info($"退款订单同步 {shop.ShopName} isAuto {isAuto}");
|
|
|
|
// if (!syncRefundOrderMethodDic.ContainsKey(shop.PlatformId))
|
|
|
|
// throw new Exception("不支持的平台");
|
|
|
|
// var shopId = long.Parse(shop.ShopId);
|
|
|
|
// var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId);
|
|
|
|
// var refundOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetRefundList", new SearchRefundPlatformOrderRequest()
|
|
|
|
// {
|
|
|
|
// StartDate = startTime ?? DateTime.Now.Date.AddDays(-5),
|
|
|
|
// EndDate = endTime ?? DateTime.Now,
|
|
|
|
// AppKey = shop.AppKey,
|
|
|
|
// AppSecret = shop.AppSecret,
|
|
|
|
// AppToken = shop.AppToken,
|
|
|
|
// PageIndex = 1,
|
|
|
|
// PageSize = 50,
|
|
|
|
// Platform = shop.PlatformId,
|
|
|
|
// SaveResponseLog = true,
|
|
|
|
// OrderId = orderId
|
|
|
|
// }, null, HttpMethod.Post);
|
|
|
|
// if (refundOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK)
|
|
|
|
// throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}");
|
|
|
|
|
|
|
|
// var refundOrderListResponse = JsonConvert.DeserializeObject<ApiResponse<JArray>>(refundOrderListApiResult.Content);
|
|
|
|
// if (!refundOrderListResponse.Success)
|
|
|
|
// throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}");
|
|
|
|
|
|
|
|
// if (refundOrderListResponse.Data == null || refundOrderListResponse.Data.Count == 0)
|
|
|
|
// return;
|
|
|
|
|
|
|
|
// syncRefundOrderMethodDic[shop.PlatformId](refundOrderListResponse.Data, shop);
|
|
|
|
// }
|
|
|
|
// catch (Exception ex)
|
|
|
|
// {
|
|
|
|
// var shopData = JsonConvert.SerializeObject(shop);
|
|
|
|
// logger.Error(ex, $"SyncRefundOrder ShopData:{shopData}");
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// public void SyncAllShopRefundOrder()
|
|
|
|
// {
|
|
|
|
// var shopList = venderBusiness.GetShopList();
|
|
|
|
// SyncRefundOrder(shopList.FirstOrDefault(s => s.ShopName == "布莱特玩具专营店"), string.Empty, isAuto: true);
|
|
|
|
// //foreach (var shop in shopList)
|
|
|
|
// //{
|
|
|
|
// // Task.Factory.StartNew(() => SyncRefundOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncRefundOrderTaskScheduler);
|
|
|
|
// //}
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
} |
|
|
|