|
@@ -17,7 +17,10 @@ using Exam.Share.Dtos.ExamManage;
|
|
|
using Exam.Share.ViewResponses.Exam;
|
|
|
using Exam.TestPapers;
|
|
|
using Hotline.Application.Exam.Core.Extensions;
|
|
|
+using Hotline.Application.Exam.Extensions;
|
|
|
+using Hotline.Application.Exam.Interface.Strategy;
|
|
|
using Hotline.Application.Exam.QueryExtensions.ExamManages;
|
|
|
+using Hotline.Application.Exam.Strategy;
|
|
|
using Hotline.Exams.ExamManages;
|
|
|
using Hotline.Exams.TestPapers;
|
|
|
using Hotline.Repository.SqlSugar;
|
|
@@ -38,9 +41,11 @@ using MapsterMapper;
|
|
|
using NPOI.SS.Formula.Functions;
|
|
|
using SqlSugar;
|
|
|
using System.Linq;
|
|
|
+using System.Threading.Tasks;
|
|
|
using XF.Domain.Authentications;
|
|
|
using XF.Domain.Dependency;
|
|
|
using XF.Domain.Exceptions;
|
|
|
+using XF.Domain.Repository;
|
|
|
|
|
|
namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
{
|
|
@@ -110,7 +115,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- throw new UserFriendlyException(ErrorMessage.ServiceError, string.Format(ErrorMessage.IsNotExists, nameof(Question)));
|
|
|
+ throw new UserFriendlyException(ErrorMessage.ServiceError, string.Format(ErrorMessage.IsNotExists, string.Concat(typeof(Question).GetDescription(),":", examQuestionRequest.QuestionId)));
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -129,7 +134,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
QuestionType = m.Key,
|
|
|
Questions = m.Select(n => new SimpleViewResponse
|
|
|
{
|
|
|
- Id = n.Id
|
|
|
+ Id = n.QuestionId
|
|
|
}).ToList()
|
|
|
}).ToList();
|
|
|
|
|
@@ -222,43 +227,190 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public async Task<UserExamQuestionDto> ExamAsync(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ public async Task<StartExamViewResponse> ExamAsync(UpdateUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- await AddUserExamItem(addUserExamItemDto, cancellationToken);
|
|
|
+ var userExam = await new ExamRepository<UserExam>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.Id == addUserExamItemDto.UserExamId).FirstAsync();
|
|
|
|
|
|
- await AddUserExamItemOptions(addUserExamItemDto, cancellationToken);
|
|
|
+ var startExamViewResponse = await CheckExamValid(userExam);
|
|
|
|
|
|
- await AddExamAnswer(addUserExamItemDto, cancellationToken);
|
|
|
+ if (!startExamViewResponse.CheckValidate())
|
|
|
+ {
|
|
|
+ return startExamViewResponse;
|
|
|
+ }
|
|
|
+
|
|
|
+ var userExamRepository = new ExamRepository<UserExamItem>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
+
|
|
|
+ var hasUserExamItem = userExamRepository.Queryable().Where(x => x.UserExamId == addUserExamItemDto.UserExamId && x.QuestionId == addUserExamItemDto.QuestionId).Any();
|
|
|
+
|
|
|
+ if (!hasUserExamItem)
|
|
|
+ {
|
|
|
+ await AddExamAsync(userExamRepository,addUserExamItemDto, cancellationToken);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ await UpdateExamAsync(userExamRepository,addUserExamItemDto, cancellationToken);
|
|
|
+ }
|
|
|
|
|
|
- var gradingExamQuestionDto = await GetNextExamQuestion(addUserExamItemDto);
|
|
|
+ await CalcuteExamItemScore(userExamRepository, addUserExamItemDto, cancellationToken);
|
|
|
|
|
|
- return gradingExamQuestionDto;
|
|
|
+ return startExamViewResponse;
|
|
|
}
|
|
|
+ public async Task<StartExamViewResponse> StartUserExamAsync(StartUserExamDto startUserExamDto, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var userExam = await _repository.GetAsync(x => x.Id == startUserExamDto.Id);
|
|
|
+
|
|
|
+ if (userExam == null) return new StartExamViewResponse
|
|
|
+ {
|
|
|
+ IsJoin = false
|
|
|
+ };
|
|
|
+
|
|
|
+ if (userExam.StartTime == null)
|
|
|
+ userExam.StartTime = DateTime.Now;
|
|
|
|
|
|
+ var startExamViewResponse = await CheckExamValid(userExam);
|
|
|
|
|
|
- public async Task<UserExamQuestionDto> UpdateExamAsync(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ if (!startExamViewResponse.CheckValidate())
|
|
|
+ {
|
|
|
+ return startExamViewResponse;
|
|
|
+ }
|
|
|
+
|
|
|
+ userExam.ExamStatus = Share.Enums.Exams.EExamStatus.Executing;
|
|
|
+
|
|
|
+ userExam.ToUpdate(_sessionContext);
|
|
|
+
|
|
|
+ await _repository.UpdateWithValidateAsync(userExam, cancellationToken);
|
|
|
+
|
|
|
+ return new StartExamViewResponse
|
|
|
+ {
|
|
|
+ StartTime = userExam.StartTime,
|
|
|
+ IsCompleted = false
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<StartExamViewResponse> CheckExamValid(UserExam userExam)
|
|
|
{
|
|
|
- await UpdateUserExamItem(updateUserExamItemDto, cancellationToken);
|
|
|
+ var examManageRepository = new ExamRepository<ExamManage>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
|
|
|
- await ModifyUserItemOptions(updateUserExamItemDto, cancellationToken);
|
|
|
+ var examManage = await examManageRepository.Queryable().Where(x => x.Id == userExam.ExamId).FirstAsync();
|
|
|
|
|
|
- await UpdateExamAnswer(updateUserExamItemDto, cancellationToken);
|
|
|
+ var startExamViewResponse = new StartExamViewResponse
|
|
|
+ {
|
|
|
+ IsJoin = false,
|
|
|
+ IsCompleted = true
|
|
|
+ };
|
|
|
+
|
|
|
+ if (examManage != null)
|
|
|
+ {
|
|
|
+ var examStrategyProxy = new ExamStrategyProxy();
|
|
|
|
|
|
- var gradingExamQuestionDto = await GetNextExamQuestion(updateUserExamItemDto);
|
|
|
+ var examStrategys = new List<IExamStrategy>();
|
|
|
+ startExamViewResponse = AddCheckStartTimeStrategy(userExam, examManage, startExamViewResponse, examStrategys);
|
|
|
+ startExamViewResponse = AddCheckEndTimeStrategy(userExam, examManage, startExamViewResponse, examStrategys);
|
|
|
+ startExamViewResponse = AddCheckValidateTimeStrategy(userExam, examManage, startExamViewResponse, examStrategys);
|
|
|
+ startExamViewResponse = AddCheckValidateCountStrategy(userExam, examManage, startExamViewResponse, examStrategys);
|
|
|
|
|
|
- return gradingExamQuestionDto;
|
|
|
+ if (!examStrategyProxy.Validate())
|
|
|
+ {
|
|
|
+ return startExamViewResponse;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return startExamViewResponse;
|
|
|
}
|
|
|
- public async Task StartUserExamAsync(StartUserExamDto startUserExamDto, CancellationToken cancellationToken)
|
|
|
+
|
|
|
+ private StartExamViewResponse AddCheckValidateCountStrategy(UserExam userExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
|
|
|
{
|
|
|
- var userExam = await _repository.GetAsync(x => x.Id == startUserExamDto.Id);
|
|
|
+ if(examManage.ExamType == Share.Enums.Exams.EExamType.Simulate)
|
|
|
+ {
|
|
|
+ var checkStartTime = new CheckValidateCountStrategy(1, 1)
|
|
|
+ {
|
|
|
+ CallBack = () =>
|
|
|
+ {
|
|
|
+ startExamViewResponse = new StartExamViewResponse
|
|
|
+ {
|
|
|
+ IsJoin = false,
|
|
|
+ IsStart = false,
|
|
|
+ IsCompleted = true
|
|
|
+ };
|
|
|
+ }
|
|
|
+ };
|
|
|
+ examStrategys.Add(checkStartTime);
|
|
|
+ return startExamViewResponse;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var count = new ExamRepository<UserExam>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).CountAsync(x => x.ExamId == examManage.Id && x.UserId == userExam.UserId).Result;
|
|
|
|
|
|
- if (userExam == null) return;
|
|
|
+ var checkStartTime = new CheckValidateCountStrategy(examManage.Count, count)
|
|
|
+ {
|
|
|
+ CallBack = () =>
|
|
|
+ {
|
|
|
+ startExamViewResponse = new StartExamViewResponse
|
|
|
+ {
|
|
|
+ IsJoin = false,
|
|
|
+ IsStart = false,
|
|
|
+ IsCompleted = true
|
|
|
+ };
|
|
|
+ }
|
|
|
+ };
|
|
|
+ examStrategys.Add(checkStartTime);
|
|
|
+ return startExamViewResponse;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- userExam.ExamStatus = Share.Enums.Exams.EExamStatus.Executing;
|
|
|
+ private StartExamViewResponse AddCheckValidateTimeStrategy(UserExam userExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
|
|
|
+ {
|
|
|
+ var checkStartTime = new CheckValidateTimeStrategy(examManage.TimeSpan, userExam.StartTime)
|
|
|
+ {
|
|
|
+ CallBack = () =>
|
|
|
+ {
|
|
|
+ startExamViewResponse = new StartExamViewResponse
|
|
|
+ {
|
|
|
+ IsJoin = false,
|
|
|
+ IsStart = false,
|
|
|
+ IsCompleted = true
|
|
|
+ };
|
|
|
+ }
|
|
|
+ };
|
|
|
+ examStrategys.Add(checkStartTime);
|
|
|
+ return startExamViewResponse;
|
|
|
+ }
|
|
|
|
|
|
- userExam.ToUpdate(_sessionContext);
|
|
|
+ private StartExamViewResponse AddCheckEndTimeStrategy(UserExam userExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
|
|
|
+ {
|
|
|
+ var checkStartTime = new CheckEndTimeStrategy(examManage.EndTime, DateTime.Now)
|
|
|
+ {
|
|
|
+ CallBack = () =>
|
|
|
+ {
|
|
|
+ startExamViewResponse = new StartExamViewResponse
|
|
|
+ {
|
|
|
+ IsJoin = false,
|
|
|
+ IsStart = false,
|
|
|
+ IsCompleted = true
|
|
|
+ };
|
|
|
+ }
|
|
|
+ };
|
|
|
+ examStrategys.Add(checkStartTime);
|
|
|
+ return startExamViewResponse;
|
|
|
+ }
|
|
|
|
|
|
- await _repository.ValidateUpdateAsync(userExam, cancellationToken);
|
|
|
+ private static StartExamViewResponse AddCheckStartTimeStrategy(UserExam userExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
|
|
|
+ {
|
|
|
+ var checkStartTime = new CheckStartTimeStrategy(examManage.StartTime, userExam.StartTime)
|
|
|
+ {
|
|
|
+ CallBack = () =>
|
|
|
+ {
|
|
|
+ startExamViewResponse = new StartExamViewResponse
|
|
|
+ {
|
|
|
+ IsJoin = false,
|
|
|
+ IsStart = false,
|
|
|
+ IsCompleted = false
|
|
|
+ };
|
|
|
+ }
|
|
|
+ };
|
|
|
+ examStrategys.Add(checkStartTime);
|
|
|
+ return startExamViewResponse;
|
|
|
}
|
|
|
|
|
|
public async Task CompleteGradingAsync(GradingExamDto gradingExtamDto, CancellationToken cancellationToken)
|
|
@@ -290,12 +442,15 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
var expression = gradingExamRequest.GetExpression();
|
|
|
var userExamTable = _repository.Queryable().Where(expression);
|
|
|
|
|
|
+ var questionScoreRepository = new ExamRepository<ExamQuestionScore>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
+
|
|
|
var userExamItemTable = _userExamItemRepository.Queryable();
|
|
|
var userExamItemOptionTable = _userExamItemOptionRepository.Queryable();
|
|
|
var examAnswerTable = new ExamRepository<ExamAnswer>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
|
|
|
var questionTable = new ExamRepository<TestPaperItem>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
|
|
|
var quesitonOptionTable = new ExamRepository<TestPaperItemOptions>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
|
|
|
var testPaperItemAnswerTable = new ExamRepository<TestPaperItemAnswer>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
|
|
|
+ var questionScoreTable = questionScoreRepository.Queryable();
|
|
|
|
|
|
var queryResult = await userExamTable.InnerJoin(userExamItemTable, (e, i) => e.Id == i.UserExamId)
|
|
|
.InnerJoin(questionTable, (e, i, q) => i.QuestionId == q.Id)
|
|
@@ -303,8 +458,10 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
.LeftJoin(quesitonOptionTable, (e, i, q, o, qo) => o.QuestionOptionId == qo.Id)
|
|
|
.LeftJoin(examAnswerTable, (e, i, q, o, qo, a) => i.Id == a.UserExamItemId)
|
|
|
.LeftJoin(testPaperItemAnswerTable, (e, i, q, o, qo, a, ta) => ta.QuestionId == qo.QuestionId)
|
|
|
+ .InnerJoin(questionScoreTable, (e, i, q, o, qo, a, ta, s) => q.QuestionType == s.QuestionType && e.ExamId == s.ExamManageId)
|
|
|
+ .Where((e, i, q, o, qo, a, ta, s) => !q.QuestionType.CheckSelectType())
|
|
|
.Select(
|
|
|
- (e, i, q, o, qo, a, ta) => new GradingExamQuestionTempDto
|
|
|
+ (e, i, q, o, qo, a, ta, s) => new GradingExamQuestionTempDto
|
|
|
{
|
|
|
Id = i.Id,
|
|
|
QuestionType = q.QuestionType,
|
|
@@ -316,7 +473,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
Content = qo.Content,
|
|
|
Label = qo.Label,
|
|
|
IsAnswer = qo.IsAnswer,
|
|
|
- IsSelected = o != null
|
|
|
+ IsSelected = o != null,
|
|
|
+ Score = s.Score
|
|
|
}
|
|
|
).ToListAsync();
|
|
|
|
|
@@ -329,16 +487,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
Answer = g.FirstOrDefault().Answer,
|
|
|
QuestionType = g.Key.QuestionType,
|
|
|
Id = g.Key.Id,
|
|
|
+ Score = g.FirstOrDefault().Score,
|
|
|
Title = g.FirstOrDefault().Title,
|
|
|
- UserExamItemOptionDtos = g.Select(i => new GradingUserExamItemOptionDto
|
|
|
- {
|
|
|
- QuestionOptionId = i.QuestionOptionId,
|
|
|
- UserExamItemId = i.UserExamItemId,
|
|
|
- Content = i.Content,
|
|
|
- IsAnswer = i.IsAnswer,
|
|
|
- IsSelected = i.IsSelected,
|
|
|
- Label = i.Label
|
|
|
- }).ToList(),
|
|
|
CorrectAnswer = g.Key.QuestionType.CheckSelectType() ? string.Join(",", g.Where(i => i.IsAnswer).Select(n => n.Label)) : g.FirstOrDefault()?.CorrectAnswer
|
|
|
}).ToList();
|
|
|
|
|
@@ -427,17 +577,74 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
#region private method
|
|
|
|
|
|
|
|
|
+
|
|
|
+ private async Task CalcuteExamItemScore(ExamRepository<UserExamItem> userExamRepository, UpdateUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ if (!addUserExamItemDto.QuestionType.CheckSelectType()) return;
|
|
|
+
|
|
|
+ var testPaperItemOptionsRepository = new ExamRepository<TestPaperItemOptions>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
+ var examManageRepository = new ExamRepository<ExamManage>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
+ var testPaperItemRepository = new ExamRepository<TestPaperItem>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
+ var examQuestionScoreRepository = new ExamRepository<ExamQuestionScore>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
+ var testPaperOptionsTable = testPaperItemOptionsRepository.Queryable().Where(x => x.QuestionId == addUserExamItemDto.QuestionId && x.IsAnswer);
|
|
|
+ var testPaperItemTable = testPaperItemRepository.Queryable();
|
|
|
+ var userExamTable = _repository.Queryable().Where(x => x.Id == addUserExamItemDto.UserExamId);
|
|
|
+ var examManageTable = examManageRepository.Queryable();
|
|
|
+ var testPaperOptionIds = await testPaperOptionsTable.InnerJoin(testPaperItemTable, (t, i) => t.TestPaperItemId == i.Id)
|
|
|
+ .InnerJoin(examManageTable, (t, i, e) => i.TestPaperId == e.TestPaperId)
|
|
|
+ .InnerJoin(userExamTable, (t, i, e, u) => e.Id == u.ExamId)
|
|
|
+ .Select((t, i, e, u) => t.Id).ToListAsync();
|
|
|
+
|
|
|
+ var isCorrect = addUserExamItemDto.UserExamItemOptionDtos.Select(x => x.QuestionOptionId).OrderBy(x => x).SequenceEqual(testPaperOptionIds.OrderBy(x => x));
|
|
|
+
|
|
|
+ var userExamItem = await userExamRepository.GetAsync(x => x.UserExamId == addUserExamItemDto.UserExamId && x.QuestionId == addUserExamItemDto.QuestionId);
|
|
|
+ var examQuesiontScores = await examQuestionScoreRepository.Queryable().Where(x => x.QuestionType == addUserExamItemDto.QuestionType)
|
|
|
+ .InnerJoin(userExamTable, (e, u) => e.Id == u.ExamId)
|
|
|
+ .Select((e, u) => e).ToListAsync();
|
|
|
+ userExamItem.IsCheck = true;
|
|
|
+ userExamItem.Score = isCorrect ? examQuesiontScores.FirstOrDefault()?.Score : 0;
|
|
|
+ userExamItem.ToUpdate(_sessionContext);
|
|
|
+ await userExamRepository.UpdateWithValidateAsync(userExamItem, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task AddExamAsync(IRepository<UserExamItem> userExamItemRepository, AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var userExamItem = await AddUserExamItem(addUserExamItemDto, cancellationToken);
|
|
|
+
|
|
|
+ userExamItem.UserExamItemOptionses = await AddUserExamItemOptions(addUserExamItemDto, cancellationToken);
|
|
|
+
|
|
|
+ userExamItem.ExamAnswers = await AddExamAnswer(addUserExamItemDto, cancellationToken);
|
|
|
+
|
|
|
+ await userExamItemRepository.AddNav(userExamItem)
|
|
|
+ .Include(x => x.UserExamItemOptionses)
|
|
|
+ .Include(x => x.ExamAnswers)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task UpdateExamAsync(IRepository<UserExamItem> userExamItemRepository, UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var userExamItem = await UpdateUserExamItem(updateUserExamItemDto, cancellationToken);
|
|
|
+
|
|
|
+ userExamItem.UserExamItemOptionses = await ModifyUserItemOptions(updateUserExamItemDto, cancellationToken);
|
|
|
+
|
|
|
+ userExamItem.ExamAnswers = await UpdateExamAnswer(updateUserExamItemDto, cancellationToken);
|
|
|
+
|
|
|
+ await userExamItemRepository.UpdateNav(userExamItem)
|
|
|
+ .Include(x => x.UserExamItemOptionses)
|
|
|
+ .Include(x => x.ExamAnswers)
|
|
|
+ .ExecuteCommandAsync();
|
|
|
+ }
|
|
|
private async Task<GradingExamQuestionDto> GetNextExamQuestion(GradingExtamItemDto gradingExtamItemDto)
|
|
|
{
|
|
|
// TODO: 获取未阅卷的第一道题
|
|
|
var current = _userExamItemRepository.Queryable().Where(x => x.Id == gradingExtamItemDto.UserExamItemId);
|
|
|
var userExamItemTable = _userExamItemRepository.Queryable().Where(x => !x.IsCheck);
|
|
|
|
|
|
- var userExamItem = current.InnerJoin(userExamItemTable, (c, u) => c.UserExamId == u.UserExamId).OrderBy(x => x.SortIndex).First();
|
|
|
+ var userExamItem = current.InnerJoin(userExamItemTable, (c, u) => c.UserExamId == u.UserExamId).OrderBy((c, u) => c.SortIndex).First();
|
|
|
|
|
|
if (userExamItem != null)
|
|
|
{
|
|
|
- var testPaperItem = new ExamRepository<TestPaperItem>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.Id == userExamItem.Id).First();
|
|
|
+ var testPaperItem = new ExamRepository<TestPaperItem>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.Id == userExamItem.Id && !x.QuestionType.CheckSelectType()).First();
|
|
|
|
|
|
if (testPaperItem == null) return null;
|
|
|
|
|
@@ -445,36 +652,14 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
|
|
|
gradingExamQuestionDto = _mapper.Map<TestPaperItem, GradingExamQuestionDto>(testPaperItem, gradingExamQuestionDto);
|
|
|
|
|
|
- if (testPaperItem.QuestionType.CheckSelectType())
|
|
|
- {
|
|
|
- var userExamItemOptionTable = _userExamItemOptionRepository.Queryable().Where(x => x.UserExamItemId == userExamItem.Id);
|
|
|
- var quesitonOptionTable = new ExamRepository<TestPaperItemOptions>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
|
|
|
-
|
|
|
- var queryResult = quesitonOptionTable.LeftJoin(userExamItemOptionTable, (q, u) => u.QuestionOptionId == q.Id)
|
|
|
- .Select((q, u) => new GradingUserExamItemOptionDto
|
|
|
- {
|
|
|
- Content = q.Content,
|
|
|
- QuestionOptionId = u.QuestionOptionId,
|
|
|
- UserExamItemId = u != null ? u.UserExamItemId : string.Empty,
|
|
|
- IsAnswer = q.IsAnswer,
|
|
|
- Label = q.Label,
|
|
|
- IsSelected = u != null
|
|
|
- });
|
|
|
+ var examAnswer = new ExamRepository<ExamAnswer>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.UserExamItemId == userExamItem.Id).First();
|
|
|
|
|
|
- gradingExamQuestionDto.UserExamItemOptionDtos = queryResult.ToList();
|
|
|
+ var testPaperItemAnswer = await new ExamRepository<TestPaperItemAnswer>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable().FirstAsync(x => x.QuestionId == testPaperItem.QuestionId && x.TestPaperItemId == testPaperItem.Id);
|
|
|
|
|
|
- gradingExamQuestionDto.CorrectAnswer = string.Join(",", gradingExamQuestionDto.UserExamItemOptionDtos.Where(x => x.IsAnswer).Select(m => m.Label));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- var examAnswer = new ExamRepository<ExamAnswer>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.UserExamItemId == userExamItem.Id).First();
|
|
|
+ gradingExamQuestionDto.Answer = examAnswer.Answer ?? string.Empty;
|
|
|
|
|
|
- var testPaperItemAnswer = await new ExamRepository<TestPaperItemAnswer>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable().FirstAsync(x => x.QuestionId == testPaperItem.QuestionId && x.TestPaperItemId == testPaperItem.Id);
|
|
|
+ gradingExamQuestionDto.CorrectAnswer = testPaperItemAnswer != null ? testPaperItemAnswer.Answer ?? string.Empty : string.Empty;
|
|
|
|
|
|
- gradingExamQuestionDto.Answer = examAnswer.Answer ?? string.Empty;
|
|
|
-
|
|
|
- gradingExamQuestionDto.CorrectAnswer = testPaperItemAnswer != null ? testPaperItemAnswer.Answer ?? string.Empty : string.Empty;
|
|
|
- }
|
|
|
|
|
|
return gradingExamQuestionDto;
|
|
|
|
|
@@ -483,9 +668,11 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- private async Task AddExamAnswer(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ private async Task<List<ExamAnswer>> AddExamAnswer(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- if (addUserExamItemDto.QuestionType.CheckSelectType()) return;
|
|
|
+ if (addUserExamItemDto.QuestionType.CheckSelectType()) return null;
|
|
|
+
|
|
|
+ var examAnswers = new List<ExamAnswer>();
|
|
|
|
|
|
var examAnswer = new ExamAnswer
|
|
|
{
|
|
@@ -496,6 +683,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
examAnswer.ToInsert(_sessionContext);
|
|
|
|
|
|
await new ExamRepository<ExamAnswer>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).ValidateAddAsync(examAnswer, cancellationToken);
|
|
|
+
|
|
|
+ return examAnswers;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -557,7 +746,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
|
|
|
}
|
|
|
|
|
|
- private async Task UpdateExamAnswer(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ private async Task<List<ExamAnswer>> UpdateExamAnswer(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var repository = new ExamRepository<ExamAnswer>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
|
|
@@ -574,11 +763,19 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
examAnswer.ToUpdate(_sessionContext);
|
|
|
|
|
|
await repository.ValidateAddAsync(examAnswer, cancellationToken);
|
|
|
+
|
|
|
+ var examAnswers = new List<ExamAnswer>();
|
|
|
+
|
|
|
+ examAnswers.Add(examAnswer);
|
|
|
+
|
|
|
+ return examAnswers;
|
|
|
}
|
|
|
+
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
|
|
|
- private async Task ModifyUserItemOptions(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ private async Task<List<UserExamItemOptions>> ModifyUserItemOptions(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
if (updateUserExamItemDto.QuestionType.CheckSelectType())
|
|
|
{
|
|
@@ -602,8 +799,10 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
addUserExamItemDto.UserExamItemOptionDtos.Add(_mapper.Map<AddUserExamItemOptionDto>(item));
|
|
|
});
|
|
|
|
|
|
- await AddUserExamItemOptions(addUserExamItemDto, cancellationToken);
|
|
|
+ return await AddUserExamItemOptions(addUserExamItemDto, cancellationToken);
|
|
|
}
|
|
|
+
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
private async Task UpdateUserItemOptions(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
|
|
@@ -637,12 +836,14 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
|
|
|
}
|
|
|
|
|
|
- private async Task UpdateUserExamItem(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ private async Task<UserExamItem> UpdateUserExamItem(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- var userExamItem = await _userExamItemRepository.GetAsync(x => x.Id == updateUserExamItemDto.Id);
|
|
|
+ var userExamItem = await _userExamItemRepository.GetAsync(x => x.UserExamId == updateUserExamItemDto.UserExamId && x.QuestionId == updateUserExamItemDto.QuestionId);
|
|
|
|
|
|
userExamItem = _mapper.Map<UpdateUserExamItemDto, UserExamItem>(updateUserExamItemDto, userExamItem);
|
|
|
|
|
|
+ updateUserExamItemDto.Id = userExamItem.Id;
|
|
|
+
|
|
|
userExamItem.ToUpdate(_sessionContext);
|
|
|
|
|
|
await _userExamItemRepository.ValidateUpdateAsync(userExamItem, cancellationToken);
|
|
@@ -654,10 +855,12 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
updateUserExamItemDto.UserExamItemOptionDtos.ForEach(x => x.UserExamItemId = updateUserExamItemDto.Id);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ return userExamItem;
|
|
|
}
|
|
|
|
|
|
|
|
|
- private async Task AddUserExamItemOptions(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ private async Task<List<UserExamItemOptions>> AddUserExamItemOptions(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var userExamItemOptions = new List<UserExamItemOptions>();
|
|
|
|
|
@@ -675,9 +878,11 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
userExamItemOptions.ToInsert(_sessionContext);
|
|
|
|
|
|
await _userExamItemOptionRepository.ValidateAddAsync(userExamItemOptions, cancellationToken);
|
|
|
+
|
|
|
+ return userExamItemOptions;
|
|
|
}
|
|
|
|
|
|
- private async Task AddUserExamItem(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
|
+ private async Task<UserExamItem> AddUserExamItem(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var userExamItem = _mapper.Map<UserExamItem>(addUserExamItemDto);
|
|
|
|
|
@@ -692,6 +897,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
addUserExamItemDto.UserExamItemOptionDtos.ForEach(x => x.UserExamItemId = userExamItem.Id);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ return userExamItem;
|
|
|
}
|
|
|
|
|
|
private async Task DeleteUserExamItemOptions(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
|
|
@@ -725,7 +932,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
EndTime = e.EndTime,
|
|
|
StartTime = e.StartTime,
|
|
|
TimeSpan = e.TimeSpan,
|
|
|
- ExamType = e.ExamType
|
|
|
+ ExamType = e.ExamType,
|
|
|
+ ExamId = e.Id
|
|
|
});
|
|
|
return queryable;
|
|
|
}
|