附加评估

Uat_Study
hang 2023-03-20 17:18:03 +08:00
parent 107c95aa9f
commit 7d17d993af
16 changed files with 445 additions and 171 deletions

View File

@ -1953,16 +1953,22 @@
<param name="inQuery"></param> <param name="inQuery"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.SubjectCriteriaEvaluationService.AddOrUpdateSubjectCriteriaEvaluation(IRaCIS.Core.Application.ViewModel.SubjectCriteriaEvaluationAddOrEdit)"> <member name="M:IRaCIS.Core.Application.Service.SubjectCriteriaEvaluationService.BatchAddOrUpdateSubjectCriteriaEvaluation(System.Collections.Generic.List{IRaCIS.Core.Application.ViewModel.SubjectCriteriaEvaluationAddOrEdit})">
<summary> <summary>
添加 编辑 是否参与评估 添加 编辑 是否参与评估
</summary> </summary>
<param name="addOrEditSubjectCriteriaEvaluation"></param> <param name="addOrEditSubjectCriteriaEvaluationList"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.SubjectCriteriaEvaluationService.AutoSubjectCriteriaEvaluationVisitFilter(System.Guid,System.Guid,System.Guid)">
<summary>
自动访视筛选 (针对单一访视,重新筛选一遍,可能不存在该结果,仅仅留存)
</summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.SubjectCriteriaEvaluationService.GetSubjectCriteriaEvaluationVisitFilterList(IRaCIS.Core.Application.ViewModel.SubjectCriteriaEvaluationVisitFilterQuery)"> <member name="M:IRaCIS.Core.Application.Service.SubjectCriteriaEvaluationService.GetSubjectCriteriaEvaluationVisitFilterList(IRaCIS.Core.Application.ViewModel.SubjectCriteriaEvaluationVisitFilterQuery)">
<summary> <summary>
评估访视筛选列表 评估访视筛选列表(一致性核查通过的访视都会出现 根据条件筛选)
</summary> </summary>
<param name="inQuery"></param> <param name="inQuery"></param>
<returns></returns> <returns></returns>
@ -1974,11 +1980,10 @@
<param name="inQuery"></param> <param name="inQuery"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.SubjectCriteriaEvaluationService.AddOrUpdateSubjectCriteriaEvaluationVisitFilter(IRaCIS.Core.Application.ViewModel.SubjectCriteriaEvaluationVisitFilterAddOrEdit)"> <member name="M:IRaCIS.Core.Application.Service.SubjectCriteriaEvaluationService.BatchGenerateTask(IRaCIS.Core.Application.ViewModel.BatchGenerateTaskCommand)">
<summary> <summary>
评估访视 判断结果 影像筛选状态 手动添加/编辑接口 批量勾选 生成该标准的任务
</summary> </summary>
<param name="addOrEditSubjectCriteriaEvaluationVisitFilter"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.SubjectCriteriaEvaluationService.GetVisitStudyAndSeriesList(IRaCIS.Core.Application.ViewModel.VisitStudyAndSeriesQuery)"> <member name="M:IRaCIS.Core.Application.Service.SubjectCriteriaEvaluationService.GetVisitStudyAndSeriesList(IRaCIS.Core.Application.ViewModel.VisitStudyAndSeriesQuery)">

View File

@ -15,6 +15,6 @@ namespace IRaCIS.Core.Application.Service
Task AddTaskAsync(GenerateTaskCommand generateTaskCommand); Task AddTaskAsync(GenerateTaskCommand generateTaskCommand);
Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId); Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId,bool? isManualSelectVisit=null,List<Guid>? subjectVisitIdList=null);
} }
} }

View File

@ -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<Guid>? subjectVisitIdList = null)
{
var needGenerateVisit = new List<SubjectVisit>();
if (isManualSelectVisit == null)
{ {
//找到一致性核查通过且没有产生任务的访视 //找到一致性核查通过且没有产生任务的访视
var needGenerateVisit = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.CheckState == CheckStateEnum.CVPassed && 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(); !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(); 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();
@ -319,6 +328,7 @@ namespace IRaCIS.Core.Application.Service
private bool IsNeedClinicalDataSign(ReadingCategory readingCategory, bool isbaseLine, Guid trialReadingCriterionId, List<ClinicalDataTrialSet> trialClinicalDataSetList) private bool IsNeedClinicalDataSign(ReadingCategory readingCategory, bool isbaseLine, Guid trialReadingCriterionId, List<ClinicalDataTrialSet> trialClinicalDataSetList)
{ {
//访视 //访视

View File

@ -11,8 +11,11 @@ using System.ComponentModel.DataAnnotations;
namespace IRaCIS.Core.Application.ViewModel namespace IRaCIS.Core.Application.ViewModel
{ {
/// <summary> SubjectCriteriaEvaluationView 列表视图模型 </summary> /// <summary> SubjectCriteriaEvaluationView 列表视图模型 </summary>
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 DateTime? CreateTime { get; set; }
public Guid? CreateUserId { get; set; } public Guid? CreateUserId { get; set; }
@ -22,12 +25,26 @@ namespace IRaCIS.Core.Application.ViewModel
public bool? IsImageFiltering { get; set; } public bool? IsImageFiltering { get; set; }
public new bool? IsJoinEvaluation { get; set; } public bool? IsJoinEvaluation { get; set; }
public string SubjectCode { get; set; } public string SubjectCode { get; set; }
public string TrialSiteCode { get; set; } public string TrialSiteCode { get; set; }
public SubjectStatus SubjectStatus { get; set; } public SubjectStatus SubjectStatus { get; set; }
public List<EvaluationInfo> 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
///<summary>SubjectCriteriaEvaluationQuery 列表查询参数模型</summary> ///<summary>SubjectCriteriaEvaluationQuery 列表查询参数模型</summary>
public class SubjectCriteriaEvaluationQuery : PageInput public class SubjectCriteriaEvaluationQuery : PageInput
{ {
[NotDefault]
public Guid TrialId { get; set; }
[NotDefault] [NotDefault]
public Guid TrialReadingCriterionId { get; set; } public Guid TrialReadingCriterionId { get; set; }
public string SubjectCode { get; set; } = string.Empty; public string SubjectCode { get; set; } = string.Empty;

View File

@ -18,8 +18,8 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid? UpdateUserId { get; set; } public Guid? UpdateUserId { get; set; }
public DateTime? UpdateTime { get; set; } public DateTime? UpdateTime { get; set; }
public new int? ImageFilterState { get; set; } public new ImageFilterState? ImageFilterState { get; set; }
public new int? ImageDeterminationResultState { get; set; } public new ImageDeterminationResultState? ImageDeterminationResultState { get; set; }
public bool? IsGeneratedTask { get; set; } public bool? IsGeneratedTask { get; set; }
@ -39,9 +39,9 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid SubjectId { get; set; } 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; } public bool? IsGeneratedTask { get; set; }
} }
@ -56,6 +56,21 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid SubjectId { get; set; } 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<Guid> SubjectVisitIdList { get; set; }
}
public class VisitStudyAndSeriesQuery public class VisitStudyAndSeriesQuery
{ {
[NotDefault] [NotDefault]

View File

@ -34,6 +34,8 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid SubjectVisitId { get; set; } public Guid SubjectVisitId { get; set; }
public Guid StudyId { get; set; } public Guid StudyId { get; set; }
public Guid SeriesId { get; set; } public Guid SeriesId { get; set; }
public bool IsConfirmed { get; set; }
} }

View File

@ -16,10 +16,10 @@ namespace IRaCIS.Core.Application.Interfaces
Task<PageOutput<SubjectCriteriaEvaluationView>> GetSubjectCriteriaEvaluationList(SubjectCriteriaEvaluationQuery inQuery); Task<PageOutput<SubjectCriteriaEvaluationView>> GetSubjectCriteriaEvaluationList(SubjectCriteriaEvaluationQuery inQuery);
Task<IResponseOutput> AddOrUpdateSubjectCriteriaEvaluation(SubjectCriteriaEvaluationAddOrEdit addOrEditSubjectCriteriaEvaluation); //Task<IResponseOutput> AddOrUpdateSubjectCriteriaEvaluation(SubjectCriteriaEvaluationAddOrEdit addOrEditSubjectCriteriaEvaluation);
//Task<IResponseOutput> DeleteSubjectCriteriaEvaluation(Guid subjectCriteriaEvaluationId); //Task<IResponseOutput> DeleteSubjectCriteriaEvaluation(Guid subjectCriteriaEvaluationId);
Task AutoSubjectCriteriaEvaluationVisitFilter(Guid subjectId, Guid subjectVisitId, Guid trialReadingCriterionId);
} }
} }

View File

@ -11,6 +11,9 @@ using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Application.Contracts.DTO; using IRaCIS.Core.Application.Contracts.DTO;
using System.Linq; using System.Linq;
using System.Linq.Dynamic.Core; using System.Linq.Dynamic.Core;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.Contracts;
using DocumentFormat.OpenXml.Spreadsheet;
namespace IRaCIS.Core.Application.Service namespace IRaCIS.Core.Application.Service
{ {
@ -27,17 +30,23 @@ namespace IRaCIS.Core.Application.Service
private readonly IRepository<SubjectCriteriaEvaluationVisitFilter> _subjectCriteriaEvaluationVisitFilterRepository; private readonly IRepository<SubjectCriteriaEvaluationVisitFilter> _subjectCriteriaEvaluationVisitFilterRepository;
private readonly IRepository<SubjectCriteriaEvaluationVisitStudyFilter> _subjectCriteriaEvaluationVisitStudyFilterRepository; private readonly IRepository<SubjectCriteriaEvaluationVisitStudyFilter> _subjectCriteriaEvaluationVisitStudyFilterRepository;
private readonly IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository;
private readonly IVisitTaskHelpeService _IVisitTaskHelpeService;
public SubjectCriteriaEvaluationService(IRepository<SubjectCriteriaEvaluation> subjectCriteriaEvaluationRepository, IRepository<Subject> subjectRepository, public SubjectCriteriaEvaluationService(IRepository<SubjectCriteriaEvaluation> subjectCriteriaEvaluationRepository, IRepository<Subject> subjectRepository,
IRepository<SubjectCriteriaEvaluationVisitFilter> subjectCriteriaEvaluationVisitFilterRepository, IRepository<SubjectVisit> subjectVisitRepository, IRepository<SubjectCriteriaEvaluationVisitFilter> subjectCriteriaEvaluationVisitFilterRepository, IRepository<SubjectVisit> subjectVisitRepository,
IRepository<SubjectCriteriaEvaluationVisitStudyFilter> subjectCriteriaEvaluationVisitStudyFilterRepository) IRepository<SubjectCriteriaEvaluationVisitStudyFilter> subjectCriteriaEvaluationVisitStudyFilterRepository,
IRepository<ReadingQuestionCriterionTrial> trialReadingCriterionRepository, IVisitTaskHelpeService IVisitTaskHelpeService)
{ {
_subjectCriteriaEvaluationRepository = subjectCriteriaEvaluationRepository; _subjectCriteriaEvaluationRepository = subjectCriteriaEvaluationRepository;
_subjectRepository = subjectRepository; _subjectRepository = subjectRepository;
_subjectCriteriaEvaluationVisitFilterRepository = subjectCriteriaEvaluationVisitFilterRepository; _subjectCriteriaEvaluationVisitFilterRepository = subjectCriteriaEvaluationVisitFilterRepository;
_subjectVisitRepository = subjectVisitRepository; _subjectVisitRepository = subjectVisitRepository;
_subjectCriteriaEvaluationVisitStudyFilterRepository = subjectCriteriaEvaluationVisitStudyFilterRepository; _subjectCriteriaEvaluationVisitStudyFilterRepository = subjectCriteriaEvaluationVisitStudyFilterRepository;
_trialReadingCriterionRepository = trialReadingCriterionRepository;
_IVisitTaskHelpeService = IVisitTaskHelpeService;
} }
@ -51,7 +60,20 @@ namespace IRaCIS.Core.Application.Service
public async Task<PageOutput<SubjectCriteriaEvaluationView>> GetSubjectCriteriaEvaluationList(SubjectCriteriaEvaluationQuery inQuery) public async Task<PageOutput<SubjectCriteriaEvaluationView>> 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.SubjectCode), t => t.Code.Contains(inQuery.SubjectCode))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteCode), t => t.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteCode), t => t.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode))
.WhereIf(inQuery.SubjectStatus != null, t => t.Status == inQuery.SubjectStatus) .WhereIf(inQuery.SubjectStatus != null, t => t.Status == inQuery.SubjectStatus)
@ -69,8 +91,12 @@ namespace IRaCIS.Core.Application.Service
Id = subjectCriteriaEvaluation.Id, Id = subjectCriteriaEvaluation.Id,
TrialReadingCriterionId = inQuery.TrialReadingCriterionId, TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
IsImageFiltering = subjectCriteriaEvaluation.IsImageFiltering, IsImageFiltering = subjectCriteriaEvaluation.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.ImageFilterState == ImageFilterState.None),
IsJoinEvaluation = subjectCriteriaEvaluation.IsJoinEvaluation, 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
/// <summary> /// <summary>
/// 添加 编辑 是否参与评估 /// 添加 编辑 是否参与评估
/// </summary> /// </summary>
/// <param name="addOrEditSubjectCriteriaEvaluation"></param> /// <param name="addOrEditSubjectCriteriaEvaluationList"></param>
/// <returns></returns> /// <returns></returns>
public async Task<IResponseOutput> AddOrUpdateSubjectCriteriaEvaluation(SubjectCriteriaEvaluationAddOrEdit addOrEditSubjectCriteriaEvaluation) [UnitOfWork]
public async Task<IResponseOutput> BatchAddOrUpdateSubjectCriteriaEvaluation(List<SubjectCriteriaEvaluationAddOrEdit> addOrEditSubjectCriteriaEvaluationList)
{ {
// 在此处拷贝automapper 映射 // 在此处拷贝automapper 映射
var entity = await _subjectCriteriaEvaluationRepository.InsertOrUpdateAsync(addOrEditSubjectCriteriaEvaluation, true); foreach (var addOrEditSubjectCriteriaEvaluation in addOrEditSubjectCriteriaEvaluationList)
{
return ResponseOutput.Ok(entity.Id.ToString());
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();
}
/// <summary>
/// 自动访视筛选 (针对单一访视,重新筛选一遍,可能不存在该结果,仅仅留存)
/// </summary>
/// <returns></returns>
public async Task AutoSubjectCriteriaEvaluationVisitFilter(Guid subjectId, Guid subjectVisitId, Guid trialReadingCriterionId)
{
if ((await _trialReadingCriterionRepository.FindAsync(trialReadingCriterionId)).CriterionType == CriterionType.RECIST1Pointt1_MB)
{
//如果所有访视 的所有序列部位都是脑部 那么自动筛选通过,同时需要插入序列的筛选记录
//找到该方式的所有序列
var list = await _repository.Where<DicomSeries>(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<VisitTask>(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<Guid>() { subjectVisitId});
//}
}
}
await _subjectCriteriaEvaluationVisitFilterRepository.SaveChangesAsync();
}
/// <summary> /// <summary>
/// 评估访视筛选列表 /// 评估访视筛选列表(一致性核查通过的访视都会出现 根据条件筛选)
/// </summary> /// </summary>
/// <param name="inQuery"></param> /// <param name="inQuery"></param>
/// <returns></returns> /// <returns></returns>
@ -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 join subjectCriteriaEvaluationVisitFilter in _subjectCriteriaEvaluationVisitFilterRepository
@ -147,27 +321,43 @@ namespace IRaCIS.Core.Application.Service
/// <returns></returns> /// <returns></returns>
public async Task<List<HaveGeneratedTaskDto>> GetHaveGeneratedTaskList(HaveGeneratedTaskQuery inQuery) public async Task<List<HaveGeneratedTaskDto>> GetHaveGeneratedTaskList(HaveGeneratedTaskQuery inQuery)
{ {
var list = await _repository.Where<VisitTask>(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SubjectId == inQuery.SubjectId) var list = await _repository.Where<VisitTask>(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SubjectId == inQuery.SubjectId && t.TaskState == TaskState.Effect)
.ProjectTo<HaveGeneratedTaskDto>(_mapper.ConfigurationProvider).ToListAsync(); .ProjectTo<HaveGeneratedTaskDto>(_mapper.ConfigurationProvider).ToListAsync();
return list; return list;
} }
/// <summary> /// <summary>
/// 评估访视 判断结果 影像筛选状态 手动添加/编辑接口 /// 批量勾选 生成该标准的任务
/// </summary> /// </summary>
/// <param name="addOrEditSubjectCriteriaEvaluationVisitFilter"></param>
/// <returns></returns> /// <returns></returns>
public async Task<IResponseOutput> AddOrUpdateSubjectCriteriaEvaluationVisitFilter(SubjectCriteriaEvaluationVisitFilterAddOrEdit addOrEditSubjectCriteriaEvaluationVisitFilter) [UnitOfWork]
public async Task BatchGenerateTask(BatchGenerateTaskCommand batchGenerateTaskCommand)
{ {
var entity = await _subjectCriteriaEvaluationVisitFilterRepository.InsertOrUpdateAsync(addOrEditSubjectCriteriaEvaluationVisitFilter, true); await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == batchGenerateTaskCommand.SubjectId
&& t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId
return ResponseOutput.Ok(entity.Id.ToString()); && batchGenerateTaskCommand.SubjectVisitIdList.Contains(t.SubjectVisitId), u => new SubjectCriteriaEvaluationVisitFilter { IsGeneratedTask = true });
await _IVisitTaskHelpeService.BaseCritrionGenerateVisitTask(batchGenerateTaskCommand.TrialId, batchGenerateTaskCommand.TrialReadingCriterionId, true, batchGenerateTaskCommand.SubjectVisitIdList);
} }
///// <summary>
///// 评估访视 判断结果 影像筛选状态 手动添加/编辑接口
///// </summary>
///// <param name="addOrEditSubjectCriteriaEvaluationVisitFilter"></param>
///// <returns></returns>
//public async Task<IResponseOutput> AddOrUpdateSubjectCriteriaEvaluationVisitFilter(SubjectCriteriaEvaluationVisitFilterAddOrEdit addOrEditSubjectCriteriaEvaluationVisitFilter)
//{
// var entity = await _subjectCriteriaEvaluationVisitFilterRepository.InsertOrUpdateAsync(addOrEditSubjectCriteriaEvaluationVisitFilter, true);
// return ResponseOutput.Ok(entity.Id.ToString());
//}
@ -230,7 +420,6 @@ namespace IRaCIS.Core.Application.Service
await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddRangeAsync(_mapper.Map<List<SubjectCriteriaEvaluationVisitStudyFilter>>(batchList)); await _subjectCriteriaEvaluationVisitStudyFilterRepository.AddRangeAsync(_mapper.Map<List<SubjectCriteriaEvaluationVisitStudyFilter>>(batchList));
//var entity = await _subjectCriteriaEvaluationVisitStudyFilterRepository.InsertOrUpdateAsync(addOrEditSubjectCriteriaEvaluationVisitStudyFilter, true);
return ResponseOutput.Ok(); return ResponseOutput.Ok();

View File

@ -1,6 +1,7 @@
using AutoMapper; using AutoMapper;
using EasyCaching.Core; using EasyCaching.Core;
using EntityFrameworkCore.Triggered; using EntityFrameworkCore.Triggered;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
@ -20,10 +21,17 @@ namespace IRaCIS.Core.Application.Triggers
private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository; private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository;
private readonly IRepository<ReadingClinicalData> _readingClinicalDataRepository; private readonly IRepository<ReadingClinicalData> _readingClinicalDataRepository;
private readonly IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository;
private readonly IRepository<SubjectCriteriaEvaluationVisitFilter> _SubjectCriteriaEvaluationVisitFilterRepository;
private readonly ISubjectCriteriaEvaluationService _subjectCriteriaEvaluationService;
public SubjectVisitCheckPassedTrigger(IRepository<Subject> subjectRepository, public SubjectVisitCheckPassedTrigger(IRepository<Subject> subjectRepository,
IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository, IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository,
IRepository<ReadingClinicalData> readingClinicalDataRepository, IRepository<ReadingClinicalData> readingClinicalDataRepository,
IVisitTaskHelpeService visitTaskHelpeService) IVisitTaskHelpeService visitTaskHelpeService, IRepository<ReadingQuestionCriterionTrial> trialReadingCriterionRepository,
IRepository<SubjectCriteriaEvaluationVisitFilter> subjectCriteriaEvaluationVisitFilterRepository, ISubjectCriteriaEvaluationService subjectCriteriaEvaluationService)
{ {
_subjectRepository = subjectRepository; _subjectRepository = subjectRepository;
@ -31,6 +39,9 @@ namespace IRaCIS.Core.Application.Triggers
_readingClinicalDataRepository = readingClinicalDataRepository; _readingClinicalDataRepository = readingClinicalDataRepository;
this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository;
_visitTaskHelpeService = visitTaskHelpeService; _visitTaskHelpeService = visitTaskHelpeService;
_trialReadingCriterionRepository = trialReadingCriterionRepository;
_SubjectCriteriaEvaluationVisitFilterRepository = subjectCriteriaEvaluationVisitFilterRepository;
_subjectCriteriaEvaluationService = subjectCriteriaEvaluationService;
} }
@ -54,7 +65,21 @@ namespace IRaCIS.Core.Application.Triggers
context.Entity.IsPMBackOrReReading = false; 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<Guid>() { subjectVisit.Id }, true); await _visitTaskHelpeService.GenerateVisitTaskAsync(subjectVisit.TrialId, new List<Guid>() { subjectVisit.Id }, true);
} }
} }

View File

@ -17,58 +17,44 @@ namespace IRaCIS.Core.Domain.Models
{ {
/// <summary> [JsonIgnore]
/// SubjectId [ForeignKey("TrialReadingQuestionId")]
/// </summary> public ReadingQuestionTrial TrialReadingQuestion { get; set; }
[Required]
public Guid TrialReadingQuestionId { get; set; }
public Guid SubjectId { get; set; } public Guid SubjectId { get; set; }
/// <summary>
/// TrialReadingCriterionId
/// </summary>
[Required]
public Guid TrialReadingCriterionId { get; set; } public Guid TrialReadingCriterionId { get; set; }
/// <summary>
/// CreateTime
/// </summary>
[Required]
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
/// <summary>
/// CreateUserId
/// </summary>
[Required]
public Guid CreateUserId { get; set; } public Guid CreateUserId { get; set; }
/// <summary>
/// UpdateUserId
/// </summary>
[Required]
public Guid UpdateUserId { get; set; } public Guid UpdateUserId { get; set; }
/// <summary>
/// UpdateTime
/// </summary>
[Required]
public DateTime UpdateTime { get; set; } public DateTime UpdateTime { get; set; }
/// <summary>
/// VisitTaskId
/// </summary>
public Guid? VisitTaskId { get; set; } public Guid? VisitTaskId { get; set; }
/// <summary>
/// 附加评估答案
/// </summary>
[Required]
public string Answer { get; set; } public string Answer { get; set; }
/// <summary> /// <summary>
/// 附加评估答案翻译字典 /// 附加评估答案翻译字典
/// </summary> /// </summary>
[Required] [Required]
public string TranslateDictionaryCode { get; set; } public string TranslateDictionaryCode { get; set; }=string.Empty;
/// <summary> /// <summary>
/// 是否是最终结果 /// 是否是最终结果

View File

@ -7,6 +7,8 @@ using System;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.Collections.Generic;
namespace IRaCIS.Core.Domain.Models namespace IRaCIS.Core.Domain.Models
{ {
///<summary> ///<summary>
@ -60,11 +62,15 @@ namespace IRaCIS.Core.Domain.Models
[Required] [Required]
public DateTime UpdateTime { get; set; } public DateTime UpdateTime { get; set; }
/// <summary>
/// 是否影像筛选
/// </summary> public List<SubjectCriteriaEvaluationVisitFilter> SubjectCriteriaEvaluationVisitFilterList { get; set; }
[Required]
public bool IsImageFiltering { get; set; } ///// <summary>
// /// 是否影像筛选
// /// </summary>
//[Required]
//public bool IsImageFiltering { get; set; }
} }

View File

@ -16,61 +16,39 @@ namespace IRaCIS.Core.Domain.Models
public class SubjectCriteriaEvaluationVisitFilter : Entity, IAuditUpdate, IAuditAdd public class SubjectCriteriaEvaluationVisitFilter : Entity, IAuditUpdate, IAuditAdd
{ {
public SubjectCriteriaEvaluation SubjectCriteriaEvaluation { get; set; }
/// <summary>
/// SubjectId
/// </summary>
[Required]
public Guid SubjectId { get; set; } public Guid SubjectId { get; set; }
/// <summary>
/// TrialReadingCriterionId
/// </summary>
[Required]
public Guid TrialReadingCriterionId { get; set; } public Guid TrialReadingCriterionId { get; set; }
/// <summary>
/// CreateTime
/// </summary>
[Required]
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
/// <summary>
/// CreateUserId
/// </summary>
[Required]
public Guid CreateUserId { get; set; } public Guid CreateUserId { get; set; }
/// <summary>
/// UpdateUserId
/// </summary>
[Required]
public Guid UpdateUserId { get; set; } public Guid UpdateUserId { get; set; }
/// <summary>
/// UpdateTime
/// </summary>
[Required]
public DateTime UpdateTime { get; set; } public DateTime UpdateTime { get; set; }
/// <summary>
/// SubjectVisitId
/// </summary>
[Required]
public Guid SubjectVisitId { get; set; } public Guid SubjectVisitId { get; set; }
/// <summary> /// <summary>
/// 影像筛选状态 /// 影像筛选状态
/// </summary> /// </summary>
[Required] [Required]
public int ImageFilterState { get; set; } public ImageFilterState ImageFilterState { get; set; }
/// <summary> /// <summary>
/// 影像判断结果 /// 影像判断结果
/// </summary> /// </summary>
[Required] [Required]
public int ImageDeterminationResultState { get; set; } public ImageDeterminationResultState ImageDeterminationResultState { get; set; }
/// <summary> /// <summary>
/// 是否已生成任务 /// 是否已生成任务
@ -80,4 +58,23 @@ namespace IRaCIS.Core.Domain.Models
} }
public enum ImageDeterminationResultState
{
//待定
None = 0,
//通过
Passed = 1,
}
public enum ImageFilterState
{
//默认值 待筛选
None = 0,
//已完成
Finished = 1
}
} }

View File

@ -17,8 +17,8 @@ namespace IRaCIS.Core.Domain.Models
{ {
[JsonIgnore]
public SubjectVisit SubjectVisit { get; set; }
public Guid TrialReadingCriterionId { get; set; } public Guid TrialReadingCriterionId { get; set; }

View File

@ -29,6 +29,10 @@ namespace IRaCIS.Core.Domain.Models
[JsonIgnore] [JsonIgnore]
public List<SubjectCriteriaEvaluation> SubjectCriteriaEvaluationList { get; set; } public List<SubjectCriteriaEvaluation> SubjectCriteriaEvaluationList { get; set; }
[JsonIgnore]
public List <SubjectAdditionalEvaluationResult> SubjectAdditionalEvaluationResult { get; set; }
[JsonIgnore] [JsonIgnore]
[ForeignKey("FinalSubjectVisitId")] [ForeignKey("FinalSubjectVisitId")]
public SubjectVisit FinalSubjectVisit { get; set; } public SubjectVisit FinalSubjectVisit { get; set; }

View File

@ -229,8 +229,8 @@ namespace IRaCIS.Core.Domain.Models
[JsonIgnore] [JsonIgnore]
public List<VisitTask> VisitTaskList { get; set; } = new List<VisitTask>(); public List<VisitTask> VisitTaskList { get; set; } = new List<VisitTask>();
[JsonIgnore]
public List<SubjectCriteriaEvaluationVisitFilter> SubjectCriteriaEvaluationVisitFilterList { get; set; }
public ReadingStatusEnum ReadingStatus { get; set; } public ReadingStatusEnum ReadingStatus { get; set; }

View File

@ -20,4 +20,19 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration
} }
} }
public class SubjectCriteriaEvaluationConfigration : IEntityTypeConfiguration<SubjectCriteriaEvaluation>
{
public void Configure(EntityTypeBuilder<SubjectCriteriaEvaluation> builder)
{
builder
.HasMany(s => s.SubjectCriteriaEvaluationVisitFilterList)
.WithOne(c => c.SubjectCriteriaEvaluation)
.HasForeignKey(s => new { s.SubjectId, s.TrialReadingCriterionId })
.HasPrincipalKey(c => new { c.SubjectId, c.TrialReadingCriterionId });
}
}
} }