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

1375 lines
86 KiB

3 years ago
using BBWY.Common.Http;
using BBWY.Common.Models;
using BBWY.Server.Business.Extensions;
3 years ago
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;
3 years ago
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
2 years ago
using System.Threading;
3 years ago
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;
3 years ago
public OrderSyncBusiness(RestApiService restApiService,
IOptions<GlobalConfig> options,
NLogManager nLogManager,
3 years ago
IFreeSql fsql,
IIdGenerator idGenerator,
TaskSchedulerManager taskSchedulerManager,
VenderBusiness venderBusiness,
3 years ago
IMemoryCache memoryCache,
YunDingBusiness yunDingBusiness) : base(restApiService,
3 years ago
options,
nLogManager,
3 years ago
fsql,
3 years ago
idGenerator,
3 years ago
taskSchedulerManager,
3 years ago
venderBusiness,
yunDingBusiness)
3 years ago
{
this.memoryCache = memoryCache;
3 years ago
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"
};
3 years ago
}
/// <summary>
/// 手动同步订单
3 years ago
/// </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)
3 years ago
{
var shop = venderBusiness.GetShopByShopId(shopId.ToString());
SyncOrder(shop, orderId, startTime, endTime, isAuto: false, Enums.SortTimeType.StartTime);
3 years ago
}
2 years ago
/// <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);
}
2 years ago
public void SyncOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false, Enums.SortTimeType? sortTimeType = null)
3 years ago
{
try
{
2 years ago
if (shop.ShopName == "创艺家居日用专营店")
nLogManager.Default().Info($"订单同步 {shop.ShopName} isAuto {isAuto}");
3 years ago
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()
{
2 years ago
StartDate = startTime ?? DateTime.Now.AddHours(-3),
3 years ago
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);
3 years ago
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}");
3 years ago
}
}
public void SyncOrderByDate(SyncOrderByDateRequest syncOrderByDateRequest)
{
2 years ago
//if (fsql.Select<OrderSyncTask>().Where(ost => ost.ShopId == syncOrderByDateRequest.ShopId && ost.State == Enums.OrderSyncState.Running).Any())
// throw new BusinessException("存在未结束的同步任务,请稍后同步");
2 years ago
syncOrderByDateRequest.EndTime = syncOrderByDateRequest.EndTime.Date.AddDays(1).AddSeconds(-1);
if ((syncOrderByDateRequest.EndTime - syncOrderByDateRequest.StartTime).Days > 7)
throw new BusinessException("同步任务时差最长7天");
3 years ago
//var orderSyncTask = new OrderSyncTask()
//{
// Id = idGenerator.NewLong(),
// ShopId = syncOrderByDateRequest.ShopId,
// State = Enums.OrderSyncState.Running,
// SyncStartTime = syncOrderByDateRequest.StartTime,
// SyncEndTime = syncOrderByDateRequest.EndTime
//};
//fsql.Insert(orderSyncTask).ExecuteAffrows();
3 years ago
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);
3 years ago
}
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) { }
3 years ago
}, 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;
3 years ago
3 years ago
#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>();
2 years ago
List<OrderTotalInfo> insertOrderTotalInfoList = new List<OrderTotalInfo>();
List<OrderCoupon_New> insertOrderCouponNewList = new List<OrderCoupon_New>();
List<OrderPromotion> insertOrderPromotionList = new List<OrderPromotion>();
3 years ago
IList<IUpdate<Order>> updateOrderList = new List<IUpdate<Order>>();
2 years ago
Dictionary<string, IUpdate<OrderSku>> updateOrderSkuDictionary = new Dictionary<string, IUpdate<OrderSku>>();
3 years ago
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
3 years ago
var dbOrderList = fsql.Select<Order>().Where(o => interfaceOrderIdList.Contains(o.Id)).ToList(o => new Order
3 years ago
{
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
3 years ago
}); //数据库订单
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信息
3 years ago
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();
}
2 years ago
#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>();
2 years ago
#endregion
3 years ago
var orderSkuIds = new List<string>();
foreach (var orderJToken in validOrders)
3 years ago
{
3 years ago
var itemInfoList = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value<decimal>("jdPrice") != 0M);
foreach (var josku in itemInfoList)
3 years ago
{
3 years ago
var skuId = josku.Value<string>("skuId");
3 years ago
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(); //数据库采购单
3 years ago
orderSkuIds.Clear();
foreach (var orderJToken in validOrders)
3 years ago
{
var orderId = orderJToken.Value<string>("orderId");
try
{
if (insertOrderList.Any(o => o.Id == orderId))
continue;
var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == orderId);
2 years ago
var dbOrderTotal = dbOrderTotalList.FirstOrDefault(o => o.Id == orderId);
var isNewOrder = dbOrder == null;
SDCalculationCostRequest sDCalculationCostRequest = null; //SD信息埋点
#region 优惠券/促销/拆分明细
if (!dbOrderTotalList.Any(ot => ot.Id == orderId))
{
2 years ago
Thread.Sleep(2000);
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)
{
2 years ago
var jtoken = orderCouponDetailResponse.Data["jingdong_pop_order_queryCouponDetai_responce"]["couponDetailExternal"]["couponDetailVo"];
if (jtoken.Value<decimal>("totalShouldPay") > 0M ||
jtoken.Value<decimal>("totalSuperRedEnvelope") > 0M ||
jtoken.Value<decimal>("totalDongQuan") > 0M ||
jtoken.Value<decimal>("totalJingDou") > 0M ||
jtoken.Value<decimal>("totalXianPinLeiDongQuan") > 0M ||
jtoken.Value<decimal>("totalPingTaiChengDanYouHuiQuan") > 0M )
{
#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;
1 year ago
if (skuJArray != null && skuJArray.Count() > 0)
{
foreach (var oskuJtoken in skuJArray)
2 years ago
{
var skuDiscountInfoList = oskuJtoken["skuDiscountInfoList"] as JArray;
decimal? xianPinLeiDongQuan = 0M;
if (skuDiscountInfoList != null && skuDiscountInfoList.Count > 0)
2 years ago
{
foreach (var item1 in skuDiscountInfoList)
2 years ago
{
var discountTypeList = item1["discountTypeList"] as JArray;
if (discountTypeList != null && discountTypeList.Count() > 0)
2 years ago
{
foreach (var discountType in discountTypeList)
{
if (discountType.Value<int>("type") == 6)
xianPinLeiDongQuan += discountType.Value<decimal>("amount");
}
2 years ago
}
}
}
if (xianPinLeiDongQuan == 0M)
xianPinLeiDongQuan = oskuJtoken.Value<decimal>("xianPinLeiDongQuan");
2 years ago
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 = 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);
2 years ago
decimal? actualProductAmount = 0M;
decimal actualAmount = 0M; //实收金额
2 years ago
decimal? preferentialAmount = 0M;
decimal? pingtaiChengDanYouHuiQuan = 0M;
if (dbOrder == null)
{
var orderTotalInfo = insertOrderTotalInfoList.FirstOrDefault(x => x.Id == orderId);
2 years ago
//actualProductAmount = orderPayment - freightPrice + pingtaibutie;
pingtaiChengDanYouHuiQuan = (orderTotalInfo?.TotalPingTaiChengDanYouHuiQuan ?? 0M);
actualProductAmount = orderSellerPrice + pingtaiChengDanYouHuiQuan;
actualAmount = orderSellerPrice + freightPrice + (pingtaiChengDanYouHuiQuan ?? 0M);
//preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M) - freightPrice;
preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M);
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,
2 years ago
//PreferentialAmount = (orderTotalInfo?.TotalPingTaiChengDanYouHuiQuan) ?? 0M,
ActualProductAmount = actualProductAmount ?? 0M,
PreferentialAmount = preferentialAmount ?? 0M,
PingTaiChengDanYouHuiQuan = pingtaiChengDanYouHuiQuan ?? 0M
};
3 years ago
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;
}
3 years ago
var payType = orderJToken.Value<string>("payType");
if (payType.Contains("-"))
dbOrder.PayType = (Enums.PayType)Convert.ToInt32(payType.Substring(0, 1));
3 years ago
insertOrderList.Add(dbOrder);
#region OrderSku
var itemInfoList = orderJToken["itemInfoList"] as JArray;
foreach (var orderSkuJToken in itemInfoList)
3 years ago
{
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,
2 years ago
BaseDiscount = oskuCF?.BaseDiscount ?? 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
};
osku.ActualAmount = osku.ShouldPay +
osku.Balance +
osku.PingTaiChengDanYouHuiQuan +
osku.SuperRedEnvelope +
osku.XianPinLeiDongQuan +
osku.JingDou +
osku.DongQuan;
insertOrderSkuList.Add(osku);
//}
//CumulativeSkuDailySalesDetail(skuDailySalesDetailDictionary, dbOrder.StartTime.Value, shopId, skuId, wareId, jdPrice, itemTotal);
3 years ago
}
#endregion
3 years ago
}
else
{
2 years ago
var orderTotalInfo = insertOrderTotalInfoList.FirstOrDefault(x => x.Id == orderId);
if (orderTotalInfo == null)
orderTotalInfo = dbOrderTotalList.FirstOrDefault(x => x.Id == orderId);
pingtaiChengDanYouHuiQuan = (orderTotalInfo?.TotalPingTaiChengDanYouHuiQuan ?? 0M);
actualProductAmount = orderSellerPrice + pingtaiChengDanYouHuiQuan;
actualAmount = orderSellerPrice + freightPrice + (pingtaiChengDanYouHuiQuan ?? 0M);
//preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M) - freightPrice;
preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M);
2 years ago
//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);
1 year ago
var isDetailChanged = oskuCF != null && (dbOsku.ShouldPay != oskuCF.ShouldPay ||
dbOsku.Balance != oskuCF.Balance||
dbOsku.PingTaiChengDanYouHuiQuan != oskuCF.PingTaiChengDanYouHuiQuan||
dbOsku.SuperRedEnvelope != oskuCF.SuperRedEnvelope ||
dbOsku.XianPinLeiDongQuan != oskuCF.XianPinLeiDongQuan ||
dbOsku.JingDou != oskuCF.JingDou ||
dbOsku.DongQuan != oskuCF.DongQuan);
if (dbOsku.ProductId != wareId || isDetailChanged)
{
var skuActualAmount = oskuCF?.ShouldPay ?? 0M +
oskuCF?.Balance ?? 0M +
oskuCF?.PingTaiChengDanYouHuiQuan ?? 0M +
oskuCF?.SuperRedEnvelope ?? 0M +
oskuCF?.XianPinLeiDongQuan ?? 0M +
oskuCF?.JingDou ?? 0M +
oskuCF?.DongQuan ?? 0M;
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)
.SetIf(isDetailChanged && skuActualAmount != 0, osku => osku.ActualAmount, skuActualAmount);
;
updateOrderSkuDictionary.Add(skuUpdateKey, update);
}
}
}
}
#endregion
3 years ago
#region 收货人信息
if (dbOrderConsigneeList.FirstOrDefault(oc => oc.OrderId == orderId) == null)
3 years ago
{
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
3 years ago
#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.)
3 years ago
{
var currentOrderCostDetailList = dbOrderCostDetailList.Where(ocd => ocd.OrderId == orderId);
if (currentOrderCostDetailList.Count() > 0)
3 years ago
{
foreach (var orderCostDetail in currentOrderCostDetailList)
{
var updateSql = fsql.Update<PurchaseOrder>(orderCostDetail.PurchaseOrderPKId)
.Set(po => po.RemainingQuantity + orderCostDetail.DeductionQuantity);
updatePurchaseOrderList.Add(updateSql);
}
3 years ago
}
}
#endregion
#region 扣减库存, 计算成本
if (dbOrder.StorageType != null &&
dbOrder.StorageType != Enums.StorageType. &&
orderState != null &&
orderState != Enums.OrderState. &&
orderState != Enums.OrderState.)
3 years ago
{
bool checkOrderTotal = true;
if (dbOrder.StorageType == Enums.StorageType. || dbOrder.StorageType == Enums.StorageType.)
{
var orderTotalInfo = insertOrderTotalInfoList.FirstOrDefault(x => x.Id == dbOrder.Id);
if (orderTotalInfo == null)
orderTotalInfo = dbOrderTotalList.FirstOrDefault(x => x.Id == dbOrder.Id);
if (orderTotalInfo == null || orderTotalInfo.TotalShouldPay == 0M)
checkOrderTotal = false;
}
if (checkOrderTotal)
{
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)
3 years ago
{
var orderCostPurchaseAmount = 0M;
var orderDeliveryExpressFreight = 0M; //发货总运费,sku购买数量第二个开始半价
//var avgPreferential = preferentialAmount / orderSkuJArray.Count();
2 years ago
#region 扣减库存
foreach (var orderSkuJToken in orderSkuJArray)
3 years ago
{
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? skuPingTaiChengDanYouHuiQuan = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId &&
x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan;
if (skuPingTaiChengDanYouHuiQuan == null)
skuPingTaiChengDanYouHuiQuan = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan;
if (skuPingTaiChengDanYouHuiQuan == null)
skuPingTaiChengDanYouHuiQuan = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan;
decimal? skuSuperRedEnvelope = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId &&
x.SkuId == orderSkuId)?.SuperRedEnvelope;
if (skuSuperRedEnvelope == null)
skuSuperRedEnvelope = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.SuperRedEnvelope;
if (skuSuperRedEnvelope == null)
skuSuperRedEnvelope = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.SuperRedEnvelope;
decimal? skuXianPinLeiDongQuan = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId &&
x.SkuId == orderSkuId)?.XianPinLeiDongQuan;
if (skuXianPinLeiDongQuan == null)
skuXianPinLeiDongQuan = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.XianPinLeiDongQuan;
if (skuXianPinLeiDongQuan == null)
skuXianPinLeiDongQuan = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.XianPinLeiDongQuan;
decimal? skuVenderFee = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId &&
x.SkuId == orderSkuId)?.VenderFee;
if (skuVenderFee == null)
skuVenderFee = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.VenderFee;
if (skuVenderFee == null)
skuVenderFee = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.VenderFee;
decimal? skuJingDou = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId &&
x.SkuId == orderSkuId)?.JingDou;
if (skuJingDou == null)
skuJingDou = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.JingDou;
if (skuJingDou == null)
skuJingDou = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.JingDou;
decimal? skuDongQuan = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId &&
x.SkuId == orderSkuId)?.DongQuan;
if (skuDongQuan == null)
skuDongQuan = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.DongQuan;
if (skuDongQuan == null)
skuDongQuan = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.DongQuan;
decimal? skuBalnace = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId &&
x.SkuId == orderSkuId)?.Balance;
if (skuBalnace == null)
skuBalnace = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.Balance;
if (skuBalnace == null)
skuBalnace = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.Balance;
#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,
2 years ago
//StorageAmount = purchaseOrder.SingleStorageAmount * deductionQuantity,
PackagingLaborAmount = purchaseOrder.SinglePackagingLaborAmount * deductionQuantity,
IsEnabled = true,
IsEstimateCost = false
};
//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,
skuPingTaiChengDanYouHuiQuan ?? 0M,
skuSuperRedEnvelope ?? 0M,
skuXianPinLeiDongQuan ?? 0M,
skuVenderFee ?? 0M,
skuJingDou ?? 0M,
skuDongQuan ?? 0M,
skuBalnace ?? 0M,
platformCommissionRatio);
insertOrderCostDetailList.Add(orderCostDetail);
}
}
#endregion
3 years ago
#region 计算成本
//当具备订单明细成本的时候,才为其创建订单成本
if (insertOrderCostDetailList.Any(iocd => iocd.OrderId == orderId))
{
orderCost = new OrderCost()
{
OrderId = orderId,
PlatformCommissionRatio = platformCommissionRatio,
PreferentialAmount = (dbOrderTotal?.TotalPingTaiChengDanYouHuiQuan) ?? dbOrder.PreferentialAmount,
Profit = 0,
PurchaseAmount = orderCostPurchaseAmount,
DeliveryExpressFreight = orderDeliveryExpressFreight,
CreateTime = DateTime.Now,
IsEstimateCost = false
};
if (dbOrder.OrderTotalPrice != 0)
orderCost.CalculationOrderProfitAndCost(dbOrder, null);
else
orderCost.CalculationOrderProfitAndCost(actualAmount, null);
insertOrderCostList.Add(orderCost);
}
#endregion
}
}
3 years ago
}
}
}
#endregion
3 years ago
#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 ||
2 years ago
storeId != dbOrder.StoreId ||
2 years ago
actualProductAmount != dbOrder.ActualProductAmount ||
preferentialAmount != dbOrder.PreferentialAmount ||
pingtaiChengDanYouHuiQuan != dbOrder.PingTaiChengDanYouHuiQuan)
{
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)
2 years ago
.SetIf(storeId != dbOrder.StoreId, o => o.StoreId, storeId)
.SetIf(actualProductAmount != dbOrder.ActualProductAmount, o => o.ActualProductAmount, actualProductAmount)
.SetIf(preferentialAmount != dbOrder.PreferentialAmount, o => o.PreferentialAmount, preferentialAmount)
.SetIf(pingtaiChengDanYouHuiQuan != dbOrder.PingTaiChengDanYouHuiQuan, o => o.PingTaiChengDanYouHuiQuan, pingtaiChengDanYouHuiQuan);
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}");
}
3 years ago
}
#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);
3 years ago
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
3 years ago
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();
3 years ago
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)
3 years ago
fsql.Insert(insertOrderCostList).ExecuteAffrows();
if (insertOrderCostDetailList.Count() > 0)
fsql.Insert(insertOrderCostDetailList).ExecuteAffrows();
if (insertOrderCouponList.Count() > 0)
fsql.Insert(insertOrderCouponList).ExecuteAffrows();
3 years ago
3 years ago
if (updatePurchaseOrderList.Count() > 0)
{
foreach (var update in updatePurchaseOrderList)
update.ExecuteAffrows();
}
if (updateOrderList.Count() > 0)
{
foreach (var update in updateOrderList)
update.ExecuteAffrows();
}
2 years ago
if (updateOrderSkuDictionary.Keys.Count() > 0)
{
2 years ago
foreach (var update in updateOrderSkuDictionary)
update.Value.ExecuteAffrows();
}
3 years ago
});
}
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;
}
3 years ago
/// <summary>
/// 同步所有店铺的订单
/// </summary>
public void SyncAllShopOrder()
{
var shopList = venderBusiness.GetShopList(platform: Enums.Platform.);
2 years ago
//var a = shopList.FirstOrDefault(s => s.ShopName == "创艺家居日用专营店");
3 years ago
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => SyncOrder(shop, string.Empty, isAuto: true), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
3 years ago
}
}
3 years ago
2 years ago
public void SyncAllShopOrderByDate()
{
var shopList = venderBusiness.GetShopList(platform: Enums.Platform.);
var st = DateTime.Parse("2023-11-26 00:00:00");
var et = DateTime.Parse("2023-11-27 14:00:00");
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => SyncOrderByDate(new SyncOrderByDateRequest()
{
ShopId = long.Parse(shop.ShopId),
StartTime = st,
EndTime = et
}), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
}
}
3 years ago
/// <summary>
3 years ago
/// 转换订单状态
3 years ago
/// </summary>
3 years ago
/// <param name="orderJToken"></param>
/// <param name="storageType"></param>
/// <returns></returns>
private Enums.OrderState? ConvertOrderState(JToken orderJToken, Enums.StorageType? storageType = null)
3 years ago
{
3 years ago
var jdOrderState = orderJToken.Value<string>("orderState");
Enums.OrderState? orderState = null;
#region SOP状态翻译
if (jdOrderState.Equals("NOT_PAY")) //未付款
3 years ago
{
3 years ago
orderState = Enums.OrderState.;
3 years ago
}
3 years ago
else if (jdOrderState.Equals("WAIT_SELLER_STOCK_OUT")) //等待出库
3 years ago
{
3 years ago
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.;
3 years ago
}
3 years ago
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;
3 years ago
}
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)
{
2 years ago
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();
2 years ago
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)
2 years ago
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();
}
});
}
3 years ago
}
}