UserExamService.cs 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011
  1. using Exam.Application.Interface.Exam;
  2. using Exam.Infrastructure.Data.Entity;
  3. using Exam.Infrastructure.Enums;
  4. using Exam.Infrastructure.Extensions;
  5. using Exam.Share;
  6. using Exam.Share.Dtos.ExamManage;
  7. using Exam.Share.ViewResponses.Exam;
  8. using Hotline.Application.Exam.Core.Extensions;
  9. using Hotline.Application.Exam.Extensions;
  10. using Hotline.Application.Exam.Interface.Strategy;
  11. using Hotline.Application.Exam.QueryExtensions.ExamManages;
  12. using Hotline.Application.Exam.Strategy;
  13. using Hotline.Exams.ExamManages;
  14. using Hotline.Repository.SqlSugar;
  15. using Hotline.Repository.SqlSugar.DataPermissions;
  16. using Hotline.Repository.SqlSugar.Exam.Interfaces.ExamManages;
  17. using Hotline.Share.Dtos.ExamManages;
  18. using Hotline.Share.Exams.Extensions;
  19. using Hotline.Share.Requests.Exam;
  20. using Hotline.Share.ViewResponses;
  21. using Hotline.Share.ViewResponses.Exam;
  22. using Hotline.Users;
  23. using JiebaNet.Segmenter.Common;
  24. using MapsterMapper;
  25. using Hotline.Application.Exam.Core.Utilities;
  26. using Hotline.Application.Exam.Interface.ExamManages;
  27. using Hotline.Exams.Validate;
  28. using Hotline.Repository.SqlSugar.Exam.Repositories;
  29. using XF.Domain.Authentications;
  30. using XF.Domain.Dependency;
  31. using XF.Domain.Exceptions;
  32. using XF.Domain.Repository;
  33. using ExamQuestion = Hotline.Exams.Questions.ExamQuestion;
  34. using Hotline.Repository.SqlSugar.Exam.Service;
  35. using Hotline.Repository.SqlSugar.Exam.Extensions;
  36. namespace Hotline.Application.Exam.Service.ExamManages
  37. {
  38. public class UserExamService : ApiService<ExamUserExam, AddUserExamDto, UpdateUserExamDto, HotlineDbContext>, IUserExamService, IScopeDependency
  39. {
  40. private readonly IUserExamRepository _repository;
  41. private readonly IUserExamItemRepository _userExamItemRepository;
  42. private readonly IUserExamItemOptionRepository _userExamItemOptionRepository;
  43. private readonly IExamAnswerRepository _examAnswerRepository;
  44. private readonly IDataPermissionFilterBuilder _dataPermissionFilterBuilder;
  45. private readonly IServiceProvider _serviceProvider;
  46. private readonly IMapper _mapper;
  47. private readonly ISessionContext _sessionContext
  48. ;
  49. public UserExamService(IUserExamRepository repository,
  50. IUserExamItemRepository userExamItemRepository,
  51. IUserExamItemOptionRepository userExamItemOptionRepository,
  52. IExamAnswerRepository examAnswerRepository,
  53. IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider,
  54. IMapper mapper, ISessionContext sessionContext) : base(repository, mapper, sessionContext)
  55. {
  56. this._repository = repository;
  57. this._userExamItemRepository = userExamItemRepository;
  58. this._userExamItemOptionRepository = userExamItemOptionRepository;
  59. this._examAnswerRepository = examAnswerRepository;
  60. this._dataPermissionFilterBuilder = dataPermissionFilterBuilder;
  61. this._serviceProvider = serviceProvider;
  62. this._mapper = mapper;
  63. this._sessionContext = sessionContext;
  64. }
  65. #region public method
  66. public Task<UserExamDto> GetAsync(EntityQueryRequest entityQueryRequest)
  67. {
  68. throw new NotImplementedException();
  69. }
  70. public Task<(int, List<UserExamResultViewResponse>)> GetListAsync(UserExamPagedRequest queryRequest)
  71. {
  72. throw new NotImplementedException();
  73. }
  74. public async Task<ExamQuestionDto> GetExamQuestionDto(ExamQuestionRequest examQuestionRequest)
  75. {
  76. var expression = examQuestionRequest.GetExpression();
  77. var quesetion = await new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression).FirstAsync();
  78. if (quesetion != null)
  79. {
  80. var examQuestionDto = _mapper.Map<ExamQuestionDto>(quesetion);
  81. if (examQuestionDto.QuestionType.CheckSelectType())
  82. {
  83. var questionOptions = await new ExamRepository<ExamQuestionOptionsBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.ExamQuestionId == quesetion.Id).ToListAsync();
  84. List<ExamUserExamItemOptions> userItemItemOptions = await GetUserExteamItemOptios(quesetion);
  85. if (questionOptions != null)
  86. {
  87. examQuestionDto.QuestionOptions = new List<ExamQuestionOptionsDto>();
  88. questionOptions.ForEach(item =>
  89. {
  90. var examQuestionOptionsDto = _mapper.Map<ExamQuestionOptionsDto>(item);
  91. if (userItemItemOptions != null)
  92. {
  93. examQuestionOptionsDto.IsSelected = userItemItemOptions.Any(m => m.QuestionOptionId == item.Id);
  94. }
  95. examQuestionDto.QuestionOptions.Add(examQuestionOptionsDto);
  96. });
  97. }
  98. }
  99. else
  100. {
  101. List<ExamAnswer> examAnswers = await GetExamAnswers(examQuestionRequest);
  102. examQuestionDto.Answer = examAnswers != null ? examAnswers.FirstOrDefault()?.Answer : null;
  103. }
  104. return examQuestionDto;
  105. }
  106. else
  107. {
  108. throw new UserFriendlyException(ExamErrorMessage.ServiceError, string.Format(ExamErrorMessage.IsNotExists, string.Concat(typeof(ExamQuestion).GetDescription(), ":", examQuestionRequest.QuestionId)));
  109. }
  110. }
  111. private async Task<List<ExamAnswer>> GetExamAnswers(ExamQuestionRequest examQuestionRequest)
  112. {
  113. var examAnswerRepository = new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  114. var userExamItemRepository = new ExamRepository<ExamUserExamItem>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  115. var userExamItemTable = userExamItemRepository.Queryable().Where(i=> i.QuestionId == examQuestionRequest.QuestionId);
  116. var userExamTable = _repository.Queryable().Where(u=> u.UserId == _sessionContext.UserId);
  117. var examAnswerTable = examAnswerRepository.Queryable();
  118. var examAnswers = await examAnswerTable.InnerJoin(userExamItemTable, (e, i) => e.UserExamItemId == i.Id)
  119. .InnerJoin(userExamTable, (e, i, u) => i.UserExamId == u.Id)
  120. .Select((e, i, u) => e).ToListAsync();
  121. return examAnswers;
  122. }
  123. private async Task<List<ExamUserExamItemOptions>> GetUserExteamItemOptios(Exams.ExamManages.ExamQuestionBak quesetion)
  124. {
  125. var userExamItemOptionsRepository = new ExamRepository<ExamUserExamItemOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  126. var userExamItemOptionsTable = userExamItemOptionsRepository.Queryable();
  127. var userExamItemTable = _userExamItemRepository.Queryable();
  128. var userExamTable = _repository.Queryable();
  129. var userItemItemOptions = await userExamItemOptionsTable
  130. .InnerJoin(userExamItemTable, (o, u) => o.UserExamItemId == u.Id)
  131. .InnerJoin(userExamTable, (o, u, e) => u.UserExamId == e.Id)
  132. .Where((o, u, e) => u.QuestionId == quesetion.QuestionId && e.UserId == _sessionContext.UserId).
  133. Select((o, u, e) => o).ToListAsync();
  134. return userItemItemOptions;
  135. }
  136. public async Task<List<ExamQuestionViewResponse>> GetExamQuestionViewResponses(ExamQuestionGroupRequest examQuestionGroupRequest)
  137. {
  138. if (examQuestionGroupRequest.ExamId.IsNull() && examQuestionGroupRequest.UserId.IsNull())
  139. throw UserFriendlyException.SameMessage("查询参数不能为空");
  140. var expression = examQuestionGroupRequest.GetExpression();
  141. var examManageTable = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression);
  142. var testPaperItemTable = new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
  143. var queryable = await examManageTable.InnerJoin(testPaperItemTable, (e, i) => e.Id == i.ExamId)
  144. .Select((e, i) => i).ToListAsync();
  145. var result = queryable.GroupBy(x => x.QuestionType).Select(m => new ExamQuestionViewResponse
  146. {
  147. QuestionType = m.Key,
  148. Questions = m.Select(n => new SimpleViewResponse
  149. {
  150. Id = n.QuestionId
  151. }).ToList()
  152. }).ToList();
  153. return result;
  154. }
  155. public async Task<List<GradingQuestionViewResponce>> GetGradingQuestionViewResponces(ExamQuestionGroupRequest examQuestionGroupRequest)
  156. {
  157. var expression = examQuestionGroupRequest.GetExpression();
  158. var examManageTable = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression);
  159. var testPaperItemTable = new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
  160. var queryable = await examManageTable.InnerJoin(testPaperItemTable, (e, i) => e.Id == i.ExamId)
  161. .Select((e, i) => i).ToListAsync();
  162. var examQuestionScores = await new ExamRepository<ExamQuestionScoreBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.ExamManageId == examQuestionGroupRequest.ExamId).ToListAsync();
  163. var userExamItemTable = _userExamItemRepository.Queryable();
  164. var userExamTable = _repository.Queryable().Where(x => x.ExamId == examQuestionGroupRequest.ExamId && x.UserId == examQuestionGroupRequest.UserId);
  165. var userExamItems = await userExamItemTable.InnerJoin(userExamTable, (i, u) => i.UserExamId == u.Id)
  166. .Select((i, u) => i).ToListAsync();
  167. var result = queryable.GroupBy(x => x.QuestionType).Select(m => new GradingQuestionViewResponce
  168. {
  169. QuestionType = m.Key,
  170. Questions = m.Select(n => new GradingExamViewResponse
  171. {
  172. IsCorrect = CheckCorrect(n, examQuestionScores, userExamItems),
  173. Id = userExamItems.FirstOrDefault(x => x.QuestionId == n.QuestionId)?.Id ?? n.Id
  174. }).ToList()
  175. }).ToList();
  176. return result;
  177. }
  178. private bool CheckCorrect(Exams.ExamManages.ExamQuestionBak n, List<ExamQuestionScoreBak> examQuestionScores, List<ExamUserExamItem> userExamItems)
  179. {
  180. var examQuestionScore = examQuestionScores.FirstOrDefault(x => x.QuestionType == n.QuestionType);
  181. var userItem = userExamItems.FirstOrDefault(x => x.QuestionId == n.QuestionId);
  182. if (userItem != null && examQuestionScore != null)
  183. {
  184. return userItem.Score == examQuestionScore.Score;
  185. }
  186. return false;
  187. }
  188. public async Task<PageViewResponse<UserExamResultViewResponse>> GetPagedListAsync(UserExamPagedRequest queryRequest)
  189. {
  190. SqlSugar.ISugarQueryable<UserExamResultViewResponse> queryable = GetQueryable(queryRequest);
  191. var list = await queryable.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
  192. var total = await queryable.CountAsync();
  193. var result = new UserExamResultPageViewResponse
  194. {
  195. Items = list,
  196. Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
  197. };
  198. return result;
  199. }
  200. public async Task<GradingExamQuestionDto> GradingAsync(GradingExtamItemDto gradingExtamItemDto, CancellationToken cancellationToken)
  201. {
  202. var userExamItem = await _userExamItemRepository.GetAsync(m => m.Id == gradingExtamItemDto.UserExamItemId);
  203. if (userExamItem != null)
  204. {
  205. userExamItem = _mapper.Map<GradingExtamItemDto, ExamUserExamItem>(gradingExtamItemDto, userExamItem);
  206. await _userExamItemRepository.ValidateUpdateAsync(userExamItem, cancellationToken);
  207. }
  208. return await GetNextExamQuestion(gradingExtamItemDto);
  209. }
  210. public async Task SubmitAsync(SubmitExamDto submitExamDto, CancellationToken cancellationToken)
  211. {
  212. var userExam = await _repository.GetAsync(x => x.Id == submitExamDto.Id);
  213. if (userExam != null)
  214. {
  215. userExam = _mapper.Map<SubmitExamDto, ExamUserExam>(submitExamDto, userExam);
  216. await _repository.ValidateUpdateAsync(userExam, cancellationToken);
  217. }
  218. }
  219. public async Task<StartExamViewResponse> ExamAsync(UpdateUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
  220. {
  221. var userExam = await new ExamRepository<ExamUserExam>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.Id == addUserExamItemDto.UserExamId).FirstAsync();
  222. var startExamViewResponse = await CheckExamValid(userExam);
  223. if (!startExamViewResponse.CheckValidate())
  224. {
  225. return startExamViewResponse;
  226. }
  227. var hasUserExamItem = _userExamItemRepository.Queryable().Where(x => x.UserExamId == addUserExamItemDto.UserExamId && x.QuestionId == addUserExamItemDto.QuestionId).Any();
  228. if (!hasUserExamItem)
  229. {
  230. await AddExamAsync(_userExamItemRepository, addUserExamItemDto, cancellationToken);
  231. }
  232. else
  233. {
  234. await UpdateExamAsync(_userExamItemRepository, addUserExamItemDto, cancellationToken);
  235. }
  236. await CalcuteExamItemScore(_userExamItemRepository, addUserExamItemDto, cancellationToken);
  237. return startExamViewResponse;
  238. }
  239. public async Task<StartExamViewResponse> StartUserExamAsync(StartUserExamDto startUserExamDto, CancellationToken cancellationToken)
  240. {
  241. var userExam = await _repository.GetAsync(x => x.Id == startUserExamDto.Id);
  242. if (userExam == null) return new StartExamViewResponse
  243. {
  244. IsJoin = false
  245. };
  246. if (userExam.StartTime == null)
  247. userExam.StartTime = DateTime.Now;
  248. var startExamViewResponse = await CheckExamValid(userExam);
  249. if (!startExamViewResponse.CheckValidate())
  250. {
  251. return startExamViewResponse;
  252. }
  253. userExam.ExamStatus = Share.Enums.Exams.EExamStatus.Executing;
  254. userExam.ToUpdate(_sessionContext);
  255. await _repository.UpdateWithValidateAsync(userExam, cancellationToken);
  256. var examManage = await new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).GetAsync(x => x.Id == userExam.ExamId);
  257. return new StartExamViewResponse
  258. {
  259. StartTime = userExam.StartTime,
  260. TimeSpan = examManage?.TimeSpan,
  261. IsCompleted = false
  262. };
  263. }
  264. private async Task<StartExamViewResponse> CheckExamValid(ExamUserExam examUserExam)
  265. {
  266. var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  267. var examManage = await examManageRepository.Queryable().Where(x => x.Id == examUserExam.ExamId).FirstAsync();
  268. var startExamViewResponse = new StartExamViewResponse
  269. {
  270. IsJoin = true,
  271. IsCompleted = false
  272. };
  273. if (examManage != null)
  274. {
  275. var examStrategyProxy = new ExamStrategyProxy();
  276. var examStrategys = new List<IExamStrategy>();
  277. startExamViewResponse = AddCheckStartTimeStrategy(examUserExam, examManage, startExamViewResponse, examStrategys);
  278. startExamViewResponse = AddCheckEndTimeStrategy(examUserExam, examManage, startExamViewResponse, examStrategys);
  279. startExamViewResponse = AddCheckValidateTimeStrategy(examUserExam, examManage, startExamViewResponse, examStrategys);
  280. startExamViewResponse = AddCheckValidateCountStrategy(examUserExam, examManage, startExamViewResponse, examStrategys);
  281. if (!examStrategyProxy.Validate())
  282. {
  283. return startExamViewResponse;
  284. }
  285. }
  286. startExamViewResponse.IsStart = true;
  287. return startExamViewResponse;
  288. }
  289. private StartExamViewResponse AddCheckValidateCountStrategy(ExamUserExam examUserExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
  290. {
  291. if (examManage.ExamType == Share.Enums.Exams.EExamType.Simulate)
  292. {
  293. var checkStartTime = new CheckValidateCountStrategy(1, 1)
  294. {
  295. CallBack = () =>
  296. {
  297. startExamViewResponse = new StartExamViewResponse
  298. {
  299. IsJoin = false,
  300. IsStart = false,
  301. IsCompleted = true
  302. };
  303. }
  304. };
  305. examStrategys.Add(checkStartTime);
  306. return startExamViewResponse;
  307. }
  308. else
  309. {
  310. var count = new ExamRepository<ExamUserExam>(_uow, _dataPermissionFilterBuilder, _serviceProvider).CountAsync(x => x.ExamId == examManage.Id && x.UserId == examUserExam.UserId).Result;
  311. var checkStartTime = new CheckValidateCountStrategy(examManage.Count, count)
  312. {
  313. CallBack = () =>
  314. {
  315. startExamViewResponse = new StartExamViewResponse
  316. {
  317. IsJoin = false,
  318. IsStart = false,
  319. IsCompleted = true
  320. };
  321. }
  322. };
  323. examStrategys.Add(checkStartTime);
  324. return startExamViewResponse;
  325. }
  326. }
  327. private StartExamViewResponse AddCheckValidateTimeStrategy(ExamUserExam examUserExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
  328. {
  329. if (examManage.ExamType == Share.Enums.Exams.EExamType.Simulate) return startExamViewResponse;
  330. var checkStartTime = new CheckValidateTimeStrategy(examManage.TimeSpan, examUserExam.StartTime)
  331. {
  332. CallBack = () =>
  333. {
  334. startExamViewResponse = new StartExamViewResponse
  335. {
  336. IsJoin = false,
  337. IsStart = false,
  338. IsCompleted = true
  339. };
  340. }
  341. };
  342. examStrategys.Add(checkStartTime);
  343. return startExamViewResponse;
  344. }
  345. private StartExamViewResponse AddCheckEndTimeStrategy(ExamUserExam examUserExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
  346. {
  347. if (examManage.ExamType == Share.Enums.Exams.EExamType.Simulate) return startExamViewResponse;
  348. var checkStartTime = new CheckEndTimeStrategy(examManage.EndTime, DateTime.Now)
  349. {
  350. CallBack = () =>
  351. {
  352. startExamViewResponse = new StartExamViewResponse
  353. {
  354. IsJoin = false,
  355. IsStart = false,
  356. IsCompleted = true
  357. };
  358. }
  359. };
  360. examStrategys.Add(checkStartTime);
  361. return startExamViewResponse;
  362. }
  363. private static StartExamViewResponse AddCheckStartTimeStrategy(ExamUserExam examUserExam, ExamManage examManage, StartExamViewResponse startExamViewResponse, List<IExamStrategy> examStrategys)
  364. {
  365. if (examManage.ExamType == Share.Enums.Exams.EExamType.Simulate) return startExamViewResponse;
  366. var checkStartTime = new CheckStartTimeStrategy(examManage.StartTime, examUserExam.StartTime)
  367. {
  368. CallBack = () =>
  369. {
  370. startExamViewResponse = new StartExamViewResponse
  371. {
  372. IsJoin = false,
  373. IsStart = false,
  374. IsCompleted = false
  375. };
  376. }
  377. };
  378. examStrategys.Add(checkStartTime);
  379. return startExamViewResponse;
  380. }
  381. public async Task CompleteGradingAsync(GradingExamDto gradingExtamDto, CancellationToken cancellationToken)
  382. {
  383. var userExam = await _repository.GetAsync(x => x.Id == gradingExtamDto.Id);
  384. if (userExam == null) return;
  385. var userExamItems = await _userExamItemRepository.Queryable().Where(x => x.UserExamId == gradingExtamDto.Id).ToListAsync();
  386. if (userExamItems != null)
  387. {
  388. var totalScore = userExamItems.Sum(x => x.Score);
  389. userExam.Score = totalScore;
  390. var examManage = await new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).GetAsync(x => x.Id == userExam.ExamId);
  391. userExam.IsSuccess = totalScore >= examManage.CutoffScore;
  392. userExam.ExamStatus = Share.Enums.Exams.EExamStatus.Complete;
  393. userExam.ToUpdate(_sessionContext);
  394. await _repository.ValidateUpdateAsync(userExam, cancellationToken);
  395. }
  396. }
  397. public async Task<List<GradingExamQuestionDto>> GetGradingExamQuestion(GradingExamRequest gradingExamRequest)
  398. {
  399. var expression = gradingExamRequest.GetExpression();
  400. var userExamTable = _repository.Queryable().Where(expression);
  401. var questionScoreRepository = new ExamRepository<ExamQuestionScoreBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  402. var userExamItemTable = _userExamItemRepository.Queryable();
  403. var userExamItemOptionTable = _userExamItemOptionRepository.Queryable();
  404. var examAnswerTable = new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
  405. var questionTable = new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
  406. var quesitonOptionTable = new ExamRepository<ExamQuestionOptionsBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
  407. var testPaperItemAnswerTable = new ExamRepository<ExamQuestionAnswerBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
  408. var questionScoreTable = questionScoreRepository.Queryable();
  409. var queryResult = await userExamTable.InnerJoin(userExamItemTable, (e, i) => e.Id == i.UserExamId)
  410. .InnerJoin(questionTable, (e, i, q) => i.QuestionId == q.Id)
  411. .LeftJoin(userExamItemOptionTable, (e, i, q, o) => i.Id == o.UserExamItemId)
  412. .LeftJoin(quesitonOptionTable, (e, i, q, o, qo) => o.QuestionOptionId == qo.Id)
  413. .LeftJoin(examAnswerTable, (e, i, q, o, qo, a) => i.Id == a.UserExamItemId)
  414. .LeftJoin(testPaperItemAnswerTable, (e, i, q, o, qo, a, ta) => ta.QuestionId == qo.QuestionId)
  415. .InnerJoin(questionScoreTable, (e, i, q, o, qo, a, ta, s) => q.QuestionType == s.QuestionType && e.ExamId == s.ExamManageId)
  416. .Where((e, i, q, o, qo, a, ta, s) => !q.QuestionType.CheckSelectType())
  417. .Select(
  418. (e, i, q, o, qo, a, ta, s) => new GradingExamQuestionTempDto
  419. {
  420. Id = i.Id,
  421. QuestionType = q.QuestionType,
  422. CorrectAnswer = ta != null ? ta.Answer : string.Empty,
  423. Answer = a != null ? a.Answer : string.Empty,
  424. Title = q.Title,
  425. QuestionOptionId = o.Id,
  426. UserExamItemId = i.Id,
  427. Content = qo.Content,
  428. Label = qo.Label,
  429. IsAnswer = qo.IsAnswer,
  430. IsSelected = o != null,
  431. Score = s.Score
  432. }
  433. ).ToListAsync();
  434. var gradingExamQuestionDtos = queryResult.GroupBy(x => new
  435. {
  436. Id = x.Id,
  437. QuestionType = x.QuestionType
  438. }).Select(g => new GradingExamQuestionDto
  439. {
  440. Answer = g.FirstOrDefault().Answer,
  441. QuestionType = g.Key.QuestionType,
  442. Id = g.Key.Id,
  443. Score = g.FirstOrDefault().Score,
  444. Title = g.FirstOrDefault().Title,
  445. CorrectAnswer = g.Key.QuestionType.CheckSelectType() ? string.Join(",", g.Where(i => i.IsAnswer).Select(n => n.Label)) : g.FirstOrDefault()?.CorrectAnswer
  446. }).ToList();
  447. return gradingExamQuestionDtos;
  448. }
  449. public async Task<GradingExamQuestionDto> ViewGradingExamQuestion(ViewGradingExamRequest viewGradingExamRequest)
  450. {
  451. var gradingExtamItemDto = _mapper.Map<ViewGradingExamRequest, GradingExtamItemDto>(viewGradingExamRequest);
  452. return await GetNextExamQuestion(gradingExtamItemDto);
  453. }
  454. public async Task<UnExamUserPageViewResponse> GetUnExamUsers(UnExamUserReportPagedRequest unExamUserReportPagedRequest)
  455. {
  456. unExamUserReportPagedRequest.ResoleEndTime();
  457. var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  458. var userRepository = new ExamRepository<User>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  459. var expression = unExamUserReportPagedRequest.GetExpression();
  460. var userExamExpression = unExamUserReportPagedRequest.GetUserExamExpression();
  461. var examManageTable = examManageRepository.Queryable().Where(expression);
  462. var userTable = userRepository.Queryable();
  463. var userExamTable = _repository.Queryable().Where(userExamExpression);
  464. var queryResult = userExamTable.InnerJoin(examManageTable, (ue, e) => ue.ExamId == e.Id)
  465. .InnerJoin(userTable, (ue, e, u) => ue.UserId == u.Id)
  466. .Select((ue, e, u) => new UnExamUserViewResponse
  467. {
  468. ExamName = e.Name,
  469. OrgName = u.Organization.Name,
  470. UserName = u.Name
  471. });
  472. var total = await queryResult.CountAsync();
  473. var items = await queryResult.ToPageListAsync(unExamUserReportPagedRequest.PageIndex, unExamUserReportPagedRequest.PageSize);
  474. return new UnExamUserPageViewResponse
  475. {
  476. Items = items,
  477. Pagination = new Pagination(unExamUserReportPagedRequest.PageIndex, unExamUserReportPagedRequest.PageSize, total)
  478. };
  479. }
  480. public async Task<UserExamResultPageViewResponse> GetUserExamResults(UserExamResultReportPagedRequest userExamResultReportPagedRequest)
  481. {
  482. userExamResultReportPagedRequest.ResoleEndTime();
  483. var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  484. var userRepository = new ExamRepository<User>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  485. var expression = userExamResultReportPagedRequest.GetExpression();
  486. var userExamExpression = userExamResultReportPagedRequest.GetUserExamExpression();
  487. var examManageTable = examManageRepository.Queryable().Where(expression);
  488. var userTable = userRepository.Queryable();
  489. var userExamTable = _repository.Queryable().Where(userExamExpression);
  490. var queryResult = userExamTable.InnerJoin(examManageTable, (ue, e) => ue.ExamId == e.Id)
  491. .InnerJoin(userTable, (ue, e, u) => ue.UserId == u.Id)
  492. .Select((ue, e, u) => new UserExamResultViewResponse
  493. {
  494. ExamName = e.Name,
  495. OrgName = u.Organization.Name,
  496. UserName = u.Name,
  497. TotalScore = e.TotalScore,
  498. CutoffScore = e.CutoffScore,
  499. Score = ue.Score ?? 0,
  500. });
  501. var total = await queryResult.CountAsync();
  502. var items = await queryResult.ToPageListAsync(userExamResultReportPagedRequest.PageIndex, userExamResultReportPagedRequest.PageSize);
  503. return new UserExamResultPageViewResponse
  504. {
  505. Items = items,
  506. Pagination = new Pagination(userExamResultReportPagedRequest.PageIndex, userExamResultReportPagedRequest.PageSize, total)
  507. };
  508. }
  509. #endregion
  510. #region private method
  511. private async Task CalcuteExamItemScore(IUserExamItemRepository userExamRepository, UpdateUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
  512. {
  513. if (!addUserExamItemDto.QuestionType.CheckSelectType()) return;
  514. var testPaperItemOptionsRepository = new ExamRepository<ExamQuestionOptionsBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  515. var examManageRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  516. var testPaperItemRepository = new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  517. var examQuestionScoreRepository = new ExamRepository<ExamQuestionScoreBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  518. var testPaperOptionsTable = testPaperItemOptionsRepository.Queryable().Where(x => x.QuestionId == addUserExamItemDto.QuestionId && x.IsAnswer);
  519. var testPaperItemTable = testPaperItemRepository.Queryable();
  520. var userExamTable = _repository.Queryable().Where(x => x.Id == addUserExamItemDto.UserExamId);
  521. var examManageTable = examManageRepository.Queryable();
  522. var testPaperOptionIds = await testPaperOptionsTable.InnerJoin(testPaperItemTable, (t, i) => t.ExamQuestionId == i.Id)
  523. .InnerJoin(examManageTable, (t, i, e) => i.ExamId == e.Id)
  524. .InnerJoin(userExamTable, (t, i, e, u) => e.Id == u.ExamId)
  525. .Select((t, i, e, u) => t.Id).ToListAsync();
  526. var isCorrect = addUserExamItemDto.UserExamItemOptionDtos.Select(x => x.QuestionOptionId).OrderBy(x => x).SequenceEqual(testPaperOptionIds.OrderBy(x => x));
  527. var userExamItem = await userExamRepository.GetAsync(x => x.UserExamId == addUserExamItemDto.UserExamId && x.QuestionId == addUserExamItemDto.QuestionId);
  528. var examQuesiontScores = await examQuestionScoreRepository.Queryable().Where(x => x.QuestionType == addUserExamItemDto.QuestionType)
  529. .InnerJoin(userExamTable, (e, u) => e.Id == u.ExamId)
  530. .Select((e, u) => e).ToListAsync();
  531. userExamItem.IsCheck = true;
  532. userExamItem.Score = isCorrect ? examQuesiontScores.FirstOrDefault()?.Score : 0;
  533. userExamItem.ToUpdate(_sessionContext);
  534. await userExamRepository.UpdateWithValidateAsync(userExamItem, cancellationToken);
  535. }
  536. private async Task AddExamAsync(IRepository<ExamUserExamItem> userExamItemRepository, AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
  537. {
  538. var userExamItem = await AddUserExamItem(addUserExamItemDto, cancellationToken);
  539. userExamItem.UserExamItemOptionses = await AddUserExamItemOptions(addUserExamItemDto, cancellationToken);
  540. userExamItem.ExamAnswers = await AddExamAnswer(addUserExamItemDto, userExamItem.Id, cancellationToken);
  541. await userExamItemRepository.AddNav(userExamItem)
  542. .Include(x => x.UserExamItemOptionses)
  543. .Include(x => x.ExamAnswers)
  544. .ExecuteCommandAsync();
  545. }
  546. private async Task UpdateExamAsync(IRepository<ExamUserExamItem> userExamItemRepository, UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
  547. {
  548. var userExamItem = await UpdateUserExamItem(updateUserExamItemDto, cancellationToken);
  549. userExamItem.UserExamItemOptionses = await ModifyUserItemOptions(updateUserExamItemDto, cancellationToken);
  550. userExamItem.ExamAnswers = await UpdateExamAnswer(updateUserExamItemDto, cancellationToken);
  551. await userExamItemRepository.UpdateNav(userExamItem)
  552. .Include(x => x.UserExamItemOptionses)
  553. .Include(x => x.ExamAnswers)
  554. .ExecuteCommandAsync();
  555. }
  556. private async Task<GradingExamQuestionDto> GetNextExamQuestion(GradingExtamItemDto gradingExtamItemDto)
  557. {
  558. // TODO: 获取未阅卷的第一道题
  559. var current = _userExamItemRepository.Queryable().Where(x => x.Id == gradingExtamItemDto.UserExamItemId);
  560. var userExamItemTable = _userExamItemRepository.Queryable().Where(x => !x.IsCheck);
  561. var userExamItem = current.InnerJoin(userExamItemTable, (c, u) => c.UserExamId == u.UserExamId).OrderBy((c, u) => c.SortIndex).First();
  562. if (userExamItem != null)
  563. {
  564. var testPaperItem = new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.Id == userExamItem.Id && !x.QuestionType.CheckSelectType()).First();
  565. if (testPaperItem == null) return null;
  566. var gradingExamQuestionDto = new GradingExamQuestionDto();
  567. gradingExamQuestionDto = _mapper.Map<Exams.ExamManages.ExamQuestionBak, GradingExamQuestionDto>(testPaperItem, gradingExamQuestionDto);
  568. var examAnswer = new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.UserExamItemId == userExamItem.Id).First();
  569. var testPaperItemAnswer = await new ExamRepository<ExamQuestionAnswerBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().FirstAsync(x => x.QuestionId == testPaperItem.QuestionId && x.ExamQuestionId == testPaperItem.Id);
  570. gradingExamQuestionDto.Answer = examAnswer.Answer ?? string.Empty;
  571. gradingExamQuestionDto.CorrectAnswer = testPaperItemAnswer != null ? testPaperItemAnswer.Answer ?? string.Empty : string.Empty;
  572. return gradingExamQuestionDto;
  573. }
  574. return null;
  575. }
  576. private async Task<List<ExamAnswer>> AddExamAnswer(AddUserExamItemDto addUserExamItemDto,string id, CancellationToken cancellationToken)
  577. {
  578. if (addUserExamItemDto.QuestionType.CheckSelectType()) return null;
  579. var examAnswers = new List<ExamAnswer>();
  580. var examAnswer = new ExamAnswer
  581. {
  582. UserId = _sessionContext.UserId,
  583. UserExamItemId = id,
  584. Answer = addUserExamItemDto.Answer
  585. };
  586. examAnswer.ToInsert(_sessionContext);
  587. await _examAnswerRepository.ValidateAddAsync(examAnswer, cancellationToken);
  588. return examAnswers;
  589. }
  590. private async Task<UserExamQuestionDto> GetNextExamQuestion(AddUserExamItemDto addUserExamItemDto)
  591. {
  592. // TODO: 获取未阅卷的第一道题
  593. var testPaperItemRepository = new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  594. var examRepository = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  595. var userExamTable = _repository.Queryable().Where(x => x.Id == addUserExamItemDto.UserExamId);
  596. var userExamItemTable = _userExamItemRepository.Queryable().WhereIF(addUserExamItemDto.QuestionId.IsNotNullOrEmpty(), x => x.QuestionId == addUserExamItemDto.QuestionId);
  597. var examTable = examRepository.Queryable();
  598. var testPaperItemTable = testPaperItemRepository.Queryable();
  599. var current = examTable.InnerJoin(testPaperItemTable, (e, t) => e.Id == t.ExamId)
  600. .InnerJoin(userExamTable, (e, t, u) => e.Id == u.ExamId)
  601. .InnerJoin(userExamItemTable, (e, t, u, i) => t.QuestionId == i.QuestionId).Select((e, t, u, i) => t);
  602. var nextTable = testPaperItemTable.InnerJoin(current, (t, c) => t.SortIndex > c.SortIndex).OrderBy((t, c) => t.SortIndex).Select((t, c) => t);
  603. var userExamItem = userExamItemTable.InnerJoin(nextTable, (u, n) => u.QuestionId == n.QuestionId).OrderBy((u, n) => u.SortIndex).Select((u, n) => u).First();
  604. if (userExamItem != null)
  605. {
  606. var question = testPaperItemRepository.Queryable().Where(x => x.Id == userExamItem.Id).First();
  607. if (question == null) return null;
  608. var userExamQuestionDto = new UserExamQuestionDto();
  609. userExamQuestionDto = _mapper.Map<Exams.ExamManages.ExamQuestionBak, UserExamQuestionDto>(question, userExamQuestionDto);
  610. if (question.QuestionType.CheckSelectType())
  611. {
  612. var userExamItemOptionTable = _userExamItemOptionRepository.Queryable().Where(x => x.UserExamItemId == userExamItem.Id);
  613. var quesitonOptionTable = new ExamRepository<ExamQuestionOptionsBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
  614. var queryResult = userExamItemOptionTable.InnerJoin(quesitonOptionTable, (u, q) => u.QuestionOptionId == q.Id)
  615. .Select((u, q) => new UserExamItemOptionDto
  616. {
  617. Content = q.Content,
  618. QuestionOptionId = u.QuestionOptionId,
  619. UserExamItemId = u.UserExamItemId
  620. });
  621. userExamQuestionDto.UserExamItemOptionDtos = queryResult.ToList();
  622. }
  623. else
  624. {
  625. var examAnswer = new ExamRepository<ExamAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.UserExamItemId == userExamItem.Id).First();
  626. userExamQuestionDto.Answer = examAnswer.Answer ?? string.Empty;
  627. }
  628. return userExamQuestionDto;
  629. }
  630. else
  631. {
  632. return null;
  633. }
  634. }
  635. private async Task<List<ExamAnswer>> UpdateExamAnswer(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
  636. {
  637. var examAnswerTable = _examAnswerRepository.Queryable();
  638. var userExamItemTable = _userExamItemRepository.Queryable().Where(x => x.Id == updateUserExamItemDto.Id);
  639. var examAnswer = await examAnswerTable.InnerJoin(userExamItemTable, (e, u) => e.UserExamItemId == u.Id).Select((e, u) => e).FirstAsync();
  640. if (!updateUserExamItemDto.QuestionType.CheckSelectType())
  641. {
  642. var examAnswers = new List<ExamAnswer>();
  643. if (examAnswer != null)
  644. {
  645. examAnswer.Answer = updateUserExamItemDto.Answer;
  646. examAnswer.UserId = _sessionContext.UserId;
  647. examAnswer.UserExamItemId = updateUserExamItemDto.Id;
  648. examAnswer.ToUpdate(_sessionContext);
  649. await _examAnswerRepository.ValidateUpdateAsync(examAnswer, cancellationToken);
  650. examAnswers.Add(examAnswer);
  651. }
  652. else
  653. {
  654. examAnswer = new ExamAnswer
  655. {
  656. Answer = updateUserExamItemDto.Answer,
  657. UserId = _sessionContext.UserId,
  658. UserExamItemId = updateUserExamItemDto.Id
  659. };
  660. examAnswer.ToInsert(_sessionContext);
  661. await _examAnswerRepository.ValidateAddAsync(examAnswer, cancellationToken);
  662. examAnswers.Add(examAnswer);
  663. }
  664. return examAnswers;
  665. }
  666. return null;
  667. }
  668. private async Task<List<ExamUserExamItemOptions>> ModifyUserItemOptions(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
  669. {
  670. if (updateUserExamItemDto.QuestionType.CheckSelectType())
  671. {
  672. var entityQuestionRequest = new EntityQueryRequest
  673. {
  674. Expression = ExpressionableUtility.CreateExpression<ExamUserExamItemOptions>()
  675. .AndIF(updateUserExamItemDto.Id.IsNotEmpty(), x => x.UserExamItemId == updateUserExamItemDto.Id).ToExpression()
  676. };
  677. await DeleteUserExamItemOptions(entityQuestionRequest, cancellationToken);
  678. //await UpdateUserItemOptions(updateUserExamItemDto, cancellationToken);
  679. var addUserExamItemDto = _mapper.Map<AddUserExamItemDto>(updateUserExamItemDto);
  680. addUserExamItemDto.UserExamItemOptionDtos = new List<AddUserExamItemOptionDto>();
  681. updateUserExamItemDto.UserExamItemOptionDtos.ForEach(item =>
  682. {
  683. addUserExamItemDto.UserExamItemOptionDtos.Add(_mapper.Map<AddUserExamItemOptionDto>(item));
  684. });
  685. return await AddUserExamItemOptions(addUserExamItemDto, cancellationToken);
  686. }
  687. return null;
  688. }
  689. private async Task UpdateUserItemOptions(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
  690. {
  691. if (updateUserExamItemDto.QuestionType.CheckSelectType())
  692. {
  693. var userExamItemOptions = await _userExamItemOptionRepository.Queryable().Where(x => x.UserExamItemId == updateUserExamItemDto.Id).ToListAsync();
  694. var entities = new List<ExamUserExamItemOptions>();
  695. if (updateUserExamItemDto.UserExamItemOptionDtos != null)
  696. {
  697. updateUserExamItemDto.UserExamItemOptionDtos.Where(m => m.OperationStatus == EEOperationStatus.Update).ToList().ForEach(x =>
  698. {
  699. var entity = userExamItemOptions.FirstOrDefault(m => m.Id == x.Id);
  700. if (entity != null)
  701. {
  702. entities.Add(_mapper.Map<UpdateUserExamItemOptionDto, ExamUserExamItemOptions>(x, entity));
  703. }
  704. });
  705. }
  706. entities.ToUpdate(_sessionContext);
  707. await _userExamItemOptionRepository.ValidateUpdateAsync(entities, cancellationToken);
  708. }
  709. }
  710. private async Task<ExamUserExamItem> UpdateUserExamItem(UpdateUserExamItemDto updateUserExamItemDto, CancellationToken cancellationToken)
  711. {
  712. var userExamItem = await _userExamItemRepository.GetAsync(x => x.UserExamId == updateUserExamItemDto.UserExamId && x.QuestionId == updateUserExamItemDto.QuestionId);
  713. userExamItem = _mapper.Map<UpdateUserExamItemDto, ExamUserExamItem>(updateUserExamItemDto, userExamItem);
  714. updateUserExamItemDto.Id = userExamItem.Id;
  715. userExamItem.ToUpdate(_sessionContext);
  716. await _userExamItemRepository.ValidateUpdateAsync(userExamItem, cancellationToken);
  717. if (updateUserExamItemDto.QuestionType.CheckSelectType())
  718. {
  719. if (updateUserExamItemDto.UserExamItemOptionDtos != null)
  720. {
  721. updateUserExamItemDto.UserExamItemOptionDtos.ForEach(x => x.UserExamItemId = updateUserExamItemDto.Id);
  722. }
  723. }
  724. return userExamItem;
  725. }
  726. private async Task<List<ExamUserExamItemOptions>> AddUserExamItemOptions(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
  727. {
  728. var userExamItemOptions = new List<ExamUserExamItemOptions>();
  729. if (addUserExamItemDto.QuestionType.CheckSelectType())
  730. {
  731. if (addUserExamItemDto.UserExamItemOptionDtos != null)
  732. {
  733. addUserExamItemDto.UserExamItemOptionDtos.ToList().ForEach(x =>
  734. {
  735. userExamItemOptions.Add(_mapper.Map<ExamUserExamItemOptions>(x));
  736. });
  737. }
  738. }
  739. userExamItemOptions.ToInsert(_sessionContext);
  740. await _userExamItemOptionRepository.ValidateAddAsync(userExamItemOptions, cancellationToken);
  741. return userExamItemOptions;
  742. }
  743. private async Task<ExamUserExamItem> AddUserExamItem(AddUserExamItemDto addUserExamItemDto, CancellationToken cancellationToken)
  744. {
  745. var userExamItem = _mapper.Map<ExamUserExamItem>(addUserExamItemDto);
  746. userExamItem.ToInsert(_sessionContext);
  747. await _userExamItemRepository.ValidateAddAsync(userExamItem, cancellationToken);
  748. if (addUserExamItemDto.QuestionType.CheckSelectType())
  749. {
  750. if (addUserExamItemDto.UserExamItemOptionDtos != null)
  751. {
  752. addUserExamItemDto.UserExamItemOptionDtos.ForEach(x => x.UserExamItemId = userExamItem.Id);
  753. }
  754. }
  755. return userExamItem;
  756. }
  757. private async Task DeleteUserExamItemOptions(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
  758. {
  759. await _userExamItemOptionRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
  760. }
  761. private SqlSugar.ISugarQueryable<UserExamResultViewResponse> GetQueryable(UserExamPagedRequest queryRequest)
  762. {
  763. if (_sessionContext.UserId != null)
  764. {
  765. queryRequest.UserId = _sessionContext.UserId;
  766. }
  767. var expression = queryRequest.GetExpression();
  768. var userExamTable = _repository.Queryable().Where(expression);
  769. var examManageExpression = queryRequest.GetExamManageExpression();
  770. var examManageTable = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(examManageExpression);
  771. var queryable = userExamTable.InnerJoin(examManageTable, (u, e) => u.ExamId == e.Id).Select((u, e) => new UserExamResultViewResponse
  772. {
  773. Id = u.Id,
  774. CutoffScore = e.CutoffScore,
  775. TotalScore = e.TotalScore,
  776. ExamName = e.Name,
  777. Score = u.Score ?? 0,
  778. Status = u.Status,
  779. SortIndex = u.SortIndex,
  780. ExamStatus = u.ExamStatus,
  781. IsSuccess = u.IsSuccess,
  782. EndTime = e.EndTime,
  783. StartTime = e.StartTime,
  784. TimeSpan = e.TimeSpan,
  785. ExamType = e.ExamType,
  786. ExamId = e.Id
  787. });
  788. return queryable;
  789. }
  790. #endregion
  791. }
  792. }