UserExamService.cs 47 KB

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