@@ -1077,4 +1077,18 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class StudyUndoMaskImageCommand
|
||||
{
|
||||
public Guid? SeriesId { get; set; }
|
||||
|
||||
public List<Guid>? InstanceIdList { get; set; }
|
||||
}
|
||||
|
||||
public class InstanceIdPath
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
|
||||
public string Path { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ using IRaCIS.Core.Infrastructure;
|
||||
using Medallion.Threading;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using SkiaSharp;
|
||||
using System.Drawing;
|
||||
using ZiggyCreatures.Caching.Fusion;
|
||||
|
||||
@@ -68,7 +69,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 标注遮盖影像
|
||||
/// 标注遮盖影像 路径后面加了.MaskImage 就是遮盖的新路径
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<IResponseOutput> StudyMaskImage(StudyMaskImageCommand inCommand)
|
||||
@@ -78,20 +79,25 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
return ResponseOutput.NotOk("SeriesId and InstanceIdList can not both be null");
|
||||
}
|
||||
|
||||
var instancePathList = new List<string>();
|
||||
|
||||
var idPathList = new List<InstanceIdPath>();
|
||||
|
||||
if (inCommand.SeriesId == null && inCommand.InstanceIdList != null)
|
||||
{
|
||||
instancePathList = await _dicomInstanceRepository.Where(t => inCommand.InstanceIdList.Contains(t.Id)).Select(t => t.Path).ToListAsync();
|
||||
|
||||
idPathList = await _dicomInstanceRepository.Where(t => inCommand.InstanceIdList.Contains(t.Id)).Select(t => new InstanceIdPath { Id = t.Id, Path = t.Path }).ToListAsync();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
instancePathList = await _dicomInstanceRepository.Where(t => t.SeriesId == inCommand.SeriesId).Select(t => t.Path).ToListAsync();
|
||||
idPathList = await _dicomInstanceRepository.Where(t => t.SeriesId == inCommand.SeriesId).Select(t => new InstanceIdPath { Id = t.Id, Path = t.Path }).ToListAsync();
|
||||
}
|
||||
|
||||
foreach (var path in instancePathList)
|
||||
var errorPathList = new List<string>();
|
||||
|
||||
foreach (var item in idPathList)
|
||||
{
|
||||
var path = item.Path;
|
||||
|
||||
try
|
||||
{
|
||||
var inputStream = await _oSSService.GetStreamFromOSSAsync(path);
|
||||
@@ -99,21 +105,79 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
var outPutStream = await DicomPixelMasker.MaskAsync(inputStream, inCommand.MaskRegionList);
|
||||
|
||||
var prefix = path.Substring(1, path.LastIndexOf('/') - 1);
|
||||
await _oSSService.UploadToOSSAsync(outPutStream, prefix, $"MaskImage_{Path.GetFileName(path)}");
|
||||
|
||||
var maskPath = $"{Path.GetFileName(path)}.MaskImage";
|
||||
|
||||
//清理缓存的里面的遮盖图,多次遮盖同一张图时,清除缓存很重要
|
||||
await _oSSService.DeleteFromPrefix(maskPath, true);
|
||||
|
||||
await _oSSService.UploadToOSSAsync(outPutStream, prefix, maskPath);
|
||||
|
||||
await _dicomInstanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Id, u => new DicomInstance() { IsMasked = true });
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errorPathList.Add(path);
|
||||
|
||||
Log.Logger.Error(ex, $"StudyMaskImage Error for InstanceIdList Path:{path} {ex.Message}");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
await _dicomInstanceRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok(errorPathList);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 撤销遮盖的影像,可以单张,也可以整个序列
|
||||
/// </summary>
|
||||
/// <param name="inCommand"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IResponseOutput> StudyUndoMaskImage(StudyUndoMaskImageCommand inCommand)
|
||||
{
|
||||
if (inCommand.SeriesId == null && inCommand.InstanceIdList == null)
|
||||
{
|
||||
return ResponseOutput.NotOk("SeriesId and InstanceIdList can not both be null");
|
||||
}
|
||||
|
||||
|
||||
var idPathList = new List<InstanceIdPath>();
|
||||
|
||||
if (inCommand.SeriesId == null && inCommand.InstanceIdList != null)
|
||||
{
|
||||
idPathList = await _dicomInstanceRepository.Where(t => inCommand.InstanceIdList.Contains(t.Id)).Select(t => new InstanceIdPath { Id = t.Id, Path = t.Path }).ToListAsync();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
idPathList = await _dicomInstanceRepository.Where(t => t.SeriesId == inCommand.SeriesId).Select(t => new InstanceIdPath { Id = t.Id, Path = t.Path }).ToListAsync();
|
||||
}
|
||||
|
||||
foreach (var item in idPathList)
|
||||
{
|
||||
if (item.Path.EndsWith(".MaskImage"))
|
||||
{
|
||||
var newPath = item.Path[..^10];
|
||||
|
||||
//await _oSSService.DeleteFromPrefix(newPath, true);
|
||||
|
||||
await _dicomInstanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Id, u => new DicomInstance() { Path = newPath, IsMasked = false });
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
await _dicomInstanceRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
[TrialGlobalLimit("AfterStopCannNotOpt")]
|
||||
|
||||
public async Task<IResponseOutput> PreArchiveDicomStudy(PreArchiveDicomStudyCommand preArchiveStudyCommand)
|
||||
|
||||
Reference in New Issue
Block a user