예제 #1
0
        /// <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());
        }
예제 #2
0
        /// <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));
        }
예제 #3
0
        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);
        }