コード例 #1
0
 public async Task <bool> SaveCourse(DtoCourse course)
 {
     try
     {
         using (var data = Context)
         {
             var c = await(from item in data.Courses where course.Id == item.id select item).FirstOrDefaultAsync();
             // Updating Course
             if (c != null)
             {
                 c.name      = course.Name;
                 c.startHour = course.StartHour;
                 c.day       = course.Day;
                 c.endHour   = course.EndHour;
                 c.limit     = course.Limit;
             }
             // Adding new Course
             else
             {
                 data.Courses.Add(CourseConverter.DtoToDataAccess(course));
             }
             await data.SaveChangesAsync();
         }
         return(true);
     }
     catch (Exception)
     {
         return(false);
     }
 }
コード例 #2
0
 public static Courses DtoToDataAccess(DtoCourse d)
 {
     return(new Courses
     {
         id = d.Id,
         startHour = d.StartHour,
         endHour = d.EndHour,
         name = d.Name,
         day = d.Day,
         limit = d.Limit
     });
 }
コード例 #3
0
        public void CourseBll_AddCourse_ShouldSuccess()
        {
            var       currentUser = 10000;
            CourseBll bll         = new CourseBll();
            DtoCourse c           = new DtoCourse
            {
                CourseType  = 2,
                CurrentUser = currentUser,
                Description = "d",
                Grade       = 1,
                LessonCount = 3,
                Lessons     = new List <string> {
                    "1", "3"
                },
                Name            = "sfsf",
                Owner           = currentUser,
                ResourceGroupId = 2,
                Employees       = "1,3"
            };

            bll.AddCourse(c);
            Assert.IsTrue(true);
        }
コード例 #4
0
        public static async Task Compute()
        {
            List <DtoCourse>      allCourses        = (await new CourseLogic().GetCourses()).ToList();
            List <DtoUser>        notAssignedUsers  = new List <DtoUser>();
            List <DtoSchedule>    assignedSchedules = new List <DtoSchedule>();
            Dictionary <int, int> freePlaces        = (await new CourseLogic().GetCourses()).ToDictionary(item => item.Id, item => 0);
            List <DtoSchedule>    allSchedules      = await new ScheduleLogic().GetAllSchedules();
            List <DtoUser>        users             =
                allSchedules.OrderByDescending(item => item.User.AverageScore).GroupBy(item => item.User).Select(item => item.Key).Distinct().ToList();

            foreach (DtoUser user in users)
            {
                List <int> schedules =
                    allSchedules.Where(item => item.User.Id == user.Id)
                    .GroupBy(item => item.ScheduleId)
                    .OrderBy(item => item.Key)
                    .Select(item => item.Key)
                    .ToList();
                bool success = false;
                foreach (int schedule in schedules)
                {
                    List <DtoCourse> courses =
                        allSchedules.Where(item => item.User.Id == user.Id && item.ScheduleId == schedule)
                        .OrderBy(item => item.Course.Id)
                        .Select(item => item.Course)
                        .ToList();
                    bool canAdd = true;
                    foreach (DtoCourse course in courses)
                    {
                        if (freePlaces[course.Id] >= course.Limit)
                        {
                            canAdd = false;
                        }
                    }
                    if (canAdd)
                    {
                        foreach (var course in courses)
                        {
                            assignedSchedules.Add(new DtoSchedule {
                                Course = course, ScheduleId = schedule * 1000, User = user
                            });
                            freePlaces[course.Id]++;
                        }
                        success = true;
                        break;
                    }
                }
                if (!success)
                {
                    notAssignedUsers.Add(user);
                }
            }
            if (notAssignedUsers.Any())
            {
                foreach (DtoUser user in notAssignedUsers)
                {
                    int minConflicts = int.MaxValue;
                    int bestSchedule = 0;
                    List <DtoCourse> bestCoursesToChange = new List <DtoCourse>();
                    List <int>       schedules           =
                        allSchedules.Where(item => item.User.Id == user.Id)
                        .GroupBy(item => item.ScheduleId)
                        .OrderBy(item => item.Key)
                        .Select(item => item.Key)
                        .ToList();
                    foreach (int schedule in schedules)
                    {
                        List <List <DtoCourse> > coursesToAssignRandomly = new List <List <DtoCourse> >();
                        int conflictsCounter     = 0;
                        List <DtoCourse> courses =
                            allSchedules.Where(item => item.User.Id == user.Id && item.ScheduleId == schedule)
                            .OrderBy(item => item.Course.Id)
                            .Select(item => item.Course)
                            .ToList();
                        List <DtoCourse> originalCourses = courses.ToList();
                        foreach (DtoCourse course in courses.ToList())
                        {
                            //if (freePlaces[course.Id] >= course.Limit)
                            {
                                //conflictsCounter++;
                                coursesToAssignRandomly.Add(allCourses.Where(item => item.Name == course.Name && freePlaces[item.Id] < item.Limit).ToList());
                                courses.Remove(course);
                            }
                        }
                        bool shouldBreak = false;
                        for (int i = 0; i < coursesToAssignRandomly.Count; ++i)
                        {
                            if (shouldBreak)
                            {
                                break;
                            }

                            for (int j = 0; j < coursesToAssignRandomly[i].Count; ++j)
                            {
                                courses.Add(coursesToAssignRandomly[i][j]);
                                if (i + 1 < coursesToAssignRandomly.Count)
                                {
                                    i++;
                                    j = -1;
                                }
                                else
                                {
                                    for (int k = 0; k < courses.Count - 1; ++k)
                                    {
                                        var course1 = courses[k];
                                        for (int l = k + 1; l < courses.Count; ++l)
                                        {
                                            var course2 = courses[l];
                                            if ((course1.Day == course2.Day) &&
                                                ((course1.StartHour >= course2.StartHour && course1.StartHour < course2.EndHour) ||
                                                 (course1.EndHour > course2.StartHour && course1.EndHour <= course2.EndHour) ||
                                                 (course1.StartHour <= course2.StartHour && course1.EndHour >= course2.EndHour)))
                                            {
                                                conflictsCounter += 20;
                                            }
                                        }
                                    }
                                    conflictsCounter += originalCourses.Count(originalCourse => courses.All(item => item.Id != originalCourse.Id));
                                    if (conflictsCounter < minConflicts)
                                    {
                                        minConflicts        = conflictsCounter;
                                        bestSchedule        = schedule;
                                        bestCoursesToChange = new List <DtoCourse>();
                                        for (int k = 0; k < coursesToAssignRandomly.Count; ++k)
                                        {
                                            bestCoursesToChange.Add(courses[courses.Count - 1 - k]);
                                        }
                                    }
                                    for (int k = 0; k < courses.Count - 1; ++k)
                                    {
                                        var course1 = courses[k];
                                        for (int l = k + 1; l < courses.Count; ++l)
                                        {
                                            var course2 = courses[l];
                                            if (course1.Day == course2.Day &&
                                                (course1.StartHour >= course2.StartHour && course1.StartHour < course2.EndHour ||
                                                 course1.EndHour > course2.StartHour && course1.EndHour <= course2.EndHour ||
                                                 course1.StartHour <= course2.StartHour && course1.EndHour >= course2.EndHour))
                                            {
                                                conflictsCounter -= 20;
                                            }
                                        }
                                    }
                                    conflictsCounter -= originalCourses.Count(originalCourse => courses.All(item => item.Id != originalCourse.Id));
                                    courses.RemoveAt(courses.Count - 1);
                                    if (j == coursesToAssignRandomly[i].Count - 1)
                                    {
label:
                                        DtoCourse tempCourse = new DtoCourse();
                                        if (courses.Count > 0)
                                        {
                                            tempCourse = courses[courses.Count - 1];
                                            courses.RemoveAt(courses.Count - 1);
                                        }
                                        if (i - 1 >= 0)
                                        {
                                            i--;
                                            j = coursesToAssignRandomly[i].IndexOf(coursesToAssignRandomly[i].Find(item => item.Id == tempCourse.Id));
                                            if (j == coursesToAssignRandomly[i].Count - 1)
                                            {
                                                goto label;
                                            }
                                        }
                                        else
                                        {
                                            shouldBreak = true;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    List <DtoCourse> bestCourses =
                        allSchedules.Where(item => item.User.Id == user.Id && item.ScheduleId == bestSchedule)
                        .OrderBy(item => item.Course.Id)
                        .Select(item => item.Course).Where(item => bestCoursesToChange.All(item2 => item2.Name != item.Name))
                        .ToList();
                    bestCourses.AddRange(bestCoursesToChange);
                    foreach (DtoCourse course in bestCourses)
                    {
                        if (freePlaces[course.Id] < course.Limit)
                        {
                            assignedSchedules.Add(new DtoSchedule {
                                Course = course, ScheduleId = bestSchedule * 1000 + minConflicts, User = user
                            });
                            freePlaces[course.Id]++;
                        }
                        else
                        {
                            throw new ApplicationException();
                        }
                    }
                }
            }
            await new ScheduleLogic().RemoveAllSchedules();
            await new ScheduleLogic().SaveSchedule(assignedSchedules);
            await new RegistrationLogic().UpdateStatus("Zakończona");
        }