//--------------------------------------------------------------------
// 此代码由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;
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 _clinicalQuestionAnswerRepository;
private readonly IRepository _clinicalTableAnswerRepository;
private readonly IRepository _clinicalAnswerRowInfoRepository;
private readonly IClinicalQuestionService _iClinicalQuestionService;
public ClinicalAnswerService(IRepository trialClinicalQuestionRepository,
IRepository systemClinicalTableQuestionRepository,
IRepository trialClinicalTableQuestionRepository,
IRepository clinicalFormRepository,
IRepository clinicalTableAnswerRepository,
IRepository clinicalQuestionAnswerRepository,
IClinicalQuestionService iClinicalQuestionService,
IRepository clinicalAnswerRowInfoRepository,
IRepository clinicalDataTrialSetRepository,
IRepository systemClinicalQuestionRepository
)
{
_clinicalAnswerRowInfoRepository = clinicalAnswerRowInfoRepository;
_clinicalQuestionAnswerRepository = clinicalQuestionAnswerRepository;
_systemClinicalTableQuestionRepository = systemClinicalTableQuestionRepository;
_trialClinicalQuestionRepository = trialClinicalQuestionRepository;
_trialClinicalTableQuestionRepository = trialClinicalTableQuestionRepository;
_systemClinicalQuestionRepository = systemClinicalQuestionRepository;
_clinicalDataTrialSetRepository = clinicalDataTrialSetRepository;
_clinicalFormRepository = clinicalFormRepository;
_clinicalTableAnswerRepository = clinicalTableAnswerRepository;
_iClinicalQuestionService = iClinicalQuestionService;
}
///
/// 获取CRC受试者临床数据
///
///
///
[HttpPost]
public async Task> GetCRCSubjectClinicalList(GetCRCSubjectClinicalInDto inDto)
{
var result =await _clinicalDataTrialSetRepository.Where(x => x.TrialId == inDto.TrialId).OrderBy(x=>x.ClinicalDataSetName).Select(x => new GetCRCSubjectClinicalOutDto()
{
ClinicalDataTrialSetId = x.Id,
ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us),
}).ToListAsync();
var clinicalData = await _clinicalFormRepository.Where(x => x.SubjectId == inDto.TrialId).ToListAsync();
result.ForEach(x =>
{
x.ClinicalCount = clinicalData.Where(y => y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Count();
});
return result;
}
///
/// 获取表单列表
///
///
///
[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)
{
var checkDateQuestionId = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.ClinicalDataTrialSetId && x.IsCheckDate).Select(x => x.Id).FirstNotNullAsync();
ClinicalForm clinicalForm = new ClinicalForm() { };
try
{
clinicalForm = new ClinicalForm()
{
ClinicalDataTrialSetId = inDto.ClinicalDataTrialSetId,
SubjectId = inDto.SubjectId,
Id = inDto.ClinicalFormId ?? NewId.NextGuid(),
ReadingId=inDto.ReadingId,
VisitId=inDto.VisitId,
CheckDate = DateTime.Parse(inDto.QuestionAnswers.Where(x => x.QuestionId == checkDateQuestionId).Select(x => x.Answer).First()),
};
}
catch (Exception)
{
throw new BusinessValidationFailedException("检查日期问题答案填写错误!");
}
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);
}
}
}