TrainTemplateService.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. using DocumentFormat.OpenXml.Office2010.Excel;
  2. using Exam.Infrastructure.Data.Entity;
  3. using Exam.Infrastructure.Enums;
  4. using Exam.Infrastructure.Extensions;
  5. using Exam.Insfrastructure.Service.Service;
  6. using Exam.Repository.Sqlsugar.Repositories;
  7. using Exam.Share.ViewResponses.Train;
  8. using Hotline.Application.Exam.Core.Constants;
  9. using Hotline.Application.Exam.Core.Extensions;
  10. using Hotline.Application.Exam.Core.Utilities;
  11. using Hotline.Application.Exam.Extensions;
  12. using Hotline.Application.Exam.Interface.Train;
  13. using Hotline.Application.Exam.QueryExtensions.Trains;
  14. using Hotline.Exams.Questions;
  15. using Hotline.Exams.TestPapers;
  16. using Hotline.Exams.Trains;
  17. using Hotline.Repository.SqlSugar;
  18. using Hotline.Repository.SqlSugar.DataPermissions;
  19. using Hotline.Repository.SqlSugar.Exam.Core.Constants;
  20. using Hotline.Repository.SqlSugar.Exam.Interfaces.Questions;
  21. using Hotline.Repository.SqlSugar.Exam.Interfaces.Trains;
  22. using Hotline.Repository.SqlSugar.Extensions;
  23. using Hotline.Repository.SqlSugar.Interface;
  24. using Hotline.Share.Dtos.Questions;
  25. using Hotline.Share.Dtos.Trains;
  26. using Hotline.Share.Requests.Train;
  27. using JiebaNet.Segmenter.Common;
  28. using MapsterMapper;
  29. using SqlSugar;
  30. using XF.Domain.Authentications;
  31. using XF.Domain.Dependency;
  32. namespace Hotline.Application.Exam.Service.Trains
  33. {
  34. public class TrainTemplateService : ApiService<ExamTrainTemplate, AddTrainTemplateDto, UpdateTrainTemplateDto, HotlineDbContext>, ITrainTemplateService, IScopeDependency
  35. {
  36. private readonly ITrainTemplateRepository _repository;
  37. private readonly ITrainKnowladgeRepository _trainKnowladgeRepository;
  38. private readonly ITrainPracticeRepository _trainPracticeRepository;
  39. private readonly ITrainPracticeOptionsRepository _trainPracticeOptionsRepository;
  40. private readonly ITrainPracticeSourcewareRepository _trainPracticeSourcewareRepository;
  41. private readonly ITrainPracticeKnowladgeRepository _trainPracticeKnowladgeRepository;
  42. private readonly IDataPermissionFilterBuilder _dataPermissionFilterBuilder;
  43. private readonly IServiceProvider _serviceProvider;
  44. private readonly ISessionContext _sessionContext;
  45. private readonly IMapper _mapper;
  46. private AddTrainTemplateDto _addTrainTemplateDto;
  47. public TrainTemplateService(ITrainTemplateRepository repository,
  48. ITrainKnowladgeRepository trainKnowladgeRepository,
  49. ITrainPracticeRepository trainPracticeRepository,
  50. ITrainPracticeOptionsRepository trainPracticeOptionsRepository,
  51. ITrainPracticeSourcewareRepository trainPracticeSourcewareRepository,
  52. ITrainPracticeKnowladgeRepository trainPracticeKnowladgeRepository,
  53. IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider,
  54. ISessionContext sessionContext,
  55. IMapper mapper) : base(repository, mapper)
  56. {
  57. _repository = repository;
  58. this._trainKnowladgeRepository = trainKnowladgeRepository;
  59. this._trainPracticeRepository = trainPracticeRepository;
  60. this._trainPracticeOptionsRepository = trainPracticeOptionsRepository;
  61. this._trainPracticeSourcewareRepository = trainPracticeSourcewareRepository;
  62. this._trainPracticeKnowladgeRepository = trainPracticeKnowladgeRepository;
  63. this._dataPermissionFilterBuilder = dataPermissionFilterBuilder;
  64. this._serviceProvider = serviceProvider;
  65. this._sessionContext = sessionContext;
  66. this._mapper = mapper;
  67. }
  68. #region public method
  69. public async Task<TrainTemplateDto> GetAsync(EntityQueryRequest entityQueryRequest)
  70. {
  71. var trainTemplate = await _repository.GetAsync(entityQueryRequest.Id);
  72. var trainTemplateDto = _mapper.Map<TrainTemplateDto>(trainTemplate);
  73. trainTemplateDto.TrainKnowladges = await GetKnowladges(entityQueryRequest);
  74. trainTemplateDto.TrainPracticeDtos = await GetTrainPractices(entityQueryRequest);
  75. return trainTemplateDto;
  76. }
  77. public async Task<(int, List<TrainTemplateViewResponse>)> GetListAsync(TrainTemplatePagedRequest queryRequest)
  78. {
  79. SqlSugar.ISugarQueryable<TrainTemplateViewResponse> queryResult = QueryRequest(queryRequest);
  80. var total = await queryResult.CountAsync();
  81. var items = await queryResult.ToListAsync();
  82. return (total, items);
  83. }
  84. public async Task<PageViewResponse<TrainTemplateViewResponse>> GetPagedListAsync(TrainTemplatePagedRequest queryRequest)
  85. {
  86. SqlSugar.ISugarQueryable<TrainTemplateViewResponse> queryResult = QueryRequest(queryRequest);
  87. var total = await queryResult.CountAsync();
  88. var items = await queryResult.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
  89. return new TrainTemplatePageViewResponse
  90. {
  91. Items = items,
  92. Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
  93. };
  94. }
  95. public override async Task<string> AddAsync(AddTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  96. {
  97. base.StartTran();
  98. actionRequest.Code = await GenerateCode(ExamBusiConstants.TrainTemplateCode,3);
  99. var id = await base.AddAsync(actionRequest, cancellationToken);
  100. ResolveTemplateId(actionRequest, id);
  101. base.Entity.TrainKnowladges = await AddTrainKnowladgesAsync(actionRequest, cancellationToken);
  102. base.Entity.TrainPractices = await AddTrainPracticesAsync(actionRequest, cancellationToken);
  103. var trainPracticeOptions = await AddTrainPracticeOptionsAsync(actionRequest, cancellationToken);
  104. var trainPracticeKnowladges = await AddTrainPracticeKnowladgeAsync(actionRequest, cancellationToken);
  105. base.Entity.TrainPractices.ForEach(item =>
  106. {
  107. item.TrainPracticeKnowladges = trainPracticeKnowladges.Where(x => item.Id == x.TrainPracticeId).ToList();
  108. });
  109. var trainPracticeSourcewares = await AddTrainPracticeSourcewareAsync(actionRequest, cancellationToken);
  110. base.Entity.TrainPractices.ForEach(item =>
  111. {
  112. item.TrainPracticeKnowladges = trainPracticeKnowladges.Where(x => item.Id == x.TrainPracticeId).ToList();
  113. item.TrainPracticeOptionses = trainPracticeOptions.Where(x => item.Id == x.TrainPracticeId).ToList();
  114. item.TrainPracticeSourcewares = trainPracticeSourcewares.Where(x => item.Id == x.TrainPracticeId).ToList();
  115. });
  116. await base.Complete(base.Entity, OperationConstant.Create);
  117. return id;
  118. }
  119. public override async Task UpdateAsync(UpdateTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  120. {
  121. base.StartTran();
  122. await base.UpdateAsync(actionRequest, cancellationToken);
  123. _addTrainTemplateDto = _mapper.Map<AddTrainTemplateDto>(actionRequest);
  124. base.Entity.TrainKnowladges = await ModifyTrainKnowladgeAsync(actionRequest, cancellationToken);
  125. base.Entity.TrainPractices = await ModifyTrainPracticesAsync(actionRequest, cancellationToken);
  126. var trainPracticeOptions = await ModifyTrainPracticeOptionsAsync(actionRequest, cancellationToken);
  127. var trainPracticeKnowladges = await ModifyTrainPracticeKnowladgeAsync(actionRequest, cancellationToken);
  128. var trainPracticeSourcewares = await ModifyTrainPracticeSourcewareAsync(actionRequest, cancellationToken);
  129. base.Entity.TrainPractices.ForEach(item =>
  130. {
  131. item.TrainPracticeOptionses = trainPracticeOptions.Where(x => item.Id == x.TrainPracticeId).ToList();
  132. item.TrainPracticeKnowladges = trainPracticeKnowladges.Where(x => item.Id == x.TrainPracticeId).ToList();
  133. item.TrainPracticeSourcewares = trainPracticeSourcewares.Where(x => item.Id == x.TrainPracticeId).ToList();
  134. });
  135. await base.Complete(base.Entity, OperationConstant.Update);
  136. }
  137. public override async Task DeleteAsync(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
  138. {
  139. await base.DeleteAsync(entityQueryRequest, cancellationToken);
  140. var tmpEntityQueryRequest = ExpressionableUtility.CreateExpression<ExamTrainKnowladge>()
  141. .AndIF(entityQueryRequest.Id.IsNotNullOrEmpty(), x => x.TrainTemplateId == entityQueryRequest.Id)
  142. .AndIF(entityQueryRequest.Ids.IsNotNullOrEmpty(), x => entityQueryRequest.Ids.Contains(x.TrainTemplateId))
  143. .ToEntityQueryRequest<ExamTrainKnowladge>();
  144. await DeleteTrainKnowladgesAsync(tmpEntityQueryRequest, cancellationToken);
  145. tmpEntityQueryRequest = ExpressionableUtility.CreateExpression<ExamTrainPractice>()
  146. .AndIF(entityQueryRequest.Id.IsNotNullOrEmpty(), x => x.TrainTemplateId == entityQueryRequest.Id)
  147. .AndIF(entityQueryRequest.Ids.IsNotNullOrEmpty(), x => entityQueryRequest.Ids.Contains(x.TrainTemplateId))
  148. .ToEntityQueryRequest<ExamTrainPractice>();
  149. await DeleteTrainPracticeAsync(tmpEntityQueryRequest, cancellationToken);
  150. }
  151. #endregion
  152. #region private method
  153. private async Task<List<TrainKnowladgeDto>> GetKnowladges(EntityQueryRequest entityQueryRequest)
  154. {
  155. var trainKnowladgeTable = _trainKnowladgeRepository.Queryable().Where(x => x.TrainTemplateId == entityQueryRequest.Id);
  156. var knowledgeTable = new ExamRepository<KnowledgeBase.Knowledge>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
  157. var queseryResult = trainKnowladgeTable.InnerJoin(knowledgeTable, (t, k) => t.KnowladgeId == k.Id).Select((t, k) => new TrainKnowladgeDto
  158. {
  159. Id = t.Id,
  160. KnowladgeId = t.KnowladgeId,
  161. Title = k.Title
  162. });
  163. return await queseryResult.ToListAsync();
  164. }
  165. private async Task<List<ExamTrainPracticeOptions>> ModifyTrainPracticeOptionsAsync(UpdateTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  166. {
  167. if (actionRequest.TrainPracticeDtos == null) return null;
  168. var questionIds = actionRequest.TrainPracticeDtos.Where(x => x.QuestionType.CheckSelectType()).Select(x => x.QuestionId).ToList();
  169. if (questionIds.IsNotNullOrEmpty())
  170. {
  171. var entityQueryRequest = new EntityQueryRequest
  172. {
  173. Expression = ExpressionableUtility.CreateExpression<ExamTrainPracticeOptions>()
  174. .AndIF(questionIds.IsNotNullOrEmpty(), x => questionIds.Contains(x.QuestionId)).ToExpression()
  175. };
  176. await DeleteTrainPracticeOptionsAsync(entityQueryRequest, cancellationToken);
  177. }
  178. return await AddTrainPracticeOptionsAsync(_addTrainTemplateDto, cancellationToken);
  179. }
  180. private async Task DeleteTrainPracticeOptionsAsync(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
  181. {
  182. await _trainPracticeOptionsRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
  183. }
  184. private async Task<List<ExamTrainPracticeSourceware>> AddTrainPracticeSourcewareAsync(AddTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  185. {
  186. var questionSourcewareRepository = new ExamRepository<ExamQuestionSourceware>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  187. var quesitonIds = actionRequest.TrainPracticeDtos.Select(x => x.QuestionId);
  188. var questionSourceware = await questionSourcewareRepository.Queryable().Where(x => quesitonIds.Contains(x.QuestionId)).ToListAsync();
  189. var trainPracticeSourcewares = new List<ExamTrainPracticeSourceware>();
  190. actionRequest.TrainPracticeDtos.Where(x => x.QuestionType.CheckSelectType()).ToList().ForEach(x =>
  191. {
  192. var options = questionSourceware.Where(n => x.QuestionId == n.QuestionId).ToList();
  193. if (options != null)
  194. {
  195. options.ForEach(item =>
  196. {
  197. var trainPracticeSourceware = _mapper.Map<ExamQuestionSourceware, ExamTrainPracticeSourceware>(item);
  198. trainPracticeSourceware.ToInsert(_sessionContext);
  199. trainPracticeSourcewares.Add(trainPracticeSourceware);
  200. });
  201. }
  202. });
  203. await _trainPracticeSourcewareRepository.ValidateAddAsync(trainPracticeSourcewares, cancellationToken);
  204. return trainPracticeSourcewares;
  205. }
  206. private async Task<List<ExamTrainPracticeKnowladge>> AddTrainPracticeKnowladgeAsync(AddTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  207. {
  208. var questionKnowladgeRepository = new ExamRepository<ExamQuestionKnowladge>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  209. var quesitonIds = actionRequest.TrainPracticeDtos.Select(x => x.QuestionId);
  210. var questionKnowladge = await questionKnowladgeRepository.Queryable().Where(x => quesitonIds.Contains(x.QuestionId)).ToListAsync();
  211. var trainPracticeKnowladges = new List<ExamTrainPracticeKnowladge>();
  212. actionRequest.TrainPracticeDtos.Where(x => x.QuestionType.CheckSelectType()).ToList().ForEach(x =>
  213. {
  214. var trainPractice = base.Entity?.TrainPractices.FirstOrDefault(n => n.QuestionId == x.QuestionId) ?? null;
  215. var options = questionKnowladge.Where(n => x.QuestionId == n.QuestionId).ToList();
  216. if (options != null)
  217. {
  218. options.ForEach(item =>
  219. {
  220. var trainPracticeKnowladge = _mapper.Map<ExamQuestionKnowladge, ExamTrainPracticeKnowladge>(item);
  221. trainPracticeKnowladge.TrainPracticeId = trainPractice?.Id;
  222. trainPracticeKnowladge.ToInsert(_sessionContext);
  223. trainPracticeKnowladges.Add(trainPracticeKnowladge);
  224. });
  225. }
  226. });
  227. await _trainPracticeKnowladgeRepository.ValidateAddAsync(trainPracticeKnowladges, cancellationToken);
  228. return trainPracticeKnowladges;
  229. }
  230. private async Task<List<ExamTrainPracticeSourceware>> ModifyTrainPracticeSourcewareAsync(UpdateTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  231. {
  232. if (actionRequest.TrainPracticeDtos == null) return null;
  233. var questionIds = actionRequest.TrainPracticeDtos.Where(x => x.QuestionType.CheckSelectType()).Select(x => x.QuestionId).ToList();
  234. if (questionIds.IsNotNullOrEmpty())
  235. {
  236. var entityQueryRequest = new EntityQueryRequest
  237. {
  238. Expression = ExpressionableUtility.CreateExpression<ExamTrainPracticeSourceware>()
  239. .AndIF(questionIds.IsNotNullOrEmpty(), x => questionIds.Contains(x.QuestionId)).ToExpression()
  240. };
  241. await DeleteTrainPracticeSourcewareAsync(entityQueryRequest, cancellationToken);
  242. }
  243. return await AddTrainPracticeSourcewareAsync(_addTrainTemplateDto, cancellationToken);
  244. }
  245. private async Task DeleteTrainPracticeSourcewareAsync(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
  246. {
  247. await _trainPracticeSourcewareRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
  248. }
  249. private async Task<List<ExamTrainPracticeKnowladge>> ModifyTrainPracticeKnowladgeAsync(UpdateTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  250. {
  251. if (actionRequest.TrainPracticeDtos == null) return null;
  252. var questionIds = actionRequest.TrainPracticeDtos.Where(x => x.QuestionType.CheckSelectType()).Select(x => x.QuestionId).ToList();
  253. if (questionIds.IsNotNullOrEmpty())
  254. {
  255. var entityQueryRequest = new EntityQueryRequest
  256. {
  257. Expression = ExpressionableUtility.CreateExpression<ExamTrainPracticeKnowladge>()
  258. .AndIF(questionIds.IsNotNullOrEmpty(), x => questionIds.Contains(x.QuestionId)).ToExpression()
  259. };
  260. await DeleteTrainPracticeKnowladgeAsync(entityQueryRequest, cancellationToken);
  261. }
  262. return await AddTrainPracticeKnowladgeAsync(_addTrainTemplateDto, cancellationToken);
  263. }
  264. private async Task DeleteTrainPracticeKnowladgeAsync(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
  265. {
  266. await _trainPracticeKnowladgeRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
  267. }
  268. private async Task<List<ExamTrainPracticeOptions>> AddTrainPracticeOptionsAsync(AddTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  269. {
  270. var questionOptionRepository = new ExamRepository<ExamQuestionOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
  271. var quesitonIds = actionRequest.TrainPracticeDtos.Select(x => x.QuestionId);
  272. var questionOptions = await questionOptionRepository.Queryable().Where(x => quesitonIds.Contains(x.QuestionId)).ToListAsync();
  273. var trainPracticeOptions = new List<ExamTrainPracticeOptions>();
  274. actionRequest.TrainPracticeDtos.Where(x => x.QuestionType.CheckSelectType()).ToList().ForEach(x =>
  275. {
  276. var trainPractice = base.Entity?.TrainPractices.FirstOrDefault(n => n.QuestionId == x.QuestionId) ?? null;
  277. var options = questionOptions.Where(n => x.QuestionId == n.QuestionId).ToList();
  278. if (options != null)
  279. {
  280. options.ForEach(item =>
  281. {
  282. var trainPracticeOption = _mapper.Map<ExamQuestionOptions, ExamTrainPracticeOptions>(item);
  283. trainPracticeOption.TrainPracticeId = trainPractice?.Id;
  284. trainPracticeOption.QuestionOptionId = item.Id;
  285. trainPracticeOption.ToInsert(_sessionContext);
  286. trainPracticeOptions.Add(trainPracticeOption);
  287. });
  288. }
  289. });
  290. await _trainPracticeOptionsRepository.ValidateAddAsync(trainPracticeOptions, cancellationToken);
  291. return trainPracticeOptions;
  292. }
  293. private void ResolveTemplateId(AddTrainTemplateDto actionRequest, string id)
  294. {
  295. if (actionRequest.TrainKnowladges != null)
  296. {
  297. actionRequest.TrainKnowladges.ForEach(x => x.TrainTemplateId = id);
  298. }
  299. if (actionRequest.TrainPracticeDtos != null)
  300. {
  301. actionRequest.TrainPracticeDtos.ForEach(x => x.TrainTemplateId = id);
  302. }
  303. }
  304. private async Task<List<TrainPracticeDto>> GetTrainPractices(EntityQueryRequest entityQueryRequest)
  305. {
  306. var questionTable = new ExamRepository<ExamQuestion>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
  307. var trainPracticeTable = _trainPracticeRepository.Queryable().Where(x => x.TrainTemplateId == entityQueryRequest.Id);
  308. var trainPractices = trainPracticeTable.InnerJoin(questionTable, (t, q) => t.QuestionId == q.Id).Select((t, q) => new TrainPracticeDto
  309. {
  310. Id = t.Id,
  311. QuestionId = t.QuestionId,
  312. QuestionType = q.QuestionType,
  313. DifficultyLevel = q.DifficultyLevel,
  314. Title = q.Title
  315. });
  316. return await trainPractices.ToListAsync();
  317. }
  318. private SqlSugar.ISugarQueryable<TrainTemplateViewResponse> QueryRequest(TrainTemplatePagedRequest queryRequest)
  319. {
  320. var expression = queryRequest.GetExpression();
  321. var queryable = _repository.Queryable().Where(expression);
  322. var queryResult = queryable.Select(m => new TrainTemplateViewResponse
  323. {
  324. Id = m.Id,
  325. Code = m.Code,
  326. Name = m.Name,
  327. IsContainsPractice = m.IsContainsPractice,
  328. SortIndex = m.SortIndex,
  329. Status = m.Status,
  330. CreationTime = m.CreationTime,
  331. CreatorName = m.CreatorName,
  332. CreatorOrgName = m.CreatorOrgName
  333. });
  334. return queryResult;
  335. }
  336. private async Task<List<ExamTrainPractice>> AddTrainPracticesAsync(AddTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  337. {
  338. if (actionRequest.TrainPracticeDtos != null)
  339. {
  340. actionRequest.TrainPracticeDtos.ResolveOperationStatus();
  341. var trainPracticeDtos = actionRequest.TrainPracticeDtos.Where(x => x.OperationStatus == EEOperationStatus.Add).ToList();
  342. var trainPractices = _mapper.Map<List<ExamTrainPractice>>(trainPracticeDtos);
  343. //TODO:排序
  344. var sortIndex = 0;
  345. trainPractices.ForEach(x =>
  346. {
  347. x.SortIndex = sortIndex + 1;
  348. });
  349. trainPractices.ToInsert(_sessionContext);
  350. await _trainPracticeRepository.ValidateAddAsync(trainPractices, cancellationToken);
  351. return trainPractices;
  352. }
  353. return null;
  354. }
  355. private async Task<List<ExamTrainKnowladge>> AddTrainKnowladgesAsync(AddTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  356. {
  357. if (actionRequest.TrainKnowladges != null)
  358. {
  359. actionRequest.TrainKnowladges.ResolveOperationStatus();
  360. var trainKnowladgeDtos = actionRequest.TrainKnowladges.Where(x => x.OperationStatus == EEOperationStatus.Add).ToList();
  361. var trainKnowladges = _mapper.Map<List<ExamTrainKnowladge>>(trainKnowladgeDtos);
  362. trainKnowladges.ToInsert(_sessionContext);
  363. await _trainKnowladgeRepository.ValidateAddAsync(trainKnowladges, cancellationToken);
  364. return trainKnowladges;
  365. }
  366. return null;
  367. }
  368. private async Task<List<ExamTrainPractice>> ModifyTrainPracticesAsync(UpdateTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  369. {
  370. var trainPractices = new List<ExamTrainPractice>();
  371. trainPractices.AddRangeExt(await AddTrainPracticesAsync(_addTrainTemplateDto, cancellationToken));
  372. trainPractices.AddRangeExt(await UpdateTrainPracticesAsync(actionRequest, cancellationToken));
  373. if (actionRequest.TrainPracticeDtos != null)
  374. {
  375. var ids = actionRequest.TrainPracticeDtos.Where(x => x.OperationStatus == EEOperationStatus.Delete).Select(x => x.Id).ToList();
  376. if (ids.IsNotNullOrEmpty())
  377. {
  378. var entityQueryRequest = new EntityQueryRequest
  379. {
  380. Expression = ExpressionableUtility.CreateExpression<ExamTrainPractice>()
  381. .AndIF(ids.IsNotEmpty(), x => ids.Contains(x.Id))
  382. .ToExpression()
  383. };
  384. await DeleteTrainPracticeAsync(entityQueryRequest, cancellationToken);
  385. }
  386. }
  387. return trainPractices;
  388. }
  389. private async Task DeleteTrainPracticeAsync(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
  390. {
  391. await _trainPracticeRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
  392. }
  393. private async Task<List<ExamTrainPractice>> UpdateTrainPracticesAsync(UpdateTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  394. {
  395. if (actionRequest.TrainPracticeDtos == null) return null;
  396. actionRequest.TrainPracticeDtos.ResolveOperationStatus();
  397. var trainPracticeDtos = actionRequest.TrainPracticeDtos.Where(x => x.OperationStatus == EEOperationStatus.Update).ToList();
  398. var ids = trainPracticeDtos.Select(x => x.Id);
  399. var trainPractices = await _trainPracticeRepository.Queryable().Where(x => ids.Contains(x.Id)).ToListAsync();
  400. trainPractices = _mapper.Map<List<UpdateTrainPracticeDto>, List<ExamTrainPractice>>(trainPracticeDtos, trainPractices);
  401. trainPractices.ToUpdate(_sessionContext);
  402. await _trainPracticeRepository.ValidateUpdateAsync(trainPractices, cancellationToken);
  403. return trainPractices;
  404. }
  405. private async Task<List<ExamTrainKnowladge>> ModifyTrainKnowladgeAsync(UpdateTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  406. {
  407. var trainKnowladges = new List<ExamTrainKnowladge>();
  408. trainKnowladges.AddRangeExt(await AddTrainKnowladgesAsync(_addTrainTemplateDto, cancellationToken));
  409. trainKnowladges.AddRangeExt(await UpdateTrainKnowladgesAsync(actionRequest, cancellationToken));
  410. if (actionRequest.TrainKnowladges != null)
  411. {
  412. var ids = actionRequest.TrainKnowladges.Where(x => x.OperationStatus == EEOperationStatus.Delete).Select(x => x.Id).ToList();
  413. if (ids.IsNotNullOrEmpty())
  414. {
  415. var entityQueryRequest = new EntityQueryRequest
  416. {
  417. Expression = ExpressionableUtility.CreateExpression<ExamTrainKnowladge>()
  418. .AndIF(ids.IsNotEmpty(), x => ids.Contains(x.Id))
  419. .ToExpression()
  420. };
  421. await DeleteTrainKnowladgesAsync(entityQueryRequest, cancellationToken);
  422. }
  423. }
  424. return trainKnowladges;
  425. }
  426. private async Task DeleteTrainKnowladgesAsync(EntityQueryRequest entityQueryRequest, CancellationToken cancellationToken)
  427. {
  428. await _trainKnowladgeRepository.DeleteWithValidateAsync(entityQueryRequest, cancellationToken);
  429. }
  430. private async Task<List<ExamTrainKnowladge>> UpdateTrainKnowladgesAsync(UpdateTrainTemplateDto actionRequest, CancellationToken cancellationToken)
  431. {
  432. if (actionRequest.TrainKnowladges == null) return null;
  433. actionRequest.TrainKnowladges.ResolveOperationStatus();
  434. var trainKnowladgeDtos = actionRequest.TrainKnowladges.Where(x => x.OperationStatus == EEOperationStatus.Update).ToList();
  435. var ids = trainKnowladgeDtos.Select(x => x.Id);
  436. var trainKnowladges = await _trainKnowladgeRepository.Queryable().Where(x => ids.Contains(x.Id)).ToListAsync();
  437. trainKnowladges = _mapper.Map<List<UpdateTrainKnowladgeDto>, List<ExamTrainKnowladge>>(trainKnowladgeDtos, trainKnowladges);
  438. trainKnowladges.ToUpdate(_sessionContext);
  439. await _trainKnowladgeRepository.ValidateUpdateAsync(trainKnowladges, cancellationToken);
  440. return trainKnowladges;
  441. }
  442. private async Task<string> GenerateCode(string codePrefix, int length)
  443. {
  444. var trainTemplate = await _repository.Queryable().Where(x => x.CreationTime.Date == DateTime.Now.Date).OrderByDescending(x=>x.CreationTime).FirstAsync();
  445. var code = string.Empty;
  446. if (trainTemplate != null)
  447. {
  448. code = trainTemplate.Code;
  449. }
  450. code = CodeUtility.GenerateCode(codePrefix,length,code);
  451. return code;
  452. }
  453. #endregion
  454. #region protected method
  455. protected override async Task CompleteAdd(ExamTrainTemplate entity)
  456. {
  457. await base.AddNav(entity)
  458. .Include(x => x.TrainKnowladges)
  459. .Include(x => x.TrainPractices)
  460. .ThenInclude(x => x.TrainPracticeKnowladges)
  461. .Include(x => x.TrainPractices, new InsertNavOptions
  462. {
  463. OneToManyIfExistsNoInsert = true
  464. })
  465. .ThenInclude(x => x.TrainPracticeOptionses)
  466. .Include(x => x.TrainPractices, new InsertNavOptions
  467. {
  468. OneToManyIfExistsNoInsert = true
  469. })
  470. .ThenInclude(x => x.TrainPracticeSourcewares).ExecuteCommandAsync();
  471. }
  472. protected override async Task CompleteUpdate(ExamTrainTemplate entity)
  473. {
  474. await base.UpdateNav(entity)
  475. .Include(x => x.TrainKnowladges)
  476. .Include(x => x.TrainPractices)
  477. .ThenInclude(x => x.TrainPracticeKnowladges)
  478. .Include(x => x.TrainPractices, new UpdateNavOptions
  479. {
  480. OneToManyInsertOrUpdate = true
  481. })
  482. .ThenInclude(x => x.TrainPracticeOptionses)
  483. .Include(x => x.TrainPractices, new UpdateNavOptions
  484. {
  485. OneToManyInsertOrUpdate = true
  486. })
  487. .ThenInclude(x => x.TrainPracticeSourcewares).ExecuteCommandAsync();
  488. }
  489. #endregion
  490. }
  491. }