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 RefundOrderSyncBusiness : BaseSyncBusiness, IDenpendency { private IDictionary> syncRefundOrderMethodDic; public RefundOrderSyncBusiness(RestApiService restApiService, IOptions options, ILogger logger, IFreeSql fsql, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager, VenderBusiness venderBusiness) : base(restApiService, options, logger, fsql, idGenerator, taskSchedulerManager, venderBusiness) { syncRefundOrderMethodDic = new Dictionary>() { { Enums.Platform.京东, SyncJDRefundOrder} }; } private void SyncJDRefundOrder(JArray refundOrderTokenJArray, ShopResponse shopResponse) { var shopId = long.Parse(shopResponse.ShopId); var validRefundOrderTokenJArray = refundOrderTokenJArray.Where(j => j.Value("status") == 13 && j.Value("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().Where(o => orderIds.Contains(o.Id) && o.IsAfterSaleOrder == false).ToList(); var updateOrderSkus = fsql.Select().Where(osku => orderIds.Contains(osku.OrderId) && orderSkuIds.Contains(osku.SkuId) && 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 refundOrderJToken in validRefundOrderTokenJArray) { var skuId = refundOrderJToken["sameOrderServiceBill"]["wareId"].ToString(); var orderId = refundOrderJToken["sameOrderServiceBill"]["orderId"].ToString(); var updateSku = updateOrderSkus.FirstOrDefault(osku => osku.OrderId == orderId && osku.SkuId == skuId); if (updateSku == null) continue; var refundAmount = refundOrderJToken.Value("refoundAmount"); var refundCompleteTime = refundOrderJToken.Value("completeTime").StampToDateTime(); var afterOrder = afterOrders.FirstOrDefault(aso => aso.OrderId == orderId && aso.SkuId == skuId); if (afterOrder == null) { insertAfterSaleOrders.Add(new AfterSaleOrder() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, OrderId = updateSku.OrderId, ProductId = updateSku.ProductId, RefundAmount = refundAmount, RefundTime = refundCompleteTime, SkuId = skuId, ShopId = shopId }); } else if (afterOrder.RefundAmount == 0) { //afterOrder.RefundAmount = refundAmount; //afterOrder.RefundTime = refundCompleteTime; var update = fsql.Update(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(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.ExecuteUpdated(); }); } 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>(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); } } } }