123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697 |
- using Exam.Application.Interface.Practices;
- using Exam.ExamManages;
- using Exam.Infrastructure.Data.Entity;
- using Exam.Infrastructure.Data.Interface;
- using Exam.Insfrastructure.Service.Service;
- using Exam.Practices;
- using Exam.Questions;
- using Exam.Repository.Sqlsugar;
- using Exam.Repository.Sqlsugar.Repositories;
- using Exam.Share;
- 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.Application.Exam.QueryExtensions.TestPapers;
- using Hotline.Exams.Practices;
- using Hotline.Exams.Sourcewares;
- using Hotline.Exams.TestPapers;
- using Hotline.Repository.SqlSugar;
- using Hotline.Repository.SqlSugar.DataPermissions;
- using Hotline.Repository.SqlSugar.Exam.Core.Constants;
- using Hotline.Repository.SqlSugar.Exam.Interfaces.Practices;
- using Hotline.Repository.SqlSugar.Exam.Interfaces.Questions;
- using Hotline.Repository.SqlSugar.Extensions;
- using Hotline.Share.Dtos.Practices;
- using Hotline.Share.Dtos.Questions;
- using Hotline.Share.Dtos.TestPapers;
- using Hotline.Share.Requests.Exam;
- using Hotline.Share.Requests.TestPaper;
- using Hotline.Share.Requests.Train;
- using Hotline.Share.ViewResponses;
- using Hotline.Share.ViewResponses.Exam;
- using Hotline.Share.ViewResponses.Practices;
- using MapsterMapper;
- using NPOI.OpenXmlFormats.Dml;
- using NPOI.SS.Formula.Functions;
- using SqlSugar;
- using System.Linq;
- using XF.Domain.Authentications;
- using XF.Domain.Dependency;
- namespace Hotline.Application.Exam.Service.Practices
- {
- public class PracticeService : ApiService<Practice, AddPracticeDto, UpdatePracticeDto, HotlineDbContext>, IPracticeService, IScopeDependency
- {
- private readonly IPracticeRepository _repository;
- private readonly IPracticeRecordRepository _practiceRecordRepository;
- private readonly IPracticeQuestionOptionsRepository _practiceQuestionOptionsRepository;
- private readonly IPracticeQuestionRepository _practiceQuestionRepository;
- private readonly IPracticeQuestionSourcewareRepository _practiceQuestionSourcewareRepository;
- private readonly IPracticeQuestionKnowladgeRepository _practiceQuestionKnowladgeRepository;
- private readonly IPracticeResultItemRepository _practiceResultItemRepository;
- private readonly IPracticeResultRepository _practiceResultRepository;
- private readonly IPracticeAnswerRepository _practiceAnswerRepository;
- private readonly IDataPermissionFilterBuilder _dataPermissionFilterBuilder;
- private readonly IServiceProvider _serviceProvider;
- private readonly ISessionContext _sessionContext;
- private readonly IMapper _mapper;
- public PracticeService(IPracticeRepository repository,
- IPracticeRecordRepository practiceRecordRepository,
- IPracticeQuestionOptionsRepository practiceQuestionOptionsRepository,
- IPracticeQuestionRepository practiceQuestionRepository,
- IPracticeQuestionSourcewareRepository practiceQuestionSourcewareRepository,
- IPracticeQuestionKnowladgeRepository practiceQuestionKnowladgeRepository,
- IPracticeResultItemRepository practiceResultItemRepository,
- IPracticeResultRepository practiceResultRepository,
- IPracticeAnswerRepository practiceAnswerRepository,
- IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider,
- ISessionContext sessionContext,
- IMapper mapper) : base(repository, mapper, sessionContext)
- {
- this._repository = repository;
- this._practiceRecordRepository = practiceRecordRepository;
- this._practiceQuestionOptionsRepository = practiceQuestionOptionsRepository;
- this._practiceQuestionRepository = practiceQuestionRepository;
- this._practiceQuestionSourcewareRepository = practiceQuestionSourcewareRepository;
- this._practiceQuestionKnowladgeRepository = practiceQuestionKnowladgeRepository;
- this._practiceResultItemRepository = practiceResultItemRepository;
- this._practiceResultRepository = practiceResultRepository;
- this._practiceAnswerRepository = practiceAnswerRepository;
- this._dataPermissionFilterBuilder = dataPermissionFilterBuilder;
- this._serviceProvider = serviceProvider;
- this._sessionContext = sessionContext;
- this._mapper = mapper;
- }
- #region public method
- public async Task<PracticeDto> GetAsync(EntityQueryRequest entityQueryRequest)
- {
- throw new NotImplementedException();
- }
- public async Task<(int, List<PracticeViewResponse>)> GetListAsync(PracticePagedRequest queryRequest)
- {
- SqlSugar.ISugarQueryable<PracticeViewResponse> queryResult = QueryResult(queryRequest);
- var total = await queryResult.CountAsync();
- var items = await queryResult.ToListAsync();
- return (total, items);
- }
- public async Task<PageViewResponse<PracticeViewResponse>> GetPagedListAsync(PracticePagedRequest queryRequest)
- {
- SqlSugar.ISugarQueryable<PracticeViewResponse> queryResult = QueryResult(queryRequest);
- var total = await queryResult.CountAsync();
- var items = await queryResult.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
- return new PracticePageViewResponse
- {
- Items = items,
- Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
- };
- }
- public override async Task<string> AddAsync(AddPracticeDto actionRequest, CancellationToken cancellationToken)
- {
- 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);
- });
- var practiceRecord = await AddPracticeRecord(id, cancellationToken);
- base.Entity.PracticeRecords = new List<PracticeRecord>();
- base.Entity.PracticeRecords.Add(practiceRecord);
- base.Entity.PracticeQuestions = await AddPracticeQuestions(addPracticeQuestionDtos, cancellationToken);
- var practiceQuestionOptions = await AddPracticeQuestionOptions(addPracticeQuestionDtos, cancellationToken);
- var practiceQuestionKnowladges = await AddPracticeQuestionKnowladgeAsync(addPracticeQuestionDtos, cancellationToken);
- var practiceQuestionSourcewares = await AddPracticeQuestionSourcewareAsync(addPracticeQuestionDtos, cancellationToken);
- base.Entity.PracticeQuestions.ForEach(item =>
- {
- item.PracticeQuestionKnowladges = practiceQuestionKnowladges.Where(x => item.Id == x.PracticeQuestionId).ToList();
- item.PracticeQuestionOptionses = practiceQuestionOptions.Where(x => item.Id == x.PracticeQuestionId).ToList();
- item.PracticeQuestionSourcewares = practiceQuestionSourcewares.Where(x => item.Id == x.PracticeQuestionId).ToList();
- });
- await base.Complete(base.Entity, OperationConstant.Create);
- return id;
- }
- public async Task<List<PracticeQuestionViewResponse>> GetPracticeQuestionViewResponses(PracticeQuestionGroupRequest practiceQuestionGroupRequest)
- {
- var expression = practiceQuestionGroupRequest.GetExpression();
- var practiceQuestionTable = _practiceQuestionRepository.Queryable().Where(expression);
- var queryable = await practiceQuestionTable.ToListAsync();
- var result = queryable.GroupBy(x => x.QuestionType).Select(m => new PracticeQuestionViewResponse
- {
- QuestionType = m.Key,
- Questions = m.Select(n => new SimpleViewResponse
- {
- Id = n.Id
- }).ToList()
- }).ToList();
- return result;
- }
- public async Task<List<PracticeQuestionViewResponse>> GetViewPracticeQuestions(PracticeQuestionGroupRequest practiceQuestionGroupRequest)
- {
- var expression = practiceQuestionGroupRequest.GetExpression();
- var practiceQuestionTable = _practiceQuestionRepository.Queryable().Where(expression);
- var practiceResultTable = _practiceResultRepository.Queryable();
- var queryable = await practiceQuestionTable
- .LeftJoin(practiceResultTable, (q, r) => q.Id == r.PracticeQuestionId)
- .Select((q, r) => new GradingExamViewResponse
- {
- Id = q.Id,
- IsCorrect = r.IsCorrect,
- QuestionType = q.QuestionType
- })
- .ToListAsync();
- var result = queryable.GroupBy(x => x.QuestionType).Select(m => new PracticeQuestionViewResponse
- {
- QuestionType = m.Key,
- Questions = m.Select(n => new SimpleViewResponse
- {
- Id = n.Id
- }).ToList()
- }).ToList();
- return result;
- }
- public async Task<PracticeQuestionDto> GetPracticeQuestion(PracticeQuestionRequest practiceQuestionRequest)
- {
- PracticeQuestionDto practiceQuestionDto = await QueryPracticeQuestion(practiceQuestionRequest);
- return practiceQuestionDto;
- }
- public async Task<ViewPracticeQuestionDto> ViewPracticeQuestion(PracticeQuestionRequest practiceQuestionRequest)
- {
- var practiceQuestionDto = await QueryPracticeQuestion(practiceQuestionRequest);
- var viewPracticeQuestionDto = _mapper.Map<ViewPracticeQuestionDto>(practiceQuestionDto);
- if (viewPracticeQuestionDto != null)
- {
- var practiceResultItemTable = _practiceResultItemRepository.Queryable();
- var practiceResultTable = _practiceResultRepository.Queryable().Where(x => x.PracticeQuestionId == practiceQuestionRequest.PracticeQuestionId);
- var practiceResultItems = await practiceResultTable.InnerJoin(practiceResultItemTable, (r, i) => r.Id == i.PracticeResultId).Select((r, i) => i).ToListAsync();
- var practiceAnswers = await _practiceAnswerRepository.Queryable().Where(x => x.PracticeQuestionId == practiceQuestionRequest.PracticeQuestionId).ToListAsync();
- viewPracticeQuestionDto.PracticeQuestionOptionsDtos.ForEach(item =>
- {
- item.IsSelected = practiceResultItems.Any(x => x.QuestionOptionId == item.QuestionOptionId);
- item.IsAnswer = practiceAnswers.Any(x => x.PracticeOptionId == item.QuestionOptionId);
- });
- viewPracticeQuestionDto.Answer = string.Join(",", viewPracticeQuestionDto.PracticeQuestionOptionsDtos.Where(x => x.IsAnswer).Select(m => m.Label));
- }
- return viewPracticeQuestionDto;
- }
- public async Task<PracticeQuestionDto> Practice(SubmitPracticeDto submitPracticeDto, CancellationToken cancellationToken)
- {
- var current = await _practiceQuestionRepository.GetAsync(submitPracticeDto.PracticeQuestionId);
- var practiceResult = await AddPracticeResult(submitPracticeDto, cancellationToken);
- practiceResult.PracticeResultItems = await AddPracticeResultItem(submitPracticeDto, cancellationToken);
- await _practiceResultRepository.AddNav(practiceResult).Include(x => x.PracticeResultItems).ExecuteCommandAsync();
- var nextId = await _practiceQuestionRepository.Queryable().Where(x => x.PracticeId == current.PracticeId && x.SortIndex > current.SortIndex).OrderBy(x => x.SortIndex).Select(x => x.Id).FirstAsync();
- var practiceQuestionRequest = new PracticeQuestionRequest
- {
- PracticeQuestionId = nextId
- };
- return await QueryPracticeQuestion(practiceQuestionRequest);
- }
- private async Task<PracticeResult> AddPracticeResult(SubmitPracticeDto submitPracticeDto, CancellationToken cancellationToken)
- {
- var practiceQuetionOptions = await _practiceQuestionOptionsRepository.Queryable().Where(x => x.PracticeQuestionId == submitPracticeDto.PracticeQuestionId && x.IsAnswer).ToListAsync();
- var practiceRecordTable = _practiceRecordRepository.Queryable();
- var practiceQuestionTable = _practiceQuestionRepository.Queryable().Where(x => x.Id == submitPracticeDto.PracticeQuestionId);
- var practiceRecordId = await practiceRecordTable.InnerJoin(practiceQuestionTable, (p, q) => p.PracticeId == q.PracticeId)
- .Select((p, q) => p.Id).FirstAsync();
- var practiceResult = new PracticeResult
- {
- PracticeRecordId = practiceRecordId,
- PracticeQuestionId = submitPracticeDto.PracticeQuestionId,
- IsCorrect = submitPracticeDto.PracticeResultItemDtos.Select(x => x.QuestionOptionId).All(m => practiceQuetionOptions.Any(t => t.QuestionOptionId == m))
- };
- practiceResult.ToInsert(_sessionContext);
- await _practiceResultRepository.ValidateAddAsync(practiceResult, cancellationToken);
- submitPracticeDto.PracticeResultId = practiceResult.Id;
- return practiceResult;
- }
- public async Task Complete(CompletePracticeRecordDto completePracticeRecordDto, CancellationToken cancellationToken)
- {
- var practiceRecord = await _practiceRecordRepository.Queryable().Where(x => x.PracticeId == completePracticeRecordDto.PracticeId && x.UserId == _sessionContext.UserId).FirstAsync();
- practiceRecord.IsComplete = true;
- practiceRecord.ToUpdate(_sessionContext);
- await _practiceRecordRepository.ValidateUpdateAsync(practiceRecord, cancellationToken);
- }
- #endregion
- #region private method
- private async Task<List<PracticeResultItem>> AddPracticeResultItem(SubmitPracticeDto submitPracticeDto, CancellationToken cancellationToken)
- {
- if (submitPracticeDto.PracticeResultItemDtos == null) return null;
- var practiceResultItems = new List<PracticeResultItem>();
- submitPracticeDto.PracticeResultItemDtos.ForEach(item =>
- {
- var practiceResultItem = _mapper.Map<PracticeResultItem>(item);
- practiceResultItem.PracticeResultId = submitPracticeDto.PracticeResultId;
- practiceResultItem.ToInsert(_sessionContext);
- practiceResultItems.Add(practiceResultItem);
- });
- await _practiceResultItemRepository.ValidateAddAsync(practiceResultItems, cancellationToken);
- return practiceResultItems;
- }
- private async Task<PracticeQuestionDto> QueryPracticeQuestion(PracticeQuestionRequest practiceQuestionRequest)
- {
- var practiceQuestion = await _practiceQuestionRepository.GetAsync(x => x.Id == practiceQuestionRequest.PracticeQuestionId);
- var practiceQuestionDto = _mapper.Map<PracticeQuestionDto>(practiceQuestion);
- 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);
- var expression = practiceQuestionRequest.GetExpression();
- var practiceQuestionTable = _practiceQuestionRepository.Queryable().Where(expression);
- var practiceQuestionKnowladgeTable = _practiceQuestionKnowladgeRepository.Queryable();
- var knowlegdeTable = knowledgeRepository.Queryable();
- var queryResult = practiceQuestionTable.InnerJoin(practiceQuestionKnowladgeTable, (t, ts) => t.QuestionId == ts.QuestionId && t.Id == ts.PracticeQuestionId)
- .InnerJoin(knowlegdeTable, (t, ts, sw) => ts.KnowladgeId == sw.Id)
- .Select((t, ts, sw) => new PracticeQuestionKnowladgeDto
- {
- KnowladgeId = ts.KnowladgeId,
- QuestionId = ts.QuestionId,
- Title = sw.Title,
- });
- return await queryResult.ToListAsync();
- }
- private async Task<List<PracticeQuestionSourcewareDto>> GetPracticeQuestionSourceware(PracticeQuestionRequest practiceQuestionRequest)
- {
- var sourcewareRepository = new ExamRepository<Sourceware>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var expression = practiceQuestionRequest.GetExpression();
- var practiceQuestionTable = _practiceQuestionRepository.Queryable().Where(expression);
- var practiceQuestionSourcewareTable = _practiceQuestionSourcewareRepository.Queryable();
- var sourcewareTable = sourcewareRepository.Queryable();
- var queryResult = practiceQuestionTable.InnerJoin(practiceQuestionSourcewareTable, (t, ts) => t.QuestionId == ts.QuestionId && t.Id == ts.PracticeQuestionId)
- .InnerJoin(sourcewareTable, (t, ts, sw) => ts.SourcewareId == sw.Id)
- .Select((t, ts, sw) => new PracticeQuestionSourcewareDto
- {
- AttachmentId = sw.AttachmentId,
- SourcewareId = ts.SourcewareId,
- QuestionId = ts.QuestionId,
- Name = sw.Name,
- });
- return await queryResult.ToListAsync();
- }
- private async Task<List<PracticeQuestionOptionsDto>> GetPracticeQuestionOptions(PracticeQuestionRequest practiceQuestionRequest)
- {
- var expression = practiceQuestionRequest.GetExpression();
- var practiceQuestionTable = _practiceQuestionRepository.Queryable().Where(expression);
- var practiceQuestionOptionTable = _practiceQuestionOptionsRepository.Queryable();
- var queryResult = practiceQuestionTable.InnerJoin(practiceQuestionOptionTable, (p, o) => p.QuestionId == o.QuestionId && p.Id == o.PracticeQuestionId)
- .Select((p, o) => new PracticeQuestionOptionsDto
- {
- Content = o.Content,
- Label = o.Label,
- PracticeQuestionId = o.PracticeQuestionId,
- QuestionOptionId = o.QuestionOptionId
- });
- return await queryResult.ToListAsync();
- }
- private SqlSugar.ISugarQueryable<PracticeViewResponse> QueryResult(PracticePagedRequest queryRequest)
- {
- var expression = queryRequest.GetExpression();
- var practiceTable = _repository.Queryable().Where(expression);
- var practiceRecordTable = _practiceRecordRepository.Queryable();
- var queryResult = practiceTable.InnerJoin(practiceRecordTable, (p, r) => p.Id == r.PracticeId).Select((p, r) => new PracticeViewResponse
- {
- Id = p.Id,
- Code = p.Code,
- Count = p.Count,
- PracticeTime = r.PracticeTime,
- PracticeType = p.PracticeType
- });
- return queryResult;
- }
- private async Task<List<PracticeQuestionSourceware>> AddPracticeQuestionSourcewareAsync(List<AddPracticeQuestionDto> practiceQuestionDtos, CancellationToken cancellationToken)
- {
- var questionSourcewareRepository = new ExamRepository<QuestionSourceware>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var quesitonIds = practiceQuestionDtos.Select(x => x.QuestionId);
- var questionSourceware = await questionSourcewareRepository.Queryable().Where(x => quesitonIds.Contains(x.QuestionId)).ToListAsync();
- var practiceQuestionSourcewares = new List<PracticeQuestionSourceware>();
- practiceQuestionDtos.Where(x => x.QuestionType.CheckSelectType()).ToList().ForEach(x =>
- {
- var practiceQuestion = base.Entity?.PracticeQuestions.FirstOrDefault(n => n.QuestionId == x.QuestionId) ?? null;
- var options = questionSourceware.Where(n => x.QuestionId == n.QuestionId).ToList();
- if (options != null)
- {
- options.ForEach(item =>
- {
- var practiceQuestionSourceware = _mapper.Map<QuestionSourceware, PracticeQuestionSourceware>(item);
- practiceQuestionSourceware.PracticeQuestionId = practiceQuestion?.Id;
- practiceQuestionSourceware.ToInsert(_sessionContext);
- practiceQuestionSourcewares.Add(practiceQuestionSourceware);
- });
- }
- });
- await _practiceQuestionSourcewareRepository.ValidateAddAsync(practiceQuestionSourcewares, cancellationToken);
- return practiceQuestionSourcewares;
- }
- private async Task<List<PracticeQuestionKnowladge>> AddPracticeQuestionKnowladgeAsync(List<AddPracticeQuestionDto> practiceQuestionDtos, CancellationToken cancellationToken)
- {
- var questionKnowladgeRepository = new ExamRepository<QuestionKnowladge>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var quesitonIds = practiceQuestionDtos.Select(x => x.QuestionId);
- var questionKnowladge = await questionKnowladgeRepository.Queryable().Where(x => quesitonIds.Contains(x.QuestionId)).ToListAsync();
- var practiceQuestionKnowladges = new List<PracticeQuestionKnowladge>();
- practiceQuestionDtos.Where(x => x.QuestionType.CheckSelectType()).ToList().ForEach(x =>
- {
- var practiceQuestion = base.Entity?.PracticeQuestions.FirstOrDefault(n => n.QuestionId == x.QuestionId) ?? null;
- var options = questionKnowladge.Where(n => x.QuestionId == n.QuestionId).ToList();
- if (options != null)
- {
- options.ForEach(item =>
- {
- var practiceQuestionKnowladge = _mapper.Map<QuestionKnowladge, PracticeQuestionKnowladge>(item);
- practiceQuestionKnowladge.PracticeQuestionId = practiceQuestion?.Id;
- practiceQuestionKnowladge.ToInsert(_sessionContext);
- practiceQuestionKnowladges.Add(practiceQuestionKnowladge);
- });
- }
- });
- await _practiceQuestionKnowladgeRepository.ValidateAddAsync(practiceQuestionKnowladges, cancellationToken);
- return practiceQuestionKnowladges;
- }
- private async Task<List<PracticeQuestionOptions>> AddPracticeQuestionOptions(List<AddPracticeQuestionDto> practiceQuestionDtos, CancellationToken cancellationToken)
- {
- var questionOptionRepository = new ExamRepository<QuestionOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var quesitonIds = practiceQuestionDtos.Select(x => x.QuestionId);
- var questionOptions = await questionOptionRepository.Queryable().Where(x => quesitonIds.Contains(x.QuestionId)).ToListAsync();
- var practiceQuestionOptions = new List<PracticeQuestionOptions>();
- practiceQuestionDtos.Where(x => x.QuestionType.CheckSelectType()).ToList().ForEach(x =>
- {
- var practiceQuestion = base.Entity?.PracticeQuestions.FirstOrDefault(n=> n.QuestionId == x.QuestionId) ?? null;
- var options = questionOptions.Where(n => x.QuestionId == n.QuestionId).ToList();
- if (options != null)
- {
- options.ForEach(item =>
- {
- var practiceQuestionOption = _mapper.Map<QuestionOptions, PracticeQuestionOptions>(item);
- practiceQuestionOption.PracticeQuestionId = practiceQuestion?.Id;
- practiceQuestionOption.QuestionOptionId = item.Id;
- practiceQuestionOption.ToInsert(_sessionContext);
- practiceQuestionOptions.Add(practiceQuestionOption);
- });
- }
- });
- await _practiceQuestionOptionsRepository.ValidateAddAsync(practiceQuestionOptions, cancellationToken);
- return practiceQuestionOptions;
- }
- private async Task<List<PracticeQuestion>> AddPracticeQuestions(List<AddPracticeQuestionDto> addPracticeQuestionDtos, CancellationToken cancellationToken)
- {
- var practiceQuestions = new List<PracticeQuestion>();
- var sortIndex = 0;
- addPracticeQuestionDtos.ForEach(item =>
- {
- var practiceQuestion = _mapper.Map<PracticeQuestion>(item);
- practiceQuestion.SortIndex = sortIndex;
- practiceQuestions.Add(practiceQuestion);
- sortIndex++;
- });
- practiceQuestions.ToInsert(_sessionContext);
- await _practiceQuestionRepository.ValidateAddAsync(practiceQuestions, cancellationToken);
- return practiceQuestions;
- }
- private async Task<PracticeRecord> AddPracticeRecord(string practiceId, CancellationToken cancellationToken)
- {
- var practiceRecordDto = new PracticeRecordDto
- {
- PracticeId = practiceId,
- UserId = _sessionContext.UserId,
- PracticeTime = DateTime.Now
- };
- var practiceRecord = _mapper.Map<PracticeRecord>(practiceRecordDto);
- practiceRecord.ToInsert(_sessionContext);
- await _practiceRecordRepository.ValidateAddAsync(practiceRecord, cancellationToken);
- return practiceRecord;
- }
- private async Task<List<Question>> ExactractQuestion(AddPracticeDto actionRequest)
- {
- if (actionRequest.PracticeTagDtos == null) return new List<Question>();
- var tagIds = actionRequest.PracticeTagDtos.Select(x => x.TagId).ToList();
- var questionTagRepostiory = new ExamRepository<QuestionTag>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var questionRepository = new ExamRepository<Question>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var questionTagTable = questionTagRepostiory.Queryable();
- var questionTable = questionRepository.Queryable();
- // 按照标签获取试题,至少取一道
- if (actionRequest.Count < actionRequest.PracticeTagDtos.Count)
- {
- questionTagTable = questionTagTable.Where(x => tagIds.Contains(x.TagId)).Take(actionRequest.Count);
- }
- else
- {
- var unionQuestions = new List<ISugarQueryable<QuestionTag>>();
- var ids = new List<string>();
- // 保证每个标签至少获取一道题
- tagIds.ForEach(v =>
- {
- 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();
- });
- var mainQuesiton = questionTagTable;
- mainQuesiton = mainQuesiton.Where(x => tagIds.Contains(x.TagId) && !ids.Contains(x.Id)).Take(actionRequest.Count - tagIds.Count);
- unionQuestions.Add(mainQuesiton);
- questionTagTable = questionTagRepostiory.Queryable();
- questionTagTable = questionTagRepostiory.UnionAll(unionQuestions.ToArray());
- }
- var queryResult = questionTagTable.InnerJoin(questionTable, (t, q) => t.QuestionId == q.Id)
- .Select((t, q) => q);
- 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
- protected override async Task CompleteAdd(Practice entity)
- {
- await base.AddNav(entity).Include(x => x.PracticeRecords)
- .Include(x => x.PracticeQuestions)
- .ThenInclude(x => x.PracticeQuestionKnowladges)
- .Include(x => x.PracticeQuestions, new InsertNavOptions
- {
- OneToManyIfExistsNoInsert = true
- })
- .ThenInclude(x => x.PracticeQuestionOptionses)
- .Include(x => x.PracticeQuestions, new InsertNavOptions
- {
- OneToManyIfExistsNoInsert = true
- })
- .ThenInclude(x => x.PracticeQuestionSourcewares).ExecuteCommandAsync();
- }
- public async Task<TagQuestionCountViewResponse> GetTagQuestionCount(TagQuestionCountForPracticeRequest tagQuestionCountForPracticeRequest)
- {
- var expression = tagQuestionCountForPracticeRequest.GetExpression();
- var questionExpression = tagQuestionCountForPracticeRequest.GetQuestionExpression();
- var tagQuestionRepository = new ExamRepository<QuestionTag>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var quesitonRepository = new ExamRepository<Question>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
- var tagQuestionTable = tagQuestionRepository.Queryable().Where(expression);
- var questionTable = quesitonRepository.Queryable().Where(questionExpression);
- var taqQuestions = await tagQuestionTable.LeftJoin(questionTable, (t, q) => t.QuestionId == q.Id)
- .Select((t, q) => new TagQuestionCountViewResponse
- {
- TotalCount = SqlFunc.AggregateCount(t.Id)
- })
- .ToListAsync();
- return taqQuestions.Count() > 0 ? taqQuestions.FirstOrDefault() : new TagQuestionCountViewResponse
- {
- TotalCount = 0
- };
- }
- #endregion
- }
- }
|