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.
156 lines
9.8 KiB
156 lines
9.8 KiB
using BBWY.Common.Models;
|
|
using BBWY.Server.Model;
|
|
using BBWY.Server.Model.Db;
|
|
using BBWY.Server.Model.Db.Mds;
|
|
using BBWY.Server.Model.Dto;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
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)
|
|
{
|
|
invalidOrderStateList = new List<Enums.OrderState>() { Enums.OrderState.待付款, Enums.OrderState.已取消 };
|
|
this.freeSqlMultiDBManager = freeSqlMultiDBManager;
|
|
}
|
|
|
|
public OrderAchievementResponse GetOrderAchievementStatistics(OrderAchievementRequest request)
|
|
{
|
|
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 &&
|
|
!invalidOrderStateList.Contains(o.OrderState.Value) && //排除待付款和取消
|
|
o.StartTime >= request.StartTime &&
|
|
o.StartTime <= request.EndTime)
|
|
.ToAggregate((o, oc) => new OrderAchievementResponse()
|
|
{
|
|
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;
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
public XingXinagSearchResponse XingXiangStatistics(XingXiangSearchOrderRequest xingXiangSearchOrderRequest)
|
|
{
|
|
var beginTime = xingXiangSearchOrderRequest.SearchDate.Date;
|
|
var endTime = xingXiangSearchOrderRequest.SearchDate.Date.AddDays(1).AddSeconds(-1);
|
|
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))
|
|
.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())
|
|
.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,
|
|
OrderSellerPrice = o.OrderSellerPrice
|
|
});
|
|
|
|
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();
|
|
//查询成本明细
|
|
var orderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList();
|
|
|
|
detailList = new List<XingXiangItemResponse>();
|
|
var totalSDOrderCost = 0M;
|
|
foreach (var order in orderList)
|
|
{
|
|
var skuCount = orderSkuList.Count(osku => osku.OrderId == order.Id);
|
|
var currentOrderSkuGroupsSelect = orderSkuList.Where(osku => osku.OrderId == order.Id);
|
|
if (xingXiangSearchOrderRequest.SpuList != null && xingXiangSearchOrderRequest.SpuList.Count() > 0)
|
|
currentOrderSkuGroupsSelect = currentOrderSkuGroupsSelect.Where(osku => xingXiangSearchOrderRequest.SpuList.Contains(osku.ProductId));
|
|
var currentOrderSkuGroups = currentOrderSkuGroupsSelect.GroupBy(osku => osku.ProductId);
|
|
foreach (var group in currentOrderSkuGroups)
|
|
{
|
|
var spuId = group.Key;
|
|
|
|
var profit = 0M;
|
|
var sdCost = 0M;
|
|
var prodcutAmount = group.Sum(osku => osku.Price * osku.ItemTotal) ?? 0; //货款
|
|
var preferentialAmount = order.PreferentialAmount / skuCount * group.Count(); //该SPU分摊的商家优惠金额
|
|
prodcutAmount -= preferentialAmount;
|
|
var commissionAmount = prodcutAmount * 0.05M; //该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);
|
|
|
|
return new XingXinagSearchResponse()
|
|
{
|
|
ItemList = detailList,
|
|
TotalSDOrderAmount = sdOrderList.Count() > 0 ? sdOrderList.Sum(o => o.OrderSellerPrice) : 0M,
|
|
TotalSDOrderCount = sdOrderList.Count(),
|
|
TotalSDOrderCost = totalSDOrderCost
|
|
};
|
|
|
|
}
|
|
}
|
|
}
|
|
|