115 lines
4.8 KiB
C#
115 lines
4.8 KiB
C#
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
|
||
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using IRaCIS.Core.Application.Dicom;
|
||
using Microsoft.AspNetCore.Authorization;
|
||
|
||
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;
|
||
private readonly DicomFileStoreHelper _dicomFileStoreHelper;
|
||
public SeriesService(IRepository<DicomInstance> instanceRepository, IRepository<DicomStudy> studyRepository,
|
||
IRepository<KeyInstance> keyInstanceRepository, DicomFileStoreHelper dicomFileStoreHelper, IRepository<DicomSeries> seriesRepository, IRepository<ImageLabel> imageLabelRepository)
|
||
{
|
||
_seriesRepository = seriesRepository;
|
||
_dicomFileStoreHelper = dicomFileStoreHelper;
|
||
_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 = _dicomFileStoreHelper.GetInstanceFilePath(dicomStudy, dicomInstance.SeriesId, dicomInstance.Id.ToString());
|
||
|
||
using (var sw = DicomRenderingHelper.RenderPreviewJpeg(path))
|
||
{
|
||
var bytes = new byte[sw.Length];
|
||
sw.Read(bytes, 0, bytes.Length);
|
||
sw.Close();
|
||
return new FileContentResult(bytes, "image/jpeg");
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
} |