Browse Source

售后利润计算

qianyi
shanji 3 years ago
parent
commit
f6c84c46ad
  1. 27
      BBWY.Client/APIServices/AfterOrderService.cs
  2. 5
      BBWY.Client/APIServices/OrderService.cs
  3. 50
      BBWY.Client/ViewModels/Order/OrderListViewModel.cs
  4. 11
      BBWY.Server.API/Controllers/AfterSaleOrderController.cs
  5. 10
      BBWY.Server.API/Controllers/OrderController.cs
  6. 120
      BBWY.Server.Business/AfterSaleOrder/AfterSaleOrderBusiness.cs
  7. 68
      BBWY.Server.Business/Order/OrderBusiness.cs
  8. 14
      BBWY.Server.Model/Dto/Request/AfterSaleOrder/EditAfterSaleOrderRequest.cs
  9. 9
      BBWY.Server.Model/Dto/Request/Order/EditAfterSaleOrderSkuRequest.cs
  10. 4
      BBWY.Server.Model/Dto/Response/AfterSaleOrder/AfterSaleOrderResponse.cs
  11. 2
      BBWY.Server.Model/MappingProfiles.cs

27
BBWY.Client/APIServices/AfterOrderService.cs

@ -36,5 +36,32 @@ namespace BBWY.Client.APIServices
pageSize pageSize
}, null, HttpMethod.Post); }, null, HttpMethod.Post);
} }
public ApiResponse<AfterSaleOrderResponse> GetAfterSaleOrderById(long afterSaleOrderId)
{
return SendRequest<AfterSaleOrderResponse>(globalContext.BBYWApiHost, $"api/AfterSaleOrder/GetAfterSaleOrderById/{afterSaleOrderId}", null, null, HttpMethod.Get);
}
public ApiResponse<object> EditAfterSaleOrderSku(long afterSaleOrderId,
string orderId,
ProductResult productResult,
ServiceResult serviceResult,
ProductHealth productHealth,
decimal reissueAfterSaleAmount,
decimal reissueFreight,
decimal reissueProductAmount)
{
return SendRequest<object>(globalContext.BBYWApiHost, "Api/Order/EditAfterSaleOrderSku", new
{
Id = afterSaleOrderId,
orderId,
serviceResult,
productResult,
productHealth,
reissueAfterSaleAmount,
reissueFreight,
reissueProductAmount
}, null, HttpMethod.Post);
}
} }
} }

5
BBWY.Client/APIServices/OrderService.cs

@ -258,10 +258,5 @@ namespace BBWY.Client.APIServices
excludeCanceled excludeCanceled
}, null, HttpMethod.Post); }, null, HttpMethod.Post);
} }
public ApiResponse<object> EditAfterSaleOrderSku(AfterSaleOrder afterSaleOrder)
{
return SendRequest<object>(globalContext.BBYWApiHost, "Api/Order/EditAfterSaleOrderSku", afterSaleOrder, null, HttpMethod.Post);
}
} }
} }

50
BBWY.Client/ViewModels/Order/OrderListViewModel.cs

@ -261,6 +261,25 @@ namespace BBWY.Client.ViewModels
} }
public void RefreshAfterOrder(long afterSaleOrderId)
{
var afterSaleOrder = AfterSaleOrderList.FirstOrDefault(aso => aso.Id == afterSaleOrderId);
if (afterSaleOrder == null)
{
IsLoading = false;
return;
}
var afterSaleOrderResponse = afterOrderService.GetAfterSaleOrderById(afterSaleOrderId);
var newAfterSaleOrder = afterSaleOrderResponse.Data.Map<AfterSaleOrder>();
App.Current.Dispatcher.Invoke(() =>
{
var index = AfterSaleOrderList.IndexOf(afterSaleOrder);
AfterSaleOrderList.Remove(afterSaleOrder);
AfterSaleOrderList.Insert(index, newAfterSaleOrder);
});
}
private void LoadOrder(int pageIndex) private void LoadOrder(int pageIndex)
{ {
if (IncludeAfterOrder == true) if (IncludeAfterOrder == true)
@ -807,18 +826,25 @@ namespace BBWY.Client.ViewModels
return; return;
var afterSaleOrder = editAfterSaleOrderSku.SaleOrder; var afterSaleOrder = editAfterSaleOrderSku.SaleOrder;
//IsLoading = true; IsLoading = true;
//Task.Factory.StartNew(() => orderService.EditAfterSaleOrderSku(afterSaleOrder)).ContinueWith(t => Task.Factory.StartNew(() => afterOrderService.EditAfterSaleOrderSku(afterSaleOrder.Id,
//{ afterSaleOrder.OrderId,
// var response = t.Result; afterSaleOrder.ProductResult.Value,
// if (!response.Success) afterSaleOrder.ServiceResult.Value,
// { afterSaleOrder.ProductHealth.Value,
// IsLoading = false; afterSaleOrder.ReissueAfterSaleAmount,
// App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "修改售后")); afterSaleOrder.ReissueFreight,
// return; afterSaleOrder.ReissueProductAmount)).ContinueWith(t =>
// } {
// RefreshOrder(afterSaleOrder.OrderId); var response = t.Result;
//}); if (!response.Success)
{
IsLoading = false;
App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "修改售后"));
return;
}
RefreshAfterOrder(afterSaleOrder.Id);
});
} }
} }
} }

11
BBWY.Server.API/Controllers/AfterSaleOrderController.cs

@ -24,5 +24,16 @@ namespace BBWY.Server.API.Controllers
{ {
return afterSaleOrderBusiness.GetAfterSaleOrderList(request); return afterSaleOrderBusiness.GetAfterSaleOrderList(request);
} }
/// <summary>
/// 获取单个服务单
/// </summary>
/// <param name="afterSaleOrderId"></param>
/// <returns></returns>
[HttpGet]
public AfterSaleOrderResponse GetAfterSaleOrderById([FromRoute]long afterSaleOrderId)
{
return afterSaleOrderBusiness.GetAfterSaleOrderById(afterSaleOrderId);
}
} }
} }

10
BBWY.Server.API/Controllers/OrderController.cs

@ -131,15 +131,5 @@ namespace BBWY.Server.API.Controllers
{ {
orderBusiness.EditVenderRemark(editVenderRemarkRequest); orderBusiness.EditVenderRemark(editVenderRemarkRequest);
} }
/// <summary>
/// 修改售后
/// </summary>
/// <param name="editAfterSaleOrderSkuRequest"></param>
[HttpPost]
public void EditAfterSaleOrderSku([FromBody] EditAfterSaleOrderSkuRequest editAfterSaleOrderSkuRequest)
{
orderBusiness.EditAfterSaleOrderSku(editAfterSaleOrderSkuRequest);
}
} }
} }

120
BBWY.Server.Business/AfterSaleOrder/AfterSaleOrderBusiness.cs

@ -1,6 +1,9 @@
using BBWY.Common.Models; using BBWY.Common.Models;
using BBWY.Server.Model.Db; using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto; using BBWY.Server.Model.Dto;
using System;
using System.Linq;
using System.Linq.Expressions;
using Yitter.IdGenerator; using Yitter.IdGenerator;
namespace BBWY.Server.Business namespace BBWY.Server.Business
@ -12,30 +15,10 @@ namespace BBWY.Server.Business
} }
public AfterSaleOrderListResponse GetAfterSaleOrderList(SearchAfterSaleOrderRequest request) private Expression<Func<AfterSaleOrder, OrderSku, OrderConsignee, AfterSaleOrderResponse>> GetExpressionField()
{ {
var select = fsql.Select<AfterSaleOrder, OrderSku, OrderConsignee>().InnerJoin((aso, osku, oc) => aso.OrderId == osku.OrderId && aso.SkuId == osku.SkuId) return (aso, osku, oc) => new AfterSaleOrderResponse(aso.Id)
.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);
}
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((aso, osku, oc) => new AfterSaleOrderResponse
{
Id = aso.Id,
ApplyTime = aso.ApplyTime, ApplyTime = aso.ApplyTime,
ConsumableAmount = aso.ConsumableAmount, ConsumableAmount = aso.ConsumableAmount,
CreateTime = aso.CreateTime, CreateTime = aso.CreateTime,
@ -65,12 +48,103 @@ namespace BBWY.Server.Business
ItemTotal = osku.ItemTotal.Value, ItemTotal = osku.ItemTotal.Value,
Price = osku.Price.Value, Price = osku.Price.Value,
AfterTotalCost = aso.AfterTotalCost AfterTotalCost = aso.AfterTotalCost
}); };
}
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);
}
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() return new AfterSaleOrderListResponse()
{ {
Count = total, Count = total,
Items = list 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 afterSaleOrderList = fsql.Select<AfterSaleOrder>().Where(aso => aso.OrderId == editAfterSaleOrderRequest.OrderId).ToList();
var dbAfterSaleOrder = afterSaleOrderList.FirstOrDefault(aso => aso.Id == editAfterSaleOrderRequest.Id);
var dbOrder = fsql.Select<Order>(editAfterSaleOrderRequest.OrderId).ToOne();
#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.AfterTotalCost = 0M;
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;
dbAfterSaleOrder.ReissueFreight = editAfterSaleOrderRequest.ReissueFreight;
}
else if (dbAfterSaleOrder.ServiceResult == Model.Enums.ServiceResult.退)
{
if (dbAfterSaleOrder.ProductResult == Model.Enums.ProductResult.退 ||
dbAfterSaleOrder.ProductResult == Model.Enums.ProductResult.退)
{
}
}
if (dbAfterSaleOrder.ProductHealth == Model.Enums.ProductHealth.)
{
//原sku采购成本
}
else if (dbAfterSaleOrder.ProductHealth == Model.Enums.ProductHealth._ ||
dbAfterSaleOrder.ProductHealth == Model.Enums.ProductHealth.退 ||
dbAfterSaleOrder.ProductHealth == Model.Enums.ProductHealth.)
{
dbAfterSaleOrder.RefundPurchaseAmount = 0M;
}
#endregion
}
} }
} }

68
BBWY.Server.Business/Order/OrderBusiness.cs

@ -991,73 +991,5 @@ namespace BBWY.Server.Business
.Set(o => o.VenderRemark, editVenderRemarkRequest.VenderRemark) .Set(o => o.VenderRemark, editVenderRemarkRequest.VenderRemark)
.ExecuteAffrows(); .ExecuteAffrows();
} }
/// <summary>
/// 修改售后
/// </summary>
/// <param name="editAfterSaleOrderSkuRequest"></param>
/// <exception cref="BusinessException"></exception>
public void EditAfterSaleOrderSku(EditAfterSaleOrderSkuRequest editAfterSaleOrderSkuRequest)
{
var dbOrder = fsql.Select<Order>(editAfterSaleOrderSkuRequest.OrderId).ToOne();
if (dbOrder == null)
throw new BusinessException("订单不存在");
var dbOrderCost = fsql.Select<OrderCost>(editAfterSaleOrderSkuRequest.OrderId).ToOne();
if (dbOrderCost == null)
throw new BusinessException("缺少订单成本");
IInsert<AfterSaleOrder> insertAfterSaleOrder = null;
IUpdate<AfterSaleOrder> updateAfterSaleOrder = null;
IUpdate<OrderCost> updateOrderCost = null;
var afterSaleOrderSkuList = fsql.Select<AfterSaleOrder>().Where(aso => aso.OrderId == editAfterSaleOrderSkuRequest.OrderId).ToList();
if (afterSaleOrderSkuList.Any(aso => aso.Id == editAfterSaleOrderSkuRequest.Id))
{
var dbAfterSaleOrderSku = afterSaleOrderSkuList.FirstOrDefault(aso => aso.Id == editAfterSaleOrderSkuRequest.Id);
editAfterSaleOrderSkuRequest.Map(dbAfterSaleOrderSku);
updateAfterSaleOrder = fsql.Update<AfterSaleOrder>().SetSource(dbAfterSaleOrderSku).IgnoreColumns(aso => new { aso.CreateTime });
}
else
{
editAfterSaleOrderSkuRequest.Id = idGenerator.NewLong();
var afterSaleOrder = editAfterSaleOrderSkuRequest.Map<AfterSaleOrder>();
afterSaleOrder.CreateTime = DateTime.Now;
insertAfterSaleOrder = fsql.Insert(afterSaleOrder);
afterSaleOrderSkuList.Add(afterSaleOrder);
}
//var refundAfterSaleOrderSkuIds = afterSaleOrderSkuList.Where(aso => aso.RefundAmount != 0 && aso.ProductResult == Enums.ProductResult.退款退货).Select(aso => aso.SkuId);
dbOrderCost.RefundAmount = afterSaleOrderSkuList.Sum(aso => aso.RefundAmount ?? 0);
//dbOrderCost.ReissueProductAmount = afterSaleOrderSkuList.Sum(aso => aso.ReissueProductAmount ?? 0);
//dbOrderCost.ReissueFreight = afterSaleOrderSkuList.Sum(aso => aso.ReissueFreight ?? 0);
//dbOrderCost.ReissueAfterSaleAmount = afterSaleOrderSkuList.Sum(aso => aso.ReissueAfterSaleAmount ?? 0);
//退款采购货款
//dbOrderCost.RefundPurchaseAmount = fsql.Select<OrderCostDetail>().Where(ocd => ocd.OrderId == editAfterSaleOrderSkuRequest.OrderId && refundAfterSaleOrderSkuIds.Contains(ocd.SkuId)).Sum(ocd => ocd.TotalCost);
//退款之后平台扣点
dbOrderCost.PlatformCommissionAmount = (dbOrder.OrderSellerPrice - dbOrderCost.RefundAmount) * (dbOrderCost?.PlatformCommissionRatio ?? 0.05M);
//订单利润
dbOrderCost.Profit = dbOrder.OrderSellerPrice + dbOrder.FreightPrice - dbOrderCost.RefundAmount -
(dbOrderCost.PurchaseAmount - dbOrderCost.RefundPurchaseAmount) -
dbOrderCost.DeliveryExpressFreight -
dbOrderCost.PlatformCommissionAmount -
dbOrderCost.AfterTotalCost;
updateOrderCost = fsql.Update<OrderCost>().SetSource(dbOrderCost).IgnoreColumns(oc => new { oc.CreateTime });
fsql.Transaction(() =>
{
fsql.Update<Order>(editAfterSaleOrderSkuRequest.OrderId).Set(o => o.IsAfterSaleOrder, true).ExecuteAffrows();
updateOrderCost.ExecuteAffrows();
insertAfterSaleOrder?.ExecuteAffrows();
updateAfterSaleOrder?.ExecuteAffrows();
});
}
} }
} }

14
BBWY.Server.Model/Dto/Request/AfterSaleOrder/EditAfterSaleOrderRequest.cs

@ -0,0 +1,14 @@
namespace BBWY.Server.Model.Dto
{
public class EditAfterSaleOrderRequest
{
public long Id { get; set; }
public string OrderId { get; set; }
public Enums.ProductResult ProductResult { get; set; }
public Enums.ServiceResult ServiceResult { get; set; }
public Enums.ProductHealth? ProductHealth { get; set; }
public decimal ReissueAfterSaleAmount { get; set; }
public decimal ReissueFreight { get; set; }
public decimal ReissueProductAmount { get; set; }
}
}

9
BBWY.Server.Model/Dto/Request/Order/EditAfterSaleOrderSkuRequest.cs

@ -1,9 +0,0 @@
using BBWY.Server.Model.Db;
namespace BBWY.Server.Model.Dto
{
public class EditAfterSaleOrderSkuRequest: AfterSaleOrder
{
}
}

4
BBWY.Server.Model/Dto/Response/AfterSaleOrder/AfterSaleOrderResponse.cs

@ -4,6 +4,10 @@ namespace BBWY.Server.Model.Dto
{ {
public class AfterSaleOrderResponse : AfterSaleOrder public class AfterSaleOrderResponse : AfterSaleOrder
{ {
public AfterSaleOrderResponse(long id)
{
this.Id = id;
}
public string Logo { get; set; } public string Logo { get; set; }
public string Title { get; set; } public string Title { get; set; }

2
BBWY.Server.Model/MappingProfiles.cs

@ -24,8 +24,6 @@ namespace BBWY.Server.Model
CreateMap<AddPurchaseOrderRequest, PurchaseOrder>(); CreateMap<AddPurchaseOrderRequest, PurchaseOrder>();
CreateMap<PurchaseOrder, PurchaseOrderResponse>(); CreateMap<PurchaseOrder, PurchaseOrderResponse>();
CreateMap<EditAfterSaleOrderSkuRequest, AfterSaleOrder>();
CreateMap<OrderDropShippingRequest, OrderDropShipping>(); CreateMap<OrderDropShippingRequest, OrderDropShipping>();
CreateMap<OrderDropShipping, OrderDropShippingResponse>(); CreateMap<OrderDropShipping, OrderDropShippingResponse>();
CreateMap<OrderCostDetailRequest, OrderCostDetail>(); CreateMap<OrderCostDetailRequest, OrderCostDetail>();

Loading…
Cancel
Save