diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 2f382f67a..1a9e7f4e5 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -1204,7 +1204,12 @@ namespace IRaCIS.Core.Application.Image.QA // CRC 上传的基线数据签名 - await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ReadingId == dbSubjectVisit.Id && x.IsSign==false, x => new ReadingClinicalData() + await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => + + (x.ClinicalDataTrialSet.ClinicalDataLevel== ClinicalLevel.Subject|| x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit)&& + + + x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ReadingId == dbSubjectVisit.Id && x.IsSign==false, x => new ReadingClinicalData() { IsSign = true, ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs index caa107ed2..58b4ff165 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs @@ -14,6 +14,7 @@ using MassTransit; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Infrastructure.Extention; +using IRaCIS.Core.Application.Service.Reading.Interface; namespace IRaCIS.Core.Application.Service { @@ -21,8 +22,8 @@ namespace IRaCIS.Core.Application.Service /// 临床答案 /// [ApiExplorerSettings(GroupName = "Reading")] - public class ClinicalAnswerService : BaseService - { + public class ClinicalAnswerService : BaseService, IClinicalAnswerService + { private readonly IRepository _trialClinicalQuestionRepository; @@ -106,7 +107,9 @@ namespace IRaCIS.Core.Application.Service x.IsBaseLine, }).ToListAsync(); - var clinicalDataList =await _readingClinicalDataRepository.Where(x =>x.TrialId==inDto.TrialId&&x.ClinicalDataTrialSet.UploadRole== UploadRole.CRC).IgnoreAutoIncludes().ToListAsync(); + var clinicalDataList =await _readingClinicalDataRepository + .WhereIf(inDto.SubjectId != null, x => x.SubjectId == inDto.SubjectId) + .Where(x =>x.TrialId==inDto.TrialId&&x.ClinicalDataTrialSet.UploadRole== UploadRole.CRC).IgnoreAutoIncludes().ToListAsync(); List readingClinicalDatas = new List(); @@ -178,11 +181,12 @@ namespace IRaCIS.Core.Application.Service public async Task> GetCRCSubjectClinicalList(GetCRCSubjectClinicalInDto inDto) { - await AutoAddCRCClinical(new AutoAddClinicalInDto() - { + //await AutoAddCRCClinical(new AutoAddClinicalInDto() + //{ + + // TrialId = inDto.TrialId + //}) ; - TrialId = inDto.TrialId - }) ; @@ -251,8 +255,12 @@ namespace IRaCIS.Core.Application.Service 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); + dic.Add("ClinicalFormId", x.ToString()); + dic.Add("TrialId", inDto.TrialId.ToString()); + dic.Add("SubjectId", inDto.SubjectId.ToString()); + dic.Add("ClinicalDataTrialSetId", inDto.ClinicalDataTrialSetId.ToString()); + + result.AnswerList.Add(dic); }); return result; @@ -264,7 +272,7 @@ namespace IRaCIS.Core.Application.Service /// /// [HttpPost] - public async Task GetClinicalFormInfo(GetClinicalFormInfoInDto inDto) + public async Task> GetClinicalFormInfo(GetClinicalFormInfoInDto inDto) { var formInfo = await _clinicalFormRepository.Where(x => x.Id == inDto.ClinicalFormId).FirstNotNullAsync(); @@ -285,7 +293,7 @@ namespace IRaCIS.Core.Application.Service var questions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - var tableQuestions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId) + var tableQuestions = await _trialClinicalTableQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); @@ -296,11 +304,7 @@ namespace IRaCIS.Core.Application.Service _iClinicalQuestionService.FindChildQuestion(x, questions, tableQuestions, questionAnswer, tableAnswer); }); - return new GetClinicalFormInfoOutDto() - { - - Question = result - }; + return result; } @@ -419,6 +423,7 @@ namespace IRaCIS.Core.Application.Service public async Task> GetCRCConfirmList(GetCRCConfirmListInDto inDto) { List result = await _readModuleRepository.Where(x => x.TrialId == inDto.TrialId) + .WhereIf(inDto.ReadModuleId!=null,x=>x.Id==inDto.ReadModuleId) .Select(x => new GetCRCConfirmListOutDto() { SubjectId= x.SubjectId, @@ -426,46 +431,93 @@ namespace IRaCIS.Core.Application.Service LatestScanDate = x.SubjectVisit.LatestScanDate, ReadingSetType = x.ReadingSetType, IsPMConfirm = x.IsPMConfirm, + SubjectCode=x.Subject.Code, ReadModuleId = x.Id, }).OrderBy(x => x.LatestScanDate).ToListAsync(); var formList = await _clinicalFormRepository.Where(x => x.TrialId == inDto.TrialId) .Where(x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC) .Where(x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.OncologyRead) - .Select(x => new CRCClinicalForm + .Include(x=>x.ClinicalDataTrialSet) + .Select(x => new CRCClinicalForm { - CkeckDate = x.CheckDate, + CheckDate = x.CheckDate, ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel, ClinicalFormId = x.Id, + ClinicalDataSetName=x.ClinicalDataTrialSet.ClinicalDataSetName, + ClinicalDataSetEnName=x.ClinicalDataTrialSet.ClinicalDataSetEnName, }).ToListAsync(); - var confirmList = await _readModuleCriterionFromRepository.Where(x => x.TrialId == inDto.TrialId).ToListAsync(); + var confirmList = await _readModuleCriterionFromRepository.Where(x => x.TrialId == inDto.TrialId).Include(x=>x.ClinicalForm).Include(x=>x.ClinicalForm.ClinicalDataTrialSet).ToListAsync(); result.ForEach(x => { if (x.IsCRCConfirm) { - x.ClinicalFormIdList = confirmList.Where(y => y.ReadModuleId == x.ReadModuleId).Select(y=>y.ClinicalFormId).ToList(); + x.ClinicalFormIdList = confirmList.Where(y => y.ReadModuleId == x.ReadModuleId).Select(y=>new GetCRCBeConfirmListOutDto() { + CheckDate = y.ClinicalForm.CheckDate??default(DateTime), + ClinicalDataSetName= y.ClinicalForm.ClinicalDataTrialSet.ClinicalDataSetName, + ClinicalDataSetEnName= y.ClinicalForm.ClinicalDataTrialSet.ClinicalDataSetEnName, + ClinicalFormId=y.ClinicalFormId, + }).ToList(); } else { if (x.ReadingSetType == ReadingSetType.ImageReading) { - x.ClinicalFormIdList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.ImageRead&&y.CkeckDate<=x.LatestScanDate).Select(y => y.ClinicalFormId).ToList(); + x.ClinicalFormIdList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.ImageRead&&y.CheckDate <= x.LatestScanDate) + .Select(y => new GetCRCBeConfirmListOutDto() + { + CheckDate = y.CheckDate ?? default(DateTime), + ClinicalDataSetName = y.ClinicalDataSetName, + ClinicalDataSetEnName = y.ClinicalDataSetEnName, + ClinicalFormId = y.ClinicalFormId, + }).ToList(); } else { - x.ClinicalFormIdList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.OncologyRead&&y.CkeckDate <= x.LatestScanDate).Select(y => y.ClinicalFormId).ToList(); + x.ClinicalFormIdList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.OncologyRead&&y.CheckDate <= x.LatestScanDate) + .Select(y => new GetCRCBeConfirmListOutDto() + { + CheckDate = y.CheckDate ?? default(DateTime), + ClinicalDataSetName = y.ClinicalDataSetName, + ClinicalDataSetEnName = y.ClinicalDataSetEnName, + ClinicalFormId = y.ClinicalFormId, + }).ToList(); } } }); return result; } - /// - /// CRC 确认临床数据 + /// 获取CRC待确认列表 /// /// /// [HttpPost] + public async Task> GetCRCBeConfirmList(GetCRCBeConfirmListInDto inDto) + { + var result = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto() + { + ReadModuleId = inDto.ReadModuleId, + TrialId = inDto.TrialId + })).SelectMany(x => x.ClinicalFormIdList).ToList(); + + result.ForEach(x => { + + x.ClinicalDataSetName = _userInfo.IsEn_Us ? x.ClinicalDataSetEnName : x.ClinicalDataSetName; + + }); + + return result.OrderBy(x => x.ClinicalDataSetName).ThenBy(x => x.CheckDate).ToList(); + + } + + + /// + /// CRC 确认临床数据 + /// + /// + /// + [HttpPost] public async Task CRCConfirmClinical(CRCConfirmClinicalInDto inDto) { var dataList =await this.GetCRCConfirmList(new GetCRCConfirmListInDto() @@ -487,7 +539,7 @@ namespace IRaCIS.Core.Application.Service { needAddList.Add(new ReadModuleCriterionFrom() { - ClinicalFormId = y, + ClinicalFormId = y.ClinicalFormId, ReadModuleId = x.ReadModuleId, SubjectId = x.SubjectId, TrialId = inDto.TrialId, diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs index 0c072ec28..967d63a51 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -179,10 +179,10 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task> GetCRCClinicalData(GetCRCClinicalDataInDto inDto) { - if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator) - { - await this.AddCRCClinicalData(inDto); - } + //if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator) + //{ + // await this.AddCRCClinicalData(inDto); + //} List cRCClinicalDataList = await _readingClinicalDataRepository.Where(x => x.ReadingId == inDto.SubjectVisitId) diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs index 4e125fd93..c0562e954 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs @@ -57,7 +57,10 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { public Guid SubjectId { get; set; } - public Guid ClinicalDataTrialSetId { get; set; } + + public Guid TrialId { get; set; } + + public Guid ClinicalDataTrialSetId { get; set; } } @@ -99,6 +102,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class GetCRCConfirmListInDto { public Guid TrialId { get; set; } + + public Guid? ReadModuleId { get; set; } } public class CRCCancelConfirmClinicalInDto @@ -108,6 +113,25 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid ReadModuleId { get; set; } } + public class GetCRCBeConfirmListInDto + { + public Guid TrialId { get; set; } + + public Guid ReadModuleId { get; set; } + } + + + public class GetCRCBeConfirmListOutDto + { + public Guid ClinicalFormId { get; set; } + + public string ClinicalDataSetName { get; set; } + + public string ClinicalDataSetEnName { get; set; } + + public DateTime CheckDate { get; set; } + } + public class CRCConfirmClinicalInDto { public Guid TrialId { get; set; } @@ -118,7 +142,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class CRCClinicalForm { - public DateTime? CkeckDate { get; set; } + public DateTime? CheckDate { get; set; } public Guid ClinicalFormId { get; set; } @@ -126,6 +150,10 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// 临床级别 /// public ClinicalLevel ClinicalDataLevel { get; set; } + + public string ClinicalDataSetName { get; set; } + + public string ClinicalDataSetEnName { get; set; } } @@ -144,13 +172,14 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool IsCRCConfirm { get; set; } = false; + public string SubjectCode { get; set; } /// /// 最晚拍片日期 /// public DateTime? LatestScanDate { get; set; } - public List ClinicalFormIdList { get; set; } + public List ClinicalFormIdList { get; set; } public int FormCount { diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs new file mode 100644 index 000000000..29775bb1f --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs @@ -0,0 +1,14 @@ +using IRaCIS.Core.Application.Service.Reading.Dto; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IRaCIS.Core.Application.Service.Reading.Interface +{ + public interface IClinicalAnswerService + { + Task AutoAddCRCClinical(AutoAddClinicalInDto inDto); + } +} diff --git a/IRaCIS.Core.Application/Triggers/AddCRCCliniaclDataTrigger.cs b/IRaCIS.Core.Application/Triggers/AddCRCCliniaclDataTrigger.cs new file mode 100644 index 000000000..8ee6c4463 --- /dev/null +++ b/IRaCIS.Core.Application/Triggers/AddCRCCliniaclDataTrigger.cs @@ -0,0 +1,39 @@ +using EntityFrameworkCore.Triggered; +using IRaCIS.Core.Application.Service.Reading.Interface; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IRaCIS.Core.Application.Triggers +{ + public class AddCRCCliniaclDataTrigger : IAfterSaveTrigger + { + private readonly IRepository _subjectVisitRepository; + private readonly IRepository _repository; + private readonly IClinicalAnswerService _iClinicalAnswerService; + + public AddCRCCliniaclDataTrigger(IRepository subjectVisitRepository, IRepository repository, IClinicalAnswerService iClinicalAnswerService) + { + _subjectVisitRepository = subjectVisitRepository; + + _repository = repository; + this._iClinicalAnswerService = iClinicalAnswerService; + } + + //注意删除不能用扩展方法,必须用EF跟踪的实体 否则不能取到 SubjectVisitId + public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) + { + var subjectVisit = context.Entity; + + await _iClinicalAnswerService.AutoAddCRCClinical(new Service.Reading.Dto.AutoAddClinicalInDto() + { + TrialId = subjectVisit.TrialId, + SubjectId = subjectVisit.SubjectId, + + }); + } + + } +} diff --git a/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ReadModuleCriterionFrom.cs b/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ReadModuleCriterionFrom.cs index dbfa8d0a7..27a661289 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ReadModuleCriterionFrom.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ReadModuleCriterionFrom.cs @@ -45,8 +45,13 @@ namespace IRaCIS.Core.Domain.Models /// 创建时间 /// public DateTime CreateTime { get; set; } - - } + + [JsonIgnore] + [ForeignKey("ClinicalFormId")] + public ClinicalForm ClinicalForm { get; set; } + + + } }