Esempio n. 1
0
 /// <summary>
 /// Добавляет ответ пользователя, выбранный из набора вариантов ответов
 /// </summary>
 /// <param name="lmsEventLmsTasksetAppUserAnswerTaskAnswer"></param>
 /// <returns></returns>
 public async Task AddLmsEventLmsTasksetAppUserAnswerTaskAnswerAsync(LmsEventLmsTasksetAppUserAnswerTaskAnswer lmsEventLmsTasksetAppUserAnswerTaskAnswer)
 {
     _context.LmsEventLmsTasksetAppUserAnswerTaskAnswers.Add(lmsEventLmsTasksetAppUserAnswerTaskAnswer);
     await _context.SaveChangesAsync();
 }
Esempio n. 2
0
        /// <summary>
        /// Добавляет ответ пользователя
        /// </summary>
        /// <param name="lmsEventLmsTasksetAppUserAnswer">Бланк объекта ответа</param>
        /// <param name="choosedAnswers">Идентификаторы выбранных пользователем ответов из списка ответов</param>
        /// <param name="uploadedFile">Загруженный пользователем файл</param>
        /// <returns></returns>
        public async Task AddAppUserAnswerAsync(LmsEventLmsTasksetAppUserAnswer lmsEventLmsTasksetAppUserAnswer,
                                                int[] choosedAnswers,
                                                IFormFile uploadedFile)
        {
            // Обрабатываем ответы пользователя на тестовые задания и текстовый ввод
            if ((choosedAnswers != null && choosedAnswers.Count() > 0) ||
                !string.IsNullOrWhiteSpace(lmsEventLmsTasksetAppUserAnswer.AnswerAsText))
            {
                // Загружаем задание с вариантами ответов
                var lmsTask = await _lmsTaskSetRepository.GetLmsTaskAsync(lmsEventLmsTasksetAppUserAnswer.LmsTaskId);

                if (lmsTask != null && lmsTask.LmsTaskAnswers != null && lmsTask.LmsTaskAnswers.Count > 0)
                {
                    int numberOfPoints     = 0;
                    var correctTaskAnswers = lmsTask.LmsTaskAnswers.Where(ta => ta.IsCorrect);

                    // Обрабатываем случаи, когда пользователь выбирал ответы
                    if (choosedAnswers != null && choosedAnswers.Count() > 0 && correctTaskAnswers.Count() == choosedAnswers.Count())
                    {
                        bool isAllCorrectAnswersChoosed = true;
                        foreach (var correctTaskAnswer in correctTaskAnswers)
                        {
                            if (!choosedAnswers.Contains(correctTaskAnswer.LmsTaskAnswerId))
                            {
                                isAllCorrectAnswersChoosed = false;
                                break;
                            }
                        }

                        // Если все ответы правильные, назначаем балл по значению из настроек задания
                        if (isAllCorrectAnswersChoosed)
                        {
                            numberOfPoints = lmsTask.NumberOfPoints;
                        }

                        lmsEventLmsTasksetAppUserAnswer.NumberOfPoints = numberOfPoints;
                    }

                    // Обрабатываем случай, когда пользователь вводил ответ в текстовое поле
                    if (!string.IsNullOrWhiteSpace(lmsEventLmsTasksetAppUserAnswer.AnswerAsText) && correctTaskAnswers.Count() > 0)
                    {
                        // Приводим строки к общему виду и сравниваем
                        string sUserAnswer = lmsEventLmsTasksetAppUserAnswer.AnswerAsText.Trim().ToLower().Replace(',', '.');

                        foreach (var correctTaskAnswer in correctTaskAnswers)
                        {
                            string sCorrectAnswer = correctTaskAnswer.LmsTaskAnswerText.Trim().ToLower().Replace(',', '.');

                            if (sUserAnswer == sCorrectAnswer)
                            {
                                lmsEventLmsTasksetAppUserAnswer.NumberOfPoints = lmsTask.NumberOfPoints;
                            }

                            // Обработка вопроса типа "ввод числа"
                            if (lmsTask.LmsTaskTypeId == (int)LmsTaskTypesEnum.InputNumber)
                            {
                                double dUserAnswer           = 0;
                                double dCorrectAnswer        = 0;
                                bool   isUserAnswerParsed    = double.TryParse(sUserAnswer, out dUserAnswer);
                                bool   isCorrectAnswerParsed = double.TryParse(sCorrectAnswer, out dCorrectAnswer);
                                if (isUserAnswerParsed && isCorrectAnswerParsed)
                                {
                                    double stdErr = (dUserAnswer - dCorrectAnswer) * 100 / dCorrectAnswer;
                                    if (stdErr < 0.5) // Допустимое отклонение - 0.5%
                                    {
                                        lmsEventLmsTasksetAppUserAnswer.NumberOfPoints = lmsTask.NumberOfPoints;
                                    }
                                    else
                                    {
                                        lmsEventLmsTasksetAppUserAnswer.NumberOfPoints = 0;
                                    }
                                }
                            }
                        }
                    }
                }


                // Сохраняем ответы пользователя
                if (lmsEventLmsTasksetAppUserAnswer.LmsEventLmsTasksetAppUserAnswerTaskAnswers == null)
                {
                    lmsEventLmsTasksetAppUserAnswer.LmsEventLmsTasksetAppUserAnswerTaskAnswers = new List <LmsEventLmsTasksetAppUserAnswerTaskAnswer>();
                }
                foreach (var choosedAnswer in choosedAnswers)
                {
                    var newChoosedAnswerRecord = new LmsEventLmsTasksetAppUserAnswerTaskAnswer
                    {
                        LmsTaskAnswerId = choosedAnswer
                    };
                    lmsEventLmsTasksetAppUserAnswer.LmsEventLmsTasksetAppUserAnswerTaskAnswers.Add(newChoosedAnswerRecord);
                }
            }

            // Сохраняем ответ пользователя в виде скан-копии решения
            if (uploadedFile != null)
            {
                var newFileModel = await _fileModelRepository.UploadLmsAppUserAnswer(uploadedFile);

                if (newFileModel != null)
                {
                    lmsEventLmsTasksetAppUserAnswer.AnswerAsFile   = newFileModel;
                    lmsEventLmsTasksetAppUserAnswer.AnswerAsFileId = newFileModel.Id;
                }
            }

            _context.LmsEventLmsTasksetsAppUserAnswers.Add(lmsEventLmsTasksetAppUserAnswer);
            await _context.SaveChangesAsync();
        }