ir 上传后处理检查预览数据接口
parent
e5a8a06bbb
commit
c078d496be
|
@ -88,6 +88,7 @@
|
||||||
"QCChallengeCodePrefix": "Q",
|
"QCChallengeCodePrefix": "Q",
|
||||||
"NoneDicomStudyCodePrefix": "NST",
|
"NoneDicomStudyCodePrefix": "NST",
|
||||||
"DicomStudyCodePrefix": "ST",
|
"DicomStudyCodePrefix": "ST",
|
||||||
|
"TaskStudyCodePrefix": "P-ST",
|
||||||
"SystemSiteCodePrefix": "S",
|
"SystemSiteCodePrefix": "S",
|
||||||
"DefaultPassword": "123456",
|
"DefaultPassword": "123456",
|
||||||
"ImageShareExpireDays": 10
|
"ImageShareExpireDays": 10
|
||||||
|
|
|
@ -397,6 +397,11 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
public string SubjectCode { get; set; }
|
public string SubjectCode { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class IRTaskUploadedDicomStudyQuery
|
||||||
|
{
|
||||||
|
public Guid VisitTaskId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class IRUploadTaskDicomStudyDto : DicomStudyBasicInfo
|
public class IRUploadTaskDicomStudyDto : DicomStudyBasicInfo
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using FellowOakDicom;
|
using FellowOakDicom;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
|
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
|
||||||
using IRaCIS.Core.Application.Filter;
|
using IRaCIS.Core.Application.Filter;
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
|
using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
|
||||||
|
@ -301,7 +302,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1;
|
int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1;
|
||||||
study.Code = currentNextCodeInt;
|
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));
|
await _fusionCache.SetAsync<int>(CacheKeys.TrialStudyMaxCode(trialId), study.Code, TimeSpan.FromMinutes(30));
|
||||||
|
|
||||||
|
@ -484,6 +485,310 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
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>
|
||||||
/// 打包和匿名化影像 默认是匿名化打包,也可以不匿名化打包
|
/// 打包和匿名化影像 默认是匿名化打包,也可以不匿名化打包
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -493,6 +798,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
/// <param name="isAnonymize"></param>
|
/// <param name="isAnonymize"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
|
||||||
|
[Obsolete]
|
||||||
public async Task<IResponseOutput> RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
|
public async Task<IResponseOutput> RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -547,6 +853,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
/// <param name="_subjectRepository"></param>
|
/// <param name="_subjectRepository"></param>
|
||||||
/// <param name="inQuery"></param>
|
/// <param name="inQuery"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
[Obsolete]
|
||||||
public async Task<IResponseOutput> GetSubejectOrVisitZipInfo([FromServices] IRepository<Subject> _subjectRepository, SubejctZipInfoQuery inQuery)
|
public async Task<IResponseOutput> GetSubejectOrVisitZipInfo([FromServices] IRepository<Subject> _subjectRepository, SubejctZipInfoQuery inQuery)
|
||||||
{
|
{
|
||||||
var isImageFilter = false;
|
var isImageFilter = false;
|
||||||
|
@ -678,6 +985,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
/// <param name="isAnonymize"></param>
|
/// <param name="isAnonymize"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
|
[Obsolete]
|
||||||
public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
|
public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -901,6 +1209,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region 按照任务为维度 展示上传的列表 废弃
|
#region 按照任务为维度 展示上传的列表 废弃
|
||||||
|
@ -910,6 +1221,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
/// <param name="inQuery"></param>
|
/// <param name="inQuery"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
|
[Obsolete]
|
||||||
public async Task<List<SubjectUploadTaskInfo>> GetIRUploadTaskList_Old(CRCUploadTaskQuery inQuery)
|
public async Task<List<SubjectUploadTaskInfo>> GetIRUploadTaskList_Old(CRCUploadTaskQuery inQuery)
|
||||||
{
|
{
|
||||||
var query = _visitTaskRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
|
var query = _visitTaskRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
|
||||||
|
@ -927,6 +1239,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
/// <param name="inQuery"></param>
|
/// <param name="inQuery"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
|
[Obsolete]
|
||||||
public async Task<List<IRUploadTaskDicomStudyDto>> GetIRUploadTaskDicomStudyList_Old(CRCUploadTaskStudyQuery inQuery)
|
public async Task<List<IRUploadTaskDicomStudyDto>> GetIRUploadTaskDicomStudyList_Old(CRCUploadTaskStudyQuery inQuery)
|
||||||
{
|
{
|
||||||
var list = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
|
var list = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
|
||||||
|
@ -965,6 +1278,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
/// <param name="inQuery"></param>
|
/// <param name="inQuery"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
|
[Obsolete]
|
||||||
public async Task<List<IRUploadTaskNoneDicomStudyDto>> GetIRUploadTaskNoneDicomStudyList_Old(CRCUploadTaskStudyQuery inQuery)
|
public async Task<List<IRUploadTaskNoneDicomStudyDto>> GetIRUploadTaskNoneDicomStudyList_Old(CRCUploadTaskStudyQuery inQuery)
|
||||||
{
|
{
|
||||||
var list = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
|
var list = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
|
||||||
|
@ -989,270 +1303,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
}
|
}
|
||||||
#endregion
|
#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)
|
public async Task<List<NoneDicomStudyFileView>> GetNoneDicomStudyFileList(Guid noneDicomStudyId)
|
||||||
{
|
{
|
||||||
return await _noneDicomStudyFileRepository.Where(t => t.NoneDicomStudyId == 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}")]
|
[HttpGet("{subjectVisitId:guid}")]
|
||||||
public async Task<List<NoneDicomStudyFileView>> GetVisitNoneDicomStudyFileList(Guid subjectVisitId)
|
public async Task<List<NoneDicomStudyFileView>> GetVisitNoneDicomStudyFileList(Guid subjectVisitId)
|
||||||
{
|
{
|
||||||
return await _noneDicomStudyFileRepository.Where(t => t.NoneDicomStudy.SubjectVisitId == subjectVisitId)
|
return await _noneDicomStudyFileRepository.Where(t => t.NoneDicomStudy.SubjectVisitId == subjectVisitId)
|
||||||
.ProjectTo<NoneDicomStudyFileView>(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken }).ToListAsync();
|
.ProjectTo<NoneDicomStudyFileView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -590,7 +590,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
|
|
||||||
CreateMap<NoneDicomStudyFile, NoneDicomStudyFileView>()
|
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>()
|
CreateMap<NoneDicomStudy, NoneDicomStudyView>()
|
||||||
//.ForMember(d => d.FileCount, u => u.MapFrom(s => s.NoneDicomFileList.Count))
|
//.ForMember(d => d.FileCount, u => u.MapFrom(s => s.NoneDicomFileList.Count))
|
||||||
|
|
|
@ -108,9 +108,12 @@ namespace IRaCIS.Core.Domain.Share
|
||||||
|
|
||||||
public static string DicomStudyCodePrefix { get; set; }
|
public static string DicomStudyCodePrefix { get; set; }
|
||||||
|
|
||||||
|
public static string TaskStudyCodePrefix { get; set; }
|
||||||
|
|
||||||
public static string NoneDicomStudyCodePrefix { get; set; }
|
public static string NoneDicomStudyCodePrefix { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static int ImageShareExpireDays { get; set; } = 7;
|
public static int ImageShareExpireDays { get; set; } = 7;
|
||||||
|
|
||||||
|
|
||||||
|
@ -141,7 +144,7 @@ namespace IRaCIS.Core.Domain.Share
|
||||||
DicomStudyCodePrefix = configuration.GetSection("IRaCISBasicConfig").GetValue<string>("DicomStudyCodePrefix");
|
DicomStudyCodePrefix = configuration.GetSection("IRaCISBasicConfig").GetValue<string>("DicomStudyCodePrefix");
|
||||||
DefaultPassword = configuration.GetSection("IRaCISBasicConfig").GetValue<string>("DefaultPassword");
|
DefaultPassword = configuration.GetSection("IRaCISBasicConfig").GetValue<string>("DefaultPassword");
|
||||||
SystemSiteCodePrefix = configuration.GetSection("IRaCISBasicConfig").GetValue<string>("SystemSiteCodePrefix");
|
SystemSiteCodePrefix = configuration.GetSection("IRaCISBasicConfig").GetValue<string>("SystemSiteCodePrefix");
|
||||||
|
TaskStudyCodePrefix = configuration.GetSection("IRaCISBasicConfig").GetValue<string>("TaskStudyCodePrefix");
|
||||||
|
|
||||||
ImageShareExpireDays = configuration.GetSection("IRaCISBasicConfig").GetValue<int>("ImageShareExpireDays");
|
ImageShareExpireDays = configuration.GetSection("IRaCISBasicConfig").GetValue<int>("ImageShareExpireDays");
|
||||||
|
|
||||||
|
@ -175,6 +178,10 @@ namespace IRaCIS.Core.Domain.Share
|
||||||
|
|
||||||
return DicomStudyCodePrefix + codeInt.ToString("D5");
|
return DicomStudyCodePrefix + codeInt.ToString("D5");
|
||||||
|
|
||||||
|
case nameof(TaskStudy):
|
||||||
|
|
||||||
|
return TaskStudyCodePrefix + codeInt.ToString("D5");
|
||||||
|
|
||||||
case nameof(VisitTask):
|
case nameof(VisitTask):
|
||||||
|
|
||||||
return "W" + codeInt.ToString("D5");
|
return "W" + codeInt.ToString("D5");
|
||||||
|
|
Loading…
Reference in New Issue