示例#1
0
        private string GetValue(ReportTimeType reportTimeType, DateTime end)
        {
            switch (reportTimeType)
            {
            case ReportTimeType.Daily:
                return(end.ToString("dd-MMMM-yyyy"));

            case ReportTimeType.Weekly:
                Calendar calendar = new GregorianCalendar();
                string   value    = "Week " + calendar.GetWeekOfYear(
                    end,
                    CalendarWeekRule.FirstDay,
                    DayOfWeek.Sunday) + "-" + end.Year;
                return(value);

            case ReportTimeType.Monthly:
                return(end.ToString("MMMM-yyyy"));

            case ReportTimeType.Yearly:
                return(end.ToString("yyyy"));

            default:
                throw new ArgumentOutOfRangeException(nameof(reportTimeType), reportTimeType, null);
            }
        }
示例#2
0
        private void UpsertDailyAllProduct(
            string shopId,
            ReportTimeType reportTimeType,
            DateTime operationDate,
            List <PurchaseDetail> purchaseDetails,
            List <SaleDetail> saleDetails,
            List <ProductDetail> productDetails,
            List <ProductCategory> categories)
        {
            Console.WriteLine($"Operation date : {operationDate}");
            var dailyPurchase = purchaseDetails.Where(x => x.Modified.Date == operationDate);
            var dailySales    = saleDetails.Where(x => x.Modified.Date == operationDate);

            List <IGrouping <string, PurchaseDetail> > purchaseDetailsGrouped =
                dailyPurchase.GroupBy(x => x.ProductDetailId).ToList();
            List <IGrouping <string, SaleDetail> > saleDetailsGrouped = dailySales.GroupBy(x => x.ProductDetailId).ToList();

            //List<string> dailyPurchaseIds = purchaseDetailsGrouped.Select(x => x.Key).ToList();
            //List<string> dailySoldIds = saleDetailsGrouped.Select(x => x.Key).ToList();
            //List<string> dailyAllIds = dailySoldIds.Union(dailyPurchaseIds).ToList();
            List <string> dailyAllIds = productDetails.Select(x => x.Id).Distinct().ToList();


            string value = this.GetValue(reportTimeType, operationDate);
            ReportParameterBase reportParameterBase = new ReportParameterBase(operationDate, value, shopId);

            //foreach (string productDetailId in dailyAllIds)
            //{
            //    this.UpsertDailyProductReport(productDetailId, reportParameterBase, saleDetailsGrouped, purchaseDetailsGrouped, productDetails, categories);
            //}

            Parallel.ForEach(
                dailyAllIds,
                productDetailId => this.UpsertDailyProductReport(
                    productDetailId,
                    reportParameterBase,
                    saleDetailsGrouped,
                    purchaseDetailsGrouped,
                    productDetails,
                    categories));
        }
示例#3
0
        public void ShopClose(string shopId, DateTime start, DateTime end, ReportTimeType reportTimeType)
        {
            DateTime               starts         = DateTime.Now;
            var                    db             = BusinessDbContext.Create();
            List <ProductDetail>   productDetails = db.ProductDetails.Where(x => x.ShopId == shopId).AsQueryable().ToList();
            List <ProductCategory> categories     = db.ProductCategories.Where(x => x.ShopId == shopId)
                                                    .Include(x => x.ProductGroup).ToList();

            var purchaseDetails = db.PurchaseDetails
                                  .Where(x => x.ShopId == shopId && x.Modified >= start && x.Modified <= end)
                                  .OrderBy(x => x.Modified).AsQueryable().ToList();

            var saleDetails = db.SaleDetails
                              .Where(x => x.ShopId == shopId && x.Modified >= start && x.Modified <= end)
                              .OrderBy(x => x.Modified).AsQueryable().ToList();

            var purchaseDates = purchaseDetails.Select(x => x.Modified.Date).Distinct().OrderBy(x => x).ToList();
            var saleDates     = saleDetails.Select(x => x.Modified.Date).Distinct().OrderBy(x => x).ToList();
            var alldates      = purchaseDates.Union(saleDates).OrderBy(x => x).ToList();

            //foreach (DateTime operationDate in alldates)
            //{
            //    this.UpsertDailyAllProduct(shopId, reportTimeType, operationDate, purchaseDetails, saleDetails, productDetails, categories);
            //}

            Parallel.ForEach(
                alldates,
                operationDate => this.UpsertDailyAllProduct(
                    shopId,
                    reportTimeType,
                    operationDate,
                    purchaseDetails,
                    saleDetails,
                    productDetails,
                    categories));

            DateTime ends = DateTime.Now;

            Console.WriteLine("Completed in " + (ends - starts).TotalSeconds);
            Console.Read();
        }
示例#4
0
        public virtual void ShopClose(string shopId, DateTime start, DateTime end, ReportTimeType reportTimeType)
        {
            IQueryable <T> models = this.db.Set <T>().AsQueryable();
            Expression <Func <T, bool> > expression = x => x.ShopId == shopId && x.Modified >= start && x.Modified <= end;
            IQueryable <T> allModelsForTheShop      = models.Where(expression).OrderByDescending(x => x.Modified).AsQueryable();

            switch (reportTimeType)
            {
            case ReportTimeType.Daily:
                var years = allModelsForTheShop.GroupBy(this.yearKeySelector).Select(x => x.Key).ToList();
                foreach (var year in years)
                {
                    List <IGrouping <int?, T> > dailyGroupedModels = allModelsForTheShop
                                                                     .Where(x => x.Modified.Year == year).GroupBy(dayKeySelector).OrderBy(x => x.Key)
                                                                     .ToList();

                    foreach (IGrouping <int?, T> dailyGrouped in dailyGroupedModels)
                    {
                        this.ProcessShopClose(shopId, dailyGrouped);
                    }

                    // Parallel.ForEach(dailyGroupedModels, x => ProcessShopClose(shopId, end, x));
                }

                break;

            case ReportTimeType.Weekly:
                var weeklySales = allModelsForTheShop.GroupBy(weekKeySelector).OrderBy(x => x.Key).ToList();
                foreach (var week in weeklySales)
                {
                    if (week.Any())
                    {
                        List <T> weeklySalesList = week.OrderBy(x => x.Modified).ToList();
                        DateTime date            = weeklySalesList.First().Modified.Date;
                        string   value           = "Week " + calendar.GetWeekOfYear(
                            date,
                            CalendarWeekRule.FirstDay,
                            DayOfWeek.Sunday) + "-" + date.Year;
                        ReportParameterBase p = new ReportParameterBase(date, value, shopId);
                        var reports           = this.CreateReportModels(weeklySalesList, p).ToList();
                        this.SaveReports(reports);
                    }
                }
                break;

            case ReportTimeType.Monthly:
                var monthlySales = allModelsForTheShop.GroupBy(monthKeySelector).OrderBy(x => x.Key).ToList();
                foreach (var month in monthlySales)
                {
                    DateTime date = new DateTime(end.Year, month.Key.Value, 1);
                    if (month.Any())
                    {
                        ReportParameterBase p = new ReportParameterBase(
                            date,
                            date.ToString("MMMM-yyyy"),
                            shopId);
                        var reports = this.CreateReportModels(month.ToList(), p).ToList();
                        this.SaveReports(reports);
                    }
                }

                break;

            case ReportTimeType.Yearly:
                List <IGrouping <int?, T> > yearlySales = allModelsForTheShop.GroupBy(yearKeySelector).ToList();
                foreach (var yearlySale in yearlySales)
                {
                    DateTime            date = new DateTime((int)yearlySale.Key, 1, 1);
                    ReportParameterBase p    = new ReportParameterBase(date,
                                                                       date.ToString("yyyy"), shopId);
                    var reports = this.CreateReportModels(yearlySale.ToList(), p).ToList();
                    this.SaveReports(reports);
                }
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(reportTimeType), reportTimeType, null);
            }
        }