TrainRecordService.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. using Exam.Infrastructure.Data.Entity;
  2. using Exam.Infrastructure.Validation.Validation;
  3. using Exam.Share.Dtos.Trains;
  4. using Exam.Share.ViewResponses.Train;
  5. using Hotline.Application.Exam.Core.Extensions;
  6. using Hotline.Application.Exam.Interface.Train;
  7. using Hotline.Application.Exam.QueryExtensions.Trains;
  8. using Hotline.Exams.Practices;
  9. using Hotline.Exams.Sourcewares;
  10. using Hotline.Exams.Trains;
  11. using Hotline.Repository.SqlSugar;
  12. using Hotline.Repository.SqlSugar.DataPermissions;
  13. using Hotline.Repository.SqlSugar.Exam.Interfaces.Trains;
  14. using Hotline.Share.Dtos.Questions;
  15. using Hotline.Share.Dtos.Trains;
  16. using Hotline.Share.Requests.Exam;
  17. using Hotline.Share.Requests.Train;
  18. using Hotline.Share.ViewResponses.Trains;
  19. using Hotline.Users;
  20. using MapsterMapper;
  21. using Train.Application.Interface.Train;
  22. using XF.Domain.Authentications;
  23. using XF.Domain.Dependency;
  24. using XF.Domain.Exceptions;
  25. using Hotline.Share.Exams.Extensions;
  26. using NPOI.SS.Formula.Functions;
  27. using Hotline.Repository.SqlSugar.Exam.Repositories.Trains;
  28. using static NPOI.HSSF.Util.HSSFColor;
  29. using DocumentFormat.OpenXml.Drawing.Charts;
  30. using Hotline.Repository.SqlSugar.Exam.Repositories;
  31. using JiebaNet.Segmenter.Common;
  32. using Hotline.Repository.SqlSugar.Exam.Service;
  33. using Hotline.Repository.SqlSugar.Exam.Extensions;
  34. using DocumentFormat.OpenXml.Office2010.Excel;
  35. namespace Hotline.Application.Exam.Service.Trains
  36. {
  37. public class TrainRecordService : ApiService<ExamTrainRecord, AddTrainRecordDto, UpdateTrainRecordDto, HotlineDbContext>, ITrainRecordService, IScopeDependency
  38. {
  39. private readonly ITrainRecordRepository _repository;
  40. private readonly ITrainRecordAnswerRepository _trainRecordAnswerRepository;
  41. private readonly ITrainRecordItemRepository _trainRecordItemRepository;
  42. private readonly ITrainKnowladgeRepository _trainKnowladgeRepository;
  43. private readonly IMapper _mapper;
  44. private readonly IDataPermissionFilterBuilder _dataPermissionFilterBuilder;
  45. private readonly IServiceProvider _serviceProvider;
  46. private readonly ISessionContext _sessionContext;
  47. public TrainRecordService(ITrainRecordRepository repository,
  48. ITrainRecordAnswerRepository trainRecordAnswerRepository,
  49. ITrainRecordItemRepository trainRecordItemRepository,
  50. ITrainKnowladgeRepository trainKnowladgeRepository,
  51. IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider,
  52. ISessionContext sessionContext,
  53. IMapper mapper) : base(repository, mapper, sessionContext)
  54. {
  55. this._repository = repository;
  56. this._trainRecordAnswerRepository = trainRecordAnswerRepository;
  57. this._trainRecordItemRepository = trainRecordItemRepository;
  58. this._trainKnowladgeRepository = trainKnowladgeRepository;
  59. this._mapper = mapper;
  60. this._dataPermissionFilterBuilder = dataPermissionFilterBuilder;
  61. this._serviceProvider = serviceProvider;
  62. this._sessionContext = sessionContext;
  63. }
  64. #region public method
  65. public async Task CompleteTrainRecordAsync(CompleteTrainRecordDto completeTrainRecordDto, CancellationToken cancellationToken)
  66. {
  67. var trainRecord = await _repository.GetAsync(x => x.Id == completeTrainRecordDto.Id);
  68. trainRecord= _mapper.Map<CompleteTrainRecordDto,ExamTrainRecord>(completeTrainRecordDto, trainRecord);
  69. trainRecord.ToUpdate(_sessionContext);
  70. await _repository.ValidateUpdateAsync(trainRecord, cancellationToken);
  71. }
  72. public async Task CompleteTrainKnowladgeAsync(CompleteTrainKnowladgeDto completeTrainPracticeDto, CancellationToken cancellationToken)
  73. {
  74. var trainKnowladge = _mapper.Map<ExamTrainKnowladge>(completeTrainPracticeDto);
  75. trainKnowladge.ToUpdate(_sessionContext);
  76. await _trainKnowladgeRepository.ValidateUpdateAsync(trainKnowladge,cancellationToken);
  77. }
  78. public async Task<TrainRecordDto> GetAsync(EntityQueryRequest entityQueryRequest)
  79. {
  80. var trainRecord = await _repository.GetAsync(entityQueryRequest.Id);
  81. var trainRecordDto = _mapper.Map<TrainRecordDto>(trainRecord);
  82. trainRecordDto.KnowladgeDtos = await GetKnowladges(entityQueryRequest);
  83. trainRecordDto.QuestionDtos = await GetQuestions(entityQueryRequest);
  84. return trainRecordDto;
  85. }
  86. public async Task<(int, List<TrainRecordViewResponse>)> GetListAsync(TrainRecordPagedRequest queryRequest)
  87. {
  88. SqlSugar.ISugarQueryable<TrainRecordViewResponse> queryResult = QueryResult(queryRequest);
  89. var total = await queryResult.CountAsync();
  90. var items = await queryResult.ToListAsync();
  91. return (total, items);
  92. }
  93. public async Task<PageViewResponse<TrainRecordViewResponse>> GetPagedListAsync(TrainRecordPagedRequest queryRequest)
  94. {
  95. SqlSugar.ISugarQueryable<TrainRecordViewResponse> queryResult = QueryResult(queryRequest);
  96. var total = await queryResult.CountAsync();
  97. var items = await queryResult.ToPageListAsync(queryRequest.PageIndex,queryRequest.PageSize);
  98. return new TrainRecordPageViewResponse
  99. {
  100. Items = items,
  101. Pagination = new Pagination(queryRequest.PageIndex,queryRequest.PageSize,total)
  102. };
  103. }
  104. public async Task<TrainPracticeDto> TrainAsync(AddTrainDto addTrainDto, CancellationToken cancellationToken)
  105. {
  106. await GetTrainPracticeKnowladge(addTrainDto, cancellationToken);
  107. await AddTrainRecordItem(addTrainDto,cancellationToken);
  108. await AddTrainRecordAnswer(addTrainDto, cancellationToken);
  109. //var trainPracticeOptionsDtos = await GetTrainQuestionOptions(addTrainDto);
  110. return null;
  111. }
  112. private async Task GetTrainPracticeKnowladge(AddTrainDto addTrainDto, CancellationToken cancellationToken)
  113. {
  114. var trainPracticeKnowladeRepository = new TrainPracticeKnowladgeRepository(_uow,_dataPermissionFilterBuilder,_serviceProvider);
  115. var trainPracticeKnowladge = await trainPracticeKnowladeRepository.GetAsync(x => x.TrainPracticeId == addTrainDto.TrainPracticeId);
  116. if (trainPracticeKnowladge != null)
  117. {
  118. addTrainDto.TrainKnowladgeId = trainPracticeKnowladge.Id;
  119. addTrainDto.QuestionId = trainPracticeKnowladge.QuestionId;
  120. }
  121. }
  122. public async Task<TrainPracticeDto> GetTrainPracticeAsync(TrainPracticeRequest trainPracticeRequest)
  123. {
  124. SqlSugar.ISugarQueryable<ExamTrainPractice> trainPractices = GetTrainPractices(trainPracticeRequest);
  125. var trainPractice = await trainPractices.FirstAsync();
  126. if (trainPractice == null) return null;
  127. var trainPracticeDto = _mapper.Map<TrainPracticeDto>(trainPractice);
  128. trainPracticeRequest.TrainPracticeId = trainPractice.Id;
  129. trainPracticeDto.TrainPracticeOptionsDtos = await GetTrainQuestionOptions(trainPracticeRequest);
  130. trainPracticeDto.TrainPracticeSourcewareDtos = await GetTrainPracticeSourcewares(trainPracticeRequest);
  131. trainPracticeDto.TrainPracticeKnowladgeDtos = await GetTrainPracticeKnowladges(trainPracticeRequest);
  132. return trainPracticeDto;
  133. }
  134. public async Task<SimpleTrainPracticeDto> GetSimpleTrainPracticeAsync(TrainPracticeRequest trainPracticeRequest)
  135. {
  136. SqlSugar.ISugarQueryable<ExamTrainPractice> trainPractices = GetTrainPractices(trainPracticeRequest);
  137. var trainPractice = await trainPractices.FirstAsync();
  138. if (trainPractice == null) return null;
  139. var trainPracticeDto = _mapper.Map<TrainPracticeDto>(trainPractice);
  140. trainPracticeRequest.TrainPracticeId = trainPractice.Id;
  141. trainPracticeDto.TrainPracticeOptionsDtos = await GetTrainQuestionOptions(trainPracticeRequest);
  142. return trainPracticeDto;
  143. }
  144. public async Task<TrainResultPagedViewResponse> AnalysisTrainResult(TrainResultReportPagedRequest trainResultReportPagedRequest)
  145. {
  146. trainResultReportPagedRequest.ResoleEndTime();
  147. var expression = trainResultReportPagedRequest.GetExpression();
  148. var templateExpression = trainResultReportPagedRequest.GetTemplateExpression();
  149. var trainTemplateRepostitory = new ExamRepository<ExamTrainTemplate>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  150. var trainPlanRepository = new ExamRepository<ExamTrainPlan>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  151. var trainPlanTemplateRepository = new ExamRepository<ExamTrainPlanTemplate>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  152. var userRepository = new ExamRepository<User>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  153. var trainPlanTable = trainPlanRepository.Queryable().Where(expression);
  154. var trainTemplateTable = trainTemplateRepostitory.Queryable().Where(templateExpression);
  155. var trainPlanTemplateTable = trainPlanTemplateRepository.Queryable();
  156. var trainRecordTable = _repository.Queryable();
  157. var userTable = userRepository.Queryable();
  158. var queryResult = trainRecordTable.InnerJoin(trainPlanTable, (r, p) => r.TrainPlanId == p.Id)
  159. .InnerJoin(trainPlanTemplateTable, (r, p, pt) => p.Id == pt.TrainPlanId)
  160. .InnerJoin(trainTemplateTable, (r, p, pt, t) => pt.TrainTemplateId == t.Id)
  161. .InnerJoin(userTable,(r,p,pt,t,u)=>r.UserId == u.Id)
  162. .Select((r, p, pt, t, u) => new TrainResultViewResponse
  163. {
  164. TrainName = t.Name,
  165. UserName = u.Name,
  166. IsComplete = r.IsComplete,
  167. SortIndex = r.SortIndex,
  168. Status = r.Status
  169. });
  170. var total = await queryResult.CountAsync();
  171. var items = await queryResult.ToPageListAsync(trainResultReportPagedRequest.PageIndex, trainResultReportPagedRequest.PageSize);
  172. return new TrainResultPagedViewResponse
  173. {
  174. Items = items,
  175. Pagination = new Pagination(trainResultReportPagedRequest.PageIndex, trainResultReportPagedRequest.PageSize, total)
  176. };
  177. }
  178. public async Task<TrainResultRateViewResponse> CalcuteAnalysisRate(TrainResultReportPagedRequest trainResultReportPagedRequest)
  179. {
  180. trainResultReportPagedRequest.ResoleEndTime();
  181. var expression = trainResultReportPagedRequest.GetExpression();
  182. var templateExpression = trainResultReportPagedRequest.GetTemplateExpression();
  183. var trainTemplateRepostitory = new ExamRepository<ExamTrainTemplate>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  184. var trainPlanRepository = new ExamRepository<ExamTrainPlan>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  185. var trainPlanTemplateRepository = new ExamRepository<ExamTrainPlanTemplate>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  186. var trainPlanTable = trainPlanRepository.Queryable().Where(expression);
  187. var trainTemplateTable = trainTemplateRepostitory.Queryable().Where(templateExpression);
  188. var trainPlanTemplateTable = trainPlanTemplateRepository.Queryable();
  189. var trainRecordTable = _repository.Queryable();
  190. var queryResult = trainRecordTable.InnerJoin(trainPlanTable, (r, p) => r.TrainPlanId == p.Id)
  191. .InnerJoin(trainPlanTemplateTable, (r, p, pt) => p.Id == pt.TrainPlanId)
  192. .InnerJoin(trainTemplateTable, (r, p, pt, t) => pt.TrainTemplateId == t.Id)
  193. .Select((r, p, pt, t) => new TrainResultViewResponse
  194. {
  195. TrainName = t.Name,
  196. IsComplete = r.IsComplete,
  197. SortIndex = r.SortIndex,
  198. Status = r.Status,
  199. TrainTime = p.TrainEndTime
  200. });
  201. var calcuteRateResult = new TrainResultRateViewResponse
  202. {
  203. Complete = await queryResult.CountAsync(x=>x.IsComplete),
  204. Trainning = await queryResult.CountAsync(x => !x.IsComplete && x.TrainTime > DateTime.Now),
  205. UnComplete = await queryResult.CountAsync(x => !x.IsComplete && x.TrainTime <= DateTime.Now),
  206. };
  207. return calcuteRateResult;
  208. }
  209. #endregion
  210. #region private method
  211. private async Task AddTrainRecordItem(AddTrainDto addTrainDto, CancellationToken cancellationToken)
  212. {
  213. var trainRecordItem = _mapper.Map<ExamTrainRecordItem>(addTrainDto);
  214. trainRecordItem.ToInsert(_sessionContext);
  215. await _trainRecordItemRepository.AddWithValidateAsync(trainRecordItem, cancellationToken);
  216. }
  217. private SqlSugar.ISugarQueryable<TrainRecordViewResponse> QueryResult(TrainRecordPagedRequest queryRequest)
  218. {
  219. var trainPlanRepository = new TrainPlanRepository(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  220. queryRequest.UserId = _sessionContext.UserId;
  221. var expression = queryRequest.GetExpression();
  222. var trainPlanTable = trainPlanRepository.Queryable().Where(expression);
  223. var traiRecordExpression = queryRequest.GetTrainRecordExpression();
  224. var trainRecordTable = _repository.Queryable().Where(traiRecordExpression);
  225. var queryResult = trainPlanTable.InnerJoin(trainRecordTable, (p, r) => p.Id == r.TrainPlanId)
  226. .Select((p, r) => new TrainRecordViewResponse
  227. {
  228. Id = r.Id,
  229. TrainCode = p.Code,
  230. TrainName = p.Name,
  231. IsComplete = r.IsComplete,
  232. Status = r.Status,
  233. SortIndex = r.SortIndex,
  234. TrainEndTime = p.TrainEndTime,
  235. TrainStartTime = p.TrainStartTime
  236. });
  237. return queryResult;
  238. }
  239. private async Task<List<SimpleQuestionDto>> GetQuestions(EntityQueryRequest entityQueryRequest)
  240. {
  241. SqlSugar.ISugarQueryable<SimpleQuestionDto> queryable = QueryQuestions(entityQueryRequest);
  242. return await queryable.ToListAsync();
  243. }
  244. private SqlSugar.ISugarQueryable<SimpleQuestionDto> QueryQuestions(EntityQueryRequest entityQueryRequest)
  245. {
  246. SqlSugar.ISugarQueryable<ExamTrainRecord, ExamTrainPlan, ExamTrainPlanTemplate, ExamTrainPractice> queryable = QuestionQueryable(entityQueryRequest);
  247. var result = queryable.Select((r, p, tpt, tp) => new SimpleQuestionDto
  248. {
  249. Title = tp.Title,
  250. Id = tp.Id
  251. });
  252. return result;
  253. }
  254. private SqlSugar.ISugarQueryable<ExamTrainRecord, ExamTrainPlan, ExamTrainPlanTemplate, ExamTrainPractice> QuestionQueryable(EntityQueryRequest entityQueryRequest)
  255. {
  256. var trainPlanRepository = new ExamRepository<ExamTrainPlan>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  257. var trainPracticeRepository = new ExamRepository<ExamTrainPractice>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  258. var trainPlanTemplateRepository = new ExamRepository<ExamTrainPlanTemplate>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  259. var trainRecordTable = _repository.Queryable().Where(x => x.Id == entityQueryRequest.Id);
  260. var trainPlanTable = trainPlanRepository.Queryable();
  261. var trainPracticeTable = trainPracticeRepository.Queryable();
  262. var trainPlanTemplateTable = trainPlanTemplateRepository.Queryable();
  263. var queryable = trainRecordTable.InnerJoin(trainPlanTable, (r, p) => r.TrainPlanId == p.Id)
  264. .InnerJoin(trainPlanTemplateTable, (r, p, tpt) => p.Id == tpt.TrainPlanId)
  265. .InnerJoin(trainPracticeTable, (r, p, tpt, tp) => tpt.TrainTemplateId == tp.TrainTemplateId);
  266. return queryable;
  267. }
  268. private async Task<List<SimpleKnowladgeDto>> GetKnowladges(EntityQueryRequest entityQueryRequest)
  269. {
  270. var questionTable = QuestionQueryable(entityQueryRequest);
  271. var questionKnowladgeRepository = new ExamRepository<ExamTrainPracticeKnowladge>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  272. var knowledgeRepository = new ExamRepository<KnowledgeBase.Knowledge>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  273. var questionKnowladgeTable = questionKnowladgeRepository.Queryable();
  274. var knowledgeTable = knowledgeRepository.Queryable();
  275. var queryable = questionTable.InnerJoin(questionKnowladgeTable, (r, p, tpt, tp, ExamPracticeQuestionKnowledge) => tp.QuestionId == ExamPracticeQuestionKnowledge.QuestionId)
  276. .InnerJoin(knowledgeTable, (r, p, tpt, tp, ExamPracticeQuestionKnowledge,kl) => ExamPracticeQuestionKnowledge.KnowladgeId == kl.Id)
  277. .GroupBy((r, p, tpt, tp, ExamPracticeQuestionKnowledge, kl) => new {
  278. Title = kl.Title,
  279. Id = kl.Id
  280. })
  281. .Select((r, p, tpt, tp, ExamPracticeQuestionKnowledge, kl) => new SimpleKnowladgeDto
  282. {
  283. Title = kl.Title,
  284. Id = kl.Id
  285. });
  286. return await queryable.ToListAsync();
  287. }
  288. private async Task AddTrainRecordAnswer(AddTrainDto addTrainDto, CancellationToken cancellationToken)
  289. {
  290. if (addTrainDto.AddTrainRecordOptionDtos == null && addTrainDto.AddTrainRecordAnswerDto == null) return;
  291. var trainRecordAnswers = new List<ExamTrainRecordAnswer>();
  292. addTrainDto.AddTrainRecordOptionDtos?.ForEach(item =>
  293. {
  294. item.TrainRecordId = addTrainDto.TrainRecordId;
  295. var traiRecordAnswer = _mapper.Map<ExamTrainRecordAnswer>(item);
  296. traiRecordAnswer.QuestionId = addTrainDto.QuestionId;
  297. trainRecordAnswers.Add(traiRecordAnswer);
  298. });
  299. if (addTrainDto.AddTrainRecordAnswerDto != null)
  300. {
  301. addTrainDto.AddTrainRecordAnswerDto.TrainRecordId = addTrainDto.TrainRecordId;
  302. addTrainDto.AddTrainRecordAnswerDto.QuestionId = addTrainDto.QuestionId;
  303. trainRecordAnswers.Add(_mapper.Map<ExamTrainRecordAnswer>(addTrainDto.AddTrainRecordAnswerDto));
  304. }
  305. trainRecordAnswers.ToInsert(_sessionContext);
  306. await _trainRecordAnswerRepository.AddWithValidateAsync(trainRecordAnswers,cancellationToken);
  307. }
  308. //private async Task<TrainPracticeDto> GetTrainQuestionOptions(AddTrainDto addTrainDto)
  309. //{
  310. // var trainPracticeOptionsRepository = new ExamRepository<ExamTrainPracticeOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  311. // var trainPracticeRepository = new ExamRepository<ExamTrainPractice>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  312. // // TODO: 获取未答题的第一道题
  313. // var trainPractice = await trainPracticeRepository.Queryable()
  314. // .Where(x => x.TrainTemplateId == addTrainDto.TrainTemplateId && x.Id!= addTrainDto.TrainPracticeId).OrderBy(x=>x.SortIndex).FirstAsync();
  315. // var trainPracticeOptions = await trainPracticeOptionsRepository.Queryable().Where(x => x.TrainPracticeId == trainPractice.Id).ToListAsync();
  316. // var trainPracticeOptionsDtos = new List<SimpleTrainPracticeOptionsDto>();
  317. // trainPracticeOptions.ForEach(x =>
  318. // {
  319. // trainPracticeOptionsDtos.Add(_mapper.Map<SimpleTrainPracticeOptionsDto>(x));
  320. // });
  321. // var trainPracticeDto = _mapper.Map<TrainPracticeDto>(trainPractice);
  322. // trainPracticeDto.TrainPracticeOptionsDtos = trainPracticeOptionsDtos;
  323. // return trainPracticeDto;
  324. //}
  325. private SqlSugar.ISugarQueryable<ExamTrainPractice> GetTrainPractices(TrainPracticeRequest trainPracticeRequest)
  326. {
  327. var trainPracticeRepostitory = new TrainPracticeRepository(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  328. var trainPlanRepository = new TrainPlanRepository(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  329. var trainPlanTemplateRepository = new TrainPlanTemplateRepository(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  330. var trainRecordTable = _repository.Queryable().Where(x => x.Id == trainPracticeRequest.Id);
  331. var trainPlanTable = trainPlanRepository.Queryable();
  332. var trainPracticeTable = trainPracticeRepostitory.Queryable().WhereIF(!string.IsNullOrEmpty(trainPracticeRequest.TrainPracticeId),x=>x.Id == trainPracticeRequest.TrainPracticeId);
  333. var tranPlanTemplateTable = trainPlanTemplateRepository.Queryable();
  334. var trainPractices = trainPracticeTable.InnerJoin(tranPlanTemplateTable, (tp, tpt) => tp.TrainTemplateId == tpt.TrainTemplateId)
  335. .InnerJoin(trainPlanTable, (tp, tpt, tpn) => tpt.TrainPlanId == tpn.Id)
  336. .InnerJoin(trainRecordTable, (tp, tpt, tpn, tr) => tpn.Id == tr.TrainPlanId)
  337. .Select((tp, tpt, tpn, tr) => tp)
  338. .OrderBy(tp => tp.CreationTime);
  339. return trainPractices;
  340. }
  341. private async Task<List<SimpleTrainPracticeOptionsDto>> GetTrainQuestionOptions(TrainPracticeRequest trainPracticeRequest)
  342. {
  343. var trainPracticeOptionsRepository = new ExamRepository<ExamTrainPracticeOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  344. var trainRecordAnswerRepository = new ExamRepository<ExamTrainRecordAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  345. // TODO: 获取未阅卷的第一道题
  346. var trainPractices = GetTrainPractices(trainPracticeRequest);
  347. var trainPracticeOptions = await trainPracticeOptionsRepository.Queryable()
  348. .InnerJoin(trainPractices, (tpo, tp) => tpo.TrainPracticeId == tp.Id)
  349. .Where((tpo, tp)=> tp.Id == trainPracticeRequest.TrainPracticeId)
  350. .Select((tpo, tp) => tpo).ToListAsync();
  351. var queryable = trainRecordAnswerRepository.Queryable()
  352. .InnerJoin<ExamTrainRecord>((t, x) => t.TrainRecordId == x.Id)
  353. .InnerJoin<ExamTrainPlanTemplate>((t, x, p) => x.TrainPlanId == p.TrainPlanId)
  354. .InnerJoin<ExamTrainPractice>((t, x, p, tp) => p.TrainTemplateId == tp.TrainTemplateId)
  355. .Where((t, x, p, tp) => tp.Id == trainPracticeRequest.TrainPracticeId)
  356. .Select((t, x, p, tp) => t);
  357. var trainRecordOptions = await queryable
  358. .ToListAsync();
  359. var trainPracticeOptionsDtos = new List<SimpleTrainPracticeOptionsDto>();
  360. trainPracticeOptions.ForEach(x =>
  361. {
  362. var trainPracticeOptionsDto = _mapper.Map<SimpleTrainPracticeOptionsDto>(x);
  363. trainPracticeOptionsDto.IsSelected = trainRecordOptions.Any(m => m.QuestionOptionId == x.QuestionOptionId);
  364. trainPracticeOptionsDtos.Add(trainPracticeOptionsDto);
  365. });
  366. return trainPracticeOptionsDtos;
  367. }
  368. private async Task<List<TrainPracticeKnowladgeDto>> GetTrainPracticeKnowladges(TrainPracticeRequest trainPracticeRequest)
  369. {
  370. var trainPracticeKnowladgeRepository = new ExamRepository<ExamTrainPracticeKnowladge>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  371. var knowledgeRepository = new ExamRepository<KnowledgeBase.Knowledge>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  372. var trainPracticeRepostitory = new ExamRepository<ExamTrainPractice>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  373. var expression = trainPracticeRequest.GetExpression();
  374. var trainPracticeTable = trainPracticeRepostitory.Queryable().Where(expression);
  375. var trainPracticeKnowladgeTable = trainPracticeKnowladgeRepository.Queryable();
  376. var knowledgeTable = knowledgeRepository.Queryable();
  377. var queryResult = trainPracticeTable.InnerJoin(trainPracticeKnowladgeTable, (t, tk) => t.QuestionId == tk.QuestionId)
  378. .InnerJoin(knowledgeTable, (t, tk, k) => tk.KnowladgeId == k.Id)
  379. .Select((t, tk, k) => new TrainPracticeKnowladgeDto
  380. {
  381. KnowladgeId = tk.KnowladgeId,
  382. QuestionId = tk.QuestionId,
  383. Title = k.Title
  384. });
  385. return await queryResult.ToListAsync();
  386. }
  387. private async Task<List<TrainPracticeSourcewareDto>> GetTrainPracticeSourcewares(TrainPracticeRequest trainPracticeRequest)
  388. {
  389. var trainPracticeSourcewareRepository = new ExamRepository<ExamTrainPracticeSourceware>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  390. var sourcewareRepository = new ExamRepository<ExamSourceware>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  391. var trainPracticeRepostitory = new ExamRepository<ExamTrainPractice>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  392. var expression = trainPracticeRequest.GetExpression();
  393. var trainPracticeTable = trainPracticeRepostitory.Queryable().Where(expression);
  394. var trainPracticeSourcewareTable = trainPracticeSourcewareRepository.Queryable();
  395. var sourcewareTable = sourcewareRepository.Queryable();
  396. var queryResult = trainPracticeTable.InnerJoin(trainPracticeSourcewareTable, (t, ts) => t.QuestionId == ts.QuestionId)
  397. .InnerJoin(sourcewareTable, (t, ts, sw) => ts.SourcewareId == sw.Id)
  398. .Select((t, ts, sw) => new TrainPracticeSourcewareDto
  399. {
  400. SourcewareId = ts.SourcewareId,
  401. QuestionId = ts.QuestionId,
  402. Name = sw.Name,
  403. });
  404. return await queryResult.ToListAsync();
  405. }
  406. #endregion
  407. }
  408. }