From 7d17d993afff0a3d142fee444faa950f2b859eec Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 20 Mar 2023 17:18:03 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=84=E5=8A=A0=E8=AF=84=E4=BC=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 17 +- .../Interface/IVisitTaskHelpeService.cs | 2 +- .../Allocation/VisitTaskHelpeService.cs | 20 +- .../DTO/SubjectCriteriaEvaluationViewModel.cs | 24 +- ...tCriteriaEvaluationVisitFilterViewModel.cs | 23 +- ...eriaEvaluationVisitStudyFilterViewModel.cs | 2 + .../ISubjectCriteriaEvaluationService.cs | 8 +- .../SubjectCriteriaEvaluationService.cs | 227 ++++++++++++++++-- .../SubjectVisitCheckPassedTrigger.cs | 33 ++- .../SubjectAdditionalEvaluationResult.cs | 54 ++--- .../SubjectCriteriaEvaluation.cs | 16 +- .../SubjectCriteriaEvaluationVisitFilter.cs | 125 +++++----- ...bjectCriteriaEvaluationVisitStudyFilter.cs | 42 ++-- IRaCIS.Core.Domain/Visit/Subject.cs | 4 + IRaCIS.Core.Domain/Visit/SubjectVisit.cs | 4 +- .../TrialSiteConfigration.cs | 15 ++ 16 files changed, 445 insertions(+), 171 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 01c6b6209..db671c87b 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -1953,16 +1953,22 @@ - + 添加 编辑 是否参与评估 - + + + + + + 自动访视筛选 (针对单一访视,重新筛选一遍,可能不存在该结果,仅仅留存) + - 评估访视筛选列表 + 评估访视筛选列表(一致性核查通过的访视都会出现 根据条件筛选) @@ -1974,11 +1980,10 @@ - + - 评估访视 判断结果 影像筛选状态 手动添加/编辑接口 + 批量勾选 生成该标准的任务 - diff --git a/IRaCIS.Core.Application/Service/Allocation/Interface/IVisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/Interface/IVisitTaskHelpeService.cs index ac847dc70..e527c8301 100644 --- a/IRaCIS.Core.Application/Service/Allocation/Interface/IVisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/Interface/IVisitTaskHelpeService.cs @@ -15,6 +15,6 @@ namespace IRaCIS.Core.Application.Service Task AddTaskAsync(GenerateTaskCommand generateTaskCommand); - Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId); + Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId,bool? isManualSelectVisit=null,List? subjectVisitIdList=null); } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index 6c5a31632..481fff6da 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -90,12 +90,21 @@ namespace IRaCIS.Core.Application.Service } - //基于标准签名 产生任务 - public async Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId) + //基于标准签名 产生任务 (或者手动选择某些访视生成该标准的任务) + public async Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId, bool? isManualSelectVisit = null, List? subjectVisitIdList = null) { - //找到一致性核查通过且没有产生任务的访视 - var needGenerateVisit = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.CheckState == CheckStateEnum.CVPassed && - !t.VisitTaskList.Any(u => u.TrialReadingCriterionId == confirmedTrialReadingCriterionId && u.SourceSubjectVisitId == t.Id && u.TaskState==TaskState.Effect && u.IsAnalysisCreate==false)).ToListAsync(); + var needGenerateVisit = new List(); + + if (isManualSelectVisit == null) + { + //找到一致性核查通过且没有产生任务的访视 + needGenerateVisit = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.CheckState == CheckStateEnum.CVPassed && + !t.VisitTaskList.Any(u => u.TrialReadingCriterionId == confirmedTrialReadingCriterionId && u.SourceSubjectVisitId == t.Id && u.TaskState == TaskState.Effect && u.IsAnalysisCreate == false)).ToListAsync(); + } + else + { + needGenerateVisit = await _subjectVisitRepository.Where(t=> subjectVisitIdList.Contains(t.Id)).ToListAsync(); + } var trialReadingCriterionConfig = await _trialReadingCriterionRepository.Where(t => t.Id == confirmedTrialReadingCriterionId).Select(t => new { TrialReadingCriterionId = t.Id, t.ReadingTool, t.ReadingType, t.IsReadingTaskViewInOrder, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState, t.TaskAllocateObjEnum, t.CriterionType }).FirstOrDefaultAsync(); @@ -318,6 +327,7 @@ namespace IRaCIS.Core.Application.Service } + private bool IsNeedClinicalDataSign(ReadingCategory readingCategory, bool isbaseLine, Guid trialReadingCriterionId, List trialClinicalDataSetList) { diff --git a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationViewModel.cs b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationViewModel.cs index d19a21dad..8f6792956 100644 --- a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationViewModel.cs @@ -11,8 +11,11 @@ using System.ComponentModel.DataAnnotations; namespace IRaCIS.Core.Application.ViewModel { /// SubjectCriteriaEvaluationView 列表视图模型 - public class SubjectCriteriaEvaluationView : SubjectCriteriaEvaluationAddOrEdit + public class SubjectCriteriaEvaluationView { + public Guid? Id { get; set; } + public Guid SubjectId { get; set; } + public Guid TrialReadingCriterionId { get; set; } public DateTime? CreateTime { get; set; } public Guid? CreateUserId { get; set; } @@ -22,12 +25,26 @@ namespace IRaCIS.Core.Application.ViewModel public bool? IsImageFiltering { get; set; } - public new bool? IsJoinEvaluation { get; set; } + public bool? IsJoinEvaluation { get; set; } public string SubjectCode { get; set; } public string TrialSiteCode { get; set; } public SubjectStatus SubjectStatus { get; set; } + + public List EvaluationList { get; set; } + } + + + public class EvaluationInfo + { + public string QuestioName { get; set; } + + public string QuestioNameEn { get; set; } + + public string Answer { get; set; } + + public string FinalTranslateDictionaryCode { get; set; } = string.Empty; } @@ -35,6 +52,9 @@ namespace IRaCIS.Core.Application.ViewModel ///SubjectCriteriaEvaluationQuery 列表查询参数模型 public class SubjectCriteriaEvaluationQuery : PageInput { + [NotDefault] + public Guid TrialId { get; set; } + [NotDefault] public Guid TrialReadingCriterionId { get; set; } public string SubjectCode { get; set; } = string.Empty; diff --git a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationVisitFilterViewModel.cs b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationVisitFilterViewModel.cs index ee0c048e5..e9233a9d6 100644 --- a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationVisitFilterViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationVisitFilterViewModel.cs @@ -18,8 +18,8 @@ namespace IRaCIS.Core.Application.ViewModel public Guid? UpdateUserId { get; set; } public DateTime? UpdateTime { get; set; } - public new int? ImageFilterState { get; set; } - public new int? ImageDeterminationResultState { get; set; } + public new ImageFilterState? ImageFilterState { get; set; } + public new ImageDeterminationResultState? ImageDeterminationResultState { get; set; } public bool? IsGeneratedTask { get; set; } @@ -39,9 +39,9 @@ namespace IRaCIS.Core.Application.ViewModel public Guid SubjectId { get; set; } - public int? ImageFilterState { get; set; } + public ImageFilterState? ImageFilterState { get; set; } - public int? ImageDeterminationResultState { get; set; } + public ImageDeterminationResultState? ImageDeterminationResultState { get; set; } public bool? IsGeneratedTask { get; set; } } @@ -56,6 +56,21 @@ namespace IRaCIS.Core.Application.ViewModel public Guid SubjectId { get; set; } } + public class BatchGenerateTaskCommand + { + [NotDefault] + public Guid TrialReadingCriterionId { get; set; } + + [NotDefault] + public Guid TrialId { get; set; } + + [NotDefault] + public Guid SubjectId { get; set; } + + + public List SubjectVisitIdList { get; set; } + } + public class VisitStudyAndSeriesQuery { [NotDefault] diff --git a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationVisitStudyFilterViewModel.cs b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationVisitStudyFilterViewModel.cs index 02831b9cb..19ce6b128 100644 --- a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationVisitStudyFilterViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/DTO/SubjectCriteriaEvaluationVisitStudyFilterViewModel.cs @@ -34,6 +34,8 @@ namespace IRaCIS.Core.Application.ViewModel public Guid SubjectVisitId { get; set; } public Guid StudyId { get; set; } public Guid SeriesId { get; set; } + + public bool IsConfirmed { get; set; } } diff --git a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/Interface/ISubjectCriteriaEvaluationService.cs b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/Interface/ISubjectCriteriaEvaluationService.cs index d01e8532c..119a85055 100644 --- a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/Interface/ISubjectCriteriaEvaluationService.cs +++ b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/Interface/ISubjectCriteriaEvaluationService.cs @@ -15,11 +15,11 @@ namespace IRaCIS.Core.Application.Interfaces Task> GetSubjectCriteriaEvaluationList(SubjectCriteriaEvaluationQuery inQuery); - - Task AddOrUpdateSubjectCriteriaEvaluation(SubjectCriteriaEvaluationAddOrEdit addOrEditSubjectCriteriaEvaluation); - //Task DeleteSubjectCriteriaEvaluation(Guid subjectCriteriaEvaluationId); + //Task AddOrUpdateSubjectCriteriaEvaluation(SubjectCriteriaEvaluationAddOrEdit addOrEditSubjectCriteriaEvaluation); - + //Task DeleteSubjectCriteriaEvaluation(Guid subjectCriteriaEvaluationId); + + Task AutoSubjectCriteriaEvaluationVisitFilter(Guid subjectId, Guid subjectVisitId, Guid trialReadingCriterionId); } } diff --git a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs index 31003d425..dcb4d9b72 100644 --- a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs +++ b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs @@ -11,6 +11,9 @@ using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.Contracts.DTO; using System.Linq; using System.Linq.Dynamic.Core; +using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Application.Contracts; +using DocumentFormat.OpenXml.Spreadsheet; namespace IRaCIS.Core.Application.Service { @@ -27,17 +30,23 @@ namespace IRaCIS.Core.Application.Service private readonly IRepository _subjectCriteriaEvaluationVisitFilterRepository; private readonly IRepository _subjectCriteriaEvaluationVisitStudyFilterRepository; + private readonly IRepository _trialReadingCriterionRepository; + private readonly IVisitTaskHelpeService _IVisitTaskHelpeService; public SubjectCriteriaEvaluationService(IRepository subjectCriteriaEvaluationRepository, IRepository subjectRepository, IRepository subjectCriteriaEvaluationVisitFilterRepository, IRepository subjectVisitRepository, - IRepository subjectCriteriaEvaluationVisitStudyFilterRepository) + IRepository subjectCriteriaEvaluationVisitStudyFilterRepository, + IRepository trialReadingCriterionRepository, IVisitTaskHelpeService IVisitTaskHelpeService) { _subjectCriteriaEvaluationRepository = subjectCriteriaEvaluationRepository; _subjectRepository = subjectRepository; _subjectCriteriaEvaluationVisitFilterRepository = subjectCriteriaEvaluationVisitFilterRepository; _subjectVisitRepository = subjectVisitRepository; _subjectCriteriaEvaluationVisitStudyFilterRepository = subjectCriteriaEvaluationVisitStudyFilterRepository; + _trialReadingCriterionRepository = trialReadingCriterionRepository; + + _IVisitTaskHelpeService = IVisitTaskHelpeService; } @@ -51,7 +60,20 @@ namespace IRaCIS.Core.Application.Service public async Task> GetSubjectCriteriaEvaluationList(SubjectCriteriaEvaluationQuery inQuery) { - var subjectCriteriaEvaluationQueryable = from subject in _subjectRepository + var trialReadingCritionList = _trialReadingCriterionRepository.Where(t => t.TrialId == inQuery.TrialId).ToList(); + + var resultTrialReadingCriterionId = Guid.Empty; + + //BM 需要找基线 两个人做的结果 + if (trialReadingCritionList.First(t => t.Id == inQuery.TrialReadingCriterionId).CriterionType == CriterionType.RECIST1Pointt1_MB) + { + + resultTrialReadingCriterionId = trialReadingCritionList.First(t => t.CriterionType == CriterionType.RECIST1Point1).Id; + } + + + + var subjectCriteriaEvaluationQueryable = from subject in _subjectRepository.Where(t=>t.TrialId==inQuery.TrialId) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), t => t.Code.Contains(inQuery.SubjectCode)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteCode), t => t.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode)) .WhereIf(inQuery.SubjectStatus != null, t => t.Status == inQuery.SubjectStatus) @@ -69,8 +91,12 @@ namespace IRaCIS.Core.Application.Service Id = subjectCriteriaEvaluation.Id, TrialReadingCriterionId = inQuery.TrialReadingCriterionId, - IsImageFiltering = subjectCriteriaEvaluation.IsImageFiltering, + IsImageFiltering = subjectCriteriaEvaluation.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.ImageFilterState == ImageFilterState.None), + IsJoinEvaluation = subjectCriteriaEvaluation.IsJoinEvaluation, + + EvaluationList=subject.SubjectAdditionalEvaluationResult.Where(t=>t.IsFinalResult && t.TrialReadingCriterionId==resultTrialReadingCriterionId).Select(u=>new EvaluationInfo() + { Answer=u.Answer,FinalTranslateDictionaryCode=u.FinalTranslateDictionaryCode,QuestioName=u.TrialReadingQuestion .QuestionName,QuestioNameEn=u.TrialReadingQuestion.QuestionEnName}).ToList() }; @@ -86,22 +112,170 @@ namespace IRaCIS.Core.Application.Service /// /// 添加 编辑 是否参与评估 /// - /// + /// /// - public async Task AddOrUpdateSubjectCriteriaEvaluation(SubjectCriteriaEvaluationAddOrEdit addOrEditSubjectCriteriaEvaluation) + [UnitOfWork] + public async Task BatchAddOrUpdateSubjectCriteriaEvaluation(List addOrEditSubjectCriteriaEvaluationList) { // 在此处拷贝automapper 映射 - var entity = await _subjectCriteriaEvaluationRepository.InsertOrUpdateAsync(addOrEditSubjectCriteriaEvaluation, true); + foreach (var addOrEditSubjectCriteriaEvaluation in addOrEditSubjectCriteriaEvaluationList) + { + + + if (addOrEditSubjectCriteriaEvaluation.Id != null) + { + var entity = await _subjectCriteriaEvaluationRepository.InsertFromDTOAsync(addOrEditSubjectCriteriaEvaluation); + + //找到一致性核查通过的访视 并且没有 自动影像筛选的数据 + var subjectVisitIdList = await _subjectVisitRepository.Where(t => t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId && t.CheckState == CheckStateEnum.CVPassed + && !t.SubjectCriteriaEvaluationVisitFilterList.Any(t=>t.TrialReadingCriterionId==addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectId==addOrEditSubjectCriteriaEvaluation.SubjectId)).Select(t => t.Id) + .ToListAsync(); + + + foreach (var subjectVisitId in subjectVisitIdList) + { + await AutoSubjectCriteriaEvaluationVisitFilter(addOrEditSubjectCriteriaEvaluation.SubjectId, subjectVisitId, addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId); + } + + + } + //编辑 + else + { + //参与评估 + if (addOrEditSubjectCriteriaEvaluation.IsJoinEvaluation) + { + var dbBeforeEntity = await _subjectCriteriaEvaluationRepository.UpdateFromDTOAsync(addOrEditSubjectCriteriaEvaluation); + + //从不评估 改为评估 + if (addOrEditSubjectCriteriaEvaluation.IsJoinEvaluation != dbBeforeEntity.IsJoinEvaluation) + { + //找到一致性核查通过的访视 并且没有 自动影像筛选的数据 + var subjectVisitIdList = await _subjectVisitRepository.Where(t => t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId && t.CheckState == CheckStateEnum.CVPassed && + !t.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.TrialReadingCriterionId == addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId)). + Select(t => t.Id).ToListAsync(); + + + foreach (var subjectVisitId in subjectVisitIdList) + { + await AutoSubjectCriteriaEvaluationVisitFilter(addOrEditSubjectCriteriaEvaluation.SubjectId, subjectVisitId, addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId); + } + } + //未修改 不做任何操作 + + + } + //不参与评估 + else + { + //删除该Subject 该标准访视的所有 访视筛选记录数据 + await _subjectCriteriaEvaluationVisitFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId); + await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectVisit.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId); + } + } + + } + + await _subjectCriteriaEvaluationRepository.SaveChangesAsync(); + return ResponseOutput.Ok(); + + } + + /// + /// 自动访视筛选 (针对单一访视,重新筛选一遍,可能不存在该结果,仅仅留存) + /// + /// + public async Task AutoSubjectCriteriaEvaluationVisitFilter(Guid subjectId, Guid subjectVisitId, Guid trialReadingCriterionId) + { + + if ((await _trialReadingCriterionRepository.FindAsync(trialReadingCriterionId)).CriterionType == CriterionType.RECIST1Pointt1_MB) + { + //如果所有访视 的所有序列部位都是脑部 那么自动筛选通过,同时需要插入序列的筛选记录 + + + //找到该方式的所有序列 + var list = await _repository.Where(t => t.SubjectVisitId == subjectVisitId && t.SubjectId == subjectId).Select(t => new { SeriesId = t.Id, t.StudyId, t.BodyPartForEdit }).ToListAsync(); + + + //已经自动筛选过 + if (await _subjectCriteriaEvaluationVisitFilterRepository.AnyAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == subjectVisitId)) + { + await _subjectCriteriaEvaluationVisitFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == subjectVisitId); + + await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == subjectVisitId); + } + + //var existEntity = await _subjectCriteriaEvaluationVisitFilterRepository.FirstOrDefaultAsync(t => t.SubjectId == subjectId && t.SubjectVisitId == subjectVisitId && t.TrialReadingCriterionId == trialReadingCriterionId); + + //有不是脑部的序列 + if (list.Any(t => t.BodyPartForEdit != "脑部")) + { + + + //if (existEntity == null) + { + var addItem = new SubjectCriteriaEvaluationVisitFilter + { + SubjectVisitId = subjectVisitId, + SubjectId = subjectId, + ImageDeterminationResultState = ImageDeterminationResultState.None, + ImageFilterState = ImageFilterState.None, + TrialReadingCriterionId = trialReadingCriterionId + }; + + + var subjectCriteriaEvaluationVisitFilter = await _subjectCriteriaEvaluationVisitFilterRepository.AddAsync(addItem); + } + + } + //都是脑部的序列 + else + { + + //if (existEntity == null) + { + var addItem = new SubjectCriteriaEvaluationVisitFilter + { + SubjectVisitId = subjectVisitId, + SubjectId = subjectId, + ImageDeterminationResultState = ImageDeterminationResultState.Passed, + ImageFilterState = ImageFilterState.Finished, + TrialReadingCriterionId = trialReadingCriterionId, + //IsGeneratedTask = true + }; + + var subjectCriteriaEvaluationVisitFilter = await _subjectCriteriaEvaluationVisitFilterRepository.AddAsync(addItem); + + } + + + foreach (var item in list) + { + await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddAsync(new SubjectCriteriaEvaluationVisitStudyFilter { SubjectVisitId = subjectVisitId, SeriesId = item.SeriesId, TrialReadingCriterionId = trialReadingCriterionId, StudyId = item.StudyId, IsConfirmed = 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}); + //} + + + + } + } + + await _subjectCriteriaEvaluationVisitFilterRepository.SaveChangesAsync(); - return ResponseOutput.Ok(entity.Id.ToString()); } - /// - /// 评估访视筛选列表 + /// 评估访视筛选列表(一致性核查通过的访视都会出现 根据条件筛选) /// /// /// @@ -111,7 +285,7 @@ namespace IRaCIS.Core.Application.Service - var subjectCriteriaEvaluationVisitFilterQueryable = from subjectVisit in _subjectVisitRepository.Where(t => t.SubjectId == inQuery.SubjectId) + var subjectCriteriaEvaluationVisitFilterQueryable = from subjectVisit in _subjectVisitRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.CheckState == CheckStateEnum.CVPassed) join subjectCriteriaEvaluationVisitFilter in _subjectCriteriaEvaluationVisitFilterRepository @@ -147,27 +321,43 @@ namespace IRaCIS.Core.Application.Service /// public async Task> GetHaveGeneratedTaskList(HaveGeneratedTaskQuery inQuery) { - var list = await _repository.Where(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SubjectId == inQuery.SubjectId) + var list = await _repository.Where(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SubjectId == inQuery.SubjectId && t.TaskState == TaskState.Effect) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); return list; } /// - /// 评估访视 判断结果 影像筛选状态 手动添加/编辑接口 + /// 批量勾选 生成该标准的任务 /// - /// /// - public async Task AddOrUpdateSubjectCriteriaEvaluationVisitFilter(SubjectCriteriaEvaluationVisitFilterAddOrEdit addOrEditSubjectCriteriaEvaluationVisitFilter) + [UnitOfWork] + public async Task BatchGenerateTask(BatchGenerateTaskCommand batchGenerateTaskCommand) { - var entity = await _subjectCriteriaEvaluationVisitFilterRepository.InsertOrUpdateAsync(addOrEditSubjectCriteriaEvaluationVisitFilter, true); - - return ResponseOutput.Ok(entity.Id.ToString()); + await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == batchGenerateTaskCommand.SubjectId + && t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId + && batchGenerateTaskCommand.SubjectVisitIdList.Contains(t.SubjectVisitId), u => new SubjectCriteriaEvaluationVisitFilter { IsGeneratedTask = true }); + await _IVisitTaskHelpeService.BaseCritrionGenerateVisitTask(batchGenerateTaskCommand.TrialId, batchGenerateTaskCommand.TrialReadingCriterionId, true, batchGenerateTaskCommand.SubjectVisitIdList); } + ///// + ///// 评估访视 判断结果 影像筛选状态 手动添加/编辑接口 + ///// + ///// + ///// + //public async Task AddOrUpdateSubjectCriteriaEvaluationVisitFilter(SubjectCriteriaEvaluationVisitFilterAddOrEdit addOrEditSubjectCriteriaEvaluationVisitFilter) + //{ + + // var entity = await _subjectCriteriaEvaluationVisitFilterRepository.InsertOrUpdateAsync(addOrEditSubjectCriteriaEvaluationVisitFilter, true); + + // return ResponseOutput.Ok(entity.Id.ToString()); + + //} + + @@ -228,9 +418,8 @@ namespace IRaCIS.Core.Application.Service var ids = batchList.Select(t => t.Id).ToList(); await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => ids.Contains(t.Id)); - await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddRangeAsync(_mapper.Map >(batchList)); + await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddRangeAsync(_mapper.Map>(batchList)); - //var entity = await _subjectCriteriaEvaluationVisitStudyFilterRepository.InsertOrUpdateAsync(addOrEditSubjectCriteriaEvaluationVisitStudyFilter, true); return ResponseOutput.Ok(); diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs index 4cd05bdc5..7e341827a 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs @@ -1,6 +1,7 @@ using AutoMapper; using EasyCaching.Core; using EntityFrameworkCore.Triggered; +using IRaCIS.Core.Application.Interfaces; using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; @@ -15,15 +16,22 @@ namespace IRaCIS.Core.Application.Triggers { private readonly IVisitTaskHelpeService _visitTaskHelpeService; - + private readonly IRepository _subjectRepository; private readonly IRepository _clinicalDataTrialSetRepository; private readonly IRepository _readingClinicalDataRepository; + private readonly IRepository _trialReadingCriterionRepository; + + private readonly IRepository _SubjectCriteriaEvaluationVisitFilterRepository; + + private readonly ISubjectCriteriaEvaluationService _subjectCriteriaEvaluationService; + public SubjectVisitCheckPassedTrigger(IRepository subjectRepository, IRepository clinicalDataTrialSetRepository, IRepository readingClinicalDataRepository, - IVisitTaskHelpeService visitTaskHelpeService) + IVisitTaskHelpeService visitTaskHelpeService, IRepository trialReadingCriterionRepository, + IRepository subjectCriteriaEvaluationVisitFilterRepository, ISubjectCriteriaEvaluationService subjectCriteriaEvaluationService) { _subjectRepository = subjectRepository; @@ -31,9 +39,12 @@ namespace IRaCIS.Core.Application.Triggers _readingClinicalDataRepository = readingClinicalDataRepository; this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; _visitTaskHelpeService = visitTaskHelpeService; + _trialReadingCriterionRepository = trialReadingCriterionRepository; + _SubjectCriteriaEvaluationVisitFilterRepository = subjectCriteriaEvaluationVisitFilterRepository; + _subjectCriteriaEvaluationService = subjectCriteriaEvaluationService; } - + public async Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) { @@ -54,7 +65,21 @@ 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(); + + foreach (var criterion in criterionList) + { + //if(!await _SubjectCriteriaEvaluationVisitFilterRepository.AnyAsync(t=>t.SubjectId==subjectVisit.SubjectId&& t.SubjectVisitId==subjectVisit.Id && t.TrialReadingCriterionId == criterion.Id)) + //{ + // await _SubjectCriteriaEvaluationVisitFilterRepository.AddAsync(new SubjectCriteriaEvaluationVisitFilter() { SubjectId = subjectVisit.SubjectId, SubjectVisitId = subjectVisit.Id, TrialReadingCriterionId = criterion.Id }); + //} + + await _subjectCriteriaEvaluationService.AutoSubjectCriteriaEvaluationVisitFilter(subjectVisit.SubjectId, subjectVisit.Id, criterion.Id); + } + await _visitTaskHelpeService.GenerateVisitTaskAsync(subjectVisit.TrialId, new List() { subjectVisit.Id }, true); + } } @@ -79,7 +104,7 @@ namespace IRaCIS.Core.Application.Triggers SubjectId = context.Entity.SubjectId, ReadingId = context.Entity.Id, TrialId = context.Entity.TrialId - + }).ToList() ); diff --git a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectAdditionalEvaluationResult.cs b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectAdditionalEvaluationResult.cs index 755f4cdd3..bb5b63628 100644 --- a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectAdditionalEvaluationResult.cs +++ b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectAdditionalEvaluationResult.cs @@ -15,60 +15,46 @@ namespace IRaCIS.Core.Domain.Models [Table("SubjectAdditionalEvaluationResult")] public class SubjectAdditionalEvaluationResult : Entity, IAuditUpdate, IAuditAdd { - - /// - /// SubjectId - /// - [Required] - public Guid SubjectId { get; set; } + + [JsonIgnore] + [ForeignKey("TrialReadingQuestionId")] + public ReadingQuestionTrial TrialReadingQuestion { get; set; } + + + public Guid TrialReadingQuestionId { get; set; } + + + + + public Guid SubjectId { get; set; } - /// - /// TrialReadingCriterionId - /// - [Required] + public Guid TrialReadingCriterionId { get; set; } - /// - /// CreateTime - /// - [Required] + public DateTime CreateTime { get; set; } - /// - /// CreateUserId - /// - [Required] + public Guid CreateUserId { get; set; } - /// - /// UpdateUserId - /// - [Required] + public Guid UpdateUserId { get; set; } - /// - /// UpdateTime - /// - [Required] + public DateTime UpdateTime { get; set; } - /// - /// VisitTaskId - /// + public Guid? VisitTaskId { get; set; } - /// - /// 附加评估答案 - /// - [Required] + public string Answer { get; set; } /// /// 附加评估答案翻译字典 /// [Required] - public string TranslateDictionaryCode { get; set; } + public string TranslateDictionaryCode { get; set; }=string.Empty; /// /// 是否是最终结果 diff --git a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluation.cs b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluation.cs index 7fc6a9ac6..b70fab15c 100644 --- a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluation.cs +++ b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluation.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 { /// @@ -59,12 +61,16 @@ namespace IRaCIS.Core.Domain.Models /// [Required] public DateTime UpdateTime { get; set; } + + + + public List SubjectCriteriaEvaluationVisitFilterList { get; set; } - /// - /// 是否影像筛选 - /// - [Required] - public bool IsImageFiltering { get; set; } + ///// + // /// 是否影像筛选 + // /// + //[Required] + //public bool IsImageFiltering { get; set; } } diff --git a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs index 2ec1bbf2b..05f2f7539 100644 --- a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs +++ b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs @@ -9,75 +9,72 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace IRaCIS.Core.Domain.Models { - /// - ///SubjectCriteriaEvaluationVisitFilter - /// - [Table("SubjectCriteriaEvaluationVisitFilter")] - public class SubjectCriteriaEvaluationVisitFilter : Entity, IAuditUpdate, IAuditAdd - { - + /// + ///SubjectCriteriaEvaluationVisitFilter + /// + [Table("SubjectCriteriaEvaluationVisitFilter")] + public class SubjectCriteriaEvaluationVisitFilter : Entity, IAuditUpdate, IAuditAdd + { - - /// - /// SubjectId - /// - [Required] - public Guid SubjectId { get; set; } - - /// - /// TrialReadingCriterionId - /// - [Required] - public Guid TrialReadingCriterionId { get; set; } - - /// - /// CreateTime - /// - [Required] - public DateTime CreateTime { get; set; } - - /// - /// CreateUserId - /// - [Required] - public Guid CreateUserId { get; set; } - - /// - /// UpdateUserId - /// - [Required] - public Guid UpdateUserId { get; set; } - - /// - /// UpdateTime - /// - [Required] - public DateTime UpdateTime { get; set; } - - /// - /// SubjectVisitId - /// - [Required] - public Guid SubjectVisitId { get; set; } - - /// + public SubjectCriteriaEvaluation SubjectCriteriaEvaluation { get; set; } + + + public Guid SubjectId { get; set; } + + + public Guid TrialReadingCriterionId { get; set; } + + public DateTime CreateTime { get; set; } + + + public Guid CreateUserId { get; set; } + + + public Guid UpdateUserId { get; set; } + + + public DateTime UpdateTime { get; set; } + + + public Guid SubjectVisitId { get; set; } + + /// /// 影像筛选状态 /// - [Required] - public int ImageFilterState { get; set; } - - /// + [Required] + public ImageFilterState ImageFilterState { get; set; } + + /// /// 影像判断结果 /// - [Required] - public int ImageDeterminationResultState { get; set; } - - /// + [Required] + public ImageDeterminationResultState ImageDeterminationResultState { get; set; } + + /// /// 是否已生成任务 /// - [Required] - public bool IsGeneratedTask { get; set; } - - } + [Required] + public bool IsGeneratedTask { get; set; } -} + } + + + public enum ImageDeterminationResultState + { + //待定 + None = 0, + + //通过 + Passed = 1, + } + + public enum ImageFilterState + { + //默认值 待筛选 + None = 0, + + //已完成 + Finished = 1 + } + +} diff --git a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitStudyFilter.cs b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitStudyFilter.cs index a122561d6..1ad1efd2e 100644 --- a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitStudyFilter.cs +++ b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitStudyFilter.cs @@ -9,18 +9,18 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace IRaCIS.Core.Domain.Models { - /// - ///SubjectCriteriaEvaluationVisitStudyFilter - /// - [Table("SubjectCriteriaEvaluationVisitStudyFilter")] - public class SubjectCriteriaEvaluationVisitStudyFilter : Entity, IAuditUpdate, IAuditAdd - { - + /// + ///SubjectCriteriaEvaluationVisitStudyFilter + /// + [Table("SubjectCriteriaEvaluationVisitStudyFilter")] + public class SubjectCriteriaEvaluationVisitStudyFilter : Entity, IAuditUpdate, IAuditAdd + { - + [JsonIgnore] + public SubjectVisit SubjectVisit { get; set; } - public Guid TrialReadingCriterionId { get; set; } + public Guid TrialReadingCriterionId { get; set; } public Guid SubjectVisitId { get; set; } @@ -34,18 +34,18 @@ namespace IRaCIS.Core.Domain.Models public DateTime CreateTime { get; set; } - - - public Guid CreateUserId { get; set; } - - - public Guid UpdateUserId { get; set; } - - - public DateTime UpdateTime { get; set; } - - } + public Guid CreateUserId { get; set; } -} + + public Guid UpdateUserId { get; set; } + + + public DateTime UpdateTime { get; set; } + + + + } + +} diff --git a/IRaCIS.Core.Domain/Visit/Subject.cs b/IRaCIS.Core.Domain/Visit/Subject.cs index 0858a9fdf..0a16d6309 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 SubjectAdditionalEvaluationResult { get; set; } + [JsonIgnore] [ForeignKey("FinalSubjectVisitId")] public SubjectVisit FinalSubjectVisit { get; set; } diff --git a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs index 2b36d9fe6..cf80c30b2 100644 --- a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs +++ b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs @@ -229,8 +229,8 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] public List VisitTaskList { get; set; } = new List(); - - + [JsonIgnore] + public List SubjectCriteriaEvaluationVisitFilterList { get; set; } public ReadingStatusEnum ReadingStatus { get; set; } diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs index 1d7ebd30f..54171066f 100644 --- a/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs @@ -20,4 +20,19 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration } } + + public class SubjectCriteriaEvaluationConfigration : IEntityTypeConfiguration + { + + + public void Configure(EntityTypeBuilder builder) + { + builder + .HasMany(s => s.SubjectCriteriaEvaluationVisitFilterList) + .WithOne(c => c.SubjectCriteriaEvaluation) + .HasForeignKey(s => new { s.SubjectId, s.TrialReadingCriterionId }) + .HasPrincipalKey(c => new { c.SubjectId, c.TrialReadingCriterionId }); + + } + } }