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); } }
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)); }
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(); }
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); } }