Browse Source

调整考试接口

guqiang 2 tuần trước cách đây
mục cha
commit
6ff3226ebd

+ 2 - 2
src/Hotline.Api/Controllers/JudicialManagementOrdersController.cs

@@ -575,8 +575,8 @@ namespace Hotline.Api.Controllers
                 .GroupBy(d => d.Id)
                  .Select(d => new EventClassificationOrderCountDto
                  {
-                     TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
-                     TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
+                     TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder.HasValue && d.IsEnforcementOrder.Value == true, 1, 0)),
+                     TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder.HasValue && d.IsEnforcementOrder.Value == false, 1, 0)),
                      EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder.HasValue && d.IsEnforcementOrder.Value == true, 1, 0)),
                      PassTheBuckOrder = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder, 1, 0)),
                      ToBeVerified = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue == null, 1, 0)),

+ 2 - 0
src/Hotline.Application/Exam/Core/Constants/BusiConstants.cs

@@ -11,5 +11,7 @@ namespace Hotline.Application.Exam.Core.Constants
         public const string TrainCode = "PX";
 
         public const string TrainTemplateCode = "PXMB";
+
+        public const string PracticeCode = "LX";
     }
 }

+ 4 - 1
src/Hotline.Application/Exam/Service/ExamManages/UserExamService.cs

@@ -54,6 +54,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
         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;
@@ -63,12 +64,14 @@ namespace Hotline.Application.Exam.Service.ExamManages
         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;
@@ -742,7 +745,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
 
             examAnswer.ToInsert(_sessionContext);
 
-            await new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider).ValidateAddAsync(examAnswer, cancellationToken);
+            await _examAnswerRepository.ValidateAddAsync(examAnswer, cancellationToken);
 
             return examAnswers;
         }

+ 54 - 4
src/Hotline.Application/Exam/Service/Practices/PracticeService.cs

@@ -12,7 +12,9 @@ using Exam.Share.ViewResponses.Exam;
 using Exam.Share.ViewResponses.Practices;
 using Exam.TestPapers;
 using Exam.Trains;
+using Hotline.Application.Exam.Core.Constants;
 using Hotline.Application.Exam.Core.Extensions;
+using Hotline.Application.Exam.Core.Utilities;
 using Hotline.Application.Exam.QueryExtensions.Practices;
 using Hotline.Exams.Practices;
 using Hotline.Exams.Sourcewares;
@@ -118,12 +120,14 @@ namespace Hotline.Application.Exam.Service.Practices
         {
             var questions = await ExactractQuestion(actionRequest);
             base.StartTran();
+            actionRequest.Code = await GenerateCode(BusiConstants.PracticeCode,3);
             var id = await base.AddAsync(actionRequest, cancellationToken);
             var addPracticeQuestionDtos = new List<AddPracticeQuestionDto>();
             questions.ForEach(item =>
             {
                 var addPracticeQuestionDto = _mapper.Map<AddPracticeQuestionDto>(item);
                 addPracticeQuestionDto.PracticeId = id;
+                addPracticeQuestionDto.QuestionId = item.Id;
                 addPracticeQuestionDtos.Add(addPracticeQuestionDto);
             });
 
@@ -319,12 +323,35 @@ namespace Hotline.Application.Exam.Service.Practices
 
             practiceQuestionDto.PracticeQuestionOptionsDtos = await GetPracticeQuestionOptions(practiceQuestionRequest);
 
+            var practiceResultItems = await GetPracticeResultItems(practiceQuestionRequest);
+
+            if (practiceResultItems != null)
+            {
+                practiceQuestionDto.PracticeQuestionOptionsDtos.ForEach(item =>
+                {
+                    item.IsSelected = practiceResultItems.Any(x => x.QuestionOptionId == item.QuestionOptionId);
+                });
+            }
+
             practiceQuestionDto.PracticeQuestionSourcewareDtos = await GetPracticeQuestionSourceware(practiceQuestionRequest);
 
             practiceQuestionDto.PracticeQuestionKnowladgeDtos = await GetPracticeQuestionKnowladge(practiceQuestionRequest);
             return practiceQuestionDto;
         }
 
+        private async Task<List<PracticeResultItem>> GetPracticeResultItems(PracticeQuestionRequest practiceQuestionRequest)
+        {
+            var practiceRecordRepository = new ExamRepository<PracticeRecord>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+            var practiceRecordTable = practiceRecordRepository.Queryable().Where(x=>x.UserId == _sessionContext.UserId);
+
+            var practiceResultItems = practiceRecordTable.InnerJoin<PracticeResult>((p, r) => p.Id == r.PracticeRecordId)
+                                      .InnerJoin<PracticeResultItem>((p, r, i) => i.PracticeResultId == r.Id)
+                                      .Where((p, r, i) => r.PracticeQuestionId == practiceQuestionRequest.PracticeQuestionId)
+                                      .Select((p, r, i) => i);
+
+            return await practiceResultItems.ToListAsync();
+        }
+
         private async Task<List<PracticeQuestionKnowladgeDto>> GetPracticeQuestionKnowladge(PracticeQuestionRequest practiceQuestionRequest)
         {
             var knowledgeRepository = new ExamRepository<KnowledgeBase.Knowledge>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
@@ -494,6 +521,8 @@ namespace Hotline.Application.Exam.Service.Practices
 
                         practiceQuestionOption.PracticeQuestionId = practiceQuestion?.Id;
 
+                        practiceQuestionOption.QuestionOptionId = item.Id;
+
                         practiceQuestionOption.ToInsert(_sessionContext);
 
                         practiceQuestionOptions.Add(practiceQuestionOption);
@@ -567,17 +596,24 @@ namespace Hotline.Application.Exam.Service.Practices
             else
             {
                 var unionQuestions = new List<ISugarQueryable<QuestionTag>>();
+                var ids = new List<string>();
                 // 保证每个标签至少获取一道题
                 tagIds.ForEach(v =>
                 {
-                    var unionQuestion = questionTagTable.Where(x => x.TagId == v).Take(1);
+                    var unionQuestion = questionTagTable;
+                    unionQuestion= unionQuestion.Where(x => x.TagId == v).Take(1);
+                    ids.Add(questionTagRepostiory.Queryable().Where(x => x.TagId == v).Select(x => x.Id).First());
                     unionQuestions.Add(unionQuestion);
+                    questionTagTable = questionTagRepostiory.Queryable();
                 });
-                questionTagTable = questionTagTable.Where(x => tagIds.Contains(x.TagId)).Take(tagIds.Count - actionRequest.Count);
 
-                unionQuestions.Add(questionTagTable);
+                var mainQuesiton = questionTagTable;
+                mainQuesiton = mainQuesiton.Where(x => tagIds.Contains(x.TagId) && !ids.Contains(x.Id)).Take(actionRequest.Count - tagIds.Count);
 
-                questionTagTable = questionTagRepostiory.UnionAll(unionQuestions.ToArray()).MergeTable();
+                unionQuestions.Add(mainQuesiton);
+
+                questionTagTable = questionTagRepostiory.Queryable();
+                questionTagTable = questionTagRepostiory.UnionAll(unionQuestions.ToArray());
             }
 
             var queryResult = questionTagTable.InnerJoin(questionTable, (t, q) => t.QuestionId == q.Id)
@@ -586,6 +622,20 @@ namespace Hotline.Application.Exam.Service.Practices
             return await queryResult.ToListAsync();
 
         }
+
+        private async Task<string> GenerateCode(string codePrefix, int length)
+        {
+            var trainPlan = await _repository.Queryable().Where(x => x.CreationTime.Date == DateTime.Now.Date).OrderByDescending(x => x.CreationTime).FirstAsync();
+
+
+            var code = string.Empty;
+            if (trainPlan != null)
+            {
+                code = trainPlan.Code;
+            }
+            code = CodeUtility.GenerateCode(codePrefix, length, code);
+            return code;
+        }
         #endregion
 
         #region protect method

+ 3 - 1
src/Hotline.Application/Exam/Service/Questions/QuestionService.cs

@@ -856,7 +856,9 @@ namespace Hotline.Application.Exam.Service.Questions
 
             actionRequest.QuestionOptionsDtos.ResolveOperationStatus(all);
 
-            questionOptions.AddRangeExt(await AddQuestionOptions(actionRequest, cancellationToken));
+            _addQuestionDto.QuestionOptionsDtos.ResolveOperationStatus();
+
+            questionOptions.AddRangeExt(await AddQuestionOptions(_addQuestionDto, cancellationToken));
 
             questionOptions.AddRangeExt(await UpdateQuestionOptions(actionRequest, all, cancellationToken));
 

+ 1 - 1
src/Hotline.Application/JudicialManagement/EnforcementApplication.cs

@@ -89,7 +89,7 @@ namespace Hotline.Application.JudicialManagement
                      //.WhereIF(dto.IsTheClueTrue.HasValue, d => d.IsTheClueTrue == dto.IsTheClueTrue)//线索是否属实
                      .WhereIF(dto.IsTheClueTrueText == "1", d => d.IsTheClueTrue == null)//待核实
                      .WhereIF(dto.IsTheClueTrueText == "2", d => d.IsTheClueTrue == true)//线索属实
-                     .WhereIF(dto.IsTheClueTrueText == "3", d => d.IsTheClueTrue == false)//线索不属实
+                     .WhereIF(dto.IsTheClueTrueText == "3", d => d.IsEnforcementOrder == false)//线索不属实 调整为非行政执法类工单
                      .WhereIF(dto.IsTheClueTrueText == "4", d => d.IsPassTheBuckOrder == true)//推诿工单
                      .WhereIF(dto.IsTheClueTrueText == "5", d => d.IsEnforcementOrder == true)//行政执法类工单
 

+ 1 - 1
src/Hotline.Repository.SqlSugar/Exam/Repositories/Practices/PracticeRepository.cs

@@ -17,7 +17,7 @@ namespace Exam.Repository.Sqlsugar.Repositories.Practices
     {
         public PracticeRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider) : base(uow, dataPermissionFilterBuilder, serviceProvider)
         {
-            Validator = new PracticeValidator();
+            Validator = new PracticeValidator(this);
         }
     }
 }

+ 2 - 0
src/Hotline.Repository.SqlSugar/Exam/Validators/Practices/PracticeQuestionOptionsValidator.cs

@@ -1,6 +1,7 @@
 using Exam.Infrastructure.Extensions;
 using Exam.Infrastructure.Validation.Validation;
 using Exam.Practices;
+using Exam.Questions;
 using FluentValidation;
 using Hotline.Exams.Practices;
 using Hotline.Repository.SqlSugar.Validate;
@@ -34,6 +35,7 @@ namespace Hotline.Repository.SqlSugar.Exam.Validators.Practices
         protected override void BaseValidateRule()
         {
             base.BaseValidateRule();
+            RuleFor(m=> m.QuestionOptionId).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired, typeof(QuestionOptions).GetDescription()));
         }
 
         protected override void ValidateRuleWithAdd()

+ 2 - 0
src/Hotline.Repository.SqlSugar/Exam/Validators/Practices/PracticeQuestionValidator.cs

@@ -1,6 +1,7 @@
 using Exam.Infrastructure.Extensions;
 using Exam.Infrastructure.Validation.Validation;
 using Exam.Practices;
+using Exam.Questions;
 using FluentValidation;
 using Hotline.Repository.SqlSugar.Validate;
 
@@ -28,6 +29,7 @@ namespace Exam.Repository.Sqlsugar.Validators.Practices
         protected override void BaseValidateRule()
         {
             base.BaseValidateRule();
+            RuleFor(m=>m.QuestionId).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired,typeof(Question).GetDescription()));
         }
 
         protected override void ValidateRuleWithAdd()

+ 11 - 1
src/Hotline.Repository.SqlSugar/Exam/Validators/Practices/PracticeValidator.cs

@@ -1,14 +1,19 @@
+using Exam.ExamManages;
 using Exam.Infrastructure.Extensions;
 using Exam.Infrastructure.Validation.Validation;
 using Exam.Practices;
 using FluentValidation;
+using Hotline.Repository.SqlSugar.Exam.Interfaces.ExamManages;
+using Hotline.Repository.SqlSugar.Exam.Interfaces.Practices;
 using Hotline.Repository.SqlSugar.Validate;
 
 namespace Exam.Repository.Sqlsugar.Validators.Practices
 {
     public class PracticeValidator : BaseValidator<Practice>
     {
-        public PracticeValidator()
+        private readonly IPracticeRepository _practiceRepository;
+
+        public PracticeValidator(IPracticeRepository practiceRepository)
         {
             RuleSet(ValidatorTypeConstants.Create, () =>
             {
@@ -23,23 +28,28 @@ namespace Exam.Repository.Sqlsugar.Validators.Practices
 
                 ValidateRuleWithModify();
             });
+            this._practiceRepository = practiceRepository;
         }
 
         protected override void BaseValidateRule()
         {
             base.BaseValidateRule();
+            RuleFor(m => m.Code).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired, x.GetType().GetDescription(nameof(Practice.Code))));
         }
 
         protected override void ValidateRuleWithAdd()
         {
             base.ValidateRuleWithAdd();
             RuleFor(m => m.CreationTime).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired, x.GetType().GetDescription(nameof(Practice.CreationTime))));
+            RuleFor(m => m.Code).Must(v => !_practiceRepository.Queryable().Any(x => x.Code == v)).WithMessage(x => string.Format(ErrorMessage.IsRepeat, x.GetType().GetDescription(nameof(Practice.Code))));
+
         }
 
         protected override void ValidateRuleWithModify()
         {
             base.ValidateRuleWithModify();
             RuleFor(m => m.LastModificationTime).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired, x.GetType().GetDescription(nameof(Practice.LastModificationTime))));
+            RuleFor(m => m.Code).Must((e, v) => !_practiceRepository.Queryable().Any(x => x.Code == v && x.Id != e.Id)).WithMessage(x => string.Format(ErrorMessage.IsRepeat, x.GetType().GetDescription(nameof(Practice.Code))));
 
         }
 

+ 18 - 1
src/Hotline.Share/Dtos/JudicialManagement/EnforcementOrderListDto.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Enums.Order;
+using Exam.Infrastructure.Extensions;
+using Hotline.Share.Enums.Order;
 using System.Diagnostics.Metrics;
 
 namespace Hotline.Share.Dtos.JudicialManagement
@@ -158,6 +159,22 @@ namespace Hotline.Share.Dtos.JudicialManagement
         public List<Kv> EnforcementOrdersHandler { get; set; }
         public string EnforcementOrdersHandlerText => GetText();
 
+        /// <summary>
+        /// 个案类型
+        /// </summary>
+        public ECaseType? CaseType { get; set; }
+
+        /// <summary>
+        /// 个案类型
+        /// </summary>
+        public string CaseTypeDesc
+        {
+            get
+            {
+                return CaseType?.GetDescription() ?? string.Empty;
+            }
+        }
+
         /// <summary>
         /// 执法部门
         /// </summary>

+ 6 - 0
src/Hotline.Share/Dtos/Practices/PracticeQuestionOptionsDto.cs

@@ -29,6 +29,12 @@ namespace Hotline.Share.Dtos.Practices
         /// </summary>
         [Description("选项题标")]
         public string Label { get; set; }
+
+        /// <summary>
+        /// 是否选中
+        /// </summary>
+        [Description("是否选中")]
+        public bool IsSelected { get; set; }
     }
 
     public class GradingPracticeQuestionOptionsDto : PracticeQuestionOptionsDto, IActionRequest

+ 1 - 1
src/Hotline.Share/Requests/TestPaper/TagQuestionCountRequest.cs

@@ -16,7 +16,7 @@ namespace Hotline.Share.Requests.TestPaper
         /// 题型
         /// </summary>
         [Description("题型")]
-        public EQuestionType QuestionType { get; set; }
+        public EQuestionType? QuestionType { get; set; }
 
         /// <summary>
         /// 难度