Explorar o código

Merge branch 'feature/exam' into dev
合并冲突

guqiang hai 3 días
pai
achega
36e5322fa5

+ 3 - 2
src/Hotline.Api/Controllers/Exam/UserExamController.cs

@@ -204,11 +204,12 @@ namespace Hotline.Api.Controllers.Exam
         /// 查看考试试题
         /// </summary>
         /// <param name="id"></param>
+        /// <param name="questionId"></param>
         /// <returns></returns>
         [HttpGet(UserExamApiRoute.View)]
-        public async Task<List<ViewExamQuestionDto>> View([FromQuery] string id)
+        public async Task<ViewExamQuestionDto> View([FromQuery] string id,string questionId)
         {
-            return await _userExamService.View(id);
+            return await _userExamService.View(id, questionId);
         }
     }
 }

+ 7 - 0
src/Hotline.Application/Exam/Interface/ExamManages/IUserExamService.cs

@@ -118,6 +118,13 @@ namespace Hotline.Application.Exam.Interface.ExamManages
         /// <returns></returns>
         Task<List<ExamUserViewResponse>> GetUserListAsync(ExamUserQueryRequest examUserQueryRequest);
         
+        /// <summary>
+        /// 查看考试
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        Task<ViewExamQuestionDto> View(string id,string questionId);
+
         /// <summary>
         /// 查看考试
         /// </summary>

+ 12 - 1
src/Hotline.Application/Exam/QueryExtensions/ExamManages/ExamQuestionQueryExtensions.cs

@@ -30,7 +30,18 @@ namespace Hotline.Application.Exam.QueryExtensions.ExamManages
 
             expression = ExpressionableUtility.CreateExpression<ExamQuestionBak>()
                 .AndIF(examQuestionRequest.QuestionId.IsNotNullOrEmpty(), x => x.QuestionId == examQuestionRequest.QuestionId)
-                .AndIF(examQuestionRequest.ExamId.IsNotNullOrEmpty(), x => x.ExamId == examQuestionRequest.ExamId)
+                .ToExpression();
+
+            return expression;
+        }
+
+        public static Expression<Func<ExamUserExam, bool>> GetUserExamExpression(this ExamQuestionRequest examQuestionRequest)
+        {
+            Expression<Func<ExamUserExam, bool>> expression = m => m.Id != null;
+
+            expression = ExpressionableUtility.CreateExpression<ExamUserExam>()
+                .AndIF(examQuestionRequest.UserExamId.IsNotNullOrEmpty(), x => x.Id == examQuestionRequest.UserExamId
+                )
                 .ToExpression();
 
             return expression;

+ 48 - 7
src/Hotline.Application/Exam/Service/ExamManages/UserExamService.cs

@@ -94,13 +94,17 @@ namespace Hotline.Application.Exam.Service.ExamManages
         public async Task<ExamQuestionDto> GetExamQuestionDto(ExamQuestionRequest examQuestionRequest)
         {
             var expression = examQuestionRequest.GetExpression();
-            var question = await new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression).FirstAsync();
-
+            var userUserExpression = examQuestionRequest.GetUserExamExpression();
+            //var question = await new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression).FirstAsync();
+            var querable = new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression);
+            var userExamTable = new ExamRepository<Exams.ExamManages.ExamUserExam>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(userUserExpression);
+            querable = querable.InnerJoin(userExamTable, (q, u) => q.ExamId == u.ExamId).Select((q, u) => q);
+            var question = await querable.FirstAsync();
             if (question != null)
             {
                 var examQuestionDto = _mapper.Map<ExamQuestionDto>(question);
 
-                var questionScore = await new ExamRepository<ExamQuestionScoreBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).GetAsync(x=>x.QuestionType == question.QuestionType && x.ExamManageId == examQuestionRequest.ExamId);
+                var questionScore = await new ExamRepository<ExamQuestionScoreBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).GetAsync(x=>x.QuestionType == question.QuestionType && x.ExamManageId == question.ExamId);
 
                 if (questionScore != null)
                 {
@@ -154,7 +158,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
             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 && u.ExamId == examQuestionRequest.ExamId);
+            var userExamTable = _repository.Queryable().Where(u => u.UserId == _sessionContext.UserId && u.Id == examQuestionRequest.UserExamId);
             var examAnswerTable = examAnswerRepository.Queryable();
 
             var examAnswers = await examAnswerTable.InnerJoin(userExamItemTable, (e, i) => e.UserExamItemId == i.Id)
@@ -684,6 +688,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
 
         public async Task<UnExamUserPageViewResponse> GetUnExamUsers(UnExamUserReportPagedRequest unExamUserReportPagedRequest)
         {
+            if(unExamUserReportPagedRequest.EndTime == null)
             unExamUserReportPagedRequest.ResolveEndTime();
 
             var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
@@ -717,6 +722,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
 
         public async Task<UserExamResultPageViewResponse> GetUserExamResults(UserExamResultReportPagedRequest userExamResultReportPagedRequest)
         {
+            if(userExamResultReportPagedRequest.EndTime == null)
             userExamResultReportPagedRequest.ResolveEndTime();
 
             var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
@@ -1319,7 +1325,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
         public async Task<List<ViewExamQuestionDto>> View(string id)
         {
            
-            List<ViewExamQuestionDto> viewExamQuestionDtos = await GetViewExamQuestion(id);
+            List<ViewExamQuestionDto> viewExamQuestionDtos = await GetViewExamQuestion(id,null);
 
             var questionIds = viewExamQuestionDtos.Select(x => x.QuestionId).ToList();
 
@@ -1351,6 +1357,41 @@ namespace Hotline.Application.Exam.Service.ExamManages
 
         }
 
+
+
+        public async Task<ViewExamQuestionDto> View(string id, string questionId)
+        {
+            List<ViewExamQuestionDto> viewExamQuestionDtos = await GetViewExamQuestion(id, questionId);
+
+            var questionIds = viewExamQuestionDtos.Select(x => x.QuestionId).ToList();
+
+            List<ViewQuestionAnswerDto> questionAnswers = await GetQuestionAnswers(id, questionIds);
+            List<ViewQuestionOptionDto> questionOptions = await GetQuestionOptions(questionIds);
+            List<QuestionKnowladgeDto> questionKnowladges = await GetQuestionKnowladges(questionIds);
+            List<QuestionSourcewareDto> sourcewares = await GetSourcewares(questionIds);
+
+            viewExamQuestionDtos.ForEach(item =>
+            {
+                item.QuestionKnowladgeDtos = questionKnowladges.Where(x => x.QuestionId == item.QuestionId).ToList();
+                item.QuestionSourcewareDtos = sourcewares.Where(x => x.QuestionId == item.QuestionId).ToList();
+                if (!item.QuestionType.CheckSelectType())
+                {
+                    var questionAnswer = questionAnswers.FirstOrDefault(x => x.QuestionId == item.QuestionId);
+                    item.Answer = questionAnswer?.Answer ?? string.Empty;
+                    item.CorrectAnswer = questionAnswer?.CorrectAnswer ?? string.Empty;
+                }
+                else
+                {
+                    item.QuestionOptions = questionOptions.Where(x => x.QuestionId == item.QuestionId).ToList();
+                    item.CorrectAnswer = string.Join(",", item.QuestionOptions.Where(x => x.IsAnswer).Select(x => x.Label));
+                }
+
+            });
+
+
+            return viewExamQuestionDtos.FirstOrDefault();
+        }
+
         private  async Task<List<QuestionSourcewareDto>> GetSourcewares(List<string> questionIds)
         {
             var questionSourcewareTable = new ExamRepository<ExamQuestionSourcewareBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
@@ -1424,7 +1465,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
             return await querable.ToListAsync();
         }
 
-        private  async Task<List<ViewExamQuestionDto>> GetViewExamQuestion(string id)
+        private  async Task<List<ViewExamQuestionDto>> GetViewExamQuestion(string id,string questionId)
         {
             var userExamTable = _repository.Queryable().Where(x => x.Id == id);
             var userExamItemTable = _userExamItemRepository.Queryable();
@@ -1445,7 +1486,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                                 Title = q.Title,
                                 QuestionType = q.QuestionType,
                                 QuestionId = q.Id,
-                            }).MergeTable().OrderBy(x=>x.QuestionType).OrderBy(x=>x.Id);
+                            }).MergeTable().OrderBy(x=>x.QuestionType).OrderBy(x=>x.Id).WhereIF(!string.IsNullOrEmpty(questionId),x=>x.QuestionId == questionId);
 
             return await querable.Distinct().ToListAsync();
         }

+ 19 - 16
src/Hotline.Application/Exam/Service/Trains/TrainRecordService.cs

@@ -68,7 +68,7 @@ namespace Hotline.Application.Exam.Service.Trains
         public async Task CompleteTrainRecordAsync(CompleteTrainRecordDto completeTrainRecordDto, CancellationToken cancellationToken)
         {
             var trainRecord = await _repository.GetAsync(x => x.Id == completeTrainRecordDto.Id);
-            trainRecord= _mapper.Map<CompleteTrainRecordDto,ExamTrainRecord>(completeTrainRecordDto, trainRecord);
+            trainRecord = _mapper.Map<CompleteTrainRecordDto, ExamTrainRecord>(completeTrainRecordDto, trainRecord);
             trainRecord.ToUpdate(_sessionContext);
 
             await _repository.UpdateWithValidateAsync(trainRecord, cancellationToken);
@@ -80,7 +80,7 @@ namespace Hotline.Application.Exam.Service.Trains
 
             trainKnowladge.ToUpdate(_sessionContext);
 
-            await _trainKnowladgeRepository.UpdateWithValidateAsync(trainKnowladge,cancellationToken);
+            await _trainKnowladgeRepository.UpdateWithValidateAsync(trainKnowladge, cancellationToken);
 
         }
 
@@ -113,12 +113,12 @@ namespace Hotline.Application.Exam.Service.Trains
             SqlSugar.ISugarQueryable<TrainRecordViewResponse> queryResult = QueryResult(queryRequest);
 
             var total = await queryResult.CountAsync();
-            var items = await queryResult.ToPageListAsync(queryRequest.PageIndex,queryRequest.PageSize);
+            var items = await queryResult.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
 
             return new TrainRecordPageViewResponse
             {
                 Items = items,
-                Pagination = new Pagination(queryRequest.PageIndex,queryRequest.PageSize,total)
+                Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
             };
 
         }
@@ -127,7 +127,7 @@ namespace Hotline.Application.Exam.Service.Trains
         {
             await GetTrainPracticeKnowladge(addTrainDto, cancellationToken);
 
-            await AddTrainRecordItem(addTrainDto,cancellationToken);
+            await AddTrainRecordItem(addTrainDto, cancellationToken);
 
             await AddTrainRecordAnswer(addTrainDto, cancellationToken);
 
@@ -138,7 +138,7 @@ namespace Hotline.Application.Exam.Service.Trains
 
         private async Task GetTrainPracticeKnowladge(AddTrainDto addTrainDto, CancellationToken cancellationToken)
         {
-            var trainPracticeKnowladeRepository = new TrainPracticeKnowladgeRepository(_uow,_dataPermissionFilterBuilder,_serviceProvider);
+            var trainPracticeKnowladeRepository = new TrainPracticeKnowladgeRepository(_uow, _dataPermissionFilterBuilder, _serviceProvider);
             var trainPracticeKnowladge = await trainPracticeKnowladeRepository.GetAsync(x => x.TrainPracticeId == addTrainDto.TrainPracticeId);
 
             if (trainPracticeKnowladge != null)
@@ -208,6 +208,7 @@ namespace Hotline.Application.Exam.Service.Trains
 
         public async Task<TrainResultPagedViewResponse> AnalysisTrainResult(TrainResultReportPagedRequest trainResultReportPagedRequest)
         {
+            if(trainResultReportPagedRequest.EndTime == null)
             trainResultReportPagedRequest.ResolveEndTime();
 
             var expression = trainResultReportPagedRequest.GetExpression();
@@ -227,7 +228,7 @@ namespace Hotline.Application.Exam.Service.Trains
             var queryResult = trainRecordTable.InnerJoin(trainPlanTable, (r, p) => r.TrainPlanId == p.Id)
                 .InnerJoin(trainPlanTemplateTable, (r, p, pt) => p.Id == pt.TrainPlanId)
                 .InnerJoin(trainTemplateTable, (r, p, pt, t) => pt.TrainTemplateId == t.Id)
-                .InnerJoin(userTable,(r,p,pt,t,u)=>r.UserId == u.Id)
+                .InnerJoin(userTable, (r, p, pt, t, u) => r.UserId == u.Id)
                 .Select((r, p, pt, t, u) => new TrainResultViewResponse
                 {
                     TrainName = t.Name,
@@ -250,7 +251,8 @@ namespace Hotline.Application.Exam.Service.Trains
 
         public async Task<TrainResultRateViewResponse> CalcuteAnalysisRate(TrainResultReportPagedRequest trainResultReportPagedRequest)
         {
-            trainResultReportPagedRequest.ResolveEndTime();
+            if (trainResultReportPagedRequest.EndTime == null)
+                trainResultReportPagedRequest.ResolveEndTime();
 
             var expression = trainResultReportPagedRequest.GetExpression();
             var templateExpression = trainResultReportPagedRequest.GetTemplateExpression();
@@ -278,7 +280,7 @@ namespace Hotline.Application.Exam.Service.Trains
 
             var calcuteRateResult = new TrainResultRateViewResponse
             {
-                Complete = await queryResult.CountAsync(x=>x.IsComplete),
+                Complete = await queryResult.CountAsync(x => x.IsComplete),
                 Trainning = await queryResult.CountAsync(x => !x.IsComplete && x.TrainTime > DateTime.Now),
                 UnComplete = await queryResult.CountAsync(x => !x.IsComplete && x.TrainTime <= DateTime.Now),
             };
@@ -369,8 +371,9 @@ namespace Hotline.Application.Exam.Service.Trains
             var knowledgeTable = knowledgeRepository.Queryable();
 
             var queryable = questionTable.InnerJoin(questionKnowladgeTable, (r, p, tpt, tp, ExamPracticeQuestionKnowledge) => tp.QuestionId == ExamPracticeQuestionKnowledge.QuestionId)
-                .InnerJoin(knowledgeTable, (r, p, tpt, tp, ExamPracticeQuestionKnowledge,kl) => ExamPracticeQuestionKnowledge.KnowladgeId == kl.Id)
-                .GroupBy((r, p, tpt, tp, ExamPracticeQuestionKnowledge, kl) => new {
+                .InnerJoin(knowledgeTable, (r, p, tpt, tp, ExamPracticeQuestionKnowledge, kl) => ExamPracticeQuestionKnowledge.KnowladgeId == kl.Id)
+                .GroupBy((r, p, tpt, tp, ExamPracticeQuestionKnowledge, kl) => new
+                {
                     Title = kl.Title,
                     Id = kl.Id
                 })
@@ -382,7 +385,7 @@ namespace Hotline.Application.Exam.Service.Trains
 
             return await queryable.ToListAsync();
         }
-       
+
 
         private async Task AddTrainRecordAnswer(AddTrainDto addTrainDto, CancellationToken cancellationToken)
         {
@@ -407,7 +410,7 @@ namespace Hotline.Application.Exam.Service.Trains
 
             trainRecordAnswers.ToInsert(_sessionContext);
 
-            await _trainRecordAnswerRepository.AddWithValidateAsync(trainRecordAnswers,cancellationToken);
+            await _trainRecordAnswerRepository.AddWithValidateAsync(trainRecordAnswers, cancellationToken);
         }
 
         //private async Task<TrainPracticeDto> GetTrainQuestionOptions(AddTrainDto addTrainDto)
@@ -442,7 +445,7 @@ namespace Hotline.Application.Exam.Service.Trains
 
             var trainRecordTable = _repository.Queryable().Where(x => x.Id == trainPracticeRequest.Id);
             var trainPlanTable = trainPlanRepository.Queryable();
-            var trainPracticeTable = trainPracticeRepostitory.Queryable().WhereIF(!string.IsNullOrEmpty(trainPracticeRequest.TrainPracticeId),x=>x.Id == trainPracticeRequest.TrainPracticeId);
+            var trainPracticeTable = trainPracticeRepostitory.Queryable().WhereIF(!string.IsNullOrEmpty(trainPracticeRequest.TrainPracticeId), x => x.Id == trainPracticeRequest.TrainPracticeId);
             var tranPlanTemplateTable = trainPlanTemplateRepository.Queryable();
 
             var trainPractices = trainPracticeTable.InnerJoin(tranPlanTemplateTable, (tp, tpt) => tp.TrainTemplateId == tpt.TrainTemplateId)
@@ -462,7 +465,7 @@ namespace Hotline.Application.Exam.Service.Trains
 
             var trainPracticeOptions = await trainPracticeOptionsRepository.Queryable()
                 .InnerJoin(trainPractices, (tpo, tp) => tpo.TrainPracticeId == tp.Id)
-                .Where((tpo, tp)=> tp.Id == trainPracticeRequest.TrainPracticeId)
+                .Where((tpo, tp) => tp.Id == trainPracticeRequest.TrainPracticeId)
                 .Select((tpo, tp) => tpo).ToListAsync();
 
             var queryable = trainRecordAnswerRepository.Queryable()
@@ -478,7 +481,7 @@ namespace Hotline.Application.Exam.Service.Trains
             var trainPracticeOptionsDtos = new List<SimpleTrainPracticeOptionsDto>();
 
             trainPracticeOptions.ForEach(x =>
-            {              
+            {
                 var trainPracticeOptionsDto = _mapper.Map<SimpleTrainPracticeOptionsDto>(x);
 
                 trainPracticeOptionsDto.IsSelected = trainRecordOptions.Any(m => m.QuestionOptionId == x.QuestionOptionId);

+ 3 - 3
src/Hotline.Share/Requests/Exam/ExamQuestionRequest.cs

@@ -13,9 +13,9 @@ namespace Hotline.Share.Requests.Exam
         public string QuestionId { get; set; }
 
         /// <summary>
-        /// 考试Id
+        /// 用户考试Id
         /// </summary>
-        [Description("考试Id")]
-        public string ExamId { get; set; }
+        [Description("用户考试Id")]
+        public string UserExamId { get; set; }
     }
 }