Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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;
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
 /// <summary>
 /// Конструктор по заданию
 /// </summary>
 /// <param name="exercise">Задание</param>
 public MatrixItem(Storage.Exercise exercise)
 {
     Exercise = exercise;
 }
Exemplo n.º 5
0
        /// <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)"Внутренняя ошибка"));
            }
        }