irc-netcore-api/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs

113 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using IRaCIS.Core.Application.Contracts.Dicom.DTO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using IRaCIS.Core.Application.Helper;
namespace IRaCIS.Core.Application.Services
{
[ApiExplorerSettings(GroupName = "Image")]
[AllowAnonymous]
public class SeriesService : BaseService
{
private readonly IRepository<ImageLabel> _imageLabelRepository;
private readonly IRepository<DicomSeries> _seriesRepository;
private readonly IRepository<DicomInstance> _instanceRepository;
private readonly IRepository<DicomStudy> _studyRepository;
private readonly IRepository<KeyInstance> _keyInstanceRepository;
public SeriesService(IRepository<DicomInstance> instanceRepository, IRepository<DicomStudy> studyRepository,
IRepository<KeyInstance> keyInstanceRepository, IRepository<DicomSeries> seriesRepository, IRepository<ImageLabel> imageLabelRepository)
{
_seriesRepository = seriesRepository;
_instanceRepository = instanceRepository;
_studyRepository = studyRepository;
_keyInstanceRepository = keyInstanceRepository;
_imageLabelRepository = imageLabelRepository;
}
//医生读片那一块有耦合,关键序列 这里暂时留存
/// <summary> 指定资源Id获取Dicom检查所属序列信息列表 </summary>
/// <param name="studyId"> Dicom检查的Id </param>
/// <param name="tpCode"></param>
[HttpGet, Route("{studyId:guid}/{tpCode?}")]
public async Task<IResponseOutput<List<DicomSeriesWithLabelDTO>>> List(Guid studyId, string? tpCode)
{
var seriesList = await _seriesRepository.Where(s => s.StudyId == studyId).OrderBy(s => s.SeriesNumber).
ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime)
.ProjectTo<DicomSeriesWithLabelDTO>(_mapper.ConfigurationProvider).ToListAsync();
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).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();
}
}
return ResponseOutput.Ok(seriesList);
}
/// <summary> 指定资源Id渲染Dicom序列的Jpeg预览图像 </summary>
/// <param name="seriesId"> Dicom序列的Id </param>
[HttpGet, Route("{seriesId:guid}")]
[AllowAnonymous]
public async Task<FileContentResult> Preview(Guid seriesId)
{
string path = string.Empty;
DicomInstance dicomInstance = await _instanceRepository.FirstOrDefaultAsync(s => s.SeriesId == seriesId).IfNullThrowException();
DicomStudy dicomStudy = await _studyRepository.FirstOrDefaultAsync(s => s.Id == dicomInstance.StudyId).IfNullThrowException();
path = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id);
using (var sw = ImageHelper.RenderPreviewJpeg(path))
{
var bytes = new byte[sw.Length];
sw.Read(bytes, 0, bytes.Length);
sw.Close();
return new FileContentResult(bytes, "image/jpeg");
}
}
}
}