public BlokingRateListViewModel GetBlockingRateByFactory() { DayOfWeek weekStart = DayOfWeek.Sunday; // or Sunday, or whenever DateTime startingDate = DateTime.Today; while (startingDate.DayOfWeek != weekStart) { startingDate = startingDate.AddDays(-1); } //lấy ngày thứ 2 cách đó 5 tuần DateTime previousFiveWeekStart = startingDate.AddDays(-35); //tổng số PO được inspect rồi var list = _appDbContext.Inspections.Where(t => t.InspectDate.Date >= previousFiveWeekStart.Date && t.InspectDate.Date < startingDate.Date && t.InspectStatus == true).ToList(); var manufacturerList = (from so in list//_appDbContext.Inspections : avoid retrieving all inspections to improve performance; btw maybe not list all manufacturer unless list does not collect all group so by so.FactoryName into TotaledFactories select new { FactoryName = TotaledFactories.Key, }); List <BlokingRateViewModel> brList = new List <BlokingRateViewModel>(); foreach (var item in manufacturerList) { var rejectPO = list.Where(x => x.Result == (int)InspectionResultEnum.Reject && x.FactoryName == item.FactoryName).Count(); var totalPO = list.Where(x => x.FactoryName == item.FactoryName).Count(); //var factoryId = list.FirstOrDefault(x => x.FactoryName == item.FactoryName).FactoryId; var blockingRate = totalPO == 0 ? 0 : (int)Math.Round((double)(100 * rejectPO) / totalPO); BlokingRateViewModel br = new BlokingRateViewModel() { RejectPO = rejectPO, TotalPO = totalPO, FactoryName = item.FactoryName, BlockingRate = blockingRate //FactoryId = factoryId }; brList.Add(br); } BlokingRateListViewModel result = new BlokingRateListViewModel() { BlockingRateList = brList, StartDate = previousFiveWeekStart.AddDays(1).ToString("d"), EndDate = startingDate.AddDays(-1).ToString("d") }; return(result); }
public List <NumberOfPONeedCheckViewModel> GetNumberOfPONeedToCheckListByFactory(BlokingRateListViewModel blockingRateList) { List <NumberOfPONeedCheckViewModel> numberOfPONeedToCheckList = new List <NumberOfPONeedCheckViewModel>(); var importHelper = new ImportHelper(); int weekOfYear = importHelper.GetIso8601WeekOfYear(DateTime.Now); int currentYear = DateTime.Now.Year; int finalWeekId = 0; var currentFinalWeek = _appDbContext.FinalWeeks.FirstOrDefault(x => x.Week == weekOfYear && x.Year == currentYear); if (currentFinalWeek != null) { finalWeekId = currentFinalWeek.FinalWeekId; } foreach (var item in blockingRateList.BlockingRateList) { NumberOfPONeedCheckViewModel numberOfPONeedToCheck = new NumberOfPONeedCheckViewModel(); var blockingRate = item.TotalPO == 0 ? 0 : (int)Math.Round((double)(100 * item.RejectPO) / item.TotalPO); var numberRate = (blockingRate - 1) / 5; var totalPO = _appDbContext.Inspections.Where(t => t.FinalWeekId == finalWeekId && t.FactoryName == item.FactoryName).Count(); var listOfImplantation = _appDbContext.Inspections.Where(t => t.FinalWeekId == finalWeekId && t.FactoryName == item.FactoryName && t.OrderType == (int)OrderTypeEnum.Implantation).Count(); //var listOfImplantation = _appDbContext.Inspections.Where(t => t.DateChecked.Date >= Convert.ToDateTime(blockingRateList.StartDate) && t.DateChecked.Date < Convert.ToDateTime(blockingRateList.EndDate) && t.FactoryName == item.FactoryName && t.OrderType == (int)OrderType.Implantation).Count(); int numberCheck = 0; if (blockingRate <= 5) { var rate = Decimal.Divide(1, 16); numberCheck = (int)Math.Round(totalPO * rate); if (numberCheck < listOfImplantation) { numberCheck = listOfImplantation; } } else if (blockingRate > 5 && blockingRate <= 10) { var rate = Decimal.Divide(1, 8); numberCheck = (int)Math.Round(totalPO * rate); if (numberCheck < listOfImplantation) { numberCheck = listOfImplantation; } } else if (blockingRate > 10 && blockingRate <= 25) { var rate = Decimal.Divide(1, 2); numberCheck = (int)Math.Round(totalPO * rate); if (numberCheck < listOfImplantation) { numberCheck = listOfImplantation; } } else { numberCheck = totalPO; } numberOfPONeedToCheck.FactoryName = item.FactoryName; numberOfPONeedToCheck.BlockingRate = blockingRate; numberOfPONeedToCheck.NumberOfPONeedToCheck = numberCheck; numberOfPONeedToCheck.TotalPO = totalPO; numberOfPONeedToCheckList.Add(numberOfPONeedToCheck); } return(numberOfPONeedToCheckList); }