Диплом: Автоматизация процесса контроля знаний учащихся ГОУ СОШ №31

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
98
test.QuestionsPerformedCount = test.QuestionsPerformedCount == null ? 0 :
test.QuestionsPerformedCount;
if (availableQuestions.Count() == 0 || (userQuestions.Count() != 0 &&
userQuestions.Count() == test.QuestionsPerformedCount))
return null;
int idQuestion = availableQuestions.OrderBy(item =>
item.Id).FirstOrDefault().Id;
int numberQuestion = userQuestions.Count() + 1;
UserQuestion userQuestion = new UserQuestion
{
IdUserTest = idUserTest,
IdQuestion = idQuestion,
Number = numberQuestion,
};
using (var transaction = storage.BeginTransaction())
{
try
{
await storage.GetRepository<UserQuestion>().Create(userQuestion);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw new Exception(ex.Message);
}
}
return await GetQuestionAnswerByIdUserQuestion(userQuestion.Id);
}
public async Task<bool> SetAnswerRunTestQuestion(QuestionAnswerDTO
questionAnswerDTO)
{
if(questionAnswerDTO.SelectedAnswer.Count() == 0)
throw new
ArgumentNullException(nameof(questionAnswerDTO.SelectedAnswer));
IEnumerable<Answer> answers = await
storage.GetRepository<Answer>().Get(item =>
item.IdQuestion == questionAnswerDTO.IdQuestion);
99
IEnumerable<int> rightAnswerIds = answers.Where(item => item.IsRight ==
true).Select(item => item.Id);
int CorrectAnswersCount = 0;
foreach (int item in rightAnswerIds)
{
if (questionAnswerDTO.SelectedAnswer.Contains(item))
CorrectAnswersCount++;
}
decimal userQuestionResult = (decimal)CorrectAnswersCount /
rightAnswerIds.Count();
using (var transaction = storage.BeginTransaction())
{
try
{
UserQuestion userQuestion = await
storage.GetRepository<UserQuestion>().FindById(questionAnswerDTO.IdUserQues
tion);
userQuestion.Result = userQuestionResult;
await storage.GetRepository<UserQuestion>().Update(userQuestion);
foreach (int item in questionAnswerDTO.SelectedAnswer)
{
UserAnswer userAnswer = new UserAnswer
{
IdUserQuestion = questionAnswerDTO.IdUserQuestion,
IdAnswer = item
};
await storage.GetRepository<UserAnswer>().Create(userAnswer);
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw new Exception(ex.Message);
}
}
return true;
}
100
public async Task<UserTestAdvancedDTO> EndExecuteTest(int idUserTest)
{
IEnumerable<UserQuestion> userQuestions = await
storage.GetRepository<UserQuestion>().Get(item =>
item.IdUserTest == idUserTest);
UserTest userTest = await
storage.GetRepository<UserTest>().FindById(idUserTest);
userTest.EndDate = DateTime.Now;
userTest.PointsСount = (decimal)userQuestions.Sum(item => item.Result) /
userQuestions.Count() * 100;
using (var transaction = storage.BeginTransaction())
{
try
{
await storage.GetRepository<UserTest>().Update(userTest);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw new Exception(ex.Message);
}
}
Test test = await storage.GetRepository<Test>().FindById(userTest.IdTest);
IEnumerable<UserInfo> usersInfo = await
storage.GetRepository<UserInfo>().Get(item => item.IdUser == userTest.IdUser);
UserInfo userInfo = usersInfo.FirstOrDefault();
UserTestAdvancedDTO userTestAdvancedDTO = new
UserTestAdvancedDTO
{
Id = userTest.Id,
IdTest = userTest.IdTest,
IdUser = userTest.IdUser,
StartDate = userTest.StartDate,
EndDate = userTest.EndDate,
AttemptNumber = userTest.AttemptNumber,
PointsСount = userTest.PointsСount,
TestName = test.Name,
UserFIO = $"{userInfo.Surname} {userInfo.Name}
{userInfo.Patronymic}"
101
};
return userTestAdvancedDTO;
}
private async Task<QuestionAnswerDTO>
GetQuestionAnswerByIdUserQuestion(int idUserQuestion)
{
UserQuestion userQuestion = await
storage.GetRepository<UserQuestion>().FindById(idUserQuestion);
Question question = await
storage.GetRepository<Question>().FindById(userQuestion.IdQuestion);
IEnumerable<Answer> answers = await
storage.GetRepository<Answer>().Get(item =>
item.IdQuestion == userQuestion.IdQuestion &&
item.IsDeleted == false);
return new QuestionAnswerDTO
{
IdUserQuestion = userQuestion.Id,
IdUserTest = userQuestion.IdUserTest,
IdQuestion = userQuestion.IdQuestion,
Number = userQuestion.Number,
QuestionText = question.Text,
CorrectAnswersCount = answers.Where(item => item.IsRight ==
true).Count(),
Answers = mapper.Map<IEnumerable<AnswerDTO>>(answers)
};
}
}
}
@using KCS.UI.Web.Models.Test
@model List<TestViewModel>
@{
ViewData["Title"] = "Тесты";
Layout = "~/Views/Shared/_Layout.cshtml";
int rowNumber = 0;
}
<h2 style="margin-bottom: 0; padding: 5px 10px;">Тесты</h2>
102
<nav class="navbar navbar-light bg-light justify-content-between" style="padding:
5px 10px 5px 0;">
<nav class="nav">
<a id="tool-strip-create-button" class="nav-link tool-strip-button"
style="padding-right: 0;" asp-controller="Test" asp-action="Create">
<i class="fas fa-plus"></i>
<span class="d-sm-inline-block d-none">Создать</span>
</a>
<a id="tool-strip-edit-button" class="nav-link tool-strip-button disabled"
style="padding-right: 0;">
<i class="fas fa-edit"></i>
<span class="d-sm-inline-block d-none">Редактировать</span>
</a>
<a id="tool-strip-details-button" class="nav-link tool-strip-button disabled"
style="padding-right: 0;">
<i class="fas fa-address-card"></i>
<span class="d-sm-inline-block d-none">Подробнее</span>
</a>
<a id="tool-strip-delete-button" class="nav-link tool-strip-button disabled"
style="padding-right: 0;">
<i class="fas fa-minus-circle"></i>
<span class="d-sm-inline-block d-none">Удалить</span>
</a>
<a id="tool-strip-additional-button" class="nav-link tool-strip-button disabled"
style="padding-right: 0;">
<i class="fas fa-bars"></i>
<span class="d-sm-inline-block d-none">Вопросы теста</span>
</a>
</nav>
<div>
<button class="btn"><span class="fas fa-filter"></span>Фильтр</button>
</div>
</nav>
<div id="main-table" class="table">
<table class="table table-bordered table-hover">
<thead class="thead-light">
<tr>
<th scope="col" class="align-middle">#</th>
<th scope="col" class="align-middle" style="width: 65%;">Название</th>
<th scope="col" class="align-middle">Доступен для выполнения</th>
</tr>
</thead>
<tbody>
103
@foreach (var item in Model)
{
rowNumber++;
<tr data-edit="@Url.Action("Edit", new { id = item.Id })"
data-details="@Url.Action("Edit", new { id = item.Id })"
data-delete="@Url.Action("Delete", new { id = item.Id })"
data-additional="@Url.Action("Index", "Question", new { idTest =
item.Id })">
<td>@rowNumber</td>
<td>@item.Name</td>
@if (item.IsAvailable)
{
<td>Да</td>
}
else
{
<td>Нет</td>
}
</tr>
}
</tbody>
</table>
</div>
@using KCS.Identity.Managers
@inject UserManager UserManager
@using KCS.UI.Web.Models.Test
@model TestModel
@{
ViewData["Title"] = "Создание теста";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2 style="margin-bottom: 0; padding: 5px 10px;">Создание теста</h2>
<div class="card-body" style="margin-left: 0; padding-top: 0;">
<form asp-controller="Test" asp-action="Create" asp-antiforgery="true"
method="post">
<div asp-validation-summary="All" class="text-danger"></div>
104
<input asp-for="IdUser" value="@UserManager.GetUserId(User)"
type="hidden">
<div class="form-group">
<label asp-for="Name"></label>
<input asp-for="Name" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Description"></label>
<textarea asp-for="Description" class="form-control" cols="20"
rows="5"></textarea>
</div>
<div class="form-group">
<label asp-for="TimeLimit"></label>
<span style="display: block; font-size: small;">Если поле пустое, то время
не ограничено</span>
<input asp-for="TimeLimit" class="form-control" type="number" />
</div>
<div class="form-group">
<label asp-for="MaxAttemptsCount"></label>
<input asp-for="MaxAttemptsCount" class="form-control" type="number"
value="1" />
</div>
<div class="form-group">
<input asp-for="IsAvailable" type="checkbox" />
<label asp-for="IsAvailable"></label>
</div>
<div class="form-group">
<input asp-for="IsRandomQuestions" type="checkbox" />
<label asp-for="IsRandomQuestions"></label>
</div>
<div class="form-group">
<input asp-for="IsRandomAnswers" type="checkbox" />
<label asp-for="IsRandomAnswers"></label>
</div>
<div class="form-group">
<input asp-for="IsDisplayResults" type="checkbox" />
105
<label asp-for="IsDisplayResults"></label>
</div>
<div class="form-group">
<button type="submit" class="btn btn-success">Создать</button>
</div>
</form>
</div>
using Microsoft.EntityFrameworkCore;
using KCS.DataAccess.Context;
using KCS.DataAccess.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Linq.Expressions;
namespace KCS.DataAccess.Repositories
{
/// <summary>
/// Реализация интерфейса общего репозитория для работы с сущностями.
/// </summary>
/// <typeparam name="TEntity">Сущность базы.</typeparam>
public class GenericRepository<TEntity> : IGenericRepository<TEntity> where
TEntity : class
{
public GenericRepository(KCSContext kcsContext)
{
this.kcsContext = kcsContext;
dbSet = kcsContext.Set<TEntity>();
}
private readonly KCSContext kcsContext;
private readonly DbSet<TEntity> dbSet;
public async Task<IEnumerable<TEntity>> GetAll()
{
return await dbSet.ToListAsync();
}
public async Task<IEnumerable<TEntity>> Get(Expression<Func<TEntity,
bool>> predicate)
106
{
return await dbSet.Where(predicate).ToListAsync();
}
public async Task<TEntity> FindById(int id)
{
return await dbSet.FindAsync(id);
}
public async Task Create(TEntity item)
{
await dbSet.AddAsync(item);
await kcsContext.SaveChangesAsync();
}
public async Task Update(TEntity item)
{
kcsContext.Entry(item).State = EntityState.Modified;
await kcsContext.SaveChangesAsync();
}
public async Task Delete(TEntity item)
{
dbSet.Remove(item);
await kcsContext.SaveChangesAsync();
}
public async Task DeleteRange(IEnumerable<TEntity> items)
{
dbSet.RemoveRange(items);
await kcsContext.SaveChangesAsync();
}
}
}
using Microsoft.EntityFrameworkCore;
using KCS.DataAccess.Context;
using KCS.DataAccess.Model.Views;
using System.Collections.Generic;
using System.Threading.Tasks;
using KCS.DataAccess.Model.Tables;
using KCS.DataAccess.Model.Common;
using System.Linq;
107
namespace KCS.DataAccess.Repositories
{
/// <summary>
/// Смешанный репозиторий для работы с представлениями базы,
несколькими сущностями или со сложными запросами к сущностям.
/// </summary>
public class MixedRepository
{
public MixedRepository(KCSContext kcsContext) => this.kcsContext =
kcsContext;
private readonly KCSContext kcsContext;
public async Task<List<Question>> GetAvailableQuestionsByIdUserTest(int
idUserTest)
{
return await kcsContext.Questions.FromSqlRaw($@"select * from
KCS.Question q where
q.IsDeleted = 0 and
q.ID_Test = (select ut.ID_Test from
KCS.UserTest ut where ut.ID = {idUserTest}) and
q.ID not in (
select uq.ID_Question from KCS.UserQuestion
uq where
uq.ID_UserTest = {idUserTest}
)
").ToListAsync();
}
public async Task<List<TestResultView>> GetTestResultsByIdAuthorTest(int
idUser)
{
return await kcsContext.TestResultViews.FromSqlRaw($@"select trv.*
from KCS.TestResultView trv
inner join KCS.UserTest ut on trv.IdUserTest =
ut.ID
inner join KCS.Test t on ut.ID_Test = t.ID
where t.ID_User = {idUser}
").ToListAsync();
}
public async Task<List<UserTest>> GetPassedTestsByIdAuthorTest(int idUser)
{

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)