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