400 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			400 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
//--------------------------------------------------------------------
 | 
						|
//     此代码由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
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// 临床答案
 | 
						|
    /// </summary>	
 | 
						|
    [ApiExplorerSettings(GroupName = "Reading")]
 | 
						|
    public class ClinicalAnswerService : BaseService
 | 
						|
    {
 | 
						|
 | 
						|
        private readonly IRepository<TrialClinicalQuestion> _trialClinicalQuestionRepository;
 | 
						|
 | 
						|
        private readonly IRepository<SystemClinicalQuestion> _systemClinicalQuestionRepository;
 | 
						|
 | 
						|
 | 
						|
        private readonly IRepository<SystemClinicalTableQuestion> _systemClinicalTableQuestionRepository;
 | 
						|
 | 
						|
        private readonly IRepository<TrialClinicalTableQuestion> _trialClinicalTableQuestionRepository;
 | 
						|
 | 
						|
        private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository;
 | 
						|
 | 
						|
		private readonly IRepository<ClinicalForm> _clinicalFormRepository;
 | 
						|
		private readonly IRepository<Subject> _subjectRepository;
 | 
						|
		private readonly IRepository<ClinicalQuestionAnswer> _clinicalQuestionAnswerRepository;
 | 
						|
 | 
						|
        private readonly IRepository<ClinicalTableAnswer> _clinicalTableAnswerRepository;
 | 
						|
 | 
						|
        private readonly IRepository<ClinicalAnswerRowInfo> _clinicalAnswerRowInfoRepository;
 | 
						|
 | 
						|
		private readonly IRepository<ReadingClinicalData> _readingClinicalDataRepository;
 | 
						|
		private readonly IRepository<SubjectVisit> _subjectVisitRepository;
 | 
						|
 | 
						|
		private readonly IClinicalQuestionService _iClinicalQuestionService;
 | 
						|
 | 
						|
 | 
						|
        public ClinicalAnswerService(IRepository<TrialClinicalQuestion> trialClinicalQuestionRepository,
 | 
						|
            IRepository<SystemClinicalTableQuestion> systemClinicalTableQuestionRepository,
 | 
						|
            IRepository<TrialClinicalTableQuestion> trialClinicalTableQuestionRepository,
 | 
						|
			IRepository<ReadingClinicalData> readingClinicalDataRepository,
 | 
						|
		IRepository<ClinicalForm> clinicalFormRepository,
 | 
						|
		IRepository<Subject> subjectRepository,
 | 
						|
		IRepository<SubjectVisit> subjectVisitRepository,
 | 
						|
			IRepository<ClinicalTableAnswer> clinicalTableAnswerRepository,
 | 
						|
             IRepository<ClinicalQuestionAnswer> clinicalQuestionAnswerRepository,
 | 
						|
                IClinicalQuestionService iClinicalQuestionService,
 | 
						|
                IRepository<ClinicalAnswerRowInfo> clinicalAnswerRowInfoRepository,
 | 
						|
        IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository,
 | 
						|
			IRepository<SystemClinicalQuestion> 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;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 自动添加CRC临床数据
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        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<ReadingClinicalData> readingClinicalDatas = new List<ReadingClinicalData>();
 | 
						|
 | 
						|
            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();
 | 
						|
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		/// <summary>
 | 
						|
		/// 获取CRC受试者临床数据
 | 
						|
		/// </summary>
 | 
						|
		/// <param name="inDto"></param>
 | 
						|
		/// <returns></returns>
 | 
						|
		[HttpPost]
 | 
						|
        public async Task<List<GetCRCSubjectClinicalResultDto>> 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;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取表单列表
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<GetClinicalQuestionAnswerListOutDto> GetClinicalQuestionFormList(GetClinicalQuestionAnswerListInDto inDto)
 | 
						|
        {
 | 
						|
            var result = new GetClinicalQuestionAnswerListOutDto();
 | 
						|
            result.AnswerList = new List<Dictionary<string, string>>();
 | 
						|
            result.QuestionList=await _trialClinicalQuestionRepository.Where(x=>x.TrialClinicalId==inDto.ClinicalDataTrialSetId
 | 
						|
            &&x.ClinicalQuestionType!= ReadingQestionType.Group
 | 
						|
            && x.ClinicalQuestionType != ReadingQestionType.Table).OrderBy(x=>x.ShowOrder)
 | 
						|
               .ProjectTo<TrialClinicalQuestionDto>(_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;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取临床数据表单问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<GetClinicalFormInfoOutDto> 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<ClinicalQuestionPreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
 | 
						|
            var tableQuestions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId)
 | 
						|
                .ProjectTo<ClinicalTablePreviewDto>(_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
 | 
						|
            };
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 提交临床数据表单
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<IResponseOutput> 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<ClinicalQuestionAnswer> clinicalQuestionAnswers = inDto.QuestionAnswers.Select(x => new ClinicalQuestionAnswer()
 | 
						|
            {
 | 
						|
                Answer=x.Answer,
 | 
						|
                ClinicalDataTrialSetId=inDto.ClinicalDataTrialSetId,
 | 
						|
                SubjectId=inDto.SubjectId,
 | 
						|
                ClinicalFormId= clinicalForm.Id,
 | 
						|
                QuestionId=x.QuestionId,
 | 
						|
            }).ToList();
 | 
						|
 | 
						|
            List<ClinicalAnswerRowInfo> clinicalAnswerRowInfos = new List<ClinicalAnswerRowInfo>();
 | 
						|
 | 
						|
            List<ClinicalTableAnswer> clinicalTableAnswers = new List<ClinicalTableAnswer>();
 | 
						|
 | 
						|
            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);
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
}
 |