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 _imageLabelRepository; private readonly IRepository _seriesRepository; private readonly IRepository _instanceRepository; private readonly IRepository _studyRepository; private readonly IRepository _keyInstanceRepository; public SeriesService(IRepository instanceRepository, IRepository studyRepository, IRepository keyInstanceRepository, IRepository seriesRepository, IRepository imageLabelRepository) { _seriesRepository = seriesRepository; _instanceRepository = instanceRepository; _studyRepository = studyRepository; _keyInstanceRepository = keyInstanceRepository; _imageLabelRepository = imageLabelRepository; } //医生读片那一块有耦合,关键序列 这里暂时留存 /// 指定资源Id,获取Dicom检查所属序列信息列表 /// Dicom检查的Id /// [HttpGet, Route("{studyId:guid}/{tpCode?}")] public async Task>> 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(_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); } /// 指定资源Id,渲染Dicom序列的Jpeg预览图像 /// Dicom序列的Id [HttpGet, Route("{seriesId:guid}")] [AllowAnonymous] public async Task 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"); } } } }