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 });
+
+ }
+ }
}