/// <summary> /// РК1 Задание 2 - Формирование /// </summary> /// <param name="e">Уникальное задание</param> private void Exercise2(Storage.Exercise e) { Guid aid = e.Assessment.ID; // Идентификатор РК string codever; List <Storage.Exercise2> list2; do { codever = string.Empty; list2 = new List <Storage.Exercise2>(); // Список всех строк кода данного РК foreach (int row in db.CodeRows.Where(x => x.Assessment.ID == aid).Select(x => x.Row).Distinct()) { // Определение количества вариантов строки int versions = db.CodeRows.Where(x => (x.Assessment.ID) == aid && (x.Row == row)).Count(); // Случайный выбор варианта int version = (versions == 1) ? 1 : rnd.Next(1, versions + 1); // Загрузка варианта var code = db.CodeRows.Where(x => (x.Assessment.ID) == aid && (x.Row == row) && (x.Version == version)).First(); // Ключ варианта codever += version; // Сохранение варианта list2.Add(new Storage.Exercise2() { Exercise = e, CodeRow = code }); } }while (db.Exercises.Where(x => x.CodeVersion == codever).FirstOrDefault() != null); // Сохранение уникального кода задания e.CodeVersion = codever; db.Exercises2.AddRange(list2); }
/// <summary> /// РК2 Задание 1 - Формирование /// </summary> /// <param name="e"></param> private void Exercise3(Storage.Exercise e) { // Количество принципов int principles = db.Principles.Count(); string code; // Код задания List <int> list; // Вектор номеров принципов // Формирование уникальной комбинации принципов Agile do { list = Utilities.Helper.Randoms(principles, principles); code = string.Join("", list.Select(a => a.ToString("X1"))); }while (db.Exercises.Where(x => x.Code == code).Any()); // Формирование задания for (int i = 0; i < principles; i++) { int n = list[i]; // Считаем, что принцип в базе существует var p = db.Principles.Where(a => a.Number == n).First(); var item = new Storage.Exercise3() { Exercise = e, Principle = p, Number = i + 1 // Нумерацию начинаем с 1 }; db.Exercises3.Add(item); } // Сохранение уникального кода e.Code = code; }
/// <summary> /// РК 1 Задание 1 - формирование /// </summary> /// <param name="e"></param> private void Exercise1(Storage.Exercise e) { // Общее количество сотрудников int characterCount = db.Characters.Count(); // Список заданий var elist = new List <Storage.Exercise1>(); // Формирование варианта задания для каждой из шести ролей foreach (var role in db.Roles.OrderBy(x => x.Number).ToList()) { // Количество способностей для данной роли int aCount = db.Abilities.Where(x => x.Role.Number == role.Number).Count(); Storage.Exercise1 e1; do { // Вектор способностей List <int> abilities = Utilities.Helper.Randoms(2, aCount); int a1 = abilities[0]; int a2 = abilities[1]; // Номер уникального сотрудника int cnumber = Utilities.Helper.UniqueRandom(elist.Select(x => x.Character.Number).ToList(), characterCount); e1 = new Storage.Exercise1() { Role = role, Character = db.Characters.Where(x => x.Number == cnumber).First(), Ability1 = db.Abilities.Where(x => x.Role.Number == role.Number && x.Number == a1).First(), Ability2 = db.Abilities.Where(x => x.Role.Number == role.Number && x.Number == a2).First(), Exercise = e }; e1.Code = e1.ToString(); }while (db.Exercises1.Where(x => x.Code == e1.Code).FirstOrDefault() != null); elist.Add(e1); } db.Exercises1.AddRange(elist); }
/// <summary> /// Конструктор по заданию /// </summary> /// <param name="exercise">Задание</param> public MatrixItem(Storage.Exercise exercise) { Exercise = exercise; }
/// <summary> /// Рубежный контроль - запуск /// </summary> /// <param name="sid">Идентификатор студента</param> /// <param name="aid">Идентификатор рубежного контроля</param> /// <returns></returns> public ActionResult Assessment(Guid sid, Guid aid) { try { DateTime now = DateTime.Now; // Загрузка исходных данных var s = db.Students.Find(sid); var a = db.Assessments.Find(aid); // Проверка на корректность параметров if ((s == null) || (a == null)) { return(View("Message", (object)"Некорректный идентификатор объекта")); } // Проверка на доступное время if (a.StartTime > DateTime.Now) { return(View("Message", (object)$"{a.Name} начнётся {a.StartTime:dd-MM-yyyy} в {a.StartTime:HH:mm}")); } Storage.Exercise e; // Проверка на повторный запуск e = db.Exercises.Where (x => (x.Student.ID == sid) && (x.Assessment.ID == aid) && x.FinishTime.HasValue).FirstOrDefault(); // Есть завершенный РК if (e != null) { // Повторная сдача не допускается return(View($"Assessment{a.Number}Result", e)); } // Проверка на идущий рубежный контроль e = db.Exercises .Where(x => (x.Student.ID == sid) && (x.Assessment.ID == aid) && !x.FinishTime.HasValue) .ToList() // для выделения запроса сервер/клиент .Where(x => (now - x.StartTime).TotalMinutes < MaxMinutes) .OrderByDescending(x => x.StartTime) .FirstOrDefault(); if (e == null) { // Формирование уникального задания e = new Storage.Exercise() { Student = s, Assessment = a, // Сведения о клиенте UserAddress = Request.UserHostAddress, UserBrowser = Request.Browser.Browser, UserHost = Request.UserHostName, UserPlatform = Request.Browser.Platform }; switch (a.Number) { case 1: Exercise1(e); Exercise2(e); break; case 2: Exercise3(e); Exercise2(e); break; case 3: Exercise2(e); break; case 4: // Домашнее задание break; default: return(View("Message", (object)"Некорректный номер РК")); } // Сохранение уникального задания db.Exercises.Add(e); db.SaveChanges(); // Повторное чтение объекта из БД после сохранения e = db.Exercises.Find(e.ID); } // Время окончания приёма задания ViewBag.FinishTime = e.StartTime.AddMinutes(MaxMinutes); return(View($"Assessment{a.Number}", e)); } catch (Exception ex) { log.Warn(ex); return(View("Message", (object)"Внутренняя ошибка")); } }