//-------------------------------------------------------------------- // 此代码由T4模板自动生成 byzhouhang 20210918 // 生成时间 2023-06-15 15:06:06 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 //-------------------------------------------------------------------- using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Application.Interfaces; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Domain.Share; using MassTransit; namespace IRaCIS.Core.Application.Service { /// /// 临床数据问题 /// [ApiExplorerSettings(GroupName = "Reading")] public class ClinicalQuestionService : BaseService, IClinicalQuestionService { private readonly IRepository _trialClinicalQuestionRepository; private readonly IRepository _systemClinicalQuestionRepository; private readonly IRepository _systemClinicalTableQuestionRepository; private readonly IRepository _trialClinicalTableQuestionRepository; public ClinicalQuestionService(IRepository trialClinicalQuestionRepository, IRepository systemClinicalTableQuestionRepository, IRepository trialClinicalTableQuestionRepository, IRepository systemClinicalQuestionRepository ) { _systemClinicalTableQuestionRepository = systemClinicalTableQuestionRepository; _trialClinicalQuestionRepository = trialClinicalQuestionRepository; _trialClinicalTableQuestionRepository = trialClinicalTableQuestionRepository; _systemClinicalQuestionRepository = systemClinicalQuestionRepository; } /// /// 获取问题计算关系 /// /// /// [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(); var tableQuestions= await _systemClinicalTableQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); questions.ForEach(x => x.CreateTime = null); var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList(); result.ForEach(x => { this.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(); var tableQuestions = await _trialClinicalTableQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); questions.ForEach(x => x.CreateTime = null); var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).OrderBy(x => x.ShowOrder).ToList(); result.ForEach(x => { this.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 => { this.FindChildQuestion(x, questions, tableQuestions, answers, tableAnswers); }); item.Childrens.ForEach(x => { this.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.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialClinicalQuestion.ShowOrder) : inQuery.SortField, inQuery.Asc); 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 this._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 this._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.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(SystemClinicalQuestion.ShowOrder) : inQuery.SortField, inQuery.Asc); 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 this._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 this._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 = this._systemClinicalTableQuestionRepository .Where(x => x.QuestionId == inQuery.QuestionId) .ProjectTo(_mapper.ConfigurationProvider); var pageList = await systemClinicalTableQuestionQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(SystemClinicalTableQuestion.ShowOrder) : inQuery.SortField, inQuery.Asc); 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(); } #endregion #region 项目表格问题 /// /// 获取项目表格问题 /// /// /// [HttpPost] public async Task> GetTrialClinicalTableQuestionList(TrialClinicalTableQuestionQuery inQuery) { var trialClinicalTableQuestionQueryable = this._trialClinicalTableQuestionRepository .Where(x => x.QuestionId == inQuery.QuestionId) .ProjectTo(_mapper.ConfigurationProvider); var pageList = await trialClinicalTableQuestionQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialClinicalTableQuestion.ShowOrder) : inQuery.SortField, inQuery.Asc); 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; } }); 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 } }