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
Details
continuous-integration/drone/push Build is passing
Details
commit
45af1d7ba6
|
|
@ -100,11 +100,11 @@ namespace IRaCIS.Core.Application.Helper
|
||||||
var dicomFile = new DicomFile(dataset);
|
var dicomFile = new DicomFile(dataset);
|
||||||
|
|
||||||
// 文件名递增格式:IM_00001, IM_00002, ...
|
// 文件名递增格式:IM_00001, IM_00002, ...
|
||||||
string filename = $@"IMAGE/IM_{index:D5}"; // :D5 表示补足5位
|
string filename = $@"IMAGE\IM_{index:D5}"; // :D5 表示补足5位
|
||||||
|
|
||||||
mappings.Add($"{filename} => {item.InstanceId}");
|
mappings.Add($"{filename} => {item.InstanceId}");
|
||||||
|
|
||||||
dic.Add(item.InstanceId.ToString(), Path.GetFileName(filename));
|
dic.Add(item.InstanceId.ToString(), filename.TrimEnd('/', '\\').Split('/', '\\').Last());
|
||||||
|
|
||||||
dicomDir.AddFile(dicomFile, filename);
|
dicomDir.AddFile(dicomFile, filename);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15707,7 +15707,7 @@
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Helper.OSSService.DeleteFromPrefix(System.String,System.Boolean)">
|
<member name="M:IRaCIS.Core.Application.Helper.OSSService.DeleteFromPrefix(System.String,System.Boolean)">
|
||||||
<summary>
|
<summary>
|
||||||
删除某个目录的文件
|
删除某个目录的文件 (包含单个文件,oss单个文件需要去除前缀/)
|
||||||
</summary>
|
</summary>
|
||||||
<param name="prefix"></param>
|
<param name="prefix"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
|
|
|
||||||
|
|
@ -159,7 +159,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
if (inQuery.IsImageSegmentLabel == true)
|
if (inQuery.IsImageSegmentLabel == true)
|
||||||
{
|
{
|
||||||
var querySV = _subjectVisitRepository.WhereIf(inQuery.SubjectVisitId != null, t => t.Id == inQuery.SubjectVisitId)
|
var querySV = _subjectVisitRepository.Where(t => t.CheckState == CheckStateEnum.CVPassed)
|
||||||
|
.WhereIf(inQuery.SubjectVisitId != null, t => t.Id == inQuery.SubjectVisitId)
|
||||||
.WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId)
|
.WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId)
|
||||||
.Select(u => new SubjectVisitMarkUploadDto()
|
.Select(u => new SubjectVisitMarkUploadDto()
|
||||||
{
|
{
|
||||||
|
|
@ -230,7 +231,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SourceSubjectVisitId != null
|
var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed
|
||||||
&& t.DoctorUserId == _userInfo.UserRoleId && t.TaskState == TaskState.Effect)
|
&& t.DoctorUserId == _userInfo.UserRoleId && t.TaskState == TaskState.Effect)
|
||||||
//满足 有序,或者随机只看到当前任务的dicom 非dicom检查
|
//满足 有序,或者随机只看到当前任务的dicom 非dicom检查
|
||||||
.WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
|
.WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
|
||||||
|
|
@ -989,7 +990,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var list = _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId)
|
var list = _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId && t.SubjectVisit.CheckState == CheckStateEnum.CVPassed)
|
||||||
.WhereIf(inQuery.SubjectVisitId != null, t => t.SubjectVisitId == inQuery.SubjectVisitId)
|
.WhereIf(inQuery.SubjectVisitId != null, t => t.SubjectVisitId == inQuery.SubjectVisitId)
|
||||||
//.WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|"))
|
//.WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|"))
|
||||||
.Select(u => new TaskNoneDicomStudyDTO()
|
.Select(u => new TaskNoneDicomStudyDTO()
|
||||||
|
|
@ -1047,7 +1048,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var query = from u in _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
|
var query = from u in _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
|
||||||
&& t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId && t.TaskState == TaskState.Effect)
|
&& t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.DoctorUserId == doctorUserId && t.TaskState == TaskState.Effect)
|
||||||
//满足 有序,或者随机只看到当前任务的dicom 非dicom检查
|
//满足 有序,或者随机只看到当前任务的dicom 非dicom检查
|
||||||
.WhereIf(info.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
|
.WhereIf(info.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
|
||||||
join ns in _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId).WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|"))
|
join ns in _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId).WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|"))
|
||||||
|
|
@ -1137,6 +1138,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
var dirDic = new Dictionary<string, string>();
|
var dirDic = new Dictionary<string, string>();
|
||||||
#region DIR处理导出文件名,并将对应关系上传到OSS里面存储
|
#region DIR处理导出文件名,并将对应关系上传到OSS里面存储
|
||||||
|
|
||||||
|
var info = await _subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId).Select(t => new { t.Trial.TrialCode }).FirstOrDefaultAsync();
|
||||||
|
|
||||||
//有传输语法值的导出 才生成DIR
|
//有传输语法值的导出 才生成DIR
|
||||||
if (_subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSytaxUID != string.Empty))
|
if (_subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSytaxUID != string.Empty))
|
||||||
{
|
{
|
||||||
|
|
@ -1148,7 +1151,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
DicomStudyId = t.DicomStudy.Id,
|
DicomStudyId = t.DicomStudy.Id,
|
||||||
|
|
||||||
PatientId = t.DicomStudy.PatientId,
|
PatientId = info.TrialCode + "-" + t.DicomStudy.PatientId,
|
||||||
PatientName = t.DicomStudy.PatientName,
|
PatientName = t.DicomStudy.PatientName,
|
||||||
PatientBirthDate = t.DicomStudy.PatientBirthDate,
|
PatientBirthDate = t.DicomStudy.PatientBirthDate,
|
||||||
PatientSex = t.DicomStudy.PatientSex,
|
PatientSex = t.DicomStudy.PatientSex,
|
||||||
|
|
@ -1329,7 +1332,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
if (inQuery.IsImageSegmentLabel == true)
|
if (inQuery.IsImageSegmentLabel == true)
|
||||||
{
|
{
|
||||||
var list = await _subjectVisitRepository
|
var list = await _subjectVisitRepository.Where(t => t.CheckState == CheckStateEnum.CVPassed)
|
||||||
.WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId)
|
.WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId)
|
||||||
.ProjectTo<SubjectVisitMarkStudyDto>(_mapper.ConfigurationProvider).ToListAsync();
|
.ProjectTo<SubjectVisitMarkStudyDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
|
||||||
|
|
@ -1404,7 +1407,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
}
|
}
|
||||||
|
|
||||||
var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
|
var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
|
||||||
&& t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId)
|
&& t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.DoctorUserId == doctorUserId)
|
||||||
//满足 有序,或者随机只看到当前任务的dicom 非dicom检查
|
//满足 有序,或者随机只看到当前任务的dicom 非dicom检查
|
||||||
.WhereIf(inQuery.VisitTaskId == null, t => t.TaskState == TaskState.Effect)//从待阅列表进入,要筛选出有效的,任务可能重阅了,也要看到该任务的
|
.WhereIf(inQuery.VisitTaskId == null, t => t.TaskState == TaskState.Effect)//从待阅列表进入,要筛选出有效的,任务可能重阅了,也要看到该任务的
|
||||||
.WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
|
.WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
|
||||||
|
|
@ -1508,7 +1511,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
public async Task<IResponseOutput> GetIRReadingDownloadStudyInfo(IRDownloadQuery inQuery)
|
public async Task<IResponseOutput> GetIRReadingDownloadStudyInfo(IRDownloadQuery inQuery)
|
||||||
{
|
{
|
||||||
var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
|
var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
|
||||||
.Select(t => new { t.IsImageFilter, t.CriterionModalitys, t.TrialId, t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
|
.Select(t => new { t.IsImageFilter, t.CriterionModalitys, t.TrialId, t.IsReadingTaskViewInOrder, t.Trial.TrialCode }).FirstNotNullAsync();
|
||||||
|
|
||||||
var isQueryDicom = inQuery.DicomStudyIdList.Count > 0;
|
var isQueryDicom = inQuery.DicomStudyIdList.Count > 0;
|
||||||
var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0;
|
var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0;
|
||||||
|
|
@ -1526,7 +1529,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
#region 在下载前先处理DIR文件
|
#region 在下载前先处理DIR文件
|
||||||
|
|
||||||
//有传输语法值的导出 才生成DIR
|
//有传输语法值的导出 才生成DIR
|
||||||
if (_subjectVisitRepository.Where(t => t.SubjectId == inQuery.SubjectId).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSytaxUID != string.Empty))
|
if (_subjectVisitRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.CheckState == CheckStateEnum.CVPassed).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSytaxUID != string.Empty))
|
||||||
{
|
{
|
||||||
var dirInfolist = _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id))).SelectMany(t => t.StudyList)
|
var dirInfolist = _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id))).SelectMany(t => t.StudyList)
|
||||||
.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
|
.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
|
||||||
|
|
@ -1539,7 +1542,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
DicomStudyId = t.DicomStudy.Id,
|
DicomStudyId = t.DicomStudy.Id,
|
||||||
|
|
||||||
PatientId = t.DicomStudy.PatientId,
|
PatientId = info.TrialCode + "-" + t.DicomStudy.PatientId,
|
||||||
PatientName = t.DicomStudy.PatientName,
|
PatientName = t.DicomStudy.PatientName,
|
||||||
PatientBirthDate = t.DicomStudy.PatientBirthDate,
|
PatientBirthDate = t.DicomStudy.PatientBirthDate,
|
||||||
PatientSex = t.DicomStudy.PatientSex,
|
PatientSex = t.DicomStudy.PatientSex,
|
||||||
|
|
@ -1579,7 +1582,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
DicomStudyId = t.TaskStudy.Id,
|
DicomStudyId = t.TaskStudy.Id,
|
||||||
|
|
||||||
PatientId = t.TaskStudy.PatientId,
|
PatientId = info.TrialCode + "-" + t.TaskStudy.PatientId,
|
||||||
PatientName = t.TaskStudy.PatientName,
|
PatientName = t.TaskStudy.PatientName,
|
||||||
PatientBirthDate = t.TaskStudy.PatientBirthDate,
|
PatientBirthDate = t.TaskStudy.PatientBirthDate,
|
||||||
PatientSex = t.TaskStudy.PatientSex,
|
PatientSex = t.TaskStudy.PatientSex,
|
||||||
|
|
@ -1642,7 +1645,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id)))
|
var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id) && t.CheckState == CheckStateEnum.CVPassed))
|
||||||
//一致性分析,导致查询出来两条数据
|
//一致性分析,导致查询出来两条数据
|
||||||
join visitTask in _visitTaskRepository.Where(t => taskIdList.Contains(t.Id)) on sv.Id equals visitTask.SourceSubjectVisitId into cc
|
join visitTask in _visitTaskRepository.Where(t => taskIdList.Contains(t.Id)) on sv.Id equals visitTask.SourceSubjectVisitId into cc
|
||||||
from leftVisitTask in cc.DefaultIfEmpty()
|
from leftVisitTask in cc.DefaultIfEmpty()
|
||||||
|
|
@ -2248,7 +2251,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
#region 在下载前先处理DIR文件
|
#region 在下载前先处理DIR文件
|
||||||
|
|
||||||
//有传输语法值的导出 才生成DIR
|
//有传输语法值的导出 才生成DIR
|
||||||
|
|
@ -2263,7 +2265,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
DicomStudyId = t.DicomStudy.Id,
|
DicomStudyId = t.DicomStudy.Id,
|
||||||
|
|
||||||
PatientId = t.DicomStudy.PatientId,
|
PatientId = t.Trial.TrialCode + "-" + t.DicomStudy.PatientId,
|
||||||
PatientName = t.DicomStudy.PatientName,
|
PatientName = t.DicomStudy.PatientName,
|
||||||
PatientBirthDate = t.DicomStudy.PatientBirthDate,
|
PatientBirthDate = t.DicomStudy.PatientBirthDate,
|
||||||
PatientSex = t.DicomStudy.PatientSex,
|
PatientSex = t.DicomStudy.PatientSex,
|
||||||
|
|
@ -2406,16 +2408,16 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
SubjectCode = t.Code,
|
SubjectCode = t.Code,
|
||||||
IsUrgent = t.IsUrgent,
|
IsUrgent = t.IsUrgent,
|
||||||
|
|
||||||
VisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).Count(),
|
VisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.CheckState == CheckStateEnum.CVPassed).Count(),
|
||||||
|
|
||||||
MarkIVUSVisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).Count(t => t.NoneDicomStudyList.Where(t => t.Modality == "IVUS").SelectMany(c => c.ImageLabelNoneDicomFileList).Any()),
|
MarkIVUSVisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.CheckState == CheckStateEnum.CVPassed).Count(t => t.NoneDicomStudyList.Where(t => t.Modality == "IVUS").SelectMany(c => c.ImageLabelNoneDicomFileList).Any()),
|
||||||
|
|
||||||
MarkOCTVisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).Count(t => t.NoneDicomStudyList.Where(t => t.Modality == "OCT").SelectMany(c => c.ImageLabelNoneDicomFileList).Any()),
|
MarkOCTVisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.CheckState == CheckStateEnum.CVPassed).Count(t => t.NoneDicomStudyList.Where(t => t.Modality == "OCT").SelectMany(c => c.ImageLabelNoneDicomFileList).Any()),
|
||||||
|
|
||||||
DicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.StudyList).Count(),
|
DicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.CheckState == CheckStateEnum.CVPassed).SelectMany(t => t.StudyList).Count(),
|
||||||
//MarkDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.TaskStudyList).Count(),
|
//MarkDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.TaskStudyList).Count(),
|
||||||
|
|
||||||
NoneDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.NoneDicomStudyList).Count(),
|
NoneDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.CheckState == CheckStateEnum.CVPassed).SelectMany(t => t.NoneDicomStudyList).Count(),
|
||||||
//MarkNoneDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.NoneDicomStudyList).Where(t => t.ImageLabelNoneDicomFileList.Any()).Count(),
|
//MarkNoneDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.NoneDicomStudyList).Where(t => t.ImageLabelNoneDicomFileList.Any()).Count(),
|
||||||
}).ToPagedListAsync(inQuery);
|
}).ToPagedListAsync(inQuery);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -91,17 +91,48 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||||
public Guid? TrialSiteId { get; set; }
|
public Guid? TrialSiteId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class FirstPdInfo
|
||||||
|
{
|
||||||
|
public string SubjectCode { get; set; }
|
||||||
|
|
||||||
|
public DateTime? EarliestScanDate { get; set; }
|
||||||
|
|
||||||
|
public DateTime? BaseLineLatestScanDate { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
// 新增属性:天数差
|
||||||
|
public double? DaysDiff
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (BaseLineLatestScanDate.HasValue && EarliestScanDate.HasValue)
|
||||||
|
{
|
||||||
|
return (EarliestScanDate.Value - BaseLineLatestScanDate.Value).TotalDays;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class EfficacyEvaluationStatViewModel
|
public class EfficacyEvaluationStatViewModel
|
||||||
{
|
{
|
||||||
public string? DictionaryCode { get; set; }
|
public string? DictionaryCode { get; set; }
|
||||||
|
|
||||||
|
public string Code { get; set; }
|
||||||
public string OverallTumorEvaluation { get; set; }
|
public string OverallTumorEvaluation { get; set; }
|
||||||
|
|
||||||
public int SubjectCount { get; set; }
|
public int SubjectCount => SubjectCodeList.Count();
|
||||||
|
|
||||||
|
public List<string> SubjectCodeList { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EfficacyEvaluationExport
|
public class EfficacyEvaluationExport
|
||||||
{
|
{
|
||||||
|
|
||||||
|
public DateTime? EarliestScanDate { get; set; }
|
||||||
|
|
||||||
|
public DateTime? LatestScanDate { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -113,18 +113,18 @@ public class TrialStatService(
|
||||||
/// <param name="inQuery"></param>
|
/// <param name="inQuery"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<List<EfficacyEvaluationStatViewModel>> GetTrialEfficacyEvaluationStatList(EfficacyEvaluationQuery inQuery)
|
public async Task<IResponseOutput<List<EfficacyEvaluationStatViewModel>>> GetTrialEfficacyEvaluationStatList(EfficacyEvaluationQuery inQuery)
|
||||||
{
|
{
|
||||||
|
|
||||||
var trialReadingCriterionId = inQuery.TrialReadingCriterionId;
|
var trialReadingCriterionId = inQuery.TrialReadingCriterionId;
|
||||||
|
|
||||||
//每次查询必须是单标准的
|
//每次查询必须是单标准的
|
||||||
var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionGroup, t.IsGlobalReading, t.IsArbitrationReading, t.IsOncologyReading, t.CriterionName, t.ArbitrationRule,t.TrialId }).FirstNotNullAsync();
|
var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionGroup, t.IsGlobalReading, t.IsArbitrationReading, t.IsOncologyReading, t.CriterionName, t.ArbitrationRule, t.TrialId }).FirstNotNullAsync();
|
||||||
|
|
||||||
|
|
||||||
if (criterion.CriterionGroup == CriterionGroup.Nontumorous)
|
if (criterion.CriterionGroup == CriterionGroup.Nontumorous)
|
||||||
{
|
{
|
||||||
return new List<EfficacyEvaluationStatViewModel>();
|
return ResponseOutput.Ok(new List<EfficacyEvaluationStatViewModel>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -132,15 +132,18 @@ public class TrialStatService(
|
||||||
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB
|
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB
|
||||||
|| criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC)
|
|| criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC)
|
||||||
{
|
{
|
||||||
|
|
||||||
questionType = QuestionType.Tumor;
|
questionType = QuestionType.Tumor;
|
||||||
|
//iresist pfs 是icpd
|
||||||
}
|
}
|
||||||
else if (criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET)
|
else if (criterion.CriterionType == CriterionType.Lugano2014)
|
||||||
{
|
{
|
||||||
|
|
||||||
questionType = QuestionType.ImgOncology;
|
questionType = QuestionType.ImgOncology;
|
||||||
}
|
}
|
||||||
|
else if (criterion.CriterionType == CriterionType.Lugano2014WithoutPET)
|
||||||
|
{
|
||||||
|
questionType = QuestionType.CTandMRI;
|
||||||
|
}
|
||||||
else if (criterion.CriterionType == CriterionType.PCWG3)
|
else if (criterion.CriterionType == CriterionType.PCWG3)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -164,6 +167,8 @@ public class TrialStatService(
|
||||||
ReadingCategory = t.ReadingCategory,
|
ReadingCategory = t.ReadingCategory,
|
||||||
ArmEnum = t.ArmEnum,
|
ArmEnum = t.ArmEnum,
|
||||||
JudgeArmEnum = t.JudgeResultTask.ArmEnum,
|
JudgeArmEnum = t.JudgeResultTask.ArmEnum,
|
||||||
|
LatestScanDate = t.SourceSubjectVisit.LatestScanDate,
|
||||||
|
EarliestScanDate = t.SourceSubjectVisit.EarliestScanDate,
|
||||||
|
|
||||||
IsTrigerJudge = criterion.ArbitrationRule == ArbitrationRule.Visit ? t.JudgeVisitTaskId != null :
|
IsTrigerJudge = criterion.ArbitrationRule == ArbitrationRule.Visit ? t.JudgeVisitTaskId != null :
|
||||||
(criterion.ArbitrationRule == ArbitrationRule.Reading ?
|
(criterion.ArbitrationRule == ArbitrationRule.Reading ?
|
||||||
|
|
@ -176,7 +181,7 @@ public class TrialStatService(
|
||||||
|
|
||||||
DictionaryCode = t.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == questionType).Select(t => t.ReadingQuestionTrial.DictionaryCode).FirstOrDefault(),
|
DictionaryCode = t.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == questionType).Select(t => t.ReadingQuestionTrial.DictionaryCode).FirstOrDefault(),
|
||||||
//整体肿瘤评估答案
|
//整体肿瘤评估答案
|
||||||
OverallTumorEvaluation = t.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == questionType).FirstOrDefault()!.Answer
|
OverallTumorEvaluation = t.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == questionType).Select(t => t.IsGlobalChange ? t.GlobalChangeAnswer : t.Answer).FirstOrDefault()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -201,6 +206,24 @@ public class TrialStatService(
|
||||||
//处理裁判标记
|
//处理裁判标记
|
||||||
list = DealJudgeMark(criterion.ArbitrationRule, criterion.IsGlobalReading, list);
|
list = DealJudgeMark(criterion.ArbitrationRule, criterion.IsGlobalReading, list);
|
||||||
|
|
||||||
|
//基线(最晚拍片日期)-首次PD(所有触发PD的病灶的检查的最早拍片日期)的中位数,单位是天
|
||||||
|
|
||||||
|
// 构建字典:SubjectCode -> LatestScanDate
|
||||||
|
var baseLineDict = list.Where(t => t.VisitTaskNum == 0).GroupBy(t => t.SubjectCode)
|
||||||
|
.ToDictionary(
|
||||||
|
g => g.Key,
|
||||||
|
g => g.First().LatestScanDate // 如果同一个 SubjectCode 有多条记录,只取第一条
|
||||||
|
);
|
||||||
|
|
||||||
|
//一定要两个人做完了,产生了裁判并且有结果的,否则就不算,并且排除基线
|
||||||
|
list = list.Where(t => t.IsJudgeSelect == true && t.VisitTaskNum != 0 && t.ReadingCategory==ReadingCategory.Visit)//全局的答案已经放在对应访视上了
|
||||||
|
.GroupBy(t => t.SubjectCode).Select(g => g.OrderByDescending(t => t.VisitTaskNum).First()).ToList();
|
||||||
|
|
||||||
|
|
||||||
|
//总subject 数量
|
||||||
|
var totalSubjectCount = list.Select(t => t.SubjectId).Distinct().Count();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//判断subject的逻辑需要确认,这么多次访视任务,有的符合,有的不符合,准则是什么?
|
//判断subject的逻辑需要确认,这么多次访视任务,有的符合,有的不符合,准则是什么?
|
||||||
|
|
@ -208,30 +231,69 @@ public class TrialStatService(
|
||||||
{
|
{
|
||||||
DictionaryCode = g.FirstOrDefault()?.DictionaryCode,
|
DictionaryCode = g.FirstOrDefault()?.DictionaryCode,
|
||||||
OverallTumorEvaluation = g.Key,
|
OverallTumorEvaluation = g.Key,
|
||||||
SubjectCount = g.Select(t => t.SubjectId).Distinct().Count()
|
Code = g.Key,
|
||||||
|
SubjectCodeList = g.Select(t => t.SubjectCode).Distinct().ToList()
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
|
|
||||||
// 先把 resultList 转成内存字典
|
// 先把 resultList 转成内存字典
|
||||||
var resultDict = resultList.ToDictionary(r => r.OverallTumorEvaluation, r => r.SubjectCount);
|
var resultDict = resultList.ToDictionary(r => r.OverallTumorEvaluation, r => r.SubjectCodeList);
|
||||||
|
|
||||||
// 查询字典表,先把数据拉出来到内存,再合并
|
// 查询字典表,先把数据拉出来到内存,再合并
|
||||||
var dicList = _dictionaryRepository
|
var translateList = _dictionaryRepository
|
||||||
.Where(t => t.Parent.Code == dicName)
|
.Where(t => t.Parent.Code == dicName)
|
||||||
.Select(t => new
|
.Select(t => new
|
||||||
{
|
{
|
||||||
t.Code
|
t.Code,
|
||||||
|
t.Value,
|
||||||
})
|
})
|
||||||
.ToList()
|
.ToList()
|
||||||
.Select(t => new EfficacyEvaluationStatViewModel
|
.Select(t => new EfficacyEvaluationStatViewModel
|
||||||
{
|
{
|
||||||
DictionaryCode = dicName,
|
DictionaryCode = dicName,
|
||||||
OverallTumorEvaluation = t.Code,
|
Code = t.Code, //方便找到首次PD的日期
|
||||||
SubjectCount = resultDict.ContainsKey(t.Code) ? resultDict[t.Code] : 0
|
OverallTumorEvaluation = t.Value,//翻译后的值
|
||||||
|
SubjectCodeList = resultDict.ContainsKey(t.Code) ? resultDict[t.Code] : new List<string>()
|
||||||
})
|
})
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
return dicList;
|
// (cr +pr) /总人数
|
||||||
|
|
||||||
|
var crAddPr = translateList.Where(t => t.OverallTumorEvaluation == "PR" || t.OverallTumorEvaluation == "CR").Sum(t => t.SubjectCount);
|
||||||
|
|
||||||
|
var orrPercent = totalSubjectCount > 0
|
||||||
|
? ((decimal)crAddPr / totalSubjectCount * 100).ToString("0.00") + "%"
|
||||||
|
: "0.00%";
|
||||||
|
|
||||||
|
var pdInfo = translateList
|
||||||
|
.WhereIf(criterion.CriterionType == CriterionType.IRECIST1Point1, t => t.OverallTumorEvaluation == "ICPD")
|
||||||
|
.WhereIf(criterion.CriterionType == CriterionType.IRECIST1Point1, t => t.OverallTumorEvaluation == "PD")
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
var firstPdList = new List<FirstPdInfo>();
|
||||||
|
if (pdInfo != null)
|
||||||
|
{
|
||||||
|
firstPdList = list.Where(t => t.OverallTumorEvaluation == pdInfo.Code).GroupBy(t => t.SubjectCode)
|
||||||
|
.Select(g => new FirstPdInfo
|
||||||
|
{
|
||||||
|
SubjectCode = g.Key,
|
||||||
|
EarliestScanDate = g.Where(t => t.OverallTumorEvaluation == pdInfo.Code).OrderBy(t => t.VisitTaskNum).First().EarliestScanDate
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var item in firstPdList)
|
||||||
|
{
|
||||||
|
if (baseLineDict.TryGetValue(item.SubjectCode, out var latestScanDate))
|
||||||
|
{
|
||||||
|
item.BaseLineLatestScanDate = latestScanDate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(translateList, new { PDList = firstPdList, ORR = orrPercent });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,10 @@ public class DicomInstance : BaseFullDeleteAuditEntity, IEntitySeqId
|
||||||
[ForeignKey("StudyId")]
|
[ForeignKey("StudyId")]
|
||||||
public DicomStudy DicomStudy { get; set; }
|
public DicomStudy DicomStudy { get; set; }
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
[ForeignKey("TrialId")]
|
||||||
|
public Trial Trial { get; set; }
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public List<ReadingTableAnswerRowInfo> ReadingTableAnswerRowInfoList { get; set; }
|
public List<ReadingTableAnswerRowInfo> ReadingTableAnswerRowInfoList { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ public class DicomStudy : BaseFullDeleteAuditEntity, IEntitySeqId
|
||||||
[ForeignKey("SubjectVisitId")]
|
[ForeignKey("SubjectVisitId")]
|
||||||
public SubjectVisit SubjectVisit { get; set; }
|
public SubjectVisit SubjectVisit { get; set; }
|
||||||
|
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public List<ReadingClinicalData> ReadingClinicalDataList { get; set; }
|
public List<ReadingClinicalData> ReadingClinicalDataList { get; set; }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue