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.
1242 lines
73 KiB
1242 lines
73 KiB
using BBWY.Common.Http;
|
|
using BBWY.Common.Models;
|
|
using BBWY.Server.Business.Extensions;
|
|
using BBWY.Server.Business.PlatformSDK.DataExtension;
|
|
using BBWY.Server.Model;
|
|
using BBWY.Server.Model.Db;
|
|
using BBWY.Server.Model.Dto;
|
|
using FreeSql;
|
|
using Microsoft.Extensions.Caching.Memory;
|
|
using Microsoft.Extensions.Options;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Net.Http;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Yitter.IdGenerator;
|
|
|
|
namespace BBWY.Server.Business
|
|
{
|
|
public class OrderSyncBusiness : BaseSyncBusiness, IDenpendency
|
|
{
|
|
private IDictionary<Enums.Platform, Action<JArray, long, string, string, string, string, decimal>> syncOrderMethodDic;
|
|
|
|
private IMemoryCache memoryCache;
|
|
|
|
private IList<string> validOrderState;
|
|
|
|
|
|
public OrderSyncBusiness(RestApiService restApiService,
|
|
IOptions<GlobalConfig> options,
|
|
NLogManager nLogManager,
|
|
IFreeSql fsql,
|
|
IIdGenerator idGenerator,
|
|
TaskSchedulerManager taskSchedulerManager,
|
|
VenderBusiness venderBusiness,
|
|
IMemoryCache memoryCache,
|
|
YunDingBusiness yunDingBusiness) : base(restApiService,
|
|
options,
|
|
nLogManager,
|
|
fsql,
|
|
idGenerator,
|
|
taskSchedulerManager,
|
|
venderBusiness,
|
|
yunDingBusiness)
|
|
{
|
|
this.memoryCache = memoryCache;
|
|
syncOrderMethodDic = new Dictionary<Enums.Platform, Action<JArray, long, string, string, string, string, decimal>>()
|
|
{
|
|
{ Enums.Platform.京东, SyncJDOrder }
|
|
};
|
|
this.validOrderState = new List<string>()
|
|
{
|
|
"WAIT_SELLER_STOCK_OUT","WAIT_GOODS_RECEIVE_CONFIRM","FINISHED_L","LOCKED","TRADE_CANCELED","POP_ORDER_PAUSE","PAUSE"
|
|
};
|
|
}
|
|
/// <summary>
|
|
/// 手动同步订单
|
|
/// </summary>
|
|
/// <param name="shopId"></param>
|
|
/// <param name="orderId"></param>
|
|
/// <param name="startTime"></param>
|
|
/// <param name="endTime"></param>
|
|
public void ManualSyncOrder(long shopId, string orderId, DateTime? startTime = null, DateTime? endTime = null)
|
|
{
|
|
var shop = venderBusiness.GetShopByShopId(shopId.ToString());
|
|
SyncOrder(shop, orderId, startTime, endTime, isAuto: false, Enums.SortTimeType.StartTime);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 手动同步订单
|
|
/// </summary>
|
|
/// <param name="shopId"></param>
|
|
/// <param name="orderIds"></param>
|
|
/// <param name="startTime"></param>
|
|
/// <param name="endTime"></param>
|
|
public void ManualSyncOrder(long shopId, IList<string> orderIds, DateTime? startTime = null, DateTime? endTime = null)
|
|
{
|
|
var shop = venderBusiness.GetShopByShopId(shopId.ToString());
|
|
Task.Factory.StartNew(() =>
|
|
{
|
|
var i = 1;
|
|
foreach (var orderId in orderIds)
|
|
{
|
|
SyncOrder(shop, orderId, startTime, endTime, isAuto: false, Enums.SortTimeType.StartTime);
|
|
Thread.Sleep(500);
|
|
i++;
|
|
Console.WriteLine();
|
|
Console.WriteLine($"Sync Order {orderId}, {i}");
|
|
}
|
|
Console.WriteLine("job done");
|
|
}, System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
|
|
|
|
}
|
|
|
|
public void SyncOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false, Enums.SortTimeType? sortTimeType = null)
|
|
{
|
|
try
|
|
{
|
|
//logger.Info($"订单同步 {shop.ShopName} isAuto {isAuto}");
|
|
if (!syncOrderMethodDic.ContainsKey(shop.PlatformId))
|
|
throw new Exception("不支持的平台");
|
|
var shopId = long.Parse(shop.ShopId);
|
|
var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId);
|
|
var orderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetOrderList", new SearchPlatformOrderRequest()
|
|
{
|
|
StartDate = startTime ?? DateTime.Now.AddHours(shop.ShopName.Contains("腾奇") ? -0.5 : -3),
|
|
EndDate = endTime ?? DateTime.Now,
|
|
AppKey = shop.AppKey,
|
|
AppSecret = shop.AppSecret,
|
|
AppToken = shop.AppToken,
|
|
PageIndex = 1,
|
|
PageSize = 100,
|
|
Platform = shop.PlatformId,
|
|
JDColType = string.IsNullOrEmpty(shop.ShopType) ? "0" : shop.ShopType,
|
|
//SaveResponseLog = true,
|
|
OrderId = orderId,
|
|
SortTimeType = sortTimeType
|
|
}, GetYunDingRequestHeader(), HttpMethod.Post, timeOutSeconds: 120);
|
|
if (orderListApiResult.StatusCode != System.Net.HttpStatusCode.OK)
|
|
throw new Exception($"获取订单失败 {orderListApiResult.Content}");
|
|
|
|
var orderListResponse = JsonConvert.DeserializeObject<ApiResponse<JArray>>(orderListApiResult.Content);
|
|
if (!orderListResponse.Success)
|
|
throw new Exception($"获取订单失败 {orderListApiResult.Content}");
|
|
|
|
if (orderListResponse.Data == null || orderListResponse.Data.Count == 0)
|
|
return;
|
|
|
|
syncOrderMethodDic[shop.PlatformId](orderListResponse.Data, shopId, relayAPIHost, shop.AppKey, shop.AppSecret, shop.AppToken, shop.PlatformCommissionRatio ?? 0.05M);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
var shopData = JsonConvert.SerializeObject(shop);
|
|
nLogManager.Default().Error(ex, $"SyncOrder ShopData:{shopData}");
|
|
}
|
|
}
|
|
|
|
public void SyncOrderByDate(SyncOrderByDateRequest syncOrderByDateRequest)
|
|
{
|
|
if (fsql.Select<OrderSyncTask>().Where(ost => ost.ShopId == syncOrderByDateRequest.ShopId && ost.State == Enums.OrderSyncState.Running).Any())
|
|
throw new BusinessException("存在未结束的同步任务,请稍后同步");
|
|
syncOrderByDateRequest.EndTime = syncOrderByDateRequest.EndTime.Date.AddDays(1).AddSeconds(-1);
|
|
if ((syncOrderByDateRequest.EndTime - syncOrderByDateRequest.StartTime).Days > 7)
|
|
throw new BusinessException("同步任务时差最长7天");
|
|
|
|
var orderSyncTask = new OrderSyncTask()
|
|
{
|
|
Id = idGenerator.NewLong(),
|
|
ShopId = syncOrderByDateRequest.ShopId,
|
|
State = Enums.OrderSyncState.Running,
|
|
SyncStartTime = syncOrderByDateRequest.StartTime,
|
|
SyncEndTime = syncOrderByDateRequest.EndTime
|
|
};
|
|
fsql.Insert(orderSyncTask).ExecuteAffrows();
|
|
Task.Factory.StartNew(() =>
|
|
{
|
|
var currentStartTime = syncOrderByDateRequest.StartTime;
|
|
var currentEndTime = currentStartTime.AddHours(3);
|
|
var keeploop = true;
|
|
while (keeploop)
|
|
{
|
|
try
|
|
{
|
|
ManualSyncOrder(syncOrderByDateRequest.ShopId, string.Empty, currentStartTime, currentEndTime);
|
|
}
|
|
catch (Exception ex) { }
|
|
finally
|
|
{
|
|
var lessHour = (syncOrderByDateRequest.EndTime - currentEndTime).TotalHours;
|
|
if (lessHour > 3)
|
|
{
|
|
currentStartTime = currentStartTime.AddHours(3);
|
|
currentEndTime = currentEndTime.AddHours(3);
|
|
}
|
|
else if (lessHour > 0 && lessHour < 3)
|
|
{
|
|
currentStartTime = currentEndTime;
|
|
currentEndTime = syncOrderByDateRequest.EndTime;
|
|
}
|
|
else if (lessHour <= 0)
|
|
{
|
|
keeploop = false;
|
|
}
|
|
}
|
|
}
|
|
try
|
|
{
|
|
fsql.Update<OrderSyncTask>(orderSyncTask.Id).Set(ost => ost.State, Enums.OrderSyncState.End).ExecuteAffrows();
|
|
}
|
|
catch (Exception ex) { }
|
|
}, System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
|
|
}
|
|
|
|
private void SyncJDOrder(JArray orderTokenJArray, long shopId, string relayAPIHost, string appKey, string appSecret, string appToken, decimal platformCommissionRatio)
|
|
{
|
|
var validOrders = orderTokenJArray.Where(o => validOrderState.Contains(o.Value<string>("orderState")));
|
|
if (validOrders.Count() == 0)
|
|
return;
|
|
|
|
#region 数据库操作
|
|
List<Order> insertOrderList = new List<Order>();
|
|
List<OrderConsignee> insertOrderConsigneeList = new List<OrderConsignee>();
|
|
List<OrderCost> insertOrderCostList = new List<OrderCost>();
|
|
List<OrderCostDetail> insertOrderCostDetailList = new List<OrderCostDetail>();
|
|
List<OrderSku> insertOrderSkuList = new List<OrderSku>();
|
|
List<OrderCoupon> insertOrderCouponList = new List<OrderCoupon>();
|
|
List<OrderTotalInfo> insertOrderTotalInfoList = new List<OrderTotalInfo>();
|
|
List<OrderCoupon_New> insertOrderCouponNewList = new List<OrderCoupon_New>();
|
|
List<OrderPromotion> insertOrderPromotionList = new List<OrderPromotion>();
|
|
|
|
IList<IUpdate<Order>> updateOrderList = new List<IUpdate<Order>>();
|
|
Dictionary<string, IUpdate<OrderSku>> updateOrderSkuDictionary = new Dictionary<string, IUpdate<OrderSku>>();
|
|
IList<IUpdate<PurchaseOrder>> updatePurchaseOrderList = new List<IUpdate<PurchaseOrder>>();
|
|
#endregion
|
|
|
|
|
|
var interfaceOrderIdList = validOrders.Select(orderJToken => orderJToken.Value<string>("orderId"));
|
|
var interfaceCanceledOrderIdList = validOrders.Where(orderJToken => orderJToken.Value<string>("orderState").Equals("TRADE_CANCELED"))
|
|
.Select(orderJToken => orderJToken.Value<string>("orderId")); //接口查询结果中取消状态的订单Id
|
|
|
|
|
|
var dbOrderList = fsql.Select<Order>().Where(o => interfaceOrderIdList.Contains(o.Id)).ToList(o => new Order
|
|
{
|
|
Id = o.Id,
|
|
OrderState = o.OrderState,
|
|
StorageType = o.StorageType,
|
|
BuyerRemark = o.BuyerRemark,
|
|
VenderRemark = o.VenderRemark,
|
|
ModifyTime = o.ModifyTime,
|
|
EndTime = o.EndTime,
|
|
WaybillNo = o.WaybillNo,
|
|
FreightPrice = o.FreightPrice,
|
|
OrderPayment = o.OrderPayment,
|
|
SellerPreferentialAmount = o.SellerPreferentialAmount,
|
|
OrderSellerPrice = o.OrderSellerPrice,
|
|
OrderTotalPrice = o.OrderTotalPrice,
|
|
StoreOrder = o.StoreOrder,
|
|
PreferentialAmount = o.PreferentialAmount,
|
|
StoreId = o.StoreId,
|
|
IsGift = o.IsGift
|
|
}); //数据库订单
|
|
var dbOrderConsigneeList = fsql.Select<OrderConsignee>().Where(oc => interfaceOrderIdList.Contains(oc.OrderId)).ToList(); //数据库订单收货信息
|
|
var dbOrderCostList = fsql.Select<OrderCost>().Where(oc => interfaceOrderIdList.Contains(oc.OrderId)).ToList(); //数据库订单成本信息
|
|
var dbOrderCouponList = fsql.Select<OrderCoupon>().Where(oc => interfaceOrderIdList.Contains(oc.OrderId)).ToList(); //数据库订单优惠信息
|
|
var dbOrderSkuList = fsql.Select<OrderSku>().Where(osku => interfaceOrderIdList.Contains(osku.OrderId)).ToList(); //数据库sku信息
|
|
|
|
List<OrderCostDetail> dbOrderCostDetailList = null; //数据库成本明细
|
|
if (interfaceCanceledOrderIdList.Count() > 0 &&
|
|
dbOrderList.Any(dbOrder => interfaceCanceledOrderIdList.Contains(dbOrder.Id) && dbOrder.OrderState != Enums.OrderState.已取消))
|
|
{
|
|
dbOrderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => interfaceCanceledOrderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList();
|
|
}
|
|
|
|
#region 优惠券/促销/拆分明细
|
|
//var dbOrderCouponNewList = fsql.Select<OrderCoupon_New>().Where(ocn => interfaceOrderIdList.Contains(ocn.OrderId)).ToList();
|
|
//var dbOrderPromotionList = fsql.Select<OrderPromotion>().Where(op => interfaceOrderIdList.Contains(op.OrderId)).ToList();
|
|
var dbOrderTotalList = fsql.Select<OrderTotalInfo>().Where(ot => interfaceOrderIdList.Contains(ot.Id)).ToList();
|
|
|
|
var orderSkuCFDetailList = new List<OrderSkuCFDetail>();
|
|
#endregion
|
|
|
|
var orderSkuIds = new List<string>();
|
|
foreach (var orderJToken in validOrders)
|
|
{
|
|
var itemInfoList = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value<decimal>("jdPrice") != 0M);
|
|
foreach (var josku in itemInfoList)
|
|
{
|
|
var skuId = josku.Value<string>("skuId");
|
|
if (!orderSkuIds.Contains(skuId))
|
|
orderSkuIds.Add(skuId);
|
|
}
|
|
}
|
|
var dbPurchaseOrderList = fsql.Select<PurchaseOrder>().Where(po => po.ShopId == shopId && po.RemainingQuantity != 0 && orderSkuIds.Contains(po.SkuId)).ToList(); //数据库采购单
|
|
orderSkuIds.Clear();
|
|
|
|
foreach (var orderJToken in validOrders)
|
|
{
|
|
var orderId = orderJToken.Value<string>("orderId");
|
|
try
|
|
{
|
|
|
|
if (insertOrderList.Any(o => o.Id == orderId))
|
|
continue;
|
|
var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == orderId);
|
|
var dbOrderTotal = dbOrderTotalList.FirstOrDefault(o => o.Id == orderId);
|
|
var isNewOrder = dbOrder == null;
|
|
SDCalculationCostRequest sDCalculationCostRequest = null; //SD信息埋点
|
|
|
|
#region 优惠券/促销/拆分明细
|
|
if (!dbOrderTotalList.Any(ot => ot.Id == orderId))
|
|
{
|
|
var orderCouponDetailHttpResult = restApiService.SendRequest("http://yunding.qiyue666.com", "api/PlatformSDK/GetOrderCouponDetail", new
|
|
{
|
|
OrderId = orderId,
|
|
AppKey = appKey,
|
|
AppSecret = appSecret,
|
|
AppToken = appToken,
|
|
Platform = Enums.Platform.京东
|
|
}, null, HttpMethod.Post);
|
|
if (orderCouponDetailHttpResult.StatusCode == System.Net.HttpStatusCode.OK)
|
|
{
|
|
var orderCouponDetailResponse = JsonConvert.DeserializeObject<ApiResponse<JToken>>(orderCouponDetailHttpResult.Content);
|
|
if (orderCouponDetailResponse.Success)
|
|
{
|
|
var jtoken = orderCouponDetailResponse.Data["jingdong_pop_order_coupondetail_responce"]["couponDetailExternal"]["couponDetailVo"];
|
|
|
|
#region 订单合计信息
|
|
var orderTotal = new OrderTotalInfo()
|
|
{
|
|
CreateTime = DateTime.Now,
|
|
Id = orderId,
|
|
TotalBalance = jtoken.Value<decimal>("totalBalance"),
|
|
TotalBaseDiscount = jtoken.Value<decimal>("TotalBaseDiscount"),
|
|
TotalBaseFee = jtoken.Value<decimal>("totalBaseFee"),
|
|
TotalCoupon = jtoken.Value<decimal>("totalCoupon"),
|
|
TotalDongQuan = jtoken.Value<decimal>("totalDongQuan"),
|
|
TotalExpiryGiftDiscount = jtoken.Value<decimal>("totalExpiryGiftDiscount"),
|
|
TotalGlobalGeneralIncludeTax = jtoken.Value<decimal>("totalGlobalGeneralIncludeTax"),
|
|
TotalGlobalGeneralTax = jtoken.Value<decimal>("totalGlobalGeneralTax"),
|
|
TotalItemPrice = jtoken.Value<decimal>("totalItemPrice"),
|
|
TotalJdZhiFuYouHui = jtoken.Value<decimal>("totalJdZhiFuYouHui"),
|
|
TotalJingDou = jtoken.Value<decimal>("totalJingDou"),
|
|
TotalJingQuan = jtoken.Value<decimal>("totalJingQuan"),
|
|
TotalJingXiangLiJin = jtoken.Value<decimal>("totalJingXiangLiJin"),
|
|
TotalLiJinYouHui = jtoken.Value<decimal>("totalLiJinYouHui"),
|
|
TotalLuoDiPeiService = jtoken.Value<decimal>("totalLuoDiPeiService"),
|
|
TotalManJian = jtoken.Value<decimal>("totalManJian"),
|
|
TotalPingTaiChengDanYouHuiQuan = jtoken.Value<decimal>("totalPingTaiChengDanYouHuiQuan"),
|
|
TotalPlus95 = jtoken.Value<decimal>("totalPlus95"),
|
|
TotalPromotionDiscount = jtoken.Value<decimal>("totalPromotionDiscount"),
|
|
TotalRemoteFee = jtoken.Value<decimal>("totalRemoteFee"),
|
|
TotalShouldPay = jtoken.Value<decimal>("totalShouldPay"),
|
|
TotalSuperRedEnvelope = jtoken.Value<decimal>("totalSuperRedEnvelope"),
|
|
TotalTaxFee = jtoken.Value<decimal>("totalTaxFee"),
|
|
TotalTuiHuanHuoWuYou = jtoken.Value<decimal>("totalTuiHuanHuoWuYou"),
|
|
TotalVenderFee = jtoken.Value<decimal>("totalVenderFee"),
|
|
TotalXianPinLeiDongQuan = jtoken.Value<decimal>("totalXianPinLeiDongQuan"),
|
|
TotalXianPinLeiJingQuan = jtoken.Value<decimal>("totalXianPinLeiJingQuan"),
|
|
TotalZhiFuYingXiaoYouHui = jtoken.Value<decimal>("totalZhiFuYingXiaoYouHui")
|
|
};
|
|
insertOrderTotalInfoList.Add(orderTotal);
|
|
#endregion
|
|
|
|
#region 订单优惠券信息
|
|
var couponJArray = jtoken["couponList"] as JArray;
|
|
if (couponJArray != null && couponJArray.Count() > 0)
|
|
{
|
|
insertOrderCouponNewList.AddRange(couponJArray.Select(j => new OrderCoupon_New()
|
|
{
|
|
Id = idGenerator.NewLong(),
|
|
CouponId = j.Value<int>("couponId"),
|
|
CouponName = j.Value<string>("couponName"),
|
|
CouponNum = j.Value<int>("couponNum"),
|
|
CouponPrice = j.Value<decimal>("couponPrice"),
|
|
CouponTypeDesc = j.Value<string>("couponTypeDesc"),
|
|
CreateTime = DateTime.Now,
|
|
JdCouponId = j.Value<string>("jdCouponId"),
|
|
JdDivideMoney = j.Value<decimal>("jdDivideMoney"),
|
|
OrderId = orderId,
|
|
PriceDivide = j.Value<bool>("priceDivide"),
|
|
VenderDivideMoney = j.Value<decimal>("venderDivideMoney")
|
|
}));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region 订单活动信息
|
|
var promotionJArray = jtoken["promotionList"] as JArray;
|
|
if (promotionJArray != null && promotionJArray.Count() > 0)
|
|
{
|
|
insertOrderPromotionList.AddRange(promotionJArray.Select(j => new OrderPromotion()
|
|
{
|
|
Id = idGenerator.NewLong(),
|
|
BeginTime = j.Value<DateTime>("beginTime"),
|
|
EndTime = j.Value<DateTime>("endTime"),
|
|
CreateTime = DateTime.Now,
|
|
OrderId = orderId,
|
|
PromotionId = j.Value<long>("promotionId"),
|
|
PromotionName = j.Value<string>("promotionName"),
|
|
SalePrice = j.Value<decimal>("salePrice"),
|
|
SaleTypeDesc = j.Value<string>("saleTypeDesc")
|
|
}));
|
|
}
|
|
#endregion
|
|
|
|
#region 订单sku金额明细
|
|
var skuJArray = jtoken["skuList"] as JArray;
|
|
if (skuJArray != null && skuJArray.Count() > 0)
|
|
{
|
|
foreach (var oskuJtoken in skuJArray)
|
|
{
|
|
var oskuCF = new OrderSkuCFDetail()
|
|
{
|
|
OrderId = orderId,
|
|
SkuId = oskuJtoken.Value<string>("skuCode"),
|
|
Balance = oskuJtoken.Value<decimal>("balance"),
|
|
BaseDiscount = oskuJtoken.Value<decimal>("baseDiscount"),
|
|
BaseFee = oskuJtoken.Value<decimal>("baseFee"),
|
|
Coupon = oskuJtoken.Value<decimal>("coupon"),
|
|
DongQuan = oskuJtoken.Value<decimal>("dongQuan"),
|
|
ExpiryGiftDiscount = oskuJtoken.Value<decimal>("expiryGiftDiscount"),
|
|
GlobalGeneralIncludeTax = oskuJtoken.Value<decimal>("globalGeneralIncludeTax"),
|
|
GlobalGeneralTax = oskuJtoken.Value<decimal>("globalGeneralTax"),
|
|
JdZhiFuYouHui = oskuJtoken.Value<decimal>("jdZhiFuYouHui"),
|
|
JingDou = oskuJtoken.Value<decimal>("jingDou"),
|
|
JingQuan = oskuJtoken.Value<decimal>("jingQuan"),
|
|
JingXiangLiJin = oskuJtoken.Value<decimal>("jingXiangLiJin"),
|
|
LiJinYouHui = oskuJtoken.Value<decimal>("liJinYouHui"),
|
|
LuoDiPeiService = oskuJtoken.Value<decimal>("luoDiPeiService"),
|
|
ManJian = oskuJtoken.Value<decimal>("manJian"),
|
|
PingTaiChengDanYouHuiQuan = oskuJtoken.Value<decimal>("pingTaiChengDanYouHuiQuan"),
|
|
Plus95 = oskuJtoken.Value<decimal>("plus95"),
|
|
PromotionDiscount = oskuJtoken.Value<decimal>("promotionDiscount"),
|
|
RemoteFee = oskuJtoken.Value<decimal>("remoteFee"),
|
|
ShouldPay = oskuJtoken.Value<decimal>("shouldPay"),
|
|
SuperRedEnvelope = oskuJtoken.Value<decimal>("superRedEnvelope"),
|
|
TaxFee = oskuJtoken.Value<decimal>("taxFee"),
|
|
TuiHuanHuoWuYou = oskuJtoken.Value<decimal>("tuiHuanHuoWuYou"),
|
|
VenderFee = oskuJtoken.Value<decimal>("venderFee"),
|
|
XianPinLeiDongQuan = oskuJtoken.Value<decimal>("xianPinLeiDongQuan"),
|
|
XianPinLeiJingQuan = oskuJtoken.Value<decimal>("xianPinLeiJingQuan"),
|
|
ZhiFuYingXiaoYouHui = oskuJtoken.Value<decimal>("zhiFuYingXiaoYouHui")
|
|
};
|
|
orderSkuCFDetailList.Add(oskuCF);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 订单基本信息
|
|
var buyerRemark = orderJToken.Value<string>("orderRemark");
|
|
var venderRemark = orderJToken.Value<string>("venderRemark");
|
|
var modifyTime = orderJToken.Value<DateTime?>("modified");
|
|
var endTime = orderJToken.Value<DateTime?>("orderEndTime");
|
|
var waybillNo = orderJToken.Value<string>("waybill");
|
|
var freightPrice = orderJToken.Value<decimal>("freightPrice");
|
|
var orderPayment = orderJToken.Value<decimal>("orderPayment");
|
|
var sellerPreferentialAmount = orderJToken.Value<decimal>("sellerDiscount");
|
|
var orderSellerPrice = orderJToken.Value<decimal>("orderSellerPrice");
|
|
var orderTotalPrice = orderJToken.Value<decimal>("orderTotalPrice");
|
|
var storeOrder = orderJToken.Value<string>("storeOrder") ?? string.Empty;
|
|
var storeId = orderJToken.Value<string>("storeId");
|
|
var storageType = ConvertStoreOrder(storeOrder);
|
|
if (dbOrder == null)
|
|
{
|
|
var orderTotalInfo = insertOrderTotalInfoList.FirstOrDefault(x => x.Id == orderId);
|
|
dbOrder = new Order()
|
|
{
|
|
Id = orderId,
|
|
BuyerRemark = buyerRemark,
|
|
VenderRemark = venderRemark,
|
|
FreightPrice = freightPrice,
|
|
EndTime = endTime,
|
|
StartTime = orderJToken.Value<DateTime>("orderStartTime"),
|
|
ModifyTime = modifyTime,
|
|
OrderPayment = orderPayment, //(orderTotalInfo?.TotalShouldPay) ?? orderPayment,
|
|
SellerPreferentialAmount = sellerPreferentialAmount,
|
|
OrderSellerPrice = orderSellerPrice,
|
|
OrderTotalPrice = orderTotalPrice,
|
|
OrderType = (Enums.OrderType)orderJToken.Value<int>("orderType"),
|
|
Platform = Enums.Platform.京东,
|
|
ShopId = shopId,
|
|
//VenderId = orderJToken.Value<long>("venderId"),
|
|
WaybillNo = waybillNo,
|
|
StoreOrder = storeOrder,
|
|
StoreId = storeId,
|
|
IsGift = orderSellerPrice == 0M,
|
|
StorageType = storageType,
|
|
PreferentialAmount = (orderTotalInfo?.TotalPingTaiChengDanYouHuiQuan) ?? 0M
|
|
};
|
|
|
|
if (memoryCache.TryGetValue(orderId, out sDCalculationCostRequest))
|
|
{
|
|
dbOrder.StorageType = Enums.StorageType.SD;
|
|
dbOrder.SDType = sDCalculationCostRequest.SDType;
|
|
dbOrder.Flag = sDCalculationCostRequest.Flag;
|
|
if (!string.IsNullOrEmpty(sDCalculationCostRequest.VenderRemark))
|
|
dbOrder.VenderRemark = sDCalculationCostRequest.VenderRemark;
|
|
dbOrder.SDKey = sDCalculationCostRequest.SDKey;
|
|
dbOrder.SDPayBillNo = sDCalculationCostRequest.SDPayBillNo;
|
|
dbOrder.SDOperator = sDCalculationCostRequest.SDOperator;
|
|
dbOrder.SDPayChannel = sDCalculationCostRequest.SDPayChannel;
|
|
}
|
|
|
|
var payType = orderJToken.Value<string>("payType");
|
|
if (payType.Contains("-"))
|
|
dbOrder.PayType = (Enums.PayType)Convert.ToInt32(payType.Substring(0, 1));
|
|
|
|
insertOrderList.Add(dbOrder);
|
|
|
|
#region OrderSku
|
|
var itemInfoList = orderJToken["itemInfoList"] as JArray;
|
|
foreach (var orderSkuJToken in itemInfoList)
|
|
{
|
|
var itemTotal = orderSkuJToken.Value<int>("itemTotal");
|
|
var jdPrice = orderSkuJToken.Value<decimal>("jdPrice");
|
|
var wareId = orderSkuJToken.Value<string>("wareId");
|
|
var skuId = orderSkuJToken.Value<string>("skuId");
|
|
|
|
//if (orderSkuJToken.Value<decimal>("jdPrice") != 0M)
|
|
//{
|
|
var oskuCF = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == skuId);
|
|
|
|
var osku = new OrderSku()
|
|
{
|
|
Id = idGenerator.NewLong(),
|
|
ItemTotal = itemTotal,
|
|
Price = jdPrice,
|
|
ProductId = wareId,
|
|
Title = orderSkuJToken.Value<string>("skuName").SimplifySkuName(),
|
|
ProductNo = orderSkuJToken.Value<string>("productNo"),
|
|
CreateTime = DateTime.Now,
|
|
OrderId = orderId,
|
|
SkuId = skuId,
|
|
Balance = oskuCF?.Balance ?? 0M,
|
|
BaseDiscount = oskuCF?.BaseFee ?? 0M,
|
|
BaseFee = oskuCF?.BaseFee ?? 0M,
|
|
Coupon = oskuCF?.Coupon ?? 0M,
|
|
DongQuan = oskuCF?.DongQuan ?? 0M,
|
|
ExpiryGiftDiscount = oskuCF?.ExpiryGiftDiscount ?? 0M,
|
|
GlobalGeneralIncludeTax = oskuCF?.GlobalGeneralIncludeTax ?? 0M,
|
|
GlobalGeneralTax = oskuCF?.GlobalGeneralTax ?? 0M,
|
|
JdZhiFuYouHui = oskuCF?.JdZhiFuYouHui ?? 0M,
|
|
JingDou = oskuCF?.JingDou ?? 0M,
|
|
JingQuan = oskuCF?.JingQuan ?? 0M,
|
|
JingXiangLiJin = oskuCF?.JingXiangLiJin ?? 0M,
|
|
LiJinYouHui = oskuCF?.LiJinYouHui ?? 0M,
|
|
LuoDiPeiService = oskuCF?.LuoDiPeiService ?? 0M,
|
|
ManJian = oskuCF?.ManJian ?? 0M,
|
|
PingTaiChengDanYouHuiQuan = oskuCF?.PingTaiChengDanYouHuiQuan ?? 0M,
|
|
Plus95 = oskuCF?.Plus95 ?? 0M,
|
|
PromotionDiscount = oskuCF?.PromotionDiscount ?? 0M,
|
|
RemoteFee = oskuCF?.RemoteFee ?? 0M,
|
|
ShouldPay = oskuCF?.ShouldPay ?? 0M,
|
|
SuperRedEnvelope = oskuCF?.SuperRedEnvelope ?? 0M,
|
|
TaxFee = oskuCF?.TaxFee ?? 0M,
|
|
TuiHuanHuoWuYou = oskuCF?.TuiHuanHuoWuYou ?? 0M,
|
|
VenderFee = oskuCF?.VenderFee ?? 0M,
|
|
XianPinLeiDongQuan = oskuCF?.XianPinLeiDongQuan ?? 0M,
|
|
XianPinLeiJingQuan = oskuCF?.XianPinLeiJingQuan ?? 0M,
|
|
ZhiFuYingXiaoYouHui = oskuCF?.ZhiFuYingXiaoYouHui ?? 0M
|
|
};
|
|
insertOrderSkuList.Add(osku);
|
|
//}
|
|
//CumulativeSkuDailySalesDetail(skuDailySalesDetailDictionary, dbOrder.StartTime.Value, shopId, skuId, wareId, jdPrice, itemTotal);
|
|
|
|
}
|
|
#endregion
|
|
}
|
|
else
|
|
{
|
|
//preferentialAmount = dbOrder.PreferentialAmount;
|
|
if (storageType != null && dbOrder.StorageType != storageType)
|
|
dbOrder.StorageType = storageType;
|
|
|
|
var currentDbOrderSkuList = dbOrderSkuList.Where(osku => osku.OrderId == orderId).ToList();
|
|
|
|
|
|
var itemInfoList = orderJToken["itemInfoList"] as JArray;
|
|
foreach (var orderSkuJToken in itemInfoList)
|
|
{
|
|
//var itemTotal = orderSkuJToken.Value<int>("itemTotal");
|
|
//var jdPrice = orderSkuJToken.Value<decimal>("jdPrice");
|
|
var wareId = orderSkuJToken.Value<string>("wareId");
|
|
var skuId = orderSkuJToken.Value<string>("skuId");
|
|
var dbOsku = currentDbOrderSkuList.FirstOrDefault(osku => osku.SkuId == skuId);
|
|
var skuUpdateKey = $"{orderId}_{skuId}";
|
|
if (dbOsku != null)
|
|
{
|
|
var oskuCF = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == dbOsku.SkuId);
|
|
var isDetailChanged = (dbOsku.ShouldPay == 0 || dbOsku.ShouldPay == null) && oskuCF != null && oskuCF.ShouldPay != 0;
|
|
if (dbOsku.ProductId != wareId || isDetailChanged)
|
|
{
|
|
var update = fsql.Update<OrderSku>(dbOsku.Id)
|
|
.SetIf(dbOsku.ProductId != wareId, osku => osku.ProductId, wareId)
|
|
.SetIf(isDetailChanged, osku => osku.ShouldPay, oskuCF?.ShouldPay)
|
|
.SetIf(isDetailChanged, osku => osku.Balance, oskuCF?.Balance)
|
|
.SetIf(isDetailChanged, osku => osku.BaseDiscount, oskuCF?.BaseDiscount)
|
|
.SetIf(isDetailChanged, osku => osku.BaseFee, oskuCF?.BaseFee)
|
|
.SetIf(isDetailChanged, osku => osku.Coupon, oskuCF?.Coupon)
|
|
.SetIf(isDetailChanged, osku => osku.DongQuan, oskuCF?.DongQuan)
|
|
.SetIf(isDetailChanged, osku => osku.ExpiryGiftDiscount, oskuCF?.ExpiryGiftDiscount)
|
|
.SetIf(isDetailChanged, osku => osku.GlobalGeneralIncludeTax, oskuCF?.GlobalGeneralIncludeTax)
|
|
.SetIf(isDetailChanged, osku => osku.GlobalGeneralTax, oskuCF?.GlobalGeneralTax)
|
|
.SetIf(isDetailChanged, osku => osku.JdZhiFuYouHui, oskuCF?.JdZhiFuYouHui)
|
|
.SetIf(isDetailChanged, osku => osku.JingDou, oskuCF?.JingDou)
|
|
.SetIf(isDetailChanged, osku => osku.JingQuan, oskuCF?.JingQuan)
|
|
.SetIf(isDetailChanged, osku => osku.JingXiangLiJin, oskuCF?.JingXiangLiJin)
|
|
.SetIf(isDetailChanged, osku => osku.LiJinYouHui, oskuCF?.LiJinYouHui)
|
|
.SetIf(isDetailChanged, osku => osku.LuoDiPeiService, oskuCF?.LuoDiPeiService)
|
|
.SetIf(isDetailChanged, osku => osku.ManJian, oskuCF?.ManJian)
|
|
.SetIf(isDetailChanged, osku => osku.PingTaiChengDanYouHuiQuan, oskuCF?.PingTaiChengDanYouHuiQuan)
|
|
.SetIf(isDetailChanged, osku => osku.Plus95, oskuCF?.Plus95)
|
|
.SetIf(isDetailChanged, osku => osku.PromotionDiscount, oskuCF?.PromotionDiscount)
|
|
.SetIf(isDetailChanged, osku => osku.RemoteFee, oskuCF?.RemoteFee)
|
|
.SetIf(isDetailChanged, osku => osku.SuperRedEnvelope, oskuCF?.SuperRedEnvelope)
|
|
.SetIf(isDetailChanged, osku => osku.TaxFee, oskuCF?.TaxFee)
|
|
.SetIf(isDetailChanged, osku => osku.TuiHuanHuoWuYou, oskuCF?.TuiHuanHuoWuYou)
|
|
.SetIf(isDetailChanged, osku => osku.VenderFee, oskuCF?.VenderFee)
|
|
.SetIf(isDetailChanged, osku => osku.XianPinLeiDongQuan, oskuCF?.XianPinLeiDongQuan)
|
|
.SetIf(isDetailChanged, osku => osku.XianPinLeiJingQuan, oskuCF?.XianPinLeiJingQuan)
|
|
.SetIf(isDetailChanged, osku => osku.ZhiFuYingXiaoYouHui, oskuCF?.ZhiFuYingXiaoYouHui);
|
|
;
|
|
updateOrderSkuDictionary.Add(skuUpdateKey, update);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 收货人信息
|
|
if (dbOrderConsigneeList.FirstOrDefault(oc => oc.OrderId == orderId) == null)
|
|
{
|
|
var orderConsignee = new OrderConsignee()
|
|
{
|
|
OrderId = orderId,
|
|
City = orderJToken["consigneeInfo"].Value<string>("city"),
|
|
Province = orderJToken["consigneeInfo"].Value<string>("province"),
|
|
County = orderJToken["consigneeInfo"].Value<string>("county"),
|
|
Town = orderJToken["consigneeInfo"].Value<string>("town"),
|
|
IsDecode = false,
|
|
CreateTime = DateTime.Now
|
|
};
|
|
insertOrderConsigneeList.Add(orderConsignee);
|
|
}
|
|
#endregion
|
|
|
|
//#region 订单优惠
|
|
|
|
//var orderCouponJArray = (JArray)orderJToken["couponDetailList"];
|
|
//if (orderCouponJArray.HasValues)
|
|
//{
|
|
// foreach (var orderCouponJToken in orderCouponJArray)
|
|
// {
|
|
// var couponType = orderCouponJToken.Value<string>("couponType");
|
|
// if (string.IsNullOrEmpty(couponType))
|
|
// continue;
|
|
// //dbOrder.PreferentialAmount += orderCouponJToken.Value<decimal>("couponPrice");
|
|
// preferentialAmount += orderCouponJToken.Value<decimal>("couponPrice");
|
|
// if (!dbOrderCouponList.Any(oc => oc.OrderId == orderId))
|
|
// {
|
|
// insertOrderCouponList.Add(new OrderCoupon()
|
|
// {
|
|
// Id = idGenerator.NewLong(),
|
|
// SkuId = orderCouponJToken.Value<string>("skuId"),
|
|
// OrderId = orderId,
|
|
// CreateTime = DateTime.Now,
|
|
// CouponType = couponType,
|
|
// CouponPrice = orderCouponJToken.Value<decimal>("couponPrice")
|
|
// });
|
|
// }
|
|
// }
|
|
//}
|
|
//#endregion
|
|
|
|
#region 订单状态转换
|
|
var orderState = ConvertOrderState(orderJToken, dbOrder.StorageType);
|
|
#endregion
|
|
|
|
#region 取消订单恢复库存
|
|
if (orderState == Enums.OrderState.已取消 &&
|
|
!isNewOrder &&
|
|
dbOrder.OrderState != Enums.OrderState.已取消 &&
|
|
dbOrder.StorageType != Enums.StorageType.SD &&
|
|
dbOrder.StorageType != Enums.StorageType.代发)
|
|
{
|
|
var currentOrderCostDetailList = dbOrderCostDetailList.Where(ocd => ocd.OrderId == orderId);
|
|
if (currentOrderCostDetailList.Count() > 0)
|
|
{
|
|
foreach (var orderCostDetail in currentOrderCostDetailList)
|
|
{
|
|
var updateSql = fsql.Update<PurchaseOrder>(orderCostDetail.PurchaseOrderPKId)
|
|
.Set(po => po.RemainingQuantity + orderCostDetail.DeductionQuantity);
|
|
updatePurchaseOrderList.Add(updateSql);
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 扣减库存, 计算成本
|
|
if (dbOrder.StorageType != null &&
|
|
dbOrder.StorageType != Enums.StorageType.代发 &&
|
|
orderState != null &&
|
|
orderState != Enums.OrderState.待付款 &&
|
|
orderState != Enums.OrderState.已取消)
|
|
{
|
|
var orderCost = dbOrderCostList.FirstOrDefault(oc => oc.OrderId == dbOrder.Id);
|
|
if (orderCost == null && orderSellerPrice > 0M)
|
|
{
|
|
if (isNewOrder && dbOrder.StorageType == Enums.StorageType.SD && sDCalculationCostRequest != null)
|
|
{
|
|
//检查SD埋点
|
|
if (sDCalculationCostRequest.PlatformCommissionRatio == 0M)
|
|
sDCalculationCostRequest.PlatformCommissionRatio = 0.05M;
|
|
orderCost = new OrderCost()
|
|
{
|
|
OrderId = sDCalculationCostRequest.OrderId,
|
|
PlatformCommissionRatio = sDCalculationCostRequest.PlatformCommissionRatio,
|
|
PreferentialAmount = (dbOrderTotal?.TotalPingTaiChengDanYouHuiQuan) ?? dbOrder.PreferentialAmount,
|
|
Profit = 0,
|
|
DeliveryExpressFreight = sDCalculationCostRequest.DeliveryExpressFreight,
|
|
CreateTime = DateTime.Now,
|
|
IsManualEdited = true,
|
|
SDCommissionAmount = sDCalculationCostRequest.SDCommissionAmount,
|
|
SDOrderAmount = sDCalculationCostRequest.SDOrderAmount
|
|
};
|
|
orderCost.CalculationSDOrderProfitAndCost(dbOrder, null);
|
|
insertOrderCostList.Add(orderCost);
|
|
}
|
|
else if (!fsql.Select<OrderCost>(dbOrder.Id).Any()) //再查询一次数据库,以防同步开始执行后被人为操作扣减库存,造成重复扣减库存
|
|
{
|
|
var orderSkuJArray = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value<decimal>("jdPrice") != 0M);
|
|
if (orderSkuJArray != null && orderSkuJArray.Count() > 0)
|
|
{
|
|
var orderCostPurchaseAmount = 0M;
|
|
var orderDeliveryExpressFreight = 0M; //发货总运费,sku购买数量第二个开始半价
|
|
|
|
//var avgPreferential = preferentialAmount / orderSkuJArray.Count();
|
|
|
|
#region 扣减库存
|
|
foreach (var orderSkuJToken in orderSkuJArray)
|
|
{
|
|
var orderSkuId = orderSkuJToken.Value<string>("skuId");
|
|
var itemTotal = orderSkuJToken.Value<int>("itemTotal"); //sku购买数量
|
|
|
|
#region sku拆分明细
|
|
decimal? skuShouldPay = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.ShouldPay;
|
|
if (skuShouldPay == null)
|
|
skuShouldPay = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.ShouldPay;
|
|
if (skuShouldPay == null)
|
|
skuShouldPay = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.ShouldPay;
|
|
|
|
|
|
decimal? pingtaiCoupon = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId &&
|
|
x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan;
|
|
if (pingtaiCoupon == null)
|
|
pingtaiCoupon = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan;
|
|
if (pingtaiCoupon == null)
|
|
pingtaiCoupon = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan;
|
|
|
|
decimal? venderFee = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId &&
|
|
x.SkuId == orderSkuId)?.VenderFee;
|
|
if (venderFee == null)
|
|
venderFee = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.VenderFee;
|
|
if (venderFee == null)
|
|
venderFee = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.VenderFee;
|
|
#endregion
|
|
|
|
//var itemPrice = orderSkuJToken.Value<decimal>("jdPrice"); //sku单价
|
|
var isReduceMultiTimes = false; //是否多次扣减库存
|
|
while (itemTotal != 0)
|
|
{
|
|
var purchaseOrder = dbPurchaseOrderList.FirstOrDefault(po => po.StorageType == dbOrder.StorageType &&
|
|
po.RemainingQuantity != 0 &&
|
|
po.SkuId == orderSkuId);
|
|
if (purchaseOrder == null)
|
|
break; //没有库存了
|
|
|
|
//本次扣减量
|
|
var deductionQuantity = purchaseOrder.RemainingQuantity >= itemTotal ? itemTotal : purchaseOrder.RemainingQuantity;
|
|
//var deductionQuantity = itemTotal;
|
|
//本次扣减量的采购成本
|
|
var currentPurchaseAmount = purchaseOrder.UnitCost * deductionQuantity;
|
|
//本次扣减量的发货运费
|
|
var currentSkuDeliveryFreight = isReduceMultiTimes ?
|
|
(purchaseOrder.SingleDeliveryFreight / 2 * deductionQuantity) :
|
|
(purchaseOrder.SingleDeliveryFreight + purchaseOrder.SingleDeliveryFreight / 2 * (deductionQuantity - 1));
|
|
|
|
purchaseOrder.RemainingQuantity -= deductionQuantity;
|
|
itemTotal -= deductionQuantity;
|
|
|
|
//累计采购成本
|
|
orderCostPurchaseAmount += currentPurchaseAmount;
|
|
//累计发货运费(销售运费)
|
|
orderDeliveryExpressFreight += currentSkuDeliveryFreight;
|
|
isReduceMultiTimes = true;
|
|
|
|
var updateSql = fsql.Update<PurchaseOrder>(purchaseOrder.Id).Set(po => po.RemainingQuantity - deductionQuantity);
|
|
updatePurchaseOrderList.Add(updateSql);
|
|
|
|
var orderCostDetail = new OrderCostDetail()
|
|
{
|
|
Id = idGenerator.NewLong(),
|
|
OrderId = orderId,
|
|
ProductId = orderSkuJToken.Value<string>("wareId"),
|
|
SkuId = orderSkuId,
|
|
CreateTime = DateTime.Now,
|
|
PurchaseOrderPKId = purchaseOrder.Id,
|
|
//UnitCost = purchaseOrder.UnitCost,
|
|
DeductionQuantity = deductionQuantity,
|
|
DeliveryExpressFreight = currentSkuDeliveryFreight,
|
|
//TotalCost = currentPurchaseAmount,
|
|
ConsumableAmount = purchaseOrder.SingleConsumableAmount * deductionQuantity,
|
|
FirstFreight = purchaseOrder.SingleFirstFreight * deductionQuantity,
|
|
//OperationAmount = purchaseOrder.SingleOperationAmount * deductionQuantity,
|
|
InStorageAmount = purchaseOrder.SingleInStorageAmount * deductionQuantity,
|
|
OutStorageAmount = purchaseOrder.SingleOutStorageAmount * deductionQuantity,
|
|
PurchaseFreight = purchaseOrder.SingleFreight * deductionQuantity,
|
|
SkuAmount = purchaseOrder.SingleSkuAmount * deductionQuantity,
|
|
StorageAmount = purchaseOrder.SingleStorageAmount * deductionQuantity,
|
|
IsEnabled = true
|
|
};
|
|
|
|
//orderCostDetail.SkuGrossProfit = itemPrice * deductionQuantity - avgPreferential -
|
|
// (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) -
|
|
// itemPrice * deductionQuantity * platformCommissionRatio;
|
|
|
|
//var koudian = (skuShouldPay.Value - venderFee.Value) * deductionQuantity * platformCommissionRatio;
|
|
//orderCostDetail.SkuGrossProfit = (skuShouldPay.Value + pingtaiCoupon.Value) * deductionQuantity -
|
|
// orderCostDetail.TotalCost - orderCostDetail.DeliveryExpressFreight -
|
|
// koudian;
|
|
|
|
orderCostDetail.CalculationSkuGrossProfit(skuShouldPay ?? 0M, pingtaiCoupon ?? 0M, venderFee ?? 0M, platformCommissionRatio);
|
|
insertOrderCostDetailList.Add(orderCostDetail);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 计算成本
|
|
orderCost = new OrderCost()
|
|
{
|
|
OrderId = orderId,
|
|
PlatformCommissionRatio = platformCommissionRatio,
|
|
PreferentialAmount = (dbOrderTotal?.TotalPingTaiChengDanYouHuiQuan) ?? dbOrder.PreferentialAmount,
|
|
Profit = 0,
|
|
PurchaseAmount = orderCostPurchaseAmount,
|
|
DeliveryExpressFreight = orderDeliveryExpressFreight,
|
|
CreateTime = DateTime.Now
|
|
};
|
|
if (dbOrder.OrderTotalPrice != 0)
|
|
orderCost.CalculationOrderProfitAndCost(dbOrder, null);
|
|
else
|
|
orderCost.CalculationOrderProfitAndCost(dbOrder.OrderPayment, dbOrder.PreferentialAmount, dbOrder.FreightPrice, null);
|
|
|
|
insertOrderCostList.Add(orderCost);
|
|
#endregion
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 检查订单信息是否变化
|
|
if (isNewOrder)
|
|
{
|
|
dbOrder.OrderState = orderState;
|
|
//dbOrder.PreferentialAmount = preferentialAmount;
|
|
}
|
|
else if ((orderState != null && orderState != dbOrder.OrderState) ||
|
|
buyerRemark != dbOrder.BuyerRemark ||
|
|
venderRemark != dbOrder.VenderRemark ||
|
|
modifyTime != dbOrder.ModifyTime ||
|
|
endTime != dbOrder.EndTime ||
|
|
waybillNo != dbOrder.WaybillNo ||
|
|
freightPrice != dbOrder.FreightPrice ||
|
|
orderPayment != dbOrder.OrderPayment ||
|
|
sellerPreferentialAmount != dbOrder.SellerPreferentialAmount ||
|
|
orderSellerPrice != dbOrder.OrderSellerPrice ||
|
|
(orderSellerPrice > 0M && dbOrder.IsGift) ||
|
|
orderTotalPrice != dbOrder.OrderTotalPrice ||
|
|
storeOrder != dbOrder.StoreOrder ||
|
|
storeId != dbOrder.StoreId ||
|
|
(dbOrderTotal != null && dbOrderTotal.TotalPingTaiChengDanYouHuiQuan != dbOrder.PreferentialAmount))
|
|
{
|
|
var updateSql = fsql.Update<Order>(orderId).SetIf(orderState != null && orderState != dbOrder.OrderState, o => o.OrderState, orderState)
|
|
.SetIf(buyerRemark != dbOrder.BuyerRemark, o => o.BuyerRemark, buyerRemark)
|
|
.SetIf(venderRemark != dbOrder.VenderRemark, o => o.VenderRemark, venderRemark)
|
|
.SetIf(modifyTime != dbOrder.ModifyTime, o => o.ModifyTime, modifyTime)
|
|
.SetIf(endTime != dbOrder.EndTime, o => o.EndTime, modifyTime)
|
|
.SetIf(waybillNo != dbOrder.WaybillNo, o => o.WaybillNo, waybillNo)
|
|
.SetIf(freightPrice != dbOrder.FreightPrice, o => o.FreightPrice, freightPrice)
|
|
.SetIf(orderPayment != dbOrder.OrderPayment, o => o.OrderPayment, orderPayment)
|
|
.SetIf(sellerPreferentialAmount != dbOrder.SellerPreferentialAmount, o => o.SellerPreferentialAmount, sellerPreferentialAmount)
|
|
.SetIf(orderSellerPrice != dbOrder.OrderSellerPrice, o => o.OrderSellerPrice, orderSellerPrice)
|
|
.SetIf(orderTotalPrice != dbOrder.OrderTotalPrice, o => o.OrderTotalPrice, orderTotalPrice)
|
|
.SetIf(orderSellerPrice > 0M && dbOrder.IsGift == true, o => o.IsGift, false)
|
|
.SetIf(storeOrder != dbOrder.StoreOrder, o => o.StoreOrder, storeOrder)
|
|
.SetIf(storeOrder != dbOrder.StoreOrder, o => o.StorageType, storageType)
|
|
.SetIf(dbOrderTotal != null && dbOrderTotal.TotalPingTaiChengDanYouHuiQuan != dbOrder.PreferentialAmount, o => o.PreferentialAmount, dbOrderTotal.TotalPingTaiChengDanYouHuiQuan)
|
|
.SetIf(storeId != dbOrder.StoreId, o => o.StoreId, storeId);
|
|
updateOrderList.Add(updateSql);
|
|
}
|
|
#endregion
|
|
|
|
#region 删除SD埋点
|
|
try
|
|
{
|
|
if (sDCalculationCostRequest != null)
|
|
memoryCache.Remove(orderId);
|
|
}
|
|
catch { }
|
|
#endregion
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
nLogManager.Default().Error(ex, $"SyncOrder OrderLevel Error, OrderId:{orderId}, ShopId:{shopId}");
|
|
}
|
|
}
|
|
|
|
#region 补齐sku logo
|
|
if (insertOrderSkuList.Count() > 0)
|
|
{
|
|
foreach (var orderSku in insertOrderSkuList)
|
|
{
|
|
if (!orderSkuIds.Contains(orderSku.SkuId))
|
|
orderSkuIds.Add(orderSku.SkuId);
|
|
}
|
|
|
|
var orderSkuRequestCount = (orderSkuIds.Count() - 1) / 50 + 1; //sku最多一次请求50条
|
|
for (var i = 0; i < orderSkuRequestCount; i++)
|
|
{
|
|
var orderSkuIdString = string.Join(",", orderSkuIds.Skip(i * 50).Take(50));
|
|
var skuHttpResult = restApiService.SendRequest(relayAPIHost, "Api/PlatformSDK/GetSimpleProductSkuList", new SearchProductSkuRequest()
|
|
{
|
|
AppKey = appKey,
|
|
AppSecret = appSecret,
|
|
AppToken = appToken,
|
|
Platform = Enums.Platform.京东,
|
|
Sku = orderSkuIdString
|
|
}, GetYunDingRequestHeader(), HttpMethod.Post);
|
|
if (skuHttpResult.StatusCode != System.Net.HttpStatusCode.OK)
|
|
continue;
|
|
var skuResponse = JsonConvert.DeserializeObject<ApiResponse<IList<SimpleProductSkuResponse>>>(skuHttpResult.Content);
|
|
if (!skuResponse.Success)
|
|
continue;
|
|
foreach (var sku in skuResponse.Data)
|
|
{
|
|
var insertSkus = insertOrderSkuList.Where(orderSku => orderSku.SkuId == sku.Id);
|
|
foreach (var insertSku in insertSkus) { insertSku.Logo = sku.Logo; }
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 需要清理的数据
|
|
var orderCouponDetailOrderIdList = insertOrderTotalInfoList.Select(x => x.Id).ToList();
|
|
#endregion
|
|
|
|
fsql.Transaction(() =>
|
|
{
|
|
if (orderCouponDetailOrderIdList.Count() > 0)
|
|
{
|
|
fsql.Delete<OrderTotalInfo>(orderCouponDetailOrderIdList).ExecuteAffrows();
|
|
fsql.Delete<OrderCoupon_New>().Where(on => orderCouponDetailOrderIdList.Contains(on.OrderId)).ExecuteAffrows();
|
|
fsql.Delete<OrderPromotion>().Where(op => orderCouponDetailOrderIdList.Contains(op.OrderId)).ExecuteAffrows();
|
|
}
|
|
if (insertOrderTotalInfoList.Count() > 0)
|
|
fsql.Insert(insertOrderTotalInfoList).ExecuteAffrows();
|
|
if (insertOrderCouponNewList.Count() > 0)
|
|
fsql.Insert(insertOrderCouponNewList).ExecuteAffrows();
|
|
if (insertOrderPromotionList.Count() > 0)
|
|
fsql.Insert(insertOrderPromotionList).ExecuteAffrows();
|
|
|
|
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 (insertOrderCostList.Count() > 0)
|
|
fsql.Insert(insertOrderCostList).ExecuteAffrows();
|
|
if (insertOrderCostDetailList.Count() > 0)
|
|
fsql.Insert(insertOrderCostDetailList).ExecuteAffrows();
|
|
if (insertOrderCouponList.Count() > 0)
|
|
fsql.Insert(insertOrderCouponList).ExecuteAffrows();
|
|
|
|
if (updatePurchaseOrderList.Count() > 0)
|
|
{
|
|
foreach (var update in updatePurchaseOrderList)
|
|
update.ExecuteAffrows();
|
|
}
|
|
|
|
if (updateOrderList.Count() > 0)
|
|
{
|
|
foreach (var update in updateOrderList)
|
|
update.ExecuteAffrows();
|
|
}
|
|
|
|
if (updateOrderSkuDictionary.Keys.Count() > 0)
|
|
{
|
|
foreach (var update in updateOrderSkuDictionary)
|
|
update.Value.ExecuteAffrows();
|
|
}
|
|
});
|
|
}
|
|
|
|
private Enums.StorageType? ConvertStoreOrder(string storeOrder)
|
|
{
|
|
if (string.IsNullOrEmpty(storeOrder))
|
|
return null;
|
|
if (storeOrder.Contains("京仓"))
|
|
return Enums.StorageType.京仓;
|
|
else if (storeOrder.Contains("云仓"))
|
|
return Enums.StorageType.云仓;
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 同步所有店铺的订单
|
|
/// </summary>
|
|
public void SyncAllShopOrder()
|
|
{
|
|
var shopList = venderBusiness.GetShopList(platform: Enums.Platform.京东);
|
|
foreach (var shop in shopList)
|
|
{
|
|
Task.Factory.StartNew(() => SyncOrder(shop, string.Empty, isAuto: true), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 转换订单状态
|
|
/// </summary>
|
|
/// <param name="orderJToken"></param>
|
|
/// <param name="storageType"></param>
|
|
/// <returns></returns>
|
|
private Enums.OrderState? ConvertOrderState(JToken orderJToken, Enums.StorageType? storageType = null)
|
|
{
|
|
var jdOrderState = orderJToken.Value<string>("orderState");
|
|
Enums.OrderState? orderState = null;
|
|
|
|
#region SOP状态翻译
|
|
if (jdOrderState.Equals("NOT_PAY")) //未付款
|
|
{
|
|
orderState = Enums.OrderState.待付款;
|
|
}
|
|
else if (jdOrderState.Equals("WAIT_SELLER_STOCK_OUT")) //等待出库
|
|
{
|
|
orderState = Enums.OrderState.等待采购;
|
|
if (storageType != null)
|
|
orderState = Enums.OrderState.待出库;
|
|
}
|
|
else if (jdOrderState.Equals("WAIT_GOODS_RECEIVE_CONFIRM"))
|
|
{
|
|
orderState = Enums.OrderState.待收货;
|
|
}
|
|
else if (jdOrderState.Equals("FINISHED_L"))
|
|
{
|
|
orderState = Enums.OrderState.已完成;
|
|
}
|
|
else if (jdOrderState.Equals("LOCKED"))
|
|
{
|
|
orderState = Enums.OrderState.锁定;
|
|
}
|
|
else if (jdOrderState.Equals("TRADE_CANCELED"))
|
|
{
|
|
orderState = Enums.OrderState.已取消;
|
|
}
|
|
else if (jdOrderState.Equals("POP_ORDER_PAUSE") || jdOrderState.Equals("PAUSE"))
|
|
{
|
|
orderState = Enums.OrderState.暂停;
|
|
}
|
|
#endregion
|
|
|
|
#region FBP状态翻译
|
|
else if (jdOrderState.Equals("DengDaiDaYin") || jdOrderState.Equals("DengDaiChuKu") || jdOrderState.Equals("DengDaiDaBao") || jdOrderState.Equals("DengDaiFaHuo"))
|
|
{
|
|
orderState = Enums.OrderState.待出库;
|
|
}
|
|
else if (jdOrderState.Equals("DengDaiQueRenShouHuo"))
|
|
{
|
|
orderState = Enums.OrderState.待收货;
|
|
}
|
|
else if (jdOrderState.Equals("WanCheng"))
|
|
{
|
|
orderState = Enums.OrderState.已完成;
|
|
}
|
|
else if (jdOrderState.Equals("SuoDing") || jdOrderState.Equals("LOCKED"))
|
|
{
|
|
orderState = Enums.OrderState.锁定;
|
|
}
|
|
else if (jdOrderState.Equals("TRADE_CANCELED"))
|
|
{
|
|
orderState = Enums.OrderState.已取消;
|
|
}
|
|
#endregion
|
|
|
|
return orderState;
|
|
}
|
|
|
|
public void OrderDelete(long ShopId, IList<string> orderIds)
|
|
{
|
|
fsql.Transaction(() =>
|
|
{
|
|
fsql.Delete<Order>().Where(o => o.ShopId == ShopId && orderIds.Contains(o.Id)).ExecuteAffrows();
|
|
fsql.Delete<OrderSku>().Where(osku => orderIds.Contains(osku.OrderId)).ExecuteAffrows();
|
|
fsql.Delete<OrderCostDetail>().Where(ocd => orderIds.Contains(ocd.OrderId)).ExecuteAffrows();
|
|
fsql.Delete<OrderCost>().Where(oc => orderIds.Contains(oc.OrderId)).ExecuteAffrows();
|
|
fsql.Delete<OrderDropShipping>().Where(ods => orderIds.Contains(ods.OrderId)).ExecuteAffrows();
|
|
fsql.Delete<OrderConsignee>().Where(ocs => orderIds.Contains(ocs.OrderId)).ExecuteAffrows();
|
|
fsql.Delete<OrderCoupon>().Where(oc => orderIds.Contains(oc.OrderId)).ExecuteAffrows();
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 接收订单推送
|
|
/// </summary>
|
|
/// <param name="request"></param>
|
|
public void OrderPublish(OrderPublishRequest request)
|
|
{
|
|
nLogManager.Default().Info($"订单推送-{JsonConvert.SerializeObject(request)}");
|
|
|
|
if (request.orderStatus != "TRADE_CREATED")
|
|
return;
|
|
var shop = venderBusiness.GetShopByVenderId(request.venderId);
|
|
if (shop == null)
|
|
return;
|
|
|
|
IInsert<WaitPayOrder> insertWaitPayOrder = null;
|
|
IInsert<JdPublishOrder> insertJdPublishOrder = null;
|
|
|
|
{
|
|
var isExists = fsql.Select<WaitPayOrder>(request.orderId).Any();
|
|
if (!isExists)
|
|
{
|
|
insertWaitPayOrder = fsql.Insert(new WaitPayOrder()
|
|
{
|
|
CreateTime = DateTime.Now,
|
|
Id = request.orderId,
|
|
ShopId = long.Parse(shop.ShopId)
|
|
});
|
|
}
|
|
}
|
|
|
|
{
|
|
var isExists = fsql.Select<JdPublishOrder>(request.orderId).Any();
|
|
if (!isExists)
|
|
{
|
|
insertJdPublishOrder = fsql.Insert(new JdPublishOrder()
|
|
{
|
|
CreateTime = DateTime.Now,
|
|
Id = request.orderId,
|
|
ShopId = long.Parse(shop.ShopId)
|
|
});
|
|
}
|
|
}
|
|
if (insertWaitPayOrder != null || insertJdPublishOrder != null)
|
|
{
|
|
fsql.Transaction(() =>
|
|
{
|
|
insertWaitPayOrder?.ExecuteAffrows();
|
|
insertJdPublishOrder?.ExecuteAffrows();
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
#region 同步暂停订单
|
|
public void CheckJDPauseOrder(long? shopId)
|
|
{
|
|
var shopList = venderBusiness.GetShopList(shopId, platform: Enums.Platform.京东);
|
|
var shopIds = shopList.Select(s => long.Parse(s.ShopId)).ToList();
|
|
|
|
var deleteRow = fsql.Select<WaitPayOrder>().Where(wo => shopIds.Contains(wo.ShopId.Value))
|
|
.Where(wo => fsql.Select<Order>().Where(o => o.Id == wo.Id).Any())
|
|
.ToDelete()
|
|
.ExecuteAffrows();
|
|
|
|
|
|
var waitPayOrderList = fsql.Select<WaitPayOrder>().Where(wo => shopIds.Contains(wo.ShopId.Value)).ToList();
|
|
if (waitPayOrderList.Count() == 0)
|
|
return;
|
|
|
|
foreach (var shop in shopList)
|
|
{
|
|
var currentWaitPayOrderList = waitPayOrderList.Where(wo => wo.ShopId == long.Parse(shop.ShopId)).ToList();
|
|
if (currentWaitPayOrderList.Count() > 0)
|
|
{
|
|
Task.Factory.StartNew(() => CheckJDPauseOrder(shop, currentWaitPayOrderList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void CheckJDPauseOrder(ShopResponse shop, IList<WaitPayOrder> waitPayOrderList)
|
|
{
|
|
foreach (var w in waitPayOrderList)
|
|
{
|
|
SyncOrder(shop, w.Id);
|
|
}
|
|
}
|
|
|
|
public void DeleteTimeOutWaitPayOrder()
|
|
{
|
|
IDelete<WaitPayOrder> deleteWaitPayOrder = null;
|
|
IDelete<JdPublishOrder> deleteJdPublishOrder = null;
|
|
|
|
{
|
|
var deleteTime = DateTime.Now.AddHours(-24);
|
|
deleteWaitPayOrder = fsql.Delete<WaitPayOrder>().Where(w => w.CreateTime <= deleteTime);
|
|
}
|
|
|
|
{
|
|
var deleteTime = DateTime.Now.AddDays(-90);
|
|
deleteJdPublishOrder = fsql.Delete<JdPublishOrder>().Where(w => w.CreateTime <= deleteTime);
|
|
}
|
|
|
|
fsql.Transaction(() =>
|
|
{
|
|
deleteWaitPayOrder?.ExecuteAffrows();
|
|
deleteJdPublishOrder?.ExecuteAffrows();
|
|
});
|
|
}
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// 修复订单Sku缺少的spu
|
|
/// </summary>
|
|
public void RepairOrderSkuProductId()
|
|
{
|
|
var date = DateTime.Now.AddHours(-2);
|
|
var waitRepairOrderSkuList = fsql.Select<OrderSku, ProductSku>()
|
|
.InnerJoin((osku, psku) => osku.SkuId == psku.Id)
|
|
.Where((osku, psku) => osku.CreateTime >= date && string.IsNullOrEmpty(osku.ProductId) && osku.Price > 0)
|
|
.ToList((osku, psku) => new
|
|
{
|
|
Id = osku.Id,
|
|
SkuId = osku.SkuId,
|
|
ProductId = psku.ProductId
|
|
});
|
|
if (waitRepairOrderSkuList.Count() == 0)
|
|
return;
|
|
|
|
var waitRepairOrderSkuGroupList = waitRepairOrderSkuList.GroupBy(s => s.ProductId);
|
|
|
|
fsql.Transaction(() =>
|
|
{
|
|
foreach (var group in waitRepairOrderSkuGroupList)
|
|
{
|
|
var orderSkuIds = group.Select(g => g.Id).ToList();
|
|
var productId = group.Key;
|
|
fsql.Update<OrderSku>(orderSkuIds).Set(osku => osku.ProductId, productId).ExecuteAffrows();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|