//-------------------------------------------------------------------- // 此代码由T4模板自动生成 byzhouhang 20210918 // 生成时间 2023-06-15 15:06:06 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 //-------------------------------------------------------------------- using IRaCIS.Core.Application.Interfaces; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infra.EFCore.Common; using MassTransit; using Microsoft.AspNetCore.Mvc; namespace IRaCIS.Core.Application.Service { /// /// 临床数据问题 /// [ApiExplorerSettings(GroupName = "Reading")] public class ClinicalQuestionService(IRepository _trialClinicalQuestionRepository, IRepository _systemClinicalQuestionRepository, IRepository _systemClinicalTableQuestionRepository, IRepository _trialClinicalTableQuestionRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IClinicalQuestionService { /// /// 获取问题计算关系 /// /// /// [HttpPost] public async Task> GetTrialClinicalQuestionCalculateRelation(GetTrialClinicalQuestionCalculateRelationInDto inDto) { var result = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId) .Where(x => x.ClinicalQuestionType == "number") .Where(x => x.CustomCalculateMark != null && x.CustomCalculateMark > ClinicalCalculateMark.None) .Select(x => new GetTrialClinicalQuestionCalculateRelationOutDto() { QuestionId = x.Id, QuestionName = x.QuestionName, CustomCalculateMark = x.CustomCalculateMark, CalculateQuestionList = x.CalculateQuestionList, }).ToListAsync(); result = result.Where(x => x.CalculateQuestionList.Count() > 0).ToList(); return result; } /// /// 获取计算问题 /// /// /// [HttpPost] public async Task> GetClinicalCalculateQuestions(GetClinicalCalculateQuestionsInDto inDto) { var result = await _trialClinicalQuestionRepository .Where(x => x.TrialClinicalId == inDto.TrialClinicalId) .WhereIf(!inDto.ClinicalQuestionType.IsNullOrEmpty(), x => x.ClinicalQuestionType == inDto.ClinicalQuestionType) .OrderBy(x => x.ShowOrder) .Select(x => new GetClinicalCalculateQuestionsOutDto () { QuestionId = x.Id, QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us) }).ToListAsync(); var tablequestion = await _trialClinicalTableQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId && x.ClinicalTableQuestionType == "number").Select(x => new { TableQuestionId = x.Id, QuestionId = x.QuestionId, QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us) }).ToListAsync(); result.ForEach(x => { x.TableQuestions = tablequestion.Where(y => x.QuestionId == y.QuestionId).Select(y => new CalculateQuestion() { QuestionId = y.QuestionId, QuestionName = y.QuestionName }).ToList(); }); return result; } /// /// 获取系统临床数据预览 /// /// /// [HttpPost] public async Task<(List, bool)> GetSystemClinicalQuestionPreview(GetSystemClinicalQuestionPreviewDto inDto) { var questions = await _systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); if (_userInfo.IsEn_Us) { questions.ForEach(x => { x.GroupName = x.GroupEnName; x.QuestionName = x.QuestionEnName; }); } var tableQuestions = await _systemClinicalTableQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); if (_userInfo.IsEn_Us) { tableQuestions.ForEach(x => { x.QuestionName = x.QuestionEnName; }); } questions.ForEach(x => x.CreateTime = null); var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList(); result.ForEach(x => { FindChildQuestion(x, questions, tableQuestions, new List(), new List()); }); return (result, true); } /// /// 获取项目临床数据预览 /// /// /// [HttpPost] public async Task<(List, bool)> GetTrialClinicalQuestionPreview(GetTrialClinicalQuestionPreviewDto inDto) { var questions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); if (_userInfo.IsEn_Us) { questions.ForEach(x => { x.GroupName = x.GroupEnName; x.QuestionName = x.QuestionEnName; }); } var tableQuestions = await _trialClinicalTableQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); if (_userInfo.IsEn_Us) { tableQuestions.ForEach(x => { x.QuestionName = x.QuestionEnName; }); } questions.ForEach(x => x.CreateTime = null); var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).OrderBy(x => x.ShowOrder).ToList(); result.ForEach(x => { FindChildQuestion(x, questions, tableQuestions, new List(), new List()); }); return (result, true); } /// /// 获取子元素 /// /// /// /// /// /// public void FindChildQuestion(ClinicalQuestionPreviewDto item, List questions, List tableQuestions, List answers, List tableAnswers) { item.Childrens = questions.Where(x => (x.ParentId == item.Id) || (x.GroupId == item.Id && x.ParentId == null)).OrderBy(x => x.ShowOrder).ToList(); item.RelationQuestions = questions.Where(x => x.RelevanceId == item.Id).ToList(); item.Answer = answers.Where(x => x.QuestionId == item.Id).Select(x => x.Answer).FirstOrDefault() ?? string.Empty; var tableIndexs = tableAnswers.Where(x => x.QuestionId == item.Id).Select(x => x.RowIndex).Distinct().OrderBy(x => x).ToList(); item.TableAnswer = new List>(); tableIndexs.ForEach(x => { item.TableAnswer.Add(tableAnswers.Where(y => y.RowIndex == x).ToDictionary(y => y.TableQuestionId, y => y.Answer)); }); item.TableQuestions = tableQuestions.Where(x => x.QuestionId == item.Id).OrderBy(x => x.ShowOrder).OrderBy(x => x.ShowOrder).ToList(); item.RelationQuestions.ForEach(x => { FindChildQuestion(x, questions, tableQuestions, answers, tableAnswers); }); item.Childrens.ForEach(x => { FindChildQuestion(x, questions, tableQuestions, answers, tableAnswers); }); } #region 项目问题 /// /// 获取项目临床问题 /// /// /// [HttpPost] public async Task> GetTrialClinicalQuestionList(TrialClinicalQuestionQuery inQuery) { var trialClinicalQuestionQueryable = _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inQuery.TrialClinicalId) .WhereIf(!inQuery.QuestionName.IsNullOrEmpty(), x => x.QuestionName.Contains(inQuery.QuestionName) || x.QuestionEnName.Contains(inQuery.QuestionName)) .ProjectTo(_mapper.ConfigurationProvider); var pageList = await trialClinicalQuestionQueryable .ToPagedListAsync(inQuery, nameof(TrialClinicalQuestion.ShowOrder)); return pageList; } /// /// 新增或者修改项目临床问题 /// /// /// [HttpPost] public async Task AddOrUpdateTrialClinicalQuestion(TrialClinicalQuestionDto inDto) { if (inDto.IsVerify) { if (await _trialClinicalQuestionRepository.AnyAsync(x => x.TrialClinicalId == inDto.TrialClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) { return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"], string.Empty, ApiResponseCodeEnum.NeedTips); } } if (await _trialClinicalQuestionRepository.AnyAsync(x => x.TrialClinicalId == inDto.TrialClinicalId && x.Id != inDto.Id && x.ShowOrder == inDto.ShowOrder)) { return ResponseOutput.NotOk("问题序号存在重复!"); } if (await _trialClinicalQuestionRepository.AnyAsync(x => x.TrialClinicalId == inDto.TrialClinicalId && x.Id != inDto.Id && x.IsCheckDate == inDto.IsCheckDate && inDto.IsCheckDate)) { return ResponseOutput.NotOk("已经添加过类型为检查日期的问题!"); } var entity = await _trialClinicalQuestionRepository.InsertOrUpdateAsync(inDto, true); return ResponseOutput.Ok(entity.Id.ToString()); } /// /// 删除项目临床数据问题 /// /// /// [HttpPost("{id:guid}")] public async Task DeleteTrialClinicalQuestion(Guid id) { var success = await _trialClinicalQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true); return ResponseOutput.Ok(); } /// /// 获取项目问题分组 /// /// /// [HttpPost] public async Task> GetTrialClinicalGroupQuestionList(GetTrialGroupDto inDto) { return await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId && x.ClinicalQuestionType == "group") .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } /// /// 获取项目标准其他问题 /// /// /// [HttpPost] public async Task> GetTrialClinicalOtherQuestionList(GetTrialGroupDto inDto) { var types = new List() { "select","radio" }; return await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId && types.Contains(x.ClinicalQuestionType)) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } #endregion #region 系统问题 /// /// 获取系统临床问题 /// /// /// [HttpPost] public async Task> GetSystemClinicalQuestionList(SystemClinicalQuestionQuery inQuery) { var systemClinicalQuestionQueryable = _systemClinicalQuestionRepository .Where(x => x.SystemClinicalId == inQuery.SystemClinicalId) .WhereIf(!inQuery.QuestionName.IsNullOrEmpty(), x => x.QuestionName.Contains(inQuery.QuestionName) || x.QuestionEnName.Contains(inQuery.QuestionName)) .ProjectTo(_mapper.ConfigurationProvider); var pageList = await systemClinicalQuestionQueryable .ToPagedListAsync(inQuery, nameof(SystemClinicalQuestion.ShowOrder)); return pageList; } /// /// 新增或者修改系统临床问题 /// /// /// [HttpPost] public async Task AddOrUpdateSystemClinicalQuestion(SystemClinicalQuestionDto inDto) { if (inDto.IsVerify) { if (await _systemClinicalQuestionRepository.AnyAsync(x => x.SystemClinicalId == inDto.SystemClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) { return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"], string.Empty, ApiResponseCodeEnum.NeedTips); } } if (await _systemClinicalQuestionRepository.AnyAsync(x => x.SystemClinicalId == inDto.SystemClinicalId && x.Id != inDto.Id && x.ShowOrder == inDto.ShowOrder)) { return ResponseOutput.NotOk("问题序号存在重复!"); } if (await _systemClinicalQuestionRepository.AnyAsync(x => x.SystemClinicalId == inDto.SystemClinicalId && x.Id != inDto.Id && x.IsCheckDate == inDto.IsCheckDate && inDto.IsCheckDate)) { return ResponseOutput.NotOk("已经添加过类型为检查日期的问题!"); } var entity = await _systemClinicalQuestionRepository.InsertOrUpdateAsync(inDto, true); return ResponseOutput.Ok(entity.Id.ToString()); } /// /// 删除系统临床数据问题 /// /// /// [HttpPost("{id:guid}")] public async Task DeleteSystemClinicalQuestion(Guid id) { var success = await _systemClinicalQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true); return ResponseOutput.Ok(); } /// /// 获取系统问题分组 /// /// /// [HttpPost] public async Task> GetSystemClinicalGroupQuestionList(GetSystemGroupDto inDto) { return await _systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId && x.ClinicalQuestionType == "group") .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } /// /// 获取系统其他问题 /// /// /// [HttpPost] public async Task> GetSystemClinicalOtherQuestionList(GetSystemGroupDto inDto) { var types = new List() { "select","radio" }; return await _systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId && types.Contains(x.ClinicalQuestionType)) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } #endregion #region 系统表格问题 /// /// 获取系统表格问题 /// /// /// [HttpPost] public async Task> GetSystemClinicalTableQuestionList(SystemClinicalTableQuestionQuery inQuery) { var systemClinicalTableQuestionQueryable = _systemClinicalTableQuestionRepository .Where(x => x.QuestionId == inQuery.QuestionId) .ProjectTo(_mapper.ConfigurationProvider); var pageList = await systemClinicalTableQuestionQueryable.ToPagedListAsync(inQuery, nameof(SystemClinicalTableQuestion.ShowOrder)); return pageList; } /// /// 新增或修改系统表格问题 /// /// /// [HttpPost] public async Task AddOrUpdateSystemClinicalTableQuestion(SystemClinicalTableQuestionDto inDto) { if (inDto.IsVerify) { if (await _systemClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) { return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"], string.Empty, ApiResponseCodeEnum.NeedTips); } } if (await _systemClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.ShowOrder == inDto.ShowOrder)) { return ResponseOutput.NotOk("问题序号存在重复!"); } var entity = await _systemClinicalTableQuestionRepository.InsertOrUpdateAsync(inDto, true); return ResponseOutput.Ok(entity.Id.ToString()); } /// /// 删除系统表格问题 /// /// /// [HttpPost("{id:guid}")] public async Task DeleteSystemClinicalTableQuestion(Guid id) { var success = await _systemClinicalTableQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true); return ResponseOutput.Ok(); } /// /// 获取系统其他表格问题 /// /// /// [HttpPost] public async Task> GetSystemClinicalOtherTableQuestionList(GetClinicalOtherTableQuestionListInDto inDto) { var types = new List() { "select","radio" }; return await _systemClinicalTableQuestionRepository.Where(x => x.QuestionId == inDto.QuestionId && types.Contains(x.ClinicalTableQuestionType)) .Where(x => x.Id != inDto.TableQuestionId) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } #endregion #region 项目表格问题 /// /// 获取项目其他表格问题 /// /// /// [HttpPost] public async Task> GetTrialClinicalOtherTableQuestionList(GetClinicalOtherTableQuestionListInDto inDto) { var types = new List() { "select","radio" }; return await _trialClinicalTableQuestionRepository.Where(x => x.QuestionId == inDto.QuestionId && types.Contains(x.ClinicalTableQuestionType)) .Where(x => x.Id != inDto.TableQuestionId) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } /// /// 获取项目表格问题 /// /// /// [HttpPost] public async Task> GetTrialClinicalTableQuestionList(TrialClinicalTableQuestionQuery inQuery) { var trialClinicalTableQuestionQueryable = _trialClinicalTableQuestionRepository .Where(x => x.QuestionId == inQuery.QuestionId) .ProjectTo(_mapper.ConfigurationProvider); var pageList = await trialClinicalTableQuestionQueryable.ToPagedListAsync(inQuery, nameof(TrialClinicalTableQuestion.ShowOrder)); return pageList; } /// /// 新增或修改项目表格问题 /// /// /// [HttpPost] public async Task AddOrUpdateTrialClinicalTableQuestion(TrialClinicalTableQuestionDto inDto) { if (inDto.IsVerify) { if (await _trialClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName)) { return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"], string.Empty, ApiResponseCodeEnum.NeedTips); } } if (await _trialClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.ShowOrder == inDto.ShowOrder)) { return ResponseOutput.NotOk("问题序号存在重复!"); } var entity = await _trialClinicalTableQuestionRepository.InsertOrUpdateAsync(inDto, true); return ResponseOutput.Ok(entity.Id.ToString()); } /// /// 删除项目表格问题 /// /// /// [HttpPost("{id:guid}")] public async Task DeleteTrialClinicalTableQuestion(Guid id) { var success = await _trialClinicalTableQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true); return ResponseOutput.Ok(); } #endregion #region 同步系统问题 /// /// 同步系统问题 /// /// /// public async Task SynchronizationQuestion(List inDto) { var trialClinicalId = inDto.Select(x => x.TrialClinicalId).ToList(); var systemClinicalId = inDto.Select(x => x.SystemClinicalId).ToList(); var questionRelationList = await _trialClinicalQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).Select(x => new QuestionDic() { SystemQuestionId = x.SystemClinicalQuestionId ?? default(Guid), TrialQuestionId = x.Id, TrialClinicalId = x.TrialClinicalId, }).ToListAsync(); var tableQuestionRelationList = await _trialClinicalTableQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).Select(x => new QuestionDic() { SystemQuestionId = x.SystemTableQuestionId ?? default(Guid), TrialQuestionId = x.Id, TrialClinicalId = x.TrialClinicalId, }).ToListAsync(); var newTrialQuestionAll = await _systemClinicalQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId)) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var newTrialTableQuestionAll = await _systemClinicalTableQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId)) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); List addTrialDataList = new List(); List addTrialTableList = new List(); foreach (var item in inDto) { var questionRelation = questionRelationList.Where(x => x.TrialClinicalId == item.TrialClinicalId).ToDictionary( x => x.SystemQuestionId, x => x.TrialQuestionId ); var newTrialQuestionList = newTrialQuestionAll.Where(x => x.SystemClinicalId == item.SystemClinicalId).ToList(); newTrialQuestionList.ForEach(x => { if (questionRelation.ContainsKey(x.Id)) { x.Id = questionRelation[x.Id]; } else { var newid = NewId.NextGuid(); questionRelation.Add(x.Id, newid); x.Id = newid; } x.TrialClinicalId = item.TrialClinicalId; }); var copyNewQuestionList = newTrialQuestionList.Clone(); foreach (var x in newTrialQuestionList) { var question = x.Clone(); if (question.ParentId != null) { question.ParentId = questionRelation[question.ParentId ?? default(Guid)]; } if (question.GroupId != null) { question.GroupId = questionRelation[question.GroupId ?? default(Guid)]; } if (question.RelevanceId != null) { question.RelevanceId = questionRelation[question.RelevanceId ?? default(Guid)]; } addTrialDataList.Add(question); }; var tableQuestionRelation = tableQuestionRelationList.Where(x => x.TrialClinicalId == item.TrialClinicalId).ToDictionary( x => x.SystemQuestionId, x => x.TrialQuestionId ); var newTrialTableQuestionList = newTrialTableQuestionAll.Where(x => x.SystemClinicalId == item.SystemClinicalId) .ToList(); newTrialTableQuestionList.ForEach(x => { if (tableQuestionRelation.ContainsKey(x.Id)) { x.Id = tableQuestionRelation[x.Id]; } else { var newid = NewId.NextGuid(); tableQuestionRelation.Add(x.Id, newid); x.Id = newid; } if (x.RelevanceId != null) { x.RelevanceId = questionRelation[x.RelevanceId ?? default(Guid)]; } }); foreach (var x in newTrialTableQuestionList) { var tableQuestion = x.Clone(); tableQuestion.TrialClinicalId = item.TrialClinicalId; tableQuestion.QuestionId = copyNewQuestionList.Where(y => y.SystemClinicalQuestionId == x.QuestionId).Select(y => y.Id).FirstOrDefault(); addTrialTableList.Add(tableQuestion); } } await _trialClinicalQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId)); await _trialClinicalQuestionRepository.AddRangeAsync(addTrialDataList); await _trialClinicalTableQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId)); await _trialClinicalTableQuestionRepository.AddRangeAsync(addTrialTableList); await _trialClinicalQuestionRepository.SaveChangesAsync(); } #endregion } }