|
@@ -41,6 +41,7 @@ using System.Threading;
|
|
using DocumentFormat.OpenXml.Office2013.Excel;
|
|
using DocumentFormat.OpenXml.Office2013.Excel;
|
|
using Hotline.Share.Enums.Exams;
|
|
using Hotline.Share.Enums.Exams;
|
|
using DocumentFormat.OpenXml.Wordprocessing;
|
|
using DocumentFormat.OpenXml.Wordprocessing;
|
|
|
|
+using Hotline.Repository.SqlSugar.Exam.Repositories.ExamManages;
|
|
|
|
|
|
namespace Hotline.Application.Exam.Service.ExamManages
|
|
namespace Hotline.Application.Exam.Service.ExamManages
|
|
{
|
|
{
|
|
@@ -141,8 +142,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
var examAnswerRepository = new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
var examAnswerRepository = new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
var userExamItemRepository = new ExamRepository<ExamUserExamItem>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
var userExamItemRepository = new ExamRepository<ExamUserExamItem>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
|
|
|
- var userExamItemTable = userExamItemRepository.Queryable().Where(i=> i.QuestionId == examQuestionRequest.QuestionId);
|
|
|
|
- var userExamTable = _repository.Queryable().Where(u=> u.UserId == _sessionContext.UserId);
|
|
|
|
|
|
+ var userExamItemTable = userExamItemRepository.Queryable().Where(i => i.QuestionId == examQuestionRequest.QuestionId);
|
|
|
|
+ var userExamTable = _repository.Queryable().Where(u => u.UserId == _sessionContext.UserId);
|
|
var examAnswerTable = examAnswerRepository.Queryable();
|
|
var examAnswerTable = examAnswerRepository.Queryable();
|
|
|
|
|
|
var examAnswers = await examAnswerTable.InnerJoin(userExamItemTable, (e, i) => e.UserExamItemId == i.Id)
|
|
var examAnswers = await examAnswerTable.InnerJoin(userExamItemTable, (e, i) => e.UserExamItemId == i.Id)
|
|
@@ -182,9 +183,9 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
var result = queryable.GroupBy(x => x.QuestionType).Select(m => new ExamQuestionViewResponse
|
|
var result = queryable.GroupBy(x => x.QuestionType).Select(m => new ExamQuestionViewResponse
|
|
{
|
|
{
|
|
QuestionType = m.Key,
|
|
QuestionType = m.Key,
|
|
- Questions = m.Select(n => new SimpleViewResponse
|
|
|
|
|
|
+ Questions = m.GroupBy(g => g.QuestionId).Select(n => new SimpleViewResponse
|
|
{
|
|
{
|
|
- Id = n.QuestionId
|
|
|
|
|
|
+ Id = n.Key
|
|
}).ToList()
|
|
}).ToList()
|
|
}).ToList();
|
|
}).ToList();
|
|
|
|
|
|
@@ -287,7 +288,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
|
|
|
if (userExams.All(x => x.IsSubmit))
|
|
if (userExams.All(x => x.IsSubmit))
|
|
{
|
|
{
|
|
- var examManage = await _examManageRepository.GetAsync(x=>x.Id == examId);
|
|
|
|
|
|
+ var examManage = await _examManageRepository.GetAsync(x => x.Id == examId);
|
|
|
|
|
|
examManage.ExamStatus = EExamStatus.Complete;
|
|
examManage.ExamStatus = EExamStatus.Complete;
|
|
|
|
|
|
@@ -303,6 +304,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
|
|
|
if (!startExamViewResponse.CheckValidate())
|
|
if (!startExamViewResponse.CheckValidate())
|
|
{
|
|
{
|
|
|
|
+ await SetExamStatus(userExam, startExamViewResponse, cancellationToken);
|
|
|
|
+
|
|
return startExamViewResponse;
|
|
return startExamViewResponse;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -321,6 +324,16 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
|
|
|
return startExamViewResponse;
|
|
return startExamViewResponse;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ private async Task SetExamStatus(ExamUserExam userExam, StartExamViewResponse startExamViewResponse, CancellationToken cancellationToken)
|
|
|
|
+ {
|
|
|
|
+ userExam.ExamStatus = startExamViewResponse.IsCompleted ? EExamStatus.Complete : EExamStatus.NoStart;
|
|
|
|
+
|
|
|
|
+ userExam.ToUpdate(_sessionContext);
|
|
|
|
+
|
|
|
|
+ await _repository.UpdateWithValidateAsync(userExam, cancellationToken);
|
|
|
|
+ }
|
|
|
|
+
|
|
public async Task<StartExamViewResponse> StartUserExamAsync(StartUserExamDto startUserExamDto, CancellationToken cancellationToken)
|
|
public async Task<StartExamViewResponse> StartUserExamAsync(StartUserExamDto startUserExamDto, CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
var userExam = await _repository.GetAsync(x => x.Id == startUserExamDto.Id);
|
|
var userExam = await _repository.GetAsync(x => x.Id == startUserExamDto.Id);
|
|
@@ -337,6 +350,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
|
|
|
if (!startExamViewResponse.CheckValidate())
|
|
if (!startExamViewResponse.CheckValidate())
|
|
{
|
|
{
|
|
|
|
+ await SetExamStatus(userExam, startExamViewResponse, cancellationToken);
|
|
|
|
+
|
|
return startExamViewResponse;
|
|
return startExamViewResponse;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -362,7 +377,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
private async Task<StartExamViewResponse> CheckExamValid(ExamUserExam examUserExam, CancellationToken cancellationToken)
|
|
private async Task<StartExamViewResponse> CheckExamValid(ExamUserExam examUserExam, CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
|
|
|
|
- var examManage = await _examManageRepository.Queryable().Where(x => x.Id == examUserExam.ExamId).FirstAsync();
|
|
|
|
|
|
+ var examManage = await _examManageRepository.Queryable().Where(x => x.Id == examUserExam.ExamId).FirstAsync();
|
|
|
|
|
|
var startExamViewResponse = new StartExamViewResponse
|
|
var startExamViewResponse = new StartExamViewResponse
|
|
{
|
|
{
|
|
@@ -381,15 +396,18 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
startExamViewResponse = AddCheckValidateTimeStrategy(examUserExam, examManage, startExamViewResponse, examStrategys);
|
|
startExamViewResponse = AddCheckValidateTimeStrategy(examUserExam, examManage, startExamViewResponse, examStrategys);
|
|
startExamViewResponse = AddCheckValidateCountStrategy(examUserExam, examManage, startExamViewResponse, examStrategys);
|
|
startExamViewResponse = AddCheckValidateCountStrategy(examUserExam, examManage, startExamViewResponse, examStrategys);
|
|
|
|
|
|
|
|
+ examStrategyProxy.Initial(examStrategys);
|
|
|
|
+
|
|
if (!examStrategyProxy.Validate())
|
|
if (!examStrategyProxy.Validate())
|
|
{
|
|
{
|
|
|
|
+ startExamViewResponse = (StartExamViewResponse)examStrategyProxy.GetResult();
|
|
return startExamViewResponse;
|
|
return startExamViewResponse;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
startExamViewResponse.IsStart = true;
|
|
startExamViewResponse.IsStart = true;
|
|
|
|
|
|
- if (examManage.ExamStatus== EExamStatus.NoStart)
|
|
|
|
|
|
+ if (examManage.ExamStatus == EExamStatus.NoStart)
|
|
{
|
|
{
|
|
await UpdateExamStatus(examManage, cancellationToken);
|
|
await UpdateExamStatus(examManage, cancellationToken);
|
|
}
|
|
}
|
|
@@ -416,12 +434,16 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
{
|
|
{
|
|
CallBack = () =>
|
|
CallBack = () =>
|
|
{
|
|
{
|
|
- startExamViewResponse = new StartExamViewResponse
|
|
|
|
|
|
+ var response = new StartExamViewResponse
|
|
{
|
|
{
|
|
IsJoin = false,
|
|
IsJoin = false,
|
|
IsStart = false,
|
|
IsStart = false,
|
|
- IsCompleted = true
|
|
|
|
|
|
+ IsCompleted = true,
|
|
|
|
+ StartTime = examUserExam.StartTime,
|
|
|
|
+ TimeSpan = examManage.TimeSpan
|
|
};
|
|
};
|
|
|
|
+
|
|
|
|
+ return response;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
examStrategys.Add(checkStartTime);
|
|
examStrategys.Add(checkStartTime);
|
|
@@ -435,12 +457,16 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
{
|
|
{
|
|
CallBack = () =>
|
|
CallBack = () =>
|
|
{
|
|
{
|
|
- startExamViewResponse = new StartExamViewResponse
|
|
|
|
|
|
+ var response = new StartExamViewResponse
|
|
{
|
|
{
|
|
IsJoin = false,
|
|
IsJoin = false,
|
|
IsStart = false,
|
|
IsStart = false,
|
|
- IsCompleted = true
|
|
|
|
|
|
+ IsCompleted = true,
|
|
|
|
+ StartTime = examUserExam.StartTime,
|
|
|
|
+ TimeSpan = examManage.TimeSpan
|
|
};
|
|
};
|
|
|
|
+
|
|
|
|
+ return response;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
examStrategys.Add(checkStartTime);
|
|
examStrategys.Add(checkStartTime);
|
|
@@ -457,12 +483,16 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
{
|
|
{
|
|
CallBack = () =>
|
|
CallBack = () =>
|
|
{
|
|
{
|
|
- startExamViewResponse = new StartExamViewResponse
|
|
|
|
|
|
+ var response = new StartExamViewResponse
|
|
{
|
|
{
|
|
IsJoin = false,
|
|
IsJoin = false,
|
|
IsStart = false,
|
|
IsStart = false,
|
|
- IsCompleted = true
|
|
|
|
|
|
+ IsCompleted = true,
|
|
|
|
+ StartTime = examUserExam.StartTime,
|
|
|
|
+ TimeSpan = examManage.TimeSpan
|
|
};
|
|
};
|
|
|
|
+
|
|
|
|
+ return response;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
examStrategys.Add(checkStartTime);
|
|
examStrategys.Add(checkStartTime);
|
|
@@ -477,12 +507,16 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
{
|
|
{
|
|
CallBack = () =>
|
|
CallBack = () =>
|
|
{
|
|
{
|
|
- startExamViewResponse = new StartExamViewResponse
|
|
|
|
|
|
+ var response = new StartExamViewResponse
|
|
{
|
|
{
|
|
IsJoin = false,
|
|
IsJoin = false,
|
|
IsStart = false,
|
|
IsStart = false,
|
|
- IsCompleted = true
|
|
|
|
|
|
+ IsCompleted = true,
|
|
|
|
+ StartTime = examUserExam.StartTime,
|
|
|
|
+ TimeSpan = examManage.TimeSpan
|
|
};
|
|
};
|
|
|
|
+
|
|
|
|
+ return response;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
examStrategys.Add(checkStartTime);
|
|
examStrategys.Add(checkStartTime);
|
|
@@ -497,12 +531,16 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
{
|
|
{
|
|
CallBack = () =>
|
|
CallBack = () =>
|
|
{
|
|
{
|
|
- startExamViewResponse = new StartExamViewResponse
|
|
|
|
|
|
+ var response = new StartExamViewResponse
|
|
{
|
|
{
|
|
IsJoin = false,
|
|
IsJoin = false,
|
|
IsStart = false,
|
|
IsStart = false,
|
|
- IsCompleted = false
|
|
|
|
|
|
+ IsCompleted = false,
|
|
|
|
+ StartTime = examUserExam.StartTime,
|
|
|
|
+ TimeSpan = examManage.TimeSpan
|
|
};
|
|
};
|
|
|
|
+
|
|
|
|
+ return response;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
examStrategys.Add(checkStartTime);
|
|
examStrategys.Add(checkStartTime);
|
|
@@ -570,7 +608,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
Label = qo.Label,
|
|
Label = qo.Label,
|
|
IsAnswer = qo.IsAnswer,
|
|
IsAnswer = qo.IsAnswer,
|
|
IsSelected = o.Id != null,
|
|
IsSelected = o.Id != null,
|
|
- Score = s.Score
|
|
|
|
|
|
+ QuestionScore = s.Score,
|
|
|
|
+ Score = i.Score
|
|
}
|
|
}
|
|
);
|
|
);
|
|
|
|
|
|
@@ -585,6 +624,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
Answer = g.FirstOrDefault().Answer,
|
|
Answer = g.FirstOrDefault().Answer,
|
|
QuestionType = g.Key.QuestionType,
|
|
QuestionType = g.Key.QuestionType,
|
|
Id = g.Key.Id,
|
|
Id = g.Key.Id,
|
|
|
|
+ QuestionScore = g.FirstOrDefault().QuestionScore,
|
|
Score = g.FirstOrDefault().Score,
|
|
Score = g.FirstOrDefault().Score,
|
|
Title = g.FirstOrDefault().Title,
|
|
Title = g.FirstOrDefault().Title,
|
|
CorrectAnswer = g.Key.QuestionType.CheckSelectType() ? string.Join(",", g.Where(i => i.IsAnswer).Select(n => n.Label).Distinct()) : g.FirstOrDefault()?.CorrectAnswer
|
|
CorrectAnswer = g.Key.QuestionType.CheckSelectType() ? string.Join(",", g.Where(i => i.IsAnswer).Select(n => n.Label).Distinct()) : g.FirstOrDefault()?.CorrectAnswer
|
|
@@ -604,7 +644,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
|
|
|
public async Task<UnExamUserPageViewResponse> GetUnExamUsers(UnExamUserReportPagedRequest unExamUserReportPagedRequest)
|
|
public async Task<UnExamUserPageViewResponse> GetUnExamUsers(UnExamUserReportPagedRequest unExamUserReportPagedRequest)
|
|
{
|
|
{
|
|
- unExamUserReportPagedRequest.ResoleEndTime();
|
|
|
|
|
|
+ unExamUserReportPagedRequest.ResolveEndTime();
|
|
|
|
|
|
var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
var userRepository = new ExamRepository<User>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
var userRepository = new ExamRepository<User>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
@@ -637,7 +677,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
|
|
|
public async Task<UserExamResultPageViewResponse> GetUserExamResults(UserExamResultReportPagedRequest userExamResultReportPagedRequest)
|
|
public async Task<UserExamResultPageViewResponse> GetUserExamResults(UserExamResultReportPagedRequest userExamResultReportPagedRequest)
|
|
{
|
|
{
|
|
- userExamResultReportPagedRequest.ResoleEndTime();
|
|
|
|
|
|
+ userExamResultReportPagedRequest.ResolveEndTime();
|
|
|
|
|
|
var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
var userRepository = new ExamRepository<User>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
var userRepository = new ExamRepository<User>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
@@ -659,7 +699,9 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
CutoffScore = e.CutoffScore,
|
|
CutoffScore = e.CutoffScore,
|
|
Score = ue.Score ?? 0,
|
|
Score = ue.Score ?? 0,
|
|
|
|
|
|
- });
|
|
|
|
|
|
+ })
|
|
|
|
+ .MergeTable()
|
|
|
|
+ .OrderByDescending(x => x.Score);
|
|
|
|
|
|
var total = await queryResult.CountAsync();
|
|
var total = await queryResult.CountAsync();
|
|
var items = await queryResult.ToPageListAsync(userExamResultReportPagedRequest.PageIndex, userExamResultReportPagedRequest.PageSize);
|
|
var items = await queryResult.ToPageListAsync(userExamResultReportPagedRequest.PageIndex, userExamResultReportPagedRequest.PageSize);
|
|
@@ -676,7 +718,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
public async Task<GradingResultPageViewResponse> GetGradingResultPagedList(GradingPagedRequest gradingPagedRequest)
|
|
public async Task<GradingResultPageViewResponse> GetGradingResultPagedList(GradingPagedRequest gradingPagedRequest)
|
|
{
|
|
{
|
|
// 只要有阅卷记录就在已阅卷列表中,已阅卷和未阅卷会有重复数据,只有所有记录都已阅卷才会从未阅卷列表中排除
|
|
// 只要有阅卷记录就在已阅卷列表中,已阅卷和未阅卷会有重复数据,只有所有记录都已阅卷才会从未阅卷列表中排除
|
|
- var userExamTable = _repository.Queryable().WhereIF(gradingPagedRequest.IsCheck!=null, x => x.IsCheck == gradingPagedRequest.IsCheck && x.IsSubmit);
|
|
|
|
|
|
+ var userExamTable = _repository.Queryable().WhereIF(gradingPagedRequest.IsCheck != null, x => x.IsCheck == gradingPagedRequest.IsCheck && x.IsSubmit);
|
|
|
|
|
|
var examManageTable = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
|
|
var examManageTable = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
|
|
|
|
|
|
@@ -695,7 +737,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
TotalScore = e.TotalScore,
|
|
TotalScore = e.TotalScore,
|
|
ExamName = e.Name,
|
|
ExamName = e.Name,
|
|
ExamCode = e.Code,
|
|
ExamCode = e.Code,
|
|
- IsCheck = SqlFunc.Subqueryable<ExamUserExam>().Where(x=>x.ExamId == e.Id && x.IsCheck).Any(),
|
|
|
|
|
|
+ IsCheck = SqlFunc.Subqueryable<ExamUserExam>().Where(x => x.ExamId == e.Id && x.IsCheck).Any(),
|
|
Id = e.Id,
|
|
Id = e.Id,
|
|
Remark = e.Remark
|
|
Remark = e.Remark
|
|
});
|
|
});
|
|
@@ -720,16 +762,45 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
|
|
|
|
if (userExamItems != null && userExamItemIds.Any())
|
|
if (userExamItems != null && userExamItemIds.Any())
|
|
{
|
|
{
|
|
- userExamItems = _mapper.Map<List<GradingExamItemDto>, List<ExamUserExamItem>>(batchGradingExamItemDto.Items, userExamItems);
|
|
|
|
|
|
+ var updateUserExamItems = new List<ExamUserExamItem>();
|
|
|
|
+ userExamItems.ForEach(x =>
|
|
|
|
+ {
|
|
|
|
+ var gradingExamItemDto = batchGradingExamItemDto.Items.Find(m => m.UserExamItemId == x.Id);
|
|
|
|
+
|
|
|
|
+ var updateUserExamItem = _mapper.Map<GradingExamItemDto, ExamUserExamItem>(gradingExamItemDto, x);
|
|
|
|
+
|
|
|
|
+ updateUserExamItem.IsCheck = true;
|
|
|
|
+
|
|
|
|
+ updateUserExamItems.Add(updateUserExamItem);
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ updateUserExamItems.ToUpdate(_sessionContext);
|
|
|
|
+
|
|
|
|
+ await _userExamItemRepository.UpdateWithValidateAsync(updateUserExamItems, cancellationToken);
|
|
|
|
+
|
|
|
|
+ var userExamId = userExamItems.FirstOrDefault()?.UserExamId;
|
|
|
|
+ // 计算本次考试得分
|
|
|
|
+ var userExamItemsInCheck = await _userExamItemRepository.Queryable()
|
|
|
|
+ .InnerJoin<ExamQuestionBak>((u, q) => u.QuestionId == q.QuestionId)
|
|
|
|
+ .Where((u, q) => u.UserExamId == userExamId && (q.QuestionType == EQuestionType.Single || q.QuestionType == EQuestionType.Multi || q.QuestionType == EQuestionType.Judge)).Select((u, q) => new UpdateUserExamItemDto
|
|
|
|
+ {
|
|
|
|
+ QuestionId = u.QuestionId,
|
|
|
|
+ QuestionType = q.QuestionType,
|
|
|
|
+ UserExamId = u.UserExamId,
|
|
|
|
+ }).Distinct().ToListAsync();
|
|
|
|
+ await CalcuteExamItemScore(_userExamItemRepository, userExamItemsInCheck, cancellationToken);
|
|
|
|
+
|
|
|
|
+ await CalcuteTotalScore(_userExamItemRepository, userExamId, cancellationToken);
|
|
|
|
|
|
- await _userExamItemRepository.UpdateWithValidateAsync(userExamItems, cancellationToken);
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
public async Task<List<ExamUserViewResponse>> GetUserListAsync(ExamUserQueryRequest examUserQueryRequest)
|
|
public async Task<List<ExamUserViewResponse>> GetUserListAsync(ExamUserQueryRequest examUserQueryRequest)
|
|
{
|
|
{
|
|
- var userExamTable = _repository.Queryable().Where(x => x.ExamId == examUserQueryRequest.ExamId);
|
|
|
|
- var queryable = await userExamTable.InnerJoin<User>((ux, u) => ux.UserId == u.Id).Select((ux,u) => new ExamUserViewResponse
|
|
|
|
|
|
+ var userExamTable = _repository.Queryable().Where(x => x.ExamId == examUserQueryRequest.ExamId);
|
|
|
|
+ var queryable = await userExamTable.InnerJoin<User>((ux, u) => ux.UserId == u.Id).Select((ux, u) => new ExamUserViewResponse
|
|
{
|
|
{
|
|
ExamId = ux.ExamId,
|
|
ExamId = ux.ExamId,
|
|
UserId = ux.UserId,
|
|
UserId = ux.UserId,
|
|
@@ -774,6 +845,80 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
await userExamRepository.UpdateWithValidateAsync(userExamItem, cancellationToken);
|
|
await userExamRepository.UpdateWithValidateAsync(userExamItem, cancellationToken);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private async Task CalcuteExamItemScore(IUserExamItemRepository userExamItemRepository, List<UpdateUserExamItemDto> addUserExamItemDtos, CancellationToken cancellationToken)
|
|
|
|
+ {
|
|
|
|
+ var questionIds = addUserExamItemDtos.Select(x => x.QuestionId).ToList();
|
|
|
|
+ var userExamIds = addUserExamItemDtos.Select(x => x.UserExamId).ToList();
|
|
|
|
+ var questionTypes = addUserExamItemDtos.Select(x => x.QuestionType).ToList();
|
|
|
|
+
|
|
|
|
+ var testPaperItemOptionsRepository = new ExamRepository<ExamQuestionOptionsBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
|
+ var userExamItemOptionRepository = new ExamRepository<ExamUserExamItemOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
|
+ var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
|
+ var testPaperItemRepository = new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
|
+ var examQuestionScoreRepository = new ExamRepository<ExamQuestionScoreBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
|
+ var testPaperOptionsTable = testPaperItemOptionsRepository.Queryable().Where(x => questionIds.Contains(x.QuestionId) && x.IsAnswer);
|
|
|
|
+ var testPaperItemTable = testPaperItemRepository.Queryable().Where(x => x.QuestionType == EQuestionType.Single || x.QuestionType == EQuestionType.Multi || x.QuestionType == EQuestionType.Judge);
|
|
|
|
+ var userExamTable = _repository.Queryable().Where(x => userExamIds.Contains(x.Id));
|
|
|
|
+ var examManageTable = examManageRepository.Queryable();
|
|
|
|
+ var testPaperOptionIds = await testPaperOptionsTable.InnerJoin(testPaperItemTable, (t, i) => t.ExamQuestionId == i.Id)
|
|
|
|
+ .InnerJoin(examManageTable, (t, i, e) => i.ExamId == e.Id)
|
|
|
|
+ .InnerJoin(userExamTable, (t, i, e, u) => e.Id == u.ExamId)
|
|
|
|
+ .Select((t, i, e, u) => t.Id).ToListAsync();
|
|
|
|
+
|
|
|
|
+ var userExamItems = await userExamItemRepository.Queryable().Where(x => userExamIds.Contains(x.UserExamId)).ToListAsync();
|
|
|
|
+ var userExamItemIds = userExamItems.Select(x => x.Id).ToList();
|
|
|
|
+ var userExamItemOptions = await userExamItemOptionRepository.Queryable().Where(x => userExamItemIds.Contains(x.UserExamItemId)).ToListAsync();
|
|
|
|
+ var examQuesiontScores = await examQuestionScoreRepository.Queryable().Where(x => questionTypes.Contains(x.QuestionType))
|
|
|
|
+ .InnerJoin(userExamTable, (e, u) => e.Id == u.ExamId)
|
|
|
|
+ .Select((e, u) => e).ToListAsync();
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ foreach (var addUserExamItemDto in addUserExamItemDtos)
|
|
|
|
+ {
|
|
|
|
+ var isCorrect = userExamItemOptions.Select(x => x.QuestionOptionId).OrderBy(x => x).SequenceEqual(testPaperOptionIds.OrderBy(x => x));
|
|
|
|
+ var userExamItem = userExamItems.FirstOrDefault(x => x.QuestionId == addUserExamItemDto.QuestionId);
|
|
|
|
+ if (userExamItem != null)
|
|
|
|
+ {
|
|
|
|
+ userExamItem.IsCheck = true;
|
|
|
|
+ userExamItem.Score = isCorrect ? examQuesiontScores.FirstOrDefault(x => x.QuestionType == addUserExamItemDto.QuestionType)?.Score : 0;
|
|
|
|
+ userExamItem.ToUpdate(_sessionContext);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ await userExamItemRepository.UpdateWithValidateAsync(userExamItems, cancellationToken);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private async Task CalcuteTotalScore(IUserExamItemRepository userExamItemRepository, string userExamId, CancellationToken cancellationToken)
|
|
|
|
+ {
|
|
|
|
+ var userExam = await _repository.GetAsync(x => x.Id == userExamId);
|
|
|
|
+
|
|
|
|
+ if (userExam != null)
|
|
|
|
+ {
|
|
|
|
+ var userExamItems = await userExamItemRepository.Queryable().Where(x => x.UserExamId == userExamId).ToListAsync();
|
|
|
|
+ var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
|
|
|
|
+ var examManage = await examManageRepository.GetAsync(x => x.Id == userExam.ExamId);
|
|
|
|
+
|
|
|
|
+ var totalScore = userExamItems.Sum(x => x.Score);
|
|
|
|
+
|
|
|
|
+ userExam.Score = totalScore;
|
|
|
|
+
|
|
|
|
+ userExam.IsCheck = true;
|
|
|
|
+
|
|
|
|
+ userExam.ExamStatus = EExamStatus.Complete;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if (examManage != null)
|
|
|
|
+ {
|
|
|
|
+ userExam.IsSuccess = userExam.Score > examManage.CutoffScore;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ userExam.ToUpdate(_sessionContext);
|
|
|
|
+
|
|
|
|
+ await _repository.UpdateWithValidateAsync(userExam, cancellationToken);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
private async Task AddExamAsync(IRepository<ExamUserExamItem> userExamItemRepository, AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
private async Task AddExamAsync(IRepository<ExamUserExamItem> userExamItemRepository, AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
var userExamItem = await AddUserExamItem(addUserExamItemDto, cancellationToken);
|
|
var userExamItem = await AddUserExamItem(addUserExamItemDto, cancellationToken);
|
|
@@ -781,7 +926,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
userExamItem.UserExamItemOptionses = await AddUserExamItemOptions(addUserExamItemDto, cancellationToken);
|
|
userExamItem.UserExamItemOptionses = await AddUserExamItemOptions(addUserExamItemDto, cancellationToken);
|
|
|
|
|
|
userExamItem.ExamAnswers = await AddExamAnswer(addUserExamItemDto, userExamItem.Id, cancellationToken);
|
|
userExamItem.ExamAnswers = await AddExamAnswer(addUserExamItemDto, userExamItem.Id, cancellationToken);
|
|
-
|
|
|
|
|
|
+
|
|
|
|
|
|
await userExamItemRepository.AddNav(userExamItem)
|
|
await userExamItemRepository.AddNav(userExamItem)
|
|
.Include(x => x.UserExamItemOptionses)
|
|
.Include(x => x.UserExamItemOptionses)
|
|
@@ -836,7 +981,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
- private async Task<List<ExamAnswer>> AddExamAnswer(AddUserExamItemDto addUserExamItemDto,string id, CancellationToken cancellationToken)
|
|
|
|
|
|
+ private async Task<List<ExamAnswer>> AddExamAnswer(AddUserExamItemDto addUserExamItemDto, string id, CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
if (addUserExamItemDto.QuestionType.CheckSelectType()) return null;
|
|
if (addUserExamItemDto.QuestionType.CheckSelectType()) return null;
|
|
|
|
|
|
@@ -952,7 +1097,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
|
|
await _examAnswerRepository.ValidateAddAsync(examAnswer, cancellationToken);
|
|
await _examAnswerRepository.ValidateAddAsync(examAnswer, cancellationToken);
|
|
|
|
|
|
examAnswers.Add(examAnswer);
|
|
examAnswers.Add(examAnswer);
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
|
|
return examAnswers;
|
|
return examAnswers;
|
|
}
|
|
}
|