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

250 lines
14 KiB

using BBWY.Common.Models;
using BBWY.Server.Business.Extensions;
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto;
using System;
using System.Linq;
using System.Linq.Expressions;
using Yitter.IdGenerator;
namespace BBWY.Server.Business
{
public class AfterSaleOrderBusiness : BaseBusiness, IDenpendency
{
public AfterSaleOrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator) : base(fsql, nLogManager, idGenerator)
{
}
private Expression<Func<AfterSaleOrder, OrderSku, OrderConsignee, AfterSaleOrderResponse>> GetExpressionField()
{
return (aso, osku, oc) => new AfterSaleOrderResponse(aso.Id)
{
ApplyTime = aso.ApplyTime,
ConsumableAmount = aso.ConsumableAmount,
CreateTime = aso.CreateTime,
DeliveryExpressFreight = aso.DeliveryExpressFreight,
FirstFreight = aso.FirstFreight,
InStorageAmount = aso.InStorageAmount,
Logo = osku.Logo,
OrderId = aso.OrderId,
OutStorageAmount = aso.OutStorageAmount,
StorageAmount = aso.StorageAmount,
ProductHealth = aso.ProductHealth,
ProductId = aso.ProductId,
ProductResult = aso.ProductResult,
RefundAmount = aso.RefundAmount,
RefundInStorageAmount = aso.RefundInStorageAmount,
RefundPurchaseAmount = aso.RefundPurchaseAmount,
RefundTime = aso.RefundTime,
ReissueAfterSaleAmount = aso.ReissueAfterSaleAmount,
ReissueFreight = aso.ReissueFreight,
ReissueProductAmount = aso.ReissueProductAmount,
ServiceId = aso.ServiceId,
ServiceResult = aso.ServiceResult,
ShopId = aso.ShopId,
SkuId = aso.SkuId,
Title = osku.Title,
ContactName = oc.ContactName,
Mobile = oc.Mobile,
ItemTotal = osku.ItemTotal.Value,
Price = osku.Price.Value,
AfterTotalCost = aso.AfterTotalCost,
RefundAlipayOrderNo = aso.RefundAlipayOrderNo,
RefundMerchantOrderNo = aso.RefundMerchantOrderNo,
PurchaseMethod = aso.PurchaseMethod,
PurchaseOrderId = aso.PurchaseOrderId,
PurchaseOrderPKId = aso.PurchaseOrderPKId,
PurchasePlatform = aso.PurchasePlatform,
SDRefundFreight = aso.SDRefundFreight
};
}
public AfterSaleOrderListResponse GetAfterSaleOrderList(SearchAfterSaleOrderRequest request)
{
var select = fsql.Select<AfterSaleOrder, OrderSku, OrderConsignee>().InnerJoin((aso, osku, oc) => aso.OrderId == osku.OrderId && aso.SkuId == osku.SkuId)
.InnerJoin((aso, osku, oc) => aso.OrderId == oc.OrderId);
if (!string.IsNullOrEmpty(request.ServiceId))
{
select = select.Where((aso, osku, o) => aso.ServiceId == request.ServiceId);
}
else
{
select = select.WhereIf(request.StartDate != null, (aso, osku, oc) => aso.ApplyTime >= request.StartDate)
.WhereIf(request.EndDate != null, (aso, osku, oc) => aso.ApplyTime <= request.EndDate)
.WhereIf(!string.IsNullOrEmpty(request.Spu), (aso, osku, oc) => aso.ProductId == request.Spu)
.WhereIf(!string.IsNullOrEmpty(request.Sku), (aso, osku, oc) => aso.SkuId == request.Sku)
.WhereIf(!string.IsNullOrEmpty(request.OrderId), (aso, osku, oc) => aso.OrderId == request.OrderId)
.WhereIf(request.OnlyUnhandle, (aso, osku, oc) => aso.ProductHealth == null || aso.ProductResult == null);
}
select = select.Where((aso, osku, oc) => aso.ShopId == request.ShopId)
.OrderByDescending((aso, osku, oc) => aso.ApplyTime)
.Count(out var total)
.Page(request.PageIndex, request.PageSize);
var list = select.ToList(GetExpressionField());
return new AfterSaleOrderListResponse()
{
Count = total,
Items = list
};
}
public AfterSaleOrderResponse GetAfterSaleOrderById(long afterSaleOrderId)
{
var response = fsql.Select<AfterSaleOrder, OrderSku, OrderConsignee>().InnerJoin((aso, osku, oc) => aso.OrderId == osku.OrderId && aso.SkuId == osku.SkuId)
.InnerJoin((aso, osku, oc) => aso.OrderId == oc.OrderId)
.Where((aso, osku, oc) => aso.Id == afterSaleOrderId)
.ToOne(GetExpressionField());
return response;
}
public void EditAfterSaleOrder(EditAfterSaleOrderRequest editAfterSaleOrderRequest)
{
var dbOrder = fsql.Select<Order>(editAfterSaleOrderRequest.OrderId).ToOne();
var dbOrderCost = fsql.Select<OrderCost>(editAfterSaleOrderRequest.OrderId).ToOne();
if (dbOrder.StorageType == null || dbOrderCost == null)
throw new BusinessException("缺少订单成本信息 请先手动补录成本");
var afterSaleOrderList = fsql.Select<AfterSaleOrder>().Where(aso => aso.OrderId == editAfterSaleOrderRequest.OrderId).ToList();
var dbAfterSaleOrder = afterSaleOrderList.FirstOrDefault(aso => aso.Id == editAfterSaleOrderRequest.Id);
var dbOrderCostDetail = fsql.Select<OrderCostDetail>().Where(ocd => ocd.OrderId == editAfterSaleOrderRequest.OrderId &&
ocd.SkuId == dbAfterSaleOrder.SkuId &&
ocd.IsEnabled == true).ToOne();
var dbPurchaseOrder = dbOrderCostDetail != null ? fsql.Select<PurchaseOrder>(dbOrderCostDetail.PurchaseOrderPKId).ToOne() : null;
#region 更新当前服务单属性
dbAfterSaleOrder.ServiceResult = editAfterSaleOrderRequest.ServiceResult;
dbAfterSaleOrder.ProductResult = editAfterSaleOrderRequest.ProductResult;
dbAfterSaleOrder.ProductHealth = editAfterSaleOrderRequest.ProductHealth;
dbAfterSaleOrder.ReissueAfterSaleAmount = editAfterSaleOrderRequest.ReissueAfterSaleAmount;
dbAfterSaleOrder.ConsumableAmount = 0M;
dbAfterSaleOrder.DeliveryExpressFreight = 0M;
dbAfterSaleOrder.FirstFreight = 0M;
dbAfterSaleOrder.InStorageAmount = 0M;
dbAfterSaleOrder.OutStorageAmount = 0M;
dbAfterSaleOrder.RefundInStorageAmount = 0M;
dbAfterSaleOrder.ReissueFreight = 0M;
dbAfterSaleOrder.ReissueProductAmount = 0M;
dbAfterSaleOrder.StorageAmount = 0M;
dbAfterSaleOrder.AfterTotalCost = 0M;
dbAfterSaleOrder.SDRefundFreight = 0M;
dbAfterSaleOrder.PurchaseMethod = null;
dbAfterSaleOrder.PurchasePlatform = null;
dbAfterSaleOrder.PurchaseOrderId = string.Empty;
dbAfterSaleOrder.PurchaseOrderPKId = null;
if (dbAfterSaleOrder.ServiceResult == Model.Enums.ServiceResult.SD退货)
{
if (dbOrder.StorageType != Model.Enums.StorageType.SD)
throw new BusinessException("只有SD订单才能选择SD退货");
dbAfterSaleOrder.SDRefundFreight = editAfterSaleOrderRequest.SDRefundFreight;
dbAfterSaleOrder.AfterTotalCost = dbAfterSaleOrder.SDRefundFreight + dbAfterSaleOrder.ReissueAfterSaleAmount;
dbOrderCost.CalculationSDOrderProfitAndCost(dbOrder, afterSaleOrderList);
}
else
{
if (dbAfterSaleOrder.ServiceResult == Model.Enums.ServiceResult. ||
dbAfterSaleOrder.ServiceResult == Model.Enums.ServiceResult. ||
dbAfterSaleOrder.ServiceResult == Model.Enums.ServiceResult.线)
{
if (dbAfterSaleOrder.ServiceResult == Model.Enums.ServiceResult.)
dbAfterSaleOrder.ProductHealth = Model.Enums.ProductHealth.退;
dbAfterSaleOrder.ReissueProductAmount = editAfterSaleOrderRequest.ReissueProductAmount;
if (dbOrder.StorageType == Model.Enums.StorageType.)
dbAfterSaleOrder.ReissueFreight = editAfterSaleOrderRequest.ReissueFreight; //其他单单更新采购运费
else
dbAfterSaleOrder.DeliveryExpressFreight = editAfterSaleOrderRequest.ReissueFreight; //代发单更新快递费
}
else if (dbAfterSaleOrder.ServiceResult == Model.Enums.ServiceResult. && dbOrderCostDetail != null)
{
dbAfterSaleOrder.ConsumableAmount = dbOrderCostDetail.ConsumableAmount;
dbAfterSaleOrder.DeliveryExpressFreight = dbOrderCostDetail.DeliveryExpressFreight;
dbAfterSaleOrder.FirstFreight = dbOrderCostDetail.FirstFreight;
dbAfterSaleOrder.ReissueProductAmount = dbOrderCostDetail.SkuAmount;
dbAfterSaleOrder.ReissueFreight = dbOrderCostDetail.PurchaseFreight;
dbAfterSaleOrder.StorageAmount = dbOrderCostDetail.StorageAmount;
dbAfterSaleOrder.InStorageAmount = dbOrderCostDetail.InStorageAmount;
dbAfterSaleOrder.OutStorageAmount = dbOrderCostDetail.OutStorageAmount;
}
if ((dbAfterSaleOrder.ProductResult == Model.Enums.ProductResult.退 || dbAfterSaleOrder.ProductResult == Model.Enums.ProductResult.退) &&
dbOrderCostDetail != null &&
dbPurchaseOrder != null)
dbAfterSaleOrder.RefundInStorageAmount = dbPurchaseOrder.SingleRefundInStorageAmount * dbOrderCostDetail.DeductionQuantity;
if (dbAfterSaleOrder.ProductHealth == Model.Enums.ProductHealth.)
{
//原sku采购成本
dbAfterSaleOrder.RefundPurchaseAmount = dbOrderCostDetail.SkuAmount; //只退货款
}
else if (dbAfterSaleOrder.ProductHealth == Model.Enums.ProductHealth._ ||
dbAfterSaleOrder.ProductHealth == Model.Enums.ProductHealth.退 ||
dbAfterSaleOrder.ProductHealth == Model.Enums.ProductHealth.)
{
dbAfterSaleOrder.RefundPurchaseAmount = 0M;
}
else if (dbAfterSaleOrder.ProductHealth == Model.Enums.ProductHealth.退退 &&
dbOrderCostDetail != null &&
dbPurchaseOrder != null)
{
dbAfterSaleOrder.PurchaseMethod = dbPurchaseOrder.PurchaseMethod;
dbAfterSaleOrder.PurchasePlatform = dbPurchaseOrder.PurchasePlatform;
dbAfterSaleOrder.PurchaseOrderId = dbPurchaseOrder.PurchaseOrderId;
dbAfterSaleOrder.PurchaseOrderPKId = dbPurchaseOrder.Id;
}
dbAfterSaleOrder.AfterTotalCost = dbAfterSaleOrder.ReissueAfterSaleAmount +
dbAfterSaleOrder.ConsumableAmount.Value +
dbAfterSaleOrder.DeliveryExpressFreight.Value +
dbAfterSaleOrder.FirstFreight.Value +
dbAfterSaleOrder.InStorageAmount.Value +
dbAfterSaleOrder.OutStorageAmount.Value +
dbAfterSaleOrder.RefundInStorageAmount.Value +
dbAfterSaleOrder.ReissueFreight.Value +
dbAfterSaleOrder.ReissueProductAmount.Value +
dbAfterSaleOrder.StorageAmount;
dbOrderCost.CalculationOrderProfitAndCost(dbOrder, afterSaleOrderList);
}
#endregion
fsql.Transaction(() =>
{
fsql.Update<OrderCost>().SetSource(dbOrderCost).ExecuteAffrows();
fsql.Update<AfterSaleOrder>().SetSource(dbAfterSaleOrder).ExecuteAffrows();
});
}
/// <summary>
/// 手动更新退款信息
/// </summary>
/// <param name="request"></param>
public void EditAfterSaleOrderRefundPurchaseAmount(EditAfterSaleOrderRefundPurchaseAmountRequest request)
{
var afterSaleOrderList = fsql.Select<AfterSaleOrder>().Where(aso => aso.OrderId == request.OrderId).ToList();
var dbAfterSaleOrder = afterSaleOrderList.FirstOrDefault(aso => aso.Id == request.Id);
var dbOrder = fsql.Select<Order>(request.OrderId).ToOne();
var dbOrderCost = fsql.Select<OrderCost>(request.OrderId).ToOne();
dbAfterSaleOrder.RefundAlipayOrderNo = request.RefundAlipayOrderNo;
dbAfterSaleOrder.RefundMerchantOrderNo = request.RefundMerchantOrderNo;
dbAfterSaleOrder.RefundPurchaseAmount = request.RefundPurchaseAmount;
dbOrderCost.CalculationOrderProfitAndCost(dbOrder, afterSaleOrderList);
fsql.Transaction(() =>
{
fsql.Update<OrderCost>().SetSource(dbOrderCost).ExecuteAffrows();
fsql.Update<AfterSaleOrder>().SetSource(dbAfterSaleOrder).ExecuteAffrows();
});
}
}
}