修改附加评估提交

This commit is contained in:
2023-03-23 15:06:09 +08:00
parent bd028771b6
commit c28fbf0093
11 changed files with 324 additions and 91 deletions
@@ -35,7 +35,7 @@ namespace IRaCIS.Core.Application.ViewModel
public List<EvaluationInfo> FinalEvaluationList { get; set; }=new List<EvaluationInfo>();
public List<EvaluationInfo> ReadingEvaluationList { get; set; }
public List<EvaluationInfo> ReadingEvaluationList { get; set; }=new List<EvaluationInfo>();
}
@@ -19,7 +19,11 @@ namespace IRaCIS.Core.Application.ViewModel
public DateTime? UpdateTime { get; set; }
public Guid? Id { get; set; }
public Guid TrialId { get; set; }
public Guid SubjectId { get; set; }
public string SubjectCode { get; set; }
public Guid TrialReadingCriterionId { get; set; }
public Guid SubjectVisitId { get; set; }
@@ -78,6 +82,22 @@ namespace IRaCIS.Core.Application.ViewModel
public List<Guid> SubjectVisitIdList { get; set; }=new List<Guid>();
}
public class CriteriaVisitBackCommand
{
[NotDefault]
public Guid TrialReadingCriterionId { get; set; }
[NotDefault]
public Guid TrialId { get; set; }
[NotDefault]
public Guid SubjectId { get; set; }
[NotDefault]
public Guid SubjectVisitId { get; set; }
}
public class VisitStudyAndSeriesQuery
{
[NotDefault]
@@ -18,6 +18,7 @@ using Panda.DynamicWebApi.Attributes;
using IRaCIS.Core.Domain.Share.Reading;
using System.Runtime.InteropServices;
using DocumentFormat.OpenXml.Bibliography;
using System.Linq.Expressions;
namespace IRaCIS.Core.Application.Service
{
@@ -38,12 +39,15 @@ namespace IRaCIS.Core.Application.Service
private readonly IRepository<ReadingQuestionTrial> _trialReadingQuestionRepository;
private readonly IRepository<VisitTask> _visitTaskRepository;
private readonly IVisitTaskHelpeService _IVisitTaskHelpeService;
private readonly IRepository<TaskMedicalReview> _taskMedicalReviewRepository;
public SubjectCriteriaEvaluationService(IRepository<SubjectCriteriaEvaluation> subjectCriteriaEvaluationRepository, IRepository<Subject> subjectRepository,
IRepository<SubjectCriteriaEvaluationVisitFilter> subjectCriteriaEvaluationVisitFilterRepository, IRepository<SubjectVisit> subjectVisitRepository,
IRepository<SubjectCriteriaEvaluationVisitStudyFilter> subjectCriteriaEvaluationVisitStudyFilterRepository,
IRepository<ReadingQuestionCriterionTrial> trialReadingCriterionRepository, IVisitTaskHelpeService IVisitTaskHelpeService, IRepository<ReadingQuestionTrial> trialReadingQuestionRepository)
IRepository<ReadingQuestionCriterionTrial> trialReadingCriterionRepository, IVisitTaskHelpeService IVisitTaskHelpeService, IRepository<ReadingQuestionTrial> trialReadingQuestionRepository, IRepository<VisitTask> visitTaskRepository, IRepository<TaskMedicalReview> taskMedicalReviewRepository)
{
_subjectCriteriaEvaluationRepository = subjectCriteriaEvaluationRepository;
_subjectRepository = subjectRepository;
@@ -55,7 +59,8 @@ namespace IRaCIS.Core.Application.Service
_IVisitTaskHelpeService = IVisitTaskHelpeService;
_trialReadingQuestionRepository = trialReadingQuestionRepository;
_visitTaskRepository = visitTaskRepository;
_taskMedicalReviewRepository = taskMedicalReviewRepository;
}
@@ -65,14 +70,14 @@ namespace IRaCIS.Core.Application.Service
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<(PageOutput<SubjectCriteriaEvaluationView>,object)> GetSubjectCriteriaEvaluationList(SubjectCriteriaEvaluationQuery inQuery)
public async Task<(PageOutput<SubjectCriteriaEvaluationView>, object)> GetSubjectCriteriaEvaluationList(SubjectCriteriaEvaluationQuery inQuery)
{
var trialReadingCritionList = _trialReadingCriterionRepository.Where(t => t.TrialId == inQuery.TrialId).ToList();
var resultTrialReadingCriterionId = Guid.Empty;
var resultTrialReadingCriterion = trialReadingCritionList.First();
var resultTrialReadingCriterion = trialReadingCritionList.First();
var curentCriterionType = CriterionType.NoCriterion;
@@ -89,15 +94,15 @@ namespace IRaCIS.Core.Application.Service
var addtionalQustionInfoList = _trialReadingQuestionRepository.Where(t => t.ReadingQuestionCriterionTrialId == resultTrialReadingCriterionId && t.IsAdditional == true && t.Type != "group").IgnoreQueryFilters().Select(t => new
{
QuestionId= t.Id,
QuestionId = t.Id,
t.QuestionEnName,
t.QuestionName
}).ToList();
var questionIdList= addtionalQustionInfoList.Select(t=>t.QuestionId).ToList();
var questionIdList = addtionalQustionInfoList.Select(t => t.QuestionId).ToList();
var subjectCriteriaEvaluationQueryable = from subject in _subjectRepository.Where(t=>t.TrialId==inQuery.TrialId)
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)
@@ -120,25 +125,18 @@ namespace IRaCIS.Core.Application.Service
IsJoinEvaluation = subjectCriteriaEvaluation.IsJoinEvaluation,
ReadingEvaluationList= subject.ReadingTaskQuestionAnswerList
.Where(t=>t.ReadingQuestionCriterionTrialId == resultTrialReadingCriterionId &&
ReadingEvaluationList = subject.ReadingTaskQuestionAnswerList
.Where(t => t.ReadingQuestionCriterionTrialId == resultTrialReadingCriterionId &&
questionIdList.Contains(t.ReadingQuestionTrialId)
&& t.VisitTask.TaskState==TaskState.Effect)
.Select(u=>new EvaluationInfo()
&& t.VisitTask.TaskState == TaskState.Effect)
.Select(u => new EvaluationInfo()
{
QuestionId=u.ReadingQuestionTrialId,
Answer=u.Answer,
FinalTranslateDictionaryCode=u.ReadingQuestionTrial.DictionaryCode
QuestionId = u.ReadingQuestionTrialId,
Answer = u.Answer,
FinalTranslateDictionaryCode = u.ReadingQuestionTrial.DictionaryCode
}).ToList()
//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()
};
var pageList = await subjectCriteriaEvaluationQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField == string.Empty ? nameof(SubjectCriteriaEvaluationView.SubjectCode) : inQuery.SortField, inQuery.Asc);
@@ -153,33 +151,39 @@ namespace IRaCIS.Core.Application.Service
if (resultTrialReadingCriterion.ReadingType == ReadingMethod.Double)
{
if (item.ReadingEvaluationList.Count==2)
if (item.ReadingEvaluationList.Count == 2)
{
if (item.ReadingEvaluationList.All(t => t.Answer == 1.ToString()))
{
item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId=item.ReadingEvaluationList.First().QuestionId, Answer = ((int)BrainMetastasisResult.Yes).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult)
});
item.FinalEvaluationList.Add(new EvaluationInfo()
{
QuestionId = item.ReadingEvaluationList.First().QuestionId,
Answer = ((int)BrainMetastasisResult.Yes).ToString(),
FinalTranslateDictionaryCode = nameof(BrainMetastasisResult)
});
}
else if (item.ReadingEvaluationList.All(t => t.Answer == 0.ToString()))
{
item.FinalEvaluationList.Add(new EvaluationInfo() {
item.FinalEvaluationList.Add(new EvaluationInfo()
{
QuestionId = item.ReadingEvaluationList.First().QuestionId,
Answer = ((int)BrainMetastasisResult.No).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult)
});
Answer = ((int)BrainMetastasisResult.No).ToString(),
FinalTranslateDictionaryCode = nameof(BrainMetastasisResult)
});
}
else if (item.ReadingEvaluationList.First().Answer != item.ReadingEvaluationList.Last().Answer)
{
item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = item.ReadingEvaluationList.First().QuestionId, Answer = ((int)BrainMetastasisResult.Maybe).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult)});
item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = item.ReadingEvaluationList.First().QuestionId, Answer = ((int)BrainMetastasisResult.Maybe).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
}
else
{
}
}
else
{
item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId= addtionalQustionInfoList.FirstOrDefault()?.QuestionId, Answer = ((int)BrainMetastasisResult.Unknown).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = addtionalQustionInfoList.FirstOrDefault()?.QuestionId, Answer = ((int)BrainMetastasisResult.Unknown).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
}
}
else if (resultTrialReadingCriterion.ReadingType == ReadingMethod.Single)
@@ -204,7 +208,7 @@ namespace IRaCIS.Core.Application.Service
{
item.FinalEvaluationList.Add(new EvaluationInfo() { QuestionId = addtionalQustionInfoList.FirstOrDefault()?.QuestionId, Answer = ((int)BrainMetastasisResult.Unknown).ToString(), FinalTranslateDictionaryCode = nameof(BrainMetastasisResult) });
}
}
else
{
@@ -216,7 +220,7 @@ namespace IRaCIS.Core.Application.Service
break;
}
}
@@ -246,7 +250,7 @@ namespace IRaCIS.Core.Application.Service
//找到一致性核查通过的访视 并且没有 自动影像筛选的数据
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)
&& !t.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.TrialReadingCriterionId == addOrEditSubjectCriteriaEvaluation.TrialReadingCriterionId && t.SubjectId == addOrEditSubjectCriteriaEvaluation.SubjectId)).Select(t => t.Id)
.ToListAsync();
@@ -366,7 +370,7 @@ namespace IRaCIS.Core.Application.Service
var subjectCriteriaEvaluationVisitFilter = await _subjectCriteriaEvaluationVisitFilterRepository.AddAsync(addItem);
}
foreach (var item in list)
{
@@ -413,15 +417,17 @@ namespace IRaCIS.Core.Application.Service
.WhereIf(inQuery.ImageFilterState != null, t => t.ImageFilterState == inQuery.ImageFilterState)
.WhereIf(inQuery.IsGeneratedTask != null, t => t.IsGeneratedTask == inQuery.IsGeneratedTask)
on subjectVisit.Id equals subjectCriteriaEvaluationVisitFilter.SubjectVisitId
//into d from subjectCriteriaEvaluationVisitFilter in d.DefaultIfEmpty()
select new SubjectCriteriaEvaluationVisitFilterView()
{
VisitName = subjectVisit.VisitName,
VisitNum=subjectVisit.VisitNum,
VisitNum = subjectVisit.VisitNum,
SubjectVisitId = subjectVisit.Id,
TrialId = subjectVisit.TrialId,
SubjectId = subjectVisit.SubjectId,
SubjectCode= subjectVisit.Subject.Code,
TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
LatestScanDate = subjectVisit.LatestScanDate,
EarliestScanDate = subjectVisit.LatestScanDate,
@@ -431,14 +437,14 @@ namespace IRaCIS.Core.Application.Service
Id = subjectCriteriaEvaluationVisitFilter.Id,
CreateTime = subjectCriteriaEvaluationVisitFilter.CreateTime,
CreateUserId=subjectCriteriaEvaluationVisitFilter.CreateUserId,
UpdateTime= subjectCriteriaEvaluationVisitFilter.UpdateTime,
UpdateUserId= subjectCriteriaEvaluationVisitFilter.UpdateUserId,
CreateUserId = subjectCriteriaEvaluationVisitFilter.CreateUserId,
UpdateTime = subjectCriteriaEvaluationVisitFilter.UpdateTime,
UpdateUserId = subjectCriteriaEvaluationVisitFilter.UpdateUserId,
};
return await subjectCriteriaEvaluationVisitFilterQueryable.OrderBy(t=>t.VisitNum).ToListAsync();
return await subjectCriteriaEvaluationVisitFilterQueryable.OrderBy(t => t.VisitNum).ToListAsync();
}
/// <summary>
@@ -467,28 +473,20 @@ namespace IRaCIS.Core.Application.Service
&& t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId
&& batchGenerateTaskCommand.SubjectVisitIdList.Contains(t.SubjectVisitId), u => new SubjectCriteriaEvaluationVisitFilter { IsGeneratedTask = true });
await _IVisitTaskHelpeService.BaseCritrionGenerateVisitTask(batchGenerateTaskCommand.TrialId, batchGenerateTaskCommand.TrialReadingCriterionId, true, batchGenerateTaskCommand.SubjectVisitIdList);
//自动生成任务
var idList = batchGenerateTaskCommand.SubjectVisitIdList.Select(t => (Guid?)t).ToList();
//存在任务的访视
var haveGenerateVisitIdList = await _repository.Where<VisitTask>(t => idList.Contains(t.SourceSubjectVisitId) && t.TrialReadingCriterionId == batchGenerateTaskCommand.TrialReadingCriterionId && t.TaskState == TaskState.Effect)
.Select(t => t.SourceSubjectVisitId).ToListAsync();
var generateVisitIdList = idList.Except(haveGenerateVisitIdList);
await _IVisitTaskHelpeService.BaseCritrionGenerateVisitTask(batchGenerateTaskCommand.TrialId, batchGenerateTaskCommand.TrialReadingCriterionId, true, generateVisitIdList.Select(t => (Guid)t).ToList());
}
///// <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());
//}
/// <summary>
/// 获取dicom 访视检查列表 (序列的 Id CreateTime 是否为空 代表了记录是否创建、IsConfirmed 代表 保存 确认)
/// </summary>
@@ -516,7 +514,7 @@ namespace IRaCIS.Core.Application.Service
SeriesNumber = series.SeriesNumber,
SeriesTime = series.SeriesTime,
InstanceCount=series.InstanceCount,
InstanceCount = series.InstanceCount,
StudyTime = series.DicomStudy.StudyTime,
StudyId = series.StudyId,
SeriesId = series.Id,
@@ -524,7 +522,7 @@ namespace IRaCIS.Core.Application.Service
TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
IsReading=visitStudyFilter.IsReading,
IsReading = visitStudyFilter.IsReading,
Id = visitStudyFilter.Id,
CreateTime = visitStudyFilter.CreateTime,
IsConfirmed = visitStudyFilter.IsConfirmed,
@@ -567,8 +565,8 @@ namespace IRaCIS.Core.Application.Service
u => new SubjectCriteriaEvaluationVisitFilter() { ImageFilterState = ImageFilterState.Finished });
}
await _subjectCriteriaEvaluationVisitStudyFilterRepository.SaveChangesAsync();
return ResponseOutput.Ok();
@@ -576,13 +574,122 @@ namespace IRaCIS.Core.Application.Service
//[HttpDelete("{subjectCriteriaEvaluationId:guid}")]
// public async Task<IResponseOutput> DeleteSubjectCriteriaEvaluation(Guid subjectCriteriaEvaluationId)
//{
// var success = await _subjectCriteriaEvaluationRepository.DeleteFromQueryAsync(t => t.Id == subjectCriteriaEvaluationId,true);
// return ResponseOutput.Ok();
//}
/// <summary>
/// 附加评估标准 PM 退回某一访视 影响任务列表
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<InfluenceTaskInfo>> GetCriteriaVisitBackInfluenceTaskList(CriteriaVisitBackCommand command)
{
var filterExpression = await GetTaskExpressionAsync(command);
var list = await _visitTaskRepository.Where(filterExpression)
.OrderBy(t => t.VisitTaskNum).ProjectTo<InfluenceTaskInfo>(_mapper.ConfigurationProvider).ToListAsync();
return list;
}
private async Task<Expression<Func<VisitTask, bool>>> GetTaskExpressionAsync(CriteriaVisitBackCommand command)
{
var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == command.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException();
var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == command.SubjectVisitId);
//仅仅影响该标准自己的任务
Expression<Func<VisitTask, bool>> filterExpression = t => t.TrialId == command.TrialId && t.SubjectId == command.SubjectId && t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated
&& t.TrialReadingCriterionId == command.TrialReadingCriterionId;
//有序
if (criterionConfig.IsReadingTaskViewInOrder)
{
filterExpression = filterExpression.And(t => t.VisitTaskNum >= subjectVisit.VisitNum);
}
else
{
filterExpression = filterExpression.And(t => t.VisitTaskNum == subjectVisit.VisitNum);
}
return filterExpression;
}
/// <summary>
/// 退回任务
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
public async Task ConfirmBackCriteriaVisitTask(CriteriaVisitBackCommand command)
{
var filterExpression = await GetTaskExpressionAsync(command);
var influenceTaskList = await _visitTaskRepository.Where(filterExpression, true).ToListAsync();
var subjectVisit = await _subjectVisitRepository.FindAsync(command.SubjectVisitId);
foreach (var influenceTask in influenceTaskList)
{
//申请的访视 要不是重阅重置,要不就是失效 不会存在取消分配
if (influenceTask.ReadingCategory == ReadingCategory.Visit && influenceTask.VisitTaskNum != subjectVisit.VisitNum)
{
//后续访视处理访视
if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned)
{
influenceTask.TaskState = TaskState.HaveReturned;
}
else if (influenceTask.ReadingTaskState == ReadingTaskState.Reading)
{
influenceTask.TaskState = TaskState.Adbandon;
}
else
{
influenceTask.DoctorUserId = null;
influenceTask.AllocateTime = null;
influenceTask.SuggesteFinishedTime = null;
influenceTask.TaskAllocationState = TaskAllocationState.NotAllocate;
}
}
else
{
//申请的访视 全局肿瘤学
if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned)
{
influenceTask.TaskState = TaskState.HaveReturned;
}
else
{
influenceTask.TaskState = TaskState.Adbandon;
}
}
}
var taskIdList = influenceTaskList.Select(t => t.Id).ToList();
var subjectVisitIdLsit = influenceTaskList.Where(t => t.SourceSubjectVisitId != null).Select(t => t.SourceSubjectVisitId).ToList();
//医学审核任务失效
await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(t => taskIdList.Contains(t.VisitTaskId) && t.AuditState != MedicalReviewAuditState.HaveSigned, u => new TaskMedicalReview() { IsInvalid = true });
//将筛选的访视 序列状态重置
//重置访视数据
await _subjectCriteriaEvaluationVisitFilterRepository.BatchUpdateNoTrackingAsync(t => t.TrialReadingCriterionId== command.TrialReadingCriterionId && t.SubjectId == command.SubjectId && subjectVisitIdLsit.Contains(t.SubjectVisitId) ,
t=>new SubjectCriteriaEvaluationVisitFilter()
{
ImageFilterState=ImageFilterState.None,
ImageDeterminationResultState=ImageDeterminationResultState.None
});
//删除序列数据
await _subjectCriteriaEvaluationVisitStudyFilterRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == command.TrialReadingCriterionId && subjectVisitIdLsit.Contains(t.SubjectVisitId));
await _visitTaskRepository.SaveChangesAsync();
}
}
}