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

This commit is contained in:
2024-06-12 17:10:22 +08:00
parent 4b8b02fa55
commit c2350f1418
12 changed files with 300 additions and 309 deletions
@@ -28,11 +28,11 @@ namespace IRaCIS.Core.Application.Image.QA
private readonly IRepository<QCChallenge> _qcChallengeRepository;
private readonly IRepository<DicomStudy> _dicomStudyRepository;
private readonly IRepository<DicomSeries> _dicomSeriesrepository;
private readonly IReadingClinicalDataService _readingClinicalDataService;
private readonly IRepository<Subject> _subjectRepository;
private readonly IReadingClinicalDataService _readingClinicalDataService;
private readonly IRepository<Subject> _subjectRepository;
private readonly IRepository<ReadingClinicalData> _readingClinicalDataRepository;
private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository;
private readonly IRepository<QCChallengeDialog> _qCChallengeDialogrepository;
private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository;
private readonly IRepository<QCChallengeDialog> _qCChallengeDialogrepository;
private readonly IRepository<CheckChallengeDialog> _checkChallengeDialogrepository;
private readonly IRepository<Trial> _trialRepository;
private readonly IRepository<VisitTask> _visitTaskRepository;
@@ -45,11 +45,11 @@ namespace IRaCIS.Core.Application.Image.QA
IRepository<VisitTask> visitTaskRepository,
IRepository<DicomStudy> dicomStudyRepository,
IRepository<DicomSeries> dicomSeriesrepository,
IReadingClinicalDataService readingClinicalDataService,
IRepository<Subject> subjectRepository,
IReadingClinicalDataService readingClinicalDataService,
IRepository<Subject> subjectRepository,
IRepository<ReadingClinicalData> readingClinicalDataRepository,
IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository,
IRepository<QCChallengeDialog> qCChallengeDialogrepository,
IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository,
IRepository<QCChallengeDialog> qCChallengeDialogrepository,
IRepository<CheckChallengeDialog> checkChallengeDialogrepository,
IVisitTaskHelpeService visitTaskHelpeService,
IDistributedLockProvider distributedLockProvider
@@ -59,11 +59,11 @@ namespace IRaCIS.Core.Application.Image.QA
_qcChallengeRepository = qcChallengeRepository;
_dicomStudyRepository = dicomStudyRepository;
this._dicomSeriesrepository = dicomSeriesrepository;
this._readingClinicalDataService = readingClinicalDataService;
this._subjectRepository = subjectRepository;
this._readingClinicalDataService = readingClinicalDataService;
this._subjectRepository = subjectRepository;
this._readingClinicalDataRepository = readingClinicalDataRepository;
this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository;
this._qCChallengeDialogrepository = qCChallengeDialogrepository;
this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository;
this._qCChallengeDialogrepository = qCChallengeDialogrepository;
this._checkChallengeDialogrepository = checkChallengeDialogrepository;
_trialRepository = trialRepository;
this._visitTaskRepository = visitTaskRepository;
@@ -894,7 +894,7 @@ namespace IRaCIS.Core.Application.Image.QA
public async Task<GetNextIQCQualityOutDto> CollectNextIQCQuality(GetNextIQCQualityInDto inDto)
{
var nextIQCQuality = await this.GetNextIQCQuality(inDto);
if (nextIQCQuality.VisitId != null)
{
var visit = await _subjectVisitRepository.Where(x => x.Id == nextIQCQuality.VisitId).FirstNotNullAsync();
@@ -902,7 +902,7 @@ namespace IRaCIS.Core.Application.Image.QA
{
await ObtainOrCancelQCTask(inDto.TrialId, nextIQCQuality.VisitId.Value, true);
}
}
return nextIQCQuality;
@@ -932,23 +932,24 @@ namespace IRaCIS.Core.Application.Image.QA
break;
case TrialQCProcess.SingleAudit:
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)))
.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();
&& 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)
.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();
if(subjectVisit!=null)
.OrderBy(x => x.VisitNum).FirstOrDefault();
if (subjectVisit != null)
{
return new GetNextIQCQualityOutDto() {
SubjectId= subjectVisit.SubjectId,
VisitId= subjectVisit.Id
return new GetNextIQCQualityOutDto()
{
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)
{
return new GetNextIQCQualityOutDto()
@@ -965,10 +966,10 @@ namespace IRaCIS.Core.Application.Image.QA
case TrialQCProcess.DoubleAudit:
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)
.Include(x => x.Subject).ToListAsync();
.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();
if (subjectVisit != null)
{
return new GetNextIQCQualityOutDto()
@@ -1027,14 +1028,14 @@ namespace IRaCIS.Core.Application.Image.QA
{
//throw new BusinessValidationFailedException("当前访视已被领取,不允许领取");
//---当前访视的影像质控任务已被其他QC领取,不允许领取
//---当前访视的影像质控任务已被其他QC领取,不允许领取
return ResponseOutput.NotOk(_localizer["QCOperation_QCTaskNoAccess"], ApiResponseCodeEnum.NeedTips);
}
if (await _subjectVisitRepository.AnyAsync(t => t.Trial.QCQuestionConfirmedUserId == null && t.Id == subjectVisitId))
{
//---请先配置影像质控审核问题,再领取影像质控任务
//---请先配置影像质控审核问题,再领取影像质控任务
return ResponseOutput.NotOk(_localizer["QCOperation_QCConfigFirst"], ApiResponseCodeEnum.NeedTips);
}
@@ -1053,14 +1054,14 @@ namespace IRaCIS.Core.Application.Image.QA
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
{
//---项目配置为不审,没有领取QC Task
//---项目配置为不审,没有领取QC Task
return ResponseOutput.NotOk(_localizer["QCOperation_NoQC"]);
}
else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit)
{
if (dbSubjectVisit.PreliminaryAuditUserId == _userInfo.Id)
{
//---初审已通过,不能继续领取
//---初审已通过,不能继续领取
return ResponseOutput.NotOk(_localizer["QCOperation_InitialAuditPassed"]);
}
@@ -1074,15 +1075,15 @@ namespace IRaCIS.Core.Application.Image.QA
}
else
{
// ---项目配置为单审,不满足Submmit State:已提交 或者 Audit State:待审核/审核中, 不允许领取,请刷新界面
return ResponseOutput.NotOk(_localizer["QCOperation_NoSingleAudit"]);
// ---项目配置为单审,不满足Submmit State:已提交 或者 Audit State:待审核/审核中, 不允许领取,请刷新界面
return ResponseOutput.NotOk(_localizer["QCOperation_NoSingleAudit"]);
}
}
else if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit)
{
if (dbSubjectVisit.PreliminaryAuditUserId == _userInfo.Id)
{
//---复审不能和初审是同一个人
//---复审不能和初审是同一个人
return ResponseOutput.NotOk(_localizer["QCOperation_NoSameReviewer"]);
}
@@ -1102,7 +1103,7 @@ namespace IRaCIS.Core.Application.Image.QA
}
else
{
//---项目配置为复审,不满足提交状态:已提交 或者 审核状态:待审核/QC中, 不允许领取,请刷新界面
//---项目配置为复审,不满足提交状态:已提交 或者 审核状态:待审核/QC中, 不允许领取,请刷新界面
return ResponseOutput.NotOk(_localizer["QCOperation_NoSecondaryAudit"]);
}
}
@@ -1123,14 +1124,14 @@ namespace IRaCIS.Core.Application.Image.QA
{
if (dbSubjectVisit!.CurrentActionUserId != _userInfo.Id)
{
//---您不是该质控任务当前领取人,没有操作权限!
//---您不是该质控任务当前领取人,没有操作权限!
return ResponseOutput.NotOk(_localizer["QCOperation_NoRecipient"], ApiResponseCodeEnum.NeedTips);
}
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
{
//---项目配置影像质控为不审,不需要取消任务功能
//---项目配置影像质控为不审,不需要取消任务功能
return ResponseOutput.NotOk(_localizer["QCOperation_NoQCFunction"]);
}
else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit)
@@ -1143,7 +1144,7 @@ namespace IRaCIS.Core.Application.Image.QA
else
{
//---当前访视影像质控任务没有当前领取人,不能释放。
//---当前访视影像质控任务没有当前领取人,不能释放。
return ResponseOutput.NotOk(_localizer["QCOperation_NoTaskOwner"]);
}
}
@@ -1163,7 +1164,7 @@ namespace IRaCIS.Core.Application.Image.QA
else
{
//---当前访视影像质控任务没有当前领取人,不能释放。
//---当前访视影像质控任务没有当前领取人,不能释放。
return ResponseOutput.NotOk(_localizer["QCOperation_NoTaskOwner"]);
}
}
@@ -1214,7 +1215,7 @@ namespace IRaCIS.Core.Application.Image.QA
}
//同时要根据项目有没有配置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)]
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类型
#region Pet类型
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)))
{
var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync();
var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto()
{
SubjectVisitId = item,
});
if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities)))
{
var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync();
var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto()
{
SubjectVisitId = item,
});
if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0))
{
throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]);
}
}
if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0))
{
throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]);
}
}
}
}
#endregion
}
}
#endregion
var trialId = cRCRequestToQCCommand.TrialId;
var trialId = cRCRequestToQCCommand.TrialId;
var trialConfig = (await _trialRepository
.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)
{
//---项目配置了需要填写访视基准日期。但是受试者没有填写访视基准日期,不允许提交
//---项目配置了需要填写访视基准日期。但是受试者没有填写访视基准日期,不允许提交
return ResponseOutput.NotOk(_localizer["QCOperation_MissingBaselineDate"]);
}
//基线 且配置了临床数据
//if (trialConfig.ClinicalInformationTransmissionEnum != 0 /*&& dbSubjectVisit.IsBaseLine*//*&&dbSubjectVisit.ClinicalDataSignUserId==null*/)
//{
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))
{
//有标准配置了影像筛选,该受试者有检查未设置检查类型,不允许提交
return ResponseOutput.NotOk(_localizer["QCOperation_MissingModality"]);
}
////找到需要确认的PDF 临床数据 如果没有CRC 没有上传 那么就添加一条没有文件的记录
//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;
//已确认临床数据完整性
dbSubjectVisit.IsConfirmedClinicalData = true;
// CRC 上传的基线数据签名
List<ClinicalLevel> clinicalneedSign = new List<ClinicalLevel>() {
ClinicalLevel.Subject,
ClinicalLevel.SubjectVisit,
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("没有签名临床数据,不允许提交");
//}
ClinicalLevel.Subject,
ClinicalLevel.SubjectVisit,
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 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&&
dbSubjectVisit.VisitNum<= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum+0.01m) // 当前的访视 全局 裁判 及之前 全都加急
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId &&
dbSubjectVisit.VisitNum <= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 及之前 全都加急
&& x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask()
{
IsUrgent = true,
TaskUrgentType = TaskUrgentType.PDProgress,
IsCanEditUrgentState=false,
IsCanEditUrgentState = false,
});
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId
@@ -1428,7 +1383,7 @@ namespace IRaCIS.Core.Application.Image.QA
IsUrgent = true,
TaskUrgentType = TaskUrgentType.Other,
TaskUrgentRemake= "后续访视设为pd",
TaskUrgentRemake = "后续访视设为pd",
IsCanEditUrgentState = false,
});
}
@@ -1440,7 +1395,7 @@ namespace IRaCIS.Core.Application.Image.QA
});
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()
{
@@ -1464,14 +1419,7 @@ namespace IRaCIS.Core.Application.Image.QA
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的话 或者设置为末次访视 根据配置自动生成阅片期
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))
{
//---当前访视有影像质控质疑未关闭,不能进行此操作。
//---当前访视有影像质控质疑未关闭,不能进行此操作。
return ResponseOutput.NotOk(_localizer["QCOperation_QCNotClosed"]);
}
}
@@ -1621,7 +1569,7 @@ namespace IRaCIS.Core.Application.Image.QA
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
{
//---项目配置影像质控为不审,不需要设置为影像质控通过。
//---项目配置影像质控为不审,不需要设置为影像质控通过。
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))
{
//---影像质控审核问题没有保存,不能进行此操作。
//---影像质控审核问题没有保存,不能进行此操作。
return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]);
}
@@ -1651,7 +1599,7 @@ namespace IRaCIS.Core.Application.Image.QA
{
var physicalPath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, path);
if (System.IO.File.Exists(physicalPath))
{
File.Delete(physicalPath);
@@ -1662,7 +1610,7 @@ namespace IRaCIS.Core.Application.Image.QA
}
else
{
//---项目配置影像质控为单审,当前访视影像质控任务不能从当前审核状态变更到 审核通过。
//---项目配置影像质控为单审,当前访视影像质控任务不能从当前审核状态变更到 审核通过。
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))
{
//---影像质控审核问题没有保存,不能进行此操作。
//---影像质控审核问题没有保存,不能进行此操作。
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))
{
//---影像质控审核问题没有保存,不能进行此操作。
//---影像质控审核问题没有保存,不能进行此操作。
return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]);
}
@@ -1738,7 +1686,7 @@ namespace IRaCIS.Core.Application.Image.QA
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
{
//---项目配置影像质控为不审,不允许设置影像质控终止。
//---项目配置影像质控为不审,不允许设置影像质控终止。
return ResponseOutput.NotOk(_localizer["QCOperation_NoQCNeededNotEnd"]);
}
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"]);
}
List<string> modalitieTypess = new List<string>() { "PT、CT", "CT、PT", "PET-CT" };
// 验证临床数据 是否有Pet类型
#region Pet类型
if (await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == cRCReuploadFinishedCommand.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Study))
{
List<string> modalitieTypess = new List<string>() { "PT、CT", "CT、PT", "PET-CT" };
// 验证临床数据 是否有Pet类型
#region Pet类型
if (await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == cRCReuploadFinishedCommand.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Study))
{
var item = qcChallenge.SubjectVisitId;
if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities)))
{
var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync();
var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto()
{
SubjectVisitId = item,
});
if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities)))
{
var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync();
var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto()
{
SubjectVisitId = item,
});
if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0))
{
throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]);
}
}
}
if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0))
{
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 &&
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)
.AnyAsync(t => t.SubmitState == SubmitStateEnum.Submitted && t.IsEnrollmentConfirm != command.IsEnrollmentConfirm))
{
//---该访视已提交,不能修改入组确认状态
//---该访视已提交,不能修改入组确认状态
return ResponseOutput.NotOk(_localizer["QCOperation_CannotModifyConfirmation"]);
}
if (await _subjectVisitRepository.Where(t => t.Id == command.SubjectVisitId)
.AnyAsync(t => t.IsEnrollmentConfirm != command.IsEnrollmentConfirm && t.RequestBackState == RequestBackStateEnum.PM_AgressBack))
{
//---该访视为回退访视,不允许修改PD确认状态
//---该访视为回退访视,不允许修改PD确认状态
return ResponseOutput.NotOk(_localizer["QCOperation_CannotModifyPDStatus"]);
}
@@ -2211,7 +2159,7 @@ namespace IRaCIS.Core.Application.Image.QA
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId,
u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed });
//---转发影像失败。
//---转发影像失败。
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,
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();
//---转发影像失败。
//---转发影像失败。
return isSuccess ? ResponseOutput.Ok() : ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"]);
}