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; using System.Collections.Generic; using System.Linq; using Yitter.IdGenerator; namespace BBWY.Server.Business { public class StatisticsBusiness : BaseBusiness, IDenpendency { private IList 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.已取消 }; this.freeSqlMultiDBManager = freeSqlMultiDBManager; } public OrderAchievementResponse GetOrderAchievementStatistics(OrderAchievementRequest request) { request.EndTime = request.EndTime.Date.AddDays(1).AddSeconds(-1); var response = fsql.Select().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().Where(s => s.ShopId == shopId).ToOne(); if (mdsShop != null) { var advCost = freeSqlMultiDBManager.JDXXfsql.Select().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 detailList = null; //查询订单 var orderList = fsql.Select().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().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().Where(osku => orderIdList.Contains(osku.OrderId)).ToList(); //查询成本明细 var orderCostDetailList = fsql.Select().Where(ocd => orderIdList.Contains(ocd.OrderId)).ToList(); detailList = new List(); 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 }; } } }