|
@@ -9,6 +9,7 @@ using Exam.Repository.Sqlsugar;
|
|
|
using Exam.Repository.Sqlsugar.Repositories;
|
|
|
using Exam.Share.ViewResponses.Question;
|
|
|
using Hotline.Application.Exam.QueryExtensions.Questions;
|
|
|
+using Hotline.Exams.Sourcewares;
|
|
|
using Hotline.Repository.SqlSugar;
|
|
|
using Hotline.Repository.SqlSugar.DataPermissions;
|
|
|
using Hotline.Repository.SqlSugar.Exam.Interfaces.Questions;
|
|
@@ -16,6 +17,7 @@ using Hotline.Repository.SqlSugar.Extensions;
|
|
|
using Hotline.Share.Dtos.Questions;
|
|
|
using Hotline.Share.Requests.Question;
|
|
|
using Mapster;
|
|
|
+using SqlSugar;
|
|
|
using XF.Domain.Dependency;
|
|
|
|
|
|
namespace Hotline.Application.Exam.Service.Questions
|
|
@@ -58,6 +60,16 @@ namespace Hotline.Application.Exam.Service.Questions
|
|
|
|
|
|
var questionDto = entity.Adapt<QuestionDto>();
|
|
|
|
|
|
+ questionDto.QuestionTagDtos = await GetQuestionTags(entityQueryRequest);
|
|
|
+
|
|
|
+ questionDto.QuestionAnswerDto = await GetQuestionAnswer(entityQueryRequest);
|
|
|
+
|
|
|
+ questionDto.QuestionKnowladgeDtos = await GetKnowladges(entityQueryRequest);
|
|
|
+
|
|
|
+ questionDto.QuestionOptionsDtos = await GetQuestionOptions(entityQueryRequest);
|
|
|
+
|
|
|
+ questionDto.QuestionSourcewareDtos = await GetQuestionSourcewares(entityQueryRequest);
|
|
|
+
|
|
|
return questionDto;
|
|
|
}
|
|
|
|
|
@@ -67,7 +79,7 @@ namespace Hotline.Application.Exam.Service.Questions
|
|
|
var questionTable = _repository.Queryable().Where(expression);
|
|
|
|
|
|
var questionTagExpression = queryRequest.GetQuestionTagExpression();
|
|
|
- var questionTagTable = new ExamRepository<QuestionTag>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(questionTagExpression);
|
|
|
+ var questionTagTable = _questionTagRepository.Queryable().Where(questionTagExpression);
|
|
|
|
|
|
var examTagExpression = queryRequest.GetExamTagExpression();
|
|
|
var examTagTable = new ExamRepository<ExamTag>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(examTagExpression);
|
|
@@ -138,6 +150,36 @@ namespace Hotline.Application.Exam.Service.Questions
|
|
|
|
|
|
await AddSourcewares(actionRequest, cancellationToken);
|
|
|
}
|
|
|
+
|
|
|
+ public override async Task UpdateAsync(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await base.UpdateAsync(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ await ModifyQuestionTags(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ await ModifyQuestionOptions(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ await ModifyQuestionAnswer(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ await ModifyKnowladges(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ await ModifySourcewares(actionRequest, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override async Task DeleteAsync(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await base.DeleteAsync(entityQueryRequest, cancellationToken);
|
|
|
+
|
|
|
+ await DeleteQuestionTags(entityQueryRequest, cancellationToken);
|
|
|
+
|
|
|
+ await DeleteQuestionOptions(entityQueryRequest, cancellationToken);
|
|
|
+
|
|
|
+ await DeleteQuestionAnswer(entityQueryRequest, cancellationToken);
|
|
|
+
|
|
|
+ await DeleteKnowladges(entityQueryRequest, cancellationToken);
|
|
|
+
|
|
|
+ await DeleteSourcewares(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
#endregion
|
|
|
|
|
|
#region private method
|
|
@@ -151,7 +193,6 @@ namespace Hotline.Application.Exam.Service.Questions
|
|
|
|
|
|
await _questionTagRepository.AddWithValidateAsync(questionTags, cancellationToken);
|
|
|
}
|
|
|
-
|
|
|
private async Task AddQuestionOptions(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
{
|
|
|
if (actionRequest.QuestionOptionsDtos == null) return;
|
|
@@ -166,7 +207,6 @@ namespace Hotline.Application.Exam.Service.Questions
|
|
|
|
|
|
await _questionOptionRepository.AddWithValidateAsync(questionOptionses, cancellationToken);
|
|
|
}
|
|
|
-
|
|
|
private async Task AddQuestionAnswer(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
{
|
|
|
if (actionRequest.QuestionAnswerDto == null) return;
|
|
@@ -187,13 +227,12 @@ namespace Hotline.Application.Exam.Service.Questions
|
|
|
{
|
|
|
if (actionRequest.QuestionSourcewareDtos == null) return;
|
|
|
|
|
|
- var questionSourcewares = actionRequest.QuestionSourcewareDtos.Where(x=>x.OperationStatus == OperationStatus.Add).Adapt<QuestionSourceware>();
|
|
|
+ var questionSourcewares = actionRequest.QuestionSourcewareDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionSourceware>();
|
|
|
|
|
|
questionSourcewares.ToInsert(actionRequest);
|
|
|
|
|
|
- await _questionSourcewareRepository.AddWithValidateAsync(questionSourcewares,cancellationToken);
|
|
|
+ await _questionSourcewareRepository.AddWithValidateAsync(questionSourcewares, cancellationToken);
|
|
|
}
|
|
|
-
|
|
|
private async Task AddKnowladges(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
{
|
|
|
if (actionRequest.QuestionKnowladgeDtos == null) return;
|
|
@@ -204,6 +243,237 @@ namespace Hotline.Application.Exam.Service.Questions
|
|
|
|
|
|
await _questionKnowladgeRepository.AddWithValidateAsync(questionKnowladges, cancellationToken);
|
|
|
}
|
|
|
+ private async Task UpdateSourcewares(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ if (actionRequest.QuestionSourcewareDtos == null) return;
|
|
|
+
|
|
|
+ var questionSourcewares = actionRequest.QuestionSourcewareDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionSourceware>();
|
|
|
+
|
|
|
+ questionSourcewares.ToUpdate(actionRequest);
|
|
|
+
|
|
|
+ await _questionSourcewareRepository.UpdateWithValidateAsync(questionSourcewares, cancellationToken);
|
|
|
+ }
|
|
|
+ private async Task UpdateKnowladges(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ if (actionRequest.QuestionKnowladgeDtos == null) return;
|
|
|
+
|
|
|
+ var questionKnowladges = actionRequest.QuestionKnowladgeDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionKnowladge>();
|
|
|
+
|
|
|
+ questionKnowladges.ToUpdate(actionRequest);
|
|
|
+
|
|
|
+ await _questionKnowladgeRepository.UpdateWithValidateAsync(questionKnowladges, cancellationToken);
|
|
|
+ }
|
|
|
+ private async Task UpdateQuestionAnswer(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ if (actionRequest.QuestionAnswerDto == null) return;
|
|
|
+
|
|
|
+ // 简单和填空没有选项
|
|
|
+ if (actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Multi
|
|
|
+ || actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Single
|
|
|
+ || actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Judge) return;
|
|
|
+
|
|
|
+ var questionAnswer = actionRequest.QuestionAnswerDto.Adapt<QuestionAnswer>();
|
|
|
+
|
|
|
+ questionAnswer.ToUpdate(actionRequest);
|
|
|
+
|
|
|
+ await _questionAnswerRepository.UpdateWithValidateAsync(questionAnswer, cancellationToken);
|
|
|
+ }
|
|
|
+ private async Task UpdateQuestionOptions(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ if (actionRequest.QuestionOptionsDtos == null) return;
|
|
|
+
|
|
|
+ // 简单和填空没有选项
|
|
|
+ if (actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Essay || actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Blank)
|
|
|
+ return;
|
|
|
+
|
|
|
+ var questionOptionses = actionRequest.QuestionOptionsDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionOptions>();
|
|
|
+
|
|
|
+ questionOptionses.ToUpdate(actionRequest);
|
|
|
+
|
|
|
+ await _questionOptionRepository.UpdateWithValidateAsync(questionOptionses, cancellationToken);
|
|
|
+ }
|
|
|
+ private async Task UpdateQuestionTags(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ if (actionRequest.QuestionTagDtos == null) return;
|
|
|
+
|
|
|
+ var questionTags = actionRequest.QuestionTagDtos.Where(x => x.OperationStatus == OperationStatus.Update).Adapt<QuestionTag>();
|
|
|
+
|
|
|
+ questionTags.ToUpdate(actionRequest);
|
|
|
+
|
|
|
+ await _questionTagRepository.UpdateWithValidateAsync(questionTags, cancellationToken);
|
|
|
+ }
|
|
|
+ private async Task DeleteSourcewares(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await _questionSourcewareRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
+ private async Task DeleteKnowladges(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await _questionKnowladgeRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
+ private async Task DeleteQuestionAnswer(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await _questionAnswerRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
+ private async Task DeleteQuestionOptions(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await _questionOptionRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
+ private async Task DeleteQuestionTags(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await _questionTagRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
+ private async Task ModifySourcewares(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await AddSourcewares(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ await UpdateSourcewares(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ Expressionable<QuestionSourceware> expressionable = new Expressionable<QuestionSourceware>();
|
|
|
+ var questionSourcewareDtos = actionRequest.QuestionSourcewareDtos.Where(x => x.OperationStatus == OperationStatus.Delete);
|
|
|
+ expressionable.AndIF(questionSourcewareDtos.Any(), x => questionSourcewareDtos.Select(m => m.Id).Contains(x.Id));
|
|
|
+
|
|
|
+ var entityQueryRequest = new EntityQueryRequest
|
|
|
+ {
|
|
|
+ Expression = expressionable.ToExpression()
|
|
|
+ };
|
|
|
+
|
|
|
+ await DeleteSourcewares(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task ModifyKnowladges(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await AddKnowladges(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ await UpdateKnowladges(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ Expressionable<QuestionKnowladge> expressionable = new Expressionable<QuestionKnowladge>();
|
|
|
+ var questionKnowladgeDtos = actionRequest.QuestionKnowladgeDtos.Where(x => x.OperationStatus == OperationStatus.Delete);
|
|
|
+ expressionable.AndIF(questionKnowladgeDtos.Any(), x => questionKnowladgeDtos.Select(m => m.Id).Contains(x.Id));
|
|
|
+
|
|
|
+ var entityQueryRequest = new EntityQueryRequest
|
|
|
+ {
|
|
|
+ Expression = expressionable.ToExpression()
|
|
|
+ };
|
|
|
+
|
|
|
+ await DeleteKnowladges(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task ModifyQuestionAnswer(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await AddQuestionAnswer(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ await UpdateQuestionAnswer(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ if (actionRequest.QuestionAnswerDto != null && actionRequest.QuestionAnswerDto.OperationStatus == OperationStatus.Delete)
|
|
|
+ {
|
|
|
+ var entityQueryRequest = new EntityQueryRequest
|
|
|
+ {
|
|
|
+ Id = actionRequest.QuestionAnswerDto?.Id
|
|
|
+ };
|
|
|
+
|
|
|
+ await DeleteQuestionAnswer(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task ModifyQuestionOptions(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await AddQuestionOptions(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ await UpdateQuestionOptions(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ Expressionable<QuestionOptions> expressionable = new Expressionable<QuestionOptions>();
|
|
|
+ var questionSourcewareDtos = actionRequest.QuestionOptionsDtos.Where(x => x.OperationStatus == OperationStatus.Delete);
|
|
|
+ expressionable.AndIF(questionSourcewareDtos.Any(), x => questionSourcewareDtos.Select(m => m.Id).Contains(x.Id));
|
|
|
+
|
|
|
+ var entityQueryRequest = new EntityQueryRequest
|
|
|
+ {
|
|
|
+ Expression = expressionable.ToExpression()
|
|
|
+ };
|
|
|
+
|
|
|
+ await DeleteQuestionOptions(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task ModifyQuestionTags(QuestionDto actionRequest, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await AddQuestionTags(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ await UpdateQuestionTags(actionRequest, cancellationToken);
|
|
|
+
|
|
|
+ Expressionable<QuestionTag> expressionable = new Expressionable<QuestionTag>();
|
|
|
+ var questionSourcewareDtos = actionRequest.QuestionTagDtos.Where(x => x.OperationStatus == OperationStatus.Delete);
|
|
|
+ expressionable.AndIF(questionSourcewareDtos.Any(), x => questionSourcewareDtos.Select(m => m.Id).Contains(x.Id));
|
|
|
+
|
|
|
+ var entityQueryRequest = new EntityQueryRequest
|
|
|
+ {
|
|
|
+ Expression = expressionable.ToExpression()
|
|
|
+ };
|
|
|
+
|
|
|
+ await DeleteQuestionTags(entityQueryRequest, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private async Task<List<QuestionSourcewareDto>> GetQuestionSourcewares(EntityQueryRequest entityQueryRequest)
|
|
|
+ {
|
|
|
+ var questionSourcewareTable = _questionSourcewareRepository.Queryable().Where(x => x.QuestionId == entityQueryRequest.Id);
|
|
|
+
|
|
|
+ var sourcewareTable = new ExamRepository<Sourceware>(_questionSourcewareRepository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
|
|
|
+
|
|
|
+ var questionSourcewares = questionSourcewareTable.InnerJoin(sourcewareTable, (q, s) =>
|
|
|
+ q.SourcewareId == s.Id).Select((q, s) => new QuestionSourcewareDto
|
|
|
+ {
|
|
|
+ Id = q.Id,
|
|
|
+ SourcewareId = q.SourcewareId,
|
|
|
+ Sourceware = s.Name
|
|
|
+ });
|
|
|
+
|
|
|
+ return await questionSourcewares.ToListAsync();
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<List<QuestionOptionsDto>> GetQuestionOptions(EntityQueryRequest entityQueryRequest)
|
|
|
+ {
|
|
|
+ var questionOptionTable = await _questionOptionRepository.Queryable().Where(x => x.QuestionId == entityQueryRequest.Id).ToListAsync();
|
|
|
+
|
|
|
+ var questionOptions = questionOptionTable.Adapt<List<QuestionOptionsDto>>();
|
|
|
+
|
|
|
+ return questionOptions;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<List<QuestionKnowladgeDto>> GetKnowladges(EntityQueryRequest entityQueryRequest)
|
|
|
+ {
|
|
|
+ var questionKnowladgeTable = await _questionKnowladgeRepository.Queryable().Where(x => x.QuestionId == entityQueryRequest.Id).ToListAsync();
|
|
|
+
|
|
|
+ var questionKnowladges = questionKnowladgeTable.Adapt<List<QuestionKnowladgeDto>>();
|
|
|
+
|
|
|
+ return questionKnowladges;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<QuestionAnswerDto> GetQuestionAnswer(EntityQueryRequest entityQueryRequest)
|
|
|
+ {
|
|
|
+ var questionAnswer = await _questionAnswerRepository.GetAsync(entityQueryRequest.Id);
|
|
|
+
|
|
|
+ var questionAnswerDto = questionAnswer.Adapt<QuestionAnswerDto>();
|
|
|
+
|
|
|
+ return questionAnswerDto;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<List<QuestionTagDto>> GetQuestionTags(EntityQueryRequest entityQueryRequest)
|
|
|
+ {
|
|
|
+ var questionTags = _questionTagRepository.Queryable().Where(x => x.QuestionId == entityQueryRequest.Id);
|
|
|
+
|
|
|
+ var examTags = new ExamRepository<ExamTag>(_questionTagRepository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
|
|
|
+
|
|
|
+ var questionTagDtos = questionTags.InnerJoin(examTags, (q, t) => q.TagId == t.Id).Select((q, t) => new QuestionTagDto
|
|
|
+ {
|
|
|
+ Id = q.Id,
|
|
|
+ TagId = q.TagId,
|
|
|
+ Tag = t.Name,
|
|
|
+ QuestionId = q.QuestionId
|
|
|
+ });
|
|
|
+
|
|
|
+ return await questionTagDtos.ToListAsync();
|
|
|
+ }
|
|
|
#endregion
|
|
|
}
|
|
|
}
|