影像筛选逻辑增加
continuous-integration/drone/push Build is passing Details

IRC_NewDev
hang 2024-06-12 17:10:22 +08:00
parent 4b8b02fa55
commit c2350f1418
12 changed files with 300 additions and 309 deletions

View File

@ -117,7 +117,7 @@ namespace IRaCIS.Core.Application.Service
var pageList = await visitTaskQueryable.ToPagedListAsync(queryVisitTask.PageIndex, queryVisitTask.PageSize, queryVisitTask.SortField, queryVisitTask.Asc, string.IsNullOrWhiteSpace(queryVisitTask.SortField), defalutSortArray); var pageList = await visitTaskQueryable.ToPagedListAsync(queryVisitTask.PageIndex, queryVisitTask.PageSize, queryVisitTask.SortField, queryVisitTask.Asc, string.IsNullOrWhiteSpace(queryVisitTask.SortField), defalutSortArray);
var trialTaskConfig = _repository.Where<Trial>(t => t.Id == queryVisitTask.TrialId).Select(t => new { IsHaveDoubleReadCriterion=t.ReadingQuestionCriterionTrialList.Any(t=>t.IsSigned && t.IsConfirm && t.ReadingType==ReadingMethod.Double), t.VitrualSiteCode }).FirstOrDefault(); var trialTaskConfig = _repository.Where<Trial>(t => t.Id == queryVisitTask.TrialId).Select(t => new { IsHaveDoubleReadCriterion=t.TrialReadingCriterionList.Any(t=>t.IsSigned && t.IsConfirm && t.ReadingType==ReadingMethod.Double), t.VitrualSiteCode }).FirstOrDefault();
return ResponseOutput.Ok(pageList, trialTaskConfig); return ResponseOutput.Ok(pageList, trialTaskConfig);
} }

View File

@ -1152,7 +1152,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
else else
{ {
if (subjectId!=null && _visitTaskRepository.Any(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom)) if (subjectId != null)
{ {
//找到 非一致性分析,未签名,状态正常的 并且任务名称是TimePoint的 任务 //找到 非一致性分析,未签名,状态正常的 并且任务名称是TimePoint的 任务
var needDealTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.Id var needDealTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.Id

View File

@ -74,7 +74,7 @@ namespace IRaCIS.Core.Application.Service
CreateMap<TaskAllocationRule, TaskAllocationRuleDTO>() CreateMap<TaskAllocationRule, TaskAllocationRuleDTO>()
.ForMember(o => o.DoctorUser, t => t.MapFrom(u => u.Enroll.DoctorUser)) .ForMember(o => o.DoctorUser, t => t.MapFrom(u => u.Enroll.DoctorUser))
.ForMember(o => o.CriterionReadingCategoryList, t => t.MapFrom(u => u.Enroll.EnrollReadingCategoryList.Select(t => new TrialCriterionReadingCategory() { EnrollId = t.EnrollId, ReadingCategory = t.ReadingCategory, TrialReadingCriterionId = t.TrialReadingCriterionId }))) .ForMember(o => o.CriterionReadingCategoryList, t => t.MapFrom(u => u.Enroll.EnrollReadingCategoryList.Select(t => new TrialCriterionReadingCategory() { EnrollId = t.EnrollId, ReadingCategory = t.ReadingCategory, TrialReadingCriterionId = t.TrialReadingCriterionId })))
.ForMember(o => o.TrialReadingCriterionList, t => t.MapFrom(u => u.Trial.ReadingQuestionCriterionTrialList.Where(t => t.IsConfirm))) .ForMember(o => o.TrialReadingCriterionList, t => t.MapFrom(u => u.Trial.TrialReadingCriterionList.Where(t => t.IsConfirm)))
.ForMember(o => o.ReadingCategoryList, t => t.MapFrom(u => u.Enroll.EnrollReadingCategoryList.Where(t=>t.TrialReadingCriterionId== trialReadingCriterionId).OrderBy(t => t.ReadingCategory).Select(t => t.ReadingCategory).ToList())) .ForMember(o => o.ReadingCategoryList, t => t.MapFrom(u => u.Enroll.EnrollReadingCategoryList.Where(t=>t.TrialReadingCriterionId== trialReadingCriterionId).OrderBy(t => t.ReadingCategory).Select(t => t.ReadingCategory).ToList()))
; ;

View File

@ -68,6 +68,10 @@ namespace IRaCIS.Core.Application.Contracts.Dicom.DTO
public int ShowOrder { get; set; } public int ShowOrder { get; set; }
[JsonIgnore] [JsonIgnore]
public decimal RowIndex { get; set; } public decimal RowIndex { get; set; }
[JsonIgnore]
public string WindowCenter { get; set; }
[JsonIgnore]
public string WindowWidth { get; set; }
} }
public class DicomSeriesWithLabelDTO : DicomSeriesDTO public class DicomSeriesWithLabelDTO : DicomSeriesDTO

View File

@ -28,11 +28,11 @@ namespace IRaCIS.Core.Application.Image.QA
private readonly IRepository<QCChallenge> _qcChallengeRepository; private readonly IRepository<QCChallenge> _qcChallengeRepository;
private readonly IRepository<DicomStudy> _dicomStudyRepository; private readonly IRepository<DicomStudy> _dicomStudyRepository;
private readonly IRepository<DicomSeries> _dicomSeriesrepository; private readonly IRepository<DicomSeries> _dicomSeriesrepository;
private readonly IReadingClinicalDataService _readingClinicalDataService; private readonly IReadingClinicalDataService _readingClinicalDataService;
private readonly IRepository<Subject> _subjectRepository; private readonly IRepository<Subject> _subjectRepository;
private readonly IRepository<ReadingClinicalData> _readingClinicalDataRepository; private readonly IRepository<ReadingClinicalData> _readingClinicalDataRepository;
private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository; private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository;
private readonly IRepository<QCChallengeDialog> _qCChallengeDialogrepository; private readonly IRepository<QCChallengeDialog> _qCChallengeDialogrepository;
private readonly IRepository<CheckChallengeDialog> _checkChallengeDialogrepository; private readonly IRepository<CheckChallengeDialog> _checkChallengeDialogrepository;
private readonly IRepository<Trial> _trialRepository; private readonly IRepository<Trial> _trialRepository;
private readonly IRepository<VisitTask> _visitTaskRepository; private readonly IRepository<VisitTask> _visitTaskRepository;
@ -45,11 +45,11 @@ namespace IRaCIS.Core.Application.Image.QA
IRepository<VisitTask> visitTaskRepository, IRepository<VisitTask> visitTaskRepository,
IRepository<DicomStudy> dicomStudyRepository, IRepository<DicomStudy> dicomStudyRepository,
IRepository<DicomSeries> dicomSeriesrepository, IRepository<DicomSeries> dicomSeriesrepository,
IReadingClinicalDataService readingClinicalDataService, IReadingClinicalDataService readingClinicalDataService,
IRepository<Subject> subjectRepository, IRepository<Subject> subjectRepository,
IRepository<ReadingClinicalData> readingClinicalDataRepository, IRepository<ReadingClinicalData> readingClinicalDataRepository,
IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository, IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository,
IRepository<QCChallengeDialog> qCChallengeDialogrepository, IRepository<QCChallengeDialog> qCChallengeDialogrepository,
IRepository<CheckChallengeDialog> checkChallengeDialogrepository, IRepository<CheckChallengeDialog> checkChallengeDialogrepository,
IVisitTaskHelpeService visitTaskHelpeService, IVisitTaskHelpeService visitTaskHelpeService,
IDistributedLockProvider distributedLockProvider IDistributedLockProvider distributedLockProvider
@ -59,11 +59,11 @@ namespace IRaCIS.Core.Application.Image.QA
_qcChallengeRepository = qcChallengeRepository; _qcChallengeRepository = qcChallengeRepository;
_dicomStudyRepository = dicomStudyRepository; _dicomStudyRepository = dicomStudyRepository;
this._dicomSeriesrepository = dicomSeriesrepository; this._dicomSeriesrepository = dicomSeriesrepository;
this._readingClinicalDataService = readingClinicalDataService; this._readingClinicalDataService = readingClinicalDataService;
this._subjectRepository = subjectRepository; this._subjectRepository = subjectRepository;
this._readingClinicalDataRepository = readingClinicalDataRepository; this._readingClinicalDataRepository = readingClinicalDataRepository;
this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository;
this._qCChallengeDialogrepository = qCChallengeDialogrepository; this._qCChallengeDialogrepository = qCChallengeDialogrepository;
this._checkChallengeDialogrepository = checkChallengeDialogrepository; this._checkChallengeDialogrepository = checkChallengeDialogrepository;
_trialRepository = trialRepository; _trialRepository = trialRepository;
this._visitTaskRepository = visitTaskRepository; this._visitTaskRepository = visitTaskRepository;
@ -932,23 +932,24 @@ namespace IRaCIS.Core.Application.Image.QA
break; break;
case TrialQCProcess.SingleAudit: case TrialQCProcess.SingleAudit:
visitList = await _subjectVisitRepository.Where(x => x.SubmitState == SubmitStateEnum.Submitted visitList = await _subjectVisitRepository.Where(x => x.SubmitState == SubmitStateEnum.Submitted
&& x.TrialId == inDto.TrialId && x.PreliminaryAuditUserId!= _userInfo.Id&&(x.CurrentActionUserId == _userInfo.Id || (x.AuditState != AuditStateEnum.PrimaryQCPassed && !x.IsTake))) && x.TrialId == inDto.TrialId && x.PreliminaryAuditUserId != _userInfo.Id && (x.CurrentActionUserId == _userInfo.Id || (x.AuditState != AuditStateEnum.PrimaryQCPassed && !x.IsTake)))
.Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y=>!y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.Id) .Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.Id)
.Include(x => x.Subject).ToListAsync(); .Include(x => x.Subject).ToListAsync();
subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId) subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId)
.OrderBy(x=>x.VisitNum).FirstOrDefault(); .OrderBy(x => x.VisitNum).FirstOrDefault();
if(subjectVisit!=null) if (subjectVisit != null)
{ {
return new GetNextIQCQualityOutDto() { return new GetNextIQCQualityOutDto()
SubjectId= subjectVisit.SubjectId, {
VisitId= subjectVisit.Id SubjectId = subjectVisit.SubjectId,
VisitId = subjectVisit.Id
}; };
} }
subjectVisit= visitList.OrderBy(x => x.Subject.Code).ThenBy(x=>x.VisitNum).FirstOrDefault(); subjectVisit = visitList.OrderBy(x => x.Subject.Code).ThenBy(x => x.VisitNum).FirstOrDefault();
if (subjectVisit != null) if (subjectVisit != null)
{ {
return new GetNextIQCQualityOutDto() return new GetNextIQCQualityOutDto()
@ -965,10 +966,10 @@ namespace IRaCIS.Core.Application.Image.QA
case TrialQCProcess.DoubleAudit: case TrialQCProcess.DoubleAudit:
visitList = await _subjectVisitRepository.Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.TrialId == inDto.TrialId && visitList = await _subjectVisitRepository.Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.TrialId == inDto.TrialId &&
((x.CurrentActionUserId == _userInfo.Id)||(!x.IsTake&& x.AuditState != AuditStateEnum.QCPassed&& (x.PreliminaryAuditUserId != _userInfo.Id))) ((x.CurrentActionUserId == _userInfo.Id) || (!x.IsTake && x.AuditState != AuditStateEnum.QCPassed && (x.PreliminaryAuditUserId != _userInfo.Id)))
) )
.Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId !=_userInfo.Id) .Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.Id)
.Include(x => x.Subject).ToListAsync(); .Include(x => x.Subject).ToListAsync();
if (subjectVisit != null) if (subjectVisit != null)
{ {
return new GetNextIQCQualityOutDto() return new GetNextIQCQualityOutDto()
@ -1027,14 +1028,14 @@ namespace IRaCIS.Core.Application.Image.QA
{ {
//throw new BusinessValidationFailedException("当前访视已被领取,不允许领取"); //throw new BusinessValidationFailedException("当前访视已被领取,不允许领取");
//---当前访视的影像质控任务已被其他QC领取不允许领取 //---当前访视的影像质控任务已被其他QC领取不允许领取
return ResponseOutput.NotOk(_localizer["QCOperation_QCTaskNoAccess"], ApiResponseCodeEnum.NeedTips); return ResponseOutput.NotOk(_localizer["QCOperation_QCTaskNoAccess"], ApiResponseCodeEnum.NeedTips);
} }
if (await _subjectVisitRepository.AnyAsync(t => t.Trial.QCQuestionConfirmedUserId == null && t.Id == subjectVisitId)) if (await _subjectVisitRepository.AnyAsync(t => t.Trial.QCQuestionConfirmedUserId == null && t.Id == subjectVisitId))
{ {
//---请先配置影像质控审核问题,再领取影像质控任务 //---请先配置影像质控审核问题,再领取影像质控任务
return ResponseOutput.NotOk(_localizer["QCOperation_QCConfigFirst"], ApiResponseCodeEnum.NeedTips); return ResponseOutput.NotOk(_localizer["QCOperation_QCConfigFirst"], ApiResponseCodeEnum.NeedTips);
} }
@ -1053,14 +1054,14 @@ namespace IRaCIS.Core.Application.Image.QA
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit) if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
{ {
//---项目配置为不审没有领取QC Task //---项目配置为不审没有领取QC Task
return ResponseOutput.NotOk(_localizer["QCOperation_NoQC"]); return ResponseOutput.NotOk(_localizer["QCOperation_NoQC"]);
} }
else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit) else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit)
{ {
if (dbSubjectVisit.PreliminaryAuditUserId == _userInfo.Id) if (dbSubjectVisit.PreliminaryAuditUserId == _userInfo.Id)
{ {
//---初审已通过,不能继续领取 //---初审已通过,不能继续领取
return ResponseOutput.NotOk(_localizer["QCOperation_InitialAuditPassed"]); return ResponseOutput.NotOk(_localizer["QCOperation_InitialAuditPassed"]);
} }
@ -1074,15 +1075,15 @@ namespace IRaCIS.Core.Application.Image.QA
} }
else else
{ {
// ---项目配置为单审,不满足Submmit State已提交 或者 Audit State待审核/审核中, 不允许领取,请刷新界面 // ---项目配置为单审,不满足Submmit State已提交 或者 Audit State待审核/审核中, 不允许领取,请刷新界面
return ResponseOutput.NotOk(_localizer["QCOperation_NoSingleAudit"]); return ResponseOutput.NotOk(_localizer["QCOperation_NoSingleAudit"]);
} }
} }
else if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit) else if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit)
{ {
if (dbSubjectVisit.PreliminaryAuditUserId == _userInfo.Id) if (dbSubjectVisit.PreliminaryAuditUserId == _userInfo.Id)
{ {
//---复审不能和初审是同一个人 //---复审不能和初审是同一个人
return ResponseOutput.NotOk(_localizer["QCOperation_NoSameReviewer"]); return ResponseOutput.NotOk(_localizer["QCOperation_NoSameReviewer"]);
} }
@ -1102,7 +1103,7 @@ namespace IRaCIS.Core.Application.Image.QA
} }
else else
{ {
//---项目配置为复审,不满足提交状态:已提交 或者 审核状态:待审核/QC中, 不允许领取,请刷新界面 //---项目配置为复审,不满足提交状态:已提交 或者 审核状态:待审核/QC中, 不允许领取,请刷新界面
return ResponseOutput.NotOk(_localizer["QCOperation_NoSecondaryAudit"]); return ResponseOutput.NotOk(_localizer["QCOperation_NoSecondaryAudit"]);
} }
} }
@ -1123,14 +1124,14 @@ namespace IRaCIS.Core.Application.Image.QA
{ {
if (dbSubjectVisit!.CurrentActionUserId != _userInfo.Id) if (dbSubjectVisit!.CurrentActionUserId != _userInfo.Id)
{ {
//---您不是该质控任务当前领取人,没有操作权限! //---您不是该质控任务当前领取人,没有操作权限!
return ResponseOutput.NotOk(_localizer["QCOperation_NoRecipient"], ApiResponseCodeEnum.NeedTips); return ResponseOutput.NotOk(_localizer["QCOperation_NoRecipient"], ApiResponseCodeEnum.NeedTips);
} }
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit) if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
{ {
//---项目配置影像质控为不审,不需要取消任务功能 //---项目配置影像质控为不审,不需要取消任务功能
return ResponseOutput.NotOk(_localizer["QCOperation_NoQCFunction"]); return ResponseOutput.NotOk(_localizer["QCOperation_NoQCFunction"]);
} }
else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit) else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit)
@ -1143,7 +1144,7 @@ namespace IRaCIS.Core.Application.Image.QA
else else
{ {
//---当前访视影像质控任务没有当前领取人,不能释放。 //---当前访视影像质控任务没有当前领取人,不能释放。
return ResponseOutput.NotOk(_localizer["QCOperation_NoTaskOwner"]); return ResponseOutput.NotOk(_localizer["QCOperation_NoTaskOwner"]);
} }
} }
@ -1163,7 +1164,7 @@ namespace IRaCIS.Core.Application.Image.QA
else else
{ {
//---当前访视影像质控任务没有当前领取人,不能释放。 //---当前访视影像质控任务没有当前领取人,不能释放。
return ResponseOutput.NotOk(_localizer["QCOperation_NoTaskOwner"]); return ResponseOutput.NotOk(_localizer["QCOperation_NoTaskOwner"]);
} }
} }
@ -1214,7 +1215,7 @@ namespace IRaCIS.Core.Application.Image.QA
} }
//同时要根据项目有没有配置Subject 级别临床数据 //同时要根据项目有没有配置Subject 级别临床数据
if (dbSubjectVisitList.Any(t => t.IsBaseLine && !t.IsHaveClinicalData)&&trialinfo.ClinicalInformationTransmissionEnum!=0) if (dbSubjectVisitList.Any(t => t.IsBaseLine && !t.IsHaveClinicalData) && trialinfo.ClinicalInformationTransmissionEnum != 0)
{ {
//---基线没有临床数据,确认提交? //---基线没有临床数据,确认提交?
@ -1235,36 +1236,36 @@ namespace IRaCIS.Core.Application.Image.QA
//[Authorize(Policy = IRaCISPolicy.CRC)] //[Authorize(Policy = IRaCISPolicy.CRC)]
public async Task<IResponseOutput> CRCRequestToQC(CRCRequestToQCCommand cRCRequestToQCCommand) public async Task<IResponseOutput> CRCRequestToQC(CRCRequestToQCCommand cRCRequestToQCCommand)
{ {
List<string> modalitieTypess = new List<string>() { "PT、CT", "CT、PT", "PET-CT" }; List<string> modalitieTypess = new List<string>() { "PT、CT", "CT、PT", "PET-CT" };
// 验证临床数据 是否有Pet类型 // 验证临床数据 是否有Pet类型
#region 验证临床数据 是否有Pet类型 #region 验证临床数据 是否有Pet类型
if (await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == cRCRequestToQCCommand.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Study)) if (await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == cRCRequestToQCCommand.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Study))
{ {
foreach (var item in cRCRequestToQCCommand.SubjectVisitIds) foreach (var item in cRCRequestToQCCommand.SubjectVisitIds)
{ {
if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities))) if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities)))
{ {
var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync(); var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync();
var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto() var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto()
{ {
SubjectVisitId = item, SubjectVisitId = item,
}); });
if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0)) if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0))
{ {
throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]); throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]);
} }
} }
} }
} }
#endregion #endregion
var trialId = cRCRequestToQCCommand.TrialId; var trialId = cRCRequestToQCCommand.TrialId;
var trialConfig = (await _trialRepository var trialConfig = (await _trialRepository
.Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification, t.IsUrgent, t.IsHaveFirstGiveMedicineDate, t.ClinicalInformationTransmissionEnum }) .Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification, t.IsUrgent, t.IsHaveFirstGiveMedicineDate, t.ClinicalInformationTransmissionEnum })
@ -1311,82 +1312,36 @@ namespace IRaCIS.Core.Application.Image.QA
//基线不验证 //基线不验证
if (trialConfig.IsHaveFirstGiveMedicineDate && !dbSubjectVisit.IsBaseLine && dbSubjectVisit.Subject.FirstGiveMedicineTime == null) if (trialConfig.IsHaveFirstGiveMedicineDate && !dbSubjectVisit.IsBaseLine && dbSubjectVisit.Subject.FirstGiveMedicineTime == null)
{ {
//---项目配置了需要填写访视基准日期。但是受试者没有填写访视基准日期,不允许提交 //---项目配置了需要填写访视基准日期。但是受试者没有填写访视基准日期,不允许提交
return ResponseOutput.NotOk(_localizer["QCOperation_MissingBaselineDate"]); return ResponseOutput.NotOk(_localizer["QCOperation_MissingBaselineDate"]);
} }
//基线 且配置了临床数据 if (_subjectVisitRepository.Where(t => t.Id == dbSubjectVisit.Id).Any(t => (t.StudyList.Count(t => t.ModalityForEdit == "") > 0 ||t.NoneDicomStudyList.Count(t => t.Modality == "")>0) && t.Trial.TrialReadingCriterionList.Count(t => t.IsImageFilter == true) > 0))
//if (trialConfig.ClinicalInformationTransmissionEnum != 0 /*&& dbSubjectVisit.IsBaseLine*//*&&dbSubjectVisit.ClinicalDataSignUserId==null*/) {
//{ //有标准配置了影像筛选,该受试者有检查未设置检查类型,不允许提交
return ResponseOutput.NotOk(_localizer["QCOperation_MissingModality"]);
}
////找到需要确认的PDF 临床数据 如果没有CRC 没有上传 那么就添加一条没有文件的记录 //已确认临床数据完整性
dbSubjectVisit.IsConfirmedClinicalData = true;
//var crcNeedConfirmClinicalDataSetList = clinicalDataConfirmList.Where(t => t.UploadRole == UploadRole.CRC && t.ClinicalUploadType == ClinicalUploadType.PDF).ToList();
//// 找到CRC 已经自己添加的临床PDF数据文件
//var crcAddClinicalDataIdList = _readingClinicalDataRepository.Where(t => t.ReadingId == dbSubjectVisit.Id && t.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && t.ClinicalDataTrialSet.ClinicalUploadType == ClinicalUploadType.PDF)
// .Select(t => new { t.ClinicalDataTrialSetId }).ToList();
//foreach (var crcNeedConfirmClinicalDataSet in crcNeedConfirmClinicalDataSetList)
//{
// if (!crcAddClinicalDataIdList.Any(t => t.ClinicalDataTrialSetId == crcNeedConfirmClinicalDataSet.Id))
// {
// await _repository.AddAsync(new ReadingClinicalData()
// {
// TrialId = dbSubjectVisit.TrialId,
// SubjectId = dbSubjectVisit.SubjectId,
// ReadingId = dbSubjectVisit.Id,
// ClinicalDataTrialSetId = crcNeedConfirmClinicalDataSet.Id,
// IsVisit = true,
// IsSign = true,
// ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned
// });
// }
//}
//已确认临床数据完整性
dbSubjectVisit.IsConfirmedClinicalData = true;
// CRC 上传的基线数据签名 // CRC 上传的基线数据签名
List<ClinicalLevel> clinicalneedSign = new List<ClinicalLevel>() { List<ClinicalLevel> clinicalneedSign = new List<ClinicalLevel>() {
ClinicalLevel.Subject, ClinicalLevel.Subject,
ClinicalLevel.SubjectVisit, ClinicalLevel.SubjectVisit,
ClinicalLevel.Study, ClinicalLevel.Study,
}; };
await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x =>
clinicalneedSign.Contains(x.ClinicalDataTrialSet.ClinicalDataLevel)&&
x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ReadingId == dbSubjectVisit.Id && x.IsSign==false, x => new ReadingClinicalData()
{
IsSign = true,
ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned
});
//var signSuccess = await _repository.UpdateFromQueryAsync<TrialSign>(t => t.Id == cRCRequestToQCCommand.SignId, u => new TrialSign() { IsCompleted = true });
////现在修改为 提交时 设置签名信息
//dbSubjectVisit.ClinicalDataSignUserId = _userInfo.Id;
//dbSubjectVisit.ClinicalDataSignTime = DateTime.Now;
//那么没有录入 不允许提交
//if (!await _repository.AnyAsync<SubjectVisit>(t => t.PreviousHistoryList.Any() || t.PreviousOtherList.Any() || t.PreviousSurgeryList.Any()))
//{
// return ResponseOutput.NotOk("没有临床数据,不允许提交");
//}
//return ResponseOutput.NotOk("没有签名临床数据,不允许提交");
//}
await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x =>
clinicalneedSign.Contains(x.ClinicalDataTrialSet.ClinicalDataLevel) &&
x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ReadingId == dbSubjectVisit.Id && x.IsSign == false, x => new ReadingClinicalData()
{
IsSign = true,
ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned
});
var maxVisit = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.SubmitState == SubmitStateEnum.Submitted) var maxVisit = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.SubmitState == SubmitStateEnum.Submitted)
@ -1411,14 +1366,14 @@ namespace IRaCIS.Core.Application.Image.QA
}); });
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId)&& x.SubjectId == dbSubjectVisit.SubjectId&& await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId &&
dbSubjectVisit.VisitNum<= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum+0.01m) // 当前的访视 全局 裁判 及之前 全都加急 dbSubjectVisit.VisitNum <= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 及之前 全都加急
&& x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask() && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask()
{ {
IsUrgent = true, IsUrgent = true,
TaskUrgentType = TaskUrgentType.PDProgress, TaskUrgentType = TaskUrgentType.PDProgress,
IsCanEditUrgentState=false, IsCanEditUrgentState = false,
}); });
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId
@ -1428,7 +1383,7 @@ namespace IRaCIS.Core.Application.Image.QA
IsUrgent = true, IsUrgent = true,
TaskUrgentType = TaskUrgentType.Other, TaskUrgentType = TaskUrgentType.Other,
TaskUrgentRemake= "后续访视设为pd", TaskUrgentRemake = "后续访视设为pd",
IsCanEditUrgentState = false, IsCanEditUrgentState = false,
}); });
} }
@ -1440,7 +1395,7 @@ namespace IRaCIS.Core.Application.Image.QA
}); });
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) &&
x.VisitTaskNum>= dbSubjectVisit.VisitNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 全都加急 x.VisitTaskNum >= dbSubjectVisit.VisitNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 全都加急
&& x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask() && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask()
{ {
@ -1464,14 +1419,7 @@ namespace IRaCIS.Core.Application.Image.QA
dbSubjectVisit.IsUrgent = true; dbSubjectVisit.IsUrgent = true;
////PD确认的紧急会把前面所有未QC完成的访视均标记为紧急
//var previosSVlist = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.VisitNum < dbSubjectVisit.VisitNum && t.IsUrgent == false && t.SubmitState == SubmitStateEnum.Submitted, true).ToListAsync();
//previosSVlist.ForEach(t =>
//{
// t.IsUrgent = true;
//});
} }
@ -1522,7 +1470,7 @@ namespace IRaCIS.Core.Application.Image.QA
} }
//非基线设置为PD的话 或者设置为末次访视 根据配置自动生成阅片期 //非基线设置为PD的话 或者设置为末次访视 根据配置自动生成阅片期
if (!dbSubjectVisit.IsBaseLine && (dbSubjectVisit.PDState == PDStateEnum.PDProgress || dbSubjectVisit.IsFinalVisit) ) if (!dbSubjectVisit.IsBaseLine && (dbSubjectVisit.PDState == PDStateEnum.PDProgress || dbSubjectVisit.IsFinalVisit))
{ {
//该标准需要添加阅片期 //该标准需要添加阅片期
@ -1590,7 +1538,7 @@ namespace IRaCIS.Core.Application.Image.QA
//判断质疑是否都关闭了 //判断质疑是否都关闭了
if (await _repository.AnyAsync<QCChallenge>(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false)) if (await _repository.AnyAsync<QCChallenge>(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false))
{ {
//---当前访视有影像质控质疑未关闭,不能进行此操作。 //---当前访视有影像质控质疑未关闭,不能进行此操作。
return ResponseOutput.NotOk(_localizer["QCOperation_QCNotClosed"]); return ResponseOutput.NotOk(_localizer["QCOperation_QCNotClosed"]);
} }
} }
@ -1621,7 +1569,7 @@ namespace IRaCIS.Core.Application.Image.QA
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit) if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
{ {
//---项目配置影像质控为不审,不需要设置为影像质控通过。 //---项目配置影像质控为不审,不需要设置为影像质控通过。
return ResponseOutput.NotOk(_localizer["QCOperation_NoQCNeeded"]); return ResponseOutput.NotOk(_localizer["QCOperation_NoQCNeeded"]);
} }
@ -1631,7 +1579,7 @@ namespace IRaCIS.Core.Application.Image.QA
{ {
if (!await _repository.AnyAsync<TrialQCQuestionAnswer>(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.First)) if (!await _repository.AnyAsync<TrialQCQuestionAnswer>(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.First))
{ {
//---影像质控审核问题没有保存,不能进行此操作。 //---影像质控审核问题没有保存,不能进行此操作。
return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]); return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]);
} }
@ -1662,7 +1610,7 @@ namespace IRaCIS.Core.Application.Image.QA
} }
else else
{ {
//---项目配置影像质控为单审,当前访视影像质控任务不能从当前审核状态变更到 审核通过。 //---项目配置影像质控为单审,当前访视影像质控任务不能从当前审核状态变更到 审核通过。
return ResponseOutput.NotOk(_localizer["QCOperation_NotChangePass"]); return ResponseOutput.NotOk(_localizer["QCOperation_NotChangePass"]);
} }
@ -1678,7 +1626,7 @@ namespace IRaCIS.Core.Application.Image.QA
if (!await _repository.AnyAsync<TrialQCQuestionAnswer>(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.First)) if (!await _repository.AnyAsync<TrialQCQuestionAnswer>(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.First))
{ {
//---影像质控审核问题没有保存,不能进行此操作。 //---影像质控审核问题没有保存,不能进行此操作。
return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]); return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]);
} }
@ -1693,7 +1641,7 @@ namespace IRaCIS.Core.Application.Image.QA
if (!await _repository.AnyAsync<TrialQCQuestionAnswer>(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.Second)) if (!await _repository.AnyAsync<TrialQCQuestionAnswer>(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.Second))
{ {
//---影像质控审核问题没有保存,不能进行此操作。 //---影像质控审核问题没有保存,不能进行此操作。
return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]); return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]);
} }
@ -1738,7 +1686,7 @@ namespace IRaCIS.Core.Application.Image.QA
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit) if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
{ {
//---项目配置影像质控为不审,不允许设置影像质控终止。 //---项目配置影像质控为不审,不允许设置影像质控终止。
return ResponseOutput.NotOk(_localizer["QCOperation_NoQCNeededNotEnd"]); return ResponseOutput.NotOk(_localizer["QCOperation_NoQCNeededNotEnd"]);
} }
else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit) else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit)
@ -1778,7 +1726,7 @@ namespace IRaCIS.Core.Application.Image.QA
} }
await _qcChallengeRepository.UpdatePartialFromQueryAsync(t => t.IsClosed == false&& t.SubjectVisitId==dbSubjectVisit.Id, u => new QCChallenge() { IsClosed = true, ClosedTime=DateTime.Now, CloseResonEnum = QCChallengeCloseEnum.Unresolvable }); await _qcChallengeRepository.UpdatePartialFromQueryAsync(t => t.IsClosed == false && t.SubjectVisitId == dbSubjectVisit.Id, u => new QCChallenge() { IsClosed = true, ClosedTime = DateTime.Now, CloseResonEnum = QCChallengeCloseEnum.Unresolvable });
} }
@ -1958,31 +1906,31 @@ namespace IRaCIS.Core.Application.Image.QA
throw new BusinessValidationFailedException(_localizer["QCOperation_InvalidCompleteResend"]); throw new BusinessValidationFailedException(_localizer["QCOperation_InvalidCompleteResend"]);
} }
List<string> modalitieTypess = new List<string>() { "PT、CT", "CT、PT", "PET-CT" }; List<string> modalitieTypess = new List<string>() { "PT、CT", "CT、PT", "PET-CT" };
// 验证临床数据 是否有Pet类型 // 验证临床数据 是否有Pet类型
#region 验证临床数据 是否有Pet类型 #region 验证临床数据 是否有Pet类型
if (await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == cRCReuploadFinishedCommand.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Study)) if (await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == cRCReuploadFinishedCommand.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Study))
{ {
var item = qcChallenge.SubjectVisitId; var item = qcChallenge.SubjectVisitId;
if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities))) if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities)))
{ {
var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync(); var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync();
var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto() var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto()
{ {
SubjectVisitId = item, SubjectVisitId = item,
}); });
if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0)) if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0))
{ {
throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]); throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]);
} }
} }
} }
#endregion #endregion
var subjectVisitId = qcChallenge.SubjectVisitId; var subjectVisitId = qcChallenge.SubjectVisitId;
if (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.StudyList).CountAsync() == 0 && if (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.StudyList).CountAsync() == 0 &&
await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.NoneDicomStudyList).SelectMany(u => u.NoneDicomFileList).CountAsync() == 0) await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.NoneDicomStudyList).SelectMany(u => u.NoneDicomFileList).CountAsync() == 0)
@ -2117,14 +2065,14 @@ namespace IRaCIS.Core.Application.Image.QA
if (await _subjectVisitRepository.Where(t => t.Id == command.SubjectVisitId) if (await _subjectVisitRepository.Where(t => t.Id == command.SubjectVisitId)
.AnyAsync(t => t.SubmitState == SubmitStateEnum.Submitted && t.IsEnrollmentConfirm != command.IsEnrollmentConfirm)) .AnyAsync(t => t.SubmitState == SubmitStateEnum.Submitted && t.IsEnrollmentConfirm != command.IsEnrollmentConfirm))
{ {
//---该访视已提交,不能修改入组确认状态 //---该访视已提交,不能修改入组确认状态
return ResponseOutput.NotOk(_localizer["QCOperation_CannotModifyConfirmation"]); return ResponseOutput.NotOk(_localizer["QCOperation_CannotModifyConfirmation"]);
} }
if (await _subjectVisitRepository.Where(t => t.Id == command.SubjectVisitId) if (await _subjectVisitRepository.Where(t => t.Id == command.SubjectVisitId)
.AnyAsync(t => t.IsEnrollmentConfirm != command.IsEnrollmentConfirm && t.RequestBackState == RequestBackStateEnum.PM_AgressBack)) .AnyAsync(t => t.IsEnrollmentConfirm != command.IsEnrollmentConfirm && t.RequestBackState == RequestBackStateEnum.PM_AgressBack))
{ {
//---该访视为回退访视不允许修改PD确认状态 //---该访视为回退访视不允许修改PD确认状态
return ResponseOutput.NotOk(_localizer["QCOperation_CannotModifyPDStatus"]); return ResponseOutput.NotOk(_localizer["QCOperation_CannotModifyPDStatus"]);
} }
@ -2211,7 +2159,7 @@ namespace IRaCIS.Core.Application.Image.QA
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId,
u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed }); u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed });
//---转发影像失败。 //---转发影像失败。
return ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"] + result.Failures.ToString() + result.ToJson()); return ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"] + result.Failures.ToString() + result.ToJson());
} }
} }
@ -2231,8 +2179,8 @@ namespace IRaCIS.Core.Application.Image.QA
await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.Id == subjectVisitId, await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.Id == subjectVisitId,
u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed }); u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed });
// --转发影像失败 // --转发影像失败
return ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"] + e.Message); return ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"] + e.Message);
} }
@ -2242,7 +2190,7 @@ namespace IRaCIS.Core.Application.Image.QA
await _subjectVisitRepository.SaveChangesAsync(); await _subjectVisitRepository.SaveChangesAsync();
//---转发影像失败。 //---转发影像失败。
return isSuccess ? ResponseOutput.Ok() : ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"]); return isSuccess ? ResponseOutput.Ok() : ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"]);
} }

View File

@ -1465,7 +1465,7 @@ namespace IRaCIS.Core.Application
.WhereIf(!string.IsNullOrEmpty(inQuery.ResearchProgramNo), o => o.ResearchProgramNo.Contains(inQuery.ResearchProgramNo)) .WhereIf(!string.IsNullOrEmpty(inQuery.ResearchProgramNo), o => o.ResearchProgramNo.Contains(inQuery.ResearchProgramNo))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.ExperimentName), o => o.ExperimentName.Contains(inQuery.ExperimentName)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.ExperimentName), o => o.ExperimentName.Contains(inQuery.ExperimentName))
.WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.Admin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.OP, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id && t.IsDeleted == false) && t.IsDeleted == false) .WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.Admin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.OP, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id && t.IsDeleted == false) && t.IsDeleted == false)
.WhereIf(inQuery.CriterionType != null, o => o.ReadingQuestionCriterionTrialList.Any(t=>t.CriterionType==inQuery.CriterionType && t.IsSigned && t.IsConfirm)) .WhereIf(inQuery.CriterionType != null, o => o.TrialReadingCriterionList.Any(t=>t.CriterionType==inQuery.CriterionType && t.IsSigned && t.IsConfirm))
.WhereIf(!string.IsNullOrEmpty(inQuery.PM_EMail), o => o.TrialUserList.Any(t => t.User.EMail.Contains(inQuery.PM_EMail) && (t.User.UserTypeEnum == UserTypeEnum.ProjectManager || t.User.UserTypeEnum == UserTypeEnum.APM))) .WhereIf(!string.IsNullOrEmpty(inQuery.PM_EMail), o => o.TrialUserList.Any(t => t.User.EMail.Contains(inQuery.PM_EMail) && (t.User.UserTypeEnum == UserTypeEnum.ProjectManager || t.User.UserTypeEnum == UserTypeEnum.APM)))
.Select(t => new TrialToBeDoneDto() .Select(t => new TrialToBeDoneDto()
{ {
@ -1525,7 +1525,7 @@ namespace IRaCIS.Core.Application
.Where(u => u.CurrentActionUserId == null && (u.PreliminaryAuditUserId == null || (u.PreliminaryAuditUserId != _userInfo.Id && u.ReviewAuditUserId == null))).Count() : 0, .Where(u => u.CurrentActionUserId == null && (u.PreliminaryAuditUserId == null || (u.PreliminaryAuditUserId != _userInfo.Id && u.ReviewAuditUserId == null))).Count() : 0,
IR_ReadingCriterionList =isIR ? t.ReadingQuestionCriterionTrialList.Where(t=>t.IsConfirm && t.IsSigned).OrderBy(t => t.CriterionName).Select(t=>t.CriterionName).ToList():null, IR_ReadingCriterionList =isIR ? t.TrialReadingCriterionList.Where(t=>t.IsConfirm && t.IsSigned).OrderBy(t => t.CriterionName).Select(t=>t.CriterionName).ToList():null,
IR_PMEmailList= isIR ? t.TrialUserList.Where(t=>t.User.UserTypeEnum==UserTypeEnum.ProjectManager || t.User.UserTypeEnum == UserTypeEnum.APM).OrderBy(t => t.User.EMail).Select(t => t.User.EMail).ToList() : null, IR_PMEmailList= isIR ? t.TrialUserList.Where(t=>t.User.UserTypeEnum==UserTypeEnum.ProjectManager || t.User.UserTypeEnum == UserTypeEnum.APM).OrderBy(t => t.User.EMail).Select(t => t.User.EMail).ToList() : null,

View File

@ -66,7 +66,7 @@ namespace IRaCIS.Core.Application.Service
var userTypeEnumInt = 0; var userTypeEnumInt = 0;
var isEn_Us = false; var isEn_Us = false;
CreateMap<Trial, TrialDetailDTO>() CreateMap<Trial, TrialDetailDTO>()
.ForMember(x=>x.CriterionList,y=>y.MapFrom(z=>z.ReadingQuestionCriterionTrialList.Where(n=>n.IsConfirm).Select(m=>m.CriterionName))) .ForMember(x=>x.CriterionList,y=>y.MapFrom(z=>z.TrialReadingCriterionList.Where(n=>n.IsConfirm).Select(m=>m.CriterionName)))
.ForMember(d => d.DictionaryList, u => u.MapFrom(s => s.TrialDicList.Select(t => t.Dictionary).OrderBy(t => t.ShowOrder))) .ForMember(d => d.DictionaryList, u => u.MapFrom(s => s.TrialDicList.Select(t => t.Dictionary).OrderBy(t => t.ShowOrder)))
//.ForMember(d => d.Code, u => u.MapFrom(s => s.TrialCode)) //.ForMember(d => d.Code, u => u.MapFrom(s => s.TrialCode))
.ForMember(d => d.Sponsor, u => u.MapFrom(s => s.Sponsor.SponsorName)) .ForMember(d => d.Sponsor, u => u.MapFrom(s => s.Sponsor.SponsorName))
@ -170,8 +170,8 @@ namespace IRaCIS.Core.Application.Service
CreateMap<Domain.Models.Trial, TrialConfigDTO>().ForMember(t => t.TrialId, u => u.MapFrom(c => c.Id)) CreateMap<Domain.Models.Trial, TrialConfigDTO>().ForMember(t => t.TrialId, u => u.MapFrom(c => c.Id))
.ForMember(t => t.TrialCriterionIds, u => u.MapFrom(c => c.ReadingQuestionCriterionTrialList.Where(v =>v.IsConfirm).OrderBy(x=>x.ShowOrder).Select(r => r.Id))) .ForMember(t => t.TrialCriterionIds, u => u.MapFrom(c => c.TrialReadingCriterionList.Where(v =>v.IsConfirm).OrderBy(x=>x.ShowOrder).Select(r => r.Id)))
.ForMember(t => t.TrialCriterionNames, u => u.MapFrom(c => c.ReadingQuestionCriterionTrialList.Where(v => v.IsConfirm).OrderBy(x => x.ShowOrder).Select(r => r.CriterionName))) .ForMember(t => t.TrialCriterionNames, u => u.MapFrom(c => c.TrialReadingCriterionList.Where(v => v.IsConfirm).OrderBy(x => x.ShowOrder).Select(r => r.CriterionName)))
.ForMember(t => t.ClinicalDataTrialSetIds, u => u.MapFrom(c => c.clinicalDataTrialSets.Where(v => v.IsConfirm).Select(r => r.Id))) .ForMember(t => t.ClinicalDataTrialSetIds, u => u.MapFrom(c => c.clinicalDataTrialSets.Where(v => v.IsConfirm).Select(r => r.Id)))
.ForMember(t => t.ClinicalDataSetNames, u => u.MapFrom(c => c.clinicalDataTrialSets.Where(v => v.IsConfirm).Select(r => isEn_Us ? r.ClinicalDataSetEnName:r.ClinicalDataSetName))) .ForMember(t => t.ClinicalDataSetNames, u => u.MapFrom(c => c.clinicalDataTrialSets.Where(v => v.IsConfirm).Select(r => isEn_Us ? r.ClinicalDataSetEnName:r.ClinicalDataSetName)))
//.ForMember(t => t.CriterionIds, u => u.MapFrom(c => c.TrialDicList.Where(v => v.KeyName == StaticData.Criterion).Select(r => r.DictionaryId))) //.ForMember(t => t.CriterionIds, u => u.MapFrom(c => c.TrialDicList.Where(v => v.KeyName == StaticData.Criterion).Select(r => r.DictionaryId)))

View File

@ -264,7 +264,7 @@ namespace IRaCIS.Core.Application.Contracts
public bool IsCriticalSequence { get; set; } = false; public bool IsCriticalSequence { get; set; } = false;
public int SeriesCount { get; set; } public int SeriesCount =>SeriesList.Count;
public int InstanceCount { get; set; } public int InstanceCount { get; set; }
public bool IsDicom { get; set; } = true; public bool IsDicom { get; set; } = true;

View File

@ -15,6 +15,7 @@ using IRaCIS.Application.Services;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using DocumentFormat.OpenXml.Drawing.Charts; using DocumentFormat.OpenXml.Drawing.Charts;
using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Models;
using NPOI.SS.Formula.Functions;
namespace IRaCIS.Core.Application.Services namespace IRaCIS.Core.Application.Services
{ {
@ -263,7 +264,7 @@ namespace IRaCIS.Core.Application.Services
{ {
InstanceCount = k.InstanceCount, InstanceCount = k.InstanceCount,
Modalities = k.Modalities, Modalities = k.Modalities,
SeriesCount = k.SeriesCount, //SeriesCount = k.SeriesCount,
StudyCode = k.StudyCode, StudyCode = k.StudyCode,
StudyId = k.Id StudyId = k.Id
}).ToListAsync(); }).ToListAsync();
@ -297,7 +298,7 @@ namespace IRaCIS.Core.Application.Services
); );
//设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计 //设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计
t.SeriesCount = t.SeriesList.Count; //t.SeriesCount = t.SeriesList.Count;
t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count(); t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
} }
@ -483,172 +484,198 @@ namespace IRaCIS.Core.Application.Services
var studyList = new List<VisitStudyDTO>(); var studyList = new List<VisitStudyDTO>();
var taskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).FirstNotNullAsync(); 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();
//影响后处理 上传了新的影像
#region dicom 检查查询 if (taskInfo.TaskStudyCount > 0)
//如果是手动生成的标准,需要过滤检查和序列数据
var isManualGenerate = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == taskInfo.TrialReadingCriterionId && t.IsAutoCreate == false);
var dicomStudyList = await _repository.Where<DicomStudy>(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId)
.WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading))
.Select(k => new VisitStudyDTO()
{
InstanceCount = k.InstanceCount,
Modalities = k.Modalities,
SeriesCount = k.SeriesCount,
StudyCode = k.StudyCode,
StudyId = k.Id,
}).ToListAsync();
var studyIds = dicomStudyList.Select(t => t.StudyId).ToList();
var instanceList = await _repository.Where<DicomInstance>(t => studyIds.Contains(t.StudyId))
.Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync();
List<DicomSeriesDTO> seriesLists = await _repository.Where<DicomSeries>(s => studyIds.Contains(s.StudyId))
.WhereIf(isManualGenerate == false, t => t.IsReading)
.WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading))
.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
foreach (var t in dicomStudyList)
{ {
t.SeriesList = seriesLists.Where(s => s.StudyId == t.StudyId).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList();
t.SeriesList.ForEach(series => var taskStudyList= await _repository.Where<TaskStudy>(t => t.TrialId == indto.TrialId && t.VisitTaskId == indto.VisitTaskId).ProjectTo<VisitStudyDTO>(_mapper.ConfigurationProvider).ToListAsync();
foreach (var study in taskStudyList)
{ {
series.InstanceInfoList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k => study.SeriesList = study.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList();
new InstanceBasicInfo()
{
Id = k.Id,
NumberOfFrames = k.NumberOfFrames,
HtmlPath = k.HtmlPath,
Path = k.Path,
InstanceNumber = k.InstanceNumber,
}).ToList(); foreach (var series in study.SeriesList)
{
series.WindowCenter = series.InstanceInfoList.FirstOrDefault()!.WindowCenter;
series.WindowWidth = series.InstanceInfoList.FirstOrDefault()!.WindowWidth;
}
//study.SeriesCount = study.SeriesList.Count;
series.WindowWidth = instanceList.FirstOrDefault()!.WindowWidth; study.InstanceCount = study.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
series.WindowCenter = instanceList.FirstOrDefault()!.WindowCenter; }
});
studyList.AddRange(taskStudyList);
//设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计
t.SeriesCount = t.SeriesList.Count;
t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
} }
else
studyList.AddRange(dicomStudyList);
#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 #region dicom 检查查询
{
x.ReadingQuestionTrial.ShowOrder,
x.RowIndex,
x.SeriesId,
x.StudyId,
x.InstanceId,
}).ToListAsync();
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 isManualGenerate = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == taskInfo.TrialReadingCriterionId && t.IsAutoCreate == false);
{
var thisVisitTaskStudy = await _repository.Where<DicomStudy>(t => thisStudyIds.Contains(t.Id)).Select(k => new VisitStudyDTO() var dicomStudyList = await _repository.Where<DicomStudy>(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, InstanceCount = k.InstanceCount,
Modalities = k.Modalities,
SeriesCount = k.SeriesCount, //SeriesCount = k.SeriesCount,
StudyCode = k.StudyCode,
StudyId = k.Id, StudyId = k.Id,
IsCriticalSequence = true,
}).FirstOrDefaultAsync(); }).ToListAsync();
var studyIds = dicomStudyList.Select(t => t.StudyId).ToList();
if (thisVisitTaskStudy != null) var instanceList = await _repository.Where<DicomInstance>(t => studyIds.Contains(t.StudyId))
.Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync();
List<DicomSeriesDTO> seriesLists = await _repository.Where<DicomSeries>(s => studyIds.Contains(s.StudyId))
.WhereIf(isManualGenerate == false, t => t.IsReading)
.WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading))
.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
foreach (var t in dicomStudyList)
{
t.SeriesList = seriesLists.Where(s => s.StudyId == t.StudyId).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList();
t.SeriesList.ForEach(series =>
{ {
thisVisitTaskStudy.StudyId = default(Guid); series.InstanceInfoList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k =>
var item = await _repository.Where<DicomSeries>(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber). new InstanceBasicInfo()
ThenBy(s => s.SeriesTime) {
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); Id = k.Id,
NumberOfFrames = k.NumberOfFrames,
HtmlPath = k.HtmlPath,
Path = k.Path,
InstanceNumber = k.InstanceNumber,
if (item != null) }).ToList();
series.WindowWidth = instanceList.FirstOrDefault()!.WindowWidth;
series.WindowCenter = instanceList.FirstOrDefault()!.WindowCenter;
});
//设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计
//t.SeriesCount = t.SeriesList.Count;
t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count();
}
studyList.AddRange(dicomStudyList);
#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
{
x.ReadingQuestionTrial.ShowOrder,
x.RowIndex,
x.SeriesId,
x.StudyId,
x.InstanceId,
}).ToListAsync();
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 _repository.Where<DicomStudy>(t => thisStudyIds.Contains(t.Id)).Select(k => new VisitStudyDTO()
{ {
item.SeriesInstanceUid = string.Empty; InstanceCount = k.InstanceCount,
var markInstanceIdList = rowInfoList.Where(y => y.InstanceId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(y => y.InstanceId!.Value).Distinct().ToList(); //SeriesCount = k.SeriesCount,
item.InstanceInfoList = await _repository.Where<DicomInstance>(t => markInstanceIdList.Contains(t.Id)).OrderBy(t => t.InstanceNumber).Select(k => StudyId = k.Id,
new InstanceBasicInfo() IsCriticalSequence = true,
{
Id = k.Id,
NumberOfFrames = k.NumberOfFrames,
HtmlPath = k.HtmlPath,
Path = k.Path,
InstanceNumber = k.InstanceNumber,
}).ToListAsync(); }).FirstOrDefaultAsync();
item.InstanceInfoList.ForEach(x => if (thisVisitTaskStudy != null)
{
thisVisitTaskStudy.StudyId = default(Guid);
var item = await _repository.Where<DicomSeries>(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).
ThenBy(s => s.SeriesTime)
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
if (item != null)
{ {
item.SeriesInstanceUid = string.Empty;
var item = rowInfoList.FirstOrDefault(y => y.InstanceId == x.Id); var markInstanceIdList = rowInfoList.Where(y => y.InstanceId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(y => y.InstanceId!.Value).Distinct().ToList();
if (item != null)
item.InstanceInfoList = await _repository.Where<DicomInstance>(t => markInstanceIdList.Contains(t.Id)).OrderBy(t => t.InstanceNumber).Select(k =>
new InstanceBasicInfo()
{
Id = k.Id,
NumberOfFrames = k.NumberOfFrames,
HtmlPath = k.HtmlPath,
Path = k.Path,
InstanceNumber = k.InstanceNumber,
}).ToListAsync();
item.InstanceInfoList.ForEach(x =>
{ {
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.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).ToList(); });
item.InstanceInfoList.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).ToList();
item.InstanceCount = item.InstanceInfoList.Count; item.InstanceCount = item.InstanceInfoList.Count;
item.Description = "Key Series"; item.Description = "Key Series";
var modalityList = await _repository.Where<DicomSeries>(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.Add(thisVisitTaskStudy);
var modalityList = await _repository.Where<DicomSeries>(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.Add(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 检查查询 #region 非Dicom 检查查询
var noDicomList = await _noneDicomStudyRepository.Where(x => x.TrialId == indto.TrialId && x.SubjectVisitId == indto.SujectVisitId).ToListAsync(); var noDicomList = await _noneDicomStudyRepository.Where(x => x.TrialId == indto.TrialId && x.SubjectVisitId == indto.SujectVisitId)
.WhereIf(taskInfo.IsImageFilter == true, t => taskInfo.CriterionModalitys.Contains(t.Modality)).ToListAsync();
List<VisitStudyDTO> noDicomStudyList = noDicomList.Select(x => new VisitStudyDTO() List<VisitStudyDTO> noDicomStudyList = noDicomList.Select(x => new VisitStudyDTO()
@ -656,7 +683,7 @@ namespace IRaCIS.Core.Application.Services
InstanceCount = x.FileCount, InstanceCount = x.FileCount,
StudyId = x.Id, StudyId = x.Id,
Modalities = x.Modality, Modalities = x.Modality,
SeriesCount = 1, //SeriesCount = 1,
StudyCode = x.StudyCode, StudyCode = x.StudyCode,
IsDicom = false, IsDicom = false,
@ -671,7 +698,7 @@ namespace IRaCIS.Core.Application.Services
if (instanceCount == 0) if (instanceCount == 0)
{ {
item.SeriesList = new List<DicomSeriesDTO>(); item.SeriesList = new List<DicomSeriesDTO>();
item.SeriesCount = 0; //item.SeriesCount = 0;
} }
else else
{ {
@ -696,6 +723,7 @@ namespace IRaCIS.Core.Application.Services
} }
studyList.AddRange(noDicomStudyList); studyList.AddRange(noDicomStudyList);
#endregion #endregion

View File

@ -1,6 +1,7 @@
using AutoMapper; using AutoMapper;
using IRaCIS.Application.Contracts; using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
using IRaCIS.Core.Application.MediatR.CommandAndQueries; using IRaCIS.Core.Application.MediatR.CommandAndQueries;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
@ -101,6 +102,16 @@ namespace IRaCIS.Core.Application.Service
.ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.SubjectVisit.Subject.Code)) .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.SubjectVisit.Subject.Code))
.ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName)) .ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName))
.ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.SubjectVisit.TrialSite.TrialSiteCode)); .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.SubjectVisit.TrialSite.TrialSiteCode));
CreateMap<TaskStudy, VisitStudyDTO>()
.ForMember(d => d.StudyId, u => u.MapFrom(s => s.Id))
.ForMember(d => d.SeriesList, u => u.MapFrom(s => s.SeriesList));
CreateMap<TaskSeries, DicomSeriesDTO>()
.ForMember(d => d.InstanceInfoList, u => u.MapFrom(s => s.InstanceList));
CreateMap<TaskInstance, InstanceBasicInfo>();
} }
} }

View File

@ -252,7 +252,7 @@ namespace IRaCIS.Application.Services
EnrollId = intoGroup.Id, EnrollId = intoGroup.Id,
IsEnable = allocateRule.IsEnable, IsEnable = allocateRule.IsEnable,
TrialReadingCriterionList = intoGroup.Trial.ReadingQuestionCriterionTrialList.Where(t => t.IsConfirm).Select(t => new TrialReadingCriterionDto() { TrialReadingCriterionId = t.Id, TrialReadingCriterionName = t.CriterionName, CriterionType = t.CriterionType, IsOncologyReading = t.IsOncologyReading, IsArbitrationReading = t.IsArbitrationReading, IsGlobalReading = t.IsGlobalReading, ReadingInfoSignTime = t.ReadingInfoSignTime, ReadingType = t.ReadingType }).ToList(), TrialReadingCriterionList = intoGroup.Trial.TrialReadingCriterionList.Where(t => t.IsConfirm).Select(t => new TrialReadingCriterionDto() { TrialReadingCriterionId = t.Id, TrialReadingCriterionName = t.CriterionName, CriterionType = t.CriterionType, IsOncologyReading = t.IsOncologyReading, IsArbitrationReading = t.IsArbitrationReading, IsGlobalReading = t.IsGlobalReading, ReadingInfoSignTime = t.ReadingInfoSignTime, ReadingType = t.ReadingType }).ToList(),
DoctorCriterionStatusList= intoGroup.EnrollReadingCriteriaList.Select(t=>new DoctorCriterionStatus() DoctorCriterionStatusList= intoGroup.EnrollReadingCriteriaList.Select(t=>new DoctorCriterionStatus()
{ {

View File

@ -46,7 +46,7 @@ namespace IRaCIS.Core.Domain.Models
[JsonIgnore] [JsonIgnore]
public List<TrialUser> TrialUserList { get; set; } = new List<TrialUser>(); public List<TrialUser> TrialUserList { get; set; } = new List<TrialUser>();
[JsonIgnore] [JsonIgnore]
public List<ReadingQuestionCriterionTrial> ReadingQuestionCriterionTrialList { get; set; } = new List<ReadingQuestionCriterionTrial>(); public List<ReadingQuestionCriterionTrial> TrialReadingCriterionList { get; set; } = new List<ReadingQuestionCriterionTrial>();
[JsonIgnore] [JsonIgnore]
public List<Subject> SubjectList { get; set; } = new List<Subject>(); public List<Subject> SubjectList { get; set; } = new List<Subject>();
[JsonIgnore] [JsonIgnore]