using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Db; 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; public StatisticsBusiness(IFreeSql fsql, NLog.ILogger logger, IIdGenerator idGenerator) : base(fsql, logger, idGenerator) { invalidOrderStateList = new List() { Enums.OrderState.待付款, Enums.OrderState.已取消 }; } 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) }); return response; } public IList XingXiangStatistics(XingXiangSearchOrderRequest xingXiangSearchOrderRequest) { var beginTime = xingXiangSearchOrderRequest.SearchDate.Date; var endTime = xingXiangSearchOrderRequest.SearchDate.Date.AddDays(1).AddSeconds(-1); IList list = null; //查询订单 var select = fsql.Select().Where(o => o.ShopId == xingXiangSearchOrderRequest.ShopId) .Where(o => o.StartTime >= beginTime && o.StartTime <= endTime); var childSelect = fsql.Select().As("osku") .Where(osku => xingXiangSearchOrderRequest.SpuList.Contains(osku.ProductId)); select = select.Where(o => childSelect.Where(osku => osku.OrderId == o.Id).Any()); var orderList = select.ToList(); 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(); list = new List(); foreach (var order in orderList) { var skuCount = orderSkuList.Count(osku => osku.OrderId == order.Id); var currentOrderSkuGroups = orderSkuList.Where(osku => osku.OrderId == order.Id && xingXiangSearchOrderRequest.SpuList.Contains(osku.ProductId)).GroupBy(osku => osku.ProductId); foreach (var group in currentOrderSkuGroups) { var spuId = group.Key; var procutAmount = group.Sum(osku => osku.Price * osku.ItemTotal) ?? 0; //货款 var commissionAmount = procutAmount * 0.05M; //该SPU的平台扣点金额 var freightPriceByUser = order.FreightPrice == 0 ? 0 : order.FreightPrice / skuCount * group.Count(); //该SPU分配的用户承担运费 var currentOrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == spuId).ToList(); var purchaseAmount = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.TotalCost) : 0; var deliveryFreight = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.DeliveryExpressFreight) : 0; var profit = procutAmount + freightPriceByUser - purchaseAmount - deliveryFreight - commissionAmount; var xxRespose = list.FirstOrDefault(xx => xx.Spu == spuId); if (xxRespose == null) xxRespose = new XingXinagSearchResponse() { Spu = spuId, Profit = 0M }; xxRespose.Profit += profit; } } return list; } } }