Procházet zdrojové kódy

调整阅卷接口

guqiang před 3 dny
rodič
revize
f8a06302e9

+ 38 - 34
src/Hotline.Application/Exam/Service/ExamManages/UserExamService.cs

@@ -142,8 +142,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
             var examAnswerRepository = new ExamRepository<ExamAnswer>(_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 examAnswers = await examAnswerTable.InnerJoin(userExamItemTable, (e, i) => e.UserExamItemId == i.Id)
@@ -183,7 +183,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
             var result = queryable.GroupBy(x => x.QuestionType).Select(m => new ExamQuestionViewResponse
             {
                 QuestionType = m.Key,
-                Questions = m.GroupBy(g=>g.QuestionId).Select(n => new SimpleViewResponse
+                Questions = m.GroupBy(g => g.QuestionId).Select(n => new SimpleViewResponse
                 {
                     Id = n.Key
                 }).ToList()
@@ -288,7 +288,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
 
             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;
 
@@ -377,7 +377,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
         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
             {
@@ -407,7 +407,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
 
             startExamViewResponse.IsStart = true;
 
-            if (examManage.ExamStatus== EExamStatus.NoStart)
+            if (examManage.ExamStatus == EExamStatus.NoStart)
             {
                 await UpdateExamStatus(examManage, cancellationToken);
             }
@@ -434,7 +434,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 {
                     CallBack = () =>
                     {
-                       var  response = new StartExamViewResponse
+                        var response = new StartExamViewResponse
                         {
                             IsJoin = false,
                             IsStart = false,
@@ -457,7 +457,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 {
                     CallBack = () =>
                     {
-                       var response = new StartExamViewResponse
+                        var response = new StartExamViewResponse
                         {
                             IsJoin = false,
                             IsStart = false,
@@ -608,7 +608,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 Label = qo.Label,
                 IsAnswer = qo.IsAnswer,
                 IsSelected = o.Id != null,
-                Score = s.Score
+                QuestionScore = s.Score,
+                Score = i.Score
             }
                 );
 
@@ -623,6 +624,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 Answer = g.FirstOrDefault().Answer,
                 QuestionType = g.Key.QuestionType,
                 Id = g.Key.Id,
+                QuestionScore = g.FirstOrDefault().QuestionScore,
                 Score = g.FirstOrDefault().Score,
                 Title = g.FirstOrDefault().Title,
                 CorrectAnswer = g.Key.QuestionType.CheckSelectType() ? string.Join(",", g.Where(i => i.IsAnswer).Select(n => n.Label).Distinct()) : g.FirstOrDefault()?.CorrectAnswer
@@ -714,7 +716,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
         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();
 
@@ -733,7 +735,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 TotalScore = e.TotalScore,
                 ExamName = e.Name,
                 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,
                 Remark = e.Remark
             });
@@ -763,7 +765,9 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 {
                     var gradingExamItemDto = batchGradingExamItemDto.Items.Find(m => m.UserExamItemId == x.Id);
 
-                    var updateUserExamItem = _mapper.Map<GradingExamItemDto, ExamUserExamItem>(gradingExamItemDto,x);
+                    var updateUserExamItem = _mapper.Map<GradingExamItemDto, ExamUserExamItem>(gradingExamItemDto, x);
+
+                    updateUserExamItem.IsCheck = true;
 
                     updateUserExamItems.Add(updateUserExamItem);
                 });
@@ -774,27 +778,27 @@ namespace Hotline.Application.Exam.Service.ExamManages
 
                 var userExamId = userExamItems.FirstOrDefault()?.UserExamId;
                 // 计算本次考试得分
-                var userExamItemsInCheck = await _userExamItemRepository.Queryable().Where(x => x.UserExamId == userExamId).ToListAsync();
-                var updateExamItemDTOs = new List<UpdateUserExamItemDto>();
-                userExamItemsInCheck.ForEach(x =>
-                {
-                    var updateUserExamItem = _mapper.Map<ExamUserExamItem, UpdateUserExamItemDto>(x);
-
-                    updateExamItemDTOs.Add(updateUserExamItem);
-                });
-                await CalcuteExamItemScore(_userExamItemRepository, updateExamItemDTOs,cancellationToken);
+                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);
 
             }
 
-            
+
         }
 
         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,
                 UserId = ux.UserId,
@@ -850,8 +854,8 @@ namespace Hotline.Application.Exam.Service.ExamManages
             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 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)
@@ -868,7 +872,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
 
 
             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)
@@ -876,10 +880,10 @@ namespace Hotline.Application.Exam.Service.ExamManages
                     userExamItem.IsCheck = true;
                     userExamItem.Score = isCorrect ? examQuesiontScores.FirstOrDefault(x => x.QuestionType == addUserExamItemDto.QuestionType)?.Score : 0;
                     userExamItem.ToUpdate(_sessionContext);
-                }               
+                }
             }
 
-          
+
             await userExamItemRepository.UpdateWithValidateAsync(userExamItems, cancellationToken);
         }
 
@@ -905,11 +909,11 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 if (examManage != null)
                 {
                     userExam.IsSuccess = userExam.Score > examManage.CutoffScore;
-                }               
+                }
 
                 userExam.ToUpdate(_sessionContext);
 
-                await _repository.UpdateWithValidateAsync(userExam,cancellationToken);
+                await _repository.UpdateWithValidateAsync(userExam, cancellationToken);
             }
         }
 
@@ -920,7 +924,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
             userExamItem.UserExamItemOptionses = await AddUserExamItemOptions(addUserExamItemDto, cancellationToken);
 
             userExamItem.ExamAnswers = await AddExamAnswer(addUserExamItemDto, userExamItem.Id, cancellationToken);
-            
+
 
             await userExamItemRepository.AddNav(userExamItem)
                 .Include(x => x.UserExamItemOptionses)
@@ -975,7 +979,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
             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;
 
@@ -1091,7 +1095,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                     await _examAnswerRepository.ValidateAddAsync(examAnswer, cancellationToken);
 
                     examAnswers.Add(examAnswer);
-                }                
+                }
 
                 return examAnswers;
             }

+ 0 - 6
src/Hotline.Share/Dtos/ExamManages/GradingExamItemDto.cs

@@ -16,12 +16,6 @@ namespace Exam.Share.Dtos.ExamManage
         /// </summary>
         [Description("得分")]
         public int Score { get; set; }
-
-        /// <summary>
-        /// 是否已阅卷
-        /// </summary>
-        [Description("是否已阅卷")]
-        public bool IsCheck { get; set; }
     }
 
     public class BatchGradingExamItemDto : IAddRequest

+ 16 - 3
src/Hotline.Share/Dtos/ExamManages/GradingExamQuestionDto.cs

@@ -3,6 +3,7 @@ using Exam.Share;
 using Hotline.Share.Dtos.ExamManages;
 using Hotline.Share.Enums.Exams;
 using System.ComponentModel;
+using System.Runtime.CompilerServices;
 
 namespace Exam.Application.Interface.Exam
 {
@@ -21,6 +22,12 @@ namespace Exam.Application.Interface.Exam
 
         public string CorrectAnswer { get; set; }
 
+        /// <summary>
+        /// 试题分数
+        /// </summary>
+        [Description("试题分数")]
+        public int QuestionScore { set; get; }
+
     }
 
     public class GradingExamQuestionTempDto
@@ -92,13 +99,19 @@ namespace Exam.Application.Interface.Exam
         public bool IsSelected { get; set; }
 
         /// <summary>
-        /// 分数
+        /// 试题分数
+        /// </summary>
+        [Description("试题分数")]
+        public int QuestionScore { get; set; }
+
+        /// <summary>
+        /// 实际分数
         /// </summary>
-        [Description("分数")]
+        [Description("实际分数")]
         public int? Score { get; set; }
     }
 
-    public class UserExamQuestionDto:IActionRequest
+    public class UserExamQuestionDto : IActionRequest
     {
         /// <summary>
         /// 主键