using BBWY.Common.Extensions; using BBWY.Common.Http; using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Db; using BBWY.Server.Model.Dto; using FreeSql; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NLog; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using Yitter.IdGenerator; namespace BBWY.Server.Business { public class AfterSaleOrderSyncBusiness : BaseSyncBusiness, IDenpendency { private IDictionary> syncAfterSaleOrderMethodDic; private IDictionary processResultDic; public AfterSaleOrderSyncBusiness(RestApiService restApiService, IOptions options, ILogger logger, IFreeSql fsql, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager, VenderBusiness venderBusiness,YunDingBusiness yunDingBusiness) : base(restApiService, options, logger, fsql, idGenerator, taskSchedulerManager, venderBusiness, yunDingBusiness) { syncAfterSaleOrderMethodDic = new Dictionary>() { { Enums.Platform.京东, SyncJDAfterOrder } }; processResultDic = new Dictionary() { { 23,Enums.ServiceResult.换新}, { 40,Enums.ServiceResult.退货}, { 60,Enums.ServiceResult.原返}, { 90,Enums.ServiceResult.线下换新}, { 110,Enums.ServiceResult.商品补发} }; } private void SyncJDAfterOrder(JArray afterOrderTokenJArray, ShopResponse shop) { var shopId = long.Parse(shop.ShopId); var validAfterOrderJArray = afterOrderTokenJArray.Where(j => (j.Value("serviceStatus") == 10010 || j.Value("serviceStatus") == 10009) && //完成 processResultDic.ContainsKey(j.Value("processResult"))); var orderIds = validAfterOrderJArray.Select(j => j["orderId"].ToString()).Distinct().ToList(); var orderSkuIds = validAfterOrderJArray.Select(j => j["skuId"].ToString()).Distinct().ToList(); var updateOrders = fsql.Select().Where(o => orderIds.Contains(o.Id) && o.IsAfterSaleOrder == false).ToList(); var dbOrderSkus = fsql.Select().Where(osku => orderIds.Contains(osku.OrderId) && orderSkuIds.Contains(osku.SkuId)).ToList(); var updateOrderSkus = dbOrderSkus.Where(osku => osku.IsRefund == false).ToList(); var afterOrders = fsql.Select().Where(aso => orderIds.Contains(aso.OrderId)).ToList(); List insertAfterSaleOrders = new List(); List> updateAfterSaleOrders = new List>(); foreach (var afterOrderJToken in validAfterOrderJArray) { var orderId = afterOrderJToken.Value("orderId"); var skuId = afterOrderJToken.Value("skuId"); var serviceId = afterOrderJToken.Value("serviceId"); var processResult = processResultDic[afterOrderJToken.Value("processResult")]; var afterOrder = afterOrders.FirstOrDefault(aso => aso.ServiceId == serviceId); if (afterOrder == null) { var dbOrderSku = dbOrderSkus.FirstOrDefault(osku => osku.OrderId == orderId && osku.SkuId == skuId); if (dbOrderSku == null) continue; 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)}"); } insertAfterSaleOrders.Add(new AfterSaleOrder() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, OrderId = dbOrderSku.OrderId, ProductId = dbOrderSku.ProductId, RefundAmount = refundAmount, SkuId = skuId, ShopId = shopId, ServiceResult = processResult, ServiceId = serviceId, ApplyTime = afterOrderJToken.Value("applyTime").StampToDateTime() }); } else { if (afterOrder.ServiceResult == null || (afterOrder.ServiceResult != processResult && afterOrder.ServiceResult != Enums.ServiceResult.维修 && afterOrder.ServiceResult != Enums.ServiceResult.仅退款 && afterOrder.ServiceResult != Enums.ServiceResult.SD退货)) { var update = fsql.Update(afterOrder.Id).Set(aso => aso.ServiceResult, processResult); updateAfterSaleOrders.Add(update); } } } fsql.Transaction(() => { if (updateOrders.Count() > 0) foreach (var updateOrder in updateOrders) fsql.Update(updateOrder.Id).Set(o => o.IsAfterSaleOrder, true).ExecuteAffrows(); if (updateOrderSkus.Count() > 0) foreach (var updateOrderSku in updateOrderSkus) fsql.Update(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 SyncAfterOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false) { try { //logger.Info($"售后订单同步 {shop.ShopName} isAuto {isAuto}"); 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), 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); if (afterOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception($"获取退款订单失败 {afterOrderListApiResult.Content}"); var afterOrderListResponse = JsonConvert.DeserializeObject>(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}"); } } public void SyncAllShopAfterOrder() { var shopList = venderBusiness.GetShopList(); //SyncAfterOrder(shopList.FirstOrDefault(s => s.ShopName == "布莱特玩具专营店"), string.Empty, isAuto: true); foreach (var shop in shopList) { Task.Factory.StartNew(() => SyncAfterOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncAfterOrderTaskScheduler); } } /// /// 获取退款单 /// /// /// /// /// /// 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); if (refundOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}"); var refundOrderListResponse = JsonConvert.DeserializeObject>(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("status") == 13 && j.Value("refoundAmount") != 0M); return jtoken == null ? 0M : jtoken.Value("refoundAmount"); } } }