/// <summary> /// Добавляет ответ пользователя /// </summary> /// <param name="userName">Логин пользователя</param> /// <param name="lmsEventId">УИД мероприятия</param> /// <param name="lmsEventLmsTasksetAppUserAnswer">Бланк объекта ответа</param> /// <param name="choosedAnswers">Идентификаторы выбранных пользователем ответов из списка ответов</param> /// <param name="uploadedFile">Загруженный пользователем файл</param> /// <returns></returns> public async Task AddAppUserAnswerAsync(string userName, int lmsEventId, LmsEventLmsTasksetAppUserAnswer lmsEventLmsTasksetAppUserAnswer, int[] choosedAnswers, IFormFile uploadedFile) { var lmsEvent = await _lmsEventRepository.GetLmsEventAsync(lmsEventId); var appUser = lmsEvent.AppUserLmsEvents .FirstOrDefault(ae => ae.AppUser.UserName == userName && ae.AppUserLmsEventUserRoleId == (int)AppUserLmsEventUserRolesEnum.Participant) .AppUser; if (appUser == null) { return; } if (lmsEventLmsTasksetAppUserAnswer.AppUserId != appUser.Id) { return; } await AddAppUserAnswerAsync(lmsEventLmsTasksetAppUserAnswer, choosedAnswers, uploadedFile); }
/// <summary> /// Возвращает вопрос из списка заданий мероприятия, на который пользователь ещё не отвечал /// </summary> public async Task <LmsEventLmsTasksetAppUserAnswer> GetLmsTaskNotAnsweredAsync(string userName, int lmsEventId) { // Получаем мероприятие var lmsEvent = await _lmsEventRepository.GetLmsEventAsync(lmsEventId); if (lmsEvent == null) { return(null); } // Удостоверяемся, что пользователь является участником события var appUser = lmsEvent.AppUserLmsEvents .FirstOrDefault(ae => ae.AppUser.UserName == userName && ae.AppUserLmsEventUserRoleId == (int)AppUserLmsEventUserRolesEnum.Participant) .AppUser; if (appUser == null) { return(null); } //if (! lmsEvent.AppUserLmsEvents // .Any(ae => ae.AppUser.UserName == userName && // ae.AppUserLmsEventUserRoleId == (int)AppUserLmsEventUserRolesEnum.Participant)) // return null; // Удостоверяемся, что мероприятие проходит в данный момент if (!lmsEvent.IsLmsEventStarted) { return(null); } foreach (var lmsEventLmsTaskSet in lmsEvent.LmsEventLmsTaskSets) { if (lmsEventLmsTaskSet.LmsTaskSetId != 0 && lmsEventLmsTaskSet.LmsTaskSet.LmsTaskSetLmsTasks == null) { // Загружаем набор заданий var lmsTaskSet = await _lmsTaskSetRepository.GetLmsTaskSetAsync(lmsEventLmsTaskSet.LmsTaskSetId); lmsEventLmsTaskSet.LmsTaskSet = lmsTaskSet; } // Загружаем уже полученные ответы пользователя на вопросы данного мероприятия var appUserAnswers = await GetLmsEventLmsTaskSetAppUserAnswers(userName, lmsEventLmsTaskSet.LmsEventLmsTaskSetId).ToListAsync(); foreach (var lmsTaskSetLmsTask in lmsEventLmsTaskSet.LmsTaskSet.LmsTaskSetLmsTasks) { // Проверяем, отвечал ли уже пользователь на данный вопрос bool isAppUserAnswered = false; foreach (var appUserAnswer in appUserAnswers) { if (appUserAnswer.LmsTaskId == lmsTaskSetLmsTask.LmsTaskId) { isAppUserAnswered = true; break; } } if (!isAppUserAnswered) { // Если мы до сюда дошли, значит пользователь не отвечал на текущий вопрос // Формируем объект будущего ответа для передачи в представление задания var newAppUserAnswer = new LmsEventLmsTasksetAppUserAnswer { AppUserId = appUser.Id, LmsEventLmsTaskSetId = lmsEventLmsTaskSet.LmsEventLmsTaskSetId, LmsTaskId = lmsTaskSetLmsTask.LmsTaskId, LmsTask = lmsTaskSetLmsTask.LmsTask }; return(newAppUserAnswer); } } } return(null); }
/// <summary> /// Обновление ответа пользователя на задание СДО /// </summary> /// <param name="lmsEventLmsTasksetAppUserAnswer"></param> /// <returns></returns> public async Task UpdateLmsEventLmsTasksetAppUserAnswerAsync(LmsEventLmsTasksetAppUserAnswer lmsEventLmsTasksetAppUserAnswer) { _context.LmsEventLmsTasksetsAppUserAnswers.Update(lmsEventLmsTasksetAppUserAnswer); await _context.SaveChangesAsync(); }
/// <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(); }