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

122 lines
6.8 KiB

3 years ago
using BBWY.Common.Models;
using BBWY.Server.Model;
3 years ago
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto;
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;
3 years ago
public StatisticsBusiness(IFreeSql fsql, NLog.ILogger logger, IIdGenerator idGenerator) : base(fsql, logger, idGenerator)
{
invalidOrderStateList = new List<Enums.OrderState>() { Enums.OrderState., Enums.OrderState. };
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 &&
!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)
});
return response;
}
3 years ago
public XingXinagSearchResponse XingXiangStatistics(XingXiangSearchOrderRequest xingXiangSearchOrderRequest)
{
var beginTime = xingXiangSearchOrderRequest.SearchDate.Date;
var endTime = xingXiangSearchOrderRequest.SearchDate.Date.AddDays(1).AddSeconds(-1);
3 years ago
IList<XingXiangItemResponse> detailList = null;
//查询订单
3 years ago
var orderList = fsql.Select<Order>().Where(o => o.ShopId == xingXiangSearchOrderRequest.ShopId)
.Where(o => o.StartTime >= beginTime && o.StartTime <= endTime)
.Where(o => !invalidOrderStateList.Contains(o.OrderState.Value))
.ToList();
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)).ToList();
3 years ago
detailList = new List<XingXiangItemResponse>();
var totalSDOrderCost = 0M;
foreach (var order in orderList)
{
var skuCount = orderSkuList.Count(osku => osku.OrderId == order.Id);
3 years ago
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));
3 years ago
var currentOrderSkuGroups = currentOrderSkuGroupsSelect.GroupBy(osku => osku.ProductId);
foreach (var group in currentOrderSkuGroups)
{
var spuId = group.Key;
3 years ago
var prodcutAmount = group.Sum(osku => osku.Price * osku.ItemTotal) ?? 0; //货款
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 == spuId).ToList();
3 years ago
var purchaseAmount = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.TotalCost) : 0;
var deliveryFreight = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.DeliveryExpressFreight) : 0;
3 years ago
var profit = 0M;
if (order.StorageType != Enums.StorageType.SD)
profit = prodcutAmount + freightPriceByUser - purchaseAmount - deliveryFreight - commissionAmount;
else
{
var sdCommissionAmount = order.SDCommissionAmount.Value / skuCount * group.Count();
profit = 0 - sdCommissionAmount - commissionAmount - deliveryFreight;
totalSDOrderCost += Math.Abs(profit);
}
var xxRespose = detailList.FirstOrDefault(xx => xx.Spu == spuId);
if (xxRespose == null)
3 years ago
{
3 years ago
xxRespose = new XingXiangItemResponse() { Spu = spuId, Profit = 0M };
detailList.Add(xxRespose);
3 years ago
}
xxRespose.Profit += profit;
3 years ago
if (order.StorageType == Enums.StorageType.SD)
{
xxRespose.SDOrderCount++;
3 years ago
xxRespose.SDOrderAmount += prodcutAmount;
xxRespose.SDOrderCost += Math.Abs(profit);
3 years ago
}
}
}
3 years ago
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
};
}
3 years ago
}
}