12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022 |
- using DocumentFormat.OpenXml.Drawing;
- using DocumentFormat.OpenXml.Drawing.Charts;
- using DocumentFormat.OpenXml.Office2010.Excel;
- using Exam.Application.Interface.Exam;
- using Exam.ExamManages;
- using Exam.Infrastructure.Data.Entity;
- using Exam.Infrastructure.Data.Interface;
- using Exam.Infrastructure.Enums;
- using Exam.Infrastructure.Extensions;
- using Exam.Infrastructure.Validation.Validation;
- using Exam.Infrastructure.Web.Utilities;
- using Exam.Insfrastructure.Service.Service;
- using Exam.Questions;
- using Exam.Repository.Sqlsugar.Repositories;
- using Exam.Share;
- 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;
- using Hotline.Repository.SqlSugar.DataPermissions;
- using Hotline.Repository.SqlSugar.Exam.Interfaces.ExamManages;
- using Hotline.Repository.SqlSugar.Extensions;
- using Hotline.Repository.SqlSugar.Interface;
- using Hotline.Settings;
- using Hotline.Share.Dtos.ExamManages;
- using Hotline.Share.Dtos.Org;
- using Hotline.Share.Exams.Extensions;
- using Hotline.Share.Requests.Exam;
- using Hotline.Share.ViewResponses;
- using Hotline.Share.ViewResponses.Exam;
- using Hotline.Users;
- using JiebaNet.Segmenter.Common;
- 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
- {
- public class UserExamService : ApiService<UserExam, AddUserExamDto, UpdateUserExamDto, HotlineDbContext>, IUserExamService, IScopeDependency
- {
- private readonly IUserExamRepository _repository;
- private readonly IUserExamItemRepository _userExamItemRepository;
- private readonly IUserExamItemOptionRepository _userExamItemOptionRepository;
- private readonly IExamAnswerRepository _examAnswerRepository;
- private readonly IDataPermissionFilterBuilder _dataPermissionFilterBuilder;
- private readonly IServiceProvider _serviceProvider;
- private readonly IMapper _mapper;
- private readonly ISessionContext _sessionContext
- ;
- public UserExamService(IUserExamRepository repository,
- IUserExamItemRepository userExamItemRepository,
- IUserExamItemOptionRepository userExamItemOptionRepository,
- IExamAnswerRepository examAnswerRepository,
- IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider,
- IMapper mapper, ISessionContext sessionContext) : base(repository, mapper, sessionContext)
- {
- this._repository = repository;
- this._userExamItemRepository = userExamItemRepository;
- this._userExamItemOptionRepository = userExamItemOptionRepository;
- this._examAnswerRepository = examAnswerRepository;
- this._dataPermissionFilterBuilder = dataPermissionFilterBuilder;
- this._serviceProvider = serviceProvider;
- this._mapper = mapper;
- this._sessionContext = sessionContext;
- }
- #region public method
- public Task<UserExamDto> GetAsync(EntityQueryRequest entityQueryRequest)
- {
- throw new NotImplementedException();
- }
- public Task<(int, List<UserExamResultViewResponse>)> GetListAsync(UserExamPagedRequest queryRequest)
- {
- throw new NotImplementedException();
- }
- public async Task<ExamQuestionDto> GetExamQuestionDto(ExamQuestionRequest examQuestionRequest)
- {
- var expression = examQuestionRequest.GetExpression();
- var quesetion = await new ExamRepository<ExamQuestion>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression).FirstAsync();
- if (quesetion != null)
- {
- var examQuestionDto = _mapper.Map<ExamQuestionDto>(quesetion);
- if (examQuestionDto.QuestionType.CheckSelectType())
- {
- var questionOptions = await new ExamRepository<ExamQuestionOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.ExamQuestionId == quesetion.Id).ToListAsync();
- List<UserExamItemOptions> userItemItemOptions = await GetUserExteamItemOptios(quesetion);
- if (questionOptions != null)
- {
- examQuestionDto.QuestionOptions = new List<ExamQuestionOptionsDto>();
- questionOptions.ForEach(item =>
- {
- var examQuestionOptionsDto = _mapper.Map<ExamQuestionOptionsDto>(item);
- if (userItemItemOptions != null)
- {
- examQuestionOptionsDto.IsSelected = userItemItemOptions.Any(m => m.QuestionOptionId == item.Id);
- }
- examQuestionDto.QuestionOptions.Add(examQuestionOptionsDto);
- });
- }
- }
- else
- {
- List<ExamAnswer> examAnswers = await GetExamAnswers(examQuestionRequest);
- examQuestionDto.Answer = examAnswers != null ? examAnswers.FirstOrDefault()?.Answer : null;
- }
- return examQuestionDto;
- }
- else
- {
- throw new UserFriendlyException(ErrorMessage.ServiceError, string.Format(ErrorMessage.IsNotExists, string.Concat(typeof(Question).GetDescription(), ":", examQuestionRequest.QuestionId)));
- }
- }
- private async Task<List<ExamAnswer>> GetExamAnswers(ExamQuestionRequest examQuestionRequest)
- {
- var examAnswerRepository = new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var userExamItemRepository = new ExamRepository<UserExamItem>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- 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 examAnswers = await examAnswerTable.InnerJoin(userExamItemTable, (e, i) => e.UserExamItemId == i.Id)
- .InnerJoin(userExamTable, (e, i, u) => i.UserExamId == u.Id)
- .Select((e, i, u) => e).ToListAsync();
- return examAnswers;
- }
- private async Task<List<UserExamItemOptions>> GetUserExteamItemOptios(ExamQuestion quesetion)
- {
- var userExamItemOptionsRepository = new ExamRepository<UserExamItemOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var userExamItemOptionsTable = userExamItemOptionsRepository.Queryable();
- var userExamItemTable = _userExamItemRepository.Queryable();
- var userExamTable = _repository.Queryable();
- var userItemItemOptions = await userExamItemOptionsTable
- .InnerJoin(userExamItemTable, (o, u) => o.UserExamItemId == u.Id)
- .InnerJoin(userExamTable, (o, u, e) => u.UserExamId == e.Id)
- .Where((o, u, e) => u.QuestionId == quesetion.QuestionId && e.UserId == _sessionContext.UserId).
- Select((o, u, e) => o).ToListAsync();
- return userItemItemOptions;
- }
- public async Task<List<ExamQuestionViewResponse>> GetExamQuestionViewResponses(ExamQuestionGroupRequest examQuestionGroupRequest)
- {
- if (examQuestionGroupRequest.ExamId.IsNull() && examQuestionGroupRequest.UserId.IsNull())
- throw UserFriendlyException.SameMessage("查询参数不能为空");
- var expression = examQuestionGroupRequest.GetExpression();
- var examManageTable = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression);
- var testPaperItemTable = new ExamRepository<ExamQuestion>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
- var queryable = await examManageTable.InnerJoin(testPaperItemTable, (e, i) => e.Id == i.ExamId)
- .Select((e, i) => i).ToListAsync();
- var result = queryable.GroupBy(x => x.QuestionType).Select(m => new ExamQuestionViewResponse
- {
- QuestionType = m.Key,
- Questions = m.Select(n => new SimpleViewResponse
- {
- Id = n.QuestionId
- }).ToList()
- }).ToList();
- return result;
- }
- public async Task<List<GradingQuestionViewResponce>> GetGradingQuestionViewResponces(ExamQuestionGroupRequest examQuestionGroupRequest)
- {
- var expression = examQuestionGroupRequest.GetExpression();
- var examManageTable = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression);
- var testPaperItemTable = new ExamRepository<ExamQuestion>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
- var queryable = await examManageTable.InnerJoin(testPaperItemTable, (e, i) => e.Id == i.ExamId)
- .Select((e, i) => i).ToListAsync();
- var examQuestionScores = await new ExamRepository<ExamQuestionScore>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.ExamManageId == examQuestionGroupRequest.ExamId).ToListAsync();
- var userExamItemTable = _userExamItemRepository.Queryable();
- var userExamTable = _repository.Queryable().Where(x => x.ExamId == examQuestionGroupRequest.ExamId && x.UserId == examQuestionGroupRequest.UserId);
- var userExamItems = await userExamItemTable.InnerJoin(userExamTable, (i, u) => i.UserExamId == u.Id)
- .Select((i, u) => i).ToListAsync();
- var result = queryable.GroupBy(x => x.QuestionType).Select(m => new GradingQuestionViewResponce
- {
- QuestionType = m.Key,
- Questions = m.Select(n => new GradingExamViewResponse
- {
- IsCorrect = CheckCorrect(n, examQuestionScores, userExamItems),
- Id = userExamItems.FirstOrDefault(x => x.QuestionId == n.QuestionId)?.Id ?? n.Id
- }).ToList()
- }).ToList();
- return result;
- }
- private bool CheckCorrect(ExamQuestion n, List<ExamQuestionScore> examQuestionScores, List<UserExamItem> userExamItems)
- {
- var examQuestionScore = examQuestionScores.FirstOrDefault(x => x.QuestionType == n.QuestionType);
- var userItem = userExamItems.FirstOrDefault(x => x.QuestionId == n.QuestionId);
- if (userItem != null && examQuestionScore != null)
- {
- return userItem.Score == examQuestionScore.Score;
- }
- return false;
- }
- public async Task<PageViewResponse<UserExamResultViewResponse>> GetPagedListAsync(UserExamPagedRequest queryRequest)
- {
- SqlSugar.ISugarQueryable<UserExamResultViewResponse> queryable = GetQueryable(queryRequest);
- var list = await queryable.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
- var total = await queryable.CountAsync();
- var result = new UserExamResultPageViewResponse
- {
- Items = list,
- Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
- };
- return result;
- }
- public async Task<GradingExamQuestionDto> GradingAsync(GradingExtamItemDto gradingExtamItemDto, CancellationToken cancellationToken)
- {
- var userExamItem = await _userExamItemRepository.GetAsync(m => m.Id == gradingExtamItemDto.UserExamItemId);
- if (userExamItem != null)
- {
- userExamItem = _mapper.Map<GradingExtamItemDto, UserExamItem>(gradingExtamItemDto, userExamItem);
- await _userExamItemRepository.ValidateUpdateAsync(userExamItem, cancellationToken);
- }
- return await GetNextExamQuestion(gradingExtamItemDto);
- }
- public async Task SubmitAsync(SubmitExamDto submitExamDto, CancellationToken cancellationToken)
- {
- var userExam = await _repository.GetAsync(x => x.Id == submitExamDto.Id);
- if (userExam != null)
- {
- userExam = _mapper.Map<SubmitExamDto, UserExam>(submitExamDto, userExam);
- await _repository.ValidateUpdateAsync(userExam, cancellationToken);
- }
- }
- public async Task<StartExamViewResponse> ExamAsync(UpdateUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
- {
- var userExam = await new ExamRepository<UserExam>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.Id == addUserExamItemDto.UserExamId).FirstAsync();
- var startExamViewResponse = await CheckExamValid(userExam);
- if (!startExamViewResponse.CheckValidate())
- {
- return startExamViewResponse;
- }
- var hasUserExamItem = _userExamItemRepository.Queryable().Where(x => x.UserExamId == addUserExamItemDto.UserExamId && x.QuestionId == addUserExamItemDto.QuestionId).Any();
- if (!hasUserExamItem)
- {
- await AddExamAsync(_userExamItemRepository, addUserExamItemDto, cancellationToken);
- }
- else
- {
- await UpdateExamAsync(_userExamItemRepository, addUserExamItemDto, cancellationToken);
- }
- await CalcuteExamItemScore(_userExamItemRepository, addUserExamItemDto, cancellationToken);
- 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);
- if (!startExamViewResponse.CheckValidate())
- {
- return startExamViewResponse;
- }
- userExam.ExamStatus = Share.Enums.Exams.EExamStatus.Executing;
- userExam.ToUpdate(_sessionContext);
- await _repository.UpdateWithValidateAsync(userExam, cancellationToken);
- var examManage = await new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).GetAsync(x => x.Id == userExam.ExamId);
- return new StartExamViewResponse
- {
- StartTime = userExam.StartTime,
- TimeSpan = examManage?.TimeSpan,
- IsCompleted = false
- };
- }
- private async Task<StartExamViewResponse> CheckExamValid(UserExam userExam)
- {
- var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var examManage = await examManageRepository.Queryable().Where(x => x.Id == userExam.ExamId).FirstAsync();
- var startExamViewResponse = new StartExamViewResponse
- {
- IsJoin = true,
- IsCompleted = false
- };
- if (examManage != null)
- {
- var examStrategyProxy = new ExamStrategyProxy();
- 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);
- if (!examStrategyProxy.Validate())
- {
- return startExamViewResponse;
- }
- }
- startExamViewResponse.IsStart = true;
- return startExamViewResponse;
- }
- private StartExamViewResponse AddCheckValidateCountStrategy(UserExam userExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
- {
- 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>(_uow, _dataPermissionFilterBuilder, _serviceProvider).CountAsync(x => x.ExamId == examManage.Id && x.UserId == userExam.UserId).Result;
- var checkStartTime = new CheckValidateCountStrategy(examManage.Count, count)
- {
- CallBack = () =>
- {
- startExamViewResponse = new StartExamViewResponse
- {
- IsJoin = false,
- IsStart = false,
- IsCompleted = true
- };
- }
- };
- examStrategys.Add(checkStartTime);
- return startExamViewResponse;
- }
- }
- private StartExamViewResponse AddCheckValidateTimeStrategy(UserExam userExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
- {
- if (examManage.ExamType == Share.Enums.Exams.EExamType.Simulate) return startExamViewResponse;
- var checkStartTime = new CheckValidateTimeStrategy(examManage.TimeSpan, userExam.StartTime)
- {
- CallBack = () =>
- {
- startExamViewResponse = new StartExamViewResponse
- {
- IsJoin = false,
- IsStart = false,
- IsCompleted = true
- };
- }
- };
- examStrategys.Add(checkStartTime);
- return startExamViewResponse;
- }
- private StartExamViewResponse AddCheckEndTimeStrategy(UserExam userExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
- {
- if (examManage.ExamType == Share.Enums.Exams.EExamType.Simulate) return startExamViewResponse;
- var checkStartTime = new CheckEndTimeStrategy(examManage.EndTime, DateTime.Now)
- {
- CallBack = () =>
- {
- startExamViewResponse = new StartExamViewResponse
- {
- IsJoin = false,
- IsStart = false,
- IsCompleted = true
- };
- }
- };
- examStrategys.Add(checkStartTime);
- return startExamViewResponse;
- }
- private static StartExamViewResponse AddCheckStartTimeStrategy(UserExam userExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
- {
- if (examManage.ExamType == Share.Enums.Exams.EExamType.Simulate) return startExamViewResponse;
- 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)
- {
- var userExam = await _repository.GetAsync(x => x.Id == gradingExtamDto.Id);
- if (userExam == null) return;
- var userExamItems = await _userExamItemRepository.Queryable().Where(x => x.UserExamId == gradingExtamDto.Id).ToListAsync();
- if (userExamItems != null)
- {
- var totalScore = userExamItems.Sum(x => x.Score);
- userExam.Score = totalScore;
- var examManage = await new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).GetAsync(x => x.Id == userExam.ExamId);
- userExam.IsSuccess = totalScore >= examManage.CutoffScore;
- userExam.ExamStatus = Share.Enums.Exams.EExamStatus.Complete;
- userExam.ToUpdate(_sessionContext);
- await _repository.ValidateUpdateAsync(userExam, cancellationToken);
- }
- }
- public async Task<List<GradingExamQuestionDto>> GetGradingExamQuestion(GradingExamRequest gradingExamRequest)
- {
- var expression = gradingExamRequest.GetExpression();
- var userExamTable = _repository.Queryable().Where(expression);
- var questionScoreRepository = new ExamRepository<ExamQuestionScore>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var userExamItemTable = _userExamItemRepository.Queryable();
- var userExamItemOptionTable = _userExamItemOptionRepository.Queryable();
- var examAnswerTable = new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
- var questionTable = new ExamRepository<ExamQuestion>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
- var quesitonOptionTable = new ExamRepository<ExamQuestionOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
- var testPaperItemAnswerTable = new ExamRepository<ExamQuestionAnswer>(_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)
- .LeftJoin(userExamItemOptionTable, (e, i, q, o) => i.Id == o.UserExamItemId)
- .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, s) => new GradingExamQuestionTempDto
- {
- Id = i.Id,
- QuestionType = q.QuestionType,
- CorrectAnswer = ta != null ? ta.Answer : string.Empty,
- Answer = a != null ? a.Answer : string.Empty,
- Title = q.Title,
- QuestionOptionId = o.Id,
- UserExamItemId = i.Id,
- Content = qo.Content,
- Label = qo.Label,
- IsAnswer = qo.IsAnswer,
- IsSelected = o != null,
- Score = s.Score
- }
- ).ToListAsync();
- var gradingExamQuestionDtos = queryResult.GroupBy(x => new
- {
- Id = x.Id,
- QuestionType = x.QuestionType
- }).Select(g => new GradingExamQuestionDto
- {
- Answer = g.FirstOrDefault().Answer,
- QuestionType = g.Key.QuestionType,
- Id = g.Key.Id,
- Score = g.FirstOrDefault().Score,
- Title = g.FirstOrDefault().Title,
- CorrectAnswer = g.Key.QuestionType.CheckSelectType() ? string.Join(",", g.Where(i => i.IsAnswer).Select(n => n.Label)) : g.FirstOrDefault()?.CorrectAnswer
- }).ToList();
- return gradingExamQuestionDtos;
- }
- public async Task<GradingExamQuestionDto> ViewGradingExamQuestion(ViewGradingExamRequest viewGradingExamRequest)
- {
- var gradingExtamItemDto = _mapper.Map<ViewGradingExamRequest, GradingExtamItemDto>(viewGradingExamRequest);
- return await GetNextExamQuestion(gradingExtamItemDto);
- }
- public async Task<UnExamUserPageViewResponse> GetUnExamUsers(UnExamUserReportPagedRequest unExamUserReportPagedRequest)
- {
- unExamUserReportPagedRequest.ResoleEndTime();
- var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var userRepository = new ExamRepository<User>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var expression = unExamUserReportPagedRequest.GetExpression();
- var userExamExpression = unExamUserReportPagedRequest.GetUserExamExpression();
- var examManageTable = examManageRepository.Queryable().Where(expression);
- var userTable = userRepository.Queryable();
- var userExamTable = _repository.Queryable().Where(userExamExpression);
- var queryResult = userExamTable.InnerJoin(examManageTable, (ue, e) => ue.ExamId == e.Id)
- .InnerJoin(userTable, (ue, e, u) => ue.UserId == u.Id)
- .Select((ue, e, u) => new UnExamUserViewResponse
- {
- ExamName = e.Name,
- OrgName = u.Organization.Name,
- UserName = u.Name
- });
- var total = await queryResult.CountAsync();
- var items = await queryResult.ToPageListAsync(unExamUserReportPagedRequest.PageIndex, unExamUserReportPagedRequest.PageSize);
- return new UnExamUserPageViewResponse
- {
- Items = items,
- Pagination = new Pagination(unExamUserReportPagedRequest.PageIndex, unExamUserReportPagedRequest.PageSize, total)
- };
- }
- public async Task<UserExamResultPageViewResponse> GetUserExamResults(UserExamResultReportPagedRequest userExamResultReportPagedRequest)
- {
- userExamResultReportPagedRequest.ResoleEndTime();
- var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var userRepository = new ExamRepository<User>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var expression = userExamResultReportPagedRequest.GetExpression();
- var userExamExpression = userExamResultReportPagedRequest.GetUserExamExpression();
- var examManageTable = examManageRepository.Queryable().Where(expression);
- var userTable = userRepository.Queryable();
- var userExamTable = _repository.Queryable().Where(userExamExpression);
- var queryResult = userExamTable.InnerJoin(examManageTable, (ue, e) => ue.ExamId == e.Id)
- .InnerJoin(userTable, (ue, e, u) => ue.UserId == u.Id)
- .Select((ue, e, u) => new UserExamResultViewResponse
- {
- ExamName = e.Name,
- OrgName = u.Organization.Name,
- UserName = u.Name,
- TotalScore = e.TotalScore,
- CutoffScore = e.CutoffScore,
- Score = ue.Score ?? 0,
- });
- var total = await queryResult.CountAsync();
- var items = await queryResult.ToPageListAsync(userExamResultReportPagedRequest.PageIndex, userExamResultReportPagedRequest.PageSize);
- return new UserExamResultPageViewResponse
- {
- Items = items,
- Pagination = new Pagination(userExamResultReportPagedRequest.PageIndex, userExamResultReportPagedRequest.PageSize, total)
- };
- }
- #endregion
- #region private method
- private async Task CalcuteExamItemScore(IUserExamItemRepository userExamRepository, UpdateUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
- {
- if (!addUserExamItemDto.QuestionType.CheckSelectType()) return;
- var testPaperItemOptionsRepository = new ExamRepository<ExamQuestionOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var testPaperItemRepository = new ExamRepository<ExamQuestion>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var examQuestionScoreRepository = new ExamRepository<ExamQuestionScore>(_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.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 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((c, u) => c.SortIndex).First();
- if (userExamItem != null)
- {
- var testPaperItem = new ExamRepository<ExamQuestion>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.Id == userExamItem.Id && !x.QuestionType.CheckSelectType()).First();
- if (testPaperItem == null) return null;
- var gradingExamQuestionDto = new GradingExamQuestionDto();
- gradingExamQuestionDto = _mapper.Map<ExamQuestion, GradingExamQuestionDto>(testPaperItem, gradingExamQuestionDto);
- var examAnswer = new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.UserExamItemId == userExamItem.Id).First();
- var testPaperItemAnswer = await new ExamRepository<ExamQuestionAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().FirstAsync(x => x.QuestionId == testPaperItem.QuestionId && x.ExamQuestionId == testPaperItem.Id);
- gradingExamQuestionDto.Answer = examAnswer.Answer ?? string.Empty;
- gradingExamQuestionDto.CorrectAnswer = testPaperItemAnswer != null ? testPaperItemAnswer.Answer ?? string.Empty : string.Empty;
- return gradingExamQuestionDto;
- }
- return null;
- }
- private async Task<List<ExamAnswer>> AddExamAnswer(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
- {
- if (addUserExamItemDto.QuestionType.CheckSelectType()) return null;
- var examAnswers = new List<ExamAnswer>();
- var examAnswer = new ExamAnswer
- {
- UserId = _sessionContext.UserId,
- Answer = addUserExamItemDto.Answer
- };
- examAnswer.ToInsert(_sessionContext);
- await _examAnswerRepository.ValidateAddAsync(examAnswer, cancellationToken);
- return examAnswers;
- }
- private async Task<UserExamQuestionDto> GetNextExamQuestion(AddUserExamItemDto addUserExamItemDto)
- {
- // TODO: 获取未阅卷的第一道题
- var testPaperItemRepository = new ExamRepository<ExamQuestion>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var examRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var userExamTable = _repository.Queryable().Where(x => x.Id == addUserExamItemDto.UserExamId);
- var userExamItemTable = _userExamItemRepository.Queryable().WhereIF(addUserExamItemDto.QuestionId.IsNotNullOrEmpty(), x => x.QuestionId == addUserExamItemDto.QuestionId);
- var examTable = examRepository.Queryable();
- var testPaperItemTable = testPaperItemRepository.Queryable();
- var current = examTable.InnerJoin(testPaperItemTable, (e, t) => e.Id == t.ExamId)
- .InnerJoin(userExamTable, (e, t, u) => e.Id == u.ExamId)
- .InnerJoin(userExamItemTable, (e, t, u, i) => t.QuestionId == i.QuestionId).Select((e, t, u, i) => t);
- var nextTable = testPaperItemTable.InnerJoin(current, (t, c) => t.SortIndex > c.SortIndex).OrderBy((t, c) => t.SortIndex).Select((t, c) => t);
- var userExamItem = userExamItemTable.InnerJoin(nextTable, (u, n) => u.QuestionId == n.QuestionId).OrderBy((u, n) => u.SortIndex).Select((u, n) => u).First();
- if (userExamItem != null)
- {
- var question = testPaperItemRepository.Queryable().Where(x => x.Id == userExamItem.Id).First();
- if (question == null) return null;
- var userExamQuestionDto = new UserExamQuestionDto();
- userExamQuestionDto = _mapper.Map<ExamQuestion, UserExamQuestionDto>(question, userExamQuestionDto);
- if (question.QuestionType.CheckSelectType())
- {
- var userExamItemOptionTable = _userExamItemOptionRepository.Queryable().Where(x => x.UserExamItemId == userExamItem.Id);
- var quesitonOptionTable = new ExamRepository<ExamQuestionOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
- var queryResult = userExamItemOptionTable.InnerJoin(quesitonOptionTable, (u, q) => u.QuestionOptionId == q.Id)
- .Select((u, q) => new UserExamItemOptionDto
- {
- Content = q.Content,
- QuestionOptionId = u.QuestionOptionId,
- UserExamItemId = u.UserExamItemId
- });
- userExamQuestionDto.UserExamItemOptionDtos = queryResult.ToList();
- }
- else
- {
- var examAnswer = new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.UserExamItemId == userExamItem.Id).First();
- userExamQuestionDto.Answer = examAnswer.Answer ?? string.Empty;
- }
- return userExamQuestionDto;
- }
- else
- {
- return null;
- }
- }
- private async Task<List<ExamAnswer>> UpdateExamAnswer(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
- {
- var examAnswerTable = _examAnswerRepository.Queryable();
- var userExamItemTable = _userExamItemRepository.Queryable().Where(x => x.Id == updateUserExamItemDto.Id);
- var examAnswer = await examAnswerTable.InnerJoin(userExamItemTable, (e, u) => e.UserExamItemId == u.Id).Select((e, u) => e).FirstAsync();
- if (!updateUserExamItemDto.QuestionType.CheckSelectType())
- {
- var examAnswers = new List<ExamAnswer>();
- if (examAnswer != null)
- {
- examAnswer.Answer = updateUserExamItemDto.Answer;
- examAnswer.UserId = _sessionContext.UserId;
- examAnswer.UserExamItemId = updateUserExamItemDto.Id;
- examAnswer.ToUpdate(_sessionContext);
- await _examAnswerRepository.ValidateUpdateAsync(examAnswer, cancellationToken);
- examAnswers.Add(examAnswer);
- }
- else
- {
- examAnswer = new ExamAnswer
- {
- Answer = updateUserExamItemDto.Answer,
- UserId = _sessionContext.UserId,
- UserExamItemId = updateUserExamItemDto.Id
- };
- examAnswer.ToInsert(_sessionContext);
- await _examAnswerRepository.ValidateAddAsync(examAnswer, cancellationToken);
- examAnswers.Add(examAnswer);
- }
- return examAnswers;
- }
- return null;
- }
- private async Task<List<UserExamItemOptions>> ModifyUserItemOptions(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
- {
- if (updateUserExamItemDto.QuestionType.CheckSelectType())
- {
- var entityQuestionRequest = new EntityQueryRequest
- {
- Expression = ExpressionableUtility.CreateExpression<UserExamItemOptions>()
- .AndIF(updateUserExamItemDto.Id.IsNotEmpty(), x => x.UserExamItemId == updateUserExamItemDto.Id).ToExpression()
- };
- await DeleteUserExamItemOptions(entityQuestionRequest, cancellationToken);
- //await UpdateUserItemOptions(updateUserExamItemDto, cancellationToken);
- var addUserExamItemDto = _mapper.Map<AddUserExamItemDto>(updateUserExamItemDto);
- addUserExamItemDto.UserExamItemOptionDtos = new List<AddUserExamItemOptionDto>();
- updateUserExamItemDto.UserExamItemOptionDtos.ForEach(item =>
- {
- addUserExamItemDto.UserExamItemOptionDtos.Add(_mapper.Map<AddUserExamItemOptionDto>(item));
- });
- return await AddUserExamItemOptions(addUserExamItemDto, cancellationToken);
- }
- return null;
- }
- private async Task UpdateUserItemOptions(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
- {
- if (updateUserExamItemDto.QuestionType.CheckSelectType())
- {
- var userExamItemOptions = await _userExamItemOptionRepository.Queryable().Where(x => x.UserExamItemId == updateUserExamItemDto.Id).ToListAsync();
- var entities = new List<UserExamItemOptions>();
- if (updateUserExamItemDto.UserExamItemOptionDtos != null)
- {
- updateUserExamItemDto.UserExamItemOptionDtos.Where(m => m.OperationStatus == EEOperationStatus.Update).ToList().ForEach(x =>
- {
- var entity = userExamItemOptions.FirstOrDefault(m => m.Id == x.Id);
- if (entity != null)
- {
- entities.Add(_mapper.Map<UpdateUserExamItemOptionDto, UserExamItemOptions>(x, entity));
- }
- });
- }
- entities.ToUpdate(_sessionContext);
- await _userExamItemOptionRepository.ValidateUpdateAsync(entities, cancellationToken);
- }
- }
- private async Task<UserExamItem> UpdateUserExamItem(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
- {
- 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);
- if (updateUserExamItemDto.QuestionType.CheckSelectType())
- {
- if (updateUserExamItemDto.UserExamItemOptionDtos != null)
- {
- updateUserExamItemDto.UserExamItemOptionDtos.ForEach(x => x.UserExamItemId = updateUserExamItemDto.Id);
- }
- }
- return userExamItem;
- }
- private async Task<List<UserExamItemOptions>> AddUserExamItemOptions(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
- {
- var userExamItemOptions = new List<UserExamItemOptions>();
- if (addUserExamItemDto.QuestionType.CheckSelectType())
- {
- if (addUserExamItemDto.UserExamItemOptionDtos != null)
- {
- addUserExamItemDto.UserExamItemOptionDtos.ToList().ForEach(x =>
- {
- userExamItemOptions.Add(_mapper.Map<UserExamItemOptions>(x));
- });
- }
- }
- userExamItemOptions.ToInsert(_sessionContext);
- await _userExamItemOptionRepository.ValidateAddAsync(userExamItemOptions, cancellationToken);
- return userExamItemOptions;
- }
- private async Task<UserExamItem> AddUserExamItem(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
- {
- var userExamItem = _mapper.Map<UserExamItem>(addUserExamItemDto);
- userExamItem.ToInsert(_sessionContext);
- await _userExamItemRepository.ValidateAddAsync(userExamItem, cancellationToken);
- if (addUserExamItemDto.QuestionType.CheckSelectType())
- {
- if (addUserExamItemDto.UserExamItemOptionDtos != null)
- {
- addUserExamItemDto.UserExamItemOptionDtos.ForEach(x => x.UserExamItemId = userExamItem.Id);
- }
- }
- return userExamItem;
- }
- private async Task DeleteUserExamItemOptions(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
- {
- await _userExamItemOptionRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
- }
- private SqlSugar.ISugarQueryable<UserExamResultViewResponse> GetQueryable(UserExamPagedRequest queryRequest)
- {
- if (_sessionContext.UserId != null)
- {
- queryRequest.UserId = _sessionContext.UserId;
- }
- var expression = queryRequest.GetExpression();
- var userExamTable = _repository.Queryable().Where(expression);
- var examManageExpression = queryRequest.GetExamManageExpression();
- var examManageTable = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(examManageExpression);
- var queryable = userExamTable.InnerJoin(examManageTable, (u, e) => u.ExamId == e.Id).Select((u, e) => new UserExamResultViewResponse
- {
- Id = u.Id,
- CutoffScore = e.CutoffScore,
- TotalScore = e.TotalScore,
- ExamName = e.Name,
- Score = u.Score ?? 0,
- Status = u.Status,
- SortIndex = u.SortIndex,
- ExamStatus = u.ExamStatus,
- IsSuccess = u.IsSuccess,
- EndTime = e.EndTime,
- StartTime = e.StartTime,
- TimeSpan = e.TimeSpan,
- ExamType = e.ExamType,
- ExamId = e.Id
- });
- return queryable;
- }
- #endregion
- }
- }
|