From 1dae1834a4b0feee08e512f706504c9bb9c1f0f6 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 27 Mar 2023 16:38:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9BM=E9=80=80=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 2 +- .../Allocation/VisitTaskHelpeService.cs | 66 +++++++++++-------- .../Service/Allocation/VisitTaskService.cs | 49 ++++++++++++-- .../SubjectCriteriaEvaluationService.cs | 39 +++++++---- .../SubjectVisitCheckPassedTrigger.cs | 22 +++++-- IRaCIS.Core.Domain/Allocation/VisitTask.cs | 3 + .../SubjectCriteriaEvaluationVisitFilter.cs | 5 ++ IRaCIS.Core.Domain/Visit/Subject.cs | 4 ++ .../TrialSiteConfigration.cs | 15 +++++ 9 files changed, 152 insertions(+), 53 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 65f65cf2e..240018fca 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -441,7 +441,7 @@ - + 如果是基线退回 影响附加评估标准 是否参与评估 diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index 597215059..5cf4b1cfa 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -332,15 +332,17 @@ namespace IRaCIS.Core.Application.Service bool isCanEditUrgentState = taskUrgentType == TaskUrgentType.EnrollmentConfirm || taskUrgentType == TaskUrgentType.PDProgress ? false : true; + //为防止脏数据 这里也多判断一次 + var existCurrentVisitTaskList = _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId + && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.TaskState == TaskState.Effect + && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.SourceSubjectVisitId == subjectVisit.Id).ToList(); + if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double) { - //未防止脏数据 这里也多判断一次 - var existCurrentVisitTaskList = _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId - && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.TaskState == TaskState.Effect - && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.SourceSubjectVisitId == subjectVisit.Id).ToList(); + - VisitTask? task1 = null; - VisitTask? task2 = null; + VisitTask? task1 = existCurrentVisitTaskList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm1); + VisitTask? task2 = existCurrentVisitTaskList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm2); if (!existCurrentVisitTaskList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1)) { @@ -432,29 +434,37 @@ namespace IRaCIS.Core.Application.Service else if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Single) { - var singleTask = await _visitTaskRepository.AddAsync(new VisitTask() + VisitTask? singleTask = existCurrentVisitTaskList.FirstOrDefault(t => t.ArmEnum == Arm.SingleReadingArm); + + if (!existCurrentVisitTaskList.Any(t => t.ArmEnum == Arm.SingleReadingArm)) { - TrialId = trialId, - SubjectId = subjectVisit.SubjectId, - IsUrgent = subjectVisit.IsUrgent, - TaskBlindName = blindTaskName, - TaskName = subjectVisit.VisitName, - VisitTaskNum = subjectVisit.VisitNum, - TaskUrgentType = taskUrgentType, - IsCanEditUrgentState = isCanEditUrgentState, - //CheckPassedTime = subjectVisit.CheckPassedTime, - ArmEnum = Arm.SingleReadingArm, //特殊 - Code = currentMaxCodeInt + 1, - SourceSubjectVisitId = subjectVisit.Id, - TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), - ReadingCategory = ReadingCategory.Visit, - TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, - IsNeedClinicalDataSign = isNeedClinicalDataSign, - IsClinicalDataSign = isClinicalDataSign - }); + currentMaxCodeInt = currentMaxCodeInt + 1; + + singleTask = await _visitTaskRepository.AddAsync(new VisitTask() + { + TrialId = trialId, + SubjectId = subjectVisit.SubjectId, + IsUrgent = subjectVisit.IsUrgent, + TaskBlindName = blindTaskName, + TaskName = subjectVisit.VisitName, + VisitTaskNum = subjectVisit.VisitNum, + TaskUrgentType = taskUrgentType, + IsCanEditUrgentState = isCanEditUrgentState, + //CheckPassedTime = subjectVisit.CheckPassedTime, + ArmEnum = Arm.SingleReadingArm, //特殊 + Code = currentMaxCodeInt + 1, + SourceSubjectVisitId = subjectVisit.Id, + TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), + ReadingCategory = ReadingCategory.Visit, + TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, + IsNeedClinicalDataSign = isNeedClinicalDataSign, + IsClinicalDataSign = isClinicalDataSign + }); + } + + - currentMaxCodeInt = currentMaxCodeInt + 1; _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); @@ -709,9 +719,9 @@ namespace IRaCIS.Core.Application.Service foreach (var trialReadingCriterionConfig in trialReadingCriterionConfigList) { - var subjectCriteriaEvaluation = _subjectCriteriaEvaluationRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.IsJoinEvaluation && t.SubjectId == subjectVisit.SubjectId).FirstOrDefault(); + //var subjectCriteriaEvaluation = _subjectCriteriaEvaluationRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.IsJoinEvaluation && t.SubjectId == subjectVisit.SubjectId).FirstOrDefault(); - if (trialReadingCriterionConfig.IsAutoCreate == true || (trialReadingCriterionConfig.IsAutoCreate == false && subjectCriteriaEvaluation != null && subjectCriteriaEvaluation?.IsJoinEvaluation == true)) + if (trialReadingCriterionConfig.IsAutoCreate == true /*|| (trialReadingCriterionConfig.IsAutoCreate == false && subjectCriteriaEvaluation != null && subjectCriteriaEvaluation?.IsJoinEvaluation == true)*/) { diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index 1258c41a9..32a8dd92b 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -1008,11 +1008,19 @@ namespace IRaCIS.Core.Application.Service.Allocation //Expression> visitTaskLambda = x => x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect && x.TrialReadingCriterionId == inDto.TrialReadingCriterionId; + var critrion = await _trialReadingCriterionRepository.FindAsync(trialReadingCriterionId); + var visitGroupQuery = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect /*&& x.TrialReadingCriterionId== inDto.TrialReadingCriterionId*/) + .WhereIf(critrion.IsAutoCreate==false, t=>t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(t => t.ImageFilterState != ImageFilterState.Finished) ? + t.VisitTaskNum <= t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Min(t => t.SubjectVisit.VisitNum) : true) - //.Where(t => t.VisitTaskNum < t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) ) - .Where(t => t.Subject.SubjectVisitList.Any(t => t.CheckState != CheckStateEnum.CVPassed) ? t.VisitTaskNum < t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) : true) + .Where(t => t.TrialReadingCriterion.IsAutoCreate == false && t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(t => t.ImageFilterState != ImageFilterState.Finished) ? + t.VisitTaskNum <= t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Min(t => t.SubjectVisit.VisitNum) : true) + + + + .Where(t => t.Subject.SubjectVisitList.Any(t => t.CheckState != CheckStateEnum.CVPassed) ? t.VisitTaskNum <=t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) : true) //满足前序访视不存在 需要签署但是未签署 sql 相当复杂 同时想查询所有未读的统计数字 就无法统计 byzhouhang //但是加字段 IsFrontTaskNeedSignButNotSign 那么签名临床数据的时候,要对该subject 该标准的有效的任务 这个字段需要在签名的时候维护 采取这种方式 统计数字灵活 //.Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)) @@ -1485,7 +1493,6 @@ namespace IRaCIS.Core.Application.Service.Allocation //执行类似一致性核查回退流程 await VisitBackAsync(origenalTask.SourceSubjectVisitId); - await InfluenceAddtioncalEvaluationCritrionAsync(origenalTask); } else { @@ -1523,6 +1530,8 @@ namespace IRaCIS.Core.Application.Service.Allocation // influenceTask.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = t.Id }); //}); + await InfluenceAddtioncalEvaluationCritrionAsync(origenalTask, influenceTaskList.Where(t => t.Id != origenalTask.Id).Where(t => t.SourceSubjectVisitId != null).Select(t => (Guid)t.SourceSubjectVisitId).Distinct().ToList()); + await SetReReadingOrBackInfluenceAnalysisAsync(origenalTask.SubjectId); await SetMedicalReviewInvalidAsync(influenceTaskList); @@ -1729,7 +1738,7 @@ namespace IRaCIS.Core.Application.Service.Allocation await SetMedicalReviewInvalidAsync(influenceTaskList, false); - await InfluenceAddtioncalEvaluationCritrionAsync(origenalTask); + await InfluenceAddtioncalEvaluationCritrionAsync(origenalTask ,influenceTaskList.Where(t => t.Id != origenalTask.Id).Where(t => t.SourceSubjectVisitId != null).Select(t => (Guid)t.SourceSubjectVisitId).Distinct().ToList()); trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Return }); } @@ -2157,6 +2166,8 @@ namespace IRaCIS.Core.Application.Service.Allocation // influenceTask.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = t.Id }); //}); + await InfluenceAddtioncalEvaluationCritrionAsync(task, influenceTaskList.Where(t => t.Id != task.Id).Where(t => t.SourceSubjectVisitId != null).Select(t => (Guid)t.SourceSubjectVisitId).Distinct().ToList()); + await SetReReadingOrBackInfluenceAnalysisAsync(influenceTask.SubjectId); await SetMedicalReviewInvalidAsync(influenceTaskList); @@ -2283,7 +2294,7 @@ namespace IRaCIS.Core.Application.Service.Allocation - await InfluenceAddtioncalEvaluationCritrionAsync(task); + await _visitTaskRepository.SaveChangesAsync(); @@ -2296,7 +2307,7 @@ namespace IRaCIS.Core.Application.Service.Allocation /// 如果是基线退回 影响附加评估标准 是否参与评估 /// /// - private async Task InfluenceAddtioncalEvaluationCritrionAsync(VisitTask task) + private async Task InfluenceAddtioncalEvaluationCritrionAsync(VisitTask task,List otherVisitIdList) { if (_subjectVisitRepository.Any(t => t.Id == task.SourceSubjectVisitId && t.IsBaseLine)) @@ -2312,6 +2323,32 @@ namespace IRaCIS.Core.Application.Service.Allocation //删除筛选的序列数据 await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterion.IsAutoCreate == false && t.SubjectVisit.SubjectId == task.SubjectId); } + else + { + //当前访视筛选状态重置,任务生成状态重置 + if(task.SourceSubjectVisitId != null) + { + await _subjectCriteriaEvaluationVisitFilterRepository.UpdatePartialFromQueryAsync(t => t.TrialReadingCriterion.IsAutoCreate == false && t.SubjectVisit.SubjectId == task.SubjectId && t.SubjectVisitId == task.SourceSubjectVisitId, + t => new SubjectCriteriaEvaluationVisitFilter() + { + ImageFilterState = ImageFilterState.None, + ImageDeterminationResultState = ImageDeterminationResultState.None, + IsGeneratedTask = false + }); + + //删除序列数据 + await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterion.IsAutoCreate == false && t.SubjectVisit.SubjectId == task.SubjectId && t.SubjectVisitId == task.SourceSubjectVisitId); + } + + + //BM后续访视 ,筛选状态不变,任务生成状态重置(实际该访视任务状态 可能是重阅重置了或者失效了,需要后续生成,或者取消分配了,需要后续重新分配) + await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.TrialReadingCriterion.IsAutoCreate == false && t.SubjectVisit.SubjectId == task.SubjectId && otherVisitIdList.Contains(t.SubjectVisitId), + t => new SubjectCriteriaEvaluationVisitFilter() + { + IsGeneratedTask = false + }); + } + } //包括临床数据签名状态 diff --git a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs index fa9b9cfc7..81b24a7be 100644 --- a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs +++ b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs @@ -135,7 +135,7 @@ namespace IRaCIS.Core.Application.Service { QuestionId = u.ReadingQuestionTrialId, Answer = u.Answer, - ArmEnum=u.VisitTask.ArmEnum, + ArmEnum = u.VisitTask.ArmEnum, FinalTranslateDictionaryCode = u.ReadingQuestionTrial.DictionaryCode }).ToList() @@ -376,18 +376,14 @@ namespace IRaCIS.Core.Application.Service foreach (var item in list) { - await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddAsync(new SubjectCriteriaEvaluationVisitStudyFilter { SubjectVisitId = subjectVisitId, SeriesId = item.SeriesId, TrialReadingCriterionId = trialReadingCriterionId, StudyId = item.StudyId, IsConfirmed = true,IsReading=true }); + await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddAsync(new SubjectCriteriaEvaluationVisitStudyFilter { SubjectVisitId = subjectVisitId, SeriesId = item.SeriesId, TrialReadingCriterionId = trialReadingCriterionId, StudyId = item.StudyId, IsConfirmed = true, IsReading = true }); } //自动生成任务 - if (!await _repository.AnyAsync(t => t.SourceSubjectVisitId == subjectVisitId && t.TrialReadingCriterionId == trialReadingCriterionId && t.TaskState == TaskState.Effect)) - { - var trialId = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => t.TrialId).FirstOrDefault(); - - await _IVisitTaskHelpeService.BaseCritrionGenerateVisitTask(trialId, trialReadingCriterionId, true, new List() { subjectVisitId }); - } + var trialId = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => t.TrialId).FirstOrDefault(); + await _IVisitTaskHelpeService.BaseCritrionGenerateVisitTask(trialId, trialReadingCriterionId, true, new List() { subjectVisitId }); } } @@ -430,7 +426,7 @@ namespace IRaCIS.Core.Application.Service TrialId = subjectVisit.TrialId, SubjectId = subjectVisit.SubjectId, SubjectCode = subjectVisit.Subject.Code, - SiteId=subjectVisit.SiteId, + SiteId = subjectVisit.SiteId, TrialReadingCriterionId = inQuery.TrialReadingCriterionId, LatestScanDate = subjectVisit.LatestScanDate, EarliestScanDate = subjectVisit.LatestScanDate, @@ -647,7 +643,7 @@ namespace IRaCIS.Core.Application.Service influenceTask.OptType = influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned ? ReReadingOrBackOptType.Return : ReReadingOrBackOptType.Abandon; } } - + return (list, new { IsIRAppyTaskInfluenced = isIRAppyTaskInfluenced }); } @@ -752,17 +748,32 @@ namespace IRaCIS.Core.Application.Service //将筛选的访视 序列状态重置 - //重置访视数据 - await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.SubjectId == command.SubjectId && subjectVisitIdLsit.Contains(t.SubjectVisitId), + + //当前申请影像回退的访视 筛选状态重置,任务生成状态重置 + + + var otherVisitIdList = subjectVisitIdLsit.Where(t => t != command.SubjectVisitId).ToList(); + + await _subjectCriteriaEvaluationVisitFilterRepository.UpdatePartialFromQueryAsync(t => t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.SubjectId == command.SubjectId && t.SubjectVisitId == command.SubjectVisitId, t => new SubjectCriteriaEvaluationVisitFilter() { ImageFilterState = ImageFilterState.None, ImageDeterminationResultState = ImageDeterminationResultState.None, - IsGeneratedTask=false + IsGeneratedTask = false }); //删除序列数据 - await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == command.TrialReadingCriterionId && subjectVisitIdLsit.Contains(t.SubjectVisitId)); + await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.SubjectVisitId == command.SubjectVisitId); + + //BM后续访视 ,筛选状态不变,任务生成状态重置(实际该访视任务状态 可能是重阅重置了或者失效了,需要后续生成,或者取消分配了,需要后续重新分配) + await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.SubjectId == command.SubjectId && otherVisitIdList.Contains(t.SubjectVisitId), + t => new SubjectCriteriaEvaluationVisitFilter() + { + IsGeneratedTask = false + }); + + + await _visitTaskRepository.SaveChangesAsync(); } diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs index 7e341827a..7155d8ed6 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs @@ -25,15 +25,20 @@ namespace IRaCIS.Core.Application.Triggers private readonly IRepository _SubjectCriteriaEvaluationVisitFilterRepository; + + private readonly ISubjectCriteriaEvaluationService _subjectCriteriaEvaluationService; + private readonly IRepository _subjectCriteriaEvaluationRepository; + public SubjectVisitCheckPassedTrigger(IRepository subjectRepository, IRepository clinicalDataTrialSetRepository, IRepository readingClinicalDataRepository, IVisitTaskHelpeService visitTaskHelpeService, IRepository trialReadingCriterionRepository, - IRepository subjectCriteriaEvaluationVisitFilterRepository, ISubjectCriteriaEvaluationService subjectCriteriaEvaluationService) + IRepository subjectCriteriaEvaluationVisitFilterRepository, ISubjectCriteriaEvaluationService subjectCriteriaEvaluationService + , IRepository subjectCriteriaEvaluationRepository) { - + _subjectCriteriaEvaluationRepository= subjectCriteriaEvaluationRepository; _subjectRepository = subjectRepository; _clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; _readingClinicalDataRepository = readingClinicalDataRepository; @@ -66,7 +71,7 @@ namespace IRaCIS.Core.Application.Triggers context.Entity.IsPMBackOrReReading = false; //找到手动生成任务的标准 - var criterionList = await _trialReadingCriterionRepository.Where(t => t.IsAutoCreate == false && t.IsSigned == true).Select(t => new { t.Id, t.TrialId }).ToListAsync(); + var criterionList = await _trialReadingCriterionRepository.Where(t => t.IsAutoCreate == false && t.IsSigned == true).Select(t => new { t.Id, t.TrialId,t.IsReadingTaskViewInOrder }).ToListAsync(); foreach (var criterion in criterionList) { @@ -75,7 +80,16 @@ namespace IRaCIS.Core.Application.Triggers // await _SubjectCriteriaEvaluationVisitFilterRepository.AddAsync(new SubjectCriteriaEvaluationVisitFilter() { SubjectId = subjectVisit.SubjectId, SubjectVisitId = subjectVisit.Id, TrialReadingCriterionId = criterion.Id }); //} - await _subjectCriteriaEvaluationService.AutoSubjectCriteriaEvaluationVisitFilter(subjectVisit.SubjectId, subjectVisit.Id, criterion.Id); + //如果参与评估,那么久对当前访视进行自动筛选 + if( await _subjectCriteriaEvaluationRepository.AnyAsync(t=>t.SubjectId==subjectVisit.SubjectId && t.TrialReadingCriterionId==criterion.Id && t.IsJoinEvaluation)) + { + await _subjectCriteriaEvaluationService.AutoSubjectCriteriaEvaluationVisitFilter(subjectVisit.SubjectId, subjectVisit.Id, criterion.Id); + + } + + + + } await _visitTaskHelpeService.GenerateVisitTaskAsync(subjectVisit.TrialId, new List() { subjectVisit.Id }, true); diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index fb0fc11e9..728211e5e 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -120,6 +120,9 @@ namespace IRaCIS.Core.Domain.Models public Subject Subject { get; set; } + [JsonIgnore] + + public SubjectCriteriaEvaluationVisitFilter SubjectCriteriaEvaluationVisitFilter { get; set;} [JsonIgnore] public List TaskMedicalReviewList { get; set; } diff --git a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs index e5ec08770..baeef00f4 100644 --- a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs +++ b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs @@ -7,6 +7,8 @@ using System; using IRaCIS.Core.Domain.Share; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Collections.Generic; + namespace IRaCIS.Core.Domain.Models { /// @@ -17,6 +19,9 @@ namespace IRaCIS.Core.Domain.Models { [JsonIgnore] + + public List SubjectCriterionTaskList { get; set; } + [JsonIgnore] [ForeignKey("TrialReadingCriterionId")] public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; } [JsonIgnore] diff --git a/IRaCIS.Core.Domain/Visit/Subject.cs b/IRaCIS.Core.Domain/Visit/Subject.cs index 2a901ed65..66a00fed3 100644 --- a/IRaCIS.Core.Domain/Visit/Subject.cs +++ b/IRaCIS.Core.Domain/Visit/Subject.cs @@ -29,6 +29,10 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] public List SubjectCriteriaEvaluationList { get; set; } + + [JsonIgnore] + public List SubjectCriteriaEvaluationVisitFilterList { get; set; } + [JsonIgnore] public List SubjectAdditionalEvaluationResult { get; set; } diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs index 54171066f..2bfb1dbca 100644 --- a/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs @@ -35,4 +35,19 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration } } + + public class SubjectCriteriaEvaluationVisitFilterConfigration : IEntityTypeConfiguration + { + + + public void Configure(EntityTypeBuilder builder) + { + builder + .HasMany(s => s.SubjectCriterionTaskList) + .WithOne(c => c.SubjectCriteriaEvaluationVisitFilter) + .HasForeignKey(s => new { s.SubjectId, s.TrialReadingCriterionId }) + .HasPrincipalKey(c => new { c.SubjectId, c.TrialReadingCriterionId }); + + } + } }