pacs 影像预览
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
47b8d5186e
commit
06118b08c5
|
@ -11,6 +11,8 @@ namespace IRaCIS.Core.Application.Services
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
public class SeriesService(IRepository<DicomSeries> _seriesRepository,
|
public class SeriesService(IRepository<DicomSeries> _seriesRepository,
|
||||||
IRepository<DicomInstance> _instanceRepository,
|
IRepository<DicomInstance> _instanceRepository,
|
||||||
|
IRepository<SCPSeries> _scpSeriesRepository,
|
||||||
|
IRepository<SCPInstance> _scpInstanceRepository,
|
||||||
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IWebHostEnvironment _hostEnvironment) : BaseService
|
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IWebHostEnvironment _hostEnvironment) : BaseService
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -22,104 +24,96 @@ namespace IRaCIS.Core.Application.Services
|
||||||
/// <param name="studyId"> Dicom检查的Id </param>
|
/// <param name="studyId"> Dicom检查的Id </param>
|
||||||
/// <param name="isReading"></param>
|
/// <param name="isReading"></param>
|
||||||
[HttpGet, Route("{studyId:guid}")]
|
[HttpGet, Route("{studyId:guid}")]
|
||||||
public async Task<IResponseOutput<List<DicomSeriesDTO>>> List(Guid studyId, bool? isReading)
|
public async Task<IResponseOutput<List<DicomSeriesDTO>>> List(Guid studyId, bool? isReading, bool? isPacs)
|
||||||
{
|
{
|
||||||
//质控的时候,要标记序列,和instance 删除 ,所以要返回全部,但是 质控通过后,pm 进去看的时候要看过滤后的
|
if (isPacs == true)
|
||||||
|
|
||||||
var qcAuditState = await _seriesRepository.Where(s => s.StudyId == studyId).Select(t => t.DicomStudy.SubjectVisit.AuditState).FirstOrDefaultAsync();
|
|
||||||
|
|
||||||
//质控通过以后,预览过滤删除的 质控之前的不过滤
|
|
||||||
var isQCFinished = qcAuditState == AuditStateEnum.QCPassed;
|
|
||||||
|
|
||||||
//断点
|
|
||||||
var seriesList = await _seriesRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters()
|
|
||||||
.WhereIf(isQCFinished, t => t.IsDeleted == false)
|
|
||||||
.WhereIf(isReading == true, t => t.IsReading == true)
|
|
||||||
.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime)
|
|
||||||
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
|
||||||
|
|
||||||
var instanceList = await _instanceRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters()
|
|
||||||
.WhereIf(isQCFinished, t => t.IsDeleted == false)
|
|
||||||
.WhereIf(isReading == true, t => t.IsReading == true)
|
|
||||||
.OrderBy(t => t.SeriesId).ThenBy(t => t.InstanceNumber)
|
|
||||||
.ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime)
|
|
||||||
.Select(t => new { t.SeriesId, t.Id, t.Path, t.NumberOfFrames, t.InstanceNumber, t.HtmlPath, t.IsReading, t.IsDeleted, t.FileSize }).ToListAsync();//.GroupBy(u => u.SeriesId);
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var series in seriesList)
|
|
||||||
{
|
{
|
||||||
|
var seriesList = await _scpSeriesRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters()
|
||||||
|
.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime)
|
||||||
|
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
|
||||||
series.InstanceInfoList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k =>
|
var instanceList = await _scpInstanceRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters()
|
||||||
new InstanceBasicInfo()
|
.OrderBy(t => t.SeriesId).ThenBy(t => t.InstanceNumber)
|
||||||
{
|
.ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime)
|
||||||
Id = k.Id,
|
.Select(t => new { t.SeriesId, t.Id, t.Path, t.NumberOfFrames, t.InstanceNumber, t.FileSize }).ToListAsync();//.GroupBy(u => u.SeriesId);
|
||||||
NumberOfFrames = k.NumberOfFrames,
|
|
||||||
HtmlPath = k.HtmlPath,
|
|
||||||
Path = k.Path,
|
|
||||||
InstanceNumber = k.InstanceNumber,
|
|
||||||
IsReading = k.IsReading,
|
|
||||||
IsDeleted = k.IsDeleted,
|
|
||||||
FileSize = k.FileSize
|
|
||||||
|
|
||||||
}).ToList();
|
|
||||||
|
|
||||||
series.InstanceCount = series.InstanceInfoList.Count;
|
foreach (var series in seriesList)
|
||||||
|
{
|
||||||
|
|
||||||
|
series.InstanceInfoList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k =>
|
||||||
|
new InstanceBasicInfo()
|
||||||
|
{
|
||||||
|
Id = k.Id,
|
||||||
|
NumberOfFrames = k.NumberOfFrames,
|
||||||
|
HtmlPath = string.Empty,
|
||||||
|
Path = k.Path,
|
||||||
|
InstanceNumber = k.InstanceNumber,
|
||||||
|
IsReading = true,
|
||||||
|
IsDeleted = false,
|
||||||
|
FileSize = k.FileSize
|
||||||
|
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
|
series.InstanceCount = series.InstanceInfoList.Count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(seriesList);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//质控的时候,要标记序列,和instance 删除 ,所以要返回全部,但是 质控通过后,pm 进去看的时候要看过滤后的
|
||||||
|
|
||||||
|
var qcAuditState = await _seriesRepository.Where(s => s.StudyId == studyId).Select(t => t.DicomStudy.SubjectVisit.AuditState).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
//质控通过以后,预览过滤删除的 质控之前的不过滤
|
||||||
|
var isQCFinished = qcAuditState == AuditStateEnum.QCPassed;
|
||||||
|
|
||||||
|
//断点
|
||||||
|
var seriesList = await _seriesRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters()
|
||||||
|
.WhereIf(isQCFinished, t => t.IsDeleted == false)
|
||||||
|
.WhereIf(isReading == true, t => t.IsReading == true)
|
||||||
|
.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime)
|
||||||
|
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
|
||||||
|
var instanceList = await _instanceRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters()
|
||||||
|
.WhereIf(isQCFinished, t => t.IsDeleted == false)
|
||||||
|
.WhereIf(isReading == true, t => t.IsReading == true)
|
||||||
|
.OrderBy(t => t.SeriesId).ThenBy(t => t.InstanceNumber)
|
||||||
|
.ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime)
|
||||||
|
.Select(t => new { t.SeriesId, t.Id, t.Path, t.NumberOfFrames, t.InstanceNumber, t.HtmlPath, t.IsReading, t.IsDeleted, t.FileSize }).ToListAsync();//.GroupBy(u => u.SeriesId);
|
||||||
|
|
||||||
|
|
||||||
|
foreach (var series in seriesList)
|
||||||
|
{
|
||||||
|
|
||||||
|
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,
|
||||||
|
InstanceNumber = k.InstanceNumber,
|
||||||
|
IsReading = k.IsReading,
|
||||||
|
IsDeleted = k.IsDeleted,
|
||||||
|
FileSize = k.FileSize
|
||||||
|
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
|
series.InstanceCount = series.InstanceInfoList.Count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(seriesList);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 暂时废弃
|
|
||||||
|
|
||||||
//bool hasKeyInstance = false;
|
|
||||||
//var SeriesIdList = _imageLabelRepository.Where(u => u.TpCode == tpCode).Select(s => s.SeriesId).Distinct().ToList();
|
|
||||||
//var instanceIdList = _imageLabelRepository.Where(u => u.TpCode == tpCode).Select(s => s.InstanceId).Distinct().ToList();
|
|
||||||
//foreach (var item in seriesList)
|
|
||||||
//{
|
|
||||||
// if (SeriesIdList.Contains(item.Id))
|
|
||||||
// {
|
|
||||||
// item.HasLabel = true;
|
|
||||||
// hasKeyInstance = true;
|
|
||||||
// }
|
|
||||||
// else item.HasLabel = false;
|
|
||||||
//}
|
|
||||||
//if (hasKeyInstance)
|
|
||||||
//{
|
|
||||||
// seriesList.Add(new DicomSeriesWithLabelDTO
|
|
||||||
// {
|
|
||||||
// KeySeries = true,
|
|
||||||
// Id = SeriesIdList[0],
|
|
||||||
// InstanceCount = instanceIdList.Count,
|
|
||||||
// HasLabel = true,
|
|
||||||
// Modality = seriesList[0].Modality,
|
|
||||||
// Description = "Key Series"
|
|
||||||
// });
|
|
||||||
//}
|
|
||||||
|
|
||||||
//var idList = await _instanceRepository.Where(s => s.StudyId == studyId).OrderBy(t => t.SeriesId).ThenBy(t => t.InstanceNumber)
|
|
||||||
// .ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime)
|
|
||||||
// .Select(t => new { t.SeriesId, t.Id, t.Path }).ToListAsync();//.GroupBy(u => u.SeriesId);
|
|
||||||
|
|
||||||
//foreach (var item in seriesList)
|
|
||||||
//{
|
|
||||||
// if (item.KeySeries)
|
|
||||||
// {
|
|
||||||
// item.InstanceList = instanceIdList;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// //item.InstanceList = idList.Where(s => s.SeriesId == item.Id).OrderBy(t => t.InstanceNumber)
|
|
||||||
// // .ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime).Select(u => u.Id).ToList();
|
|
||||||
|
|
||||||
// item.InstanceList = idList.Where(s => s.SeriesId == item.Id).Select(u => u.Id).ToList();
|
|
||||||
|
|
||||||
// item.InstancePathList = idList.Where(s => s.SeriesId == item.Id).Select(u => u.Path).ToList();
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return ResponseOutput.Ok(seriesList);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
public class StudyService(IRepository<SubjectVisit> _subjectVisitRepository,
|
public class StudyService(IRepository<SubjectVisit> _subjectVisitRepository,
|
||||||
IRepository<DicomInstance> _dicomInstanceRepository,
|
IRepository<DicomInstance> _dicomInstanceRepository,
|
||||||
IRepository<DicomSeries> _dicomSeriesRepository,
|
IRepository<DicomSeries> _dicomSeriesRepository,
|
||||||
IRepository<DicomStudy> _dicomstudyRepository,
|
IRepository<DicomStudy> _dicomStudyRepository,
|
||||||
IRepository<Dictionary> _dictionaryRepository,
|
IRepository<Dictionary> _dictionaryRepository,
|
||||||
IRepository<Trial> _trialRepository,
|
IRepository<Trial> _trialRepository,
|
||||||
IRepository<VisitTask> _visitTaskRepository,
|
IRepository<VisitTask> _visitTaskRepository,
|
||||||
IRepository<DicomStudy> _dicomStudyRepository,
|
IRepository<SCPStudy> _scpStudyRepository,
|
||||||
IRepository<Subject> _subjectRepository,
|
IRepository<Subject> _subjectRepository,
|
||||||
IRepository<StudyMonitor> _studyMonitorRepository,
|
IRepository<StudyMonitor> _studyMonitorRepository,
|
||||||
IRepository<SystemAnonymization> _systemAnonymizationRepository,
|
IRepository<SystemAnonymization> _systemAnonymizationRepository,
|
||||||
|
@ -628,9 +628,17 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
/// <param name="studyId"> Dicom检查的Id </param>
|
/// <param name="studyId"> Dicom检查的Id </param>
|
||||||
[HttpGet, Route("{studyId:guid}")]
|
[HttpGet, Route("{studyId:guid}")]
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
public IResponseOutput<DicomStudyDTO> Item(Guid studyId)
|
public IResponseOutput<DicomStudyDTO> Item(Guid studyId,bool? isPacs)
|
||||||
{
|
{
|
||||||
return ResponseOutput.Ok(_mapper.Map<DicomStudyDTO>(_dicomStudyRepository.Where().FirstOrDefault(s => s.Id == studyId)));
|
if (isPacs == true)
|
||||||
|
{
|
||||||
|
return ResponseOutput.Ok(_mapper.Map<DicomStudyDTO>(_scpStudyRepository.Where().FirstOrDefault(s => s.Id == studyId)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ResponseOutput.Ok(_mapper.Map<DicomStudyDTO>(_dicomStudyRepository.Where().FirstOrDefault(s => s.Id == studyId)));
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -154,6 +154,11 @@ namespace IRaCIS.Core.Application.Service
|
||||||
.ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.Subject.TrialSite.TrialSiteCode))
|
.ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.Subject.TrialSite.TrialSiteCode))
|
||||||
;
|
;
|
||||||
|
|
||||||
|
CreateMap<SCPStudy, DicomStudyDTO>();
|
||||||
|
CreateMap<SCPSeries, DicomSeriesDTO>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue