using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Helper; namespace IRaCIS.Core.Application.Services { [ApiExplorerSettings(GroupName = "Image")] [AllowAnonymous] public class InstanceService : BaseService, IInstanceService { private readonly IRepository _instanceRepository; private readonly IRepository _studyRepository; private readonly IRepository _keyInstanceRepository; public InstanceService(IRepository instanceRepository, IRepository studyRepository, IRepository keyInstanceRepository ) { _instanceRepository = instanceRepository; _studyRepository = studyRepository; _keyInstanceRepository = keyInstanceRepository; } /// 指定资源Id,获取Dicom序列所属的实例信息列表 /// Dicom序列的Id [HttpGet("{seriesId:guid}")] public async Task> List(Guid seriesId) { return await _instanceRepository.Where(s => s.SeriesId == seriesId).OrderBy(s => s.InstanceNumber). ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } /// 指定资源Id,获取Dicom序列所属的实例Id列表 /// Dicom序列的Id /// /// [HttpGet, Route("{seriesId:guid}/{tpCode?}/{key?}")] public IEnumerable List(Guid seriesId, string tpCode, bool? key) { if (key != null && key.HasValue && key.Value) { return _keyInstanceRepository.Where(s => s.TpCode == tpCode).Select(t => t.InstanceId).Distinct(); } else return _instanceRepository.Where(s => s.SeriesId == seriesId).OrderBy(s => s.InstanceNumber).Select(t => t.Id); } [AllowAnonymous] [HttpGet, Route("{instanceId:guid}")] public async Task Preview(Guid instanceId) { var path = string.Empty; DicomInstance dicomInstance = await _instanceRepository.FirstOrDefaultAsync(s => s.Id == instanceId).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"); } } [AllowAnonymous] [HttpGet, Route("{instanceId:guid}")] public async Task Content(Guid instanceId) { var filePath = string.Empty; DicomInstance dicomInstance = await _instanceRepository.FirstOrDefaultAsync(s => s.Id == instanceId).IfNullThrowException(); DicomStudy dicomStudy = await _studyRepository.FirstOrDefaultAsync(s => s.Id == dicomInstance.StudyId).IfNullThrowException(); //if (dicomInstance.Anonymize) //被匿名化 //{ // filePath = _dicomFileStoreHelper.GetInstanceFilePath(dicomStudy, dicomInstance.SeriesId, dicomInstance.Id + ".Anonymize"); //} //else filePath = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); using (var sw = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { var bytes = new byte[sw.Length]; sw.Read(bytes, 0, bytes.Length); sw.Close(); return new FileContentResult(bytes, "application/octet-stream"); } } } }