//-------------------------------------------------------------------- // 此代码由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; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Infrastructure.Extention; namespace IRaCIS.Core.Application.Service { /// /// 临床答案 /// [ApiExplorerSettings(GroupName = "Reading")] public class ClinicalAnswerService : BaseService { private readonly IRepository _trialClinicalQuestionRepository; private readonly IRepository _systemClinicalQuestionRepository; private readonly IRepository _systemClinicalTableQuestionRepository; private readonly IRepository _trialClinicalTableQuestionRepository; private readonly IRepository _clinicalDataTrialSetRepository; private readonly IRepository _clinicalFormRepository; private readonly IRepository _subjectRepository; private readonly IRepository _clinicalQuestionAnswerRepository; private readonly IRepository _clinicalTableAnswerRepository; private readonly IRepository _clinicalAnswerRowInfoRepository; private readonly IRepository _readingClinicalDataRepository; private readonly IRepository _subjectVisitRepository; private readonly IClinicalQuestionService _iClinicalQuestionService; public ClinicalAnswerService(IRepository trialClinicalQuestionRepository, IRepository systemClinicalTableQuestionRepository, IRepository trialClinicalTableQuestionRepository, IRepository readingClinicalDataRepository, IRepository clinicalFormRepository, IRepository subjectRepository, IRepository subjectVisitRepository, IRepository clinicalTableAnswerRepository, IRepository clinicalQuestionAnswerRepository, IClinicalQuestionService iClinicalQuestionService, IRepository clinicalAnswerRowInfoRepository, IRepository clinicalDataTrialSetRepository, IRepository systemClinicalQuestionRepository ) { _subjectVisitRepository = subjectVisitRepository; _readingClinicalDataRepository = readingClinicalDataRepository; _clinicalAnswerRowInfoRepository = clinicalAnswerRowInfoRepository; _clinicalQuestionAnswerRepository = clinicalQuestionAnswerRepository; _systemClinicalTableQuestionRepository = systemClinicalTableQuestionRepository; _trialClinicalQuestionRepository = trialClinicalQuestionRepository; _trialClinicalTableQuestionRepository = trialClinicalTableQuestionRepository; _systemClinicalQuestionRepository = systemClinicalQuestionRepository; _clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; _clinicalFormRepository = clinicalFormRepository; this._subjectRepository = subjectRepository; _clinicalTableAnswerRepository = clinicalTableAnswerRepository; _iClinicalQuestionService = iClinicalQuestionService; } /// /// 自动添加CRC临床数据 /// /// /// public async Task AutoAddCRCClinical(AutoAddClinicalInDto inDto) { var dataTrialSetList = await _clinicalDataTrialSetRepository.Where(x =>x.TrialId == inDto.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm) .IgnoreAutoIncludes().ToListAsync(); var baseLine = await _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId) .WhereIf(inDto.SubjectId!=null,x=>x.SubjectId==inDto.SubjectId) .Select(x => new { x.SubjectId, VisitId = x.Id, x.IsBaseLine, }).ToListAsync(); var clinicalDataList =await _readingClinicalDataRepository.Where(x =>x.TrialId==inDto.TrialId&&x.ClinicalDataTrialSet.UploadRole== UploadRole.CRC).IgnoreAutoIncludes().ToListAsync(); List readingClinicalDatas = new List(); baseLine.Select(x => x.SubjectId).Distinct().ForEach(n => { var baseLineVisitId = baseLine.Where(x => x.IsBaseLine && x.SubjectId == n).Select(x => x.VisitId).First(); readingClinicalDatas.AddRange( dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.Subject).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.SubjectId == n).Count() == 0) .Select(x => new ReadingClinicalData() { ClinicalDataTrialSetId = x.Id, IsVisit = true, SubjectId = n, ReadingId = baseLineVisitId, TrialId = inDto.TrialId }).ToList()); readingClinicalDatas.AddRange( dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.ImageRead).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.SubjectId == n).Count() == 0) .Select(x => new ReadingClinicalData() { ClinicalDataTrialSetId = x.Id, IsVisit = false, SubjectId = n, ReadingId = default(Guid), TrialId = inDto.TrialId }).ToList()); readingClinicalDatas.AddRange( dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.OncologyRead).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.SubjectId == n).Count() == 0) .Select(x => new ReadingClinicalData() { ClinicalDataTrialSetId = x.Id, IsVisit = false, SubjectId = n, ReadingId = default(Guid), TrialId = inDto.TrialId }).ToList()); }); baseLine.ForEach(n => { readingClinicalDatas.AddRange( dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.ReadingId == n.VisitId).Count() == 0) .Select(x => new ReadingClinicalData() { ClinicalDataTrialSetId = x.Id, IsVisit = true, SubjectId = n.SubjectId, ReadingId = n.VisitId, TrialId = inDto.TrialId }).ToList()); }); await _readingClinicalDataRepository.AddRangeAsync(readingClinicalDatas); await _readingClinicalDataRepository.SaveChangesAsync(); } /// /// 获取CRC受试者临床数据 /// /// /// [HttpPost] public async Task> GetCRCSubjectClinicalList(GetCRCSubjectClinicalInDto inDto) { await AutoAddCRCClinical(new AutoAddClinicalInDto() { TrialId = inDto.TrialId }) ; var subjects = await _subjectRepository.Where(x => x.TrialId == inDto.TrialId).Select(x => new GetCRCSubjectClinicalResultDto() { SubjectId = x.Id, SunjectCode = x.ShortName }).ToListAsync(); var clinicalData=await _readingClinicalDataRepository.Where(x=>x.TrialId == inDto.TrialId&&x.ClinicalDataTrialSet.UploadRole==UploadRole.CRC&&x.ClinicalDataTrialSet.ClinicalDataLevel!= ClinicalLevel.SubjectVisit) .Where(x=>!x.IsSign) .Include(x=>x.ClinicalDataTrialSet).Select(x=>new GetCRCSubjectClinicalOutDto() { SubjectId=x.SubjectId, ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id, ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName.LanguageName(x.ClinicalDataTrialSet.ClinicalDataSetEnName, _userInfo.IsEn_Us), }).OrderBy(x=>x.ClinicalDataSetName).ToListAsync(); var clinicalFormData = await _clinicalFormRepository.Where(x => x.SubjectId == inDto.TrialId).ToListAsync(); subjects.ForEach(x => { x.ClinicalDataList = clinicalData.Where(y => y.SubjectId == x.SubjectId).ToList(); x.ClinicalDataList.ForEach(n => { n.ClinicalCount = clinicalData.Where(y => y.ClinicalDataTrialSetId == n.ClinicalDataTrialSetId && y.SubjectId == n.SubjectId).Count(); }); }); return subjects; } /// /// 获取表单列表 /// /// /// [HttpPost] public async Task GetClinicalQuestionFormList(GetClinicalQuestionAnswerListInDto inDto) { var result = new GetClinicalQuestionAnswerListOutDto(); result.AnswerList = new List>(); result.QuestionList=await _trialClinicalQuestionRepository.Where(x=>x.TrialClinicalId==inDto.ClinicalDataTrialSetId &&x.ClinicalQuestionType!= ReadingQestionType.Group && x.ClinicalQuestionType != ReadingQestionType.Table).OrderBy(x=>x.ShowOrder) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var answers = await _clinicalQuestionAnswerRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId) .Select(x => new { x.ClinicalFormId, x.ClinicalForm.CheckDate, x.QuestionId, x.Answer }) .ToListAsync(); var ClinicalFormIds = answers.OrderBy(x=>x.CheckDate).Select(x => x.ClinicalFormId).Distinct().ToList(); ClinicalFormIds.ForEach(x => { var dic = answers.Where(y => y.ClinicalFormId == x).ToDictionary(x => x.QuestionId.ToString(), x => x.Answer); dic.Add("clinicalFormId", x.ToString()); result.AnswerList.Add(dic); }); return result; } /// /// 获取临床数据表单问题 /// /// /// [HttpPost] public async Task GetClinicalFormInfo(GetClinicalFormInfoInDto inDto) { var formInfo = await _clinicalFormRepository.Where(x => x.Id == inDto.ClinicalFormId).FirstNotNullAsync(); var questionAnswer = await _clinicalQuestionAnswerRepository.Where(x => x.ClinicalFormId == inDto.ClinicalFormId).Select(x => new ClinicalFormQuestionAnswer { QuestionId = x.QuestionId, Answer = x.Answer }).ToListAsync(); var tableAnswer = await _clinicalTableAnswerRepository.Where(x => x.ClinicalFormId == inDto.ClinicalFormId).Select(x => new ClinicalFormTableQuestionAnswer { TableQuestionId = x.TableQuestionId, Answer = x.Answer, QuestionId = x.QuestionId, RowIndex = x.ClinicalAnswerRowInfo.RowIndex }).ToListAsync(); var questions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var tableQuestions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList(); result.ForEach(x => { _iClinicalQuestionService.FindChildQuestion(x, questions, tableQuestions, questionAnswer, tableAnswer); }); return new GetClinicalFormInfoOutDto() { Question = result }; } /// /// 提交临床数据表单 /// /// /// [HttpPost] public async Task SubmitClinicalForm(SubmitClinicalFormInDto inDto) { ClinicalForm clinicalForm = new ClinicalForm() { }; clinicalForm = new ClinicalForm() { ClinicalDataTrialSetId = inDto.ClinicalDataTrialSetId, SubjectId = inDto.SubjectId, Id = inDto.ClinicalFormId ?? NewId.NextGuid(), ReadingId = inDto.ReadingId, VisitId = inDto.VisitId, }; try { var checkDateQuestionId = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.ClinicalDataTrialSetId && x.IsCheckDate).Select(x => x.Id).FirstNotNullAsync(); clinicalForm.CheckDate = DateTime.Parse(inDto.QuestionAnswers.Where(x => x.QuestionId == checkDateQuestionId).Select(x => x.Answer).First()); } catch (Exception) { } List clinicalQuestionAnswers = inDto.QuestionAnswers.Select(x => new ClinicalQuestionAnswer() { Answer=x.Answer, ClinicalDataTrialSetId=inDto.ClinicalDataTrialSetId, SubjectId=inDto.SubjectId, ClinicalFormId= clinicalForm.Id, QuestionId=x.QuestionId, }).ToList(); List clinicalAnswerRowInfos = new List(); List clinicalTableAnswers = new List(); inDto.TableQuestionAnswerList.ForEach(x => { var questionid = x.QuestionId; for (int i = 0; i < x.TableQuestionAnswers.Count(); i++) { var rowInfo = new ClinicalAnswerRowInfo() { Id = NewId.NextGuid(), SubjectId = inDto.SubjectId, ClinicalFormId = clinicalForm.Id, QuestionId = questionid, RowIndex = i+1, }; clinicalAnswerRowInfos.Add(rowInfo); x.TableQuestionAnswers[i].ForEach(y => { clinicalTableAnswers.Add(new ClinicalTableAnswer() { Answer=y.Answer, ClinicalFormId= clinicalForm.Id, QuestionId= questionid, RowId= rowInfo.Id, TableQuestionId=y.TableQuestionId, SubjectId= inDto.SubjectId, }); }); } }); if (inDto.ClinicalFormId != null) { await _clinicalFormRepository.BatchDeleteNoTrackingAsync(x => x.Id == inDto.ClinicalFormId); await _clinicalQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId); await _clinicalAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId); await _clinicalTableAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId); } await _clinicalFormRepository.AddAsync(clinicalForm); await _clinicalQuestionAnswerRepository.AddRangeAsync(clinicalQuestionAnswers); await _clinicalAnswerRowInfoRepository.AddRangeAsync(clinicalAnswerRowInfos); await _clinicalTableAnswerRepository.AddRangeAsync(clinicalTableAnswers); await _clinicalTableAnswerRepository.SaveChangesAsync(); return ResponseOutput.Ok(true); } } }