多帧配合玲姐修改模块1
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
af282d2bb8
commit
a4b9c44cfa
|
@ -33,19 +33,43 @@
|
|||
public bool IsDeleted { get; set; }
|
||||
public bool IsReading { get; set; } = true;
|
||||
|
||||
|
||||
public List<InstanceBasicInfo> InstanceInfoList { get; set; }
|
||||
|
||||
public bool IsExistMutiFrames => InstanceInfoList.Any(t => t.NumberOfFrames > 1);
|
||||
|
||||
|
||||
#region 以后废弃
|
||||
|
||||
public List<Guid> InstanceList { get; set; } = new List<Guid>();
|
||||
|
||||
public List<string> InstancePathList { get; set; } = new List<string>();
|
||||
|
||||
public List<string> InstanceHtmlPathList { get; set; }
|
||||
|
||||
|
||||
|
||||
//存放在instance 上面
|
||||
public string WindowCenter { get; set; } = string.Empty;
|
||||
public string WindowWidth { get; set; } = string.Empty;
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
public string ImageResizePath { get; set; }
|
||||
}
|
||||
|
||||
public class InstanceBasicInfo
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
|
||||
public string Path { get; set; }
|
||||
|
||||
public string HtmlPath { get; set; }
|
||||
|
||||
public int NumberOfFrames { get; set; }
|
||||
}
|
||||
|
||||
public class DicomSeriesWithLabelDTO : DicomSeriesDTO
|
||||
{
|
||||
public bool HasLabel { get; set; } = false;
|
||||
|
|
|
@ -26,7 +26,7 @@ namespace IRaCIS.Core.Application.Services
|
|||
private readonly IRepository<ReadingClinicalData> _readingClinicalDataRepository;
|
||||
private readonly IRepository<ReadModule> _readModuleRepository;
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
private readonly IRepository<ReadingPeriodSet> _readingPeriodSetRepository;
|
||||
private readonly IRepository<ReadingPeriodSet> _readingPeriodSetRepository;
|
||||
private readonly IRepository<NoneDicomStudy> _noneDicomStudyRepository;
|
||||
private readonly IRepository<DicomInstance> _dicomInstanceRepository;
|
||||
private readonly IRepository<VisitTask> _visitTaskRepository;
|
||||
|
@ -34,8 +34,8 @@ namespace IRaCIS.Core.Application.Services
|
|||
private readonly IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository;
|
||||
private readonly IRepository<ReadingPeriodPlan> _readingPeriodPlanRepository;
|
||||
private readonly IRepository<Subject> _subjectRepository;
|
||||
private readonly IServiceProvider iServiceProvider;
|
||||
private readonly IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository;
|
||||
private readonly IServiceProvider iServiceProvider;
|
||||
private readonly IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository;
|
||||
private readonly IRepository<SubjectCriteriaEvaluationVisitStudyFilter> _subjectCriteriaEvaluationVisitStudyFilterRepository;
|
||||
|
||||
public SubjectVisitService(IRepository<SubjectVisit> subjectVisitRepository,
|
||||
|
@ -43,8 +43,8 @@ namespace IRaCIS.Core.Application.Services
|
|||
IRepository<ReadingClinicalData> readingClinicalDataRepository,
|
||||
IRepository<ReadModule> readModuleRepository,
|
||||
IRepository<Trial> trialRepository,
|
||||
IServiceProvider IServiceProvider,
|
||||
IRepository<ReadingPeriodSet> readingPeriodSetRepository,
|
||||
IServiceProvider IServiceProvider,
|
||||
IRepository<ReadingPeriodSet> readingPeriodSetRepository,
|
||||
IRepository<NoneDicomStudy> noneDicomStudyRepository,
|
||||
IRepository<DicomInstance> dicomInstanceRepository,
|
||||
IRepository<VisitTask> visitTaskRepository,
|
||||
|
@ -52,19 +52,19 @@ namespace IRaCIS.Core.Application.Services
|
|||
IRepository<NoneDicomStudyFile> noneDicomStudyFileRepository,
|
||||
IRepository<ReadingPeriodPlan> readingPeriodPlanRepository,
|
||||
IRepository<Subject> subjectRepository,
|
||||
|
||||
IRepository<ReadingQuestionCriterionTrial> trialReadingCriterionRepository,
|
||||
|
||||
IRepository<ReadingQuestionCriterionTrial> trialReadingCriterionRepository,
|
||||
IRepository<SubjectCriteriaEvaluationVisitStudyFilter> subjectCriteriaEvaluationVisitStudyFilterRepository
|
||||
|
||||
|
||||
)
|
||||
{
|
||||
this.iServiceProvider = IServiceProvider;
|
||||
_subjectVisitRepository = subjectVisitRepository;
|
||||
this.iServiceProvider = IServiceProvider;
|
||||
_subjectVisitRepository = subjectVisitRepository;
|
||||
this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository;
|
||||
this._readingClinicalDataRepository = readingClinicalDataRepository;
|
||||
this._readModuleRepository = readModuleRepository;
|
||||
this._trialRepository = trialRepository;
|
||||
this._readingPeriodSetRepository = readingPeriodSetRepository;
|
||||
this._readingPeriodSetRepository = readingPeriodSetRepository;
|
||||
this._noneDicomStudyRepository = noneDicomStudyRepository;
|
||||
this._dicomInstanceRepository = dicomInstanceRepository;
|
||||
this._visitTaskRepository = visitTaskRepository;
|
||||
|
@ -112,7 +112,7 @@ namespace IRaCIS.Core.Application.Services
|
|||
svCommand.VisitExecuted = svCommand.IsLostVisit ? VisitExecutedEnum.Executed : svCommand.VisitExecuted;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
SubjectVisit? dbBeforeEntity = null;
|
||||
//Add
|
||||
|
@ -124,13 +124,13 @@ namespace IRaCIS.Core.Application.Services
|
|||
{
|
||||
if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == svCommand.SubjectId && t.IsFinalVisit))
|
||||
{
|
||||
//---设置末次评估后,不允许添加计划外访视。
|
||||
//---设置末次评估后,不允许添加计划外访视。
|
||||
throw new BusinessValidationFailedException(_localizer["Visit_NoExtraVisitAfterLast"]);
|
||||
}
|
||||
|
||||
if (await _repository.AnyAsync<VisitTask>(t => t.SubjectId == svCommand.SubjectId && t.TaskState == TaskState.Effect && t.VisitTaskNum > svCommand.VisitNum && t.SignTime != null && t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.InOrder))
|
||||
{
|
||||
//---该受试者后续访视已有任务完成阅片(有序阅片标准),不允许在此添加,如果确实需要,请回退
|
||||
//---该受试者后续访视已有任务完成阅片(有序阅片标准),不允许在此添加,如果确实需要,请回退
|
||||
throw new BusinessValidationFailedException(_localizer["Visit_FinishedTasksNoAdd"]);
|
||||
}
|
||||
|
||||
|
@ -163,13 +163,13 @@ namespace IRaCIS.Core.Application.Services
|
|||
|
||||
if (svCommand.PDState != dbBeforeEntity.PDState && dbBeforeEntity.SubmitState == SubmitStateEnum.Submitted)
|
||||
{
|
||||
//---当前访视影像提交后,不允许修改PD确认状态。
|
||||
//---当前访视影像提交后,不允许修改PD确认状态。
|
||||
throw new BusinessValidationFailedException(_localizer["Visit_NoPDStatusChangeAfterSubmission"]);
|
||||
}
|
||||
|
||||
if (svCommand.PDState != dbBeforeEntity.PDState && dbBeforeEntity.RequestBackState == RequestBackStateEnum.PM_AgressBack)
|
||||
{
|
||||
//---当前访视影像提交后,不允许修改PD确认状态。
|
||||
//---当前访视影像提交后,不允许修改PD确认状态。
|
||||
throw new BusinessValidationFailedException(_localizer["Visit_NoPDStatusChangeAfterSubmission"]);
|
||||
}
|
||||
|
||||
|
@ -177,7 +177,7 @@ namespace IRaCIS.Core.Application.Services
|
|||
{
|
||||
if (await _subjectVisitRepository.AnyAsync(t => t.Id == svCommand.Id && t.SubmitState == SubmitStateEnum.ToSubmit))
|
||||
{
|
||||
//---当前访视已经有影像上传,不允许设置为失访。
|
||||
//---当前访视已经有影像上传,不允许设置为失访。
|
||||
throw new BusinessValidationFailedException(_localizer["Visit_UploadedNoLost"]);
|
||||
}
|
||||
}
|
||||
|
@ -269,8 +269,8 @@ namespace IRaCIS.Core.Application.Services
|
|||
}).ToListAsync();
|
||||
var studyIds = studyList.Select(t => t.StudyId).ToList();
|
||||
|
||||
var instanceList = await _repository.Where<DicomInstance>(t => studyIds.Contains(t.StudyId) )
|
||||
.Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames,t.HtmlPath }).ToListAsync();
|
||||
var instanceList = await _repository.Where<DicomInstance>(t => studyIds.Contains(t.StudyId))
|
||||
.Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.HtmlPath }).ToListAsync();
|
||||
|
||||
foreach (var t in studyList)
|
||||
{
|
||||
|
@ -280,15 +280,173 @@ namespace IRaCIS.Core.Application.Services
|
|||
|
||||
|
||||
t.SeriesList.ForEach(series =>
|
||||
{
|
||||
|
||||
series.InstanceInfoList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k =>
|
||||
new InstanceBasicInfo()
|
||||
{
|
||||
Id = k.Id,
|
||||
NumberOfFrames = k.NumberOfFrames,
|
||||
HtmlPath = k.HtmlPath,
|
||||
Path = k.Path
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
//设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计
|
||||
t.SeriesCount = t.SeriesList.Count;
|
||||
t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
return studyList;
|
||||
|
||||
//return ResponseOutput.Ok(studyList.Where(t => t.SeriesList.Count > 0).ToList());
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取Series信息
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<DicomSeriesDTO> GetDicomSeriesInfo(GetDicomSeriesInfoInDto inDto)
|
||||
{
|
||||
DicomSeriesDTO series = await _repository.Where<DicomSeries>(s => s.Id == inDto.SeriesId).ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).FirstNotNullAsync();
|
||||
|
||||
var instanceList = await _repository.Where<DicomInstance>(t => t.SeriesId == inDto.SeriesId)
|
||||
.Select(t => new { t.SeriesId, t.StudyId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath, t.SliceLocation }).ToListAsync();
|
||||
series.InstanceList = instanceList.Where(t => t.SeriesId == series.Id).OrderByDescending(t => t.SliceLocation).ThenBy(t => t.InstanceNumber).Select(k => k.Id).ToList();
|
||||
|
||||
|
||||
series.InstanceHtmlPathList = instanceList.Where(t => t.SeriesId == series.Id && t.HtmlPath != string.Empty).OrderBy(t => t.InstanceNumber).Select(k => k.HtmlPath).ToList();
|
||||
|
||||
//处理多帧
|
||||
series.InstancePathList = instanceList.Where(s => s.SeriesId == series.Id).OrderBy(t => t.InstanceNumber)
|
||||
.SelectMany(u =>
|
||||
{
|
||||
|
||||
if (u.NumberOfFrames > 1)
|
||||
{
|
||||
var pathList = new List<string>();
|
||||
|
||||
for (int i = 1; i <= u.NumberOfFrames; i++)
|
||||
{
|
||||
pathList.Add(u.Path + "?frame=" + (i - 1));
|
||||
}
|
||||
return pathList;
|
||||
}
|
||||
else
|
||||
{
|
||||
return new List<string> { u.Path };
|
||||
|
||||
}
|
||||
})
|
||||
.ToList();
|
||||
|
||||
series.WindowWidth = instanceList.FirstOrDefault()!.WindowWidth;
|
||||
series.WindowCenter = instanceList.FirstOrDefault()!.WindowCenter;
|
||||
|
||||
return series;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取PTAndCtSeries
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<GetPTAndCtSeriesOutDto>> GetPTAndCtSeries(GetPTAndCtSeriesInDto inDto)
|
||||
{
|
||||
|
||||
|
||||
|
||||
var pastResultList = await this.iServiceProvider.GetService<IReadingImageTaskService>().GetReadingPastResultList(new GetReadingPastResultListInDto()
|
||||
{
|
||||
VisitTaskId = inDto.VisitTaskId
|
||||
});
|
||||
|
||||
var visitTaskIds = pastResultList.Select(x => x.VisitTaskId).ToList();
|
||||
var visitSeriesList = await _readingTableAnswerRowInfoRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId))
|
||||
.Where(x => x.PTSeriesId != null && x.CTSeriesId != null)
|
||||
.Select(x => new
|
||||
{
|
||||
x.PTSeriesId,
|
||||
x.CTSeriesId,
|
||||
x.VisitTaskId,
|
||||
x.OtherStudyId,
|
||||
x.VisitTask.SourceSubjectVisitId,
|
||||
x.VisitTask.SourceSubjectVisit.IsBaseLine,
|
||||
x.VisitTask.VisitTaskNum,
|
||||
x.VisitTask.TaskBlindName,
|
||||
x.UpdateTime,
|
||||
}).ToListAsync();
|
||||
|
||||
List<GetPTAndCtSeriesOutDto> result = new List<GetPTAndCtSeriesOutDto>();
|
||||
|
||||
List<Guid> ctseriesIds = visitSeriesList.Select(x => x.CTSeriesId.Value).ToList();
|
||||
|
||||
List<Guid> ptseriesIds = visitSeriesList.Select(x => x.PTSeriesId.Value).ToList();
|
||||
foreach (var item in visitTaskIds)
|
||||
{
|
||||
var visitSeries = visitSeriesList.Where(x => x.VisitTaskId == item).OrderByDescending(x => x.UpdateTime).FirstOrDefault();
|
||||
if (visitSeries != null)
|
||||
{
|
||||
result.Add(new GetPTAndCtSeriesOutDto()
|
||||
{
|
||||
PTSeriesId = visitSeries.PTSeriesId!.Value,
|
||||
CTSeriesId = visitSeries.CTSeriesId!.Value,
|
||||
TaskBlindName = visitSeries.TaskBlindName,
|
||||
VisitTaskId = item,
|
||||
SubjectVisitId = visitSeries.SourceSubjectVisitId!.Value,
|
||||
IsBaseLineTask = visitSeries.IsBaseLine,
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
List<DicomSeriesDTO> ctseriesLists = await _repository.Where<DicomSeries>(s => ctseriesIds.Contains(s.Id)).ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
List<DicomSeriesDTO> ptseriesLists = await _repository.Where<DicomSeries>(s => ptseriesIds.Contains(s.Id)).ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var seriesIds = ctseriesIds.Union(ptseriesIds).ToList(); //并集
|
||||
|
||||
var instanceList = await _repository.Where<DicomInstance>(t => seriesIds.Contains(t.SeriesId))
|
||||
.Select(t => new { t.SeriesId, t.StudyId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync();
|
||||
|
||||
var studyIds = instanceList.Select(x => x.StudyId).Distinct().ToList();
|
||||
|
||||
var studyList = await _repository.Where<DicomStudy>(t => studyIds.Contains(t.Id))
|
||||
.Select(k => new StudyInfo()
|
||||
{
|
||||
InstanceCount = k.InstanceCount,
|
||||
Modalities = k.Modalities,
|
||||
SeriesCount = k.SeriesCount,
|
||||
StudyCode = k.StudyCode,
|
||||
StudyId = k.Id,
|
||||
SubjectVisitId = k.SubjectVisitId,
|
||||
}).ToListAsync();
|
||||
AddinstanceList(ctseriesLists);
|
||||
AddinstanceList(ptseriesLists);
|
||||
|
||||
void AddinstanceList(List<DicomSeriesDTO> list)
|
||||
{
|
||||
list.ForEach(series =>
|
||||
{
|
||||
series.InstanceList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k => k.Id).ToList();
|
||||
|
||||
|
||||
series.InstanceHtmlPathList = instanceList.Where(t => t.SeriesId == series.Id && t.HtmlPath != string.Empty).OrderBy(t => t.InstanceNumber).Select(k => k.HtmlPath).ToList();
|
||||
|
||||
|
||||
//处理多帧
|
||||
series.InstancePathList = instanceList.OrderBy(t => t.InstanceNumber).Where(s => s.SeriesId == series.Id)
|
||||
series.InstancePathList = instanceList.Where(s => s.SeriesId == series.Id).OrderBy(t => t.InstanceNumber)
|
||||
.SelectMany(u =>
|
||||
{
|
||||
|
||||
|
@ -310,217 +468,39 @@ namespace IRaCIS.Core.Application.Services
|
|||
})
|
||||
.ToList();
|
||||
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
//设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计
|
||||
t.SeriesCount = t.SeriesList.Count;
|
||||
t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceList).Count();
|
||||
series.WindowWidth = instanceList.FirstOrDefault()!.WindowWidth;
|
||||
series.WindowCenter = instanceList.FirstOrDefault()!.WindowCenter;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
return studyList;
|
||||
|
||||
//return ResponseOutput.Ok(studyList.Where(t => t.SeriesList.Count > 0).ToList());
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取Series信息
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<DicomSeriesDTO> GetDicomSeriesInfo(GetDicomSeriesInfoInDto inDto)
|
||||
{
|
||||
DicomSeriesDTO series = await _repository.Where<DicomSeries>(s =>s.Id==inDto.SeriesId ).ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).FirstNotNullAsync();
|
||||
|
||||
var instanceList = await _repository.Where<DicomInstance>(t => t.SeriesId==inDto.SeriesId )
|
||||
.Select(t => new { t.SeriesId, t.StudyId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath ,t.SliceLocation}).ToListAsync();
|
||||
series.InstanceList = instanceList.Where(t => t.SeriesId == series.Id).OrderByDescending(t => t.SliceLocation).ThenBy(t=>t.InstanceNumber).Select(k => k.Id).ToList();
|
||||
|
||||
|
||||
series.InstanceHtmlPathList = instanceList.Where(t => t.SeriesId == series.Id && t.HtmlPath != string.Empty).OrderBy(t => t.InstanceNumber).Select(k => k.HtmlPath).ToList();
|
||||
|
||||
//处理多帧
|
||||
series.InstancePathList = instanceList.Where(s => s.SeriesId == series.Id).OrderBy(t => t.InstanceNumber)
|
||||
.SelectMany(u =>
|
||||
{
|
||||
|
||||
if (u.NumberOfFrames > 1)
|
||||
{
|
||||
var pathList = new List<string>();
|
||||
|
||||
for (int i = 1; i <= u.NumberOfFrames; i++)
|
||||
{
|
||||
pathList.Add(u.Path + "?frame=" + (i - 1));
|
||||
}
|
||||
return pathList;
|
||||
}
|
||||
else
|
||||
{
|
||||
return new List<string> { u.Path };
|
||||
|
||||
}
|
||||
})
|
||||
.ToList();
|
||||
|
||||
series.WindowWidth = instanceList.FirstOrDefault()!.WindowWidth;
|
||||
series.WindowCenter = instanceList.FirstOrDefault()!.WindowCenter;
|
||||
|
||||
return series;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取PTAndCtSeries
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<GetPTAndCtSeriesOutDto>> GetPTAndCtSeries(GetPTAndCtSeriesInDto inDto)
|
||||
{
|
||||
|
||||
|
||||
|
||||
var pastResultList= await this.iServiceProvider.GetService<IReadingImageTaskService>().GetReadingPastResultList(new GetReadingPastResultListInDto()
|
||||
{
|
||||
VisitTaskId = inDto.VisitTaskId
|
||||
}) ;
|
||||
|
||||
var visitTaskIds = pastResultList.Select(x => x.VisitTaskId).ToList();
|
||||
var visitSeriesList=await _readingTableAnswerRowInfoRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId))
|
||||
.Where(x => x.PTSeriesId != null && x.CTSeriesId != null)
|
||||
.Select(x => new
|
||||
{
|
||||
x.PTSeriesId,
|
||||
x.CTSeriesId,
|
||||
x.VisitTaskId,
|
||||
x.OtherStudyId,
|
||||
x.VisitTask.SourceSubjectVisitId,
|
||||
x.VisitTask.SourceSubjectVisit.IsBaseLine,
|
||||
x.VisitTask.VisitTaskNum,
|
||||
x.VisitTask.TaskBlindName,
|
||||
x.UpdateTime,
|
||||
}).ToListAsync();
|
||||
|
||||
List<GetPTAndCtSeriesOutDto> result = new List<GetPTAndCtSeriesOutDto>();
|
||||
|
||||
List<Guid> ctseriesIds = visitSeriesList.Select(x => x.CTSeriesId.Value).ToList();
|
||||
|
||||
List<Guid> ptseriesIds = visitSeriesList.Select(x => x.PTSeriesId.Value).ToList();
|
||||
foreach (var item in visitTaskIds)
|
||||
{
|
||||
var visitSeries = visitSeriesList.Where(x => x.VisitTaskId == item).OrderByDescending(x => x.UpdateTime).FirstOrDefault();
|
||||
if (visitSeries != null)
|
||||
{
|
||||
result.Add(new GetPTAndCtSeriesOutDto()
|
||||
{
|
||||
PTSeriesId = visitSeries.PTSeriesId!.Value,
|
||||
CTSeriesId = visitSeries.CTSeriesId!.Value,
|
||||
TaskBlindName=visitSeries.TaskBlindName,
|
||||
VisitTaskId= item,
|
||||
SubjectVisitId= visitSeries.SourceSubjectVisitId!.Value,
|
||||
IsBaseLineTask=visitSeries.IsBaseLine,
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
List<DicomSeriesDTO> ctseriesLists = await _repository.Where<DicomSeries>(s => ctseriesIds.Contains(s.Id)).ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
List<DicomSeriesDTO> ptseriesLists = await _repository.Where<DicomSeries>(s => ptseriesIds.Contains(s.Id)).ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var seriesIds = ctseriesIds.Union(ptseriesIds).ToList(); //并集
|
||||
|
||||
var instanceList = await _repository.Where<DicomInstance>(t => seriesIds.Contains(t.SeriesId))
|
||||
.Select(t => new { t.SeriesId,t.StudyId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync();
|
||||
|
||||
var studyIds = instanceList.Select(x => x.StudyId).Distinct().ToList();
|
||||
|
||||
var studyList = await _repository.Where<DicomStudy>(t => studyIds.Contains(t.Id))
|
||||
.Select(k => new StudyInfo()
|
||||
{
|
||||
InstanceCount = k.InstanceCount,
|
||||
Modalities = k.Modalities,
|
||||
SeriesCount = k.SeriesCount,
|
||||
StudyCode = k.StudyCode,
|
||||
StudyId = k.Id,
|
||||
SubjectVisitId=k.SubjectVisitId,
|
||||
}).ToListAsync();
|
||||
AddinstanceList(ctseriesLists);
|
||||
AddinstanceList(ptseriesLists);
|
||||
|
||||
void AddinstanceList(List<DicomSeriesDTO> list)
|
||||
{
|
||||
list.ForEach(series =>
|
||||
{
|
||||
series.InstanceList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k => k.Id).ToList();
|
||||
|
||||
|
||||
series.InstanceHtmlPathList = instanceList.Where(t => t.SeriesId == series.Id && t.HtmlPath != string.Empty).OrderBy(t => t.InstanceNumber).Select(k => k.HtmlPath).ToList();
|
||||
|
||||
//处理多帧
|
||||
series.InstancePathList = instanceList.Where(s => s.SeriesId == series.Id).OrderBy(t => t.InstanceNumber)
|
||||
.SelectMany(u =>
|
||||
{
|
||||
|
||||
if (u.NumberOfFrames > 1)
|
||||
{
|
||||
var pathList = new List<string>();
|
||||
|
||||
for (int i = 1; i <= u.NumberOfFrames; i++)
|
||||
{
|
||||
pathList.Add(u.Path + "?frame=" + (i - 1));
|
||||
}
|
||||
return pathList;
|
||||
}
|
||||
else
|
||||
{
|
||||
return new List<string> { u.Path };
|
||||
|
||||
}
|
||||
})
|
||||
.ToList();
|
||||
|
||||
series.WindowWidth = instanceList.FirstOrDefault()!.WindowWidth;
|
||||
series.WindowCenter = instanceList.FirstOrDefault()!.WindowCenter;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
foreach (var item in result)
|
||||
foreach (var item in result)
|
||||
{
|
||||
|
||||
item.StudyId = ptseriesLists.Where(x => x.Id == item.PTSeriesId).Select(x => x.StudyId).FirstOrDefault();
|
||||
|
||||
item.StudyInfoList = studyList.Where(x => x.SubjectVisitId == item.SubjectVisitId).ToList();
|
||||
item.StudyInfoList = studyList.Where(x => x.SubjectVisitId == item.SubjectVisitId).ToList();
|
||||
|
||||
foreach (var study in item.StudyInfoList)
|
||||
{
|
||||
study.PTSeriesList = ptseriesLists.Where(x => x.SubjectVisitId == item.SubjectVisitId).ToList();
|
||||
study.CTSeriesList = ctseriesLists.Where(x => x.SubjectVisitId == item.SubjectVisitId).ToList();
|
||||
}
|
||||
|
||||
}
|
||||
study.PTSeriesList = ptseriesLists.Where(x => x.SubjectVisitId == item.SubjectVisitId).ToList();
|
||||
study.CTSeriesList = ctseriesLists.Where(x => x.SubjectVisitId == item.SubjectVisitId).ToList();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取访视下的Dicom 检查信息 分所有的, 阅片的 不阅片 isReading : 0 查询所有 1 查询仅仅阅片的
|
||||
/// </summary>
|
||||
/// <param name="indto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
/// <summary>
|
||||
/// 获取访视下的Dicom 检查信息 分所有的, 阅片的 不阅片 isReading : 0 查询所有 1 查询仅仅阅片的
|
||||
/// </summary>
|
||||
/// <param name="indto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<VisitStudyDTO>> GetReadingVisitStudyList(GetReadingVisitStudyListIndto indto)
|
||||
{
|
||||
var result = new List<VisitStudyDTO>();
|
||||
|
@ -544,7 +524,7 @@ namespace IRaCIS.Core.Application.Services
|
|||
var thisSeriesIdIds = thisRowinfo.Where(x => x.SeriesId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.SeriesId).Distinct().ToList();
|
||||
if (thisRowinfo.Count > 0)
|
||||
{
|
||||
var thisVisitTaskStudy = await _repository.Where<DicomStudy>(t => thisStudyIds.Contains(t.Id) ).Select(k => new VisitStudyDTO()
|
||||
var thisVisitTaskStudy = await _repository.Where<DicomStudy>(t => thisStudyIds.Contains(t.Id)).Select(k => new VisitStudyDTO()
|
||||
{
|
||||
InstanceCount = k.InstanceCount,
|
||||
|
||||
|
@ -558,7 +538,7 @@ namespace IRaCIS.Core.Application.Services
|
|||
if (thisVisitTaskStudy != null)
|
||||
{
|
||||
thisVisitTaskStudy.StudyId = default(Guid);
|
||||
var item = await _repository.Where<DicomSeries>(s => thisSeriesIdIds.Contains(s.Id) ).OrderBy(s => s.SeriesNumber).
|
||||
var item = await _repository.Where<DicomSeries>(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).
|
||||
ThenBy(s => s.SeriesTime)
|
||||
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
|
||||
|
||||
|
@ -568,7 +548,7 @@ namespace IRaCIS.Core.Application.Services
|
|||
|
||||
item.InstanceList = thisRowinfo.Where(y => y.InstanceId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(y => y.InstanceId!.Value).Distinct().ToList();
|
||||
|
||||
var tempInstanceList = await _repository.Where<DicomInstance>(t => item.InstanceList.Contains(t.Id) ).OrderBy(t => t.InstanceNumber)
|
||||
var tempInstanceList = await _repository.Where<DicomInstance>(t => item.InstanceList.Contains(t.Id)).OrderBy(t => t.InstanceNumber)
|
||||
.Select(t => new TempInstance
|
||||
{
|
||||
|
||||
|
@ -617,7 +597,7 @@ namespace IRaCIS.Core.Application.Services
|
|||
|
||||
item.Description = "Key Series";
|
||||
|
||||
var modalityList = await _repository.Where<DicomSeries>(s => thisSeriesIdIds.Contains(s.Id) ).OrderBy(s => s.SeriesNumber).
|
||||
var modalityList = await _repository.Where<DicomSeries>(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).
|
||||
ThenBy(s => s.SeriesTime).Select(x => x.Modality).Distinct().ToListAsync(); ;
|
||||
item.Modality = string.Join(",", modalityList);
|
||||
thisVisitTaskStudy.SeriesList.Add(item);
|
||||
|
@ -642,7 +622,7 @@ namespace IRaCIS.Core.Application.Services
|
|||
var isManualGenerate = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == taskInfo.TrialReadingCriterionId && t.IsAutoCreate == false);
|
||||
|
||||
var studyList = await _repository.Where<DicomStudy>(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId)
|
||||
.WhereIf(isManualGenerate,t=>t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t=>t.TrialReadingCriterionId==taskInfo.TrialReadingCriterionId && t.IsConfirmed &&t.IsReading ))
|
||||
.WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading))
|
||||
.Select(k => new VisitStudyDTO()
|
||||
{
|
||||
InstanceCount = k.InstanceCount,
|
||||
|
@ -654,13 +634,13 @@ namespace IRaCIS.Core.Application.Services
|
|||
}).ToListAsync();
|
||||
var studyIds = studyList.Select(t => t.StudyId).ToList();
|
||||
|
||||
var instanceList = await _repository.Where<DicomInstance>(t => studyIds.Contains(t.StudyId) )
|
||||
.Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames,t.WindowCenter,t.WindowWidth,t.HtmlPath }).ToListAsync();
|
||||
var instanceList = await _repository.Where<DicomInstance>(t => studyIds.Contains(t.StudyId))
|
||||
.Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync();
|
||||
|
||||
|
||||
|
||||
List<DicomSeriesDTO> seriesLists = await _repository.Where<DicomSeries>(s => studyIds.Contains(s.StudyId) /*&& s.IsReading*/)
|
||||
.WhereIf(isManualGenerate==false, t => t.IsReading)
|
||||
.WhereIf(isManualGenerate == false, t => t.IsReading)
|
||||
.WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading))
|
||||
.OrderBy(s => s.SeriesNumber).
|
||||
ThenBy(s => s.SeriesTime)
|
||||
|
@ -675,7 +655,7 @@ namespace IRaCIS.Core.Application.Services
|
|||
series.InstanceList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k => k.Id).ToList();
|
||||
|
||||
|
||||
series.InstanceHtmlPathList = instanceList.Where(t => t.SeriesId == series.Id && t.HtmlPath!=string.Empty).OrderBy(t => t.InstanceNumber).Select(k => k.HtmlPath).ToList();
|
||||
series.InstanceHtmlPathList = instanceList.Where(t => t.SeriesId == series.Id && t.HtmlPath != string.Empty).OrderBy(t => t.InstanceNumber).Select(k => k.HtmlPath).ToList();
|
||||
|
||||
//处理多帧
|
||||
series.InstancePathList = instanceList.Where(s => s.SeriesId == series.Id).OrderBy(t => t.InstanceNumber)
|
||||
|
@ -736,28 +716,28 @@ namespace IRaCIS.Core.Application.Services
|
|||
{
|
||||
item.SeriesList = new List<DicomSeriesDTO>();
|
||||
item.SeriesCount = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
item.SeriesList = new List<DicomSeriesDTO>()
|
||||
{
|
||||
new DicomSeriesDTO (){
|
||||
IsDicom=false,
|
||||
Id=item.StudyId,
|
||||
InstanceCount=instanceCount,
|
||||
Modality=item.Modalities,
|
||||
StudyId=item.StudyId,
|
||||
TrialId=nodicom.TrialId,
|
||||
SiteId=nodicom.SiteId,
|
||||
SubjectVisitId=nodicom.SubjectVisitId,
|
||||
SubjectId=nodicom.SubjectId,
|
||||
SeriesNumber=1,
|
||||
NoneDicomFileFirstFile=await _noneDicomStudyFileRepository.Where(x=>x.NoneDicomStudyId==item.StudyId).Select(x=>x.Path).FirstOrDefaultAsync(),
|
||||
}
|
||||
item.SeriesList = new List<DicomSeriesDTO>()
|
||||
{
|
||||
new DicomSeriesDTO (){
|
||||
IsDicom=false,
|
||||
Id=item.StudyId,
|
||||
InstanceCount=instanceCount,
|
||||
Modality=item.Modalities,
|
||||
StudyId=item.StudyId,
|
||||
TrialId=nodicom.TrialId,
|
||||
SiteId=nodicom.SiteId,
|
||||
SubjectVisitId=nodicom.SubjectVisitId,
|
||||
SubjectId=nodicom.SubjectId,
|
||||
SeriesNumber=1,
|
||||
NoneDicomFileFirstFile=await _noneDicomStudyFileRepository.Where(x=>x.NoneDicomStudyId==item.StudyId).Select(x=>x.Path).FirstOrDefaultAsync(),
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue