/// <summary> /// Merupakan fungsi yang menghitung nilai hari yang berlaku pada sebuah process /// hari yang berlaku untuk sebuah process dilihat dari nilai hari maksimun yang dimiliki olah proses yang menjadi dependency proses tersebut /// </summary> /// <param name="processDependency">sebuah class processDependency yang berarti dependency yang dimiliki ssebuah proses</param> /// <param name="currentProductProcessDailyScheduleList">sebuah list dari processDailySchedule yang dimiliki oleh process yang akad dihitung nilai harinya</param> /// <returns>sebuah class processday yang berisikan angka hari kapan process dimulai dan seberapa lama hari tersebut digunakan </returns> private ProcessDay GetProcessDay(ProcessDependency processDependency, List <ProcessDailySchedule> currentProductProcessDailyScheduleList) { ProcessDay processDayData = new ProcessDay() { StartDay = 1, UsedDay = 0 }; int maxDay = currentProductProcessDailyScheduleList.Where(x => x.MasterProcessID == processDependency.PredecessorProcessID).Max(m => m.Day); //processDependency.MasterProcessPredecessor.ProcessDailySchedules.Max(x => x.Day); ProcessDailySchedule processDailyScheduleWithMaximumDay = currentProductProcessDailyScheduleList.Where(x => x.Day == maxDay && x.MasterProcessID == processDependency.PredecessorProcessID).FirstOrDefault(); // processDependency.MasterProcessPredecessor.ProcessDailySchedules.Where(x => x.Day == maxDay).Sum(x => x.UsedDay); processDayData.UsedDay = processDailyScheduleWithMaximumDay.UsedDay; if (processDayData.UsedDay < 1) { processDayData.StartDay = maxDay; } else { processDayData.StartDay = maxDay + 1; processDayData.UsedDay = 0; } return(processDayData); }
public ActionResult CalculateTotalDay(int productID) { Products productData = db.Products.Find(productID); var username = User.Identity.Name; try { foreach (MasterProcess item in productData.MasterProcess) { if (item.ProcessDailySchedules.Count() > 0) { db.ProcessDailySchedules.RemoveRange(item.ProcessDailySchedules); db.SaveChanges(); } } ProcessDay processDayData = new ProcessDay() { StartDay = 0, UsedDay = 0 }; List <ProcessDailySchedule> currentProductProcessDailyScheduleList = new List <ProcessDailySchedule>(); List <MasterProcess> orderedMasterProcessesList = productData.MasterProcess.OrderBy(o => o.ID).ThenBy(o => o.ProcessDependencies.Count()).ToList(); foreach (MasterProcess item in orderedMasterProcessesList) { if (item.ProcessDependencies.Count() == 0)//set process as first processes { processDayData.StartDay = 1; processDayData.UsedDay = 0; } else if (item.ProcessDependencies.Count() == 1)//Set Start Day for Process that have dependency only 1 { ProcessDependency processDependency = new ProcessDependency(); processDependency = item.ProcessDependencies.FirstOrDefault(); processDayData = GetProcessDay(processDependency, currentProductProcessDailyScheduleList); } else//Set Start Day for Process that have dependency more than 1 { ProcessDay maxprocessDay = new ProcessDay() { StartDay = 0, UsedDay = 0 }; processDayData.StartDay = 0; processDayData.UsedDay = 0; foreach (ProcessDependency pdItem in item.ProcessDependencies) { maxprocessDay = GetProcessDay(pdItem, currentProductProcessDailyScheduleList); if (processDayData.StartDay < maxprocessDay.StartDay || (processDayData.StartDay == maxprocessDay.StartDay && processDayData.UsedDay < maxprocessDay.UsedDay)) { processDayData.StartDay = maxprocessDay.StartDay; processDayData.UsedDay = maxprocessDay.UsedDay; } } } decimal currentProcessCycleTime = item.CycleTime; int startDay = processDayData.StartDay; decimal usedDay = 0; decimal currentProcessUsedDay = 1 - processDayData.UsedDay; //find the capacity of currentDay for currentProcess if (currentProcessUsedDay <= currentProcessCycleTime) //if currentCapacity smaller then processCycletime, so the capacity of the da is fully used { usedDay = 1; } else //if no, current usedDay is sum of processCycleTime and usedDay { usedDay = processDayData.UsedDay + currentProcessCycleTime; currentProcessUsedDay = usedDay; } do { DateTime now = DateTime.Now; currentProductProcessDailyScheduleList.Add(new ProcessDailySchedule() { MasterProcessID = item.ID, Day = startDay, UsedDay = usedDay, Created = now, LastModified = now, LastModifiedBy = username, CreatedBy = username }); currentProcessCycleTime -= currentProcessUsedDay; startDay++; if (currentProcessCycleTime > 1) { currentProcessUsedDay = usedDay = 1; } else { currentProcessUsedDay = usedDay = currentProcessCycleTime; } } while (currentProcessCycleTime > 0); } int totalDay = currentProductProcessDailyScheduleList.Max(x => x.Day); //ProcessDailySchedule lastProcessDailySchedule = currentProductProcessDailyScheduleList.Where(x => x.Day == totalDay).OrderByDescending(x => x.UsedDay).FirstOrDefault(); //if() db.ProcessDailySchedules.AddRange(currentProductProcessDailyScheduleList); if (db.SaveChanges() > 0) { productData.TotalDay = totalDay; productData.IsTotalDayCalculated = true; productData.LastModifiedBy = username; productData.LastModified = DateTime.Now; db.SaveChanges(); } } catch (Exception ex) { ViewBag.Exception = ex; } return(RedirectToAction("Details", "Product", new { id = productID })); }