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

695 lines
38 KiB

using BBWY.Common.Extensions;
using BBWY.Common.Models;
using BBWY.Server.Model;
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto;
using FreeSql;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using QuanTan.SDK.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Yitter.IdGenerator;
namespace BBWY.Server.Business
{
public class PurchaseOrderBusiness : BaseBusiness, IDenpendency
{
private TaskSchedulerManager taskSchedulerManager;
private OrderBusiness orderBusiness;
private MDSBusiness mdsBusiness;
private VenderBusiness venderBusiness;
private LogisticsCompanyConverter logisticsCompanyConverter;
//private IDictionary<Enums.Platform, string> deliverySelfDic;
public PurchaseOrderBusiness(IFreeSql fsql,
NLogManager nLogManager,
IIdGenerator idGenerator,
IEnumerable<PlatformSDKBusiness> platformSDKBusinessList,
TaskSchedulerManager taskSchedulerManager,
OrderBusiness orderBusiness,
MDSBusiness mdsBusiness,
VenderBusiness venderBusiness,
LogisticsCompanyConverter logisticsCompanyConverter) : base(fsql, nLogManager, idGenerator, platformSDKBusinessList)
{
this.platformSDKBusinessList = platformSDKBusinessList;
this.taskSchedulerManager = taskSchedulerManager;
this.orderBusiness = orderBusiness;
this.mdsBusiness = mdsBusiness;
this.venderBusiness = venderBusiness;
this.logisticsCompanyConverter = logisticsCompanyConverter;
//deliverySelfDic = new Dictionary<Enums.Platform, string>()
//{
// {Enums.Platform.京东 , "1274"} //厂家自送
//};
}
public void AddPurchaseOrder(AddPurchaseOrderRequest addPurchaseOrderRequest)
{
if (string.IsNullOrEmpty(addPurchaseOrderRequest.PurchaseOrderId) ||
string.IsNullOrEmpty(addPurchaseOrderRequest.SkuId) ||
string.IsNullOrEmpty(addPurchaseOrderRequest.ProductId))
throw new BusinessException("缺少采购单必要信息");
if (fsql.Select<PurchaseOrder>().Where(po => po.SkuId == addPurchaseOrderRequest.SkuId &&
po.PurchaseOrderId == addPurchaseOrderRequest.PurchaseOrderId &&
po.StorageType == addPurchaseOrderRequest.StorageType).Any())
throw new BusinessException("同一个SkuId和同一种仓储类型中不能存在重复的采购单号");
var purchaseOrder = addPurchaseOrderRequest.Map<PurchaseOrder>();
purchaseOrder.Id = idGenerator.NewLong();
purchaseOrder.CreateTime = DateTime.Now;
if (purchaseOrder.StorageType == Enums.StorageType.)
{
if (purchaseOrder.SingleInStorageAmount == 0M)
purchaseOrder.SingleInStorageAmount = 0.2M;
if (purchaseOrder.SingleOutStorageAmount == 0M)
purchaseOrder.SingleOutStorageAmount = 2.8M;
if (purchaseOrder.SingleRefundInStorageAmount == 0M)
purchaseOrder.SingleRefundInStorageAmount = 2.8M;
}
if (purchaseOrder.StorageType == Enums.StorageType.)
{
if (purchaseOrder.SingleInStorageAmount == 0M)
purchaseOrder.SingleInStorageAmount = 0.2M;
if (purchaseOrder.SingleOutStorageAmount == 0M)
purchaseOrder.SingleOutStorageAmount = 0.9M;
if (purchaseOrder.SingleRefundInStorageAmount == 0M)
purchaseOrder.SingleRefundInStorageAmount = 1M;
}
fsql.Insert(purchaseOrder).ExecuteAffrows();
}
public void EditPurchaseOrder(EditPurchaseOrderRequest editPurchaseOrderRequest)
{
fsql.Update<PurchaseOrder>(editPurchaseOrderRequest.Id).Set(po => po.PurchaseQuantity, editPurchaseOrderRequest.PurchaseQuantity)
.Set(po => po.RemainingQuantity, editPurchaseOrderRequest.RemainingQuantity)
.Set(po => po.SingleSkuAmount, editPurchaseOrderRequest.SingleSkuAmount)
.Set(po => po.SingleFreight, editPurchaseOrderRequest.SingleFreight)
.Set(po => po.SingleFirstFreight, editPurchaseOrderRequest.SingleFirstFreight)
.Set(po => po.SingleInStorageAmount, editPurchaseOrderRequest.SingleInStorageAmount)
.Set(po => po.SingleOutStorageAmount, editPurchaseOrderRequest.SingleOutStorageAmount)
.Set(po => po.SingleRefundInStorageAmount, editPurchaseOrderRequest.SingleRefundInStorageAmount)
.Set(po => po.SingleConsumableAmount, editPurchaseOrderRequest.SingleConsumableAmount)
.Set(po => po.SingleStorageAmount, editPurchaseOrderRequest.SingleStorageAmount)
.Set(po => po.SingleDeliveryFreight, editPurchaseOrderRequest.SingleDeliveryFreight)
.ExecuteAffrows();
}
public IList<PurchaseOrderResponse> GetList(QueryPurchaseOrderRequest queryPurchaseOrderRequest)
{
return fsql.Select<PurchaseOrder>().Where(po => po.ShopId == queryPurchaseOrderRequest.ShopId &&
queryPurchaseOrderRequest.SkuIdList.Contains(po.SkuId) &&
po.StorageType == queryPurchaseOrderRequest.StorageType)
.ToList()
.Map<IList<PurchaseOrderResponse>>();
}
public void DeletePurchaseOrder(long id)
{
fsql.Delete<PurchaseOrder>(id).ExecuteAffrows();
}
public PreviewOrderResponse PreviewPurchaseOrder(PreviewOrderReuqest previewOrderReuqest)
{
return platformSDKBusinessList.FirstOrDefault(p => p.Platform == previewOrderReuqest.Platform).PreviewOrder(previewOrderReuqest);
}
public void NewFastCreateOrder(CreateOnlinePurchaseOrderRequest createOnlinePurchaseOrderRequest)
{
if (createOnlinePurchaseOrderRequest.PlatformCommissionRatio == 0M)
createOnlinePurchaseOrderRequest.PlatformCommissionRatio = 0.05M;
//if (createOnlinePurchaseOrderRequest.Platform != Enums.Platform.阿里巴巴)
// throw new NotImplementedException();
var dbOrder = fsql.Select<Order>(createOnlinePurchaseOrderRequest.OrderId).ToOne();
if (dbOrder == null)
throw new BusinessException("订单不存在");
if (dbOrder.OrderState != Enums.OrderState. && dbOrder.OrderState != Enums.OrderState.)
throw new BusinessException("只能为等待采购或待出库的订单进行采购");
var oldPourchaseIdList = fsql.Select<OrderCostDetail>().Where(ocd => ocd.OrderId == dbOrder.Id)
.ToList(ocd => ocd.PurchaseOrderPKId);
var deletePurchaseOrder = fsql.Delete<PurchaseOrder>().Where(po => oldPourchaseIdList.Contains(po.Id));
var deleteOrderCostDetail = fsql.Delete<OrderCostDetail>().Where(ocd => ocd.OrderId == dbOrder.Id);
var isRepurchase = fsql.Select<OrderCost>(dbOrder.Id).Any();
#region 合并重复的采购sku
var repeatPurchaseSkuGroups = createOnlinePurchaseOrderRequest.CargoParamList.GroupBy(p => p.SkuId).ToList();
foreach (var group in repeatPurchaseSkuGroups)
{
if (group.Count() > 1)
{
var repeatSkus = group.ToList();
foreach (var repeatSku in repeatSkus)
createOnlinePurchaseOrderRequest.CargoParamList.Remove(repeatSku);
createOnlinePurchaseOrderRequest.CargoParamList.Add(new CargoParamRequest()
{
BelongSkuId = repeatSkus[0].BelongSkuId,
ProductId = repeatSkus[0].ProductId,
SkuId = repeatSkus[0].SkuId,
SpecId = repeatSkus[0].SpecId,
Quantity = repeatSkus.Sum(s => s.Quantity)
});
}
}
#endregion
var orderSkus = fsql.Select<OrderSku>().Where(osku => osku.Price != 0 && osku.OrderId == createOnlinePurchaseOrderRequest.OrderId).ToList();
var orderSkuIds = orderSkus.Select(osku => osku.Id).ToList();
var createOrderResponse = platformSDKBusinessList.FirstOrDefault(p => p.Platform == createOnlinePurchaseOrderRequest.Platform)
.FastCreateOrder(createOnlinePurchaseOrderRequest);
var purchaseOrderSimpleInfo = platformSDKBusinessList.FirstOrDefault(p => p.Platform == createOnlinePurchaseOrderRequest.Platform).GetOrderSimpleInfo(new GetOrderInfoRequest()
{
AppKey = createOnlinePurchaseOrderRequest.AppKey,
AppSecret = createOnlinePurchaseOrderRequest.AppSecret,
AppToken = createOnlinePurchaseOrderRequest.AppToken,
OrderId = createOrderResponse.PurchaseOrderId,
Platform = createOnlinePurchaseOrderRequest.Platform
});
nLogManager.Default().Info($"NewFastCreateOrder\r\ncreateOnlinePurchaseOrderRequest\r\n{JsonConvert.SerializeObject(createOnlinePurchaseOrderRequest)}\r\npurchaseOrderSimpleInfo\r\n{JsonConvert.SerializeObject(purchaseOrderSimpleInfo)}");
List<PurchaseOrder> insertPurchaseOrders = new List<PurchaseOrder>();
List<PurchaseOrderDetail> insertPurchaseOrderDetails = new List<PurchaseOrderDetail>();
List<OrderCostDetail> insertOrderCostDetails = new List<OrderCostDetail>();
IInsert<OrderCost> insertOrderCost = null;
IUpdate<OrderCost> updateOrderCost = null;
IInsert<OrderDropShipping> insertOrderDropShipping = null;
var avgPreferential = dbOrder.PreferentialAmount / orderSkus.Count();
foreach (var orderSku in orderSkus)
{
#region 计算当前sku的采购成本和采购运费
var currentOrderSkuProductAmount = 0M; //采购成本
var currentOrderSkuCargoParamList = createOnlinePurchaseOrderRequest.CargoParamList.Where(p => p.BelongSkuId == orderSku.SkuId); //找当前skuId的采购skuId
currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => currentOrderSkuCargoParamList.Any(p1 => p1.SkuId == p.SkuId))
?.Sum(p => p.ProductAmount) ?? 0M;
var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / orderSkus.Count(); //采购运费(按sku数均分)
#endregion
#region 采购单
var purchaseOrder = new PurchaseOrder()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
ProductId = orderSku.ProductId,
SkuId = orderSku.SkuId,
PurchaseMethod = Enums.PurchaseMethod.线,
PurchaseOrderId = createOrderResponse.PurchaseOrderId,
PurchasePlatform = createOnlinePurchaseOrderRequest.Platform,
PurchaseQuantity = orderSku.ItemTotal.Value,
RemainingQuantity = 0,
ShopId = createOnlinePurchaseOrderRequest.ShopId,
SingleConsumableAmount = 0,
SingleDeliveryFreight = 0,
SingleFirstFreight = 0,
SingleStorageAmount = 0,
//SingleOperationAmount = 0,
SingleOutStorageAmount = 0,
SingleInStorageAmount = 0,
SingleSkuAmount = currentOrderSkuProductAmount / orderSku.ItemTotal.Value,
SingleFreight = currentOrderSkuFreightAmount / orderSku.ItemTotal.Value,
StorageType = Enums.StorageType.,
PurchaserId = createOnlinePurchaseOrderRequest.PurchaserId
};
insertPurchaseOrders.Add(purchaseOrder);
#endregion
#region 采购单明细
insertPurchaseOrderDetails.AddRange(currentOrderSkuCargoParamList.Select(p => new PurchaseOrderDetail()
{
Id = idGenerator.NewLong(),
OrderId = createOnlinePurchaseOrderRequest.OrderId,
PurchaseOrderPKId = purchaseOrder.Id,
PurchaseSkuId = p.SkuId,
SkuId = orderSku.SkuId
}));
#endregion
#region 成本明细
var orderCostDetail = new OrderCostDetail()
{
Id = idGenerator.NewLong(),
ConsumableAmount = 0,
CreateTime = DateTime.Now,
DeductionQuantity = orderSku.ItemTotal.Value,
DeliveryExpressFreight = 0,
FirstFreight = 0,
//OperationAmount = 0,
InStorageAmount = 0,
OutStorageAmount = 0,
OrderId = createOnlinePurchaseOrderRequest.OrderId,
ProductId = orderSku.ProductId,
PurchaseFreight = currentOrderSkuFreightAmount,
PurchaseOrderPKId = purchaseOrder.Id,
SkuAmount = currentOrderSkuProductAmount,
SkuId = orderSku.SkuId,
StorageAmount = 0,
//UnitCost = purchaseOrder.UnitCost,
//TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount//purchaseOrder.UnitCost * orderSku.ItemTotal.Value
};
orderCostDetail.SkuGrossProfit = orderSku.Price.Value * orderCostDetail.DeductionQuantity - avgPreferential - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - orderSku.Price.Value * orderCostDetail.DeductionQuantity * createOnlinePurchaseOrderRequest.PlatformCommissionRatio;
insertOrderCostDetails.Add(orderCostDetail);
#endregion
}
#region 订单成本
var orderCost = new OrderCost()
{
OrderId = createOnlinePurchaseOrderRequest.OrderId,
CreateTime = DateTime.Now,
DeliveryExpressFreight = 0,
IsManualEdited = false,
PlatformCommissionRatio = createOnlinePurchaseOrderRequest.PlatformCommissionRatio,
PreferentialAmount = dbOrder.PreferentialAmount,
SDCommissionAmount = 0,
SDOrderAmount = 0,
PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount
};
orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio;
orderCost.Profit = dbOrder.OrderSellerPrice +
dbOrder.FreightPrice -
orderCost.PurchaseAmount -
orderCost.DeliveryExpressFreight -
orderCost.PlatformCommissionAmount;
if (!isRepurchase)
{
insertOrderCost = fsql.Insert(orderCost);
}
else
{
updateOrderCost = fsql.Update<OrderCost>().SetSource(orderCost).IgnoreColumns(a => new { a.CreateTime });
}
#endregion
#region 代发信息
var orderDropShipping = new OrderDropShipping()
{
Id = idGenerator.NewLong(),
OrderId = createOnlinePurchaseOrderRequest.OrderId,
PurchaseAccountId = createOnlinePurchaseOrderRequest.PurchaseAccountId,
BuyerAccount = createOnlinePurchaseOrderRequest.BuyerAccount,
SellerAccount = createOnlinePurchaseOrderRequest.SellerAccount,
CreateTime = DateTime.Now,
DeliveryFreight = 0,
PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount,
SkuAmount = purchaseOrderSimpleInfo.ProductAmount,
PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount,
PurchaseOrderId = createOrderResponse.PurchaseOrderId,
PurchasePlatform = createOnlinePurchaseOrderRequest.Platform,
ShopId = dbOrder.ShopId
};
insertOrderDropShipping = fsql.Insert(orderDropShipping);
#endregion
fsql.Transaction(() =>
{
deletePurchaseOrder.ExecuteAffrows();
deleteOrderCostDetail.ExecuteAffrows();
fsql.Update<OrderDropShipping>().Set(ods => ods.IsHistory, true).Where(ods => ods.OrderId == createOnlinePurchaseOrderRequest.OrderId).ExecuteAffrows();
fsql.Insert(insertPurchaseOrders).ExecuteAffrows();
fsql.Insert(insertPurchaseOrderDetails).ExecuteAffrows();
fsql.Insert(insertOrderCostDetails).ExecuteAffrows();
updateOrderCost?.ExecuteAffrows();
insertOrderCost?.ExecuteAffrows();
insertOrderDropShipping?.ExecuteAffrows();
fsql.Update<Order>(createOnlinePurchaseOrderRequest.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState., o => o.OrderState, Model.Enums.OrderState.)
.Set(o => o.StorageType, Model.Enums.StorageType.)
.ExecuteAffrows();
fsql.Update<OrderSku>().Set(osku => osku.OrderDropShippingId, orderDropShipping.Id)
.Where(osku => orderSkuIds.Contains(osku.Id))
.ExecuteAffrows();
});
}
/// <summary>
/// 查询审核采购单
/// <para>暂时从订单查询采购单,之后改为直接查询采购单</para>
/// </summary>
/// <param name="auditOrderRequest"></param>
/// <returns></returns>
public IList<AuditPurchaseOrderResponse> GetAuditPurchaseOrderList(AuditOrderRequest auditOrderRequest)
{
auditOrderRequest.EndDate = auditOrderRequest.EndDate.Date.AddDays(1).AddSeconds(-1);
return fsql.Select<Order, OrderDropShipping>().InnerJoin((o, ods) => o.Id == ods.OrderId)
.Where((o, ods) => o.StartTime >= auditOrderRequest.StartDate &&
o.StartTime <= auditOrderRequest.EndDate &&
auditOrderRequest.ShopIdList.Contains(o.ShopId))
.ToList((o, ods) => new AuditPurchaseOrderResponse()
{
OrderDropShippingId = ods.Id,
OrderId = o.Id,
PurchaseAmount = ods.PurchaseAmount,
PurchaseOrderId = ods.PurchaseOrderId,
MerchantOrderId = ods.MerchantOrderId,
ShopId = o.ShopId,
PurchaseTime = ods.CreateTime,
PurchasePlatform = ods.PurchasePlatform,
OrderStartTime = o.StartTime
});
}
#region CallBack
#region 1688CallBack
public void CallbackFrom1688(string jsonStr)
{
nLogManager.Default().Info(jsonStr);
var jObject = JObject.Parse(jsonStr);
var type = jObject.Value<string>("type").ToUpper();
switch (type)
{
case "ORDER_BUYER_VIEW_PART_PART_SENDGOODS": //部分发货
case "ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS": //发货
DeliveryCallbackFrom1688(jObject);
break;
case "ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY":
OrderPriceModificationCallbackFrom1688(jObject); //订单改价
break;
default:
break;
}
}
/// <summary>
/// 1688发货回调
/// </summary>
/// <param name="jObject"></param>
private void DeliveryCallbackFrom1688(JObject jObject)
{
var purchaseOrderId = jObject["data"].Value<string>("orderId");
Task.Factory.StartNew(() => DeliveryCallback(purchaseOrderId, null, Enums.Platform.), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler);
}
/// <summary>
/// 1688订单改价回调
/// </summary>
/// <param name="jObject"></param>
private void OrderPriceModificationCallbackFrom1688(JObject jObject)
{
var purchaseOrderId = jObject["data"].Value<string>("orderId");
Task.Factory.StartNew(() => OrderPriceModificationCallback(purchaseOrderId, Enums.Platform.), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler);
}
#endregion
#region 拳探回调
public void QuanTan_SendGoodsCallback(QuanTanSendGoodsNotifyRequest request)
{
Task.Factory.StartNew(() => DeliveryCallback(request.OrderId, new WayBillNoResponse()
{
LogisticsCompanyId = request.ExpressId,
LogisticsCompanyName = request.ExpressName,
WayBillNo = request.WayBillNo,
}, Enums.Platform.), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler);
}
#endregion
/// <summary>
/// 采购平台发货回调
/// </summary>
/// <param name="purchaseOrderId"></param>
/// <param name="wayBillNoResponse"></param>
/// <param name="callbackPlatform"></param>
private void DeliveryCallback(string purchaseOrderId, WayBillNoResponse wayBillNoResponse, Enums.Platform callbackPlatform)
{
string currentProgress = string.Empty;
string wayBillNoResponseInfo = string.Empty;
string logisticsCompanyListInfo = string.Empty;
string logisticsCompanyId = string.Empty;
string orderId = string.Empty;
long? shopId = null;
OutStockRequest outStockRequest = null;
try
{
#region 查询代发信息
currentProgress = "查询代发信息";
var orderDropshipping = fsql.Select<OrderDropShipping>().Where(o => o.PurchaseOrderId == purchaseOrderId).ToOne();
if (orderDropshipping == null)
throw new Exception("未查询到代发信息");
orderId = orderDropshipping.OrderId;
#endregion
#region 查询订单
if (orderDropshipping.ShopId == null)
{
var order = fsql.Select<Order>(orderId).ToOne();
if (order == null)
throw new Exception("未查询到订单");
shopId = order.ShopId;
}
else
{
shopId = orderDropshipping.ShopId.Value;
}
#endregion
#region 查询采购账号
currentProgress = "查询采购账号";
var purchaseAccount = fsql.Select<PurchaseAccount>().WhereIf(orderDropshipping.PurchaseAccountId != 0, pa => pa.Id == orderDropshipping.PurchaseAccountId)
.WhereIf(orderDropshipping.PurchaseAccountId == 0, pa => pa.AccountName == orderDropshipping.BuyerAccount)
.Where(pa => pa.PurchasePlatformId == callbackPlatform && pa.ShopId == shopId.Value).ToOne();
if (purchaseAccount == null)
throw new Exception($"未查询到采购账号{orderDropshipping.BuyerAccount}");
#endregion
#region 获取采购单的物流信息
currentProgress = "获取采购单的物流信息";
var queryOrderWayBillNoRequest = new QueryOrderWayBillNoRequest()
{
AppKey = purchaseAccount.AppKey,
AppSecret = purchaseAccount.AppSecret,
AppToken = purchaseAccount.AppToken,
OrderId = purchaseOrderId,
Platform = callbackPlatform
};
if (wayBillNoResponse == null)
wayBillNoResponse = platformSDKBusinessList.FirstOrDefault(p => p.Platform == callbackPlatform).GetWayBillNoByOrderId(queryOrderWayBillNoRequest);
wayBillNoResponseInfo = JsonConvert.SerializeObject(new { Request = queryOrderWayBillNoRequest, Result = wayBillNoResponse });
#endregion
#region 查询采购账号的归属店铺
currentProgress = "查询采购账号归属店铺";
var shop = mdsBusiness.GetShopInfoByShopId(purchaseAccount.ShopId.Value);
#endregion
#region 获取目标平台的物流公司列表
currentProgress = "获取店铺平台物流公司列表";
var logisticsCompanyList = venderBusiness.GetLogisticsList(new PlatformRequest()
{
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
AppToken = shop.AppToken,
Platform = shop.PlatformId
});
if (logisticsCompanyList != null)
logisticsCompanyListInfo = JsonConvert.SerializeObject(logisticsCompanyList);
#endregion
#region 物流公司翻译
currentProgress = "物流公司翻译";
//logisticsCompanyId = ConvertLogisticsCompanyId(wayBillNoResponse.LogisticsCompanyName, logisticsCompanyList, shop.Platform);
logisticsCompanyId = logisticsCompanyConverter.Converter(wayBillNoResponse.LogisticsCompanyName, callbackPlatform, shop.PlatformId, logisticsCompanyList);
#endregion
#region 店铺平台订单出库
currentProgress = "店铺平台订单出库";
outStockRequest = new OutStockRequest()
{
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
AppToken = shop.AppToken,
OrderId = orderDropshipping.OrderId,
Platform = shop.PlatformId,
WayBillNo = wayBillNoResponse.WayBillNo,
LogisticsId = logisticsCompanyId, //物流公司Id
SaveResponseLog = true
};
orderBusiness.OutStock(outStockRequest);
#endregion
nLogManager.Default().Info($"DeliveryCallback 回调平台{callbackPlatform},订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo},店铺平台物流公司列表:{logisticsCompanyListInfo},翻译后的物流公司Id:{logisticsCompanyId},出库请求:{(outStockRequest != null ? JsonConvert.SerializeObject(outStockRequest) : null)}");
}
catch (Exception ex)
{
nLogManager.Default().Error(ex, $"DeliveryCallback 回调平台{callbackPlatform},订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo},店铺平台物流公司列表:{logisticsCompanyListInfo},翻译后的物流公司Id:{logisticsCompanyId},出库请求:{(outStockRequest != null ? JsonConvert.SerializeObject(outStockRequest) : null)}");
}
}
///// <summary>
///// 物流公司翻译, 将发货平台的物流公司翻译为店铺平台的物流公司
///// </summary>
///// <param name="sourceLogisticsCompanyName"></param>
///// <param name="targetLogisticsList"></param>
///// <param name="tagetLogisticsPlatform"></param>
///// <returns></returns>
//private string ConvertLogisticsCompanyId(string sourceLogisticsCompanyName, IList<LogisticsResponse> targetLogisticsList, Enums.Platform tagetLogisticsPlatform)
//{
// var match = Regex.Match(sourceLogisticsCompanyName, "(中通|圆通|申通|顺丰|韵达|邮政快递包裹|平邮|EMS|德邦|百世|天天|优速)");
// if (match.Success)
// {
// var sname = match.Groups[1].Value;
// var targetLogistics = targetLogisticsList.FirstOrDefault(t => t.Name.Contains(sname));
// if (targetLogistics != null)
// return targetLogistics.Id;
// }
// return deliverySelfDic[tagetLogisticsPlatform];
//}
/// <summary>
/// 采购平台改价回调
/// </summary>
/// <param name="purchaseOrderId"></param>
/// <param name="callbackPlatform"></param>
private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform)
{
string currentProgress = string.Empty;
try
{
#region 查询代发信息
currentProgress = "查询代发信息";
var orderDropshipping = fsql.Select<OrderDropShipping>().Where(o => o.PurchaseOrderId == purchaseOrderId).ToOne();
if (orderDropshipping == null)
throw new Exception("未查询到代发信息");
#endregion
#region 查询订单Sku
currentProgress = "查询订单Sku";
var orderSkuList = fsql.Select<OrderSku>().Where(osku => osku.Price != 0 && osku.OrderId == orderDropshipping.OrderId).ToList();
if (orderSkuList == null || orderSkuList.Count() == 0)
throw new BusinessException("订单Sku不存在");
#endregion
#region 查询采购单
currentProgress = "查询采购单";
var purchaseOrderList = fsql.Select<PurchaseOrder>().Where(po => po.PurchaseOrderId == purchaseOrderId).ToList();
if (purchaseOrderList == null || purchaseOrderList.Count() == 0)
throw new BusinessException("采购单不存在");
if (orderSkuList.Count() > 1 && purchaseOrderList.Any(p => p.PurchaseMethod == Enums.PurchaseMethod.线))
throw new Exception("多sku订单关联采购单不支持改价");
#endregion
#region 查询成本
currentProgress = "查询成本";
var orderCost = fsql.Select<OrderCost>(orderDropshipping.OrderId).ToOne();
if (orderCost == null)
throw new BusinessException("订单成本不存在");
#endregion
#region 查询成本明细
currentProgress = "查询成本明细";
var orderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => ocd.OrderId == orderDropshipping.OrderId).ToList();
if (orderCostDetailList == null || orderCostDetailList.Count() == 0)
throw new BusinessException("订单成本明细不存在");
#endregion
#region 查询采购账号
currentProgress = "查询采购账号";
var purchaseAccount = fsql.Select<PurchaseAccount>().WhereIf(orderDropshipping.PurchaseAccountId != 0, pa => pa.Id == orderDropshipping.PurchaseAccountId)
.WhereIf(orderDropshipping.PurchaseAccountId == 0, pa => pa.AccountName == orderDropshipping.BuyerAccount)
.Where(pa => pa.PurchasePlatformId == callbackPlatform).ToOne();
if (purchaseAccount == null)
throw new Exception($"未查询到采购账号{orderDropshipping.BuyerAccount}");
#endregion
#region 查询改价后的订单金额
currentProgress = "查询改价后的订单金额";
var purchaseOrderSimpleInfo = platformSDKBusinessList.FirstOrDefault(p => p.Platform == callbackPlatform).GetOrderSimpleInfo(new GetOrderInfoRequest()
{
AppKey = purchaseAccount.AppKey,
AppSecret = purchaseAccount.AppSecret,
AppToken = purchaseAccount.AppToken,
OrderId = purchaseOrderId,
Platform = callbackPlatform
});
#endregion
#region 查询采购单明细
currentProgress = "查询采购单明细";
var purchaseOrderDetails = fsql.Select<PurchaseOrderDetail>().Where(p => p.OrderId == orderDropshipping.OrderId);
#endregion
#region 查询订单
currentProgress = "查询订单";
var dbOrder = fsql.Select<Order>(orderDropshipping.OrderId).ToOne();
if (dbOrder == null)
throw new BusinessException("订单不存在");
#endregion
IList<IUpdate<PurchaseOrder>> updatePurchaseOrders = new List<IUpdate<PurchaseOrder>>();
IList<IUpdate<OrderCostDetail>> updateOrderCostDetails = new List<IUpdate<OrderCostDetail>>();
foreach (var orderSku in orderSkuList)
{
var currentOrderSkuProductAmount = 0M; //采购成本
if (orderSkuList.Count() != 1)
{
var currentOrderSkuPurchaseOrderDetails = purchaseOrderDetails.Where(p => p.SkuId == orderSku.SkuId); //找当前skuId的采购skuId
currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => currentOrderSkuPurchaseOrderDetails.Any(p1 => p1.PurchaseSkuId == p.SkuId))
?.Sum(p => p.ProductAmount) ?? 0M;
}
else
{
currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ProductAmount;
}
var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / orderSkuList.Count(); //采购运费(按sku数均分)
var purchaseOrder = purchaseOrderList.FirstOrDefault(po => po.SkuId == orderSku.SkuId);
var orderCostDetail = orderCostDetailList.FirstOrDefault(oc => oc.PurchaseOrderPKId == purchaseOrder.Id);
purchaseOrder.SingleSkuAmount = currentOrderSkuProductAmount / orderSku.ItemTotal.Value;
purchaseOrder.SingleFreight = currentOrderSkuFreightAmount / orderSku.ItemTotal.Value;
orderCostDetail.SkuAmount = currentOrderSkuProductAmount;
orderCostDetail.PurchaseFreight = currentOrderSkuFreightAmount;
//orderCostDetail.UnitCost = purchaseOrder.UnitCost;
//orderCostDetail.TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount;
updatePurchaseOrders.Add(fsql.Update<PurchaseOrder>().SetSource(purchaseOrder));
updateOrderCostDetails.Add(fsql.Update<OrderCostDetail>().SetSource(orderCostDetail));
}
orderCost.PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount;
orderCost.Profit = dbOrder.OrderSellerPrice +
dbOrder.FreightPrice -
orderCost.PurchaseAmount -
orderCost.DeliveryExpressFreight -
orderCost.PlatformCommissionAmount;
orderDropshipping.PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount;
orderDropshipping.SkuAmount = purchaseOrderSimpleInfo.ProductAmount;
orderDropshipping.PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount;
fsql.Transaction(() =>
{
foreach (var update in updatePurchaseOrders)
update.ExecuteAffrows();
foreach (var update in updateOrderCostDetails)
update.ExecuteAffrows();
fsql.Update<OrderCost>().SetSource(orderCost).ExecuteAffrows();
fsql.Update<OrderDropShipping>().SetSource(orderDropshipping).ExecuteAffrows();
});
}
catch (Exception ex)
{
nLogManager.Default().Error(ex, $"OrderPriceModificationCallback 回调平台{callbackPlatform},采购单号{purchaseOrderId},执行进度[{currentProgress}]");
}
}
#endregion
}
}