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

202 lines
12 KiB

3 years ago

using BBWY.Common.Models;
using BBWY.Server.Model;
3 years ago
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Db.Mds;
3 years ago
using BBWY.Server.Model.Dto;
3 years ago
using System;
using System.Collections.Generic;
using System.Linq;
3 years ago
using Yitter.IdGenerator;
namespace BBWY.Server.Business
{
public class StatisticsBusiness : BaseBusiness, IDenpendency
{
private IList<Enums.OrderState> invalidOrderStateList;
private FreeSqlMultiDBManager freeSqlMultiDBManager;
public StatisticsBusiness(IFreeSql fsql, NLog.ILogger logger, IIdGenerator idGenerator, FreeSqlMultiDBManager freeSqlMultiDBManager) : base(fsql, logger, idGenerator)
3 years ago
{
invalidOrderStateList = new List<Enums.OrderState>() { Enums.OrderState., Enums.OrderState. };
this.freeSqlMultiDBManager = freeSqlMultiDBManager;
3 years ago
}
public OrderAchievementResponse GetOrderAchievementStatistics(OrderAchievementRequest request)
3 years ago
{
request.EndTime = request.EndTime.Date.AddDays(1).AddSeconds(-1);
var response = fsql.Select<Order, OrderCost>().LeftJoin((o, oc) => o.Id == oc.OrderId)
.Where((o, oc) => o.ShopId == request.ShopId &&
o.OrderState != null &&
3 years ago
!invalidOrderStateList.Contains(o.OrderState.Value) && //排除待付款和取消
o.StartTime >= request.StartTime &&
o.StartTime <= request.EndTime)
.ToAggregate((o, oc) => new OrderAchievementResponse()
3 years ago
{
OrderCount = o.Count(),
Profit = oc.Sum(oc.Key.Profit),
SaleAmount = o.Sum(o.Key.OrderPayment),
DeliveryExpressFreight = oc.Sum(oc.Key.DeliveryExpressFreight),
PlatformCommissionAmount = oc.Sum(oc.Key.PlatformCommissionAmount),
PurchaseAmount = oc.Sum(oc.Key.PurchaseAmount)
});
var shopId = request.ShopId.ToString();
var mdsShop = freeSqlMultiDBManager.MDSfsql.Select<Shops>().Where(s => s.ShopId == shopId).ToOne();
if (mdsShop != null)
{
var advCost = freeSqlMultiDBManager.JDXXfsql.Select<Shopsdetail>().Where(s => s.ShopsId == mdsShop.Id &&
s.CreateTime >= request.StartTime &&
s.CreateTime <= request.EndTime)
.ToAggregate(s => s.Sum(s.Key.ExpressCost + s.Key.ShotgunCost));
response.AdvCost = advCost;
response.Profit -= advCost;
}
3 years ago
return response;
}
3 years ago
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;
}
}
3 years ago
public XingXinagSearchResponse XingXiangStatistics(XingXiangSearchOrderRequest xingXiangSearchOrderRequest)
{
3 years ago
var mdsShop = freeSqlMultiDBManager.MDSfsql.Select<Shops>().Where(s => s.ShopId == xingXiangSearchOrderRequest.ShopId.ToString()).ToOne();
var platformCommissionRatio = mdsShop.PlatformCommissionRatio ?? 0.05M;
var beginTime = xingXiangSearchOrderRequest.SearchDate.Date;
var endTime = xingXiangSearchOrderRequest.SearchDate.Date.AddDays(1).AddSeconds(-1);
3 years ago
IList<XingXiangItemResponse> detailList = null;
//查询订单
var orderList = fsql.Select<Order, OrderCost>().InnerJoin((o, oc) => o.Id == oc.OrderId)
.Where((o, oc) => o.ShopId == xingXiangSearchOrderRequest.ShopId)
.Where((o, oc) => o.StartTime >= beginTime && o.StartTime <= endTime)
.Where((o, oc) => !invalidOrderStateList.Contains(o.OrderState.Value))
3 years ago
.OrderByDescending((o, oc) => o.StartTime)
.ToList((o, oc) => new Order()
{
Id = o.Id,
//FreightPrice = o.FreightPrice,
OrderState = o.OrderState,
OrderTotalPrice = o.OrderTotalPrice,
StartTime = o.StartTime,
StorageType = o.StorageType,
ShopId = o.ShopId,
//SDCommissionAmount = oc.SDCommissionAmount,
//DeliveryExpressFreight = oc.DeliveryExpressFreight,
//PreferentialAmount = oc.PreferentialAmount,
3 years ago
OrderSellerPrice = o.OrderSellerPrice,
//SellerPreferentialAmount = o.SellerPreferentialAmount,
3 years ago
Profit = oc.Profit
});
if (orderList.Count() == 0)
return null;
var orderIdList = orderList.Select(o => o.Id).ToList();
//查询orderSku
var orderSkuList = fsql.Select<OrderSku>().Where(osku => orderIdList.Contains(osku.OrderId)).ToList();
//查询成本明细
3 years ago
var orderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList();
3 years ago
detailList = new List<XingXiangItemResponse>();
foreach (var order in orderList)
{
3 years ago
var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList();
if (order.StorageType == Enums.StorageType.SD)
{
XingXiangCumulative(detailList, currentOrderSkuList[0].ProductId, true, order.Profit ?? 0M, order.OrderSellerPrice, Math.Abs(order.Profit ?? 0M));
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)
{
3 years ago
var currentSpuCostDetailList = currentOrderCostDetailList.Where(ocd => ocd.ProductId == spuGroup.Key);
var tempSpuProductAmount = spuGroup.Sum(osku => osku.Price * osku.ItemTotal) ?? 0M;
var tempSpuCost = currentSpuCostDetailList.Count() > 0 ? currentSpuCostDetailList.Sum(ocd => ocd.TotalCost) : 0M;
var tempSpuProfit = tempSpuProductAmount - tempSpuCost;
var spuProfitPercent = tempOrderProfit == 0M ? 0M : tempSpuProfit / tempOrderProfit;
var realSpuProfit = (order.Profit ?? 0M) * spuProfitPercent;
XingXiangCumulative(detailList, spuGroup.Key, false, realSpuProfit, 0, 0);
}
3 years ago
//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;
// }
//}
}
3 years ago
var sdOrderList = orderList.Where(o => o.StorageType == Enums.StorageType.SD);
return new XingXinagSearchResponse()
{
ItemList = detailList,
3 years ago
TotalSDOrderAmount = detailList.Sum(xx => xx.SDOrderAmount),
3 years ago
TotalSDOrderCount = sdOrderList.Count(),
3 years ago
TotalSDOrderCost = detailList.Sum(xx => xx.SDOrderCost),
TotalProfit = detailList.Sum(xx => xx.Profit)
3 years ago
};
}
3 years ago
}
}