Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing

This commit is contained in:
he
2024-09-06 09:22:08 +08:00
17 changed files with 619 additions and 365 deletions
@@ -244,6 +244,9 @@ namespace IRaCIS.Core.Application.Contracts
public string RecordPath { get; set; } = string.Empty;
public AddOrUpdateStudyDto Study { get; set; }
[NotDefault]
public Guid VisitTaskId { get; set; }
}
public class NewArchiveStudyCommand
@@ -397,6 +400,11 @@ namespace IRaCIS.Core.Application.Contracts
public string SubjectCode { get; set; }
}
public class IRTaskUploadedDicomStudyQuery
{
public Guid VisitTaskId { get; set; }
}
public class IRUploadTaskDicomStudyDto : DicomStudyBasicInfo
{
@@ -1,5 +1,7 @@
using FellowOakDicom;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
@@ -239,35 +241,42 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
}
//public async Task<List<VerifyStudyUploadResult>> VerifyIRStudyAllowUpload(VerifyUploadOrReupload inCommand)
//{
//}
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
public async Task<IResponseOutput> AddOrUpdateArchiveTaskStudy(TaskArchiveStudyCommand incommand)
{
#region subject 访
var queryStudy = _visitTaskRepository.Where(t => t.SubjectId == incommand.SubjectId && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id).Select(u => new
{
VisitTaskId = u.Id,
SourceSubjectVisitId = u.SourceSubjectVisitId,
OrginalStudyList = u.SourceSubjectVisit.StudyList.Select(t => new StudyBasicInfo()
{
Id = t.Id,
StudyInstanceUid = t.StudyInstanceUid
}).ToList(),
});
//var queryStudy = _visitTaskRepository.Where(t => t.SubjectId == incommand.SubjectId && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id).Select(u => new
//{
// VisitTaskId = u.Id,
// SourceSubjectVisitId = u.SourceSubjectVisitId,
// OrginalStudyList = u.SourceSubjectVisit.StudyList.Select(t => new StudyBasicInfo()
// {
// Id = t.Id,
// StudyInstanceUid = t.StudyInstanceUid
// }).ToList(),
//});
var studyList = await queryStudy.ToListAsync();
//var studyList = await queryStudy.ToListAsync();
var findOriginStudy = studyList.FirstOrDefault(c => c.OrginalStudyList.Any(t => t.StudyInstanceUid == incommand.Study.StudyInstanceUid));
//var findOriginStudy = studyList.FirstOrDefault(c => c.OrginalStudyList.Any(t => t.StudyInstanceUid == incommand.Study.StudyInstanceUid));
if (findOriginStudy == null)
{
return ResponseOutput.NotOk("该检查不属于该受试者,请核查");
}
//if (findOriginStudy == null)
//{
// return ResponseOutput.NotOk("该检查不属于该受试者,请核查");
//}
#endregion
var visiTaskId = incommand.VisitTaskId;
var modalitys = string.Empty;
@@ -301,17 +310,17 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1;
study.Code = currentNextCodeInt;
study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy));
study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(TaskStudy));
await _fusionCache.SetAsync<int>(CacheKeys.TrialStudyMaxCode(trialId), study.Code, TimeSpan.FromMinutes(30));
}
study.Id = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), findOriginStudy.VisitTaskId.ToString());
study.Id = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), visiTaskId.ToString());
study.TrialId = incommand.TrialId;
study.SubjectId = incommand.SubjectId;
study.VisitTaskId = findOriginStudy.VisitTaskId;
study.VisitTaskId = visiTaskId;
//study.SubjectVisitId = incommand.SubjectVisitId;
@@ -331,13 +340,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
{
var series = _mapper.Map<TaskSeries>(seriesItem);
series.Id = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, incommand.TrialId.ToString(), findOriginStudy.VisitTaskId.ToString());
series.Id = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, incommand.TrialId.ToString(), visiTaskId.ToString());
series.StudyId = study.Id;
series.TrialId = incommand.TrialId;
series.SubjectId = incommand.SubjectId;
//series.SubjectVisitId = incommand.SubjectVisitId;
series.VisitTaskId = findOriginStudy.VisitTaskId;
series.VisitTaskId = visiTaskId;
//前端传递的数量不准,上传的时候,把失败的也加进来了,以实际数组的数字为准
series.InstanceCount = seriesItem.InstanceList.Count;
@@ -348,7 +357,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
{
var isntance = _mapper.Map<TaskInstance>(instanceItem);
Guid instanceId = IdentifierHelper.CreateGuid(study.StudyInstanceUid, series.SeriesInstanceUid, isntance.SopInstanceUid, study.TrialId.ToString(), findOriginStudy.VisitTaskId.ToString());
Guid instanceId = IdentifierHelper.CreateGuid(study.StudyInstanceUid, series.SeriesInstanceUid, isntance.SopInstanceUid, study.TrialId.ToString(), visiTaskId.ToString());
isntance.Id = instanceId;
isntance.StudyId = study.Id;
@@ -357,7 +366,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
isntance.TrialId = incommand.TrialId;
isntance.SubjectId = incommand.SubjectId;
//isntance.SubjectVisitId = incommand.SubjectVisitId;
isntance.VisitTaskId = findOriginStudy.VisitTaskId;
isntance.VisitTaskId = visiTaskId;
await _taskInstanceRepository.AddAsync(isntance);
}
@@ -370,7 +379,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
else
{
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), findOriginStudy.VisitTaskId.ToString());
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), visiTaskId.ToString());
var study = await _taskStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
@@ -389,7 +398,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
//某个序列下少了instance
foreach (var seriesItem in incommand.Study.SeriesList)
{
var seriesId = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, trialId.ToString(), findOriginStudy.VisitTaskId.ToString());
var seriesId = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, trialId.ToString(), visiTaskId.ToString());
TaskSeries dicomSeries = await _taskSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
@@ -403,7 +412,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
series.TrialId = incommand.TrialId;
series.SubjectId = incommand.SubjectId;
series.VisitTaskId = findOriginStudy.VisitTaskId;
series.VisitTaskId = visiTaskId;
//series.SubjectVisitId = incommand.SubjectVisitId;
@@ -421,13 +430,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
foreach (var instanceItem in seriesItem.InstanceList)
{
var insntance = _mapper.Map<TaskInstance>(instanceItem);
insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString(), findOriginStudy.VisitTaskId.ToString());
insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString(), visiTaskId.ToString());
insntance.StudyId = study.Id;
insntance.SeriesId = dicomSeries.Id;
insntance.TrialId = incommand.TrialId;
insntance.SubjectId = incommand.SubjectId;
insntance.VisitTaskId = findOriginStudy.VisitTaskId;
insntance.VisitTaskId = visiTaskId;
await _taskInstanceRepository.AddAsync(insntance);
}
@@ -484,6 +493,310 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
return ResponseOutput.Ok();
}
/// <summary>
/// IR 上传任务 nonedicom 列表 后处理的数据UploadedFileCount不能排序 --new
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<TaskNoneDicomStudyDTO>> GetIRUploadTaskNoneDicomStudyList(IRUploadStudyQuery inQuery)
{
var query = from u in _visitTaskRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
&& t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect)
join ns in _noneDicomStudyReposiotry.Where(t => t.SubjectId == inQuery.SubjectId) on u.SourceSubjectVisitId equals ns.SubjectVisitId
select new TaskNoneDicomStudyDTO()
{
SubjectId = u.SubjectId,
SubjectCode = u.IsSelfAnalysis == true ? u.BlindSubjectCode : u.Subject.Code,
TaskBlindName = u.TaskBlindName,
TaskName = u.TaskName,
SourceSubjectVisitId = u.SourceSubjectVisitId,
VisitTaskId = u.Id,
Id = ns.Id,
Description = ns.Description,
ImageDate = ns.ImageDate,
BodyPart = ns.BodyPart,
FileCount = ns.FileCount,
Modality = ns.Modality,
StudyCode = ns.StudyCode,
FileList = ns.NoneDicomFileList.Select(t => new NoneDicomFileInfo()
{
FileType = t.FileType,
FileName = t.FileName,
FileSize = t.FileSize,
Path = t.Path
}).ToList()
};
var list = await query.Where(t => t.SubjectCode == inQuery.SubjectCode).SortToListAsync(inQuery);
var noneDicomStudyTaskIdList = list.Select(t => t.VisitTaskId).ToList();
var taskNoneDicomStudyList = _visitTaskRepository.Where(t => noneDicomStudyTaskIdList.Contains(t.Id))
.SelectMany(t => t.TaskNoneDicomStudyFileList).Where(t => noneDicomStudyTaskIdList.Contains((Guid)t.VisitTaskId))
.Select(u => new NoneDicomFileInfo
{
OriginNoneDicomStudyId = u.OriginNoneDicomStudyId,
FileType = u.FileType,
FileName = u.FileName,
FileSize = u.FileSize,
Path = u.Path
})
.ToList();
foreach (var item in list)
{
item.UploadedFileCount = taskNoneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).Count();
item.UploadedFileList = taskNoneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).ToList();
}
return list;
}
/// <summary>
/// IQC 获取CRC 上传到某一个访视的的检查信息 (原始影像信息 包含dicom 非dicom)
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> GetCRCUploadedStudyInfo(CRCUploadedStudyQuqry inQuery)
{
var isQueryDicom = inQuery.DicomStudyIdList.Count > 0;
var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0;
var query = from sv in _subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId)
select new
{
SubjectCode = sv.Subject.Code,
VisitName = sv.VisitName,
StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
.Select(u => new
{
u.PatientId,
u.StudyTime,
u.StudyCode,
SeriesList = u.SeriesList.Select(z => new
{
z.Modality,
InstanceList = z.DicomInstanceList.Select(k => new
{
k.Path,
k.FileSize
})
})
}).ToList(),
NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false)
.Select(nd => new
{
nd.Modality,
nd.StudyCode,
nd.ImageDate,
FileList = nd.NoneDicomFileList.Select(file => new
{
file.FileName,
file.Path,
file.FileType
})
}).ToList()
};
var result = query.FirstOrDefault();
return ResponseOutput.Ok(result);
}
/// <summary>
/// IR 阅片页面 和IR 任务列表页面下载 勾选下载列表(后端要考虑到一致性分析 subjectCode的问题)
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<SubjectCRCImageUploadedStudyDto>> GetSubjectImageDownloadSelectList(IRReadingDownloadQuery inQuery)
{
var query = _visitTaskRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
&& t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect)
.ProjectTo<SubjectCRCImageUploadedDto>(_mapper.ConfigurationProvider);
var list = await query.Where(t => t.SubjectCode == inQuery.SubjectCode).ToListAsync();
#region
var result = new List<SubjectCRCImageUploadedStudyDto>();
var dicomStudyList = list.Where(item => item.DicomStudyList.Count > 0)
.Select(item => new SubjectCRCImageUploadedStudyDto
{
VisitTaskId = item.VisitTaskId,
SubjectId = item.SubjectId,
SubjectCode = item.SubjectCode,
TaskBlindName = item.TaskBlindName,
TaskName = item.TaskName,
IsImageFilter = item.IsImageFilter,
CriterionModalitys = item.CriterionModalitys,
SourceSubjectVisitId = item.SourceSubjectVisitId,
//取dicom
DicomStudyList = item.DicomStudyList,
}).ToList();
var noneStudyList = list.Where(item => item.NoneDicomStudyList.Count > 0)
.Select(item => new SubjectCRCImageUploadedStudyDto
{
VisitTaskId = item.VisitTaskId,
SubjectId = item.SubjectId,
SubjectCode = item.SubjectCode,
TaskBlindName = item.TaskBlindName,
TaskName = item.TaskName,
IsImageFilter = item.IsImageFilter,
CriterionModalitys = item.CriterionModalitys,
SourceSubjectVisitId = item.SourceSubjectVisitId,
//非dicom
NoneDicomStudyList = item.NoneDicomStudyList,
}).ToList();
result.AddRange(dicomStudyList);
result.AddRange(noneStudyList);
#endregion
return result;
}
/// <summary>
/// IR 阅片页面获取下载检查的信息 会根据标准进行过滤检查,(后端要考虑到一致性分析 subjectCode的问题)
/// 检查在访视下面,所以需要传递下载的访视Id,另外下载访视下面那些检查,就把访视下的对应的检查Id 丢到数组里就好
/// </summary>
/// <param name="inQuery"></param>
/// <param name="_subjectRepository"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> GetIRReadingDownloadStudyInfo(IRDownloadQuery inQuery, [FromServices] IRepository<Subject> _subjectRepository)
{
var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
.Select(t => new { t.IsImageFilter, t.CriterionModalitys }).FirstNotNullAsync();
var isQueryDicom = inQuery.DicomStudyIdList.Count > 0;
var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0;
var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => inQuery.SubjectVisitIdList.Contains(t.Id)))
select new
{
SubjectCode = sv.Subject.Code,
VisitName = sv.VisitName,
StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
.Select(u => new
{
u.PatientId,
u.StudyTime,
u.StudyCode,
SeriesList = u.SeriesList.Select(z => new
{
z.Modality,
InstancePathList = z.DicomInstanceList.Select(k => new
{
k.Path
})
})
}),
NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false)
.Select(nd => new
{
nd.Modality,
nd.StudyCode,
nd.ImageDate,
FileList = nd.NoneDicomFileList.Select(file => new
{
file.FileName,
file.Path,
file.FileType
})
})
};
var result = await query.FirstOrDefaultAsync();
return ResponseOutput.Ok(result);
}
[HttpPost]
public async Task<IResponseOutput> GetTaskUploadedDicomStudyList(IRTaskUploadedDicomStudyQuery inQuery)
{
var query = _taskStudyRepository.Where(t => t.VisitTaskId == inQuery.VisitTaskId).Select(t => new
{
StudyId=t.Id,
t.Modalities,
t.InstanceCount,
t.SeriesCount,
t.StudyCode,
SeriesList= t.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).Select(u=>new
{
u.SeriesTime,
u.InstanceCount,
u.ImageResizePath,
u.Modality,
u.Description,
u.SeriesInstanceUid,
u.SeriesNumber,
u.SliceThickness,
u.StudyInstanceUid,
IsExistMutiFrames= u.InstanceList.Any(t=>t.NumberOfFrames>1),
InstanceInfoList =u.InstanceList.OrderBy(t => t.InstanceNumber).Select(k =>
new InstanceBasicInfo()
{
Id = k.Id,
NumberOfFrames = k.NumberOfFrames,
HtmlPath = k.HtmlPath,
Path = k.Path,
InstanceNumber = k.InstanceNumber,
}).ToList()
})
});
var list = await query.ToListAsync();
return ResponseOutput.Ok(list);
}
#region
/// <summary>
/// 打包和匿名化影像 默认是匿名化打包,也可以不匿名化打包
/// </summary>
@@ -493,6 +806,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <param name="isAnonymize"></param>
/// <returns></returns>
[Obsolete]
public async Task<IResponseOutput> RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
{
@@ -547,6 +861,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <param name="_subjectRepository"></param>
/// <param name="inQuery"></param>
/// <returns></returns>
[Obsolete]
public async Task<IResponseOutput> GetSubejectOrVisitZipInfo([FromServices] IRepository<Subject> _subjectRepository, SubejctZipInfoQuery inQuery)
{
var isImageFilter = false;
@@ -678,6 +993,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <param name="isAnonymize"></param>
/// <returns></returns>
[HttpPost]
[Obsolete]
public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
{
@@ -901,6 +1217,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
}
#endregion
#region
@@ -910,6 +1229,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
[Obsolete]
public async Task<List<SubjectUploadTaskInfo>> GetIRUploadTaskList_Old(CRCUploadTaskQuery inQuery)
{
var query = _visitTaskRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
@@ -927,6 +1247,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
[Obsolete]
public async Task<List<IRUploadTaskDicomStudyDto>> GetIRUploadTaskDicomStudyList_Old(CRCUploadTaskStudyQuery inQuery)
{
var list = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
@@ -965,6 +1286,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
[Obsolete]
public async Task<List<IRUploadTaskNoneDicomStudyDto>> GetIRUploadTaskNoneDicomStudyList_Old(CRCUploadTaskStudyQuery inQuery)
{
var list = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
@@ -989,270 +1311,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
}
#endregion
#region IR dicom dicom
/// <summary>
/// IR 上传任务 nonedicom 列表 后处理的数据UploadedFileCount不能排序 --new
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<TaskNoneDicomStudyDTO>> GetIRUploadTaskNoneDicomStudyList(IRUploadStudyQuery inQuery)
{
var query = from u in _visitTaskRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
&& t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect)
join ns in _noneDicomStudyReposiotry.Where(t => t.SubjectId == inQuery.SubjectId) on u.SourceSubjectVisitId equals ns.SubjectVisitId
select new TaskNoneDicomStudyDTO()
{
SubjectId = u.SubjectId,
SubjectCode = u.IsSelfAnalysis == true ? u.BlindSubjectCode : u.Subject.Code,
TaskBlindName = u.TaskBlindName,
TaskName = u.TaskName,
SourceSubjectVisitId = u.SourceSubjectVisitId,
VisitTaskId=u.Id,
Id = ns.Id,
Description = ns.Description,
ImageDate = ns.ImageDate,
BodyPart = ns.BodyPart,
FileCount = ns.FileCount,
Modality = ns.Modality,
StudyCode = ns.StudyCode,
FileList = ns.NoneDicomFileList.Select(t => new NoneDicomFileInfo()
{
FileType=t.FileType,
FileName = t.FileName,
FileSize = t.FileSize,
Path = t.Path
}).ToList()
};
var list = await query.Where(t => t.SubjectCode == inQuery.SubjectCode).SortToListAsync(inQuery);
var noneDicomStudyTaskIdList = list.Select(t => t.VisitTaskId).ToList();
var taskNoneDicomStudyList = _visitTaskRepository.Where(t => noneDicomStudyTaskIdList.Contains(t.Id))
.SelectMany(t => t.TaskNoneDicomStudyFileList).Where(t => noneDicomStudyTaskIdList.Contains((Guid)t.VisitTaskId))
.Select(u => new NoneDicomFileInfo
{
OriginNoneDicomStudyId = u.OriginNoneDicomStudyId,
FileType=u.FileType,
FileName = u.FileName,
FileSize = u.FileSize,
Path = u.Path
})
.ToList();
foreach (var item in list)
{
item.UploadedFileCount = taskNoneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).Count();
item.UploadedFileList = taskNoneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).ToList();
}
return list;
}
#endregion
/// <summary>
/// IQC 获取CRC 上传到某一个访视的的检查信息 (原始影像信息 包含dicom 非dicom)
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> GetCRCUploadedStudyInfo(CRCUploadedStudyQuqry inQuery)
{
var isQueryDicom = inQuery.DicomStudyIdList.Count > 0;
var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0;
var query = from sv in _subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId)
select new
{
SubjectCode = sv.Subject.Code,
VisitName = sv.VisitName,
StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
.Select(u => new
{
u.PatientId,
u.StudyTime,
u.StudyCode,
SeriesList = u.SeriesList.Select(z => new
{
z.Modality,
InstanceList = z.DicomInstanceList.Select(k => new
{
k.Path,
k.FileSize
})
})
}).ToList(),
NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false)
.Select(nd => new
{
nd.Modality,
nd.StudyCode,
nd.ImageDate,
FileList = nd.NoneDicomFileList.Select(file => new
{
file.FileName,
file.Path,
file.FileType
})
}).ToList()
};
var result = query.FirstOrDefault();
return ResponseOutput.Ok(result);
}
/// <summary>
/// IR 阅片页面 和IR 任务列表页面下载 勾选下载列表(后端要考虑到一致性分析 subjectCode的问题)
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<SubjectCRCImageUploadedStudyDto>> GetSubjectImageDownloadSelectList(IRReadingDownloadQuery inQuery)
{
var query = _visitTaskRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
&& t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect)
.ProjectTo<SubjectCRCImageUploadedDto>(_mapper.ConfigurationProvider);
var list = await query.Where(t => t.SubjectCode == inQuery.SubjectCode).ToListAsync();
#region
var result = new List<SubjectCRCImageUploadedStudyDto>();
var dicomStudyList = list.Where(item => item.DicomStudyList.Count > 0)
.Select(item => new SubjectCRCImageUploadedStudyDto
{
VisitTaskId = item.VisitTaskId,
SubjectId = item.SubjectId,
SubjectCode = item.SubjectCode,
TaskBlindName = item.TaskBlindName,
TaskName = item.TaskName,
IsImageFilter = item.IsImageFilter,
CriterionModalitys = item.CriterionModalitys,
SourceSubjectVisitId = item.SourceSubjectVisitId,
//取dicom
DicomStudyList = item.DicomStudyList,
}).ToList();
var noneStudyList = list.Where(item => item.NoneDicomStudyList.Count > 0)
.Select(item => new SubjectCRCImageUploadedStudyDto
{
VisitTaskId = item.VisitTaskId,
SubjectId = item.SubjectId,
SubjectCode = item.SubjectCode,
TaskBlindName = item.TaskBlindName,
TaskName = item.TaskName,
IsImageFilter = item.IsImageFilter,
CriterionModalitys = item.CriterionModalitys,
SourceSubjectVisitId = item.SourceSubjectVisitId,
//非dicom
NoneDicomStudyList = item.NoneDicomStudyList,
}).ToList();
result.AddRange(dicomStudyList);
result.AddRange(noneStudyList);
#endregion
return result;
}
/// <summary>
/// IR 阅片页面获取下载检查的信息 会根据标准进行过滤检查,(后端要考虑到一致性分析 subjectCode的问题)
/// 检查在访视下面,所以需要传递下载的访视Id,另外下载访视下面那些检查,就把访视下的对应的检查Id 丢到数组里就好
/// </summary>
/// <param name="inQuery"></param>
/// <param name="_subjectRepository"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> GetIRReadingDownloadStudyInfo(IRDownloadQuery inQuery, [FromServices] IRepository<Subject> _subjectRepository)
{
var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
.Select(t => new { t.IsImageFilter, t.CriterionModalitys }).FirstNotNullAsync();
var isQueryDicom = inQuery.DicomStudyIdList.Count > 0;
var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0;
var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => inQuery.SubjectVisitIdList.Contains(t.Id)))
select new
{
SubjectCode = sv.Subject.Code,
VisitName = sv.VisitName,
StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
.Select(u => new
{
u.PatientId,
u.StudyTime,
u.StudyCode,
SeriesList = u.SeriesList.Select(z => new
{
z.Modality,
InstancePathList = z.DicomInstanceList.Select(k => new
{
k.Path
})
})
}),
NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false)
.Select(nd => new
{
nd.Modality,
nd.StudyCode,
nd.ImageDate,
FileList = nd.NoneDicomFileList.Select(file => new
{
file.FileName,
file.Path,
file.FileType
})
})
};
var result = await query.FirstOrDefaultAsync();
return ResponseOutput.Ok(result);
}
}
@@ -137,14 +137,14 @@ namespace IRaCIS.Core.Application.Contracts
public async Task<List<NoneDicomStudyFileView>> GetNoneDicomStudyFileList(Guid noneDicomStudyId)
{
return await _noneDicomStudyFileRepository.Where(t => t.NoneDicomStudyId == noneDicomStudyId)
.ProjectTo<NoneDicomStudyFileView>(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken }).ToListAsync();
.ProjectTo<NoneDicomStudyFileView>(_mapper.ConfigurationProvider).ToListAsync();
}
[HttpGet("{subjectVisitId:guid}")]
public async Task<List<NoneDicomStudyFileView>> GetVisitNoneDicomStudyFileList(Guid subjectVisitId)
{
return await _noneDicomStudyFileRepository.Where(t => t.NoneDicomStudy.SubjectVisitId == subjectVisitId)
.ProjectTo<NoneDicomStudyFileView>(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken }).ToListAsync();
.ProjectTo<NoneDicomStudyFileView>(_mapper.ConfigurationProvider).ToListAsync();
}
@@ -740,6 +740,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var visitList = _subjectVisitRepository.Where(t => t.SubjectId == verifyInfo.SubjectId).Select(t => new { t.VisitNum, t.EarliestScanDate, t.LatestScanDate, t.Id }).ToList();
var currentVisitNum = visitList.Where(t => t.Id == verifyInfo.SubjectVisitId).First().VisitNum;
verifyInfo.StudyInstanceUidList.ForEach(waitUploadItem =>
{
@@ -748,7 +749,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
{
//小于当前访视 最近的最晚拍片
var before = visitList.Where(u => u.VisitNum < verifyInfo.VisitNum).Max(k => k.LatestScanDate);
var before = visitList.Where(u => u.VisitNum < currentVisitNum).Max(k => k.LatestScanDate);
if (before != null && waitUploadItem.StudyDate != null && before > waitUploadItem.StudyDate)
{
@@ -759,7 +760,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
}
//大于当前访视 最近的最早拍片日期
var after = visitList.Where(u => u.VisitNum > verifyInfo.VisitNum).Min(k => k.EarliestScanDate);
var after = visitList.Where(u => u.VisitNum > currentVisitNum).Min(k => k.EarliestScanDate);
if (after != null && waitUploadItem.StudyDate != null && after < waitUploadItem.StudyDate)
{
@@ -638,7 +638,7 @@ namespace IRaCIS.Core.Application.Image.QA
public async Task<List<SubjectVisitSelectItem>> GetSubjectVisitSelectList(Guid subjectId)
{
var maxNum = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TaskState == TaskState.Effect && t.SignTime != null && t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.InOrder).MaxAsync(x => x.VisitTaskNum);
var maxNum = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TaskState == TaskState.Effect && t.SignTime != null && t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.InOrder).MaxAsync(x => (decimal?)x.VisitTaskNum)??0;
return await _subjectVisitRepository.Where(t => t.SubjectId == subjectId&&t.VisitNum>= maxNum).OrderBy(T => T.VisitNum).ProjectTo<SubjectVisitSelectItem>(_mapper.ConfigurationProvider).ToListAsync();
@@ -590,7 +590,7 @@ namespace IRaCIS.Core.Application.Service
CreateMap<NoneDicomStudyFile, NoneDicomStudyFileView>()
.ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path + "?access_token=" + token));
.ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path));
CreateMap<NoneDicomStudy, NoneDicomStudyView>()
//.ForMember(d => d.FileCount, u => u.MapFrom(s => s.NoneDicomFileList.Count))
@@ -382,6 +382,8 @@ namespace IRaCIS.Application.Contracts
}
public class VerifyPacsImageCommand
{
[NotDefault]
@@ -419,7 +419,6 @@ namespace IRaCIS.Core.Application.Contracts
public Guid SubjectVisitId { get; set; }
public decimal VisitNum { get; set; }
public List<VerifyUploadStudyBasicInfo> StudyInstanceUidList { get; set; } = new List<VerifyUploadStudyBasicInfo>();
}