步步为盈
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.

245 lines
12 KiB

using BBWY.Common.Extensions;
using BBWY.Common.Http;
3 years ago
using BBWY.Common.Models;
using BBWY.Server.Model;
3 years ago
using BBWY.Server.Model.Db;
3 years ago
using BBWY.Server.Model.Dto;
3 years ago
using FreeSql;
3 years ago
using Microsoft.Extensions.Options;
3 years ago
using Newtonsoft.Json;
3 years ago
using Newtonsoft.Json.Linq;
using NLog;
using System;
using System.Collections.Generic;
3 years ago
using System.Linq;
using System.Net.Http;
3 years ago
using System.Threading.Tasks;
using Yitter.IdGenerator;
namespace BBWY.Server.Business
{
public class AfterSaleOrderSyncBusiness : BaseSyncBusiness, IDenpendency
{
private IDictionary<Enums.Platform, Action<JArray, ShopResponse>> syncAfterSaleOrderMethodDic;
3 years ago
private IDictionary<int, Enums.ServiceResult> processResultDic;
3 years ago
public AfterSaleOrderSyncBusiness(RestApiService restApiService,
IOptions<GlobalConfig> options,
ILogger logger,
IFreeSql fsql,
3 years ago
NLogManager logManager,
3 years ago
IIdGenerator idGenerator,
TaskSchedulerManager taskSchedulerManager,
3 years ago
VenderBusiness venderBusiness, YunDingBusiness yunDingBusiness) : base(restApiService,
3 years ago
options,
logger,
3 years ago
logManager,
3 years ago
fsql,
idGenerator,
taskSchedulerManager,
3 years ago
venderBusiness,
yunDingBusiness)
3 years ago
{
syncAfterSaleOrderMethodDic = new Dictionary<Enums.Platform, Action<JArray, ShopResponse>>()
{
{ Enums.Platform., SyncJDAfterOrder }
};
3 years ago
processResultDic = new Dictionary<int, Enums.ServiceResult>()
{
{ 23,Enums.ServiceResult.},
{ 40,Enums.ServiceResult.退},
{ 60,Enums.ServiceResult.},
{ 90,Enums.ServiceResult.线},
{ 110,Enums.ServiceResult.}
3 years ago
};
3 years ago
}
3 years ago
private void SyncJDAfterOrder(JArray afterOrderTokenJArray, ShopResponse shop)
3 years ago
{
3 years ago
var shopId = long.Parse(shop.ShopId);
var validAfterOrderJArray = afterOrderTokenJArray.Where(j => (j.Value<int>("serviceStatus") == 10010 || j.Value<int>("serviceStatus") == 10009) && //完成
processResultDic.ContainsKey(j.Value<int>("processResult")));
3 years ago
var orderIds = validAfterOrderJArray.Select(j => j["orderId"].ToString()).Distinct().ToList();
var orderSkuIds = validAfterOrderJArray.Select(j => j["skuId"].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();
3 years ago
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 afterOrderJToken in validAfterOrderJArray)
{
var orderId = afterOrderJToken.Value<string>("orderId");
var skuId = afterOrderJToken.Value<string>("skuId");
var serviceId = afterOrderJToken.Value<string>("serviceId");
3 years ago
var processResult = processResultDic[afterOrderJToken.Value<int>("processResult")];
var afterOrder = afterOrders.FirstOrDefault(aso => aso.ServiceId == serviceId);
3 years ago
if (afterOrder == null)
{
var dbOrderSku = dbOrderSkus.FirstOrDefault(osku => osku.OrderId == orderId && osku.SkuId == skuId);
if (dbOrderSku == null)
continue;
3 years ago
decimal refundAmount = 0M;
try
{
if (processResult == Enums.ServiceResult.退)
refundAmount = SyncJDRefundOrder(shop, orderId, serviceId);
}
catch (Exception ex)
{
logger.Error(ex, $"SyncAfterOrder-SyncRefound ServiceId:{serviceId} OrderId:{orderId} ShopData:{JsonConvert.SerializeObject(shop)}");
}
3 years ago
insertAfterSaleOrders.Add(new AfterSaleOrder()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
OrderId = dbOrderSku.OrderId,
ProductId = dbOrderSku.ProductId,
3 years ago
RefundAmount = refundAmount,
3 years ago
SkuId = skuId,
ShopId = shopId,
ServiceResult = processResult,
ServiceId = serviceId,
ApplyTime = afterOrderJToken.Value<long>("applyTime").StampToDateTime()
3 years ago
});
}
else
{
if (afterOrder.ServiceResult == null ||
(afterOrder.ServiceResult != processResult &&
afterOrder.ServiceResult != Enums.ServiceResult. &&
afterOrder.ServiceResult != Enums.ServiceResult.退 &&
afterOrder.ServiceResult != Enums.ServiceResult.SD退货))
3 years ago
{
var update = fsql.Update<AfterSaleOrder>(afterOrder.Id).Set(aso => aso.ServiceResult, processResult);
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();
3 years ago
if (insertAfterSaleOrders.Count() > 0)
fsql.Insert(insertAfterSaleOrders).ExecuteAffrows();
if (updateAfterSaleOrders.Count() > 0)
foreach (var update in updateAfterSaleOrders)
3 years ago
update.ExecuteAffrows();
3 years ago
});
3 years ago
}
private void SyncAfterOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false)
{
3 years ago
try
{
//logger.Info($"售后订单同步 {shop.ShopName} isAuto {isAuto}");
3 years ago
if (!syncAfterSaleOrderMethodDic.ContainsKey(shop.PlatformId))
throw new Exception("不支持的平台");
var shopId = long.Parse(shop.ShopId);
var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId);
var afterOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetAfterOrderList", new SyncAfterOrderRequest()
{
StartDate = startTime ?? DateTime.Now.Date.AddDays(-3),
3 years ago
EndDate = endTime ?? DateTime.Now,
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
AppToken = shop.AppToken,
PageIndex = 1,
PageSize = 50,
Platform = shop.PlatformId,
SaveResponseLog = true,
OrderId = orderId,
VenderId = shop.VenderId
}, GetYunDingRequestHeader(), HttpMethod.Post);
3 years ago
if (afterOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception($"获取退款订单失败 {afterOrderListApiResult.Content}");
3 years ago
3 years ago
var afterOrderListResponse = JsonConvert.DeserializeObject<ApiResponse<JArray>>(afterOrderListApiResult.Content);
if (!afterOrderListResponse.Success)
throw new Exception($"获取退款订单失败 {afterOrderListApiResult.Content}");
if (afterOrderListResponse.Data == null || afterOrderListResponse.Data.Count == 0)
return;
syncAfterSaleOrderMethodDic[shop.PlatformId](afterOrderListResponse.Data, shop);
}
catch (Exception ex)
{
var shopData = JsonConvert.SerializeObject(shop);
logger.Error(ex, $"SyncAfterOrder ShopData:{shopData}");
}
3 years ago
}
public void SyncAllShopAfterOrder()
{
var shopList = venderBusiness.GetShopList();
3 years ago
//SyncAfterOrder(shopList.FirstOrDefault(s => s.ShopName == "布莱特玩具专营店"), string.Empty, isAuto: true);
3 years ago
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => SyncAfterOrder(shop, string.Empty, isAuto: true),
System.Threading.CancellationToken.None,
TaskCreationOptions.LongRunning,
taskSchedulerManager.SyncAfterOrderTaskScheduler);
}
}
3 years ago
/// <summary>
/// 获取退款单
/// </summary>
/// <param name="shop"></param>
/// <param name="orderId"></param>
/// <param name="serviceId"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
private decimal SyncJDRefundOrder(ShopResponse shop, string orderId, string serviceId)
{
var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId);
var refundOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetRefundList", new SearchRefundPlatformOrderRequest()
{
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
AppToken = shop.AppToken,
PageIndex = 1,
PageSize = 50,
Platform = shop.PlatformId,
SaveResponseLog = false,
OrderId = orderId
}, GetYunDingRequestHeader(), HttpMethod.Post);
3 years ago
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 0M;
var jtoken = refundOrderListResponse.Data.FirstOrDefault(j => j["sameOrderServiceBill"]["serviceId"].ToString() == serviceId &&
j.Value<int>("status") == 13 &&
j.Value<decimal>("refoundAmount") != 0M);
return jtoken == null ? 0M : jtoken.Value<decimal>("refoundAmount");
}
3 years ago
}
}