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> 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().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().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(editAfterSaleOrderRequest.OrderId).ToOne(); var dbOrderCost = fsql.Select(editAfterSaleOrderRequest.OrderId).ToOne(); if (dbOrder.StorageType == null || dbOrderCost == null) throw new BusinessException("缺少订单成本信息 请先手动补录成本"); var afterSaleOrderList = fsql.Select().Where(aso => aso.OrderId == editAfterSaleOrderRequest.OrderId).ToList(); var dbAfterSaleOrder = afterSaleOrderList.FirstOrDefault(aso => aso.Id == editAfterSaleOrderRequest.Id); var dbOrderCostDetail = fsql.Select().Where(ocd => ocd.OrderId == editAfterSaleOrderRequest.OrderId && ocd.SkuId == dbAfterSaleOrder.SkuId && ocd.IsEnabled == true).ToOne(); var dbPurchaseOrder = dbOrderCostDetail != null ? fsql.Select(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().SetSource(dbOrderCost).ExecuteAffrows(); fsql.Update().SetSource(dbAfterSaleOrder).ExecuteAffrows(); }); } /// /// 手动更新退款信息 /// /// public void EditAfterSaleOrderRefundPurchaseAmount(EditAfterSaleOrderRefundPurchaseAmountRequest request) { var afterSaleOrderList = fsql.Select().Where(aso => aso.OrderId == request.OrderId).ToList(); var dbAfterSaleOrder = afterSaleOrderList.FirstOrDefault(aso => aso.Id == request.Id); var dbOrder = fsql.Select(request.OrderId).ToOne(); var dbOrderCost = fsql.Select(request.OrderId).ToOne(); dbAfterSaleOrder.RefundAlipayOrderNo = request.RefundAlipayOrderNo; dbAfterSaleOrder.RefundMerchantOrderNo = request.RefundMerchantOrderNo; dbAfterSaleOrder.RefundPurchaseAmount = request.RefundPurchaseAmount; dbOrderCost.CalculationOrderProfitAndCost(dbOrder, afterSaleOrderList); fsql.Transaction(() => { fsql.Update().SetSource(dbOrderCost).ExecuteAffrows(); fsql.Update().SetSource(dbAfterSaleOrder).ExecuteAffrows(); }); } } }