162 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
| 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>
 | ||
|         [HttpGet, Route("{studyId:guid}")]
 | ||
|         public async Task<IResponseOutput<List<DicomSeriesDTO>>> List(Guid studyId)
 | ||
|         {
 | ||
| 
 | ||
|             var seriesList = await _seriesRepository.Where(s => s.StudyId == studyId).OrderBy(s => s.SeriesNumber).
 | ||
|               ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime)
 | ||
|               .ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
 | ||
| 
 | ||
|             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, t.NumberOfFrames,t.InstanceNumber }).ToListAsync();//.GroupBy(u => u.SeriesId);
 | ||
| 
 | ||
|             foreach (var item in seriesList)
 | ||
|             {
 | ||
|                 item.InstanceList = idList.Where(s => s.SeriesId == item.Id).Select(u => u.Id).ToList();
 | ||
| 
 | ||
|                 //处理多帧
 | ||
|                 item.InstancePathList = idList.Where(s => s.SeriesId == item.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();
 | ||
|             }
 | ||
| 
 | ||
|             #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);
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|         /// <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;
 | ||
| 
 | ||
|             path = (await _instanceRepository.Where(s => s.SeriesId == seriesId).Select(t => t.Path).FirstOrDefaultAsync()).IfNullThrowException();
 | ||
| 
 | ||
|             var physicalPath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, path);
 | ||
| 
 | ||
|             //DicomInstance dicomInstance = await _instanceRepository.FirstOrDefaultAsync(s => s.SeriesId == seriesId).IfNullThrowException();
 | ||
| 
 | ||
|             //DicomStudy dicomStudy = await _studyRepository.FirstOrDefaultAsync(s => s.Id == dicomInstance.StudyId).IfNullThrowException();
 | ||
| 
 | ||
|             //var (physicalPath, relativePath)  = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id);
 | ||
| 
 | ||
|             using (var sw = ImageHelper.RenderPreviewJpeg(physicalPath))
 | ||
|             {
 | ||
|                 var bytes = new byte[sw.Length];
 | ||
|                 sw.Read(bytes, 0, bytes.Length);
 | ||
|                 sw.Close();
 | ||
|                 return new FileContentResult(bytes, "image/jpeg");
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
|     }
 | ||
| } |