|
@ -1,8 +1,10 @@ |
|
|
using BBWY.Common.Models; |
|
|
|
|
|
|
|
|
using BBWY.Common.Models; |
|
|
using BBWY.Server.Model; |
|
|
using BBWY.Server.Model; |
|
|
using BBWY.Server.Model.Db; |
|
|
using BBWY.Server.Model.Db; |
|
|
using BBWY.Server.Model.Db.Mds; |
|
|
using BBWY.Server.Model.Db.Mds; |
|
|
using BBWY.Server.Model.Dto; |
|
|
using BBWY.Server.Model.Dto; |
|
|
|
|
|
using System; |
|
|
using System.Collections.Generic; |
|
|
using System.Collections.Generic; |
|
|
using System.Linq; |
|
|
using System.Linq; |
|
|
using Yitter.IdGenerator; |
|
|
using Yitter.IdGenerator; |
|
@ -53,6 +55,23 @@ namespace BBWY.Server.Business |
|
|
return response; |
|
|
return response; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void XingXiangCumulative(IList<XingXiangItemResponse> detailList, string spuId, bool isSD, decimal profit, decimal sdProductAmount, decimal sdCost) |
|
|
|
|
|
{ |
|
|
|
|
|
var xxRespose = detailList.FirstOrDefault(xx => xx.Spu == spuId); |
|
|
|
|
|
if (xxRespose == null) |
|
|
|
|
|
{ |
|
|
|
|
|
xxRespose = new XingXiangItemResponse() { Spu = spuId, Profit = 0M }; |
|
|
|
|
|
detailList.Add(xxRespose); |
|
|
|
|
|
} |
|
|
|
|
|
xxRespose.Profit += profit; |
|
|
|
|
|
if (isSD) |
|
|
|
|
|
{ |
|
|
|
|
|
xxRespose.SDOrderCount++; |
|
|
|
|
|
xxRespose.SDOrderAmount += sdProductAmount; |
|
|
|
|
|
xxRespose.SDOrderCost += sdCost; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
public XingXinagSearchResponse XingXiangStatistics(XingXiangSearchOrderRequest xingXiangSearchOrderRequest) |
|
|
public XingXinagSearchResponse XingXiangStatistics(XingXiangSearchOrderRequest xingXiangSearchOrderRequest) |
|
|
{ |
|
|
{ |
|
|
var mdsShop = freeSqlMultiDBManager.MDSfsql.Select<Shops>().Where(s => s.ShopId == xingXiangSearchOrderRequest.ShopId.ToString()).ToOne(); |
|
|
var mdsShop = freeSqlMultiDBManager.MDSfsql.Select<Shops>().Where(s => s.ShopId == xingXiangSearchOrderRequest.ShopId.ToString()).ToOne(); |
|
@ -66,8 +85,6 @@ namespace BBWY.Server.Business |
|
|
.Where((o, oc) => o.ShopId == xingXiangSearchOrderRequest.ShopId) |
|
|
.Where((o, oc) => o.ShopId == xingXiangSearchOrderRequest.ShopId) |
|
|
.Where((o, oc) => o.StartTime >= beginTime && o.StartTime <= endTime) |
|
|
.Where((o, oc) => o.StartTime >= beginTime && o.StartTime <= endTime) |
|
|
.Where((o, oc) => !invalidOrderStateList.Contains(o.OrderState.Value)) |
|
|
.Where((o, oc) => !invalidOrderStateList.Contains(o.OrderState.Value)) |
|
|
.WhereIf(xingXiangSearchOrderRequest.SpuList != null && xingXiangSearchOrderRequest.SpuList.Count() > 0, |
|
|
|
|
|
(o, oc) => fsql.Select<OrderSku>().As("osku").Where(osku => xingXiangSearchOrderRequest.SpuList.Contains(osku.ProductId) && osku.OrderId == o.Id).Any()) |
|
|
|
|
|
.OrderByDescending((o, oc) => o.StartTime) |
|
|
.OrderByDescending((o, oc) => o.StartTime) |
|
|
.ToList((o, oc) => new Order() |
|
|
.ToList((o, oc) => new Order() |
|
|
{ |
|
|
{ |
|
@ -82,7 +99,8 @@ namespace BBWY.Server.Business |
|
|
DeliveryExpressFreight = oc.DeliveryExpressFreight, |
|
|
DeliveryExpressFreight = oc.DeliveryExpressFreight, |
|
|
PreferentialAmount = oc.PreferentialAmount, |
|
|
PreferentialAmount = oc.PreferentialAmount, |
|
|
OrderSellerPrice = o.OrderSellerPrice, |
|
|
OrderSellerPrice = o.OrderSellerPrice, |
|
|
SellerPreferentialAmount = o.SellerPreferentialAmount |
|
|
SellerPreferentialAmount = o.SellerPreferentialAmount, |
|
|
|
|
|
Profit = oc.Profit |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
if (orderList.Count() == 0) |
|
|
if (orderList.Count() == 0) |
|
@ -95,54 +113,76 @@ namespace BBWY.Server.Business |
|
|
var orderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList(); |
|
|
var orderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList(); |
|
|
|
|
|
|
|
|
detailList = new List<XingXiangItemResponse>(); |
|
|
detailList = new List<XingXiangItemResponse>(); |
|
|
var totalSDOrderCost = 0M; |
|
|
|
|
|
foreach (var order in orderList) |
|
|
foreach (var order in orderList) |
|
|
{ |
|
|
{ |
|
|
var skuCount = orderSkuList.Count(osku => osku.OrderId == order.Id); |
|
|
var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList(); |
|
|
var currentOrderSkuGroupsSelect = orderSkuList.Where(osku => osku.OrderId == order.Id); |
|
|
|
|
|
if (xingXiangSearchOrderRequest.SpuList != null && xingXiangSearchOrderRequest.SpuList.Count() > 0) |
|
|
if (order.StorageType == Enums.StorageType.SD) |
|
|
currentOrderSkuGroupsSelect = currentOrderSkuGroupsSelect.Where(osku => xingXiangSearchOrderRequest.SpuList.Contains(osku.ProductId)); |
|
|
{ |
|
|
var currentOrderSkuGroups = currentOrderSkuGroupsSelect.GroupBy(osku => osku.ProductId); |
|
|
XingXiangCumulative(detailList, currentOrderSkuList[0].ProductId, true, order.Profit ?? 0M, order.OrderSellerPrice, Math.Abs(order.Profit ?? 0M)); |
|
|
foreach (var group in currentOrderSkuGroups) |
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var currentOrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id); |
|
|
|
|
|
var spuGroups = currentOrderSkuList.GroupBy(osku => osku.ProductId); |
|
|
|
|
|
|
|
|
|
|
|
var tempOrderProdcutAmount = currentOrderSkuList.Sum(osku => osku.ItemTotal * osku.Price) ?? 0M; |
|
|
|
|
|
var tempOrderCost = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.TotalCost) : 0M; |
|
|
|
|
|
var tempOrderProfit = tempOrderProdcutAmount - tempOrderCost; |
|
|
|
|
|
|
|
|
|
|
|
foreach (var spuGroup in spuGroups) |
|
|
{ |
|
|
{ |
|
|
var spuId = group.Key; |
|
|
var currentSpuCostDetailList = currentOrderCostDetailList.Where(ocd => ocd.ProductId == spuGroup.Key); |
|
|
|
|
|
|
|
|
var profit = 0M; |
|
|
var tempSpuProductAmount = spuGroup.Sum(osku => osku.Price * osku.ItemTotal) ?? 0M; |
|
|
var sdCost = 0M; |
|
|
var tempSpuCost = currentSpuCostDetailList.Count() > 0 ? currentSpuCostDetailList.Sum(ocd => ocd.TotalCost) : 0M; |
|
|
var prodcutAmount = group.Sum(osku => osku.Price * osku.ItemTotal) ?? 0; //货款
|
|
|
var tempSpuProfit = tempSpuProductAmount - tempSpuCost; |
|
|
var skuSellerPreferentialAmount = order.SellerPreferentialAmount / skuCount * group.Count(); //该SPU分摊的商家优惠金额
|
|
|
var spuProfitPercent = tempOrderProfit == 0M ? 0M : tempSpuProfit / tempOrderProfit; |
|
|
prodcutAmount -= skuSellerPreferentialAmount; |
|
|
|
|
|
var commissionAmount = prodcutAmount * platformCommissionRatio; //该SPU的平台扣点金额
|
|
|
var realSpuProfit = (order.Profit ?? 0M) * spuProfitPercent; |
|
|
var freightPriceByUser = order.FreightPrice == 0 ? 0 : order.FreightPrice / skuCount * group.Count(); //该SPU分摊的用户承担运费
|
|
|
XingXiangCumulative(detailList, spuGroup.Key, false, realSpuProfit, 0, 0); |
|
|
var currentOrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id && ocd.ProductId == spuId).ToList(); |
|
|
|
|
|
var purchaseAmount = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.TotalCost) : 0; |
|
|
|
|
|
var deliveryFreight = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.DeliveryExpressFreight) : 0; |
|
|
|
|
|
|
|
|
|
|
|
if (order.StorageType != Enums.StorageType.SD) |
|
|
|
|
|
{ |
|
|
|
|
|
profit = prodcutAmount + freightPriceByUser - purchaseAmount - deliveryFreight - commissionAmount; |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
var sdCommissionAmount = order.SDCommissionAmount.Value / skuCount * group.Count(); |
|
|
|
|
|
profit = 0; |
|
|
|
|
|
sdCost = sdCommissionAmount + commissionAmount + order.DeliveryExpressFreight ?? 0M; |
|
|
|
|
|
totalSDOrderCost += sdCost; |
|
|
|
|
|
} |
|
|
|
|
|
var xxRespose = detailList.FirstOrDefault(xx => xx.Spu == spuId); |
|
|
|
|
|
if (xxRespose == null) |
|
|
|
|
|
{ |
|
|
|
|
|
xxRespose = new XingXiangItemResponse() { Spu = spuId, Profit = 0M }; |
|
|
|
|
|
detailList.Add(xxRespose); |
|
|
|
|
|
} |
|
|
|
|
|
xxRespose.Profit += profit; |
|
|
|
|
|
if (order.StorageType == Enums.StorageType.SD) |
|
|
|
|
|
{ |
|
|
|
|
|
xxRespose.SDOrderCount++; |
|
|
|
|
|
xxRespose.SDOrderAmount += prodcutAmount; |
|
|
|
|
|
xxRespose.SDOrderCost += sdCost; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//foreach (var group in spuGroups)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// var spuId = group.Key;
|
|
|
|
|
|
|
|
|
|
|
|
// var profit = 0M;
|
|
|
|
|
|
// var sdCost = 0M;
|
|
|
|
|
|
// var prodcutAmount = group.Sum(osku => osku.Price * osku.ItemTotal) ?? 0; //货款
|
|
|
|
|
|
// var skuSellerPreferentialAmount = order.SellerPreferentialAmount / skuCount * group.Count(); //该SPU分摊的商家优惠金额
|
|
|
|
|
|
// prodcutAmount -= skuSellerPreferentialAmount;
|
|
|
|
|
|
// var commissionAmount = prodcutAmount * platformCommissionRatio; //该SPU的平台扣点金额
|
|
|
|
|
|
// var freightPriceByUser = order.FreightPrice == 0 ? 0 : order.FreightPrice / skuCount * group.Count(); //该SPU分摊的用户承担运费
|
|
|
|
|
|
// var currentOrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id && ocd.ProductId == spuId).ToList();
|
|
|
|
|
|
// var purchaseAmount = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.TotalCost) : 0;
|
|
|
|
|
|
// var deliveryFreight = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.DeliveryExpressFreight) : 0;
|
|
|
|
|
|
|
|
|
|
|
|
// if (order.StorageType != Enums.StorageType.SD)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// profit = prodcutAmount + freightPriceByUser - purchaseAmount - deliveryFreight - commissionAmount;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else
|
|
|
|
|
|
// {
|
|
|
|
|
|
// var sdCommissionAmount = order.SDCommissionAmount.Value / skuCount * group.Count();
|
|
|
|
|
|
// profit = 0;
|
|
|
|
|
|
// sdCost = sdCommissionAmount + commissionAmount + order.DeliveryExpressFreight ?? 0M;
|
|
|
|
|
|
// totalSDOrderCost += sdCost;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// var xxRespose = detailList.FirstOrDefault(xx => xx.Spu == spuId);
|
|
|
|
|
|
// if (xxRespose == null)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// xxRespose = new XingXiangItemResponse() { Spu = spuId, Profit = 0M };
|
|
|
|
|
|
// detailList.Add(xxRespose);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// xxRespose.Profit += profit;
|
|
|
|
|
|
// if (order.StorageType == Enums.StorageType.SD)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// xxRespose.SDOrderCount++;
|
|
|
|
|
|
// xxRespose.SDOrderAmount += prodcutAmount;
|
|
|
|
|
|
// xxRespose.SDOrderCost += sdCost;
|
|
|
|
|
|
// }
|
|
|
|
|
|
//}
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var sdOrderList = orderList.Where(o => o.StorageType == Enums.StorageType.SD); |
|
|
var sdOrderList = orderList.Where(o => o.StorageType == Enums.StorageType.SD); |
|
@ -150,9 +190,10 @@ namespace BBWY.Server.Business |
|
|
return new XingXinagSearchResponse() |
|
|
return new XingXinagSearchResponse() |
|
|
{ |
|
|
{ |
|
|
ItemList = detailList, |
|
|
ItemList = detailList, |
|
|
TotalSDOrderAmount = sdOrderList.Count() > 0 ? sdOrderList.Sum(o => o.OrderSellerPrice) : 0M, |
|
|
TotalSDOrderAmount = detailList.Sum(xx => xx.SDOrderAmount), |
|
|
TotalSDOrderCount = sdOrderList.Count(), |
|
|
TotalSDOrderCount = sdOrderList.Count(), |
|
|
TotalSDOrderCost = totalSDOrderCost |
|
|
TotalSDOrderCost = detailList.Sum(xx => xx.SDOrderCost), |
|
|
|
|
|
TotalProfit = detailList.Sum(xx => xx.Profit) |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|