/// <summary> /// 打印日结报表 /// </summary> /// <returns></returns> public TResult Daily(string printKey) { var result = new TResult(); var printConfigData = _printGateway.Get(printKey); if (printConfigData == null) { return(result.FailureResult("打印机配置不正确")); } var reportList = new ReportStatisticsModel { List = new List <TicketSaleCount>() }; var user = _enterpriseUserService.LoginForSession(); var nowDate = DateTime.Now.Date; var endTime = nowDate.AddDays(1); var list = _orderDetailRepository.db.Queryable <Tbl_OrderDetail, Tbl_Ticket, Tbl_Order, Tbl_TicketType>((a, b, c, d) => new object[] { JoinType.Left, a.TicketId == b.TicketId, JoinType.Inner, a.OrderNo == c.OrderNo, JoinType.Left, b.TypeId == d.Id }) .Where((a, b, c, d) => a.ScenicId == user.ScenicId && a.SellerId == user.UserId && c.SellerId == user.UserId && a.TicketSource == (int)TicketSourceStatus.ScenicSpot && a.CreateTime >= nowDate && a.CreateTime < endTime && ((a.OrderStatus == (int)OrderDetailsDataStatus.IsTaken) || (a.OrderStatus == (int)OrderDetailsDataStatus.Activate) || (a.OrderStatus == (int)OrderDetailsDataStatus.Consume) || (a.OrderStatus == (int)OrderDetailsDataStatus.Canncel) || (a.OrderStatus == (int)OrderDetailsDataStatus.Refund))) .Select((a, b, c, d) => new { OrderDtlId = a.OrderDetailId, TicketId = a.TicketId, TicketName = a.TicketName, TicketType = d.TicketType, OrderNo = a.OrderNo, PayType = (PayStatus)c.PayType, OrderType = a.OrderType, Price = a.Price, Quantity = a.Quantity, ShelvesChannel = b.ShelvesChannel, OrderStatus = a.OrderStatus, CreateTime = a.CreateTime }).ToList(); if (list.Count <= 0) { return(result.FailureResult("今天售卖门票数量为0,不能打印")); } var refundList = list.Where(p => p.OrderStatus == (int)OrderDetailsDataStatus.Refund).ToList(); var startData = list.OrderBy(a => a.CreateTime).FirstOrDefault(); var endData = list.OrderByDescending(a => a.CreateTime).FirstOrDefault(); PrintReportData printData = new PrintReportData { RealName = user.RealName, StartTime = startData.CreateTime.ToString("yyyy-MM-dd HH:dd:ss"), EndTime = endData.CreateTime.ToString("yyyy-MM-dd HH:dd:ss"), TotalCount = list.Sum(p => p.Quantity), TotalAmount = list.Sum(p => p.Quantity * p.Price), RefundTotalCount = refundList.Sum(p => p.Quantity), RefundTotalAmount = refundList.Sum(p => p.Quantity * p.Price), PrintBulkTicket = new PrintTicketList(), PrintTeamTicket = new PrintTicketList() }; var totalList = list.GroupBy(a => new { a.TicketId, a.TicketName, a.PayType, a.TicketType }).Select(a => new PrintTicketData { TicketId = a.Key.TicketId, TicketName = a.Key.TicketName, TotalCount = a.Sum(b => b.Quantity), TotalAmount = a.Sum(b => b.Quantity * b.Price), TicketType = a.Key.TicketType, PayType = (int)a.Key.PayType }).ToList(); //散客票 printData.PrintBulkTicket.Alipay = totalList.Where(p => p.PayType == (int)PayStatus.Alipay && p.TicketType == (int)ShelvesChannelEnum.IndividualTicket).ToList(); printData.PrintBulkTicket.ReadyMoney = totalList.Where(p => p.PayType == (int)PayStatus.ReadyMoney && p.TicketType == (int)ShelvesChannelEnum.IndividualTicket).ToList(); printData.PrintBulkTicket.Wechat = totalList.Where(p => p.PayType == (int)PayStatus.Wechat && p.TicketType == (int)ShelvesChannelEnum.IndividualTicket).ToList(); //团队票 printData.PrintTeamTicket.Alipay = totalList.Where(p => p.PayType == (int)PayStatus.Alipay && p.TicketType == (int)ShelvesChannelEnum.TeamTicket).ToList(); printData.PrintTeamTicket.ReadyMoney = totalList.Where(p => p.PayType == (int)PayStatus.ReadyMoney && p.TicketType == (int)ShelvesChannelEnum.TeamTicket).ToList(); printData.PrintTeamTicket.Wechat = totalList.Where(p => p.PayType == (int)PayStatus.Wechat && p.TicketType == (int)ShelvesChannelEnum.TeamTicket).ToList(); _printGateway.Send(printData, printConfigData); return(result.SuccessResult()); }
/// <summary> /// 日结报表统计 /// </summary> /// <returns></returns> public TResult <ReportStatisticsModel> ReportStatistics() { var result = new TResult <ReportStatisticsModel>(); var reportList = new ReportStatisticsModel { List = new List <TicketSaleCount>() }; var user = _enterpriseUserService.LoginForSession(); var nowDate = DateTime.Now.Date; var endTime = nowDate.AddDays(1).Date; var list = _orderDetailRepository.db.Queryable <Tbl_OrderDetail, Tbl_Ticket, Tbl_Order>((a, b, c) => new object[] { JoinType.Left, a.TicketId == b.TicketId, JoinType.Inner, a.OrderNo == c.OrderNo }) .Where((a, b, c) => a.ScenicId == user.ScenicId && a.SellerId == user.UserId && c.SellerId == user.UserId && a.TicketSource == (int)TicketSourceStatus.ScenicSpot && a.CreateTime >= nowDate && a.CreateTime < endTime && ((a.OrderStatus == (int)OrderDetailsDataStatus.IsTaken) || (a.OrderStatus == (int)OrderDetailsDataStatus.Activate) || (a.OrderStatus == (int)OrderDetailsDataStatus.Consume) || (a.OrderStatus == (int)OrderDetailsDataStatus.Canncel) || (a.OrderStatus == (int)OrderDetailsDataStatus.Refund))) .Select((a, b, c) => new { OrderDtlId = a.OrderDetailId, TicketId = a.TicketId, TicketName = a.TicketName, OrderNo = a.OrderNo, PayType = (PayStatus)c.PayType, OrderType = a.OrderType, Price = a.Price, Quantity = a.Quantity, ShelvesChannel = b.ShelvesChannel, OrderStatus = a.OrderStatus, CreateTime = a.CreateTime, SellerId = a.SellerId }).ToList(); reportList.TotalAmount = list.Sum(p => (decimal)p.Quantity * p.Price); reportList.TotalCount = list.Sum(p => p.Quantity); reportList.AlipayAmount = list.Where(p => p.PayType == PayStatus.Alipay).Sum(p => (decimal)p.Quantity * p.Price); reportList.CashAmount = list.Where(p => p.PayType == PayStatus.ReadyMoney).Sum(p => (decimal)p.Quantity * p.Price); reportList.WxPayAmount = list.Where(p => p.PayType == PayStatus.Wechat).Sum(p => (decimal)p.Quantity * p.Price); var shelvesChannelType = ((int)ShelvesChannelEnum.TeamTicket).ToString();//上线渠道 var refundList = list.Where(p => p.OrderStatus == (int)OrderDetailsDataStatus.Refund).ToList(); reportList.TotalRefundAmount = refundList.Sum(p => (decimal)p.Quantity * p.Price); reportList.TotalRefundCount = refundList.Sum(p => p.Quantity); reportList.AlipayRefundAmount = refundList.Where(p => p.PayType == PayStatus.Alipay).Sum(p => (decimal)p.Quantity * p.Price); reportList.CashRefundAmount = refundList.Where(p => p.PayType == PayStatus.ReadyMoney).Sum(p => (decimal)p.Quantity * p.Price); reportList.WxPayRefundAmount = refundList.Where(p => p.PayType == PayStatus.Wechat).Sum(p => (decimal)p.Quantity * p.Price); foreach (var row in list) { reportList.List.Add(new TicketSaleCount { OrderNo = row.OrderNo, TicketName = row.TicketName, TicketId = row.TicketId, Price = row.Price, Count = row.Quantity, Amount = (decimal)row.Quantity * row.Price, RefundAmount = 0, RefundCount = 0 }); } foreach (var row in refundList) { reportList.List.Add(new TicketSaleCount { OrderNo = row.OrderNo, TicketName = row.TicketName, TicketId = row.TicketId, Price = row.Price, Count = 0, Amount = 0, RefundAmount = (decimal)row.Quantity * row.Price, RefundCount = row.Quantity }); } reportList.List = reportList.List.GroupBy(a => new { a.TicketId, a.TicketName, a.Price }).Select(a => new TicketSaleCount { TicketName = a.Key.TicketName, TicketId = a.Key.TicketId, Price = a.Key.Price, Amount = a.Sum(b => b.Amount), Count = a.Sum(b => b.Count), RefundAmount = a.Sum(b => b.RefundAmount), RefundCount = a.Sum(b => b.RefundCount), }).ToList(); return(result.SuccessResult(reportList)); }
public async Task <ReportStatisticsModel> GetStatisticsAsync() { var all = (await _context.ReportRequests .Find(Builders <ReportRequest> .Filter.Empty) .Project(Builders <ReportRequest> .Projection .Include("ExportType") .Include("RequestDateTimeUtc") .Include("ResponseDateTimeUtc") .Include("ReportType")) .ToListAsync()) .Select(bson => BsonSerializer.Deserialize <ReportRequestItem>(bson)) .ToList(); var model = new ReportStatisticsModel() { TotalCount = all.Count, }; var countByReportTypeTotal = new Dictionary <string, int>(20); var countByExportTypeTotal = new Dictionary <string, int>(10); var countByReportTypeToday = new Dictionary <string, int>(20); var countByExportTypeToday = new Dictionary <string, int>(10); var reportRenderTimeByReportType = new Dictionary <string, List <int> >(20); var reportRenderTimeByExportType = new Dictionary <string, List <int> >(10); foreach (var request in all) { var today = request.RequestDateTimeUtc.ToLocalTime().Date == DateTime.Today; if (today) { model.TodayCount++; if (!countByReportTypeToday.TryAdd(request.ReportType, 1)) { countByReportTypeToday[request.ReportType]++; } if (!countByExportTypeToday.TryAdd(request.ExportType, 1)) { countByExportTypeToday[request.ExportType]++; } } if (!countByReportTypeTotal.TryAdd(request.ReportType, 1)) { countByReportTypeTotal[request.ReportType]++; } if (!countByExportTypeTotal.TryAdd(request.ExportType, 1)) { countByExportTypeTotal[request.ExportType]++; } var renderTime = (int)request.ResponseDateTimeUtc.Subtract(request.RequestDateTimeUtc).TotalMilliseconds; reportRenderTimeByReportType.TryAdd(request.ReportType, new List <int>()); reportRenderTimeByReportType[request.ReportType].Add(renderTime); reportRenderTimeByExportType.TryAdd(request.ExportType, new List <int>()); reportRenderTimeByExportType[request.ExportType].Add(renderTime); } model.CountByExportTypeTotal = countByExportTypeTotal.OrderByDescending(x => x.Value); model.CountByReportTypeTotal = countByReportTypeTotal.OrderByDescending(x => x.Value); model.CountByExportTypeToday = countByExportTypeToday.OrderByDescending(x => x.Value); model.CountByReportTypeToday = countByReportTypeToday.OrderByDescending(x => x.Value); model.AverageReportRenderTimeByExportType = reportRenderTimeByExportType.Select(pair => new KeyValuePair <string, int>(pair.Key, (int)pair.Value.Average())) .OrderByDescending(x => x.Value); model.AverageReportRenderTimeByReportType = reportRenderTimeByReportType.Select(pair => new KeyValuePair <string, int>(pair.Key, (int)pair.Value.Average())) .OrderByDescending(x => x.Value); return(model); }