oct-ivus-修改1
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-11-19 10:24:43 +08:00
parent 73b7aae6c0
commit e0111a2419
17 changed files with 22560 additions and 433 deletions
@@ -6,9 +6,11 @@ using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Org.BouncyCastle.Asn1.Tsp;
namespace IRaCIS.Core.Application.Services
{
@@ -19,7 +21,7 @@ namespace IRaCIS.Core.Application.Services
IRepository<NoneDicomStudy> _noneDicomStudyRepository,
IRepository<VisitTask> _visitTaskRepository,
IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository,
//IRepository<ReadingCustomTag> _readingCustomTagRepository,
//IRepository<ReadingCustomTag> _readingCustomTagRepository,
IRepository<ReadingTaskQuestionMark> _readingTaskQuestionMark,
IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository,
IRepository<Subject> _subjectRepository,
@@ -288,7 +290,7 @@ namespace IRaCIS.Core.Application.Services
return studyList.Where(x=>x.SeriesList.Count()>0).ToList();
return studyList.Where(x => x.SeriesList.Count() > 0).ToList();
//return ResponseOutput.Ok(studyList.Where(t => t.SeriesList.Count > 0).ToList());
@@ -468,62 +470,44 @@ namespace IRaCIS.Core.Application.Services
var studyList = new List<VisitStudyDTO>();
var taskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).Select(t => new { t.TrialReadingCriterionId, t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys, t.ReadingTaskState, TaskStudyCount = t.TaskStudyList.Count }).FirstNotNullAsync();
var taskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).Select(t => new { t.TrialReadingCriterionId, t.TrialReadingCriterion.CriterionType, t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys, t.ReadingTaskState, TaskStudyCount = t.TaskStudyList.Count }).FirstNotNullAsync();
//影像后处理 上传了新的影像
if (taskInfo.TaskStudyCount > 0)
{
var taskStudyList = await _taskStudyRepository.Where(t => t.TrialId == indto.TrialId && t.VisitTaskId == indto.VisitTaskId)
.WhereIf(taskInfo.IsImageFilter == true, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))
.ProjectTo<VisitStudyDTO>(_mapper.ConfigurationProvider).ToListAsync();
foreach (var study in taskStudyList)
#region dicom
//如果是手动生成的标准,需要过滤检查和序列数据
var isManualGenerate = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == taskInfo.TrialReadingCriterionId && t.IsAutoCreate == false);
var dicomStudyList = await _dicomStudyRepository.Where(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId)
.WhereIf(taskInfo.IsImageFilter == true, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))
.WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading))
//影像后处理 上传了新的影像 还要原始dsa
.WhereIf(taskInfo.TaskStudyCount > 0 && (taskInfo.CriterionType == CriterionType.OCT || taskInfo.CriterionType == CriterionType.IVUS), t => t.ModalityForEdit == "XA")
.WhereIf(taskInfo.TaskStudyCount > 0 && (taskInfo.CriterionType != CriterionType.OCT || taskInfo.CriterionType != CriterionType.IVUS), t => false)
.Select(k => new VisitStudyDTO()
{
study.SeriesList = study.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList();
InstanceCount = k.InstanceCount,
StudyName = k.StudyName,
Modalities = k.Modalities,
//SeriesCount = k.SeriesCount,
StudyCode = k.StudyCode,
StudyId = k.Id,
//foreach (var series in study.SeriesList)
//{
// series.WindowCenter = series.InstanceInfoList.FirstOrDefault()!.WindowCenter;
// series.WindowWidth = series.InstanceInfoList.FirstOrDefault()!.WindowWidth;
//}
//study.SeriesCount = study.SeriesList.Count;
BodyPartForEdit = k.BodyPartForEdit,
BodyPartForEditOther = k.BodyPartForEditOther
study.InstanceCount = study.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
}
studyList.AddRange(taskStudyList);
}).ToListAsync();
}
else
var studyIds = dicomStudyList.Select(t => t.StudyId).ToList();
if (studyIds.Count > 0)
{
#region dicom
//如果是手动生成的标准,需要过滤检查和序列数据
var isManualGenerate = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == taskInfo.TrialReadingCriterionId && t.IsAutoCreate == false);
var dicomStudyList = await _dicomStudyRepository.Where(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId)
.WhereIf(taskInfo.IsImageFilter == true, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))
.WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading))
.Select(k => new VisitStudyDTO()
{
InstanceCount = k.InstanceCount,
StudyName = k.StudyName,
Modalities = k.Modalities,
//SeriesCount = k.SeriesCount,
StudyCode = k.StudyCode,
StudyId = k.Id,
BodyPartForEdit=k.BodyPartForEdit,
BodyPartForEditOther=k.BodyPartForEditOther
}).ToListAsync();
var studyIds = dicomStudyList.Select(t => t.StudyId).ToList();
var instanceList = await _dicomInstanceRepository.Where(t => studyIds.Contains(t.StudyId) && t.IsReading)
.Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath, t.IsReading, t.FileSize }).ToListAsync();
.Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath, t.IsReading, t.FileSize }).ToListAsync();
List<DicomSeriesDTO> seriesLists = await _dicomSeriesRepository.Where(s => studyIds.Contains(s.StudyId))
.WhereIf(isManualGenerate == false, t => t.IsReading)
@@ -561,150 +545,168 @@ namespace IRaCIS.Core.Application.Services
}
studyList.AddRange(dicomStudyList);
}
#endregion
//影像后处理 上传了新的影像
if (taskInfo.TaskStudyCount > 0)
{
#region dicom
var taskStudyList = await _taskStudyRepository.Where(t => t.TrialId == indto.TrialId && t.VisitTaskId == indto.VisitTaskId)
.WhereIf(taskInfo.IsImageFilter == true, t => ("|" + taskInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))
.ProjectTo<VisitStudyDTO>(_mapper.ConfigurationProvider).ToListAsync();
//已经签名的任务,加关键序列
if (taskInfo.ReadingTaskState == ReadingTaskState.HaveSigned)
foreach (var study in taskStudyList)
{
var rowInfoList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).OrderBy(x => x.ReadingQuestionTrial.ShowOrder).ThenBy(x => x.RowIndex).Select(x => new StudyInstanceInfo()
study.SeriesList = study.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList();
study.InstanceCount = study.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
}
studyList.AddRange(taskStudyList);
}
#endregion
#region dicom
//已经签名的任务,加关键序列
if (taskInfo.ReadingTaskState == ReadingTaskState.HaveSigned)
{
var rowInfoList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).OrderBy(x => x.ReadingQuestionTrial.ShowOrder).ThenBy(x => x.RowIndex).Select(x => new StudyInstanceInfo()
{
ShowOrder = x.ReadingQuestionTrial.ShowOrder,
RowIndex = x.RowIndex,
SeriesId = x.SeriesId,
StudyId = x.StudyId,
InstanceId = x.InstanceId,
NumberOfFrames = x.NumberOfFrames,
CreateTime = x.CreateTime,
}).ToListAsync();
// 这个表的数据已经移动到 _readingTaskQuestionMark 了
//var customoList = await _readingCustomTagRepository.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).Select(x => new StudyInstanceInfo()
//{
// ShowOrder = 0,
// RowIndex = 0m,
// SeriesId = x.SeriesId,
// StudyId = x.StudyId,
// InstanceId = x.InstanceId,
// NumberOfFrames = x.NumberOfFrames,
// CreateTime = x.CreateTime,
//}).ToListAsync();
//rowInfoList.AddRange(customoList);
var questionMarkList = await _readingTaskQuestionMark.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).Select(x => new StudyInstanceInfo()
{
ShowOrder = x.ReadingQuestionTrial == null ? 0 : x.ReadingQuestionTrial.ShowOrder,
RowIndex = 0m,
SeriesId = x.SeriesId,
StudyId = x.StudyId,
InstanceId = x.InstanceId,
NumberOfFrames = x.NumberOfFrames,
CreateTime = x.CreateTime,
}).ToListAsync();
rowInfoList.AddRange(questionMarkList);
var thisStudyIds = rowInfoList.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.StudyId).Distinct().ToList();
var thisSeriesIdIds = rowInfoList.Where(x => x.SeriesId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.SeriesId).Distinct().ToList();
if (rowInfoList.Count > 0)
{
var thisVisitTaskStudy = await _dicomStudyRepository.Where(t => thisStudyIds.Contains(t.Id)).Select(k => new VisitStudyDTO()
{
ShowOrder = x.ReadingQuestionTrial.ShowOrder,
RowIndex = x.RowIndex,
SeriesId = x.SeriesId,
StudyId = x.StudyId,
InstanceId = x.InstanceId,
NumberOfFrames = x.NumberOfFrames,
CreateTime=x.CreateTime,
}).ToListAsync();
InstanceCount = k.InstanceCount,
//SeriesCount = k.SeriesCount,
// 这个表的数据已经移动到 _readingTaskQuestionMark 了
//var customoList = await _readingCustomTagRepository.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).Select(x => new StudyInstanceInfo()
//{
// ShowOrder = 0,
// RowIndex = 0m,
// SeriesId = x.SeriesId,
// StudyId = x.StudyId,
// InstanceId = x.InstanceId,
// NumberOfFrames = x.NumberOfFrames,
// CreateTime = x.CreateTime,
//}).ToListAsync();
//rowInfoList.AddRange(customoList);
StudyId = k.Id,
IsCriticalSequence = true,
var questionMarkList = await _readingTaskQuestionMark.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).Select(x => new StudyInstanceInfo()
}).FirstOrDefaultAsync();
if (thisVisitTaskStudy != null)
{
ShowOrder = x.ReadingQuestionTrial==null?0: x.ReadingQuestionTrial.ShowOrder,
RowIndex = 0m,
SeriesId = x.SeriesId,
StudyId = x.StudyId,
InstanceId = x.InstanceId,
NumberOfFrames = x.NumberOfFrames,
CreateTime = x.CreateTime,
}).ToListAsync();
rowInfoList.AddRange(questionMarkList);
thisVisitTaskStudy.StudyId = default(Guid);
var item = await _dicomSeriesRepository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).
ThenBy(s => s.SeriesTime)
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
var thisStudyIds = rowInfoList.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.StudyId).Distinct().ToList();
var thisSeriesIdIds = rowInfoList.Where(x => x.SeriesId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.SeriesId).Distinct().ToList();
if (rowInfoList.Count > 0)
{
var thisVisitTaskStudy = await _dicomStudyRepository.Where(t => thisStudyIds.Contains(t.Id)).Select(k => new VisitStudyDTO()
if (item != null)
{
InstanceCount = k.InstanceCount,
item.SeriesInstanceUid = string.Empty;
//SeriesCount = k.SeriesCount,
var markInstanceIdList = rowInfoList.Where(y => y.InstanceId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(y => y.InstanceId!.Value).Distinct().ToList();
StudyId = k.Id,
IsCriticalSequence = true,
item.InstanceInfoList = await _dicomInstanceRepository.Where(t => markInstanceIdList.Contains(t.Id)).OrderBy(s => s.DicomSerie.SeriesNumber).ThenBy(s => s.DicomSerie.SeriesTime).ThenBy(x => x.InstanceTime).Select(k =>
new InstanceBasicInfo()
{
Id = k.Id,
NumberOfFrames = k.NumberOfFrames,
HtmlPath = k.HtmlPath,
Path = k.Path,
InstanceNumber = k.InstanceNumber,
StudyId = k.StudyId,
SeriesId = k.SeriesId,
FileSize = k.FileSize
}).ToListAsync();
}).FirstOrDefaultAsync();
if (thisVisitTaskStudy != null)
{
thisVisitTaskStudy.StudyId = default(Guid);
var item = await _dicomSeriesRepository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).
ThenBy(s => s.SeriesTime)
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
if (item != null)
item.InstanceInfoList.ForEach(x =>
{
item.SeriesInstanceUid = string.Empty;
x.RowDate = rowInfoList.FirstOrDefault(y => y.InstanceId == x.Id)?.CreateTime ?? DateTime.Now;
var keyFramesList = rowInfoList.Where(y => y.InstanceId == x.Id && y.NumberOfFrames != 0 && y.NumberOfFrames != null).Select(y => y.NumberOfFrames).Distinct().ToList();
var markInstanceIdList = rowInfoList.Where(y => y.InstanceId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(y => y.InstanceId!.Value).Distinct().ToList();
item.InstanceInfoList = await _dicomInstanceRepository.Where(t => markInstanceIdList.Contains(t.Id)).OrderBy(s => s.DicomSerie.SeriesNumber).ThenBy(s => s.DicomSerie.SeriesTime).ThenBy(x => x.InstanceTime).Select(k =>
new InstanceBasicInfo()
{
Id = k.Id,
NumberOfFrames = k.NumberOfFrames,
HtmlPath = k.HtmlPath,
Path = k.Path,
InstanceNumber = k.InstanceNumber,
StudyId = k.StudyId,
SeriesId = k.SeriesId,
FileSize = k.FileSize
}).ToListAsync();
item.InstanceInfoList.ForEach(x =>
if (keyFramesList.Count() > 0)
{
x.RowDate = rowInfoList.FirstOrDefault(y => y.InstanceId == x.Id)?.CreateTime ?? DateTime.Now;
var keyFramesList = rowInfoList.Where(y => y.InstanceId == x.Id && y.NumberOfFrames != 0 && y.NumberOfFrames != null).Select(y => y.NumberOfFrames).Distinct().ToList();
x.KeyFramesList = keyFramesList;
}
if (keyFramesList.Count() > 0)
{
x.KeyFramesList = keyFramesList;
}
var item = rowInfoList.FirstOrDefault(y => y.InstanceId == x.Id);
if (item != null)
{
x.ShowOrder = item.ShowOrder;
x.RowIndex = item.RowIndex;
}
var item = rowInfoList.FirstOrDefault(y => y.InstanceId == x.Id);
if (item != null)
{
x.ShowOrder = item.ShowOrder;
x.RowIndex = item.RowIndex;
}
});
});
item.InstanceInfoList = item.InstanceInfoList.OrderBy(x => x.ShowOrder).ThenBy(x=>x.RowIndex).ThenBy(x=>x.RowDate).ToList();
item.InstanceInfoList = item.InstanceInfoList.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).ThenBy(x => x.RowDate).ToList();
item.InstanceCount = item.InstanceInfoList.Count;
item.InstanceCount = item.InstanceInfoList.Count;
item.Description = "Key Series";
var modalityList = await _dicomSeriesRepository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).Select(x => x.Modality).Distinct().ToListAsync(); ;
item.Modality = string.Join(",", modalityList);
thisVisitTaskStudy.SeriesList.Add(item);
//thisVisitTaskStudy.SeriesCount = thisVisitTaskStudy.SeriesList.Count;
}
studyList.Insert(0, thisVisitTaskStudy);
item.Description = "Key Series";
var modalityList = await _dicomSeriesRepository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).Select(x => x.Modality).Distinct().ToListAsync(); ;
item.Modality = string.Join(",", modalityList);
thisVisitTaskStudy.SeriesList.Add(item);
//thisVisitTaskStudy.SeriesCount = thisVisitTaskStudy.SeriesList.Count;
}
studyList.Insert(0, thisVisitTaskStudy);
}
studyList.ForEach(x =>
{
x.SeriesList.ForEach(y =>
{
y.IsBeMark = rowInfoList.Any(z => z.SeriesId == y.Id);
});
});
}
studyList.ForEach(x =>
{
x.SeriesList.ForEach(y =>
{
y.IsBeMark = rowInfoList.Any(z => z.SeriesId == y.Id);
});
#endregion
});
}
#endregion
#region Dicom
var noDicomList = await _noneDicomStudyRepository.Where(x => x.TrialId == indto.TrialId && x.SubjectVisitId == indto.SujectVisitId && x.NoneDicomFileList.Any(t => !t.FileType.Contains(StaticData.FileType.Zip)))
@@ -722,8 +724,8 @@ namespace IRaCIS.Core.Application.Services
StudyCode = x.StudyCode,
IsDicom = false,
BodyPartForEdit=x.BodyPart,
BodyPartForEditOther=x.BodyPartForEditOther
BodyPartForEdit = x.BodyPart,
BodyPartForEditOther = x.BodyPartForEditOther
}).ToList();
@@ -125,7 +125,9 @@ namespace IRaCIS.Core.Application.Service
CreateMap<SCPSeries, DicomSeries>();
CreateMap<SCPInstance, DicomInstance>();
CreateMap<DicomStudy, VisitStudyDTO>()
.ForMember(d => d.StudyId, u => u.MapFrom(s => s.Id))
.ForMember(d => d.SeriesList, u => u.MapFrom(s => s.SeriesList));
}
}