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
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.Collections.Generic;
|
|
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, IEnumerable<PlatformSDKBusiness> platformSDKBusinessList) : base(fsql, nLogManager, idGenerator, platformSDKBusinessList)
|
|
{
|
|
}
|
|
|
|
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();
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|